summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <matthiasc@src.gnome.org>2007-06-06 04:57:37 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2007-06-06 04:57:37 +0000
commit7c66305af7d923a3cd3e51296cfdc782c0508640 (patch)
treec6e7529d10dd0e1a65aec1fb8f7fcacab381e588
parent789254f52292ab8819d1458ccfc196b269671f58 (diff)
svn path=/tags/GLIB_2_13_4/; revision=5541
-rw-r--r--trunk/AUTHORS40
-rw-r--r--trunk/COPYING482
-rw-r--r--trunk/ChangeLog1397
-rw-r--r--trunk/ChangeLog.pre-1-22880
-rw-r--r--trunk/ChangeLog.pre-2-07225
-rw-r--r--trunk/ChangeLog.pre-2-101368
-rw-r--r--trunk/ChangeLog.pre-2-12738
-rw-r--r--trunk/ChangeLog.pre-2-21502
-rw-r--r--trunk/ChangeLog.pre-2-42042
-rw-r--r--trunk/ChangeLog.pre-2-61683
-rw-r--r--trunk/ChangeLog.pre-2-81483
-rw-r--r--trunk/HACKING34
-rw-r--r--trunk/INSTALL111
-rw-r--r--trunk/INSTALL.in111
-rw-r--r--trunk/MAINTAINERS7
-rw-r--r--trunk/Makefile.am123
-rw-r--r--trunk/NEWS1592
-rw-r--r--trunk/NEWS.pre-1-3211
-rw-r--r--trunk/README167
-rw-r--r--trunk/README.in167
-rw-r--r--trunk/README.win32336
-rw-r--r--trunk/acglib.m4131
-rw-r--r--trunk/acinclude.m4448
-rwxr-xr-xtrunk/autogen.sh98
-rw-r--r--trunk/config.h.win32.in584
-rw-r--r--trunk/configure.in2995
-rw-r--r--trunk/debian/README.debian30
-rwxr-xr-xtrunk/debian/build62
-rw-r--r--trunk/debian/changelog10
-rw-r--r--trunk/debian/control53
-rw-r--r--trunk/debian/copyright8
-rw-r--r--trunk/debian/libglib-cvs-dev.files9
-rw-r--r--trunk/debian/postinst7
-rwxr-xr-xtrunk/debian/rules126
-rw-r--r--trunk/docs/Makefile.am10
-rw-r--r--trunk/docs/debugging.txt41
-rw-r--r--trunk/docs/macros.txt81
-rw-r--r--trunk/docs/reference/AUTHORS7
-rw-r--r--trunk/docs/reference/COPYING30
-rw-r--r--trunk/docs/reference/ChangeLog3025
-rw-r--r--trunk/docs/reference/Makefile.am1
-rw-r--r--trunk/docs/reference/NEWS0
-rw-r--r--trunk/docs/reference/README63
-rw-r--r--trunk/docs/reference/glib/Makefile.am97
-rw-r--r--trunk/docs/reference/glib/building.sgml509
-rw-r--r--trunk/docs/reference/glib/changes.sgml178
-rw-r--r--trunk/docs/reference/glib/compiling.sgml72
-rw-r--r--trunk/docs/reference/glib/cross.sgml187
-rw-r--r--trunk/docs/reference/glib/file-name-encodings.pngbin0 -> 32141 bytes
-rw-r--r--trunk/docs/reference/glib/file-name-encodings.sxdbin0 -> 7006 bytes
-rw-r--r--trunk/docs/reference/glib/glib-docs.sgml223
-rw-r--r--trunk/docs/reference/glib/glib-gettextize.151
-rw-r--r--trunk/docs/reference/glib/glib-gettextize.xml76
-rw-r--r--trunk/docs/reference/glib/glib-overrides.txt307
-rw-r--r--trunk/docs/reference/glib/glib-sections.txt2479
-rw-r--r--trunk/docs/reference/glib/glib.types0
-rw-r--r--trunk/docs/reference/glib/mainloop-states.eps306
-rw-r--r--trunk/docs/reference/glib/mainloop-states.fig65
-rw-r--r--trunk/docs/reference/glib/mainloop-states.gifbin0 -> 7088 bytes
-rw-r--r--trunk/docs/reference/glib/mainloop-states.pngbin0 -> 15258 bytes
-rw-r--r--trunk/docs/reference/glib/regex-syntax.sgml2704
-rw-r--r--trunk/docs/reference/glib/resources.sgml111
-rw-r--r--trunk/docs/reference/glib/running.sgml275
-rw-r--r--trunk/docs/reference/glib/tmpl/allocators.sgml57
-rw-r--r--trunk/docs/reference/glib/tmpl/arrays.sgml309
-rw-r--r--trunk/docs/reference/glib/tmpl/arrays_byte.sgml191
-rw-r--r--trunk/docs/reference/glib/tmpl/arrays_pointer.sgml248
-rw-r--r--trunk/docs/reference/glib/tmpl/async_queues.sgml233
-rw-r--r--trunk/docs/reference/glib/tmpl/atomic_operations.sgml183
-rw-r--r--trunk/docs/reference/glib/tmpl/base64.sgml94
-rw-r--r--trunk/docs/reference/glib/tmpl/bookmarkfile.sgml552
-rw-r--r--trunk/docs/reference/glib/tmpl/byte_order.sgml553
-rw-r--r--trunk/docs/reference/glib/tmpl/caches.sgml162
-rw-r--r--trunk/docs/reference/glib/tmpl/completion.sgml158
-rw-r--r--trunk/docs/reference/glib/tmpl/conversions.sgml400
-rw-r--r--trunk/docs/reference/glib/tmpl/datalist.sgml244
-rw-r--r--trunk/docs/reference/glib/tmpl/datasets.sgml212
-rw-r--r--trunk/docs/reference/glib/tmpl/date.sgml793
-rw-r--r--trunk/docs/reference/glib/tmpl/error_reporting.sgml470
-rw-r--r--trunk/docs/reference/glib/tmpl/fileutils.sgml457
-rw-r--r--trunk/docs/reference/glib/tmpl/glib-unused.sgml918
-rw-r--r--trunk/docs/reference/glib/tmpl/gregex.sgml596
-rw-r--r--trunk/docs/reference/glib/tmpl/hash_tables.sgml395
-rw-r--r--trunk/docs/reference/glib/tmpl/hooks.sgml467
-rw-r--r--trunk/docs/reference/glib/tmpl/i18n.sgml112
-rw-r--r--trunk/docs/reference/glib/tmpl/iochannels.sgml682
-rw-r--r--trunk/docs/reference/glib/tmpl/keyfile.sgml863
-rw-r--r--trunk/docs/reference/glib/tmpl/limits.sgml220
-rw-r--r--trunk/docs/reference/glib/tmpl/linked_lists_double.sgml544
-rw-r--r--trunk/docs/reference/glib/tmpl/linked_lists_single.sgml469
-rw-r--r--trunk/docs/reference/glib/tmpl/macros.sgml227
-rw-r--r--trunk/docs/reference/glib/tmpl/macros_misc.sgml548
-rw-r--r--trunk/docs/reference/glib/tmpl/main.sgml1037
-rw-r--r--trunk/docs/reference/glib/tmpl/markup.sgml254
-rw-r--r--trunk/docs/reference/glib/tmpl/memory.sgml333
-rw-r--r--trunk/docs/reference/glib/tmpl/memory_chunks.sgml331
-rw-r--r--trunk/docs/reference/glib/tmpl/memory_slices.sgml221
-rw-r--r--trunk/docs/reference/glib/tmpl/messages.sgml292
-rw-r--r--trunk/docs/reference/glib/tmpl/misc_utils.sgml423
-rw-r--r--trunk/docs/reference/glib/tmpl/modules.sgml291
-rw-r--r--trunk/docs/reference/glib/tmpl/numerical.sgml122
-rw-r--r--trunk/docs/reference/glib/tmpl/option.sgml599
-rw-r--r--trunk/docs/reference/glib/tmpl/patterns.sgml124
-rw-r--r--trunk/docs/reference/glib/tmpl/quarks.sgml123
-rw-r--r--trunk/docs/reference/glib/tmpl/queue.sgml432
-rw-r--r--trunk/docs/reference/glib/tmpl/random_numbers.sgml206
-rw-r--r--trunk/docs/reference/glib/tmpl/relations.sgml204
-rw-r--r--trunk/docs/reference/glib/tmpl/scanner.sgml604
-rw-r--r--trunk/docs/reference/glib/tmpl/sequence.sgml432
-rw-r--r--trunk/docs/reference/glib/tmpl/shell.sgml68
-rw-r--r--trunk/docs/reference/glib/tmpl/spawn.sgml183
-rw-r--r--trunk/docs/reference/glib/tmpl/string_chunks.sgml132
-rw-r--r--trunk/docs/reference/glib/tmpl/string_utils.sgml942
-rw-r--r--trunk/docs/reference/glib/tmpl/strings.sgml309
-rw-r--r--trunk/docs/reference/glib/tmpl/thread_pools.sgml202
-rw-r--r--trunk/docs/reference/glib/tmpl/threads.sgml1715
-rw-r--r--trunk/docs/reference/glib/tmpl/timers.sgml102
-rw-r--r--trunk/docs/reference/glib/tmpl/trash_stack.sgml74
-rw-r--r--trunk/docs/reference/glib/tmpl/trees-binary.sgml233
-rw-r--r--trunk/docs/reference/glib/tmpl/trees-nary.sgml543
-rw-r--r--trunk/docs/reference/glib/tmpl/type_conversion.sgml123
-rw-r--r--trunk/docs/reference/glib/tmpl/types.sgml234
-rw-r--r--trunk/docs/reference/glib/tmpl/unicode.sgml831
-rw-r--r--trunk/docs/reference/glib/tmpl/version.sgml139
-rw-r--r--trunk/docs/reference/glib/tmpl/warnings.sgml229
-rw-r--r--trunk/docs/reference/glib/tmpl/windows.sgml128
-rw-r--r--trunk/docs/reference/glib/version.xml.in1
-rw-r--r--trunk/docs/reference/gobject/Makefile.am80
-rw-r--r--trunk/docs/reference/gobject/glib-genmarshal.1201
-rw-r--r--trunk/docs/reference/gobject/glib-genmarshal.xml347
-rw-r--r--trunk/docs/reference/gobject/glib-mkenums.1166
-rw-r--r--trunk/docs/reference/gobject/glib-mkenums.xml272
-rw-r--r--trunk/docs/reference/gobject/gobject-docs.sgml152
-rw-r--r--trunk/docs/reference/gobject/gobject-overrides.txt0
-rw-r--r--trunk/docs/reference/gobject/gobject-query.180
-rw-r--r--trunk/docs/reference/gobject/gobject-query.xml111
-rw-r--r--trunk/docs/reference/gobject/gobject-sections.txt837
-rw-r--r--trunk/docs/reference/gobject/gobject.cI11
-rw-r--r--trunk/docs/reference/gobject/gobject.types6
-rw-r--r--trunk/docs/reference/gobject/images/glue.pngbin0 -> 12722 bytes
-rw-r--r--trunk/docs/reference/gobject/tmpl/enumerations_flags.sgml311
-rw-r--r--trunk/docs/reference/gobject/tmpl/gboxed.sgml147
-rw-r--r--trunk/docs/reference/gobject/tmpl/gclosure.sgml820
-rw-r--r--trunk/docs/reference/gobject/tmpl/generic_values.sgml263
-rw-r--r--trunk/docs/reference/gobject/tmpl/gobject-unused.sgml377
-rw-r--r--trunk/docs/reference/gobject/tmpl/gparamspec.sgml532
-rw-r--r--trunk/docs/reference/gobject/tmpl/gtype.sgml1847
-rw-r--r--trunk/docs/reference/gobject/tmpl/gtypemodule.sgml290
-rw-r--r--trunk/docs/reference/gobject/tmpl/gtypeplugin.sgml187
-rw-r--r--trunk/docs/reference/gobject/tmpl/objects.sgml1111
-rw-r--r--trunk/docs/reference/gobject/tmpl/param_value_types.sgml1788
-rw-r--r--trunk/docs/reference/gobject/tmpl/signals.sgml926
-rw-r--r--trunk/docs/reference/gobject/tmpl/value_arrays.sgml140
-rw-r--r--trunk/docs/reference/gobject/tmpl/value_collection.sgml66
-rw-r--r--trunk/docs/reference/gobject/tut_gobject.xml771
-rw-r--r--trunk/docs/reference/gobject/tut_gsignal.xml520
-rw-r--r--trunk/docs/reference/gobject/tut_gtype.xml958
-rw-r--r--trunk/docs/reference/gobject/tut_howto.xml1718
-rw-r--r--trunk/docs/reference/gobject/tut_intro.xml179
-rw-r--r--trunk/docs/reference/gobject/tut_tools.xml100
-rw-r--r--trunk/docs/reference/gobject/version.xml.in1
-rw-r--r--trunk/glib-2.0-uninstalled.pc.in9
-rw-r--r--trunk/glib-2.0.pc.in15
-rw-r--r--trunk/glib-gettextize.in188
-rwxr-xr-xtrunk/glib-zip.in66
-rw-r--r--trunk/glib/Makefile.am298
-rwxr-xr-xtrunk/glib/abicheck.sh13
-rw-r--r--trunk/glib/galloca.h60
-rw-r--r--trunk/glib/garray.c719
-rw-r--r--trunk/glib/garray.h167
-rw-r--r--trunk/glib/gasyncqueue.c642
-rw-r--r--trunk/glib/gasyncqueue.h115
-rw-r--r--trunk/glib/gatomic.c767
-rw-r--r--trunk/glib/gatomic.h68
-rw-r--r--trunk/glib/gbacktrace.c308
-rw-r--r--trunk/glib/gbacktrace.h61
-rw-r--r--trunk/glib/gbase64.c379
-rw-r--r--trunk/glib/gbase64.h50
-rw-r--r--trunk/glib/gbookmarkfile.c3695
-rw-r--r--trunk/glib/gbookmarkfile.h187
-rw-r--r--trunk/glib/gbsearcharray.h303
-rw-r--r--trunk/glib/gcache.c197
-rw-r--r--trunk/glib/gcache.h68
-rw-r--r--trunk/glib/gcompletion.c350
-rw-r--r--trunk/glib/gcompletion.h74
-rw-r--r--trunk/glib/gconvert.c2106
-rw-r--r--trunk/glib/gconvert.h134
-rw-r--r--trunk/glib/gdataset.c757
-rw-r--r--trunk/glib/gdataset.h122
-rw-r--r--trunk/glib/gdatasetprivate.h44
-rw-r--r--trunk/glib/gdate.c1918
-rw-r--r--trunk/glib/gdate.h260
-rw-r--r--trunk/glib/gdebug.h59
-rw-r--r--trunk/glib/gdir.c296
-rw-r--r--trunk/glib/gdir.h47
-rwxr-xr-xtrunk/glib/gen-script-table.pl119
-rwxr-xr-xtrunk/glib/gen-unicode-tables.pl1303
-rw-r--r--trunk/glib/gerror.c261
-rw-r--r--trunk/glib/gerror.h74
-rw-r--r--trunk/glib/gfileutils.c1867
-rw-r--r--trunk/glib/gfileutils.h119
-rw-r--r--trunk/glib/ghash.c870
-rw-r--r--trunk/glib/ghash.h120
-rw-r--r--trunk/glib/ghook.c637
-rw-r--r--trunk/glib/ghook.h178
-rw-r--r--trunk/glib/gi18n-lib.h40
-rw-r--r--trunk/glib/gi18n.h35
-rw-r--r--trunk/glib/giochannel.c2304
-rw-r--r--trunk/glib/giochannel.h354
-rw-r--r--trunk/glib/giounix.c601
-rw-r--r--trunk/glib/giowin32.c2111
-rw-r--r--trunk/glib/gkeyfile.c3712
-rw-r--r--trunk/glib/gkeyfile.h246
-rw-r--r--trunk/glib/glib-mirroring-tab/Makefile11
-rw-r--r--trunk/glib/glib-mirroring-tab/gen-mirroring-tab.c232
-rw-r--r--trunk/glib/glib-mirroring-tab/packtab.c424
-rw-r--r--trunk/glib/glib-mirroring-tab/packtab.h50
-rw-r--r--trunk/glib/glib-object.h41
-rw-r--r--trunk/glib/glib.h84
-rw-r--r--trunk/glib/glib.rc.in30
-rw-r--r--trunk/glib/glib.symbols1498
-rw-r--r--trunk/glib/glibintl.h30
-rw-r--r--trunk/glib/glist.c652
-rw-r--r--trunk/glib/glist.h116
-rw-r--r--trunk/glib/gmacros.h267
-rw-r--r--trunk/glib/gmain.c4195
-rw-r--r--trunk/glib/gmain.h332
-rw-r--r--trunk/glib/gmappedfile.c278
-rw-r--r--trunk/glib/gmappedfile.h39
-rw-r--r--trunk/glib/gmarkup.c2284
-rw-r--r--trunk/glib/gmarkup.h130
-rw-r--r--trunk/glib/gmem.c721
-rw-r--r--trunk/glib/gmem.h148
-rw-r--r--trunk/glib/gmessages.c1093
-rw-r--r--trunk/glib/gmessages.h364
-rw-r--r--trunk/glib/gmirroringtable.h1289
-rw-r--r--trunk/glib/gnode.c916
-rw-r--r--trunk/glib/gnode.h172
-rw-r--r--trunk/glib/gnulib/Makefile.am28
-rw-r--r--trunk/glib/gnulib/README44
-rw-r--r--trunk/glib/gnulib/asnprintf.c40
-rw-r--r--trunk/glib/gnulib/g-gnulib.h50
-rw-r--r--trunk/glib/gnulib/makefile.msc18
-rw-r--r--trunk/glib/gnulib/printf-args.c129
-rw-r--r--trunk/glib/gnulib/printf-args.h142
-rw-r--r--trunk/glib/gnulib/printf-parse.c498
-rw-r--r--trunk/glib/gnulib/printf-parse.h74
-rw-r--r--trunk/glib/gnulib/printf.c154
-rw-r--r--trunk/glib/gnulib/printf.h57
-rw-r--r--trunk/glib/gnulib/vasnprintf.c1071
-rw-r--r--trunk/glib/gnulib/vasnprintf.h61
-rw-r--r--trunk/glib/goption.c2182
-rw-r--r--trunk/glib/goption.h160
-rw-r--r--trunk/glib/gpattern.c343
-rw-r--r--trunk/glib/gpattern.h44
-rw-r--r--trunk/glib/gprimes.c90
-rw-r--r--trunk/glib/gprimes.h47
-rw-r--r--trunk/glib/gprintf.c342
-rw-r--r--trunk/glib/gprintf.h54
-rw-r--r--trunk/glib/gprintfint.h59
-rw-r--r--trunk/glib/gqsort.c287
-rw-r--r--trunk/glib/gqsort.h44
-rw-r--r--trunk/glib/gquark.h50
-rw-r--r--trunk/glib/gqueue.c1013
-rw-r--r--trunk/glib/gqueue.h123
-rw-r--r--trunk/glib/grand.c635
-rw-r--r--trunk/glib/grand.h87
-rw-r--r--trunk/glib/gregex.c2454
-rw-r--r--trunk/glib/gregex.h200
-rw-r--r--trunk/glib/grel.c474
-rw-r--r--trunk/glib/grel.h94
-rw-r--r--trunk/glib/gscanner.c1767
-rw-r--r--trunk/glib/gscanner.h275
-rw-r--r--trunk/glib/gscripttable.h2982
-rw-r--r--trunk/glib/gsequence.c1740
-rw-r--r--trunk/glib/gsequence.h121
-rw-r--r--trunk/glib/gshell.c673
-rw-r--r--trunk/glib/gshell.h53
-rw-r--r--trunk/glib/gslice.c1445
-rw-r--r--trunk/glib/gslice.h77
-rw-r--r--trunk/glib/gslist.c621
-rw-r--r--trunk/glib/gslist.h110
-rw-r--r--trunk/glib/gspawn-win32-helper.c311
-rw-r--r--trunk/glib/gspawn-win32.c1434
-rw-r--r--trunk/glib/gspawn.c1597
-rw-r--r--trunk/glib/gspawn.h138
-rw-r--r--trunk/glib/gstdio.c729
-rw-r--r--trunk/glib/gstdio.h114
-rw-r--r--trunk/glib/gstrfuncs.c2845
-rw-r--r--trunk/glib/gstrfuncs.h248
-rw-r--r--trunk/glib/gstring.c1284
-rw-r--r--trunk/glib/gstring.h158
-rw-r--r--trunk/glib/gthread.c931
-rw-r--r--trunk/glib/gthread.h379
-rw-r--r--trunk/glib/gthreadpool.c945
-rw-r--r--trunk/glib/gthreadpool.h111
-rw-r--r--trunk/glib/gthreadprivate.h68
-rw-r--r--trunk/glib/gtimer.c408
-rw-r--r--trunk/glib/gtimer.h61
-rw-r--r--trunk/glib/gtree.c1290
-rw-r--r--trunk/glib/gtree.h88
-rw-r--r--trunk/glib/gtypes.h429
-rw-r--r--trunk/glib/gunibreak.c66
-rw-r--r--trunk/glib/gunibreak.h17270
-rw-r--r--trunk/glib/gunichartables.h12250
-rw-r--r--trunk/glib/gunicode.h385
-rw-r--r--trunk/glib/gunicodeprivate.h36
-rw-r--r--trunk/glib/gunicollate.c495
-rw-r--r--trunk/glib/gunicomp.h682
-rw-r--r--trunk/glib/gunidecomp.c525
-rw-r--r--trunk/glib/gunidecomp.h10870
-rw-r--r--trunk/glib/guniprop.c1305
-rw-r--r--trunk/glib/gutf8.c1851
-rw-r--r--trunk/glib/gutils.c3352
-rw-r--r--trunk/glib/gutils.h467
-rw-r--r--trunk/glib/gwin32.c570
-rw-r--r--trunk/glib/gwin32.h104
-rw-r--r--trunk/glib/libcharset/Makefile.am62
-rw-r--r--trunk/glib/libcharset/README41
-rw-r--r--trunk/glib/libcharset/codeset.m420
-rwxr-xr-xtrunk/glib/libcharset/config.charset467
-rw-r--r--trunk/glib/libcharset/glibc21.m426
-rw-r--r--trunk/glib/libcharset/libcharset-glib.patch94
-rw-r--r--trunk/glib/libcharset/libcharset.h42
-rw-r--r--trunk/glib/libcharset/localcharset.c390
-rwxr-xr-xtrunk/glib/libcharset/make-patch.sh27
-rw-r--r--trunk/glib/libcharset/ref-add.sin31
-rw-r--r--trunk/glib/libcharset/ref-del.sin26
-rwxr-xr-xtrunk/glib/libcharset/update.sh31
-rw-r--r--trunk/glib/makefile.msc.in138
-rwxr-xr-xtrunk/glib/makegalias.pl136
-rw-r--r--trunk/glib/pcre/COPYING68
-rw-r--r--trunk/glib/pcre/Makefile.am64
-rw-r--r--trunk/glib/pcre/makefile.msc49
-rw-r--r--trunk/glib/pcre/pcre.h286
-rw-r--r--trunk/glib/pcre/pcre_chartables.c195
-rw-r--r--trunk/glib/pcre/pcre_compile.c5385
-rw-r--r--trunk/glib/pcre/pcre_config.c116
-rw-r--r--trunk/glib/pcre/pcre_dfa_exec.c2433
-rw-r--r--trunk/glib/pcre/pcre_exec.c4199
-rw-r--r--trunk/glib/pcre/pcre_fullinfo.c149
-rw-r--r--trunk/glib/pcre/pcre_get.c461
-rw-r--r--trunk/glib/pcre/pcre_globals.c59
-rw-r--r--trunk/glib/pcre/pcre_info.c89
-rw-r--r--trunk/glib/pcre/pcre_internal.h1041
-rw-r--r--trunk/glib/pcre/pcre_maketables.c140
-rw-r--r--trunk/glib/pcre/pcre_newline.c135
-rw-r--r--trunk/glib/pcre/pcre_ord2utf8.c78
-rw-r--r--trunk/glib/pcre/pcre_refcount.c77
-rw-r--r--trunk/glib/pcre/pcre_study.c570
-rw-r--r--trunk/glib/pcre/pcre_tables.c304
-rw-r--r--trunk/glib/pcre/pcre_try_flipped.c132
-rw-r--r--trunk/glib/pcre/pcre_ucp_searchfuncs.c126
-rw-r--r--trunk/glib/pcre/pcre_valid_utf8.c13
-rw-r--r--trunk/glib/pcre/pcre_version.c86
-rw-r--r--trunk/glib/pcre/pcre_xclass.c144
-rw-r--r--trunk/glib/pcre/ucp.h133
-rw-r--r--trunk/glib/pcre/ucpinternal.h92
-rwxr-xr-xtrunk/glib/pltcheck.sh19
-rw-r--r--trunk/glib/update-pcre/Makefile.am9
-rw-r--r--trunk/glib/update-pcre/Makefile.am-129
-rw-r--r--trunk/glib/update-pcre/Makefile.am-210
-rw-r--r--trunk/glib/update-pcre/digitab.patch133
-rw-r--r--trunk/glib/update-pcre/make_utt.py57
-rw-r--r--trunk/glib/update-pcre/memory.patch87
-rw-r--r--trunk/glib/update-pcre/notdll.patch19
-rw-r--r--trunk/glib/update-pcre/pcre_ucp_searchfuncs.c126
-rw-r--r--trunk/glib/update-pcre/pcre_valid_utf8.c13
-rw-r--r--trunk/glib/update-pcre/table-reduction.patch269
-rw-r--r--trunk/glib/update-pcre/ucp.patch141
-rw-r--r--trunk/glib/update-pcre/update.sh162
-rw-r--r--trunk/glib/update-pcre/utt.patch30
-rw-r--r--trunk/glibconfig.h.win32.in191
-rw-r--r--trunk/gmodule-2.0-uninstalled.pc.in8
-rw-r--r--trunk/gmodule-2.0.pc.in13
-rw-r--r--trunk/gmodule-export-2.0.pc.in13
-rw-r--r--trunk/gmodule-no-export-2.0-uninstalled.pc.in14
-rw-r--r--trunk/gmodule-no-export-2.0.pc.in13
-rw-r--r--trunk/gmodule/AUTHORS1
-rw-r--r--trunk/gmodule/COPYING482
-rw-r--r--trunk/gmodule/ChangeLog805
-rw-r--r--trunk/gmodule/Makefile.am110
-rw-r--r--trunk/gmodule/gmodule-ar.c184
-rw-r--r--trunk/gmodule/gmodule-beos.c203
-rw-r--r--trunk/gmodule/gmodule-dl.c167
-rw-r--r--trunk/gmodule/gmodule-dld.c162
-rw-r--r--trunk/gmodule/gmodule-dyld.c153
-rw-r--r--trunk/gmodule/gmodule-os2.c143
-rw-r--r--trunk/gmodule/gmodule-win32.c261
-rw-r--r--trunk/gmodule/gmodule.c678
-rw-r--r--trunk/gmodule/gmodule.def11
-rw-r--r--trunk/gmodule/gmodule.h101
-rw-r--r--trunk/gmodule/gmodule.rc.in30
-rw-r--r--trunk/gmodule/gmoduleconf.h.in54
-rw-r--r--trunk/gmodule/gmoduleconf.h.win3244
-rw-r--r--trunk/gmodule/makefile.msc.in31
-rw-r--r--trunk/gobject-2.0-uninstalled.pc.in7
-rw-r--r--trunk/gobject-2.0.pc.in11
-rw-r--r--trunk/gobject/ChangeLog3356
-rw-r--r--trunk/gobject/Makefile.am261
-rwxr-xr-xtrunk/gobject/abicheck.sh13
-rw-r--r--trunk/gobject/gboxed.c580
-rw-r--r--trunk/gobject/gboxed.h87
-rw-r--r--trunk/gobject/gclosure.c616
-rw-r--r--trunk/gobject/gclosure.h166
-rw-r--r--trunk/gobject/genums.c435
-rw-r--r--trunk/gobject/genums.h125
-rw-r--r--trunk/gobject/glib-genmarshal.1212
-rw-r--r--trunk/gobject/glib-genmarshal.c884
-rw-r--r--trunk/gobject/glib-mkenums.1166
-rwxr-xr-xtrunk/gobject/glib-mkenums.in486
-rw-r--r--trunk/gobject/gmarshal.list47
-rw-r--r--trunk/gobject/gobject-query.c228
-rw-r--r--trunk/gobject/gobject.c2267
-rw-r--r--trunk/gobject/gobject.h286
-rw-r--r--trunk/gobject/gobject.rc.in30
-rw-r--r--trunk/gobject/gobject.symbols436
-rw-r--r--trunk/gobject/gobjectnotifyqueue.c169
-rw-r--r--trunk/gobject/gparam.c1133
-rw-r--r--trunk/gobject/gparam.h235
-rw-r--r--trunk/gobject/gparamspecs.c2031
-rw-r--r--trunk/gobject/gparamspecs.h439
-rw-r--r--trunk/gobject/gsignal.c2613
-rw-r--r--trunk/gobject/gsignal.h270
-rw-r--r--trunk/gobject/gsourceclosure.c195
-rw-r--r--trunk/gobject/gsourceclosure.h41
-rw-r--r--trunk/gobject/gtype.c3573
-rw-r--r--trunk/gobject/gtype.h498
-rw-r--r--trunk/gobject/gtypemodule.c430
-rw-r--r--trunk/gobject/gtypemodule.h133
-rw-r--r--trunk/gobject/gtypeplugin.c104
-rw-r--r--trunk/gobject/gtypeplugin.h79
-rw-r--r--trunk/gobject/gvalue.c364
-rw-r--r--trunk/gobject/gvalue.h94
-rw-r--r--trunk/gobject/gvaluearray.c233
-rw-r--r--trunk/gobject/gvaluearray.h70
-rw-r--r--trunk/gobject/gvaluecollector.h160
-rw-r--r--trunk/gobject/gvaluetransform.c440
-rw-r--r--trunk/gobject/gvaluetypes.c944
-rw-r--r--trunk/gobject/gvaluetypes.h120
-rw-r--r--trunk/gobject/makefile.msc.in91
-rwxr-xr-xtrunk/gobject/makegobjectalias.pl137
-rw-r--r--trunk/gobject/marshal-genstrings.pl9
-rwxr-xr-xtrunk/gobject/pltcheck.sh17
-rw-r--r--trunk/gobject/testgobject.c428
-rw-r--r--trunk/gthread-2.0-uninstalled.pc.in6
-rw-r--r--trunk/gthread-2.0.pc.in11
-rw-r--r--trunk/gthread/ChangeLog646
-rw-r--r--trunk/gthread/Makefile.am87
-rw-r--r--trunk/gthread/gthread-impl.c366
-rw-r--r--trunk/gthread/gthread-none.c39
-rw-r--r--trunk/gthread/gthread-posix.c467
-rw-r--r--trunk/gthread/gthread-win32.c639
-rw-r--r--trunk/gthread/gthread.def3
-rw-r--r--trunk/gthread/gthread.rc.in30
-rw-r--r--trunk/gthread/makefile.msc.in26
-rw-r--r--trunk/m4macros/Makefile.am7
-rw-r--r--trunk/m4macros/glib-2.0.m4208
-rw-r--r--trunk/m4macros/glib-gettext.m4433
-rw-r--r--trunk/makefile.msc28
-rw-r--r--trunk/msvc_recommended_pragmas.h28
-rw-r--r--trunk/po/ChangeLog2948
-rw-r--r--trunk/po/Makefile.in.in271
-rw-r--r--trunk/po/POTFILES.in15
-rw-r--r--trunk/po/README.translators25
-rw-r--r--trunk/po/am.po886
-rw-r--r--trunk/po/ar.po909
-rw-r--r--trunk/po/az.po937
-rw-r--r--trunk/po/be.po1073
-rw-r--r--trunk/po/be@latin.po1049
-rw-r--r--trunk/po/bg.po951
-rw-r--r--trunk/po/bn.po936
-rw-r--r--trunk/po/bn_IN.po925
-rw-r--r--trunk/po/bs.po936
-rw-r--r--trunk/po/ca.po983
-rw-r--r--trunk/po/cs.po932
-rw-r--r--trunk/po/cy.po950
-rw-r--r--trunk/po/da.po968
-rw-r--r--trunk/po/de.po966
-rw-r--r--trunk/po/dz.po944
-rw-r--r--trunk/po/el.po977
-rw-r--r--trunk/po/en_CA.po920
-rw-r--r--trunk/po/en_GB.po937
-rw-r--r--trunk/po/eo.po931
-rw-r--r--trunk/po/es.po958
-rw-r--r--trunk/po/et.po925
-rw-r--r--trunk/po/eu.po948
-rw-r--r--trunk/po/fa.po943
-rw-r--r--trunk/po/fi.po976
-rw-r--r--trunk/po/fr.po977
-rw-r--r--trunk/po/ga.po894
-rw-r--r--trunk/po/gl.po943
-rw-r--r--trunk/po/gu.po911
-rw-r--r--trunk/po/he.po945
-rw-r--r--trunk/po/hi.po914
-rw-r--r--trunk/po/hr.po932
-rw-r--r--trunk/po/hu.po961
-rw-r--r--trunk/po/hy.po883
-rw-r--r--trunk/po/id.po970
-rw-r--r--trunk/po/is.po924
-rw-r--r--trunk/po/it.po973
-rw-r--r--trunk/po/ja.po927
-rw-r--r--trunk/po/ka.po932
-rw-r--r--trunk/po/ko.po927
-rw-r--r--trunk/po/ku.po883
-rw-r--r--trunk/po/lt.po943
-rw-r--r--trunk/po/lv.po940
-rw-r--r--trunk/po/mg.po947
-rw-r--r--trunk/po/mk.po944
-rw-r--r--trunk/po/ml.po913
-rw-r--r--trunk/po/mn.po964
-rw-r--r--trunk/po/ms.po931
-rw-r--r--trunk/po/nb.po930
-rw-r--r--trunk/po/ne.po917
-rw-r--r--trunk/po/nl.po962
-rw-r--r--trunk/po/nn.po927
-rw-r--r--trunk/po/oc.po777
-rw-r--r--trunk/po/or.po918
-rw-r--r--trunk/po/pa.po910
-rw-r--r--trunk/po/pl.po964
-rw-r--r--trunk/po/po2tbl.sed.in102
-rw-r--r--trunk/po/pt.po966
-rw-r--r--trunk/po/pt_BR.po960
-rw-r--r--trunk/po/ro.po936
-rw-r--r--trunk/po/ru.po956
-rw-r--r--trunk/po/rw.po936
-rw-r--r--trunk/po/sk.po944
-rw-r--r--trunk/po/sl.po941
-rw-r--r--trunk/po/sq.po937
-rw-r--r--trunk/po/sr.po958
-rw-r--r--trunk/po/sr@Latn.po958
-rw-r--r--trunk/po/sr@ije.po945
-rw-r--r--trunk/po/sv.po987
-rw-r--r--trunk/po/ta.po926
-rw-r--r--trunk/po/te.po922
-rw-r--r--trunk/po/th.po915
-rw-r--r--trunk/po/tl.po979
-rw-r--r--trunk/po/tr.po953
-rw-r--r--trunk/po/tt.po895
-rw-r--r--trunk/po/uk.po934
-rw-r--r--trunk/po/vi.po935
-rw-r--r--trunk/po/wa.po912
-rw-r--r--trunk/po/xh.po971
-rw-r--r--trunk/po/yi.po944
-rw-r--r--trunk/po/zh_CN.po891
-rw-r--r--trunk/po/zh_HK.po896
-rw-r--r--trunk/po/zh_TW.po896
-rwxr-xr-xtrunk/sanity_check40
-rw-r--r--trunk/tests/Makefile.am228
-rw-r--r--trunk/tests/array-test.c105
-rw-r--r--trunk/tests/asyncqueue-test.c194
-rw-r--r--trunk/tests/atomic-test.c63
-rw-r--r--trunk/tests/base64-test.c131
-rw-r--r--trunk/tests/bit-test.c145
-rw-r--r--trunk/tests/bookmarkfile-test.c247
-rw-r--r--trunk/tests/bookmarks/fail-01.xbel0
-rw-r--r--trunk/tests/bookmarks/fail-02.xbel2
-rw-r--r--trunk/tests/bookmarks/fail-03.xbel18
-rw-r--r--trunk/tests/bookmarks/fail-04.xbel21
-rw-r--r--trunk/tests/bookmarks/fail-05.xbel21
-rw-r--r--trunk/tests/bookmarks/fail-06.xbel19
-rw-r--r--trunk/tests/bookmarks/fail-07.xbel21
-rw-r--r--trunk/tests/bookmarks/fail-08.xbel18
-rw-r--r--trunk/tests/bookmarks/fail-09.xbel20
-rw-r--r--trunk/tests/bookmarks/fail-10.xbel21
-rw-r--r--trunk/tests/bookmarks/fail-11.xbel22
-rw-r--r--trunk/tests/bookmarks/fail-12.xbel22
-rw-r--r--trunk/tests/bookmarks/fail-13.xbel22
-rw-r--r--trunk/tests/bookmarks/fail-14.xbel24
-rw-r--r--trunk/tests/bookmarks/fail-15.xbel23
-rw-r--r--trunk/tests/bookmarks/fail-16.xbel24
-rw-r--r--trunk/tests/bookmarks/fail-17.xbel22
-rw-r--r--trunk/tests/bookmarks/valid-01.xbel21
-rw-r--r--trunk/tests/bookmarks/valid-02.xbel15
-rw-r--r--trunk/tests/casefold.txt1019
-rw-r--r--trunk/tests/casemap.txt3031
-rw-r--r--trunk/tests/child-test.c206
-rw-r--r--trunk/tests/collate/collate-1.file9
-rw-r--r--trunk/tests/collate/collate-1.in9
-rw-r--r--trunk/tests/collate/collate-1.unicode9
-rw-r--r--trunk/tests/collate/collate-2.file13
-rw-r--r--trunk/tests/collate/collate-2.in13
-rw-r--r--trunk/tests/collate/collate-2.unicode13
-rw-r--r--trunk/tests/completion-test.c74
-rw-r--r--trunk/tests/convert-test.c659
-rw-r--r--trunk/tests/cxx-test.C9
-rw-r--r--trunk/tests/date-test.c499
-rw-r--r--trunk/tests/dirname-test.c121
-rw-r--r--trunk/tests/env-test.c117
-rw-r--r--trunk/tests/errorcheck-mutex-test.c131
-rw-r--r--trunk/tests/file-test.c180
-rwxr-xr-xtrunk/tests/gen-casefold-txt.pl84
-rwxr-xr-xtrunk/tests/gen-casemap-txt.pl258
-rw-r--r--trunk/tests/gio-test.c444
-rw-r--r--trunk/tests/gobject/Makefile.am89
-rw-r--r--trunk/tests/gobject/accumulator.c227
-rw-r--r--trunk/tests/gobject/defaultiface.c191
-rw-r--r--trunk/tests/gobject/deftype.c59
-rw-r--r--trunk/tests/gobject/dynamictype.c130
-rw-r--r--trunk/tests/gobject/gvalue-test.c374
-rw-r--r--trunk/tests/gobject/ifacecheck.c167
-rw-r--r--trunk/tests/gobject/ifaceinherit.c227
-rw-r--r--trunk/tests/gobject/ifaceinit.c422
-rw-r--r--trunk/tests/gobject/ifaceproperties.c507
-rw-r--r--trunk/tests/gobject/override.c324
-rw-r--r--trunk/tests/gobject/paramspec-test.c220
-rw-r--r--trunk/tests/gobject/references.c281
-rw-r--r--trunk/tests/gobject/singleton.c85
-rw-r--r--trunk/tests/gobject/testcommon.h100
-rw-r--r--trunk/tests/gobject/testmarshal.list4
-rw-r--r--trunk/tests/gobject/testmodule.c69
-rw-r--r--trunk/tests/gobject/testmodule.h57
-rw-r--r--trunk/tests/hash-test.c405
-rw-r--r--trunk/tests/iochannel-test-infile5
-rw-r--r--trunk/tests/iochannel-test.c173
-rw-r--r--trunk/tests/keyfile-test.c1366
-rw-r--r--trunk/tests/libmoduletestplugin_a.c71
-rw-r--r--trunk/tests/libmoduletestplugin_b.c70
-rw-r--r--trunk/tests/list-test.c212
-rw-r--r--trunk/tests/mainloop-test.c437
-rw-r--r--trunk/tests/makefile.msc.in97
-rw-r--r--trunk/tests/mapping-test.c256
-rw-r--r--trunk/tests/markup-escape-test.c95
-rw-r--r--trunk/tests/markup-test.c214
-rw-r--r--trunk/tests/markups/expected-137
-rw-r--r--trunk/tests/markups/expected-106
-rw-r--r--trunk/tests/markups/expected-113
-rw-r--r--trunk/tests/markups/expected-251
-rw-r--r--trunk/tests/markups/expected-361
-rw-r--r--trunk/tests/markups/expected-429
-rw-r--r--trunk/tests/markups/expected-54
-rw-r--r--trunk/tests/markups/expected-66
-rw-r--r--trunk/tests/markups/expected-74
-rw-r--r--trunk/tests/markups/expected-85
-rw-r--r--trunk/tests/markups/expected-93
-rw-r--r--trunk/tests/markups/fail-1.gmarkup0
-rw-r--r--trunk/tests/markups/fail-10.gmarkup2
-rw-r--r--trunk/tests/markups/fail-11.gmarkup4
-rw-r--r--trunk/tests/markups/fail-12.gmarkup1
-rw-r--r--trunk/tests/markups/fail-13.gmarkup1
-rw-r--r--trunk/tests/markups/fail-14.gmarkup2
-rw-r--r--trunk/tests/markups/fail-15.gmarkup3
-rw-r--r--trunk/tests/markups/fail-16.gmarkup1
-rw-r--r--trunk/tests/markups/fail-17.gmarkup1
-rw-r--r--trunk/tests/markups/fail-18.gmarkup1
-rw-r--r--trunk/tests/markups/fail-19.gmarkup1
-rw-r--r--trunk/tests/markups/fail-2.gmarkup1
-rw-r--r--trunk/tests/markups/fail-20.gmarkup1
-rw-r--r--trunk/tests/markups/fail-21.gmarkup1
-rw-r--r--trunk/tests/markups/fail-22.gmarkup1
-rw-r--r--trunk/tests/markups/fail-23.gmarkup2
-rw-r--r--trunk/tests/markups/fail-24.gmarkup1
-rw-r--r--trunk/tests/markups/fail-25.gmarkup1
-rw-r--r--trunk/tests/markups/fail-26.gmarkup1
-rw-r--r--trunk/tests/markups/fail-27.gmarkup1
-rw-r--r--trunk/tests/markups/fail-28.gmarkup1
-rw-r--r--trunk/tests/markups/fail-29.gmarkup1
-rw-r--r--trunk/tests/markups/fail-3.gmarkup49
-rw-r--r--trunk/tests/markups/fail-30.gmarkup1
-rw-r--r--trunk/tests/markups/fail-31.gmarkup1
-rw-r--r--trunk/tests/markups/fail-32.gmarkup1
-rw-r--r--trunk/tests/markups/fail-33.gmarkup1
-rw-r--r--trunk/tests/markups/fail-34.gmarkup1
-rw-r--r--trunk/tests/markups/fail-35.gmarkup1
-rw-r--r--trunk/tests/markups/fail-36.gmarkupbin0 -> 13 bytes
-rw-r--r--trunk/tests/markups/fail-37.gmarkup1
-rw-r--r--trunk/tests/markups/fail-38.gmarkup1
-rw-r--r--trunk/tests/markups/fail-39.gmarkup1
-rw-r--r--trunk/tests/markups/fail-4.gmarkup1
-rw-r--r--trunk/tests/markups/fail-40.gmarkup1
-rw-r--r--trunk/tests/markups/fail-5.gmarkup2
-rw-r--r--trunk/tests/markups/fail-6.gmarkup2
-rw-r--r--trunk/tests/markups/fail-7.gmarkup2
-rw-r--r--trunk/tests/markups/fail-8.gmarkup2
-rw-r--r--trunk/tests/markups/fail-9.gmarkup2
-rw-r--r--trunk/tests/markups/valid-1.gmarkup9
-rw-r--r--trunk/tests/markups/valid-10.gmarkup6
-rw-r--r--trunk/tests/markups/valid-11.gmarkup2
-rw-r--r--trunk/tests/markups/valid-2.gmarkup49
-rw-r--r--trunk/tests/markups/valid-3.gmarkup10
-rw-r--r--trunk/tests/markups/valid-4.gmarkup8
-rw-r--r--trunk/tests/markups/valid-5.gmarkup2
-rw-r--r--trunk/tests/markups/valid-6.gmarkup4
-rw-r--r--trunk/tests/markups/valid-7.gmarkup2
-rw-r--r--trunk/tests/markups/valid-8.gmarkup1
-rw-r--r--trunk/tests/markups/valid-9.gmarkup2
-rw-r--r--trunk/tests/memchunks.c612
-rw-r--r--trunk/tests/module-test.c202
-rw-r--r--trunk/tests/node-test.c223
-rw-r--r--trunk/tests/option-test.c1502
-rw-r--r--trunk/tests/patterntest.c310
-rw-r--r--trunk/tests/printf-test.c244
-rw-r--r--trunk/tests/qsort-test.c33
-rw-r--r--trunk/tests/queue-test.c962
-rw-r--r--trunk/tests/rand-test.c135
-rw-r--r--trunk/tests/refcount/Makefile.am39
-rw-r--r--trunk/tests/refcount/closures.c291
-rw-r--r--trunk/tests/refcount/objects.c158
-rw-r--r--trunk/tests/refcount/objects2.c118
-rw-r--r--trunk/tests/refcount/properties.c255
-rw-r--r--trunk/tests/refcount/properties2.c199
-rw-r--r--trunk/tests/refcount/signals.c284
-rw-r--r--trunk/tests/regex-test.c2104
-rw-r--r--trunk/tests/relation-test.c139
-rwxr-xr-xtrunk/tests/run-bookmark-test.sh34
-rwxr-xr-xtrunk/tests/run-collate-tests.sh38
-rwxr-xr-xtrunk/tests/run-markup-tests.sh41
-rw-r--r--trunk/tests/sequence-test.c1301
-rw-r--r--trunk/tests/shell-test.c297
-rw-r--r--trunk/tests/slice-color.c178
-rw-r--r--trunk/tests/slice-test.c310
-rw-r--r--trunk/tests/slist-test.c204
-rw-r--r--trunk/tests/spawn-test-win32-gui.c111
-rw-r--r--trunk/tests/spawn-test.c293
-rw-r--r--trunk/tests/strfunc-test.c775
-rw-r--r--trunk/tests/string-test.c309
-rw-r--r--trunk/tests/strtod-test.c146
-rw-r--r--trunk/tests/strtoll-test.c71
-rw-r--r--trunk/tests/testgdate.c506
-rw-r--r--trunk/tests/testgdateparser.c115
-rw-r--r--trunk/tests/testglib.c1562
-rw-r--r--trunk/tests/thread-test.c402
-rw-r--r--trunk/tests/threadpool-test.c473
-rw-r--r--trunk/tests/timeloop-basic.c235
-rw-r--r--trunk/tests/timeloop-closure.c222
-rw-r--r--trunk/tests/timeloop.c216
-rw-r--r--trunk/tests/tree-test.c246
-rw-r--r--trunk/tests/type-test.c142
-rw-r--r--trunk/tests/unicode-caseconv.c132
-rw-r--r--trunk/tests/unicode-collate.c124
-rw-r--r--trunk/tests/unicode-encoding.c422
-rw-r--r--trunk/tests/unicode-normalize.c210
-rw-r--r--trunk/tests/uri-test.c477
-rw-r--r--trunk/tests/utf8-pointer.c99
-rw-r--r--trunk/tests/utf8-validate.c319
-rw-r--r--trunk/tests/utf8.txt301
-rw-r--r--trunk/win32-fixup.pl35
737 files changed, 372944 insertions, 0 deletions
diff --git a/trunk/AUTHORS b/trunk/AUTHORS
new file mode 100644
index 000000000..17814caa1
--- /dev/null
+++ b/trunk/AUTHORS
@@ -0,0 +1,40 @@
+Below are just a few of the people who have contributed
+to GLib. Please don't mail these people about problems you
+have with GTK+; see the README file for information about
+filing bugs and submitting patches.
+
+GLib-2.0 Team
+-------------
+Hans Breuer <hans@breuer.org>
+Matthias Clasen <mclasen@redhat.com>
+Tor Lillqvist <tml@iki.fi>
+Tim Janik <timj@gtk.org>
+Havoc Pennington <hp@redhat.com>
+Ron Steinke <rsteinke@w-link.net>
+Owen Taylor <otaylor@redhat.com>
+Sebastian Wilhelmi <seppi@seppi.de>
+
+GLib-1.2 Team
+-------------
+Shawn T. Amundson <amundson@gimp.org>
+Jeff Garzik <jgarzik@pobox.com>
+Raja R Harinath <harinath@cs.umn.edu>
+Tim Janik <timj@gtk.org>
+Elliot Lee <sopwith@redhat.com>
+Tor Lillqvist <tml@iki.fi>
+Paolo Molaro <lupus@debian.org>
+Havoc Pennington <hp@pobox.com>
+Manish Singh <yosh@gimp.org>
+Owen Taylor <otaylor@gtk.org>
+Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+The random number generator "Mersenne Twister", which is used by GLib,
+was developed and originally coded by:
+Makoto Matsumoto <matumoto@math.keio.ac.jp>
+Takuji Nishimura <nisimura@math.keio.ac.jp>
+
+Original Authors
+----------------
+Peter Mattis <petm@xcf.berkeley.edu>
+Spencer Kimball <spencer@xcf.berkeley.edu>
+Josh MacDonald <jmacd@xcf.berkeley.edu>
diff --git a/trunk/COPYING b/trunk/COPYING
new file mode 100644
index 000000000..bf50f20de
--- /dev/null
+++ b/trunk/COPYING
@@ -0,0 +1,482 @@
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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.
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/trunk/ChangeLog b/trunk/ChangeLog
new file mode 100644
index 000000000..0896da88f
--- /dev/null
+++ b/trunk/ChangeLog
@@ -0,0 +1,1397 @@
+2007-06-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.4 ===
+
+ * NEWS: Updates
+
+2007-06-05 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_is_key_name):
+ (g_key_file_is_group_name): Don't assume the string is
+ valid UTF-8, since it may be user data. (#444161, Ben Combee)
+
+2007-06-05 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/gutf8.c: Add not to g_utf8_get_char_validated() about
+ nul-terminated strings.
+
+2007-06-05 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.c (g_get_user_special_dir): Don't deadlock
+ when running with threads. (#444121, Christian Persch)
+
+2007-06-05 Vincent Untz <vuntz@gnome.org>
+
+ * glib/goption.c: (g_option_context_get_help): don't replace the usage
+ line with the description for optional parameters, but append the
+ description. (#444130)
+
+2007-06-04 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.13.3 ===
+
+ * NEWS: Updates
+
+2007-06-04 Matthias Clasen <mclasen@redhat.com>
+
+ Add support for a number of special directories, as
+ defined by the xdg-user-dirs specification. (#432651,
+ Bastien Nocera, Emmanuele Bassi, Michael Natterer)
+
+ * glib/glib.symbols:
+ * glib/gutils.[hc]: Add the GUserDirectory enum and
+ g_get_user_special_dir(), with implementations based
+ on the xdg-user-dirs spec and on native interfaces
+ for Win32 and Carbon.
+
+ * configure.in: Add Carbon checks.
+
+ * tests/tetsglib.c: Test g_get_user_special_dir().
+
+2007-06-03 Yevgen Muntyan <muntyan@tamu.edu>
+
+ * glib/gregex.c: fixed g_regex_fetch_named* for cases when (?J)
+ is used inside a pattern (#442265, comment #12).
+ * tests/regex-test.c: Test it.
+
+2007-06-03 Matthias Clasen <mclasen@redhat.com>
+
+ * NEWS: Updates
+
+2007-06-03 Yevgen Muntyan <muntyan@tamu.edu>
+
+ Some API additions and changes (#442265).
+
+ * glib/gregex.c:
+ * glib/gregex.h: new functions: g_regex_ref(), g_regex_unref() which
+ replaces g_regex_free(); g_match_info_get_regex(), g_match_info_get_string();
+ g_regex_check_replacement().
+ Made g_match_info_expand_references() accept NULL; changed GRegexEvalCallback
+ to take only arguments which are likely to be actualy used.
+
+ * docs/reference/glib/glib-sections.txt:
+ * glib/glib.symbols: Added new functions.
+
+ * tests/regex-test.c: Test them.
+
+ * docs/reference/glib/tmpl/gregex.sgml: Updated GRegexEvalCallback docs.
+
+2007-05-31 Matthias Clasen <mclasen@redhat.com>
+
+ * README.win32: Fix a typo. (#423708, Olivier Delhomme)
+
+2007-05-30 Dan Winship <danw@novell.com>
+
+ * glib/gkeyfile.h: add defines for desktop file handling. #339225,
+ original patch from Vincent Untz.
+
+2007-05-29 Cody Russell <bratsche@gnome.org>
+
+ * configure.in: Fix a sed script that doesn't correctly detect
+ i586-mingw32-gcc-3.4 compiler, and was causing -Wno-pointer-sign
+ errors when building with that compiler. (#440896, Yevgen Muntyan)
+
+2007-05-29 Marco Barisione <marco@barisione.org>
+
+ * glib/gregex.c: Fix g_regex_fetch_named() and
+ g_regex_fetch_named_pos() when G_REGEX_DUPNAMES is used (#434358,
+ Yevgen Muntyan and #419376, Marco Barisione, patch by Yevgen Muntyan)
+
+2007-05-25 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/guniprop.c (g_unichar_iswide), (g_unichar_iswide_cjk):
+ Update to Markus Kuhn's updated wcwidth for Unicode 5.0.
+
+2007-05-22 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.13.2 ===
+
+ * README.in:
+ * NEWS: Updates
+
+2007-05-18 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Try again to move the compiler-dependency
+ of G_GNUC_INTERNAL to runtime.
+
+2007-05-18 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Don't let PERL_PATH be ''. (#356769, Joseph Sacco)
+
+2007-05-17 Michael Natterer <mitch@imendio.com>
+
+ * configure.in: hotfix: revert last change to fix the build on OS X.
+
+2007-05-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c (g_option_context_set_translate_func): Fix
+ a doc typo. (#439232, Vincent Untz)
+
+2007-05-17 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Move the compiler-dependency in the G_GNUC_INTERNAL
+ definition from configure-time to runtime (of the compiler).
+ (#438869, Damien Carbery)
+
+ * glib/gdebug.h:
+ * glib/gmessages.h:
+ * glib/gunicodeprivate.h:
+ * glib/gthreadprivate.h: Move G_GNUC_INTERNAL before function
+ declarations to fix compilation with sun studio. (#438873,
+ Damien Carbery)
+
+2007-05-14 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gslice.h:
+ * glib/gslice.c:
+ * glib/glib.symbols: Make g_slice_debug_tree_statistics()
+ debug-only functionality again.
+
+2007-05-14 Christian Persch <chpe@gnome.org>
+
+ * docs/reference/glib/tmpl/string_utils.sgml: Improve g_strerror and
+ g_strsignal docs. Bug #438293.
+
+2007-05-13 Tor Lillqvist <tml@novell.com>
+
+ * glib/gwin32.h: Drop the pipe() macro. Defining macros outside of
+ its namespace that look like POSIX functions is not GLib's
+ business in my opinion. This means pipe()-using code that has
+ relied on this definition will need changing to call _pipe() on
+ Windows, and make the decision itself on what size pipe buffer to
+ use, and whether to use text or binary mode, and whether the pipe
+ handles should be inheritable or not.
+
+ * glib/gspawn-win32.c (make_pipe): Use _pipe() instead of pipe().
+
+2007-05-11 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c: Allow G_OPTION_ARG_CALLBACK for
+ G_OPTION_REMAINING. (#437297, Dave Benson)
+
+ * tests/option-test.c: Add a test for this.
+
+2007-05-04 Dan Winship <danw@novell.com>
+
+ * glib/gkeyfile.c (g_key_file_get_boolean)
+ (g_key_file_get_boolean_list, g_key_file_get_integer)
+ (g_key_file_get_integer_list, g_key_file_get_double)
+ (g_key_file_get_double_list): Document the error return values
+ rather than calling them undefined. #435885.
+
+2007-05-03 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/glib.symbols:
+ * glib/gunicode.h:
+ * glib/guniprop.c (g_unichar_ismark):
+ Add g_unichar_ismark(). Patch from Yevgen Muntyan. Fixes #339991.
+
+2007-05-03 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.13.1 ===
+
+2007-05-02 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/threadpool-test.c: Stop unused threads before
+ the last test, to make the test terminate reliably.
+
+ * NEWS: Updates
+
+2007-05-02 Marco Barisione <marco@barisione.org>
+
+ * glib/gregex.c: Made more clear that the string passed to the match
+ functions cannot be freed before using g_match_info_fetch() and
+ similar functions, and fixed a typo.
+
+2007-04-30 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols:
+ * glib/gregex.[hc]: Add g_regex_get_max_backref() and
+ g_regex_get_capture_count(). (#419371, Marco Barisione)
+
+2007-04-30 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols:
+ * glib/gregex.[hc]: Split GRegex into GRegex and GMatchInfo.
+ (#419368, Marco Barisione)
+
+ * tests/regex-test.c: Adapt.
+
+2007-04-30 Chris Wilson <chris@chris-wilson.co.uk>
+
+ * glib/gbookmarkfile.c (g_bookmark_file_get_app_info):
+ Include the gshell.h header file (to define g_shell_[un]quote)
+ and correct the order of the arguments to g_propagate_error(), as
+ spotted by gcc.
+
+2007-04-29 Emmanuele Bassi <ebassi@gnome.org>
+
+ * glib/gbookmarkfile.c:
+ (g_bookmark_file_set_app_info): Quote the passed command line...
+
+ (g_bookmark_file_get_app_info): ... and unquote it when giving it
+ back. (#432274)
+
+2007-04-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gstrfuncs.c: small coding style cleanups.
+
+2007-04-27 Chris Wilson <chris@chris-wilson.co.uk>
+
+ * glib/gregex.h: Remove trailing comma at end of enumerator list.
+
+2007-04-27 Tor Lillqvist <tml@novell.com>
+
+ * glib/gstdio.c (g_mkdir): Document that the mode argument is
+ ignored on Windows
+ (g_stat): Document that st_mode is mostly useless on Windows.
+
+2007-04-25 Paolo Borelli <pborelli@katamail.com>
+
+ * glib/gstrfuncs.c (g_strsplit): small cleanup. (#433387)
+
+2007-04-24 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols:
+ * glib/goption.h:
+ * glib/goption.c (g_option_context_get_help): New function to
+ get the formatted help string. (#336089, Dom Lachowicz)
+
+2007-04-24 Michael Natterer <mitch@imendio.com>
+
+ * tests/gobject/paramspec-test.c: test all GParamSpecString
+ validations with static and allocated strings.
+
+2007-04-19 William Jon McCann <mccann@jhu.edu>
+
+ * glib/gkeyfile.[ch]: (find_file_in_data_dirs),
+ (g_key_file_load_from_dirs), (g_key_file_load_from_data_dirs):
+ Add g_key_file_load_from_dirs for looking through a search
+ path for a key-file. (#355334)
+
+2007-04-15 Tor Lillqvist <tml@novell.com>
+
+ * build: Include the build module using the svn:externals
+ mechanism.
+
+ * Makefile.am
+ * configure: Add the references to build back.
+
+2007-04-11 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gspawn.c (g_spawn_async): Fix a doc typo. (#427285,
+ Jochen Baier)
+
+2007-04-11 Emmanuele Bassi <ebassi@gnome.org>
+
+ * glib/ghash.[ch]: Add g_hash_table_get_keys() and
+ g_hash_table_get_values(), API to retrieve the keys
+ and values inside an hash table in list form. (#413133)
+
+ * glib/glib.symbols: Update symbols.
+
+ * tests/hash-test.c: Exercise newly added functions.
+
+2007-04-11 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Use CFLAGS/LDFLAGS in addition to
+ PCRE_CFLAGS/PCRE_LIBS when checking system PCRE. (#421607,
+ Paul Jarc)
+
+2007-03-27 Emmanuele Bassi <ebassi@gnome.org>
+
+ * glib/gdate.h: Remove old comment and forward declaration of
+ struct tm: gdate.h includes time.h now.
+
+2007-03-23 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/gobject/Makefile.am: Handle $RANDOM missing. (#356843,
+ Paul Jarc)
+
+2007-03-22 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/guniprop.c: Fix corner-cases of upper/lowercase conversion.
+ (#418217, Denis Jacquerye)
+
+2007-03-22 Chris Wilson <chris@chris-wilson.co.uk>
+
+ * glib/gkeyfile.c: Track whether the last key=value pair in a group
+ is a blank line and during to_data() only insert a new blank line
+ betweens group in its absence. This allows the beautification of the
+ GKeyFile and prevents newlines being inserted indefinitely. (#420686)
+
+ * tests/keyfile-test.c (test_reload_idempotency): Test that after a
+ single beautification pass, g_key_file_to_data() does not alter its
+ input data.
+
+2007-03-21 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/pcre/Makefile.am: Make builddir != srcdir work. (#419900)
+
+2007-03-19 Paolo Borelli <pborelli@katamail.com>
+
+ * glib/gutf8.c (fast_validate_len): remove unneeded checks.
+
+2007-03-18 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gregex.c: Cosmetic fixes
+
+2007-03-17 Marco Barisione <marco@barisione.org>
+
+ * glib/update-pcre/table-reduction.patch:
+ * glib/update-pcre/make_utt.py:
+ * glib/update-pcre/utt.patch: Add forgotten files
+
+ * glib/update-pcre/update.sh: Call python directly instead of relying
+ on shebang. Also copy the changes from glib/pcre/makefile.msc to this
+ file
+
+2007-03-17 Hans Breuer <hans@breuer.org>
+
+ * glib/makefile.msc.in glib/pcre/makefile.msc
+ glib/update-pcre/update.sh : define PCRE_STATIC to reflect the
+ inclusion of pcre as LIB, not stand-alone DLL. Also set NEWLINE=-1
+ to match any newline by default, use of ../../build/win32/make.msc
+
+ * glib/gregex.h : minimal includes of <glib/*.H> instead of <glib.h>
+
+ * glib/gnulib/makefile.msc : make use of ../../build/win32/make.msc
+
+ * tests/regex-test.c(verbose): don't pass a string containing '%'
+ as first parameter to g_print ()
+ (test_match) : for the unexpected case output pattern and string
+ escaped
+
+ * tests/child-test.c tests/slice-color.c : fix c99ism
+ * tests/slice-test.c : fix c99ism and gccism
+ * tests/mapping-test.c tests/base-64-tests.c : don't
+ #include <unistd.h> unconditionally
+ * tests/option-test.c : use G_GINT64_CONSTANT() instead of direct LL
+
+ * tests/makefile.msc.in : more tests build
+
+2007-03-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gsequence.[hc]:
+ * glib/glib.symbols:
+ * tests/sequence-test.c: Move the consistency
+ checks to the test.
+
+2007-03-16 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.13.0 ===
+
+ * NEWS: Updates
+
+2007-03-16 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols:
+ * glib/gsequence.h: Add the test function to the header,
+ since it is exported.
+
+ * glib/gbase64.c (g_base64_decode): Warn if the input
+ is too short. (#418862, Halton Huo)
+
+Fri Mar 16 11:24:51 2007 Tim Janik <timj@imendio.com>
+
+ * glib/gscanner.[hc]: reverted premature commit which broke
+ GScanner ABI and API, #415323.
+
+2007-03-16 Chris Wilson <chris@chris-wilson.co.uk>
+
+ * glib/gkeyfile.c: Convert to GSlice and check for redundant
+ clears. (#418637)
+
+2007-03-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gscanner.[hc]: Revert recent changes that break
+ existing users of GScanner.
+
+2007-03-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gscanner.c (g_scanner_get_token_ll): Fix a typo
+ in the last commit. (#415323, Richard Hult)
+
+2007-03-15 Tor Lillqvist <tml@novell.com>
+
+ * glib/gnulib/Makefile.am (INCLUDES): Add -I$(top_srcdir)/glib so
+ that gregex.h finds <glib.h>.
+
+ * glib/update-pcre/Makefille.am-1: Add -DGLIB_COMPILATION so that
+ we don't think g_ascii_table is dllimport.
+
+ * glib/pcre/Makefile.am: Corresponding change.
+
+ * glib/update-pcre/notdll.patch: New file. Drop
+ dllimport/dllexport magic for the pcre symbols.
+
+ * glib/update-pcre/Makefile.am: Dist it.
+
+ * glib/update-pcre/update.sh: Apply notdll.patch.
+
+ * glib/pcre/pcre.h: Corresponding change.
+
+2007-03-15 Tor Lillqvist <tml@novell.com>
+
+ * glib/gtypes.h: Add comment to avoid misleading people with the
+ large number of digits in G_PI etc. (#404338)
+
+2007-03-15 Tor Lillqvist <tml@novell.com>
+
+ * config.h.win32.in: Update to match what configure produces.
+
+2007-03-15 Marco Barisione <marco@barisione.org>
+
+ Add GRegex for regular expression matching. (#50075)
+
+ * configure.in: Handle GRegex compilation.
+
+ * glib/gregex.c:
+ * glib/gregex.h: Code for GRegex.
+
+ * glib/Makefile.am:
+ * glib/makefile.msc.in: Updated makefiles.
+
+ * glib/pcre/*: Internal copy of PCRE.
+
+ * glib/update-pcre/*: Stuff to automatically update the internal PCRE
+ to a newer version.
+
+ * tests/regex-test.c:
+ * tests/Makefile.am:
+ * tests/makefile.msc.in: Add tests for GRegex.
+
+2007-03-15 Chris Wilson <chris@chris-wilson.co.uk>
+
+ * glib/gmain.c (g_main_dispatch): Replace a
+ g_slist_prepend/g_slist_remove pair with an on-stack link
+ and open coding. (#416094)
+
+2007-03-15 Matthias Clasen <mclasen@redhat.com>
+
+ Fix two glitches in the Unicode case conversion
+ functions (#418217, Denis Jacquerye)
+
+ * glib/guniprop.c (g_unichar_toupper): Handle zero entries
+ in special_case_table correctly.
+ (g_unichar_totitle): Fall back to g_unichar_toupper.
+
+2007-03-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gscanner.[hc]: Some optimizations, use a lookup
+ table for character classes, pre-allocate GStrings with
+ reasonable sizes. (#415323, Charlie Brej)
+
+2007-03-14 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_get_double): Fix a
+ small typo. (#417847, Bobby Jack)
+
+2007-03-08 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gstrfuncs.c (g_strtoll): Return negative values.
+ (#416062)
+
+ * tests/strtoll-test.c: Add more testcases.
+
+2007-03-06 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gstring.c (g_str_equal): Clarify docs. (#364026,
+ Bastian Nocera)
+
+2007-03-06 Matthew Barnes <mbarnes@redhat.com>
+
+ * glib/gqueue.h:
+ * glib/gqueue.c: Add G_QUEUE_INIT, g_queue_init(), and
+ g_queue_clear() to better support statically allocated
+ queues. (#413244)
+
+2007-03-06 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_parse_value_as_boolean):
+ Remove a NULL check that didn't do any good. (#360904,
+ Paolo Borelli)
+
+2007-03-06 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmarkup.c (g_markup_parse_context_parse): Report
+ more accurate position for invalid UTF-8. (#350802,
+ Simon Budig)
+
+2007-03-06 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gbase64.c: Add NULL checks to the base64
+ functions that take pointers. (#399611, Martyn Russell)
+
+2007-03-06 Matthias Clasen <mclasen@redhat.com>
+
+ Work with Solaris gettext (#341988, Laszlo Peter)
+
+ * m4macros/glib-gettext.m4: Make GLIB_WITH_NLS define
+ MSGFMT_OPTS if msgfmt supports -c.
+
+ * po/Makefile.in.in: Use MSGFMT_OPTS when calling
+ msgfmt.
+
+2007-03-06 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/Makefile.am: Apply a patch by Loïc Minier
+ to fix building with -Wl,-z,defs. (#149144)
+
+2007-03-03 Thierry Randrianiriana <randrianiriana@gmail.com>
+
+ * po/mg.po: Added Malagasy translation.
+ * configure.in: Added Malagasy 'mg' to ALL_LINGUAS
+
+2007-03-01 Ihar Hrachyshka <iharh@gnome.org>
+ * configure.in: Added be@latin to ALL_LINGUAS.
+
+2007-02-17 Tor Lillqvist <tml@novell.com>
+
+ * glib/gdate.c (win32_strftime_helper): New Win32-only
+ function. Use the wide character Win32 API to do the work of
+ strftime(): GetThreadLocale(), GetLocaleInfoW(), GetDateFormatW()
+ and GetTimeFormatW().
+ (g_date_strftime): On Windows use win32_strftime_helper()
+ instead of strftime() to avoid codepage issues with strftime().
+ Unfortunately using wcsftime() would not help either. (#404832)
+
+2007-02-16 Soren Sandmann <sandmann@redhat.com>
+
+ * tests/sequence-test.c: For move, test moving between two
+ sequences. Add test for swap.
+
+ * glib/gsequence.c: Replace splay tree with a treap.
+ (check_node): Add checks for the treap invariants.
+
+2007-02-10 Hans Breuer <hans@breuer.org>
+
+ * glib/makefile.msc.in : added gsequence.obj
+
+Fri Feb 9 17:46:18 2007 Søren Sandmann <sandmann@redhat.com>
+
+ * glib/gsequence.c (g_sequence_get_end_iter): Remove assertion.
+ * glib/gsequence.c (is_end): Return TRUE if the iter doesn't have
+ a parent.
+ * glib/gsequence.c: Fix grammar of comment.
+ * glib/gsequence.c (node_update_fields): Use a temporary variable
+ for the n_nodes.
+
+2007-02-07 Soren Sandmann <sandmann@daimi.au.dk>
+
+ * tests/sequence-test.c (compare_items): Force an arbitrary order
+ on otherwise identical items.
+
+ * glib/gsequence.c: Add comment discussing splay trees vs. other trees.
+ * glib/gsequence.c (is_end): Add fast path for the common case
+ when the node is not actually the end node.
+
+2007-02-05 Soren Sandmann <sandmann@daimi.au.dk>
+
+ * glib/gsequence.c (g_sequence_sort_iter): Don't prohibit access
+ until after the g_sequence_move_range() call. Bug 404759,
+ Christian Persch.
+
+ * tests/sequence-test.c: Formatting fix.
+
+2007-02-03 Soren Sandmann <sandmann@daimi.au.dk>
+
+ * glib/gsequence.c (struct _GSequence): Add a new 'real_sequence'
+ field.
+ (g_sequence_new): Initialize real_sequence to the sequence
+ (g_sequence_sort_iter): Set real_sequence of the temporary
+ sequence to the real sequence.
+ (g_sequence_sort_changed_iter): Same
+ (g_sequence_insert_sorted_iter): Same
+ (g_sequence_search_iter): Same
+ (g_sequence_iter_get_sequence): Return real_sequence
+
+ * tests/sequence-test.c (compare_iters): Insert assertions that
+ the iters point to the sequence being manipulated.
+
+2007-02-03 Soren Sandmann <sandmann@daimi.au.dk>
+
+ * glib/gsequence.[ch]: New files implementing GSequence, a list
+ implemented using a binary tree.
+ * glib/glib.h, glib/glib.symbols: Update for GSequence.
+ * docs/reference: Add documentation for GSequence
+ * tests: Add sequence-test.c, a thorough test of all of
+ the GSequence API.
+
+2007-01-30 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols:
+ * glib/gslice.h:
+ * glib/gslice.c: Don't make ABI depend on G_ENABLE_DEBUG,
+ just add an empty g_slice_debug_tree_statistics () implementation
+ in the !G_ENABLE_DEBUG case.
+
+2007-01-26 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Define G_GNUC_INTERNAL for Sun Studio
+ as __hidden. (#342981, Brian Cameron)
+
+ * glib/gconvert.c:
+ * glib/gutf8.c: Move G_GNUC_INTERNAL uses to the right
+ spot.
+
+2007-01-26 Matthias Clasen <mclasen@redhat.com>
+
+ * gmem.c:
+ * gslice.c:
+ * gmessages.c:
+ * gutils.c: Make some structs which are used only once
+ non-static.
+
+2007-01-24 Benjamin Otte <otte@gnome.org>
+
+ * glib/gprintf.c (g_sprintf): Clarify the documentation
+ regarding overflows (wording by Jan Schmidt)
+
+2007-01-23 Roozbeh Pournader <roozbeh@farsiweb.info>
+
+ * README: Remove mention of no-longer-existing PATCH
+ keyword in bugzilla. (#396899)
+
+2007-01-23 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutf8.c (g_utf8_get_char_validated): Clarify
+ the behaviour is max_len is zero. (#400044,
+ Benjamin Dauvergne)
+
+2007-01-23 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c (print_help): Use bitwise &
+ when operating on flags. (#399971, Jon Oberheide)
+
+2007-01-19 Matthias Clasen <mclasen@redhat.com>
+
+ Some file list updates (#398069, Owen Taylor)
+
+ * docs/Changes-2.0.txt
+ * docs/reference/README.cvs-commits
+ * glib.spec.in: Remove obsolete files
+
+ * tests/Makefile.am:
+ * glib/libcharset/Makefile.am:
+ * gobject/Makefile.am:
+ * Makefile.am: Add some missing files to EXTRA_DIST
+
+ * tests/timeloop-basic.c: Make it build
+ * HACKING: Small updates
+
+2007-01-18 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gdate.c (g_date_set_time): Fix a typo. (#398203,
+ Owen Taylor)
+
+2007-01-17 Tor Lillqvist <tml@novell.com>
+
+ * config.h.win32.in
+ * glib/galloca.h
+ * glib/gbacktrace.h
+ * glib/gwin32.c
+ * glibconfig.h.win32.in
+ * README.win32: More minor tweaks for Digital Mars
+ compiler. (#346808, Serhat Sevki Dincer)
+
+2007-01-17 Tor Lillqvist <tml@novell.com>
+
+ * glib-zip.in: DLLs are always installed in "bin" with current
+ libtool, drop unnecessary logic to check where they are. Include
+ also the COPYING file.
+
+2007-01-17 Tor Lillqvist <tml@novell.com>
+
+ * glib/galloca.h: Use <malloc.h> also with Digital Mars compiler
+ on Win32. (#346808, Serhat Sevki Dincer)
+
+2007-01-16 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gthread.h:
+ * glib/gthread.c:
+ * glib/glib.symbols: Revert an accidental ABI break by
+ moving gettime out of the GThreadFunctions struct and making
+ it a separate variable. (#397139, Joe Marcus Clarke)
+
+ * gthread/*.c: Adapt.
+
+2007-01-16 Tor Lillqvist <tml@novell.com>
+
+ * glib/gthread.c (gettime): GetSystemTimeAsFileTime() returns 100s
+ of nanoseconds since 1601, so offset to Unix epoch (1970) and
+ multiply by 100 to get nanoseconds which is what we want.
+
+2007-01-15 Tor Lillqvist <tml@novell.com>
+
+ * glib/gmain.h (struct _GPollFD): Fix mistake in my last commit.
+
+2005-01-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/giochannel.c:
+ * glib/gbookmarkfile.c: Remove redundant NULL-checks.
+ (#369668, Morten Welinder)
+
+2005-01-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gthread.c:
+ * gthread/gthread-posix.c: Correct the gettime calculations
+ once more. (#395203, Chris Wilson)
+
+2007-01-15 Tor Lillqvist <tml@novell.com>
+
+ * glib/gmain.h (struct _GPollFD): Prepare for potential Win64
+ build: Use gint64 for the fd field on Win64, as we want to be able
+ to store a HANDLE in it. (#395422) (Other changes will surely also
+ be necessary when building on Win64, at least in giowin32.c.)
+
+2007-01-15 Tor Lillqvist <tml@novell.com>
+
+ * glib/gwin32.c (g_win32_getlocale): Simplify greatly. Instead of
+ hardcoding a large switch statement, just ask Windows for the
+ ISO639 and ISO3166 codes. Tack on @Latn or @Cyrl for those
+ languages which can alternatively be written in Latin or
+ Cyrillic. Fixes #395419.
+
+2007-01-12 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c: Rework the handling of invalid
+ keys/groups again. We are back to being liberal about
+ what we accept, and only reject things that would lead
+ to non-rereadable keyfiles.
+
+ * tests/keyfile-test.c: Adapt tests.
+
+2007-01-12 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.c (g_get_home_dir): Clarify docs. (#394687,
+ Marc Brockschmidt)
+
+2007-01-12 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gthread.c: Include windows.h and fix
+ include order. (#394258, Kazuki Iwamoto)
+
+2007-01-12 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Make G_GNUC_INTERNAL a no-op for
+ gcc 2.95. (#329031, David Schleef, Marc Brockschmidt)
+
+2007-01-12 Matthias Clasen <mclasen@redhat.com>
+
+ * gthread/gthread-posix.c:
+ * glib/gtimer.c:
+ * glib/gthread.c: Fix errors in the recently moved
+ time calculations. (#395203, Chris Wilson)
+
+2007-01-10 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Actually link gthread against librt.
+ (#394641, Marco Pesenti Gritti)
+
+2007-01-10 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_is_key_name): Grr, allow '*' in keys,
+ too. (#394262)
+
+2007-01-09 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/gutils.h: Use a more optimized g_bit_storage() when gcc is
+ available. (#371670, Daniel Elstner)
+
+2007-01-08 Matthias Clasen <mclasen@redhat.com>
+
+ * gthread/gthread-posix.c (g_thread_impl_init): Don't
+ use _SC_MONOTONIC_CLOCK unless USE_CLOCK_GETTIME is
+ defined. (#394150)
+
+2007-01-07 Matthias Clasen <mclasen@redhat.com>
+
+ Don't link glib against libpthread. (#393812)
+
+ * configure.in: Link gthread against librt, not glib itself.
+
+ * glib/gthread.h:
+ * glib/gthread.c: Add a new thread function, gettime.
+
+ * glib/gtimer.c: Use gettime instead of directly working with
+ the various system interfaces.
+
+ * gthread/gthread-impl.c:
+ * gthread/gthread-posix.c:
+ * gthread/gthread-win32.c: Implement gettime.
+
+2007-01-07 Matthias Clasen <mclasen@redhat.com>
+
+ * m4macros/glib-2.0.m4: Use PKG_PROG_PKG_CONFIG. (#392636,
+ Yevgen Muntyan)
+
+2007-01-07 Tor Lillqvist <tml@novell.com>
+
+ * glib/giowin32.c: Handle GIOChannels for file descriptors
+ connected to the console separately. This would typically be the
+ fd 0, 1, or 2 (if not redirected) in a console application. For
+ such fds we don't need a separate thread, as console HANDLEs are
+ waitable objects. (#359202, Michiel de Hoon)
+
+2007-01-04 Behdad Esfahbod <behdad@gnome.org>
+
+ * tests/bit-test.c (builtin_bit_nth_lsf1), (builtin_bit_nth_lsf2),
+ (builtin_bit_nth_msf): Fix tests on x86_64.
+
+2007-01-03 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/goption.c (_g_unichar_get_width), (_g_utf8_strwidth),
+ (calculate_max_length), (print_entry), (print_help): Take zerowidth
+ and double-width chars into consideration when computing width of a
+ string. Also fix another bug in width computation. (#346955)
+
+ * glib/guniprop.c (g_unichar_iszerowidth): Fix typo. It was not
+ working correctly.
+
+2007-01-03 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/glib.symbols:
+ * glib/gunicode.h:
+ * glib/guniprop.c: Add g_unichar_iszerowidth(). (#347645)
+
+2007-01-03 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/gutils.h: Fix bug in g_bit_nth_lsf (#371631) and use
+ __builtin_clzl for g_bit_storage if available (#371670).
+
+ * tests/Makefile.am:
+ * tests/bit-test.c: New test, to test g_bit_* operations against
+ naive and builtin implementations.
+
+2007-01-02 Behdad Esfahbod <behdad@gnome.org>
+
+ * configure.in: Avoid more warnings from running libtool --config.
+ (#391364)
+
+2007-01-03 Michael Natterer <mitch@imendio.com>
+
+ * removed all .cvsignore files. SVN doesn't need them.
+
+2007-01-02 Emmanuele Bassi <ebassi@gnome.org>
+
+ * glib/gbookmarkfile.c (expand_exec_line): Add support for
+ expanding the desktop entry spec variables %U (list of URIs)
+ and %F (list of filenames), so that using the command line
+ from the Exec and TryExec key of a desktop entry file works
+ as intended.
+
+2007-01-02 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Avoid warnings from running libtool --config.
+ (#391364, Loïc Minier)
+
+2007-01-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gbookmarkfile.c (g_bookmark_file_get_app_info):
+ Return an error if the uri is bad. (#391370, Maciej Piechotka)
+
+2007-01-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols: Guard g_slice_debug_tree_statistics
+ by G_ENABLE_DEBUG. (#390940, Kazuki Iwamoto)
+
+2007-01-02 Michael Natterer <mitch@imendio.com>
+
+ * configure.in
+ * Makefile.am: remove references to build/ until a proper decision
+ has been made what to do with it.
+
+2007-01-01 Matthias Clasen <mclasen@redhat.com>
+
+ * glib-gettextize.in: Silence autoconf warnings about
+ datarootdir. (#391367, Loïc Minier)
+
+2006-12-31 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gslice.c: Fix some C99isms. (#390913, Kazuki Iwamoto)
+
+Fri Dec 29 13:28:07 2006 Tim Janik <timj@imendio.com>
+
+ * glib/gslice.c: turned detection of too late g_thread_init() calls
+ into a warning. this is a temporary work-around for some head-room
+ to fix affected programs, memory corruption still occours regardless.
+
+2006-12-29 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/gobject/Makefile.am:
+ * tests/gobject/dynamictype.c: New test for dynamic type
+ registration macros.
+
+Thu Dec 28 21:14:45 2006 Tim Janik <timj@imendio.com>
+
+ * glib/gslice.c: removed pthread-dependant debugging bits, the code
+ was already converted to GMutex. this obsoletes Tor's recent fixups.
+
+2006-12-28 Tor Lillqvist <tml@novell.com>
+
+ * glib/gutils.h (G_WIN32_DLLMAIN_FOR_DLL_NAME)
+ * glib/gutils.c (get_windows_directory_root): : Use only the wide
+ character API here, too.
+
+ * glib/gslice.c: Make it compile on Win32 without pthreads: Use a
+ Win32 critical section instead.
+
+ * glib/gmessages.c (g_logv): On Win32, if we get a fatal error
+ message while being debugged we break into the debugger with
+ G_BREAKPOINT(). Don't call abort() if the user is foolhardy enough
+ to continue after the breakpoint. The user presumably knows what
+ he is doing and deserves what he gets. (#376645, Andreas Köhler)
+
+Thu Dec 28 12:50:31 2006 Tim Janik <timj@imendio.com>
+
+ * glib/gslice.h, glib/gslice.c: implemented static debugging
+ hash-tree to validate slice adresses and sizes with G_SLICE=debug-blocks.
+ use abort() to exit in mem_error() to allow catching of these in gdb.
+ abort programs with a descriptive error message if g_thread_init() is
+ called after GSlice was in use. previously this just silently corrupted
+ the magazines.
+
+ * glib/ghash.c (struct _GHashNode): reordered fields to keep 8-byte
+ pointer alignment on 64bit systems and request smaller slice sizes
+ on 32bit systems.
+
+ * tests/slice-test.c: support '~' option flag to introduce slice
+ allocation/release corruption with a significant probability. this
+ allowes testing of G_SLICE=debug-blocks.
+
+2006-12-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gconvert.[hc]:
+ * glib/gfileutils.c:
+ * glib/giochannel.c:
+ * glib/goption.c:
+ * glib/gspawn.c:
+ * glib/gunicollate.c:
+ * glib/gutils.c:
+ * tests/timeloop-basic.c:
+ Consistently use gsize rather than size_t. (#333310,
+ Morten Welinder)
+
+2006-12-27 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Use AC_CACHE_CHECK for the nl_langinfo
+ check. (#304517, Lőrinczy Zsigmond)
+
+2006-12-27 Tor Lillqvist <tml@novell.com>
+
+ * glib/gwin32.h
+ * glib/gwin32.c (get_package_directory_from_module)
+ (g_win32_get_package_installation_directory)
+ (g_win32_get_package_installation_subdirectory): Add const to
+ gchar* arguments. (#384523, Yevgen Muntyan)
+
+2006-12-27 Ryan Lortie <desrt@desrt.ca>
+
+ * glib/ghash.c: cache the value of the hash function
+ in the GHashNode. this speeds up resizing the hash
+ table and it also allows a slight optimisation on
+ lookups. (#388332)
+
+2006-12-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gunicollate.c (g_utf8_collate_key): Don't modify
+ the current locale. (#389300)
+
+2006-12-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutf8.c: Add hints for locale-dependent interfaces.
+ * glib/gconvert.c: Add hints for locale-dependent interfaces.
+
+ * glib/gconvert.c (g_get_filename_charsets): Improve
+ formatting of docs.
+
+2006-12-26 Behdad Esfahbod <behdad@gnome.org>
+
+ * configure.in: Use libtool to determine shared library suffix.
+ (#357245)
+
+2006-12-24 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/run-collate-tests.sh:
+ * tests/unicode-collate.c: Silently skip tests if
+ we can't set LC_COLLATE to en_US. (#336438)
+
+2006-12-19 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_is_key_name): Accept
+ '/', '+' and '.' in key names, since gnome-vfs uses
+ mime types as keys in some cache.
+
+ * tests/keyfile-test.c: Tests for the above.
+
+2006-12-18 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Fix the broken poll test. (#387260,
+ Christian Persch)
+
+ * glib/gmain.c (child_watch_helper_thread): Readd a
+ return which was removed as dead code a while ago.
+ icc may consider it dead, but gcc doesn't like non-void
+ functions without a return... (#354707)
+
+ * tests/Makefile.am: Try a different fix for bug 346373.
+
+2006-12-18 Matthias Clasen <mclasen@redhat.com>
+
+ Fix bug 161288:
+
+ * configure.in: Check for wcslen.
+
+ * glib/gnulib/vasnprintf.c: Handle wcslen missing.
+
+2006-12-18 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c: Accept '@' in locale names.
+
+ * glib/gkeyfile.c: Tighten up the check for allowed
+ key and group names. (#343191, Tommi Komulainen)
+
+ * tests/keyfile-test.c: Test handling of key and group names.
+
+ * tests/Makefile.am: Don't use $RANDOM if the shell doesn't
+ have it. (#346373, Thomas Klausner)
+
+2006-12-17 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/gstring.c: Improve docs about string functions taking a
+ length. (#378727)
+
+2006-12-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gconvert.c:
+ * glib/gutf8.c (_g_charset_get_aliases): Put the G_GNUC_INTERNAL
+ where gcc doesn't complain about it.
+
+ * glib/ghash.c: Make ref_count an int to avoid compiler
+ warnings.
+
+ * configure.in: Use AC_LANG_SOURCE for the clock test.
+
+ * glib/gthreadpool.h:
+ * glib/gthreadpool.c (g_thread_pool_free): Don't use "wait"
+ as parameter name. (#379207, Christian Biere)
+
+ * glib/gspawn.c: Refer to g_child_watch_add() in addition
+ to waitpid().
+
+ * glib/gstrfuncs.c (g_strndup, g_strnfill): Move docs
+ inline, and improve wording. (#372598, Behdad Esfahbod)
+
+ * glib/gspawn.c: Add some pointers to the gdk_spawn_
+ variants. (#338134, Federico Mena Quintero)
+
+ * configure.in: Make montonic clock test work again. Does
+ AC_COMPILE_IFELSE not get confdefs ? Also, move the clock
+ tests below the thread checks to fix #364663.
+
+ * tests/run-markup-tests.sh: Don't use diff -u (#380801,
+ Marek Rouchal)
+
+ * glib/gspawn.c: Fix the recent fdwalk()-related changes
+ to not break mapping-test. (#286838, Marco Barisione)
+
+ * glib/gstring.c (g_string_chunk_new): Don't shadow size.
+ (#386760, Kazuki IWAMOTO)
+
+2006-12-16 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gstring.c: Move more documentation inline.
+
+ * configure.in: Use AC_COMPILE_IFELSE for the monotonic
+ clock test. (#362918, Han-Wen Nienhuys, Jeremy Lainé)
+
+ * glib/gstring.c: Move documentation inline.
+
+2006-12-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/giochannel.h: Make ref_count a gint to avoid
+ compiler warnings. (#321977, Andrew Paprocki)
+
+ * configure.in: On Solaris, set CFLAGS and LDFLAGS that
+ work both with Sun cc and gcc. (#315061, Lazlo Peter)
+
+ * glib/gspawn.c: Undefine READ_OK to fix the build on
+ old versions of Darwin. (#327800)
+
+ * glib/glib.symbols:
+ * glib/gstring.[hc] (g_string_chunk_clear): Add a function
+ for clearing a GStringChunk. (#364608, Matt Barnes)
+
+ * glib/guniprop.c (interval_compare): Avoid a compiler
+ warning.
+
+ * glib/gspawn.c (do_exec): Call set_cloexec() with
+ the right parameters. (#386252, Guillaume Desmottes)
+
+2006-12-15 Matthias Clasen <mclasen@redhat.com>
+
+ Fix #357585, Padraig O'Briain.
+
+ * configure.in: Check for fdwalk.
+
+ * glib/gspawn.c (do_exec): Use fdwalk() to close all
+ file descriptors.
+
+ * glib/gspawn.c (fdwalk): Fallback implementation of
+ fdwalk.
+
+2006-12-14 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gconvert.c (open_converter): Don't use alloca
+ and avoid allocating memory for small keys that are
+ already cached. (#172406, Morten Welinder)
+
+ * glib/gmain.c (g_child_watch_add_full): Improve the docs.
+ (#345569, Tim-Philipp Müller)
+
+ * glib/gkeyfile.c (g_key_file_add_group): If the group
+ is already there, make it current. (#385910, Joe Halliwell)
+
+ * tests/keyfile-test.c: Add a test for duplicate groups/keys.
+
+2006-12-13 Matthias Clasen <mclasen@redhat.com>
+
+ * m4macros/glib-gettext.m4: Require AC_CANONICAL_HOST in
+ GLIB_WITH_NLS. (#385132, Laszlo Peter)
+
+2006-12-12 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Add a check for broken poll on Mac OS X.
+
+ * glib/gmain.c: Use poll emulation on OS X. (#302672, Toby Peterson,
+ patch by Dave Vasilevsky)
+
+2006-12-11 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gatomic.c: Don't use local numeric labels in
+ inline assembler on AIX. (#316434, Hans Rosenfeld)
+
+ * glib/gunicode.h (g_utf8_next_char): Cast to const char *,
+ not char *. (#138153, Nikolai Weibull)
+
+Wed Nov 22 16:09:13 2006 Tim Janik <timj@gtk.org>
+
+ * glib/gmacros.h: added G_GNUC_MAY_ALIAS, suggested by Mathias
+ Hasselmann in bug #335341, fixes bug #335853.
+
+2006-11-15 Matthias Clasen <mclasen@redhat.com>
+
+ * m4macros/glib-gettext.m4: Apply a patch from James
+ Henstridge for compatibility with automake 2.60 (#343825)
+
+2006-11-14 Behdad Esfahbod <behdad@gnome.org>
+
+ * sanity_check: Replace bash-specific == with sh-understood =.
+ Fixes bug #373864.
+
+2006-11-05 Hans Breuer <hans@breuer.org>
+
+ * glib/makefile.msc.in : glib/ version not the gobject/
+ one I accidentially commited. Fixes bug #371074.
+
+2006-11-05 Tor Lillqvist <tml@novell.com>
+
+ * makefile.mingw
+ * gmodule/makefile.mingw.in
+ * glib/makefile.mingw.in
+ * gobject/makefile.mingw.in
+ * gthread/makefile.mingw.in
+ * tests/makefile.mingw.in: Remove from CVS. Haven't been
+ maintained or distributed for long.
+
+2006-10-26 Pascal Terjan <pterjan@linuxfr.org>
+
+ * glib/libcharset/localcharset.c: Fix small leak on failed
+ realloc in _g_locale_get_charset_aliases (#338582)
+
+2006-10-16 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/gnulib/Makefile.am: Add $(GLIB_DEBUG_FLAGS). (#362543,
+ Peter Kjellerstedt)
+
+2006-10-15 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * tests/Makefile.am: Compile errorcheck-mutex-test with thread
+ libraries explicitly. (#74748, Javier Villavicencio)
+
+2006-10-08 Matthias Clasen <mclasen@redhat.com>
+
+ Add a way to obtain Unicode script information. (#348348,
+ Marco Barisione)
+
+ * glib/glib.symbols:
+ * glib/gunicode.h: Add GUnicodeScript enumeration and
+ g_unichar_get_script.
+
+ * glib/guniprop.c: Implement g_unichar_get_script.
+
+ * glib/gscripttable.h: Generated private header containing
+ script tables.
+
+ * glib/gen-script-table.pl: Script to generate gscripttable.h.
+
+ * glib/Makefile.am: Update
+
+2006-10-08 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/run-markup-tests.sh: Small portability fix. (#347944,
+ Dan McMahill)
+
+2006-10-07 Tor Lillqvist <tml@novell.com>
+
+ * glib/gwin32.c (get_package_directory_from_module)
+ (g_win32_get_package_installation_directory): g_strdup the keys
+ that we are passed before adding them to the hash tables, to guard
+ against the caller freeing them. (#355955, Andreas Köhler)
+
+2006-10-06 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gtimer.c: Fix a typo. (#359190)
+
+2006-10-02 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/Makefile.am:
+ * gobject/Makefile.am:
+ Include pltcheck.sh in EXTRA_DIST, and remove redefinition of TESTS.
+ (#358966)
+
+2006-10-01 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gtimer.c (g_usleep): Use nsleep to implement
+ g_usleep on AIX. (#321974, Andrew Paprocki)
+
+ * configure.in: Check for nsleep
+
+ * glib/gmain.c: Fix typos in doc comments.
+ (#358421, Tom Tromey)
+
+2006-09-30 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/pltcheck.sh: A script to check PLT entries.
+ * glib/Makefile.am (TESTS): Run pltcheck.sh
+
+ * glib/*: Fix includes to correct some issues with
+ PLT entries. (#354522, Behdad Esfahbod)
+
+2006-09-17 Hans Breuer <hans@breuer.org>
+
+ * glib/makefile.msc.in gobject/makefile.msc.in : better filtering
+ of G_GNUC_* stuff when generating .def files. Now also works with
+ newer (less tolerant) linkers, e.g. from vc2500e
+
+2006-09-10 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gbacktrace.c: Assume string.h is available.
+ (#354523, Behdad Esfahbod)
+
+ * configure.in: Bump version to 2.13.0
+
+ * glib/glib.symbols:
+ * glib/gmain.[hc]: Add functions to create approximate
+ timeouts. (#353942, Arjan van de Ven)
+
+ * glib/gstdio.c (g_rename): Initialize save_errno.
+ (#355206, Mike Edenfield)
+
+2006-09-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gerror.c: Allocate GErrors using the slice allocator.
+ (#354054, Matt Barnes)
+
+2006-09-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gtimer.c: Forgotten HAVE_CLOCK_GETTIME.
+
+2006-09-02 Tor Lillqvist <tml@novell.com>
+
+ * glib/gutils.c (g_get_any_init_do): Correct C99ism (mixed
+ declarations and code) in Win32 ifdef branch. (#353903, Mike
+ Edenfield)
+
+2006-09-01 Abel Cheung <abel@oaka.org>
+
+ * configure.in: Added 'dz' 'hy' to ALL_LINGUAS.
+
+2006-09-01 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Check for CLOCK_MONOTONIC.
+
+ * glib/gtimer.c: Only use clock_gettime if we
+ have a monotonic clock.
+
+2006-08-31 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Add missing includes to a few test
+ programs. (#353580, Chris Wilson)
+
+2006-08-30 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmarkup.c (g_markup_vprintf_escaped): Don't call
+ va_end on caller-provided va_args. (#353584, Chris Wilson)
+
+2006-08-29 Tor Lillqvist <tml@novell.com>
+
+ Remove support for Windows 9x/ME, as will be done also in Pango
+ and GTK+. GTK+ hasn't worked on Win9x since 2.6 or 2.8 anyway, so
+ it's pretty pointless to keep the Win9x code in here either. If
+ somebody is interested, the code can always be found in older GLib
+ versions, and in CVS.
+
+ * glib/gdir.c
+ * glib/gfileutils.c
+ * glib/gspawn-win32-helper.c
+ * glib/gspawn-win32.c
+ * glib/gstdio.c
+ * glib/gutils.c
+ * glib/gwin32.c
+ * glib/gwin32.h: Remove the G_WIN32_IS_NT_BASED() and
+ G_WIN32_HAVE_WIDECHAR_API() tests and their false (Win9x)
+ branches, and any variables or static functions used only by the
+ Win9x branches.
+
+ * glib/gwin32.c (g_win32_windows_version_init): Call g_error() if
+ run on Win9x.
+
+2006-08-27 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Fix pthread compiler flag detection.
+
+ * glib/gtimer.c: Use Posix monotonic clocks instead of
+ gettimeofday when available. (#336114, William Jon McCann)
+
+2006-08-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.h:
+ * glib/gscanner.c: Fix some typos. (#351741, Kjartan Maraas)
+
+2006-08-25 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Fix the pthread compiler flag detection.
+
+ * glib/gunicode.h:
+ * glib/gutf8.c (_g_utf8_make_valid): Rename make_valid_utf8
+ from gconvert.c, move it to gutf8.c, and export it privately.
+
+ * glib/gconvert.c (g_filename_display_name): Adjust callers.
+
+ * glib/gkeyfile.c: Use _g_utf8_make_valid() in a number of
+ places to ensure error messages are valid UTF-8. (#351853,
+ Simon Budig)
+
+2006-08-22 Matthias Clasen <mclasen@redhat.com>
+
+ * Branch for 2.12
diff --git a/trunk/ChangeLog.pre-1-2 b/trunk/ChangeLog.pre-1-2
new file mode 100644
index 000000000..e5b481aa9
--- /dev/null
+++ b/trunk/ChangeLog.pre-1-2
@@ -0,0 +1,2880 @@
+Sun Feb 21 22:11:51 CST 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.2.0
+
+ * AUTHORS: updated
+
+Wed Feb 24 00:08:42 CST 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * *.[ch]: inserted additional note to look for ChangeLog and
+ AUTHORS file for a log of modifications.
+
+Sun Feb 21 14:01:00 1999 Dr Mike <drmike@redhat.com>
+
+ * Made specfile generated, tweaked slightly
+
+Thu Feb 18 08:24:12 1999 Tim Janik <timj@gtk.org>
+
+ * gmem.c (g_realloc): plugged a memory leak, reported by Koen D'Hondt
+ <ripley@xs4all.nl> on 15 Oct 1998. allocate inital block from realloc.
+
+1999-02-17 Elliot Lee <sopwith@redhat.com>
+
+ * glib.spec: Do --enable-debug=no for the .rpm's.
+
+Wed Feb 17 17:04:06 1999 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32: Must define HAVE_PTHREAD_GETSPECIFIC_POSIX.
+
+Tue Feb 16 14:08:59 CST 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * NEWS
+ README
+ INSTALL
+ config.h.win32
+ configure.in
+ glib.spec
+ glibconfig.h.win32
+ docs/glib-config.1: version=1.1.16
+
+ * Released GLib 1.1.16
+
+1999-02-15 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib.h, glibconfig.h.win32, configure.in: Changed signature of
+ all g_static_mutex_* functions to take a pointer rather than the
+ struct itself. This is not an issue at the moment, because those
+ funcs are really macros, but is it un'G'ish and might fall on our
+ feet in the future.
+
+Mon Feb 15 07:45:54 1999 Tim Janik <timj@gtk.org>
+
+ * configure.in (--enable-debug): default to yes for development trees.
+
+Mon Feb 15 06:18:58 1999 Tim Janik <timj@gtk.org>
+
+ * glib.h: return guints instead of gints for g_hash_table_size
+ and g_hash_table_foreach_remove.
+
+Wed Feb 10 12:01:42 1999 Tim Janik <timj@gtk.org>
+
+ * configure.in: don't reset G_MODULE_IMPL, so it can be overridden
+ from the command line.
+
+1999-02-10 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib.h: s/G_LOCK_DECLARE/G_LOCK_DEFINE/ throuhout glib. Added
+ G_LOCK_EXTERN macro to declare a lock externally.
+
+Wed Feb 10 06:20:30 1999 Tim Janik <timj@gtk.org>
+
+ * gmutex.c (g_static_private_set): invoke destroy notifier when
+ overwriting values, initialize new array fields with NULL.
+ (g_static_private_free_data): do not skip destroy notification for
+ data == NULL.
+
+ * gutils.c (g_direct_equal): compare pointer values directly instead
+ of just their guint values which is a loosing conversion for
+ sizeof(gpointer)==8 systems.
+ (g_get_any_init): restructured code so we don't use endless loops like
+ while (1), which boil down to an ugly alias for goto.
+ strip ,.* from the real name.
+
+February 9, 1999 sopwith@redhat.com
+
+ . glist.c, gnode.c, gslist.c: allocate pools of 128 items instead
+ of 1024 items.
+
+1999-02-08 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in, acconfig.h: Changed the test for getpwuid_r to
+ exclude those systems (i.e. IRIX), that set ENOSYS after the call.
+ Test, if pthread_getspecific is posix like or something different,
+ as on PCThreads.
+
+Sun Feb 7 21:56:00 1999 Owen Taylor <otaylor@redhat.com>
+
+ * gmem.c (g_mem_profile): Copy all elements
+ of the allocations[] array, including the last.
+ (Pointed out by "Matthew W. Samsonoff" <mws7323@osfmail.isc.rit.edu>)
+
+1999-02-05 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Make the error message in case of a broken thread
+ system a bit more informative.
+
+ * gutils.c (g_get_any_init): Changed the error logic again, now
+ only leaving the memory doubling loop, when success is reached or
+ when the user isn't found or when the buffer is 32k big,
+ additionally now getpwuid will be run, if getpwuid_r didn't work
+ out properly. A warning is issued however.
+
+Thu Feb 04 20:42:24 1999 Tor Lillqvist <tml@iki.fi>
+
+ * glibconfig.h.win32 config.h.win32: Update GLIB_MICRO_VERSION.
+
+1999-02-04 Christopher Blizzard <blizzard@redhat.com>
+
+ * glib.spec (Packager): Change my email address
+
+Thu Feb 4 01:45:01 PST 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * ChangeLog
+ NEWS
+ README
+ configure.in
+ glib.spec
+ docs/glib-config.1: version=1.1.15
+
+ * Released GLib 1.1.15
+
+Tue Feb 02 00:08:54 1999 Tor Lillqvist <tml@iki.fi>
+
+ * gmessages.c (g_log_default_handler): (Win32:) Don't call
+ ensure_stdout_valid (which would open an unneeded console window)
+ if we're calling a logging function. Define ensure_stdout_valid
+ as an empty macro on Unix.
+
+ * gutils.c (g_get_any_init): (Win32:) Trust HOME first if defined,
+ then try HOMEDRIVE and HOMEPATH.
+
+Mon Feb 1 19:04:28 1999 Owen Taylor <otaylor@redhat.com>
+
+ * gmain.c (g_main_iterate): Release the main_loop
+ lock around calls to prepare() and check() so
+ that we are not holding the main loop lock
+ over user code.
+
+1999-01-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Moved the check for MT safe function variants
+ after the determination of the MT cflags and use them there.
+
+1999-01-29 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Fixed typo. Now HPUX 11 thread system detection
+ should work.
+
+ * gutils.c (g_get_any_init): Changed initial bufsize to 64. Should
+ solve some problems out there.
+
+Wed Jan 27 23:21:50 CST 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * INSTALL
+ NEWS
+ README
+ configure.in
+ glib.spec
+ docs/glib-config.1: version=1.1.14
+
+ * Released GLib 1.1.14
+
+1999-01-28 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Simplified configure.in test for posix threads,
+ systems, that provide /usr/include/pthread.h should also have the
+ posix thread library. This is to avoid writing down all the tests
+ twice. New test for thread system on HPUX 11. Info from Matt
+ Nottingham <matt@sar.dera.gov.uk>.
+
+Wed Jan 27 20:39:49 PST 1999 Manish Singh <yosh@gimp.org>
+
+ * acinclude.m4: Xsed isn't valid here, don't use it
+
+ * ltmain.sh
+ * ltconfig: better file magic regexp for Linux libs
+
+ * gmodule/Makefile.am: arg, noinst_LTLIBRARIES doesn't make shared
+ libs, revert my previous change to this file
+
+ * docs/texinfo.tex: add it so automake doesn't whine
+
+Wed Jan 27 01:57:19 1999 Tim Janik <timj@gtk.org>
+
+ * configure.in (G_MODULE_HAVE_DLERROR): applied patch from Andrej
+ Borsenkow <borsenkow.msk@sni.de> to also check for dlsym() in system
+ libraries and -ldl, to catch systems that provide dlopen() in libc
+ and dlsym() in libdl. this is at least the case for Reliant UNIX
+ 5.44 (labeling itself as SINIX).
+
+Tue Jan 26 13:39:22 PST 1999 Manish Singh <yosh@gimp.org>
+
+ * configure.in: don't use backquotes in warning text
+
+1999-01-26 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gdate.c (g_date_set_time): Removed the #warning about MT
+ unsafety without localtime_r.
+
+ * configure.in: Moved it here.
+
+Mon Jan 25 10:07:53 1999 Raph Levien <raph@gimp.org>
+
+ * configure.in: (#define G_THREADS_IMPL...) Changed the #define,
+ adding the G_THREADS_IMPL_ prefix to $g_threads_impl_def because
+ it looked wrong to me and was breaking gimp compile.
+
+Mon Jan 25 15:34:43 1999 Timur Bakeyev <mc@bat.ru>
+
+ * configure.in, gstrfuncs.c: Inverted logic of NO_SYS_SYGLIST_DECL -
+ now it's normal (see 1999-01-19 Josh MacDonald). Also, remove from
+ #include <signal.h> wrapper NO_SYS_SYGLIST - *sys_syglist[] declara-
+ tion hides there.
+
+1999-01-25 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Do not use the thread libs, when searching for
+ some functions, as this might require glib to always be linked
+ with the thread libs on some platforms.
+
+ * gutils.c (g_get_any_init): Don't set errno to zero and use it
+ only as the error code, if the function returned a value less
+ 0. It might happen, that the call succeeds, even though the errno
+ is set during the call (i.e. it first looks for a passwd file,
+ which is not found). Submitted by Michael Natterer
+ <mitschel@cs.tu-berlin.de>. BTW: Sorry for all the mess with that
+ `getpwuid_r' change, but it had to be done once.
+
+Sun Jan 24 10:33:30 1999 Tim Janik <timj@gtk.org>
+
+ * gutils.c (g_get_any_init): reverted raja's changes, since they leaked
+ a struct passwd contents buffer and for the rest mostly substituted a
+ while loop with a bunch of gotos.
+ restored the getpwuid() code to what we had after my recent clean ups
+ ("Sat Jan 23 02:14:28 1999 Tim Janik"), module yosh's recent changes.
+ to feature solaris behaviour of directly returning errno, we don't
+ modify error anymore if it's > 0 and simply reset errno.
+ don't reset g_home_dir for !NATIVE_WIN32 && !NATIVE_WIN32.
+
+1999-01-24 Raja R Harinath <harinath@cs.umn.edu>
+
+ * gutils.c
+ (g_get_any_init) [HAVE_GETPWUID_R && HAVE_GETPWUID_R_POSIX]:
+ Hopefully got the error handling for `getpwuid_r' right.
+ (g_get_any_init) [HAVE_GETPWUID_R && !HAVE_GETPWUID_R_POSIX]:
+ Fix typo (change `pw == NULL' to `pw != NULL').
+
+Sun Jan 24 00:36:22 EST 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * ghash.c:
+ - Revert previous "fix" (which really just did things a
+ different way).
+ - (g_hash_table_remove): Don't need to support multiple values
+ for a single key.
+
+ * tests/hash-test.c:
+ Add test where hash function always returns a single value.
+ Add beginnings of tests for g_hash_table_foreach[_remove] and
+ g_hash_table_remove.
+
+Sat Jan 23 20:40:06 PST 1999 Manish Singh <yosh@gimp.org>
+
+ * gutils.c: removed the #warning about MT without getpwuid_r
+
+ * configure.in: and moved it here
+
+Sat Jan 23 22:45:59 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * ghash.c (g_hash_table_lookup_node, g_hash_table_lookup,
+ g_hash_table_insert, g_hash_table_remove,
+ g_hash_table_lookup_extended):
+ - Fixed bug that overwrote nodes in hash buckets instead of
+ adding them to the hash bucket node list.
+ Hash tables now work as advertised.
+
+ (g_hash_table_resize):
+ - Use g_new0 instead of manual init.
+ - Space out code a bit for readability.
+
+ (g_hash_nodes_destroy):
+ - Replaced "if (!hash_node) return;" with
+ "if (hash_node) {do stuff}".
+ Testing takes up less code space than explicit call to
+ 'return' before end of function. (look at gcc -S)
+
+ Updated module header copyright to 1999.
+ New module macro G_HASH_BUCKET for (table,key)->bucket lookups.
+
+ * tests/hash-test.c:
+ - Add two new tests, one with strings as the keys and values, and
+ one with ints as the keys and values. Tests indirect (strings)
+ and direct (ints) hashing.
+ - Cleanup unused junk left over from testglib.c.
+ - Converted a g_print call to g_assert_not_reached.
+ - Updated copyright to 1999.
+
+ * testglib.c, tests/string-test.c:
+ - Init 'tmp_string' var to NULL, silencing uninit-var warning.
+
+1999-01-23 Raja R Harinath <harinath@cs.umn.edu>
+
+ * gutils.c (g_get_any_init) [HAVE_GETPWUID_R]:
+ Rewrite not to look at `errno' if library call succeeds, since
+ `errno' is not reset to 0.
+
+Sat Jan 23 16:17:04 1999 Tor Lillqvist <tml@iki.fi>
+
+ * glibconfig.h.win32: Update the magic values for
+ pthread_mutex_t size and initializer bytes to match the
+ latest version of pthreads for Win32.
+
+Sat Jan 23 02:14:28 1999 Tim Janik <timj@gtk.org>
+
+ * gutils.c (g_get_any_init): cleaned up the errno mess for
+ GETPWUID. we especially don't want to g_error() out here!
+ the warning for G_THREADS_ENABLED and !HAVE_GETPWUID_R isn't
+ gcc related.
+ if !HAVE_PWD_H and !NATIVE_WIN32, g_free the home dir before
+ resetting it to NULL, why are we doing this anyways?
+ reordered code a bit so we always provide defaults (except
+ for g_home_dir).
+
+Thu Jan 21 12:40:11 EST 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * tests/{Makefile.am, string-test.c, strfunc-test.c}:
+ Separate string and strfunc tests, working towards goal of
+ having separate test for each of the GLib modules.
+ Add a couple GString length tests.
+
+Thu Jan 21 09:36:05 EST 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * configure.in:
+ Use AC_PREREQ not AC_REQUIRE for autoconf version test.
+
+1999-01-21 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gutils.c (g_get_any_init): Changed error handling again, as the
+ error is not always set in errno, it is the return value on some
+ systems. What an evil world.
+
+Thu Jan 21 05:35:20 1999 Tor Lillqvist <tml@iki.fi>
+
+ * gstrfuncs.c: Include signal.h only when the signal names will be
+ needed.
+
+Wed Jan 20 22:09:59 EST 1999 Mandrake <mandrake@mandrake.net>
+
+ * configure.in / Makefile.am : made some adjustments for automake 1.4
+ and autoconf 2.13 (per suggestions made by Raja R Harinath
+ <harinath@cs.umn.edu>)
+
+Wed Jan 20 20:33:14 EST 1999 Mandrake <mandrake@mandrake.net>
+
+ * autogen.sh: automake 1.4 and libtool 1.2d notices.
+ (maybe I'll write an actual test for automake 1.4 later)
+
+Wed Jan 20 15:05:25 PST 1999 Manish Singh <yosh@gimp.org>
+
+ * HACKING: new file
+
+ * Makefile.am: since we require automake 1.4 now, ditch the build
+ top-level first and just use SUBDIRS
+
+ * gmodule/Makefile.am: use noinst_LTLIBRARIES instead of overriding
+ the install rule
+
+Wed Jan 20 16:16:01 EST 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * gutils.c (g_get_any_init):
+ Revert previous patch, move error value set line down to proper
+ place. Caught by Elliot Lee <sopwith@redhat.com>.
+
+Wed Jan 20 20:48:58 GMT 1999 Adam D. Moss <adam@gimp.org>
+
+ * gutils.c (g_get_any_init): All gtk apps were broken
+ here on my setup. I changed the error to a warning to at
+ least get things limping.
+
+1999-01-20 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gutils.c (g_get_any_init): Use getpwuid_r with the right
+ signature, if available.
+
+ * configure.in, acconfig.h: Test for existance of getpwuid_r and
+ its signature.
+
+Tue Jan 19 20:52:43 1999 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am (EXTRA_DIST): Add new Win32 files.
+
+ * README.win32: Describe the conditional compilation macros.
+
+ * makefile.lcc: Removed.
+
+1999-01-19 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Moved test for localtime_r and rand_r to a place
+ after the determination of the G_THREAD_LIBS and use them for
+ finding those functions, necessary on systems with a different C
+ library libc_r for threaded progs, like FreeBSD 2.2.x. Info from
+ Timur Bakeyev <mc@bat.ru>.
+
+Tue Jan 19 00:44:24 1999 Josh MacDonald <jmacd@axis.hip.berkeley.edu>
+
+ * gstrfuncs.c (g_strsignal): The "extern char* sys_siglist"
+ declaration breaks systems with different declarations, like
+ mine (FreeBSD). So, I added a configuration variable to decide
+ whether the declaration is neccesary. Change also appears on
+ line 275 of configure.in.
+
+Sun Jan 17 17:13:54 CST 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.1.13
+
+ * README:
+ INSTALL:
+ docs/glib-config: ver=1.1.13
+
+Mon Jan 18 00:02:46 1999 Tim Janik <timj@gtk.org>
+
+ * NEWS: updates for 1.1.13.
+
+Sun Jan 17 17:15:59 1999 Tim Janik <timj@gtk.org>
+
+ * gtree.c (g_tree_traverse): removed assertion about rtree->root being
+ NULL, so this function can be applied to unpopulated trees as well, fix
+ provided by Simon Kagedal <sika8225@csd.uu.se>.
+
+Sun Jan 17 11:17:19 1999 Christopher Blizzard <blizzard@appliedtheory.com>
+
+ * glib.spec: add packager address
+
+Sun Jan 17 11:10:05 1999 Christopher Blizzard <blizzard@appliedtheory.com>
+
+ * glib.spec: increment version number to 1.1.13
+
+Sun Jan 17 16:14:03 1999 Tim Janik <timj@gtk.org>
+
+ * glib.h (g_error): if !defined (G_LOG_DOMAIN) define G_LOG_DOMAIN as
+ ((gchar*) 0) instead of ((void*) 0) to silence egcs C++ mode, reported
+ by Seth Alves <alves@hungry.com>.
+
+Sun Jan 17 14:13:52 1999 Tim Janik <timj@gtk.org>
+
+ * glib.h: added a define G_HOOK_DEFERRED_DESTROY, to substitute a noop
+ GHookList.hook_destroy function.
+
+ * ghook.c (g_hook_destroy_link): don't really call hook_destroy if it
+ is G_HOOK_DEFERRED_DESTROY. for the case where we invoke hook->destroy()
+ we now clean up the hook completely afterwards, i.e. data, func and
+ destroy are immediately set to NULL and hook_free can't play with that
+ values anymore.
+
+ * gmain.c (g_source_add): set hook_destroy to G_HOOK_DEFERRED_DESTROY,
+ instead of using an ugly _noop() hack, this is to avoid an uneccessary
+ function invocation. set hook_free to g_source_destroy_func, this way
+ we always invoke the destroy notifiers for user_data and source_data
+ after execution of dispatch(). thus, g_source_destroy_func() will always
+ be called within the main_loop lock (this wasn't really assured
+ before), and can release and reaquire the look around destroy notifier
+ invocation.
+
+Sun Jan 17 11:01:40 1999 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32 glibconfig.h.win32: Increment version number here
+ also.
+
+Sun Jan 17 05:12:17 1999 Tim Janik <timj@gtk.org>
+
+ * configure.in: incremented version number to 1.1.13, bin age 0,
+ interface age 0.
+
+ * glib.h: added hook_destroy member to struct _GHookList.
+
+ * ghook.c (g_hook_destroy_link): if the hook_list defines a hook_destroy
+ function, use that to marshal hook destruction notifiers.
+
+ * gmain.c: removed g_source_free_func and added g_source_destroy_func,
+ which marshalls the user_data and source_data destructors of sources
+ outside of the main_loop lock.
+ removed GIdleData struct since its sole member callback can be passed
+ as source_data directly.
+ added a gboolean return value to all g_source_remove* functions,
+ indicating whether the source could be removed, because these functions
+ don't issue warnings upon unseccessful removals themselves. this way at
+ least the caller gets a chance to warn upon failing removals.
+ (g_main_iterate): set in_check_or_prepare around calls to check() or
+ prepare().
+ (g_main_pending): simply return FALSE if called from within check() or
+ prepare().
+ (g_main_iteration): issue a warning if called from within check() or
+ prepare() and bail out with FALSE.
+ (g_main_run): likewise.
+ (g_source_remove_by_funcs_user_data): new function to remove sources by
+ user data and function table.
+ (g_idle_remove_by_data): new function to really remove idles only, since
+ g_source_remove_by_user_data would remove timeouts or other sources as
+ well.
+
+1999-01-16 Tor Lillqvist <tml@iki.fi>
+
+ * Merge in current Win32 version:
+
+ * README.win32: More text.
+
+ * config.h.win32 glibconfig.h.win32: Update to match the
+ corresponding generated files on Unix.
+
+ * makefile.msc: Update with new source files, and gthread
+ library. Use the compiler flag -MD instead of using -D_DLL and
+ /nodefaultlib:libc msvcrt.lib in the link phase.
+
+ * glib.def: Update to include new functions, drop removed ones.
+
+ * glib.h: Add comments about main loop and polling on Win32. (In
+ general, it's only for the GIMP's use.) Add Win32 IO Channel
+ functions. Remove the obsoleted old IO Channel stuff (which was
+ in #if 0 already).
+
+ * giowin32.c: New file.
+
+ * gmain.c: Include config.h, conditionalize <sys/time.h>
+ inclusion. Add g_poll implementation for Win32 (only for the
+ GIMP's needs for now, it's hard or even impossible to be as clean
+ and generic as on Unix). Implement g_get_current_time on Win32. If
+ threads aren't supported, don't try to wake up main thread's
+ loop. On Win32, use a semaphore and not a pipe to wake up the main
+ loop.
+
+ * gmessages.c: On Win32, allocate a console window if the standard
+ output handle is invalid before writing to stdout, and reopen stdout
+ to that console window.
+
+ * giochannel.c: Conditionalize unistd.h inclusion. Some indentation
+ cleanup.
+
+ * gstrfuncs.c: Include <signal.h>.
+
+ * gutils.c: On Win32, also check the HOMEDRIVE and HOMEPATH
+ environment variables.
+
+Sun Jan 17 01:06:38 1999 Timur Bakeyev <mc@bat.ru>
+
+ * configure.in: Add support for FreeBSD 2.2.x macro _THREAD_SAFE.
+
+Wed Jan 13 11:27:24 PST 1999 Manish Singh <yosh@gimp.org>
+
+ * glib.h: don't use inline for !__GNUC__ case with g_warning,
+ g_error, and g_message wrappers since some compilers throw
+ away arguments in this case
+
+Tue Jan 12 21:59:14 PST 1999 Manish Singh <yosh@gimp.org>
+
+ * acinclude.m4
+ * ltconfig
+ * ltmain.sh: upgrade to libtool 1.2d (with fixes for irix6 and osf)
+
+ * testglib.c: removed unused cruft
+
+Tue Jan 12 09:57:06 PST 1999 Manish Singh <yosh@gimp.org>
+
+ * gdate.c: #warning isn't portable, check for gcc
+
+1999-01-12 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gdate.c: Include config.h to get HAVE_LOCALTIME_R macro.
+
+ * configure.in: Moved function check back to the place, they've
+ been before.
+
+1999-01-11 Jeff Garzik <jgarzik@pobox.com>
+
+ * gstrfuncs.c:
+ Do not use vasprintf.
+
+ * configure.in, glib.h, testglib.c, tests/.cvsignore,
+ tests/Makefile.am, tests/alloca-test.c:
+ Do not use alloca.
+
+1999-01-11 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Test for localtime_r only after including the
+ right MT enabling CFLAGS (i.e. -D_REENTRANT on most systems).
+
+ * configure.in: Find right thread system on DG/UX. Thanks to Marc
+ J. Fraioli <fraioli@dg-rtp.dg.com> for hint. Finally removed the
+ stuff for -fstack-check, that didnt work anyway.
+
+ * gdate.c (g_date_set_time): Emit warning, if no localtime_r
+ function is available on thread enabled systems. Define ptm only,
+ if really needed, and assert on it.
+
+Sat Jan 9 15:08:44 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * testglib.c:
+ Make all aux functions static.
+
+ * tests/Makefile.am, tests/dirname-test.c, tests/type-test.c:
+ New tests dirname-test and type-test, from testglib.
+
+Sat Jan 9 13:53:00 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * configure.in:
+ Add checks for vasprintf, localtime_r.
+
+ * gdate.c (g_date_set_time):
+ Use localtime if localtime_r is not available.
+
+ * gstrfuncs.c (g_strdup_vprintf):
+ Use glibc vasprintf if possible; it's a bit faster than using
+ GLib routines, and makes output code a bit smaller.
+
+ * acconfig.h:
+ Remove HAVE_VSNPRINTF and HAVE_VPRINTF. autoheader picks these
+ up automatically and puts them in config.h.in.
+
+Thu Jan 7 15:14:08 1999 Owen Taylor <otaylor@redhat.com>
+
+ * gmain.c (g_source_free_func): Call the source-specific
+ free function when the hook is freed not when it
+ is destroyed; this fixes a bug where a timeout destroyed
+ from itself would access already freed data.
+
+1999-01-07 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gutils.c (g_get_any_init): Here we must replace getpwuid by
+ getpwuid_r, but as I do not know how for now, I just made a FIXME
+ note ;-)
+
+ * gdate.c (g_date_set_time): localtime --> localtime_r to make it
+ thread safe.
+
+ * configure.in: We do not need to check for broken solaris mutex
+ intitializer any longer. Provide a macro to show the used thread
+ implementation. Not nice, but this is needed until thread support
+ is completed here inside glib.
+
+Tue Jan 5 12:23:52 PST 1999 Manish Singh <yosh@gimp.org>
+
+ * configure.in: ditch whitespace before GLIB_SYSDEFS #includes,
+ the # needs to be in column 1
+
+ * gthread/testgthread.c: cleanups
+
+ * tests/node-test.c: #include unistd.h for exit()
+
+1999-01-04 Andrew T. Veliath <andrewtv@usa.net>
+
+ * glib.h (g_array_insert_val): fix macro to be shorthand of
+ g_array_insert_vals.
+
+Mon Jan 4 15:35:29 PST 1999 Manish Singh <yosh@gimp.org>
+
+ * acglib.m4: some echos interpret \n's and some don't. Deal with
+ accordingly.
+
+Mon Jan 4 20:58:50 1999 Tim Janik <timj@gtk.org>
+
+ * gscanner.c: eliminated extraneous "register" qualifiers in variable
+ declarations.
+
+ * gmain.c: #undef events and revents which may have been defined in
+ sys/poll.h for SVR3,4 compatibility on some AIX systems. fix been
+ provided by Philippe Defert <Philippe.Defert@cern.ch>.
+
+Mon Jan 4 14:38:11 1999 Tim Janik <timj@gtk.org>
+
+ * glib.h: adjusted the g_strdup_a, g_strndup_a and g_strconcat3_a macros
+ so their arguments get only evaluated once. changed g_strconcat3_a to
+ have the same semantics as g_strconcat, i.e. if a certain argument is
+ NULL, the rest of the parameter list is skipped.
+
+ * tests/alloca-test.c: removed #if/#endif G_HAVE_ALLOCA, we need to be
+ able to compile on all systems. added test for g_strconcat() semantics.
+
+ * we need a alloca() replacement for !G_HAVE_ALLOCA rsn!
+
+Mon Jan 4 02:58:13 CST 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.1.12
+
+ * INSTALL:
+ NEWS:
+ README:
+ configure.in:
+ glib.spec:
+ docs/glib-config.1: version=1.1.12
+
+ * tests/Makefile.am: fixed so it works properly with
+ builddir and srcdir.
+
+Sun Jan 3 01:38:14 EST 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * tests/Makefile.am:
+ add array-test.c, tree-test.c
+
+ * tests/array-test.c, tests/tree-test.c:
+ New module, tests array family
+
+ * tests/hash-test.c, tests/list-test.c, tests/slist-test.c,
+ tests/string-test.c, tests/node-test.c:
+ Clean out cruft left over from testglib.
+
+Sat Jan 2 22:42:25 EST 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * Makefile.am, configure.in, tests/*:
+ Added 'make check' tests, based on testglib code.
+
+Sat Jan 2 19:52:45 EST 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * glib.h, testglib.c:
+ Added g_alloca, g_new_a, g_new0_a macros.
+
+Sat Jan 2 16:45:44 EST 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * testglib.c: Added g_strdup_printf check.
+
+Fri Jan 1 21:58:40 EST 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * glib.h:
+ (g_strdup_a, g_strndup_a): Handle NULL strings like g_strdup.
+ s/g_strconcat_a/g_strconcat3_a/ to reflect fixed number of args
+
+ * testglib.c:
+ Added g_strdup, g_strconcat checks.
+ Added str==NULL checks for alloca string macros.
+ s/g_strconcat_a/g_strconcat3_a/
+
+Fri Jan 1 18:30:41 PST 1999 Manish Singh <yosh@gimp.org>
+
+ * testglib.c: made the alloca tests follow the testglib style
+
+ * Makefile.am: minor cleanups, mostly cosmetic
+
+Fri Jan 1 20:43:19 EST 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * glib.h: added g_strndup_a macro
+
+ * testglib.c:
+ Added tests for new alloca-based string routines.
+ Reformatted a couple strings.
+
+Sat Jan 2 02:20:59 1999 Tim Janik <timj@gtk.org>
+
+ * ghook.c:
+ (g_hook_list_invoke):
+ (g_hook_list_invoke_check):
+ (g_hook_list_marshal_check):
+ (g_hook_list_marshal): avoid unneccessary extra hook referencing (the
+ explicit hook referencing became unneccessarry with my changes from
+ Mon Dec 21 21:48:29 1998).
+
+ * gmain.c (g_main_iterate): fixed reference counting leaks with
+ premature loop aborts.
+
+Fri Jan 1 22:47:44 1999 Tim Janik <timj@gtk.org>
+
+ * gscanner.c (g_scanner_unexp_token): handle G_TOKEN_IDENTIFIER_NULL
+ as G_TOKEN_IDENTIFIER.
+
+Fri Jan 1 17:09:19 EST 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * configure.in, glib.h:
+ Added two new alloca-based function macros, g_strdup_a and
+ g_strconcat_a. These are stack-based and much faster than
+ their g_malloc-based counterparts. Kudos to Ulrich Drepper
+ for help on this one.
+
+Wed Dec 30 18:24:57 CST 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.1.11
+
+ * INSTALL:
+ NEWS:
+ README:
+ configure.in:
+ docs/glib-config.1: version=1.1.11
+
+1998-12-30 Raja R Harinath <harinath@cs.umn.edu>
+
+ * glib.h (G[U]INT64_FROM_{LE,BE}):
+ Define to G[U]INT64_TO_{LE,BE}, not G[U]INT32_TO_{LE,BE}.
+
+Fri Dec 25 19:56:33 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * acglib.m4
+ * configure.in: provide defaults for POLL sysdefs, simple enums
+ don't work with bitwise logic. Reported by Daniel Skarda
+ <0rfelyus@atrey.karlin.mff.cuni.cz>
+
+Wed Dec 23 00:43:25 CST 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * INSTALL:
+ NEWS:
+ README:
+ configure.in:
+ docs/glib-config.1: version=1.1.10
+
+Wed Dec 23 04:18:11 1998 George Lebl <jirka@5z.com>
+
+ * gmain.c: (g_get_current_time) don't cast to timeval since
+ timeval is for some reason not always a struct of longs, weird
+
+Tue Dec 22 10:32:11 1998 Tim Janik <timj@gtk.org>
+
+ * ghook.c (g_hook_first_valid): fixed buglet that could cause bogus
+ warnings.
+
+Mon Dec 21 21:48:29 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gmain.c: there was a reference count race for hooks during invocation
+ loops. since all (known) hook loop implementations, do currently start
+ out with g_hook_first_valid() and iterate with g_hook_next_valid(),
+ g_hook_first_valid() will now return a referenced hook, and
+ g_hook_next_valid() will "eat" that, and eventually transfer it to
+ the next hook. <sigh> unfortunately this requires g_hook_next_valid()
+ to take the hook_list as additional argument.
+
+ * gmain.c (g_main_iterate): adjusted callers of g_hook_next_valid().
+
+Mon Dec 21 03:48:04 1998 Tim Janik <timj@gtk.org>
+
+ * gmain.c (g_main_iterate): default initialize source_timeout with -1
+ so we have a sane timeout value if (*prpare) doesn't set it.
+
+Sat Dec 19 16:56:02 1998 Owen Taylor <otaylor@redhat.com>
+
+ * glib.h gmain.c (G_PRIORITY_LOW): Add #defines defining
+ scale of priorities.
+
+Sat Dec 19 16:56:02 1998 Owen Taylor <otaylor@redhat.com>
+
+ * gmain.c (g_main_poll): Allocate space for pollfd's
+ _after_ adding poll wake-up-pipe record.
+
+ * gmain.c (g_main_add_poll): Changed name
+ of internal function g_main_add_poll_unlocked()
+ back from the non-sensical g_main_add_unlocking_poll().
+
+Sat Dec 19 06:25:55 1998 Tim Janik <timj@gtk.org>
+
+ * glib.m4: fixed a minor bug that would let configures bail out
+ if the MODULES argument contained newlines.
+
+ * acglib.m4: new file to be included by configure.in. it holds
+ special GLIB_ autoconfiguration macros, eventually some of the
+ easier ones should be moved into glib.m4, e.g. GLIB_IF_VAR_EQ,
+ GLIB_STR_CONTAINS or GLIB_ADD_TO_VAR.
+
+Sat Dec 19 04:27:17 1998 Tim Janik <timj@gtk.org>
+
+ * fixed up sys/poll.h and sys/types.h inclusions.
+
+Sat Dec 19 03:10:50 1998 Tim Janik <timj@gtk.org>
+
+ * fixed up gthread includes, cleaned up glibconfig.h a little bit.
+
+Fri Dec 18 12:51:39 1998 Owen Taylor <otaylor@redhat.com>
+
+ * gmain.c: Fix errors in computation of timeout
+ expiration times > 1sec.
+
+1998-12-18 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in (have_threads): Changed the last pthread_cond_init
+ to pthread_attr_init.
+
+Fri Dec 18 00:03:17 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gmain.c:
+ (g_main_is_running): new function to check whether a main loop has been
+ quitted.
+ (g_main_new): added a gboolean argument to determine whether the loop
+ should be considered initially running or not. however, g_main_run ()
+ will still reset the main loops running state to TRUE upon initial
+ entrance.
+
+ * gmain.c:
+ (g_main_iterate): documented this function's purpose in 5 steps.
+ for step 2), flag sources as G_SOURCE_READY even if !dispatch and
+ check G_SOURCE_READY prior to (*prepare), so we don't call (*prepare)
+ on them multiple times.
+
+Thu Dec 17 23:43:47 1998 Tim Janik <timj@gtk.org>
+
+ * gmain.c (g_main_add_poll): reordered arguments, so GPollFD* comes
+ first, <sigh> (sorry Snorfle, i should have let you know in the first
+ place).
+ (g_main_dispatch): stack G_HOOK_FLAG_IN_CALL flags. call source's
+ destructor when destroying a source.
+
+1998-12-17 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * garray.c (g_ptr_array_remove_index): Fixed size in g_memmove,
+ reported by Alexander Larsson <alla@lysator.liu.se>.
+
+ * gmem.c: Fixed bug, that made compile fail for -DENABLE_MEM_PROFILE.
+
+Wed Dec 16 23:04:26 CST 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.1.9
+
+ * INSTALL:
+ NEWS:
+ README:
+ configure.in:
+ glib.spec:
+ docs/glib-config.1: version=1.1.9
+
+Wed Dec 16 22:32:13 CST 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * glib.h:
+ giounix.c: s/g_main_poll_add/g_main_remove_add/g
+ s/g_main_poll_remove/g_main_remove_poll/g
+ s/g_main_poll_add_unlocking/g_main_add_unlocking_poll/g
+ (from Tim Janik)
+
+Wed Dec 16 20:04:10 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * configure.in: check for pthread_attr_init in all cases, du4
+ needs this since most of the other functions are just #defines
+
+Thu Dec 17 04:10:49 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h (G_LOCK_DECLARE_*): if !G_THREADS_ENABLED, eat the
+ trailing semicolon with a bogus function declaration, instead
+ of with a bogus variable declarations, so we avoid unused
+ variable warnings.
+
+Wed Dec 16 07:49:16 PST 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.1.8 (CVS tag is GLIB_1_1_8a)
+
+1998-12-16 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * giounix.c (g_io_channel_unix_get_fd): Fixed small bug.
+
+1998-12-16 Joel Becker <jlbec@ocala.cs.miami.edu>
+
+ * glib.h, gscanner.c: changed func_data to user_data in
+ g_scanner_scope_symbol_foreach and associated friends, because
+ AIX headers #define func_data.
+
+1998-12-16 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Fixed stupid bug, that made
+ g_static_mutex_lock(*mutex) not work as expected.
+
+ * docs/glib-config.1: Updated to reflect the existence of gthread.
+
+ * gmain.c (g_main_poll_add_unlocking): Changed
+ g_main_poll_add_unlocked to g_main_poll_add_unlocking to match
+ semantic, (indeed, main_loop must be locked, when calling this
+ function). Removed the unlocking from the end of that function, as
+ that is not right. Made a 'HOLDS' comment above the function.
+
+Wed Dec 16 03:16:58 1998 Tim Janik <timj@gtk.org>
+
+ * configure.in: version bump to 1.1.8, binary age 0, interface age 0.
+
+ * glib.h: changed g_lock() to G_LOCK(), g_unlock() to G_UNLOCK() and
+ g_trylock() to G_TRYLOCK(), since these are macros that expand to
+ nothing with --disable-threads.
+ changed G_LOCK_DEFINE() to G_LOCK_DECLARE() and introduced
+ G_LOCK_DECLARE_STATIC() to achive the results of static G_LOCK_DECLARE().
+ changed semantics of g_thread_supported to g_thread_supported() so it
+ can be used as a function like g_module_supported(). the actuall
+ definition is still a macro that expands into a variable for
+ performance reasons though.
+ various indentation and coding style cleanups.
+
+ * configure.in: added --enable-threads that defaults to yes.
+
+ * gmutex.c: changed tests g_thread_supported to g_thread_supported (),
+ changed variable settings of g_thread_supported
+ to g_threads_got_initialized.
+
+ garray.c:
+ gcache.c:
+ gdataset.c:
+ gdate.c:
+ ghash.c:
+ glist.c:
+ gmain.c:
+ gnode.c:
+ gslist.c:
+ gstring.c:
+ gtree.c:
+ gutils.c:
+ changed s/g_lock/G_LOCK/, s/g_unlock/G_UNLOCK/,
+ s/static G_LOCK_DEFINE/G_LOCK_DECLARE_STATIC/.
+
+Tue Dec 15 23:16:05 CST 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * INSTALL:
+ NEWS:
+ README
+ configure.in:
+ glib.spec:
+ docs/glib-config.1: Incremented version
+
+Wed Dec 16 22:29:48 1998 Joel Becker <jlbec@ocala.cs.miami.edu>
+
+ * configure.in: fixed the AIX thread checking.
+ Just an error on the wildcard. BTW, -D_THREAD_SAFE
+ is correct for AIX.
+
+Wed Dec 16 02:02:48 1998 Tim Janik <timj@gtk.org>
+
+ * glib-config.in (lib_glib): fixed library and flag ordering for
+ --libs
+
+Tue Dec 15 17:17:46 1998 Owen Taylor <otaylor@redhat.com>
+
+ * glib.h giounix.c giochannel.c: Use an "inheritance"
+ scheme for IO channel memory allocation.h
+
+1998-12-15 Havoc Pennington <hp@pobox.com>
+
+ * gdate.c (g_date_prepare_to_parse): Solaris has a broken strftime
+ that produced garbage output for the test date I was using to
+ set up the parser. So use a different date that Solaris seems
+ to like.
+
+1998-12-15 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Dont complain, if --without-threads or
+ --with-threads=none is supplied; Test for pthread_attr_init
+ instead of pthread_cond_init, if threads seems to be supported by
+ standard glib. (CFLAGS): Use G_THREAD_CFLAGS for compiling of glib
+ as well.
+
+ * glib.h, gmutex.c: Changed private to private_key to avoid
+ problems when compiling with under C++.
+
+1998-12-15 Jeff Garzik <jgarzik@Pobox.com>
+
+ * configure.in:
+ bugfixes, correctly support --without-threads and friends
+
+ * gthread/testgthread.c: corrected 64-bitness problem
+
+Tue Dec 15 10:40:09 1998 Owen Taylor <otaylor@redhat.com>
+
+ * gnode.c glist.c gslist.c: Make sure all
+ calls to g_node_validate_allocator are within
+ current_allocator lock, so we have consistency
+ on that point. (Should not really matter,
+ but this way we match the comments)
+
+ * glist.c (g_list_free_1): Removed some lines
+ that should never have been committed. (For
+ debugging)
+
+1998-12-11 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread/gthread-nspr.c, configure.in: Added new default thread
+ implementation on top of the mozilla nspr library.
+
+ * gmem.c, gmessaged.c, gthread/gthread.c, gthread/gthread-*.c:
+ Changed GStaticMutex and GStaticPrivate in gmem.c and gmessages.c
+ into GMutex and GPrivate resp. to make error reporting and use of
+ gmem possible in most (not all, though) gthread functions. Also
+ initialized the modules via new init functions.
+
+ * configure.in: Fixed syntax bug in definition of type
+ GStaticMutex.
+
+ * gthread/testgthread.c: Updated to work with nspr, but see note
+ there for remaining problems.
+
+1998-12-10 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gmutex.c, glib.h: Now abort, if a mutex/cond/private is
+ allocated before the thread system is set up.
+
+ * gthread/gthread.c (g_thread_init): Removed g_thread_try_init(),
+ as it is not necessary. Changed the error message. Corrected logic
+ for g_thread_use_default_impl.
+
+ * gmutex.c (g_mutex_init): Keep the thread private data array
+ after calling g_thread_init().
+
+1998-12-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread/testgthread.c (new_thread): Now also working for posix
+ threads; (wait_thread): Now a better implementation, that does not
+ use 100% CPU.
+
+ * Made the thread related code follow GNU coding standard.
+
+ * Made a comment (HOLDS:) above each function, that expects the
+ given locks to be held.
+
+ * Changed try_lock to trylock throughout.
+
+ * glib.c: Eventually removed the #if 0'ed code for old GStaticMutex.
+
+ * glib.c: Corrected g_trylock macro for G_DEBUG_LOCKS.
+
+ * gmain.c (g_main_poll_add_unlocked): first take a new poll record
+ form the poll_free_list.
+
+ * gmem.c, gstrfuncs.c, gutils.c: Made it MT safe.
+
+ * gthraed/*.c: Added copyright headers.
+
+ * gthread/gthread-solaris.c: do not use g_log for errors, as g_log
+ uses these module and endless recursions might happen, just use a
+ plain fprintf(stderr,...).
+
+ * gthread/gthread.c (g_thread_try_init): Call g_mutex_init().
+
+ * gthread/testgthread.c: updated test program.
+
+Tue Dec 8 18:49:56 1998 Owen Taylor <otaylor@redhat.com>
+
+ * Start at adding thread-safety. (mostly work
+ of Sebastian Wilhelmi <wilhelmi@ira.uka.de>)
+
+ - configure.in now looks for a system thread implementation.
+ Currently support is included for POSIX threads
+ and Solaris threads. The default support is built
+ into a separate library -lgthread.
+
+ - The thread implementation can be modified by passing
+ a vector of functions g_thread_init().
+
+ - The default or supplied functions are used to
+ implement a small set of thread functions for
+ mutexes, condition variables, and thread-private
+ data.
+
+ - GLib now uses these functions to provide thread
+ safety. (In the sense that all global static
+ data is locked... individual structures must still
+ be locked by the caller.)
+
+Sat Dec 12 19:08:59 1998 Tim Janik <timj@gtk.org>
+
+ * configure.in: always define G_HAVE_INLINE if __cplusplus is
+ defined, reported by Wan-Teh Chang <wtc@netscape.com>.
+
+Thu Dec 10 21:49:39 CST 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.1.7
+
+ * INSTALL:
+ NEWS:
+ README:
+ configure.in:
+ glib.spec:
+ docs/glib-config.1: Increased version to 1.1.7
+
+Wed Dec 9 22:44:44 EST 1998 Joel Becker <jlbec@ocala.cs.miami.edu>
+
+ * Removed #define of G_COMPILED_WITH_DEBUGGING from glibconfig.h
+ It shouldn't be there, and it was causing a double #define.
+ (config.h defines it also)
+
+Tue Dec 8 12:18:38 CST 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.1.6
+
+ * NEWS: updated
+
+Mon Dec 7 23:10:41 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * gmain.c: fixes to #undef HAVE_POLL case
+
+1998-12-02 Havoc Pennington <hp@pobox.com>
+
+ * gdate.c (g_date_set_month): If Julian is valid, we have to
+ update the dmy representation before setting the components
+ of it.
+ (g_date_set_day): Same.
+ (g_date_set_year): Same.
+
+1998-12-02 Havoc Pennington <hp@pobox.com>
+
+ * testgdate.c, testgdateparser.c: Two new files. This is kind of
+ ugly code, but I want to go ahead and make the tests available.
+ It isn't contaminating any other code. :-) Since one of these
+ is interactive and the other takes a while to run, I've kept
+ them separate from testglib for now.
+ * Makefile.am: Build gdate test programs.
+
+1998-12-02 Havoc Pennington <hp@pobox.com>
+
+ * gdate.c (g_date_valid): Rely on GDate::dmy and GDate::Julian
+ flags, rather than re-checking the validity of the actual
+ values. This should be the correct behavior, the old way was
+ leftover cruft.
+
+ * glib.h, gdate.c: Changed MDY to DMY throughout.
+
+Sat Nov 28 12:53:47 1998 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.am configure.in acconfig.h giochannel.c
+ glib.h glist.c gmain.c gutils.c:
+
+ - Revised GIOChannel to provide a generic virtual-function
+ based interface.
+ - Added unix fd-based GIOChannel's
+ - Added generic main-loop abstraction
+ - Added timeouts and idle functions using main-loop abstraction.
+
+1998-12-02 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib.h:
+ * gdate.c: changed `gpointer struct_tm_p' parameter of
+ g_date_to_struct_tm back to `struct tm *tm' and forward declared
+ `struct tm' in glib.h; yes, this is nice, we still need not
+ include time.h.
+
+Tue Dec 1 23:01:44 CST 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * INSTALL:
+ NEWS:
+ README:
+ glib.spec:
+ docs/glib-config.1: Incremented versions to 1.1.6.
+
+Wed Dec 2 02:10:59 1998 Tim Janik <timj@gtk.org>
+
+ * gdate.c: s/time_t/GTime/ and s/g_print/g_message/
+ include time.h.
+
+ * glib.h: removed #include <time.h>, changed time_t paramter of
+ g_date_set_time() to time_t, changed struct tm parameter of
+ g_date_to_struct_tm to `gpointer struct_tm_p'. yes, this is not
+ nice, but including time.h actually breaks a bunch of code.
+
+ * incremented GLib version to 1.1.6.
+
+1998-11-30 Havoc Pennington <hp@pobox.com>
+
+ * gdate.c: New file, implements calendrical calculations.
+
+ * glib.h: Added declarations for GDate module.
+
+Mon Nov 30 07:12:10 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * ghook.c: added g_hook_list_marshal_check() to eventually destroy
+ hooks after they got marshalled.
+
+Sun Nov 29 17:31:43 EST 1998 Jeff Garzik <jgarzik@pobox.com>
+
+ * configure.in, Makefile.am, gmodule/Makefile.am:
+ Put -DFOO stuff into Makefile.am INCLUDES.
+
+Sun Nov 29 14:17:09 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * configure.in: put debug -DFOO stuff into CPPFLAGS, not CFLAGS,
+ so CFLAGS can be overridden at make time properly
+
+Sat Nov 28 01:23:25 1998 Tim Janik <timj@gtk.org>
+
+ * ghash.c: implemented incremental freezing facility.
+
+Thu Nov 26 01:36:20 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * ghash.c: reverted the g_hash_table_set_key_freefunc() addition,
+ since it's to specialized and needs to be resolved in a generic
+ fashion.
+
+Tue Nov 24 18:57:59 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * applied glib-tml-981120-0, change log appended below.
+
+ * glibconfig.h.win32: passthrough 64-bit constants unchanged, VC++
+ infers them
+
+Fri Nov 20 22:26:43 1998 Tor Lillqvist <tml@iki.fi>
+
+ * glib.h: Moved MSC pragmas from glib.h to glibconfig.h.win32.
+ peer_offset field in WIN32 part of GIOChannel removed, need_wakeups
+ added. Added "extern" to __declspec(dllimport).
+
+ * gutils.c: Initialise need_wakeups.
+
+ * glibconfig.h.win32: Pragmas moved here. Define G_GINT64_CONSTANT.
+
+ * gmodule/gmodule.def: Added g_module_build_path.
+
+ * gscanner.c: (g_scanner_cur_value) Move initailisation of v
+ to before its use.
+
+ * glib.def: Added g_(s)list_sort.
+
+ * makefile.msc: A few more comments.
+
+Tue Nov 24 14:05:47 EST 1998 Michael K. Johnson <johnsonm@redhat.com>
+
+ * glib.h: added GFreeFunc and g_hash_table_set_key_freefunc()
+ prototype.
+ * ghash.c: added g_hash_table_set_key_freefunc() implementation.
+ Modified the prototypes of the functions g_hash_node_destroy() and
+ g_hash_nodes_destroy(), and changed the functions that call them
+ to match the new definitions.
+ This changes no external interfaces, and should create no binary
+ or source incompatibilities. It does add a member to the
+ GHashTable structure.
+
+Tue Nov 24 09:40:00 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: removed the GListAllocator type and its g_*_allocator_*()
+ function variants (which weren't working anyways) in favour of a
+ generic GAllocator type. new functions:
+ g_allocator_new, g_allocator_free, g_slist_push_allocator,
+ g_slist_pop_allocator, g_list_push_allocator, g_list_pop_allocator,
+ g_node_push_allocator and g_node_pop_allocator.
+
+ * gstring.c: removed bogus slist allocator code.
+ * gtree.c: maintain own list of free tree nodes and don't waste
+ GSLists for that, removed bogus slist allocator code.
+ * glist.c: use GAllocators for node allocation.
+ * gslist.c: use GAllocators for node allocation.
+ * gnode.c: use GAllocators for node allocation.
+
+ * gdataset.c: cleanups wrt automatic initialization.
+
+Mon Nov 23 10:03:58 1998 Owen Taylor <otaylor@gtk.org>
+
+ * glib.h garray.[ch]: added g_array_insert_vals() to
+ insert elements at an arbitrary index, and
+ g_array_insert_val() macro.
+
+Sun Nov 22 17:07:03 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gslist.c: new function g_slist_copy() to duplicate a list with all its
+ data pointers.
+ * glist.c: new function g_list_copy.
+
+Sat Nov 21 14:57:39 CST 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * INSTALL:
+ NEWS:
+ README:
+ configure.in:
+ glib.spec: Updated to version 1.1.5
+
+ * Released GLib 1.1.5
+
+Wed Nov 18 1998 Elliot Lee <sopwith@redhat.com>
+
+ * gdataset.c: There was a code path into g_data_set_internal
+ through a function (g_datalist_id_set_full). Neither function
+ checked for g_dataset_init having been run, but
+ g_data_set_internal used the memchunk. I added
+ a check into g_data_set_internal so it will do the
+ initialization if needed. (There's probably a better way.)
+
+Mon Nov 16 07:48:06 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h (g_bit_nth_msf): fixed off-by-one error, so we don't waste
+ a loop iteration if (-1) was passed, reported by Andreas Bombe
+ <andreas.bombe@munich.netsurf.de>.
+
+Fri Nov 13 15:17:34 1998 Owen Taylor <otaylor@redhat.com>
+
+ * glist.c gslist.c glib.h: Added g_list_sort() and
+ g_slist_sort() to merge sort GLists and GSLists.
+ Submitted by Sven Over <sven.over@ob.kamp.net>
+ over a year ago!
+
+ * testglib.c: Test the new sort functions.
+
+Wed Nov 11 23:23:22 EST 1998 Jeff Garzik <jgarzik@pobox.com>
+
+ * Makefile.am : INCLUDES is the right way to add to CFLAGS, not
+ DEFS. Also there are bugs with '+=' in makefiles.
+ Got rid of DEFS line by moving G_LOG_DOMAIN setting into INCLUDES.
+ Removed redundant -I from INCLUDES.
+
+Wed Nov 11 18:11:24 EST 1998 Gregory McLean <gregm@comstar.net>
+
+ * docs/*.sgml : Batch of new documentation that should be easier
+ to maintain and extend. Plus generate whatever sort of doc file
+ you would like. I didn't change the Makefile stuff as I'm not sure
+ what default doc type people want. Oh and this is all DocBook format.
+ Enjoy!
+
+Tue Nov 10 17:12:45 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * configure.in: use __extension__ for long long on gcc >= 2.8 and
+ egcs, and provide a G_GINT64_CONSTANT wrapper so -ansi -pedantic
+ compiles clean.
+
+ * glib.h: make the endian x86 asm __const__ so the compiler can do
+ better optimizations. Also remove the cc clobber, these shouldn't
+ be changing condition codes. Ditch some redundant casts. Add an
+ optimization for 64-bit endian conversions in x86. Use constant
+ wrapper for the generic method.
+
+ * testglib.c: use constant wrappers for 64-bit constants
+
+1998-11-04 Phil Schwan <pschwan@cmu.edu>
+
+ * configure.in: Added 'strncasecmp' to the list of functions to be
+ searched for.
+ * glib.h: Added a prototype for 'g_strncasecmp'
+ * gstrfuncs.c: (g_strncasecmp) new function modeled closely after
+ 'g_strcasecmp'
+
+Wed Nov 4 15:06:44 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * config.h.win32 (new file)
+ * glibconfig.h.win32
+ * glib.def
+ * makefile.msc: applied glib-tml-981104, win32 sync
+
+1998-11-03 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib.h:
+ * garray.c:
+ (g_array_remove_index): new function for removing an entry from an
+ array while preserving the order
+ (g_array_remove_index_fast): new function for removing an entry
+ from an array. the order might be distorted
+ (g_ptr_array_remove_index_fast, g_ptr_array_remove_fast): new
+ functions; working similiar to the above. (they have the semantic
+ of the old g_ptr_array_remove[_index] functions)
+ (g_ptr_array_remove_index, g_ptr_array_remove): new semantic. now
+ the order of the elements in the array is not changed
+ (g_byte_array_remove_index, g_byte_array_remove_index_fast): new
+ functions; byte_array wrapper for g_array_remove_index[_fast]
+
+Sun Nov 1 23:00:18 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * glib.h
+ * configure.in: endian macros defined using the glibconfig.h
+ mechanism now
+
+ * ghook.c: casts for GHookFunc and GHookCheckFunc to avoid warnings
+
+Sat Oct 31 20:14:22 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * applied glib-tml-981101-1 patch from Tor Lillqvist (ChangeLog
+ entry appended below)
+
+ * testglib.c
+ * gstrfuncs.c
+ * glib.h: use G_HAVE_GINT64, since HAVE_GINT64 is gone
+
+ * gmessages.c
+ * gscanner.c: #include <config.h> in here too, for HAVE_UNISTD_H
+
+1998-11-01 Tor Lillqvist <tml@iki.fi>
+
+ * glib.def: Added the new functions.
+
+ * gutils.c:
+ (g_getenv): Better implementation on Win32. No loop necessary.
+ (g_get_any_init): Use P_tmpdir if defined as tmp directory. Don't
+ set home dir always to NULL on Win32. Don't use tmp directory as
+ last resort home directory, but return NULL if no home
+ directory is known (application must check).
+
+ * makefile.msc: Better touch command, just COPYing a single file
+ sets the timestamp from that file, which isn't what touching should
+ do.
+
+1998-10-31 Raja R Harinath <harinath@cs.umn.edu>
+
+ Land glib-rrh-19981025-0.patch.
+ * Makefile.am (glibconfig.h): New rule.
+ (stamp-gc-h): New rule. Generate `glibconfig.h'.
+ * configure.in (AM_CONFIG_HEADER): It is now `config.h'.
+ (HAVE_BROKEN_WCTYPE): On Solaris, look for iswalnum in -lw before
+ concluding "broken wctype".
+ (glibconfig.h): Use AC_OUTPUT_COMMANDS to put generation code into
+ config.status.
+ * glib.h: Remove a lot of tests and defines. All these have been
+ moved to `configure.in (glibconfig.h)'.
+ * gerror.c: Include <config.h>.
+ * gmem.c: Likewise.
+ * gstrfuncs.c: Likewise.
+ * gutils.c: Likewise.
+
+Sat Oct 31 05:08:26 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: removed old G_ENUM(), G_FLAGS(), G_NV() and G_SV() macros.
+ added macros G_STRUCT_OFFSET(), G_STRUCT_MEMBER_P() and
+ G_STRUCT_MEMBER() for handling structure fields through their offsets.
+ (struct _GHookList): added a hook_free function member, that can be used
+ to free additional fields in derived hook structures.
+ g_hook_free(): if hook_list->hook_free != NULL, call this function prior
+ to freeing the hook. (this functionality should have been there in the
+ first place, it just got forgotten as an implementation detail).
+
+Wed Oct 28 00:49:32 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * glib.h: G_BREAKPOINT for alpha from Robert Wilhelm
+ <robert@physiol.med.tu-muenchen.de>
+
+Tue Oct 27 07:25:53 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gscanner.c:
+ (g_scanner_sync_file_offset): new function 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.
+ (this became neccessary with the implementation of buffered
+ reads).
+ (g_scanner_input_file):
+ (g_scanner_input_text): automatically blow the read ahead buffer.
+ (g_scanner_get_char): blow the read ahead buffer when the end of
+ input is reached, i.e. a '\000' char is read.
+
+Tue Oct 27 00:27:31 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * glib.h: get rid of duplicate #g_htonl and friends in the
+ NATIVE_WIN32 part
+
+Mon Oct 26 22:42:01 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * glibconfig.h.win32
+ * gutils.c
+ * makefile.msc: win32 patch from Tor Lillqvist (glib-tml-981027-0),
+ fixes some minor win32 buglets
+
+Mon Oct 26 22:12:03 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * glib.h: reimplemented the endian stuff, using inline asm
+ for x86. #define g_htonl and friends.
+
+ * testglib.c: new tests for the endian stuff
+
+ * configure.in: care for AIX in gmodule linker flags test (from
+ Joel Becker <jlbec@raleigh.ibm.com>). Check $host_os for linux
+ instead of existance of /usr/include/linux
+
+ * gutils.c: buh-bye evil warning. Thou hast been #ifdef'd out
+ of thine existance!
+
+Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: removed dummy structure definitions for struct _GCache,
+ _GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
+
+ * gutils.c: implement glib's inline functions _after_ all include
+ statements have been processed.
+ removed Tor's MAXPATHLEN check since there already was one supplied
+ further down in this file.
+ (LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
+ since lcc maybe used on other platforms as well. why in hell is this
+ stuff required?
+ (g_get_any_init): for windows, if the user name is supplied, use it as
+ realname also.
+ in general, if there is no homedir specified, use the tmpdir that
+ we already figured.
+
+ * gtimer.c (g_timer_elapsed): changed a g_assert() statement to
+ g_return_if_fail().
+
+ * applied glib-tml-981020-0.patch for WIN32 portability, added some
+ comments and g_return_if_fail() statements, minor indentation fixes.
+ ChangeLog entry from Tor Lillqvist is appended.
+
+ * glib.h (struct dirent): use lower case structure members.
+
+ * glib.h:
+ * makefile.lcc:
+ * makefile.msc:
+ s/COMPILING_GLIB/GLIB_COMPILATION/
+
+1998-10-20: Tor Lillqvist <tml@iki.fi>
+
+ * README.win32 glib.def gmodule.def
+ * glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
+ New files for the Windows port. The .def files list exported
+ symbols for the Microsoft linker and compatibles.
+
+ * configure.in:
+ Added checks for some platform-dependent headers: pwd.h sys/param.h
+ sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
+
+ * gerror.c:
+ Conditionalized inclusion of system-dependent headers. Changes
+ for Windows: no gdb to do a stack trace. Just call abort().
+
+ * glib.h:
+ Changes for Windows:
+
+ Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
+ platform-dependent file name syntax elements. Added macros
+ G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
+ platform-dependent search path syntax conventions.
+
+ Added pragmas for Microsoft C to make it more pedantic.
+
+ Marked GLib's global variables for export from DLL.
+
+ Added the function g_strescape that escapes backslashes.
+
+ Added functions g_path_is_absolute and g_path_skip_root to
+ handle platform-dependent file name syntax.
+
+ Added the function g_getenv that expands environment variables
+ that contain references to other environment variables, as is
+ typical on Windows NT.
+
+ Added the GIOChannel structure which is used to encapsulate the
+ IPC mechanism used by the GIMP's plug-ins, and possibly other
+ things later. On Unix a GIOChannel encapsulates just a file
+ descriptor. On Windows it contains a file handle from _pipe() and a
+ few other things related to the implementation of gdk_input_add
+ and GIMP plug-in communication. Subject to change.
+
+ Removed duplicate declarations of the version variables.
+
+ For the Microsoft compiler, declare own implementation of
+ ftruncate and the <dirent.h> functions.
+
+ * gmem.c:
+ Define a symbolic name for the profiling table size.
+
+ * gmessages.c:
+ Conditionalized inclusion of unistd.h. On Windows, output using
+ stdio to stdout.
+
+ * gscanner.c:
+ Conditionalized inclusion of unistd.h. Added changes for
+ Microsoft C. Added CR to the skipped character set. Added small
+ workaround for MSC compiler bug in g_scanner_cur_value.
+
+ * gstrfuncs.c:
+ Added the function g_strescape, which escapes the backslash
+ character. Needed especially when printing Windows filenames.
+
+ * gtimer.c:
+ Conditionalized inclusion of unistd.h and sys/time.h. Added
+ implementations for Windows.
+
+ * gutils.c:
+ Conditionalized inclusion of platform-dependent headers. Use
+ the platform-independent file name syntax macros.
+ Conditionalize code on platform-dependent features. Added the
+ functions g_path_is_absolute g_path_skip_root and g_getenv.
+ Added the GIOChannel-related functions. Added
+ compiler-dependent Unix compatibility functions for Windows.
+
+ * makefile.lcc makefile.msc:
+ New files. Compiler-specific makefiles for LCC-Win32 and
+ Microsoft C. Only Microsoft C is actually supported currently.
+
+ * testglib.c:
+ Added pathname check cases for Windows. Added workaround for
+ bug in the Microsoft runtime library. Improved some tests a bit.
+
+Sun Oct 25 01:24:01 CST 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.1.4
+
+ * docs/Makefile.am:
+ * docs/.cvsignore
+ * docs/glib-config.1:
+ * docs/glib.texi: Moved docs from gtk and created glib-config.1
+ from gtk-config.1 in gtk
+
+ * configure.in:
+ * Makefile.am:
+ * sanity_check: added in docs directory, change rule 'release'
+ to 'snapshot' and created a new 'release' rule for doing the
+ distribution. Added in a 'sanity' rule.
+
+ * NEWS:
+ * README:
+ * INSTALL: Updated for the release
+
+Sun Oct 25 07:30:10 1998 Tim Janik <timj@gtk.org>
+
+ * gscanner.c:
+ (g_scanner_peek_next_char):
+ (g_scanner_get_char): no more characters are available if read() returns
+ anything less than 1, not only on 0 return.
+
+ * glib.h:
+ * gstrfuncs.c: final API cleanup of string arrays to suit sopwith's
+ argument order requirements.
+ (g_strsplit): renamed from g_str_array_split().
+ (g_strjoinv): renamed from g_str_array_joinv(), string array is
+ now passed as last parameter. removed `const' qualifier from string
+ array pointer (again).
+ (g_strjoin): new function from sopwith to concatenate strings with
+ an additional seperator.
+ (g_strfreev): renamed from g_str_array_free.
+
+Sat Oct 24 22:23:04 PDT 1998 Manish Singh <yosh@gimp.org>
+
+ * gnode.c: small fix to g_node_children_foreach to make it work right.
+ From Paco Moya <paco@cadnotebk17.eecs.berkeley.edu>
+
+Wed Oct 21 19:22:58 1998 Tim Janik <timj@gtk.org>
+
+ * configure.in (G_MODULE_HAVE_DLERROR): reverted part of the changes
+ from Sebastian Wilhelmi (1998-10-20). don't specify a specific loading
+ behaviour (i.e. RTLD_NOW) when we are not sure whether it is supplied.
+ changed the return value from (!f2 && f1) to (!f2 || f1) so we default
+ to not needing an underscore. reverted the extra plugin.c building,
+ because .lo files are not ELF libraries, this can't work. This needs
+ further investigation on Solaris...
+
+Wed Oct 21 17:03:05 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gstrfuncs.c: API cleanups of the new g_str* functions for consistency
+ with the existing naming scheme for g_str* functions. grouped the g_str*
+ functions that will return a newly allocated string seperatedly. all of
+ the in_place arguments were skipped, the caller is supposed to pass a
+ g_strdup()ed string if he wants to retrive a new copy. indentation and
+ coding style fixups. added some g_return_if_fail() statements.
+ string array functions are prefixed with g_str_array_.
+ (g_strdelimit): return the modified string like all other g_str*
+ functions, that operate in place.
+ (g_strchug): renamed from g_str_chug(), removed in_place argument.
+ (g_strchomp): renamed from g_str_chomp(), removed in_place argument.
+ (g_strstrip): renamed from g_str_strip(), removed in_place argument.
+ (g_str_array_join): renamed from g_strconcatv(), since it actually
+ operates on a string array and has totaly different semantics from
+ g_strconcat(). check for separator != NULL, don't segfault if the first
+ string is NULL. removed the `const' from the string array that's passed,
+ so users can operate on gchar** string arrays.
+ (g_str_array_split): renamed from g_str_split() because we actually
+ produce a string array. reimplemented this function for efficiency.
+ removed macro aliases g_str_joinv and g_str_join.
+
+1998-10-20 Elliot Lee <sopwith@redhat.com>
+
+ * glib.h, gstrfuncs.c: Move string join/split/free routines from
+ libgnome/gnome-string, rename, and add g_str_chug.
+
+1998-10-20 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: made the check for needed _ in module's func-names
+ work on solaris. (G_MODULE_NEED_USCORE must be set outside
+ AC_CACHE_VAL, dlopen(0,0) refused to work on solaris).
+
+Tue Oct 20 03:32:58 PDT 1998 Manish Singh <yosh@gimp.org>
+
+ * configure.in
+ * acconfig.h: added test for endianness
+
+ * glib.h: #define endian macros for system and some conversions
+ between byte order
+
+Thu Oct 8 06:47:27 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gdataset.c: removed functions g_dataset_id_set_destroy and
+ g_datalist_id_set_destroy and macros g_dataset_set_destroy and
+ g_datalist_set_destroy.
+ added new functions g_dataset_id_remove_no_notify and
+ g_datalist_id_remove_no_notify plus associated macros
+ g_dataset_remove_no_notify and g_datalist_remove_no_notify, which
+ will remove a certain data portion without invocation of its destroy
+ notifier, this should only be used in very controled circumstances.
+
+Wed Oct 7 05:31:24 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ removed the #pragma } statement after extern "C" {. use
+ (c-set-offset 'inextern-lang 0) to fixup emacs cc-mode indentation.
+
+ * glib.h:
+ * ghook.c: API and code cleanups. changed the G_HOOK_ACTIVE and
+ G_HOOK_IN_CALL enum vals to G_HOOK_FLAG_ACTIVE and G_HOOK_FLAG_IN_CALL.
+ changed the G_HOOK_IS_ACTIVE() and G_HOOK_IS_IN_CALL() macros to
+ G_HOOK_ACTIVE() and G_HOOK_IN_CALL().
+ fixed the g_hook_find* functions, so they iterate over non-active
+ hooks as well.
+ (g_hook_first_valid):
+ (g_hook_next_valid): added an extra argument gboolean may_be_in_call,
+ which indicates whether G_HOOK_IN_CALL() hooks are considered valid
+ or not. these two functions are meant as iterators for the hook list
+ invocation, so they need to a) provide functionality to implement
+ may_recurse bahaviour and b) only walk active hooks.
+
+Tue Oct 6 14:29:47 1998 Tim Janik <timj@gtk.org>
+
+ * gmem.c (g_malloc0): fixed memory offsett when ENABLE_MEM_CHECK is
+ defined and ENABLE_MEM_PROFILE is not (patch from Martin Pool
+ <mbp@wistful.humbug.org.au>).
+
+Sat Oct 3 01:18:10 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * ghook.c:
+ (g_hook_list_invoke):
+ (g_hook_list_invoke):
+ (g_hook_list_marshal): properly handle the first valid hook to call,
+ it maybe IN_CALL already.
+ (g_hook_list_marshal): minor name change.
+
+Fri Oct 2 23:21:21 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * ghook.c: renamed GHook.id to GHook.hook_id so we don't get troubles
+ with ObjC which reserves "id" as a keyword (Raja R Harinath
+ <harinath@cs.umn.edu>).
+
+Wed Sep 30 10:53:03 1998 Tim Janik <timj@gtk.org>
+
+ * Makefile.am: added ghook.c.
+
+ * glib.h:
+ * ghook.c: generic callback maintenance functions.
+
+ * glib.h: define G_GNUC_UNUSED.
+
+Fri Sep 25 00:04:37 1998 Tim Janik <timj@gtk.org>
+
+ * configure.in: version bump to 1.1.4, binary age 0, interface age 0.
+
+ * glib.h (struct _GScanner): dumped peeked_char and text_len in favour
+ of *text_end and *buffer for buffered read()s.
+
+ * gscanner.c: changed peeking and retrival of next character so we
+ have buffered reads. fixed minor bug with number parsing error
+ reporting. made some static!!! variables local ones (why did we use
+ static temporary variables in the lowlevel tokenization code anyways?).
+
+Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.1.3
+
+Mon Sep 21 07:43:13 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: added g_renew() which works as g_new() for g_realloc().
+
+Mon Sep 21 02:22:12 1998 Tim Janik <timj@gtk.org>
+
+ * NEWS file update for upcoming release of GLib + GModule
+ version 1.1.3, binary age 0, interface age 0. (GModule uses
+ the same version numbers as GLib.)
+
+ * glib.h: swap the inclusion of of float.h and limits.h to work
+ around a egcs 1.1 oddity on Solaris 2.5.1 (fix provided by
+ Per Abrahamsen <abraham@dina.kvl.dk>).
+
+ * glib.h:
+ * gscanner.c: renamed the GValue union to GTokenValue, this should
+ not affect source compatibility in most cases.
+
+ * ghash.c: added some g_return_if_fail() statements. make
+ g_hash_table_lookup_node() an inline function so we save an extra
+ function invocation on lookups.
+
+Sun Sep 20 18:21:46 1998 Owen Taylor <otaylor@redhat.com>
+
+ * ltmain.sh: Patch to libtool-1.2b to make --disable-static
+ work.
+
+Sun Sep 20 02:09:44 1998 Josh MacDonald <jmacd@axis.hip.berkeley.edu>
+
+ * glib.h: New function g_hash_table_foreach_remove is similar to
+ g_hash_table_foreach, but the callback's return value indicates
+ whether to remove the element (if TRUE) or not (if FALSE).
+ Returns the number of elements deleted.
+
+Fri Sep 18 11:31:50 PDT 1998 Manish Singh <yosh@gimp.org>
+
+ * glib.h
+ * gstrfuncs.c: added g_memdup implementation
+
+Fri Sep 18 18:46:14 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gdataset.c: make the datalists a safe type (not using a generic
+ gpointer) by expecting a GData* argument in the g_datalist functions.
+ provide g_dataset_foreach() and g_datalist_foreach() functions that
+ allow a GDataForeachFunc function to walk the data lists.
+ (g_dataset_destroy_internal): made this function truely reentrant (i.e.
+ can be called from within destroy notifiers as well).
+ the *_foreach functions are _not_ reentrant (unless all the other
+ dataset and datalist functions).
+
+Fri Sep 18 03:41:20 1998 Tim Janik <timj@gtk.org>
+
+ * gtree.c (g_tree_new): check for key_compare_func != NULL (reported
+ by Michal Kara).
+
+Thu Sep 17 18:55:46 PDT 1998 Manish Singh <yosh@gimp.org>
+
+ * config.h.in: removed from repository
+
+ * install-sh
+ * missing
+ * mkinstalldirs: updated to latest automake version
+
+Thu Sep 17 06:36:25 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gdataset.c: implemented g_datalist_* along the lines of g_dataset,
+ but operates on an opaque gpointer *datalist; pointer, e.g. for the
+ implementation of GtkObject named data.
+ we cache a certain portion of the already freed data entries now, to
+ gain a slight performance improve with data reallocation.
+
+Tue Sep 15 14:57:30 1998 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.am glib-config.in l*: Update to libtool-1.2b,
+ change library versioning scheme to drop LT_RELEASE
+ from the -l line, while keeping it in the soname.
+
+Fri Sep 11 02:11:46 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: explicitely include the prototypes for inline functions
+ to cure gcc warnings for -Wmissing-prototypes.
+
+Wed Sep 9 02:52:04 PDT 1998 Manish Singh <yosh@gimp.org>
+
+ * configure.in: added -posix check for NeXTStep
+
+Tue Sep 8 05:04:06 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: abandon the use of ATEXIT(), we keep the fallback
+ macros for backwards compatibility. people ought to use g_atexit().
+
+ * gutils.c (g_atexit): new function to take over the implementation
+ of ATEXIT. this function is guarranteed to succeed, similar to
+ g_malloc().
+
+Mon Sep 7 20:07:38 PDT 1998 Manish Singh <yosh@gimp.org>
+
+ * configure.in: comment the -std1 check and save LIBS properly
+
+Mon Sep 7 07:53:21 1998 Tim Janik <timj@gtk.org>
+
+ * configure.in: check for all three inline keywords individually.
+
+ * glib.h: 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 inlinig can be performed. we special case most of the
+ stuff, so inline functions can have a normal implementation by defining
+ G_INLINE_FUNC to extern and G_CAN_INLINE to 1.
+
+ * ltconfig: (compiler PIC flag test): special case linux for non
+ aout systems to honour lcc's position independant code (cases
+ "linux*aout)" and "linux*)" got added). (this needs to go into
+ libtool which does an advanced test, checking for __LCC__).
+
+ * autogen.sh: take $CC=lcc into account by invoking automake with
+ --include-deps so lcc isn't scared by gcc's auto-dependancy
+ generation code. care about $ACLOCAL_FLAGS. optionally feature
+ autoheader.
+
+ * minor fixups in other places to cure some of lcc's warnings.
+
+Sun Sep 6 19:08:53 PDT 1998 Manish Singh <yosh@gimp.org>
+
+ * configure.in: added -std1 check for ANSI compliance (from gtk)
+
+Sun Sep 6 12:31:50 PDT 1998 Manish Singh <yosh@gimp.org>
+
+ * glib.h: provide proper ATEXIT behavior on NeXTStep by !atexit
+
+Sat Sep 5 18:03:36 1998 Tom Tromey <tromey@cygnus.com>
+
+ * gutils.c (GLIB_INLINE): Define.
+ * glib.h (GLIB_INLINE): New define.
+ (g_bit_nth_msf): Use it. Also, add prototype.
+ (g_bit_storage): Likewise.
+ (g_bit_storage): Likewise.
+
+Sat Sep 5 04:40:02 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ (g_chunk_new0): use g_mem_chunk_alloc0() to allocate the memchunk,
+ so the correct size of the memchunk is allocated with 0's and not
+ a memory portion of the size of the desired type.
+
+ * gmem.c: new function g_mem_chunk_alloc0() which will initialize
+ a memory area allocated with g_mem_chunk_alloc() with 0's.
+
+Wed Sep 2 19:13:28 1998 Owen Taylor <otaylor@redhat.com>
+
+ * garray.c glib.h (g_array_[ap/pre]pend_vals): make
+ data argument const.
+
+Wed Aug 26 06:32:40 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gstrfuncs.c: new function g_strnfill() to return a new string
+ of specified length, filled with a specific character.
+
+Tue Sep 1 23:46:31 1998 Josh MacDonald <jmacd@axis.hip.berkeley.edu>
+
+ * testglib.c (main): Update the array tests. Reduce the number of
+ iterations for the prepend test from 10000 to 100 since it is
+ O(n^2) and was taking longer than I would like to wait.
+
+ * garray.c: I've worked on the GArray interface, mostly. It was
+ seriously broken before and I hate to do it, but this is going to
+ break some code. It is important to do this now, because more and
+ more people are starting to use glib and the interface was both
+ broken and inconsistent. First, rename the _truncate functions of
+ both the GArray and GPtrArray classes to _set_size, since this
+ function can also be used to extend the arrays. GArray now
+ accepts two more initialization arguments: clear and element_size.
+ Instead of providing the type to each access function, the array
+ now stores the element size. Clear, if set, causes the library to
+ zero element's memory as the array expands. The major broken-ness
+ here was that array->len was in bytes, not elements. Now, since
+ the array knows its element size, array->len is correct and I have
+ removed the g_array_length macro. The only macro which now
+ accepts the type as an argument is g_array_index, which casts the
+ element to the right type--this interface does not change. The
+ append and prepend functions simply need the types removed.
+ g_ptr_array_remove_index now returns the removed element.
+
+ * gprimes.c (g_spaced_primes_closest): Move this function out of
+ ghash.c and rename it from g_hash_closest_prime. Fix the primes
+ so that they are actually prime (they weren't all -- isn't that
+ nice?).
+
+Mon Aug 24 02:08:56 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gstring.c:
+ * gstrfuncs.c:
+ (g_vsprintf): removed this function which was not publically
+ exported in glib.h. to export it, it should have been named
+ differently in the first place, since its semantics differ from
+ vsprintf(). apart from that, it was a possible cause for
+ problems since it worked on a previously allocated memory area and
+ was used in a lot places of glib. exporting it would have been a
+ guararant for problems with threaded programs.
+ (g_printf_string_upper_bound): exported this function to return
+ a string size, guarranteed to be big enough to hold the fully
+ expanded format+args string. added 'q', 'L' and 'll' flag handling.
+ in fact, the newly allocated area is in most cases much bigger than
+ required.
+ (g_strdup_vprintf()): new function returning a newly allocated string
+ containing the contents of *format and associated args (size is
+ calculated with g_printf_string_upper_bound()).
+ (g_strdup_printf): new function which wraps g_strdup_vprintf().
+
+ * configure.in: check for va_copy() or __va_copy() alternatively.
+ check whether va_lists can be copyied by value.
+
+ * glib.h: provide a definition for G_VA_COPY.
+
+ * glib.h:
+ * gmessages.c:
+ (g_logv):
+ (g_vsnprintf):
+ pass va_lists by value, not by reference, since this causes problems
+ on platforms that implement va_list as as arrays. internaly, use
+ G_VA_COPY (new_arg, org_arg); va_end (new_arg); to produce a second
+ va_list variable, if multiple passes are required. changed all
+ callers.
+
+ * glib.h:
+ * gerror.h:
+ renamed g_debug() to g_on_error_query(), cleaned up a bit.
+ renamed g_stack_trace() to g_on_error_stack_trace() since both
+ functions cluttered different namespaces.
+ there is an appropriate comment in glib.h now that explains the
+ unix and gdb specific dependencies of both functions.
+ removed g_attach_process().
+ g_on_error_stack_trace() should probably be handled with caution,
+ i've seem several different linux versions (2.0.x) become unstable
+ after invocation of this function.
+
+1998-08-18: Elliot Lee <sopwith@redhat.com>
+
+ * In gmem.c, add the ability to exclude memory chunks from the
+ memory profiling information.
+
+Tue Aug 18 18:23:09 PDT 1998 Manish Singh <yosh@gimp.org>
+
+ * glib.h
+ * gstrfuncs.c: added g_strndup
+
+Tue Aug 18 04:40:17 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gmessages.c: new function g_log_set_always_fatal() to set an
+ additional fatal_mask for log levels that are considered to be fatal
+ globally (required by gtk). since this mask is not domain-associated,
+ it is restricted to the log levels, introduced by glib itself.
+
+ * gmem.c:
+ * grel.c:
+ * gtree.c (g_tree_node_check):
+ don't use g_print() calls for informational/debugging output,
+ but log all this stuff through g_log() with G_LOG_LEVEL_INFO.
+ libraries shouldn't use printf(), g_print() or g_printerr() at all.
+
+Tue Aug 18 02:46:44 1998 Tim Janik <timj@gtk.org>
+
+
+ * glib.h (__STRICT_ANSI__): if __STRICT_ANSI__ is defined, make
+ `inline' a noop, since strict ANSI rules don't permit `inline'.
+
+Mon Aug 17 15:21:42 1998 Tim Janik <timj@gtk.org>
+
+ * grel.c: made private functions static.
+
+Sun Aug 16 23:23:46 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * gmodule/Makefile.am: added gmodule-dl.c and gmodule-dld.c to
+ EXTRA_DIST
+ * glib.spec: version = 1.1.3
+
+Mon Aug 17 01:46:14 1998 Tim Janik <timj@gtk.org>
+
+ * glib.m4: feature an extra MODULES parameter, so glib-config can
+ be invoked with the "gmodule" argument.
+
+ * glib.h: changed the log level to G_LOG_LEVEL_CRITICAL for all
+ g_return*_if_fail statements, and made them issue a message
+ like "assertion `%s' failed".
+
+ * gmessages.c (g_logv): ugh, don't pass log_domain as NULL to
+ g_log_find_domain.
+
+Sun Aug 16 20:28:27 1998 Tim Janik <timj@gtk.org>
+
+ * version bump to 1.1.3, binary age 0, interface age 0.
+
+ * glib.h: be nice to platforms that don't have gint64 and don't
+ issue #warning on every compilation. since glib doesn't require
+ gint64 itself, packages that need gint64 should test for this
+ themselves.
+
+ * glib.h:
+ * gutils.c: added a new function g_vsnprintf().
+
+Sun Aug 16 Elliot Lee
+
+ glib.h: #error out if we don't recognize the SIZEOF_VOID_P
+ #warning if no gint64
+
+Fri Aug 14 16:41:53 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: added static inline functions for bit mask tests:
+ g_bit_nth_lsf, g_bit_nth_msf and g_bit_storage.
+
+Fri Aug 13 14:23:37 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gmessages.c:
+ revised the message handling system, which is now based on a new
+ mechanism g_log*. most of the assertment macros got adapted to
+ feature the new g_log() call with an additional specification of
+ the log level in a preprocessor macro G_LOG_DOMAIN. if G_LOG_DOMAIN
+ is undefined upon the includion of glib.h, it'll be defined with a
+ value of (NULL) and thus preserves the original bahaviour for
+ warning and error messages. the message handler setting functions
+ for g_warning, g_error and g_message are only provided for backwards
+ compatibility and might get removed somewhen.
+
+ * Makefile.am: feature the G_LOG_DOMAIN macro to set the log domain
+ to "GLib" upon compilation. we currently have to add this definition
+ to the DEFS variable.
+ * testglib.c: we need an ugly #undef G_LOG_DOMAIN at the start
+ of this file currently, since automake doesn't support per target
+ _CFLAGS yet.
+
+ * glib.h: changed some gints to gbooleans, made a few const corrections,
+ removed some superfluous G_STMT_START{}G_STMT_END wrappers, added some
+ in other required places.
+
+ * gnode.c:
+ (g_node_prepend):
+ (g_node_insert_before):
+ (g_node_insert):
+ (g_node_append_data):
+ (g_node_prepend_data):
+ (g_node_insert_data_before):
+ (g_node_insert_data):
+ (g_node_append):
+ return (node), so these macros/functions can be usefully chained with
+ g_node_new().
+
+Mon Aug 10 17:56:11 PDT 1998 Manish Singh <yosh@gimp.org>
+
+ * glib.h: it's GTime now, and it's back!
+
+Mon Aug 10 02:17:19 1998 Tim Janik <timj@gtk.org>
+
+ * Makefile.am: minor hack to cause SUBDIRS (gmodule) to be build
+ last. we do this by making all-recursive-am depend on all-am.
+
+Sun Aug 9 15:56:11 1998 Tim Janik <timj@gtk.org>
+
+ * configure.in: added GModule checks. generate files in gmodule/.
+ * glib-config.in: support library specifications `glib' and `gmodule'.
+ * Makefile.am: feature the gmodule/ subdir.
+
+Wed Aug 5 10:04:29 PDT 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.1.2
+
+Wed Aug 05 01:15:36 1998 George Lebl <jirka@5z.com>
+
+ * testglib.c: fix 64-bitness in g_prints, sizeof doesn't
+ seem to return int so I cast it for printing, probably
+ just cosmetic
+
+Tue Aug 4 19:54:06 PDT 1998 Shawn T. Amundson <amundson@gkt.org>
+
+ * Released GLib 1.1.1
+
+Tue Aug 4 15:17:54 1998 Tim Janik <timj@gtk.org>
+
+ * configure.in: version bump to 1.1.1, binary age 1, interface age 0.
+ * NEWS: updates.
+ * README: updates.
+ * INSTALL: updates and fixes.
+ * COPYING: include the GNU LGPL, rather than shipping an empty file.
+ * AUTHORS: listed original authors here, and added people who made
+ significant improvements to glib.
+
+ * glib.h:
+ * gutils.c: implement g_get_current_dir() which returns a newly
+ allocated string, instead of a g_getcwd() variant that operates
+ on a static buffer.
+ export glib_interface_age and glib_binary_age.
+ as a convenience, macro definitions have been added for
+ g_node_insert_data, g_node_insert_data_before, g_node_append_data and
+ g_node_prepend_data.
+
+ * testglib.c: minor cleanups, print current dir.
+
+Mon Aug 3 16:02:26 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gnode.c: change order of gpointer data; field in struct _GNode to
+ be partly binary compatible with GList and GSList.
+
+1998-08-03 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * garray.c (g_ptr_array_remove_index): bugfix: index check for
+ array has been wrong.
+
+Fri Jul 31 22:17:05 1998 Tim Janik <timj@gtk.org>
+
+ * testglib.c (g_node_test): added a GNode test.
+
+Fri Jul 31 09:08:16 1998 Tim Janik <timj@gtk.org>
+
+ * Makefile.am: compile gnode.c.
+
+ * glib.h:
+ * gnode.c: added implementation of n-way trees.
+
+ * gtree.c (g_tree_traverse): added a warning to the switch() statement
+ which says that G_LEVEL_ORDER is not implemented.
+
+Mon Jul 27 00:17:30 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.1.0
+
+Mon Jul 27 01:02:27 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: #if 0'ed out the GTime definition, until it is definitively
+ needed. #if 0'ed out the g_getcwd() version, because it is the wrong
+ implementation.
+
+Sat Jul 25 16:09:00 1998 Mark Crichton <crichton@expert.cc.purdue.edu>
+
+ * glib.h: gtime changed to g_time. gtime is used in
+ /usr/include/time.h in NetBSD, causing multiple headaches.
+ If this isn't the right way of fixing it.... ;)
+
+Thu Jul 23 00:29:14 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gscanner.c: new functions to make a scanner scope sensitive wrt
+ symbol lookups.
+ g_scanner_scope_foreach_symbol, g_scanner_scope_lookup_symbol,
+ g_scanner_scope_remove_symbol, g_scanner_scope_add_symbol and
+ g_scanner_set_scope.
+ g_scanner_add_symbol, g_scanner_remove_symbol and
+ g_scanner_foreach_symbol are now aliases for scope 0.
+
+Mon Jul 20 23:05:34 1998 George Lebl <jirka@5z.com>
+
+ * glib.h: typo fixed for alphas for gint64
+
+Tue Jul 14 09:05:18 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gutils.c: new fuction g_dirname() which returns a newlly
+ allocated string.
+
+Fri Jul 10 06:33:43 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gutils.h: added a bunch of utility/wrapper functions:
+ g_basename(), g_getcwd(), g_get_user_name(), g_get_real_name(),
+ g_get_home_dir(), g_get_tmp_dir(), g_get_prgname() and g_set_prgname().
+
+ * gutils.c: removed all g_str* functions.
+ * gstrfuncs.c: moved the bunch g_str* functions from gutils.c in this
+ place. this file shall never include <unistd.h> to avoid clashes for
+ some of the g_str* functions on some OSes.
+
+Fri Jul 10 00:29:03 EEST 1998 Lauri Alanko <nether@gimp.org>
+
+ * glib.h:
+ * ghash.c: Renamed g_hash_table_lookup_full to
+ g_hash_table_lookup_extended to conform with naming conventions.
+
+Tue Jul 7 03:18:58 EEST 1998 Lauri Alanko <nether@gimp.org>
+
+ * glib.h:
+ * ghash.c: Generic cleanup, added a function:
+ (g_hash_table_lookup_full): Return whether the lookup succeeded,
+ and also retrieve the key and value. This allows one to
+ distinguish between failed lookup and finding a NULL, and also
+ allows one to free a key in the hash.
+
+Mon Jul 6 10:12:05 PDT 1998 Manish Singh <yosh@gimp.org>
+
+ * ltconfig: fix for properly detecting shared lib support on
+ SunPro cc (taken from libtool 1.2.a)
+
+Sat Jul 4 13:38:52 PDT 1998 Manish Singh <yosh@gimp.org>
+
+ * glib.h: added g_array_length
+
+Tue Jun 30 11:58:25 1998 Tim Janik <timj@gtk.org>
+
+ * gscanner.c (g_scanner_unexp_token): take symbol_2_token into
+ account. react on valid/invalid string pairs.
+
+Sat Jun 27 21:55:46 PDT 1998 Manish Singh <yosh@gimp.org>
+
+ * glib.m4: ftp.glib.org -> ftp.gtk.org, since glib.org isn't
+ ours. ;)
+
+Fri Jun 19 03:11:02 1998 Tim Janik <timj@gtk.org>
+
+ * gdataset.c: removed g_dataset_try_key, g_dataset_force_id and
+ g_dataset_retrive_key in favour of GQuarks.
+ a GQuark is an numeric id wich is associated with a certain string.
+ (g_quark_try_string): try to get the quark associated with this string,
+ if the lookup failed return 0.
+ (g_quark_from_string): get the associated quark for a string, if there
+ isn't currently a GQuark associated with this string, then allocate a
+ new quark and return that.
+ (g_quark_from_static_string): like the above function, but the string
+ isn't strdup()ed to save memory.
+ (g_quark_to_string): get the string that is associated with a certain
+ GQuark.
+
+ * gdataset.c (g_dataset_id_set_data_full): invoke the destroy function
+ _after_ the new data has been setup.
+
+Thu Jun 18 02:35:21 1998 Owen Taylor <otaylor@gtk.org>
+
+ * glib.h: Changed messages for g_return_[val]_if_fail to
+ be somewhat more clear: assertion "blah" failed.
+
+1998-06-18 Federico Mena Quintero <federico@nuclecu.unam.mx>
+
+ * testglib.c (main): Use GINT_TO_POINTER casts to remove compiler
+ warnings.
+
+ * grel.c: #include <string.h>
+
+Fri Jun 12 15:39:06 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h (GScanner): cleanups of the structure fields (binary
+ incompatible).
+
+Fri Jun 12 00:39:28 1998 Josh MacDonald <jmacd@icw.EECS.Berkeley.EDU>
+
+ * glib.h: add new hash and equal functions g_int_*. complement
+ g_direct_hash with g_direct_equal.
+
+ * grel.c: new file, GRelations implement tuples of N-N mappings.
+ A comment in glib.h briefly describes the interface.
+
+ * ghash.c: new function, g_hash_table_size
+
+ * glib.h: new typedefs, gsize, gssize, gtime.
+
+ * garray.c: new functions implementing a simplified GArray. This
+ GPtrArray is an array of gpointers and has functions to add and
+ remove elements, much like java.lang.Vector.
+
+ * garray.c: new functions for the single-byte special case of
+ GArray. The functions g_byte_array* operate on arrays of bytes.
+ Internally, a GArray is used.
+
+ * testglib.c: tests for g_ptr_array, g_byte_array, and g_relation...
+
+1998-06-11 Federico Mena Quintero <federico@nuclecu.unam.mx>
+
+ * gdataset.c: #include <string.h>
+
+Thu Jun 11 04:15:31 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gdataset.c: new function g_dataset_retrive_key. adjusted prealloc
+ sizes, to take up less space on initial allocation.
+
+1998-06-10 Raja R Harinath <harinath@cs.umn.edu>
+
+ * acinclude.m4: New file. Contains `libtool.m4' from libtool-1.2,
+ the version from which glib's libtool forked. Needed for people
+ who use post-1.2 alphas of libtool.
+ * configure.in (enable_mem_check, enable_mem_profile): Replace
+ `echo -n' with AC_MSG_CHECKING.
+ (fd_set): Explain test for `fd_set' better.
+
+Wed Jun 10 19:29:51 1998 Owen Taylor <otaylor@gtk.org>
+
+ * Makefile.am glib.m4 configure.in:
+
+ Moved out from GTK+; added AM_PATH_GLIB macro.
+
+Wed Jun 10 12:56:07 1998 Owen Taylor <otaylor@gtk.org>
+
+ * glib.h: renamed g_const_pointer => gconstpointer
+
+Tue Jun 9 17:47:33 1998 Owen Taylor <otaylor@gtk.org>
+
+ * glib.h: Remove #error - HP/UX.
+
+Sat May 23 19:00:01 1998 Owen Taylor <otaylor@gtk.org>
+ [ Combination of:
+ gtk-rrh-980412-0.patch (Raja R Harinath <harinath@cs.umn.edu>)
+ gtk-jbuhler-980516-0 (Jeremy Buhler <jbuhler@cs.washington.edu>) ]
+
+ * glib.h ghash.c gstring.c gdataset.c gutils.c:
+ - Added new typedef g_const_pointer; expunged all incorrect
+ uses of 'const gpointer'.
+ - Fixed up warnings that that created,
+ - Changed GHashFunc and GCompareFunc to take g_const_pointer
+ arguments. (Necessary, but will cause warnings in existing
+ code until fixed)
+ - Added other new const in harmless positions.
+
+Mon Jun 8 01:06:47 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: added enum-helper macros for code generation.
+ added G_BREAKPOINT().
+
+Sat Jun 6 14:09:22 PDT 1998 Manish Singh <yosh@gimp.org>
+
+ * gmem.c: commented out MEM_PROFILE and MEM_CHECK, causing weird
+ problems
+
+Wed Jun 3 06:19:42 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h (g_chunk_new0): convenience macro, for allocating small chunks
+ like g_chunk_new() with additional 0 initialization.
+
+Mon Jun 1 04:43:27 1998 Tim Janik <timj@gtk.org>
+
+ * ghash.c (g_hash_table_insert): wrote a comment describing why
+ a hash node's key should not also get replaced when overriding
+ previous entries.
+
+Tue May 26 18:30:06 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h (g_string_sized_new): new function to controll the preallocated
+ size of a GString.
+
+ * glib.h (g_strreversed): new function to reverse a string.
+
+Mon May 18 22:14:39 1998 Owen Taylor <otaylor@gtk.org>
+(Yasuhiro SHIRASAKI <joke@awa.tohoku.ac.jp> : gtk-joke-980517-0.patch)
+
+ * gutils.c: Restored a missing prototype for g_vsprintf.
+
+Wed May 20 05:02:26 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: conditionally define NULL, FALSE and TRUE.
+ (g_mem_chunk_create): new convenience macro as a short hand for
+ g_mem_chunk_new().
+ (g_chunk_free): new convenience macro to be consistent with g_chunk_new.
+
+Tue, 19 May 1998 09:00:02 +0200 Paolo Molaro <lupus@debian.org>
+
+ * gcompletion.c: generic functions for com<TAB>pletion...
+
+Sun May 17 10:48:27 1998 Tim Janik <timj@gtk.org>
+
+ * gscanner.c (g_scanner_unexp_token): provide usefull default
+ specifications for identifier_spec and symbol_spec.
+
+ * glib.h: new functions g_slist_nth_data and g_list_nth_data to return
+ the data of the nth element in the list.
+
+Fri May 15 22:31:49 1998 Tim Janik <timj@gtk.org>
+
+ * gscanner.c (g_scanner_unexp_token): removed spurious va_end(args)
+ that for some reason didn't produce a compiler warning on my machine
+ (is va_end defined to nothing for i386?).
+
+Fri May 15 12:32:08 1998 rodo <doulik@karlin.mff.cuni.cz>
+
+ * gscanner.c: replaced some snprintf with g_snprintf
+
+Fri May 15 00:56:59 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: further support for gcc function attributes: G_GNUC_FORMAT,
+ G_GNUC_NORETURN and G_GNUC_CONST.
+
+ * gscanner.c (g_scanner_stat_mode): changed stat() to lstat().
+ (g_scanner_msg_handler): "\n" at end of line!
+ (g_scanner_foreach_symbol): new function to iterate over the symbol
+ table (GScanner does value-wrapping).
+
+Thu May 14 04:14:12 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h: typedef gint gboolean;
+ this is needed to provide portability with big-endian platforms (e.g.
+ try sizeof(bool) for c++ on big-endians - it's 4).
+ this is also needed to maintain some_union.d_gint==some_union.d_gboolean.
+ plus, gint to gboolean casts and vice versa need to be possible without
+ loss.
+
+Tue May 12 19:22:58 1998 Owen Taylor <otaylor@gtk.org>
+
+ * glib/glib.h: Added macros G[U]INT_TO_POINTER() and
+ GPOINTER_TO_[U]INT for storing small integers integers
+ inside pointers.
+
+ * glib/testglib.c: Print sizeof() results
+ as g_print("%ld", (glong)sizeof(foo)), to deal with
+ size_t being long on Alpha's.
+
+Tue May 12 16:54:15 1998 Owen Taylor <otaylor@gtk.org>
+ (James A <jamesa@demon.net> : gtk-jamesa-980511-4.patch)
+
+ * glib.h gstring.c gmessages.c: Added some missing
+ const to arguments.
+
+ * gutils.c (g_strsignal.c): Added missing return statements.
+
+Mon May 11 21:11:54 1998 Owen Taylor <otaylor@gtk.org>
+
+ * gutils.c gmessages.c: Moved g_error, g_warning, g_message and
+ g_print from gutils.c to new file gmessages.c, to avoid having to
+ include <unistd.h> in gutils.c which was causing problems for the
+ g_strsignal implementation on FreeBSD boxes.
+
+Mon May 11 09:53:43 1998 Tim Janik <timj@gtk.org>
+
+ * configure.in: preserve automake CFLAGS.
+
+ * Makefile.am: fully rename the created library to libglib-1.1.la.
+ this means we need to change certain portions of the Makefile.am on
+ major/minor version bumps.
+
+ * ltmain.sh: the -release option is not required anymore.
+
+ * glib.h: provide G_GNUC_FUNCTION and G_GNUC_PRETTY_FUNCTION to
+ avoid conditionals. unconditionally define NULL, TRUE, FALSE, MAX,
+ MIN, ABS and CLAMP, these macros might be screwed from other headers.
+
+Mon May 11 01:44:10 1998 Tim Janik <timj@gtk.org>
+
+ * gdataset.c: new file, gdatasets implement the object data
+ mechanism from GtkObject. a generic data pointer is associated with
+ a certain location and a key id.
+
+Sat May 9 20:08:12 1998 Owen Taylor <otaylor@gtk.org>
+
+ * glib/gmem.c: Experimentally restore GMemChunk
+ to its primeval state - where mem areas are
+ freed incrementally instead of searching the tree
+ every time a mem area is completely empty. Also,
+ always keep one mem chunk around. (Reduced calls
+ to malloc() a lot, but doesn't really improve
+ performance significiantly)
+
+Thu May 7 08:17:28 1998 Tim Janik <timj@gtk.org>
+
+ * glib.h (G_GNUC_PRINTF):
+ (G_GNUC_SCANF): macros to facilitate the printf/scanf format argument
+ checking of gcc.
+
+ * gstring.c: const corrections, string!=NULL checks at function entry.
+ (g_string_down): new function for tolower(3) conversion.
+ (g_string_up): new function for toupper(3) conversion.
+
+ * gutils.c: const corrections.
+ (g_strdown): g_string_down() counterpart.
+ (g_strup): g_string_up() counterpart.
+
+ * gscanner.c (g_scanner_unexp_token):
+ (g_scanner_error):
+ (g_scanner_warn): new functions to let a scanner put out warnings
+ or errors, especially to react on unexpected tokens.
+
+ * gslist.c:
+ (g_slist_index): find out about about the position of a
+ certain data pointer.
+ (g_slist_position): find out about about the position of a
+ certain node.
+
+ * glist.c:
+ (g_list_index): find out about about the position of a
+ certain data pointer.
+
+Thu May 7 05:14:19 1998 Tim Janik <timj@gtk.org>
+
+ * ltmain.sh: added a new commandline flag -postfix similar to -release,
+ but will immediately change the library name.
+
+ * Makefile.am: specify -postfix and -version-info
+
+ * configure.in: version bump to 1.1.0. added GLIB_INTERFACE_AGE and
+ GLIB_BINARY_AGE. calculate LT_* variables for libtool.
+
+Fri May 1 16:36:08 1998 Owen Taylor <otaylor@gtk.org>
+
+ * gutils.c: (g_strcasecmp). Check for isupper before
+ taking tolower, and account for macroized tolower.
+
+ * gutils.c (g_error): Check for recursion.
+
+1998-04-27 Elliot Lee <sopwith@cuc.ml.org>
+
+ * glist.c (g_list_position): New function to find the position of
+ a link in a list - should be the inverse of g_list_nth(), but
+ haven't tested it so poof.
+
+Thu Apr 30 21:41:30 1998 Owen Taylor <otaylor@gtk.org>
+
+ * gstring.c : Check arguments more carefully,
+ (gtk-draco-980423-1.patch; ramsey@rhrk.uni-kl.de)
+
+Tue Apr 7 19:36:48 1998 Owen Taylor <owt1@cornell.edu>
+
+ * gutils.c (g_direct_compare): Removed, because that's what
+ a NULL comparison function means. And it wasn't 64 bit safe.
+
+Mon Apr 6 18:43:25 1998 Tim Janik <timj@gtk.org>
+
+ * gscanner.c (g_scanner_get_token_ll): fixed a bug that caused floats
+ of the format ".xxx" to be parsed as "xxx".
+
+Fri Apr 3 20:36:35 1998 Owen Taylor <owt1@cornell.edu>
+
+ * gutils.c (g_parse_debug_string): Make debug string
+ parsine case-insensitive
+
+Fri Apr 3 17:03:18 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * gstring.c: corrected possible overrun when inserting into
+ GStrings (thanks Elrond)
+
+Fri Apr 3 18:05:45 1998 Owen Taylor <owt1@cornell.edu>
+
+ * testglib.c: Removed literal german from strings
+ to appease SGI compiler.
+
+Thu Mar 26 20:47:21 1998 Owen Taylor <owt1@cornell.edu>
+
+ * configure.in glib glibconfig.h.in: Add test for atexit/on_exit -
+ use on_exit if atexit not found in definition of ATEXIT.
+
+Wed Mar 25 15:23:37 1998 Owen Taylor <owt1@cornell.edu>
+
+ * Makefile.am: Switched glibconfig.h rule from HEADERS
+ to DATA, so that it is not added to DISTFILES
+
+Wed Mar 18 22:27:08 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * garray.c: g_rarray_truncate length done correctly
+
+Sun Mar 15 07:13:34 1998 Tim Janik <timj@gimp.org>
+
+ * gutils.c: changed *_handler variables to be named glib_*_handler,
+ so you can easily access them from gdb.
+
+Sat Mar 14 17:47:43 1998 Owen Taylor <owt1@cornell.edu>
+
+ * Makefile.am: Don't refer to current directory as $(top_builddir)
+ to avoid confusing non-gmakes
+
+Sat Mar 14 01:37:35 1998 Owen Taylor <owt1@cornell.edu>
+
+ * Makefile.am (configincludedir): Moved glibconfig.h to
+ $(pkglibdir)/include
+
+Tue Mar 10 02:03:12 1998 Tim Janik <timj@gimp.org>
+
+ * gscanner.c (g_scanner_destroy_symbol_table_entry): new function to
+ free symbol table entries upon destruction
+ (gtk-gronlund-980309-0.patch.gz).
+
+Mon Mar 9 15:02:21 1998 Tim Janik <timj@gimp.org>
+
+ * glib.h: changed *_length functions to return guint.
+ changed *_nth functions to take guint as argument.
+
+ * glist.c: adapted g_list_length and g_list_length.
+
+ * gslist.c: adapted g_slist_length and g_slist_length.
+
+Mon Mar 2 17:51:18 1998 Owen Taylor <owt1@cornell.edu>
+
+ * glib.h gutils.c : changed g_strcasecmp
+ to take gchar* not guchar*
+
+ * testglib.c: Remove trailing ; after functions
+
+Sun Mar 1 19:04:40 1998 Owen Taylor <owt1@cornell.edu>
+
+ * glib.h gstring.c: Added g_string_insert[_c]()
+ and g_string_erase().
+
+ From: Stefan Wille <1wille@vsys1.informatik.uni-hamburg.de>
+
+Mon Feb 16 23:05:06 1998 Owen Taylor <owt1@cornell.edu>
+
+ * glist.c (g_list_insert_sorted): Changed function
+ so elements are always inserted, even if they compare
+ equal with another.
+
+Thu Feb 12 22:48:11 1998 Owen Taylor <owt1@cornell.edu>
+
+ * gstring.c glib.h: removed deprecated g_string_equal
+ and g_string_hash.
+
+Tue Feb 10 13:04:36 1998 Owen Taylor <owt1@cornell.edu>
+
+ * configure.in: Add check to see if the C library's
+ iswalnum can actually be used. (Not true for
+ Linux libc-5.4.38)
+
+Sat Feb 7 11:48:09 1998 Owen Taylor <owt1@cornell.edu>
+
+ * gstring.c gutils.c: added some additional consts in
+ appropriate places to remove a warning
+
+Sat Feb 7 11:15:54 1998 Owen Taylor <owt1@cornell.edu>
+
+ * gutils.c: include <ctype.h> for tolower()
+
+Fri Jan 30 23:57:17 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * added and autoconfigured in a new utility function
+ g_strcasecmp
+
+Wed Jan 28 23:53:27 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * glist.c
+ * gslist.c
+ * testglib.c: the sort functions compared backwards. Fixed
+ * glib.h: list iterator macros now check for NULL pointers
+
+Tue Jan 27 09:46:57 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * gstring.c: g_string_prepend and g_string_prepend_c had
+ interchanged src and dest parameters for g_memmove. Fixed.
+
+Tue Jan 27 01:38:52 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * gslist.c: fixed a really, really lame error. g_slist_insert
+ didn't hook the data in! Reworked the routine to reflect the
+ functionality of g_list
+
+Wed Jan 21 01:13:25 1998 Tim Janik <timj@psynet.net>
+
+ * Applied patch from (Raja R Harinath <harinath@cs.umn.edu>)
+ to add function g_snprintf.
+ * configure.in (AC_CHECK_FUNCS): Check for vsnprintf.
+ * glib.h: Add prototype for g_snprintf.
+ * glibconfig.h.in: Add HAVE_VSNPRINTF.
+ * gutils.c (g_snprintf): new function.
+
+Sat Jan 17 23:52:40 1998 Owen Taylor <owt1@cornell.edu>
+
+ * gstring.{c,h} gscanner.c:
+ renamed g_string_equal => g_str_equal
+ renamed g_string_hash => g_str_hash
+ And const corrected. Old functions left in for now.
+
+Fri Jan 9 20:03:46 1998 Tim Janik <timj@psynet.net>
+
+ * gutils.c (g_strerror): changed message for EAGAIN from
+ "no more processes" to "try again" since EAGAIN is used with
+ functions else than fork().
+
+ * gscanner.c (g_scanner_get_token_ll): use strtol() instead of
+ strtoul() to avoid conflicts with solaris.
+
+ * merged the glib portions from Jan 2 to Jan 7 out of gtk+/ChangeLog
+ into this file.
+
+Wed Jan 7 02:14:30 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * glib.h:
+ * glist.c:
+ * gslist.c:
+ * testglib.c: Added g_[s]list_insert_sorted function
+ and appropriate tests in testglib
+
+Sat Jan 3 20:23:25 1998 Owen Taylor <owt1@cornell.edu>
+
+ * glib.h: Changed guint32 -> guint for bitfields.
+ (Bitfields must be int or unsigned int?)
+
+Fri Jan 2 23:52 PST 1998 Jay Painter <jpaint@serv.net>
+
+ * glib_pre1.h:
+ * glib_pre2.h:
+ * glib.h: reverted glibconfig.h and glib.h files back to the
+ way they were before my ugly hack.
+
+ * gscanner.c: removed inlines from clist and gscanner
+
+Tue Dec 23 02:49:51 1997 Tim Janik <timj@psynet.net>
+
+ * gscanner.c: new file for GScanner: Flexible lexical scanner for
+ general purpose.
+ * glib_pre2.h: added GScanner includes. added g_strconcat and g_strtod.
+ gutils.c (g_strconcat): new function for string concatenation of NULL
+ terminated parameter list.
+ (g_strtod): new function to perform best string to double conversion
+ with or without consideration of the current locale.
+
+Mon Dec 15 19:33:58 1997 Tim Janik <timj@psynet.net>
+
+ * glist.c: minor optimizations:
+ (g_list_append): `if' optimized for common code path, commented out
+ unneccessary `assert', saved one variable assignment.
+ (g_list_prepend): saved two (conditioned) variable assignment.
+ (g_list_insert): saved one (conditioned) variable assignment,
+ saved one variable assignment.
+ (g_list_remove): `if' optimized for common code path, saved two
+ variable assignments by using `g_list_free_1' (which is even
+ faster) instead of `g_list_free'.
+ (g_list_reverse): saved allocation of one variable, saved one
+ variable assignment.
+
+Wed Dec 10 23:27:20 1997 Tim Janik <timj@psynet.net>
+
+ * glib_pre1.h:
+ * glib_pre2.h:
+ * glib.h: this file now gets concatenated by makeglib_h from
+ glib_pre1.h and glib_pre2.h to merge in glibconfig.h wich got
+ created by configure (done by Jay Painter).
+
+ * glib_pre2.h: the g_assert*() and g_return_*_fail() macros
+ are wrapped by G_STMT_START and G_STMT_END now, to avoid conflicts
+ when used within if (...) g_macro(); else ... conditionals.
+
+Tue Dec 17 13:14:07 1996 Peter Mattis <pmattis@charnley.HIP.Berkeley.EDU>
+
+ * glib.h: Changed 'g_return_if_fail' and 'g_return_val_if_fail' to
+ not call 'g_string' but to simply stringify the
+ expression. Calling 'g_string' causes the expression to be
+ expanded which is undesired.
+
+Sun Dec 1 01:30:48 1996 Peter Mattis <pmattis@charnley.HIP.Berkeley.EDU>
+
+ * Started ChangeLog
diff --git a/trunk/ChangeLog.pre-2-0 b/trunk/ChangeLog.pre-2-0
new file mode 100644
index 000000000..5eb30711b
--- /dev/null
+++ b/trunk/ChangeLog.pre-2-0
@@ -0,0 +1,7225 @@
+Fri Mar 8 10:58:28 2002 Owen Taylor <otaylor@redhat.com>
+
+ * ======== Released 2.0.0 ========
+
+Fri Mar 8 10:20:46 2002 Owen Taylor <otaylor@redhat.com>
+
+ * NEWS: Final updates for 2.0.0
+
+ * glib/gstrfuncs.c: Convert the results of strerror()
+ and strsignal() to UTF-8.
+
+ * glib/gconvert.c glib/gdir.c glib/giochannel.c glib/giounix.c
+ glib/giowin32.c: Use g_strerror(), not strerror().
+
+Fri Mar 8 00:15:29 2002 Owen Taylor <otaylor@redhat.com>
+
+ * README.in: Updates.
+
+ * README.in: Add warnings about current encoding problems with .po
+ files and error logging functions.
+
+ * configure.in: Check for bind_textdomain_codeset().
+
+ * glib/gutils.c (_glib_gettext): Call
+ bind_textdomain_codeset, if present.
+
+ * INSTALL.in: Some updates.
+
+ * AUTHORS: Updates.
+
+ * Makefile.am (EXTRA_DIST): Remove TODO.xml from EXTRA_DIST.
+
+ * docs/Makefile.am (EXTRA_DIST): Remove Changes-2.0.txt
+ from EXTRA_DIST.
+
+2002-03-06 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Fixed recognition of dce. Do not use -lc_r on
+ OpenBSD and FreeBSD. Instead use -pthread. Move scheduling
+ parameter check to after the case..esac block for finding the
+ right thread libs. (#73686)
+
+Tue Mar 5 19:41:02 2002 Owen Taylor <otaylor@redhat.com>
+
+ * GTK+-2.0.0 rc1
+
+2002-03-05 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmain.c (g_source_set_priority): Finish docs.
+ (#67064)
+
+Tue Mar 5 00:38:54 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gutils.c (g_get_any_init): Where we have
+ getpwuid[_r], use that in preference to $HOME, and
+ only check $HOME as a fallback if getpwuid fails.
+ (#2311)
+
+Sun Mar 3 21:09:24 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Default to --disable-gtk-doc, to avoid
+ Jade setup hassles.
+
+ * autogen.sh: Add --enable-gtk-doc.
+
+ * configure.in: Default to --disable-static to go
+ along with Pango, GTK+ where we need to do that for
+ bin-compat reasons.
+
+ * Makefile.am: Add a slightly modified distcheck rule
+ that passes --enable-gtk-doc to the configure inside.
+ (So that 'make dist' succeeds inside.)
+
+ * configure.in *.pc.in **/Makefile.am m4macros/glib-2.0.m4
+ tests/makefile.mingw.in: Switch everything over to
+ glib-2.0.
+
+Sun Mar 3 02:30:05 2002 Tim Janik <timj@gtk.org>
+
+ * glib/gscanner.h (_GScannerConfig): added padding.
+
+ * glib/ghook.h (struct _GHook): add two padding pointers.
+
+Thu Feb 28 11:13:49 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gshell.c (g_shell_unquote): Fix memory leak.
+ (#72990, Paolo Maggi)
+
+2002-02-28 Sven Neumann <sven@gimp.org>
+
+ * m4macros/glib-2.0.m4: nicer output of configure --help.
+
+2002-02-27 Daniel Elstner <daniel.elstner@gmx.net>
+
+ * glib/gdate.c (g_date_strftime): Remove the shortcut
+ for UTF-8 locales to ensure consistent behaviour. Fix
+ handling of the strftime return value, and avoid looping
+ if strftime is buggy and constantly returns 0. Always
+ return 0 if the output buffer was to small. (#72544)
+
+Tue Feb 26 21:44:01 2002 Owen Taylor <otaylor@redhat.com>
+
+ * config.status config.guess: Remove these files
+ from CVS so we more-or-less current versions from
+ automake --add-missing. (Reported by Finlay Dobbie,
+ #60342)
+
+2002-02-26 Matthias Clasen <maclas@gmx.de>
+
+ * docs/debugging.txt, gobject/glib-genmarshal.c,
+ gobject/glib-genmarshal.1, gobject/Makefile.am, gobject/gtype.c:
+ Remove references to gruntime. This includes renaming the test
+ program testgruntime to testgobject and the debug envvar
+ GRUNTIME_DEBUG to GOBJECT_DEBUG. (#50877)
+
+Tue Feb 26 14:56:31 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib-2.0.pc.in: Reorder @INTL_LIBS@ and @ICONV_LIBS@ in case
+ -lintl depends on -licon. (Miroslaw Dobrzanski-Neumann #72708)
+
+Mon Feb 25 23:01:53 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in acconfig.h config.h.win32.in
+ glib/gconvert.c: Check for iconv_* in -liconv
+ as well as libiconv_* in -liconv since AIX ships
+ the system iconv in a separate library.
+ Patch from Miroslaw Dobrzanski-Neumann (#72569)
+
+Mon Feb 25 22:46:29 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gdebug.h: Fix trailing , in enumeration
+ Miroslaw Dobrzanski-Neumann (#72574)
+
+Mon Feb 25 21:58:01 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/guniprop.c (g_unichar_toupper/lower): Account
+ for some characters having now uppercase/lowercase
+ equivalents in code, docs. (#65416)
+
+Mon Feb 25 16:31:09 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gshell.c (tokenize_command_line): Fix quoting
+ of \' sequence (#72548, Christian Rose)
+
+2002-02-24 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: Edits.
+
+ * config.h.win32.in: Add (as undefined) HAVE_UNSETENV,
+ _FILE_OFFSET_BITS and _LARGE_FILES, just for completeness.
+
+ * glibconfig.h.win32.in: Add the gcc-2.95.x undef of
+ G_HAVE_ISO_VARARGS.
+
+Sat Feb 23 21:36:51 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: 1.3.15, binary, interface age 0.
+
+ * NEWS: Updated.
+
+Sat Feb 23 14:54:13 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/giochannel.h (struct _GIOChannel): Add a little bit
+ of padding.
+
+ * glib/gmain.h (struct _GSource): Add a little bit of padding.
+
+2002-02-21 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gdebug.h: New header containing GTK_DEBUG-style debugging
+ support for GLib. Currently only the fatal_warnings debug option exists.
+
+ * glib/gmessages.c (g_log_msg_prefix_init): New one-shot function
+ for parsing G_MESSAGES_PREFIXED.
+ (_g_debug_init): New one-shot function for parsing G_DEBUG.
+ (g_log_write_prefix): Use g_log_msg_prefix_init().
+ (g_messages_init): Use g_log_msg_prefix_init() and _g_debug_init().
+
+ * glib/Makefile.am (libglib_1_3_la_SOURCES): Add gdebug.h.
+
+Wed Feb 20 22:35:42 2002 Owen Taylor <otaylor@redhat.com>
+
+ Fixes from Miroslaw Dobrzanski-Neumann (#71963)
+
+ * glib/giounix.c (g_io_channel_new_file): Fix trailing comma
+ in enum.
+
+ * configure.in: Check for unsetenv.
+
+ * test/uri-test.c: Fall back to trying putenv(VARNAME) if
+ unsetenv isn't present.
+
+2002-02-20 Daniel Elstner <daniel.elstner@gmx.net>
+
+ * glib/gstring.[ch] (g_string_erase): Use gssize instead of
+ gsize as type of the pos and len arguments. (#71964)
+
+2002-02-20 Simos Xenitellis <simos@hellug.gr>
+
+ * configure.in: Added el to ALL_LINGUAS (Greek language).
+
+2002-02-19 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gspawn-win32.c: Include <config.h> first here, too. Use
+ g_io_channel_read_chars() instead of (deprecated)
+ g_io_channel_read(). Set encoding to NULL for the channels used
+ for the pipes from the child.
+
+ * glib/giowin32.c (buffer_read): Do return G_IO_STATUS_EOF when
+ EOF has been reached. Otherwise, with the above change to
+ gspawn-win32.c, spawn-test hangs.
+
+Mon Feb 18 20:18:23 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/libcharset/Makefile.am (EXTRA_DIST): Remove
+ charset.alias from EXTRA_DIST; we don't want the
+ charset.alias from the make distcheck machine
+ on the target system!. (#70974, reported by
+ Ryan Lovett)
+
+Mon Feb 18 12:40:36 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Turn off ISO varargs support for gcc-2.95
+ since it causes problems with ANSI and we we have GNUC
+ varargs. (#70024, reported by Morten Welinder, fix from
+ James Henstridge)
+
+Sun Feb 17 11:37:06 2002 Owen Taylor <otaylor@redhat.com>
+
+ * 1.3.14
+
+ * glib/glibintl.h: Error out of config.h wasn't included
+ rather than including it, since config.h must be the
+ first thing included.
+
+ * glib/gconvert.c glib/gmarkup.c glib/gshell.c glib/gspawn.c
+ glib/gunibreak.c glib/gunidecomp.c glib/guniprop.c:
+ Include config.h as the first thing. (#71704, Morten
+ Welinder)
+
+Fri Feb 15 11:41:42 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: 1.3.14, binary age 0, interface age 0.
+
+Fri Feb 15 10:41:51 2002 Owen Taylor <otaylor@redhat.com>
+
+ * NEWS: Updated.
+
+ * configure.in: Require autoconf-2.52, run AC_SYS_LARGEFILE.
+ (#71410, Sven Neumann)
+
+ * glib/giounix.c glib/giowin32.c glib/giochannel.[ch]:
+ Change offset type for g_io_channel_seek[_position] to
+ gint64.
+
+2002-02-15 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * tests/thread-test.c: Do not assume, that after
+ g_usleep(G_USEC_PER_SEC) the newly started thread began
+ running. Spotted by Miroslaw Dobrzanski-Neumann
+ <mne@mosaic-ag.com>. Make the test_g_static_rw_lock_thread threads
+ wait a random time. Make the test_g_static_rw_lock test run 5
+ seconds, not 1.
+
+2002-02-14 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gmessages.c (g_logv): Use the #if branch with
+ G_BREAKPOINT() also on Win32. Remove the separate __asm int 3 for
+ MSVC, G_BREAKPOINT() does exactly that.
+
+2002-02-14 James Henstridge <james@daa.com.au>
+
+ * m4macros/glib-gettext.m4: add third argument to the AC_DEFINE
+ calls, so users of the macro don't need to add entries to
+ acconfig.h in their package.
+
+2002-02-13 Havoc Pennington <hp@redhat.com>
+
+ * glib/gmain.c (g_main_context_check): never dispatch sources of
+ mixed priority, because while iterating over the dispatch array a
+ new source with more priority may be added, while a source with
+ less priority remains in the dispatch array
+
+2002-02-11 Darin Adler <darin@bentspoon.com>
+
+ * glib/gmessages.h: Use "if (expr) { } else" as I meant to in the
+ first place. The other form can trigger warnings in some compilers
+ that suspect a ";" after "if (expr)" is an error.
+
+2002-02-11 Manish Singh <yosh@gimp.org>
+
+ * glib/gmessages.h: need statement terminators for the if clauses for
+ the preceding change.
+
+2002-02-11 Darin Adler <darin@bentspoon.com>
+
+ * glib/gmessages.h: Use "if (expr) else" rather than
+ "if (!(expr))" so the parentheses don't disable the gcc
+ warnings about = vs. ==.
+
+2002-02-11 jacob berkman <jacob@ximian.com>
+
+ * glib/gmarkup.h (g_markup_error_quark): match the signature in
+ the implementation
+
+2002-02-10 Hans Breuer <hans@breuer.org>
+
+ * glib/gfileutils.c : no sym links on win32, no lstat in msvcrt
+
+ * tests/makefile.msc.in : added uri-test
+
+2002-02-09 Darin Adler <darin@bentspoon.com>
+
+ * glib/gmarkup.c: (xml_isspace): New.
+ (skip_spaces): g_unichar_isspace -> xml_isspace
+ * glib/gstrfuncs.c: (g_ascii_strtod): isspace -> g_ascii_isspace
+ isxdigit -> g_ascii_isxdigit, isdigit -> g_ascii_isdigit
+
+2002-02-09 Matthias Clasen <matthias@local>
+
+ * tests/markups/valid-4.gmarkup: Test attribute value delimiters.
+
+ * glib/gmarkup.c (g_markup_parse_context_parse): Support
+ ' and " as attribute value delimiters. (#70677)
+
+2002-02-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Make --disable-threads work again. (#71034)
+
+Fri Feb 8 23:52:27 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/gvaluetransform.c: Register transformations for
+ gint64, guint64. (#70780, patch from Andy Wingo)
+
+ * configure.in: Handle missing G_GINT64_FORMAT,
+ G_GUINT64_FORMAT ... harder to require GNU libc than GCC.
+
+ * NEWS: Some cleanups that I had setting around.
+
+2002-02-08 Darin Adler <darin@bentspoon.com>
+
+ * glib/gconvert.h: Make hostname parameter const char *.
+ * glib/gconvert.c: (g_unescape_uri_string): Added a new
+ "ASCII must not be escaped" feature, and some missing error
+ checking.
+ (is_escalphanum): New.
+ (is_escalpha): New.
+ (hostname_validate): New.
+ (g_filename_from_uri): Don't allow hostnames to include
+ escaped ASCII, validate hostnames with the new
+ hostname_validate.
+ (g_filename_to_uri): Validate hostnames with the new
+ hostname_validate.
+
+ * tests/uri-test.c: Updated tests to reflect the hostname
+ validation changes above.
+
+ * glib/gdate.c: (g_date_fill_parse_tokens): Remove the
+ <ctype.h> include and do isdigit -> g_ascii_isdigit.
+
+Fri Feb 8 12:32:14 2002 Owen Taylor <otaylor@redhat.com>
+
+ * tests/hash-test.c (second_hash_test): Fix access to
+ freed memory in test case (Miroslaw Dobrzanski-Neumann).
+ Re-enable and debug some commented out code.
+
+2002-02-08 Michael Natterer <mitch@gimp.org>
+
+ * glib/gdir.c: g_dir_open: added g_return_val_if_fail() to prevent
+ us from calling opendir(NULL) (which simply crashes).
+
+2002-02-08 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/gfileutils.c (g_file_test): Extended documentation.
+
+2002-02-07 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/gfileutils.c (g_file_test): Do not follow symbolic links
+ for G_FILE_TEST_SYMLINK. Also fixed the correct "OR"-behaviour for
+ G_FILE_TEST_IS_EXECUTABLE and G_FILE_TEST_EXISTS. (#60048)
+
+2002-02-07 Changwoo Ryu <cwryu@debian.org>
+
+ * configure.in (ALL_LINGUAS): Added "ko".
+
+Wed Feb 6 14:44:18 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.c (g_main_context_prepare): Handle
+ NULL entries (already dispatched) in pending_dispatches array
+ (pointed out by Manish Singh)
+
+Tue Feb 5 17:13:02 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.c (g_main_context_prepare): Unref pending
+ dispatches when discarding them.
+
+2002-02-04 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/gthread.c (g_thread_create_full): Delay allocation until
+ after all g_return_val_if_fail ().
+
+ * glib/gthread.h: Make depth member guint for cosmetic reasons.
+
+ * glib/gthread.c: (g_static_rec_mutex_unlock_full): depth should
+ be unsigned. All that spotted by Jrgen Viksell
+ <jorgen.viksell@telia.com>
+
+2002-02-02 Manish Singh <yosh@gimp.org>
+
+ * glib/gmain.c
+ * glib/gtree.c: remove references to deprecated functions in docs
+ and warning message.
+
+2002-01-31 jacob berkman <jacob@ximian.com>
+
+ * glib-gettextize.in:
+ * m4macros/glib-gettext.m4 (AM_GLIB_GNU_GETTEXT): remove
+ references to po2tbl
+
+2002-01-29 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gmarkup.c (g_markup_parse_context_parse): Change the
+ order in which some error conditions are checked to improve
+ error messages. (#69646)
+
+Tue Jan 29 15:04:31 2002 Owen Taylor <otaylor@redhat.com>
+
+ * 1.3.13
+
+ * tests/shell-test.c: Workaround for MSVC bugs. (#61064)
+
+Tue Jan 29 14:06:22 2002 Owen Taylor <otaylor@redhat.com>
+
+ * NEWS: Update to include last change.
+
+2002-01-21 Jeffrey Stedfast <fejj@ximian.com>
+
+ * glib/gconvert.c (open_converter): Rewritten to cache iconv
+ conversion descriptors. On at least some Unix systems like
+ Solaris, iconv_open() must dlopen the necessary charset modules in
+ order to setup the descriptor. This can take a major toll on
+ performace if you are constantly opening and closing conversion
+ descriptors for the same charset conversions over and over.
+ (g_convert_with_fallback): Use close_converter() rather than
+ g_iconv_close() since open_converter() now caches iconv
+ descriptors.
+
+Tue Jan 29 11:18:44 2002 Owen Taylor <otaylor@redhat.com>
+
+ * NEWS: Updated.
+
+ * configure.in: Micro == 13, binary age, interface age 0.
+ [ binary breakage was return type of g_signal_connect_object(),
+ probably could have used binary age == 0, but a little safer not to.]
+
+ * configure.in: Remove configure warning.
+
+2002-01-28 Havoc Pennington <hp@pobox.com>
+
+ * glib/gmarkup.c (add_attribute): NULL-terminate
+ context->attr_values so g_strfreev() is safe.
+ Would previously crash if parsing was ended prior
+ to ending the start tag.
+ (g_markup_parse_context_parse): add a couple assertions
+
+2002-01-28 Havoc Pennington <hp@redhat.com>
+
+ * glib/gmacros.h: get rid of warning here
+
+Mon Jan 28 17:56:10 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmacros.h: Only use __FUNCTION__, __PRETTY_FUNCTION__ for
+ G_GNUC_FUNCTION, G_GNUC_PRETTY_FUNCTION, G_STRLOC when __GNUC__ <
+ 3, since in 3.0.3 the semantics of these functions were changed in
+ an incompatible way. (#69097)
+
+2002-01-28 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/giochannel.c: Some documentation fixes/elaborations
+ I really should have gotten in a long time ago
+
+2002-01-24 Sven Neumann <sven@gimp.org>
+
+ * glib/gutf8.c (g_utf8_to_utf16): removed an empty line in the
+ inline documentation that confused gtk-doc.
+
+2002-01-23 Laszlo Peter <laca@ireland.sun.com>
+
+ * glib/gmessages.c (g_printf_string_upper_bound): return 1 more
+ for the trailing '\0' when using vsnprintf. (#69474)
+
+2002-01-23 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gconvert.c: (strdup_len): Not used on Windows, don't even
+ compile it then.
+
+ (acceptable): Improve comments for the _acceptable_ table: put
+ each ASCII char above the hex number for it.
+
+ (g_escape_file_uri): On Windows, turn backslashes in the file name
+ into plain ("forward") slashes.
+
+ (g_filename_from_uri): On Windows, don't return the hostname
+ "localhost", because we can not be 100% sure it will be recognized
+ in all cases anyway, so simpler to turn it into a null
+ hostname.
+
+ Change slashes in the filename into backslashes, as that is the
+ more canonical separator.
+
+ Recognize drive letters (either followed by a colon or a vertical
+ bar, as used by some browsers), and if the filename part starts
+ with a such, don't include any (back)slash.
+
+ Don't drop any extra leading slash in the filename on Unix.
+
+ (g_filename_to_uri): On Windows, if the hostname is "localhost",
+ don't use it, for consistency with g_filename_from_uri().
+
+ * tests/uri-test.c: Change accordingly, so that all tests pass on
+ Windows. Unix, too, I hope, though I couldn't check that now.
+
+ (main): Unset the G_BROKEN_FILENAMES environment variable on Unix,
+ as some tests require that filenames are in UTF-8. Is unsetenv()
+ portable?
+
+ These changes should fix bugs #59387, #59652, #59657 and #59658.
+
+2002-01-22 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Get the right multithread option for GCC 3.0 and
+ later on AIX. (#67583)
+
+2002-01-21 Jeffrey Stedfast <fejj@ximian.com>
+
+ * glib/gconvert.c (g_convert_with_fallback): If g_convert fails,
+ set bytes_written to 0 and close the iconv descriptor that was
+ opened a few lines above. On a successful return, calculate
+ bytes_written to be outp - dest instead of outp - str.
+
+2002-01-16 Sven Neumann <sven@gimp.org>
+
+ * acinclude.m4
+ * m4macros/glib-gettext.m4: removed the --disable-nls option. You
+ can't disable Native Language Support since we rely on it.
+
+ * configure.in: nicer --help output.
+
+Tue Jan 8 11:33:28 2002 Owen Taylor <otaylor@redhat.com>
+
+ * docs/Makefile.am (EXTRA_DIST): Add text files to EXTRA_DIST.
+ (#68239, Matthias Clasen)
+
+2002-01-07 Zbigniew Chyla <cyba@gnome.pl>
+
+ * configure.in (ALL_LINGUAS): Added pl.
+
+2002-01-05 Hans Breuer <hans@breuer.org>
+
+ * glibconfig.h.win32.in
+ msvc_recommended_pragmas.h (new file) : moved warning to
+ error pragmas to their own file to not force 'good practice'
+ programming in downstream libs and apps. Instead the new header
+ will be used by -FImsvc_recommended_pragmas.h in gnome/cvs
+ makefile.msc
+ * */makefile.msc.in : use -FImsvc_recommended_pragmas.h
+
+ * makefile.am : add msvc_recommended_pragmas.h to EXTRA_DIST
+
+2001-12-31 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gutils.c (g_get_any_init): (Win32) Use longer buffer for
+ user name.
+
+Sat Dec 29 15:07:21 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gspawn.c (script_execute): Copy trailing NULL
+ into new ARGV array. (#67673)
+
+2001-12-28 Sven Neumann <sven@gimp.org>
+
+ * glib/gmessages.c: only include printf_string_upper_bound() if
+ HAVE_C99_VSNPRINTF is not defined.
+
+2001-12-27 Duarte Loreto <happyguy_pt@hotmail.com>
+
+ * configure.in: Added portuguese to ALL_LINGUAS
+
+Sat Dec 22 12:08:56 2001 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: 1.3.12, binary, interface age 0.
+
+ * NEWS: Updated.
+
+2001-12-21 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32.in: Add (undefined) HAVE_C99_VSNPRINTF.
+
+ * glibconfig.h.win32.in: Add definition of G_HAVE_GROWING_STACK.
+
+ * tests/Makefile.am: Rename the progs_LDADD, thread_LDADD and
+ module_LDADD Make macros to progs_ldadd, thread_ldadd and
+ module_ldadd. Newer automakes reserve macros named *_LDADD for
+ the use as LDADDs for targets it knows.
+
+ * glib/giowin32.c: (struct _GIOWin32Watch): 'callback' wasn't used
+ here, either.
+
+2001-12-21 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gfileutils.c (g_file_get_contents): Remove FIXME. (#67063)
+
+2001-12-19 Mark McLoughlin <mark@skynet.ie>
+
+ * glib/gscanner.c: (g_scanner_unexp_token): fix segfaults.
+
+2001-12-20 Michael Meeks <michael@ximian.com>
+
+ * glib/giounix.c (struct _GIOUnixWatch): kill 'callback'
+
+Wed Dec 19 23:09:07 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gconvert.c (g_iconv_open): SGML doc fix.
+
+Tue Dec 18 21:11:10 2001 Tim Janik <timj@gtk.org>
+
+ * configure.in: add configure check to determine G_HAVE_GROWING_STACK.
+
+2001-12-16 Havoc Pennington <hp@pobox.com>
+
+ * glib/gfileutils.c (get_contents_regfile): use g_try_malloc and
+ return error on not-enough-memory
+ (get_contents_stdio): ditto
+
+2001-12-17 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gspawn.c, glib/gspawn-win32.c: Use <envar>, not <envvar>.
+
+2001-12-15 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gshell.c, glib/gspawn.c, glib/gspawn-win32.c, glib/gerror.c,
+ glib/gfileutils.c, glib/ghash.c, glib/gmain.c, glib/gasyncqueue.c,
+ glib/gtree.c: Minor markup fixes.
+
+2001-12-14 Havoc Pennington <hp@pobox.com>
+
+ * glib/gshell.c (g_shell_parse_argv): note on how to free returned
+ vector
+
+2001-12-08 Havoc Pennington <hp@pobox.com>
+
+ * glib/gspawn.c (fork_exec_with_pipes): include argv[0] in error
+ message about failure to exec
+
+2001-12-13 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gconvert.c, glib/giochannel.c, glib/gmain.c,
+ glib/gwin32.c: Revert mistaken change: it is UNIX, not Unix.
+
+Thu Dec 13 05:37:51 2001 Tim Janik <timj@gtk.org>
+
+ * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray
+ structure.
+
+2001-12-12 Matthias Clasen <matthiasc@poet.de>
+
+ This fixes #60543:
+
+ * glib/gutils.c (g_snprintf, g_vsnprintf): Switch to C99-[v]snprintf().
+
+ * tests/strfunc-test.c: Add some tests for g_snprintf().
+
+2001-12-12 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gconvert.c, glib/grand.c, glib/ghash.c,
+ glib/gthreadpool.c, glib/gtree.c: Documentation fixes.
+
+Mon Dec 10 14:08:39 2001 HideToshi Tajima <hidetoshi.tajima@sun.com>
+
+ * glib/libcharset/config.charset (os):
+ add ISO8859-3 for Solaris. (#66174)
+
+2001-12-10 Sven Neumann <sven@gimp.org>
+
+ * gobject/gvalue.c (g_value_register_transform_func): perform an exact
+ match on the two types instead of using transform_func_lookup().
+
+2001-12-09 Christopher Blizzard <blizzard@redhat.com>
+
+ * glib/gmessages.h: Add pragma that will prevent warnings when you
+ are not using -std=99 and newer gcc compilers. Patch from Red
+ Hat's gtk+ 1.2 rpm.
+
+2001-12-06 Darin Adler <darin@bentspoon.com>
+
+ * glib/gmacros.h: Do the same for "pure".
+
+2001-12-06 Matthias Clasen <matthiasc@poet.de>
+
+ The following patch corrects some function attributes. (#61780)
+
+ * glib/ghash.h (g_int_equal, g_int_hash): These are not const.
+
+ * glib/glibintl.h (_glib_gettext): Add G_GNUC_FORMAT(1).
+
+ * glib/gmacros.h: Use reserved symbols in function attribute macros.
+
+2001-12-06 Matthias Clasen <matthiasc@poet.de>
+
+ The following patch avoids manual printf()-format parsing
+ if a C99-conforming vsnprintf() is available. (#55106)
+
+ * acinclude.m4 (AC_FUNC_VSNPRINTF_C99): New macro to test for a
+ C99 conforming vsnprintf.
+
+ * configure.in: Use AC_FUNC_VSNPRINTF_C99.
+
+ * glib/gmessages.c (g_printf_string_upper_bound): Use C99 vsnprintf().
+
+2001-12-05 Sven Neumann <sven@gimp.org>
+
+ * glib/gtree.c (g_tree_foreach): mention the fact that the tree is
+ traversed in sorted order.
+
+2001-12-03 Manish Singh <yosh@gimp.org>
+
+ * tests/module-test.c: g_module_symbol takes a gpointer *, not just
+ a gpointer
+
+ * tests/libmoduletestplugin_a.c: here too
+
+2001-11-29 Havoc Pennington <hp@redhat.com>
+
+ * glib/gtree.c (g_tree_foreach):
+ * glib/ghash.c (g_hash_table_foreach):
+
+ Add notes about how you shouldn't modify these data structures as
+ you iterate over them.
+
+Thu Nov 29 11:16:03 2001 Owen Taylor <otaylor@redhat.com>
+
+ * HACKING: Update (#65721, Dave Neary)
+
+2001-11-28 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/gdate.c: Fixed wrong order in conversion.
+
+Wed Nov 28 18:34:22 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.[ch]: Rename (private) GSource.id and
+ id parameter to g_main_context_find_source_by_id()
+ to avoid problems with Objective C where 'id' is
+ a keyword. (#65616)
+
+2001-11-28 Daniel Elstner <daniel.elstner@gmx.net>
+
+ * glib/gutf8.c (utf8_skip_data): In order to avoid infinite loops
+ on invalid UTF-8 strings, change the skip count for 0xfe and 0xff
+ from 0 to 1.
+
+2001-11-28 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Always call GLIB_SIZEOF(..., system_thread). Fixes
+ #65624.
+
+2001-11-28 Tor Lillqvist <tml@iki.fi>
+
+ * glibconfig.h.win32.in: Add GLIB_SIZEOF_SIZE_T here, too.
+
+2001-11-27 Dan Winship <danw@ximian.com>
+
+ * configure.in (G_MODULE_LDFLAGS): Set this from libtool rather
+ than hardcoding values for certain platforms.
+
+ * glib/libcharset/config.charset: Add a rule for NetBSD.
+
+ * glib/libcharset/localcharset.c (_g_locale_get_charset_aliases):
+ If LIBCHARSET_ALIAS_DIR is set, look for charset.aliases there.
+
+ * tests/Makefile.am (TESTS_ENVIRONMENT): set LIBCHARSET_ALIAS_DIR
+ so we don't depend on charset.aliases having been installed
+
+2001-11-26 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gnode.c (g_node_traverse): Implement G_LEVEL_ORDER correctly.
+
+ * tests/node-test.c: Add a testcase for G_LEVEL_ORDER implementation.
+
+ * glib/gtree.h: Mark g_tree_traverse() as deprecated. (#65343)
+
+ * glib/gtree.c (g_tree_traverse): Explain the deprecation in
+ some detail.
+
+Mon Nov 26 09:42:24 2001 Tim Janik <timj@gtk.org>
+
+ * configure.in: provide GLIB_SIZEOF_SIZE_T.
+
+2001-11-26 Jesus Bravo Alvarez <jba@pobox.com>
+
+ * configure.in: Added gl (Galician) to ALL_LINGUAS
+
+2001-11-23 Hans Breuer <hans@breuer.org>
+
+ * glib/makefile.msc.in : added -Zm400 to DEPCFLAGS to avoid :
+ gunidecomp.h(5846) : fatal error C1076: compiler limit :
+ internal heap limit reached; use /Zm to specify a higher limit
+
+ * glibconfig.h.win32.in : added recommended pragma list for
+ msvc again. They are an invaluable help of letting the
+ compiler catch bugs.
+
+Thu Nov 22 13:56:55 2001 Owen Taylor <otaylor@redhat.com>
+
+ * Version 1.3.11
+
+Thu Nov 22 13:14:18 2001 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in (GLIB_MICRO_VERSION): Version 11,
+ interface, binary age 0.
+
+ * NEWS: Updated.
+
+ * tests/Makefile.am (libmoduletestplugin_[ab]_la_LDFLAGS):
+ Add dummy -rpath argument. On some (but not all) platforms,
+ libtool will only build a convenience library without this.
+ (#63486, Dan Winship)
+
+ * Makefile.am (EXTRA_DIST): Add README.in, INSTALL.in -
+ autoconf-2.5x checks for 'make dist' in the tarball
+ when you make distcheck.
+
+ * glib/Makefile.am (EXTRA_DIST): Distribute
+ makefile.msc/mingw.in, glib.rc.in.
+
+ * tests/patterntest.c: Include string.h.
+
+ * glib/gpattern.c (g_utf8_reverse): doc parsing fix.
+
+Thu Nov 22 02:50:18 2001 Tim Janik <timj@gtk.org>
+
+ * NEWS: merged with gobject/NEWS.
+
+2001-11-21 Tor Lillqvist <tml@iki.fi>
+
+ * glib/makefile.mingw.in (DEFINES): Set G_LOG_DOMAIN as in
+ Makefile.am.
+
+Tue Nov 20 20:54:25 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gunidecomp.[ch] glib/gen-unicode-tables.pl: Patch
+ from Andrew Taylor to optimize the decomposition table
+ to eliminate relocations and save space. (#64982)
+
+2001-11-18 Hans Breuer <hans@breuer.org>
+
+ * glib/glib.def :
+ * glib/makefile.msc.in : remove g_log_domain_glib usage/export
+
+ * tests/makefile.msc.in : add iochannel-test
+
+Sat Nov 17 17:21:57 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/Makefile.am glib/*.c glib/gmessages.h: Get
+ rid of g_log_domain_glib variable in favor of just
+ using a string constant.
+
+Sat Nov 17 14:10:35 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gbsearcharray.h: Include gtypes.h not gobject/gtype.h
+
+ * glib/glib-object.h gobject/*.h: Prevent headers from
+ being included directly except when compiling GObject.
+
+ * gobject/gvaluecollector.h: Include glib-object.h so that
+ this file can be included directly, since we don't
+ include it _from_ glib-object.h.
+
+ * gobject/gtype.c: Remove struct _GValue hack since we
+ now include glib/gvaluecollector.h which simply pulls in
+ glib-object.h.
+
+2001-11-15 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/giochannel.c: Documentation fixes.
+
+2001-11-15 Takayuki KUSANO <AE5T-KSN@asahi-net.or.jp>
+
+ * configure.in: Added "ja" to ALL_LINGUAS.
+
+2001-11-15 Michael Meeks <michael@ximian.com>
+
+ * glib/giounix.c (g_io_channel_unix_new): set the fd
+ before using it.
+
+2001-11-15 Tor Lillqvist <tml@iki.fi>
+
+ * tests/makefile.{mingw,msc}.in (TESTS): Add back mainloop-test
+ here, too.
+
+ * tests/Makefile.am: Remove leftover comment that claimed
+ mainloop-test is removed.
+
+2001-11-14 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gpattern.c: add UTF-8 support.
+
+ * tests/patterntest.c: add UTF-8 and equality tests.
+
+Wed Nov 14 07:34:24 2001 Tim Janik <timj@gtk.org>
+
+ * glib/galloca.h (g_newa): provide g_newa(ctype, count) on top of
+ g_alloca() like we provide g_new() on top of g_malloc().
+
+Tue Nov 13 21:25:35 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/{gen-unicode-tables.pl,gunibreak.c,gunibreak.h,
+ gunichartables.h, gunicomp.h, gunidecomp.[ch],
+ guniprop.c}: Patch from Andrew Taylor to improve
+ tables and reduce relocations by using indices
+ rather than pointers. (#64433)
+
+ * tests/unicode-normalize.c (main): Fix for changes
+ to g_strsplit().
+
+2001-11-12 Darin Adler <darin@bentspoon.com>
+
+ * glib/gstrfuncs.c: (g_strsplit): Fix max_tokens == 1 case to
+ match documentation.
+ * tests/strfunc-test.c: (main): Add tests.
+
+ * tests/.cvsignore: Recently-added test.
+
+Mon Nov 12 03:01:28 2001 Tim Janik <timj@gtk.org>
+
+ * glib/gscanner.c (g_scanner_eof): G_TOKEN_ERROR is also an end
+ of stream condition.
+
+2001-11-10 Tor Lillqvist <tml@iki.fi>
+
+ * glib-zip.in (DEVZIP): Also share/glib-2.0.
+
+2001-11-09 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gwin32.c (g_win32_getlocale): Add a couple of languages
+ that have LANG_* codes in newest headers, just for completeness.
+
+2001-11-08 Wang Jian <lark@linux.net.cn>
+
+ * configure.in(ALL_LINGUAS): Added zh_CN for Simplified Chinese.
+
+2001-11-08 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gwin32.c: Don't define LANG_AZERI etc in case those aren't
+ defined in the headers (MSVC 5.0).
+ (g_win32_getlocale): Instead, surround uses of those with
+ #ifdef. Those MSVC 5.0 users that want to build a GLib that
+ recognizes those languages should download the Platform SDK and
+ use the headers from it.
+
+2001-11-07 Peter Williams <peterw@ximian.com>
+
+ * glib/gdir.c (g_dir_read_name): Return NULL when done reading.
+
+2001-11-06 Tor Lillqvist <tml@iki.fi>
+
+ * glib/Makefile.am (gspawn_win32_helper_LDFLAGS): Use -mwindows.
+
+2001-11-05 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: Minor edits.
+
+ * glib-zip.in: Build separate runtime and developer packages.
+
+ * glib/libcharset/config.charset (os): Don't need to match mingw
+ after all, the charset.alias file isn't even used on Win32... (see
+ localcharset.c).
+
+ * glib/makefile.mingw.in: Add gdir.
+
+ * glib/glib.def: Add g_dir_* entry points.
+
+Sun Nov 4 20:45:21 2001 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in (CFLAGS): Add check for dirent.h
+
+ * glib/glib.h glib/Makefile.am: Add gdir.
+
+ * glib/gdir.c (g_dir_close): Couple of small tweaks
+ now that it is actually compiling...
+
+Sun Nov 4 20:29:31 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gdir.[ch]: Indentation fixes, some rewriting of docs to
+ conform to gtk-doc standard.
+
+ * glib/gdir.[ch] (g_dir_close): Remove the boolean
+ return value. What would you do if closing failed?
+ What would the user do if you printed a warning
+ message "closing directory %s failed"?
+
+2001-11-04 Hans Breuer <hans@breuer.org>
+
+ * glib/gdir.[hc] : (new files) simplified wrapper around dirent
+ functions to improve portability of downstream libs/apps
+ * glib/makefile.msc.in : use them
+ * glib/glib.def : export them
+ * config.h.win32.in : needing HAVE_DIRENT_H defined
+
+2001-11-04 Tor Lillqvist <tml@iki.fi>
+
+ * tests/Makefile.am: On Win32, create separate .exp file for
+ module-test.o and link with that. Otherwise the GNU linker doesn't
+ export the g_clash_func.
+
+2001-11-03 Hans Breuer <hans@breuer.org>
+
+ * glib/giowin32.c : static correctness
+
+ * glib/gwin32.c : some more #if defined (SUBLANG_* ...
+ (g_win32_get_package_installation_subdirectory) use g_build_filename
+ instead of duplicating its logic
+
+ * glib/glib.def : removed duplicates, added mising, removed
+ compat cruft
+
+Fri Nov 2 19:54:16 2001 Tim Janik <timj@gtk.org>
+
+ * glib/gbacktrace.h (G_BREAKPOINT): remove public signal.h include.
+
+Thu Nov 1 21:48:43 2001 Owen Taylor <otaylor@redhat.com>
+
+ * tests/mainloop-test.c (recurser_idle): Recurse
+ with may_block = FALSE, so we don't get into
+ the pathology where the recurser_idle recurses
+ for 10 iterations, and the only thing that is
+ running is the recurser idle, which adds
+ another recursion for each of those 10 iterations
+ and....
+
+ * tests/mainloop-test.c (create_crawler): Fix race
+ condition where a crawler source could be destroyed
+ before it was added to the crawler array.
+
+ * test/Makefile.am: Add mainloop-test back.
+
+2001-11-01 Marius Andreiana <mandreiana@yahoo.com>
+
+ * configure.in: Added ro (Romanian) to ALL_LINGUAS
+
+2001-10-31 Havoc Pennington <hp@redhat.com>
+
+ * glib/gmain.c (g_main_loop_run): fix to the locking so we don't
+ hang
+
+2001-10-31 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Make --with-threads=none mean, that we want thread
+ support, but no default thread implementation. This also was the
+ original intention, but disapeared around 1998... So it doesn't
+ seem to be the most requested feature, but we went far to make it
+ possible in the code, so I resurrected this feature.
+
+ * INSTALL.in: Describe the --enable-gc-friendly, --disable-threads
+ and --with-threads options of configure.
+
+ * glib/gmain.c (g_main_context_acquire, g_main_context_release,
+ g_main_context_wait): Use the right conditional (G_THREADS_ENABLED
+ instead of G_THREAD_ENABLED). Also remove wrong
+ return-statement. Unfortunately mainloop-test still does fail. Many
+ thanks to Andrea Fazekas <fazek@ludens.elte.hu> for spotting
+ this. (#63455)
+
+2001-10-31 Matthias Clasen <matthiasc@poet.de>
+
+ * gobject/gsourceclosure.c (g_source_set_closure): Fix documentation.
+
+2001-10-30 Tor Lillqvist <tml@iki.fi>
+
+ * glib-zip.in: New file, used to build distribution packages for
+ Windows.
+
+ * configure.in: Expand it.
+
+ * Makefile.am: Distribute it.
+
+ * config.h.win32.in: Update to match currently produced config.h
+
+2001-10-29 Daniel Egger <degger@fhm.edu>
+
+ * glib/gbacktrace.h: Fix non-Intel/-Alpha version of the
+ G_BREAKPOINT macro to include <signal.h> and use SIGTRAP.
+
+ * glib/gmessages.c: Conditionalise definition of args2
+ depending on the definition of HAVE_VSNPRINTF to avoid
+ compiler warning.
+
+ * gobject/testgruntime.c
+ * tests/patterntest.c: Include <string.h> to avoid warnings.
+
+Mon Oct 29 11:29:37 2001 Owen Taylor <otaylor@redhat.com>
+
+ * m4macros/glib-2.0.m4: Don't try to use PKG_CONFIG
+ when we didn't find it. (#62944, Eric Lemings)
+
+ * m4macros/glib-2.0.m4: Fix problem with spaces around =
+ sign in assignment. (#63209, Arkadiusz Miskiewicz)
+
+Mon Oct 29 10:59:36 2001 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Check for path to Perl, add gobject/glib-mkenums
+ to AC_OUTPUT. (#63093, Dan Winship)
+
+Mon Oct 29 10:55:12 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/libcharset/Makefile.am (EXTRA_DIST): Dist
+ ref-add.sin, ref-del.sin. (#63092, Dan Winship)
+
+2001-10-29 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/gmain.c (g_main_loop_quit): Conditionalize thread related
+ calls. (#63091)
+
+2001-10-28 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.def: Add missing g_pattern_match_simple and
+ g_pattern_spec_equal.
+
+ * glib/gwin32.c (g_win32_get_package_installation_subdirectory):
+ Set separator correctly.
+
+ * glib/libcharset/config.charset (os): Match also mingw*.
+
+ * tests/testglib.c (main): (Wibn32): Print the lib/locale
+ subdirectory, as that is what actually gets used.
+
+Wed Oct 24 11:10:54 2001 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Version 1.3.10, interface age, binary age = 0.
+
+ * NEWS: Updates
+
+2001-10-26 Tor Lillqvist <tml@iki.fi>
+
+ * configure.in: Don't default to win32 thread implementation on
+ Cygwin. The gthread-win32 implementation really is for Win32 with
+ MS runtime only. Let configure find pthreads when configuring for
+ Cygwin.
+
+ * README.win32: Updates.
+
+ * glib/glib.def: Update.
+
+ * tests/makefile.mingw.in
+ * tests/makefile.msc.in: Remove mainloop-test here, too. Add ../*
+ to PATH before running tests to find DLLs. Separate the
+ interactive tests, don't run them in the check target.
+
+ * */makefile.msc.in: Include make.msc from GLib's build directory.
+
+Thu Oct 25 12:01:41 2001 Owen Taylor <otaylor@redhat.com>
+
+ * tests/Makefile.am: Temporarily remove mainloop-test, since it
+ prevents distcheck.
+
+2001-10-24 Alex Larsson <alexl@redhat.com>
+
+ * docs/reference/glib/glib-sections.txt:
+ Add g_strtod & co.
+
+ * docs/reference/glib/tmpl/string_utils.sgml:
+ Add docs for G_ASCII_DTOSTR_BUF_SIZE.
+
+ * glib/gstrfuncs.[ch]:
+ Added g_ascii_strtod, g_ascii_dtostr and g_ascii_formatd.
+
+ * tests/Makefile.am:
+ * tests/strtod-test.c:
+ Add tests for g_ascii_strtod & co.
+
+2001-10-23 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32.in: Typo: GLIB_MICRO_VERSION and
+ GLIB_MINOR_VERSION were swapped.
+
+ * glib/gutils.h: Remove G_HARDCODED_PATH_WRAPPER, Owen didn't like
+ it.
+
+ * glib/gutils.c: Instead, expand it on Win32 as
+ _glib_get_locale_dir(), and #define GLIB_LOCALE_DIR as a call to
+ it.
+
+2001-10-23 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32.in: Typo.
+
+ * glibconfig.h.win32.in: Minor update to correspond to what
+ configure now generates.
+
+ * glib/Makefile.am: (Win32): If we have built the MSVC import
+ library, install it. Install the gcc import library. Also support
+ uninstall.
+
+ * glib/gutils.h: Add macros G_WIN32_DLLMAIN_FOR_DLL_NAME and
+ G_HARDCODED_PATH_WRAPPER. These are used to avoid hardcoding path
+ names into Windows DLLs.
+
+ * glib/gutils.c: Use them for GLIB_LOCALE_DIR.
+
+ * glib/gwin32.c (get_package_directory_from_module): Plug a small
+ memory leak. Minor code reordering.
+ (g_win32_get_package_installation_subdirectory): Allow empty subdir.
+
+2001-10-19 Tor Lillqvist <tml@iki.fi>
+
+ * configure.in: Fix test for lib.exe. Can't set ms_librarian
+ before calling AC_CHECK_PROG, as it doesn't actually check
+ anything if the result variable has been preset...
+
+2001-10-19 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/gutils.c (g_set_prgname, g_get_prgname): Use another LOCK
+ for g_prgname to avoid deadlocking. (#62606)
+
+2001-10-19 Tor Lillqvist <tml@iki.fi>
+
+ * configure.in: Check also ac_cv_sizeof___int64 when requiring a
+ 64-bit type.
+
+2001-10-17 HideToshi Tajima <hidetoshi.tajima@sun.com>
+
+ * glib/gconvert.c (g_iconv_open):
+ Fix a typo: to_codeset => from_codeset.
+ (#58195, #55152)
+
+Fri Oct 12 18:24:02 2001 Tim Janik <timj@gtk.org>
+
+ * glib/gpattern.[hc]: make struct _GPatternSpec and GMatchType
+ private.
+ (g_pattern_equal): new function to return equality of two patterns
+ (required because GPatternSpec is private now).
+ (g_pattern_spec_new): fix bug wrg wildcard counting which produced
+ incorrect pattern specs (discovered by Matthias Clasen).
+ optimized code so we just keep one compiled pattern string now.
+ correctly canonicalize patterns. reduce string walks, optimize
+ decision about MATCH_ALL vs. MATCH_ALL_TAIL.
+ (g_pattern_match_string): call just g_pattern_match() with NULL
+ reversed string.
+ (g_pattern_match): allow NULL reversed strings now, reverse_dup
+ strings on demand.
+
+ * tests/patterntest.c (test_compilation): added an extended testcase
+ for pattern matching from Matthias Clasen <matthiasc@poet.de>.
+
+2001-10-11 Raja R Harinath <harinath@cs.umn.edu>
+
+ * configure.in (ac_cv_sizeof_long_long): Avoid '==' and '-a' in
+ 'test's.
+
+Wed Oct 10 20:07:36 2001 Joshua N Pritikin <vishnu@pobox.com>
+
+ * glib/gmessages.c glib/gtypes.h: Remove G_HAVE_GINT64
+ conditionalization.
+
+Wed Oct 10 17:34:15 2001 Joshua N Pritikin <vishnu@pobox.com>
+
+ * configure.in: Un-conditionalize and require a 64-bit integer
+ type.
+
+2001-10-04 Raja R Harinath <harinath@cs.umn.edu>
+
+ * configure.in: Avoid 'test -a'.
+
+2001-10-05 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gwin32.c: Documentation update.
+
+2001-10-04 Havoc Pennington <hp@redhat.com>
+
+ * glib/libcharset/Makefile.am (EXTRA_DIST): add config.charset
+
+2001-10-03 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gutils.c (Win32) (DllMain): New function (DLL entry point)
+ to tuck away actual DLL name.
+ (GLIB_LOCALE_DIR) Use actual DLL name, instead of assuming one
+ naming convention for DLLs.
+
+ * glib/glib.def: g_string_append_printf.
+
+2001-10-02 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gstrfuncs.c, glib/giochannel.c: documentation update.
+
+ * glib/gqueue.c: add documentation.
+
+2001-10-02 Sven Neumann <sven@gimp.org>
+
+ * glib/gstring.h (g_string_sprintfa): let the compatibility definition
+ point to the new name g_string_append_printf().
+
+2001-10-01 Alex Larsson <alexl@redhat.com>
+
+ * glib/gconvert.[ch]:
+ Convert G_CONVERT_ERROR_NOT_ABSOLUTE_FILE_URI and
+ G_CONVERT_ERROR_INVALID_URI to G_CONVERT_ERROR_BAD_URI.
+
+ * tests/uri-test.c:
+ Update tests
+
+Mon Oct 1 16:01:24 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gstring.[ch] glib/grel.c: Rename g_string_printfa()
+ to g_string_append_printf(). (#61041, Havoc Pennington.)
+
+2001-10-01 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gwin32.c: Documentation cleanups. (#61487)
+
+2001-10-01 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gscanner.h (GScannerMsgFunc): make third argument
+ a gboolean.
+ (g_scanner_add_symbol, g_scanner_remove_symbol,
+ g_scanner_foreach_symbol): mark these
+ G_DISABLE_DEPRECATED. (#61469)
+
+ * glib/gscanner.c (g_scanner_msg_handler): make third
+ argument gboolean. (#61468)
+
+2001-10-01 Sven Neumann <sven@gimp.org>
+
+ * glib/gconvert.c
+ * glib/gspawn-win32.c
+ * glib/gspawn.c: some minor documentation fixes.
+
+2001-09-29 Alexander Larsson <alla@lysator.liu.se>
+
+ * configure.in:
+ Add build/win32/dirent/Makefile to the list of makefiles
+
+2001-09-30 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gwin32.c
+ * glib/gwin32.h
+ * glib/glib.def: Remove own implementation of dirent
+ functions. Instead, gcc (mingw) users should go ahead and use the
+ <dirent.h> included with the mingw gcc, and the dirent functions
+ included in libmingw32, while MSVC users can use the same (public
+ domain) code, extracted from mingw-runtime sources and placed in
+ build/win32/dirent.[ch].
+
+ * glib/gwin32.c (get_package_directory_from_module,
+ g_win32_get_package_installation_directory): Use static lock to
+ protect static hash table.
+
+Sat Sep 29 02:33:14 2001 George Lebl <jirka@5z.com>
+
+ * tests/testglib.c (main): cast the string size to gulong and use %lu
+ for printing to avoid 64bit issues
+
+ * glib/gstrfuncs.[ch] (g_ascii_strncasecmp): Change the 'n' argument
+ to gsize instead guint.
+
+Fri Sep 28 19:41:32 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/libcharset/* configure.in: Fix macros from libcharset
+ to work with autoconf-2.5x. (From Laszlo Peter.)
+
+2001-09-27 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gstring.c: Fix inline docs for g_string_prepend_unichar.
+
+2001-09-29 Abel Cheung <maddog@linux.org.hk>
+
+ * configure.in: Add quotes around test values. This fixes a minor
+ annoying warning if platform is not win32.
+
+2001-09-27 Manish Singh <yosh@gimp.org>
+
+ * glib/grand.c (g_rand_new): fix typo (#if->#ifdef) so it compiles
+ again.
+
+2001-09-24 Bruno Haible <haible@clisp.cons.org>
+
+ * glib/gwin32.c (g_win32_getlocale): When the sublangid is
+ SUBLANG_DEFAULT, return the locale of the language's main country,
+ not a country-neutral locale. E.g. "en_US" instead of "en". Add
+ handling of LANG_SORBIAN. Fix typo for SUBLANG_CHINESE_SIMPLIFIED
+ (China == CN, CH == Switzerland). Ignore empty environment
+ variable values.
+
+2001-09-28 Tor Lillqvist <tml@iki.fi>
+
+ * glib/makefile.{mingw,msc}.in: Add localcharset.o. Just copy the
+ source file from libcharset and compile in this directory.
+
+ * glib/giochannel.c: Mark rest of g_set_error strings for
+ translation, too.
+
+ * glib/giowin32.c: Add some debugging output functions, call them
+ when debugging.
+ (create_events, g_io_win32_msg_write): Free message fetched with
+ g_win32_error_message ().
+ (g_io_win32_check): Indentation fixes.
+ (g_io_win32_fd_read,g_io_win32_sock_read): Don't always return
+ G_IO_STATUS_NORMAL. Do return G_IO_STATUS_EOF if we got 0 bytes,
+ like on Unix. This helps making the test programs run
+ successfully.
+
+ * glib/gmain.c (g_poll): Return the code ifdeffed out with
+ TEST_WITHOUT_THIS. Can't remember why it was ifdeffed out. Things
+ seem to work as previously with the code in place. Especially
+ spawn-test didn't work with the code ifdeffed out (Bug#61067).
+
+ * glib/grand.c (g_rand_new): Don't try to use /dev/urandom unless
+ on Unix.
+
+ * glib/gspawn-win32-helper.c (WinMain): Remove Sleep(10000)
+ accidentally left in.
+
+Thu Sep 27 14:26:57 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gstrfuncs.c (g_ascii_strup/down): Use gssize to
+ match the header. (Reported by Elliot Lee.)
+
+Wed Sep 26 22:34:12 2001 Owen Taylor <otaylor@redhat.com>
+
+ Fixes for #58195, based on some ideas from Hidetosh Tajima.
+
+ * aclibcharset.m4 glib/libcharset: Add Bruno Haible's
+ portable-current charset detection code from libiconv.
+
+ * glib/gutf8.c (g_utf8_get_charset_internal): Rewrite
+ to use _g_locale_charset().
+
+ * glib/gutf8.c (_g_charset_get_aliases): Private functions
+ to get aliases from libcharset for a particular canonical
+ name.
+
+ * glib/gconvert.c: If loading a charset fails, try
+ aliases to look for fallbacks.
+
+2001-09-26 Matthias Clasen <matthiasc@poet.de>
+
+ * gmem.c (g_mem_is_system_malloc): Return !vtable_set.
+
+2001-09-26 Tor Lillqvist <tml@iki.fi>
+
+ * configure.in: Retract my change earlier today. Don't preset
+ autoconf variables in a try to match both mingw and MSVC. Instead,
+ he who packages a prebuilt GLib developer distribution for Win32
+ runs configure twice: once for mingw, once for MSVC, and then uses
+ diff -D on the glibconfig.h files to generate a suitably ifdeffed
+ glibconfig.h for distribution that suits both compilers. (Ditto
+ for config.h, although that file wouldn't be distributed in a
+ developer package, but in a source package for Win32 users who
+ want to build GLib but can't use configure.)
+
+ * glibconfig.h.win32.in
+ * config.h.win32.in: Generated by using diff -D as described above.
+
+ * tests/makefile.mingw.in (.c.exe): Correct name of gthread (import)
+ library.
+
+Wed Sep 26 15:33:37 2001 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.am po/Makefile.in.in: Fix distclean to
+ remove some extra files. #60993, Ben Gertzfield
+
+Wed Sep 26 14:37:52 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gen-unicode-tables.pl glib/guniprop.c
+ glib/{gunibreak,gunichartables,gunidecomp}.h:
+ Patch from Andrew Taylor to make much of the unicode
+ table data const so that it can be made read-only
+ and shared.
+
+Wed Sep 26 12:41:05 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gstrfuncs.c (g_strdup_vprintf): Copy if
+ !g_mem_is_system_malloc, not the other way around.
+ (Found by James Antill.)
+
+Wed Sep 26 11:00:31 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gstrfuncs.c (g_strnfill): Use memset; might be
+ faster if someone used this for a biiig string.
+ (Suggestion from Jakub Jelinek)
+
+2001-09-26 Tor Lillqvist <tml@iki.fi>
+
+ * configure.in: (Win32:) Move the Win32 check closer to the start,
+ after the BeOS checks. Preset some autoconf variables so that
+ configure won't find those few headers and functions that gcc
+ (mingw) pretends to implement (even if the actual C library
+ doesn't), but MSVC doesn't. This because I want the same config.h
+ and glibconfig.h to be usable both from gcc and MSVC (as they use
+ the same C library). Some other minor hackery for this purpose.
+
+ * glibconfig.h.win32.in
+ * config.h.win32.in: Use versions generated by configure (and
+ hand-edited slightly).
+
+2001-09-25 Darin Adler <darin@bentspoon.com>
+
+ * glib/gtree.h: Use gboolean for return value of GTraverseFunc.
+
+Tue Sep 25 11:34:22 2001 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Version 1.3.9 (binary, interface == 0)
+
+ * glib/gstrfuncs.c (g_ascii_strdown): Change g_ascii_strup/strdown
+ to take a 'len' argument to match g_utf8_strup/strdown. This
+ hopefully will also make it more obvious that they duplicate
+ the string rather than acting like g_strup/strdown.
+ (Suggestion from Matthias Clasen, #59550)
+
+2001-09-25 Tor Lillqvist <tml@iki.fi>
+
+ * configure.in: More Win32 automake macros. For .def files:
+ GLIB_DEF, GMODULE_DEF, GOBJECT_DEF and GTHREAD_DEF. For .exp
+ files: TESTGMODULE_EXP (for programs that need to export symbols,
+ just testgmodule here). A new conditional, MS_LIB_AVAILABLE to
+ test whether the Microsoft librarian ("ar") is available to build
+ MS import libraries.
+
+ * glib/Makefile.am
+ * gmodule/Makefile.am: Use above. New rule to build MS import
+ library.
+
+ * glib/makefile.msc.in
+ * tests/makefile.msc.in
+ * tests/makefile.mingw.in: Use same DLL and import library names as
+ libtool.
+
+2001-09-24 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gutf8.c, glib/gunibreak.c, glib/gunicollate.c,
+ glib/gunidecomp.c, glib/guniprop.c: Inline doc consistency fixes.
+
+2001-09-24 Stanislav Visnovsky <visnovsky@nenya.ms.mff.cuni.cz>
+
+ * configure.in: Added "sk" to ALL_LINGUAS.
+
+2001-09-22 Hans Breuer <hans@breuer.org>
+
+ * glib/giowin32.c : simply setting is_readable and is_writeable
+ to TRUE does make Gimp plug-ins work again. Still no API known
+ to request this info on Win32 (see #57690)
+
+2001-09-21 Hans Breuer <hans@breuer.org>
+
+ * makefile.msc : added rule for glibconfig.h
+
+ * glib/giowin32.c (g_io_channel_new_file) : always open
+ in binary mode (fix for #57695)
+
+ * glib/glib.def : updated externals
+
+ * glib/gwin32.c : re-added LANG_* and SUBLANG_* definitions,
+ which are missing from the msvc 5.0 win32 sdk
+
+ * glib/makefile.msc.in : added gbsearcharry
+
+Thu Sep 20 20:33:45 2001 Owen Taylor <otaylor@redhat.com>
+
+ * Rename g_mem_vtable_is_set() to g_mem_is_system_malloc().
+
+2001-09-20 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gutils.c (g_path_is_absolute): (Win32:) Accept also forward
+ slashes. (But still don't accept them in the other functions
+ here. This is a thorny issue. Windows in fact does treat / like \
+ on input (at least as local directory separators, dunno about
+ server/share separators). But GLib only has the one
+ G_DIR_SEPARATOR value, that apps should scan for, and use when
+ building pathnames. To properly fix this would require totally
+ abstracting pathnames, and don't having any path name scanning and
+ building in applications at all. Fat chance.)
+ (GLIB_LOCALE_DIR): Redefine only on "pure" Win32, not Cygwin. Use
+ subdirectory "share\locale", as on Unix.
+
+ * glib/gwin32.c: Don't need to define those langiage and
+ sublanguage constants here, current mingw (w32api) headers have
+ them.
+
+ * glib/glib.def: Add a few missing entry points.
+
+ * tests/testglib.c (main): Use same name for DLL as libtool does.
+ Use G_DIR_SEPARATOR in g_path_get_basename tests.
+
+Wed Sep 19 16:35:22 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.c (g_main_context_find_source_by[_funcs]_user_data):
+ Fix handling of user data when locating sources.
+ (#60414, Katsuhiro Okuno)
+
+Wed Sep 19 14:17:31 2001 Owen Taylor <otaylor@redhat.com>
+
+ Patch from Matthias Clasen (#59806)
+
+ * configure.in: Check for vasprintf().
+
+ * glib/gmem.[ch]: Add g_mem_vtable_is_set() to be used
+ for efficiency hacks to avoid extra copies when not
+ needed.
+
+ * glib/gstrfuncs.c: Use vasprintf() to implement
+ g_strdup_printf() when available.
+
+ * glib/gmessages.c (g_logv): Avoid using
+ printf_string_upper_bound() when we have have vsnprintf.
+
+ * glib/gmessages.c (printf_string_upper_bound): Don't
+ segfault when warning about positional parameters.
+
+Wzed Sep 19 14:05:27 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/{gcache.c,gmem.c,grel.c,gstring.c,gtimer.c,gtree}:
+ Patch from Darin Adler to remove GReal* structures in
+ favor of simple opaque typedefs in cases where there
+ were no non-private members. (#59693)
+
+Wed Sep 19 13:03:38 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/giochannel.c (g_io_channel_read/write_chars): Handle NUL
+ bytes_written, bytes_read. (Suggested by Joshua N Pritikin, #59550)
+
+Wed Sep 19 12:49:11 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gutils.c (g_get_any_init): Handle failure of
+ sysconf and pick a fixed size buffer. (Happens on Cygwin
+ #60242)
+
+Wed Sep 19 11:23:41 2001 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Error out if gettext support is not found. (#59386)
+
+2001-09-19 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/gthread.h (GThreadFunctions): Add thread_equal function to
+ allow for platform defined function to compare two threads.
+
+ * glib/gthread.c: Use g_thread_functions_for_glib_use.thread_equal
+ when non-NULL instead of ==.
+
+Wed Sep 19 10:44:25 2001 Tim Janik <timj@gtk.org>
+
+ * Released 1.3.8.
+
+Tue Sep 18 22:57:33 2001 Tim Janik <timj@gtk.org>
+
+ * configure.in (GLIB_MICRO_VERSION): up version number to 1.3.8,
+ interface age 0, binary age 0.
+
+ * NEWS: updates.
+
+Tue Sep 18 18:23:02 2001 Owen Taylor <otaylor@redhat.com>
+
+ Fixes for compilation on Solaris (#59026, Frank Belew)
+
+ * glib/gqsort.c (g_qsort_with_data): Use g_alloca().
+
+ * glib/giochannel.c (g_io_channel_read_to_end): Fix use
+ of ternary on left-hand-side.
+
+ * configure.in: Handle the ac_cv_working_alloca_h variable
+ set by autoconf-2.5x.
+
+Tue Sep 11 18:50:44 2001 Owen Taylor <otaylor@redhat.com>
+
+ * m4macros/glib-gettext.m4 acinclude.m4: Remove commented
+ out sections for clarity.
+
+Tue Sep 18 18:19:33 2001 Tim Janik <timj@gtk.org>
+
+ * tests/testglib.c: add simple test for g_path_get_basename().
+
+ * glib/gfileutils.c (g_file_open_tmp):
+ * glib/gstrfuncs.c (g_strerror): scratch erroneous usages
+ of "illegal".
+
+2001-09-18 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gmain.c
+ * glib/giowin32.c: Mark the _funcs tables for export.
+
+ * glib/glib.def: Add here, too.
+
+ * glib/gwin32.c (get_package_directory_from_module): No reason to
+ check for the module being in a bin or lib directory only when
+ module_name is non-NULL.
+
+ * glib/gwin32.c (g_win32_get_package_installation_directory):
+ Check first in HKEY_CURRENT_USER, then in HKEY_LOCAL_MACHINE.
+
+2001-09-17 Darin Adler <darin@bentspoon.com>
+
+ * tests/strfunc-test.c: (main): Change so that it works
+ on platforms where isalpha is a macro only, without the
+ corresponding function that the C standard requires.
+ Also eliminate the multiple lists of ctype functions.
+
+ * tests/.cvsignore: Ignore the new test.
+
+2001-09-17 Tor Lillqvist <tml@iki.fi>
+
+ * configure.in: Add variable for LT_CURRENT minus LT_AGE (the
+ suffix used by libtool on Win32 for DLLs). Set variables for the
+ compiled resource files on Windows. Handle the native Win32
+ threads gmodule.
+
+ * glib/Makefile.am
+ * gmodule/Makefile.am
+ * gobject/Makefile.am: (Win32) Add hacks to link in the object
+ file produced from the resource file. Use the lt-compile-resource
+ script from the build module. The non-hack way would be to teach
+ libtool, autoconf and automake about .rc files (which are a kind
+ of source code, after all, that gets compiled to object
+ files). But then there would be problems with those who don't have
+ bleeding edge auto* and libtool.
+
+ * glib/glib.def
+ * gobject/gobject.def: Updates.
+
+ * glib/glib.rc.in
+ * gmodule/gmodule.rc.in
+ * gobject/gobject.rc.in
+ * gthread/gthread.rc.in: Update InternalName and OriginalFilename to
+ match libtool's naming convention for DLLs.
+
+ * glib/gutils.c: Ditto when constructing the DLL name in the
+ definition for GLIB_LOCALE_DIR.
+
+ * glib/makefile.mingw.in
+ * gmodule/makefile.mingw.in
+ * gobject/makefile.mingw.in
+ * gthread/makefile.mingw.in: Update import library names.
+
+Fri Sep 14 20:34:27 2001 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gconvert.c (g_filename_from_uri): Replace `is contains'
+ by `contains' in two error messages. (#60395)
+
+2001-09-10 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/giochannel.h glib/giochannel.c: Added a length argument
+ to g_io_channel_[set,get]_line_term(), allowing embeded nulls
+ and binary safe line termination strings
+
+ * glib/giochannel.c: Got rid of a compile warning in
+ g_io_channel_write_chars()
+
+Mon Sep 10 17:13:36 2001 Tim Janik <timj@gtk.org>
+
+ * glib/gmessages.h: got rid of g_set_error_handler(),
+ g_set_warning_handler(), g_set_message_handler().
+
+Mon Sep 10 11:42:58 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gutf8.c glib/gstring.c glib/gfileutils.c glib/gmain.c:
+ Doc fixes.
+
+Sat Sep 8 17:14:51 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gfileutils.[ch]: Add g_build_path(),
+ g_build_filename(), to create separated paths,
+ suppressing duplicate separators, from varargs
+ lists.
+
+ * tests/strfunc-test.c: Add tests for g_build_path(),
+ g_build_filename().
+
+Sat Sep 8 14:11:53 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/Makefile.am (libglib_1_3_la_SOURCES): Add
+ gbsearcharray.[ch].
+
+ * glib/glib-object.h: Remove include of gbsearcharray.
+
+Mon Sep 3 23:29:51 2001 Owen Taylor <otaylor@redhat.com>
+
+ * Version 1.3.7
+
+ * Makefile.am (EXTRA_DIST): Distribute po/po2tbl.sed.in
+
+ * Makefile.am: Remove references to glib.rc[.in]
+
+ * NEWS: Various additions.
+
+2001-09-04 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: Update. Don't mention pthreads.
+
+ * build-dll: Remove, moved to the build module.
+
+ * glibconfig.h.win32.in: Don't mention pthreds here, either.
+
+ * glib/gstrfuncs.c: Mark the correct variable for export from DLL.
+
+ * glib/giowin32.c (g_io_win32_msg_create_watch): Owen forgot to
+ rename the win32_watch_funcs variable here, too.
+
+ * */makefile.mingw.in: Don't use version number in import library
+ name. Use whole version number in DLL name. Use build-dll from the
+ build module.
+
+Tue Sep 4 01:50:24 2001 Tim Janik <timj@gtk.org>
+
+ * NEWS: updates for 1.3.7 release.
+
+Mon Aug 27 14:56:12 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.h: Add closure_marshal/closure_callback
+ fields to GSourceFuncs for use by g_source_set_closure().
+
+ * glib/gmain.c glib/giounix.c glib/giowin32.c
+ glib/gmain.h: Export the SourceFuncs vtables so GObject
+ can use them to figure out closure callbacks/marshallers
+ for the default source types.
+
+Sun Sep 2 13:05:53 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gstrfuncs.c (g_strchomp): Replace some uses
+ of isspace() with g_ascii_isspace().
+
+ * glib/gutf8.c glib/gunicode.h glib/gstrfuncs.[ch]: Add
+ extra indirections to g_utf8_skip and g_ascii_table to
+ avoid great whopping copy relocs.
+
+Sun Sep 2 11:10:42 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gen-unicode-tables.pl glib/gunicomp.h
+ glib/gunichartables.h glib/giounix.c: Fix some variables that
+ should have been static.
+
+2001-08-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/gthread.h, glib/gthread.c: Add 'want_to_read' to
+ GStaticRWLock to avoid calling g_cond_broadcast, when no one is
+ waiting.
+
+ * glib/gmain.c (g_main_context_add_poll_unlocked): Don't free
+ cached_poll_array, when adding new poll's. This is taken care for
+ in g_main_context_iterate.
+
+2001-08-30 Tor Lillqvist <tml@iki.fi>
+
+ After being away for about five months, I'm back working on
+ this... For now, still using same build setup for Win32. Probably
+ will change to not including version numbers in the import library
+ names, though. (But the DLL names would still include them,
+ possibly even also the micro version number.) That would be more
+ Unix-like. Also, will have to check out newest mingw tool versions
+ to see if the build-dll script now can be retired.
+
+ * makefile.mingw
+ * makefile.msc: New files, no need to generate from .in as
+ they don't contain references to automake variables.
+
+ * makefile.mingw.in
+ * makefile.msc.in: Removed.
+
+ * glib.rc.in: Remove
+ * glib/glib.rc.in: Moved here.
+
+ * Makefile.am
+ * glib/Makefile.am: Corresponding changes.
+
+ * glib/glib.def: Fix typo, add new entries.
+
+ * glib/gspawn-win32-helper.c: More debugging. Doesn't work
+ currently (or then it never has on Win2k, which I now use?)
+
+ * glib/gstrfuncs.c
+ * glib/gstrfuncs.h: Mark g_ascii_table for export/import on Win32.
+
+ * */makefile.mingw.in: Reflect new location of glib library.
+
+2001-08-30 Michael Natterer <mitch@gimp.org>
+
+ * glib/giochannel.h: (struct GIOChannel): "gboolean foo : 1"
+ results in TRUE being -1 once assigned, use "guint foo : 1"
+ instead.
+
+2001-08-27 Darin Adler <darin@bentspoon.com>
+
+ * glib/gconvert.h:
+ * glib/gconvert.c: (g_filename_from_uri):
+ Updated name of error from G_CONVERT_ERROR_NOT_LOCAL_FILE to
+ G_CONVERT_ERROR_NOT_ABSOLUTE_FILE_URI.
+
+ * tests/.cvsignore:
+ * tests/uri-test.c:
+ Added a lot more test for the new URI functions, including a
+ number that seem to indicate some minor bugs.
+
+2001-08-26 Alex Larsson <alexl@redhat.com>
+
+ * glib/gconvert.[ch] (g_filename_from_uri,
+ g_filename_to_uri): New functions to convert
+ between local pahtnames and file: uris.
+
+ * tests/Makefile.am:
+ * tests/uri-test.c:
+ Tests for the new functions.
+
+2001-08-25 Alexander Larsson <alla@lysator.liu.se>
+
+ * glib/gstrfuncs.[ch]:
+ * docs/reference/glib/glib-overrides.txt:
+ * docs/reference/glib/glib-sections.txt:
+ * docs/reference/glib/tmpl/string_utils.sgml:
+ Implement and document g_ascii_isxxx.
+
+ * tests/strfunc-test.c:
+ Add tests for g_ascii_isxxx
+
+ * glib/guniprop.c (g_unichar_ispunct):
+ include symbols, not just punctuation.
+ (g_unichar_isspace): Vertical tab is not
+ considered whitespace.
+
+ * tests/shell-test.c:
+ Output errors on stderr
+
+2001-08-24 Alexander Larsson <alla@lysator.liu.se>
+
+ * glib/gconvert.[ch] (g_convert_with_iconv):
+ New function, doing the same as g_convert but taking
+ a GIConv argument. The old g_convert is just
+ a call to this with a newly opened GIConv.
+
+2001-08-24 Darin Adler <darin@bentspoon.com>
+
+ * tests/shell-test.c: (check_string_result): Fix bad indenting.
+ I figured I should fix this since I just pointed Alex here to
+ look at this as an example.
+
+2001-08-24 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/giochannel.c: Matthias Clasen's fix for
+ the buffer corruption bug by setting outbuf _after_
+ the call to g_string_set_size()
+
+ * glib/giochannel.c: kept the buffers from perpetually
+ growing by subtracting 1 from allocated_len in the calculation
+ of available space to account for the null at the end of the
+ buffer
+
+ * glib/giochannel.c: fixed g_io_channel_write_chars()
+ to not write more than space_in_buf bytes for the UTF-8 case
+
+Fri Aug 24 11:15:46 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gstrfuncs.c docs/Changes-2.0.txt: Patch from Darin
+ Adler to restore Glib-1.2 handling of empty strings,
+ and to fix off-by-one with @max_tokens. (#57663).
+ Doc improvements.
+
+ * tests/strfunc-test.c: Change tests to correspond to
+ new behavior of g_strsplit().
+
+Thu Aug 23 11:09:58 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/ghash.c (g_hash_table_foreach_remove_or_steal):
+ Patch from Josh Pritikin to fix reversed key and value destroy
+ functions. (#59433)
+
+ * glib/giochannel.h (struct _GIOChannel): Mark structure
+ /*< private >*/
+
+Thu Aug 23 16:14:17 2001 Tim Janik <timj@gtk.org>
+
+ * glib/gmacros.h (G_GNUC_NO_INSTRUMENT): new macro.
+
+2001-08-21 Abel Cheung <maddog@linux.org.hk>
+
+ * configure.in: Added "zh_TW" to ALL_LINGUAS.
+
+2001-08-20 Sven Neumann <sven@gimp.org>
+
+ * Makefile.am: added po to SUBDIRS
+
+Sun Aug 19 21:32:39 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/ghash.c: Eliminate use of floating point when
+ determining if the hash table needs to be resized,
+ and also factor out the test from g_hash_table_resize()
+ to save function calls for the common case.
+ (#59124)
+
+ * glib/gmain.c (g_main_context_query): Document the
+ return value.
+
+2001-08-19 Darin Adler <darin@bentspoon.com>
+
+ * glib/gshell.c: (g_shell_quote): Added missing \ character.
+
+ * tests/shell-test.c: (check_string_result), (test_shell_unquote),
+ (main): Added tests for g_shell_quote and g_shell_unquote.
+
+2001-08-19 Fatih Demir <kabalak@gtranslator.org>
+
+ * configure.in: Added "ta" to the languages list.
+
+2001-08-19 Havoc Pennington <hp@pobox.com>
+
+ * glib/gshell.c (g_shell_unquote): add comment about shell quoting
+ rules to the docs.
+
+2001-08-16 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/giounix.c: fixed an error in setting close_on_unref
+ in g_io_channel_new_file ()
+
+2001-08-16 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/giochannel.c glib/glib.def glib/giochannel.h: Added
+ new functions g_io_channel_[set,get]_close_on_unref ()
+
+ * glib/giochannel.c: glib/giochannel.h: Documentation fixes
+
+ * glib/giochannel.c: Fixed g_io_channel_write_chars ()
+ so that bytes_written is always set to an appropriate
+ value when it returns
+
+ * glib/giounix.c: changed g_io_channel_get_flags () to
+ set the is_readable and is_writeable flags cached
+ by the channel
+
+Wed Aug 15 11:09:56 2001 Tim Janik <timj@gtk.org>
+
+ * Makefile.am: let the generated .pc files depend on config.status,
+ so they get correctly remade.
+
+Sun Aug 12 21:05:13 2001 Tim Janik <timj@gtk.org>
+
+ * glib/gmessages.h: fix g_return_if_fail, g_assert and friends to
+ have a body for G_DISABLE_CHECKS and G_DISABLE_ASSERT.
+ fixes #58873.
+
+2001-08-12 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/giochannel.c: safer handling of errno, fixed
+ a bug in an assert
+
+Sun Aug 12 10:09:00 2001 Owen Taylor <otaylor@redhat.com>
+
+ * tests/iochannel-test.c (main): Find test case for
+ srcdir != builddir, miscellaneous cleanups.
+
+ * tests/Makefile.am (EXTRA_DIST): Distribute casefold.txt,
+ casemap.txt iochannel-test-infile.
+
+ * glib-2.0-uninstalled.pc.in: Fix for move of glib files
+ into subdir. (Pointed out by Steve Baker)
+
+Sat Aug 4 01:04:08 2001 Tim Janik <timj@gtk.org>
+
+ * glib/gscanner.c (g_scanner_unexp_token): fix INT and FLOAT warnings
+ for invalid token values.
+
+2001-08-10 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/giochannel.c: Fixed a "sense of comparison" bug,
+ added an assert to check when g_io_channels_read_chars ()
+ is looping endlessly due to encoded_read_buf being corrupted.
+
+2001-08-06 Sven Neumann <sven@gimp.org>
+
+ * glib/gutils.[ch]: added new function g_nullify_pointer().
+
+2001-08-05 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/giochannel.c glib/giochannel.c glib/glib.def
+ docs/reference/glib/glib-sections.txt: Added new functions
+ g_io_channel_[read,write]_unichar ()
+
+ * glib/giochannel.h: Finally remembered to remove the
+ old error message G_IO_CHANNEL_ERROR_PCHAR_FLUSH
+
+ * glib/giochannel.c: Some fixes to g_io_channel_fill_buffer ()
+ and g_io_channel_write_chars ()
+
+2001-08-05 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/giochannel.c: Replaced the local use_buf variable with a macro
+ in most places. This allows us to check some things without worrying
+ whether we have allocated the read buffers yet, and allows us to allocate
+ the buffers later in some cases.
+
+ * glib/giochannel.c: Introduced a MAX_CHAR_SIZE macro, which is
+ supposed to be greater than or equal to the length in bytes
+ of the longest character in any encoding. This is necessary
+ to get the minimum buffer size for successful writing.
+
+ * glib/giochannel.c: Fixed g_io_channel_set_encoding () so
+ that it just prints a warning if partial_write_buf isn't
+ empty instead of failing.
+
+ * glib/giochannel.c: Fixed several functions so they can accept
+ NULL parameters for pointers to return values.
+
+ * glib/giochannel.c: Altered the error handling for
+ g_io_channel_read_chars () to only return an error if
+ it doesn't have any buffered data.
+
+ * glib/giochannel.c: Rewrote g_io_channel_write_chars ()
+ to fix the error handling and remove duplicate sections
+ of code.
+
+ * glib/giounix.c: Fixed g_io_channel_new_file () to
+ call fstat () to set the is_seekable flag, in case someone
+ uses it on a FIFO.
+
+Sun Aug 5 08:25:30 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmacros.h: Include stddef.h so that we use
+ the system's definition of NULL. (#54730)
+
+2001-08-04 Alexander Larsson <alexl@redhat.com>
+
+ * win32-fixup.pl:
+ Hacky script to fix up your .msc.in files on windows.
+ Dunno if this is a good solution yet.
+
+ * build/win32/module.defs:
+ Back down libiconv version to 1.3, since that is what tor distributes.
+
+ * glib/glib.def:
+ Update
+
+ * gobject/makefile.msc.in:
+ build gobject-query.exe and gmarshal.strings, add libiconv dependency to linklines.
+
+ * gobject/marshal-genstrings.pl:
+ New file. perl script to generate gmarshal.strings.
+
+2001-08-03 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/giochannel.c: Fixed g_io_channel_seek_position()
+ so that G_SEEK_CUR can be used with UTF-8 encoding
+
+ * glib/giochannel.c: Changed test to decide whether
+ use_buf is encoded_read_buf or read_buf from
+ "if (channel->do_encode)" to "if (channel->encoding)" to
+ fix bug 58472
+
+ * tests/iochannel-test.c: Fixed so it doesn't output
+ double newlines
+
+ * glib/giochannel.c: Fixed g_io_channel_fill_buffer()
+ so that encoded_read_buf is created for UTF-8 encoding
+
+2001-08-03 Darin Adler <darin@bentspoon.com>
+
+ * tests/strfunc-test.c: (strv_check), (main):
+ Improve strfunc test to test the split function in a way that
+ demonstrates its idiosyncrasies.
+ * tests/.cvsignore:
+
+2001-08-03 Sven Neumann <sven@gimp.org>
+
+ * configure.in: beautified configure help output.
+
+ * glib/gtree.c: changed help for g_tree_insert(); it was misleading.
+
+Fri Aug 3 10:20:10 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/guniprop.c (g_unichar_xdigit_value): Fix computation
+ (Fix from Cesar Rincon)
+
+2001-08-01 Christopher James Lahey <clahey@ximian.com>
+
+ * glib/gutf8.c (g_utf8_find_prev_char): Made g_utf8_find_prev_char
+ able to return the first character of a string.
+
+2001-07-31 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/giochannel.h: Committed this file, which is where
+ the changes in my previous changelog entry happened,
+ not giochannel.c
+
+2001-07-31 Sven Neumann <sven@gimp.org>
+
+ * glib/gmem.c: declare gboolean vtable_set static.
+
+2001-07-30 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/giochannel.c docs/reference/glib/glib-sections.txt
+ tests/iochannel-test.c: removed G_IO_CHANNEL_*_LINE_TERM macros
+
+ * glib/giochannel.c put /*<public>*/ and /*<private>*/ tags in
+ the GIOChannel structure
+
+
+2001-07-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: #undef inline before testing whether it works to
+ avoid false positives. Patch from Garry R. Osgood
+ <grosgood@rcn.com>. Fixes bug #58272.
+
+ * gmodule/gmodule.c (parse_libtool_archive): build the library
+ name ourselfs ... so we can load the library specified and not
+ mangle any name not beggining in 'lib'. Patch from Michael Meeks
+ <michael@ximian.com>. Fixes bug #58226.
+
+2001-07-29 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/giochannel.c: Matthias Classen's patch to give
+ g_io_channel_flush() the correct sense when testing
+ whether the buffer is empty
+ * glib/giounix.c: Matthias Classen's patch to set
+ the mode of a file created with g_io_channel_new_file()
+
+Sun Jul 29 16:08:17 2001 Tim Janik <timj@gtk.org>
+
+ * glib/gscanner.[hc]: removed deprecated g_scanner_stat_mode().
+
+ * glib/gscanner.c (g_scanner_msg_handler): by default, print scanner
+ errors and warnings to stderr.
+
+2001-07-27 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/gtypes.h: Use G_GNUC_EXTENSION instead of
+ __extension__. Patch from Pavel Roskin <proski@gnu.org>.
+
+2001-07-26 Darin Adler <darin@bentspoon.com>
+
+ * configure.in:
+ * m4macros/glib-2.0.m4:
+ Update location of pkgconfig from sourceforge.net to new
+ location at freedeskop.org.
+
+2001-07-26 Michael Natterer <mitch@convergence.de>
+
+ * gobject/glib-genmarshal.c: added a "release_check" to the
+ OutArgument structure, which, if present, gets integrated in the
+ marshaller code and protects us from stuff like
+ g_object_unref(NULL) on marshaller return values.
+
+2001-07-23 Padraig O'Briain <Padraig.Obriain@sun.com>
+
+ * gobject/gobjectnotifyqueue.c: fix unconditional check of
+ first GParamSpec in g_object_notify_queue_thaw(); prevent
+ property notification being lost
+
+2001-07-23 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/giochannel.c: fixed g_io_channel_seek_position() so that
+ G_SEEK_CUR works for UTF-8 channel encoding, and unallocated
+ converters are not flushed after the seek; fixed
+ g_io_channel_get_buffer_condition() so that G_IO_IN is only
+ set if the read buffer contains at least one full character
+
+2001-07-23 Sven Neumann <sven@gimp.org>
+
+ * Makefile.am: removed glib.def from EXTRA_DIST ...
+ * glib/Makefile.am: ... and added it here.
+
+2001-07-22 Hans Breuer <hans@breuer.org>
+
+ * glib/giochannel.c (g_io_channel_get_buffer_condition) : make
+ the code actually have an effect (Use |= to set bits). Not
+ absolutely sure if is the right one.
+
+ * glib/giowin32.c (g_io_win32_<check|prepare>) : don't modify
+ watch->condition but restored the previous behaviour.
+ Now gio-test as well as The Gimp work again ...
+
+2001-07-21 Hans Breuer <hans@breuer.org>
+
+ * glib/giowin32.c (g_io_channel_new_file) : set the
+ corresponding p(ermission)mode of the file when creating,
+ otherwise a wronly file couldn't be overwritten (at least
+ not on Win9x).
+
+2001-07-21 Hans Breuer <hans@breuer.org>
+
+ * glib/giowin32.c : intial implementation of new API functions.
+ Not sure if it behaves as intended ...
+
+ * glib.def : removed, glib/glib.def is the file used since moved
+ * glib/glib.def : updated
+
+ * tests/makefile.msc : added iochannel-test
+
+Fri Jul 20 19:19:10 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/giochannel.c: API changes, fixes to
+ error handling, some internal restructuring
+ * glib/giochannel.h: API changes, documentation for
+ elements in GIOChannel structure
+ * glib/giounix.c: Matched API changes, implemented
+ backend to set is_readable, is_writeable, is_seekable
+ flags, added a test to catch large values of count
+ for which the behavior of write() is undefined
+ * glib/giowin32.c: Changed to match new prototypes for
+ io_close() and io_seek(), removed references to
+ G_IO_STATUS_INTR, set is_seekable flag in channel
+ creation functions
+ * glib.def: Renamed g_channel_error_quark() and
+ g_channel_error_from_errno() to g_io_channel_error_quark() and
+ g_io_channel_error_from_errno(); added new functions
+ g_io_channel_get_buffered() and g_io_channel_set_buffered()
+ * docs/reference/glib/glib-sections.txt: Modified iochannel
+ section to reflect new functions and API changes
+ * tests/iochannel-test.c: Fixed to work with API changes
+ * tests/iochannel-test-infile: New file; input file
+ for iochannel-test
+ * tests/unicode-collate.c tests/unicode-normalize.c:
+ Changed G_IO_FILE_MODE_READ to "r" to match API change
+
+Fri Jul 20 19:16:24 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
+
+ * gobject/glib-genmarshal.c: modified to create header files
+ using G_[BEGIN,END]_DECLS instead of #ifdef __cplusplus ...
+
+Fri Jul 20 14:11:29 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gutf8.c glib/gunidecomp.c: s/size_t/gsize/ to match
+ prototypes.
+
+Thu Jul 19 16:05:21 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gcompletion.c (g_completion_complete): Fix memory
+ leak and dubious list manipulation. (Found by
+ Ron Koerner, #53408)
+
+ * glib/gfileutils.c (get_contents_stdio): Call fclose()
+ on FILE * on error. (#57057)
+
+2001-07-20 Hans Breuer <hans@breuer.org>
+
+ * glib/glib/giowin32.c : make it compile again
+
+ * glib/glib.def : updated exports
+
+ * glib/makefile.msc.in :
+ * glib/makefile.mingw.in :
+ * tests/makefile.msc.in : reflect glib move
+
+ * tests/mainloop-test.c : #include <io.h> for _pipe()
+
+ * tests/gio-test.c : casts for strict compiler settings
+
+ * makefile.msc.in : new master makefile reflecting the glib
+ move. The '.in' isn't really needed anymore, because there
+ is no version number in it
+
+2001-07-19 Darin Adler <darin@bentspoon.com>
+
+ * glib/gstrfuncs.c: (g_ascii_strdown), (g_ascii_strup): Add
+ missing const.
+ (g_strsplit): Add g_return_val_if_fail for case of empty
+ delimiter, which can result in an infinite loop otherwise.
+ * glib/gstrfuncs.h: Add missing const.
+ * tests/.cvsignore: Ignore a generated file.
+
+ * tests/array-test.c:
+ * tests/dirname-test.c:
+ * tests/hash-test.c:
+ * tests/list-test.c:
+ * tests/node-test.c:
+ * tests/relation-test.c:
+ * tests/shell-test.c:
+ * tests/slist-test.c:
+ * tests/spawn-test.c:
+ * tests/strfunc-test.c:
+ * tests/string-test.c:
+ * tests/testglib.c:
+ * tests/tree-test.c:
+ * tests/type-test.c:
+ Add an #undef G_DISABLE_ASSERT so all tests will assert even if
+ asserts are disabled inside glib itself.
+
+Fri Jul 13 19:20:06 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gstring.c (g_string_insert/append/prepend_unichar):
+ Add functions to insert a unichar as UTF-8, since this
+ is reasonably common.
+
+ * glib/gutf8.c glib/gunicode.h (g_utf8_get_char_validated):
+ New function exposing iterating through possibly invalid/incomplete
+ UTF-8 to unicode to the outside world.
+
+ * glib/gutf8.c (g_utf8_get_char_extended): Fix max_len argument
+ to be gssize, not gsize.
+
+2001-07-17 Kjartan Maraas <kmaraas@gnome.org>
+
+ * configure.in: Added "nn" to ALL_LINGUAS.
+
+2001-07-17 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/gmain.c: Add some assertions. Simplify and fix
+ g_main_context_release(). Fix some locking bugs in
+ g_main_loop_run().
+
+2001-07-12 Mark Murnane <Mark.Murnane@sun.com>
+
+ * glib/gmessages.c: Changed prototype of printf_string_upper_bound
+ to return gsize. Now matches the actual function body.
+
+ * glib/gstrfuncs.c (g_strrstr_len): Changed type of parameter #2
+ from gint to gssize. Now matches the prototype in gstrfuncs.h.
+
+2001-07-11 Darin Adler <darin@bentspoon.com>
+
+ * .cvsignore: Add some generated files.
+
+ * glib/gmain.c: (g_main_context_iterate): Comment out cruft
+ after #endif to avoid gcc warning.
+ * gmodule/gmodule.c: (g_module_set_error_unduped): Remove
+ const from type to avoid gcc warning.
+ * gobject/gsignal.c: (g_signal_emitv): ifdef variable used
+ only if G_ENABLE_DEBUG to avoid gcc warning.
+ * gobject/gtype.c: (type_iface_vtable_init_Wm),
+ (type_iface_vtable_finalize_Wm): ifdef call needed only
+ if !G_DISABLE_ASSERT to avoid gcc warning.
+ * tests/testglib.c: (main): ifdef call needed only if
+ !G_DISABLE_ASSERT to avoid gcc warning. Maybe later we
+ should make the test to #undef G_DISABLE_ASSERT.
+ * tests/unicode-collate.c: Add include of <string.h> to
+ avoid gcc warning.
+
+Wed Jul 11 11:13:50 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/Makefile.am (libglib_1_3_la_SOURCES): Add gunicomp.h
+ (Reported by Sven Neumann).
+
+ * glib/guniprop.c (g_utf8_str/updown) glib/gunicollate.c
+ (g_utf8_collate_key): Fix shadowing problems reported by
+ many (D. Adler, S. Neumann, M. Murmane, L. Peter)
+
+Fri Jul 6 00:02:41 2001 Tim Janik <timj@gtk.org>
+
+ * glib/gmessages.c (printf_string_upper_bound): fix negative exponent
+ handling (numbers<0).
+
+ * glib/gutils.h (g_bit_storage): take a gulong as argument.
+ same for g_bit_nth_lsf() and g_bit_nth_msf() as mask.
+
+2001-07-08 Martin Baulig <baulig@suse.de>
+
+ * tests/unicode-normalize.c, tests/unicode-collate.c:
+ Reflect latest g_io_channel_new_file() API changes, use
+ G_IO_FILE_MODE_READ instead of "r".
+
+Fri Jul 6 22:34:32 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gunicode.h glib/gunidecomp.c glib/guniprop.c
+ glib/gunicollate.c: Add length arguments to
+ g_utf8_{strup,strdown,casefold,collate_key}.
+
+ * glib/gdate.c: Fix for above.
+
+2001-07-06 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * configure.in: added Basque (eu) to ALL_LINGUAS
+
+Mon Jul 2 19:48:52 2001 Andrew Lanoix <alanoix@umich.edu>
+
+ *giowin32.c: g_source_remove()ing an socket iochannel closes
+ the socket when it should not. Patch by Peter Zelezny
+ <zed@linux.com>
+
+ *giowin32.c: Fix a few typos
+
+Mon Jul 2 16:03:21 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/giochannel.c (g_io_channel_get_buffer_condition): Fix.
+
+ * glib/giunix.c: Fix prepare/check/dispatch for watches.
+
+ * tests/unicode-normalize.c: #include <string.h>
+
+Sat Jun 30 23:14:32 2001 Tim Janik <timj@gtk.org>
+
+ * glib/glist.[hc]: added g_list_insert_before().
+
+ * glib/gslist.c (g_slist_insert_before): provide an implementation,
+ prototype was already present...
+
+Sun Jul 1 20:16:25 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS
+ rather than a custom macro.
+
+ * glib/gen-unicode-tables.pl: Adapt to changes in table
+ formats for Unicode 3.1
+
+ * glib/gunicode.h glib/guniprop.c glib/gunichartables.h
+ glib/gen-unicode-tables.pl: Add case conversion functions
+ g_utf8_casefold, g_utf8_strup, g_utf8_strdown.
+
+ * tests/unicode-caseconv.c tests/gen-casefold-txt.pl
+ tests/gen-casemap-txt.pl tests/casefold.txt
+ tests/casemap.txt: Test cases for case conversion.
+
+ * glib/gunicode.h glib/gunidecomp.[ch] glib/gunicomp.h
+ glib/gen-unicode-tables.pl: Add function to do Unicode
+ normalization g_utf8_normalize().
+
+ * tests/unicode-normalize.c: Test program for case conversion.
+
+ * glib/gunicode.h glib/gunicollate.c: Add collation functions
+ g_utf8_collate, g_utf8_collate_key.
+
+ * test/unicode-collate.c: Test program for collation.
+
+ * glib/gdate.c (g_date_fill_parse_tokens): Fix uninitialized
+ variable.
+
+ * glib/gdate.c (g_date_strftime) docs/Changes-2.0.txt:
+ Make work with UTF-8 even if the locale isn't UTF-8 based.
+ Still somewhat of broken, if the format string contains
+ characters not representable in the current locale, will warn
+ and not work.
+
+ * glib/gdate.c: Use UTF-8 normalization and casefolding.
+
+Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
+ Rename GSourceFuncs::destroy to GSourceFuncs::finalize.
+ (#56858)
+
+Sat Jun 30 15:49:10 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.[ch]: (Mostly patch from Sebastian Wilhemi)
+ Make some changes to the way that GMainContext works:
+
+ - a GMainContext is no longer associated with a single
+ thread, but any thread can acquire ownership
+ of thread and iterate.
+
+ - There is a facility g_main_context_wait() for
+ non-owner-threads to wait either for ownership
+ or for a condition to be broadcast.
+
+ - For efficiency, GMainLoop just piggybacks of
+ of the loops mutex / condition instead of
+ having a separate mutex/condition for each
+ GMainLoop.
+
+ * glib/gthread.[ch]: Remove hacks to store the thread's
+ GMainContext in the GThread structures, since we
+ no longer have the GMainContext <=> GThread correspondence.
+
+ * glib/gmain.[ch]: Make g_main_context_wakeup() public
+ so someone could completely duplicate GMainLoop
+ with the public API.
+
+ * tests/mainloop-test: Fix up to the new API. Decidedly
+ doesn't work at the moment, but that may be the IO
+ channel changes, or preexisting locking problems.
+
+Sat Jun 30 13:18:28 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gstrfuncs.c glib/gstring.h: Try compiling
+ before committing, why don't you? Simple fixes
+ for my stupid typos.
+
+Sat Jun 30 12:49:26 2001 Owen Taylor <otaylor@redhat.com>
+
+ Patch from Darin Adler (#54166)
+
+ * glib/gstrfuncs.[ch]: Add ascii-only, locale-insensitive
+ g_ascii_to[lower/upper], g_ascii_str[down/up],
+ g_ascii_is[upper/lower] and deprecate the locale-affected
+ versions which break for UTF-8, etc. Make
+ g_ascii_strup/strdown duplicating,
+ not in-place for consistency with UTF-8 functions.
+
+ * glib/gstring.[ch]: Add ascii-only, locale-insensitive
+ g_string_ascii_[down/up], and deprecate the locale-affected
+ versions which break for UTF-8, etc.
+
+ * glib/gutils.c glib/gwin32.c test/testglib.c: Use
+ the g_ascii_* functions where appropriate.
+
+Fri Jun 29 13:36:39 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gstring.[ch] (g_string_set_size): Add function to
+ allow setting the length of a string greater than the
+ current length (for buffering usage)
+
+ * glib/gstring.[ch]: Expose string->allocated_len, since
+ that is useful when using GString simply as a buffer.
+ (Renamed from string->alloc)
+
+ * glib/giochannel.[ch] glib/giounix.c glib/giowin32.c:
+ Major patch from Hidetoshi Tajima and Ron Steinke
+ reworking GIOChannel to have:
+
+ - Buffering
+ - Sane and useful error reporting
+ - Streaming encoding conversion with iconv
+ - Convenience functions to read by lines or
+ an entire file.
+
+ Also fix remaining 64 bit cleanliness issues.
+
+ * tests/iochannel-test.c tests/Makefile.am: Test case
+ for IO channel streaming conversion. Still needs
+ some fixing up.
+
+Thu Jun 28 16:57:44 2001 Tim Janik <timj@gtk.org>
+
+ * configure.in (GLIB_MICRO_VERSION): up version number to 1.3.7,
+ interface age 0, binary age 0.
+
+2001-06-27 Kjartan Maraas <kmaraas@gnome.org>
+
+ * glib/gmarkup.c: Fix a typo.
+
+2001-06-27 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * Makefile.am, configure.in: Removed glib-config-2.0, as we have
+ pkg-config now.
+
+ * glib/Makefile.am: Added -I$(top_srcdir) for builddir != srcdir.
+
+ * Makefile.am: Removed gen-unicode-tables.pl from EXTRA_DIST.
+
+Tue Jun 26 11:43:46 2001 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in Makefile.am *.[ch] glib/*.[ch] glib/Makefile.am:
+ Move glib library into a subdirectory, make all GLib include
+ files include as <glib/glist.h>
+
+ * 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 <timj@gtk.org>
+
+ * gmessages.c (g_logv): use G_BREAKPOINT() instead of raise(5).
+
+Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
+
+ Changes for 64-bit cleanliness, loosely based on patch
+ from Mark Murnane.
+
+ * gconvert.c (g_convert/g_convert_with_fallback): Remove
+ workarounds for since-fixed GNU libc bugs. Minor
+ doc fix.
+
+ * gconvert.[ch]: Change gint to gsize/gssize as
+ appropriate.
+
+ * gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
+ computation of bytes_read / bytes_written.
+
+ * gfileutils.[ch] (g_file_get_contents): Make length
+ out parameter 'gsize *len'.
+
+ * ghook.c (g_hook_compare_ids): Don't compare a
+ and b as 'a - b'.
+
+ * gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
+ GSIZE_TO_POINTER.
+
+ * gmain.c (g_timeout_prepare): Rewrite to avoid
+ overflows. (Fixes bug when system clock skews
+ backwards more than 24 days.)
+
+ * gmarkup.[ch]: Make lengths passed to callbacks
+ gsize, length for g_markup_parse-context_parse(),
+ g_markup_escape_text() gssize.
+
+ * gmessages.[ch] (g_printf_string_upper_bound): Change
+ return value to gsize.
+
+ * gmessages.c (printf_string_upper_bound): Remove
+ a ridiculous use of 'inline' on a 300 line function.
+
+ * gstring.[ch]: Represent size of string as a gsize,
+ not gint. Make parameters to functions take gsize,
+ or gssize where -1 is allowed.
+
+ * gstring.c (g_string_erase): Make
+ g_string_erase (string, pos, -1) a synonym for
+ g_string_truncate for consistency with other G*
+ APIs.
+
+ * gstrfuncs.[ch]: Make all functions taking a string
+ length, take a gsize, or gssize if -1 is allowed.
+ (g_strstr_len, g_strrstr_len). Also fix some boundary
+ conditions in g_str[r]str[_len].
+
+ * gutf8.c tests/unicode-encoding.c: Make parameters that
+ are byte lengths gsize, gssize as appropriate. Make
+ character offsets, other counts, glong.
+
+ * gasyncqueue.c gcompletion.c
+ timeloop.c timeloop-basic.c gutils.c gspawn.c.
+ Small 64 bit cleanliness fixups.
+
+ * glist.c (g_list_sort2, g_list_sort_real): Fix functions
+ that should have been static.
+
+ * gdate.c (g_date_fill_parse_tokens): Fix extra
+ declaration that was shadowing another.
+
+ * tests/module-test.c: Include string.h
+
+Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gutf8.c (g_get_charset): Make argument
+ G_CONST_RETURN char **.
+
+2001-06-22 Andrew Lanoix <alanoix@umich.edu>
+
+ *giowin32.c: Debug and partial rewrite of async socket code
+ on windows, which fixes major MT issues. Some test code kindly
+ provided by wroberts1@home.com.
+
+Thu Jun 14 14:09:46 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gstrfuncs.c (g_strconcat): Fix a use of strcat that
+ wasn't replaced with g_stpcpy in the original
+ stpcpy-for-efficiency patch.
+
+2001-06-11 Havoc Pennington <hp@redhat.com>
+
+ * NEWS: updated
+
+ * configure.in (GLIB_MICRO_VERSION): increment version to 1.3.6
+
+2001-06-08 Alex Larsson <alexl@redhat.com>
+
+ * gstrfuncs.[ch]:
+ Added new functions g_strstr_len, g_strrstr and g_strrstr_len
+
+ * tests/strfunc-test.c:
+ Add some tests for the new functions.
+
+ * gunicode.h:
+ * gutf8.c:
+ Add length argument to g_utf8_strchr and g_utf8_strrchr.
+
+2001-06-08 Havoc Pennington <hp@redhat.com>
+
+ * gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that
+ the vector passed in to g_spawn_* contains a filename to
+ execute in argv[0] then the actual argv begins at argv + 1.
+ Kind of a lame hack, but this isn't something you commonly want
+ to do, and avoids adding more function arguments.
+
+2001-06-08 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * configure.in: Added Azeri (az) to ALL_LINGUAS
+
+2001-06-08 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * docs/Makefile.am, configure.in: Remove docs/glib-config.1.in.
+
+ * gthread-2.0-uninstalled.pc.in (Cflags): Add @G_THREAD_CFLAGS@.
+
+2001-06-07 Havoc Pennington <hp@redhat.com>
+
+ * m4macros/glib-2.0.m4: subst GLIB_GENMARSHAL, GOBJECT_QUERY,
+ GLIB_MKENUMS variables
+
+ * gmodule-2.0.pc.in: add gmodule_supported variable
+
+ * glib-2.0.pc.in: add glib_genmarshal, gobject_query,
+ glib_mkenums variables
+
+ * configure.in: put G_MODULE_SUPPORTED value into
+ .pc files
+
+ * autogen.sh: support AUTOGEN_SUBDIR_MODE
+
+ * Makefile.am: add -uninstalled.pc.in to EXTRA_DIST
+
+2001-06-07 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Look for nanosleep function.
+
+ * gtimer.c: Use nanosleep for g_usleep, when found.
+
+ * gtimer.c, gtimer.h: Add g_time_val_add function. Closes #54271.
+
+ * gasyncqueue.c: Documentation updates.
+
+ * gthreadpool.c: Use g_time_val_add now that we have it.
+
+2001-06-01 Jon Trowbridge <trow@gnu.org>
+
+ * gdate.c (g_date_update_julian): Changed to take a const
+ argument, and then to cast out const.
+ (g_date_update_dmy): Changed to take a const argument, and then
+ cast out const.
+ (g_date_get_weekday): Changed argument to be const.
+ (g_date_get_month): Changed argument to be const.
+ (g_date_get_year): Changed argument to be const.
+ (g_date_get_day): Changed argument to be const.
+ (g_date_get_julian): Changed argument to be const.
+ (g_date_get_day_of_year): Changed argument to be const.
+ (g_date_get_monday_week_of_year): Changed argument to be const.
+ (g_date_get_sunday_week_of_year): Changed argument to be const.
+ (g_date_compare): Changed arguments to be const.
+ (g_date_to_struct_tm): Changed GDate argument to be const.
+ (g_date_strftime): Changed GDate argument to be const.
+ (g_date_clamp): Added. The equivalent of the CLAMP macro for
+ GDates.
+ (g_date_order): Added. Ensure that the first GDate argument
+ preceeds the second, swapping them if necessary.
+ (g_date_days_between): Added. Computes the (signed) number of days
+ between two dates.
+
+Mon Jun 4 16:02:57 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gstrfuncs.c (g_strup/strdown): to match g_strcasecmp,
+ check if it is lower/upper before converting to upper/lower
+ [ not required by ISO... ] (#55682, Jon Trowbridge)
+
+Mon Jun 4 15:59:15 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gunicode.h: Make a bit more standalone by adding include
+ of gerror.h. #54543.
+
+ * gunicode.h: Change size_t to g_size. (Ugh)
+
+2001-05-31 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * grand.h (g_random_boolean, g_rand_boolean): Fix to stupid bug in
+ g_random_boolean, also both functions now return 1 or 0 instead of
+ 1<<15 or 0.
+
+ * tests/rand-test.c: Extended testcases.
+
+ * configure.in: Remove G_HAVE_ISO_CXX_VARARGS and
+ G_HAVE_ISO_C_VARARGS and define G_HAVE_ISO_VARARGS directly
+ guarded by #if(n)def __cplusplus.
+
+2001-05-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-2.0.pc.in: Add @G_THREAD_CFLAGS@ to Cflags.
+
+Tue May 29 18:17:11 2001 Owen Taylor <otaylor@redhat.com>
+
+ * autogen.sh (have_libtool): Fix GNU sedism
+
+2001-05-29 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * tests/Makefile.am, tests/qsort-test.c: Add test case for the
+ g_qsort_with_data func. It works. This fixes bug #52605.
+
+ * tests/Makefile.am, tests/cxx-test.C: Now that we check for a C++
+ compiler in configure.in anyway, I added a test, that the GLib
+ headers can be inclued into a C++ program. This fixes bug #52605.
+
+ * configure.in: Don't bail out, if no C++ compiler is
+ found. Define G_HAVE_ISO_VARARGS only if appropriate.
+
+ * gmessages.h: Thus we can revert the previous patch.
+
+2001-05-29 James Henstridge <james@daa.com.au>
+
+ * gmessages.h: "#ifdef G_HAVE_ISO_VARARGS" will always succeed
+ even when we don't have ISO vararg support. Changed to
+ "#if G_HAVE_ISO_VARARGS".
+
+Mon May 28 11:40:34 2001 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Check for __VARARGS__ separately for C and C++.
+
+2001-05-28 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Fix typo.
+
+Sun May 27 05:09:18 2001 Tim Janik <timj@gtk.org>
+
+ * gmain.c (g_main_context_prepare): unlock context when bailing
+ out with a warning.
+ (g_main_context_check): same here.
+
+ * gmain.c (g_main_context_check): before returning due to
+ changed pollfds, unlock context.
+
+Thu May 24 21:24:16 CEST 2001 Paolo Molaro <lupus@ximian.com>
+
+ * gmarkup.c: back out change by mitch@convergence.de and apply patch in
+ bug id #52067 that fixes the same problem in a more complete manner.
+ This fixes also a segfault for a malformed XML file and adds a new
+ test case.
+
+2001-05-24 Hans Breuer <hans@breuer.org>
+
+ * grel.c : reflect renaming of g_string_sprintfa to g_string_printfa
+
+ * makefile.msc.in : create an additional static lib to be used from
+ (at least) glib-genmarshal
+
+2001-05-23 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * garray.c (g_array_remove_index_fast): Tiny speed improvement
+ suggested by noon@users.sourceforge.net.
+
+2001-05-22 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * config.h.win32.in: Removed POSIX_*. Defined G_THREAD_SOURCE to
+ "gthread-win32.c".
+
+ * glibconfig.h.win32.in: Define G_HAVE_ISO_VARARGS for gcc, don't
+ know about MSC. Define G_THREADS_IMPL_WIN32 instead of
+ G_THREADS_IMPL_POSIX and define the right static mutex macros and
+ types.
+
+ * glib.def: g_thread_create renamed to g_thread_create_full.
+
+ * gthread.c: memcpy is not necessary here. We can simply use
+ struct assignment.
+
+ * gmessages.c: Fix compilation error on win32. Added
+ GFileDescriptor, wich is gint on Unix and FILE* on win32.
+
+2001-05-21 Andrew Lanoix <alanoix@umich.edu>
+
+ *giowin32.c: G_IO_WIN32_WINDOWS_MESSAGES channels
+ not handled correctly in g_io_win32_check()
+
+Sun May 20 10:47:47 2001 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Fix some problems in writing out varargs
+ tests in configure.in
+
+Fri May 18 10:52:23 2001 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in gmessages.h: Use compile checks for ISO C99 and GNU
+ extension varargs macros syntax and store result in glibconfig.h
+ (G_HAVE_ISO_VARARGS, G_HAVE_GNUC_VARARGS) rather than relying
+ on checking predefined macros.
+
+2001-05-18 Michael Natterer <mitch@convergence.de>
+
+ * gmarkup.c: don't g_strdup()/g_free() all parsed attributes and
+ their values twice but simply copy the string pointers from the
+ GMarkupAttribute struct to the string arrays before passing them
+ to start_element().
+
+2001-05-18 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread.c, gthread.h: Renamed g_thread_create to
+ g_thread_create_full and added macro g_thread_create, which omits
+ 'stack_size', 'bound' and 'priority' parameters. Also removed
+ 'bound' from GThread struct.
+
+ * gthreadpool.h, gthreadpool.c: Adapted GThreadPool to the above
+ changes. GThreadPool lost the 'priority' and 'bound'
+ members. g_thread_pool_new the 'stack_size', 'bound' and
+ 'priority' parameters.
+
+ * tests/mainloop-test.c, tests/thread-test.c,
+ tests/threadpool-test.c: Adapted to the above changes.
+
+ * gmem.c (g_mem_profile): Fixed mutex deadlock.
+
+2001-05-17 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * makefile.mingw.in: Add gpattern.o to objects.
+
+ * glib.def: Export g_thread_exit as well.
+
+ * Makefile.am: Fix BUILT_EXTRA_DIST exporting.
+
+Sun May 13 10:31:17 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/Makefile.am gobject/Makefile.am gmodule/Makefile.am:
+ Add inter-library dependencies.
+
+ * acinclude.m4: Remove libtool macros.
+
+ * autogen.sh: Require libtool-1.4, automake-1.4p1.
+
+2001-05-15 Havoc Pennington <hp@redhat.com>
+
+ * configure.in (AC_OUTPUT): m4macros/Makefile
+
+ * m4macros/Makefile.am, m4macros/glib-2.0.m4,
+ m4macros/glib-gettext.m4:
+ m4 files moved here on server, Makefile.am added
+
+ This is so you can aclocal -I m4macros while avoiding acinclude.m4
+
+ * Makefile.am: add m4macros subdir, remove references to glib-2.0.m4
+
+2001-05-14 Havoc Pennington <hp@redhat.com>
+
+ * gutf8.c (g_utf8_get_char): fix docs; they said we validated
+ the UTF-8, but we can't possibly detect partial chars since
+ there's no length arg here, so trying to use this function
+ on invalid UTF-8 is a bad idea.
+
+Thu May 10 23:21:30 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gmessages.c (g_log_write_prefix): Avoid using stdio
+ to be as robust as possible in out-of-memory.
+
+ * gmessages.c (g_log_default_handler): Remove some dead
+ code.
+
+ * gutils.c (g_parse_debug_string): Fix to avoid mallocs.
+
+Fri May 11 18:25:23 2001 Tim Janik <timj@gtk.org>
+
+ * gdataset.c:
+ (g_dataset_foreach):
+ (g_datalist_foreach): make these safe against removal of the
+ current element.
+
+2001-05-10 Havoc Pennington <hp@pobox.com>
+
+ * gmessages.c (g_log_write_prefix): change env variable to
+ G_MESSAGES_PREFIXED, suggested by Tim
+
+Thu May 10 15:19:01 2001 Tim Janik <timj@gtk.org>
+
+ * gscanner.c (g_scanner_key_hash): use g_str_hash() algorithm
+ to generate hashes.
+
+ * gmem.c (standard_calloc): free() doesn't return a value
+ (Mark Murnane).
+
+2001-04-26 Havoc Pennington <hp@redhat.com>
+
+ * configure.in: Get rid of --enable-msg-prefix
+
+ * gmessages.c: make whether to prefix the messages with
+ appname/pid a runtime setting, not a compile-time setting. Change
+ default to include prefix for debug/warning/error type messages.
+
+2001-05-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread.c, gthread.h: Renamed 'value' and 'arg' to 'data' and
+ 'thread_func' to 'func' to make it more consistent with the rest
+ of GLib.
+
+ * gthreadpool.c, gthreadpool.h: Moved 'stack_size' from the public
+ members of GThreadPool to the private ones. Renamed 'thread_func'
+ to 'func' as above. Moved up 'user_data' in g_thead_pool_new
+ argument list and in GThreadPool struct.
+
+Tue May 8 15:33:31 2001 Tim Janik <timj@gtk.org>
+
+ * gcompletion.h: removed #include <unistd.h> sneaked in by
+ sopwith in november.
+
+2001-05-08 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gmain.c, gthread.c, gthread.h: Moved func and arg members from
+ GRealThread to GThread, such that they can be accessed by the
+ user.
+
+ * gthread.c, gthread.h: Due to popular demand (Tim being the
+ populus here ;-) threads now have a 'return value', which is
+ returned by g_thread_join and is either the return of the topmost
+ thread function or the value given to g_thread_exit.
+
+ * gthreadpool.c, tests/mainloop-test.c, tests/thread-test.c:
+ Adapted to the above change.
+
+2001-01-06 Hans Breuer <hans@breuer.org>
+
+ * glib.def : don't try to export g_strcpy, it is g_stpcpy;
+ updated and added some tweaking for functions which got
+ renamed recently, to avoid the update hassle if it can
+ simply be done compatible. Should vanish if there is a
+ stable version for win32.
+
+Fri May 4 11:49:18 2001 Owen Taylor <otaylor@redhat.com>
+
+ * Released 1.3.5
+
+ * NEWS: Updated
+
+ * configure.in (GLIB_MICRO_VERSION): Up version to 1.3.5,
+ interface/binary age 0.
+
+2001-05-04 Sven Neumann <sven@convergence.de>
+
+ * ghash.c: fixed a typo in a comment.
+
+ * gtree.[ch]: added new functions g_tree_new_full(), g_tree_replace(),
+ g_tree_steal() and g_tree_foreach() to adapt GTree to the GHashTable
+ API. Moved comments into the C file.
+
+ * docs/reference/glib/glib-sections.txt
+ * docs/reference/glib/tmpl/glib-unused.sgml
+ * docs/reference/glib/tmpl/hash_tables.sgml
+ * docs/reference/glib/tmpl/linked_lists_double.sgml
+ * docs/reference/glib/tmpl/linked_lists_single.sgml
+ * docs/reference/glib/tmpl/macros_misc.sgml
+ * docs/reference/glib/tmpl/trees-binary.sgml: updated documentation
+
+Thu May 3 06:38:28 2001 Owen Taylor <otaylor@redhat.com>
+
+ * g[s]list.c (g_[s]list_foreach) docs/Changes-2.0.txt: Make
+ foreach() safe against removal of the _current_ element. While
+ this could break some code, the new behavior is consistent with
+ the rest of GLib/GTK+ and probably is what people expect in most
+ cases. (Suggested by Paul Kuykendall, #50071)
+
+Wed May 2 11:10:22 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gutf8.c (g_utf8_to_ucs4_fast): Fix read past end of the string.
+ (#50404, fix from Jonas Borgström)
+
+Sun Apr 29 00:37:34 2001 Tim Janik <timj@gtk.org>
+
+ * ghook.[hc]: made hook ids a gulong.
+
+2001-04-20 Dan Winship <danw@ximian.com>
+
+ * configure.in: Add a check for the Darwin dynamic linker. Use
+ AC_TRY_LINK when checking for "nonposix getpwuid_r" so it notices
+ "no getpwuid_r" correctly.
+
+ * testglib.c (main): Make template[] bigger to prevent an overrun.
+ Remove an unused variable. Initialize error to NULL.
+
+ * tests/gio-test.c (main): Add a cast to prevent a warning when
+ size_t is a long.
+
+ * tests/type-test.c (main): Add an #ifdef to prevent a warning
+ when G_HAVE_GINT64 is defined and G_GINT64_FORMAT isn't.
+
+2001-04-19 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * ghash.c, ghash.h: Remove definition of g_hash_table_freeze and
+ g_hash_table_thaw. Instead added G_DISABLE_DEPRECATED-guarded
+ macros to ghash.h to go along the lines of the standard.
+
+ * gscanner.c, gscanner.h: Dito for g_scanner_freeze_symbol_table
+ and g_scanner_thaw_symbol_table.
+
+ * gutils.c, gutils.h: Dito for g_dirname. g_basename is still
+ defined in gutils.c, but declared ing gutils.h only
+ G_DISABLE_DEPRECATED-guarded.
+
+ * configure.in: Removed bashism in test for the pkg-config
+ version.
+
+ * configure.in: Rewrote test for multithread flag. Now uses
+ localtime_r, which hopefully has a consistent prototype across
+ different platforms. Also it uses a clever double EGREP trick
+ instead of compiling, which could give false positives. Thanks to
+ Dan Winship <danw@ximian.com> for the hint.
+
+Wed Apr 18 17:35:38 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gutils.c (_glib_gettext): Add missing static pointed
+ out by Michael Meeks.
+
+Wed Apr 18 09:37:07 2001 Owen Taylor <otaylor@redhat.com>
+
+ * MAINTAINERS: Removed. Keeping README, README.cvs-commits
+ HACKING, and AUTHORS up to date is plenty without extra
+ random files that someone thought a module should have.
+ (Actually, I believe this was used for debbugs in the past.)
+
+Tue Apr 17 11:47:07 2001 Owen Taylor <otaylor@redhat.com>
+
+ * Released 1.3.4
+
+ * NEWS: Updated
+
+Tue Apr 17 10:43:36 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gstrfuncs.c: Define _GNU_SOURCE for stpcpy
+
+ * tests/mainloop-test.c (main): Wait for all threads
+ to start before beginning tests.
+
+2001-04-17 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthreadpool.c (g_thread_pool_thread_proxy): Until now every
+ thread pool always had at least one tread waiting to avoid
+ switching overhead in case a new task would be added soon after
+ one finished. This however means a big waste of threads, if many
+ mostly inactive thread pools are involved. Now such a waiting
+ thread will only wait for half a second (This value is of course
+ very randomly picked) and go to the global threadpool afterwards.
+
+Mon Apr 16 12:04:52 2001 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Remove warnings about conflicts with the
+ stable version.
+
+ * glib-2.0.m4: Fix some of the error text to be halfway
+ up to date.
+
+ * README.in INSTALL.in: Add these to generate README, INSTAL
+ (as in the stable branch). Update.
+
+ * HACKING: Update.
+
+2001-04-16 Havoc Pennington <hp@redhat.com>
+
+ * gqsort.c: docs
+
+ * gfileutils.c: docs
+
+ * gwin32.c: docs fixes
+
+ * gconvert.c: docs
+
+ * guniprop.c: docs
+
+ * gutf8.c: docs
+
+2001-04-16 Havoc Pennington <hp@redhat.com>
+
+ * glib-2.0.m4: put AC_PATH_PROG(pkg-config) before "Checking for
+ glib" so the output looks right
+
+2001-03-23 Havoc Pennington <hp@redhat.com>
+
+ * gutils.c (g_parse_debug_string): make GDebugKeys argument
+ const
+
+2001-04-14 Hans Breuer <hans@breuer.org>
+
+ * glib.def :
+ * makefile.msc.in : updated
+
+ * gpattern.c : include "gutils.h" to resolve the inline hassle
+
+2001-04-11 Alexander Larsson <alexl@redhat.com>
+
+ * glib-2.0.m4: Pass pkg-config options
+ before the other args so it works even if
+ POSIXLY_CORRECT is set.
+
+Mon Apr 9 18:57:44 2001 Tim Janik <timj@gtk.org>
+
+ * configure.in: increment version to 1.3.4 (binary 0, interface 0).
+
+2001-04-05 Christian Rose <menthos@menthos.com>
+
+ * configure.in: Added sv to ALL_LINGUAS.
+
+Wed Apr 4 09:18:55 2001 Tim Janik <timj@gtk.org>
+
+ * Released GLib-1.3.3.
+
+Tue Apr 3 20:22:59 2001 Tim Janik <timj@gtk.org>
+
+ * NEWS: updates.
+
+ * NEWS.pre-1-3: take over old news.
+
+Tue Apr 3 12:38:16 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib-config-2.0.in: Exit with an error message that you
+ should use pkg-config instead.
+
+ * configure.in (PACKAGE): Require pkg-config.
+
+ * tests/Makefile.am (EXTRA_DIST): Add utf8.txt.
+
+ * configure.in (GLIB_MICRO_VERSION): Up MICRO to 3,
+ leave interface/binary at 0.
+
+Tue Apr 3 13:46:22 2001 Tim Janik <timj@gtk.org>
+
+ * glist.[hc]: added g_list_nth_prev() which walks ->prev instead
+ of ->next.
+
+ * gpattern.[hc]: added shell-style pattern matching code from beast,
+ derived from the gtk_pattern_*() code, but with a couple of bug fixes
+ and a number of optimizations.
+
+2001-04-03 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthreadpool.c: Added documentation.
+
+ * gthreadpool.c: The global thread pool now also is seperated for
+ bound and unbound threads. Only threads with standard stack size
+ go to the global pool. g_thread_pool_new now protects the global
+ setup of inform_mutex etc. with a lock. Fixed some typos. Unlock
+ the queue after g_thread_pool_wakeup_and_stop_all in the proxy.
+
+2001-04-02 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gmain.c: Use the new GRealThread member "context" instead of a
+ GStaticPrivate to store the thread specific main loop context.
+
+ * gthread.c: Added "context" member to GRealThread and updated
+ g_thread_create, g_thread_self and g_thread_cleanup accordingly.
+
+ * gthread.c, gthread.h: Removed the functions
+ g_static_private_(get|set)_for_thread and adapted
+ g_static_private_(get|set) and g_static_private_free
+ accordingly. This fixes Bug #51435.
+
+2001-03-30 Sven Neumann <sven@gimp.org>
+
+ * ghash.[ch]
+ * docs/reference/glib/tmpl/hash_tables.sgml: added new functions
+ g_hash_table_new_full, g_hash_table_replace, g_hash_table_steal and
+ g_hash_table_foreach_steal. Moved most docs out of the template
+ file into the C file. Please proofread the new documentation.
+
+2001-03-29 Tor Lillqvist <tml@iki.fi>
+
+ * glib.def: Updates.
+ * tests/makefile.mingw.in
+ * tests/makefile.msc.in: Add module-test rules.
+
+Mon Mar 26 14:14:53 2001 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.am (INCLUDES): -DG_DISABLE_DEPRECATED
+
+ * gmain.h timeloop.c: Surround the cruftiest stuff with
+ #ifndef G_DISABLE_DEPRECATED.
+
+ * gcompat.h gdate.h: Move compat defines back to
+ gdate.h, surround with #ifndef G_DISABLE_DEPRECATED.
+ Remove gcompat.h.
+
+Mon Mar 26 13:34:50 2001 Owen Taylor <otaylor@redhat.com>
+
+ [ Patch from DindinX <David.Odin@bigfoot.com>, added docs ]
+
+ * gstrfuncs.c, gstrfuncs.h: Add g_stpcpy () for platform that
+ don't have stpcpy ().
+ * gstrfuncs.c (g_strjoin, g_strjoinv, g_strconcat):
+ use g_stpcpy () so these functions run much faster.
+ * config.h.win32.in, glib.def: add reference to g_stpcpy ()
+ * configure.in: Add a test for the stpcpy () function.
+
+2001-03-20 Havoc Pennington <hp@redhat.com>
+
+ * gutf8.c (g_utf8_strlen): rewrite, based on bug #52328 from
+ Anders
+
+2001-03-19 Havoc Pennington <hp@redhat.com>
+
+ * gutf8.c (g_unichar_validate): added this function
+
+2001-03-18 Tor Lillqvist <tml@iki.fi>
+
+ * gspawn-win32.c (SETUP_DEBUG): Add braces to silence gcc -Wall.
+
+ * gspawn-win32-helper.c (write_no_error): Remove unused function.
+
+ * tests/makefile.mingw.in (module-test.exe): Add rules for
+ building module-test.
+
+Wed Mar 14 18:46:54 2001 Tim Janik <timj@gtk.org>
+
+ * gscanner.[hc]: removed archaic gpointer derived_data; relict and
+ added a GData member instead.
+
+ * glist.[hc]: added g_list_remove_all().
+
+ * gslist.[hc]: added g_slist_remove_all().
+
+Sat Mar 17 19:54:51 2001 Owen Taylor <otaylor@redhat.com>
+
+ * timeloop.c: Reorder headers to make FreeBSD happy.
+
+2001-03-13 Tor Lillqvist <tml@iki.fi>
+
+ From Edward M. Lee <tailbert@yahoo.com>:
+
+ * gdate.c (g_date_set_parse): add support for dates that in the
+ form "Wed Mar 14 2001". Running testgdate on cygwin requires this.
+
+Fri Mar 9 18:01:43 2001 Tim Janik <timj@gtk.org>
+
+ * gscanner.[hc]: made config arg to g_scanner_new() const.
+
+2001-03-12 Tor Lillqvist <tml@iki.fi>
+
+ * tests/Makefile.am (libmoduletestplugin_b_la_LIBADD,
+ libmoduletestplugin_b_la_LIBADD): Link with the libgmodule la only
+ on Win32.
+
+2001-03-10 Tor Lillqvist <tml@iki.fi>
+
+ * glibconfig.h.win32.in: Define G_PLATFORM_WIN32 here, too.
+
+ * tests/Makefile.am: Use the _LIBADD dependency on libglib only on
+ Win32.
+
+2001-03-09 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: Update with some information about using configure
+ and libtool.
+
+2001-03-09 Hans Breuer <hans@breuer.org>
+
+ * gobject/gobject.def : updated
+
+2001-03-08 Tor Lillqvist <tml@iki.fi>
+
+ * glib.def
+ * gobject/gobject.def
+ * gobject/makefile.mingw.in: Update.
+
+2001-03-08 Sven Neumann <sven@gimp.org>
+
+ * gtree.[ch]:
+ * docs/reference/glib/tmpl/trees-binary.sgml: added new function
+ g_tree_lookup_extended().
+
+Thu Mar 8 16:23:34 2001 Tim Janik <timj@gtk.org>
+
+ * ghook.[hc]: destruction cleanup. there's one
+ ->finalize_hook member in the hooklist now that gets
+ called when a hook should be destroyed, that's it.
+ that function is guarranteed to be called only when
+ all ref_counts to the hook vanished, thus also when
+ the hook is not in call.
+
+2001-03-08 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in (FLAG_DOES_NOT_WORK): Fix typo and thus bug #51862.
+
+Wed Mar 7 09:32:06 2001 Tim Janik <timj@gtk.org>
+
+ * glib-object.h: add gvaluearray.h.
+
+ * gstring.[hc]: fixup naming of g_string_sprint*.
+
+ * gtypes.h: fixed GCompareDataFunc naming.
+
+2001-03-07 Christian Meyer <chrisime@gnome.org>
+
+ * configure.in: Added de (German) to ALL_LINGUAS.
+
+2001-03-02 Christophe Merlet <redfox@eikonex.org>
+
+ * configure.in: Added fr (French) to ALL_LINGUAS.
+
+2001-03-01 Tor Lillqvist <tml@iki.fi>
+
+ * gutils.c (g_path_is_absolute): (Win32) Remove test for initial
+ double backslash (UNC path), this will of course be matched by the
+ test for an initial G_DIR_SEPARATOR right up front. Silly me.
+ (g_find_program_in_path): Implement on Win32. Append the
+ executable file name suffixes from PATHEXT in turn while looking
+ for the program.
+ (g_find_program_in_path): If the program we are looking for is a
+ relative path in a subdirectory, don't do any path search.
+ (g_get_any_init): (Win32) Also look for the USERPROFILE env var
+ indicating the home directory equivalent.
+ (g_find_program_in_path): (Win32): Use MAXPATHLEN, not PATH_MAX
+ which isn't defined with MSVC.
+
+ * testglib.c (main): Test g_find_program_in_path() on Win32 by
+ looking for more.com and regedit.
+
+ * glib.def: Add g_find_program_in_path.
+
+2001-02-26 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthreadpool.c (g_thread_pool_thread_proxy): Make
+ max_unused_threads work for -1 as well.
+
+2001-02-23 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread.h (struct _GThread): Change the order to match the order
+ in g_thread_create().
+
+ * gthread.c (g_static_rec_mutex_lock_full): Also do the right
+ thing (behave like 'depth' calls to g_static_rec_mutex_lock) for a
+ mutex, that is already locked.
+
+Thu Feb 22 10:31:36 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gmain.c (g_source_remove_poll): Add missing implementation
+ of g_source_remove_poll. (Pointed out by Stefan Westerfeld)
+
+2001-02-21 Tor Lillqvist <tml@iki.fi>
+
+ * gutils.c (g_find_program_in_path): Implement on Win32.
+
+ Cygwin support contributed by Stefan Ondrejicka
+ <ondrej@idata.sk>. Hopefully I got it all in while simultaneously
+ adding support for auto*/libtool for mingw.
+
+ * Makefile.am: Changes for auto* support on Cygwin and Win32. Do
+ still distribute the hand-written makefiles and *.win32.in files,
+ though. Use GIO, GSPAWN and PLATFORMDEP macros set by configure.
+ Use -no-undefined. Pass -export-symbols glib.def to libtool.
+
+ * configure.in: Define G_PLATFORM_WIN32 on both pure Win32 (mingw)
+ and Cygwin. Add AC_CYGWIN, AC_EXEEXT and AC_LIBTOOL_WIN32_DLL
+ calls for Cygwin and mingw support. Check for %I64u guint64
+ format (in MS C library). Set G_MODULE_IMPL on mingw and
+ Cygwin. Use ac_object and ac_exeext. Set GIO, GSPAWN, PLATFORMDEP
+ and G_LIBS_EXTRA. Compile timeloop only on Unix. Define OS_WIN32
+ automake conditional on Win32.
+
+ * glib.h: Include gwin32.h also on Cygwin.
+
+ * gfileutils.c (get_contents_posix): Use O_BINARY (defined as 0 on
+ Unix) for Cygwin's sake.
+
+ * gtimer.c (GETTIME): Reduce #ifdefs, use a macro GETTIME().
+
+ * gconvert.c
+ * gthread.c
+ * gutf8.c
+ * gutils.c: For code needed both on Cygwin and native Win32,
+ test for G_PLATFORM_WIN32.
+
+ * gmarkup.h: Use G_BEGIN_DECLS and G_END_DECLS.
+
+ * gtypes.h: Refine GLIB_VAR definition. Also check for DLL_EXPORT
+ in case compiling a static library on Win32 or Cygwin.
+
+ * gwin32.c: No <direct.h> on Cygwin. No need for ftruncate() or
+ dirent emulation on Cygwin.
+ (get_package_directory_from_module) Convert return value from
+ GetModuleFileName() to POSIX path on Cygwin.
+
+ * tests/Makefile.am (progs_LDADD): Link with libglib, libgthread
+ and libgmodule as appropriate. Use -no-undefined.
+
+ * gbacktrace.c: Move #ifdefs around a bit on Win32.
+
+2001-02-21 Tor Lillqvist <tml@iki.fi>
+
+ * gshell.c (unquote_string_inplace): Make static.
+
+ * gthread.h: Include gtypes.h to be sure to get GLIB_VAR
+ definition, remove definition from here.
+
+ * gunicode.h: Remove duplicate GLIB_VAR definition from here, too.
+
+ * gutils.c: (Win32) Use USERPROFILE as home dir if present. On
+ Win2k, HOMEDRIVE and HOMEPATH aren't reliable.
+
+ * Makefile.am (INCLUDES): Add -DGLIB_COMPILATION.
+
+ * makefile.mingw.in: Remove install target, Windows isn't Unix.
+ (DEFINES): Add -DDLL_EXPORT.
+
+ * testgdate.c
+ * testgdateparser.c
+ * testglib.c: Undefine GLIB_COMPILATION.
+
+ * testglib.c: Make some vars static. Add Cygwin path tests.
+
+ * glib.def: Updates.
+
+ * .cvsignore
+ * */.cvsignore: Ignore also .obj, .dll, .lib and .exe files.
+
+2001-02-19 Hans Breuer <hans@breuer.org>
+
+ * glib/glib.def, gobject/gobject.def : added nissing symbols
+
+ * gobject/makefile.msc : updated
+
+ * glib/gmessages.c : call the "debug interrupt" before exiting the
+ program, if build with msvc as debug version. Which gives the opportunity
+ to see the callstack, etc.
+
+ * glib/gthread.c : thread->pid is only defined #ifdef
+ G_THREAD_USE_PID_SURROGATE
+
+Mon Feb 19 07:32:38 2001 Tim Janik <timj@gtk.org>
+
+ * glib-config-2.0.in (lib_glib): my name is glib-config-2.0!
+ don't exit with errorcode!=0 for --help or -h.
+
+ * Makefile.am:
+ * configure.in: build glib-config-2.0.
+
+2001-02-17 Havoc Pennington <hp@pobox.com>
+
+ * gthread.c: include string.h
+
+ Applied patch from Soeren Sandmann:
+
+ * testglib.c: const fixes
+
+ * gwin32.h: format cleanups
+
+ * gutils.c (g_atexit): constify a variable
+ (g_find_program_in_path): constification
+ (g_basename): G_CONST_RETURN
+ (g_path_skip_root): G_CONST_RETURN
+ (g_getenv): G_CONST_RETURN
+ (g_get_user_name): G_CONST_RETURN
+ (g_get_real_name): G_CONST_RETURN
+ (g_get_home_dir): G_CONST_RETURN
+ (g_get_tmp_dir): G_CONST_RETURN
+ (g_get_prgname): G_CONST_RETURN
+ (_glib_gettext): G_CONST_RETURN
+
+ * gunicode.h: formatting cleanups
+
+ * gstrfuncs.c (g_strerror): G_CONST_RETURN
+ (g_strsignal): G_CONST_RETURN
+
+ * gspawn.c (g_execute): const on variables
+
+ * gmessages.c (printf_string_upper_bound): fix const on a variable
+
+ * gmem.c (g_mem_chunk_new): make the "name" arg const
+ (struct _GRealMemChunk): make the "name" field const
+
+ * gfileutils.c (g_file_open_tmp): store const return in a const
+ gchar* variable
+
+ * gdataset.c (g_quark_to_string): G_CONST_RETURN
+
+Sat Feb 17 07:26:33 2001 Tim Janik <timj@gtk.org>
+
+ * configure.in (G_MODULE_HAVE_DLERROR): add check for broken RTLD_GLOBAL
+ (on OSF1 V5.0).
+
+2001-02-15 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * acconfig.h, configure.in: Reverted the changes necessary to
+ enlarge the system thread for G_THREAD_USE_PID_SURROGATE.
+
+ * gthread.c: Now implement G_THREAD_USE_PID_SURROGATE in gthread.c
+ instead of gthread/gthread-posix.c. While the latter has the
+ advantage, that it is conceptually cleaner, it makes
+ g_thread_self_posix_impl _very_ slow and that hurts
+ GStaticRecMutex and other things. So the new version is less
+ clean, but faster.
+
+2001-02-09 Havoc Pennington <hp@redhat.com>
+
+ * gconvert.c (g_convert): don't overwrite errors
+
+ * gerror.c (g_set_error): improve warning message if an error is
+ overwritten
+ (g_propagate_error): ditto
+
+2001-02-13 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread.c, gthread.h: Added functions g_static_rec_mutex_init,
+ g_static_rec_mutex_free, g_static_private_init,
+ g_static_private_free, g_static_rw_lock_init to allow the usage of
+ all those types dynamically. (g_static_rw_lock_free already
+ existed). Aditionally freed static_private indeces are reused
+ now. Untill now the array would just grow if you would use more
+ and more static_private. That required adding a slist of all
+ running threads, which could potentially be of good use later. It
+ is not exported however. Renamed a LOCK and small indentation
+ fixes.
+
+ * tests/thread-test.c: Test the new static_private index freing
+ and reusing feature.
+
+Mon Feb 12 15:01:09 2001 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in (gtk_doc_min_version): Add check for gtk-doc version.
+
+2001-02-10 Tor Lillqvist <tml@iki.fi>
+
+ * gtypes.h
+ * gutils.h: Move GLIB_VAR definition from gutils.h to gtypes.h
+
+ * glib.def
+ * gmem.h: Mark glib_mem_profiler_table for export.
+
+ * gwin32.c (get_package_directory_from_module): Don't store
+ address of local variable in hashtable.
+
+2001-02-08 Fatih Demir <kabalak@kabalak.net>
+
+ * configure.in: Added "tr" to ALL_LINGUAS.
+
+2001-02-04 Tor Lillqvist <tml@iki.fi>
+
+ * gwin32.c (g_win32_getlocale): Use "nn" for Nynorsk, as nn.po
+ files are appearing now. If the sublanguage starts with '@', don't
+ use a '_' separator. South Africa is 'ZA', not 'SA'.
+
+Sun Feb 4 07:38:32 2001 Tim Janik <timj@gtk.org>
+
+ * docs/debugging.txt: s/glib_trap_/g_trap_/. add comments on
+ g_trap_instance_signals, g_trace_instance_signals and
+ GRUNTIME_DEBUG.
+
+ * gmem.c: s/glib_trap_/g_trap_/.
+
+2001-02-04 Tor Lillqvist <tml@iki.fi>
+
+ * tests/Makefile.am (thread_LDADD): Change order of libs,
+ put progs_LDADD last. Needed for cygwin, says jbdoll@kepri.re.kr.
+
+2001-02-02 Tor Lillqvist <tml@iki.fi>
+
+ * giochannel.h
+ * giowin32.c
+ * gmain.c: Stylistic cleanups. Use G_STRLOC in g_warning() calls.
+
+ * glib.def: Add missing functions.
+
+2001-02-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread.c, gthread.h: Added g_static_mutex_init to allow
+ initialization of a GStaticMutex, that can not be initialized with
+ G_STATIC_MUTEX_INIT, for example in allocated structures.
+
+Wed Jan 31 13:46:58 2001 Owen Taylor <otaylor@redhat.com>
+
+ * acinclude.m4 glib-gettext.m4: Fix problem with --disable-nls.
+
+2001-01-31 Tor Lillqvist <tml@iki.fi>
+
+ * glibconfig.h.win32.in: Corresponding change as below to
+ GStaticMutex.
+
+2001-01-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread.c, gthread.h: Added g_static_mutex_free to allow using
+ GStaticMutexes with limited lifetime without leaking.
+
+ * configure.in: GStaticMutex doesn't have to provide extra space
+ for debugging information for G_ERRORCHECK_MUTEXES, as then the
+ non-default implementation (runtime_mutex) is used anyway.
+
+ * gthread.h (g_cond_wait): Added debug information for
+ g_mutex_free calls, if G_ERRORCHECK_MUTEXES is defined.
+
+2001-01-29 Tor Lillqvist <tml@iki.fi>
+
+ * glibconfig.h.win32.in: Use the same GMutex structure as the
+ configure-generated glibconfig.h does.
+
+ * gstrfuncs.c (g_strsignal): Declare strsignal() on Cygwin, too,
+ says jbdoll@kepri.re.kr.
+
+2001-01-29 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread.c: Broadcast the condition, if there are waiting
+ readers, as all might read at the same time. Only signal the
+ writer thread, if there are no more readers.
+
+2001-01-25 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.mingw.in
+ * */makefile.mingw.in: Protect the rule to rebuild makefile.mingw
+ if makefile.mingw.in has changed with a check if said .in file
+ exists. (This rule is mainly a convenience for yours truly.)
+
+ * giowin32.c: Socket support rewritten. It was utterly broken, and
+ untested in fact. We still do use a thread for each socket being
+ watched, but instead of blocking in recv() (which of course was
+ plain stupid for sockets being listen()ed on in a server-type
+ application), we block in select(). The read method for sockets
+ calls recv(). It is now possible for the application to call
+ accept(), recv() or send() in the callback, just like on
+ Unix. Tested with code kindly provided by Andrew Lanoix.
+
+ Rename g_io_channel_win32_new_stream_socket() to
+ g_io_channel_win32_new_socket() as it isn't restricted to stream
+ sockets.
+
+ * gmain.c (g_poll): Related changes in the Win32 version of
+ g_poll(). When polling for messages, always do a PeekMessage()
+ first. We used to miss messages if several were posted between
+ calls to g_poll().
+
+ * giochannel.h: Improve Win32-related comments.
+
+ * gutf8.c: (Win32) Include <stdio.h> for sprintf.
+
+ * tests/gio-test.c: (Win32) Add tests for polling for Windows
+ messages.
+
+ * tests/makefile.mingw.in: Remove superfluous compilation command
+ line.
+
+2001-01-23 Alex Larsson <alexl@redhat.com>
+
+ * gmain.c (g_source_callback_unref): Free the callback
+ (g_source_set_callback): Initialize the callback refcount
+
+2001-01-20 Tor Lillqvist <tml@iki.fi>
+
+ * gutils.c (g_get_codeset): (Win32) Even if g_get_codeset() is
+ currently commented out from gutils.h, fix it to return the same
+ CP%d value as g_get_charset().
+
+2001-01-19 Kjartan Maraas <kmaraas@gnome.org>
+
+ * gconvert.c: Fix typo.
+ * gfileutils.c: Same here.
+ * configure.in: Added no to ALL_LINGUAS
+
+2001-01-17 Tor Lillqvist <tml@iki.fi>
+
+ * gwin32.c (g_win32_getlocale, g_win32_error_message): Add doc
+ comments.
+ (g_win32_get_package_installation_directory): Add one parameter,
+ the name of a DLL in the package. Add possibility to use that to
+ deduce the installation directory if not entered into the
+ Registry. Make the return value dynamically allocated.
+ (g_win32_get_package_installation_subdirectory): New convenience
+ function.
+
+ * gutils.c (GLIB_LOCALE_DIR)
+ * gwin32.h: Adapt accordingly.
+
+ * testglib.c (main): Adapt tests accordingly.
+
+Tue Jan 16 23:20:38 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gutils.c glibintl.h: Optimize for size rather than speed by
+ making _() always call _glib_gettext() instead of conditionally
+ calling gettext() or _glib_gettext_init. glib only uses translated
+ strings in slow error handling code anyways.
+
+ * glibintl.h: g'ify types.
+
+ * Makefile.am: include glibintl.h in _SOURCES
+
+2001-01-17 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32.in: Define ENABLE_NLS and GETTEXT_PACKAGE.
+
+ * makefile.mingw.in
+ * makefile.msc.in: Use the GNU intl library.
+
+ * gwin32.c (g_win32_get_package_installation_directory): New
+ function. To be used by various GLib-using packages to get their
+ installation directory, which should be stored in the Registry by
+ some installer.
+
+ * gwin32.h: Declare it.
+
+ * testglib.c (main): Test it.
+
+ * gutils.c: On Win32, define GLIB_LOCALE_DIR using
+ g_win32_get_package_installation_directory().
+
+ * glib.def: Update.
+
+Mon Jan 15 21:39:06 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib-2.0.pc.in (Libs) glib-config-2.0.in: Add @INTLLIBS@.
+
+Mon Jan 15 21:12:49 2001 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in acconfig.h glibintl.h gutils.c
+ po/{Makefile.in.in,POTFILES.in,po2tbl.in}: Add gettext
+ support.
+
+ * glib-gettext.m4 acinclude.m4: Clean up the GTK+ gettext macros
+ some more and put them in this file, though they also need
+ to be included in acinclude.m4 due to the brokeness of
+ aclocal.
+
+ * gspawn.c gspawn-win32.c gutf8.c gconvert.c gfileutils.c
+ gshell.c: Remove dummy _() #defines, include glibintl.m4.
+
+2001-01-09 Tor Lillqvist <tml@iki.fi>
+
+ * giowin32.c: Rework the changes needed to pass mainloop-test. Now
+ we don't need to call TerminateThread() after all, which is a
+ relief, as the docs have a BIG RED WARNING SIGN about using that
+ API. Instead, when closing a fd channel that has a reader thread
+ running, just mark it as non-running and additionally mark the fd
+ as ripe for closing. When the reader thread hopefully eventually
+ gets something (and EOF or some actual data), it will note that it
+ shouldn't be running, break out of the loop, and close the fd.
+
+ The socket channel closing code should probably be changed
+ similarily, but that will have to wait until I have a test case.
+
+ (g_pipe_readable_msg, g_io_channel_win32_new_pipe,
+ g_io_channel_win32_new_pipe_with_wakeups,
+ g_io_channel_win32_pipe_request_wakeups,
+ g_io_channel_win32_pipe_readable): Remove these, have been
+ obsolete for some time.
+
+ * gutils.c (g_basename, g_dirname): Don't warn about deprecation
+ on Win32. Code written for GLib 1.2 doesn't have much choice but
+ to use GLib >= 1.3 on Win32.
+
+ * glib.def: Update.
+
+2001-01-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gmem.c: Made g_profile_mutex a GMutex* instead of
+ G_LOCK_DEFINE_STATIC to avoid deadlock for thread implementations
+ without native static mutexes. Contruct g_profile_mutex in
+ g_mem_init().
+
+2001-01-06 Tor Lillqvist <tml@iki.fi>
+
+ * gconvert.c (g_locale_to_utf8, g_locale_from_utf8): Get len using
+ strlen() if arg is negative in the Win32 code, too.
+
+ * giowin32.c: Changes necessary to be able to run
+ mainloop-test. We can't close the fd that our (internal) reader
+ thread is sitting doing a blocking read() from. We must terminate
+ the thread first. Keep track of thread handle, and close it when
+ thread is dying. Start reader thread with the lower-level
+ CreateThread() instead of _beginthreadex() from the C runtime, in
+ order to be able to use TerminateThread(). Hopefuly this isn't
+ harmful.
+
+ * glib.def: Update.
+
+ * tests/makefile.{mingw,msc}.in (TESTS): Add mainloop-test and
+ unicode-encoding.
+
+ * tests/mainloop-test.c: Portability: <unistd.h>, need <fcntl.h>
+ on Win32.
+
+ * tests/unicode-encoding.c (process): Add missing "line" argument
+ to fail(). On Win32, convert UTF-16LE, as libiconv'c ivonf always
+ converts to UTF-16BE if we ask for unspecific UTF-16.
+ (main) Handle also '\r'.
+
+Fri Jan 5 11:25:42 2001 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in (PACKAGE): move $enable_debug down below
+ checks for GCC to avoid setting CFLAGS prematurely,
+ change checks to avoid adding -g twice.
+
+ * gutf8.c (g_ucs4_to_utf8): Support len < 0 to mean
+ 0 termination.
+
+ * gutf8.c (g_utf8_to_ucs4): Terminate result with 0.
+
+ * tests/mainloop-test.c (main): Fix uses of
+ g_main_loop_destroy().
+
+ * tests/unicode-encoding.c tests/Makefile.am tests/utf8.txt:
+ Tests for unicode-conversion code.
+
+ * gconvert.c (g_convert, g_convert_with_fallback): work around
+ a couple of GNU libc bugs.
+
+ * gconvert.[ch] (g_{locale,filename}_{to,from}_utf8): Standardize
+ arguments to match g_convert(). Document.
+
+ * gunicode.[ch]:
+ - Implement conversion functions to and from UTF-16
+ - Standardize unicode conversion functions on prototype like
+ g_convert.
+ - Add a lot of error checking to unicode conversion functions.
+
+ * gunicode.[ch] (g_utf8_to_ucs4_fast): Add fast, non-checking
+ variant of g_utf8_to_ucs4.
+
+ * gutf8.c (g_utf8_validate):
+ - add g_return_if_fail (str != NULL).
+ - add checks for overlong strings, non-valid Unicode characters (>= 110000)
+ and single surrogates.
+
+2001-01-05 Tor Lillqvist <tml@iki.fi>
+
+ * testglib.c (main): Add test for g_path_skip_root().
+
+ * gfileutils.c (g_file_open_tmp): (Win32:) Look also for (illegal)
+ forward slashes in the template.
+
+ * gutils.c (g_path_skip_root): On Win32, skip the \\server\share
+ part of UNC paths. On all platforms, skip several initial
+ slashes. Add a few comments.
+ (g_get_any_init): On Win32, in case HOME is Unix-style with
+ (forward) slashes (some other applications apparently set it up
+ this way, convert to backslashed form.
+
+ * configure.in (glib_os): Remove stray 'v'. Add case for mingw,
+ although using configure for mingw surely doesn't work yet.
+
+ * glib.def: Update.
+
+2001-01-02 Havoc Pennington <hp@redhat.com>
+
+ * configure.in: remove glib-config-2.0
+
+ * Makefile.am: remove glib-config-2.0
+
+2001-01-03 Havoc Pennington <hp@pobox.com>
+
+ * tests/Makefile.am (INCLUDES): -I$(top_srcdir)/gmodule,
+ fix from Michael Meeks
+
+ * Makefile.am (INCLUDES): DISABLE was spelled wrong
+
+Wed Jan 3 14:10:49 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gmain.[ch]: Switch GMainLoop to be ref/unref, use to
+ make dropping reference to running loop safe.
+
+Wed Dec 13 20:41:49 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gmain.c (g_source_unref_internal): Unref callback->cb_data
+ if it was still set when the source is freed. (Usually, this
+ will be done by g_source_destroy.)
+
+2001-01-02 Dan Winship <danw@helixcode.com>
+
+ * garray.h (g_array_append_val, g_array_prepend_val,
+ g_array_insert_val): Use parentheses around an argument to make
+ these cause an error if you pass a non-lvalue for the value,
+ rather than silently doing the wrong thing.
+
+2000-12-29 Tor Lillqvist <tml@iki.fi>
+
+ * glibconfig.h.win32.in: Add GLIB_SIZEOF_VOID_P and GLIB_SIZEOF_LONG.
+
+ * glib.def: Update.
+
+ * {.,*}/makefile.{mingw,msc}.in: Add -DG_ENABLE_DEBUG.
+
+Fri Dec 29 14:53:18 2000 Tim Janik <timj@gtk.org>
+
+ * configure.in: we can't grow _cv_ variables by using a backticked
+ expr that refers back to the variable (glib_cv_sizeof_system_thread for
+ G_THREAD_USE_PID_SURROGATE), that'd keep the variable growing every time
+ it's evaluated. quantum states, anyone?)
+
+Thu Dec 28 10:21:46 2000 Tim Janik <timj@gtk.org>
+
+ * gmem.[hc]: got rid of outdated dmalloc support. provide g_try_malloc()
+ and g_try_realloc() which _may_ fail and return NULL.
+ nuked g_mem_check(), provided GMemVTable for memory function
+ virtualization, alterable at program startup with g_mem_set_vtable().
+ provided glib_mem_profiler_table and g_mem_profile() to support limited
+ profiling information out of the box (uses mprotect() for free()ed areas
+ on linux).
+ provide globally visible G_MEM_ALIGN.
+ buncha cleanups.
+
+ * docs/macros.txt: file to get a clue about the various configuration
+ macros.
+
+ * docs/debugging.txt: explain debugging traps.
+
+ * configure.in: got rid of --enable-mem-check and --enable-mem-profile,
+ define GLIB_SIZEOF_VOID_P and GLIB_SIZEOF_LONG. check malloc prototypes
+ and define SANE_MALLOC_PROTOS is we can use them.
+ <boy, is this file a mess>
+
+ * gutils.c, gscanner.c: fix up compatibility warnings, use g_message().
+
+2000-12-27 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: Update.
+
+2000-12-25 Tor Lillqvist <tml@iki.fi>
+
+ * gmessages.c: (Win32) Use a MessageBox for fatal
+ messages. Collect eror message into a buffer, and display that.
+
+ * glib.def: Update.
+
+ * glibconfig.h.win32.in: Update. Remove unused wchar and wctype
+ macros, add G_MODULE_SUFFIX.
+
+2000-12-24 Ali Abdin <aliabdin@aucegypt.edu>
+
+ * Makefile.am, gcompat.h, glib.h: New gcompat.h header file
+ as recommended by Havoc.
+
+ * gdate.c, gdate.h, testgdate.c,
+ docs/reference/glib/glib-sections.txt,
+ docs/reference/glib/tmpl/date.sgml, tests/date-test.c: Rename some
+ of the gdate functions to use the '_get' in their name. Patch
+ reviewed by Havoc.
+
+2000-12-22 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Determine the suffix of the shared librarries for
+ this system. This is done analogous to
+ ltconfig.sh. G_MODULE_SUFFIX in glibconfig.h is set to either
+ "sl", "dll", or (most often) "so".
+
+ * tests/Makefile.am, tests/module-test.c,
+ tests/libmoduletestplugin_a.c, tests/libmoduletestplugin_b.c:
+ Added new testcase for gmodule. This is mostly copied from
+ gmodule/testgmodule.c, but unlike that is is quiet. (Why BTW are
+ some tests that verbose, not to say loquacious...)
+
+2000-12-19 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * grand.c: Updated G_RAND_DOUBLE_TRANSFORM to be more
+ accurate. Redid g_rand_double() such that it returns 52 bits after
+ the point instead of 32 as before. That OTOH requires calling
+ g_rand_int() twice. Overhauled g_rand_int_range(), which is easier
+ now thanks to the new precision of g_rand_double(). Thanks to
+ Sverre Johansen <sj@ifi.uio.no> for the hint.
+
+ * grand.h: Added g_rand_boolean() and g_random_boolean()
+ macros. While they could be omitted due to extreme simplicity,
+ they make intention clearer in code and are therefore good to have.
+
+ * grand.c, grand.h: Renamed all 'min' and 'max' parameters to'
+ begin' and 'end' resp. to avoid making people think, that 'max' is
+ included in the interval. 'end' now isn't, whereas 'begin'
+ is. That's similar to the use in the STL.
+
+ * gslist.c, glist.c: Ok, I'm a moron. When I originally
+ implemented ENABLE_GC_FRIENDLY, I forgot to include config.h into
+ the affected files. Now that Alex did that for those two,
+ inevitable typos surfaced, which are now fixed.
+
+ * garray.c, ghash.c, gqueue.c, gtree.c: Include config.h as well,
+ as ENABLE_GC_FRIENDLY should be known.
+
+2000-12-19 Alexander Larsson <alexl@redhat.com>
+
+ * configure.in:
+ Added --disable-mem-pools option.
+
+ * glist.c:
+ * gslist.c:
+ * gnode.c:
+ * gmem.c:
+ Disable free list and memory chunks if DISABLE_MEM_POOLS is defined.
+
+2000-12-17 Tor Lillqvist <tml@iki.fi>
+
+ * gutf8.c (g_utf8_get_charset_internal): (Win32) Use GetACP to get
+ the current ANSI codepage.
+
+ * gunicode.h: Add comment that the static string g_get_charset
+ sets the parameter to point to should be copied in case the
+ charset might be changed later in the program.
+
+2000-12-14 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.{mingw,msc}.in: No need to -DGSPAWN_HELPER when
+ compiling gspawn-win32-helper any longer.
+
+ * giowin32.c (g_io_win32_dispatch): Warn if no callback. Call
+ callback correctly.
+ (g_io_win32_create_watch): Fix typo.
+ (g_io_win32_fd_create_watch): Ditto.
+ (g_io_channel_unix_new): If it is a file descriptor (i.e., a Unix
+ fd lookalike provided by the C library), call
+ g_io_channel_win32_new_fd(). If it is a socket (from WinSock),
+ call g_io_cahnnel_win32_new_stream_socket(). Hopefully sockets and
+ fds don't overlap. TODO: Implement also datagram sockets.
+ (g_io_channel_win32_poll): Call g_main_context_get_poll_func().
+
+ * gcompletion.h: Include <unistd.h> only on Unix. Is this
+ inclusion really needed here? OTOH, do include <stddef.h>, for
+ size_t.
+
+ * gmessages.c: (Win32) Don't define a function called "write" that
+ might clash with the prototype from <io.h>, use a #define.
+
+ * glib.def: Update.
+
+ * gmain.c (g_source_add_poll): Don't return a value from void
+ function.
+ (g_main_context_get_poll_func): Compile also for non-Win32, as
+ presumably was intended. The result var is a GPollFunc, not a
+ GPollFunc*. Return the result!
+
+2000-12-13 Havoc Pennington <hp@redhat.com>
+
+ * gconvert.c (open_converter): make static
+
+ * gutf8.c (g_utf8_validate): Simplify logic a bit, maybe
+ speeding it up - now we just return FALSE if we had to bail out
+ for any reason before getting to the end of the string, as defined
+ by a nul byte if len was -1, defined by the len otherwise. This
+ also fixes a bug where nul bytes were not treated as invalid
+ when the length was specified.
+
+2000-12-12 Havoc Pennington <hp@pobox.com>
+
+ * gmain.c (g_main_context_destroy): don't try to use thread stuff
+ unless G_THREADS_ENABLED
+ (g_main_context_query): ditto
+ (g_main_context_check): ditto
+ (g_main_loop_quit): ditto
+
+Tue Dec 12 18:58:22 2000 Tim Janik <timj@gtk.org>
+
+ * ghash.c (g_hash_table_remove): return whether a value
+ got removed.
+
+Tue Dec 12 15:18:10 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gmain.[ch]: Revert unauthorized changes.
+
+2000-12-12 Elliot Lee <sopwith@redhat.com>
+
+ * gmain.c, gmain.h (g_main_context_new, g_main_context_destroy):
+ GMainContext useful in implementing some additional styles of
+ main loop usage. To do this, however, Joe Hacker needs to be able
+ to create/destroy GMainContext's at will. This is just an export
+ of existing functionality, rather than any new functionality.
+
+ They are listed in the "Low level functions for implementing custom
+ main loops" section of the header file, to avoid confusing people.
+
+Sun Dec 10 10:47:11 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gmain.c (g_source_destroy_internal): Remove pollfds
+ from the context here, not when actually freeing the
+ source.
+
+ * gmain.c (g_source_unref_internal): Free source list
+ and source, call source->source_funcs->destroy().
+
+ * giochannel.c: Unreference io_channel properly.
+
+Thu Dec 7 15:22:30 2000 Owen Taylor <otaylor@redhat.com>
+
+ * tests/mainloop-test.c (recurser_start): Add a bunch
+ of unrefs.
+
+ * gmain.c (g_source_attach): Reference the source
+ when adding (pointed out by Elliot)
+
+2000-12-08 Raja R Harinath <harinath@cs.umn.edu>
+
+ * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP):
+ Rename from GLIB_DIVERT_BEFORE_HELP.
+ Update to track autoconf 2.49b.
+ * configure.in: Reflect above change.
+ (AC_EGREP_HEADER): Rename from really obselete AC_HEADER_EGREP.
+ (debug_default): Replace "if test `expr ...`" with "case".
+
+ * tests/Makefile.am (TESTS): Rearrange into other variables, and
+ include run-markup-tests.sh.
+ (TESTS_ENVIRONMENT): New. Pass $srcdir to tests.
+ (noinst_PROGRAMS): Rename to ...
+ (check_PROGRAMS): ... this. 'automake' ensures that these are
+ built before running the tests.
+ * tests/run-markup-tests.sh: Support $srcdir != $builddir.
+
+2000-12-08 Havoc Pennington <hp@pobox.com>
+
+ * tests/Makefile.am (TESTS): move markup-test to noinst_PROGRAMS;
+ it isn't a proper test, the proper test would be
+ run-markup-tests.sh, but that can't go in tests, so we need
+ a manual make check rule. Didn't do that yet.
+
+2000-12-07 Raja R Harinath <harinath@cs.umn.edu>
+
+ * gmain.h: Don't put anything after an #endif.
+ * gmain.c: Likewise.
+
+2000-12-06 Havoc Pennington <hp@pobox.com>
+
+ * tests/strfunc-test.c (main): add g_strdupv test
+
+ * gstrfuncs.c (g_strdupv): Add a function to copy
+ an array of strings
+
+Tue Dec 5 12:23:04 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gmain.[hc]: Major change in API for creating sources
+ to handle multiple main loops (GMainContext *).
+
+ GSources are now exposed as GSource * and implemented
+ with structure derivation.
+
+ * giochannel.[ch]: Changed vtable for GIOChannel to correspond
+ to the new mainloop API, add g_io_channel_create_watch().
+
+ * gtypes.h: Move GTimeVal here.
+
+ * gthread.h: Remove gmain.h include to avoid circularity.
+
+ * giounix.c: Update for new GMain API.
+
+ * giowin32.c: Update for new GMain API. (No check for
+ proper compilation or working.)
+
+ * timeloop.c timeloop-basic.c: A benchmarking program for
+ the main loop comparing the main loop against a
+ hand-written (timeloop-basic.c) variant.
+
+ * tests/mainloop-test.c: New torture test of mainloop.
+
+ * docs/Changes-2.0.txt: Started. Added text about
+ changes to GMain.
+
+ * gmain.c (g_main_add_poll_unlocked): Initial fd->revents
+ to zero. (#8482, Benjamin Kahn)
+
+2000-12-01 Tor Lillqvist <tml@iki.fi>
+
+ * {.,*}/makefile.msc.in: Include make.msc from GLib's build subdir.
+
+ * makefile.{mingw,msc}.in (glib_OBJECTS): Add gunibreak.
+
+ * glib.def: Update correspondingly.
+
+2000-11-21 Havoc Pennington <hp@pobox.com>
+
+ * gmacros.h: Provide G_CONST_RETURN which is 'const' by default,
+ and nothing when G_DISABLE_CONST_RETURNS is defined.
+
+2000-11-29 Havoc Pennington <hp@redhat.com>
+
+ * gunidecomp.c (COMBINING_CLASS):
+ s/UNICODE_LAST_CHAR/G_UNICODE_LAST_CHAR/
+
+ * gunichartables.h: Update for data in Unicode 3.0.1
+
+ * gunidecomp.h: Ditto
+
+ * gunicode.h (GUnicodeBreakType): Enum for line break properties
+ (g_unichar_break_type): Get the break property for a char
+
+ * gunibreak.h: Autogenerated line break property tables
+
+ * gunibreak.c (g_unichar_break_type): added
+
+ * Makefile.am (EXTRA_DIST): dist gen-unicode-tables.pl
+
+ * Makefile.am (libglib_1_3_la_SOURCES): Add gunibreak.h, gunibreak.c
+
+ * gen-unicode-tables.pl: Include the script to update the unicode
+ char tables
+
+2000-11-28 Elliot Lee <sopwith@redhat.com>
+
+ * gmarkup.c: Fix warnings.
+
+ * guniprop.c, gunidecomp.c: Make warnings go away by using
+ GPOINTER_TO_INT() instead of (int).
+
+ * gcompletion.[ch]: Add g_completion_set_compare(),
+ to allow (for example) using case-insensitive completion.
+
+2000-11-28 Tor Lillqvist <tml@iki.fi>
+
+ Patches by Hans Breuer:
+
+ * gspawn-win32.c: Move the code for gspawn-win32-helper to its own
+ file.
+
+ * makefile.{mingw,msc}.in: Change accordingly.
+
+ * gspawn-win32-helper.c: New file.
+
+ * Makefile.am (EXTRA_DIST): Add it.
+
+ * gmarkup.c (find_current_text_end): Fix assertion not to check an
+ uninitialised variable.
+
+2000-11-28 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread.c: Set the thread data before locking the mutex, because
+ the locking call might use g_thread_self ().
+
+ * gthread.h: Do only show the location of the locking/unlocking
+ for -DG_ERRORCHECK_MUTEXES and not the name of the mutex. Add the
+ errorcheck capability for g_cond_wait and g_cond_timed_wait as
+ well.
+
+2000-11-27 Havoc Pennington <hp@redhat.com>
+
+ * gthread.h: Add void in empty function arg list
+
+2000-11-22 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.{mingw,msc}.in: Add gqsort.
+
+ * glib.def: Update.
+
+2000-11-21 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Add a surrogate for thread priorities using PID
+ niceness for systems with no thread priorities and different PIDs
+ for threads of the same process (most notably: Linux). Define
+ G_THREAD_USE_PID_SURROGATE in that case, as used by
+ gthread-posix.c. Also make the system thread bigger by
+ sizeof (long) to contain the thread's PID.
+
+ * gfileutils.c: Include stdlib.h for mkstemp prototype.
+
+ * gthread.c: Add priority range checks to the affected functions.
+
+ * gthreadpool.c: Remove unused variable.
+
+Mon Nov 20 18:55:17 2000 Jonathan Blandford <jrb@redhat.com>
+
+ * gtree.[hc]: Patch from David Benson <daveb@idealab.com> to add
+ user_data support to gtree functions.
+
+Mon Nov 13 18:35:52 2000 Jonathan Blandford <jrb@redhat.com>
+
+ * gtypes.h (GCompareFuncData): new func type to let you use user
+ data when comparing nodes.
+
+ * gslist.c (g_list_sort_with_data): new function to sort with
+ user_data.
+
+ * glist.c (g_list_sort_with_data): new function to sort with
+ user_data.
+
+ * garray.[ch]: Added convenience functions to sort arrays.
+
+2000-11-16 Havoc Pennington <hp@redhat.com>
+
+ * guniprop.c (g_unichar_isspace): Use a switch here, maybe helps
+ the compiler optimize things. Also, ' ' is a SPACE_SEPARATOR,
+ so don't special case it.
+
+2000-11-17 Tor Lillqvist <tml@iki.fi>
+
+ * glib.def: Add g_trash_stack entry points.
+
+Fri Nov 17 15:43:00 2000 Owen Taylor <otaylor@redhat.com>
+
+ * Released 1.3.2
+
+ * NEWS: Update.
+
+ * tests/Makefile.am (dist-hook): Add code to distribute
+ markup test files.
+
+2000-11-15 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Check for the sched.h header and include it on
+ gthread/gthread-posix.c if available.
+
+ * configure.in: Add -D_POSIX4_DRAFT_SOURCE to
+ GTHREAD_COMPILE_IMPL_DEFINES. Also add -D_POSIX4A_DRAFT10_SOURCE
+ to G_THREAD_CFLAGS. Really deploy GTHREAD_COMPILE_IMPL_DEFINES,
+ when searching for thread libs. Look for sched_* functions in
+ -lrte as well. All of that is necessary on DG/UX.
+
+ * configure.in: Use AC_TRY_COMPILE instead of AC_EGREP_HEADERS in
+ various places to make it work more reliable, to make it accept
+ macros instead of functions etc.
+
+ * configure.in: Replace some NULL's for checks with 0 to make it
+ work without stdio.h everywhere.
+
+ * configure.in, gutils.c: changed the test for getpwuid_r to first
+ test for a posix version and then for a non-posix version. No code
+ change in gutils.c. Again this change deals better with getpwuid_r
+ being a macro and not a function. Most of the above with kind help
+ from Tethys <tet@isengard.europe.dg.com>. This fixes Bug #13403.
+
+2000-11-14 Tor Lillqvist <tml@iki.fi>
+
+ * gwin32.h: Make #endif comment match #ifdef.
+
+Mon Nov 13 14:00:20 2000 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Up version to 1.3.2
+
+ * gconvert.h (enum GConvertError): Remove trailing ,
+
+ * gfileutils.c (g_file_open_tmp): Fix comment to
+ properly describe return value.
+
+2000-11-13 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32.in: Add USE_LIBICONV.
+
+ * gconvert.c: Check G_OS_WIN32 only after including glib.h.
+
+ * glib.def: Update.
+
+2000-11-13 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread.c (g_static_rec_mutex_*): Made recursive mutexes also
+ work when the thread system is not (yet) initialized.
+
+Sun Nov 12 18:34:32 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gconvert.[ch]: Create wrapper functions for iconv()
+ so that we can transparently use the native iconv,
+ libiconv, or (in the future) a mini-iconv included
+ with glib.
+
+ * glib-config-2.0.in glib-2.0.pc.in: Include @ICONV_LIBS@
+
+ * INSTALL: Added note about libiconv.
+
+ * configure.in: Add checks for libiconv from pango. If
+ EILSEQ is not defined in errno.h add define for it into
+ glibconfig.h so g_iconv can use it. (Note, recompiling
+ from a system without EILSEQ to a system with EILSEQ
+ will break binary compatibility)
+
+2000-11-12 Robert Brady <robert@suse.co.uk>
+
+ * gstrfuncs.c, gstrfuncs.h: Remove g_filename_{to,from}_utf8
+
+ * gconvert.c, gconvert.h: Add g_filename_{to,from}_utf8 and
+ g_locale_{to.from}_utf8. The locale_ variant honours
+ nl_langinfo(CODESET), the filename_ variant uses UTF-8 unless
+ asked otherwise.
+
+ (g_convert): Add G_CONVERT_ERROR_PARTIAL_INPUT error, if bytesread
+ != length and no bytesread pointer passed.
+
+Sun Nov 12 15:29:53 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gfileutils.[ch]: template is a reserved word in
+ C++ s/template/tmpl/.
+
+2000-11-11 Havoc Pennington <hp@pobox.com>
+
+ * gmarkup.c (g_markup_parse_context_parse): Handle a long stream
+ of bytes containing no UTF-8 character starts
+
+2000-11-11 Tor Lillqvist <tml@iki.fi>
+
+ * glib.def: Add missing entry points.
+
+ * gfileutils.c (g_mkstemp): Improve chance to generate unique
+ names with less effort a bit.
+
+ * gfileutils.h: Add g_file_open_tmp() declaration.
+
+ * testglib.c: Include <io.h> on Win32.
+
+ * makefile.mingw.in: Correct the way to invoke sub-makes.
+
+Sun Nov 5 13:20:54 2000 Owen Taylor <otaylor@redhat.com>
+
+ * glib-object.h: Add gtypemodule.h
+
+2000-11-11 Tor Lillqvist <tml@iki.fi>
+
+ * gfileutils.c (g_file_open_tmp): New function, suggested by Havoc
+ earlier this month.
+ (g_mkstemp): Use only one case for letters in temp file name, as
+ this will be used on systems with case-insensitive file systems.
+
+ * testglib.c (main): Test g_mkstemp() and g_file_open_tmp().
+
+2000-11-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthreadpool.c: Don't take other threads with other priorities
+ into account as changing the priority is highly
+ unportable. (Actually using it at all already is unportable, but
+ even sometimes where that works, changing priority is not
+ possible).
+
+2000-11-05 Havoc Pennington <hp@pobox.com>
+
+ * gmarkup.h: rename G_MARKUP_FOO to
+ G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG
+
+ * gmarkup.c: don't start doc comments with "Returns"
+
+2000-11-05 Havoc Pennington <hp@pobox.com>
+
+ * gmarkup.c: inline docs
+ (unescape_text): properly check strtoul for failure.
+
+ * gerror.c (g_propagate_error): Free the src error if the dest
+ location is NULL - I'm pretty sure that's what this function was
+ supposed to do.
+
+2000-11-05 Havoc Pennington <hp@pobox.com>
+
+ * gutils.c (g_find_program_in_path): cleanup docs, sync param
+ names to those in the header
+
+ * gfileutils.c (g_mkstemp): clean up docs
+
+ * gshell.h: sync param names with param names in .c file
+
+ * gfileutils.h (enum GFileTest): remove trailing comma from last
+ member, confuses gtk-doc
+
+ * gmarkup.h: s/GMarkupErrorType/GMarkupError/g; to follow
+ convention
+
+2000-11-02 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gasyncqueue.c: Added documentation for asyncronous queues.
+
+ * gspawn.c: Include sys/select.h (some platforms need it for
+ select).
+
+ * gspawn.c: Changed unportable __FUNCTION__ to the verbatim
+ function name.
+
+2000-10-31 Tor Lillqvist <tml@iki.fi>
+
+ * gutils.c
+ * gutils.h
+ * gfileutils.c
+ * gfileutils.h: Actually, g_mkstemp() is better suited in gfileutils.
+
+2000-10-30 Tor Lillqvist <tml@iki.fi>
+
+ * configure.in: Check for mkstemp.
+
+ * gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call
+ it, otherwise use code lifted from glibc.
+
+ * gutils.h: Declare it.
+
+ * glib.def: Here, too. Plus two missing functions.
+
+2000-10-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h:
+ Introduced new function type GEqualFunc to return TRUE for equal
+ params. This is now used instead of GCompareFunc (which should
+ work akin to strcmp) here. This kind of fixes Bug #14412. Note
+ that technically GCompareFunc and GEqualFunc are still the same
+ types, as gint == gboolean.
+
+ * ghash.h, gutils.c: g_int_equal and g_direct_equal now return
+ gboolean to be really become GEqualFunc.
+
+ * gscanner.c, testglib.c, tests/hash-test.c: Some tiny changes to
+ follow the above change.
+
+2000-10-27 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.{mingw,msc}.in (glib_OBJECTS): Add gmarkup.
+
+ * glib.def: Add missing functions.
+
+ * tests/makefile.{mingw,msc}.in (TESTS): Add markup-test.
+
+2000-10-24 Havoc Pennington <hp@pobox.com>
+
+ * gmarkup.h, gmarkup.c: New module to parse a simple
+ markup language
+
+ * Makefile.am: add gmarkup.h, gmarkup.c
+
+ * tests/Makefile.am: add markup-test
+
+ * gstring.h (g_string_new_len): new function to create a string
+ with a length
+ (g_string_new): avoid a gratuitous realloc
+
+2000-10-26 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.{mingw,msc}.in: Cosmetics.
+
+2000-10-26 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gstrfuncs.c (g_strsplit): When the string is ended by a
+ delimiter, return an extra empty string just like for a delimiter
+ at the start of the string. This makes the function behave more
+ consistent and also fixes Bug #15026.
+
+Tue Oct 24 22:09:14 2000 Tim Janik <timj@gtk.org>
+
+ * glib-object.h: added newly added gobject/ headers.
+
+ * gmesage.c: print g_message() output to stderr instead of stdout.
+
+2000-10-23 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Use one = instead of two, which is plainly wrong.
+
+2000-10-19 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.msc.in: Pass -DGSPAWN_HELPER when building it. Link
+ with user32.lib.
+
+ * gspawn-win32.c
+ * gfileutils.c: Make them compile with picky MSVC.
+
+ * gwin32.h: New file. Move Win32-only stuff that isn't related to
+ GIOChannels here from giochannel.h.
+
+ * Makefile.am: Add it here.
+
+ * giochannel.h: Move stuff to gwin32.h.
+
+ * glib.h: On Win32, include gwin32.h.
+
+Mon Sep 11 10:03:24 2000 Owen Taylor <otaylor@redhat.com>
+
+ * glib.h convert.c (g_convert_with_fallback): Change
+ ERROR_OTHER to ERROR_FAILED, add some dummy marking with _().
+
+ * docs/reference/glib/glib-sections.txt
+ docs/reference/glib/glib-docs.sgml Update for g_convert,
+ g_unicode_validate.
+
+2000-10-16 Tor Lillqvist <tml@iki.fi>
+
+ * glibconfig.h.win32.in: Remove alloca stuff from here. galloca.h
+ takes care of it, correctly.
+
+ * giowin32.c (reader_thread): Some more debugging output.
+ (g_io_channel_win32_poll): Remove unused vars.
+
+ * gfileutils.c: Changes for Win32, with no unistd.h and no
+ S_ISLNK().
+
+ * gspawn-win32.c: Implementation of the g_spwan_* functions for
+ Win32. Due to the general non-Unixness of Win32, much of the
+ functionality that is relatively clean to implement on Unix, is
+ hard to do on Win32. We must use a separate helper program to
+ change directory, close extra file descriptors, redirect the std
+ ones, as needed, and only then start the child process. No child
+ process pid can be returned, unfortunately. Or if we used
+ CreateProcess directly, it probably could. (Now we use the spawnv*
+ functions from msvcrt.)
+
+ * Makefile.am (EXTRA_DIST): Add gspawn-win32.c
+
+ * glib.def: Add new entry points.
+
+ * glib.def
+ * giowin32.c: Remove g_io_channel_win32_wait_for_condition(),
+ g_io_channel_win32_poll() subsumes it.
+
+ * gbacktrace.h: G_BREAKPOINT for MSVC (on the ix86).
+
+ * gwin32.c (g_win32_getlocale): Use "sp" for
+ LANG_CROATIAN+SUBLANG_SERBIAN_LATIN.
+
+ * makefile.{mingw,msc}.in (glib_OBJECTS): Add new files.
+ Add gspawn-win32-helper.exe rule.
+
+ * tests/makefile.{mingw,msc}.in (TESTS): Add shell-test and
+ spawn-test.
+
+ * tests/spawn-test.c: (run_tests): On Win32, don't try to run
+ /bin/sh, but ipconfig (no special significance in choosing that,
+ just a program that outputs something to stdout).
+
+2000-10-15 Raja R Harinath <harinath@cs.umn.edu>
+
+ Remove need for acconfig.h, and misc. cleanups.
+ * acglib.m4 (GLIB_SIZEOF): Add 'autoheader' comment to
+ AC_DEFINE_UNQUOTED.
+ (GLIB_BYTE_CONTENTS): Likewise.
+
+ * configure.in: Add 'autoheader' comments to all AC_DEFINE(...)
+ and AC_DEFINE_UNQUOTED(...) lines.
+ Replace AC_MSG_CHECKING/AC_CACHE_VAL with AC_CACHE_CHECK.
+ (AM_PROG_LIBTOOL): Move after AC_PROG_CC.
+
+ * acconfig.h: Empty out.
+
+ * Makefile.am (BUILT_EXTRA_DIST): New variable. List 'dist'able
+ files that are created in the builddir.
+ (dist-hook): Handle those files.
+ (libglib_1_3_la_SOURCES): Remove @ALLOCA@. @ALLOCA@ should only
+ be used in an _LDADD or _LIBADD, since it expands (if necessary)
+ to 'alloca.o'.
+
+ * tests/Makefile.am (BUILT_EXTRA_DIST): New variable.
+ (dist-hook): Handle $(BUILT_EXTRA_DIST).
+
+2000-10-13 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * grand.c: Added inline documentation.
+
+ * gtypes.h, gnode.h, gutils.h: Readded GFreeFunc,
+ g_node_insert_after and g_find_program_in_path resp., which
+ mysteriously disappeared during the glib.h dissection.
+
+2000-10-12 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glibconfig.h.win32.in: Adapted accordingly to header separation
+ and GLIB_HAVE_ALLOCA_H renaming.
+
+ * Makefile.am: Added the new headers to glibinclude_HEADERS.
+
+ * glib.h: Forgot to include gerror.h.
+
+ * glib.h, galloca.h, garray.h, gasyncqueue.h, gbacktrace.h,
+ gcache.h, gcompletion.h, gconvert.h, gdataset.h, gdate.h, ghash.h,
+ ghook.h, giochannel.h, glist.h , gmacros.h, gmain.h, gmem.h,
+ gmessages.h, gnode.h, gprimes.h, gquark.h, gqueue.h, grand.h,
+ grel.h, gscanner.h, gslist.h, gstrfuncs.h, gstring.h, gthread.h,
+ gthreadpool.h, gtimer.h, gtree.h, gtypes.h, gutils.h: Split glib.h
+ into many header files mostly according to the resp. *.c-files.
+
+ * gmacros.h: Added G_BEGIN_DECLS and G_END_DECLS to mean: 'in case
+ of C++: extern "C" { ... }' analogous to glibc __BEGIN_DECLS and
+ __END_DECLS.
+
+ * configure.in, gerror.h, gfileutils.h, gshell.h, gspawn.h,
+ gunicode.h, : Changed guard-macro names to something more
+ consistent.
+
+ * configure.in, *.h: Use G_BEGIN_DECLS and G_END_DECLS.
+
+ * configure.in: Defined GLIB_HAVE_ALLOCA_H instead of including
+ alloca.h in glibconfig.h, GLIB_HAVE_ALLOCA_H is used in glib.h.
+
+ * configure.in: Removed cruft from old threading code.
+
+2000-10-09 Raja R Harinath <harinath@cs.umn.edu>
+
+ Work with beta autoconf 2.50.
+ * configure.in (GLIB_MAJOR_VERSION): Use GLIB_DIVERT_BEFORE_HELP
+ instead of AC_DIVERT_PUSH(),AC_DIVERT_POP.
+ (AC_CHECK_HEADERS): Remove redundant AC_DEFINE(HAVE_...).
+ (REALLOC_0_WORKS): Move AC_DEFINE outside AC_CACHE_VAL.
+ (dlopen): Quote nested AC_CHECK_... calls.
+
+ * acglib.m4 (GLIB_TR_SH, GLIB_TR_CPP): Utility macros copied from
+ beta autoconf 2.50.
+ (GLIB_DIVERT_BEFORE_HELP): New macro that works both with autoconf
+ 2.13 and beta autoconf 2.50.
+ (GLIB_SIZEOF, GLIB_BYTECONTENTS): Use GLIB_TR_*.
+
+ * Makefile.am (CONFIGURE_DEPENDENCIES): Use this to specify
+ that 'configure' depends on acglib.m4.
+
+2000-10-09 Havoc Pennington <hp@redhat.com>
+
+ * Makefile.am, tests/Makefile.am: Add new files.
+
+ * tests/spawn-test.c, tests/shell-test.c: new tests for
+ the shell/spawn stuff
+
+ * gutils.c (g_find_program_in_path): convert a relative
+ program name into an absolute pathname to an existing
+ executable
+
+ * gspawn.h, gspawn.c: New fork/exec API
+
+ * gshell.h, gshell.c: Shell-related utilities, at the moment
+ simply routines to parse argv and quote/unquote strings
+
+ * guniprop.c (g_unichar_isspace): Return TRUE for the
+ ASCII space characters isspace() returns TRUE for.
+
+ * gfileutils.c (g_file_get_contents): Convenience function
+ to slurp entire file into a string and return it. Partially
+ written by Joel Becker.
+ (g_file_test): file test function
+
+2000-10-06 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.msc.in: Revamp to be like makefile.mingw.in, make
+ the MSVC build actually work again.
+
+ * gmodule/makefile.msc.in
+ * gobject/makefile.msc.in
+ * gthread/makefile.msc.in: New files, like their mingw counterparts.
+
+ * gmodule/Makefile.am
+ * gobject/Makefile.am
+ * gthread/Makefile.am: Make and distribute them.
+
+ * */makefile.mingw.in: Allow override of GLib version number from
+ the build/win32/module.defs file.
+
+ * glib.def: Add new entry point.
+
+ * tests/gio-test.c (main): Fix the Win32-only code to use current
+ API, g_io_channel_win32_make_pollfd() and g_io_channel_win32_poll().
+
+ Fixes from Hans Breuer:
+
+ * glib.h (struct DIR): Keep the last readdir result cached inside
+ the DIR struct, to enable several DIRs being open simultaneously.
+
+ * gwin32.c (g_win32_readdir): Use the above instead of static.
+
+ * giowin32.c (g_io_channel_win32_make_pollfd): Insert cast to keep
+ MSVC happy.
+
+2000-10-05 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib.h: Changed alloca stuff a bit: when we have a working
+ alloca.h, we're not messing with alloca any further. Should fix a
+ bug reported by Bernd Demian <wega@csc-dd.de>.
+
+2000-09-29 Jonathan Blandford <jrb@redhat.com>
+
+ * gnode.c (g_node_insert_after): Added function to keep symmetry
+ with g_node_insert_before.
+
+2000-09-29 Martin Baulig <baulig@suse.de>
+
+ Several minor ANSI C fixes.
+
+ Added missing casts:
+ * gdate.c (g_date_fill_parse_tokens): `s = (guchar *) str'.
+ * gmain.c (g_idle_dispatch): `func = (GSourceFunc) source_data'.
+ (g_idle_add_full): `(gpointer) function' in call to g_source_add().
+ * gstrfuncs.c (g_strdown): `s = (guchar *) string' and
+ `return (gchar *) string'.
+ (g_strup): Likewise.
+ (g_strchug): `start = (guchar*) string' in 1st for() argument;
+ `strlen ((gchar *) start)' in call to g_memmove().
+ * gstring.c (g_string_down): `s = (guchar *) string->str'.
+ (g_string_up): Likewise.
+ * gthreadpool.c (stop_this_thread_marker):
+ `(gpointer) &g_thread_pool_new'.
+ * gunidecomp.h (decomp_table[]): Cast all the strings to
+ `unsigned char *'.
+
+ Put text following #endif into comments:
+ * gmain.c: here.
+
+2000-09-29 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in, glib.h: Added errorcheck mutexes. These are
+ activated through the preprocessor symbol
+ G_ERRORCHECK_MUTEXES. Need to add an extra word to StaticMutex in
+ order to achieve this. g_(static_)mutex_* functions instrument the
+ mutex operations with mutex name and location, when compiled with
+ -DG_ERRORCHECK_MUTEXES. g_thread_init activates the errorcheck
+ mutexes, when compiled with -DG_ERRORCHECK_MUTEXES.
+
+2000-09-28 Havoc Pennington <hp@pobox.com>
+
+ * glib.h (GThreadPriority): fix indentation
+ (GConvertError): generic error is conventionally called
+ _FAILED rather than _OTHER, at least at the moment,
+ according to GError docs in docs/reference.
+
+ * gconvert.c: s/_OTHER/_FAILED/
+
+2000-09-28 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Adjusted the test for an unimplemented
+ getpwuid_r. Info from Michael Pruett. This is just a forward
+ merge from glib-1-2.
+
+ * configure.in: Moved determination of G_THREAD_FLAGS before
+ G_THREAD_LIBS. Check for UnixWare systems and set the right cflags
+ and libs there (it needs -Kthread for the native compiler and
+ -pthread for gcc). Thanks to Boyd Lynn Gerber <gerberb@zenez.com>
+ for the info.
+
+ * configure.in: Fail immediately, when no thread library is found,
+ instead of continuing searching for rt libs etc. Changed almost
+ all occurances of $enable_threads to $have_threads, as that's,
+ what we want.
+
+ * tests/threadpool-test.c: Define vars inside the guard to avoid
+ warnings.
+
+ * configure.in, tests/type-test.c: Some platforms support 64 bit
+ 'long long', but you can not printf or scanf them. In that case,
+ don't define G_G{UINT|INT}64_FORMAT. Changed the type-test program
+ to reflect that.
+
+ * gutils.c (g_get_current_dir): max_len can't be initialized
+ statically as it might call a function. So do it at first call.
+
+Tue Sep 26 2000 Elliot Lee <sopwith@redhat.com>
+
+ * glib.h: Add G_GNUC_PURE macro (but don't use it anywhere).
+
+Mon Sep 25 2000 Elliot Lee <sopwith@redhat.com>
+
+ * garray.c, glib.h, gmem.c: Add a few missing G_GNUC_CONST's.
+
+2000-09-21 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.mingw.in: Add gconvert.o. Use libiconv.
+
+ * config.h.win32.in: Define HAVE_GETCWD.
+
+ * glib.def: Add new entry points.
+
+2000-09-21 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: The last released automake (1.4) still requires
+ AM_PROG_LIBTOOL instead of AC_PROG_LIBTOOL, so use that for the
+ time being.
+
+2000-09-19 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * acconfig.h, configure.in, gutils.c: Test for the existence of
+ getcwd, and use it only when found.
+
+ * glib.h: Only use the gcc-variable-macro-argument-extension for
+ gcc >= 2.4. Both patches from Jonas Oberg <jonas@gnu.org>.
+
+Mon Sep 18 10:58:21 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gutf8.c: Implement g_ucs4_to_utf8 which was in
+ the header file but not implemented.
+
+Sun Sep 17 2000 Elliot Lee <sopwith@redhat.com>
+
+ * glib.h configure.in: Define g_alloca() as an
+ alloca-that-works-anywhere.
+
+ * gconvert.c: Fix warnings which could have caused problems on
+ 64-bit platforms.
+
+Sun Sep 10 12:37:40 2000 Owen Taylor <otaylor@redhat.com>
+
+ * glib.h gconvert.c (g_convert): Havoc Pennington's implementation
+ of convenient character set conversion using iconv, with
+ the addition of GError. We probably need a fallback that
+ just does conversions between, say UTF-8,16,32 and ISO-8859-1
+ for targets without iconv at all.
+
+ Also add g_convert_with_fallback() to take care of conversions
+ where we accept some loss going to the target encoding.
+
+2000-09-10 Havoc Pennington <hp@redhat.com>
+
+ * gutf8.c (g_utf8_validate): Add this function.
+
+Sat Sep 9 18:50:42 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gstrfuncs.c (g_strescape): Add a missing g_return_if_fail().
+
+Mon Aug 21 03:57:46 2000 Tim Janik <timj@gtk.org>
+
+ * glib.h (G_BREAKPOINT): for non-i386 and non-alpha, or non gcc,
+ implement BREAKPOINT() as raise (5 /* SIGTRAP */);
+
+ * glib.h: provide user-definable switch G_IMPLEMENT_INLINES,
+ to turn on compilation of inline function implementations provided
+ in header files with extern linkage.
+ wrap inline function implementations into ifdef __G_UTILS_C__, so we
+ really only compile them for gutils.c and not also into arbitrary user
+ code that wants to make use of G_IMPLEMENT_INLINES.
+ adjusted comment apropriately.
+
+ * gutils.c: to turn on compilation of inline functions, provide
+ #define G_IMPLEMENT_INLINES 1 and #define __G_UTILS_C__.
+
+2000-09-06 Havoc Pennington <hp@redhat.com>
+
+ * gerror.c: docs
+
+ * docs/reference/glib/tmpl/error_reporting.sgml: docs
+
+Wed Sep 6 10:28:34 2000 Owen Taylor <otaylor@redhat.com>
+
+ * guniprop.c gunicode.h gutf8.c: Some inline docs fixes.
+
+2000-09-06 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib.h, gtimer.c, tests/thread-test.c:
+ s/G_MICROSEC/G_USEC_PER_SEC/
+
+ * glib.h: Removed G_G{U}{SHORT|INT|LONG}_FORMAT from glib.h, as
+ they are really superfluous.
+
+Tue Sep 5 20:16:27 2000 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in docs/Makefile.am: Add gtk-doc checks
+ for newly added docs/reference/ subdir.
+
+2000-09-05 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread.c (g_thread_error_quark): Don't use a G_LOCK, as it
+ isn't necessary.
+
+2000-09-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gstring.c (g_string_free): Use g_return_val_if_fail instead of
+ g_return_if_fail, as the function now is supposed to return
+ something.
+
+ * gerror.c, gerror.h (g_propagte_error): Added function
+ g_propagte_error to hand over local errors to the calling
+ function.
+
+ * glib.h: Include gerror.h before it is used for some g_thread_*
+ functions.
+
+ * gthread.c, gthreadpool.c, glib.h: Enable error reporting for
+ thread creation, namely for g_thread_create, g_thread_pool_new,
+ g_thread_pool_push and g_thread_pool_set_max_threads.
+
+ * tests/thread-test.c, tests/threadpool-test.c: Adapted
+ accordingly.
+
+2000-08-31 Tor Lillqvist <tml@iki.fi>
+
+ * glib.h
+ * glib.def
+ * giowin32.c (g_io_channel_win32_make_pollfd): New function, to
+ make a GPollFD from a GIOChannel. Creates the events and starts
+ the reader thread if necessary.
+
+ * glib.h
+ * giowin32.c (g_io_channel_win32_poll): No use for separate
+ condition parameter.
+
+ * gmain.c (g_get_current_time): (Win32): Simplify, use
+ GetSystemTimeAsFileTime().
+
+2000-08-27 Tor Lillqvist <tml@iki.fi>
+
+ * giowin32.c (g_io_channel_win32_poll): New function, otherwise
+ like g_io_channel_win32_wait_for_condition(), but accept several
+ GPollFDs.
+ (g_io_channel_win32_wait_for_condition): Call
+ g_io_channel_win32_poll().
+
+ * glib.h: Declare g_io_channel_win32_poll().
+
+ * gwin32.c (g_win32_error_message): Don't believe return value
+ from FormatMessage.
+
+2000-08-25 Elliot Lee <sopwith@redhat.com>
+
+ * glib.h, gunicode.h, gmodule/gmodule.h:
+ Mark the following functions G_GNUC_CONST (to allow optimization)
+ because their results are a function of only their parameters:
+ g_int_hash, g_int_equal, g_direct_hash, g_direct_equal,
+ g_quark_to_string, g_date_is_leap_year, g_date_days_in_month,
+ g_date_monday_weeks_in_year, g_date_sunday_weeks_in_year,
+ g_spaced_primes_closest, g_unichar_is*, g_unichar_to*,
+ g_unichar_*digit_value, g_unichar_type
+
+2000-08-21 Elliot Lee <sopwith@redhat.com>
+
+ * gobject/Makefile.am, gobject/gobject-query.c,
+ gobject/gparamspecs.c: Fix inclusion of config.h
+
+Mon Aug 21 14:46:23 2000 Owen Taylor <otaylor@redhat.com>
+
+ * tests/gio-test.c: Fix a couple of trivial bugs that
+ were causing warnings.
+
+Mon Aug 21 14:39:36 2000 Owen Taylor <otaylor@redhat.com>
+
+ * glib.h: Use C99 varargs macros where possible
+ (check __STDC_VERSION__), otherwise, on gcc, use an alternate
+ form of gcc varargs which is more likely
+ to be supported going forward. (Based on some code
+ from Raja Harinath)
+
+2000-08-17 Darin Adler <darin@eazel.com>
+
+ * glib.h:
+ * garray.c: (g_array_free), (g_ptr_array_free),
+ (g_byte_array_free): Return the data left behind.
+ * gstring.c: (g_string_free): Return the data left behind.
+
+ Changed the free calls that leave data behind so they
+ return a pointer to the left-behind data, NULL if told not
+ to leave anything behind. This makes these calls easier
+ to use correctly, without any incompatible API change for
+ callers that don't know about the return value. Of course,
+ it would be even clearer if the free calls weren't dual-purpose
+ in the first place.
+
+2000-08-12 Tor Lillqvist <tml@iki.fi>
+
+ * giowin32.c: Some indentation and spacing fixes. Add some more
+ logging.
+ (g_io_win32_add_watch): New function, with common code from
+ g_io_win32_fd_add_watch and g_io_win32_sock_add_watch. Don't start
+ more than one reader thread for a GIOChannel. We should obviously
+ have just one reader thread reading a file descriptor or socket.
+
+2000-08-10 Havoc Pennington <hp@redhat.com>
+
+ * gthread-2.0.pc.in (Cflags): don't duplicate glib Cflags
+
+ * gmodule-2.0.pc.in (Cflags): don't duplicate glib Cflags
+
+ * gobject-2.0.pc.in (Cflags): don't duplicate Cflags from glib
+ itself
+
+2000-08-10 Havoc Pennington <hp@redhat.com>
+
+ * glib-2.0.pc.in (Cflags): Look in glib-2.0/include for
+ glibconfig.h
+
+2000-08-07 Tor Lillqvist <tml@iki.fi>
+
+ * tests/gio-test.c (shutdown_source): New function, that calls
+ g_source_remove(). Check return value of g_source_remove(), and
+ decrement running subprocess counter only if g_source_remove()
+ actually did remove the source.
+
+ (recv_message): Call shutdown_source() on EOF condition. Return
+ FALSE on G_IO_HUP and G_IO_ERR condition. Fix printf format typo.
+
+Sun Aug 6 20:06:02 2000 Tim Janik <timj@gtk.org>
+
+ * gmessages.c (g_log_domain_check_free): keep *last updated while
+ running through the domain list, so we don't screw up the removal,
+ patch provided by Gady Kozma <gadykozma@hotmail.com>.
+
+Sun Aug 6 20:03:41 2000 Tim Janik <timj@gtk.org>
+
+ * gmessages.c (g_log_remove_handler): keep *last updated while running
+ through the handler list, so we don't screw up the removal.
+
+Sun Jul 30 16:54:13 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gunicode.h: Fix stray character
+
+ * gutf8.c (g_unichar_to_utf8): Allow outbuf to be NULL, in
+ which case we just compute the length.
+
+2000-07-31 Havoc Pennington <hp@redhat.com>
+
+ * Makefile.am (EXTRA_DIST): forgot to add .pc.in to EXTRA_DIST
+
+2000-07-31 Havoc Pennington <hp@redhat.com>
+
+ * glib-2.0.pc.in, gobject-2.0.pc.in, gmodule-2.0.pc.in,
+ gobject-2.0.pc.in: pkg-config data files
+
+ * Makefile.am: Install/dist the .pc files
+
+ * configure.in: Output the .pc files
+
+2000-07-31 Tor Lillqvist <tml@iki.fi>
+
+ * giowin32.c (buffer_read): The code didn't compile (must
+ have been sleepy when committing). "return" instead of "break"
+
+ (g_io_win32_fd_add_watch): Cannot check if the file descriptor is
+ readable by calling ReadFile to read zero bytes. ReadFile blocks
+ on NT even if trying to read nothing at all. So, don't check if
+ file descriptor is readable; assume this function isn't called
+ otherwise.
+
+Sun Jul 30 10:44:16 2000 Tim Janik <timj@gtk.org>
+
+ * gmain.c (g_get_current_time): fix tor's recent changes which
+ got rid of a required variable in the non-windows path.
+
+2000-07-30 Tor Lillqvist <tml@iki.fi>
+
+ Finally, a new and improved IO Channel and condition watch
+ implementation for Win32. Based on code provided by Craig Setera.
+
+ When watching file descriptors, for which there is no select()
+ like functionality on Win32 that would work on all Win32 platforms
+ for all types of file descriptors (including anonymous pipes), we
+ start a new thread that blocks while trying to read from the file
+ descriptor. When the read returns, a Win32 Event is signalled that
+ the polling routine eventually notices. Meanwhile, the data being
+ read is stored in a circular buffer, from where the IO channel's
+ read() method picks it up.
+
+ If the buffer fills up the reading thread has to wait for space
+ becoming available. For this another Win32 Event is used. The IO
+ Channel's read() method signals this when it has read some data
+ out of the buffer.
+
+ The separate reader thread(s), and the circular buffer(s) with
+ associated events mean lots of possibilities for fun parallelism
+ errors. But it seems to work OK, i.e. GIMP runs.
+
+ * gmain.c: Small changes to the Win32 polling function.
+ (g_main_win32_get_poll_func): New function. Perhaps it would be a
+ good idea to provide this on all platforms.
+
+ * giowin32.c: The bulk of the new implementation.
+ (g_io_channel_win32_wait_for_condition): New function. To be used
+ where on Unix one does a select() on the channel's fd, like
+ libgimp's gimp_extension_process(). Could be provided on all
+ platforms.
+
+ * glib.h: Update documentation for IO Channels on Win32. Remove
+ the declarations for the as of now obsolete old functions related
+ to IO Channels for pipes with "wakeup" messages.
+
+ * glib.def: Some new functions.
+
+ * tests/gio-test.c: New file, to test GIOChannel and main loop.
+
+ * tests/Makefile.am
+ * tests/makefile.mingw.in: Add it.
+
+ (Later the same night:)
+
+ * giowin32.c: Compile in the debugging code all the time, but only
+ output debug messages if told so. Add (unadvertised) function to
+ turn on/off debug messages for a channel.
+
+ (buffer_read): Don't loop. It is expected behaviour to return a
+ short read occasionally, for instance when reading from
+ pipes. It's the calling code that should loop if it *knows* how
+ much the writer has written.
+
+ * tests/gio-test.c: Correct the program's name in the output.
+ (recv_message): Loop calling g_io_channel_read() (in a new
+ function read_all()) until we have all the bytes we want (that we
+ know the writer has written/will write).
+
+Thu Jul 27 05:15:11 2000 Tim Janik <timj@gtk.org>
+
+ * gstrfuncs.c (g_strlcpy, g_strlcat): completed tor's fix
+ to cover both #ifdef branches.
+
+2000-07-26 Tor Lillqvist <tml@iki.fi>
+
+ * gstrfuncs.c (g_strlcpy, g_strlcat): Return 0 on error, not NULL.
+
+ * glib.def: Add g_strlcpy, g_strlcat.
+
+ * glibconfig.h.win32.in: Add gsize and gssize.
+
+Wed Jul 26 12:59:31 2000 Tim Janik <timj@gtk.org>
+
+ * *.[hc]: applied patch from Andreas Persenius <ndap@swipnet.se> that
+ updates the license headers to the GNU Lesser General Public License,
+ as well as updating the copyright year to 2000.
+
+Wed Jul 26 05:47:48 2000 Tim Janik <timj@gtk.org>
+
+ * configure.in:
+ * testglib.c:
+ * gstrfuncs.c:
+ * glib.h: added g_strlcat() and g_strlcpy() wrappers, supplied by
+ David Wheeler <dwheeler@ida.org>:
+
+ * glib.h, gstrfuncs.c: added g_strlcpy and g_strlcat to support
+ safe manipulation of fixed-length string buffers.
+ These functions were originally developed by Todd Miller to simplify
+ development of security-related programs, and
+ are available on many (but not all) Unix-like systems,
+ including OpenBSD, FreeBSD, and Solaris. See
+ ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3
+ and http://www.openbsd.org/security.html.
+ If there's a strlcpy/strlcat on the system, it's called, otherwise
+ an implementation is provided.
+
+ * testglib.c: Added tests for g_strlcpy, g_strlcat.
+
+Wed Jul 26 05:03:24 2000 Tim Janik <timj@gtk.org>
+
+ * acglib.m4 (GLIB_SIZEOF): include <stdlib.h> and <stddef.h> if
+ STDC_HEADERS is defined.
+
+ * glib.h:
+ * glibconfig.h: define gsize and gssize in terms of GLIB_SIZEOF_SIZE_T
+
+ * glib.h (g_return_if_reached): applied darin's fix for copy'n
+ paste error in the macro implementation.
+
+Wed Jul 26 00:46:03 2000 Tim Janik <timj@gtk.org>
+
+ * glib.h: applied patch from Darin Adler <darin@eazel.com> which
+ supplies g_return_if_reached(), g_return_val_if_reached() and
+ g_critical().
+
+2000-07-22 Tor Lillqvist <tml@iki.fi>
+
+ * build-dll: Fix resource handling, the resource file got left out
+ from the DLL after all... Remove the WIN32APIHEADERS, not needed
+ with current windres.
+
+ * glib.def: Add new functions.
+
+2000-07-20 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gutils.c, glib.h: Mark the functions g_basename and g_dirname
+ deprecated. They will issue an warning once, when compiled with
+ G_ENABLE_DEBUG, but continue to work as before. Instead the
+ functions g_path_get_basename and g_path_get_dirname should be
+ used, which BOTH return newly allocated memory, that has to freed
+ by g_free. The new g_path_get_basename now strips trailing slashes
+ from the path. This fixes #5097. For discussion see
+ http://mail.gnome.org/pipermail/gtk-devel-list/2000-April/003139.html
+
+ * gwin32.c, testglib.c, tests/dirname-test.c: Use the new
+ functions instead of the old ones.
+
+ * ghash.c, gscanner.c, glib.h: Mark the functions
+ g_hash_table_freeze, g_hash_table_thaw and thus
+ g_scanner_freeze_symbol_table and g_scanner_thaw_symbol_table
+ deprecated. They will issue an warning once, when compiled with
+ G_ENABLE_DEBUG. This fixes Bug #3883. For discussion see
+ http://mail.gnome.org/pipermail/gtk-devel-list/2000-April/003139.html
+
+2000-07-19 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in, glib.h: glibconfig.h and glib.h now include files
+ outside of the extern "C" block. Makes some C++ compiler
+ happy. Reported by Denis Vakatov <vakatov@peony.nlm.nih.gov>.
+
+Sat Jul 15 23:49:03 2000 Owen Taylor <otaylor@redhat.com>
+
+ * glib/glib.texi: Remove incomplete start of info file -
+ real docs are in RDP.
+
+Sat Jul 15 22:44:22 2000 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Add build/Makefile and
+ build/win32/Makefile to AC_OUTPUT() so things build
+ again.
+
+Sat Jul 15 09:11:46 2000 Tim Janik <timj@gtk.org>
+
+ * gstrfuncs.c (g_strncasecmp): fixed an off by 0 error (yeah,
+ the function went off when the while (n--) loop failed due to
+ n==0 ;), reported by Jean-Louis HAMEL <jlhamel@club-internet.fr>.
+
+2000-07-15 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am (SUBDIRS): Include the "build" module in GLib, too,
+ to make it more self-contained. If your CVS client doesn't
+ automatically get it, do a cvs get build in glib.
+
+ * */makefile.mingw.in: Include make.mingw from build in the glib
+ source directory.
+
+Fri Jul 14 16:26:35 2000 Owen Taylor <otaylor@redhat.com>
+
+ * Release 1.3.1
+
+Fri Jul 14 12:22:49 2000 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in Makefile.am glib-config.m4 glib.m4: Move
+ glib-config to glib-config-2.0 move glib.m4 to
+ glib-2.0.m4
+
+ * Makefile.am gobject/Makefile.am gmodule/Makefile.am
+ gthread/Makefile.am tests/Makefile.am: Change
+ library names to libglib-1.3.la, etc, so that we
+ can distinguish glib-1.2 and glib-2.0 on the linkline.
+
+ * Makefile.am gobject/Makefile.am gmodule/Makefile.am:
+ Move include files into /usr/include/glib-2.0.
+
+Thu Jul 6 18:54:49 2000 Owen Taylor <otaylor@redhat.com>
+
+ * docs/Makefile.am (EXTRA_DIST): Remove info files
+ from the build.
+
+2000-07-14 Tor Lillqvist <tml@iki.fi>
+
+ * glib.def: Add g_error functions.
+
+ * makefile.mingw.in: Add gbacktrace.o.
+
+ * gbacktrace.c: No need to include <process.h>.
+
+2000-07-12 Havoc Pennington <hp@redhat.com>
+
+ * glib.h: #include <gerror.h>
+
+ * Makefile.am (include_HEADERS): Add gerror.h
+ (libglib_la_SOURCES): Add gbacktrace.c
+
+ * gbacktrace.c: Move g_on_error_query() in here (moved on the
+ server, so history is preserved)
+
+ * gerror.h: GError interface
+
+ * gerror.c: GError implementation replaces stuff that's now in
+ gbacktrace.c
+
+Sun Jul 9 21:20:45 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gunicode.h: Include stddef.h instead of stdlib.h
+
+2000-07-08 Tor Lillqvist <tml@iki.fi>
+
+ * glib.h (GLIB_VAR): Rename the GUTILS_C_VAR macro to GLIB_VAR.
+
+ * gunicode.h: Mark the g_utf8_skip array with GLIB_VAR.
+
+ * glib.def: Add two missing entry points.
+
+Thu Jul 6 15:35:28 2000 Owen Taylor <otaylor@redhat.com>
+
+ * Release 1.3.1
+
+ * Makefile.am (EXTRA_DIST): Dist fixes.
+
+ * configure.in: Moderate the warnings just a little bit.
+
+2000-07-05 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: Update.
+
+Mon Jul 3 17:58:02 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gutf8.c (g_utf8_get_charset_internal): Fix up
+ to correspond to configure.in checks.
+
+Mon Jul 3 17:18:19 2000 Owen Taylor <otaylor@redhat.com>
+
+ * glib.h: Comment g_get_codeset() out of the header file
+ temporarily. (Very similar to g_get_charset(), need
+ to resolve the two.)
+
+2000-07-01 Tor Lillqvist <tml@iki.fi>
+
+ * glib.def: Add new entry points.
+
+ * makefile.{mingw,msc}.in: Add the new Unicode object files.
+
+Thu Jun 29 15:57:28 2000 Owen Taylor <otaylor@redhat.com>
+
+ * NEWS: updated
+
+ * Makefile.am: added snapcheck target to go along with snapshot
+
+ * gstring.c glib.h (g_string_hash): Add g_string_hash to
+ go along with g_string_equal.
+
+Tue Jun 27 12:40:23 EDT 2000 David A. Wheeler <dwheeler@dwheeler.com>
+
+ * glib.h: Added g_string_equal for comparing GStrings;
+ changed g_str_equal so it returns gboolean (instead of gint).
+
+ * gstring.c: Modified GString implementation to support embedded
+ ASCII NUL ('\0') characters, and implemented g_string_equal.
+
+ * testglib.c tests/string-test.c: Added tests for g_string_equal
+ and tests for proper handling of embedded ASCII NUL characters.
+
+Wed Jun 28 22:52:00 2000 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.am (libglib_la_SOURCES): Fix
+ gunichartable.h => gunichartables.h. (From Eric Limings)
+
+Fri Jun 23 17:20:26 2000 Tim Janik <timj@gtk.org>
+
+ * glib.h: define gstring in terms of gchar*. this typedef reflects
+ the type name of the primitive G_TYPE_STRING in the gobject module.
+
+Wed Jun 21 12:09:03 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gunicode.h gutf8.c guniprop.c gunidecomp.[ch] gunichartables.h
+ Makefile.am glib.h: Initial pass at adding unicode support
+ functions. A few things still need to be implemented, a bit
+ of cleanup needs to be done, tests need to be added, and
+ the docs need to be finished, but this should allow replacing
+ most or all use of libunicode.
+
+2000-06-06 Tor Lillqvist <tml@iki.fi>
+
+ * giowin32.c (g_io_channel_win32_pipe_readable): If we are
+ watching the same pipe for different conditions (with different
+ callbacks), check them all. Only call the callback for G_IO_IN
+ from here. (This bug popped up when a watch for G_IO_ERR|G_IO_HUP
+ was added to gimplib.)
+
+2000-05-30 Tor Lillqvist <tml@iki.fi>
+
+ * gutils.c (g_locale_get_codeset): Implement on Win32.
+
+ * glib.def: Add g_get_codeset.
+
+ * tests/Makefile.am (EXTRA_DIST): makefile.cygwin* has been
+ renamed to makefile.mingw*.
+
+Tue May 30 16:01:32 2000 Owen Taylor <otaylor@redhat.com>
+
+ * glib.h gutils.c: Move the g_locale_get_codeset() up in the
+ header file to correspond to to comments about memory
+ management. Rename to g_get_codeset() to avoid
+ polluting the g_locale_* namespace, which probably
+ would have g_locale_get_codeset (GLocale *locale).
+ Add a doc comment.
+
+Mon May 29 14:10:35 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gutils.c (g_locale_get_codeset): Add function to get the
+ codeset name for the current locale.
+
+ * configure.in acconfig.h: Add check for nl_langinfo(CODESET);
+
+Fri May 19 11:39:29 2000 Tim Janik <timj@gtk.org>
+
+ * gutils.c (g_snprintf):
+ (g_vsnprintf): added argument assertments.
+
+ * gstring.c (g_string_assign): added argument assertments.
+ (g_string_truncate): make len a guint.
+
+Fri May 19 09:00:44 2000 Tim Janik <timj@gtk.org>
+
+ * gmem.c (g_free): fixed SIZEOF_LONG==4 assumption with
+ ENABLE_MEM_CHECK, from Art Haas <ahaas@neosoft.com>.
+
+ * gslist.c (g_slist_reverse): shut up compiler.
+
+ * gscanner.c (g_scanner_get_token_ll): removed inline assignment.
+
+ * garray.c: remove index>=0 checks for unsigned indices.
+
+ * gmain.c (g_idle_prepare): timeout assignment fix.
+
+ * gtree.c (g_tree_node_rotate_right): shut up compiler.
+
+2000-05-13 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.mingw.in
+ * tests/makefile.mingw.in
+ * build-dll: Rename makefile.cygwin(.in) to
+ makefile.mingw(.in), which better describes what it is. Move the
+ build of gmodule, gthread and gobject DLLs to makefiles in those
+ directories. Move resource file handling and build number bump to
+ build-dll, where it sits much cleaner.
+
+ * README.win32
+ * Makefile.am (EXTRA_DIST): Update accordingly.
+
+ * glib.h: Add G_PI, G_PI_2, G_PI_4, G_E, G_LN2, G_LN10 and
+ G_SQRT2. M_PI etc aren't necessarily in <math.h> in strict ISO C
+ implementations.
+
+ * glib.def: Add g_strcanon.
+
+ * gtree.c (g_tree_node_rotate_left): Remove unused variables.
+
+ * gwin32.c (g_win32_opendir): Remove unneeded statement.
+
+Thu May 4 02:04:46 2000 Tim Janik <timj@gtk.org>
+
+ * configure.in (STRIP_DUMMY): some Make 3.79 $(strip ) versions are
+ broken and require an empty arg, give it to them.
+
+Fri Apr 28 23:54:35 2000 Tim Janik <timj@gtk.org>
+
+ * setup things for a new sub-library libgobject:
+
+ * Makefile.am (SUBDIRS): added gobject
+
+ * glib-config.in: feature -lgobject.
+
+ * configure.in (AC_OUTPUT): generate gobject/Makefile.
+
+ * glib.m4 (AM_PATH_GLIB): feature gobject module.
+
+ * glib.spec.in: added %{prefix}/lib/libgobject-1.3.so.*
+
+Fri Apr 28 21:41:49 2000 Tim Janik <timj@gtk.org>
+
+ * glib.h: added G_STRLOC macro.
+ G_STRUCT_OFFSET(): signedness corrections.
+ (G_CSET_DIGITS): list 0-9.
+ * gscanner.c (g_scanner_config_template): use G_CSET_DIGITS.
+
+ * glib.h:
+ * gstrfuncs.c:
+ (g_strdown):
+ (g_strup):
+ (g_strreverse): return the modified string instead of void, so
+ calls to these functions can be nested.
+ (g_strcanon): new function, canonicalizes string according to
+ a given character set.
+
+Fri Apr 28 19:45:16 2000 Tim Janik <timj@gtk.org>
+
+ * gasyncqueue.c (g_async_queue_unref): get rid of an unused variable.
+
+Wed May 10 19:52:44 2000 Owen Taylor <otaylor@redhat.com>
+
+ * glib.m4: Print found version when test succeeds.
+
+2000-05-04 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.cygwin.in
+ * tests/makefile.cygwin.in: Include the common makefile snippet
+ from ../build/win32.
+
+ Maybe CVSROOT/modules should be changed so that the 'build' module
+ is included within the glib module (and gtk+, and gimp, and maybe
+ others later), in the same way as the 'macros' module is included
+ in lots of GNOME CVS modules?
+
+2000-05-02 Tor Lillqvist <tml@iki.fi>
+
+ * glib.def: Add new functions.
+
+ * makefile.{cygwin,msc}.in (glib_OBJECTS): Add new object files.
+
+ * tests/makefile.{cygwin,msc}.in: Add thread pool-test.
+
+2000-04-28 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gasyncqueue.c: New File implementing an asynchronous queue to be
+ used for asynchronous inter-thread communication.
+
+ * gthreadpool.c: New File implementing a thread pool to be used
+ for distributing work among several threads.
+
+ * glib.h: Added the type and function declarations for these two
+ types.
+
+ * tests/threadpool-test.c: New File implementing a test for the
+ thread pool. This also checks the asynchronous queue underlying
+ the thread pool.
+
+ * tests/Makefile.am: Changed accordingly.
+
+2000-04-26 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Look for both pthread_create and pthread_join in
+ the thread library. Some systems define one of them, but not both
+ in libc. Arghh. Now we really start a thread and join it later and
+ check, whether the thread to actually ran.
+
+ * glib.h, gcache.c, gtree.c: Changed the 'value' parameter of
+ g_cache_remove from gpointer to gconstpointer. Dito for the 'key'
+ parameter of g_tree_lookup and g_tree_remove and the 'data'
+ parameter of g_tree_search. This function now takes a function of
+ type GCompareFunc instead of GSearchFunc. This fixes Bug
+ #8267. Thanks to Juan Toledo <toledo@users.sourceforge.net> for
+ pointing that out.
+
+ * glib.h: Removed declaration of GSearchFunc.
+
+ * gmem.c: s/GSearchFunc/GCompareFunc/.
+
+2000-04-19 Tor Lillqvist <tml@iki.fi>
+
+ * glib.def: Update entry point list.
+
+2000-04-19 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib.h (G_TRYLOCK): Made the debugging G_TRYLOCK call also work
+ for compilers with funny G_STMT_(START|END) macros.
+
+ * tests/thread-test.c: Implemented a check for that.
+
+ * gutils.c (g_getenv): Changed the win32 part of this function to
+ be thread safe and to make the returned environment string
+ persistent to match the UN*X behavior. This is again a response to
+ Bug #8983.
+
+ * glib.h (G_LOCK_NAME): Removed parentheses around the lock name,
+ as that seems to cause problems for some compilers and really
+ isn't necessary.
+
+Wed Apr 19 08:32:32 2000 Tim Janik <timj@gtk.org>
+
+ * gscanner.c (g_scanner_new): make sure that
+ scanner->config->cset_skip_characters is "" instead of NULL, so we
+ don't segfault further on.
+
+2000-04-18 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib.h, glist.h, gslist.h: Changed the 'data' parameters from
+ gpointer to gconstpointer for the functions
+ g_(list|slist)_(remove|find|find_custom|index), as they do not
+ change this parameter. This fixes bug #4836.
+
+ * glib.h: Changed comment for g_getenv to reflect, that the
+ returned memory must not be freed. Fixes bug #8983.
+
+2000-04-17 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in, acconfig.h: Add configure test for garbage
+ collector friendliness for GLib. If enabled, ENABLE_GC_FRIENDLY
+ will be defined.
+
+ * garray.c, ghash.c, glist.c, gmain.c, gmem.c, gnode.c, gqueue.c,
+ gslist.c, gtree.c: If ENABLE_GC_FRIENDLY is defined, NULLify all
+ memory released by the user, but cached by GLib. This lets a
+ garbage collector have a more correct view of the actually used
+ memory.
+
+ * garray.c, glib.h: Added g_(array|ptr_array|byte_array)_sized_new
+ functions, that reserve a certain amount of memeory for the array
+ at creation time to avoid reallocation. Fixes bug #6707 from
+ Charles Kerr <ckerr@osserver1.nssl.noaa.gov>.
+
+ * glib.h, gqueue.c, tests/queue-test.c (main): Renamed
+ g_queue_create to g_queue_new in conformance to all other GLib
+ data types.
+
+2000-04-07 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * grand.c (g_rand_new): Fixed bug. Thanks to Marko Kreen
+ <marko@l-t.ee> for reporting that.
+
+2000-03-26 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: Tell about using the mingw-based gcc, which is
+ much easier than modifying the cygwin gcc to product mingw code
+ for the msvcrt runtime.
+
+ * makefile.cygwin.in (WIN32APIHEADERS): Kludge to make it work
+ with a "pure" mingw gcc, too.
+
+2000-03-24 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * garray.c: Made GArray behave correctly. Now zero_terminated
+ really means, that the element array->data[array->len] exists and
+ is zeroed, and clear means that any unassigned elements obtained
+ through g_array_set_size (the only way to get unassigned elements
+ AFAICT) are zeroed. Added some macros to make the code more
+ obvoius. Also made GPtrArray zero elements after
+ g_ptr_array_set_size. This is done in a portbale way (assignment
+ of NULL instead of just memsetting it to zero), though that might
+ be more portability than we actually want.
+
+ * Makefile.am, gthread/Makefile.am, gmodule/Makefile.am,
+ tests/Makefile.am: Added various win32 related *.in files to
+ EXTRA_DIST to let 'make distcheck' procude all the corresponding
+ files, which it silently fails to do currently.
+
+2000-03-23 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: After finding the right thread library (containing
+ e.g. pthread_create) we now search for the right realtime library
+ (containing e.g. sched_get_priority_max). Makes the output of the
+ thread related libraries correct.
+
+ * gtimer.c (g_usleep): The current implementation of g_usleep
+ (simply calling select) doesn't work reliable for multi-threaded
+ programs on some platforms (bad omen for the main loop....), so I
+ changed the implementation for thread-using programs to wait for a
+ GCond for the specified amount of time (NB: sleep and usleep are
+ not MT-safe in general, because they often use signals).
+
+Wed Mar 22 16:49:57 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gmem.c (g_mem_chunk_area_compare): Fix indentation.
+
+2000-03-22 Elliot Lee <sopwith@redhat.com>
+
+ * gmem.c (g_mem_chunk_area_compare): Fix 64-bitness bug in
+ comparing two pointers more than 4G apart.
+
+2000-03-22 Tor Lillqvist <tml@iki.fi>
+
+ * gutils.c: Move Win32-only includes after inclusion of glib.h, so
+ that G_OS_WIN32 is defined.
+
+ * glibconfig.h.win32.in: Add GSystemThread.
+
+2000-03-22 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gutils.c (g_get_current_dir): Ok, Marcus Brinkmann
+ <Marcus.Brinkmann@ruhr-uni-bochum.de> convinced me, that 128 KB
+ path length might not be enough for the HURD. So I changed the
+ loop to at least avoid an integer overflow, which could happen at
+ beyond 2GB size ;-)
+
+ * configure.in: Test for sched_yield as the native yield function
+ first. Corrected typo g_thread_sleep -> g_usleep. Corrected
+ message for the pthread_create test. Negative Priorities are
+ allowed (and used on Solaris), so consider
+ sched_get_priority_min failed only if it returns -1, not <0. Check
+ for sched_get_priority_min also in -lrt, if not found in -lpthread
+ alone and add -lrt to G_THREAD_LIBS then. Remove special case
+ handling of priorities for older solaris versions and posix
+ threads. Thanks to Wan-Teh Chang <wtc@netscape.com> for suggesting
+ some of those changes.
+
+ * config.guess, config.sub, ltconfig, ltmain.sh:
+ Upgrade to libtool 1.3.4.
+
+2000-03-21 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib.h, configure.in, gutils.h: always define G_GNUC_EXTENSION,
+ even when not needed by GLib. That's actually also the way, the
+ GLib reference manual describes that macro. Therefore I had to
+ remove the lonesome #include <glibconfig.h> in gutils.c, which
+ doesn't seem to be needed there however. This change should make
+ Ben Gertzfield <che@debian.org> happy.
+
+ * gutils.c: Furthermore two warnings in gutils.c were voided,
+ which crept in due to my last change.
+
+ * gutils.c (g_get_current_dir): Allocate only up to 128KB for a
+ pathname. While this is an arbitrary value just like 2048, it
+ seems to be enough (after all, even 4GB is an arbitrary value).
+
+2000-03-20 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gmain.c (g_main_poll): Warn in case of an error during the call
+ to poll(2). Closes Bug#7564 as reported by David Helder
+ <dhelder@umich.edu>.
+
+ * gutils.c (g_get_current_dir): Make g_get_current_dir work on
+ systems with unlimited pathname length like the HURD (It worked
+ there before, but only for pathes shorter than 2048). Closes
+ Bug#4525 as reported by Marcus Brinkmann
+ <Marcus.Brinkmann@ruhr-uni-bochum.de>.
+
+2000-03-17 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * giounix.c (g_io_unix_write, g_io_unix_read): Interpret EINTR as
+ G_IO_ERROR_AGAIN.
+
+2000-03-17 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Added the missing POSIX_NO_YIELD and
+ POSIX_NO_PRIORITIES warning messages.
+
+ * configure.in: Use AC_TRY_RUN instead of AC_TRY_LINK, to test for
+ real thread support. On solaris pthread_create can be linked to
+ even in -lc, but it doesn't work then.
+
+ * configure.in: Don't use priorities for threads, when the
+ minimal/maximal priorities couldn't be determined at configure
+ time.
+
+ * configure.in, gthread.c: Always define GSystemThread in
+ glibconfig.h to represent a system thread.
+
+ * configure.in: Do not use native recursive threads, when
+ possibe. We use some features, that they do not expose (namely the
+ depth counter).
+
+ * glib.h, gthread.c: Redefined GStaticRecMutex. The functions are
+ now implemented in a different way, which should be way
+ faster. Alsothere are now functions g_static_rec_mutex_unlock_full
+ and g_static_rec_mutex_lock_full to leave/enter a recursive mutex
+ completly.
+
+ * gthread.c (g_thread_self): Do not test the system_thread to be
+ non-zero to speed things up.
+
+ * gthread.c (g_mutex_init): Therefore set the system_thread of the
+ main thread here.
+
+ * tests/thread-test.c: Rerun all tests once again, but this time
+ we fool the system into thinking, that the available thread system
+ is not native, but userprovided.
+
+2000-03-13 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gqueue.c (g_queue_push_tail_link, g_queue_push_head_link): We
+ want the next and prev pointer of the inserted link to be NULL.
+
+2000-03-06 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Another small change to the pthread_.. search
+ pattern. Should work *now* for AIX.
+
+2000-03-04 Tor Lillqvist <tml@iki.fi>
+
+ * gwin32.c (g_win32_error_message): New function that returns the
+ message string for a Win32 error code.
+
+ * glib.h: Declare it.
+
+ * glib.def: Export it, plus g_node_copy.
+
+2000-03-03 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Make the search for pthread_attr_... prototypes
+ find names at the start of a line also, like it is on AIX. Thanks
+ to Valdis Kletnieks <Valdis.Kletnieks@vt.edu> for the info.
+
+Wed Mar 1 10:39:39 2000 Tim Janik <timj@gtk.org>
+
+ * gslist.c (g_slist_reverse): minor optimization.
+
+ * testglib.c (g_node_test): added a couple of tests for
+ g_node_copy().
+
+ * glib.h:
+ * gnode.c (g_node_copy): new function to copy subtrees,
+ supplied by dbsears@ix.netcom.com.
+ changed iterator to walk the children list backwards, so
+ we get down from O(n^2) to O(n).
+
+ * gnode.c (g_node_first_sibling): applied patch from
+ dbsears@ix.netcom.com to optimize access if node->parent
+ is present.
+
+ * gutils.c (g_get_any_init): backed out HAVE_PW_GECOS check around
+ assignment of g_real_name, sicne HAVE_PW_GECOS is never defined and
+ thus breaks the original code.
+
+ * merged changes from 1.2.7.
+
+Fri Jan 28 11:37:41 2000 Owen Taylor <otaylor@redhat.com>
+
+ Bug #4156 - Changes vaguely modelled after Scott Gifford's patch
+
+ * gtimer.c (g_timer_elapsed): Never report negative times -
+ clip times to 0.
+
+ * gmain.c (g_timeout_prepare): Guard against unexpected
+ clock shifts by never setting a timeout of more than
+ data->interval msecs.
+
+2000-02-27 Tor Lillqvist <tml@iki.fi>
+
+ * glib.def: Add new functions.
+
+2000-02-23 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: Add a missing step to the setup instructions for
+ gcc-2.95.2. Thanks to Arnaud Charlet.
+
+ * glib.def: Add missing entry point.
+
+2000-02-18 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Changed GCC version test to also accept major
+ versions > 2. Thanks to Ben Gertzfield <che@debian.org> for
+ pointing this out.
+
+Thu Feb 17 12:53:44 2000 Tim Janik <timj@gtk.org>
+
+ * gstring.c: changed g_str_hash() to a 31 bit version based on
+ a submission by Karl Nelson and hand optimized ad absurdum by
+ various people ;)
+
+ * gstring.c: applied patch from havoc for new gstring functions,
+ added some more sanity checks, coding style fixups.
+
+2000-02-13 Havoc Pennington <hp@pobox.com>
+
+ * tests/string-test.c (main): Add tests for the new GString
+ features
+
+ * testglib.c (main): Add tests for the new GString features
+
+ * gstring.c (g_string_insert_len): New function; insert
+ a given length of string at a given position.
+ (g_string_append): reimplement in terms of g_string_insert_len
+ (g_string_append_len): new function
+ (g_string_insert_c): accept -1 for "pos" arg to mean "append"
+ (g_string_append_c): reimplement in terms of g_string_insert_c
+ (g_string_prepend): reimplement in terms of g_string_insert_len
+ (g_string_prepend_len): new function
+ (g_string_prepend_c): reimplement in terms of g_string_insert_c
+ (g_string_insert): reimplement in terms of g_string_insert_len
+
+ * glib.h: Declare g_string_insert_len, g_string_append_len,
+ g_string_prepend_len
+
+Sun Feb 13 08:16:47 2000 Tim Janik <timj@gtk.org>
+
+ * configure.in: wtf??? someone destroyed the configure.in, reverting to
+ an older version from Feb 4 which apears to still work.
+
+2000-02-07 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule.rc.in gthread.rc.in: Move to corresponding subdirectories.
+
+ * Makefile.am
+ * gmodule/Makefile.am
+ * gthread/Makefile.am: Change accordingly.
+
+ * makefile.cygwin: Corresponding changes, some cleanup.
+
+2000-02-05 Tor Lillqvist <tml@iki.fi>
+
+ * glib.rc.in gmodule.rc.in gthread.rc.in: New files, for putting
+ version info in the DLLs on Win32.
+
+ * Makefile.am: Generate corresponding *.rc files and distribute
+ them.
+
+ * makefile.cygwin.in: Add rules to automatically bump a "build
+ number" in the version info in the rc files each time the DLL is
+ built. But do this only for the person who releases binaries. If
+ others build the DLLs, the build number is set to zero.
+
+Fri Feb 4 19:36:05 2000 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gdataset.c: return stolen data from g_datalist_id_remove_no_notify()
+ and g_dataset_id_remove_no_notify() to avoid second lookup for common
+ use.
+
+2000-02-01 Tor Lillqvist <tml@iki.fi>
+
+ * glib.h
+ * gstrfuncs.c (g_filename_to_utf8, g_filename_from_utf8): New
+ functions for conversion between UTF-8 and the encoding expected
+ by C runtime functions like open() and stat(), and returned by
+ readdir().
+
+ Implement them on Win32 where we use the system "ANSI" codepage,
+ which might be single-byte or double-byte. On Unix, just skip the
+ issue for now and provide dummy implementations that return a copy
+ of the argument.
+
+ * README.win32
+ * build-dll
+ * glib.def: Minor updates.
+
+Wed Jan 26 05:24:38 2000 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gmain.c: s/current_time/dispatch_time/ for the dispatch() handlers.
+ refetch the current time after invocation of poll() to cover up for
+ the time spent in that function call.
+
+Fri Jan 21 10:18:24 2000 Owen Taylor <otaylor@redhat.com>
+
+ * glib.h (G_N_ELEMENTS): Added G_N_ELEMENTS macro to determine
+ the number of elements in an array.
+
+Sun Jan 9 13:28:36 2000 Tim Janik <timj@gtk.org>
+
+ * gstrfuncs.c (g_strtod): correctly fetch the current locale,
+ fix from owen.
+
+1999-12-16 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule/gmodule-win32.c: Use FormatMessage to translate system
+ error codes into textual messages.
+
+1999-11-25 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib.h (G_TRYLOCK): This of course should return TRUE in a
+ program with a thread-disabled GLib.
+
+1999-11-18 Tor Lillqvist <tml@iki.fi>
+
+ * glib.def: g_strjoin was missing.
+
+1999-11-16 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * acconfig.h, config.h.win32.in, configure.in: Renamed
+ GLIB_SIZEOF_PTHREAD_T to GLIB_SIZEOF_SYSTEM_THREAD to reflect
+ changed meaning.
+
+ * configure.in: Cope with systems, that have a pthread_t type,
+ that is not a pointer. Hint from Karl Nelson
+ <kenelson@ece.ucdavis.edu>. Define GLIB_SIZEOF_SYSTEM_THREAD to 4
+ for Solaris. Cope with systems, that have no default mutex
+ initialize, like obviously most DCE systems.
+
+ * glib.h, gthread.c: Changed the prototype of thread_create and
+ thread_self to return the system thread into provided memory
+ instead of a return value. This is necessary, as HPUX has a
+ pthread_t, that is bigger than the biggest integral type there.
+
+ * gthread.c: system_thread is no longer a pointer, but an memory
+ area of size GLIB_SIZEOF_SYSTEM_THREAD. Changed the
+ zeroinitialization and the tests for zeroness accordingly.
+
+1999-11-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Create docs/glib-config.1 from
+ docs/glib-config.1.in. Makes 'make distcheck' happy (and me too).
+
+ * glib-config.1: Removed from CVS, as it is a generated file.
+
+1999-11-08 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Make the test for getpwuid_r work on newer AIX
+ versions, too. Still works on Solaris and Linux. Patch from Craig
+ Rodrigues <rodrigc@mediaone.net>.
+
+1999-11-08 Tor Lillqvist <tml@iki.fi>
+
+ * gwin32.c (g_win32_getlocale): Look at env vars LC_ALL, LC_CTYPE
+ and LANG first. Some refinements to the sublanguage logic.
+
+1999-11-04 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.{cygwin,msc}.in: Add gwin32 object. Add rule to make .i
+ (preprocessed source) files.
+
+1999-11-01 Tor Lillqvist <tml@iki.fi>
+
+ * glib.h
+ * glib.def: Rename Win32-only functions from gwin_* to g_win32_*
+ to match the GLib naming conventions.
+
+ * gutils.c
+ * gwin32.c
+ * testglib.c
+ * Makefile.am: Move the Win32-only functions to the new
+ file gwin32.c
+
+1999-10-31 Tor Lillqvist <tml@iki.fi>
+
+ * gutils.c (gwin_getlocale): New Win32-specific function, returns
+ a Unixish current locale string (en, zh_TW etc).
+
+ * glib.h: Declare it.
+
+ * glib.def: Export it.
+
+ * testglib.c: Test it.
+
+ * gmessages.c (Win32: ensure_stdout_valid): Some improvements,
+ make sure we don't call AllocConsole several times, which I think
+ has happened.
+
+Sun Oct 31 18:55:01 1999 ape@spacetec.no (Asbjorn Pettersen)
+
+ * gcache.c (g_cache_remove): Test if node is NULL.
+ If not tested, GIMP's script-fu will crash.
+
+Sun Oct 17 18:11:40 1999 Tim Janik <timj@gtk.org>
+
+ * gdataset.c (g_data_set_internal): remove g_dataset_global_lock around
+ destroy() notification here as well.
+
+1999-10-15 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gdataset.c (g_datalist_clear_i): Avoid Freezing, when g_datalist
+ is called recursivly. Reported by Ola Andersson <rand@ling.umu.se>.
+
+Tue Oct 12 14:17:12 1999 Tim Janik <timj@gtk.org>
+
+ * glib.h: removed useless g_string(x) macro that cluttered the namespace
+ and was just a poor wrapper around the cpp '#' symbol, use #x if you
+ need to work around this.
+ added new macro G_STRINGIFY(arg) that will convert arg to a string,
+ no matter whether it contains macros or not.
+
+1999-10-12 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32.in: Define the new GLIB_SIZEOF_* constants here,
+ too.
+
+ * glib.h: Small Win32 comments improvement.
+
+Tue Oct 12 12:16:12 1999 Tim Janik <timj@gtk.org>
+
+ * gmessages.c (g_printf_string_upper_bound): completly new
+ implementation for printf string upper bounds calculation.
+ we handle all glibc 2.1 format specifiers now, except for positional
+ parameters (%nn$...) and wide char strings, plus some obscure upper
+ case variants of the standard conversions. this fixes a lot of
+ bugs in the old code, i.e.
+ - NULL format strings
+ - floats with exponents >+24
+ - %G
+ - precision specifications in general
+ - negative field widths
+ - %p for SIZEOF_VOID_P > 4 platforms
+ we now issue warnigns in places where the old code would have
+ caused buffer overruns anyways. warnings are suppressed when invoked
+ from glogv(), to avoid infinite recursions if someone passes a log
+ message that comes with really obscure format specifications.
+
+Tue Oct 12 11:49:00 1999 Tim Janik <timj@gtk.org>
+
+ * gstrfuncs.c: nuked old g_printf_string_upper_bound() version.
+
+Tue Oct 12 03:34:40 1999 Tim Janik <timj@gtk.org>
+
+ * glib.h: added GFloatIEEE754 and GDoubleIEEE754 unions to access sign,
+ mantissa and exponent of IEEE floats and doubles (required by the new
+ version of g_printf_string_upper_bound). the unions are endian specific,
+ we handle G_LITTLE_ENDIAN and G_BIG_ENDIAN as of currently. ieee floats
+ and doubles are supported (used for storage) by at least intel, ppc and
+ sparc, reference:
+ http://twister.ou.edu/workshop.docs/common-tools/numerical_comp_guide/ncg_math.doc.html
+
+Mon Oct 11 18:01:49 1999 Tim Janik <timj@gtk.org>
+
+ * configure.in: added additional checks to figure sizes of size_t,
+ ptrdiff_t and intmax_t (required by g_printf_string_upper_bound).
+
+Wed Oct 6 12:44:23 PDT 1999 Manish Singh <yosh@gimp.org>
+
+ * configure.in: blah. use G_WITH_CYGWIN instead of G_HAVE_CYGWIN
+
+1999-10-05 Tor Lillqvist <tml@iki.fi>
+
+ * glib.h: (Win32) Drop the mapping of POSIX function names to the
+ underscored versions, it's unnecessary after all. With MSVC we get
+ them from oldnames.lib, with gcc-2.95 and mingw32 from
+ -lmoldname-msvc. Add comment about what headers to include for
+ prototypes.
+
+ * glibconfig.h.win32.in: Don't define WIN32 and NATIVE_WIN32.
+
+ * gerror.c (g_on_error_query): (Win32) Slightly increased verbosity.
+
+ * build-dll: Don't strip.
+
+ * tests/string-test.c tests/dirname-test.c: Use G_OS_WIN32.
+
+ * glib.def: Add g_thread_use_default_impl.
+
+Sun Oct 3 19:46:55 PDT 1999 Manish Singh <yosh@gimp.org>
+
+ * configure.in: use G_HAVE_CYGWIN instead of G_OS_FEATURE_CYGWIN
+
+Sun Oct 3 19:25:42 PDT 1999 Manish Singh <yosh@gimp.org>
+
+ * acconfig.h
+ * configure.in
+ * glibconfig.h.win32: G_OS_FOO #defines. I *think* I got the cygwin
+ and beos stuff right, but I haven't tested it. The respective
+ porters should fix any screwups
+
+ * glib.h
+ * gerror.c
+ * gmain.c
+ * gmessages.c
+ * gscanner.c
+ * gthread.c
+ * gtimer.c
+ * gutils.c
+ * testglib.c: use G_OS stuff
+
+Wed Sep 22 01:53:18 1999 Tim Janik <timj@gtk.org>
+
+ * glib.h (NULL): define NULL as (0L) if __cplusplus is defined, to
+ avoid "ANSI C++ forbids implicit conversion from `void *' in argument
+ passing" errors upon NULL usage in C++ programs (gcc-2.95 is on crack
+ for erroring out on this, instead of just issueing a warning).
+
+ * glib.h (g_trash_stack_pop): use uncasted NULL again.
+
+Fri Sep 17 10:24:45 1999 Tim Janik <timj@gtk.org>
+
+ * gmem.c (g_mem_chunk_compute_size) (g_mem_chunk_new): applied
+ patch from Soeren Sandmann <sandmann@daimi.au.dk>, to force mem
+ chunk's area sizes to be a multitiple of atom_size, and to
+ eliminate the MAX_MEM_AREA restriction of 65536 bytes. we also
+ catch cases where users pass an area size < atom size with a
+ return_if_fail statement now (which is ok, because previously this
+ lead to memory corruption anyways).
+
+Thu Sep 16 13:19:54 1999 Tim Janik <timj@gtk.org>
+
+ * glib.h (g_trash_stack_pop): add explicit (GTrashStack*) cast for NULL
+ pointer to cure ANSI C++ error.
+
+Mon Sep 13 23:25:59 1999 Tim Janik <timj@gtk.org>
+
+ * gmessages.c (g_logv): in case we have to abort the program,
+ debugging is enabled and we are not called recursively, try
+ to abort with raise (SIGTRAP) first, so developers may ignore
+ certain failure conditions during debugging stage.
+
+Thu Aug 26 15:09:36 1999 Tim Janik <timj@gtk.org>
+
+ * Makefile.am:
+ * gmodule/Makefile.am:
+ * gthread/Makefile.am: added --export-dynamic so we can load dynmic
+ modules, (required, according to the libtool 1.3.3 docu).
+
+1999-07-23 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * grand.c (g_rand_new): Use /dev/urandom, as it doesn't block,
+ which /dev/random might do. Do not XOR the time, when getting the
+ seed form /dev/urandom, as this is good itself. Prevent the
+ initial seed from being zero, which causes the PRNG to produce
+ only zeros. Hints from Colin Plumb <colin@pgp.com>.
+
+1999-08-17 Tor Lillqvist <tml@iki.fi>
+
+ * glib.h (g_trash_stack_push): Add a cast.
+
+ * gslist.c
+ * glist.c: Make the inline functions static inline, and add
+ separate extern wrappers. Not all compilers produce callable entry
+ points for inline functions, even if gcc does.
+
+Sun Aug 15 02:47:14 1999 Tim Janik <timj@gtk.org>
+
+ * glib.h (g_trash_stack_pop): eliminate memset() call, since string.h
+ has not neccessarily been included prior to glib.h.
+
+Mon Aug 2 21:03:10 1999 Tim Janik <timj@gtk.org>
+
+ * configure.in: added --enable-msg-prefix option.
+
+ * gmessages.c (g_log_default_handler): feature "prg_name (pid:%u): "
+ if --enable-msg-prefix was selected (use "(process:%u): " if
+ g_get_prgname () returns NULL, along the lines of g_on_error_query).
+
+1999-08-03 Tor Lillqvist <tml@iki.fi>
+
+ * glib.h
+ * gstrfuncs.c
+ * tests/strfunc-test.c: Rename g_strccpy to g_strcompress and
+ g_strecpy to g_strescape per Tim Janik's suggestion. Dropped the
+ destination parameter, always g_malloc a new string. Fix bug in
+ g_strcompress, octal digits were gobbled up without limit, should
+ use max three.
+
+ Sources that use g_strescape must have ifdefs to be compilable
+ both with GLib 1.2 and 1.3.
+
+Sat Jul 31 17:52:03 PDT 1999 Manish Singh <yosh@gimp.org>
+
+ * glib.h
+ * gstrfuncs.c: the #define for g_strescape interfered with the
+ compilation of the function, so just remove the function and
+ note that it's deprecated in the header
+
+1999-08-01 Tor Lillqvist <tml@iki.fi>
+
+ * gstrfuncs.c (g_strccpy, g_strecpy): New functions.
+
+ * glib.h: Declare and document them. Define the deprecated
+ g_strescape as a macro that calls g_strecpy.
+
+ * tests/strfunc-test.c (main): Test them.
+
+ * makefile.{cygwin,msc}.in
+ * tests/makefile.{cygwin,msc}.in: Remove gstack and its test
+ program.
+
+ * glib.def: Additions and removals.
+
+ * README.win32: Improve gcc build instructions.
+
+ * build-dll: Also build import library for MSVC.
+
+Sat Jul 24 20:11:35 1999 Tim Janik <timj@gtk.org>
+
+ * merged GLib 1.3.0 with glib-1.2.3 from Fri Jul 16 22:18:36.
+ * incorporated proposed cleanups from gtk-devel-list.
+
+ * bumped version number to GLib-1.3.1
+
+ * glib.h:
+ * gqueue.c:
+ * gstring.c:
+ * glist.c:
+ removed string tokenisation (we got g_strsplit() and g_strjoin()
+ already) and readline functions.
+ s/g_list_delete/g_list_delete_link.
+ implemented g_slist_delete_link.
+ removed notion of g_ATEXIT() macro in glib.h, this is an *internal*
+ macro, g_atexit() is provided for public consumption.
+ added GTrashStack inline utility functions.
+ reimplement double eneded queues.
+ removed GStack implementation, people can use a queue or a (singly)
+ linked list for this task.
+ deprecated g_strescape(), we need the SunOS variants here.
+
+ * gdate.c: added DEBUG_MSG() macro to wrap old messages.
+
+ * *.*: CVS merges.
+
+ * upgrade to libtool 1.3.3.
+
+1999-07-21 Tor Lillqvist <tml@iki.fi>
+
+ Win32: With the latest gcc (2.95, pre-release), we can have binary
+ compatibility with MSVC by using the switch -fnative-struct. No
+ longer build DLLs with .gcc in the name when using gcc.
+
+ * README.win32: Renew gcc build instructions.
+
+ * build-dll: Comments change, handle also .a files.
+
+ * makefile.cygwin.in
+ * tests/makefile.cygwin.in: Remove .gcc from DLL name.
+
+1999-07-13 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: Correct URL for mingw runtime sources.
+
+ * build-dll: Combine commands with &&.
+
+ * glib.h: Map also rmdir() and hypot() for MSVCRT library.
+
+ * makefile.cygwin.in
+ * tests/makefile.cygwin.in: New DLL naming style. GCC-compiled DLLs are
+ now called *.gcc.dll, to avoid binary incompatibilities with
+ MSVC-compiled versions.
+
+ * makefile.msc.in: Cosmetics.
+
+1999-07-07 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Test for pthread_join rather than for
+ pthread_create to determine the right thread-lib. Makes it work on
+ mips-sgi-irix6.5. Hitn from to Jari Vuoksenranta
+ <javu@piano.ux.phys.jyu.fi>.
+
+1999-07-02 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: Note about need to fix another bug in the mingw32
+ headers.
+
+ * makefile.msc.in: Debugging turned on via an nmake variable,
+ no need to edit the makefile.
+
+1999-07-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in, acconfig.h, gutils.c: Added a g_memmove
+ replacement for platforms without memmove, where bcopy can't
+ handle overlapping copies and the corresponding checks, which is
+ taken form the PERL Configure routine.
+
+ * glib.h: Updated the commentary about g_memmove to be right and
+ more GLib-like.
+
+ * configure.in: Removed test for rand_r, as it isn't used anymore.
+
+1999-06-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib.h, grand.c: Finally removed the g_random_normal and
+ g_rand_normal functions.
+
+1999-06-28 Tor Lillqvist <tml@iki.fi>
+
+ * glib.def: Add missing export of g_strncasecmp.
+
+1999-06-21 Jose Mercado <jmercado@mit.edu>
+
+ * glib.spec.in: Changed version number (1.1->1.3) in files section
+ to allow rpm to build packages again.
+
+1999-06-21 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: Update the pthreads snapshot version we want.
+ Advice how to hand-expand the makefile.*.in files.
+
+ * config.h.win32.in: Define values needed by Sebastian Wilhelmi's
+ new thread stuff.
+
+ * glib.def: Add new functions.
+
+ * glibconfig.h.win32.in: Update the pthreads snapshot version.
+ Fix typo.
+
+ * gthread.c: Include config.h, guard inclusion of unistd.h. When
+ using gcc on Win32, g_thread_functions_for_glib_use must be marked
+ for export here, too.
+
+ * gtimer.c: Implement g_usleep on native Win32 using Sleep (which
+ only has millisecond granularity, though).
+
+ * makefile.cygwin.in
+ * makefile.msc.in: Update pthreads snapshot version. File
+ name changes. Remove testgthread.
+
+ * tests/makefile.cygwin.in
+ * tests/makefile.msc.in: Add thread-test. Link with gthread lib.
+
+1999-06-18 Jeff Garzik <jgarzik@pobox.com>
+
+ * tests/Makefile.am: Re-order tests in alpha order.
+
+1999-06-18 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Changed test for pthread_attr_setstacksize from
+ AC_TRY_COMPILE to AC_TRY_LINK.
+
+1999-06-17 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in, acglib.m4, acconfig.h, glib.h, gthread.c:
+ Completed the thread support in GLib. Thread creation,
+ prioritizing threads, yielding, joining threads as well as
+ reader/writer locks and recursive mutexes are now in place. Please
+ test heavily on your platform. It is so far tested on
+ Linux/i386/pthreads, Solaris/Sparc/pthreads and
+ Solaris/Sparc/solaristhreads.
+
+ * gtimer.c, glib.h: Implement g_usleep (gulong microseconds) for
+ thread safe sleeping. (sleep() is not MT-safe at all!)
+
+ * gutils.c: Avoid compiler warning.
+
+ * tests/Makefile.am, tests/thread-test.c: New program to test some
+ aspects of the thread implementation.
+
+ * gthread.c, Makefile.am: Renamed from gmutex.c to reflect the
+ change of content.
+
+ * configure.in: Purged all appearances of nspr.
+
+Wed Jun 2 11:42:46 PDT 1999 Manish Singh <yosh@gimp.org>
+
+ * acinclude.m4
+ * config.guess
+ * config.status
+ * ltconfig
+ * ltmain.sh: upgrade to libtool 1.3.2 (BeOS changes merged)
+
+1999-05-29 Tor Lillqvist <tml@iki.fi>
+
+ * gstrfuncs.c (g_strescape): Backslashify also '"' characters.
+
+ * glib.h: Document g_strescape.
+
+1999-05-12 Tor Lillqvist <tml@iki.fi>
+
+ * glib.h (Win32): Map fileno to _fileno for mingw32. Map fstat to
+ _fstat.
+
+ * README.win32: Advice also to remove -lmoldname in the
+ patch to the egcs-1.1.2 spec file.
+
+Wed May 12 00:23:55 CDT 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * gmodule/Makefile.am: Another small fix.
+
+1999-05-08 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am tests/Makefile.am: Correct rules for making the
+ win32-related files that are made from corresponding .in files.
+ Is there a cleaner way than explicitly writing rules that invoke
+ config.status?
+
+Fri Jul 16 22:18:36 PDT 1999 Manish Singh <yosh@gimp.org>
+
+ * ltconfig
+ * ltmain.sh: upgrade to libtool 1.3.3
+
+1999-06-18 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gdate.c, gstrfuncs.c, gstring.c: Fixed the use of the
+ is..... and to..... macros, which take unsigned chars, not chars!
+ Thanks to Morten Welinder <terra@diku.dk> for pointing this out.
+
+Thu Jun 3 16:30:31 PDT 1999 Manish Singh <yosh@gimp.org>
+
+ * gerror.c (g_on_error_query): check isatty() before querying so
+ we don't loop endlessly
+
+Sat May 29 11:16:29 PDT 1999 Manish Singh <yosh@gimp.org>
+
+ * acinclude.m4
+ * config.guess
+ * config.status
+ * ltconfig
+ * ltmain.sh: upgrade to libtool 1.3.2
+
+1999-05-26 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gmain.c: provide a poll prototype for SunOS, as they do not do
+ it self. Hint from Christian Parg <cparg@fs-design.de>.
+
+Tue May 25 12:23:07 1999 Owen Taylor <otaylor@redhat.com>
+
+ * gstrfuncs.c (g_strchug): Use g_memmove() not memmove().
+ (Reported by Charles Levert <charles@comm.polymtl.ca>)
+
+Mon May 10 22:03:52 CDT 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.2.3
+
+1999-05-08 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am tests/Makefile.am: Correct rules for making the
+ win32-related files that are made from corresponding .in files.
+ Is there a cleaner way than explicitly writing rules that invoke
+ config.status?
+
+Sat May 1 10:18:01 PDT 1999 Manish Singh <yosh@gimp.org>
+
+ * acinclude.m4
+ * config.guess
+ * config.status
+ * ltconfig
+ * ltmain.sh: upgrade to libtool 1.3
+
+1999-04-30 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am: Don't distribute glibconfig.h.win32.in, but
+ glibconfig.h.win32. Generate it when making a dist. Also generate
+ makefile.msc and config.h.win32 from corresponding .in files when
+ making dist.
+
+ * configure.in: Also substitute @GLIB_INTERFACE_AGE@ and
+ @GLIB_BINARY_AGE@ (needed in config.h.win32).
+
+ * glibconfig.h.win32.in: Use static mutex structure and initial
+ value corresponding to the 1999-04-07 snapshot of pthreads-win32.
+
+ * tests/Makefile.am: Distribute makefile.msc. Generate it when
+ making dist.
+
+ * tests/makefile.msc.in: New file.
+
+ * tests/node-test.c: Include <stdlib.h> for exit().
+
+Thu Apr 29 02:16:36 1999 Tim Janik <timj@gtk.org>
+
+ * gstrfuncs.c: minor code cleanups.
+
+Tue Apr 27 13:11:29 1999 Owen Taylor <otaylor@redhat.com>
+
+ * gmain.c (g_main_poll): Mask out ERR HUP and NVAL from
+ the events field so we don't give IRIX fits.
+
+Tue Apr 20 08:42:22 1999 Tim Janik <timj@gtk.org>
+
+ * gscanner.c (g_scanner_unexp_token): behave conservative with
+ G_TOKEN_IDENTIFIER_NULL and always assume scanner->value.v_string
+ to be "null" in that case.
+
+1999-04-20 Havoc Pennington <hp@pobox.com>
+
+ * gutils.c (g_vsnprintf): When using the vsnprintf()
+ implementation, '\0'-terminate the resulting string
+ and return its length rather than -1.
+
+Mon Apr 19 13:42:21 1999 Owen Taylor <otaylor@redhat.com>
+
+ * gmain.c (g_main_iterate): Added missing
+ #ifdef G_THREADS_ENABLED. (I never liked G_THREADS_ENABLED in
+ the first place!)
+
+1999-04-18 Havoc Pennington <hp@pobox.com>
+
+ * gutils.c (g_snprintf): When using the vsnprintf()
+ implementation, '\0'-terminate the resulting string
+ and return its length rather than -1.
+
+Fri Apr 16 06:52:07 1999 Tim Janik <timj@gtk.org>
+
+ * gscanner.c (g_scanner_unexp_token): feature G_TOKEN_EOF as a valid
+ expected token as well, so we get "- expected end of file" instead of
+ "- expected (unknown) token <0>".
+
+Tue Apr 13 16:16:14 CDT 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.2.2
+
+1999-04-12 Elliot Lee <sopwith@mh69.mh.cuc.edu>
+
+ * g_strchug(): s/strcpy/memmove/
+
+1999-04-12 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Adjusted the test for an unimplemented
+ getpwuid_r. Info from Michael Pruett <mikep@ugcs.caltech.edu>.
+
+Sun Apr 11 15:07:34 1999 Tim Janik <timj@gtk.org>
+
+ * configure.in: bumped versin number to GLib 1.2.2, interface 2,
+ binary 2.
+
+ * NEWS: updates.
+
+Sun Apr 11 14:37:06 1999 Tim Janik <timj@gtk.org>
+
+ * gstrfuncs.c (g_strcasecmp): always check for s1, s2 != NULL.
+
+Sat Apr 10 19:30:50 1999 Tim Janik <timj@gtk.org>
+
+ * glib.h: removed braces around inline strings for the G_GNUC_FUNCTION
+ and G_GNUC_PRETTY_FUNCTION macros, so the macros can be used for
+ compile time string concatenation.
+
+Thu Apr 8 19:53:19 1999 Owen Taylor <otaylor@redhat.com>
+
+ * gmain.c (g_main_iterate): Check for two threads
+ calling g_main_iterate at once.
+
+ * gmain.c: If the set of poll file descriptors changes
+ during a call to poll(), abort that call, and start
+ a new poll. My test program still segfaults
+ obscurely on glibc 2.0 (in read()!!!), but now it works on
+ glibc 2.1, so I'll blame something else for the other segfault.
+
+1999-03-31 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Fixed slight bug, that made configure hang on some
+ systems. Please do not merge this into 1.3 branch. It's taken care
+ of differently there. Info from J. Rhett Aultman
+ <cuplan@alley.gator.net>
+
+Wed Mar 24 21:23:47 CST 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.2.1
+
+ * README:
+ INSTALL:
+ NEWS:
+ sanity_check: updated
+
+ * glibconfig.h.win32.in:
+ Makefile.am:
+ docs/glib-config.1.in:
+ docs/Makefile.am: Added files used to generate new files.
+
+ * glibconfig.h.win32:
+ docs/glib-config.1: Removed, now generated.
+
+ * configure.in: Added to output now-generated files.
+
+Tue Mar 23 13:43:39 PST 1999 Manish Singh <yosh@gimp.org>
+
+ * giounix.c: add user_data param to check and prepare functions
+
+Mon Mar 22 03:54:43 1999 Tim Janik <timj@gtk.org>
+
+ * glib.h:
+ * gmain.c: add user_data to the GSource ->check and ->prepare
+ functions, so it can be used to e.g. pass a GPollFd.
+ (g_main_poll): only add poll records with an events mask != 0 to the
+ fd_array. don't even bother calling poll_func() if fds=timeout=0.
+ added debugging printouts around poll_func() invocation that can be
+ enabled with #define G_MAIN_POLL_DEBUG.
+
+Fri Mar 19 16:29:50 PST 1999 Manish Singh <yosh@gimp.org>
+
+ * acinclude.m4
+ * config.guess
+ * config.sub
+ * ltconfig
+ * ltmain.sh: upgrade to libtool 1.2f
+
+ * autogen.sh: libtool is not required to autogen glib
+
+ * acconfig.h: remove WITH_SYMBOL_UNDERSCORE (not explictly
+ needed)
+
+1999-03-18 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gmem.c: Fixed another stupid fault of mine: Did
+ s/g_static_/g_private_/g
+
+Wed Mar 17 03:17:42 1999 Tim Janik <timj@gtk.org>
+
+ * configure.in bumped versin number to GLib 1.2.1, interface 1,
+ binary 1.
+
+ * NEWS: updates.
+
+ * glib.h: added GLIB_CHECK_VERSION() macro similar to
+ GTK_CHECK_VERSION().
+
+Sun Mar 14 17:50:35 1999 Tim Janik <timj@gtk.org>
+
+ * gmem.c (g_mem_chunk_*): changed a bunch of g_assert() statements
+ to g_return_if_fail().
+ (g_mem_profile):
+ (g_mem_chunk_print):
+ (g_mem_chunk_info): removed some extraneous "\n"s at the end of the log
+ messages.
+
+ * gtimer.c (g_timer_*): changed a bunch of g_assert() statements
+ to g_return_if_fail().
+ * grel.c (g_*): changed a bunch of g_assert() statements to
+ g_return_if_fail() and added some extra ones to check relation != NULL.
+
+1999-03-12 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Also accept _Pctime_r instead of ctime_r, while
+ seraching for the right `_REENTRANT' flag. This is for Digital
+ UNIX 4.0d. Thanks to Sascha Brawer <sb@adasys.ch>.
+
+Tue Mar 9 23:25:50 1999 Tim Janik <timj@gtk.org>
+
+ * configure.in: check for working realloc (NULL,).
+ * gmem.c (g_realloc): use malloc() for initial allocation on systems
+ where realloc(NULL,) will not work (this is the case on SunOS, reported
+ by Tom Geiger).
+
+Mon Mar 8 07:42:08 1999 Tim Janik <timj@gtk.org>
+
+ * ghook.c (g_hook_unref): when !hook_list->is_setup, wrap the
+ flag around the call to g_hook_free() to avoid spurious
+ warnings (happens during destruction phase).
+
+1999-03-03 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glibconfig.h.win32, config.h.win32: Moved G_THREADS_IMPL_POSIX
+ from config.h.win32 to glibconfig.h.win32
+
+ * acconfig.h, configure.in, config.h.win32: Added test for DCE
+ versions of mutex_trylock and cond_timedwait. The win32 versions
+ are posix, aren't they?
+
+1999-03-02 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gmem.c: Fixed a stupid cut'n'paste error of mine. Thanks to
+ Friedrich Dominicus <Friedrich.Dominicus@inka.de>
+
+1999-03-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gutils.c (g_get_any_init): Fixed yet another bloody
+ implementation of getpwuid_r on AIX. Thanks to Olaf Dietsche
+ <olaf.dietsche+list.gtk@netcologne.de>. I would like a configure
+ test better than that, but have no idea, how to do that easily.
+
+Sun Feb 21 22:11:51 CST 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.2.0
+
+ * AUTHORS: updated
+
+Wed Feb 24 00:08:42 CST 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * *.[ch]: inserted additional note to look for ChangeLog and
+ AUTHORS file for a log of modifications.
+
+Sun Feb 21 14:01:00 1999 Dr Mike <drmike@redhat.com>
+
+ * Made specfile generated, tweaked slightly
+
+Sat May 8 06:00:17 CDT 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * configure.in
+ gmodule/Makefile.am
+ gthread/Makefile.am: Better testing reveals better
+ methods. Fixes for BeOS.
+
+Sat May 8 01:52:29 CDT 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * configure.in
+ gerror.c
+ gmain.c
+ gstrfuncs.c
+ gutils.c
+ ltconfig
+ ltmain.sh
+ gmodule/Makefile.am
+ gmodule/gmodule.c
+ gmodule/gmoduleconf.h.in
+ gmodule/gmodule-beos.c
+ gthread/Makefile.am: Port to BeOS by myself and Richard Offer.
+
+1999-05-06 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.msc.in makefile.cygwin.in glibconfig.h.win32.in
+ config.h.win32.in tests/makefile.msc.in tests/makefile.cygwin.in:
+ New files, used to generate corresponding non-.in files when
+ making a dist. This is just so the version numbers will be kept in
+ synch automatically.
+
+ * configure.in: Also substitute @GLIB_MAJOR_VERSION@,
+ @GLIB_MINOR_VERSION@, and @GLIB_INTERFACE_AGE@.
+
+ * Makefile.am tests/Makefile.am: Also distribute makefile.cygwin.
+
+ * gerror.c (g_on_error_query): On Win32, put up a MessageBox and
+ then exit.
+
+ * glib.def: Add a couple of functions.
+
+Sat May 1 10:26:20 PDT 1999 Manish Singh <yosh@gimp.org>
+
+ * acinclude.m4
+ * config.guess
+ * config.status
+ * ltconfig
+ * ltmain.sh: upgrade to libtool 1.3
+
+1999-04-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: More editing.
+ * build-dll: Use gcc, not ld to link.
+ * glib.h: On native Win32 use _unlink().
+ * gscanner.c: Use corrent NATIVE_WIN32 feature test macro,
+ not _MSC_VER.
+ * gstring.c: Include <io.h> on Win32 for _read prototype.
+ * gutils.c: Remove old IO channel code (was in #if 0).
+ * makefile.cygwin: Don't need to link with kernel32 and msvcrt
+ explicitly, they are included anyway.
+
+1999-04-24 Tor Lillqvist <tml@iki.fi>
+
+ Support added for building using a GNU toolchain on Win32,
+ i.e. gcc -mno-cygwin on cygwin (a.k.a. mingw32, using egcs-1.1.2).
+
+ * README.win32: Updated.
+ * build-dll makefile.cygwin tests/makefile.cygwin: New files.
+ * glib.h glib.def glibconfig.h.win32: Slight updates.
+ * gmain.c: No need to include <fcntl.h> and <io.h> on Win32.
+ * gmain.c gutils.c testglib.c tests/string-test.c: Test for
+ NATIVE_WIN32, not _MSC_VER.
+ * gmutex.c: Must declare g_thread_functions_for_glib_use as
+ exported (using the GUTILS_C_VAR macro).
+ * gutils.c gmodule/libgplugin_[ab].c: LibMain not needed.
+ * gmodule/gmoduleconf.h.win32: Need underscore with gcc.
+ * gthread/gthread.c: With gcc on Win32, must use memcpy to assign
+ value of g_thread_functions_for_glib_use (?).
+ * makefile.msc tests/makefile.msc: Cosmetics.
+
+Fri Apr 23 14:29:25 BST 1999 Tony Gale <gale@gtk.org>
+
+ * glib.h: Fix typo in g_string_ncasecmp macro (by me).
+ Add b_string_strncasecmp macro.
+
+1999-04-22 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gutils.c (g_get_any_init): use sysconf (_SC_GETPW_R_SIZE_MAX) as
+ the new initinal bufsize for getpwuid_r on systems, that support
+ this. Hint from Holger Duerer <H.Duerer@zait.uni-bremen.de>.
+
+Sat Apr 17 20:55:13 BST 1999 Tony Gale <gale@gtk.org>
+
+ * glib.h, gstring.c: Add new g_string functions for reading
+ from file/socket descriptors, and tokenising strings.
+
+ Added various g_string macros.
+
+Tue Apr 13 23:28:32 1999 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: Mention the tests directory.
+
+ * glib.def: Add the functions from grand.c.
+
+ * glibconfig.h.win32: Add unsigned max values, and the format
+ strings.
+
+ * makefile.msc: Add grand.
+
+ * tests/{date-test,node-test}.c: Include <stdlib.h> for exit().
+
+ * tests/makefile.msc: New file.
+
+1999-04-12 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib.h: Moved struct declaration up. Style fixes.
+
+ * grand.c: Style fixes. Only try to open /dev/random once.
+
+ * tests/rand-test.c (main): New tests; Slight bug fix.
+
+1999-04-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * grand.c, tests/rand-test.c: New files to implement the Mersenne
+ Twister Pseudo Random Number Generator.
+
+ * glib.h, AUTHORS, Makefile.am, tests/Makefile.am: Changed
+ accordingly.
+
+Thu Apr 8 21:12:30 CDT 1999 Shawn T. Amundson <amundson@gtk.org>
+
+ * Released GLib 1.3.0
+
+1999-03-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Added a check for the right format to printf and
+ scanf long longs. It is %qi instead of %lli on FreeBSD for
+ whatever reason.
+
+1999-03-28 Raja R Harinath <harinath@cs.umn.edu>
+
+ * Makefile.am (glibconfig.h): Make sure `glibconfig.h' exists
+ after the rule is fired.
+ (install-exec-local): Install glibconfig.h only if the contents
+ are different from the currently installed glibconfig.h.
+
+1999-03-26 Raja R Harinath <harinath@cs.umn.edu>
+
+ * Makefile.am (configexecincludedir): Rename from
+ configincludedir so that glibconfig.h will be installed
+ as part of `make install-exec'.
+
+Thu Mar 25 22:45:47 1999 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32: Update version numbers.
+
+ * glibconfig.h.win32: Update version numbers and pthreads-win32-
+ related magic values.
+
+ * README.win32: Some improvements.
+
+ * makefile.msc: Add gqueue and gstack. Correct version number.
+
+Fri Mar 19 16:29:50 PST 1999 Manish Singh <yosh@gimp.org>
+
+ * acinclude.m4
+ * config.guess
+ * config.sub
+ * ltconfig
+ * ltmain.sh: upgrade to libtool 1.2f
+
+ * autogen.sh: libtool is not required to autogen glib
+
+ * acconfig.h: remove WITH_SYMBOL_UNDERSCORE (not explictly
+ needed)
+
+1999-03-18 Jeff Garzik <jgarzik@pobox.com>
+
+ * glib.def: Add new g_list, g_stack, g_queue functions.
+
+1999-03-18 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: added new AC_SUBST(GTHREAD_COMPILE_IMPL_DEFINES)
+ to hold various defines to get the right thread implementation on
+ different platforms. Also look in -ldce for pthread_create. Should
+ make it work on HP-UX 10.x. Information from "D. Emilio Grimaldo
+ Tunon" <emilio_tunon@nl.compuware.com>.
+
+1999-03-17 Jeff Garzik <jgarzik@pobox.com>
+
+ * gstack.c, gqueue.c:
+ Add copyright, clean up code a bit.
+
+1999-03-17 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Added missing values for G_MAXU(SHORT|INT|LONG) on
+ platforms with only /usr/include/values.h.
+
+ * acconfig.h: Removed unnecessary macros.
+
+ * glibconfig.h.win32, config.h.win32: Moved G_THREADS_IMPL_POSIX
+ from config.h.win32 to glibconfig.h.win32. Taken from glib 1.2
+ branch.
+
+ * configure.in: Also accept _Pctime_r instead of ctime_r, while
+ seraching for the right `_REENTRANT' flag. This is for Digital
+ UNIX 4.0d. Taken from glib 1.2 branch.
+
+Wed Mar 17 03:14:56 1999 Tim Janik <timj@gtk.org>
+
+ * glib.h: added GLIB_CHECK_VERSION() macro similar to
+ GTK_CHECK_VERSION().
+
+Wed Mar 17 01:46:28 1999 Tim Janik <timj@gtk.org>
+
+ * merges from glib-1-2:
+
+Sun Mar 14 17:50:35 1999 Tim Janik <timj@gtk.org>
+
+ * gmem.c (g_mem_chunk_*): changed a bunch of g_assert() statements
+ to g_return_if_fail().
+ (g_mem_profile):
+ (g_mem_chunk_print):
+ (g_mem_chunk_info): removed some extraneous "\n"s at the end of the log
+ messages.
+
+ * gtimer.c (g_timer_*): changed a bunch of g_assert() statements
+ to g_return_if_fail().
+ * grel.c (g_*): changed a bunch of g_assert() statements to
+ g_return_if_fail() and added some extra ones to check relation != NULL.
+
+Tue Mar 9 23:25:50 1999 Tim Janik <timj@gtk.org>
+
+ * configure.in: check for working realloc (NULL,).
+ * gmem.c (g_realloc): use malloc() for initial allocation on systems
+ where realloc(NULL,) will not work (this is the case on SunOS, reported
+ by Tom Geiger).
+
+Mon Mar 8 07:42:08 1999 Tim Janik <timj@gtk.org>
+
+ * ghook.c (g_hook_unref): when !hook_list->is_setup, wrap the
+ flag around the call to g_hook_free() to avoid spurious
+ warnings (happens during destruction phase).
+
+1999-03-02 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gmem.c: Fixed a stupid cut'n'paste error of mine. Thanks to
+ Friedrich Dominicus <Friedrich.Dominicus@inka.de>
+
+1999-03-16 Timur Bakeyev <mc@bat.ru>
+
+ * configure.in: Fix problem with pthread_create in libc, as running
+ "gcc test.c -l " is not legal.
+
+1999-03-16 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * tests/type-test.c: Added a test for the
+ G_(U)?INT(16|32|64)_FORMAT and G_(MIN|MAX|MAXU)(SHORT|INT|LONG)
+ macros.
+
+ * configure.in: Removed G_(U)?INT8_FORMAT again, as it can't be
+ used for scanf.
+
+ * configure.in: Added the macros G_MAXU(SHORT|INT|LONG). I do not
+ know how to handle these on platforms with /usr/include/values.h,
+ but without /usr/include/limits.h. Please someone add this.
+
+
+1999-03-15 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Added the macros G_(U)?INT(8|16|32|64)_FORMAT to
+ use for printf and (much more important) scanf format strings for
+ the corresponding GLib types.
+
+ * glib.h Added G_(U)?(SHORT|INT|LONG)_FORMAT for consistency. It
+ however makes no sense to also provide G_(FLOAT|DOUBLE)_FORMAT, as
+ they are different for printf (f for both) and scanf (f for float,
+ lf for double). Defining G_INT_FORMAT makes sense however, as we
+ might want to define gint to something different than int someday
+ in the future. Idea from Sascha Brawer <sb@adasys.ch>.
+
+1999-03-14 Jeff Garzik <jgarzik@pobox.com>
+
+ * gdate.c:
+ Commented out debugging output.
+
+ * tests/Makefile.am, tests/date-test.c:
+ Added test of the GDate module, based closely on testgdate.c.
+
+ * tests/Makefile.am:
+ Bugfix - compile tests with @GLIB_DEBUG_FLAGS@.
+
+1999-03-14 Raja R Harinath <harinath@cs.umn.edu>
+
+ * configure.in (glibconfig.h): Remove widechar tests and defines.
+ (fd_set): Change the grep for `fd_mask' to search for `fd_set'.
+ * gerror.c (fd_mask): Remove conditional typedef. It is not used
+ elsewhere in the file.
+ * gmain.c (fd_mask): Likewise.
+
+1999-03-12 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Test for posix threads first, then for dce threads.
+
+1999-03-11 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Revamped the thread configure stuff. Now dce
+ threads (old posix draft) are recogniced. This is necessary,
+ because dce threads are in fact working quite differently from
+ posix threads. Also changed the conditions for checking for MT
+ safe functions a bit, because G_THREADS_IMPL_NONE still have to
+ compile thread safe. NOTE: Please do not commit my change to
+ glib-1-2/{acconfig.h,configure.in,config.h.win32} from 1999-03-03,
+ as the current change will take care of that too.
+
+Tue Mar 9 14:37:32 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * Makefile.am, glib.h, gstack.c, gqueue.c,
+ tests/Makefile.am, tests/queue-test.c, tests/stack-test.c:
+ Added stack, queue ADTs and related tests.
+
+ * glib.h, glist.c:
+ New g_list_delete() function.
+
+Sat Mar 6 11:03:08 1999 Asbjorn Pettersen <ape@lrdpf.spacetec.no>
+
+ * gutils.c (g_get_any_init): add OS/2 changes.
+ change '\\' in HOME to '/'.
+
+1999-03-03 Josh MacDonald <jmacd@spin.dsl.pacbell.net>
+
+ * glib.def: g_spaced_primes_closest was omitted here, so I
+ couldn't build Xdelta on Windows.
+
+1999-03-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gutils.c (g_get_any_init): Fixed yet another bloody
+ implementation of getpwuid_r on AIX. Thanks to Olaf Dietsche
+ <olaf.dietsche+list.gtk@netcologne.de>. I would like a configure
+ test better than that, but have no idea, how to do that easily.
+
+Sat Feb 27 01:18:47 1999 Tim Janik <timj@gtk.org>
+
+ * ChangeLog: moved old ChangeLog to ChangeLog.pre-1-2, and started
+ new one.
+
+ * configure.in: set glib version to 1.3.0.
diff --git a/trunk/ChangeLog.pre-2-10 b/trunk/ChangeLog.pre-2-10
new file mode 100644
index 000000000..b2074b998
--- /dev/null
+++ b/trunk/ChangeLog.pre-2-10
@@ -0,0 +1,1368 @@
+2006-03-23 Matthias Clasen <mclasen@redhat.com>
+
+ Retroactively branch for 2.10 before the last commit.
+
+ * glib/gtimer.c: Change to "Since 2.12".
+
+2006-03-23 Emmanuele Bassi <ebassi@cvs.gnome.org>
+
+ * configure.in: Check for timegm.
+
+ * glib/gtimer.h:
+ * glib/gtimer.c:
+ * glib/glib.symbols:
+ * docs/reference/glib/glib-sections.txt: Added g_time_val_to_iso8601
+ and g_time_val_from_iso8601, to convert a GTimeVal to and from an
+ ISO 8601 encoded date.
+
+ * tests/testglib.c: Added test cases for g_time_val_to_iso8601()
+ and g_time_val_from_iso8601() functions.
+
+2006-03-20 Vladimer Sichinava <vlsichinava@gmail.com>
+
+ * configure.in: Added "ka" (Georgian) to ALL_LINGUAS
+
+2006-03-20 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmem.c (profiler_log): use standard_calloc to allocate
+ the profile_data. (#335209, Chris Wilson)
+
+ * glib/gmain.c (g_main_context_unref): Avoid a deadlock.
+ (#335207, Chris Wilson)
+
+ Minor optimizations (#335216, Chris Wilson):
+
+ * glib/gasyncqueue.c (g_async_queue_pop_intern_unlocked): Use
+ g_queue_peek_tail_link instead of g_queue_peek_tail.
+
+ * glib/glist.c:
+ * glib/gslist.c: Avoid some memset calls.
+
+2006-03-19 Matthias Clasen <mclasen@redhat.com>
+
+ * MAINTAINERS: Add this, at the request of the GNOME sysadmin team.
+
+2006-03-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c (g_option_context_parse): Only set the prgname
+ if it hasn't been set before. (#334611, Chong Kai Xiong)
+
+2006-03-14 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.c (g_parse_debug_string): Don't read past the
+ end of the string. (#334471, Morten Welinder)
+
+ * tests/testglib.c (test_g_parse_debug_string): Add testss
+ for g_parse_debug_string.
+
+ * glib/goption.c (parse_short_option): Don't create the
+ option_name twice. (#334519, Chris Wilson)
+
+2006-03-13 Anders Carlsson <andersca@luminoth.local>
+
+ * configure.in: Revert fix for #322476, it breaks module loading
+ since libtool on darwin makes shared modules use .so and shared
+ libraries use .dylib. The fix breaks shared module loading everywhere
+ in GTK+.
+
+2006-03-02 Marcus Brinkmann <mb@g10code.de>
+
+ Implement watches for GIOChannels for write file descriptors on
+ Win32 (#333098).
+
+ * glib/giowin32.c (GIOWin32Channel): Add a new direction field.
+ (read_thread): Initialize direction.
+ (write_thread): New function.
+ (buffer_write): New function.
+ (g_io_win32_prepare): Handle the G_IO_WIN32_FILE_DESC case for the
+ write direction.
+ (g_io_win32_fd_write): Call buffer_write() if there is a writer
+ thread.
+ (g_io_win32_fd_close): Set space_avail_event for writer threads.
+ (g_io_win32_fd_create_watch): Create the writer thread if
+ condition is G_IO_OUT.
+ (g_io_channel_win32_make_pollfd): Likewise here.
+
+2006-03-09 Matthias Clasen <mclasen@redhat.com>
+
+ * Makefile.am: Add ChangeLog.pre-2.8 to EXTRA_DIST.
+
+2006-03-08 Tor Lillqvist <tml@novell.com>
+
+ * glibconfig.h.win32.in: Add G_GUINT64_CONSTANT.
+
+2006-03-07 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.10.1 ===
+
+ * NEWS: Updates.
+
+ * glib/gutf8.c (_g_charset_get_aliases): Match the prototype
+ in gconvert.c to fix build problems in NetBSD. (#333651,
+ Julio M. Merino Vidal)
+
+2006-03-06 Anders Carlsson <andersca@imendio.com>
+
+ * configure.in:
+ Make .dylib the shared library suffix on darwin.
+ (#322476, Vladimir Panov)
+
+2006-03-06 Anders Carlsson <andersca@imendio.com>
+
+ * configure.in:
+ Skip checking thread flags on Darwin. Fix suggested by Manish Singh.
+ (#314794, Gregor Riepl)
+
+2006-03-01 Tor Lillqvist <tml@novell.com>
+
+ * glib/gutils.c (g_listenv): Separate implementation on Win32: Use
+ the wide character API on NT-based Windows. Return UTF-8 strings.
+
+ * glib/glib.symbols: Don't mark g_listenv as PRIVATE, as that
+ meant it wasn't present in the import library. PRIVATE is used
+ only for the backwards-compatibility DLL ABI stability hacks.
+
+2006-02-24 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.10.0 ===
+
+ * README.in: Mention the slice allocator and GInitiallyUnowned.
+
+ * NEWS: Updates
+
+ * configure.in: Bump version to 2.10.0
+
+ * tests/utf8-pointer.c: Add tests for g_utf8_strlen().
+
+ * glib/gutf8.c: Fix boundary cases in g_utf8_strlen().
+ (#332435)
+
+2006-02-23 Kjartan Maraas <kmaraas@gnome.org>
+
+ * tests/completion-test.c: (main): Plug leaks reported by
+ valgrind.
+ * tests/convert-test.c: (test_iconv_state), (test_one_half):
+ Same.
+ * tests/patterntest.c: (test_compilation): Same
+ * tests/shell-test.c: (do_argv_test): Same.
+ * tests/unicode-caseconv.c: (main): Same.
+ * tests/uri-test.c: (run_to_uri_tests): Same.
+ Closes bug #332093.
+
+2006-02-19 Martyn Russell <martyn@imendio.com>
+
+ * tests/asyncqueue-test.c:
+ * tests/list-test.c:
+ * tests/slist-test.c: Updated to test _sort, _sort_with_data,
+ _insert_sorted and _insert_sorted_with_data API.
+
+2006-02-18 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/gobject/Makefile.am: Add paramspec-test
+
+ * tests/gobject/paramspec-test.c: Some GParamSpec tests.
+
+ * tests/gobject/gvalue-test.c: Add more tests.
+
+2006-02-17 Kang Jeong-Hee <keizie@gmail.com>
+
+ * glib/gutf8.c (g_utf8_find_prev_char): Correct documentation typo.
+
+2006-02-15 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * glib/gthreadpool.c: Fix deadlock when signalling the thread
+ which freed a thread pool (#331110, Chris Wilson).
+
+Tue Feb 14 17:00:43 2006 Tim Janik <timj@imendio.com>
+
+ * glib/gslice.c: only define _XOPEN_SOURCE to 600 to get at
+ posix_memalign() in case we actually are going to use it, because
+ we detected a compliant implementation (#328997).
+
+ * configure.in (enable_included_printf): don't include malloc.h when
+ testing for posix_memalign() funcitonality, since this may break the
+ test on some systems (#328997).
+
+2006-02-14 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gstrfuncs.c: Improve docs.
+
+2006-02-11 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+2006-02-10 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.6 ===
+
+ * NEWS: Updates
+
+2006-01-31 Behdad Esfahbod <behdad@gnome.org>
+
+ * docs/reference/glib/tmpl/relations.sgml (g_relation_insert): Specify
+ the type of varargs arguments. (bug #317679)
+
+2006-01-31 Matthias Clasen <mclasen@redhat.com>
+
+ * autogen.sh: Touch README and INSTALL here to pacify
+ automake. (#329124, Kjartan Maraas, Tim Janik)
+
+Tue Jan 31 16:45:03 2006 Tim Janik <timj@imendio.com>
+
+ * glib/gdataset.c: carry out all dtalist pointer accesses atomically,
+ some missing cases where pointed out by Sebastian Wilhelmi.
+
+Tue Jan 31 12:33:48 2006 Tim Janik <timj@imendio.com>
+
+ * configure.in: generate build/win32/vs8/Makefile, to fix build breakage.
+
+2006-01-30 David Schleef <ds@schleef.org>
+
+ * glib/grand.c: Update URL
+
+2006-01-29 Sven Herzberg <herzi@gnome-de.org>
+
+ * docs/reference/gobject/tmpl/param_value_types.sgml: tell how to
+ create container classes which are as flexible as a GValue is
+
+2006-01-27 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.9.5 ===
+
+ * glib/glib.symbols: Add g_mem_gc_friendly as an exported
+ variable.
+
+ * NEWS: Updates
+
+2006-01-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmem.c (g_mem_init_nomessage): Fix C99isms. (#328705,
+ Kazuki Iwamoto)
+
+Wed Jan 25 19:16:57 2006 Tim Janik <timj@imendio.com>
+
+ * fixed buglets reported by Jens Granseuer in #328254.
+
+ * configure.in: free the memory allocated in posix_memalign() tests.
+
+ * glib/gslice.c: spelling fixes.
+
+Wed Jan 25 16:39:18 2006 Tim Janik <timj@imendio.com>
+
+ * glib/gslice.c: honour g_mem_gc_friendly settings when freeing
+ slices, make sure g_mem_gc_friendly is properly initialized.
+
+ * gmem.[hc]: ensure g_mem_gc_friendly is initialized from G_DEBUG upon
+ the first allocation. applied some branching optimizations.
+
+ * docs/macros.txt: reflected --enable-gc-friendly change and
+ described ENABLE_GC_FRIENDLY_DEFAULT as well as G_DEBUG=gc-friendly.
+
+ * configure.in: changed --enable-gc-friendly=yes to define
+ ENABLE_GC_FRIENDLY_DEFAULT.
+
+ * glib/garray.c: changed ENABLE_GC_FRIENDLY macro #ifdef-s to
+ if (G_UNLIKELY (g_mem_gc_friendly)).
+
+ * glib/gtree.c:
+ * glib/ghash.c: removed ENABLE_GC_FRIENDLY code which is now taken
+ care of by g_slice_free1().
+
+ * tests/slice-test.c: fixed leaks, reported by Kjartan Maraas.
+
+Tue Jan 24 17:49:36 2006 Tim Janik <timj@imendio.com>
+
+ * glib/gslice.c: only use posix_memalign() if it's known to work,
+ revert to memalign() otherwise.
+
+ * configure.in: check for broken posix_memalign() implementations
+ to fix #328254.
+
+2006-01-24 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/unicode-encoding.c: Use UTF-16LE as target encoding
+ on all little-endian systems. (#143380, Marc Moorcroft)
+
+2006-01-23 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Change the shared libary extension for hpux-ia64
+ to so. (#328253, The Written Word)
+
+Mon Jan 23 17:30:33 2006 Tim Janik <timj@imendio.com>
+
+ * glib/gutils.c (_g_getenv_nomalloc): wiped out all the wonderfull
+ G_OS_WIN32 code i wrote ;-[) after tml told me windows has getenv()
+ as well.
+
+Mon Jan 23 16:46:20 2006 Tim Janik <timj@imendio.com>
+
+ * glib/gslice.c (slice_config_init): initialize GSlice config from
+ G_SLICE environment variable. we support G_SLICE=always-malloc
+ currently, which forces all g_slice_*() allocations to use the system
+ malloc instead.
+
+ * glib/gutils.c:
+ g_parse_debug_string(): added a note about not using g_malloc() here.
+ _g_getenv_nomalloc(): getenv() variant that doesn't use g_malloc or
+ g_slice. contains only guesswork in the WIN32 branch.
+
+2006-01-18 Matthias Clasen <mclasen@redhat.com>
+
+ * Bump version
+
+ * === Released 2.9.4 ===
+
+ * NEWS: Updates
+
+2006-01-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_get_groups): Correct a g_new0()
+ call. (#327421, Morten Welinder)
+
+2006-01-17 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * glib/gthreadpool.c: To avoid deadlocks get rid of the settings
+ G_LOCK. Use the unused_thread_queue lock instead. Change
+ g_thread_pool_thread_proxy such that threads only wait on
+ non-exlusive pools for at most a 1/2 second. Do not reorder tasks
+ due to superfluous tasks. Global tasks wait at most for
+ max-idle-time milliseconds. Make sure, that no task is woken up
+ twice for the same event via a wakeup_serial. This fixes #324228.
+
+ * tests/threadpool-test.c: Adapt test accordingly. Do not pass
+ invalid NULL into the thread pools. This as well fixes #327290.
+
+2006-01-16 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.9.3 ===
+
+ * NEWS: Updates
+
+ * glib/gthread.h (g_static_mutex_get_mutex_impl_shortcut):
+ Rework the strict aliasing fix to not break C++, pointed
+ out by Murray Cumming.
+
+ * glib/gasyncqueue.c (g_async_queue_push_sorted_unlocked):
+ Signal waiting threads, problem noticed by Christian Kellner.
+
+2006-01-16 Matthias Clasen <mclasen@redhat.com>
+
+ Fix bug 326747, Alberto Ruiz:
+
+ * glib/gconvert.c (make_valid_utf8): Change this function to
+ replace unknown characters by the Unicode replacement character
+ instead of '?', and don't append "(invalid encoding)".
+ (g_filename_display_name, g_filename_display_basename): Document
+ how to determine if the filename was in an invalid encoding.
+
+2006-01-14 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gtree.c: Replace the simple recursive implementation
+ by a nonrecursive, threaded implementation by Maurizio
+ Monge. (#169285)
+
+2006-01-12 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/asyncqueue-test.c (main): Fix the
+ assert to not always trigger. (#326558,
+ Daichi Kawahata)
+
+2006-01-11 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/convert-test.c: Don't test items_read and
+ items_written in error cases where it is not set.
+
+ * tests/asyncqueue-test.c: Set error to NULL.
+
+2006-01-08 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gtree.c: Break some long lines.
+
+ * tests/tree-test.c: Add more tests.
+
+ * glib/gslice.c: Include config.h first, pointed out
+ by Bogdan Nicula.
+
+2005-12-20 Sven Herzberg <herzi@gnome-de.org>
+
+ * docs/reference/gobject/tmpl/gtype.sgml: explain that
+ G_TYPE_INSTANCE_GET_CLASS() does behave different during
+ initialization
+
+2006-01-06 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gslice.c: Only define _XOPEN_SOURCE if we know
+ that we have posix_memalign(). (#323937, Bogdan Nicula)
+
+2006-01-05 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.9.2 ===
+
+2006-01-05 Hans Breuer <hans@breuer.org>
+
+ * glib/makefile.msc.in : added gslice.obj
+
+2006-01-05 Matthias Clasen <mclasen@redhat.com>
+
+ * NEWS: Updates
+
+ * glib/gmain.c: Clarify the documentation of source ids
+ a bit. (#325874, Dan Williams)
+
+ * configure.in: Fix another strict aliasing problem.
+
+ * glib/gthreadpool.c: Avoid use of varargs macro. (#325864,
+ Kazuki IWAMOTO)
+
+2006-01-04 Manish Singh <yosh@gimp.org>
+
+ * glib/glib.symbols
+ * glib/gstdio.h: don't macroized g_access, g_chdir, and g_unlink
+ either, since they have the same issue as g_rmdir. (Related to
+ bug #325249)
+
+Wed Jan 4 13:33:25 2006 Tim Janik <timj@gtk.org>
+
+ * glib/gslice.c (magazine_cache_pop_magazine): don't reverse chunk
+ order when creating magazines, so we hand out chunks with ascending
+ adresses.
+
+2006-01-04 Abel Cheung <maddog@linuxhall.org>
+
+ * configure.in: Added "ml" "zh_HK" to ALL_LINGUAS.
+
+2006-01-03 Martyn Russell <martyn@imendio.com>
+
+ * docs/reference/glib/glib-sections.txt:
+ * glib/glib.symbols:
+ * glib/gthreadpool.[ch]:
+ - Added new API g_thread_pool_get_idle_time() and
+ g_thread_pool_set_idle_time(). (#324228).
+
+ * tests/threadpool-test.c:
+ - Updated test case to do thread pool sorting, thread pool with
+ no sorting and a thread pool with idle thread timeouts.
+
+2006-01-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmain.h: Add new functions here, too.
+
+ * glib/glib.symbols: Add new functions.
+
+2005-12-20 Michael Meeks <michael.meeks@novell.com>
+
+ * glib/gmain.c (g_main_context_is_owner): new method
+ to determine if the current thread is the owner of the
+ context.
+
+2006-01-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols:
+ * glib/gstdio.h:
+ * glib/gstdio.c (g_rmdir): Don't provide g_rmdir() as a macro
+ expanding to rmdir, since rmdir is not declared in a portable
+ system header we can include in gstdio.h. (#325249, Jani Monoses)
+
+2006-01-01 Tor Lillqvist <tml@novell.com>
+
+ * glib/gspawn-win32.c (g_spawn_sync_utf8): Set the GIOChannels for
+ stdout and stderr to unbuffered. Otherwise the giochannel layer
+ will try to read from them regardless whether the
+ g_io_channel_win32_poll() call here has indicated
+ readability or not. (#325310)
+
+2005-12-29 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.c (glib_check_version): Fix a copy-and-paste error
+ in the docs. (#325273, Declan Naughton)
+
+2005-12-27 Manish Singh <yosh@gimp.org>
+
+ * tests/run-collate-tests.sh: use LC_ALL instead of LC_COLLATE, to
+ make sure we really override things.
+
+2005-12-27 Matthias Clasen <mclasen@redhat.com>
+
+ Fix #316221, Michal Benes, Stanislav Brabec;
+
+ * configure.in: Fix a strict aliasing problem in
+ g_static_mutex_get_mutex().
+ * glib/gthread.h: ...and in
+ g_static_mutex_get_mutex_impl_shortcut().
+
+ * glib/gdatasetprivate.h: Add a cast to silence compiler
+ warnings. (#321978, Andrew Paprocki)
+
+ Partial fix for bug #323937, Bogdan Nicula.
+
+ * configure.in: Check for malloc.h
+ * glib/gslice.c: Don't include malloc.h unconditionally.
+
+2005-12-27 Manish Singh <yosh@gimp.org>
+
+ * tests/run-collate-tests.sh: export LC_COLLATE so it takes.
+ (#324950, Dan Yefimov)
+
+2005-12-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gslice.c: On Win32, include process.h (#325015, Kazuki
+ Iwamoto)
+
+2005-12-25 Matthias Clasen <mclasen@redhat.com>
+
+ * AUTHORS: Update my email
+
+ * tests/slice-test.c: Fix C99isms. (#324950, Dan Yefimov)
+
+2005-12-21 Matthias Clasen <mclasen@redhat.com>
+
+ * README.in: Add some notes on when 'make check' may fail.
+
+2005-12-20 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols:
+ * glib/gthreadpool.h:
+ * glib/gthreadpool.c (g_thread_pool_set_sort_function): New function
+ to sort tasks pushed into a threadpool. (#324479, Martyn Russell)
+
+ * tests/threadpool-test.c: Test this.
+
+Tue Dec 20 18:14:14 2005 Tim Janik <timj@imendio.com>
+
+ * glib/gslice.[hc]: added mem_error() and mem_assert() to test and
+ handle errors without depending on gmessage.c which might not be
+ setup when the error occours.
+ removed G_SLICE_CONFIG_ALWAYS_FREE config option, fixed the code so
+ always freeing can be achieved by adjusting the working set time to
+ 0 with G_SLICE_CONFIG_WORKING_SET_MSECS.
+ added G_SLICE_CONFIG_COLOR_INCREMENT to test different color increments
+ (mainly 0 and 1). reduced the minimum block size to 128 bytes, to
+ minimize wastage if small amounts of differently sized structrues are
+ allocated, this does come at a performance cost of roughly 5% though.
+ fixed up block alignment calculation, so it works for varying
+ block sizes. only use strerror() not g_strerror() since the latter
+ depends on working GQuark and GSlice.
+ mem_error(): implemented in terms of fprintf and vfprintf.
+
+ * tests/slice-color.c: new program to test cache colorization effects.
+
+ * tests/slice-test.c: trade G_SLICE_CONFIG_ALWAYS_FREE for 0 duration
+ G_SLICE_CONFIG_WORKING_SET_MSECS.
+
+2005-12-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c (parse_short_option): Set an error in all
+ failure cases. (#324332, Tim-Philipp Müller)
+
+2005-12-17 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * glib/gatomic.c: Fix memory barrier position in g_atomic_int_get
+ and g_atomic_pointer_get. Add g_atomic_int_set and
+ g_atomic_pointer_set implementations for the !DEFINE_WITH_MUTEXES &&
+ G_ATOMIC_OP_MEMORY_BARRIER_NEEDED case, as well as defining them
+ as functions (additionally to the macros in the header) for the
+ !G_ATOMIC_OP_MEMORY_BARRIER_NEEDED case.
+
+2005-12-16 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmem.c (g_allocator_new): Don't return a pointer to
+ a const struct, since apps expect to be able to modify it.
+ (#324179, J. Ali Harlow)
+
+Tue Dec 13 10:13:32 2005 Tim Janik <timj@imendio.com>
+
+ * glib/gatomic.h: added g_atomic_pointer_set() and g_atomic_int_set()
+ for systems where the initialization of atomic variables requires a
+ write memory barrier.
+
+2005-12-09 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.9.1 ===
+
+2005-12-09 Alexander Larsson <alexl@redhat.com>
+
+ * glib/glist.h:
+ * glib/gslist.h:
+ Use G_GNUC_WARN_UNUSED_RESULT on list functions that return
+ the whole list.
+
+2005-12-08 Matthias Clasen <mclasen@redhat.com>
+
+ * NEWS: Updates
+
+2005-12-07 Martyn Russell <martyn@imendio.com>
+
+ * glib/gasyncqueue.c:
+ - Call g_queue_insert_sorted() instead of duplicating the code.
+ - Call g_queue_sort() instead of duplicating the code.
+ - Invert sort function results to make sure the same sort function
+ gives the same results across glist, gslist, gqueue and
+ gasyncqueue.
+
+ * tests/asyncqueue-test.c:
+ - Updated the sort function to reflect the example in the
+ documentation for gasyncqueue.c.
+
+2005-12-07 Martyn Russell <martyn@imendio.com>
+
+ * docs/reference/glib/glib-sections.txt:
+ * docs/reference/glib/tmpl/linked_lists_double.sgml:
+ * docs/reference/glib/tmpl/linked_lists_single.sgml:
+ * glib/glist.[ch]:
+ * glib/gslist.[ch]:
+ - Added g_list_insert_sorted_with_data () and
+ g_slist_insert_sorted_with_data ().
+ - Removed the extra check in g_list_sort() and g_slist_sort() for
+ GCompareDataFunc vs. GCompareFunc.
+
+2005-12-07 Tor Lillqvist <tml@novell.com>
+
+ * glib-gettextize.in: Look up prefix at run-time on Win32,
+ assuming the standard directory structure with glib-gettextize in
+ $prefix/bin.
+
+2005-12-06 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmem.h: Exempt GTK+ from the mem chunk deprecation, since
+ we need GTK+ 2.8 to compile against GLib 2.10.
+
+2005-12-05 Manish Singh <yosh@gimp.org>
+
+ * tests/run-collate-test.sh: set LC_COLLATE, not LANG, to be sure
+ to override any user settings.
+
+2005-12-05 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Revert an accidential commit
+
+2005-12-05 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutf8.c: Documentation updates. (#323291, Morten Welinder)
+
+ * tests/Makefile.am (TESTS_ENVIRONMENT):
+ * tests/gobject/Makefile.am (TESTS_ENVIRONMENT): Set
+ MALLOC_CHECK_ and MALLOC_PERTURB_
+
+ * tests/run-collate-tests.sh: Run the collation tests explicitly
+ in en_US locale. (#320463)
+
+ * glib/gmem.h: Really deprecate GMemChunk.
+
+ * glib/gdate.c:
+ * glib/gutils.c:
+ * glib/gtree.c:
+ * glib/gstring.c:
+ * glib/giochannel.c:
+ * glib/gstrfuncs.c: Add versioned deprecation docs.
+
+2005-12-05 Martyn Russell <martyn@imendio.com>
+
+ * docs/reference/glib/glib-sections.txt:
+ * glib/gasyncqueue.[ch]:
+ - Added support for sorting async queues by with _push_sorted(),
+ _push_sorted_unlocked(), _sort() and _sort_unlocked() (#323047).
+
+ * tests/Makefile.am:
+ * tests/asyncqueue-test.c:
+ - Added test case for gasyncqueue.c
+
+Mon Dec 5 15:53:20 2005 Tim Janik <timj@imendio.com>
+
+ * glib/gslice.c: implement chain walking for arbitrary ->next pointer
+ offsets in g_slice_free_chain_with_offset() based on a patch by behdad
+ in bug 323178. moved time consuming logic from g_slice_free() out of
+ the inner loop, so g_slice_free_chain_with_offset() provides a real
+ performance benefit over g_slice_free1() now.
+
+ * glib/gslice.h: renamed g_slice_free_chain() to
+ g_slice_free_chain_with_offset(). implemented g_slice_free_chain() as
+ a type-safe macro as suggested in bug 323178.
+ simplified the macro implementation of g_slice_free() and implemented
+ it in a type safe manner for all compliers as suggested by Morten
+ Welinder <mortenw@gnome.org>.
+
+ * glib/gmain.c:
+ * glib/glist.c:
+ * glib/gslist.c:
+ * glib/glib.symbols: s/g_slice_free_chain/g_slice_free_chain_with_offset/
+
+2005-12-05 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gasyncqueue.c: Add some docs.
+
+ * tests/libmoduletestplugin_a.c: Fix compiler warnings.
+
+ * glib/gatomic.c: In the ia64 implementation, use
+ __sync builtin without _si or _di suffix. (#321229,
+ Stanislav Brabec, patch by Andreas Schwab)
+
+2005-12-04 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/gslice.h: Remove comma at the end of enum.
+
+2005-12-04 Matthias Clasen <mclasen@redhat.com>
+
+ Handle multiple user names with the same UID better.
+ (#319535, Laszlo Peter)
+
+ * glib/gutils.c (g_get_any_init_do): When determining user
+ data, first look up $LOGNAME. If the UID doesn't match
+ getuid(), fall back to the current behaviour of looking
+ up the user data based on getuid().
+
+2005-12-04 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmacros.h (G_GNUC_WARN_UNUSED_RESULT): Add a macro
+ to make gcc warn if a function result is ignored. (#145466,
+ Arjan van de Ven, Alex Larsson)
+
+ * glib/gmem.h: Add the new attribute to g_realloc and
+ g_try_realloc.
+
+2005-12-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols:
+ * glib/gcache.h: Deprecate g_cache_value_foreach. (#322956,
+ Nicolas Caniart)
+
+ * glib/gmappedfile.c: Make mapping of empty files
+ work. (#321530)
+
+ * glib/gfileutils.c: Don't fork a new process just to
+ fix the permissions of the created temp file. (#321318,
+ Alexis S. L. Carvalho)
+
+2005-12-02 Matthias Clasen <mclasen@redhat.com>
+
+ * README.in: Add a note about Solaris threads.
+
+ * glib/gspawn.c:
+ * configure.in: Remove support for Solaris threads.
+ (#136971, Sebastian Wilhelmi, patch by Andrew Paprocki)
+
+2005-12-02 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Define G_GUINT64_CONSTANT in analogy to
+ G_GINT64_CONSTANT. (#322568, Andrew Paprocki)
+
+2005-12-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gslice.c: Win32 portability fixes and C99ism removal,
+ pointed out by Kazuki Iwamoto. (#323052)
+
+2005-12-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gatomic.c (g_atomic_int_add): Add a missing volatile for
+ the IA64 implementation.
+
+Fri Dec 2 16:18:09 2005 Tim Janik <timj@imendio.com>
+
+ * glib/gslice.c: some naming and type size fixups.
+
+Fri Dec 2 13:08:58 2005 Tim Janik <timj@gtk.org>
+
+ * glib/gslice.h (g_slice_free): reworked GCC-specific type-safe macro
+ variant into something less verbose, but digestible for gcc-3.4.
+
+Fri Dec 2 10:55:07 2005 Tim Janik <timj@imendio.com>
+
+ * tests/slice-test.c: extended to perform the benchmarking on the old
+ memchunk code if 'O' is selected.
+
+ * tests/memchunks.c: new file which contains the old GLib mem chunks
+ implementation with prefix old_mem_chunk_.
+
+ * tests/Makefile.am: added memchunks.c
+
+Fri Dec 2 00:16:59 2005 Tim Janik <timj@imendio.com>
+
+ * glib/gslice.c: improved gettimeofday() timer resolution by maintaining
+ acceptable load distribution of the syscall.
+ (allocator_get_magazine_threshold): reduce minimum/single-thread magazine
+ sizes to approximately page_size/2.5 to avoid excessive startup allocations.
+
+2005-12-01 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/gobject/ifacecheck.c (test_iface_base_init): Don't
+ double-free base interface members.
+
+ * tests/Makefile.am: Remove duplicate variable.
+
+Thu Dec 1 17:32:46 2005 Tim Janik <timj@imendio.com>
+
+ * glib/gslice.[hc]: new slice allocator implementation.
+
+ * tests/slice-test.c: added random slice allocation test.
+
+ * glib/gthread.[hc]: removed newly added private thread mem API.
+
+ * glib/gthreadinit.h:
+ * glib/gmessages.c:
+ * glib/gthread.c:
+ * glib/gmem.c: divided glib threading initialisation into three phases,
+ initialisation where private keys and messaging are not available (only
+ needed by gmem.c), initialisation without messaging but private keys
+ available (gslice.c, gmessage.c), and full fledged initialisers that
+ server the rest of glib. initialisation functions got renamed to reflect
+ the limitations of their corresponding phases.
+
+ * glib/gmem.c: removed memchunk code, defer allocations to
+ g_slice_* instead.
+
+ * glib/gmem.[hc]: removed g_slice_* skeletons.
+
+ * glib/glib.symbols: added g_slice_* symbols.
+
+ * configure.in: check for availability of posix_memalign(3), memalign(3)
+ and valloc(3).
+
+ * glib/Makefile.am: added gslice.[hc].
+
+2005-12-01 Tor Lillqvist <tml@novell.com>
+
+ * glib/gstdio.c (g_stat): In the Win32 implementation, strip
+ trailing slash(es) for non-root folders. stat() fails if non-root
+ folders are specified with trailing slashes. It's too much hassle
+ to demand that callers strip such slashes themselves, especially
+ as it is easy to get it wrong and strip the slash of a root
+ folder.
+ (g_rename): On NT-based Windows, use MoveFileEx() with
+ MOVEFILE_REPLACE_EXISTING to better match Unix behaviour.
+
+2005-11-28 Matthias Clasen <mclasen@redhat.com>
+
+ Fix G_STMT_START / G_STMT_END on Solaris. (#321972,
+ Andrew Paprocki)
+
+ * configure.in: Check whether do { } while (0) works.
+
+ * glib/gmacros.h: Use do { } while (0) for G_STMT_START /
+ G_STMT_END if it works.
+
+2005-11-28 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gthread.c (g_static_rw_lock_wait, g_static_rw_lock_signal):
+ * glib/gnode.c (g_node_depth_traverse_level):
+ * glib/gmem.c (g_allocator_new):
+ * glib/ghash.c (g_hash_table_unref, g_hash_table_destroy)
+ (g_hash_table_foreach_remove_or_steal): Silence compiler
+ warnings.
+
+2005-11-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gunicollate.c (g_utf8_collate_key_for_filename):
+ Don't read beyond len. (#322520, Christian Persch)
+
+Wed Nov 23 17:34:01 2005 Tim Janik <timj@imendio.com>
+
+ * glib/gdataset.c: access datalist flags via atomic pointer access
+ functions, instead of acquiring the dataset lock. this is faster and
+ also matches the atomic pointer readouts in gdatalistprivate.h and
+ direct pointer modifications required by gobject.c.
+
+Wed Nov 23 13:35:31 2005 Tim Janik <timj@gtk.org>
+
+ * glib/gdataset.c: streamlined initialization code somewhat,
+ removed GData node cache.
+
+2005-11-22 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/ghash.c (g_hash_table_ref):
+ (g_hash_table_unref): Mark these as new API.
+
+ Avoid double locking in g_intern_string (#322133,
+ Benedikt Meurer)
+
+ * glib/gdataset.c (g_quark_from_string_internal): New
+ internal function which factors out common parts of
+ g_quark_from[_static]_string.
+ (g_quark_from_string, g_quark_from_static_string):
+ Use g_quark_from_string_internal.
+ (g_intern_string, g_intern_static_string): Use
+ g_quark_from_string_internal, and only take the
+ lock once.
+ (g_quark_new): Don't store the strings shifted by -1
+ in the g_quarks array.
+ (g_quark_to_string): Adapt to the previous change.
+
+Tue Nov 22 14:04:26 2005 Tim Janik <timj@imendio.com>
+
+ * glib/ghash.h:
+ * glib/ghash.c:
+ g_hash_table_new_full(): create hash tables with a ref count of 1.
+ g_hash_table_ref(): atomically ref_count+=1
+ g_hash_table_unref(): atomically ref_count-=1, destroys hash table
+ when refcount reaches 0.
+ g_hash_table_destroy(): just destroy keys and values, unref by 1.
+ g_hash_table_insert():
+ g_hash_table_replace(): assert ref_count>0.
+
+ * glib/gatomic.h:
+ * glib/gatomic.c: added 'volatile' qualifier to all atomic pointer and
+ integer pointers.
+
+2005-11-20 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/guniprop.c (g_unichar_get_mirror_char): Remove unused
+ variables. (#321984, Andrew Paprocki)
+
+2005-11-18 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+2005-11-17 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.0 ===
+
+ * glib/glib.symbols: Updates
+
+ * glib/gutf8.c (g_utf8_offset_to_pointer): Add some performance
+ hints to the docs. (Paolo Borelli)
+
+ * NEWS: Updates
+
+ * glib/gthread.c (g_thread_foreach): Mark as new api.
+
+ * README.in: Updates.
+
+ * glib/glib.symbols:
+ * glib/gdate.h:
+ * glib/gdate.c (g_date_set_time_t):
+ (g_date_set_time_val): Add functions to set a date from
+ a time_t and from a GTimeVal.
+ (g_date_set_time): Deprecate. (#314067, Roger Leigh)
+
+ * tests/Makefile.am:
+ * tests/utf8-pointer.c: Unit tests for g_utf8_pointer_to_offset
+ and g_utf8_offset_to_pointer.
+
+ * glib/gutf8.c (g_utf8_pointer_to_offset)
+ (g_utf8_offset_to_pointer): Handle negative offsets, and use
+ "stutter stepping" for going backwards. (#320638, Larry
+ Ewing)
+
+ * glib/gbacktrace.c:
+ * glib/gdate.c:
+ * glib/gthread.c: const correctness fixes, found
+ by Arjan van de Ven and gcc.
+
+2005-11-16 Behdad Esfahbod <behdad@gnome.org>
+
+ * docs/reference/glib/tmpl/unicode.sgml: Correct typo on mentioning
+ @G_UNICODE_BREAK_UNKNOWN that should be #G_UNICODE_BREAK_UNKNOWN.
+
+2005-11-09 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/guniprop.c: Use bit hacks instead when checking a general
+ category value against multiple values.
+
+ * glib/gutf8.c: Change ISO10646 to Unicode in docs.
+
+2005-11-10 Simos Xenitellis <simos@gnome.org>
+
+ * configure.in: Added tt (Tatar) to ALL_LINGUAS.
+
+2005-11-05 Tor Lillqvist <tml@novell.com>
+
+ * glib/giowin32.c (g_io_win32_set_flags): Don't call g_warning().
+ (#320688) Instead set error and return failure.
+
+2005-11-07 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmain.c (g_main_dispatch): Don't call cb_funcs->unref
+ while holding the context lock. (#320886, Andy Wingo)
+
+2005-11-07 Billy Biggs <vektor@dumbterm.net>
+
+ * tests/refcount/Makefile.am: Add a missing reference to libglib
+ in the LDADD for this test.
+
+2005-11-07 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmem.c (g_allocator_new): We need to set n_preallocs to a
+ nonzero value, otherwise GTK+ 2.8 breaks when compiled against
+ GLib 2.9. (#320755, Luca Ferretti)
+
+2005-11-04 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/Makefile.am: Apply a patch from Behdad Esfahbod to
+ use a faster lookup table for g_unichar_get_mirror_char().
+ * glib/gmirroringtable.h: The new table.
+ * glib/gunichartables.h: Remove bidi_mirroring_table.
+ * glib/gen-unicode-tables.pl: Don't generate the mirroring
+ table.
+ * glib/glib-mirroring-tab/*: Sources for the program
+ which generated gmirroringtable.h.
+
+ * glib/glist.c: Avoid some code duplication.
+
+ * glib/gscanner.h: Include gdataset.h. (#320322)
+
+ * glib/gdebug.h: add new GDebugFlag for fatal_criticals
+ * glib/gmessages.c: (_g_debug_init): handle G_DEBUG=fatal_criticals,
+ to help find critical warnings in applications. (#320017,
+ Vincent Untz)
+
+2005-11-02 Tor Lillqvist <tml@novell.com>
+
+ * glib/glib.symbols: Remove large amount of trailing whitespace
+ from one line. Remove #ifdef G_UNDEFINED from around
+ g_hash_table_new and g_hash_table_new_full symbols, what was the
+ purpose of that? Add the g_slice functions.
+
+Tue Nov 1 16:24:20 2005 Tim Janik <timj@imendio.com>
+
+ * glib/gmem.[hc]: prepared deprecation of GMemChunk and GAllocator.
+ added g_slice_*() API to allocate and cache small bits of memory.
+ an actuall allocator implementation for g_slice_*() is still pending.
+
+ * glib/gthread.[hc]: changes from a patch by Matthias Clasen.
+ changed GRealThread list to use in-structure *next; fields instead
+ of GSList, in order for thread iteration to not depenend on g_slice_*()
+ indirectly.
+ _g_thread_mem_private_get():
+ _g_thread_mem_private_set(): added accessors for private memory,
+ needed because the ordinary GPrivate implementation relies on GArray
+ and GSList and therefore indirectly on working g_slice_*() allocations.
+
+ * glib/gthread.[hc]:
+ g_thread_foreach(): new public API function to loop over all existing threads.
+
+ * glib/gdataset.c:
+ * glib/gstring.c:
+ * glib/gcache.c:
+ * glib/garray.c:
+ * glib/gqueue.c:
+ * glib/gslist.c:
+ * glib/glist.c:
+ * glib/ghash.c:
+ * glib/gtree.c:
+ * glib/ghook.c:
+ * glib/gmain.c:
+ * glib/gnode.c:
+ removed GAllocator and free list usages and accompanying locks.
+ use g_slice_*() API to allocate and cache small bits of memory.
+
+ * glib/ghook.h: removed GMemChunk field from public API.
+
+ * glib/gslist.h:
+ * glib/glist.h: deprecate allocator API, provide _free1() for consistency.
+
+ * glib/gnode.h: deprecate allocator API.
+
+ * glib/gmain.c: reordered GPollRec fields so g_slice_free_chain() can
+ be used for poll rec lists.
+
+ * glib/grel.c: removed mem chunk usage, and allocated tuples via g_slice_*().
+ g_relation_destroy(): free all tuples from the all_tuples hash table,
+ this effectively maintains the life time track keeping of tuples.
+ g_relation_delete_tuple(): free tuples which are removed from the
+ all_tuples hash table. this fixes a temporary leak that was present
+ in the memchunk code until the destruction of the relation.
+
+2005-10-29 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/convert-test.c: Add some tests for conversions between
+ UTF-8, UCS-4 and UTF-16.
+
+ * glib/gutf8.c (g_utf8_to_ucs4, g_utf8_to_utf16): Fix handling
+ of len == -1, noticed by Morten Welinder.
+
+2005-10-27 Erdal Ronahi <erdal.ronahi@gmail.com>
+
+ * configure.in: Added ku (Kurdish) to ALL_LINGUAS
+
+2005-10-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutf8.c (g_ucs4_to_utf8): Don't set items_read twice
+ in the error case, and add some documentation. (#319806, Morten
+ Welinder)
+
+2005-10-19 Manish Singh <yosh@gimp.org>
+
+ * configure.in: Use AC_CHECK_FUNCS for _NSGetEnviron, to get the
+ config.h symbol automatically. Fixes bug #313731.
+
+2005-10-19 Tor Lillqvist <tml@novell.com>
+
+ * glib/gwin32.c (g_win32_get_package_installation_directory):
+ Return a g_strdup()ed copy of the value stored in the hash table,
+ so that it can be g_free()d without leaving a dangling pointer in
+ the hash table. (#319232)
+
+2005-10-06 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gunicollate.c (g_utf8_collate_key_for_filename): Handle
+ all-zero sequences correctly. (#317930, Sebastien Bacher)
+
+2005-10-05 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmarkup.c (g_markup_escape_text): Doc addition
+
+ * Makefile.am: Add Collation tests.
+
+ * tests/collate/*: Inputs and expected outputs for collation tests.
+
+ * tests/run-collate-tests.sh: Script to run collation tests.
+
+ * tests/unicode-collate.c (main): Rework slightly to make
+ it usable in unit tests. Also test g_utf8_collate_key_for_filename().
+
+2005-10-01 Behdad Esfahbod <behdad@gnome.org>
+
+ * docs/reference/glib/tmpl/unicode.sgml:
+ * glib/gen-unicode-tables.pl:
+ * glib/gunibreak.h:
+ * glib/gunichartables.h:
+ * glib/gunicode.h:
+ * tests/casefold.txt:
+ * tests/casemap.txt: Updated to Unicode 4.1. There are five new
+ GUnicodeBreakType types. That may break some applications, like
+ Pango <= 1.10.
+
+2005-09-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gstrfuncs.c (g_ascii_strtoull): Add details to the
+ docs. (#314393, Matthew F. Barnes)
+
+ * glib/glib.symbols:
+ * glib/gprintf.h: Remove g_snprintf() and g_vsnprintf(), since
+ they are already declared in glib.h. This doesn't break documented
+ use of gprintf.h, but should probably be pointed out in the
+ release notes for 2.10. (#314232, Behdad Esfahbod)
+
+Tue Sep 20 13:16:04 2005 Tim Janik <timj@imendio.com>
+
+ * glib/gpattern.c (g_pattern_ph_match): applied significant recursion
+ complexity optimization, based on a patch from Matthias Clasen.
+
+ * tests/patterntest.c: more tests, mostly from matthias.
+
+2005-09-20 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gqueue.c (g_queue_insert_sorted): Correct the docs.
+ (#316703, Mark Drago)
+
+Mon Sep 19 17:23:23 2005 Tim Janik <timj@imendio.com>
+
+ * glib/gpattern.c: applied a patch from matthias which checks on the
+ upper bound of GPatternSpec length to optimize matches.
+ cosmetic fixups.
+
+ * tests/patterntest.c: added more match cases.
+
+2005-09-16 Tor Lillqvist <tml@novell.com>
+
+ * glib/gstrfuncs.c (g_ascii_strcasecmp, g_ascii_strncasecmp): Add
+ warning to doc comment that these functions should not be used on
+ encodings like CP932.
+
+2005-09-14 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/keyfile-test.c: Add a test for grup names of length 1.
+
+ * glib/gkeyfile.c (g_key_file_line_is_group): Accept group names
+ of length 1. (#316309)
+
+2005-09-12 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmarkup.c (g_markup_escape_text): Clarify docs.
+
+2005-09-11 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * tests/refcount/Makefile.am (INCLUDES): Link the the refcount
+ tests to the system thread library $(G_THREAD_LIBS). Fixes #313744
+ and #314217.
+
+2005-09-11 Kjartan Maraas <kmaraas@gnome.org>
+
+ * glib/gmain.c: (g_child_watch_prepare), (g_child_watch_check),
+ (child_watch_helper_thread): Remove some dead code. Closes
+ bug #315278.
+
+2005-09-07 Tor Lillqvist <tml@novell.com>
+
+ * glib/Makefile.am: Create also a console version of the
+ gspawn-win32-helper program, gspawn-win32-helper-console.exe.
+ It's otherwise identical to gspawn-win32-helper.exe, except marked
+ as a console application (linked without the -mwindows option).
+
+ * glib/gspawn-win32.c (do_spawn_directly, do_spawn_with_pipes):
+ Drop the dont_wait parameter. Its truth value correlated 100% with
+ the NULLness of the exit_status parameter anyway, so it's enough
+ to check whether exit_status is NULL. Invert the sense of the
+ dont_return_handle parameter and rename it to do_return_handle, to
+ make the code easier to read by avoiding double negations.
+
+ (g_spawn_sync_utf8, g_spawn_async_with_pipes_utf8): Modify calls
+ to do_spawn_with_pipes() accordingly.
+
+ (do_spawn_with_pipes): If we have a console, use the console
+ version of the helper program, otherwise use the GUI one. This
+ avoids extra console windows opening up in some situations. (In
+ case a console application uses the GUI gspawn-win32-helper.exe to
+ spawn another console application we would get a separate console
+ for the spawned console application).
+
+ * glib-zip.in: Distribute also gspawn-win32-helper-console.exe.
+
+2005-09-05 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmappedfile.c (g_mapped_file_new): Report an error
+ if the file is too large. (#315275, Kjartan Maraas)
+
+ * glib/gkeyfile.c (g_key_file_load_from_fd): The return value
+ of read() is signed. (#315273, Kjartan Maraas)
+
+2005-08-31 Tor Lillqvist <tml@novell.com>
+
+ * glib/gutils.h: Wrapping atexit() is a bad idea on Windows, where
+ the EXE and each DLL have their own atexit function chains.
+
+ #define g_atexit as atexit instead. This means it has a
+ better chance of doing what the caller wants. For instance,
+ gtkhtml calls g_atexit() registering a function in gtkhtml
+ itself. This caused a crash when g_atexit() was implemented as a
+ function in the GLib DLL. The gtkhtml DLL was already unloaded by
+ the time the GLib DLL got unloaded.
+
+ * glib/gutils.c: #undef the #define mentioned above, to also get a
+ real g_atexit() into the DLL for backward compatibility. Document
+ the Windows behaviour of g_atexit(), and document the varying ways
+ atexit() can behave in the context of dynamically loaded modules
+ on Unix.
+
+2005-08-31 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols:
+ * glib/gquark.h:
+ * glib/gdataset.c: Add string interning functions.
+
+2005-08-28 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/giochannel.c: Unify some near-duplicate strings. (#314654,
+ Clytie Siddall)
+
+2005-08-26 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version to 2.9.0
+
+2005-08-25 Tor Lillqvist <tml@novell.com>
+
+ Make also the g_spawn*() functions take parameters in the GLib
+ file name encoding, i.e. UTF-8, on Windows. Has no impact on Unix
+ API or ABI. Like the other GLib API that was earlier changed to
+ use UTF-8 on Windows, the names of the functions that take UTF-8
+ have _utf8 suffixes added by using preprocessor macros in the
+ header file. The old names are kept for functions with the old
+ behaviour, taking parameters in the system codepage, for DLL ABI
+ stability.
+
+ * glib/gspawn.h: On Win32 add the suffix _utf8 to the names of the
+ g_spawn*() functions.
+
+ * glib/gspawn-win32.c: Use wide-char API on NT-based
+ Windows. Convert parameters from UTF-8 to wide chars (NT) or
+ system codepage (Win9x) and call the C library _wspawn*() or
+ spawn*() functions respectvely. Add DLL ABI stability versions
+ that take parameters in the system codepage.
+
+ * glib/gspawn-win32-helper.c: On NT-based Windows use the
+ wide-char versions of argv and envp, and use wide-char API to
+ change directory and spawn the program to run. Remove the verbose
+ debugging output, it was too complex to modify for the wide-char
+ features. (Just add temporary debugging printouts if needed, no
+ need to have them permanently in the source.)
+
+ * glib/gspawn.c: Corresponding documentation updates.
+
+ * glib/glib.symbols: Corresponding changes: Mark the ABI stability
+ symbols as PRIVATE, add the new _utf8-suffixed ones.
+
+2005-08-24 Stepan Kasal <kasal@ucw.cz>
+
+ * glib/gtypes.h (G_MININT64): Cast the constant to gint64; it is
+ guint64 otherwise and that can produce warnings about comparison
+ between signed and unsigned.
+
+2005-08-23 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.c: Fix the crt_externs.h include.
+
+2005-08-23 Stepan Kasal <kasal@ucw.cz>
+
+ * NEWS: Fix spelling of my first name.
+
+2005-08-23 Matthias Clasen <mclasen@redhat.com>
+
+ * Bump version
+
+ * === Released 2.8.1 ===
+
+ * NEWS: Updates
+
+2005-08-20 Hans Breuer <hans@breuer.org>
+
+ * glib/makefile.msc.in : link with ws2_32.lib
+
+2005-08-18 Tor Lillqvist <tml@novell.com>
+
+ * configure.in: Check for <sys/wait.h>
+
+ * glib/gbacktrace.c: Include <sys/wait.h> on if HAVE_SYS_WAIT_H.
+
+2005-08-18 Ross Burton <ross@burtonini.com>
+
+ * glib/gstring.c:
+ Optimise single-character insertions.
+
+ * glib/gutf8.c:
+ Note copied code.
+
+ * tests/string-test.c:
+ Add tests for new optimisation, and fix a leak.
+
+2005-08-17 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Check for crt_externs.h and _NSGetEnviron.
+
+ * glib/gutils.c: On Darwin, include crt-externs.h and
+ define environ using _NSGetEnviron(). (#313731)
+
+2005-08-16 Stepan Kasal <kasal@ucw.cz>
+
+ * glib/gutils.c (g_get_any_init): Move the body of the big if...
+ (g_get_any_init_do): ... to this new function.
+ (g_get_any_init): Declare as inline.
+ (g_get_any_init_locked): New inline function, does the locking.
+ Make use of these two throughout the code.
+
+2005-08-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gbacktrace.c (g_on_error_stack_trace): Wait for
+ the child process and then simply return. This makes
+ The "S" option work as documented in g_on_error_query().
+ (#313125, Matthew F. Barnes)
+
+ * glib/gunicode.h: Update the link to Unicode category
+ values. (#313369, Behnam Esfahbod)
+
+ * glib/gqueue.c (g_queue_find_custom): Clarify docs
+ a little. (#311727, Tristan van Berkom)
+
+ * glib/abicheck.sh, gobject/abicheck.sh: Make the
+ check work on ia64 too, where some symbols ended up
+ in yet another section.
+
diff --git a/trunk/ChangeLog.pre-2-12 b/trunk/ChangeLog.pre-2-12
new file mode 100644
index 000000000..b88cdd2d5
--- /dev/null
+++ b/trunk/ChangeLog.pre-2-12
@@ -0,0 +1,738 @@
+2006-08-22 Matthias Clasen <mclasen@redhat.com>
+
+ * Branch for 2.12
+
+2006-08-20 Tor Lillqvist <tml@novell.com>
+
+ * glib/gnulib/vasnprintf.c (vasnprintf): Fix crash when printing
+ large 64-bit values on Win32 using the %I64x format. (#351034,
+ Neil Piercy)
+
+Wed Aug 16 13:59:07 2006 Tim Janik <timj@gtk.org>
+
+ * tests/gobject/Makefile.am:
+ * tests/gobject/singleton.c: added test program which demonstrates
+ and checks singleton construction.
+
+2006-08-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gbookmarkfile.c (g_bookmark_file_get_groups):
+ * glib/gmain.c (g_source_is_destroyed): Add Since tags.
+ * glib/gkeyfile.c (g_key_file_get_double_list): Fix
+ Since tag. (#351583, Brian Cameron)
+
+ * configure.in: Bump version
+
+ * === Released 2.12.2 ===
+
+ * NEWS: Updates
+
+2006-08-08 Emmanuele Bassi <ebassi@gnome.org>
+
+ * glib/gbookmarkfile.c (g_bookmark_file_remove_group)
+ (g_bookmark_file_set_app_info): Plug a couple of leaks
+ when removing data from a bookmark.
+
+2006-08-05 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gbookmarkfile.c (find_file_in_data_dirs): Correct the
+ grammar of an error message. (#349792, Jakub Friedl)
+
+ * glib/gkeyfile.c (g_key_file_to_data): Don't insert unnecessary
+ newlines in keyfiles. (#349825, Chris Wilson)
+
+ * glib/guniprop.c (g_unichar_toupper, g_unichar_tolower)
+ (real_toupper, real_tolower): If a character can't be converted,
+ don't replace it with a NUL byte, but leave it unchanged.
+ (#348491, Nikolai Weibull)
+
+ * tests/unicode-caseconv.c: Adapt to this change.
+
+ * tests/unicode-caseconv.c (main): Add a comment to point out
+ a quirk in the test data that we are working around here.
+
+2006-07-31 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/guniprop.c (g_unichar_isxdigit): Make it only accept those
+ characters that we accept i g_unichar_xdigit_value(), i.e. don't
+ accept non-decimal digits. (#347842, Nikolai Weibull)
+
+2006-07-31 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/gunidecomp.c (_g_utf8_normalize_wc): Update to reflect Unicode
+ PR #29 (#348694, Nikolai Weibull)
+
+ * tests/unicode-normalize.c (encode), (test_form): Make output more
+ useful, reporting the unexpected output of the test.
+
+2006-07-24 Tor Lillqvist <tml@novell.com>
+
+ * tests/slice-test.c: Use g_get_current_time() insted of
+ gettimeofday().
+
+2006-07-22 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.12.1 ===
+
+ * glib/gconvert.c: Fix the prototype of _g_charset_get_aliases.
+ (#346494, Thomas Klausner)
+
+ * NEWS: Updates
+
+2006-07-21 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/gmirroringtable.h: Updated to Unicode Character Database 5.0.0.
+
+2006-07-20 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/guniprop.c (real_toupper, real_tolower): Small optimization.
+ (#348011, Nikolai Weibull)
+
+2006-07-19 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/gunibreak.h:
+ * glib/gunichartables.h:
+ * glib/gunicomp.h:
+ * glib/gunidecomp.h:
+ Update to final Unicode Character Database 5.0.0. (#336281)
+
+2006-07-06 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/gutils.c (g_parse_debug_string): When matching debug flag keys,
+ ignore case and accept any of comma, colon, semicolon, space, and tab
+ as separators. Also, match dash with underscore.
+
+2006-07-05 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gbase64.c: Fix typos in the docs. (#346660, Mark
+ Drago)
+
+2006-07-03 Runa Bhattacharjee <runabh@gmail.com>
+
+ * configure.in: Added Bengali India (bn_IN) in ALL_LINGUAS.
+
+2006-07-02 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.12.0 ===
+
+2006-06-30 Matthias Clasen <mclasen@redhat.com>
+
+ * NEWS: Updates
+
+ * configure.in: Set version to 2.12.0
+
+2006-06-20 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gtimer.c (mktime_utc): Fix an off-by-2 error
+ in the leap year calculation. (#344905, Dan Winship)
+
+ * tests/testglib.c (main): Change the test data for
+ the g_time_val_from_iso8601 tests to expose an off-by-2
+ error in the leap year calculation.
+
+ * configure.in: Bump version
+
+ * === Released 2.11.4 ===
+
+ * NEWS: Updates
+
+2006-06-16 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/file-test.c (test_mkstemp): Add tests.
+
+ * glib/gfileutils.c (g_mkstemp): Allow the XXXXXX to occur
+ inside the template, not just at the end.
+
+2006-06-14 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_to_data): Separate groups by
+ an empty line (#344868, Christian Persch)
+
+2006-06-14 Tor Lillqvist <tml@novell.com>
+
+ * glib/gutils.c (g_listenv): Add Windows notes to doc comment.
+
+2006-06-12 Emmanuele Bassi <ebassi@cvs.gnome.org>
+
+ * glib/gbookmarkfile.h:
+ * glib/gbookmarkfile.c (g_bookmark_file_remove_item): Return
+ a boolean instead of void.
+
+ * tests/bookmarkfile-test.c (test_modify): Add a test case
+ for g_bookmark_file_remove_item().
+
+2006-06-12 Matthias Clasen <mclasen@redhat.com>
+
+ * Bump version
+
+ * === Released 2.11.3 ===
+
+ * NEWS: Updates
+
+2006-06-09 Emmanuele Bassi <ebassi@cvs.gnome.org>
+
+ * glib/gbookmarkfile.c (g_bookmark_file_remove_application): Use
+ an empty string to pass the test in set_app_info.
+
+ (g_bookmark_file_move_item): Remove the old item from the
+ look up table; return success in case of empty target.
+
+2006-06-08 Tor Lillqvist <tml@novell.com>
+
+ * glib/gunicollate.c (msc_strxfrm_wrapper): Workaround for bug in
+ strxfrm() in Microsoft's newer C runtimes. (#343919, Kazuki
+ Iwamoto)
+
+2006-06-05 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.11.2 ===
+
+ * configure.in: Set interface age to 0.
+
+ * NEWS: Updates
+
+ * glib/gmain.c: Fix some doc formatting issues.
+
+ * glib/gstrfuncs.c: Revert accidental commit.
+
+ * glib/gmain.c (get_dispatch): Don't leak the
+ dispatch struct. (#321886)
+
+ * tests/strtod-test.c: Add some tests involving
+ leading whitespace.
+
+ * glib/gstrfuncs.c (g_ascii_formatd): Skip leading
+ whitespace. (#343899, Øystein Johansen)
+
+2006-06-01 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmain.h:
+ * glib/gmain.c: Add three new functions,
+ g_main_current_source, g_source_set_funcs and
+ g_source_is_destroyed, that will be necessary to
+ solve thread-safety issues with idles in GTK+.
+ (#321886, Chris Wilson)
+
+2006-06-01 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/giochannel.c (g_io_channel_write_chars): Avoid
+ running in an assertion with small writes. (#343566, Chris
+ Wilson)
+
+ * tests/iochannel-test.c: Add a testcase for small writes.
+
+ * glib/glib.symbols:
+ * glib/ghash.h:
+ * glib/ghash.c: Add g_hash_table_{remove,steal}_all to
+ remove all nodes from a hash table. (#168538, Matt Barnes)
+
+2006-06-01 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/gkeyfile.c (g_key_file_to_data),
+ (g_key_file_parse_value_as_comment),
+ (g_key_file_parse_comment_as_value):
+ * glib/gscanner.c (g_scanner_get_token_ll): Cleanup. Use return
+ value of g_string_free(...). (#343548, Chris Wilson)
+
+2006-05-28 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmarkup.c (g_markup_parse_context_parse):
+ Don't use g_str_has_{prefix,suffix} here.
+
+2006-05-28 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmarkup.h: Add a GMarkupParseFlags flag for
+ treating CDATA as text.
+
+ * glib/gmarkup.c (g_markup_parse_context_parse):
+ Implement it here.
+
+2006-05-28 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/markups/expected-*: Output that test-markup
+ is expected to produce when run on the valid gmarkup
+ examples.
+
+ * tests/markup-test.c: Only dump the results of the
+ first, unchunked parse, to compare it against the expected
+ output.
+
+ * tests/run-markup-tests.sh: For valid examples, compare
+ the output of test-markup against the corresponding
+ expected-<n> file.
+
+2006-05-24 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Don't compile timeloop on Minix.
+ (Leonard den Ottolander)
+
+2006-05-22 Sebastian Wilhelmi <wilhelmi@google.com>
+
+ * glib/gthread.c (g_thread_init_glib): Run _g_atomic_thread_init
+ as the first of the full fledged initializers to allow the later
+ to potentially use atomic ints (which they currently do
+ not). (#342563, Peter Kjellerstedt)
+
+2006-05-16 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/Makefile.am:
+ * tests/strtoll-test.c: Add tests for g_ascii_strtoll()
+ and g_ascii_strtoull().
+
+ * glib/glib.symbols:
+ * glib/gstrfuncs.h:
+ * glib/gstrfuncs.c (g_ascii_strtoll): New function to
+ parse signed 64bit integers like strtoll does.
+
+ * glib/goption.c (parse_int64): Use g_ascii_strtoll(),
+ since strtoll() is C99 and not available on some
+ systems. (#341826, Kazuki Iwamoto)
+
+2006-05-15 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.11.1 ===
+
+ * NEWS: Updates
+
+2006-05-13 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/grel.c: Fix several cases of deref-before-NULL-check.
+ (#341191, Pascal Terjan)
+
+ * glib/glib.symbols:
+ * glib/goption.h:
+ * glib/goption.c: Allow optional summary and description
+ texts before and after the option descriptions, and add
+ a way to translate them. (#336120, Behdad Esfahbod)
+
+2006-05-12 Tor Lillqvist <tml@novell.com>
+
+ * glib/giowin32.c (g_io_win32_sock_set_flags): Implement
+ setting/clearing G_IO_FLAG_NONBLOCK for channels attached to
+ sockets. (#341192)
+ (g_io_win32_unimpl_set_flags): set_flags method for the
+ unimplemented case.
+
+2006-05-11 Bastien Nocera <hadess@hadess.net>
+
+ * glib/goption.c: (parse_int64), (parse_arg), (free_changes_list):
+ * glib/goption.h:
+ * tests/option-test.c: (arg_test6), (main): add an int64 type for
+ GOption (G_OPTION_ARG_INT64) (#341237)
+
+2006-05-10 Sebastian Wilhelmi <wilhelmi@google.com>
+
+ * glib/gthread.h, gthread/gthread-impl.c: Make the magic and
+ location arguments to the error-checking-mutex functions const and
+ do not write to them, as we might not own them. Clean up the
+ error-checking-mutex code quite a bit. (#335198, Chris Wilson)
+
+ * glib/gthread.c: Use g_atomic_pointer_set instead of old
+ homegrown version now that we have it. (#335198, Chris Wilson)
+
+ * gthread/gthread-posix.c, gthread/gthread-win32.c: Prevent
+ calling into g_cond_wait resp. g_mutex_lock/unlock directly to
+ avoid recursions into the errorcheking mutex code (and out of
+ principle anyway). (#335198, Chris Wilson)
+
+ * tests/errorcheck-mutex-test.c: Adapt to GLib coding standards.
+
+2006-05-09 Sebastian Wilhelmi <wilhelmi@google.com>
+
+ * glib/gthreadinit.h: Renamed to glib/gthreadprivate.h and moved
+ system thread identifier comparision and assignment macros from
+ glib/gthread.c to glib/gthreadprivate.h.
+
+ * glib/Makefile.am, glib/gatomic.c, glib/gconvert.c, glib/gmain.c,
+ glib/gmem.c, glib/gmessages.c, glib/grand.c, glib/gslice.c,
+ glib/gthread.c, glib/gutils.c, gthread/gthread-impl.c: Use
+ glib/gthreadprivate.h instead of glib/gthreadinit.h.
+
+ * gthread/gthread-impl.c: Use GSystemThread instead of GThread for
+ owner determination. (#311043, jylefort@FreeBSD.org)
+
+ * tests/Makefile.am, tests/errorcheck-mutex-test: New test program
+ to test for all checked violations.
+
+ * glib/gprintf.c, glib/gspawn-win32.c, glib/gutf8.c,
+ gthread/gthread-impl.c, gthread/gthread-posix.c,
+ gthread/gthread-win32.c: Use canonical include form for internal
+ headers. config.h is always there.
+
+ * Remove obsolete gthread/gthread-solaris.c.
+
+2006-05-08 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/convert-test.c (test_one_half): Use encoding names which
+ may work better on Solaris. (#340434, Alessandro Vesely)
+
+ * tests/keyfile-test.c (test_number): Add some tests for
+ invalid floating point numbers.
+
+ * glib/gkeyfile.c (g_key_file_parse_value_as_double): Return
+ an error for the empty string. (#339105, Morten Welinder)
+
+ * glib/gscanner.c (g_scanner_config_template): Make const,
+ noticed by Kjartan Maraas.
+
+2006-05-06 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_set_string_list)
+ (g_key_file_set_locale_string_list): Fix invalid memory
+ reads. (#340816, Nick Treleaven)
+
+2006-05-04 Alexander Larsson <alexl@redhat.com>
+
+ * glib/gbase64.c: (g_base64_decode_step):
+ Fix OOB write (#340538)
+
+2006-05-03 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/base64-test.c: Add some more tests.
+
+ * glib/gbase64.c (g_base64_decode_step): Avoid writing
+ beyond the guaranteed lenght of the output buffer, if
+ there is padding.
+
+ * tests/base64-test.c (test_incremental): Use malloced memory
+ instead of stack-allocated, so that MALLOC_CHECK_=2 catches
+ the OOB write...
+
+ * glib/gbookmarkfile.c (g_bookmark_file_load_from_data): Remove
+ an overzealous return_if_fail check that causes make check to
+ fail.
+
+2006-05-02 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.11.0 ===
+
+ * NEWS: Updates
+
+ * tests/casemap.txt:
+ * tests/casefold.txt: Regenerate from Unicode 5.0 data.
+
+ * glib/guniprop.c: Make interval_compare static.
+
+Tue May 2 15:00:00 2006 Tim Janik <timj@gtk.org>
+
+ * tests/gobject/deftype.c: added test code from Behdad Esfahbod,
+ see #337128.
+
+Tue May 2 14:18:25 2006 Tim Janik <timj@gtk.org>
+
+ * glib/goption.c (g_option_context_parse): fixed leak in short
+ option parsing. rewrote parts of the code to be more concise to
+ enhance readability. fixed exaggerated uses of strlen.
+
+2006-04-28 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/guniprop.c: #include <stdlib.h>
+
+2006-04-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols: Add g_unichar_iswide_cjk.
+ * glib/guniprop.c: Add a "Since: 2.12".
+
+ * NEWS: Updates
+
+2006-04-27 Behdad Esfahbod <behdad@gnome.org>
+
+ * docs/reference/glib/glib-sections.txt,
+ * glib/gunicode.h glib/guniprop.c: Implement g_unichar_iswide_cjk().
+ (#105626)
+
+2006-04-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gbookmarkfile.c (g_bookmark_file_set_description)
+ (g_bookmark_file_set_title, g_bookmark_file_set_icon):
+ Remove some special-casing of empty string which led to
+ dangling pointers. (#339337, Morten Welinder)
+ (expand_exec_line): Don't use printf() needlessly, handle
+ trailing '%' gracefully. (#339338, Morten Welinder)
+ (is_element_full): Silence the compiler.
+ (g_bookmark_file_dump, bookmark_metadata_dump):
+ (bookmark_app_info_dump): Escape strings before dumping
+ them in xml. (#339340, Morten Welinder)
+
+2006-04-27 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/gunibreak.h, glib/gunichartables.h: Regenerated using
+ Unicode Character Database 5.0 beta.
+
+2006-04-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/grand.c (g_rand_new): Don't repeat a failed fclose()
+ call, since that invokes undefined behaviour. (Coverity)
+
+2006-04-25 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gbookmarkfile.c (is_element_full): Avoid a possible
+ NULL dereference (found by Coverity), also avoid some
+ pointless strdups.
+
+ * tests/keyfile-test.c (test_comments): Add a test for
+ the previous change.
+
+ * glib/gkeyfile.c (g_key_file_lookup_group_node): Remove
+ redundant code.
+ (g_key_file_get_group_comment): Don't dereference before
+ checking for NULL. (#338572, Coverity, Pascal Terjan)
+
+2006-04-19 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gdataset.c: Add some missing Since: 2.8 tags.
+
+2006-04-19 Tor Lillqvist <tml@novell.com>
+
+ * glib/gatomic.c: Adapt to the changed prototype of
+ InterlockedCompareExchange() in newer SDKs. Use
+ InterlockedCompareExchangePointer() when applicable. (#155884,
+ John Ehresman)
+
+2006-04-18 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.h:
+ * glib/glib.symbols:
+ * glib/gkeyfile.c: Add api to get and set doubles and
+ lists of doubles. (#164719, Maurizio Monge, Dom Lachowicz)
+
+ * tests/keyfile-test.c: Add tests for new api.
+
+ * glib/gkeyfile.c (g_key_file_add_group): Accept duplicate
+ groups. (#157877, Sebastien Bacher)
+
+ * tests/keyfile-test.c: Add tests for duplicate key and
+ duplicate group handling.
+
+2006-04-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gcompletion.c (g_completion_complete_utf8): Make passing
+ NULL for new_prefix work as documented. (#338845, Yevgen Muntyan)
+
+ * tests/completion-test.c: Test that passing NULL for
+ new_prefix in g_completion_complete_utf8 works.
+
+2006-04-17 Kjartan Maraas <kmaraas@gnome.org>
+
+ * configure.in: Remove obsolete entry for no_NO.
+ * po/no.po: And the translation.
+
+2006-04-16 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gdate.c (g_date_fill_parse_tokens): Avoid an array
+ overrun. (Coverity, fix by Pascal Terjan)
+
+2006-04-12 Bastien Nocera <hadess@hadess.net>
+
+ reviewed by: Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gconvert.c: add more details about which RFC is concerned
+ when using g_filename_to_uri (#337553)
+
+2006-04-12 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c (parse_arg): Add an assert to make it
+ clear when value can be NULL.
+
+2006-04-07 Martyn Russell <martyn@imendio.com>
+
+ * tests/threadpool-test.c: (test_thread_stop_unused): Removed an
+ assertion which can fail and is not a critical test.
+
+2006-04-07 Hans Breuer <hans@breuer.org>
+
+ * glib/makefile.msc.in : added gbase64.obj and derive the static libs
+ name from auto* variables
+ * glib/makefile.msc.in : link user32.lib for MessageBox()
+
+2006-04-07 Martyn Russell <martyn@imendio.com>
+
+ * glib/gasyncqueue.[ch]: Added private API
+ _g_async_queue_get_mutex so that g_thread_pool_free() can use the
+ async queue mutex.
+
+ * glib/gthreadpool.c: Make sure
+ g_thread_pool_stop_unused_threads() actually stops unused threads
+ and global limits (like max idle time and max unused threads) can
+ be set without creating a thread pool first. Fixed #335215 (patch
+ from Chris Wilson).
+
+ * tests/threadpool-test.c: Added two new tests, tests setting
+ global limits before creating a thread pool. The second test
+ makes sure unused threads are actually stopped when using the
+ g_thread_pool_stop_unused_threads().
+
+2006-04-05 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gnulib/vasnprintf.c (vasnprintf): Make
+ long long printing work if snprintf is not
+ available. (#332841, Michael McDonald)
+
+2006-04-05 Behdad Esfahbod <behdad@gnome.org>
+
+ * tests/option-test.c: Check the return value of g_get_prgname for
+ NULL before passing to strcmp.
+
+ * tests/slice-test.c: Report the correct name in Usage summary.
+
+2006-04-05 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/run-collate-tests.sh: Fix up shell script.
+
+ * tests/option-test.c (arg_test5): Skip the test if
+ setting the locale fails.
+ (empty_test1): Reset prgname before the test.
+
+ * tests/Makefile.am: Arrange for run-bookmark-test.sh
+ to be run by make check.
+
+ * tests/utf8-pointer.c:
+ * tests/tree-test.c: Silence warnings.
+
+2006-04-04 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols:
+ * glib/gbase64.[hc]: Add G_GNUC_MALLOC where
+ appropriate, use glib types.
+
+2006-04-04 Alexander Larsson <alexl@redhat.com>
+
+ * glib/Makefile.am:
+ * glib/gbase64.[ch]:
+ * glib/glib.symbols:
+ Add base64 encode/decode functions
+
+ * glib/glib.h:
+ Include gbase64.h
+
+ * tests/Makefile.am:
+ * tests/base64-test.c:
+ Tests for base64 functions
+
+2006-04-04 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gdate.c: Move short_month_names and long_month_names
+ to bss.
+
+ * glib/gspawn-win32.c (g_spawn_error_quark):
+ * glib/gspawn.c (g_spawn_error_quark):
+ * glib/gshell.c (g_shell_error_quark):
+ * glib/gmarkup.c (g_markup_error_quark):
+ * glib/goption.c (g_option_error_quark):
+ * glib/gkeyfile.c (g_key_file_error_quark):
+ * glib/giochannel.c (g_io_channel_error_quark):
+ * glib/gfileutils.c (g_file_error_quark):
+ * glib/gconvert.c (g_convert_error_quark):
+ * glib/gbookmarkfile.c (g_bookmark_file_error_quark):
+ * glib/gthread.c (g_thread_error_quark): No point in making
+ the error path fast by caching quarks.
+
+ * glib/gbookmarkfile.c: Make the parser struct const.
+
+2006-04-04 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/gbookmarkfile.c: Fix accidentally broken build.
+
+2006-04-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gbookmarkfile.c: Don't include sys/time.h (#337027,
+ Kazuki IWAMOTO)
+
+2006-03-31 Tor Lillqvist <tml@novell.com>
+
+ * glib/gstdio.c (g_remove): Revert change below. It wasn't a good
+ idea after all, says the original bug reporter. See bug for
+ discussion.
+
+2006-03-30 Tor Lillqvist <tml@novell.com>
+
+ * glib/gstdio.c (g_remove): [Win32] call rmdir() only if remove()
+ fails with errno set to ENOENT, to leave errno set to EACCESS if
+ that is the problem. (#334799, Yevgen Muntyan)
+
+2006-03-30 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gbookmarkfile.c (g_bookmark_file_get_app_info): Sync
+ the parameter names with the .h files, otherwise gtk-doc
+ misbehaves.
+
+2006-03-27 Emmanuele Bassi <ebassi@cvs.gnome.org>
+
+ * tests/.cvsignore: Add bookmarkfile-test to the ignored files.
+
+2006-03-27 Emmanuele Bassi <ebassi@cvs.gnome.org>
+
+ * tests/Makefile.am:
+ * tests/bookmarkfile-test.c:
+ * tests/run-bookmark-test.sh:
+ * tests/bookmarks/*.xbel: Add test suite for GBookmarkFile.
+
+2006-03-27 Emmanuele Bassi <ebassi@cvs.gnome.org>
+
+ * docs/reference/glib/glib-docs.sgml:
+ * docs/reference/glib/glib-sections.txt:
+ * docs/reference/glib/tmpl/bookmarkfile.sgml: Add documentation for
+ GBookmarkFile to GLib's reference guide.
+
+2006-03-27 Emmanuele Bassi <ebassi@cvs.gnome.org>
+
+ * glib/glib.h:
+ * glib/gbookmarkfile.h
+ * glib/gbookmarkfile.c: Add GBookmarkFile, a parser for files
+ containing bookmarks stored using the Desktop Bookmark
+ specification. Fixes bug #327662.
+
+ * glib/glib.symbols:
+ * glib/Makefile.am:
+ * glib/makefile.msc.in:
+ * glib/makefile.mingw.in: Build glue for GBookmarkFile.
+
+2006-03-27 Dom Lachowicz <cinamod@hotmail.com>
+
+ * tests/option-test.c: Copy-and-paste error slipped into test5. Enable
+ test5, as per Matthias' comments in bug 329548#c11.
+
+ Change a gboolean to an int. Fixes bug #329789.
+
+ * configure.in: Bump version number to 2.11.0
+
+2006-03-27 Matthias Clasen <mclasen@redhat.com>
+
+ Add support for floating point numbers to goption.
+ (#329548, Behdad Esfahbod, patch by Antoine Dopffer and
+ Dom Lachowicz)
+
+ * glib/goption.h:
+ * glib/goption.c: Support double arguments.
+
+ * tests/option-test.c: Test double arguments.`
+
+2006-03-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c (g_option_context_new): Improve the description
+ of parameter_string in the docs. (#336085, Claudio Saavedra)
+
+2006-03-24 Martyn Russell <martyn@imendio.com>
+
+ * glib/gthreadpool.c: Updated the documentation to explain that
+ when the maximum threads is > 1 the sort functionality is not 100%
+ accurate due to the ramdom nature of the scheduler choosing which
+ threads to execute. Fixes bug #334943.
+
+ * tests/threadpool-test.c: Disabled the debugging by default and
+ fixed the sort test to set the maximum threads to 1 to guarantee
+ the thread entry function is called in order.
+
+2006-03-23 Matthias Clasen <mclasen@redhat.com>
+
+ === Branch for 2.10 ===
diff --git a/trunk/ChangeLog.pre-2-2 b/trunk/ChangeLog.pre-2-2
new file mode 100644
index 000000000..f91ac7e7d
--- /dev/null
+++ b/trunk/ChangeLog.pre-2-2
@@ -0,0 +1,1502 @@
+Fri Dec 20 10:45:29 2002 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.2.0 ===
+
+ * INSTALL.in: --enable-included-printf, not --enable-trio.
+ (Matthias Clasen)
+
+Fri Dec 20 09:52:15 2002 Owen Taylor <otaylor@redhat.com>
+
+ * INSTALL.in: Document --enable-trio, --disable-mempools,
+ --enable-debug. Include docs on cross compilation.
+
+ * NEWS: Update.
+
+ * configure.in: Version 2.2.0, interface age 0.
+
+Fri Dec 20 09:37:27 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gthread/gthread-impl.c (g_thread_init): Call g_main_thread_init()
+ after setting g_threads_got_initialized. (#101624,
+ Alceste Scalas, Sebastian Wilhelmi)
+
+Wed Dec 18 16:19:08 2002 Manish Singh <yosh@gimp.org>
+
+ * glib/gtypes.h: new endian asm for ia64 and x86_64, general
+ reorg and clean up. New implementation of GUINT16_SWAP_LE_BE_CONSTANT()
+ that should optimize better. (#101318)
+
+2002-12-17 Tor Lillqvist <tml@iki.fi>
+
+ Improvement based on suggestion by Thorsten Maerz:
+
+ * glib/giowin32.c (struct _GIOWin32Channel): Don't need thread_handle.
+
+ (create_thread): We can close thread handle right away, it isn't
+ used for anything.
+
+ (read_thread, select_thread): Thus, don't close it here.
+
+ Fix #57690, partial fix for #57689:
+
+ * glib/giowin32.c (g_io_win32_set_flags): Don't set the GError,
+ instead call g_warning().
+
+ (g_io_win32_fd_get_flags_internal): New function, sets the
+ is_readable, is_writeable and is_seekable flags based on the
+ actual access modes of the underlying Win32 HANDLE, by trying
+ Win32 ReadFile() and WriteFile() of zero bytes, and
+ PeekNamedPipe(). Should work for disk files and pipes. For devices
+ (consoles) unfortunately not.
+
+ (g_io_win32_fd_get_flags): Don't set the
+ G_IO_FLAG_IS_{READ,WRITE}ABLE flags, g_io_channel_get_flags()
+ already does. Call g_io_win32_fd_get_flags_internal() to set the
+ is_* flags.
+
+ (g_io_win32_msg_get_flags, g_io_win32_sock_get_flags): Splice the
+ generic g_io_win32_get_flags() into these specific functions, as
+ they need to do different things. Not implemented yet, though.
+
+ (g_io_channel_win32_new_fd_internal): New function, to avoid
+ duplicate fstat() calls. Most code from g_io_channel_win32_new_fd()
+ moved here. Call g_io_win32_fd_get_flags_internal() to set the
+ is_* flags.
+
+ (g_io_channel_win32_new_fd, g_io_channel_unix_new): Call
+ g_io_channel_win32_new_fd_internal().
+
+ (g_io_win32_no_seek): Remove. Don't set is_seekable for those
+ channel types.
+
+Mon Dec 16 17:31:50 2002 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.1.5 ===
+
+ * configure.in: Version 2.1.5, interface age 2.
+
+ * NEWS: Updated.
+
+Mon Dec 16 14:58:33 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Add a hack to mostly deal with
+ problems in support of -pthread and -lpthread;
+ pass -lpthread (for linux) or -Wc,-pthread (for
+ other platforms) to libtool when linking libgthread.
+ (#100697)
+
+2002-12-16 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gspawn-win32.c (do_spawn): Fix potential heap
+ corruption. Sometimes called g_free() on string literal.
+
+Sun Dec 15 19:51:58 2002 Owen Taylor <otaylor@redhat.com>
+
+ * m4macros/glib-gettext.m4: AC_SUBST() DATADIRNAME, not
+ DATADIR.
+
+Sun Dec 15 19:22:58 2002 Owen Taylor <otaylor@redhat.com>
+
+ * m4macros/glib-gettext.m4: Restore a missing AC_SUBST()
+ for DATADIRNAME. (Found by Kjartan Maraas)
+
+Sun Dec 15 11:24:29 2002 Owen Taylor <otaylor@redhat.com>
+
+ * m4macros/glib-gettext.m4: Actually set INTLLIBS
+ when needed. (Reported by Tor Lillqvist)
+
+2002-12-15 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.def: Add g_rand_init.
+
+ * config.h.win32.in: Slight update to match what is currently
+ produced by configure.
+
+Sat Dec 14 21:24:04 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gutils.c (g_get_any_init): HP-UX 10 xshares the
+ same non-posix getpwuid_r signature as AIX.
+ (#100756, Kai Poitschke)
+
+Sat Dec 14 21:10:57 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gthread.h: Mark the contents of the strucures
+ in this file /*< private >*/
+
+ * glib/gthread.[ch]: Rename the 'write' field of the
+ structure to 'have_writer' to avoid any possible
+ conflict with system headers. (#90549, Morten Welinder)
+
+Sat Dec 14 20:11:41 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/libcharset/{localcharset.[ch] libcharset-glib.patch}
+ glib/gutf8.c: Break _g_locale_charset() into two pieces
+ - a fast "raw" piece, and a slow "unalias pieces".
+ Always call the "raw" piece, and call the unalias bit
+ if it changes. Use a per-thread cache. (#79529)
+
+2002-12-15 Matthias Clasen <maclas@gmx.de>
+
+ * configure.in: Set TRIO_LIBS when building with trio.
+
+ * glib-2.0.pc.in (Libs): Add @TRIO_LIBS@.
+
+ * glib/trio/Makefile.am (libtrio_la_LIBADD): Use @TRIO_LIBS@.
+
+ * glib/trio/glibtrio.h: New file, redefining all trio symbols to
+ fall into the _G/_g_ private glib namespace.
+
+ * glib/trio/Makefile.am (libtrio_la_SOURCES): Add glibtrio.h
+
+ * glib/trio/trionan.c:
+ * glib/trio/triostr.c:
+ * glib/trio/trio.c: Include glibtrio.h
+
+ * glib/gprintfint.h:
+ * glib/trio/trionan.c:
+ * glib/trio/triostr.c:
+ * glib/trio/trio.c: Include glibtrio.h
+
+Fri Dec 13 17:10:21 2002 Manish Singh <yosh@gimp.org>
+
+ * glib/gscanner.c (g_scanner_unexp_token): Fix typo. Missing '%'
+ in my last commit.
+
+Thu Dec 12 23:08:29 2002 Owen Taylor <otaylor@redhat.com>
+
+ Fixes from Johannes Stezenbach
+
+ * configure.in: When adding extra libraries to $LIBS for
+ tests, always put them at the front, since that's how
+ they'll be used in the actual Makefiles.
+
+ * configure.in: Add a couple of missing ','s in AC_LINK_IFELSE()
+
+ * m4macros/glib-gettext.m4: Remove a stray setting of $LIBS.
+
+Thu Dec 12 20:46:26 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Allow not setting glib_cv_long_long_format
+ when cross-compiling since we assume other things that
+ will cause us to pull in Trio anyways.
+
+ * configure.in: long_long_format is always ll for trio.
+
+ * configure.in: Error out if --disable-trio is specified
+ but the C library doesn't have the necessary features.
+
+2002-12-13 Matthias Clasen <maclas@gmx.de>
+
+ * glib/trio/Makefile.am (libtrio_la_LIBADD): Add -lm for pow().
+
+ * tests/string-test.c: Add a test for positional parameters in
+ g_snprintf().
+
+Thu Dec 12 14:58:55 2002 Manish Singh <yosh@gimp.org>
+
+ * configure.in: pull in trio if host printf doesn't have a known
+ way of printing 64-bit ints.
+
+ * glib/gmacros.h: remove extra whitespace at the end
+
+ * glib/gscanner.c (g_scanner_unexp_token): use G_GUINT64_FORMAT
+ instead of hardcoding "%llu"
+
+ * tests/testglib.c: remove obsolete conditionals using G_HAVE_GINT64,
+ we always have it now.
+
+ * tests/type-test.c: same as above, and for G_G[U]INT64_FORMAT as
+ well.
+
+Thu Dec 12 13:52:58 2002 Owen Taylor <otaylor@redhat.com>
+
+ * m4macros/glib-gettext.m4: AC_PREREQ(2.53) here; convinces
+ Debian's wrappers to use the right autoconf for atk, etc.
+ (Reported by Jody Goldberg)
+
+2002-12-11 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gtimer.c (g_timer_elapsed): Fix off-by-one error. (#100853)
+
+ * glib/gfileutils.c (g_file_test): Bypass extra test for root on
+ Win32.
+
+ * glib/glib.def: Add g_{get,set}_application_name.
+
+Wed Dec 11 17:53:34 2002 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.1.4 ===
+
+ * NEWS: Updates.
+
+Wed Dec 11 17:49:15 2002 Owen Taylor <otaylor@redhat.com>
+
+ * m4macros/glib-gettext.m4: Unset
+ ac_cv_func_bind_textdomain_codeset before calling
+ AC_CHECK_FUNCS(bind_textdomain_codeset) again.
+
+ * configure.in: Remove duplicate call to
+ AC_CHECK_FUNCS(bind_textdomain_codeset)
+
+2002-12-11 Pauli Virtanen <pauli.virtanen@hut.fi>
+
+ * configure.in: Added "fi" to ALL_LINGUAS.
+
+Wed Dec 11 17:00:20 2002 Owen Taylor <otaylor@redhat.com>
+
+ * acglib.m4 (ac_compile): Add GLIB_ASSERT_SET() as
+ a helper for adding "must be set when cross-compiling"
+ errors.
+
+ * configure.in: For all cached variables without defaults,
+ error out if they aren't set.
+
+Wed Dec 11 15:52:01 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Also assume AC_LINK_IFELSE() is
+ OK when cross-compiling for the libs checks, and for
+ the sched_get_priority_min() check.
+
+ * configure.in: Add cached value glib_cv_use_pid_surrogate.
+
+Wed Dec 11 15:10:25 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Factor out repeated thread test into
+ a m4_define(); when cross-compiling, assume that
+ AC_LINK_IFELSE() is good enough for thinking that
+ -pthread[s] is OK. (More of #58786)
+
+ * m4macros/glib-gettext.m4: Fix typo. (Manish Singh)
+
+Wed Dec 11 14:28:50 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Version 2.1.4, interface age 1.
+
+ * m4macros/glib-gettext.m4: Major rewrite; remove leftovers
+ from building intl/, prefer libintl if both libc and libintl
+ have dgettext and libintl also has bind_textdomain_codeset().
+ (#70627)
+
+ * configure.in acinclude.m4: Use an include to avoid having
+ to duplicate the gettext macros between glib-gettext.m4
+ and acinclude.m4.
+
+ * m4macros/glib-gettext.m4: Do some tricks so that configure.in
+ can use macros under hidden names, but aclocal will still
+ find them when installed.
+
+ * m4macros/glib-gettext.m4: Add AM_GLIB_DEFINE_LOCALEDIR
+ to encapsulate install location of catalog files.
+
+ * m4macros/glib-gettext.m4 (AM_GLIB_DEFINE_LOCALEDIR):
+ Fix bug where if --prefix wasn't set on the configure line,
+ GLib would look for translations in NONE/share/locale.
+
+Wed Dec 11 11:11:44 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/grand.c: Include string.h, supress a warning.
+
+2002-12-10 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/grand.c (g_rand_int_range): Improve generation of
+ pseudo-random integers. (#99720, Morten Welinder <terra@diku.dk>)
+
+ * README.in, docs/reference/glib/running.sgml,
+ docs/reference/glib/tmpl/random_numbers.sgml,
+ docs/reference/glib/changes.sgml: Added notes about the new
+ algorithm.
+
+2002-12-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: use 0 instead of $defattr, as it isn't defined
+ anymore on platforms using -pthread and linux, where this is used,
+ only uses 0 anyway and not "pthread_attr_default".
+
+Sun Dec 8 23:36:12 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gfileutils.c (g_file_test): Guard against
+ the POSIX allowed behavior where access (file, X_OK)
+ succeeds for uid==0 when no executable bits are set.
+
+ * glib/gfileutils.c (g_file_test): Add doc notes
+ about the possibility of race conditions, and the
+ fact that EXISTS and IS_EXECUTABLE give results
+ for the real uid not the effective user ID.
+ (#81854, Morten Welinder.)
+
+Fri Dec 6 14:34:42 2002 Owen Taylor <otaylor@redhat.com>
+
+ Avoid literal UTF-8. (Allow it to build with
+ IRIX cc, #72757, Tomas Ogren)
+
+ * tests/patterntest.c (main): Convert literal
+ iso-8859-1 high bit characters in tests to
+ string escapes.
+
+ * glib/gunichartable.h glib/gen-unicode-tables.pl:
+ Use hex \xMN escapes rather than literal UTF-8
+ for casefold tables.
+
+ * configure.in: AC_PREREQ(2.53). needed for recent
+ GLIB_SIZEOF() changes.
+
+Fri Dec 6 12:40:00 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/libcharset/Makefile.am (EXTRA_DIST): Don't
+ distribute ref-add/del.sed., fixing problem with
+ srcdir != destdir. (#99813, Phuc LeHong)
+
+Fri Dec 6 12:31:30 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: chmod 0755 scripts in AC_OUTPUT(), since
+ install -c won't necessarily do that. (#74376, Martin
+ Gansser, Joshua Weage)
+
+Thu Dec 5 16:05:55 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Use AC_LINK_IFELSE(), not AC_TRY_RUN()
+ for va_copy(), __va_copy() checks.
+
+ * configure.in: When there is a reasonable default,
+ provide that in the 3rd argument of AC_TRY_RUN(),
+ instead of just leaving the 3rd argument empty.
+
+2002-12-05 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstrfuncs.c (g_strncasecmp): Break long deprecation
+ info into two paragraphs.
+
+Thu Dec 5 15:43:46 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Fix multiple problems with the programs
+ in the argument of AC_TRY_RUN() having preprocessor
+ defines not in the first column.
+
+Thu Dec 5 15:24:14 2002 Owen Taylor <otaylor@redhat.com>
+
+ Start of fixes for cross-compilation. Based on
+ patches from Dimi Shahbaz, Dan Kegel, Johannes Stezenbach,
+ Amy Lin. (#58786)
+
+ * configure.in: Don't run the Digital-Unix 4 -std1 check
+ when cross_compiling.
+
+ * configure.in: Use AC_TRY_COMPILE() rather than
+ AC_TRY_RUN() for inline checks. (Daniel Egger)
+
+ * configure.in: use AC_CHECK_SIZEOF rather than
+ GLIB_SIZEOF for size_t. Remove unused checks for
+ size of ptrdiff_t/intmax_t.
+
+ * acglib.m4: Resync GLIB_SIZEOF of to the current
+ AC_CHECK_SIZEOF, which handles cross-compilation.
+
+ * acglib.m4: Remove no longer needed GLIB_SYSDEFS(),
+ add GLIB_CHECK_VALUE() as a wrapper around the
+ amazing _AC_COMPUTE_INT() autoconf 2.5x internal.
+
+ * configure.in: Redo the POLL* value checks in a
+ cross-compilation friendly way.
+
+Thu Dec 5 15:28:37 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gtimer.c: Include glibconfig.h early so
+ that we include <windows.h> when needed.
+
+ * glib/gstrfuncs.c: Fix typo.
+
+Tue Dec 3 21:10:28 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Add 3rd argument to remaining AC_DEFINES(),
+ so we can get rid of acconfig.h. (#76334, Daniel Egger)
+
+ * acconfig.h: Removed.
+
+Tue Dec 3 20:22:27 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/*.c: Patch from Sven Neumann to make the
+ include order consistent. (#71704)
+
+2002-12-03 Matthias Clasen <maclas@gmx.de>
+
+ * configure.in: Check that strlcpy behaves as per the OpenBSD
+ man page before wrapping it. (#53933)
+
+2002-12-03 Frederic Crozat <fcrozat@mandrakesoft.com>
+
+ * glib/gunicollate.c: (g_utf8_collate_key):
+ Fix typo from previous commit
+
+Tue Dec 3 01:05:00 2002 James M. Cape <jcape@ignore-your.tv>
+
+ * glib/gunicollate.c (g_utf8_collate, g_utf8_collate_key):
+ Check for NULL before doing anything.
+
+Mon Dec 2 16:34:13 2002 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.1.3 ===
+
+ * NEWS: Updated.
+
+ [ Unmerged change from stable from May 16 ]
+
+ * autogen.sh: Remove check for GNU gettext, since it
+ was causing problems for Solaris CVS builds.
+ (#81885, Hidetoshi Tajima.)
+
+Tue Nov 26 09:51:43 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gstrfuncs.c (g_strchomp): Avoid non-ANSI pointer
+ comparison. (#54344, Morten Welinder)
+
+ * tests/strfunc-test.c (main): Add tests for strchomp().
+
+2002-11-30 Ole Laursen <olau@hardworking.dk>
+
+ * configure.in: Added "da" to ALL_LINGUAS.
+
+2002-11-29 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstrfuncs.c (g_ascii_strtoull): It is a 2.2 addition.
+
+ * glib/gtimer.c (g_time_val_add): Adjust to changed parameter names.
+
+ * glib/gutils.c (g_get_application_name): Mark as 2.2. addition.
+
+ * glib/gstrfuncs.c (g_ascii_strtoull): Mark as 2.0.7 addition.
+
+2002-11-28 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gutils.c:
+ * glib/gtree.c:
+ * glib/gstring.c:
+ * glib/gstrfuncs.c:
+ * glib/giochannel.c: Move some docs inline, and add deprecation
+ information. To see the list of affected functions, grep for
+ "Deprecated:".
+
+ * configure.in: Fix the definitions around printf: either we use
+ system printf in which case HAVE_VASPRINTF, HAVE_C99_VSNPRINTF and
+ HAVE_UNIX98_PRINTF have already been determined by earlier tests,
+ or we use the included printf, in which case we know that these
+ three can be defined as 1. (#99826)
+
+ * glib/gutf8.c (g_utf8_strreverse):
+ * glib/gstrfuncs.c (g_str_has_suffix):
+ (g_str_has_prefix):
+ * glib/gprintf.c (g_printf):
+ (g_fprintf):
+ (g_sprintf):
+ (g_vprintf):
+ (g_vfprintf):
+ (g_vsprintf):
+ * glib/gmarkup.c (g_markup_parse_context_get_element):
+ Mark as 2.2 API additions.
+
+ * configure.in: Fix the gtk-doc version check.
+
+2002-11-27 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmessages.h: Use G_LIKELY without surrounding parentheses
+ in g_assert() and g_return_[val]_if_fail() so that we always trigger
+ the gcc warning about "assignment used as truth value".
+
+ * glib/gmacros.h: Always put parentheses in G_LIKELY and G_UNLIKELY.
+
+2002-11-26 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmessages.h: Only use G_LIKELY in g_assert() and
+ g_return_[val]_if_fail() if it is actually doing something.
+
+2002-11-26 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/grand.c, gthread/gthread-impl.c, tests/rand-test.c:
+ Changed the seeding algorithm. Old behaviour can be achived by
+ setting envvar G_RANDOM_VERSION to "2.0". (#99262)
+
+ * docs/reference/glib/glib-docs.sgml,
+ docs/reference/glib/Makefile.am: Renamed
+ docs/reference/glib/changes-2.0.sgml to
+ docs/reference/glib/changes.sgml and added section for changes
+ from 2.0 to 2.2 (Also corrected 1.0 to 1.2).
+
+ * README.in, docs/reference/glib/running.sgml,
+ docs/reference/glib/tmpl/random_numbers.sgml,
+ docs/reference/glib/changes.sgml: Added notes about the new
+ seeding algorithm.
+
+ * configure.in: Make CPPFLAGS, not CFLAGS, include
+ G_THREAD_CFLAGS. CFLAGS is used while linking too and thus GLib
+ programs would link to the threads library on some platforms. Also
+ fixed a bug manifesting through this change. (#77981)
+
+2002-11-26 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmacros.h: Fix the non-gcc-3.x definitions of G_LIKELY
+ and G_UNLIKELY. (Reported by Dan Mills)
+
+2002-11-25 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gfileutils.c (g_build_path):
+ (g_build_filename): Document that the varargs must be
+ NULL-terminated. (#99510)
+
+ * glib/gmessages.h (g_assert):
+ (g_return_if_fail):
+ (g_return_val_if_fail): Remove the (no longer effective) empty
+ if-branch.
+
+ * glib/gmacros.h: Change the definition of G_LIKELY, so that
+ g_return_if_fail() and friends still trigger a gcc warning if
+ the expr is an assignment.
+
+2002-11-23 Matthias Clasen <maclas@gmx.de>
+
+ * configure.in: Generate docs/reference/*/version.xml.
+
+ * glib/gdir.h: Add Copyright notice.
+
+2002-11-22 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Fixed typo: PTHREAD_PRIO_MIN ->
+ PTHREAD_PRIO_MAX. (Laurent Vivier, #99293)
+
+Fri Nov 22 09:39:09 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmacros.h: Remove broken G_HIDDEN_SYMBOL
+ definition which wasn't supposed to be committed
+ at all.
+
+Thu Nov 21 16:19:21 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/ghash.c: Patch from Morten Welinder to
+ make ghash.c properly obey DISABLE_MEM_POOLS. (#96600)
+
+Thu Nov 21 14:09:44 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmacros.h: Add G_GNUC_DEPRECATED. (Tom Tromey,
+ #87969)
+
+2002-11-21 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32.in: Update to match what is currently produced by
+ autotools.
+
+ * configure.in: Remove superfluous spaces on two shell variable
+ assignment lines. Don't define HAVE_GOOD_PRINTF as 0 if we don't
+ have a good printf, it is tested with #ifdef.
+
+ * glib/glib.def: Add new functions.
+
+ * glib/Makefile.am: If !HAVE_GOOD_PRINTF, add libtrio.la to LIBADD
+ and DEPENDENCIES.
+
+ * glib/glib.rc.in
+ * gmodule/gmodule.rc.in
+ * gobject/gobject.rc.in
+ * gthread/gthread.rc.in
+ * {glib,gmodule,gobject,gthread}/makefile.{mingw,msc}.in:
+ Hardcode 2.0 in the names, as that is what Makefile.am does.
+
+2002-11-21 Matthias Clasen <maclas@gmx.de>
+
+ Include a printf implementation supporting C99 snprintf and SUS
+ positional parameters: (#79488)
+
+ * glib/gstrfuncs.c:
+ * glib/gspawn-win32.c:
+ * glib/gscanner.c:
+ * glib/gconvert.c:
+ * glib/gbacktrace.c: Use _g_printf wrappers.
+
+ * glib/gutils.c (g_vsnprintf): Simplify, since we can assume C99
+ snprintf semantics now.
+
+ * glib/gmessages.c (printf_string_upper_bound): No longer needed,
+ since we can assume C99 snprintf semantics now.
+ (g_logv): Simplify.
+
+ * acinclude.m4 (AC_FUNC_PRINTF_UNIX98): New macro to check wether
+ printf supports SUS positional parameters.
+
+ * configure.in: New option --enable-included-printf to force
+ compilation of trio; otherwise trio is compiled if the system
+ printf misses either C99 snprintf semantics of SUS positional
+ parameters.
+
+ * glib/Makefile.am (SUBDIRS): Conditionally compile trio.
+ (libglib_2_0_la_SOURCES): Add gprintf.c and gprintfint.h.
+ (glibsubinclude_HEADERS): Add gprintf.h.
+
+ * glib/gprintfint.h: New private wrapping either system printf
+ or trio printf variants in _g_printf wrappers for use inside glib.
+
+ * glib/gprintf.h: New public header declaring g_printf variants.
+ * glib/gprintf.c: Corresponding implementations.
+
+ * glib/trio/*: New directory, containing the trio-1.9 sources.
+
+2002-11-20 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmessages.h (g_return_if_fail):
+ (g_return_val_if_fail): Use G_LIKELY. (#69022)
+
+ * glib/gmacros.h (G_LIKELY):
+ (G_UNLIKELY): New macros for hinting the compiler about the
+ expected result of expressions. For gcc 3.x, define these
+ using __builtin_expect. (#69022)
+
+Tue Nov 19 14:38:18 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gstrfuncs.c (g_ascii_strtoull): Fix
+ strtull/strtoull type in docs (#99012, Morten
+ Welinder.) Add copyright information for code
+ taken from GNU libc.
+
+2002-11-18 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gspawn-win32.c (do_spawn_with_pipes): Do handle
+ G_SPAWN_DO_NOT_REAP_CHILD after all, similarily as on Unix. If the
+ flag is not set, don't call DuplicateHandle() on the handle
+ returned by the helper process, and set the "child pid" returned
+ to the called to zero. Close the handle to the helper process in
+ all cases.
+
+ * glib/gspawn.c (g_spawn_async_with_pipes): Document Windows
+ behaviour of G_SPAWN_DO_NOT_REAP_CHILD.
+
+2002-11-18 Tor Lillqvist <tml@iki.fi>
+
+ [Win32] Fix the asynchronous g_spawn* to return the process handle
+ of the started program properly. (Note: not the process id. The
+ spawn*() functions in the C runtime return the created process's
+ handle. There doesn't seem to be any way to get the process id of
+ a child process if you have the handle. But then, the process
+ handle usually is more useful anyway.)
+
+ * glib/gspawn-win32-helper.c (WinMain): If the spawning of the
+ child process succeeded, and if asynchronous spawn (P_NOWAIT),
+ write the result handle up to the parent process, waiting to read
+ it in do_spawn_with_pipes().
+
+ * glib/gspawn-win32.c (do_spawn): Use return value from spawning
+ the helper. If it is -1 the helper wasn't found or couldn't be run
+ for some reason. Otherwise it is the helper's process handle.
+
+ (g_spawn_async_with_pipes): Pass the child_pid parameter on to
+ do_spawn_with_pipes().
+
+ (do_spawn_with_pipes): Take also a child_pid parameter. If
+ do_spawn() returned -1, fail immediately. Otherwise make the
+ handle passed to us by the helper process into a handle valid in
+ this process by calling DuplicateHandle().
+
+2002-11-17 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gspawn-win32.c (g_spawn_async_with_pipes): Ignore the
+ G_SPAWN_DO_NOT_REAP_CHILD flag, can't be meaninfully implemented
+ on Windows, at least not now. Always pass dont_wait as TRUE to
+ do_spawn_with_pipes(). The semantics of the dont_wait parameter is
+ very different from the semantics of the intermediate_child
+ parameter to fork_exec_with_pipes() in the Unix version. This
+ fixes a serious bug, g_spawn_async() in fact behaved
+ synchronously.
+
+ (do_spawn_with_pipes, do_spawn): Rename from
+ fork_exec_with_pipes() and do_exec(), those names were from the
+ Unix bersion, and misleading.
+
+ (close_and_invalidate): Don't try to close invalid fds.
+
+ * glib/gspawn.c (g_spawn_async_with_pipes): Add warning about
+ Windows behaviour. There is no fork(), so the child_setup()
+ function is in fact called in the parent.
+
+ * glib/gspawn-win32-helper.c (WinMain): Insert spaces in argv
+ debugging output.
+
+ * tests/spawn-test-win32-gui.c: New file. Test program to be
+ linked as a GUI application. Behaves differently depending on how
+ invoked (by spawn-test).
+
+ * tests/spawn-test.c (run_tests): On Win32, run the
+ spawn-test-win32-gui program, too, in several ways, synchronously
+ and asynchronously.
+
+ * tests/Makefile.am: Corresponding change.
+
+Fri Nov 8 19:44:20 2002 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * docs/reference/glib/tmpl/arrays.sgml:
+ * docs/reference/glib/tmpl/arrays_byte.sgml:
+ * docs/reference/glib/tmpl/arrays_pointer.sgml:
+ * docs/reference/glib/tmpl/date.sgml:
+ * docs/reference/glib/tmpl/linked_lists_double.sgml:
+ * docs/reference/glib/tmpl/linked_lists_single.sgml:
+ * docs/reference/glib/tmpl/main.sgml:
+ * docs/reference/glib/tmpl/queue.sgml:
+ * docs/reference/glib/tmpl/random_numbers.sgml:
+ * docs/reference/glib/tmpl/relations.sgml:
+ * docs/reference/glib/tmpl/scanner.sgml:
+ * docs/reference/gobject/tmpl/gtype.sgml:
+ * docs/reference/gobject/tmpl/value_arrays.sgml glib/garray.h:
+ * glib/gdate.h glib/giochannel.h glib/glist.h glib/gmain.c:
+ * glib/gmain.h glib/gqueue.c glib/gqueue.h glib/grand.c glib/grand.h:
+ * glib/grel.h glib/gslist.h glib/gtimer.h gobject/gvaluearray.h:
+
+ Trivial s/foo/foo_/ fixes to make <glib.h> includable with
+ -Wshadow without warnings (#91680)
+
+Thu Nov 7 19:32:26 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gutils.[ch] (g_set/get_application_name):
+ Patch from Havoc Pennington to add functions for
+ setting and getting a human readable application
+ name.
+
+ * configure.in: Up to version 2.1.3, since we'll
+ need to depend on last addition for GTK+.
+
+2002-11-06 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.def: Add g_main_thread_init.
+
+2002-11-06 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstrfuncs.c (g_str_has_suffix):
+ (g_str_has_prefix): Minor doc markup fix.
+
+Mon Nov 4 10:45:48 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Add -DG_DISABLE_CAST_CHECKS for
+ everything but --enable-debug.
+
+ * configure.in: Require pkg-config 0.14. (#97553)
+
+Mon Nov 4 14:41:48 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gbsearcharray.c: Include config.h
+ so DISABLE_MEMPOOLS actually has an effect.
+ (#96437, Morten Welinder)
+
+ * tests/uri-test.c: Include <config.h>
+
+2002-11-03 Dmitry G. Mastrukov <dmitry@taurussoft.org>
+
+ * configure.in: Added Belarusian to ALL_LINGUAS
+
+2002-11-02 Daniel Elstner <daniel.elstner@gmx.net>
+
+ * glib/giochannel.c (g_io_channel_write_chars): Fix left_len
+ calculation in the from UTF-8 to UTF-8 case: left_len should
+ be the number of bytes left in the input buffer rather than
+ channel->write_buf. (#96373)
+
+2002-10-27 Tor Lillqvist <tml@iki.fi>
+
+ * configure.in (G_MODULE_LDFLAGS): Don't set on Win32, only causes
+ trouble.
+
+ * glib/gmain.c (g_poll): Fix for bug reported by Herman Bloggs
+ (http://mail.gnome.org/archives/gtk-devel-list/2002-October/msg00101.html)
+ and others. We waited for events only for GPollFDs whose events
+ field had G_IO_IN set. We need to wait also for events for
+ GPollFDs that have just G_IO_OUT set. Non-blocking sockets in the
+ process of being connect()ed are one such case. Also silence a
+ couple of gcc warnings.
+
+Fri Oct 18 13:41:30 2002 Manish Singh <yosh@gimp.org>
+
+ * glib/giochannel.c (g_io_channel_read_line_backend): avoid
+ creating negative values out of unsigned values using MAX,
+ check to see if the result would be positive before doing
+ the calculation.
+
+Tue Oct 15 15:28:47 2002 Manish Singh <yosh@gimp.org>
+
+ * tests/iochannel-test.c: use gsize instead of int where appropriate
+ (64-bit cleanliness fix). Removed leftover line_term cruft.
+
+Tue Oct 15 15:07:45 2002 Manish Singh <yosh@gimp.org>
+
+ * gmodule/Makefile.am gobject/Makefile.am gthread/Makefile.am:
+ add -DG_DISABLED_DEPRECATED
+
+ * tests/gio-test.c tests/mainloop-test.c tests/string-test.c
+ tests/testglib.c test/tree-test.c tests/unicode-collate.c
+ tests/unicode-normalize.c: Deprecation cleanup
+
+Mon Oct 14 15:51:05 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gdate.c (g_date_fill_parse_tokens): Fix a memory
+ leak. (#94550, Sebastian Rittau)
+
+Mon Oct 14 15:36:11 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gcompletion.[ch] (g_completion_complete): Make
+ prefix argument const. (#91662, Gustavo Carneiro)
+
+Mon Oct 14 15:32:14 2002 Owen Taylor <otaylor@redhat.com>
+
+ * tests/mainloop-test.c (adder_response): Fix a minor memory
+ leak.
+
+Sat Oct 12 21:30:41 2002 Tim Janik <timj@gtk.org>
+
+ * merged up from glib-2-0:
+
+ * glib/gstrfuncs.c (g_ascii_strtod): fix comment.
+ (g_ascii_strtoull): new function, acting like strtoull(3) in the C
+ locale.
+
+ * glib/gscanner.[hc]: fix 32bit issues with integer parsing and
+ support storing 64bit values in GTokenValue by
+ using g_ascii_strtoull().
+
+Sat Oct 12 12:34:22 2002 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * glib/gtree.c (g_tree_search), glib/gspawn.c
+ (g_spawn_async_with_pipes):
+
+ Documentation fixes: #71778, Owen Taylor; #85095, Bill Janssen,
+ Owen Taylor.
+
+Thu Oct 10 23:27:02 2002 Tim Janik <timj@gtk.org>
+
+ * glib/gscanner.c (g_scanner_msg_handler): if input_name is NULL,
+ print out "<memory>" instead of completely skipping input specification
+ and thusly loosing error line information.
+
+Sun Sep 29 12:15:44 2002 Manish Singh <yosh@gimp.org>
+
+ * tests/mainloop-test.c: use gsize instead of int where appropriate
+ (64-bit cleanliness fix)
+
+2002-09-29 Tor Lillqvist <tml@iki.fi>
+
+ * configure.in: Instead of forcing -fnative-struct into CFLAGS
+ when using gcc for Win32, check for gcc version 3.x which uses
+ -mms-bitfields instead. Also check if either of these switches is
+ actually available at all, and warn if not. Thanks to Soren
+ Andersen for the inspiration.
+
+ * HACKING: Say we require autoconf 2.52 as that is what
+ configure.in does.
+
+2002-09-23 Arvind Samptur <arvind.samptur@wipro.com>
+ * glib/gspawn.c (fork_exec_with_pipes) : when the child fails
+ we need to reap it to avoid a zombie. This would
+ happen in case of g_spawn_sync. Fixes #92658
+
+2002-09-20 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gscanner.c (g_scanner_msg_handler): Don't print
+ scanner->input_name when it is NULL. (#93752)
+
+2002-09-06 Havoc Pennington <hp@redhat.com>
+
+ * autogen.sh: automake 1.4
+
+2002-09-01 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * docs/reference/glib/tmpl/datalist.sgml, glib/gmain.c:
+
+ Documentation fixes: (#75255, Martin Schulze; #76104, Daryll Strauss)
+
+2002-08-26 Tor Lillqvist <tml@iki.fi>
+
+ * configure.in (G_LIBS_EXTRA): Don't link with -lwsock32 on
+ Cygwin (#91696, Masahiro Sakai).
+
+Tue Aug 20 16:01:03 2002 HideToshi Tajima <hidetoshi.tajima@sun.com>
+
+ * glib/gconvert.c (strdup_len): validate 'len' argument properly
+ for the case that input string is not null-terminated. (#91222)
+
+2002-08-10 Gustavo Noronha Silva <kov@debian.org>
+
+ * configure.in: added pt_BR to ALL_LINGUAS
+
+2002-08-07 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmarkup.c (g_markup_parse_context_get_element):
+ Use g_return_val_if_fail, no g_return_if_fail.
+
+2002-08-06 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/gthread.c: Set the normal PID surrogate priority according
+ to getpid() to avoid errors for niced processes. (#86116)
+
+ * gthread/gthread-impl.c, gthread/gthread-posix.c,
+ gthread/gthread-solaris.c: Do the same for the posix/dce
+ implementation. Solaris still needs to set priority of the main
+ thread, because all unbound threads will schedule according to
+ that value and it defaults to 0 (the minimal value).
+
+ * glib/gmain.c: Factor out g_main_context_init_pipe from
+ g_main_context_new to initialize the wakeup pipe of a
+ context. Call that function from g_main_context_new if threads are
+ initialized and for all contexts when threads are initialized
+ in g_main_thread_init. (#86872)
+
+ * gthread/gthread-impl.c: Call g_main_thread_init. (#86872)
+
+Thu Jul 25 14:23:15 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gfileutils.c: Clarify the behavior of g_build_path()
+ for empty elements and for leading and trailing copies
+ of the separator in the docs.
+
+ * glib/gfileutils.c: Fix problems with leading elements
+ consisting only of "/" characters. (#85928, Guillaume Chazarain)
+
+ * tests/strfunc-test.c (main): Add more test cases
+ for g_build_filename().
+
+2002-07-26 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gunicode.h:
+ * glib/gutf8.c (g_utf8_strreverse): New function to revert
+ a utf8 string.
+ * glib/gpattern.c (g_utf8_reverse): Gone, replaced by
+ g_utf8_strreverse. (#87725)
+
+Thu Jul 25 20:57:20 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/giochannel.c (g_io_channel_read_line): Fix
+ docs for @str_return to conform to the main docs
+ and the implementation as to whether the terminator
+ is included. (#87964, Jacob Berkman)
+
+Thu Jul 25 19:52:41 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/guniprop.c (real_tolower): Handle the
+ end of the string properly when max_len is set.
+ (#88545, Morten Welinder.) Rename the next_t
+ variable to next_type to make cc-mode happy.
+
+ * glib/gconvert.c (g_iconv_open): Fix missing
+ label from previous commit.
+
+Thu Jul 25 19:41:03 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/giochannel.c (g_io_channel_get_flags): Fix
+ incorrect return value in g_return_val_if_fail
+ (#85545, David L. Cooper II)
+
+Thu Jul 25 19:12:43 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/giochannel.c (g_io_channel_set_encoding): Clarify
+ that only one of the conditions listed in the docs
+ need to be true, not all of them. (#87176,
+ Sebastian Rittau)
+
+ * glib/giochannel.c (g_io_channel_read_line): Fix
+ description of the return value. (#87754, Manuel Clos)
+
+Thu Jul 25 19:02:53 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.c (g_timeout_add): Remove reference
+ in the docs to @notify parameter. (#87768,
+ Manuel Clos)
+
+Thu Jul 25 17:57:07 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gconvert.c (g_iconv_open): Document the
+ (GIConv)-1 return value on failure. (#87559,
+ Jarek Dukat)
+
+ * glib/gconvert.c (g_iconv_open): Fix potential
+ problems with the assumption that (GIConv)(iconv_t)-1
+ is the same as (GIConv)-1.
+
+2002-07-15 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmarkup.h:
+ * glib/gmarkup.c (g_markup_parse_context_get_element): New
+ function to get the currently open element. (#70448)
+
+2002-07-04 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * tests/*.c: Added #undef G_DISABLE_ASSERT and #undef G_LOG_DOMAIN
+ throughout the files, which didn't already have them. (#87312)
+
+2002-07-03 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Made the thread flags determination tests first
+ check for the canonical form -pthread[s], then for other
+ possibilities. Also recognize some more platforms. Modeled after
+ patch from Miroslaw Dobrzanski-Neumann <mne@mosaic-ag.com>
+ (#77981).
+
+ * configure.in: Fixed bugs in posix thread priority
+ resolution. Also added AIX priorities. Fix from
+ Laurent Vivier <Laurent.Vivier@bull.net>. (#82599)
+
+ * gthread/gthread-solaris.c: Use thr_min_stack() instead of
+ sysconf (_SC_THREAD_STACK_MIN). if stack_size is 0 on entry to
+ g_thread_create_solaris_impl, also pass 0 to thr_create. Otherwise
+ the stack might be to small for any nontrivial thread. Discovered
+ on intel-solaris by Rajkumar Sivasamy <rajkumar.siva@wipro.com>.
+
+2002-07-03 Anders Carlsson <andersca@gnu.org>
+
+ * configure.in: Add a forgotten trailing ` in the
+ GLIB_BINARY_AGE expression. Also fixup LT_CURRENT.
+
+2002-07-02 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * configure.in: Set binary age to 0 to make it compile.
+
+ * configure.in: Improve checks for dce/posix threads to also do
+ the right thing, if the thread functions are not declared in
+ pthread.h. Idea from Miroslaw Dobrzanski-Neumann
+ <mne@mosaic-ag.com> in #77981.
+
+2002-07-01 Anders Carlsson <andersca@gnu.org>
+
+ * configure.in: Up version to 2.1.0.
+
+2002-07-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/garray.h: Add parenthesis to protect macro
+ argument. Spotted by Sam Couter <sam@topic.com.au>. (#86826)
+
+2002-06-28 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/gmessages.h (g_assert, g_assert_not_reached,
+ g_return_if_fail, g_return_val_if_fail): In case of
+ G_DISABLE_ASSERT replace "G_STMT_START{ }G_STMT_END" with
+ "G_STMT_START{ (void)0; }G_STMT_END", because the former chokes
+ gcc prior to 3.0. (#86664)
+
+2002-06-26 Yanko Kaneti <yaneti@declera.com>
+
+ * configure.in: (ALL_LINGUAS) Added Bulgarian (bg).
+
+Thu Jun 13 16:12:04 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.c (struct _GTimeoutSource): Make
+ interval unsigned to match g_timeout_source_new().
+ (#82624, Tim Janik.)
+
+ * glib/gmain.c (g_timeout_prepare): Add some
+ extra gymnastics to avoid signed/unisgned integer
+ overflows.
+
+Thu Jun 13 15:57:46 2002 Owen Taylor <otaylor@redhat.com>
+
+ * INSTALL.in: Add a note about the deficiency
+ of Tru64 iconv. (#81699, Manuel Op de Coul)
+
+Tue Jun 11 17:03:39 2002 Owen Taylor <otaylor@redhat.com>
+
+ * tests/patterntest.c (test_compilation)
+ * glib/gmem.c (profiler_try_realloc): A couple
+ of 64-bit printf format fix from George Lebl.
+ (#82817)
+
+ * glib/gconvert.c (open_converter): Fix gsize/gint
+ mixup for g_iconv() arguments. (#83270,
+ David L. Cooper II)
+
+2002-06-03 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gwin32.c (g_win32_get_package_installation_directory):
+ Replace homegrown "hash" entity by standard ISO entity "num".
+
+2002-05-26 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmain.c: Remove references to nonexisting functions
+ g_source_set_callback_closure(), g_source_poll(), g_source_add()
+ from docs.
+
+ * glib/gdir.c (g_dir_open): Typo fix in docs.
+
+ * glib/gasyncqueue.c (g_async_queue_lock):
+ (g_async_queue_unref_and_unlock): Fix markup to avoid erroneous
+ <link>s in docs.
+
+ * glib/gwin32.c: Escape #'s leading to erroneous <link>s in docs.
+
+ * glib/gtree.c: Replace some occurances of Gtree by GTree in docs.
+
+ * glib/gstring.c (g_string_insert_unichar): Typo fix in docs.
+
+2002-05-23 Havoc Pennington <hp@redhat.com>
+
+ * glib/gspawn.c (fork_exec_with_pipes): on success, close the
+ pipes from the child. Fix from Tim.
+
+2002-05-22 jacob berkman <jacob@ximian.com>
+
+ * m4macros/glib-gettext.m4 (AM_GLIB_WITH_NLS): fix tyop
+
+Wed May 22 15:40:47 2002 Owen Taylor <otaylor@redhat.com>
+
+ * README.in: Remove notes about now-fixed-bugs.
+
+ * m4macros/glib-gettext.m4 acinclude.m4: Get rid
+ of AC_MSG_NOTICE() usage, since some broken systems
+ (Hi Debian!) might not be using autoconf-2.5x for
+ downstream packages even though we require it for
+ glib itself.
+
+ * INSTALL.in: Add a note about installing extra
+ converters for Solaris.
+
+ * glib/gutils.h (g_bit_nth_msf): Fix termination
+ condition. (#82582, Paolo Molaro)
+
+Tue May 21 15:51:17 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: $with_libiconv, not $with_iconv.
+
+Mon May 20 18:02:46 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Move iconv tests before gettext
+ checks. (#81999)
+
+ * m4macros/glib-gettext.m4 acinclude.m4: If we can't
+ link to gettext, try adding in -liconv. (#80076,
+ Boyd Lynn Gerber)
+
+ * m4macros/glib-gettext.m4 acinclude.m4: Suppress
+ warnings about xgettext not being GNU gettext when
+ libintl wasn't found at all.
+ (#79016, Andrew P. Lentvorski, Jr.)
+
+2002-05-21 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmarkup.c (g_markup_parse_context_parse): Added
+ proper support for CDATA sections.
+
+2002-05-20 jacob berkman <jacob@ximian.com>
+
+ * glib/gdir.c: include sys/types.h before dirent.h to build on
+ darwin (fixes #72859)
+
+Mon May 20 15:35:59 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gfileutils.c (get_contents_regfile): Fix double
+ close of file descriptor on error. (#82139, Wayne Schuller)
+
+ * glib/gspawn.c (close_and_invalidate): Don't close
+ fd's that have already been closed. (Fix from Michael
+ Meeks, #81959)
+
+ * glib/giochannel.c (g_io_channel_close): If not flushing,
+ dump the contents of the write buffers, so we won't try
+ to write them to an invalid fd later. (Patch from Ron Steinke,
+ fixing #78290, Andreas Persenius.)
+
+2002-05-18 Matthias Clasen <maclas@gmx.de>
+
+ * tests/markups/fail-36.gmarkup:
+ * tests/markups/fail-35.gmarkup:
+ * tests/markups/valid-8.gmarkup:
+ * tests/markups/valid-7.gmarkup:
+ * tests/markups/valid-6.gmarkup:
+ * tests/markups/valid-5.gmarkup: New testcases.
+
+ * tests/markup-test.c (passthrough_handler):
+ (text_handler): Don't ignore the text_len parameter.
+
+ * glib/gmarkup.c (find_current_text_end): Don't hang on embedded
+ nuls. (#81977)
+ (g_markup_parse_context_parse): Fix passthrough handling to
+ correctly skip processing instructions, comments, doctype
+ declarations and CDATA marked sections. (#81977)
+
+Sat May 18 00:21:51 2002 Tim Janik <timj@gtk.org>
+
+ [merged from stable]
+
+ * glib/gscanner.c (g_scanner_unexp_token): fix missing cases for
+ expected_token.
+
+2002-05-17 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32.in: Match new additions in a configure-produced
+ config.h.
+
+ * glibconfig.h.win32.in: gssize and gsize as in a
+ configure-produced glibconfig.h.
+
+ * glib/glib.def: Add new functions.
+
+Thu May 16 12:24:00 2002 Owen Taylor <otaylor@redhat.com>
+
+ * acinclude.m4 m4macros/glib-gettext.m4: Incorporate
+ AM_LC_MESSAGES, AM_PATH_PROG_WITH_TEST as AM_GLIB_* to avoid
+ dependencies on gettext m4 files. (#81885, Hidetoshi Tajima.)
+
+2002-05-14 Alex Larsson <alexl@redhat.com>
+
+ * glib/gstrfuncs.c:
+ * glib/gstrfuncs.h:
+ New functions g_str_has_suffix and g_str_has_prefix.
+
+ * tests/string-test.c: (main):
+ Test the new functions.
+
+Mon May 13 23:20:00 2002 Owen Taylor <otaylor@redhat.com>
+
+ * autogen.sh (have_gettext): Add a check for GNU gettext.
+ (Pointed out by Dan Winship in #59386.)
+
+Mon May 13 11:55:33 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in acglib.m4: If sizeof(int) == sizeof(long)
+ run compilation tests to determine which way gsize should
+ be defined. (#74413, reported by Miroslaw Dobrzanski-Neumann)
+
+Mon May 13 11:42:23 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/libcharset/*: Update from libcharset CVS.
+ Includes additional encodings for Solaris (#80396,
+ Qingjiang Yuan)
+
+ * configure.in: Add getc_unlocked to CHECK_FUNCS().
+
+ * glib/gmessages.c (strdup_convert): If
+ g_convert_with_fallback() fails, print the error
+ message to stderr the first time, then return
+ the original string. (#78197)
+
+2002-05-10 Naba Kumar <kh_naba@users.sourceforge.net>
+
+ * configure.in: Added "hi" to ALL_LINGUAS.
+
+2002-05-08 Michael Natterer <mitch@gimp.org>
+
+ * configure.in: fixed yesterdays fix for cross compiling: simply
+ check the variable "cross_compiling" which gets set by autoconf.
+
+2002-05-07 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmarkup.c (unescape_text): Report unfinished entity
+ references as errors rather than running into an assert. (#80441)
+
+2002-05-07 Michael Natterer <mitch@gimp.org>
+
+ * configure.in: added a new conditional CROSS_COMPILING which
+ indicates ($build != $host). If it is set, look for
+ glib-genmarshal in PATH. Error out if it was not found.
+
+Tue May 7 11:24:22 2002 Owen Taylor <otaylor@redhat.com>
+
+ Fixes for #79347, Ron Arts.
+
+ * glib/gqsort.c (g_qsort_with_data): Handle 0 elements,
+ don't g_return_if_fail().
+
+ * tests/qsort-test.c (main): Add a 0 element test.
+
+ * glib/garray.c (g_[ptr_]array_sort_with[_data]):
+ Remove invalid assertions that array->pdata != NULL ..
+ it's NULL for 0 elements which is a valid case.
+
+Mon May 6 16:00:41 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gbacktrace.h: Exclude OSF from alpha definition
+ of G_BREAKPOINT(), since the assembler apparently
+ doesn't support bpt. (#77852, Gareth Pierce) [from stable]
+
+Mon May 6 11:48:08 2002 Owen Taylor <otaylor@redhat.com>
+
+ [ merged from stable ]
+
+ * Makefile.am (EXTRA_DIST): Add ChangeLog.pre-2-0 (#78641)
+
+ * m4macros/glib-2.0.m4: save CFLAGS/LIBS properly when
+ compiling "what went wrong" test case. (#79330)
+
+ * m4macros/glib-2.0.m4: Remove reference to editing
+ pkg-config script. (From Jim Gettys)
+
+ * configure.in: (Look for dyld interfaces before dlopen()
+ since OS X can have both. Patch from Jacob Berkman,
+ #80438)
+
+2002-05-01 jacob berkman <jacob@ximian.com>
+
+ * configure.in: fix typo on 64-bit printf formatting string
+ configure message (fixes #80389)
+
+2002-04-29 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * configure.in: Added Vietnamese (vi) to ALL_LINGUAS
+
+2002-04-19 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gspawn.c (g_spawn_command_line_sync): Add Windows-specific
+ note to the gtk-doc comment.
+
+ * glib/gspawn-win32.c: Remove the copy-pasted gtk-doc comment
+ blocks. It's enough to have them in gspawn.c.
+
+2002-04-18 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread/gthread-impl.c (g_thread_init): Fixed typo. (#78985)
+
+2002-04-13 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/gthreadpool.c (g_thread_pool_thread_proxy): Unlock the pool
+ for all threads leaving it. (#78348)
+
+2002-04-11 Matthias Clasen <maclas@gmx.de>
+
+ * tests/patterntest.c: Remove manual UTF-8 -> Latin1 conversion for
+ stuff fed to g_print.
+
+2002-04-08 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * tests/gio-test.c, tests/markup-test.c: Use gsize instead of
+ gint. From Miroslaw Dobrzanski-Neumann
+ <mne@mosaic-ag.com>. (#77982)
+
+2002-04-08 Stanislav Brabec <utx@penguin.cz>
+
+ * cs.po: Added Czech (cs) to ALL_LINGUAS.
+
+2002-03-31 Hasbullah Bin Pit <sebol@ikhlas.com>
+
+ * configure.in: Added Malay (ms)to ALL_LINGUAS.
+
+2002-03-29 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.def: Add g_convert_init.
+
+Thu Mar 28 18:25:14 2002 Owen Taylor <otaylor@redhat.com>
+
+ * Released 2.0.1
+
+ * configure.in: Version 2.0.1, interface, binary age 1.
+
+Thu Mar 28 18:22:53 2002 Owen Taylor <otaylor@redhat.com>
+
+ * README: Remove warning about g_print, etc, encoding.
+
+ * NEWS: Updates.
+
+ * glib/gmessages.c (g_log_default_handler): Use %lu
+ (plus a cast) when printing out pid_t arguments.
+ (#76770, Morten Welinder)
+
+ * glib/gstrfuncs.c (g_strdup_vprintf): Check the
+ result of vasprintf(), return NULL on failure.
+ (#76802, Akira Tagoh)
+
+ * tests/testglib.c (TEST): Supress a warning with
+ some GCC versions.
+
+Thu Mar 28 20:31:51 2002 Tim Janik <timj@gtk.org>
+
+ * glib/gmessages.c:
+ (g_print):
+ (g_printerr): convert prtinf() strings to local charset
+ when writing them to stdout or stderr.
+
+Wed Mar 27 18:42:22 2002 Tim Janik <timj@gtk.org>
+
+ * gmessages.[hc]:
+ major cleanups. introduced _g_log_fallback_handler() to handle
+ recursive messages which really doesn't call any GLib functions.
+ this allowes the default handler to use normal GLib functions and
+ also fixes user supplied log level handlers.
+ fixed locking issues, based on a patch from Sebastian Willhelmi,
+ attached to #74356. translate log messages from UTF-8, based
+ on the same patch. save fatal and recursion flags across flag
+ loop. use new integer format code from above patch.
+ move GLib functions out of locked mutex state to avoid deadlocks.
+ move the level prefix and filedescriptor logic into mklevel_prefix().
+ move _g_debug_init() into a place where we can figure and handle
+ recursion.
+
+Mon Mar 25 18:13:06 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gtypes.h (GUINT*_SWAP_LE_BE_X86): Remove __const__
+ qualifier from __asm__ statements... GCC since at least
+ 2.96 has assumed no side effects automaticaly, and gcc-3.1
+ will warn about this usage. (#73308, Cody Russell)
+
+Fri Mar 22 17:59:27 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmem.c (g_mem_chunk_reset): Fix problem where
+ if g_mem_chunk_reset() is called on an alloc-only
+ memchunk, then a useles GTree was created.
+
+Wed Mar 20 18:20:21 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gconvert.c (open_converter): Try to work around segfaults
+ on Solaris if NULL is passed for outbuf... supposedly gchar
+ *outbuf = NULL... &outbuf works. (#74336, Lauri Alanko)
+
+Wed Mar 20 11:17:32 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gfileutils.c (get_contents_regfile): Close the
+ file descriptor. (#75507, Matthias Clasen)
+
+Wed Mar 20 11:00:59 2002 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Use $PKG_CONFIG, not pkg-config.
+ (LEE Sau Dan, #75572)
+
+2002-03-20 Sven Neumann <sven@gimp.org>
+
+ * glib/ghash.c (g_hash_table_resize): avoid repeated call of
+ g_spaced_primes_closest() by moving it out of the CLAMP macro
+ (spotted by Salmaso Raffaele).
+
+2002-03-17 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: Add MSVC-specific text by Hans Breuer.
+
+2002-03-16 Tor Lillqvist <tml@iki.fi>
+
+ * glib/giowin32.c: Some debugging output formatting changes. The
+ following changes fix a problem with buffered GIOChannels, noticed
+ with the help of Owen's test program, thanks! (#59969)
+ (g_io_win32_prepare): Return value that takes the buffer condition
+ into account, like g_io_unix_prepare() does.
+ (g_io_win32_check): Ditto, like g_io_unix_check().
+ (g_io_win32_dispatch): Ditto, like g_io_unix_dispatch().
+
+Thu Mar 14 17:37:45 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/giochannel.c (g_io_channel_write_chars): Fix some
+ gsize/gint mismatches. (#74422, Miroslaw Dobrzanski-Neumann)
+
+2002-03-14 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/gmessages.c: Fixed threading issues brought up by
+ #74577. Make g_log_find_domain, g_log_domain_new,
+ g_log_domain_check_free and g_log_domain_get_handler require being
+ called with g_messages_lock held and remove all internal locking
+ in them. Then added proper locking to g_log_set_handler,
+ g_log_remove_handler and g_logv. Problem spotted by Miroslaw
+ Dobrzanski-Neumann <mne@mosaic-ag.com>. (#74577)
+
+2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
+ * glib/gconvert.c
+ glib/gen-unicode-tables.pl
+ glib/gunidecomp.h : fixed cast/type problems to
+ avoid warnings (with forte compiler) (#73898)
+
+2002-03-12 Alexander Larsson <alla@lysator.liu.se>
+
+ * glib/gconvert.c:
+ Cache getenv("G_BROKEN_FILENAMES") in have_broken_filenames() and
+ use instead. Add g_convert_init() that calls have_broken_filenames()
+
+ * gthread/gthread-impl.c:
+ Have g_thread_init call g_convert_init.
+
+2002-03-11 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstrfuncs.c (g_strtod):
+ (g_ascii_strtod):
+ (g_ascii_dtostr):
+ (g_ascii_formatd): Doc formatting fixes.
+
diff --git a/trunk/ChangeLog.pre-2-4 b/trunk/ChangeLog.pre-2-4
new file mode 100644
index 000000000..73ae096e1
--- /dev/null
+++ b/trunk/ChangeLog.pre-2-4
@@ -0,0 +1,2042 @@
+Tue Mar 16 11:50:56 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.4.0 ===
+
+ * configure.in: Version 2.4.0, interface age 0.
+
+ * README.in: Updates
+
+ * NEWS: Updates
+
+Sun Mar 14 13:56:48 2004 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmessages.c (escape_string): Handle invalid
+ UTF-8. (#131218, patch from Matthias Clasen)
+
+Sun Mar 14 13:23:36 2004 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gspawn.c: Use fork1() not fork for
+ G_THREADS_IMPL_SOLARIS. (#136971, Sebastian Wilhelmi)
+
+Sun Mar 14 12:58:30 2004 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.c: if _POLL_EMUL_H is defined, undefine
+ HAVE_POLL to prefer our own poll() emulation to the
+ lame OS/X one. (#136956, Manish Singh)
+
+Sat Mar 13 23:30:53 2004 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmacros.h (G_STMT_START): Add __extension__
+ to G_STMT_START to quite gcc -pedantic. (#131899,
+ Olivier Biot)
+
+Sat Mar 13 23:18:45 2004 Owen Taylor <otaylor@redhat.com>
+
+ * tests/env-test.c (main): Remove critical log handler;
+ we can't trigger g_return_if_fails() in our test suite
+ even silently, because the user could have compiled
+ with --disable-debug. #if 0 the tests for
+ g_setenv/g_unsetenv with a "foo=bar" variable name.
+ (#136709, reported by Frédéric L. W. Meunier)
+
+Sat Mar 13 23:10:35 2004 Owen Taylor <otaylor@redhat.com>
+
+ Some warning fixes for the Sun compiler (Reported by
+ David L. Cooper II, #136401)
+
+ * glib/giochannel.c (g_io_channel_read): Return
+ G_IO_ERROR_NONE, not G_IO_STATUS_NORMAL, since hte
+ function returns a GIOError.
+
+ * glib/guniprop.c: Fix some guchar/gchar confusion
+ with special_case_table.
+
+Fri Mar 12 15:30:58 2004 Manish Singh <yosh@gimp.org>
+
+ * glib/gbacktrace.h: ia32's G_BREAKPOINT() implementation works on
+ amd64 too. Enable it.
+
+Fri Mar 12 15:21:22 2004 Manish Singh <yosh@gimp.org>
+
+ * glib/gatomic.c: Non-optimizing compile fails for two asm
+ statements on PowerPC. Use generic implementaton for those
+ cases. Spotted by Christof Petig <christof@petig-baender.de>,
+ fix by Sebastian Wilhelmi. Bug #137006 has a possible alternate
+ solution, but we'll be conservative for now.
+
+Thu Mar 11 02:05:13 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmain.c (g_main_depth): Remove an extra semicolon.
+ Spotted by Kjartan Maraas.
+
+2004-03-10 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gspawn-win32.c
+ * glib/gspawn-win32-helper.c: Implement
+ G_SPAWN_FILE_AND_ARGV_ZERO. (#136792, Bruce Hochstetler)
+
+ * tests/spawn-test.c
+ * tests/spawn-test-win32-gui.c: Test it.
+
+Tue Mar 9 09:16:11 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.3.6 ===
+
+ * configure.in: Version 2.3.6, interface age 1.
+
+ * NEWS: Updates
+
+2004-03-09 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * tests/child-test.c: Do not run the g_child_watch_* test
+ multi-threaded, as that doesn't work on linux prior 2.6. Fixes
+ #136539.
+
+2004-03-08 Alastair McKinstry <mckinstry@computer.org>
+
+ * configure.in: Added "ga" (Irish) to ALL_LINGUAS.
+
+2004-03-07 Danilo Šegan <dsegan@gmx.net>
+
+ * configure.in: Added "sr@ije" to ALL_LINGUAS.
+
+2003-03-07 Hans Breuer <hans@breuer.org>
+
+ * glib/gspawn-win32.c : (GPid)shortcut_spawn_retval which
+ doesn't improve the implementation at all, it just make it
+ compile with msvc ...
+
+ * glib/makefile.msc.in : build gatomic.c (now really:)
+
+2004-03-06 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: Update.
+
+ * configure.in
+ * Makefile.am
+ * */Makefile.am: Drop the hand-written makefile.mingw(.in)
+ files. They haven't been maintained in a long time. As several
+ people have managed to build GLib for Win32 using the
+ autoconfiscation mechanism, there is no real reason to even try to
+ maintain the hand-written mingw makefiles.
+
+2004-03-05 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/gatomic.c: Fix infinite recursion for
+ G_MEMORY_BARRIER_NEEDED and DEFINE_WITH_MUTEXES by using a GMutex
+ instead of G_DEFINE_LOCK. The mutex is allocated by the new
+ function _g_atomic_thread_init. Fixes #136284.
+
+ * glib/gthreadinit.h, glib/gthread.c: Declare and call
+ _g_atomic_thread_init during thread system initialization.
+
+2004-03-05 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.def: Add g_main_depth. (#136221, Cedric Gustin)
+
+2004-03-04 Guntupalli Karunakar <karunakar@freedomink.org>
+
+ * configure.in: Added "pa" (Punjabi) to ALL_LINGUAS.
+
+2004-03-04 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * glib/gmain.c: Use the atomic integer operations for GMainContext
+ and GMainLoop reference counting.
+
+ * glib/gmain.c: Hold the main_context_list lock, when iterating
+ the list. Only call g_main_context_wakeup for positive reference
+ count.
+
+2004-03-03 Tor Lillqvist <tml@iki.fi>
+
+ * glibconfig.h.win32.in: Update to match a configure-generated
+ glibconfig.h. Specifically: Remove G_{MIN,MAX,MAXU}INT64
+ definitions (now in gtypes.h). Remove g_once and
+ g_static_mutex_get_mutex_impl_shortcut definitions (now in
+ gthread.h).
+
+ * tests/child-test.c: Use a macro GPID_FORMAT for the format to
+ print GPid in (%p on Win32, %d on Unix). Maybe configure.in should
+ place that in glibconfig.h?
+
+ Print verbose error message if CreateProcess() fails.
+
+ Don't close the child handle until in the child watch callback.
+
+ Don't try to run /bin/true on Win32. Run ipconfig instead (just to
+ pick a program that should exist on all Window boxes).
+
+2004-03-02 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * glib/gatomic.c: Fixed missing definition for ppc code. Fix by
+ Mark McLoughlin <mark@skynet.ie>.
+
+Mon Mar 1 16:49:51 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.3.5 ===
+
+ * configure.in: Version 2.3.5, interface ago 0.
+
+ * NEWS: Some further updates.
+
+Mon Mar 1 15:49:09 2004 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.c (check_for_child_exited): Don't
+ call waitpid() on a source that has already exited.
+
+ * glib/gmain.c (g_child_watch_check): Return TRUE
+ only if the child actually exited.
+
+Mon Mar 1 15:39:57 2004 Owen Taylor <otaylor@redhat.com>
+
+ Patch from J. Ali Harlow
+
+ * configure.in: Use void * not HANDLE for GPid on win32.
+
+ * glib/gspawn.[ch] glib/gspawn-win32.[ch] glib/glib.def:
+ Add g_spawn_close_pid().
+
+ * glib/gspawn.[ch]: Make g_spawn functions take
+ GPid * instead if int * (GPid == int on unix, will
+ produce compile warnings until fixed on Win32.)
+
+ * tests/child-test.c: Make the test a little more
+ inappropriately verbose.
+
+ * glib/gmain.c: Add some documentation warnings about
+ not closing @pid while the source is active.
+
+Mon Mar 1 20:32:06 2004 Tim Janik <timj@gtk.org>
+
+ * autogen.sh:
+ - exit with $? instead of 1 in case of failure
+ - exit with $? if ./configure failed
+ (that's so autogen.sh && make lines work)
+ - removed --enable-gtk-doc option
+ - added $AUTOGEN_CONFIGURE_ARGS
+
+Mon Mar 1 09:17:32 2004 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.c (g_main_depth): Clarify doc comment.
+
+2004-03-01 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * glib/gatomic.c: Define g_atomic_(int|pointer)_get only for
+ G_ATOMIC_OP_MEMORY_BARRIER_NEEDED. Spotted by Hans Breuer.
+
+Sun Feb 29 21:42:47 2004 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.c: Fix leftover references to
+ g_main_context_depth() in docs.
+
+Sun Feb 29 21:34:34 2004 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.[ch]: Add g_main_depth() (Request from
+ Tim Janik and Stefan Westerfeld)
+
+Mon Mar 1 00:26:11 2004 Matthias Clasen <maclas@gmx.de>
+
+ * NEWS: Update for 2.3.4
+
+2003-02-29 Hans Breuer <hans@breuer.org>
+
+ * glib/gatomic.c : added win32 api based implementation
+ for G_PLATFORM_WIN32, !__GNUC__
+
+ * glb/glib.def : change to g_atomi_* no _fallback
+
+2004-02-29 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * configure.in, glib/gatomic.c, glib/gatomic.h: Moved the
+ assembler functions from gatomic.h to gatomic.c, which makes for
+ better maintainability. Also use gint instead of gint32 to be able
+ to use reference counting for ABI-fixed structures with
+ gint/guint.
+
+ * glib/gthread.h: Adapted accordingly.
+
+ * tests/atomic-test.c: Updated to test for G_MAXINT and G_MININT.
+
+2003-02-28 Hans Breuer <hans@breuer.org>
+
+ * glib/glib.def : updated externals, including those
+ from bug #135386
+
+ * glib/makefile.msc.in : build gatomic.c
+
+ * glibconfig.h.win32.in : removed duplicate definition
+ of G_MAXSIZE, typedef void* GPid instead of int
+
+ * tests/child-test.c glib/gmain.c :
+ applied patch from J. Ali Harlow <ali@juiblex.co.uk> to fix
+ g_child_watch implementation on win32, bug #50296
+
+Fri Feb 27 22:13:22 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gqueue.c: Trivial doc changes.
+
+Fri Feb 27 21:58:20 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/ghash.c (g_hash_table_find): Add "Since: 2.4"
+
+2004-02-27 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * glib/gasyncqueue.c, glib/gasyncqueue.h: Use
+ g_atomic_int_(inc|dec_and_test) for reference
+ counting. g_async_queue_unref_and_unlock and
+ g_async_queue_ref_locked is deprecated, but still there to
+ preserve ABI.
+
+ * glib/gasyncqueue.c, glib/gasyncqueue.h: Reading access to
+ ref_count only with g_atomic_int_get().
+
+Fri Feb 27 02:00:34 2004 Matthias Clasen <maclas@gmx.de>
+
+ * acglib.m4: quote AC_DEFUN macro names so automake
+ 1.8 won't whine at us. (#134882)
+
+Fri Feb 27 01:44:41 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gdate.c: Translate from locale era to AD in
+ g_date_set_parse(). (#133400, Theppitak Karoonboonyanan)
+
+Fri Feb 27 00:46:29 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstrfuncs.c (g_strerror): Don't modify errno. (#116617,
+ Balazs Scheidler)
+
+2004-02-26 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * glib/gatomic.h: Fix the !G_THREADS_ENABLED case.
+
+ * tests/child-test.c (main): Only run, if threads are enabled.
+
+ * glib/gatomic.h: empty G_ATOMIC_MEMORY_BARRIER() definition for
+ !G_THREADS_ENABLED
+
+ * glib/gthread.h: Define g_once and
+ g_static_mutex_get_mutex_impl_shortcut in terms of
+ G_MEMORY_BARRIER, if defined and if we can inline.
+
+ * configure.in: Remove double checked locking feature check.
+
+ * configure.in, config.h.win32.in, glib/gthread.c: Removed the PID
+ niceness surrogate for thread priorities as requested by Tim. It
+ does more harm than good.
+
+ * glib/gatomic.c, glib/gatomic.h: New files to implement atomic
+ operations for different platforms. Fixes bug #63621.
+
+ * glib/glib.h: Include gatomic.h.
+
+ * configure.in: Add test for assembler routines for atomic operations.
+
+ * glib/Makefile.am: Add gatomic.c, gatomic.h.
+
+ * tests/Makefile.am, tests/atomic-test.c: Unit test for atomic
+ operations.
+
+2003-02-26 Hans Breuer <hans@breuer.org>
+
+ * glib/glib.def : added g_hash_table_find and a
+ bunch of g_queue_*
+
+ * glib/gmain.c : make it compile on win32,
+ child_wake_up_pipe replaced by semaphore like it is done
+ for the other wake_up_pipe
+
+ * config.h.win32.in : added HAVE_INT64_AND_I64
+ * glibconfig.h.win32.in : G_MAXSIZE .. G_M??INT64,
+ and typedef for GPid
+
+ * test/env-test.c : don't let the local log function
+ collide in namespace with standard C
+
+2004-02-25 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * configure.in, glib/gthread.c: For the PID thread priorities
+ surrogate use gettid instead of getpid. This also works with nptl
+ (on linux-2.6), as well as with linuxthreads (on linux-2.4).
+
+2004-02-24 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * glib/grand.c: Add Since: 2.4, where due
+
+Tue Feb 24 14:09:21 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.3.3 ===
+
+ * configure.in: Version 2.3.3, interface age 0.
+
+Mon Feb 23 22:24:00 2004 Matthias Clasen <maclas@gmx.de>
+
+ * NEWS: Start of 2.3.3 section.
+
+Sun Feb 22 02:32:14 2004 Matthias Clasen <maclas@gmx.de>
+
+ * configure.in: Set the gmodule suffix to 'a' for aix and
+ use the aix gmodule implementation. (#85930, Laurent Vivier)
+
+Sun Feb 22 00:47:04 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gnode.c (g_node_copy_deep): New function to deep-copy a
+ GNode and its children. (#93464, James M. Cape)
+
+Sat Feb 21 15:42:39 2004 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * glib/gqueue.c: Some documentation fixes.
+
+Sat Feb 21 13:45:08 2004 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * glib/gqueue.[ch]: Extend GQueue API to match the GList
+ API. (#78414).
+
+ * tests/queue-test.c: Update test suite to cover the new API.
+
+Fri Feb 20 03:02:05 2004 Tim Janik <timj@gtk.org>
+
+ * glib/ghash.[hc]: applied patch from #131937 with slight
+ renames. provides g_hash_table_find().
+
+Fri Feb 20 02:39:03 2004 Tim Janik <timj@gtk.org>
+
+ * applied patch from David Schleef <ds@schleef.org> which implements
+ a G_MODULE_BIND_LOCAL flag to g_module_open() to disable global
+ symbol registration.
+
+Thu Feb 19 18:40:01 2004 Tim Janik <timj@gtk.org>
+
+ * glib/gstring.[hc]: for G_CAN_INLINE environments, inline
+ g_string_append_c() for efficiency. (vaguely based on #118707).
+
+Wed Feb 18 23:57:42 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmain.c: Include signal.h for SIGCHLD. (#134622, Damien
+ Carbery)
+
+2004-02-18 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * glib/gasyncqueue.c: Lazy creation of GCond. Only
+ signal GCond, if threads are waiting.
+
+ * glib/gmain.c (g_main_context_new): Set context->wake_up_pipe
+ only for G_THREADS_ENABLED.
+
+Sat Feb 14 11:05:26 2004 Manish Singh <yosh@gimp.org>
+
+ * configure.in: Remove unnecessary STRIP_* definitions, and GNU
+ make check. Really fixes #134102.
+
+Sat Feb 14 02:11:08 2004 Matthias Clasen <maclas@gmx.de>
+
+ * configure.in: Make the check for GNU make work when MAKE is a
+ full path. (#134102, Julio M. Merino Vidal)
+
+Sat Feb 14 02:08:03 2004 Matthias Clasen <maclas@gmx.de>
+
+ * configure.in: Suppress xsltproc and xmlcatalog checks
+ if enable_man=no. (#134091, Julio M. Merino Vidal)
+
+Sat Feb 14 01:21:34 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmain.h:
+ * glib/gmain.c (g_child_watch_source_new):
+ * glib/gmain.c (g_child_watch_add):
+ * glib/gmain.c (g_child_watch_add_full): Wrap waitpid() as a
+ GSource. This is a partial implementation of the "Unix signal
+ source". (#50296, Jonathan R. Blandford)
+
+ * configure.in: Add the necessary configury to typedef GPid
+ appropriately.
+
+ * tests/Makefile.am:
+ * tests/child-test.c: Test child_watch sources.
+
+Sat Feb 7 15:02:01 2004 Manish Singh <yosh@gimp.org>
+
+ * tests/type-test.c: Fix broken test for gsize formats.
+
+2004-02-05 Robert Sedak <robert.sedak@sk.htnet.hr>
+
+ * configure.in: Added "hr" (Croatian) to ALL_LINGUAS.
+
+Wed Feb 4 17:58:51 2004 Manish Singh <yosh@gimp.org>
+
+ * glib/gcompletion.h: Add prototype for g_completion_complete_utf8().
+
+ * tests/completion-test.c: #include <string.h>
+
+2004-02-05 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.def: Add g_completion_complete_utf8.
+
+Thu Feb 5 01:19:12 2004 Matthias Clasen <maclas@gmx.de>
+
+ * tests/file-test.c (test_mkstemp): Weaken an g_assert() to a
+ g_warning(), since apparently nothing in Posix forces mkstemp()
+ to reject templates without any X's. (#133397)
+
+Thu Feb 5 00:56:28 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gcompletion.c (g_completion_complete_utf8): New function which
+ works like g_completion_complete(), but strips a trailing incomplete
+ UTF-8 character from the prefix. (#133313, Theppitak Karoonboonyanan)
+
+ * tests/completion-test.c (main): Some GCompletion tests.
+
+ * tests/Makefile.am: Add completion-test.
+
+2004-02-01 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.def: Add g_strsplit_set.
+
+Sat Jan 31 03:13:56 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/garray.c (g_byte_array_remove_range): Don't return FALSE
+ from a pointer function. (#131472, Morten Welinder)
+
+2004-01-30 Noah Levitt <nlevitt@columbia.edu>
+
+ * glib/gunicomp.h:
+ * glib/gunidecomp.c:
+ * glib/gen-unicode-tables.pl: Size compose_table correctly. (#123421,
+ Simon Josefsson)
+
+ * glib/gen-unicode-tables.pl: Get rid of some new warnings from perl
+ 5.8.1.
+
+Tue Jan 27 18:45:47 2004 Manish Singh <yosh@gimp.org>
+
+ * m4macros/glib-2.0.m4
+ * m4macros/glib-gettext.m4: quote AC_DEFUN macro names so automake
+ 1.8 won't whine at us.
+
+Wed Jan 28 01:39:21 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstrfuncs.h:
+ * glib/gstrfuncs.c (g_strsplit_set): New function, a cross
+ between g_strsplit() and strtok(). (#88329, Soeren Sandmann)
+
+ * tests/strfunc-test.c (main): Add g_strsplit_set() tests.
+
+Fri Jan 23 22:49:52 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gutils.c (g_get_any_init): Sigh, protect against
+ pw->pw_gecos being "" as well. (#132317, Kaj-Michael Lang)
+
+2004-01-23 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.def: Add new functions.
+
+ * glib/grand.c: Don't include <unistd.h> unless
+ HAVE_UNISTD_H. Include <process.h> on G_OS_WIN32.
+ (g_rand_new): Use getppid() only on G_OS_UNIX.
+
+Thu Jan 22 15:16:11 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.3.2 ===
+
+Thu Jan 22 13:55:44 2004 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gtimer.c: Add g_timer_continue().
+ (#98536, Tim-Philipp Müller)
+
+ * configure.in: Version 2.3.2, interface age 0.
+
+ * NEWS: tweak, finish.
+
+Thu Jan 22 20:50:55 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gutils.c (g_get_any_init): Protect against
+ pw->pw_gecos being NULL.
+
+Thu Jan 22 00:41:34 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gutils.c (g_get_any_init): Don't treat the Win32
+ user name like a gecos field, and when extracting a real
+ name from a gecos field, replace '&' by the capitalized
+ user name (a traditional passwd feature).
+ (#118973, reported by Soeren Boll Overgaard)
+
+Tue Jan 20 22:31:22 2004 Matthias Clasen <maclas@gmx.de>
+
+ * NEWS: Start of 2.3.2 section.
+
+Fri Jan 16 21:45:56 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstring.c (g_string_ascii_up): Forgot to fix this one.
+
+Thu Jan 15 22:35:04 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstring.c (g_string_up):
+ * glib/gstring.c (g_string_down):
+ * glib/gstring.c (g_string_ascii_down): Move initialization of
+ variables after g_return_val_if_fail. (#131564, Olivier Poncet)
+
+Sun Jan 11 16:13:20 2004 Manish Singh <yosh@gimp.org>
+
+ * configure.in: Add G_MAXSIZE, define in terms of G_MAXUfoo.
+
+ * tests/type-test.c: Add test for G_MAXSIZE.
+
+ * glibconfig.h.win32.in: Cleanup, add some missing bits.
+
+Sun Jan 11 16:05:35 2004 Manish Singh <yosh@gimp.org>
+
+ * glib/giounix.c: #define _POSIX_SOURCE for SSIZE_MAX. Fixes #128853.
+
+Sat Jan 10 00:11:12 2004 Manish Singh <yosh@gimp.org>
+
+ * glib/gutils.h (g_bit_nth_lsf,g_bit_nth_msf): 64-bit cleanliness
+ fixes.
+
+ * docs/reference/glib/tmpl/misc_utils.sgml: update to reflect the
+ above take gulongs now. My docs suck, someone should revisit it.
+
+Fri Dec 19 11:49:21 2003 George Lebl <jirka@5z.com>
+
+ * glib/grand.c
+ glib/grand.h (g_rand_new) (g_rand_new_with_seed)
+ (g_rand_new_with_seed_array) (g_rand_set_seed_array): Add
+ the init_by_array functionality from the reference implementation
+ of the mersenne twister (mt19937ar.c) and change the naming
+ to fit with the rest of the grand API. New functions are
+ g_rand_new_with_seed_array, g_rand_set_seed_array. This is only
+ reliable/tested for the 2.2 version of the seeding as that's what
+ the reference implementation uses. Also modify g_rand_new to
+ get 4 longs from /dev/urandom since that will always be available
+ anyway and we get more entropy and if /dev/urandom is unavailable
+ use also 4 longs for seeding using secs, usecs, getpid and getppid.
+ For version 2.0 use only a simple seed again but be more careful
+ about seeding with secs/usecs in this case.
+
+ * glib/grand.c
+ glib/grand.h (g_rand_copy): Add g_rand_copy function to copy the
+ current state of the random number generator.
+
+ * glib/grand.c (g_rand_new): Add testing for EINTR when reading
+ from /dev/urandom
+
+ * tests/rand-test.c: add testing of the array seeding stuff against
+ the reference implementation, plus add statistical sanity check
+ to see that the values outputted are truly kind of random. And
+ check that g_rand_copy truly copies the state by checking a few
+ terms.
+
+Tue Jan 6 15:38:30 2004 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gutils.h: Check defined (__OPTIMIZE__) not
+ __OPTIMIZE__. (Zack Rusin)
+
+2003-12-30 Murray Cumming <murrayc@usa.net>
+
+ * gobject/glib-mkenums.in: Added a lowercase_name option, to be used
+ next to the enum declaration, where the flag option is already used,
+ when it is not possible to guess where to put the underscores in the
+ _get_type() function name, for instance for GNOMEVFSURIHide.
+
+Fri Dec 26 02:03:58 2003 Matthias Clasen <maclas@gmx.de>
+
+ * glib/garray.[hc] (g_ptr_array_foreach): New function to
+ call a function for each element of a GPtrArray. (#114790)
+
+ * tests/array-test.c (main): Add a test for g_ptr_array_foreach().
+
+Sun Dec 21 22:57:58 2003 Matthias Clasen <maclas@gmx.de>
+
+ * m4macros/glib-gettext.m4: Quote macro names to support
+ reading the file multiple times. (#125537)
+
+Sun Dec 21 22:42:42 2003 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmem.c (g_mem_chunk_destroy): Fix the locking of the
+ mem_chunks list. (#127096, Balazs Scheidler)
+
+2003-12-14 Hans Breuer <hans@breuer.org>
+
+ * glib/gfileutils.c : make g_file_test(,G_FILE_TEST_IS_EXECUTABLE)
+ return something useful on win32, too.
+
+2003-12-13 Hans Breuer <hans@breuer.org>
+
+ * glib/gconvert.c : get_filename_charset() needs to
+ return false for filenames not encoded in utf-8,
+ which is always true on win32
+
+ * glibconfig.h.win32.in : (u)int64 modifier isn't the
+ gcc 'll' but always the msvcrt one 'I64'
+
+ * glib/glib.def : updated
+
+Thu Dec 11 10:31:21 2003 Manish Singh <yosh@gimp.org>
+
+ * glib/gmacros.h: change #elif with no expression to #else in
+ G_STRFUNC definition. Thanks to Damien Carbery, fixes #129101.
+
+Mon Dec 8 12:02:40 2003 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.3.1 ===
+
+ * NEWS: Further updates for 2.3.1.
+
+Fri Dec 5 12:09:13 2003 Manish Singh <yosh@gimp.org>
+
+ * glib/gunidecomp.c (_g_utf8_normalize_wc): fix gint/gsize confusion.
+
+2003-12-04 Noah Levitt <nlevitt@columbia.edu>
+
+ * glib/gunidecomp.c: Add hangul composition and decomposition to
+ unicode normalization. (#100456)
+
+ * tests/unicode-normalize.c: Test hangul.
+
+Tue Dec 2 02:29:41 2003 Matthias Clasen <maclas@gmx.de>
+
+ Fix for #103710, Mark Jones:
+
+ * glib/gtypes.h (G_MAXINT64): Define G_{MIN,MAX,MAXU}INT{8,16,32,64}.
+ * configure.in: Don't put G_{MIN,MAX,MAXU}INT64 in glibconfig.h.
+
+Thu Nov 27 17:04:08 2003 Tim Janik <timj@gtk.org>
+
+ * glib/gstrfuncs.c (g_strconcat): handle NULL arguments
+ gracefully.
+
+ * glib/gmacros.h: defined G_STRFUNC, which (pretty) prints the
+ current function (since G_STRLOC and G_GNUC_*FUNCTION became
+ unusable with gcc-3.0).
+
+Wed Nov 26 16:45:16 2003 Roozbeh Pournader <roozbeh@sharif.edu>
+
+ * glib/gstrfuncs.c: Fixed a bad pointer comparison in
+ g_ascii_strtod that came up in fa_IR locale (#126640, Behdad
+ Esfahbod).
+
+ * tests/strtod-test.c: Fixed the tests to catch the above.
+
+Sat Nov 22 14:16:51.15 2003 Andrew Lanoix <alanoix@umich.edu>
+
+ * glib/giowin32.c: Bind inter-thread comminication
+ sockets to INADDR_LOOPBACK instead of INADDR_ANY.
+
+Thu Nov 20 15:09:40 2003 Manish Singh <yosh@gimp.org>
+
+ * configure.in: Added G_GSIZE_FORMAT and friends
+
+ * tests/printf-test.c
+ * tests/testglib.c
+ * tests/type-test.c: Add tests for the above.
+
+Mon Nov 17 17:28:10 2003 Manish Singh <yosh@gimp.org>
+
+ * tests/thread-test.c (test_g_thread_once): Use GUINT_TO_POINTER
+ for g_thread_create data.
+
+Sat Nov 15 23:00:57 2003 Matthias Clasen <maclas@gmx.de>
+
+ * glib/guniprop.c (g_utf8_casefold): Add a NULL check
+ to be consistent with the other g_utf8_ functions. (#121618,
+ Tim-Philipp Müller)
+
+2003-11-15 Tor Lillqvist <tml@iki.fi>
+
+ * tests/makefile.msc.in: Fix for MSVC build: Skip strtod-test, use
+ correct glib libraries, with 2.0 in the names. (#126906, John
+ Ehresman)
+
+Sat Nov 15 00:46:14 2003 Matthias Clasen <maclas@gmx.de>
+
+ * configure.in: Don't blindly set glib_cv_long_long_format to
+ "ll" when using the included printf. As long as the native
+ printf supports 64bit printing, use the native format.
+ (#119525, Tor Lillqvist)
+
+Fri Nov 14 00:28:46 2003 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gi18n.h:
+ * glib/gi18n-lib.h: Also define bind_textdomain_codeset() in
+ the #ifndef ENABLE_NLS case.
+
+Wed Nov 12 15:06:27 2003 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Version 2.3.1, interface age 0.
+
+ * NEWS: Update for 2.3.1.
+
+2003-11-07 Mark McLoughlin <mark@skynet.ie>
+
+ * glib/gconvert.c: (get_filename_charset): re-work to
+ retain a copy of the cached charset rather than the
+ actual return value from g_get_charset (which may
+ change). Also, re-initialize the cache if it does
+ change. See bug #126454.
+
+Thu Nov 6 00:04:46 2003 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gconvert.c (get_filename_charset): Replacement for
+ have_broken_filenames() which consults the environment variable
+ G_FILENAME_ENCODINGS in addition to G_BROKEN_FILENAMES.
+ * glib/gconvert.c (g_filename_from_utf8):
+ * glib/gconvert.c (g_filename_to_utf8):
+ * glib/gconvert.c (_g_convert_thread_init): Use
+ get_filename_charset() instead of have_broken_filenames().
+
+Wed Nov 5 22:05:19 2003 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gi18n-lib.h:
+ * glib/gi18n.h: New headers defining common gettext-support
+ macros.
+
+ * glib/Makefile.am (glibsubinclude_HEADERS): Add gi18n.h
+ and gi18n-lib.h.
+
+ * glib/gstrfuncs.h:
+ * glib/gstrfuncs.c (g_strip_context): Auxiliary function for
+ the implementation of Q_().
+
+2003-11-05 Morten Welinder <terra@gnome.org>
+
+ * glib/garray.c (g_ptr_array_remove_range): Make it compile.
+ (#119337, self.)
+
+ * glib/gstring.c (g_string_insert_len): Handle the case where the
+ to-be-inserted string is a substring of the target string.
+ (g_string_assign): Handle "s = s;".
+ (#114260, self.)
+
+Sun Nov 2 01:47:31 2003 Matthias Clasen <maclas@gmx.de>
+
+ Fix 64bit printing for MSVC builds (#119292, Hans Breuer):
+
+ * configure.in (HAVE_INT64_AND_I64): Define for MSVC to
+ include support for printing __int64 with format %I64 in
+ the gnulib printf wrappers.
+ * glib/gnulib/printf-args.h (enum arg_type): Add TYPE_INT64
+ and TYPE_UINT64.
+ * glib/gnulib/printf-args.h (struct argument): Add a_int64 and
+ a_uint64 members.
+ * glib/gnulib/printf-args.c (printf_fetchargs): Support
+ TYPE_INT64 and TYPE_UINT64.
+ * glib/gnulib/printf-parse.c (printf_parse): Parse I64 format
+ modifier and map formats to TYPE_INT64.
+ * glib/gnulib/vasnprintf.c (vasnprintf): Print TYPE_INT64 with
+ format modifier I64.
+ * glib/gnulib/README: Document the __int64 support.
+
+Sat Nov 1 08:45:38 2003 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.c (g_main_context_iterate): Set the
+ return value from the result of g_main_context_check()
+ (after we poll) rather than g_main_context_prepare.
+ (#121675, Padraig O'Briain)
+
+Fri Oct 31 00:13:53 2003 Matthias Clasen <maclas@gmx.de>
+
+ * configure.in: Remove the semicolon from the definition of
+ g_once(), so that GPOINTER_TO_INT (g_once (...)) works.
+
+Tue Oct 28 23:38:30 2003 Matthias Clasen <maclas@gmx.de>
+
+ * tests/printf-test.c: Change the %e tests to not check for
+ actual string equality, but rather equality under g_ascii_strtod(),
+ since the number of leading digits in the exponent seems to
+ be not exactly prescribed by SUS.
+
+Fri Oct 24 17:09:04 2003 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.3.0 ===
+
+ * NEWS: Small update.
+
+2003-10-24 Tor Lillqvist <tml@iki.fi>
+
+ * configure.in: Force shared library (DLL) only on Windows.
+ (I don't think that is controversial?) Remove unnecessary
+ AC_LIBTOOL_WIN32_DLL. Don't use -D_REENTRANT on
+ Win32, it is not used by mingw or MSVC headers.
+
+ * config.h.win32.in
+ * glibconfig.h.win32.in: Match what configure produces.
+
+ * glib/gconvert.c
+ * glib/gutils.c: Mark a couple of functions and variables that
+ aren't public as static.
+
+ * glib/gnulib/g-gnulib.h: Undef HAVE_SNPRINTF before (re)defining
+ it potentially differently, to silence compiler.
+
+ * glib/glib.def: Add some missing entries.
+
+ * tests/gobject/Makefile.am (LDADD): Reorder, put libgobject after
+ libtestgobject.
+
+ * tests/gobject/ifaceproperties.c (main): NULL-terminate arg list
+ to g_object_set() and _get().
+
+Thu Oct 23 12:38:24 2003 Owen Taylor <otaylor@redhat.com>
+
+ * tests/gobject/Makefile.am (dist-hook): Remove
+ and extra backslash.
+
+ * tests/gobject/Makefile.am (EXTRA_DIST): Add
+ testmarshal.list.
+
+ * glib/Makefile.am (libglib_2_0_la_SOURCES): Add
+ missing gunicode-private.h.
+
+ * tests/testglib.c (main): Fix a warning.
+
+ * tests/gobject/ifaceinherit.c: Remove check that
+ wasn't supposed to work (adding an interface already
+ added to the derived class to the base class),
+ fix a bug.
+
+Wed Oct 22 23:41:03 2003 Matthias Clasen <maclas@gmx.de>
+
+ * NEWS: Update for 2.3.0.
+
+Tue Oct 14 17:44:38 2003 Owen Taylor <otaylor@redhat.com>
+
+ * tests/gobject/ifaceproperties.c: Test for interface
+ properties and GParamSpecOverride.
+
+Wed Oct 8 23:40:26 2003 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmarkup.c (g_markup_printf_escaped):
+ (g_markup_vprintf_escaped): Document as 2.4 additions.
+ (unescape_text): Implement newline and whitespace normalization
+ according to the XML specification. (#123919)
+ (g_markup_escape_text): Document whitespace (non)handling.
+
+2003-10-05 Matthias Clasen <maclas@gmx.de>
+
+ * configure.in: Make the various printf feature test macros
+ reflect the system printf, even when using the included printf.
+ In particular, don't force HAVE_C99_SNPRINTF, since g-gnulib.h
+ needs that test result. (#122973)
+
+ * glib/gprintf.c (g_vasprintf): Don't rely on HAVE_VASPRINTF,
+ directly check for _g_vasprintf.
+
+ * glib/gprintfint.h (_g_vasprintf): Only define _g_vasprintf()
+ if vasprintf() is available.
+
+ * glib/gnulib/printf.c (_g_gnulib_vfprintf): Don't write
+ trailing nul to the file. (#122973)
+
+ * acinclude.m4 (AC_FUNC_VSNPRINTF_C99): Make the test
+ detect non-C99-compliance of AIX 5.1 and Solaris
+ vsnprintf(). (#122496)
+
+Thu Oct 2 01:15:46 2003 Owen Taylor <otaylor@redhat.com>
+
+ * tests/gobject/ifacecheck.c: Test case for
+ g_type_add_interface_check().
+
+ * tests/gobject/ifaceinit.c: Add #undef G_DISABLE_ASSERT.
+
+Thu Oct 2 01:11:39 2003 Owen Taylor <otaylor@redhat.com>
+
+ * tests/gobject/ifaceinherit.c: Remove some tests that
+ were testing things that weren't supposed to work; add
+ a test for adding an interface first to the child class,
+ then to the parent class.
+
+Thu Oct 2 00:02:55 2003 Owen Taylor <otaylor@redhat.com>
+
+ * tests/gobject/Makefile.am test/gobject/ifaceinherit.c:
+ Tests of interface inheritance and overriding.
+
+2003-09-30 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gspawn-win32.c (do_spawn): Call protect_argv() in
+ do_spawn() instead of in do_spawn_with_pipes() so that we can use
+ the original argv[0] as the program file name parameter to
+ spawnv() in the shortcut (doing without helper process)
+ code. Fixes problem if GIMP 1.3 was installed in a path with
+ spaces in the name.
+
+Tue Sep 30 15:31:16 2003 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * glib/guniprop.c (has_more_above): make the argument const to
+ get rid of warning
+
+ * glib/garray.c (g_byte_array_remove_range): insert cast to get
+ rid of warning
+
+2003-09-29 Tor Lillqvist <tml@iki.fi>
+
+ * tests/testglib.c (main): Use hardcoded name for DLL, as there is
+ no reliable way to determine it at compile or run time anyway.
+
+2003-09-29 Matthias Clasen <maclas@gmx.de>
+
+ * glib/guniprop.c (g_unichar_get_mirror_char): Add "Since: 2.4"
+ to docs.
+
+Thu Sep 25 15:43:08 2003 Owen Taylor <otaylor@redhat.com>
+
+ * tests/gobject/testmodule.[ch] test/gobject/Makefile.am:
+ Dummy dynamic type module for testing type plugin code
+ and dynamic types.
+
+ * test/gobject/defaultiface.c: Test of
+ g_type_default_interface_ref() and friends.
+
+2003-09-28 Gediminas Paulauskas <menesis@delfi.lt>
+
+ * configure.in: Added lt to ALL_LINGUAS.
+
+2003-09-25 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.def: Remove g_bsearch_array_* entries that don't exist
+ any longer. (ABI change?)
+
+Thu Sep 25 15:01:37 2003 Owen Taylor <otaylor@redhat.com>
+
+ * tests/Makefile.am (SUBDIRS): Add gobject/.
+
+Fri Sep 12 16:26:21 2003 Owen Taylor <otaylor@redhat.com>
+
+ * tests/gobject/ configure.in: New directory, framework
+ for automated GObject tests.
+
+ * tests/gobject/override.c: Move testoverride.c
+ here, automate.
+
+ * tests/gobject/ifaceinit.c: Move testifaceinit.c here.
+
+ * tests/gobject/accumulator.c: Test signal accumulators,
+ including g_signal_accumulator_true_handled.
+
+2003-09-12 Noah Levitt <nlevitt@columbia.edu>
+
+ * glib/gen-unicode-tables.pl: Take a directory where to look for the
+ unicode files on the command line instead of 7 individual files.
+
+2003-09-12 Noah Levitt <nlevitt@columbia.edu>
+
+ * glib/gen-unicode-tables.pl:
+ * glib/gunichartables.h:
+ * glib/gunicode.h:
+ * glib/guniprop.c: Add g_unichar_get_mirror_char. (#114749)
+
+Thu Sep 11 20:11:05 2003 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmarkup.c: Add g_markup_printf_escaped(),
+ g_markup_vprintf_escaped().
+
+ * tests/markup-escape-test.c (main): Test for
+ g_markup_escape_text(), g_markup_printf_escaped().
+
+2003-09-10 Noah Levitt <nlevitt@columbia.edu>
+
+ * glib/gunicodeprivate.h:
+ * glib/gunicollate.c:
+ * glib/gunidecomp.c:
+ * glib/guniprop.c:
+ * tests/casemap.txt:
+ * tests/gen-casemap-txt.pl: Unicode 4.0 special casing. (#114681)
+
+ * glib/gunicodeprivate.h: Use a private header instead of extern
+ function declarations (_g_utf8_normalize_wc,
+ _g_unichar_combining_class).
+
+Mon Sep 8 00:31:10 2003 Stefan Westerfeld <stefan@space.twc.de>
+
+ * glib/gbsearcharray.h: inserted casts for C++.
+
+2003-08-28 Matthias Clasen <maclas@gmx.de>
+
+ * tests/patterntest.c (verbose): Fix a C99ism. (#120821, Thomas
+ Klausner)
+
+2003-08-25 Tor Lillqvist <tml@iki.fi>
+
+ * glib/giowin32.c (read_thread): Avoid UNLOCKing the critical
+ section twice, which might cause a hang. (#120653)
+
+ * glib/giowin32.c (g_io_channel_unix_new): Warn if fd is both a
+ valid file descriptor and socket.
+
+Mon Aug 25 12:34:36 2003 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmessages.c: Escape control characters in g_logv() output.
+ (#108287, Christian Biere)
+
+Mon Aug 25 12:17:20 2003 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.c (g_main_context_unref_and_unlock):
+ When DISABLE_MEM_POOLS is set, loop through and free
+ the poll records explicitely, since g_mem_chunk_destroy()
+ won't do it. (#118121, Morten Welinder)
+
+2003-08-22 Samúel Jón Gunnarsson <sammi@techattack.nu>
+
+ * is.po: Added "is" to ALL_LINGUAS.
+
+2003-08-19 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gmessages.c (g_logv): [Win32] Make the fatal error message
+ box easier to notice with MB_SETFOREGROUND. Also use MB_ICONERROR
+ to get a nice stop-sign icon.
+
+Tue Aug 19 09:42:06 2003 Owen Taylor <otaylor@redhat.com>
+
+ * m4macros/glib-gettext.m4: Add $INTLLIBS to $LIBS
+ temporarily, not -lintl. (Problem with fix for
+ #119171, pointed out by James Henstridge)
+
+Tue Aug 19 03:55:29 2003 Tim Janik <timj@gtk.org>
+
+ * glib/gbsearcharray.h: license change, no restrictions are made
+ in the new license at all, the implmentation is simply provided
+ "as is" to allow copy-pasting the code into any third-party app.
+ naturally, the implementation is self-contained within the header
+ file to allow this.
+ default to non-shrinking behaviour, allow users to request shrinking
+ via G_BSEARCH_ARRAY_AUTO_SHRINK.
+ creation, deletion functions are now named g_bsearch_array_create()
+ and g_bsearch_array_free().
+ fixed const in prototypes, removed cruft.
+ (g_bsearch_array_insert): take only three arguments, do nothing if the
+ node to insert is already there.
+ (g_bsearch_array_replace): insert or replace if the node is already
+ there.
+ (g_bsearch_array_remove): remove nodes by index, the index of a node
+ can be found via g_bsearch_array_get_index().
+ removed other g_bsearch_array_remove*() variants.
+ (g_bsearch_array_lookup): minor optimizations.
+ (g_bsearch_array_lookup_sibling): return nodes on mismatches.
+
+ * glib/gbsearcharray.c: removed.
+
+2003-08-16 Tor Lillqvist <tml@iki.fi>
+
+ Fix #117925 (Dov Grobgeld):
+
+ * glib/gutils.c (g_find_program_in_path, g_basename,
+ g_path_get_basename, g_path_is_absolute, g_path_skip_root,
+ g_path_get_dirname, g_get_any_init): On Win32, look also for
+ slashes ('/') as pathname separators.
+
+ * glib/gfileutils.c (g_file_open_tmp): Ditto. If the template
+ contains a pathname separator, include the actual one in the error
+ message, instead of always the canonical one.
+
+ (g_build_filename): Separate implementation on Win32 that looks
+ for either slash or backslash. Document Unix/Windows differences.
+
+ * tests/testglib.c
+ * tests/strfunc-test.c: Test above functionality on Win32.
+
+2003-08-15 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gmain.c (g_poll): [Win32] Don't exceed handle array
+ bounds. Warn if there would be too many handles to wait
+ for. (WaitForMultipleObjects() has a relatively low limit of 64
+ handles. The Win32 IO channel code should be fixed not to need to
+ wait for one handle per file or socket being watched. Later.)
+
+2003-08-13 Tor Lillqvist <tml@iki.fi>
+
+ * glib/Makefile.am
+ * gmodule/Makefile.am
+ * gobject/Makefile.am
+ * gthread/Makefile.am: Use srcdir also in references to the .def
+ files. (#118885, Jeff Bonggren)
+
+2003-08-12 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gconvert.c (g_locale_from_utf8): Drop the Win32-specific
+ implementation. It used WideCharToMultiByte(), which is broken as
+ it stores unconvertable characters as fallback characters
+ (question marks) in the destination string without being able to
+ tell how much of the conversion succeeded. Using g_convert() like
+ on Unix is better and simpler. (#117872)
+
+ (g_locale_to_utf8): No need for the Win32-specific implementation
+ here, either.
+
+ (have_broken_filenames): Define as TRUE on Win32.
+
+ (g_filename_to_utf8, g_filename_from_utf8): Drop Win32 ifdefs. As
+ have_broken_filenames() now is defined TRUE on Win32, works as
+ before.
+
+2003-08-11 Matthias Clasen <maclas@gmx.de>
+
+ * acinclude.m4: Copy newer versions of JH_CHECK_XML_CATALOG and
+ JH_PATH_XML_CATALOG from gtk-doc to enable configuring without
+ xmlcatalog in PATH. (#119115)
+
+2003-08-10 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gutils.c (g_getenv): Don't use a cache of variable name to
+ value mappings on Win32, as that breaks g_setenv() and
+ g_unsetenv(). Only call ExpandEnvironmentStrings() if necessary,
+ and in that case return a quarkified string. It is still
+ questionable how necessary expanding embedded environment variable
+ references is. Possibly the whole Win32-specific g_getenv()
+ implementation could be removed. (#119520)
+
+2003-08-08 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.def: Add g_once_impl.
+
+ * glib/gutils.c (g_setenv): Fix syntax error in the !HAVE_SETENV
+ case.
+
+2003-08-08 Matthias Clasen <maclas@gmx.de>
+
+ * tests/env-test.c (main): Remove a test for getenv() behaviour
+ which isn't specified by SUS and doesn't work on Solaris.
+
+2003-08-07 Matthias Clasen <maclas@gmx.de>
+
+ * tests/env-test.c: Add tests for '=' in names and values.
+
+ * glib/gutils.c (g_setenv, g_unsetenv): Check that the variable
+ name doesn't contain '='. Add a declaration for environ. (#119338)
+
+ * acinclude.m4: Tighten the snprintf() test to check behaviour on
+ zero-size buffers. (#106091)
+
+ * tests/patterntest.c: Specify test strings in UTF-8, remove all
+ charset conversion. Replace the NOISY define by a cmdline arg
+ --noisy. (#115757)
+
+Thu Aug 7 15:01:09 2003 Owen Taylor <otaylor@redhat.com>
+
+ * m4macros/glib-gettext.m4: Set $LIBS to include
+ -lintl when checking for dcgettext and
+ _nl_msg_cat_cntr. (Tim Mooney, #119171)
+
+Thu Aug 7 14:15:44 2003 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.c (g_idle_source_new): Make the default priority
+ for idle sources G_PRIORITY_DEFAULT_IDLE as anybody would
+ expect and document that. (#114461, reported by Andy Wingo)
+
+2003-08-06 Noah Levitt <nlevitt@columbia.edu>
+
+ * tests/casemap.txt:
+ * tests/gen-casemap-txt.pl: Add test for special case not at inital
+ position in the string, the bug just fixed. (#118957)
+
+2003-08-05 Noah Levitt <nlevitt@columbia.edu>
+
+ * glib/guniprop.c: Get rid of "len" parameter to output_special_case
+ and output_marks, and make them work more like g_unichar_to_utf8,
+ fixing a bug in the process. (#118957)
+
+2003-08-05 Hans Breuer <hans@breuer.org>
+
+ * glib/gnulib/makefile.msc : (new file) for msvc build
+
+ * glib/gnulib/vasnprintf.c : use glib/galloc.h
+
+ * glib/gnulib/printf.h : #include <stdio.h> for FILE*
+
+ * glib/makefile.msc.in : replace trio with gnulib
+
+ * glib/glib.def : updated externals
+
+ * glib/guniprop.c : fix for guniprop.c(582) : error C2082:
+ redefinition of formal parameter 'len'
+
+2003-08-04 Noah Levitt <nlevitt@columbia.edu>
+
+ * tests/unicode-normalize.c: We do handle > BMP now, so test it.
+
+2003-07-31 Noah Levitt <nlevitt@columbia.edu>
+
+ * tests/file-test.c: s/g_read_link/g_file_read_link/ (#118727)
+
+2003-07-31 Noah Levitt <nlevitt@columbia.edu>
+
+ * tests/unicode-encoding.c: Return nonzero exit status if the test
+ fails. (#118729)
+
+2003-07-31 Noah Levitt <nlevitt@columbia.edu>
+
+ * tests/utf8.txt: Change instances of U+10ffff to U+10fffd, since that
+ is the last valid unicode character. Add check that U+10ffff is
+ NOTUNICODE. (#118730)
+
+2003-07-30 Noah Levitt <nlevitt@columbia.edu>
+
+ * glib/gen-unicode-tables.pl:
+ * glib/gunibreak.c:
+ * glib/gunibreak.h:
+ * glib/gunichartables.h:
+ * glib/gunicode.h:
+ * glib/gunicomp.h:
+ * glib/gunidecomp.c:
+ * glib/gunidecomp.h:
+ * glib/guniprop.c:
+ * tests/casefold.txt:
+ * tests/casemap.txt:
+ * tests/gen-casefold-txt.pl:
+ * tests/gen-casemap-txt.pl: Update Unicode data to 4.0. (#107974)
+
+2003-07-31 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gspawn-win32.c: When possible, manage without the helper
+ process. (Part of the enhancements outlined in #98737.) Speeds up
+ GIMP 1.3's first-time-run plug-in query phase a lot.
+
+ Plug a file descriptor (and thus Win32 handle) leak: close the
+ read end of the child error report pipe after use.
+
+2003-07-30 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gutils.c (g_unsetenv): Use same argument name as in header,
+ to pacify gtk-doc.
+ (g_getenv): Move docs inline, add comment about lifespan of return
+ value.
+
+ * glib-2.0.pc.in (Libs): Remove forgotten @TRIO_LIBS@. (#118616,
+ Noah Levitt)
+
+ * glib/gfileutils.[hc]: Rename g_read_link() to g_file_read_link()
+ to better match the remaining file utilities in the g_file_
+ namespace and to better separate it from readlink(). This is
+ hopefully no problem as the function is just 2 days old.
+
+2003-07-29 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gqsort.[hc] (g_qsort_with_data):
+ * glib/gconvert.[hc] (g_filename_to_uri, g_filename_from_uri):
+ * glib/gfileutils.[hc] (g_mkstemp, g_file_open_tmp): Use gchar,
+ gint, gsize instead of char, int, size_t in the interface for
+ consistency. (#118567)
+
+ Replace trio printf() by gnulib vasnprintf(): (#101874)
+
+ * configure.in: Define HAVE_LONG_LONG_FORMAT if system printf
+ understands %llu; rename enable_trio to enable_included_printf;
+ add misc. tests needed for gnulib vasnprintf(); define
+ G_GINT{16,32,64}_MODIFIER in glibconfig.h.
+
+ * acinclude.m4: Misc tests needed for gnulib vasnprintf():
+ AC_FUNC_SNPRINTF_C99, bh_C_SIGNED, jm_AC_TYPE_LONG_LONG,
+ gt_TYPE_LONGDOUBLE, gt_TYPE_WCHAR_T, gt_TYPE_WINT_T,
+ gt_AC_TYPE_INTMAX_T, jm_AC_HEADER_STDINT_H,
+ jm_AC_HEADER_INTTYPES_H.
+
+ * glib/Makefile.am: Replace TRIO_SUBDIR by PRINTF_SUBDIR and
+ trio_libtrio_la by printf_la.
+
+ * glib/gprintfint.h: Include gnulib/printf.h and use _g_gnulib_
+ functions instead of _g_trio_ functions.
+
+ * glib/trio/*: Removed
+
+ * glib/gnulib/*: vasnprintf() implementation from gnulib, patched
+ to live in the _g_gnulib namespace, use g_malloc instead of
+ malloc, and support long long printing even if system printf
+ doesn't. For more details, see glib/gnulib/README.
+
+ * tests/printf-test.c: Add tests for 64 bit printing.
+
+2003-07-28 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gfileutils.h:
+ * glib/gfileutils.c: New function g_read_link(). (#72545)
+
+ * configure.in: Check for setenv, unsetenv, readlink and symlink.
+
+ * tests/file-test.c (test_readlink): Test for g_read_link() (only
+ on systems supporting symbolic links).
+
+ * tests/env-test.c: New test for g_{get,set,unset}env().
+
+ * tests/Makefile.am (test_programs): Add env-test.
+
+ * glib/gutils.h:
+ * glib/gutils.c: New functions g_setenv() and g_unsetenv(). (#100763)
+
+2003-07-26 Matthias Clasen <maclas@gmx.de>
+
+ * tests/printf-test.c: New test, tests printf behaviour. This was
+ already mentioned in Makefile.am by accident.
+
+ * tests/file-test.c: New test, currently contains mkstemp tests
+ copied from testglib.c.
+
+ * tests/Makefile.am (test_programs): Add file-test.
+
+ * glib/gprintf.c: Fix all g_return_val_if_fail () checks to return
+ -1 on error to match the behaviour of the stdio printf() family.
+
+ * glib/garray.h:
+ * glib/garray.c (g_{,byte,pointer}_remove_range): New functions to
+ remove a range of elements from an array. (#94879, Nalin Dahyabhai)
+
+ * glib/gmessages.c (g_logv): Remove the 1024 char limit in the
+ common (non-recursive) case.
+
+2003-07-25 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gwin32.c:
+ * glib/gutf8.c:
+ * glib/gunicollate.c:
+ * glib/gtree.c:
+ * glib/gspawn.c:
+ * glib/gmain.c:
+ * glib/giochannel.c:
+ * glib/gfileutils.c:
+ * glib/gerror.c:
+ * glib/gconvert.c:
+ * glib/gasyncqueue.c:
+ * glib/gmem.c: Remove some explicit Docbook markup which is no
+ longer necessary since gtk-doc does the right thing.
+
+ * glib/gutf8.c (g_utf8_get_char_validated): Work around gtk-doc stupidity.
+
+2003-07-20 Hans Breuer <hans@breuer.org>
+
+ * glib/trio/makefile.msc : (new file) for msvc build
+
+ * glib/glib.def : removed some duplicated entries
+
+ * glib/gscanner.c : add same workaround for MSVC(5.0)
+ which does not allow to cast an uint64 to float.
+ Same as in gvaluetransform.c
+ Also move #include <io.h> behind inclusion of "glib.h"
+ which defines the needed G_OS_WIN32
+
+ * glib/makefile.msc.in : added gprintf.obj, trio\trio.lib
+ as well as shell32.lib
+
+ * tests/spawn-test.c : include <io.h> on win32
+
+2003-07-12 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gprintf.c: Doc additions.
+
+2003-07-10 Joel Brich <joel.brich@laposte.net>
+
+ * configure.in: Added "eo" to ALL_LINGUAS.
+
+Wed Jul 9 16:27:26 2003 Manish Singh <yosh@gimp.org>
+
+ * glib/gmain.c (g_main_context_unref_and_unlock): check if
+ context->poll_chunk is set before trying to destroy it. For example,
+ this can happen if no sources are added to a context before it is
+ freed.
+
+2003-07-09 Morten Welinder <terra@gnome.org>
+
+ * glib/gprintf.c (g_vasprintf): Avoid var declaration after
+ statement.
+
+2003-07-09 Matthias Clasen <maclas@gmx.de>
+
+ Support for one-time initialization functions. (#69668, Sebastian
+ Wilhelmi)
+
+ * configure.in: Check whether double checked locking is safe,
+ define g_once() in glibconfig.h accordingly.
+ * glib/gthread.h: Add GOnce, GOnceStatus, G_ONCE_INIT and g_once_impl.
+ * glib/gthread.c (g_once_impl): Fallback implementation using a
+ mutex if double checked locking is unsafe.
+ * tests/thread-test.c: Add tests for g_once().
+
+2003-07-02 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstrfuncs.c (g_strfreev): Move docs inline, document behavior
+ for NULL. (#116439, Steve Chaplin)
+
+2003-06-25 Abigail Brady <morwen@evilmagic.org>
+
+ * glib/gconvert.c (g_convert_with_fallback): Use C99 style \uxxxx
+ and \Uxxxxyyyy escapes instead for fallback instead of perl-style
+ \X{xxxx} ones, fixing bug #114284.
+
+2003-06-25 Tor Lillqvist <tml@iki.fi>
+
+ * glib/giowin32.c (g_io_channel_unix_new): Pass real &optval and
+ &optlen to getsockopt() instead of NULL. Don't remember why I
+ thought that NULL could be used (as we don't actually use the
+ returned value for anything), the Platform SDK documentation
+ doesn't imply so.
+
+2003-06-19 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gutils.c (g_path_get_basename): Move the documentation
+ inline and add details. (#108505)
+
+2003-06-18 Matthias Clasen <maclas@gmx.de>
+
+ * acinclude.m4 (JH_PATH_XML_CATALOG, JH_CHECK_XML_CATALOG): New
+ macros to check for XML catalog contents and path, borrowed from
+ gtk-doc.
+
+ * configure.in: New option --enable-man to enable regeneration of
+ man pages from Docbook, if the necessary tools are found.
+
+2003-06-17 Matthias Clasen <maclas@gmx.de>
+
+ * acinclude.m4 (JH_PATH_XML_CATALOG, JH_CHECK_XML_CATALOG): New
+ macros to check for XML catalog contents and path, borrowed from
+ gtk-doc.
+
+ * configure.in: New option --enable-man to enable regeneration of
+ man pages from Docbook, if the necessary tools are found.
+
+2003-06-15 Tor Lillqvist <tml@iki.fi>
+
+ * glib-zip.in (DLLDIR): Test where the DLLs actually are.
+
+ * README.win32: Point to FSF's binary Win32 distributions of
+ libiconv and gettext-runtime.
+
+2003-06-11 Tor Lillqvist <tml@iki.fi>
+
+ * glib-zip.in (DEVZIP): libtool 1.5 installs DLLs in the bin
+ subdirectory, so get them from there.
+
+ * glib/gwin32.c (g_win32_getlocale): Use "sr@Latn" and "sr" in the
+ same way as the po files for Serbian in Latin and Cyrillic script.
+
+2003-06-11 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * configure.in: Remove false &. Spotted by Albert Chin
+ <gtk-devel-list@thewrittenword.com>.
+
+2003-06-08 Tor Lillqvist <tml@iki.fi>
+
+ * glib/giowin32.c: Fix indentation and spacing. Use
+ INADDR_LOOPBACK instead of inet_addr("127.0.0.1") and
+ gethostbyaddr().
+
+Sat Jun 6 16:18:10 2003 Andrew Lanoix <alanoix@umich.edu>
+
+ * glib/giowin32.c: Resolved thread deadlocks in socket
+ ichannel code to support Add-Cancel-Add watch functionality
+ on windows. Also cleaned up socket error handling to not
+ segfault and do the right thing.
+
+Fri Jun 6 10:24:23 2003 Hidetoshi Tajima <hidetoshi.tajima@sun.com>
+
+ * m4macros/glib-gettext.m4: Test for Solaris native gettext
+ in libc, seeing if it supports GNU catalog format (#85217).
+
+Thu Jun 5 23:40:31 2003 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.c: When dispatching a source that is
+ !CAN_RECURSE, temporarily remove any file descriptors
+ that that source has registered from the main loop, to keep
+ recursive main loops from busy-waiting if input
+ becomes available on one of those file descriptors.
+ (#112222, Christian Krause)
+
+ * glib/gmain.c (g_source_set_priority): Properly
+ remove the source from the context's source list
+ and reinsert it sorted, rather than simply setting
+ source->next/prev to NULL! (#114274)
+
+2003-06-06 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstring.c (g_string_append_printf_internal): Use
+ g_vasprintf() and g_string_append_len(), thus enabling embedded
+ nuls in the result of g_string_printf(). (#92492, Owen Taylor)
+
+ * tests/string-test.c: Add a test for embedded nuls in the
+ result of g_string_printf().
+
+ * glib/gprintf.[ch]: Synchronize argument names with headers and docs.
+ (g_vasprintf): An implementation of vasprintf(), code was lifted
+ from g_strdup_vprintf(). (#112365)
+
+ * glib/gstrfuncs.c (g_strdup_vprintf): Just use g_vasprintf().
+
+2003-06-05 Tor Lillqvist <tml@iki.fi>
+
+ * glib/giochannel.h
+ * glib/gmain.h: Remove bogus (Win32-only) declaration of
+ g_main_poll_win32_msg_add(). No such function exists.
+
+ * glib/gmain.c (g_poll) [Win32]: Use g_win32_error_message() for
+ better warning messages.
+
+2003-06-04 Noah Levitt <nlevitt@columbia.edu>
+
+ * glib/gunidecomp.h (combine): Fix typo (#114375). Also, make the
+ function static.
+
+2003-06-03 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * configure.in: Test for pthread_setschedparam. If not existant,
+ disable priorities. (#104718)
+
+Mon Jun 2 14:18:21 2003 Owen Taylor <otaylor@redhat.com>
+
+ Patch from Jeffrey Stedfast <fejj@ximian.com> (#104825)
+
+ * glib/gspawn.c (read_data): Don't read() into '&buf', while this
+ is technically okay - it is clearer as just 'buf'.
+ (write_all): New helper function that handles write() interrupts.
+ (write_err_and_exit): Use write_all() instead of write().
+ (fork_exec_with_pipes): Same here.
+
+Sun Jun 1 09:42:36 2003 Owen Taylor <otaylor@redhat.com>
+
+ * glib/giochannel.c (g_io_error_get_from_g_error): Put
+ the g_return_val_if_fail() in the right place.
+
+Fri May 31 1:17:45 2003 Ray Strode <halfline@hawaii.rr.com>
+
+ * glib/giochannel.c (g_io_channel_error_from_errno):
+ Fix typo: should be G_IO_ERROR_UNKNOWN not
+ G_ERROR_ERROR_UNKNOWN
+
+Fri May 30 19:23:47 2003 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gstrfuncs.c (g_ascii_strncasecmp)
+ * glib/gstrfuncs.c (g_ascii_strcasecmp): Use TOLOWER()
+ macro instead of g_ascii_tolower() (#107138)
+
+Fri May 30 19:09:25 2003 Owen Taylor <otaylor@redhat.com>
+
+ * m4macros/glib-gettext.m4: Backport better handling
+ of ALL_LINGUAS from gettext.m4. (#103808, Andras Salamon)
+
+Fri May 30 18:46:05 2003 Owen Taylor <otaylor@redhat.com>
+
+ * m4macros/glib-gettext.m4: expand $exec_prefix as
+ well as $prefix. (#107290, reported by Morten Welinder,
+ patch from Raja Harinath)
+
+Fri May 30 17:24:23 2003 Owen Taylor <otaylor@redhat.com>
+
+ * glib-gettextize.in: Quote $srcdir to handle $srcdir
+ with spaces (#107850, Evan Martin)
+
+Fri May 30 16:48:26 2003 Owen Taylor <otaylor@redhat.com>
+
+ * glib/giochannel.c (g_io_channel_error_from_errno):
+ Silently return G_IO_CHANNEL_ERROR_FAILED for EINTR,
+ since close() can return EINTR. (#11842, Balazs Scheidler)
+
+Fri May 30 15:51:43 2003 Owen Taylor <otaylor@redhat.com>
+
+ * glib/giochannel.c (g_io_error_get_from_g_error):
+ Do a g_return_val_if_fail() on err == NULL to be a
+ bit more robuts on buggy IO channel implementations.
+ (#113396, Dan Winship)
+
+Tue May 27 19:56:35 2003 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmacros.h: __PRETTY_FUNCTION__ was made a non-token
+ before gcc-3.0.0 for C++. (Fix from Martin Kretzschmar,
+ #113797)
+
+2003-05-28 Matthias Clasen <maclas@gmx.de>
+
+ * tests/patterntest.c: Remain silent when sucessful.
+
+ * tests/Makefile.am: Add patterntest to make check. (113143)
+
+2003-05-27 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstrfuncs.c (g_strdup): Use memcpy instead of
+ strcpy. (#106988, Christian Biere)
+
+2003-05-27 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstrfuncs.c (g_strdup): Use memcpy instead of
+ strcpy. (#106988, Christian Biere)
+
+2003-05-23 Noah Levitt <nlevitt@columbia.edu>
+
+ * glib/gutf8.c: Fix typo in UNICODE_VALID (related to #107427).
+
+2003-05-23 Noah Levitt <nlevitt@columbia.edu>
+
+ * glib/guniprop.c: Remove stale comment.
+
+2003-05-22 Noah Levitt <nlevitt@columbia.edu>
+
+ * glib/guniprop.c: Update g_unichar_iswide to Unicode 4.0 (#113404).
+
+2003-05-21 Noah Levitt <nlevitt@columbia.edu>
+
+ * glib/guniprop.c: Fix obscure typo in case conversion routine
+ (#113469).
+
+Tue May 20 14:14:55 2003 Manish Singh <yosh@gimp.org>
+
+ * configure.in: wrap 64-bit MIN/MAX limit constants in
+ G_GINT64_CONSTANT. Fixes bug #108699.
+
+2003-05-19 Noah Levitt <nlevitt@columbia.edu>
+
+ * glib/gunibreak.c: Fix cut-and-pasto: g_unichar_break_type should
+ return G_UNICODE_BREAK_UNKNOWN if the character is greater than
+ G_UNICODE_LAST_CHAR.
+
+2003-05-19 Noah Levitt <nlevitt@columbia.edu>
+
+ * glib/glist.c: Remove unused function g_list_sort2 (bug #113203).
+
+2003-05-19 Noah Levitt <nlevitt@columbia.edu>
+
+ * glib/gunidecomp.c: Fix off-by-one error in
+ g_unicode_canonical_ordering (bug #113260).
+
+2003-05-19 Arafat Medini <lumina@silverpen.de>
+
+ * ar.po: Added ar to ALL_LINGUAS
+
+2003-05-17 Telsa Gwynne <hobbit@aloss.ukuu.org.uk>
+
+ * configure.in: Added cy to ALL_LINGUAS
+
+2003-05-05 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstrfuncs.c (g_ascii_dtostr):
+ (g_ascii_formatd):
+ (g_ascii_strtod): Some doc fixes. (#111805)
+
+2003-05-05 Christian Rose <menthos@menthos.com>
+
+ * configure.in: Added sr and sr@Latn to ALL_LINGUAS.
+
+Thu Apr 24 19:12:05 2003 Owen Taylor <otaylor@redhat.com>
+
+ * autogen.sh (have_libtool): Accept libtool-1.5. (#111483)
+
+2003-04-09 Matthias Clasen <maclas@gmx.de>
+
+ * INSTALL:
+ * INSTALL.in: Remove list of configuration flags, since these
+ are already documented in docs/reference/glib/building.sgml.
+
+2003-04-08 Matthias Clasen <maclas@gmx.de>
+
+ * INSTALL: Move Cross-compliation information to reference manual.
+
+Mon Apr 7 13:40:28 2003 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.c (g_main_loop_run): When waiting for
+ the main loop to be freed up, wait on either
+ !loop->is_running or got_ownership, not both.
+ (Caused gtk_dialog_run() not to work in other
+ threads, reported by Jean-Yves Lefort)
+
+2003-04-07 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gutf8.c (g_utf8_strlen): Warn if p == NULL && max != 0.
+ (#110087)
+
+2003-04-01 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.def: Add g_string_chunk_insert_len.
+
+2003-04-01 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstring.[hc] (g_string_chunk_insert_len): New function, to
+ insert possible non-nul-terminated byte sequences into a string
+ chunk. (#96279)
+ (g_string_chunk_insert): Implement in terms of
+ g_string_chunk_insert_len() now.
+
+2003-03-30 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstring.c (g_string_new): Optimize the common cases
+ (init == NULL or init == "") a bit.
+ * glib/gmarkup.c, glib/gmessages.c, glib/gscanner.c,
+ glib/gshell.c, glib/gspawn-win32-helper.c, glib/gspawn-win32.c,
+ glib/gspawn.c, gobject/gvaluetransform.c: replace uses of
+ g_string_new ("") by g_string_new (NULL). (#106973, Morten Welinder)
+
+ * glib/gutf8.c (UNICODE_VALID): Update to Unicode 3.1 and optimize
+ a bit. (#107427, Noah Lewitt)
+
+ * glib/libcharset/config.charset: Add cp1251 support for Solaris.
+ (#104738, Hidetoshi Tajima)
+
+ * glib/gconvert.c (UnsafeCharacterSet): Get rid of
+ UNSAFE_DOS_PATH.
+ (acceptable): Align with RFC2396. (#59653)
+
+ * tests/uri-test.c: Adjust to the changes above.
+
+2003-03-26 Christian Rose <menthos@menthos.com>
+
+ * configure.in: Added "yi" to ALL_LINGUAS.
+
+2003-03-19 Matthias Clasen <maclas@gmx.de>
+
+ * glib/giochannel.c (g_io_channel_read_to_end): Fix docs.
+
+2003-03-19 Anders Carlsson <andersca@codefactory.se>
+
+ * configure.in: Bump version to 2.3.0
+
+2003-03-14 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * glib/gthread.c: Do not define function g_thread_init_glib, if
+ not G_THREADS_ENABLED. It's not called bu g_thread_init() then,
+ but calls other, in that case undefined functions.
+
+2003-03-06 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmain.c (g_main_context_find_source_by_id):
+ (g_main_context_find_source_by_funcs_user_data): Fix FALSE/NULL
+ confusion. (#107646, Morten Welinder)
+
+2003-03-01 James Henstridge <james@daa.com.au>
+
+ * autogen.sh: require automake 1.7. Add calls to libtoolize and
+ gtkdocize. Clean up some of the error messages.
+
+ * configure.in: move version declaration to the top of the file
+ (before AC_INIT), using M4 macros.
+ GLIB_AC_DIVERT_BEFORE_HELP() calls no longer necessary, due to use
+ of M4 macro expansion in help messages instead.
+ Convert AC_ARG_WITH/AC_ARG_ENABLE calls to use AC_HELP_STRING to
+ format help strings. Use quadrigraphs to get square brackets to
+ show correctly.
+ Replace gtk-doc checks with a call to GTK_DOC_CHECK() macro.
+ Use AC_CONFIG_COMMANDS([glibconfig.h], ...) to output
+ glibconfig.h, so that "./config.status glibconfig.h" works.
+ Add an extra AC_CONFIG_FILES call listing other files we want
+ generated by config.status protected by an "if false" block. This
+ way automake generates the rules needed to rebuild the files for
+ us.
+ Add quotes in various places.
+
+ * docs/reference/*/Makefile.am: convert to use the common
+ gtk-doc.make file. This localises the complexity to a single
+ makefile fragment maintained with gtk-doc itself.
+
+ * */Makefile.am: remove unneeded rules to build win32 files with
+ config.status. Automake now does this for us.
+ Replace instances of @FOO@ with $(FOO) where appropriate -- this
+ allows automake to do a better job checking the makefile.
+ Add some files to DISTCLEANFILES where appropriate
+
+ * Makefile.am: use the DISTCHECK_CONFIGURE_FLAGS variable to
+ ensure that --enable-gtk-doc is passed to configure during a
+ distcheck. Remove the custom distcheck, since the standard one
+ will now do.
+
+ * gobject/Makefile.am: switch to BUILT_SOURCES, since that now
+ works.
+
+2003-02-26 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstrfuncs.c (g_strdup_vprintf): Use g_strndup, not
+ g_strdup, since we know the length in advance.
+
+ * glib/gunidecomp.c (g_unicode_canonical_decomposition): Use
+ g_malloc instead of directly using malloc.
+
+2003-02-25 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.def: Add a couple of missing entries, thanks to Cedric
+ Gustin. Thread initialization function changes according to
+ Sebastian Wilhelmi's changes below (2003-02-14).
+
+2003-02-24 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gdir.c (g_dir_read_name): Clarify documentation.
+
+2003-02-18 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * configure.in: Make glib_thread_test not unnecessarily convert
+ between int and void*. (#106278). Let main return int.
+
+ * configure.in: Add an argument to specify the default thread
+ attribute to glib_thread_test. Disappeared somewhere between 2.0
+ and 2.2.
+
+2003-02-14 Sebastian Wilhelmi <seppi@seppi.de>
+
+ Fixes for #101264 and #99372:
+
+ * glib/gconvert.h, glib/gmain.c, glib/gmem.c, glib/gmessages.c,
+ glib/grand.c: Include gthreadinit.h and rename the thread
+ initialization functions a bit and let them start with _, so that
+ later we can stop exporting them.
+
+ * glib/gmem.c, glib/gmessages.c: Move the g_private_new() calls to
+ new functions. They have to be called after setting
+ g_threads_got_initialized to TRUE (see #101264).
+
+ * glib/gthread.c: Include gthreadinit.h. Renamed g_mutex_init() to
+ g_thread_init_glib(). Call the thread initialization functions
+ (which are not allowed to call g_private_new), then set
+ g_threads_got_initialized to TRUE, then call the other thread
+ initialization functions (which must not call anything but
+ g_private_new()).
+
+ * glib/gthreadinit.h: New private header to cleanly declare all
+ thread initialization functions.
+
+ * gthread/gthread-impl.c: Include gthreadinit.h. In
+ g_thread_init() just call g_thread_init_glib(), which in turn calls the
+ other functions (see #99372).
+
+ * glib/Makefile.am: Added gthreadinit.h.
+
+2003-02-12 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * configure.in: Make GLib recognize Tru64Unix thread system. (#103020)
+
+2003-02-11 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am (EXTRA_DIST): Include ChangeLog.pre-2-2.
+
+ * glib-zip.in: Include also the gtk-doc/html documentation in the
+ developer package.
+
+ * README.win32: Updates.
+
+2003-02-11 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * AUTHORS: Changed my e-mail address.
+ * glib/grand.c: Removed my e-mail address.
+
+2003-02-10 Mohammad DAMT <mdamt@bisnisweb.com>
+
+ * po/id.po: Added Indonesian translation
+ * configure.in: Added "id" to ALL_LINGUAS
+
+2003-02-06 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmessages.h:
+ * glib/gmem.h:
+ * glib/ghash.h:
+ * glib/gasyncqueue.h:
+ * glib/garray.h:
+ * glib/ghook.h:
+ * glib/gtypes.h: Fix a bunch of typos in header comments.
+ (#102422, Morten Welinder)
+
+2003-02-04 Tor Lillqvist <tml@iki.fi>
+
+ * glib/giowin32.c (g_io_channel_unix_new): Fix typo: Should be
+ SOCKET_ERROR, not SO_ERROR. Noticed by Daniel Kaufmann.
+
+ Merge from stable branch:
+
+ Fix for bug #104014, reported by Alex Shaduri:
+
+ * glib/gspawn-win32.c (protect_argv): New function. Add
+ double-quotes around argv elements that need it, and escape
+ embedded double-quotes with backslash.
+ (do_spawn_with_pipes) Call protect_argv().
+
+ * glib/gspawn-win32-helper.c (WinMain): Call protect_argv().
+
+ * glib/gspawn.c (g_spawn_async_with_pipes): Document argument
+ vector vs. command line details on Win32.
+ (g_spawn_command_line_sync): Improve documentation about
+ backslashes in the command line on Windows.
+
+Thu Jan 30 16:45:13 2003 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.am: Remove references to glib.spec.
+ (#102231)
+
+ * configure.in: Don't generate glib.spec.
+
+Tue Jan 28 16:08:56 2003 Owen Taylor <otaylor@redhat.com>
+
+ * m4macros/glib-gettext.m4: If msgfmt isn't found,
+ unset gt_cv_have_gettext. (#102552, Tim Mooney)
+
+Tue Jan 28 15:18:24 2003 Owen Taylor <otaylor@redhat.com>
+
+ * autogen.sh (have_automake): Fix version in complaint
+ message about automake. (#104366, Rich Burridge)
+
+2003-01-22 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * configure.in: Added Bengali (bn) to ALL_LINGUAS
+
+2003-01-21 Christian Rose <menthos@menthos.com>
+
+ * configure.in: Added "mn" to ALL_LINGUAS.
+
+2003-01-20 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * configure.in: Added Farsi (fa), Italian (it), Latvian (lv),
+ Macedonian (mk) to ALL_LINGUAS
+
+2003-01-16 Daniel Yacob <locales@geez.org>
+
+ * configure.in: added am to ALL_LINGUAS
+
+2003-01-12 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.def: Add some missing entries. Thanks to Kenichi SUTO.
+
+2003-01-05 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: Updates.
+
+ * configure.in: Don't use -lm in TRIO_LIBS on Windows, with no
+ libm. (Mingw has a dummy libm.a, but the .pc file should be
+ useable by MSVC users, too.)
+
+2003-01-25 Ron Steinke <rsteinke@w-link.net>
+
+ (Ancient, binary compatible fixes found sitting in my tree)
+
+ * Added early checks for count == 0 and buf == NULL in g_io_channel_read()
+
+ * Better error message for EFAULT in g_io_channel_error_from_errno()
+
+2003-01-04 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am (BUILT_EXTRA_DIST): Don't distribute glib-zip.
+
+ * {glib,gmodule,gobject,gthread}/Makefile.am:
+ [Win32] Install also the .def files, to help users generate
+ import libraries for other compilers. Uninstall, too.
+
+ * glib-zip.in: Include .def files from above.
+
+ * glib/giowin32.c (g_io_win32_fd_get_flags_internal): Don't claim
+ broken pipes are unreadable. (Well, they are, but read() handles
+ it, and treats it like EOF.)
+
+Thu Jan 2 16:19:15 2003 Manish Singh <yosh@gimp.org>
+
+ * configure.in: use AC_COMPILE_IFELSE instead of AC_TRY_COMPILE for
+ tests for inline keywords. Fixes #101976.
+
+2003-01-02 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gwin32.h: Correct the comment telling what headers have
+ the declarations of some POSIXish functions.
+
+ * glib/giowin32.c (g_io_win32_fd_get_flags_internal): Fix braino:
+ The checks for readability/writeability were backwards.
+
+2003-01-01 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gmessages.c (ensure_stderr_valid): New function, parallel
+ to ensure_stdout_valid(). #defined as empty on Unix. Move the
+ alloc_console_called static flag inside these two functions.
+ (ensure_stdout_valid, ensure_stderr_valid): Check the C stdout and
+ stderr streams for validity, instead of what GetStdHandle() returns.
+ (mklevel_prefix): Do use either stderr or stdout on Windows,
+ too. Otherwise g_warning() messages (that are just warnings, by
+ definition) will get mixed with proper stdout output. Noticed in
+ GIMP's gimpconfig-dump.
+ (strdup_convert, mklevel_prefix, g_printerr): Call
+ ensure_stderr_valid() before trying to use stderr.
+ (g_logv): [Win32] Convert message to current codepage before
+ display with MessageBox().
+
+2002-12-28 Tõivo Leedjärv <toivo@linux.ee>
+
+ * configure.in: Added et to ALL_LINGUAS.
+
diff --git a/trunk/ChangeLog.pre-2-6 b/trunk/ChangeLog.pre-2-6
new file mode 100644
index 000000000..41a9f781b
--- /dev/null
+++ b/trunk/ChangeLog.pre-2-6
@@ -0,0 +1,1683 @@
+2004-12-16 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.6.0 ===
+
+2004-12-15 Alexander Larsson <alexl@redhat.com>
+
+ * glib/gconvert.c: (g_filename_display_basename):
+ Fix spelling
+ Add g_return_val_if_fail.
+
+ * glib/glib.symbols:
+ Add g_filename_display_basename
+
+2004-12-15 Alexander Larsson <alexl@redhat.com>
+
+ * glib/gconvert.[ch]:
+ Add g_filename_display_basename.
+
+2004-12-14 Matthias Clasen <mclasen@redhat.com>
+
+ * README.in: Updates
+
+ * NEWS: Updates.
+
+ * configure.in: Set version to 2.6.0
+
+2004-12-13 Tor Lillqvist <tml@iki.fi>
+
+ * NEWS: Update.
+
+ * glib/glib.symbols
+ * glib/gstdio.[ch]: Add g_rmdir().
+
+2004-12-13 Matthias Clasen <mclasen@redhat.com>
+
+ * NEWS: Updates
+
+2004-12-12 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.symbols
+ * glib/gconvert.[ch]: Implement Windows DLL ABI stability also for
+ g_filename_{to,from}_uri().
+
+2004-12-11 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gstdio.c (g_rename, g_unlink, g_remove): Add doc comments
+ about Windows restrictions on renaming and removing.
+
+ (g_remove): Mimic POSIX remove() on Windows: Try also to rmdir if
+ removal as a file fails. Document this.
+
+ * glib/gstdio.h: Clarify comment about file name encoding on
+ Windows.
+
+ * glib/gspawn-win32.c: Fix #157255. Also some refactoring of this
+ still very ugly source file.
+
+2004-12-09 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c (print_help): Don't print help options
+ if the options of a specific group have been
+ requested. (#160645, Glynn Foster)
+
+2004-12-07 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.c (g_get_language_names): Update the returned
+ value after locale changes. (#160271, Christian Persch)
+ (_g_utils_thread_init): Initialize the language name cache
+ before going threaded.
+
+ * glib/gthread.c (g_thread_init_glib): Call _g_utils_thread_init().
+
+ * glib/gthreadinit.h: Add _g_utils_thread_init().
+
+2004-12-06 Tor Lillqvist <tml@iki.fi>
+
+ * glib/giowin32.c (g_io_win32_finalize): Fix a write to freed
+ memory: Unlock the channel's mutex before unrefing the channel.
+
+2004-12-06 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Remove a no longer needed hack for
+ libtool < 1.5.2. (#100697, Owen Taylor, Sebastian Wilhelmi)
+
+2004-12-05 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.symbols
+ * glib/gwin32.[hc]: Implement DLL ABI stability also for
+ g_win32_get_package_installation_directory()) and
+ g_win32_get_package_installation_subdirectory().
+
+ * glib/Makefile.am (install-libtool-import-lib): Remove the DLL
+ binary compatibilty entries from the import library. They aren't
+ used by newly compiled code, so no need to have them in the import
+ library. (The "PRIVATE" keyword in the .def file is supposed to do
+ this, but not implemented in the GNU linker yet.)
+
+2004-12-04 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gqueue.c (g_queue_link_index): Return -1 if queue is
+ NULL. (#159530, Philippe Blain)
+
+2004-12-02 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version.
+
+ * === Released 2.5.7 ===
+
+2004-12-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols: Protect the the various push/pop allocator
+ functions by #ifndef DISABLE_MEM_POOLS. (#160215, Frederic Crozat)
+
+ * glib/makegalias.pl: Support #ifndef'ed sections.
+
+ * glib/gutils.c (g_get_system_config_dirs): Don't forget to
+ initialize g_system_config_dirs. (#160213, Frederic Crozat)
+
+Wed Dec 1 17:04:37 2004 Manish Singh <yosh@gimp.org>
+
+ * glib/gstring.h (g_string_append_c_inline): actually enable (and
+ fix up the length test).
+
+2004-11-30 Tor Lillqvist <tml@iki.fi>
+
+ * glib/Makefile.am (glib.def): gcc -E complains "linker input file
+ unused because linking not done" if told to preprocess the
+ glib.symbols file. Use '-' and redirection to pass it as standard
+ input instead.
+
+2004-11-30 Matthias Clasen <mclasen@redhat.com>
+
+ * NEWS: Updates
+
+2004-11-30 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gspawn-win32-helper.c (WinMain): Also check errno to detect
+ true errors from spawn*(). (#157258, reported by Bruce Hochstetler)
+
+2004-11-29 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmacros.h (G_GNUC_MALLOC): Define empty for gcc 2.95.
+
+ * glib/gmarkup.c (unescape_text_state_after_charref_hash):
+ Avoid a strndup() here, noticed by Morten Welinder.
+
+2004-11-29 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmarkup.c: Remove leftover noinline attributes.
+ (is_name_start_char, is_name_char): Avoid possible reads
+ beyond the end of g_ascii_table.
+
+ * glib/Makefile.am: Use the perl found by configure. (#149826,
+ Morten Welinder)
+
+Sun Nov 28 13:13:56 2004 Manish Singh <yosh@gimp.org>
+
+ * glib/abicheck.sh: filter G_GNUC before PRIVATE so $ is still true.
+
+ * tests/utf8-validate.c: cast pointer math to gint for error print
+ message.
+
+Sun Nov 28 12:07:29 2004 Manish Singh <yosh@gimp.org>
+
+ * tests/utf8-validate.c: minor comment fix.
+
+2004-11-28 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gconvert.h:
+ * glib/gkeyfile.h:
+ * glib/gmem.h:
+ * glib/gstrfuncs.h:
+ * glib/gunicode.h:
+ * glib/gutils.h: Mark functions with G_GNUC_MALLOC when appropriate.
+
+ * glib/glib.symbols: Add G_GNUC_MALLOC annotations.
+
+ * glib/gmacros.h (G_GNUC_MALLOC): Add a macro for
+ __attribute__((__malloc__)). (#61780)
+
+2004-11-28 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gutils.[hc]
+ * glib/glib.symbols: [Win32] Make also g_get_user_name() and
+ g_get_real() name return UTF-8. As for the similar changes to fix
+ #101792, for DLL ABI stability we use preprocessor defines to get
+ the new UTF-8 versions, and keep the old names for versions
+ returning strings in the system codepage.
+
+ Fix g_get_tmp_dir() and g_get_home_dir() to actually return UTF-8
+ as was intended in the fix for bug #101792. (#159664, noticed by
+ Robert Ögren)
+
+2004-11-28 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmarkup.c: Optimizations; don't scan the entire text
+ in find_current_text_end(), split unescape_text() into multiple
+ functions. (#159001, Havoc Pennington)
+
+2004-11-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gspawn.c (g_spawn_async_with_pipes): Update the @flags
+ documentation with references to GChildWatch and
+ g_spawn_close_pid(). (#136255, noted by Owen Taylor)
+
+2004-11-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_parse_value_as_string):
+ Don't access invalid memory address if p wasn't
+ increased. (#159557, Frederic Crozat)
+
+2004-11-25 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/strtod-test.c (main): Add a testcase for the previous fix.
+
+ * glib/gstrfuncs.c (g_ascii_strtod): Make it work again for floats
+ starting with a decimal point, like .75 (#156421, Hans Breuer)
+
+Thu Nov 25 14:02:43 2004 Manish Singh <yosh@gimp.org>
+
+ * glib/abicheck.sh: filter out G_GNUC stuff when doing the compare.
+
+ * glib/gmessages.c (g_assert_warning): call abort() at the end, so
+ gcc doesn't warn.
+
+2004-11-25 Kjartan Maraas <kmaraas@gnome.org>
+
+ * configure.in: Add «nb» to ALL_LINGUAS.
+
+2004-11-24 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gwin32.c (g_win32_error_message,
+ get_package_directory_from_module,
+ g_win32_get_package_installation_directory,
+ g_win32_get_package_installation_subdirectory): Use wide character
+ API when available. Document that string parameters and return
+ values are in UTF-8.
+
+2004-11-24 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutf8.c: Replace g_utf8_validate() with an
+ optimized version, and clarify the docs a bit. (#159131,
+ Owen Taylor)
+
+ * tests/Makefile.am (test_programs): Add utf8-validate.
+
+ * tests/utf8-validate.c: Unit tests for g_utf8_validate().
+
+2004-11-23 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.h: Don't mark g_option_error_quark() as const,
+ to be consistent with all the other error_quark functions.
+ (technically they are const, but since these are called only
+ in error paths, giving the compiler better optimization
+ opportunities doesn't matter much)
+
+2004-11-23 Matthias Clasen <mclasen@redhat.com>
+
+ Fix a problem with the PLT reduction changes which caused the
+ internal aliases to lose all attributes.
+
+ * glib/glib.symbols: Add attribute annotations.
+ * glib/makegalias.pl: Keep attribute annotations, but strip PRIVATE.
+ * glib/Makefile.am (glib.def): Strip attribute annotations, but keep
+ PRIVATE.
+
+2004-11-21 Hans Breuer <hans@breuer.org>
+
+ * **/makefile.msc : updated
+
+2004-11-16 Matthias Clasen <mclasen@redhat.com>
+
+ * m4macros/glib-2.0.m4 (AM_PATH_GLIB_2_0): Support gmodule-no-export.
+
+ * Makefile.am (EXTRA_DIST):
+ * configure.in (AC_CONFIG_FILES): Add gmodule-no-export-2.0.pc.in
+
+ * gmodule-no-export-2.0.pc.in: Add a variants of gmodule-2.0.pc.in
+ which doesn't add -Wl,--export-dynamic, since Pango or GTK+ don't
+ need it. (#125627, Owen Taylor)
+
+2004-11-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c: Define S_ISREG() on windows, since it
+ is not present there. (#158469, Kazuki IWAMOTO)
+
+2004-11-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_load_from_fd): Use S_ISREG(), since
+ S_IFMT and S_IFREG are apprarently missing on some systems (they
+ are SUS, but not Posix). (#158263)
+
+2004-11-12 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version.
+
+ * === Released 2.5.6 ===
+
+2004-11-11 J. Ali Harlow <ali@juiblex.co.uk>
+
+ * gobject/Makefile.am:
+ * glib/Makefile.am (gtk.def): Use embedded tab rather than '\t'
+ escape sequence. (#157951)
+
+2004-11-10 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gconvert.c (g_get_filename_charsets): Fix typo in doc
+ comment.
+
+2004-11-10 Matthias Clasen <mclasen@redhat.com>
+
+ * NEWS: Updates
+
+Mon Nov 8 10:45:50 2004 Manish Singh <yosh@gimp.org>
+
+ * glib/gasyncqueue.c
+ * glib/ghook.c
+ * glib/giochannel.c: g_return_if_fail -> g_return_val_if_fail
+
+ * glib/gmain.c: Ditto, plus also make g_main_context_ref() actually
+ return the passed in pointer.
+
+2004-11-08 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gnode.h (enum GTraverseFlags): Add G_TRAVERSE_LEAVES
+ and G_TRAVERSE_NON_LEAVES as alternative names for
+ G_TRAVERSE_LEAFS and G_TRAVERSE_NON_LEAFS, which are
+ grammatically brutal. (#138853, Morten Welinder)
+
+ * glib/gasyncqueue.[hc]:
+ * glib/ghook.[hc]:
+ * glib/gmain.[hc]:
+ * glib/giochannel.[hc]: Make g_io_channel_ref(),
+ g_main_context_ref(), g_hook_ref(), g_async_queue_ref()
+ return the passed in pointer. (#151663, Manish Singh)
+
+ * glib/gmain.c: Initialize child_watch_count to 1, so
+ that we don't miss the very first child if it exits
+ before we set up the child watch. In that case we had
+ previously source->count == child_watch_count == 0,
+ causing g_child_watch_check() to skip the waitpid()
+ call. (#154827, Gustavo Carneiro)
+
+ * glib/gmain.c (g_child_watch_source_init_single)
+ (g_child_watch_source_init_multi_threaded): Use sigaction()
+ instead of signal(). (#136867, Jonas Jonsson, patch by
+ Archana Shah)
+
+2004-11-07 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.c (g_get_any_init): Work around an bug
+ in Mac OS < 10.3. (#156446, Dave MacLachlan)
+
+2004-11-06 Tor Lillqvist <tml@iki.fi>
+
+ * glibconfig.h.win32.in: Cosmetics: move the G_GNUC_INTERNAL
+ define to the same place where it is in a configure-generated
+ glibconfig.h
+
+2004-11-05 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/strtod-test.c: Portability fixes and extra sanity
+ checks. (#157453, Morten Welinder)
+
+2004-11-04 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gstrfuncs.c (g_ascii_strtod): Handle numbers like
+ 1e1, nan, -infinity. Also try harder to preserve errno.
+ (#156421, Morten Welinder)
+
+ * tests/strtod-test.c: Add testcases.
+
+2004-11-04 Tor Lillqvist <tml@iki.fi>
+
+ * glib/goption.h (enum GOptionFlags): Add G_OPTION_FLAG_REVERSE,
+ to reverse the sense of a G_OPTION_ARG_NONE (boolean) option.
+
+ * glib/goption.c (parse_arg): Obey the above flag.
+
+ * glib/gconvert.c (g_filename_display_name): Document that the
+ result is guaranteed to be non-NULL.
+
+ * glib/gfileutils.c (get_contents_stdio, get_contents_regfile,
+ get_contents_posix, get_contents_win32, g_file_open_tmp,
+ g_file_read_link): Use g_filename_display_name() for error
+ messages.
+ (g_mkstemp): Document that the template should be in the GLib file
+ name encoding.
+ (g_file_open_tmp): Ditto. Also document that the actual name
+ returned is also in the GLib file name encoding.
+
+2004-11-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gconvert.c (g_filename_display_name): New function
+ to convert a filename to a UTF-8 string for display
+ purposes. (requested by Alex Larsson)
+
+ * glib/gconvert.c (g_get_filename_charsets): New function
+ to return the encodings which are tried when converting a
+ filename to UTF-8. (#151465, François Gagné)
+
+2004-11-02 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.5.5 ===
+
+ * NEWS: Updates
+
+2004-11-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols: Add new functions.
+
+ * glib/gconvert.c: Fix doc comment for
+ g_get_filename_charsets().
+
+ * glib/gconvert.c (g_filename_display_name): New function to
+ convert a filename to a UTF-8 string for display purposes.
+ (g_get_filename_charsets): New function to return the
+ encodings which are tried when converting a filename to
+ UTF-8.
+
+ * glib/goption.c (g_option_context_parse): Document that
+ this function may not return.
+
+2004-11-01 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.h: Make gtkdoc-scan happy by removing spaces
+ between gchar and *.
+
+2004-11-01 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gstdio.c (g_lstat): Implement correctly also on Unix
+ systems without lstat(). (#157038, Morten Welinder)
+
+2004-11-01 Ray Strode <rstrode@redhat.com>
+
+ * glib/gkeyfile.c:
+ (g_key_file_get_locale_string): don't return an
+ error if we come across a value with invalid utf8 or
+ if we don't find a translated string. Just fallback
+ to the untranslated string (Mark McLoughlin, bug
+ #156790).
+
+ * glib/gkeyfile.c:
+ (g_key_file_init), (g_key_file_clear): track the
+ actual start GKeyFileGroup rather than just its name
+ (g_key_file_parse_group): allow add_group() to
+ update the start group.
+ (g_key_file_remove_group_node): update the start
+ group if it gets removed (Mark McLoughlin, bug
+ #156790).
+
+ * glib/gkeyfile.c:
+ (g_key_file_parse_string_as_value): Don't escape
+ tabs and spaces in the middle of key values.
+
+2004-11-01 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gconvert.c:
+ * glib/gdebug.h
+ * glib/gutils.c
+ * gobject/gtype.c
+ * gthread/gthread-posix.c
+ * tests/timeloop-closure.c
+ * tests/timeloop.c: Fix sparse warnings. (#157014, Kjartan Maraas)
+
+2004-11-01 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c: Documentation updates.
+
+ Handle conflicts between options in different groups. (#156808)
+
+ * glib/goption.c (g_option_context_parse): When a long option does not
+ match exactly, try to parse it as --group-option.
+ (g_option_context_add_group): Warn if a group name conflict occurs.
+
+ * glib/goption.c (print_help): Print out the effective options, ie
+ don't print shadowed short options, and for long options print
+ --group-option instead of --option if appropriate.
+
+2004-10-31 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gwin32.c: Add bits of markup to g_win32_get_windows_version()
+ docs.
+
+2004-10-31 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gwin32.c: Document g_win32_get_windows_version().
+
+ * glib/gstdio.[ch]: Add g_lstat().
+
+2004-10-29 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c: Doc additions.
+
+ * glib/goption.c (parse_arg): Convert filenames to UTF-8 on
+ Windows.
+
+2004-10-29 Hans Breuer <hans@breuer.org>
+
+ * glibconfig.h */makefile.msc.in : updated [and finally fixed my
+ script to produce ready to go de-in(ed) files, w/o autotools]
+
+ * */*.rc.in : updated copyrights to 2004
+
+ * glib/gutils.c : some CSIDL_* defines lacking from older SDK;
+ use the same fallback mecahnism as on *NIX where ever applicable
+
+2004-10-29 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/option-test.c: Add tests for the handling of
+ non-option arguments, "--" and G_OPTION_REMAINING.
+
+ * glib/goption.[hc]: #define G_OPTION_REMAINING, which is
+ a special long option name, which can be used for an option
+ in the main group which collects the non-option arguments.
+ It must be of type G_OPTION_ARG_STRING_ARRAY or
+ G_OPTION_ARG_FILENAME_ARRAY. If the main group doesn't contain
+ an option whose name is G_OPTION_REMAINING, the non-option
+ arguments are left behind in argv as before.
+
+ * glib/goption.c: Add documentation.
+
+2004-10-28 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmessages.h: Mark g_assert_warning as G_GNUC_NORETURN,
+ to avoid compiler warnings. (#156767, Owen Taylor)
+
+2004-10-29 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gstdio.c: Include also <direct.h> for mkdir() prototype
+ with MSVC. [156727, Kazuki IWAMOTO]
+
+ * glib/giochannel.h (g_io_channel_new_file): Redefine also
+ g_io_channel_new_file to the UTF-8 version on Win32. [156725,
+ Kazuki IWAMOTO)
+
+2004-10-28 Ray Strode <rstrode@redhat.com>
+
+ * glib/gkeyfile.c
+ (find_file_in_data_dirs): clean up a leak (#156652,
+ Morten Welinder)
+ (g_key_file_load_from_fd): propagate fstat() error
+ conditions and retry read on EAGAIN (#156647, Morten
+ Welinder). Return error if file is NOT regular, not if
+ it is regular (bug introduced from last commited bug
+ fix).
+ (g_key_file_load_from_data_dirs): allocate enough space
+ for the terminating NULL.
+
+2004-10-28 Ray Strode <rstrode@redhat.com>
+
+ * glib/gkeyfile.c: Don't use S_ISREG macro (#156728,
+ Kazuki IWAMOTO)
+
+2004-10-28 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gstdio.c: Include galias.h before glib.h (#156697,
+ Christophe Fergeau)
+
+ * glib/gkeyfile.c: Add a missing "Since: 2.6" comment.
+
+2004-10-28 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gstdio.c: Include glib.h early to get G_OS_WIN32. Include
+ errno.h for errno.
+
+ * glib/gkeyfile.c: Include gstdio.h and use g_open().
+
+2004-10-27 Ray Strode <rstrode@redhat.com>
+
+ * glib/gkeyfile.c:
+ (g_key_file_load_from_fd),
+ (g_key_file_load_from_file):
+ Move file is regular check to load_from_file to use
+ fstat() instead of race prone g_file_test(). Don't
+ clear/init until needed. Change error messages to be
+ more consistent.
+ (g_key_file_load_from_data),
+ (g_key_file_load_from_data_dirs),
+ (g_key_file_parse_data),
+ (g_key_file_get_value),
+ (g_key_file_get_string),
+ (g_key_file_set_string),
+ (g_key_file_get_string_list),
+ (g_key_file_set_string_list),
+ (g_key_file_set_locale_string),
+ (g_key_file_get_locale_string),
+ (g_key_file_set_locale_string_list),
+ (g_key_file_get_boolean),
+ (g_key_file_set_boolean),
+ (g_key_file_get_boolean_list),
+ (g_key_file_set_boolean_list),
+ (g_key_file_get_integer),
+ (g_key_file_get_integer_list),
+ (g_key_file_set_integer_list),
+ (g_key_file_remove_key):
+ Add more g_return_*if_fail checks for public functions.
+
+2004-10-27 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version.
+
+ * === Released 2.5.4 ===
+
+2004-10-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/abicheck.sh: Strip Win32 specific defs file syntax.
+
+ * NEWS: Updates.
+
+2004-10-27 Matthias Clasen <mclasen@redhat.com>
+
+ Introduce the idea of a filename encoding, which is
+ *literally* the filename encoding on Unix. On Windows,
+ use the Unicode name converted to UTF-8. (#101792,
+ Tor Lillqvist, Owen Taylor)
+
+ * glib/gdir.[hc]:
+ * glib/gconvert.[hc]:
+ * glib/gfileutils.[hc]:
+ * glib/gutils.[hc]:
+ * glib/giowin32.c: On Windows, keep old ABI versions
+ of GLib pathname api for DLL ABI stability. Use different
+ names for the new-style UTF-8 versions. Hide this through
+ a #define.
+
+ * glib/gstdio.[hc]: New files containing wrappers for
+ POSIX pathname api.
+
+ * glib/glib.symbols: Add new symbols.
+
+ * glib/makegalias.pl: Drop Win32 specific .def syntax,
+ include gstdio.h
+
+2004-10-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c: Fix includes. (#156500, #156499,
+ Kazuki IWAMOTO)
+
+ * glib/Makefile.am (galias.h): Fix srcdir != builddir
+ builds. (#156447, Thomas Fitzsimmons)
+
+2004-10-26 Gora Mohanty <gmohanty@cvs.gnome.org>
+
+ * configure.in: Added 'or' to ALL_LINGUAS.
+
+2004-10-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c: Include galias.h.
+
+ * glib/gkeyfile.c (g_key_file_parse_value_as_comment):
+ Don't compare strings and chars.
+
+ * glib/glib.symbols: Add new symbols.
+
+ * glib/gkeyfile.c (g_key_file_new): Fix docs.
+
+ * glib/gkeyfile.h: Use the same parameter names as in
+ the implementation and the docs.
+
+ * glib/gwin32.c (g_win32_get_windows_version): Make this
+ function thread-safe in the GLib style.
+ * glib/gthreadinit.h:
+ * glib/gwin32.c (_g_win32_thread_init): New function to
+ initialize the version.
+ * glib/gthread.c (g_thread_init_glib): Call
+ _g_win32_thread_init() from here.
+
+2004-10-26 Ray Strode <rstrode@redhat.com>
+
+ * glib/gkeyfile.c: Add Matthias to "Written by" lines
+ (GKeyFileGroup): add field to hold comments about groups
+ (g_key_file_load_from_fd): return TRUE on success and
+ FALSE on failure. Don't close fd's opened by other
+ parent function.
+ (g_key_file_load_from_file): run FILE_IS_REGULAR test
+ before trying to open file, to save an fd from being
+ leaked (would probably be better to use fstat()). Close
+ fd when done with it. Return TRUE on success and FALSE
+ on failure.
+ (g_key_file_load_from_data): Return TRUE on success and
+ FALSE on failure.
+ (g_key_file_load_from_data_dirs): remove superfluous
+ const modifier. Return TRUE on success and FALSE on
+ failure. Stop trying to load files when one succeeds.
+ (g_key_file_parse_key_value_pair): don't validate input
+ for UTF-8 until users uses a getter that does
+ validation. Don't leak copy of start_group_name.
+ (g_key_file_to_data): serialize new comment field for
+ groups.
+ (g_key_file_get_keys): Remove convenience code to let
+ NULL group mean start group. Get rid of unneeded NULL
+ check before g_strdup.
+ (g_key_file_get_groups): Reverse groups list before
+ sending to user because it is maintained in backward
+ order internally.
+ (g_key_file_get_value),
+ (g_key_file_set_value): add g_return checks at top of
+ public functions.
+ (g_key_file_get_string),
+ (g_key_file_get_string_list): validate key value is UTF-8.
+ (g_key_file_[sg]et_*comment): new functions for
+ setting/getting comments
+ (g_key_file_remove_comment): new function to remove
+ comment block
+ (g_key_file_remove_key_value_pair_node): new function to
+ pull a key-value pair out of the list and free it.
+ (g_key_file_remove_group_node): call
+ g_key_file_remove_key_value_pair_node instead of
+ freeing the list immediately to get better statistics
+ for approximate_size.
+ (g_key_file_remove_group): use lookup_group_node instead
+ of lookup_group to prevent a g_list_find call.
+ (g_key_file_add_key): report group also when unable to
+ find key.
+ (g_key_file_lookup_group_node): new function to make
+ getting the group node from a group name easier.
+ (g_key_file_lookup_group): use lookup_group_node under
+ the hood.
+ (g_key_file_lookup_key_value_pair_node): new function to
+ make getting the key-value pair from a group and key
+ name eaiser.
+ (g_key_file_parse_comment_as_value): new function to add '#' to the
+ beginning of every line.
+ (g_key_file_parse_value_as_comment): new function that
+ attempts to be the inverse of comment as value.
+
+2004-10-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.c:
+ * glib/gkeyfile.c: Don't include ctype.h needlessly. (#156424,
+ Morten Welinder)
+
+ * tests/strtod-test.c (test_string): Improve error reporting.
+
+Mon Oct 25 15:05:18 2004 Manish Singh <yosh@gimp.org>
+
+ * autogen.sh: rm autom4te.cache, since it might interfere with
+ differing autoconf versions.
+
+ * tests/child-test.c: use GINT_TO_POINTER for g_child_watch_add
+ user data.
+
+ * glib/gfileutils.c: G_IS_DIR_SEPARATOR is defined in gutils.h now,
+ don't redefine it here.
+
+2004-10-24 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_remove_group_node): Don't
+ destroy the lookup map if it is NULL.
+
+2004-10-23 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gasyncqueue.c, glib/gatomic.c, glib/gdate.c,
+ glib/giochannel.c, glib/gmain.c, glib/gspawn.c,
+ glib/libcharset/localcharset.c: Apply a patch to fix
+ sparse warnings. (#154696, Kjartan Maraas)
+
+ * glib/gnulib/g-gnulib.h: Undef libc functions before defining
+ them, since they may also be macros. (#155177, Andrea Campi)
+
+ * glib/gkeyfile.h:
+ * glib/gkeyfile.c: Add a parser for desktop entries and
+ similar files with a .ini-like syntax. (#139974, Ray Strode)
+
+ * glib/glib.h: Include gkeyfile.h
+
+ * glib/Makefile.am (libglib_2_0_la_SOURCES): Add gkeyfile.c
+ (glibsubinclude_HEADERS): Add gkeyfile.h
+
+ * glib/gutils.c (_g_compute_locale_variants): Make this
+ non-static and use it in gkeyfile.c
+
+2004-10-22 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/uri-test.c (run_uri_list_tests): Add some
+ uri list tests.c.
+
+ * glib/gconvert.h:
+ * glib/gconvert.c (g_uri_list_extract_uris): New function to
+ split a text/uri-list data into individual uris and strip comments.
+
+2004-10-20 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c (get_change): Don't return the wrong
+ change. (#155856, Lucas Rocha)
+
+2004-10-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.h (G_IS_DIR_SEPARATOR):
+ * glib/gutils.c: Make public. (#155589, Tim-Philipp Müller)
+
+2004-10-08 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmain.c (g_child_watch_add_full):
+ * glib/gmain.c (g_child_watch_add): Document that GLib supports only
+ a single callback per pid. (#154828, Gustavo Carneiro)
+
+2004-10-06 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gfileutils.c: Fix some C99isms. (#154676, Kjartan Maraas)
+
+2004-10-05 Anders Carlsson <andersca@gnome.org>
+
+ * glib/goption.c: (g_option_context_parse):
+ Add check for if argc is 0.
+
+ * tests/option-test.c: (empty_test3), (main):
+ Add test case.
+
+2004-10-05 Matthias Clasen <mclasen@redhat.com>
+
+ * NEWS: Update
+
+2004-10-04 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmem.c (g_mem_set_vtable): Only set vtable_set if the
+ vtable is set. (#154352, Philippe Blain)
+
+2004-10-03 Anders Carlsson <andersca@gnome.org>
+
+ * glib/goption.c: (parse_arg):
+ Set arg_data on filenames. (Discovered by Mats-Ola Persson).
+
+ * tests/option-test.c: (arg_test3), (ignore_test3), (main):
+ Add test for filename args.
+
+2004-10-01 Tor Lillqvist <tml@iki.fi>
+
+ * glib/goption.c (g_option_context_parse): Use
+ g_path_get_basename() instead of strrchr(), so that either slash
+ is accepted on Windows.
+
+2004-09-30 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gfileutils.c: Convert filenames to UTF-8 before
+ putting them in GErrors. (#154078, Morten Welinder)
+
+2004-09-29 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols: Add g_assert_warning.
+
+ * glib/gmessages.h:
+ * glib/gmessages.c (g_assert_warning): Treat g_assert
+ in the same way as g_return_if_fail and move the string
+ constants into a helper function, which also takes
+ care of removing the "IA__" prefix from internal aliases.
+
+ * glib/gmessages.h: Move the declaration of
+ g_return_if_fail_warning() out of the ifdefs, so that
+ building with G_DISABLE_ASSERT works.
+
+2004-09-27 Murray Cumming <murrayc@murrayc.com>
+
+ * glib/goptions.[h|c], glib/glib.symbols: Rename
+ g_context_option_error_quark() to g_option_error_quark(), because that
+ is consistent with normal naming conventions, and what bindings expect.
+
+.2004-09-26 Matthias Clasen <mclasen@redhat.com>
+
+ Fix #153649, Hidetaka Iwai:
+
+ * glib/goption.c (parse_long_option): Don't forget to set parsed
+ to TRUE when parsing a long ARG_NONE option.
+ (free_changes_list): Fix the memory management for string
+ and filename arrays.
+
+2004-09-22 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gmessages.c: [Win32] Don't ever open a console
+ window. (Which we used to do if standard output or standard error
+ are invalid, as they are for GUI applications.) These console
+ windows that open up unexpectedly have caused endless amounts of
+ confusion among end-users. (#141102, #151175)
+
+ Don't output the process id on Windows. Only output the program
+ name. If not set with g_set_prgname(), fetch the application
+ executable's name and use that.
+
+Mon Sep 20 00:35:14 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gutf8.c (g_utf16_to_utf8): Add a note explaining how to
+ convert UTF-16 byte stream of ambiguous endianness. (#152954,
+ Linus Walleij)
+
+Mon Sep 20 00:17:37 2004 Matthias Clasen <maclas@gmx.de>
+
+ * tests/option-test.c (error_test3_post_parse):
+ * tests/option-test.c (error_test2_post_parse):
+ * tests/option-test.c (error_test1_post_parse): Don't call
+ g_set_error () with a NULL format. (#153103, Robert Ögren)
+
+Mon Sep 20 00:13:48 2004 Matthias Clasen <maclas@gmx.de>
+
+ Make GOption remove long options completely. (#153113, Robert Ögren)
+
+ * glib/goption.c (parse_long_option): Fix a wrong index.
+
+ * tests/option-test.c (ignore_test3): Test handling of unknown
+ options some more.
+
+Sun Sep 19 23:56:15 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/goption.c (g_option_context_parse): Call error_func
+ on error, not post_parse_func again. (#153107, Robert Ögren)
+
+Sun Sep 19 23:52:35 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmessages.c (mklevel_prefix):
+ * glib/gmessages.c (g_logv): Fix the types of some variables
+ to be GLogLevelFlags instead of guint. (#153042, Philippe Blain)
+
+2004-09-18 Matthias Clasen <mclasen@redhat.com>
+
+ * Version bump
+
+ * === Released 2.5.3 ===
+
+2004-09-17 Matthias Clasen <mclasen@redhat.com>
+
+ * NEWS: More updates.
+
+Thu Sep 16 18:42:46 2004 Manish Singh <yosh@gimp.org>
+
+ * glib/abicheck.sh: don't hardcode lengths for cut, instead split on
+ the third field.
+
+Thu Sep 16 18:15:32 2004 Manish Singh <yosh@gimp.org>
+
+ * glib/gstrfuncs.c (g_strncasecmp): Make it take a guint for number
+ of characters, instead of a gsize. Technically this is incorrect,
+ but this makes it match the prototype, and this is a deprecated
+ function anyway.
+
+2004-09-16 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/Makefile.am (EXTRA_DIST): Add abicheck.sh
+
+Thu Sep 16 02:03:15 2004 Matthias Clasen <maclas@gmx.de>
+
+ Implement the same PLT reduction technique used in GTK+:
+
+ * glib/glib.symbols: Master list of symbols
+
+ * glib/makegalias.pl: Perl script which creates galias.h
+
+ * glib/abicheck.sh: Compares actual exports against glib.symbols
+
+ * glib/glib.def: Removed. This file is now generated from
+ glib.symbols
+
+ * glib/Makefile.am: Add rules to generate galias.h and glib.def,
+ and add abicheck.sh to TESTS. Don't export _-prefixed symbols.
+
+ * configure.in: Add --disable-visibility to suppress the
+ use of ELF visibility attributes.
+
+ * glib/*.c: Include galias.h
+
+2004-09-15 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gwin32.c (g_win32_error_message): Convert message to
+ UTF-8. Technically this breaks API, but the actual use cases in
+ gdk/win32 have assumed it is UTF-8 anyway. Fix
+ documentation. (#152618, Kazuki Iwamoto)
+
+ * glib/gwin32.h: Don't define ftruncate as a macro. Was never a
+ good idea, and it clashes with newest mingw headers, which have a
+ ftruncate implementation as an inline function. Thanks to Dominik R.
+
+ * glib/gwin32.c (g_win32_ftruncate): Simplify implementation, just
+ call _chsize() in the C library.
+
+2004-09-15 Matthias Clasen <mclasen@redhat.com>
+
+ * NEWS: Update.
+
+2004-09-09 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmessages.c (g_return_if_fail_warning): Strip the
+ prefix "IA__" from function names, since that is what
+ GTK+ uses for the PLT-reduction aliases.
+
+Thu Sep 9 13:52:26 2004 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmessages.c (g_return_if_fail_warning):
+ Include implementation of g_return_if_fail_internal().
+
+Thu Sep 9 10:37:41 2004 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmessages.h (g_return_[val_]if_fail): Use
+ a helper function to reduce code size; omit FILE/LINE
+ when we have __PRETTY_FUNCTION__.
+
+2004-09-09 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.c (g_get_home_dir): Remove a misleading comment.
+
+Thu Sep 9 00:10:40 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstrfuncs.h:
+ * glib/gstrfuncs.c (g_strv_length): Add a function to
+ calculate the length of a NULL-terminated string
+ array. (#150455, Tim-Philipp Müller)
+
+ * tests/strfunc-test.c (main): Add a test for g_strv_length().
+
+2004-09-08 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gutils.c (guess_category_value): On Win32, as last resort
+ call g_win32_getlocale() to get the current thread locale. There
+ usually aren't any POSIXish LANG or LC_* environment variables
+ present on Windows machines.
+
+ * glib/glib.def: Add g_get_language_names.
+
+2004-09-07 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.h:
+ * glib/gutils.c (g_get_language_names): Add a function to
+ return a list of applicable locale names. (#95587,
+ Hidetoshi Tajima)
+ (guess_category_value, compute_locale_variants):
+ (explode_locale, unalias_lang, read_aliases): Helper
+ functions for g_get_language_names()
+
+ * tests/testglib.c (main): Show the results of
+ g_get_language_names()
+
+Sun Sep 5 01:46:11 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib.def:
+ * glib/gmessages.h:
+ * glib/gmessages.c (g_log_set_default_handler): New
+ function to install an alternate default log
+ handler. (#66387, Darin Adler)
+
+2004-09-03 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.def: Update.
+
+Wed Sep 1 20:22:39 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gdate.h:
+ * glib/gdate.c (g_date_get_iso8601_week_of_year): Add
+ a function to calculate the ISO 8601 week number of
+ a date. (#92579, Niklas Lundell)
+
+2004-09-01 Anders Carlsson <andersca@gnome.org>
+
+ * glib/goption.c: (g_option_context_parse):
+ Set program name before calling the pre-parse hooks.
+
+2004-09-01 Anders Carlsson <andersca@gnome.org>
+
+ * glib/goption.c: (g_option_context_free), (print_help),
+ (g_option_context_parse):
+ Handle option contexts without a main group.
+
+ * tests/option-test.c: (empty_test2), (main):
+ Add test case for that.
+
+2004-08-30 Anders Carlsson <andersca@gnome.org>
+
+ * glib/goption.c: (g_option_context_parse):
+ Set prgname to <unknown> if argc and argv are NULL.
+
+ * tests/option-test.c: (empty_test1), (main):
+ Add test case for that.
+
+Sun Aug 29 23:58:38 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/ghash.c (g_hash_table_lookup): Point to
+ g_hash_table_lookup_extended() for differentiation between
+ not-found and value-is-NULL. (#150960, Morten Welinder)
+
+2004-08-27 Matthias Clasen <mclasen@redhat.com>
+
+ Fix #151193, Stepan Kasal:
+
+ * glib/gfileutils.c (g_file_error_from_errno):
+ * glib/gfileutils.h (enum GFileError): Add G_FILE_ERROR_NOSYS.
+
+Fri Aug 27 00:45:41 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/goption.c (g_option_context_parse): Set the program name
+ from argv[0], noticed by Masatake YAMATO.
+
+2004-08-26 Tor Lillqvist <tml@iki.fi>
+
+ * tests/testglib.c (main): Test the new XDG basedir functions.
+
+2004-08-25 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gwin32.c (g_win32_get_windows_version): New
+ function. Returns the Windows version code like GetVersion(),
+ except that one can pretend to be running on Win9x by setting the
+ G_WIN32_PRETEND_WIN9X environment variable. This is mainly for
+ debugging purposed.
+
+ * glib/gwin32.h: Declare it. Define macros G_WIN32_WINDOWS_IS_NT_BASED
+ and G_WIN32_HAVE_WIDECHAR_API to test Windows features at run-time.
+
+2004-08-25 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Post-release version bump.
+
+ * === Released 2.5.2 ===
+
+Wed Aug 25 00:25:08 2004 Matthias Clasen <maclas@gmx.de>
+
+ * NEWS: Update for 2.5.2
+
+2004-08-25 Tor Lillqvist <tml@iki.fi>
+
+ Win32 equivalences of the XDG folders
+
+ * glib/gutils.c (get_special_folder): New function, calls
+ SHGetSpecialFolderLocation() to get path to places like the My
+ Documents folder.
+ (g_get_any_init): Use CSIDL_PROFILE as HOME if not
+ overridden by env vars.
+ (g_get_user_data_dir): Use CSIDL_PERSONAL.
+ (g_get_user_config_dir): Use CSIDL_APPDATA.
+ (g_get_user_cache_dir): Use CSIDL_INTERNET_CACHE. Debatable...
+ (g_get_system_data_dirs): Use CSIDL_COMMON_APPDATA and
+ CSIDL_COMMON_DOCUMENTS.
+ (g_get_system_config_dirs): Use CSIDL_COMMON_APPDATA.
+
+ * configure.in: Add -lole32 to G_LIBS_EXTRA for mingw.
+
+ * glib/glib.def: Add the new functions.
+
+Mon Aug 23 16:16:35 2004 Manish Singh <yosh@gimp.org>
+
+ * glib/goption.c (g_option_group_add_entries): remove unused
+ variable.
+
+Mon Aug 23 01:35:18 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gutils.c (g_get_user_cache_dir):
+ * glib/gutils.c (g_get_user_config_dir):
+ * glib/gutils.c (g_get_user_data_dir): Don't call g_get_home_dir()
+ while holding the g_utils_global lock, simply use g_home_dir.
+ (#150695, Jody Goldberg)
+
+2004-08-21 Tor Lillqvist <tml@iki.fi>
+
+ * glib/giowin32.c (g_io_win32_finalize): Tell select_thread to
+ break out of its loop. Prevents a thread leak. (#147392, Peter
+ Zelezny)
+
+ * glib/gunicollate.c (g_utf8_collate_key): Guard against bogus
+ return value from strxfrm(). For instance Microsoft's strxfrm()
+ returns INT_MAX on errors. (#141124)
+
+2004-08-19 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gunicollate.c (g_utf8_collate, g_utf8_collate_key): Correct
+ source and destination charset parameter order in g_convert()
+ call. (#150394, possibly also #141124)
+
+2004-08-20 Jon K Hellan <hellan@acm.org>
+
+ * glib/goption.h: Remove trailing commas.
+
+2004-08-17 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Check for all four values of the
+ visibility attribute; gcc 2.96 seems to miss
+ "default". (#150379, Vincent Noel)
+
+2004-08-16 Christian Rose <menthos@menthos.com>
+
+ * configure.in: Added "bs" to ALL_LINGUAS.
+
+2004-08-11 Ray Strode <rstrode@redhat.com>
+
+ * docs/reference/glib/glib-sections.txt:
+ * glib/gutils.[ch] (g_get_user_data_dir),
+ (g_get_user_config_dir), (g_get_user_cache_dir),
+ (g_get_system_data_dirs), (g_get_system_config_dirs):
+ Add new XDG basedir API (bug 139973).
+
+2004-08-10 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmacros.h: Remove G_GNUC_INTERNAL from here.
+ * configure.in: Check whether the visibility attribute
+ works and define G_HAVE_GNUC_VISIBILITY and
+ G_GNUC_INTERNAL in glibconfig.h correspondingly.
+
+Mon Aug 9 17:37:56 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmacros.h (G_GNUC_INTERNAL): Define empty if gcc is too old.
+
+2004-08-06 Hans Breuer <hans@breuer.org>
+
+ * glib/makefile.msc.in glib/glib.def : updated
+
+ * glib/gutils.c : avoid 'inconsitent dll linkage' by not
+ defining extern char** environ with msvc
+
+2004-08-06 Matthias Clasen <mclasen@redhat.com>
+
+ * m4macros/glib-gettext.m4: Require ngettext. (#123847,
+ Danilo Segan)
+
+Thu Aug 5 20:53:00 2004 Ray Strode <rstrode@redhat.com>
+
+ * glib/gutils.h (g_get_codeset): strdup result so caller
+ doesn't free internally managed memory.
+
+2004-08-04 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.def: Add glib_check_version.
+
+ * config.h.win32.in: Update to match what configure produces. Add
+ the G_ATOMIC_*. Define G_ATOMIC_I486 when compiling with gcc. Move
+ HAVE_INT64_AND_I64 to where the configure script puts it. Add
+ HAVE_INTTYPES_H_WITH_UINTMAX. Define intmax_t as __int64 for MSVC.
+
+Tue Aug 3 16:19:44 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/goption.c: Mark user visible strings for translation.
+
+Tue Aug 3 15:50:55 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/goption.[hc]: Pedantically use g types throughout.
+
+Tue Aug 3 14:58:20 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gutils.h:
+ * glib/gutils.c (glib_check_version): New function to
+ check the version of GLib at runtime. (#149175, Michael Natterer)
+
+2004-08-03 Anders Carlsson <andersca@gnome.org>
+
+ * glib/goption.h:
+ * glib/gtypes.h:
+ Move GTranslateFunc to gtypes.h
+
+2004-08-02 Anders Carlsson <andersca@gnome.org>
+
+ * glib/Makefile.am:
+ * glib/glib.h:
+ * glib/goption.c:
+ * glib/goption.h:
+ * tests/.cvsignore:
+ * tests/Makefile.am:
+ * tests/option-test.c:
+ Add GOption.
+
+2004-08-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmacros.h: Add a G_GNUC_INTERNAL macro to mark function
+ declarations as internal and avoid PLT indirections for
+ them. (#145465, Arjan van de Ven)
+
+ * glib/gunicodeprivate.h:
+ * glib/gthreadinit.h:
+ * glib/gmessages.h:
+ * glib/gdebug.h:
+ * glib/gconvert.c: Use G_GNUC_INTERNAL for _g_charset_get_aliases(),
+ _g_debug_init(), _g_log_fallback_handler(), _g_mem_thread_init(),
+ _g_messages_thread_init(), _g_convert_thread_init(),
+ _g_rand_thread_init(), _g_main_thread_init(), _g_atomic_thread_init(),
+ _g_mem_thread_private_init(), _g_messages_thread_private_init(),
+ _g_utf8_normalize_wc() and _g_unichar_combining_class().
+
+ * glib/gatomic.c: Include gthreadinit.h here to see the declaration
+ for _g_atomic_thread_init().
+
+Sun Aug 1 13:19:18 2004 Manish Singh <yosh@gimp.org>
+
+ * tests/uri-test.c: move newline printing from run_from_uri_tests()
+ to run_roundtrip_tests().
+
+2004-08-01 Matthias Clasen <mclasen@redhat.com>
+
+ * Post-release version bump
+
+ * === Released 2.5.1 ===
+
+Sat Jul 31 23:17:05 2004 Matthias Clasen <maclas@gmx.de>
+
+ * NEWS: Updates.
+
+Sat Jul 31 20:33:07 2004 Matthias Clasen <maclas@gmx.de>
+
+ * tests/shell-test.c: Include a test involving consecutive
+ backslashes followed by a non-escaped doublequote.
+
+ * glib/gshell.c (tokenize_command_line): Count consecutive
+ backslashes mod 2 to detect escaped doubleqotes. (#127306)
+
+2004-07-30 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gconvert.c (g_unescape_uri_string): Don't validate
+ for UTF-8 here. (#148420, Robert Ögren)
+
+ * tests/uri-test.c (run_roundtrip_tests): Add tests for
+ roundtrip compatibility. Going from filename to uri and
+ back should always give you the same filename back.
+
+2004-07-28 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/markups/valid-{9,10,11}.gmarkup:
+ * tests/markups/fail-{37,38,39}.gmarkup: Tests for handling
+ of whitespace inside tags.
+
+ * glib/gmarkup.c (enum GMarkupParseState): Add
+ STATE_AFTER_ATTRIBUTE_NAME and STATE_AFTER_CLOSE_TAG_NAME.
+ (g_markup_parse_context_parse): Accept whitespace between
+ attribute names, '=' and attribute values and between
+ close tag name and '>'. (#148646, Hiroyuki Ikezoe)
+
+Tue Jul 27 02:01:31 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gstrfuncs.c (g_strsplit_set): s/g_strsplit/g_strsplit_set/
+ as well.
+
+Sat Jul 24 17:50:07 2004 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * glib/gstrfuncs.c (g_strsplit_set):
+ s/g_strtokenize/g_strsplit_set/ in docs.
+
+Fri Jul 23 10:37:50 2004 Matthias Clasen <maclas@gmx.de>
+
+ * tests/type-test.c (main): Actually test G_MAXSIZE with
+ a gsize variable.
+
+2004-07-21 Matthias Clasen <mclasen@redhat.com>
+
+ Fix #132858, Sven Neumann, patch by James Henstridge:
+
+ * glib-gettextize.in: modify so that mkinstalldirs will
+ get installed into auxdir.
+
+ * Makefile.am (gettext_SCRIPTS): install mkinstalldirs.
+
+2004-07-21 Matthias Clasen <mclasen@redhat.com>
+
+ Fix #147651, reported by Oliver Guntermann:
+
+ * glib/gprintfint.h (_g_vasprintf): Don't wrap vasprintf(),
+ _g_gnulib_vasprintf() in a macro, since they behave
+ differently wrt. to memory allocation.
+
+ * glib/gprintf.c (g_vasprintf): Instead, differentiate
+ here between the three cases: system vasprintf(),
+ _g_gnulib_vasprintf(), no vasprintf().
+
+2004-07-20 Crispin Flowerday <gnome@flowerday.cx>
+
+ * NEWS: Fix a typo in my name
+
+Tue Jul 20 04:31:40 2004 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * configure.in: Bump version number
+
+Sun Jul 18 19:40:30 2004 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * === Released 2.5.0 ===
+
+ * Makefile.am (BUILT_EXTRA_DIST): move gtk-doc.make here.
+
+Sun Jul 18 01:40:28 2004 Matthias Clasen <maclas@gmx.de>
+
+ * NEWS: Updates for 2.5.0
+
+Mon Jul 12 00:02:40 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gi18n-lib.h: Remove the ENABLE_NLS check here as well.
+
+2004-07-09 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gdir.c (g_dir_open): Convert filename to UTF-8
+ before using it in the error message. (#146054, Federico
+ Mena Quintero)
+
+Thu Jul 8 00:54:32 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gi18n.h: Remove the ENABLE_NLS check, since GLib can't
+ be built without anyway. (#135899, Murray Cumming)
+
+Mon Jul 5 18:50:27 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmessages.h (g_debug): Complete the g_log()
+ family. (#135730, Sven Herzberg)
+
+Mon Jul 5 18:42:30 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gnulib/Makefile.am (INCLUDES): Add top_srcdir to
+ make srcdir != . work. (#145166, Kaz Sasayama)
+
+Sun Jul 4 01:52:18 2004 Matthias Clasen <maclas@gmx.de>
+
+ * configure.in: Use a small test library instead of
+ libpthread.so for testing RTLD_GLOBAL brokenness. (#139567,
+ Julio M. Merino Vidal)
+
+2004-07-02 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * glib/gatomic.c: Rename __asm to __asm__ and __volatile to
+ __volatile__ to make the file consistent. Spotted by Benoit
+ Carpentier <gtkool_2kx@yahoo.fr>.
+
+2004-07-01 John Ehresman <jpe@wingide.com>
+
+ * glib/giowin32.c (g_io_channel_win32_init, g_io_win32_free)
+ Initialize reset_send & reset_recv fields and don't close
+ sockets unless they were created. (#145153)
+
+Fri Jun 11 22:56:46 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gscanner.c (g_scanner_get_token_ll): Ignore a
+ missing newline at EOF for single line comments.
+ (#83674, Sven Neumann)
+
+Thu Jun 10 23:38:02 2004 Matthias Clasen <maclas@gmx.de>
+
+ * tests/printf-test.c (TEST): Actually set any_failed on
+ failure. (#143552, Philippe Blain)
+
+2004-06-09 Federico Mena Quintero <federico@ximian.com>
+
+ * tests/uri-test.c (to_uri_tests): Fix expected results (ha ha)
+ for URIs that *should* have been invalid, or viceversa.
+ (from_uri_tests): Likewise.
+
+2004-06-07 Federico Mena Quintero <federico@ximian.com>
+
+ Fixes #140532.
+
+ * glib/gconvert.c (is_asciialphanum): Renamed from
+ is_escalphanum(); ensures that this is an ASCII character.
+ (is_asciiescalpha): Renamed from is_escalpha().
+ (hostname_validate): Use the two functions above.
+ (g_filename_to_uri): Don't convert the filename to UTF-8.
+ (g_filename_from_uri): Don't convert the filename from UTF-8.
+
+Mon Jun 7 22:25:24 2004 Matthias Clasen <maclas@gmx.de>
+
+ * tests/run-markup-tests.sh: Default to silence, but support
+ a -v argument to get the old output back.
+
+2004-06-06 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gutils.c (g_get_any_init): Check home for being
+ NULL. (#143812, Ivan Wong)
+
+Sun Jun 6 15:23:00 2004 Pawan Chitrakr <pawan@nplinu.org>
+
+ * configure.in: Added "ne" (Nepali) in ALL_LINGUAS
+
+Fri Jun 4 19:26:47 2004 Manish Singh <yosh@gimp.org>
+
+ * glib/galloca.h: cpp #directives should always have the "#" in the
+ first column of the the line. Do that for "#pragma alloca". Fixes
+ bug #143744.
+
+Wed Jun 2 00:57:16 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gtypes.h: Use higher precision for the mathematical
+ constants. (#141941, Morten Welinder)
+
+Tue Jun 1 22:01:40 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gmarkup.c (advance_char): Fix an off-by-one error
+ in g_markup_parse_context_parse(). (#142794, Morten Welinder)
+
+Sun May 16 23:23:29 2004 Matthias Clasen <maclas@gmx.de>
+
+ Merged from 2.4:
+
+ * glib/gcompletion.c (g_completion_add_items):
+ (g_completion_remove_items): Remove unnecessary
+ checks. (#142559, Morten Welinder)
+
+2004-05-15 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gutils.c (g_get_any_init): [Win32] Only believe HOME if it
+ is an absolute path and exists. (#138618)
+
+2004-05-14 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gnulib/vasnprintf.c (vasnprintf): Handle empty digit string
+ for precision correctly. (#142400)
+
+ For backward compatibility with the Trio implementation, make "ll"
+ format modifer work on Win32, too. Change into "I64" before
+ passing to the system printf. (#142433)
+
+ * tests/printf-test.c (main): Add tests for the above.
+
+2004-05-10 Matthias Clasen <mclasen@redhat.com>
+
+ Merge from 2.4:
+
+ * glib/gmain.c (block_source, unblock_source): Make these
+ static. (#142230, Morten Welinder)
+
+2004-05-10 Tor Lillqvist <tml@iki.fi>
+
+ * glib/giowin32.c (g_win32_print_gioflags): Remove two duplicated
+ lines. Thanks to Benoît Carpentier.
+
+Sun May 9 02:04:14 2004 Matthias Clasen <maclas@gmx.de>
+
+ Merge from 2.4:
+
+ * glib/guniprop.c (g_utf8_casefold): Avoid an unnecessary
+ memleak. (#141998, Nikolai Weibull)
+
+Sat May 8 23:02:26 2004 Matthias Clasen <maclas@gmx.de>
+
+ Merge from 2.4:
+
+ * glib/gutils.h: Remove vestigial g_get_codeset().
+ * glib/gutils.c (g_get_codeset): Call g_get_charset().
+ (#137703, Owen Taylor)
+
+2004-05-06 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version number to 2.5.0.
+
+Wed May 5 23:35:44 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/gconvert.c (g_filename_from_uri): Quote the file
+ scheme to mark it as untranslatable. String change.
+ (#133144, Danilo Segan)
+
+2004-05-03 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * configure.in: Added Walloon (wa) to ALL_LINGUAS
+
+Sun May 2 03:51:59 2004 Manish Singh <yosh@gimp.org>
+
+ * glib/gtypes.h: check for __pentium4__ when deciding whether to
+ use bswap for GUINT32_SWAP_LE_BE_IA32(). Fixes bug #141620.
+
+2004-05-01 Hans Breuer <hans@breuer.org>
+
+ * glib/gnulib/Makefile.am : added makefile.msc to EXTRA_DIST
+ fixes #141563, Steve Lhomme
+
+2004-04-30 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.4.1 ===
+
+ * configure.in: Version 2.4.1, interface age 1.
+
+ * NEWS: Updates
+
+2004-04-25 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gwin32.c (g_win32_get_package_installation_subdirectory):
+ Plug memory leak. (#140770, John Ehresman)
+
+2004-04-23 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/libcharset/localcharset.c (_g_locale_get_charset_aliases):
+ Reinstate LIBCHARSET_ALIAS_DIR support which got lost at some
+ point. (#139134, Piotr Klaban)
+
+ * glib/gconvert.c (open_converter): Don't call g_strerror() here,
+ since it can lead to infinite recursion. (#139133, Piotr Klaban)
+
+2004-04-22 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/testglib.c (main): Trivial warning fix. (#140345)
+
+ * tests/queue-test.c (main): Add some tests for off-by-one errors.
+
+ * glib/gqueue.c (g_queue_pop_nth_link): Fix an off-by-one
+ error. (#139703, Philippe Blain)
+
+ * tests/testglib.c (main): Add testcases for g_message() involving
+ non-printable and unsafe characters.
+
+ * glib/gmessages.c (escape_string): Don't assume that
+ string->str remains unchanged over g_string_insert()
+ calls. (#139030, Christophe Saout)
+
+ * glib/gstrfuncs.c (g_ascii_strtod): Fix problems when a
+ locale-specific decimal separator directly follows a
+ number. (#138424, Nickolay V. Shmyrev)
+
+ * tests/strtod-test.c (main): Add some more testcases.
+
+ * glib/gmain.c (g_main_context_query): Only set time_is_current to
+ FALSE if context->timeout is not zero. (#137795, Christian Krause)
+
+2004-04-21 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/printf-test.c (main): Comment out a nonessential testcase
+ which fails on HP-UX. (#136283, Jonas Jonsson)
+
+2004-04-15 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/patterntest.c (main): Add tests for the empty pattern.
+
+ * glib/gpattern.c (g_pattern_spec_new): Don't read and write out
+ of bounds when the pattern is empty. (#140032, Stanislav Brabec,
+ Stefan Fent)
+
+2004-04-10 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gwin32.c (g_win32_getlocale): Add new language and
+ sublanguage codes, from GNU gettext. (#137958)
+
+ * glib/giowin32.c
+ * glib/gmain.c
+ * glib/gstrfuncs.c
+ * glib/gthread.c: Decorating variable definitions with
+ __declspec(dllexport) causes problems on Cygwin build, and isn't
+ really needed for a native Win32 build with mingw or MSVC, so
+ remove. (#138402, Roger Leigh)
+
+ * glib/libcharset/localcharset.c: Use Win32-specific code also on
+ Cygwin.
+ * tests/uri-test.c: Don't assume that local filenames are in UTF-8
+ on Cygwin, either. (#138412, Roger Leigh)
+
+2004-04-08 Guntupalli Karunakar <karunakar@freedomink.org>
+
+ * configure.in: Added "gu" (Gujarati) to ALL_LINGUAS.
+
+2004-04-03 Tor Lillqvist <tml@iki.fi>
+
+ * configure.in: Remove AC_CYGWIN, obsolete. Don't let pthreads be
+ found on Cygwin, they don't work. (#138401, Roger Leigh)
+
+2004-03-31 Tor Lillqvist <tml@iki.fi>
+
+ * tests/spawn-test-win32-gui.c: Minor Cygwin fix. (#138405, Roger
+ Leigh)
+
+ * tests/unicode-encoding.c (process): Use UTF-16LE explicitly also
+ on Cygwin. (#138423, Roger Leigh)
+
+2004-03-30 Adam Weinberger <adamw@gnome.org>
+
+ * configure.in: Added en_CA to ALL_LINGUAS.
+
+2004-03-21 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gutils.c (g_path_get_dirname): Fix Win32 behaviour in some
+ cases where a drive letter is present. For 'a:' or 'a:foo', return
+ 'a:.'. This is mostly just for consistency with the behaviour
+ without a drive letter. But very important is to for 'a:\foo' or
+ 'a:\', return 'a:\', and not 'a:'. (Ditto for forward slashes
+ instead of backslashes.) (#137316)
+
+ * tests/dirname-test.c (main): More complete testing on Win32. If
+ a test fails, include expected and actual result in error message.
+
+Fri Mar 19 15:21:09 2004 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gmain.c: Fix the accidental revert of the
+ fixes from #112222 that happened when the GChildWatch
+ code was added. (Caught by Christian Persch)
+
+Fri Mar 19 11:07:06 2004 Owen Taylor <otaylor@redhat.com>
+
+ * tests/atomic-test.c (main): Make computation
+ of "biggest_pointer" vaguely more portable.
+ (#137498, Jonas Jonsson)
+
+2004-03-16 Tor Lillqvist <tml@iki.fi>
+
+ * configure.in: Define HAVE_INT64_AND_I64 also in the mingw (gcc
+ on Win32) case, where the 64-bit type is called long long, but the
+ system printf/scanf format modifier for 64-bit integers is still I64.
+
+2004-03-16 Gareth Owen <gowen72@yahoo.com>
+
+ * configure.in: Added en_GB to ALL_LINGUAS
+
diff --git a/trunk/ChangeLog.pre-2-8 b/trunk/ChangeLog.pre-2-8
new file mode 100644
index 000000000..999078cda
--- /dev/null
+++ b/trunk/ChangeLog.pre-2-8
@@ -0,0 +1,1483 @@
+2005-08-12 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.8.0 ===
+
+ * NEWS: Updates
+
+2005-08-12 Tim-Philipp Müller <tim at centricular dot net>
+
+ * gobject/genums.c: (g_flags_get_first_value): Special-case flag
+ value of 0. Instead of returning the first random GFlagsValue
+ we come across, return the GFlagsValue for 0 if it exists or
+ NULL if it does not exist. Never return the GFlagsValue for 0
+ if the requested flags value is nonzero.
+
+2005-08-12 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version to 2.8.0
+
+2005-08-11 Tor Lillqvist <tml@novell.com>
+
+ * glib/gutils.c (g_get_any_init): Use "localhost" as fallback for
+ g_get_host_name(), not "unknown".
+
+2005-08-10 Stepan Kasal <kasal@ucw.cz>
+
+ Fix typos: Invokation --> Invocation (in various places)
+
+2005-08-10 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gfileutils.c (g_build_path_va, g_build_pathname_va):
+ Take a va_list*, not a va_list, to avoid compiler warnings
+ about uninitialized variables.
+
+2005-08-09 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/gobject/Makefile.am (test_programs): Add it here.
+
+ * tests/gobject/gvalue-test.c: Beginning of a test suite
+ for GValue.
+
+ * NEWS: Updates
+
+2005-08-08 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.c (_g_compute_locale_variants): Initialize
+ variables to not make gcc nervous.
+
+2005-08-08 Manish Singh <yosh@gimp.org>
+
+ * glib/abicheck.sh: remove stray -V option to grep so it actually
+ works.
+
+2005-08-08 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/convert-test.c: Enable the endianness test.
+
+ * glib/gconvert.c: Make the caching of iconv descriptors
+ optional.
+
+ * configure.in: Add an --enable-iconv-cache option, and
+ default to disabling iconv caching on new enough glibc.
+ Somebody with access to Solaris systems will need to test
+ if opening/closing of iconv descriptors is enough of
+ a performance problem to warrant the caching on that
+ platform. Note that the caching is causing correctness
+ problems in some corner cases, thus turning it off
+ is desirable unless it has severe performance implications.
+
+ * tests/convert-test.c: Add a test for
+ endianness handling.
+
+2005-08-08 Sunil Mohan Adapa <sunil@atc.tcs.co.in>
+
+ * configure.in: Added "te" to ALL_LINGUAS.
+
+2005-08-08 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/Makefile.am: Add convert-test here.
+
+ * tests/convert-test.c: Add the beginning of a testsuite
+ for g_convert() and friends.
+
+2005-08-06 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols: Include glib_on_error_halt.
+
+ * glib/abicheck.sh: Also check exported variables.
+
+2005-08-05 Manish Singh <yosh@gimp.org>
+
+ * tests/refcount/closures.c: remove unused n_threads variable.
+
+2005-08-05 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.7.7 ===
+
+ * NEWS: Updates
+
+2005-08-04 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols:
+ * glib/gatomic.[hc]: Always export g_atomic_int_get and
+ g_atomic_pointer_get as functions, even if we have macros,
+ to avoid changing the ABI depending on configuration.
+
+ * glib/gatomic.c: Fix the s390 implementations of
+ g_atomic_pointer_compare_and_exchange.
+
+2005-08-04 Tor Lillqvist <tml@novell.com>
+
+ * glib/gstdio.h: Move the G_BEGIN_DECLS/G_END_DECLS pair outside
+ the #if/#else/#endif block. Otherwise we had G_BEGIN_DECLS without
+ matching G_END_DECLS on Unix, and G_END_DECLS without matching
+ G_BEGIN_DECLS on Win32.
+
+2005-08-03 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.7.6 ===
+
+ * NEWS: Updates
+
+2005-08-03 Ross Burton <ross@burtonini.com>
+
+ * docs/reference/glib/tmpl/windows.sgml:
+ Add a long description, pointing people at Cygwin for a complete
+ Unix library.
+
+ * glib/gutils.c:
+ Document return value of g_get_host_name().
+
+2005-08-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gatomic.c: Add native atomic operations
+ for s390.
+
+ * configure.in: ... and use them on s390.
+
+2005-08-03 Ross Burton <ross@burtonini.com>
+
+ * glib/gstdio.c:
+ Fix DocBook tag typo. (#311966)
+
+2005-08-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gstdio.h: Add G_BEGIN_DECLS/G_END_DECLS. (#312424)
+
+2005-08-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gconvert.c (g_convert_with_iconv): Don't go in an
+ infinite loop if the input text ends in an incomplete multibyte
+ character. (#312402, Sebastien Bacher)
+
+ * Bump version
+
+ * === Released 2.7.5 ===
+
+ * NEWS: Updates
+
+2005-08-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gconvert.c (g_convert_with_iconv, g_convert_with_fallback):
+ Cleanup converter state after the conversion. Document streaming
+ conversion pitfalls. (#311337)
+
+2005-08-02 Tor Lillqvist <tml@novell.com>
+
+ * tests/refcount/objects.c
+ * tests/refcount/properties.c
+ * tests/refcount/signals.c: Use g_usleep() instead of sleep() for
+ portability.
+
+Mon Aug 1 23:33:47 2005 Tim Janik <timj@imendio.com>
+
+ * tests/refcount/closures.c: test high contention on closure
+ reference counts to trigger and catch non-atomic updates.
+
+ * tests/refcount/objects.c:
+ * tests/refcount/objects2.c:
+ * tests/refcount/properties.c:
+ * tests/refcount/properties2.c:
+ * tests/refcount/signals.c:
+ fixed up test and threading fundamentals. variables accessed from all
+ threads need to be volatile. context switches are enforced by using
+ g_thread_yield(), not g_usleep(1) which may result in busy waits on
+ some platforms. for testcode, always consider all warnings and
+ critical messages fatal. issue the currently running program on
+ stdout. improved progress indicators.
+
+ * tests/refcount/properties.c:
+ * tests/refcount/objects.c:
+ don't overdo the number of testing threads to keep the testing machine
+ usable, 2 threads can produce as much contention as 20 if executing the
+ same code.
+
+ * tests/refcount/signals.c: only start 1 thread per object. GObject
+ doesn't provide mutually exclusive object access, but only mutually
+ exclusive reference count modification.
+
+ * tests/Makefile.am: added closures test.
+
+2005-08-01 Tor Lillqvist <tml@novell.com>
+
+ * tests/uri-test.c: Make it pass on Win32.
+ (from_uri_tests[]): Take into consideration that on Win32 we don't
+ return "localhost" hostnames.
+ (safe_strcmp_filename): New function that considers slash and
+ backslash equal on Win32.
+ (safe_strcmp_hostname): New function that considers "localhost"
+ equal NULL on Win32.
+ (run_roundtrip_tests): Use safe_strcmp_filename() and
+ safe_strcmp_hostname().
+
+Sun Jul 31 01:50:20 2005 Tim Janik <timj@gtk.org>
+
+ * glib/gdataset.c:
+ moved G_DATALIST_*_POINTER() macros here, because proper use requires
+ the global g_dataset_global mutex to be acquired.
+ g_datalist_id_get_data():
+ g_datalist_unset_flags():
+ g_datalist_set_flags(): properly acquire and release dataset mutex.
+
+ * glib/gdatasetprivate.h: implement G_DATALIST_GET_FLAGS() via atomic
+ pointer access to account for memory barriers. moved all other macros.
+
+2005-07-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c: Include glibintl.h, not gi18n.h, noticed
+ by Dan Winship.
+
+ * configure.in: Try -mt as compiler flag for threads, needed
+ for the HP C compiler on HP-UX. (#163051, Paul Cornett)
+
+ * glib/ghash.c (g_hash_table_foreach): Fix a typo in the
+ docs. (#311569, Ross Burton)
+
+2005-07-21 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.7.4 ===
+
+ * NEWS: Updates
+
+2005-07-20 Manish Singh <yosh@gimp.org>
+
+ * tests/refcount/signals.c: use G_CALLBACK for signal connections.
+
+2005-07-20 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gthreadpool.c (g_thread_pool_free): Don't get
+ stuck in here if immediate is TRUE. (#310954,
+ Hong Jen Yee)
+
+ * tests/threadpool-test.c (main): Test immediate == TRUE.
+
+2005-07-20 Tor Lillqvist <tml@novell.com>
+
+ * glib/gutils.h (g_win32_get_system_data_dirs): Make this an
+ inline function. Define it only if G_CAN_INLINE and not
+ C++. (#173098)
+
+2005-07-19 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gstring.c (g_string_chunk_insert_len): Avoid
+ an unnecessary strlen if len is -1. (#169692,
+ Benoit Dejean)
+
+ * glib/gatomic.c (g_atomic_pointer_compare_and_exchange):
+ Fix g_atomic_pointer_compare_and_exchange on sparc64.
+ (#167572, Gert Doering)
+
+2005-07-15 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.7.3 ===
+
+2005-07-15 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/Makefile.am (SUBDIRS): Add tests/refcount
+
+ * configure.in: Add tests/refcount
+
+ * tests/refcount/properties.c: Test property changes
+ from multiple threads.
+
+ * tests/refcount/signals.c: Test signal emission from
+ multiple threads.
+
+ * tests/refcount/objects.c: Test refcounting from
+ multiple threads.
+
+ * tests/refcount/objects2.c:
+ * tests/refcount/properties2.c: Tests to measure the
+ overhead of threadsafe refcounting.
+
+ * glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
+ Use atomic operations to make refcounting
+ threadsafe. (#166020, Wim Taymans)
+
+ * NEWS: Updates
+
+2005-07-14 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/spawn-test.c:
+ * tests/uri-test.c:
+ * tests/thread-test.c:
+ * tests/queue-test.c:
+ * tests/mainloop-test.c:
+ * tests/iochannel-test.c:
+ * tests/gio-test.c:
+ * tests/child-test.c: Make the tests silent on success.
+
+2005-07-13 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gfileutils.c (g_mkdir_with_parents): Fix a
+ typo. (#310243, Richard Laager)
+
+ * glib/goption.c (g_option_group_add_entries): Warn if a
+ short name is not acceptable.
+
+2005-07-12 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.h (G_OPTION_FLAG_NOALIAS):
+ * glib/goption.c: Add and implement a new flag
+ to turn off the automatic <groupname>- prefixing
+ for conflict resolution of long option names. (#171840,
+ Adam McLaurin)
+
+ All optional callback arguments (#308886, Pawel
+ Sliwowski)
+
+ * glib/goption.h (G_OPTION_FLAG_OPTIONAL_ARG):
+ * glib/goption.c: Add and implement a new flag
+ to indicate that a callback *optionally* takes another
+ argument.
+
+ * tests/option-test.c: Add tests for optional arguments.
+
+2005-07-12 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gthread.c (g_static_rec_mutex_lock_full): Don't lock
+ if depth is zero. (#310148, Wim Taymans)
+
+2005-07-10 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.c (g_listenv): Ignore anomalous environment
+ entries which are not of the form variable=value. (#309859,
+ Morten Welinder)
+
+2005-07-09 Tor Lillqvist <tml@novell.com>
+
+ * glib/giowin32.c: Totally rewritten socket channel
+ implementation. See discussion in bug #147392.
+
+ * configure.in: Don't use autoconf variables for the resource
+ object files on Win32 any longer. Instead handle that in the
+ Makefile.am files. Check for windres.
+
+ * glibconfig.h.win32.in: Minor tuning to match the
+ configure-produced glibconfig.h closely.
+
+ * glib/Makefile.am: Don't use the scripts in build/win32 to
+ compile glib.rc into a resource object file. (This means we lose
+ the build number increment magic, but I doubt it was that useful
+ anyway.) Instead use windres directly. To pass the normal .o file
+ produced by windres through libtool, which wants .lo files, pass
+ it directly to the linker using a -Wl option.
+
+ * glib/glib.rc.in: Thus replace BUILDNUMBER with 0.
+
+2005-07-08 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.7.2 ===
+
+ * NEWS: Updates
+
+2005-07-07 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Make the size_t size detection work on AIX.
+ (#309725)
+
+2005-07-06 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Require a newer gtk-doc.
+
+2005-07-01 Hans Breuer <hans@breuer.org>
+
+ * glib/gmessages.c : include <process.h> for getpid()
+ * glib/gmappedfile.c : include <io.h> for close() etc.
+ * glib/makefile.msc.in : add gmappedfile.obj
+
+2005-07-01 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_get_key_comment):
+ (g_key_file_get_top_comment): Don't reverse the order of multiline
+ comments.
+ (g_key_file_get_group_comment): Actually get the group comment.
+
+ * tests/keyfile-test.c (test_comments): Test that comments are
+ handled properly. (#309263, Mikael Magnusson)
+
+2005-06-30 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.7.1 ===
+
+2005-06-30 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gstring.c (g_str_hash): Fix portability issues.
+ (#307064, Morten Welinder)
+
+ Apply a patch which may make GLib work on BeOS again.
+ (#309157, Kian Duffy)
+
+ * glib/gmain.c: Update the BeOS includes.
+
+ * glib/gstdio.c:
+ * glib/gutils.c (g_find_program_in_path):
+ * glib/gbacktrace.c (g_on_error_stack_trace): Use the UNIX
+ implementation on BeOS, as well.
+
+ * configure.in: Don't put glib 1.0 into G_MODULE_LIBS, even
+ on BeOS.
+
+ * NEWS: Updates
+
+2005-06-26 Tor Lillqvist <tml@novell.com>
+
+ * glib/Makefile.am: libtool installs/uninstalls the import
+ library, no need to do it ourselves. Do still install/uninstall
+ the .def file, though.
+
+ * glib/gmappedfile.c: Add Win32 implementation.
+ (g_mapped_file_free): Don't mention writable shared mappings in
+ the doc comment. Free the GMappedFile struct.
+
+ * tests/mapping-test.c (main): No kill() or SIGUSR1 on Win32, use
+ a flag file instead to stop the child. Use g_usleep() instead of
+ sleep().
+
+2005-06-24 Matthias Clasen <mclasen@redhat.com>
+
+ Add an mmap() wrapper called GMappedFile. (#148218,
+ David Schleef, Behdad Esfahbod)
+
+ * glib/gmappedfile.[hc]: New files.
+
+ * configure.in: Check for mmap.
+
+ * glib/Makefile.am: Add new files.
+
+ * glib/glib.symbols: Add new functions.
+
+ * glib/glib.h: Include gmappedfile.h
+
+ * tests/mapping-test.c: Tests for GMappedFile.
+
+ * tests/Makefile.am: Add new file.
+
+ * Makefile.am (DISTCHECK_CONFIGURE_FLAGS): Add --enable-man.
+
+2005-06-24 Tor Lillqvist <tml@novell.com>
+
+ * glib/Makefile.am (install-libtool-import-lib): Current GNU tools
+ do understand the PRIVATE keyword.
+
+ * glib/gfileutils.c (g_mkdir_with_parents): Return error with
+ EINVAL also for empty pathnames.
+ (g_build_pathname_va): Fix typo.
+
+Thu Jun 23 15:52:08 2005 Manish Singh <yosh@gimp.org>
+
+ * glib/gfileutils.c: g_build_filename_va is only use in the G_OS_WIN32
+ case, so compile it conditionally.
+
+2005-06-23 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/keyfile-test.c (test_group_remove): Don't leak
+ memory here.
+
+ * glib/gkeyfile.c (g_key_file_load_from_data_dirs): Don't
+ leak output_path. (#308546, Kjartan Maraas)
+
+ * glib/glib.symbols:
+ * glib/gfileutils.h:
+ * glib/gfileutils.c (g_build_pathv, g_build_filenamev):
+ Variants of g_build_path() and g_build_filename()
+ which take a string array instead of varargs.
+ (#149092, Todd A. Fisher)
+
+ * tests/strfunc-test.c: Add tests for g_build_pathv()
+ and g_build_filenamev().
+
+2005-06-22 Tor Lillqvist <tml@novell.com>
+
+ * glib/gfileutils.c
+ * glib/gfileutils.h
+ * glib/glib.symbols
+ * tests/testglib.c: Rename g_makepath() to g_mkdir_with_parents().
+
+2005-06-22 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c (parse_short_option, parse_long_option):
+ Pass the option name also in the NO_ARG case. (#308602,
+ Masatake YAMATO)
+ (parse_arg): Properly store changes for arrays. (#308528,
+ Roger Leigh)
+
+2005-06-22 Tor Lillqvist <tml@novell.com>
+
+ * glib/gfileutils.c (g_makepath): New function. Creates a
+ directory including intermediate parent directories as
+ needed. (#60509)
+
+ * glib/gfileutils.h: Declare it.
+
+ * glib/gutils.c (g_get_host_name): New function. Returns the
+ machine's name, or one of its names. Document that it is
+ best-effort only, and not guaranteed to be unique or anything.
+ (g_get_any_init): Get the host name here. On Unix use
+ gethostname(), on Windows use GetComputerName(). (#5200)
+
+ * glib/gutils.h: Declare it.
+
+ * glib/glib.symbols: Add new functions.
+
+ * tests/testglib.c: Test g_makepath() and g_get_host_name().
+
+2005-06-18 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.h:
+ * glib/goption.c: Add G_OPTION_FLAG_NO_ARG and
+ G_OPTION_FLAG_FILENAME to allow greater control of
+ G_OPTION_ARG_CALLBACK options. (#302632, Dan Winship)
+
+ * tests/option-test.c: test callback args
+
+2005-06-14 Theppitak Karoonboonyanan <thep@linux.thai.net>
+
+ * configure.in: Added 'th' (Thai) to ALL_LINGUAS.
+
+2005-06-10 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+ * === Released 2.7.0 ===
+
+ * NEWS: Updates
+
+2005-06-09 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_parse_value_as_integer): Better
+ error checking. (#306389, Morten Welinder)
+
+ * glib/goption.c (parse_int): Set errno to 0 before calling
+ strtol. (#306388, Morten Welinder)
+
+2005-06-09 Tor Lillqvist <tml@novell.com>
+
+ * glib/gstdio.h
+ * glib/gstdio.c
+ * glib/glib.symbols: Add a chdir() wrapper, too.
+
+ * glib/glib.symbols: Add g_win32_locale_filename_from_utf8().
+
+ * glib/gwin32.c (g_win32_locale_filename_from_utf8): Clarify doc
+ comment.
+
+2005-06-08 Tor Lillqvist <tml@novell.com>
+
+ * glib/gutils.c (get_windows_directory_root): New helper function
+ on Win32, returns the root of the drive (or possibly share) where
+ the Windows directory is. (In the case of Terminal Server sessions
+ the Windows directory is a per-user folder.)
+ (g_get_any_init): Use get_windows_directory_root() as last resort
+ for both temp directory and home directory. g_get_home_dir() now
+ never returns NULL on Win32. Don't look at HOMEDRIVE and
+ HOMEPATH. HOME, USERPROFILE, CSIDL_PROFILE and Windows directory
+ drive root should be enough.
+
+2005-06-08 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols:
+ * glib/gunicode.h:
+ * glib/gunicollate.c (g_utf8_collate_key_for_filename):
+ New function to calculate collation keys which are more
+ suitable for sorting filenames. (#172690, Ole Laursen)
+
+Fri May 27 17:18:00 2005 Manish Singh <yosh@gimp.org>
+
+ * glib/goption.c (parse_short_option): initialize option_name
+ before using it.
+
+2005-05-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c (parse_short_option, parse_long_option):
+ Return an error if an option is missing its argument. (#305576,
+ Björn Lindqvist)
+
+ * tests/option-test.c (missing_arg_test): Add a testcase.
+
+Wed May 25 15:33:51 2005 Manish Singh <yosh@gimp.org>
+
+ * glib/goption.c (print_help): rest_description should be const.
+
+2005-05-25 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gunidecomp.c (combine_hangul): Don't eat Hangul
+ when normalizing. (#301742, reported by Christian Biere,
+ patch by Noah Levitt)
+
+2005-05-24 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c (print_help): If the remaining argument
+ has an arg_description, display the synopsis as
+ PROGNAME [OPTION...] REST (#305346, Noah Levitt)
+
+2005-05-20 Federico Mena Quintero <federico@ximian.com>
+
+ Merged from glib-2-6:
+
+ * glib/gspawn.c (g_spawn_command_line_sync): Clarify the meaning
+ of exit_status(); it's not the return code from the child, but
+ rather the waitpid() status.
+
+2005-05-18 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gunidecomp.c: Correct the end of the Hangul
+ Syllables range, from 0xd7af to 0xd7a3, in several
+ places. (#301984, Changwoo Ryu)
+
+2005-05-17 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/tree-test.c (main): Check the return values of
+ g_tree_remove().
+
+ * glib/gtree.c (g_tree_remove, g_tree_steal): Return
+ a boolean indicating wether the key was found. (#302545,
+ Matthew F. Barnes)
+
+2005-05-06 Brian Cameron <brian.cameron@sun.com>
+
+ * configure.in, gmodule-no-export-2.0-uninstalled.pc.in,
+ Makefile.am: Added gmodule-no-export-2.0-uninstalled.pc.in
+ to allow building of other libraries like pango when
+ glib is uninstalled.
+
+2005-05-06 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/option-test.c: Add a testcase.
+
+ * glib/goption.c (g_option_context_parse): Treat '-'
+ on its own as a non-option argument. (#168008, Tim Musson,
+ Thomas Leonard and others)
+
+2005-05-05 Owen Taylor <otaylor@redhat.com>
+
+ * glib/gdataset.[ch] glib/gdatasetprivate.h: Add
+ g_datalist_set/unset_flags(), g_datalist_get_flags() functions
+ to squeeze some bits into a GDataSet... this is needed for
+ efficient implementation of toggle references in GObject.
+
+ * tests/gobject/references.c tests/gobject/Makefile.am:
+ Add a test case for weak and toggle references.
+
+ * glib/gfileutils.[ch]: Rename g_file_replace() back
+ to g_file_set_contents().
+
+ * glib/glib.symbols: Update.
+
+2005-05-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gstring.c (g_str_equal, g_str_hash): Move docs
+ inline.
+
+2005-05-01 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/ghash.h: Rename some parameters to make gtk-doc
+ happy.
+
+ * glib/gutils.c:
+ * glib/gwin32.c:
+ * glib/gstdio.c: Fix some typos, mark new API as "Since 2.8".
+
+2005-04-29 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gtree.c: Clarify some docs. (#302062, Matthew F. Barnes)
+
+2005-04-28 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gstrfuncs.c (g_strcompress): Warn and don't crash
+ when meeting a trailing \\. (#301373, Benjamin Otte)
+
+2005-04-27 Tor Lillqvist <tml@novell.com>
+
+ * glib/gconvert.c (open_converter, g_convert_with_iconv): Don't
+ call g_set_error() unless the GError pointer is non-NULL. This
+ avoids infinite recursion problems in certain rare situations on
+ Windows, when g_locale_from_utf8() is called from
+ _glib_get_locale_dir() after the change below. It's the
+ _glib_gettext() calls to translate error messages that are
+ parameters to g_set_error() that cause the recursion, not
+ g_set_error() itself.
+
+ * glib/gwin32.c (g_win32_locale_filename_from_utf8): New
+ function. Converts a filename to the system codepage, and if a
+ straight conversion isn't possible (because the filename contains
+ characters not in the system codepage), try looking up the
+ filename (which should refer to an existing file for this to
+ succeed) with short (8.3) pathname components.
+
+ * glib/gutils.c (_glib_get_locale_dir): No need to cache the
+ result, this function is normally called only once. Return the
+ path to the locale directory in system codepage, not UTF-8. The
+ path is passed to bindtextdomain(), which doesn't use UTF-8 file
+ names. Use g_win32_locale_filename_from_utf8(). (#301772)
+
+ Don't do run-time lookup of message catalog directory on
+ Cygwin. Cygwin is supposed to look and feel like Unix, and on Unix
+ we use paths fixed at configure time.
+
+2005-04-19 Tor Lillqvist <tml@novell.com>
+
+ * glib/gutils.h: Minor comment improvement.
+
+2005-04-18 Tor Lillqvist <tml@novell.com>
+
+ * glib/gfileutils.c: No <sys/wait.h> on Win32. Definition of
+ save_errno was missing in one place.
+
+Sat Apr 16 20:15:44 2005 Soeren Sandmann <sandmann@redhat.com>
+
+ * glib/gfileutils.c (g_file_replace): Save the errno in various
+ places
+
+ * glib/gfileutils.c (set_umask_permissions): Fork a child and do
+ chmod() to the umask() permissions there.
+
+2005-04-10 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmessages.h (g_debug): Use G_LOG_LEVEL_DEBUG in
+ both definitions. (#300071, Tommi Komulainen)
+
+2005-04-09 Tor Lillqvist <tml@novell.com>
+
+ * glib/gutils.c: Include <process.h> on Win32 for getpid(). (#173094)
+
+2005-04-08 Tor Lillqvist <tml@novell.com>
+
+ * glib/gstdio.h
+ * glib/gstdio.c
+ * glib/glib.symbols (g_access, g_chmod, g_creat): Wrap also
+ access(), chmod() and creat(). (#169623, #171285)
+
+2005-04-08 Tor Lillqvist <tml@novell.com>
+
+ Improve g_get_system_data_dirs() on Windows. A library that calls
+ g_get_system_data_dirs() might be installed in a different
+ top-level prefix than GLib or the application being run.
+
+ * glib/gutils.h (g_win32_get_system_data_dirs): New static
+ function defined in this header. Calls
+ g_win32_get_system_data_dirs_for_module() passing the address of
+ itself as parameter. g_get_system_data_dirs() is #defined as this
+ function.
+
+ * glib/gutils.c (g_win32_get_system_data_dirs_for_module): New
+ function. If the address parameter is non-NULL, the corresponding
+ module's installation location is used for one of the returned
+ path names, in addition to the COMMON_APPDATA, COMMON_DOCUMENTS,
+ glib top-level and application top-level folders.
+ (g_get_system_data_dirs): Now just for backward compatibility on
+ Win32. Just call g_win32_get_system_data_dirs_for_module(NULL).
+
+ * glib/glib.symbols: Add g_win32_get_system_data_dirs_for_module.
+
+ * glib/gutils.c (read_aliases): Not used on Windows.
+ (unalias_lang): Don't do anything on Windows, there is no
+ /usr/share/locale/locale.alias file..
+
+Thu Apr 7 22:51:15 2005 <yosh@gimp.org>
+
+ * glib/gutils.c (g_get_system_data_dirs): Declare glib_top_share_dir
+ and exe_top_share_dir only in G_OS_WIN32.
+
+2005-04-08 Tor Lillqvist <tml@novell.com>
+
+ * glib/gutils.c (g_get_system_data_dirs): After investigating more
+ closely the actual use cases of this function, I understand better
+ what it needs to do on Windows. In addition to the Windows
+ COMMON_APPDATA and COMMON_DOCUMENTS folders, also return the
+ "share" subfolders of GLib's installation location and the
+ application .exe's installation location, hoping that either
+ matches what the function's caller is looking for.
+
+ * glib/gutils.h (G_WIN32_DLLMAIN_FOR_DLL_NAME): Use wide char API
+ if available, and store dll name in UTF-8.
+
+2005-04-05 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gfileutils.c (get_contents_stdio): Avoid memory
+ leaks in borderline cases. (#172612, Morten Welinder)
+
+2005-04-04 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gconvert.c: Clarify docs in some places. (#172404,
+ Morten Welinder)
+
+2005-04-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.h: Undef G_CAN_INLINE if G_IMPLEMENT_INLINES is
+ defined. This was the pre-2.6 behaviour, and without it,
+ G_IMPLEMENT_INLINES cannot be used in multiple .c files
+ at all. (#165852, Dave Benson)
+
+2005-04-01 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmain.c (g_child_watch_source_new): Add a note regarding
+ waitpid(-1).
+ (g_child_watch_source_init_multi_threaded):
+ (g_child_watch_source_init_single): Don't use SA_RESTART,
+ since it causes problems on at least one platform. (#168352)
+
+2005-03-30 Steve Murphy <murf@e-tools.com>
+
+ * configure.in: Added "rw" to ALL_LINGUAS.
+
+2005-03-30 Sven Neumann <sven@gimp.org>
+
+ * glib/gfileutils.c (get_contents_stdio): handle the unlikely case
+ that no bytes are read from the file and allocate an empty string.
+
+2005-03-30 Tor Lillqvist <tml@novell.com>
+
+ * glib/giowin32.c (g_io_win32_fd_get_flags_internal): Always claim
+ file descriptors open to devices are readable, since we can't
+ know. fstat() doesn't give any useful information. (#145326)
+
+2005-03-29 Tor Lillqvist <tml@novell.com>
+
+ * glib/gmain.c (g_poll): [Win32] If the event fired, assign
+ f->revents=f->events. We can't know whether the upper layer using
+ the event actually is readable, writeable or what, so say that all
+ the conditions hold. Remove the ResetEvent() call that has been
+ ifdeffed out anyway for a long time. Remove an "#ifdef 1" and
+ #endif pair of lines, that code is not optional.
+ (g_get_current_time): [Win32] Use GetSystemTimeAsFileTime()
+ instead of time() and GetTickCount(). Much simpler.
+
+2005-03-28 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/date-test.c:
+ * tests/testgdate.c: Add tests for
+ g_date_get_iso8601_week_of_year().
+
+ * glib/gdate.c (g_date_get_iso8601_week_of_year):
+ Fix the calculation. (#169858, Jon-Kare Hellan)
+
+2005-03-27 Tor Lillqvist <tml@novell.com>
+
+ * configure.in: Apparently AC_LIBTOOL_WIN32_DLL isn't deprecated
+ after all, and in fact necessary with HEAD libtool.
+
+2005-03-23 Tor Lillqvist <tml@novell.com>
+
+ * glib/gutils.c (g_getenv): [Win32] Fix corner case bug when
+ environment variable value is exactly one character.
+
+2005-03-21 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols: Add g_try_malloc0
+
+ * glib/gmem.h: Add g_try_new, g_try_new0, g_try_renew and
+ g_try_malloc0. (#169611, Stefan Kost)
+
+ * glib/gmem.c: Implement g_try_malloc0.
+
+2005-03-20 Tor Lillqvist <tml@novell.com>
+
+ * glib/gspawn-win32.c (do_spawn_with_pipes): Close the process
+ handle if the caller doesn't want it also in the case without a
+ helper process.
+ (g_spawn_sync): Don't ask for a child pid which we don't need.
+
+ * glib/gtimer.c: On Win32, use GetSystemTimeAsFileTime() instead
+ of GetTickCount(). (#159507)
+
+ * glib/gmessages.c (g_log_default_handler)
+ * glib/gutils.c (g_get_prgname): Move the Win32 code that asks the
+ program name from the system to g_get_prgname(). Do output the pid
+ also on Win32 (useful in case there are several instances of the
+ same program running).
+
+ * tests/testglib.c (main): Print more detailled output from the
+ timer tests. Don't print home directory twice. Test
+ g_win32_error_message().
+
+ * tests/spawn-test.c (run_tests): On Win32, run netstat instead of
+ ipconfig. On Windows XP collecting output from ipconfig doesn't
+ seem to work for some reason.
+
+2005-03-18 Hans Breuer <hans@breuer.org>
+
+ * glib/makefile.msc.in : handle galiasdef.c (although completely
+ useless for msvc build)
+
+ * glib/gbacktrace.c glib/gmessage.c : need at least _WIN_VER 0x0401
+ for IsDebuggerPresent()
+
+2005-03-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c: Update the documentation, reflecting the
+ fact that the special case for !group_name --> start_group
+ got removed. (#170566, Tim-Philipp Müller)
+
+2005-03-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c (g_option_context_set_main_group): Warn
+ if there already is a main group. (#170445, Jeff Franks)
+
+Sun Mar 13 22:01:17 2005 Manish Singh <yosh@gimp.org>
+
+ * tests/array-test.c: delete a bunch of dead code.
+
+Sun Mar 13 21:28:47 2005 Manish Singh <yosh@gimp.org>
+
+ * glib/gdataset.c: remove spurious IA prefix from g_quark_try_string.
+
+2005-03-13 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gatomic.c:
+ * glib/gcache.c: Small fixes to the previous commit.
+
+2005-03-13 Matthias Clasen <mclasen@redhat.com>
+
+ Make PLT-reduction work with gcc4, and don't include
+ everything in galias.h:
+
+ * glib/glib.symbols: Group symbols by header and source file.
+ * glib/makegalias.pl: Protect definitions by the same
+ preprocessor symbols used to guard the headers. Move
+ the alias declarations to a separate file which is
+ produced when calling makegalias.pl -def
+ * glib/Makefile.am (galiasdef.c): Add a rule to generate this
+ file.
+ * glib/*.c: Include galias.h after the other GLib headers,
+ include galiasdef.c at the bottom.
+
+ * glib/glib.symbols: Add g_listenv and g_file_replace.
+
+Fri Mar 11 23:51:12 2005 Soeren Sandmann <sandmann@redhat.com>
+
+ * glib/gfileutils.c (write_to_temp_file): Don't try and generate
+ a dotfile from the name -- it doesn't work with absolute
+ paths. Also make documentation indicate that symlinks will be
+ overwritten. Both pointed out by Alexis S. L. Carvalho.
+
+2005-03-11 Matthias Clasen <mclasen@redhat.com>
+
+ * m4macros/glib-gettext.m4: Avoid stupid compiler complaints
+ about precision loss.
+
+2005-03-10 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gdate.c: Remove a lot of pointless g_return_if_fail()
+ checks. (#169859, Morten Welinder)
+
+2005-03-10 Sven Neumann <sven@gimp.org>
+
+ * tests/file-test.c: include <gstdio.h>.
+
+2005-03-10 Sven Neumann <sven@gimp.org>
+
+ * glib/gfileutils.c (get_contents_stdio): delay memory allocation
+ until after the first read. Saves a bunch of reallocs. Also
+ increased the buffer size to 4096 bytes. (bug #165954)
+
+ * tests/file-test.c (test_get_contents): added a (very basic) test
+ for g_file_get_contents().
+
+Wed Mar 9 19:06:45 2005 Manish Singh <yosh@gimp.org>
+
+ * glib/glib.symbols: Add g_file_replace.
+
+2005-03-09 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Bump version
+
+2005-03-09 Sven Neumann <sven@gimp.org>
+
+ * glib/gfileutils.c (g_file_replace): avoid unnecessary filename
+ conversions.
+
+2005-03-09 Tor Lillqvist <tml@novell.com>
+
+ * glib/gutils.c (g_get_user_data_dir, g_get_user_config_dir,
+ g_get_user_cache_dir, g_get_system_data_dirs,
+ g_get_system_config_dirs): [Win32] Don't leak return value from
+ get_special_folder(). (#169348, Daniel Atallah) Guard against
+ g_home_dir being NULL, use g_tmp_dir/g_user_name in that case.
+
+Tue Mar 8 15:46:54 2005 Søren Sandmann <sandmann@redhat.com>
+
+ * glib/gfileutils.c (g_file_replace): New API. A function to
+ atomically create a file.
+
+2005-03-08 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols: Add the new attributes here too.
+
+ * glib/gmacros.h: Define G_GNUC_NULL_TERMINATED.
+ (#164706, Marc Meissner)
+
+ * glib/gstrfuncs.h:
+ * glib/gfileutils.h: Use G_GNUC_NULL_TERMINATED where
+ appropriate.
+
+ * glib/goption.c (parse_int): Fix an error message.
+ (#168751, Hazael Maldonado Torres)
+
+2005-03-07 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gdebug.h: Small cleanup (use G_BEGIN/END_DECLS).
+ (#168474, Fabricio Barros Cabral)
+
+2005-03-07 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.c (g_find_program_in_path): Mark the last
+ paragraph of the docs as Windows-specific. (#169433)
+
+2005-03-06 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gmarkup.c: Add G_GNUC_PRINTF attribute
+ to set_error.
+ (g_markup_parse_context_end_parse): Fix an
+ error message, noticed by Tim Janik.
+
+2005-02-24 Tor Lillqvist <tml@novell.com>
+
+ * glib/Makefile.am (BUILT_EXTRA_DIST): Don't distribute
+ glib.def. (#167496, J. Ali Harlow)
+
+ * glib/gfileutils.c (get_contents_win32): Use g_fopen(). (#168341,
+ Daniel Atallah)
+
+2005-02-23 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Don't forget to set G_THREAD_LIBS_FOR_GTHREAD
+ on non-linux platforms. (#168177, Michael Banck)
+
+ * tests/keyfile-test.c (test_locale_string): Set LANGUAGE
+ instead of LC_ALL to shield against LANGUAGE being set in
+ the environment. (#168311, Suren A. Chilingaryan)
+
+Tue Feb 22 22:03:38 2005 Manish Singh <yosh@gimp.org>
+
+ * glib/gstdio.h: On G_OS_UNIX, simple #define g_open and co. as
+ aliases for their respective C library functions, instead of
+ using the function wrappers. This avoids library users having to
+ care about matching large file support with whatever glib has been
+ built with. Fixes bug #167942.
+
+ * glib/gstdio.c
+ * glib/abicheck.sh
+ * glib/glib.symbols
+ * glib/makegalias.pl: Logic to make the gstdio wrappers still
+ available for compatibility, but not used in new code.
+
+Tue Feb 22 18:33:07 2005 Manish Singh <yosh@gimp.org>
+
+ * glib/gtimer.c (g_usleep): Simplify the loop for the fix below.
+
+2005-02-20 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gqueue.c (g_queue_new): Use a memchunk for
+ sizeof(GQueue)-sized chunks. (#167984, Fabrício Barros Cabral)
+
+ * glib/gtimer.c (g_usleep): Fix usage of
+ nanosleep(). (#163039, Bastien Nocera)
+
+2005-02-16 Adi Attar <aattar@cvs.gnome.org>
+
+ * configure.in: Added "xh" to ALL_LINGUAS.
+
+2005-02-11 Tor Lillqvist <tml@novell.com>
+
+ * glib/giowin32.c: Include winsock2.h before windows.h, to avoid
+ compilation errors with MSVC. (#167105)
+
+2005-02-10 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c (print_help): Take main group options into
+ account when calculating column size. (#166921)
+ (g_option_context_parse): Accept -? as documented. (#166977)
+
+2005-02-09 Matthias Clasen <mclasen@redhat.com>
+ * glib/gkeyfile.c (find_file_in_data_dirs): Don't leak path
+ here. (#166801, Kjartan Maraas)
+
+2005-02-08 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_parse_value_as_string): Don't
+ write out of bounds.
+
+ * glib/goption.c (g_option_context_parse): Fix a
+ one-too-short memory allocation. (#166609, Nicolas Laurent)
+
+ * tests/Makefile.am (TESTS_ENVIRONMENT): Add tests with
+ MALLOC_CHECK_.
+
+ * tests/option-test.c: Add a test for unkown short options.
+
+2005-02-07 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib.symbols:
+ * glib/gutils.h:
+ * glib/gutils.c (g_listenv): New function to list all
+ environment variables. (#166327, Hans Petter Jansson)
+
+2005-02-07 Tor Lillqvist <tml@novell.com>
+
+ * glib-zip.in: Add gmodule-no-export-2.0.pc.
+
+Sun Feb 6 21:59:09 2005 Manish Singh <yosh@gimp.org>
+
+ * glib/abicheck.sh: feed the contents of config.h and glibconfig.h
+ into the preprocessor, since glib.symbols could need #defines
+ from them.
+
+Sun Feb 6 12:09:55 2005 Manish Singh <yosh@gimp.org>
+
+ * glib/gatomic.c: Don't use matching constraints for asm mem
+ parameters. This makes the code match with current glibc, and
+ quiets some warnings with gcc 3.4.
+
+2005-02-05 Tor Lillqvist <tml@novell.com>
+
+ * configure.in (G_LIBS_EXTRA)
+ * glib/giowin32.c: I think we can include <winsock2.h> and link
+ with -lws2_32. Only Windows 95 originally didn't have Winsock 2,
+ and it's available as an update for it. Not that we use any actual
+ Winsock 2 -only features, but still, simpler to link directly with
+ ws2_32.dll instead of going through wsock32.dll.
+
+ * glib/gfileutils.c (g_file_get_contents): In the Win32 ABI
+ stability version, call g_file_get_contents_utf8(), not
+ itself. (#166386, Bill Skaggs)
+
+2005-02-04 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Remove the --enable-ansi option (#160469)
+
+ * configure.in: Define a HAVE_GNUC_VISIBILITY automake
+ conditional.
+
+ * glib/Makefile.am (TESTS): Only check the abi if
+ the compiler supports visibility, otherwise we
+ know there will be (harmless) extra symbols.
+ (#166181, Ed Avis)
+
+2005-02-02 Tor Lillqvist <tml@novell.com>
+
+ * glib/gwin32.h: Remove unnecessary MSVC-only typedef for
+ pid_t. (#165910) GLib does not pretend to be a POSIX emulation
+ library.
+
+ * glib/gstdio.c: In the Win32 part of all functions, handle
+ invalid UTF-8 more robustly. Don't pass the resulting NULL
+ wide-char or codepage strings on to C library functions, but bail
+ out early. (#166084)
+
+ * glib/gfileutils.c: Don't use potentially incorrect errno in
+ several places. (#165951)
+ (g_mkstemp): Set errno appropriately.
+
+2005-02-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.c: Move doc comments inline.
+
+ * glib/ghash.h: Adjust some argument names.
+
+ * configure.in: Give meaningful names to g_memmove()
+ arguments.
+
+2005-02-01 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/keyfile-test.c (test_key_remove): Add test case for
+ key removal.
+
+ * glib/gkeyfile.c (g_key_file_remove_key): Actually remove
+ the key from the list of pairs. (#165980, David Hoover)
+
+ * glib/gkeyfile.c: Doc clarifications. (#165907, Vincent Untz)
+
+ * tests/keyfile-test.c (test_group_remove): Add test case for
+ group removal.
+
+ * glib/gkeyfile.c (g_key_file_remove_group): Don't segfault
+ if the group doesn't exist. (#165887, Mathias Hasselmann)
+
+2005-01-30 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/keyfile-test.c: Some more unit tests.
+
+2005-01-28 Christian Rose <menthos@menthos.com>
+
+ * configure.in: Added "tl" to ALL_LINGUAS.
+
+2005-01-24 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/run-markup-tests.sh: Let $srcdir default to .
+
+ * tests/markups/fail-40.gmarkup: Add a test with a long entity
+ name.
+
+ * glib/gmarkup.c (unescape_text_state_inside_entity_name): Don't
+ copy the entity name into a short buffer of fixed length. Instead,
+ compare it in place with strncmp(), and do a full strdup() in the
+ error path. (#165100, Simon Budig)
+
+2005-01-22 Tor Lillqvist <tml@novell.com>
+
+ * glib/gdate.c (g_date_set_time): Don't g_assert that localtime()
+ returns non-NULL. It does return NULL at least on Win32 if you
+ pass it a negative time_t, which although wrong, shouldn't cause
+ an application to abort. Instead return 2000-01-01 as a default
+ date. Print a warning unless G_DISABLE_CHECKS. (#164622)
+
+2005-01-20 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_parse_value_as_integer): Don't
+ interpret leading zeros as octal. The specification requires
+ %f parsing, and %f doesn't allow octal.
+
+ * tests/keyfile-test.c: Add some more tests.
+
+ * glib/gkeyfile.c (g_key_file_get_keys): Return keys in
+ the order found in the file, rather than the opposite.
+ (g_key_file_parse_value_as_string): Fix error reporting.
+
+2005-01-19 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gkeyfile.c (g_key_file_parse_data): Accept \r\n as
+ line end. (#163030, Bastian Nocera)
+ (g_key_file_load_from_data): Make -1 work as a size.
+
+ * tests/keyfile-test.c: Some unit tests for the keyfile
+ parser.
+
+ * tests/Makefile.am (test_programs): Add keyfile-test.
+
+2005-01-19 Tor Lillqvist <tml@novell.com>
+
+ * glib/gbacktrace.c (g_on_error_stack_trace): On Win32 call
+ G_BREAKPOINT() if being debugged.
+
+ * glib/gmessages.c (g_logv): For fatal messages on Win32, use
+ G_BREAKPOINT() also without G_ENABLE_DEBUG, but only if being
+ debugged. Suggestion by Ulf Lamping.
+
+2005-01-18 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gqsort.c: Don't include alloca.h. It is not needed,
+ and does not exist on win32. (#164468, Kazuki IWAMOTO)
+
+ * glib/gkeyfile.c (g_key_file_get_boolean_list): Fix a
+ sparse warning. (#164467, Kjartan Maraas)
+
+2005-01-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gconvert.c (g_get_filename_charsets): Don't crash
+ if G_FILENAME_ENCODING is empty. (#164330, Pawel Sakowski)
+
+2005-01-15 Tor Lillqvist <tlillqvist@novell.com>
+
+ * configure.in: sh portability fix. Use "test" and not [.
+ (#163144, Robert Ögren)
+
+2005-01-13 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gqsort.c: Sync to glibc. (#133994, Morten Welinder,
+ patch by Kjartan Maraas)
+
+2005-01-11 Owen Taylor <otaylor@redhat.com>
+
+ * configure.in: Add gmodule-export-2.0.pc to AC_CONFIG_FILES.
+
+ * glib/Makefile.am gobject/Makefile.am gthread/Makefile.am:
+ Use grep | head -n 1 instead of grep -m 1 which doesn't work
+ with slightly older versions of GNU grep in
+ install-libtool-import-lib rule.
+
+2005-01-11 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gdir.c (g_dir_open): Typo fix.
+
+2005-01-10 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.am (EXTRA_DIST): Add missing ChangeLog.pre*
+
+2005-01-09 Hans Breuer <hans@breuer.org>
+
+ * glib/gfileutils.c : make it compile with mvc6 default sdk,
+ (#define INVALID_FILE_ATTRIBUTES, FILE_ATTRIBUTE_DEVICE)
+
+2005-01-09 Tor Lillqvist <tlillqvist@novell.com>
+
+ * glib/gwin32.c: Include also wchar.h for wcslen on
+ Cygwin.
+ (g_win32_error_message): Fix cast. (#163133, Roger Leigh)
+
+ * glib/gfileutils.c: Include <io.h> on Windows for
+ prototypes. (#163390, Kazuki Iwamoto)
+
+2005-01-07 Matthias Clasen <mclasen@redhat.com>
+
+ * NEWS: Typo fixes.
+
+ * configure.in: Bump version
+
+ * === Released 2.6.1 ===
+
+2005-01-07 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in:
+ * Makefile.am: Generate and distribute gmodule-export-2.0.pc,
+ which is currently just a copy of gmodule-2.0.pc, but makes
+ it explicit that it adds --export-dynamic.
+
+ * gmodule-export-2.0.pc.in: Copy of gmodule-2.0.pc.in.
+
+2005-01-06 Tor Lillqvist <tml@iki.fi>
+
+ * glib/Makefile.am
+ * gobject/Makefile.am: glib.def and gobject.def are generated, not
+ in $(srcdir). (#163143, J. Ali Harlow)
+
+ * configure.in
+ * glib/Makefile.am
+ * gobject/Makefile.am: Win32 cross-compilation fixes. (#163144,
+ J. Ali Harlow)
+
+2005-01-05 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.h: Simplify the inlining magic to make it
+ work at Oh zero. (#162990, Kalpesh Shah)
+
+2005-01-04 Tor Lillqvist <tml@iki.fi>
+
+ * glib/guniprop.c (get_locale_type): Use g_win32_getlocale()
+ instead of setlocale() on Windows. setlocale() returns strings
+ like "Turkish_Turkey".
+
+2005-01-04 Matthias Clasen <mclasen@redhat.com>
+
+ Fix the inlining magic. (#157536, Jens Hatlak, and
+ #149907, Morten Welinder)
+
+ * configure.in: Define G_CAN_INLINE in glibconfig.h
+
+ * glib/gutils.h: Streamline the inlining magic a bit,
+ don't use extern when implementing the non-inlined
+ version.
+
+2005-01-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.c (g_find_program_in_path): Don't return
+ directories. (#160738, Tommi Komulainen)
+
+ * glib/gfileutils.c (g_file_get_contents): Clarify the
+ documentation. (#162251, Mariano Suárez-Alvarez)
+
+2005-01-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gutils.c (g_setenv, g_unsetenv): Clarify the
+ docs. (#162747, Crispin Flowerday)
+
+2005-01-01 J. Ali Harlow <ali@juiblex.co.uk>
+
+ * configure.in: Don't use AC_TRY_RUN to test for long long format
+ when using the MSVCRT.DLL runtime since we know the answer anyway
+ and it causes some mild inconvience when cross compiling.
+
+ * README.win32: Add a reference to the cross compiling section
+ of the reference manual.
+
+ * docs/reference/glib/cross.sgml: MinGW uses MSVCRT.DLL which
+ requires %I64i instead of %lli. (#161306)
+
+2005-01-01 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gutils.c: Make the g_getenv() ABI backward compatibility
+ wrapper more robust.
+
+2005-01-01 Tor Lillqvist <tml@iki.fi>
+
+ * glib/glib.symbols
+ * glib/gutils.h
+ * glib/gutils.c: Make also g_getenv(), g_setenv(), g_unsetenv()
+ and g_find_program_in_path() take and return UTF-8 strings on
+ Win32. Implement DLL ABI backward compatility for them, too. Move
+ all the DLL ABI stability wrappers to the end of the file. Use
+ wide character API when available in inner_find_program_in_path().
+
+ * glib/gfileutils.c: With the UTF-8ness of g_getenv() above, just
+ use g_getenv() to get PATHEXT. (Yeah, it's probably overdoing it
+ to consider somebody actually having anything else than ASCII
+ in PATHEXT, but...)
+
+2004-12-31 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gfileutils.c (g_file_test): Rewrite the Win32 version to
+ use GetFileAttributes() instead of stat(). stat() is unreliable
+ for corner cases like '\\server\share' or '.\'. Part of fixing
+ #161797. When testing for executability, in addition to the fixed
+ set of executable file name extensions also check the PATHEXT
+ environment variable.
+
+2004-12-30 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gutils.c (g_get_current_dir): In the Win32 version, use
+ GetCurrentDirectory() directly for simpler buffer length
+ management. I don't trust getcwd() getting it right all the time.
+
+2004-12-30 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gfileutils.c (g_file_test): Typo fix.
+
+2004-12-30 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gutils.c (g_path_skip_root): Require UNC paths to start
+ with exactly two slashes.
+ (g_get_current_dir): Use wide character API when available.
+ (g_path_get_dirname): Handle UNC paths better. Part of fix for
+ #161797.
+
+2004-12-27 Matthias Clasen <mclasen@redhat.com>
+
+ * configure.in: Add an OS_LINUX conditional.
+
+ * glib/Makefile.am (TESTS): Only check the ABI on
+ linux, since the shell script is not portable, and libtool
+ deficiencies may distort the ABI on other platforms. (#161741)
+
+2004-12-21 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c (print_entry): Don't show
+ the special G_OPTION_REMAINING entry. (#161934,
+ Matthew F. Barnes)
+
+2004-12-20 Tor Lillqvist <tml@iki.fi>
+
+ * glib/gconvert.c (g_locale_to_utf8, g_filename_to_uri): Improve
+ docs.
+
+2004-12-20 Matthias Clasen <mclasen@redhat.com>
+
+ * tests/option-test.c: Add some tests for '--'
+ stripping.
+
+ * glib/goption.c (g_option_context_parse): Don't
+ strip '--' if it would be needed by a second option
+ parser. (#161701)
+
+ * glib/gunicollate.c (g_utf8_collate): Make docs
+ more accurate. (#161683, Marcin Krzyzanowski)
+
+2004-12-19 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/goption.c (g_option_context_parse): Call
+ post-parse hooks also if argv is NULL. (#161668,
+ Marcin Krzyzanowski)
+
diff --git a/trunk/HACKING b/trunk/HACKING
new file mode 100644
index 000000000..b1ba9f2ff
--- /dev/null
+++ b/trunk/HACKING
@@ -0,0 +1,34 @@
+If you want to hack on the GLib project, you'll need to have the
+following packages installed:
+
+ - GNU autoconf 2.54
+ - GNU automake 1.7
+ - GNU libtool 1.4
+ - GNU gettext 0.10.40
+ - gtk-doc
+
+These should be available by ftp from ftp.gnu.org or any of the
+fine GNU mirrors. Beta software can be found at alpha.gnu.org.
+
+To compile a CVS version of glib on your system, you will need to take
+several steps to setup the tree for compilation. You can do all these
+steps at once by running:
+
+ cvsroot/glib# ./autogen.sh
+
+Basically this does the following for you:
+
+ cvsroot/glib# aclocal; automake; autoconf
+
+ The above commands create the "configure" script. Now you
+ can run the configure script in cvsroot/glib to create all
+ the Makefiles.
+
+Before running autogen.sh or configure, make sure you have libtool
+in your path.
+
+Note that autogen.sh runs configure for you. If you wish to pass
+options like --prefix=/usr to configure you can give those options
+to autogen.sh and they will be passed on to configure.
+
+For information about submitting patches see the README file.
diff --git a/trunk/INSTALL b/trunk/INSTALL
new file mode 100644
index 000000000..4a411bfc7
--- /dev/null
+++ b/trunk/INSTALL
@@ -0,0 +1,111 @@
+Simple install procedure
+========================
+
+ % gzip -cd glib-2.13.4.tar.gz | tar xvf - # unpack the sources
+ % cd glib-2.13.4 # change to the toplevel directory
+ % ./configure # run the `configure' script
+ % make # build GLIB
+
+ [ Become root if necessary ]
+ % rm -rf /install-prefix/include/glib.h /install-prefix/include/gmodule.h
+ % make install # install GLIB
+
+Requirements
+============
+
+GLib-2.0 requires pkg-config, which is tool for tracking the
+compilation flags needed for libraries. (For each library, a small .pc
+text file is installed in a standard location that contains the
+compilation flags needed for that library along with version number
+information.) Information about pkg-config can be found at:
+
+ http://www.freedesktop.org/software/pkgconfig/
+
+GNU make (http://www.gnu.org/software/make) is also recommended.
+
+In order to implement conversions between character sets,
+GLib requires an implementation of the standard iconv() routine.
+Most modern systems will have a suitable implementation, however
+many older systems lack an iconv() implementation. On such systems,
+you must install the libiconv library. This can be found at:
+
+ http://www.gnu.org/software/libiconv/
+
+If your system has an iconv implementation but you want to use
+libiconv instead, you can pass the --with-libiconv option to
+configure. This forces libiconv to be used.
+
+Note that if you have libiconv installed in your default include
+search path (for instance, in /usr/local/), but don't enable
+it, you will get an error while compiling GLib because the
+iconv.h that libiconv installs hides the system iconv.
+
+If you are using the native iconv implementation on Solaris
+instead of libiconv, you'll need to make sure that you have
+the converters between locale encodings and UTF-8 installed.
+At a minimum you'll need the SUNWuiu8 package. You probably
+should also install the SUNWciu8, SUNWhiu8, SUNWjiu8, and
+SUNWkiu8 packages.
+
+The native iconv on Compaq Tru64 doesn't contain support for
+UTF-8, so you'll need to use GNU libiconv instead. (When
+using GNU libiconv for GLib, you'll need to use GNU libiconv
+for GNU gettext as well.) This probably applies to related
+operating systems as well.
+
+Finally, for message catalog handling, GLib requires an implementation
+of gettext(). If your system doesn't provide this functionality,
+you should use the libintl library from the GNU gettext package,
+available from:
+
+ http://www.gnu.org/software/gettext/
+
+The Nitty-Gritty
+================
+
+Complete information about installing GLib can be found
+in the file:
+
+ docs/reference/glib/html/glib-building.html
+
+Or online at:
+
+ http://developer.gnome.org/doc/API/2.0/glib/glib-building.html
+
+
+Installation directories
+========================
+
+The location of the installed files is determined by the --prefix
+and --exec-prefix options given to configure. There are also more
+detailed flags to control individual directories. However, the
+use of these flags is not tested.
+
+One particular detail to note, is that the architecture-dependent
+include file glibconfig.h is installed in:
+
+ $exec_prefix/lib/glib/include/
+
+if you have a version in $prefix/include, this is out of date
+and should be deleted.
+
+.pc files for the various libraries are installed in
+$exec_prefix/lib/pkgconfig to provide information when compiling
+other packages that depend on GLib. If you set PKG_CONFIG_PATH
+so that it points to this directory, then you can get the
+correct include flags and library flags for compiling a GLib
+application with:
+
+ pkg-config --cflags glib-2.0
+ pkg-config --libs glib-2.0
+
+
+Cross-compiling GLib
+====================
+
+Information about cross-compilation of GLib can be found
+in the file:
+
+ docs/reference/glib/html/glib-cross-compiling.html
+
+Or online at:
diff --git a/trunk/INSTALL.in b/trunk/INSTALL.in
new file mode 100644
index 000000000..218125755
--- /dev/null
+++ b/trunk/INSTALL.in
@@ -0,0 +1,111 @@
+Simple install procedure
+========================
+
+ % gzip -cd glib-@GLIB_VERSION@.tar.gz | tar xvf - # unpack the sources
+ % cd glib-@GLIB_VERSION@ # change to the toplevel directory
+ % ./configure # run the `configure' script
+ % make # build GLIB
+
+ [ Become root if necessary ]
+ % rm -rf /install-prefix/include/glib.h /install-prefix/include/gmodule.h
+ % make install # install GLIB
+
+Requirements
+============
+
+GLib-2.0 requires pkg-config, which is tool for tracking the
+compilation flags needed for libraries. (For each library, a small .pc
+text file is installed in a standard location that contains the
+compilation flags needed for that library along with version number
+information.) Information about pkg-config can be found at:
+
+ http://www.freedesktop.org/software/pkgconfig/
+
+GNU make (http://www.gnu.org/software/make) is also recommended.
+
+In order to implement conversions between character sets,
+GLib requires an implementation of the standard iconv() routine.
+Most modern systems will have a suitable implementation, however
+many older systems lack an iconv() implementation. On such systems,
+you must install the libiconv library. This can be found at:
+
+ http://www.gnu.org/software/libiconv/
+
+If your system has an iconv implementation but you want to use
+libiconv instead, you can pass the --with-libiconv option to
+configure. This forces libiconv to be used.
+
+Note that if you have libiconv installed in your default include
+search path (for instance, in /usr/local/), but don't enable
+it, you will get an error while compiling GLib because the
+iconv.h that libiconv installs hides the system iconv.
+
+If you are using the native iconv implementation on Solaris
+instead of libiconv, you'll need to make sure that you have
+the converters between locale encodings and UTF-8 installed.
+At a minimum you'll need the SUNWuiu8 package. You probably
+should also install the SUNWciu8, SUNWhiu8, SUNWjiu8, and
+SUNWkiu8 packages.
+
+The native iconv on Compaq Tru64 doesn't contain support for
+UTF-8, so you'll need to use GNU libiconv instead. (When
+using GNU libiconv for GLib, you'll need to use GNU libiconv
+for GNU gettext as well.) This probably applies to related
+operating systems as well.
+
+Finally, for message catalog handling, GLib requires an implementation
+of gettext(). If your system doesn't provide this functionality,
+you should use the libintl library from the GNU gettext package,
+available from:
+
+ http://www.gnu.org/software/gettext/
+
+The Nitty-Gritty
+================
+
+Complete information about installing GLib can be found
+in the file:
+
+ docs/reference/glib/html/glib-building.html
+
+Or online at:
+
+ http://developer.gnome.org/doc/API/2.0/glib/glib-building.html
+
+
+Installation directories
+========================
+
+The location of the installed files is determined by the --prefix
+and --exec-prefix options given to configure. There are also more
+detailed flags to control individual directories. However, the
+use of these flags is not tested.
+
+One particular detail to note, is that the architecture-dependent
+include file glibconfig.h is installed in:
+
+ $exec_prefix/lib/glib/include/
+
+if you have a version in $prefix/include, this is out of date
+and should be deleted.
+
+.pc files for the various libraries are installed in
+$exec_prefix/lib/pkgconfig to provide information when compiling
+other packages that depend on GLib. If you set PKG_CONFIG_PATH
+so that it points to this directory, then you can get the
+correct include flags and library flags for compiling a GLib
+application with:
+
+ pkg-config --cflags glib-2.0
+ pkg-config --libs glib-2.0
+
+
+Cross-compiling GLib
+====================
+
+Information about cross-compilation of GLib can be found
+in the file:
+
+ docs/reference/glib/html/glib-cross-compiling.html
+
+Or online at:
diff --git a/trunk/MAINTAINERS b/trunk/MAINTAINERS
new file mode 100644
index 000000000..f7fa49bff
--- /dev/null
+++ b/trunk/MAINTAINERS
@@ -0,0 +1,7 @@
+Email: mclasen@redhat.com
+Email: timj@gtk.org
+
+Note that a lot of people are contributing to GLib, and some parts of it
+are technically maintained by others. The email addresses listed above are
+meant as contacts for administrative questions such as cvs accounts. Other
+questions are best directed to the mailing list gtk-devel-list@gnome.org.
diff --git a/trunk/Makefile.am b/trunk/Makefile.am
new file mode 100644
index 000000000..a0160d630
--- /dev/null
+++ b/trunk/Makefile.am
@@ -0,0 +1,123 @@
+## Process this file with automake to produce Makefile.in
+
+AUTOMAKE_OPTIONS = 1.7
+
+SUBDIRS = . m4macros glib gobject gmodule gthread tests build po docs
+
+bin_SCRIPTS = glib-gettextize
+
+INCLUDES = -DG_LOG_DOMAIN=g_log_domain_glib @GLIB_DEBUG_FLAGS@ \
+ -DG_DISABLE_DEPRECATED -DGLIB_COMPILATION
+
+EXTRA_DIST = \
+ ChangeLog.pre-2-12 \
+ ChangeLog.pre-2-10 \
+ ChangeLog.pre-2-8 \
+ ChangeLog.pre-2-6 \
+ ChangeLog.pre-2-4 \
+ ChangeLog.pre-2-2 \
+ ChangeLog.pre-2-0 \
+ ChangeLog.pre-1-2 \
+ glib-zip.in \
+ NEWS.pre-1-3 \
+ acglib.m4 \
+ sanity_check \
+ README.in \
+ INSTALL.in \
+ README.win32 \
+ HACKING \
+ MAINTAINERS \
+ autogen.sh \
+ makefile.msc \
+ glibconfig.h.win32.in \
+ msvc_recommended_pragmas.h \
+ config.h.win32.in \
+ po/po2tbl.sed.in \
+ glib-2.0.pc.in \
+ gobject-2.0.pc.in \
+ gmodule-2.0.pc.in \
+ gmodule-export-2.0.pc.in \
+ gmodule-no-export-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 \
+ gmodule-no-export-2.0-uninstalled.pc.in
+
+
+# These may be in the builddir too
+BUILT_EXTRA_DIST = \
+ README \
+ INSTALL \
+ glibconfig.h.win32 \
+ config.h.win32 \
+ gtk-doc.make
+
+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
+
+uninstall-local:
+ rm -f $(DESTDIR)$(configexecincludedir)/glibconfig.h
+
+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
+ cd $(top_builddir) && $(SHELL) ./config.status glibconfig.h
+ echo timestamp > stamp-gc-h
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = glib-2.0.pc gobject-2.0.pc gmodule-2.0.pc gmodule-export-2.0.pc gmodule-no-export-2.0.pc gthread-2.0.pc
+
+$(pkgconfig_DATA): config.status
+
+# install mkinstalldirs for glib-gettextize's benefit
+gettextdir = $(datadir)/glib-2.0/gettext
+gettext_SCRIPTS = mkinstalldirs
+
+# build documentation when doing distcheck
+DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
+
+DISTCLEANFILES = glibconfig-sysdefs.h glibconfig.h stamp-gc-h
+
+distclean-local:
+ if test $(srcdir) = .; then :; else \
+ rm -f $(BUILT_EXTRA_DIST); \
+ fi
+
+.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)
+ files='$(BUILT_EXTRA_DIST)'; \
+ 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/trunk/NEWS b/trunk/NEWS
new file mode 100644
index 000000000..ca06d8edc
--- /dev/null
+++ b/trunk/NEWS
@@ -0,0 +1,1592 @@
+Overview of Changes from GLib 2.13.3 to GLib 2.13.4
+===================================================
+
+* Bugs fixed:
+ 444121 g_get_user_special_dir deadlocks
+ 444161 invalid UTF8 in key name shows up as valgrind error in g_...
+ 444130 g_option_context_get_help() is broken when there's a desc...
+
+
+Overview of Changes from GLib 2.13.2 to GLib 2.13.3
+===================================================
+
+* GKeyFile:
+ - Added defines for easier handling of desktop files
+
+* Unicode support:
+ - Update g_unichar_iswide_cjk for Unicode 5.0
+
+* Regular expression support:
+ - GRegex structs can now be ref-counted
+ - Some new functions for dealing with incremental
+ replacement have been added
+ - The GRegexEvalCallback signature has been changed
+
+* g_get_user_special_dir() has been added to support
+ xdg-user-dirs
+
+* Bugs fixed:
+ 419376 Functions using named subpatterns behave inconsistently w...
+ 434358 g_regex_fetch_named() and g_regex_fetch_named_pos() are b...
+ 423708 typo in the README.win32 file see patch below
+ 339225 Add new defines for easier handling of .desktop files
+ 442265 API additions/changes for GRegex
+ 432651 Add a glib-ish xdg_user_dir_lookup
+
+* Updated translations:
+ Estonian (et)
+ Norwegian bokmål (nb)
+
+
+Overview of Changes from GLib 2.13.1 to GLib 2.13.2
+===================================================
+
+* Unicode support:
+ - Add g_unichar_ismark()
+
+* GOption:
+ - Allow to use callbacks for remaining args
+
+* Updated translations:
+ Belarusian Latin (be@latin)
+ British English (en_GB)
+ Galician (gl)
+ Norwegian bokmål (nb)
+ Oriya (or)
+ Spanish (es)
+ Thai (th)
+
+
+Overview of Changes from GLib 2.13.0 to GLib 2.13.1
+===================================================
+
+* GRegex:
+ - Portability fixes
+ - Split into immutable GRegex and GMatchInfo
+ - Add g_regex_get_max_backref() and g_regex_get_capture_count()
+ to obtain information about the compiled regex
+
+* GKeyFile:
+ - Fix roundtrip problems
+ - Add g_key_file_load_from_dirs()
+
+* Unicode support:
+ - Fix corner cases in case conversion routines
+
+* GOption:
+ - Add a function to get the formatted help string
+
+* GHash:
+ - Add new functions g_hash_table_get_keys() and
+ g_hash_table_get_values() to retrieve the keys and
+ values in list form
+
+* Updated transations:
+ Simplified Chinese (zh_CN)
+ Arabic (ar)
+
+
+Overview of Changes from GLib 2.12 to GLib 2.13.0
+=================================================
+
+* Add GSequence, a list that is implemented using
+ a balanced binary tree.
+
+* Add GRegex, an implementation of Perl regular expressions,
+ based on PCRE.
+
+* Use Posix monotonic clocks instead of gettimeofday()
+ for GTimer when available.
+
+* Support static initialization of GQeues with G_QUEUE_INIT,
+ g_queue_init() and g_queue_clear().
+
+* Add g_string_chunk_clear() for clearing a
+ GStringChunk.
+
+* Add g_unichar_get_script() to obtain Unicode
+ script information.
+
+* Add g_unichar_iszerowidth() to obtain information
+ about zero-width characters.
+
+* Add G_GNUC_MAY_ALIAS which wraps the gcc may_alias
+ type attribute.
+
+* G_GNUC_INTERNAL has a working definition for the
+ Sun Studio compiler. This requires the macro to
+ be positioned before the function declaration.
+
+* The slice allocator can produce detailed debugging
+ information with G_SLICE=debug-blocks.
+
+* Modules support G_DEBUG flags resident-modules and
+ bind-now-modules.
+
+* Add G_DEFINE_DYNAMIC_TYPE() to make it easier
+ to define types in modules.
+
+* Bug fixes: too many to list them in detail here.
+
+* New and updated translations (be,bg,bn,ca,cs,de,
+ en_CA,en_GB,et,fa,fr,he,hu,it,ja,ku,lt,mg,mk,ml,
+ nb,ne,nn,pt,pt_BR,ro,sr,sr@Latn,sv,ta,uk,vi,zh_CN,
+ zh_HK,zh_TW)
+
+
+Overview of Changes from GLib 2.12.1 to GLib 2.12.2
+===================================================
+
+* Unicode updates:
+ - Normalization is following Unicode TR #29
+ - g_unichar_isxdigit() only accept characters
+ for which g_unichar_xdigit_value() returns a value
+ - g_unichar_toupper and g_unichar_tolower leave
+ unconvertable characters in place instead of
+ replacing them by NUL
+
+* Bugs fixed
+ 348491 g_utf8_strup() and g_utf8_strdown() returns
+ string with NUL bytes
+ 349825 GKeyFile always inserts a newline before a group
+ 347842 g_unichar_isxdigit() is too general about what
+ it considers a digit
+ 348694 g_utf8_normalize() hasn't been updated to PR #29
+ 348785 Hint about G_DEBUG in Message Logging docs
+ 349792 Wrong english string (UI)
+ 349952 gparamspecs.c uses gcc feature
+
+* Translation updates (ca,cs,de,dz,es,eu,fi,gu,ko,
+ nl,pl,tr,uk,zh_HK,zh_TW)
+
+
+Overview of Changes from GLib 2.12.0 to GLib 2.12.1
+===================================================
+
+* Update to final Unicode Character Database 5.0.0
+
+* Bugs fixed:
+ 346660 issues with base64 api documentation / g_base64_decode_cl...
+ 348136 Coverity reports allocation of wrong size CID #2839
+ 336281 Update to UCD 5.0
+ 346197 g_date_strftime %F option doesnt work for win32
+ 348011 Small optimization to real_toupper()
+ 246494 prototype mismatch in glib/gconvert.c
+
+* New and updated translations (bg,bn_IN,ca,dz,eu,fi,
+ fr,he,it,ja,mk,or,pt)
+
+
+Overview of Changes from GLib 2.11.4 to GLib 2.12
+=================================================
+
+* Bugs fixed:
+ 344905 leap-year bug in g_time_val_from_iso8601 w/o HAVE_TIMEGM
+
+* Updated translations (cy,nb,nl)
+
+
+Overview of Changes from GLib 2.11.3 to GLib 2.11.4
+===================================================
+
+* GBookmarkFile:
+ - g_bookmark_file_remove_item returns a boolean
+
+* g_mkstemp accepts the XXXXXX in the middle of
+ the template
+
+* Bugs fixed:
+ 344868 g_key_file_to_data should separate groups
+
+* Updated translations (de,es,fr,gu,hi,ko,th)
+
+
+Overview of Changes from GLib 2.11.2 to GLib 2.11.3
+===================================================
+
+* GBookmarkFile:
+ - g_bookmark_file_move_item: Return TRUE in case of
+ an empty target
+
+* Bugs fixed:
+ 343919 gunicollate.c: strxfrm bug on VC8
+
+* Updated translations (fi)
+
+Overview of Changes from GLib 2.11.1 to GLib 2.11.2
+===================================================
+
+* Add g_ascii_stroll to parse signed 64bit integers
+
+* GMarkup: add a flag to treat CDATA as text
+
+* GHashTable: add functions to remove all entries
+
+* GMainLoop: add functions to find the currently
+ running source, and determine if it is destroyed
+
+* Bug fixes:
+ 342563 g_atomic_thread_init() needs to be called before
+ other _g_*_thread_init() functions
+ 343548 Potential use after free in callers of g_string_free()
+ 168538 Wish: Clearing contents of GHashTables
+ 321886 GTK+ cannot be reliably used in multi-threaded
+ applications
+ 341826 goption.c: 'strtoll' is C99's function
+ 343899 g_ascii_formatd dosn't work as expected for all
+ format strings
+ 317793 Make GEnumValue strings const
+ 337129 Compile warnings in G_IMPLEMENT_INTERFACE
+ 303622 What is G_TYPE_CHAR?
+
+* Updated translations (bg,dz,eu,gl,ja,ko,nl,th,vi)
+
+
+Overview of Changes from GLib 2.11.0 to GLib 2.11.1
+===================================================
+
+* GOption
+ - Support 64-bit integers
+ - Allow optional text before and after the options
+ in help output
+
+* Bug fixes:
+ 340538 gbase64-test writes OOB
+ 340816 GKeyFile set_string_list invalid memory reads
+ 339105 g_key_file_parse_value_as_double
+ 340434 convert-test.c fails (function test_one_half)
+ 311043 Memory leaks (and potential infinite loops)
+ when using G_ERRORCHECK_MUTEXES
+ 335198 Error checking mutexes are fubar
+ 341237 Add a G_OPTION_ARG_INT64
+ 341192 g_io_channel_set_flags not implemented on win32
+ 336120 Allow adding description before/after GOption
+ --help output body
+ 341191 misplaced check in g_relation_delete
+ 340530 mismatched calloc / g_free in win32 threads
+
+* Updated translation (es)
+
+Overview of Changes from GLib 2.10.x to GLib 2.11.0
+===================================================
+
+* GBookmarkFile: a parser for files containing bookmarks
+ stored using the Desktop Bookmark specification.
+
+* Base64 encoding support
+
+* Unicode 5.0 support
+
+* GOption supports floating point numbers
+
+* GKeyFile supports floating point numbers
+
+* Bug fixes:
+ 155884 gatomic.c should be based on new SDK
+ 157877 update-desktop-database doesn't handle duplicate entries
+ 164719 keyfile parser doesn't support floats
+ 327662 Import BookmarkFile from libegg
+ 329548 Add G_OPTION_ARG_DOUBLE
+ 329789 option-test.c type confusion
+ 332841 Segmentation Fault when %llu is passed to vasnprintf and
+ HAVE_SNPRINTF is not defined
+ 333879 gthread/gthread-win32.c: IsDebuggerPresent needs '#define
+ _WIN32_WINDOWS 0x0401'
+ 333916 g_timer_elapsed docs should mention that microseconds
+ may be NULL
+ 334440 dlerror() portability issue causes crash on (old) a.out
+ NetBSD platform
+ 334646 goption + error out params
+ 334799 g_remove() must check return value of remove()
+ 334943 make check FAIL: threadpool-test
+ 335215 Some breakages with GThreadPool
+ 336085 g_option_context_new parameter lacks better explanation
+ 336677 Documentation for g_object_ref_sink() is incorrect
+ 337027 gbookmarkfile.c: sys/time.h include error
+ 337553 Wrong escaping of URIs
+ 338572 Dereferencing NULL value in g_key_file_get_group_comment
+ 338845 g_completion_complete_utf8 crashes when NULL is passed to it
+ 339337 g_bookmark_file_set_description
+ 339338 gbookmarkfile.c, function expand_exec_line
+ 339340 gbookmarkfile.c, function bookmark_app_info_dump
+
+* Translation updates (bg,en_GB,et,gl,gu,he,hi,ka,nb,nl,nn,
+ or,pt_BR,ro,tr,vi,zh_CN)
+
+
+Overview of Changes from GLib 2.10.0 to GLib 2.10.1
+===================================================
+
+* Bugs fixed:
+ 314794 Broken pthread detection on Darwin [Gregor Riepl]
+ 322476 Missing check for .dylib [Vladimir Panov]
+ 333651 Inconsistent _g_charset_get_aliases prototype [Julio
+ M. Merino Vidal]
+ 333761 GInitiallyUnowned breaks application code [Sven Herzberg]
+
+* Win32 changes:
+ - Fix g_listenv() implementation.
+ - Allow up to 100 GPrivate structs
+
+* Translation updates (fr,hu,lt,pl,sv)
+
+
+Overview of Changes from GLib 2.9.6 to GLib 2.10.0
+==================================================
+
+* Bugs fixed:
+ 328997 64bit pointer trunction in glib slab-allocator
+ [Pascal Hofstee]
+ 331110 g_cond_broadcast(inform_cond) without holding
+ inform_mutex [Chris Wilson, Sebastian Wilhelmi]
+ 332093 Fix some leaks in the tests [Kjartan Maraas]
+ 332435 g_utf8_strlen returns wrong value if a maximum
+ number of bytes to check is specified
+ [Matthias Clasen]
+ 331367 gslice requires more POSIX-like semantics for
+ GPrivate destructors [Tor Lillqvist]
+
+* Documentation improvements [Matthias, Kang Jeong-Hee,
+ Tor Lillqvist, Stefan Kost]
+
+* Translation updates (el,eu,ka,uk)
+
+Overview of Changes from GLib 2.9.5 to GLib 2.9.6
+=================================================
+
+* Bugs fixed:
+ 329124 distclean removes README [Kjartan Maraas, Tim Janik]
+ 317679 GRelation field type not documented [Behdad Esfahbod]
+ 329123 Typo in GTime docs [Kjartan Maraas]
+
+* Documentation improvements [Sven Herzberg, David
+ Schleef, Kjartan Maraas, Behdad Esfahbod]
+
+* Translation updates (cs,cy,it,ko,pt,sq,sr,sr@Latn,ru
+
+Overview of Changes from GLib 2.9.4 to GLib 2.9.5
+=================================================
+
+* Memory management:
+ Runtime debugging support: The slice allocator
+ can be turned off by setting G_SLICE=always-malloc
+ in the environment. Zeroing of freed memory can
+ now be turned on at runtime by setting
+ G_DEBUG=gc-friendly in the environment. [Tim Janik]
+
+* Bugs fixed:
+ 328253 HP-UX/IA-64 uses ".so" as default shared library
+ extension [Albert Chin]
+ 143380 unicode-encoding test fails converting to UTF-16
+ with libiconv [Marc Moorcroft]
+ 328254 Build breakage (GSlice) [Jens Ganseuer]
+ 328705 C99ism in glib/gmem.c [Kazuki Iwamoto]
+
+* Translation updates (da,et,zh_CN)
+
+Overview of Changes from GLib 2.9.3 to GLib 2.9.4
+=================================================
+
+* Type system:
+ Fix a problem with g_object_compat_control() which
+ can lead to segfaults in GTK+ applications on 64bit
+ platforms.
+
+* Thread suppport:
+ Unused threads now fall back to the global pool after
+ 500 milliseconds, where they wait for another
+ max-idle-time milliseconds. [Sebastian Wilhelmi]
+
+* Fix a memory allocation problem in GKeyFile. [Morten
+ Welinder]
+
+
+Overview of Changes from GLib 2.9.2 to GLib 2.9.3
+=================================================
+
+* GTree:
+ - Replace the simple recursive implementation by
+ a nonrecursive, threaded one [Maurizio Monge]
+
+* Change g_filename_display_name and
+ g_filename_display_basename to use the Unicode
+ replacement character U+FFFD instead of a question
+ mark, and don't append "(invalid encoding)" [Matthias]
+
+* Documentation improvements [Sven Herzberg, Federico
+ Mena Quintero, Stefan Kost]
+
+* Bugs fixed:
+ 323937 gslice.c in glib 2.9.1 doesn't build on Mac OS X
+ [Bogdan Nicula]
+ 326558 Some test failures on IRIX 6.5 [Daichi Kawahata]
+ 169285 "threaded" tree implementation for GTree
+ [Maurizio Monge]
+ 326747 g_filename_display_basename adds (invalid encoding)
+ [Alberto Ruiz]
+
+Other contributors: Christian Kellner, Murray Cumming
+
+New and updated translations (bg,ca,de,es,et,gu,ja,nl,th,vi)
+
+
+Overview of Changes from GLib 2.9.1 to GLib 2.9.2
+=================================================
+
+* Memory management:
+ - Add tests for cache colorization [Tim Janik]
+ - Minimize space consumption if small amounts of differently
+ sized slices are allocated, at a small performance cost. [Tim]
+
+* Thread support:
+ - Add g_atomic_pointer_set() and g_atomic_int_set() [Tim Janik,
+ Sebastian Wilhelmi]
+ - Add g_thread_pool_set_sort_function() to allow sorting the
+ tasks of a threadpool. [Martyn Russell]
+ - Add g_thread_pool_set_idle_time() to allow unused threads
+ to exit after a certain time. [Martyn]
+
+* Type system:
+ - introduce a new type GInitiallyUnowned, which has an initial
+ floating reference. [Tim]
+ - Add support for GType parameters. [Matthias]
+
+* Main loop:
+ - Add g_main_context_is_owner() to determine if the current
+ thread is the owner of the context. [Michael Meeks]
+
+* Provide g_access(), g_chdir(), g_unlink(), g_rmdir() as
+ wrapper functions instead of macros. [Manish Singh]
+
+* Documentation improvements [Tim, Matthias, Federico Mena Quintero,
+ Stefan Kasal, Dan Williams]
+
+* New and updated translations (en_CA,fi,fr,gl,ml,nb,no,zh_HK,zh_TW)
+
+* Bugs fixed:
+ 324179 g_allocator_new() returns pointer to const dummy which Gtk+ 2.8
+ tries to modify [J. Ali Harlow]
+ 324332 g_option_context_parse() returns false without setting error
+ [Tim-Philipp Müller]
+ 324950 GLIB 2.9.1 testcase errors [Dan Yefimov]
+ 325015 gslice.c: process.h is needed on Windows [Kazuki Iwamoto]
+ 321978 G_DATALIST_GET_FLAGS() macro is not casting datalist to
+ gpointer [Andrew Paprocki]
+ 316221 G_LOCK warns about breaking strict-aliasing [Michal Benes,
+ Stanislav Brabec]
+ 325273 Error in documentation for glib_check_version () [Declan Naughton]
+ 325310 g_spawn_sync hangs when catching both stdout and
+ stderr [Tor Lillqvist]
+ 325249 gcc warning when using g_rmdir from <glib/gstdio.h> [Jani Monoses]
+ 325864 glib/gthreadpool.c:"#define debug(...)" is C99 [Kazuki Iwamoto]
+ 325874 Should say somewhere that source IDs are > 0 [Dan Williams]
+ 325438 a typo (compatability) [Stefan Kasal]
+ 323937 gslice.c in glib 2.9.1 doesn't build on Mac OS X [Bogdan Nicula]
+
+
+Overview of Changes from GLib 2.9.0 to GLib 2.9.1
+=================================================
+
+* Memory management
+ - The slice allocator is implemented [Tim Janik]
+ - g_slice_free_chain() has been renamed to
+ g_slice_free_chain_with_offset() [Tim, Behdad Esfahbod]
+ - Mem chunks are deprecated [Matthias Clasen]
+
+* Data structures
+ - Hash tables are refcounted, and have a boxed type [Tim]
+
+* Thread support
+ - Support for Solaris threads has been removed
+ [Sebastian Wilhelmi, Andrew Paprocki]
+ - g_async_queue_sort(), g_async_queue_push_sorted() have
+ been added to allow GAsyncQueue to be used as a priority
+ queue, together with the corresponding _unlocked
+ variants [Martyn Russell]
+
+* GObject:
+ - The concept of a floating initial reference has been
+ moved from GtkObject to GObject [Tim]
+
+* Win32 changes:
+ - Make g_rename() replace existing files [Tor Lillqvist]
+
+* Misc new API:
+ - G_GUINT64_CONSTANT macro to define guint64
+ constants [Andrew Paprocki]
+ - G_GNUC_WARN_UNUSED_RESULT macro to instruct the
+ compiler to emit a warning if the value returned
+ by a function is ignored. [Arjan van de Ven, Alex Larsson]
+ - GList and GSList now have sort functions which take an
+ extra user data argument [Martyn Russell]
+ - g_param_spec_ref_sink() has been added for consistency [Tim]
+
+* $LOGNAME is respected when determining user data. [Laszlo Peter]
+
+* Other changes and bug fixes [Tim, Matthias, Behdad,
+ Christian Persch, Benedikt Meurer, Andrew Paprocki,
+ Kazuki Iwamoto, Alexis S. L. Carvalho, Stanislav Brabec,
+ Andreas Schwab, Kalle Vahlman]
+
+* Documentation
+ - Deprecation warnings carry version information [Matthias]
+ - The slice allocator has been documented [Matthias, Tim]
+ - Other improvements [Morten Welinder]
+
+Overview of Changes from GLib 2.8.x to GLib 2.9.0
+=================================================
+* Unicode support:
+ - The Unicode tables have been updated to Unicode 4.1,
+ adding several new values to the GUnicodeBreakType
+ enumeration. This breaks Pango <= 1.10
+ [Behdad Esfahbod]
+ - The various Unicode character predicate functions
+ (g_unichar_isalpha, g_unichar_isdigit,...) have
+ been optimized
+ [Behdad]
+ - g_utf8_pointer_to_offset, g_utf8_offset_to_pointer:
+ These functions handle negative offsets now, and
+ going backwards in g_utf8_offset_to_pointer uses
+ "stutter stepping".
+ [Larry Ewing, Matthias Clasen]
+
+* Memory management:
+ - Mem chunks are no longer used internally in GLib and
+ GObject. GMemChunk will be deprecated in GLib 2.10
+ - All APIs based on GAllocator (g_list_push/pop_allocator,
+ and similar push/pop_allocator functions for other
+ data structures) have been deprecated, since they
+ never worked as intended.
+ - The g_slice_* functions have been added as a
+ new API for fast allocation of small memory blocks.
+ The implementation in GLib 2.9.0 is just a simple
+ wrapper around malloc. GLib 2.10 will have an
+ efficient and scalable implementation.
+ [Tim Janik, Matthias]
+
+* Pattern matching:
+ - g_pattern_match has been optimized to avoid
+ unnecessary recursion.
+ [Tim, Matthias]
+
+* g_intern_string, g_intern_static_string:
+ - New functions to intern strings. These are now used
+ by GObject to avoid duplicating static strings
+ [Matthias]
+
+* g_thread_foreach:
+ - New function to iterate over all GThreads
+ [Tim, Matthias]
+
+* g_date_set_time_t, g_date_set_time_val:
+ - New functions to set a GDate from a time_t or
+ GTimeVal value. g_date_set_time has been deprecated
+ in favor of these.
+ [Roger Leigh]
+
+* g_snprintf and g_vsnprintf:
+ - These functions are no longer declared in gprintf.h,
+ since they are in glib.h
+ [Matthias]
+
+Overview of Changes from GLib 2.8.0 to GLib 2.8.1
+=================================================
+* Optimize single-character insertions in GString [Ross Burton]
+* Fix build problems on OS X
+* Fix build problems on Win32 [Tor Lillqvist, Hans Breuer]
+* Other bug fixes [Matthew F. Barnes, Stepan Kasal]
+* Documentation improvements [Tristan van Berkom, Behnam
+ Esfahbod, Gustavo Carneiro, Stepan Kasal, Matthias]
+* New and updated translations (ca,cy,ko,ro,uk)
+
+Overview of Changes from GLib 2.7.7 to GLib 2.8.0
+=================================================
+* Make g_value_transform() handle enum values
+ correctly on ppc64. [Michael Lorenz]
+ (Third-party code accessing enumeration values
+ in GValues should also be changed to access
+ v_long, not v_int, in order to work on bigendian
+ 64bit machines.)
+* Make g_flags_get_first_value() handle a value
+ of 0 meaningfully. [Tim-Philipp Müller]
+
+Overview of Changes from GLib 2.7.6 to GLib 2.7.7
+=================================================
+* Make atomic operations on s390 work [Matthias]
+* Fix C++ guards in gstdio.h [Tor Lillqvist]
+
+Overview of Changes from GLib 2.7.5 to GLib 2.7.6
+=================================================
+* Add native implementations of atomic operations
+ on s390 [Matthias]
+* Make atomic reference counting of closures
+ work on s390 [Matthias]
+* Avoid an infinite loop in g_convert_with_iconv().
+ [Sebastian Bacher]
+* Documentation improvements [Ross Burton]
+
+Overview of Changes from GLib 2.7.4 to GLib 2.7.5
+=================================================
+* Thread-related changes
+ - Fix build issues on HP-UX [Paul Cornett]
+ - Threadsafe access to flags stored in datasets [Tim Janik]
+ - Fix several issues with atomic refcounting for
+ closures, objects and paramspecs [Tim]
+ - Improve tests for atomic refcounting changes [Tim]
+* Fix handling of stateful encodings in g_convert_* [Matthias]
+* Fix translation of GOption help output [Dan Winship]
+* Catch format errors in translations. This may cause
+ "make check" to fail when using older versions
+ of gettext [Matthias]
+* Win32 bug fixes [Tor Lillqvist]
+* Documentation improvements [Ross Burton, Jochen Baier,
+ Matthias, Tim]
+* New and updated translations (de,fi,gu,pl,pt,tr,zh_TW)
+
+Overview of Changes from GLib 2.7.3 to GLib 2.7.4
+=================================================
+* Fix g_atomic_pointer_compare_and_exchange
+ on Sparc64 [Gert Doering]
+* Fix a hang in g_thread_pool_free. [Hong Jen Yee]
+* Win32 bug fixes [Tor Lillquist]
+* Other bug fixes [Benoit Dejean, Manish Singh]
+* Documentation improvements [Bryan Silverthorn,
+ Callum McKenzie]
+* New and updated translations (de,lt,sq,zh_CN)
+
+Overview of Changes from GLib 2.7.2 to GLib 2.7.3
+=================================================
+* GOption
+ - Allow callbacks with optional arguments [Pawel Sliwowski]
+ - Allow to turn off the automatic long option name
+ disambiguation [Adam McLaurin]
+ - Only allow printable ASCII as short option names [Matthias]
+* Win32
+ - Build fixes [Tor Lillqvist]
+ - Rewrite iochannel socket implementation [Tor]
+* GObject
+ - Threadsafety improvements; in particular, refcounting
+ of objects is done atomically now. [Wim Taymans, Tim Janik]
+* Bug fixes [Morten Welinder, Matthias, Wim Taymans]
+* Documentation improvements [Richard Laager, Matthias]
+* New and improved translations (bf,cs,hu,nb,nl,no)
+
+Overview of Changes from GLib 2.7.1 to GLib 2.7.2
+=================================================
+* Win32 build fixes [Hans Breuer]
+* Bug fixes [Mikael Magnusson]
+* Documentation improvements [Matthias Clasen]
+* New and updated translations (en_CA,es,et,ja,sr,sr@Latn,zh_TW)
+
+Overview of Changes from GLib 2.7.0 to GLib 2.7.1
+=================================================
+* GOption
+ - Allow callback arguments without parameters [Dan Winship]
+* GMappedFile: an mmap wrapper [David Schleef, Behdad Esfahbod]
+* Misc new functions:
+ - g_get_host_name [Tor Lillqvist]
+ - g_mkdir_with_parents [Tor]
+ - g_build_pathv, g_build_filenamev [Todd A. Fisher,
+ Matthias Clasen]
+* Bug fixes [Roger Leigh, Masatake YAMATO, Kjartan Maraas,
+ Manish Singh, Tor, Murray Cumming, Kian Duffy, Morten Welinder]
+* Documentation improvements [Hong Gang XU, Dan Winship, Matthias]
+* New and updated translations (bg,cs,da,en_CA,es,et,nb,nl,no,
+ sk,th,zh_TW)
+
+Overview of Changes from GLib 2.6.x to GLib 2.7.0
+=================================================
+* GKeyFile
+ - Add unit tests [Matthias Clasen, Suren A. Chilingaryan]
+ - Accept \r\n as line end [Bastian Nocera]
+ - Don't interpret leading zeros as octal numbers. [Matthias]
+ - Make key and group removal work [David Hoover, Matthias Hasselmann]
+* GOption
+ - Improve formatting of --help output [Matthias, Noah Levitt]
+ - Accept -? [Matthias]
+ - Warn about duplicate main groups [Jeff Franks]
+ - Treat '-' as non-option argument [Tim Musson, Thomas Leonard]
+ - Report missing arguments as errors [Björn Lindqvist]
+ - Add a boxed type for GDate [Tim-Philipp Müller]
+* GTree
+ - g_tree_remove() and g_tree_steal() return status information [Matthew F. Barnes]
+* Stdio wrappers
+ - Work regardless of large file support [Manish Singh]
+ - Add g_access(), g_chmod(), g_creat(), g_chdir [Tor Lillqvist]
+* GObject
+ - Implement "toggle references" to help language bindings [Owen Taylor]
+ - Allow to mark names, nicks and blurbs of pspecs as static [Ben Maurer, Matthias]
+ - Make pspec lookup a bit faster [Morten Welinder]
+* Add g_listenv() to list all set environment variables [Hans Petter Jansson]
+* Add g_file_set_contents() to atomically write a file. [Søren Sandmann,
+ Sven Neumann, Manish, Alexis S. L. Carvalho]
+* Add g_try_malloc(), g_try_new(), g_try_new0() and g_try_renew() [Stefan Kost]
+* Add g_utf8_collate_key_for_filename() to sort filenames taking
+ extensions and numeric suffixes into account. [Ole Laursen, Alex Larsson]
+* Add G_GNUC_NULL_TERMINATED to mark varargs function with
+ NULL-terminated argument lists. [Marc Meissner]
+* Win32 changes
+ - Improved debugability [Ulf Lamping, Hans Breuer]
+ - Make filename handling more robust [Tor, Billy Skaggs]
+ - Improve g_get_system_data_dirs() [Tor]
+ - Use more precise timers [Tor]
+ - Build fixes [Kazuki Iwamoto, Hans, Tor, Robert Ögren]
+* Other bug fixes [Roger Leigh, Owen, Matthias, Morten, Kjartan Maraas,
+ Pawel Sakowski, Tor, Simon Budig, Ed Avis, Manish, Nicolas Laurent,
+ Bastien, Fabrício Barros Cabral, Michael Banck, Daniel Atallah,
+ J. Ali Harlow, Tim Janik, Hazael Maldonado Torres, Sven, Jon-Kare Hellan,
+ Dave Benson, Tommi Komulainen, Benjamin Otte, Brian Cameron, Changwoo Ryu,
+ Christian Biere, Noah, Benoît Carpentier]
+* Documentation improvements [Vincent Untz, Matthias, Tim-Philipp Müller,
+ Morten, Matthew, Federico Mena Quintero, Sebastian Bacher, Oliver Sessink,
+ Stefan, Jared Lash, Tor, Owen, Daniel Vaillard, Mathieu Lacage]
+* New and updated translations (ca,cs,da,el,en_CA,en_GB,es,et,eu,fa,fr,gl,
+ hu,id,it,lt,mn,ne,nl,pl,pt,pt_BR,ro,rw,sk,sq,sr,sr@Latn,tl,uk,xh,zh_CN)
+
+Overview of Changes from GLib 2.6.0 to GLib 2.6.1
+=================================================
+* GOption
+ - Make gtk_init(NULL, NULL) work again [Marcin Krzyzanowski]
+ - Improve handling of -- [Matthias Clasen]
+ - Don't show G_OPTION_REMAINING in --help output [Matthew F. Barnes]
+* g_find_program_in_path() doesn't return directories [Tommi Komulainen]
+* Add gmodule-export-2.0.pc [Matthias]
+* Win32 changes
+ - Improve hangling of UNC paths [Tor Lillqvist]
+ - g_getenv(), g_setenv(), g_unsetenv(), g_find_program_in_path()
+ take and return UTF-8 now [Tor]
+ - Make g_file_test() work more reliably, and use PATHEXT
+ when check for executables [Tor]
+ - Build and cross-compilation fixes [J. Ali Harlow]
+* Other bug fixes [Jens Hatlak, Morten Welinder,
+ Tor, Kalpesh Shah, Adrian Bunk]
+* Documentation improvements [Marcin Krzyzanowski, Tor, Crispin
+ Flowerday, Mariano Suárez-Alvarez, Christian Biere, Danny Milo,
+ Vincent Untz, Bastien Nocera]
+* New and updated translations (cy,de,nl,ru,sq,sv)
+
+Overview of Changes from GLib 2.4.x to GLib 2.6.0
+=================================================
+
+* Major new APIs
+ - GOption, a commandline option parser
+ - GKeyFile, a parser/editor for the .ini like files
+ - Functions to support the XDG basedir specification
+ - Wrappers for common POSIX pathname functions to handle filename
+ encodings consistently. On Windows, these use UTF-8.
+
+* Miscellaneous new functions
+ - g_filename_display_name() converts filenames in displayable UTF-8 strings
+ - g_uri_list_extract_uris() splits uri lists
+ - g_date_get_iso8601_week_of_year() gets ISO 8601 week numbers
+ - g_log_set_default_handler() installs an alternate default log handler
+ - g_get_language_names() obtains a list of applicable locale names
+ - g_strv_length() calculates the length of NULL-terminated string arrays
+ - g_win32_get_windows_version() determines the Windows version
+ - G_GNUC_INTERNAL marks functions as non-exported
+ - glib_check_version() checks the GLib version at runtime
+ - g_debug() completes the family of logging functions
+
+* Performance improvements
+ - Optimize g_utf8_validate()
+ - Optimize g_markup_parse_context_parse()
+ - Reduce signal connection complexity from O(n) to O(1)
+ - Get rid of many PLT entries for internally used exported symbols
+ - Reduce code size by removing literal strings from g_return_if_fail()
+
+* Other changes
+ - On Windows, GLib functions that take file name arguments now require
+ those to be in UTF-8. Functions that return file names return UTF-8.
+ - Use higher precision for mathematical constants
+ - Don't convert to/from UTF-8 in g_filename_to_uri/g_filename_from_uri
+ - Support ll as printf format modifier for long long on all platforms
+ - Clean up the ABI and enforce the list of exported symbols
+ - Add a .pc file for using gmodule in libraries
+ - Require ngettext
+
+Overview of Changes from GLib 2.5.7 to GLib 2.6.0
+=================================================
+* GOption: Don't list help options if group-specific
+ options have been requested [Glynn Foster]
+* Make g_get_language_names() track locale changes [Christian Persch]
+* Win32 bug fixes [Tor Lillqvist]
+* Bug fixes [Philippe Blain, Owen Taylor, Sebastian Wilhelmi]
+* New and updated translations (da,es,ja,lt,zh_CN)
+Bugs fixed: 159530,100697,160271,160645,157255
+
+Overview of Changes from GLib 2.5.6 to GLib 2.5.7
+=================================================
+* Optimize g_utf8_validate() [Owen Taylor, Matthias Clasen]
+* Optimize g_markup_parse_context_parse() [Havoc Pennington,
+ Morten Welinder]
+* Reduce signal connection complexity from O(n) to O(1)
+ [Sven Neumann]
+* Add a .pc file for using gmodule in libraries [Owen]
+* Add G_GNUC_MALLOC to mark functions returning newly
+ allocated memory [Matthias]
+* Win32 bug fixes [Hans Breuer, Tor Lillqvist, Robert Ögren,
+ Bruce Hochstetler]
+* Bug fixes [Kazuki IWAMOTO, Matthias, Manish Singh, Morten,
+ Frederic Crozat, Tor]
+* Documentation improvements [Matthias, Tor, Owen]
+* New and updated translations (cs,da,de,en_CA,en_GB,es,nb,nl,sq,zh_CN)
+
+Overview of Changes from GLib 2.5.5 to GLib 2.5.6
+=================================================
+* GOption
+ - Add G_OPTION_FLAG_REVERSE to allow options
+ which unset a boolean variable [Tor Lillqvist]
+* GChildWatch
+ - Use sigaction instead of signal [Jonas Jonnson,
+ Archana Shah]
+ - Make the very first SIGCHLD work [Gustavo Carneiro]
+* Bug fixes [Morten Welinder, Tor, David MacLachlan,
+ Manish Singh, J. Ali Harlow]
+* Documentation improvements [Matthias Clasen, Tor]
+* Updated translations (da,ja,tr,zh_CN)
+
+Overview of Changes from GLib 2.5.4 to GLib 2.5.5
+=================================================
+* GKeyFile
+ - Cleanups, add more error checking [Ray Strode]
+ - Fall back to the untranslated string when getting
+ locale strings [Mark McLoughlin]
+* GOption
+ - Document GOption [Matthias Clasen]
+ - Better support for rest arguments [Owen Taylor, Matthias]
+ - Handle conflicts between groups [Matthias]
+* Add g_lstat() to the stdio wrappers [Tor Lillqvist]
+* Add g_filename_display_name() to convert filenames
+ in displayable UTF-8 strings [Alex Larsson, Matthias]
+* Win32 bug fixes [Kazuki IWAMOTO, Hans Breuer, Tor]
+* Bug fixes [Christophe Fergeau, Morten Welinder,
+ Owen, Kjartan Maraas, Mark]
+* Documentation improvements [Matthias, Tor]
+
+Overview of Changes from GLib 2.5.3 to GLib 2.5.4
+=================================================
+Add GKeyFile, a parser/editor for the .ini like files used in various
+ freedesktop.org specifications. [Ray Strode]
+Make the handling of filename encodings consistent across all
+ GLib functions, introduce wrappers for common POSIX
+ functions which accept the same filename encoding. [Tor Lillqvist,
+ Owen Taylor]
+GOption
+ - Rename g_context_option_error_quark() to a more language-binding
+ friendly name [Murray Cumming]
+ - Accept backslashes in filenames on Win32 [Tor Lillqvist]
+* Strip the internal aliasing prefix IA__ from function names in
+ assertions [Matthias Clasen]
+* Add a function to split uri lists. [Matthias]
+* Win32 bug fixes
+ - Don't open console windows [Tor]
+* Other bug fixes [Philippe Blain, Robert Ögren, Hidetaka Iwai, Matthias,
+ Morten Welinder, Mats-Ola Persson, Tor, Nickolay V. Shmyrev, Kjartan Maraas,
+ Anders Carlsson, Tim-Philipp Müller, Lucas Rocha, Andrea Campi, Manish
+ Singh, Thomas Fitzsimmons, Kazuki IWAMOTO]
+* Documentation improvements [Matthias, Linus Walleij, Nickolay, Philippe,
+ Adam Hooper, Gustavo Carneiro]
+* New and updated translations (cs,en_CA,en_GB,ja,nb,nl,or,sr,sr@Latn,sq)
+
+Overview of Changes from GLib 2.5.2 to GLib 2.5.3
+=================================================
+* GOption
+ - set the program name from argv[0] [Masatake YAMATO]
+ - make contexts work without a main group [Anders Carlsson]
+* Performance
+ - Get rid of many PLT entries for internally used exported symbols,
+ and clean up the ABI at the same time and make make check check the
+ list of exported symbols. [Matthias Clasen]
+* Add API to get ISO 8601 week numbers [Niklas Lundell]
+* Add API to install an alternate default log handler [Darin Adler]
+* Add API to obtain a list of applicable locale names [Hidetoshi Tajima]
+* Reduce code size bloat by removing literal strings from
+ the g_return_if_fail() macros [Owen Taylor]
+* Add g_strv_length [Tim-Philipp Müller]
+* Win32 changes
+ - Add API to determine the Windows version [Tor Lillqvist]
+* Other bug fixes [Stepan Kasal, Anders, Tor, Kazuki Iwamoto,
+ Manish Singh]
+* Documentation improvements [Morten Welinder, Matthias]
+* New and updated translations (es,nn,ro)
+
+Overview of Changes from GLib 2.5.1 to GLib 2.5.2
+=================================================
+* Add G_GNUC_INTERNAL macro [Arjan van de Ven]
+* Add GOption, a commandline option parser [Anders Carlsson]
+* Add glib_check_version [Michael Natterer]
+* Add XDG basedir API [Ray Strode]
+* Require ngettext [Danilo Segan]
+* Bug fixes [Manish Singh, Ray Strode, Vincent Noel,
+ Jon-Kare Hellan, Jody Goldberg]
+* Win32 bug fixes [Tor Lillqvist, Hans Breuer, Peter Zelezny]
+* Documentation improvements [Matthias Clasen, Vincent Untz, Christian Persch]
+* New and updated translations (bs,eu,fi,gu,ne,pa)
+
+Overview of Changes from GLib 2.5.0 to GLib 2.5.1
+=================================================
+
+* Bug fixes [Oliver Guntermann, Sven Neumann, James
+ Henstridge, Hiroyuki Ikezoe, Matthias Clasen, Robert
+ Ögren, Tommi Komulainen]
+* Documentation improvements [Soeren Sandmann,
+ Christophe Fergeau, Danek Duvall]
+* New and updated translations (eu,hi)
+
+Overview of Changes from GLib 2.4.1 to GLib 2.5.0
+=================================================
+
+* New functions g_debug [Sven Herzberg]
+* Use higher precision for mathematical constants [Morten
+ Welinder]
+* Don't convert to/from UTF-8 in g_filename_{to,from}_uri
+ [Federico Mena Quintero]
+* Win32
+ - Handle empty digit string in printf() functions
+ correctly [Tor Lillqvist]
+ - Support ll as format modifier for long long [Tor]
+ - Be more careful about HOME [Tor, Ivan Wong]
+ - Bug fixes [John Ehresman]
+* Miscellaneous bug and portability fixes [Danilo Segan,
+ Owen Taylor, Nikolai Weibull, Benoît Carpentier, Morten
+ Welinder, Manish Singh, Sven Neumann, Julio M. Merino Vidal,
+ Kaz Sasayama, Murray Cumming, Federico, Mariano Suarez-Alvarez]
+* Documentation updates [Matthias Clasen, Crispin Flowerday,
+ Tommi Komulainen, Federico Mena Quintero, Ed Griffiths]
+* New and updated translations (ja,ne,no,wa)
+
+Overview of Changes from GLib 2.4.0 to GLib 2.4.1
+=================================================
+
+* Win32 bug fixes [Tor Lillqvist, Roger Leigh, John Ehresman]
+* Miscellaneous bug and portability fixes [Owen Taylor,
+ Matthias Clasen, Jonas Jonsson, Christian Krause,
+ Nickolay V. Shmyrev, Christophe Saout, Philippe Blain,
+ Piotr Klaban]
+* Documentation updates [Matthias]
+* New and updated translations (ca,cs,cy,el,en_CA,en_GB,es,eu,fi,
+ fr,gu,he,id,nl,pt,pl,ru,sr,sr@ije,sr@Latn,sv,uk)
+
+Overview of Changes from GLib 2.3.6 to GLib 2.4.0
+=================================================
+
+* Handle invalid-UTF-8 in g_log() properly [Matthias Clasen]
+* Win32 bug fixes [Tor Lillqvist, Bruce Hochstetler]
+* Miscellaneous bug and portability fixes [Olivier Biot, David L. Cooper II,
+ Kjartan Maraas, Frédéric L. W. Meunier, Christof Petig, Manish Singh,
+ Sebastian Wilhelmi]
+* Documentation updates [Owen]
+* Updated translations (hr,ro)
+
+Overview of Changes from GLib 2.3.5 to GLib 2.3.6
+=================================================
+
+* GAtomic bug fixes [Sebastian Wilhelmi, Mark McLoughlin]
+* GMain threading fixes and improvements [Sebastian]
+* Win32 [Tor Lillqvist]
+ - restore some symbols extraneously exported from gobject to maintain ABI compatibility
+ - Misc build improvements and fixes [Tor, Cedric Gustin, Hans Breuer]
+* Documentation updates [Sebastian, Takeshi AIHANA, Matthias, Sven Herzberg]
+* New and updated translations (be,es,fi,ga,pa,sr@ije,zh_CN)
+
+Overview of Changes from GLib 2.3.3 to GLib 2.3.5
+=================================================
+
+* Make glib-mkenums parse initializers with macros. [Matthias Clasen, muppet]
+* Respect locale era in g_date_set_parse(). [Theppitak Karoonboonyanan]
+* Add atomic operations and use it for the async queue and
+ gonce implementation. [Sebastian Wilhelmi]
+* Documentation improvements [Sebastian, Matthias, Sven Herzberg]
+* Add g_main_depth() for finding the recursion depth of the main
+ loop [Owen Taylor, Tim Janik, Stefan Westerfeld]
+* Add g_spawn_close_pid(), needed on win32 [J. Ali]
+* Win32 fixes. [Hans Breuer, J. Ali Harlow]
+* Misc bugfixes [Sebastian, Matthias, Balazs Scheidler, Owen]
+* Updated translations (cy,et,ga,sq)
+
+Overview of Changes from GLib 2.3.2 to GLib 2.3.3
+=================================================
+
+* Add a native AIX gmodule implementation. [Laurent Vivier]
+* Add g_node_copy_deep(). [James M. Cape, Matthias Clasen]
+* Extend GQueue API to match the GList API. [Soeren Sandmann]
+* Add g_hash_table_find(). [Tim Janik]
+* Add a G_MODULE_BIND_LOCAL flag. [David Schleef]
+* Inline g_string_append_c() when possible. [Owen Taylor, Tim]
+* Wrap waitpid() as a GSource. [Jonathan R. Blandford]
+* Add g_completion_complete_utf8(). [Theppitak Karoonboonyanan,
+ Matthias]
+* Add g_strsplit_set(). [Soeren]
+* Documentation improvements. [Vincent Untz, Sebastian Wilhelmi,
+ Soeren, Matthias]
+* Win32 build fixes. [Tor Lillqvist]
+* Misc bugfixes [Manish Singh, Noah Levitt, Simon Josefsson,
+ Morten Welinder, Damien Carbery, Julio M. Merino Vidal, Sebastian,
+ Matthias]
+* Updated translations (nn,cs,it,ko,sq,ms,az,hr,uk,sr,sr@Latn,sq,ta)
+
+Overview of Changes from GLib 2.3.1 to GLib 2.3.2
+=================================================
+
+* Add G_MAXSIZE. [Manish Singh]
+* Add g_rand_new_with_seed_array(), g_rand_set_seed_array(),
+ implementing the init-by-array functionality of the
+ original mersenne twister. Add g_rand_copy(). Improve seeding.
+ [George Lebl]
+* Add a lowercase_name option to glib-mkenums. [Murray Cumming]
+* Add g_ptr_array_foreach(). [Matthias Clasen]
+* Add g_timer_continue(). [Tim-Philipp Müller]
+* Fix a threadsafety issue in mem chunks. [Matthias, Balazs Scheidler]
+* Fix g_filename_{to,from}_utf8() on Win32 and improve
+ g_file_test() there too [Hans Breuer]
+* Add a boxed type for NULL-terminated string arrays. [Matthias]
+* Add G_DEFINE_TYPE() plus variants to ease the constuction
+ of GObject boilerplate code. [Tim Janik]
+* Support & in password GECOS field [Matthias, Soeren Boll Overgaard]
+* Documentation improvements [Matthias, Manish]
+* Win32 build fixes [Hans]
+* Misc bug fixes [Damien Carbery, Matthias, Manish, Olivier Poncet,
+ Zack Rusin]
+* Updated translations (ar,de,fa,ga,mn,nn,no,sq)
+
+Overview of Changes from GLib 2.3.0 to GLib-2.3.1
+=================================================
+
+* Add glib/gi18n.h and glib/gi18n-lib.h for common
+ gettext support, including a Q_() macro for translation
+ with context [Matthias Clasen]
+* Add a more flexible G_FILENAME_ENCODING variable
+ as a replacement for G_BROKEN_FILENAMES [Matthias]
+* Fix the return value g_main_context_iterate() for
+ newly ready sources [Padraig O'Briain]
+* Handle Hangul composition for normalization [Noah Levitt]
+* Add G_{MIN,MAX,MAXU}INT{8,16,32}. [Mark Jones, Matthias]
+* Add G_GSIZE_FORMAT/G_SSIZE_FORMAT [Manish Singh]
+* Add G_STRFUNC as a portable wrapper for __func__ [Tim Janik]
+* Documentation improvements [Matthias]
+* GObject [Tim Janik]
+ - Support '-' in g_signal_connect()/disconnect() names
+ like 'swapped-signal'.
+ - Add g_type_class_peek_static() and use to optimize
+ g_object_new() for static types [Tim]
+ - Allow setting construct-only properties from within
+ init() implementations
+ - Enforce readability/writeability in g_object_set/get()
+* Fix bug with g_ascii_strtod and multi-byte separator.
+ [Behdad Esfahbod, Roozbeh Pournader]
+* Misc bug fixes [Matthias, John Ehresman, Andrew Lanoix,
+ Tor Lillqvist, Mark McLoughlin, Tim-Philipp Müller, Manish,
+ Morten Welinder]
+* Updated translations (ca,cs,da,es,fr,ja,nn,no,pt,ru)
+
+Overview of Changes from GLib 2.2.x to GLib-2.3.0
+=================================================
+
+* Replace Trio printf by gnulib vasnprintf [Matthias Clasen]
+* Update Unicode data to Unicode 4.0 [Noah Levitt]
+* Support XML-safe formatted output with
+ g_markup_[v]printf_escaped [Owen Taylor]
+* Add g_file_read_link to read symbolic links [Matthias]
+* Add g_unichar_get_mirror_char to obtain the
+ mirrored variant of a character [Noah]
+* Support for one-time initialization functions.
+ [Sebastian Wilhelmi]
+* Miscellaneous API additions: g_vasprintf
+ g_string_chunk_insert_len, g_setenv, g_unsetenv [Matthias]
+* Docs improvements [Matthias]
+* Add support instance-private data on classed types
+ [Mark McLoughlin, Tim Janik, Owen]
+* Optimize signal emissions [Soeren Sandmann, Tim]
+* Support a "default vtable" per interface [Tim]
+* Add support for properties on interfaces [Owen, Tim]
+* Miscellaneous API additions: g_value_take_string(),
+ g_value_take_param(), g_value_take_object(),
+ g_value_take_boxed(). [Matthias]
+* Win32 build fixes [Tor Lillqvist]
+
+Overview of Changes from GLib 2.1.5 to GLib-2.2.0
+=================================================
+
+* Fix a problem with g_thread_init() on 64-bit problems
+ [Alceste Scalas, Sebastian Wilhelmi]
+* Add assembly implementations of byteswap macros
+ for ia64 and x86_64. [Manish Singh]
+* IOChannel fixes for Win32 [Tor Lillqvist, Thorsten Maerz]
+* Updated translations (bg,ca,es,da,fi,lv,ru,sk)
+
+Overview of Changes from GLib 2.1.4 to GLib-2.1.5
+=================================================
+
+* Win32 bug fixes [Tor Lillqvist]
+* Various post-rewrite fixes for glib-gettext.m4 [Owen Taylor,
+ Jody Goldberg, Kjartan Maraas, Johannes Stezenbach]
+* Ensure we have a GUINT64_FORMAT by pulling in Trio
+ if necessary [Manish Singh]
+* Further Trio build fixes [Matthias Clasen, Owen]
+* Hack around gcc, libtool issues with -pthread [Owen]
+* Docs improvements [Matthias]
+* Bug and portability fixes
+* Updated and new translations (bg,de,fi,fr,sq,fr)
+
+Other contributors: Kai Poitschke, Morten Welinder
+
+Overview of Changes from GLib 2.1.3 to GLib-2.1.4
+=================================================
+
+* autoconf changes to make it possible to cross compile
+ GLib. [Owen Taylor, Dan Kegel, Amy Lin, Dimi Shahbaz,
+ Johannes Stezenbach]
+* Use libintl when it has bind_textdomain_codeset() and
+ GLib doesn't. [Owen]
+* Improve generation of pseudo-random integers [Morten Welinder,
+ Sebastian Wilhelmi]
+* Avoid literal UTF-8 in favor of octal escapes [Owen, Tomas Ogren]
+* Cleanup include order [Sven Neumann]
+* autoconf cleanups and bug fixes [Daniel, Matthias Clasen, Owen]
+* Doc fixes and additions [Matthias]
+
+Other contributors: James M. Cape, Frederic Crozat, Martin Gansser,
+ Phuc LeHong, Manish Singh, Joshua Weage, Morten Welinder
+
+Overview of Changes from GLib 2.0.x to GLib-2.1.x
+=================================================
+
+* Add copy of the Trio library to build and use for printf() when
+ system printf isn't good enough. Add g_printf()/etc. [Matthias Clasen]
+* Add g_str_has_suffix()/g_str_has_prefix() [Alex Larsson]
+* Add g_markup_parse_context_get_element() [Matthias]
+* Add g_utf8_strreverse [Matthias]
+* Add g_ascii_strtoull() [Tim Janik]
+* Support scanning of 64-bit values with GScanner [Tim]
+* Add g_set/get_application_name() [Havoc Pennington]
+* Add G_LIKELY()/G_UNLIKELY() macros for hinting branch probabilities.
+ Use for g_return_if_fail(). [Matthias Clasen]
+* Add G_GNUC_DEPRECATED macro [Tom Tromey]
+* Improve the seeding algorithm of GRandom to avoid problems
+ with certain pathological seeds. Support G_RANDOM_VERSION=2.0
+ environment variable. [Sebastian Wilhelmi]
+* Improve thread configure checks, use -pthread where applicable
+ [Sebastian]
+* Improve handlng of thread priorities [Sebastian]
+* Fix up parameter names that might shadow functions from
+ system headers [Soeren Sandmann]
+* Clean up usage of deprecated functions [Manish Singh]
+* Docs fixes and improvements. In particular, include "Since" information.
+ [Matthias, Soeren, Martin Schulze, Daryll Strauss, Bill Janssen,
+ Owen Taylor, Morten Welinder].
+
+Overview of Changes in GLib 2.0.7
+=================================
+
+* Fix C++ warnings in gtype.h [Dom Lachowicz]
+* Fix g_type_fundamental_next() [Tim Janik]
+* Fix various missing includes of config.h [Morten Welinder]
+* Handle main loop initialization before g_thread_init [Sebastian Wilhelmi]
+* Various 64-bit fixes [Manish Singh]
+* Fix GPoll on Win32 [Tor Lillqvist, Herman Bloggs]
+* Fix bug with buffering on UTF-8 IOChannels [Daniel Elstner]
+* Misc bug and build fixes [Soren Andersen, Gustavo Carneiro, Tor,
+ Tim, Havoc Pennington, Matthias Clasen, Sebastian Rittau,
+ Masahiro Sakai, Arvind Samptur, HideToshi Tajima, Owen Taylor]
+* Updated and new translations (be,cs,de,*fa,it,lv,pt_BR,tr)
+
+Overview of Changes in GLib 2.0.6
+=================================
+
+* Fix problem with interface prerequisites [Jon Trowbridge, Dave Camp]
+* Clean up debug spew from GObject [Anders Carlsson]
+* Compiler warning fixes [David L. Cooper II]
+* Fix some problems with g_build_path() [Guillaume Chazarain, Owen Taylor]
+* Fixes for --disable-debug [Sebastian Wilhelmi]
+* Threading fixes [Sebastian Wilhelmi, Miroslaw Dobrzanski-Neumann,
+ Rajkumar Sivasamy, Laurent Vivier]
+* Documentation fixes [Jacob Berkman, Manuel Clos, Jared Dukat,
+ Sebastian Rittau, Linus Welleij]
+* Misc bug fixes [Anders Carlsson, Sam Couter, Morten Welinder, Owen]
+* Updated translations (bg,ko,vi)
+
+Overview of Changes in GLib 2.0.5
+=================================
+
+* Fix problem with interface prerequisites [Jon Trowbridge, Dave Camp]
+* Clean up debug spew from GObject [Anders Carlsson]
+* Compiler warning fixes [David L. Cooper II]
+* Fix some problems with g_build_path() [Guillaume Chazarain, Owen Taylor]
+* Fixes for --disable-debug [Sebastian Wilhelmi]
+* Threading fixes [Sebastian Wilhelmi, Miroslaw Dobrzanski-Neumann,
+ Rajkumar Sivasamy, Laurent Vivier]
+* Documentation fixes [Jacob Berkman, Manuel Clos, Jared Dukat,
+ Sebastian Rittau, Linus Welleij]
+* Misc bug fixes [Anders Carlsson, Sam Couter, Morten Welinder, Owen]
+* Updated translations (bg,ko,vi)
+
+Overview of Changes in GLib 2.0.4
+=================================
+
+* Fix some 64-bit problems. (George Lebl, David L. Cooper II)
+* Add note about Tru64 iconv to INSTALL. (Manuel Op de Coul)
+* Fix problem with timouts > MAXINT. (Tim Janik, Owen Taylor)
+* Updated translations (ca,es,fr,ja,gl,ms,nl,pl,pt,ru)
+
+Overview of Changes in GLib 2.0.3
+=================================
+
+* Handle sorting 0-length arrays (Ron Arts)
+* Threading fixes (Sebastian Wilhelmi)
+* Portability fixes (Miroslaw Dobrzanski-Neumann, Jacob Berkman, Gareth Pierce,
+ Sebastian, Qingjiang Yuan)
+* Various fixes for glib-2.0.m4. (Jim Gettys, others.)
+* Locate right glib-genmarshal when cross-compiling. (Mitch Natterer)
+* Win32 fixes (Tor Lillqvist)
+* Try to fix g_get_charset() related segfaults. (Owen)
+* Fixes for gettext detection. (Dan Winship, HideToshi Tajima, Boyd Lynn Gerber,
+ Andrew P. Lentvorski, Jr.)
+* Fix g_scanner_unexp_token() (Tim Janik, Sven Neumann)
+* g_markup fixes. (Matthias Clasen.)
+* Bug fixes and cleanups (Daniel Elstner, Matthias, Laszlo Peter, Morten Welinder,
+ Wayne Schuller)
+
+Overview of Changes in GLib 2.0.1
+=================================
+
+* Portability fixes for Sun's Forte compiler [Erwann Chenede]
+* Performance improvements for GObject parameter lookup,
+ g_filename_to/from_utf8() [Alex Larsson]
+* Actually check interface prerequisites [Matthias Clasen,
+ Miroslaw Dobrzanski-Neumann]
+* Fix problem with glib-mkenums taking huge amounts of stack. [Owen Taylor]
+* Fix g_signal_handlers_disconnect_by_func() for C++ [Damien Sandras]
+* Fixes for g_log() and threading.
+ [Sebastian Wilhelmi, Miroslaw Dobrzanski-Neumann, Tim Janik]
+* Make g_print(), g_printerr(), g_warning(), etc, convert from
+ UTF-8 to the encoding of the locale [Sebastian Wilhelmi, Tim]
+* Fixes for GIOChannel on windows. [Tor Lillqvist]
+* Fix gsize/gint mismatches in giochannel.c [Miroslaw Dobrzanski-Neumann]
+* Fix file descriptor leak in g_file_get_contents() [Matthias]
+* Workaround iconv() problems on older Solaris [Lauri Alanko]
+* Fix warnings with gcc-3.1 about asm const [Cody Russel]
+* Minor bug fixes.
+
+Other contributors: Hans Breuer, LEE Sau Dan, Sven Neumann, Salmaso Raffaele,
+ Akira Tagoh, Morten Welinder
+
+
+Overview of Changes in GLib 2.0.0
+=================================
+
+* Thread portability fixes [Sebastian Wilhelmi]
+* Documentation updates [Owen Taylor]
+* Make g_strerror(), g_strsignal() properly return UTF-8,
+ call bind_text_domain_codeset() so that error strings
+ are in UTF-8 as well. [Owen, Tor Lillqvist]
+
+Overview of Changes in GLib 2.0.0 rc1:
+======================================
+
+* Win32 fixes [Tor Lillqvist]
+* Portability fixes [Finlay Dobbie, Miroslaw Dobrzanski-Neumann]
+* Fix up g_date_strftime [Daniel Elstner]
+* Add some structure padding [Tim Janik]
+* Make g_get_homedir() prefer the users home directory to $HOME
+
+Other contributors: Matthias Clasen, Paolo Maggi, Christian Rose
+
+Overview of Changes in GLib 1.3.15:
+===================================
+
+* Speed up marshalers by using private access to GValue
+ [Anders Carlsson, Tim Janik]
+* Reduce GValue to 2 elements [Tim]
+* Add G_DEBUG environment variable, G_DEBUG=fatal_warnings [Matthias Clasen]
+* Fixes for AIX compilation [Miroslaw Dobrzanski-Neumann]
+* Add padding to various structures [Owen Taylor, Tim]
+* Win32 fixes [Tor Lillqvist]
+
+Other contributors: James Henstridge, Ryan Lovett, Morten Welinder,
+ Daniel Elstner
+
+Overview of Changes in GLib 1.3.14:
+===================================
+
+* Register value transformations for gint64, guint64 [Andy Wingo]
+* Build with large-file support [Sven Neumann, Owen Taylor]
+* Fix handling of hostnames in URI's [Darin Adler]
+* Main loop bug fixes [Havoc Pennington, Owen]
+* Doc fixes and improvements [Manish Singh, Tim Janik]
+* Support ' as attribute delimiters in GMarkup [Matthias Clasen]
+* Win32 fixes [Hans Breuer, Tor Lillqvist]
+* Threading bug and build fixes [Sebastian Wilhelmi, Miroslaw Dobrzanski-Neumann]
+* Miscellaneous bug fixes
+
+Other contributors: Matthias Clasen, James Henstridge, Mitch Natterer,
+ Morten Welinder.
+
+Overview of Changes in GLib 1.3.13:
+===================================
+
+* Fix g_filename_to/from_uri for Win32 [Tor Lillqvist, Darin Adler]
+* Miscellaneous win32 fixes [Tor, Hans Breuer]
+* Fix thread options for gcc on AIX [Jerome Zago, Sebastian Wilhelmi]
+* Documentation improvements [Ron Steinke, Matthias, Sebastian]
+* Cache iconv converters as used by g_convert() [Jeffrey Stedfast]
+* Bug fixes [Sven Neumann, Owen Taylor, Matthias Clasen, Jeffrey,
+ Laszlo Peter, Havoc Pennington, Tim Janik]
+
+Overview of Changes in GLib 1.3.12:
+===================================
+
+* Implement closure chaining, fixing up API (Tim Janik)
+* Closure chaining test case (James Henstridge)
+* Make GType long not int where both are equal width (Tim)
+* Win32 fixes and improvements (Hans Breuer, Tor Lillqvist)
+* Fixes for NetBSD. (Dan Winship)
+* Use snprintf() for g_printf_string_upper_bound() where possible. (Matthias Clasen)
+* Save space for GBSearchArray (Tim Janik)
+* Documentation improvements. (Matthias, Sven Neumann, Havoc Pennington)
+
+Other contributors: Darin Adler, Chris Blizzard, Anders Carlson, Daniel Elstner, Michael Meeks,
+ Mark McLoughlin, Dave Neary, Manish Singh, Owen Taylor, HideToshi Tajima,
+ Sebastian Wilhelmi.
+
+
+Overview of Changes in GLib 1.3.11:
+===================================
+
+* Win32 fixes [Hans Breuer, Tor Lillqvist]
+* Documentation improvements [Matthias Clasen]
+* Portable directory handling API [Hans]
+* Threading fixes [Sebastian Wilhelmi, Havoc Pennington]
+* Fix excess relocations in Unicode tables [Andrew Taylor]
+* Fix gpattern for UTF-8 [Matthias Clasen]
+* Support overriding class closures [Tim Janik]
+* Support for derivation from G_TYPE_POINTER [Owen Taylor]
+* Hide pointers to type information inside GType to reduce locking
+ [Alex Larsson, Tim]
+* Adds check for direct inclusion of gobject/*.h [Owen]
+* GObject API cleanups [Tim]
+
+Other contributors: Darin Adler, Jacob Berkman, Daniel Egger, Eric Lemings,
+ Michael Meeks, Mark McLoughlin, Arkadiusz Miskiewicz, Dan Winship
+
+
+Overview of Changes in GLib 1.3.10:
+===================================
+
+* Many Win32 fixes and improvements [Tor Lillqvist]
+* Documentation improvements [Matthias Clasen]
+* g_string_printfa() renamed to g_string_append_printf()
+* Use libcharset from libiconv to implement charset detection
+ more portably. [Owen Taylor, Hidetoshi Tajima]
+* Add 64 bit type support to GObject [Joshua Pritikin, Mathieu Lacage, Owen]
+* Make support for 64 bit integers a requirement [Joshua]
+* GPattern improvements [Tim Janik, Matthias]
+* Locale independent g_ascii_strtod / g_ascii_dtostr [Alex Larsson]
+* Many bug fixes and minor tweaks.
+
+Other Contributors: Darin Adler, Jakub Jelinek, James Antill, Andrew Taylor,
+ Ben Gertzfield, Elliot Lee, Manish Singh, Abel Cheung, Laszlo Peter,
+ Sven Neumann, George Lebl, Raja Harinath, Sebastian Wilhelmi,
+ Jacob Berkman
+
+
+Overview of Changes in GLib 1.3.9:
+==================================
+
+* Fixes for comparison of threads [Sebastian Wilhelmi]
+* Use vasprintf() when possible for g_strdup_printf [Matthias Clasen]
+* Win32 fixes [Tor Lillqvist, Hans Breuer]
+* Add a len argument to g_ascii_strup/strdown
+* Bug, portability fixes, cleanups.
+
+Other Contributors: Darin Adler, Katsuhiro Okuno, Joshua N. Pritikin
+
+
+Overview of Changes in GLib 1.3.8:
+==================================
+
+* Documentation updates [Owen]
+* Made GType interfaces overridable in derived types
+* Many win32 fixes [Tor Lillqvist]
+* Miscellaneous cleanups and fixes
+
+Other contributors:
+ Darin Adler, Matthias Clasen, Ron Steinke, Hans Breuer, Alex Larsson
+
+
+Overview of Changes in GLib 1.3.7:
+==================================
+
+* Integrate GClosure support into the main loop [Owen Taylor]
+* More GSignal convenience functions (macros) [Sven Neumann, Tim Janik]
+* Introduced weak references for GObject [James Henstridge, Sven, Tim]
+* Minor hash table optimizations
+* Main loop and threading improvements [Sebastian Wilhelmi]
+* Added g_ascii_* functions to be used for locale insensitive UTF-8
+ compliant code instead of old string functions [Darin Adler, Alex Larsson]
+* Add functions for Unicode case-conversion, normalization, and
+ collation [Owen]* GString improvements [Owen]
+* Reworked the GIOChannel code [Hidetoshi Tajima, Ron Steinke]
+* Removed glib-config-2.0 in favour of pkgconfig [Sebastian]
+* Make code 64bit clean [Mark Murnane]
+* More G_CONST_RETURN fixes
+* Many improvements to the win32 code [Tor Lillqvist, Hans Breuer]
+* Miscellaneous bug and API fixes
+
+Other contributors:
+ Michael Natterer, Christopher James Lahey, Padraig O'Briain,
+ Matthias Clasen, Josh Pritikin, Steve Baker, Cesar Rincon, Garry R. Osgood,
+ Michael Meeks, Laszlo Peter, Martin Baulig, Kjartan Maraas, Andrew Lanoix,
+ Peter Williams
+
+
+Overview of Changes in GLib 1.3.6:
+==================================
+
+* Threads have a "return value" from g_thread_join
+* Removed ability to adjust thread stack size
+* Prefix warnings with progname/PID by default, change toggle for this to
+ be an env variable G_MESSAGES_PREFIXED not a compile-time option
+* GMarkup speedups
+* GDate const, convenience fixups
+* Include test cases that headers are compilable by C++ compiler
+* Add ability to spawn processes with argv[0] != executable path.
+* g_strstr_len, g_strrstr, g_strrstr_len
+* Add length argument to g_utf8_strchr and g_utf8_strrchr.
+* Misc bug fixes
+
+
+Overview of Changes in GLib 1.3.5:
+==================================
+
+* Added an installed glib-mkenums Perl program for parsing enumeration
+ declarations from header files.
+* Mark some additional deprecated functions.
+* Bug and Portability fixes
+
+
+Overview of Changes in GLib 1.3.4:
+==================================
+
+* Efficiency improvements for GThreadPool
+* A few bug fixes
+* Build fixes
+* Documentation improvements
+
+
+Overview of Changes in GLib 1.3.3:
+==================================
+
+GLib:
+
+* More user_data support in various functions.
+* Main loop API revamps to support per-thread main loops.
+* Unicode handling improvements.
+* Implemented debugging traps.
+* G_CONST_RETURN specification all over the place.
+* Various new small utility functions.
+* Random number generator precision improvements.
+* New configure option --disable-mem-pools.
+* Many Win32 improvements.
+* Added g_try_malloc() friends varinats.
+* Many documentation improvements.
+* Many threading improvements, support for dynamic allocation
+ of static mutexes.
+* GHookLIst API cleanups.
+* Improved format support of GDate parser.
+* String function speed improvements with new g_stpcpy().
+* Hashtable API additions.
+* New GPatternSpec for shell-style pattern matching (from GtkPatternSpec).
+* Optimizations, cleanups, bug fixes.
+
+GObject:
+
+* Added many convenience functions.
+* GClosure and GParamSpec use float/sink ref-counting scheme now.
+* Reworked property change notification.
+* Binary searchable array cleanups, so it's widely usable now.
+* Added static content keeping for some GValue types.
+* Support for statically scoped signal parameters.
+* Extinguished property trailer args in set/get interface.
+* Added support for abstract types.
+* G_CONST_RETURN specification all over the place.
+* Split parameter exchange functionality into value transforms
+ and parameter conversions.
+* Added signal emission hooks and signal accumulators.
+* Added interface prerequisites to support is_a (interface, object)
+ relations.
+* Implemented GValueArray.
+* New types, boxed: G_TYPE_VALUE, G_TYPE_CLOSURE, G_TYPE_GSTRING
+ GParamSpecs: G_TYPE_PARAM_PARAM, G_TYPE_PARAM_POINTER, G_TYPE_PARAM_CLOSURE,
+ G_TYPE_VALUE_ARRAY, G_TYPE_PARAM_UNICHAR, G_TYPE_PARAM_VALUE_ARRAY.
+* Varrags value collection improvements.
+* Implemented debugging traps.
+* Made things thread-safe.
+* Many documentation improvements.
+* Many cleanups, optimizations and bug fixes.
+
+
+Overview of Changes in GLib 1.3.2:
+==================================
+
+GLib:
+
+* Win32 build improvements [Tor]
+* Improvements to error reporting
+ (g_critical(), g_return_if_reached()) [Darin]
+* Add g_strlcpy/g_strlcat [David Wheeler]
+* New IO channel implementation for Win32 [Tor]
+* Make g_array_free, g_string_free return pointer to memory requested
+ not to be freed. [Darin]
+* Added GError based error reporting for thread functions. [Sebastian]
+* Moved reference docs into GLib distribution. [Owen]
+* Added g_convert() for doing convenient character set conversions based
+ on iconv. (GLib now requires libiconv or a native iconv.) [Havoc/Owen]
+* Various Unicode handling additions (g_ucs4_to_utf8, g_utf8_validate(),
+ g_{locale,filename}_{to,from}_utf8) [Robert/Havoc/Owen]
+* Portability fixes for threading. [Sebastian]
+* Added convenient functions for launching new processes (g_spawn_*),
+ and shell quoting/unquoting functions. [Havoc]
+* Split glib.h into many headers. [Sebastian]
+* Added a simple callback-based parser for XML-like files (GMarkup). [Havoc]
+* Fixed confusions between comparison functions that return <0, 0, >0
+ and equaility functions that return FALSE,TRUE. [Sebastian]
+* Added safe/portable temporary file manipulation functions. [Tor]
+* autoconf improvements. [Raja]
+* Many documentation improvements.
+* Bug fixes.
+
+GObject:
+
+* Added boxed and pointer types. [Tim/Jonathan]
+* Added callback abstraction (GClosure) [Tim]
+* Added signal system (GSignal) [Tim]
+* Make GTypePlugin an interface [Tim]
+* Added GTypeModule - a simple GTypePlugin instantiation [Owen]
+* Bug fixes.
+
+
+What's new in GLib 1.3.1:
+=========================
+
+* New GObject library added including object system based on
+ the GTK+ object system.
+* Functions for getting the properties of Unicode characters,
+ computing the canonical decomposition and ordering combining
+ characters aand manipulating UTF-8 string manipulation based
+ on libunicode.
+* GString now properly handles embedded nuls.
+* Multiple fixes from the 1.2.x branch.
+* Upgrade to libtool 1.3.3
+* Full thread support (thread creation and destruction).
+* BeOS port, BeOS dynamic modules.
+* Many improvements to the Windows ports.
+* Improvements to the OS/2 port, OS/2 module support.
+* Double ended queue implementation.
+* GLib macros for printf() formatting, e.g. G_GULONG_FORMAT = "lu"
+* New configure option --enable-msg-prefix to prefix messages, warnings
+ et ceteri with the program name and the process id.
+* New thread-safe random number generator Mersenne Twister.
+* g_strcompress() added, g_strescape() had a slight API change, and
+ more tightly defined semantics.
+* the g_string(x) macro has been removed, #x may be used instead.
+
diff --git a/trunk/NEWS.pre-1-3 b/trunk/NEWS.pre-1-3
new file mode 100644
index 000000000..1aa4f4e73
--- /dev/null
+++ b/trunk/NEWS.pre-1-3
@@ -0,0 +1,211 @@
+Overview of Changes in GLib 1.2.1:
+
+* g_realloc() fix for SunOS (please report further problems).
+* Continued the never ending fix vendetta regarding getpwuid(),
+ this time AIX has been the culprit.
+* Upgrade to libtool 1.2f
+* Miscellaneous other buglets fixed.
+
+What's new in GLib 1.2.0 (since GLib 1.0.x):
+
+* GLib is distributed seperatedly from Gtk+
+* Win32 Portability
+* Threading support
+* GModule mechanism (implemented in an extra library) which wraps dynamic
+ object code loading facilities in a portable manner
+* GIOChannel structure to encapsulate the IPC mechanism
+* GQuarks and datasets
+* GRelations for n-way mapping of certain data
+* An n-way tree implementation
+* GDate functionality for calendar date manipulations
+* GAllocator type and associated functions
+* Added generic callback maintenance functions (ghook)
+* Generic functions for TAB completions
+* Endian defines (G_*_ENDIAN)
+* g_log() mechanism for logging of messages at different log levels
+* Generic main-loop mechanism
+* New glib-config helper script
+* Many more API extensions
+
+Overview of Changes in GLib 1.1.16:
+
+* Allocate smaller pools of memory for glists, gslists, gnodes
+* Bug Fixes
+
+Overview of Changes in GLib 1.1.15:
+
+* HPUX 11 thread system detection should now work
+* Release the main loop lock around calls to prepare() and
+ check() so it is not held over user code
+* A few Win32 fixups
+
+Overview of Changes in GLib 1.1.14:
+
+* Check for dlsym() in system libraries and -dl
+* FreeBSD portability fixes
+* Random bug fixes and autoconf/automake changes
+
+Overview of Changes in GLib 1.1.13:
+
+* Removed alloca() based function and macro variants again.
+* Improved thread related configure tests.
+* GSource destruction fixups.
+* Fixed up idle function removal based on user_data pointer.
+* Advanced Win32 portability.
+* Enforced GSource's check(), prepare() and dispatch() constrains,
+ loop recursions may only happen from dispatch(), and check() as well
+ as prepare() are called while the main_loop lock is being held.
+* GLib development now requires GNU autoconf 2.13, GNU automake 1.4
+ and GNU libtool 1.2d.
+* Lots of random portability and bug fixes.
+
+Overview of Changes in GLib 1.1.12:
+
+* Added alloca functions/macros: g_strdup_a, g_strconcat3_a, g_alloca,
+ g_new_a, g_new0_a
+* New tests structure. Type 'make check' on your system to run them.
+* Avoid unnecessary extra hook referencing in g_hook_list_marshal
+
+Overview of Changes in GLib 1.1.11:
+
+* provide defaults for POLL sysdefs
+* g_main_is_running: new function to check whether a main loop has been quitted
+* a few other enhancement/fixes
+
+Overview of Changes in GLib 1.1.9:
+
+* Check for pthread_attr_init in all cases, Digital Unix 4 requires this
+* For G_LOCK_DECLARE_*, if !G_THREADS_ENABLED, eat trailing semicolon better
+* Changed g_main_poll_(add|remove) to g_main_(add|remove)_poll
+
+Overview of Changes in GLib 1.1.8:
+
+* Added threading support
+ - The ability to specify a set of functions to be used for
+ locking at runtime.
+ - Default implementations of locking functions for pthreads,
+ Solaris threads, and (experimentally) NSPR.
+ - All static variables should now properly locked.
+ - Enhancements to the generic main-loop mechanism to be thread-safe.
+ (It is used for the main-loop in GTK+ as of GTK+-1.1.8)
+* Portability fixes.
+
+Overview of Changes in GLib 1.1.7:
+
+* Removed multiple define from glibconfig.h
+
+Overview of Changes in GLib 1.1.6:
+
+* New GDate functionality for calendar date manipulations (g_date_*)
+* New GAllocator type and associated functions
+* New functions g_slist_copy and g_list_copy to duplicate a list with all
+ its data pointers.
+* New function g_array_insert_vals and new macro g_array_insert_val to
+ insert elements at an arbitrary index
+* GAllocators used for glist, gslist, gnode node allocations
+* Incremental freezing in ghash
+* New function g_hook_list_marshal_check to eventually destroy hooks after
+ they got marshalled
+* Revised GIOChannel to provide generic virtual-function based interface
+* Added generic main-loop abstraction
+* Removed GListAllocator type and its g_*_allocator_*() function variants
+* Bug fixes
+
+Overview of Changes in GLib 1.1.5:
+
+* Win32 portability
+* GIOChannel structure to encapsulate the IPC mechanism
+* Reimplemented endian stuff, using inline asm for x86
+* New functions:
+ - g_strescape: escapes backslashes
+ - g_path_is_absolute and g_path_skip_root
+ - g_getenv: expands environment variables that contain references
+ to other environment variables
+ - g_scanner_sync_file_offset: rewind the filedescriptor to the current
+ buffer position and blow the file read ahead buffer
+ - g_array_remove_index: remove an entry, preserving the order
+ - g_array_remove_index_fast: remove an entry, order might be distorted
+ - g_ptr_array_remove: remove an entry, preserving the order
+ - g_ptr_array_remove_fast: remove an entry, order might be distorted
+ - g_byte_array_remove_index: wrapper for g_array_remove_index
+ - g_byte_array_remove_index_fast: wrapper for g_array_remove_index_fast
+ - g_strncasecmp: modeled closely after g_strcasecmp
+ - g_list_sort, g_slist_sort: to merge sort GLists and GSLists
+* New macros:
+ - G_DIR_SEPARATOR, G_DIR_SEPARATOR_S: platform-dependant file name
+ syntax elements
+ - G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S: platform-dependant
+ search path syntax conventions
+ - G_STRUCT_OFFSET, G_STRUCT_MEMBER_P, G_STRUCT_MEMBER: for handling
+ structure fields through their offsets
+* Removed G_ENUM, G_FLAGS, G_NV, and G_SV macros
+* Bug fixes
+
+Overview of Changes in GLib 1.1.4:
+
+* Added generic callback maintenance functions (ghook)
+* New endian defines (G_*_ENDIAN)
+* New string join/split/free routines
+* Fixes
+
+Overview of Changes in GLib 1.1.3:
+
+* New GModule mechanism (implemented in an extra library) which wraps dynamic
+ object code loading facilities in a portable manner.
+* glib-config features extra "glib" (old behaviour remains) and "gmodule"
+ (add libgmodule.so to the --libs output) arguments now. this can also
+ be specified as fourth argument to the AM_PATH_GLIB() macro.
+* Overhaul of the `inline' autoconfiguration stuff, so inlining should be
+ sufficiently supported on all systems that allow inlining now.
+* New g_log() mechanism for logging of messages at different log levels,
+ associated with certain log domains (define -DG_LOG_DOMAIN for your library).
+* New inline functions for bit masks tests.
+* GNode macros (and functions) now return the newly allocated node.
+* New macro G_VA_COPY() to work around va_list copying oddities on some
+ platforms. the non-static g_vsprintf() function vanished in favour of
+ a publically exported g_strdup_vprintf().
+ People that used the former g_vsprintf() would definitely want to read the
+ associated ChangeLog entries (grep for printf).
+* New utility functions:
+ g_strndup(), g_on_error_query(), g_on_error_stack_trace(), g_strdup_printf(),
+ g_strdup_vprintf(), g_printf_string_upper_bound(), g_spaced_primes_closest(),
+ g_strnfill(), g_memdup().
+* Overhaul of the array implementations, this contains some source incompatible
+ changes. Again, the ChangeLog is much more informative (grep for garray.c).
+* The internals of the g_dataset mechanism are now exported through the
+ new g_datalist_* API (this is also the underlying implementation for the
+ keyed data of GtkObjects).
+* New function g_atexit(), use of the ATEXIT() macro is discouraged.
+* Better configure checks for ansi compliance.
+* Libtool update to version 1.2b.
+* Lotsa bug fixes and cleanups as always ;)
+
+Overview of Changes in GLib 1.1.2:
+
+* Fixed packaging mistake which occured in 1.1.1
+* fix 64-bitness in g_prints in glibtest
+
+What is new in GLib 1.1.1:
+
+* An n-way tree implementation is provided now, based on the GNode structure.
+* Bugfix for pointer arrays.
+
+What is new in GLib 1.1.0:
+
+* GLib is distributed seperatedly from Gtk+ now and uses a sophisticated
+ shared library versioning scheme to deal with interface and binary
+ incompatibilities.
+* There is a glib-config helper script installed now.
+* Fixups all over the place.
+* gboolean is now a gint, not a gchar anymore.
+* API extensions for GList and GSList.
+* New g_str*() functions for simple string handling.
+* GScanner extensions for scope, warning and error handling.
+* Minor performance improvements for GMemChunks.
+* Implementations of GQuarks and datasets (similar to GtkObjects data
+ mechansim, but works for generic memory locations).
+* More convenience macros for GNU C function arguments.
+* Const correction all over the place, including a new pointer type
+ gconstpointer.
+* Generic functions for TAB completions.
+* GRelations for n-way mapping of certain data.
diff --git a/trunk/README b/trunk/README
new file mode 100644
index 000000000..abd46de05
--- /dev/null
+++ b/trunk/README
@@ -0,0 +1,167 @@
+General Information
+===================
+
+This is GLib version 2.13.4. GLib is the low-level core
+library that forms the basis for projects such as GTK+ and GNOME. It
+provides data structure handling for C, portability wrappers, and
+interfaces for such runtime functionality as an event loop, threads,
+dynamic loading, and an object system.
+
+The official ftp site is:
+ ftp://ftp.gtk.org/pub/glib
+
+The official web site is:
+ http://www.gtk.org/
+
+Information about mailing lists can be found at
+ http://www.gtk.org/mailinglists.html
+
+To subscribe: mail -s subscribe gtk-list-request@gnome.org < /dev/null
+(Send mail to gtk-list-request@gnome.org with the subject "subscribe")
+
+Installation
+============
+
+See the file 'INSTALL'
+
+Notes about GLib 2.10
+=====================
+
+* The functions g_snprintf() and g_vsnprintf() have been removed from
+ the gprintf.h header, since they are already declared in glib.h. This
+ doesn't break documented use of gprintf.h, but people have been known
+ to include gprintf.h without including glib.h.
+
+* The Unicode support has been updated to Unicode 4.1. This adds several
+ new members to the GUnicodeBreakType enumeration.
+
+* The support for Solaris threads has been retired. Solaris has provided
+ POSIX threads for long enough now to have them available on every
+ Solaris platform.
+
+* 'make check' has been changed to validate translations by calling
+ msgfmt with the -c option. As a result, it may fail on systems with
+ older gettext implementations (GNU gettext < 0.14.1, or Solaris gettext).
+ 'make check' will also fail on systems where the C compiler does not
+ support ELF visibility attributes.
+
+* The GMemChunk API has been deprecated in favour of a new 'slice
+ allocator'. See the g_slice documentation for more details.
+
+* A new type, GInitiallyUnowned, has been introduced, which is
+ intended to serve as a common implementation of the 'floating reference'
+ concept that is e.g. used by GtkObject. Note that changing the
+ inheritance hierarchy of a type can cause problems for language
+ bindings and other code which needs to work closely with the type
+ system. Therefore, switching to GInitiallyUnowned should be done
+ carefully. g_object_compat_control() has been added to GLib 2.8.5
+ to help with the transition.
+
+Notes about GLib 2.6.0
+======================
+
+* GLib 2.6 introduces the concept of 'GLib filename encoding', which is the
+ on-disk encoding on Unix, but UTF-8 on Windows. All GLib functions
+ returning or accepting pathnames have been changed to expect
+ filenames in this encoding, and the common POSIX functions dealing
+ with pathnames have been wrapped. These wrappers are declared in the
+ header <glib/gstdio.h> which must be included explicitly; it is not
+ included through <glib.h>.
+
+ On current (NT-based) Windows versions, where the on-disk file names
+ are Unicode, these wrappers use the wide-character API in the C
+ library. Thus applications can handle file names containing any
+ Unicode characters through GLib's own API and its POSIX wrappers,
+ not just file names restricted to characters in the system codepage.
+
+ To keep binary compatibility with applications compiled against
+ older versions of GLib, the Windows DLL still provides entry points
+ with the old semantics using the old names, and applications
+ compiled against GLib 2.6 will actually use new names for the
+ functions. This is transparent to the programmer.
+
+ When compiling against GLib 2.6, applications intended to be
+ portable to Windows must take the UTF-8 file name encoding into
+ consideration, and use the gstdio wrappers to access files whose
+ names have been constructed from strings returned from GLib.
+
+* Likewise, g_get_user_name() and g_get_real_name() have been changed
+ to return UTF-8 on Windows, while keeping the old semantics for
+ applications compiled against older versions of GLib.
+
+* The GLib uses an '_' prefix to indicate private symbols that
+ must not be used by applications. On some platforms, symbols beginning
+ with prefixes such as _g will be exported from the library, on others not.
+ In no case can applications use these private symbols. In addition to that,
+ GLib+ 2.6 makes several symbols private which were not in any installed
+ header files and were never intended to be exported.
+
+* To reduce code size and improve efficiency, GLib, when compiled
+ with the GNU toolchain, has separate internal and external entry
+ points for exported functions. The internal names, which begin with
+ IA__, may be seen when debugging a GLib program.
+
+* On Windows, GLib no longer opens a console window when printing
+ warning messages if stdout or stderr are invalid, as they are in
+ "Windows subsystem" (GUI) applications. Simply redirect stdout or
+ stderr if you need to see them.
+
+* The child watch functionality tends to reveal a bug in many
+ thread implementations (in particular the older LinuxThreads
+ implementation on Linux) where it's not possible to call waitpid()
+ for a child created in a different thread. For this reason, for
+ maximum portability, you should structure your code to fork all
+ child processes that you want to wait for from the main thread.
+
+* A problem was recently discovered with g_signal_connect_object();
+ it doesn't actually disconnect the signal handler once the object being
+ connected to dies, just disables it. See the API docs for the function
+ for further details and the correct workaround that will continue to
+ work with future versions of GLib.
+
+How to report bugs
+==================
+
+Bugs should be reported to the GNOME bug tracking system.
+(http://bugzilla.gnome.org, product glib.) You will need
+to create an account for yourself.
+
+In the bug report please include:
+
+* Information about your system. For instance:
+
+ - What operating system and version
+ - For Linux, what version of the C library
+
+ And anything else you think is relevant.
+
+* How to reproduce the bug.
+
+ If you can reproduce it with one of the test programs that are built
+ in the tests/ subdirectory, that will be most convenient. Otherwise,
+ please include a short test program that exhibits the behavior.
+ As a last resort, you can also provide a pointer to a larger piece
+ of software that can be downloaded.
+
+* If the bug was a crash, the exact text that was printed out
+ when the crash occured.
+
+* Further information such as stack traces may be useful, but
+ is not necessary.
+
+Patches
+=======
+
+Patches should also be submitted to bugzilla.gnome.org. If the
+patch fixes an existing bug, add the patch as an attachment
+to that bug report.
+
+Otherwise, enter a new bug report that describes the patch,
+and attach the patch to that bug report.
+
+Bug reports containing patches should include the PATCH keyword
+in their keyword fields. If the patch adds to or changes the GLib
+programming interface, the API keyword should also be included.
+
+Patches should be in unified diff form. (The -u option to GNU
+diff.)
diff --git a/trunk/README.in b/trunk/README.in
new file mode 100644
index 000000000..6904373cd
--- /dev/null
+++ b/trunk/README.in
@@ -0,0 +1,167 @@
+General Information
+===================
+
+This is GLib version @GLIB_VERSION@. GLib is the low-level core
+library that forms the basis for projects such as GTK+ and GNOME. It
+provides data structure handling for C, portability wrappers, and
+interfaces for such runtime functionality as an event loop, threads,
+dynamic loading, and an object system.
+
+The official ftp site is:
+ ftp://ftp.gtk.org/pub/glib
+
+The official web site is:
+ http://www.gtk.org/
+
+Information about mailing lists can be found at
+ http://www.gtk.org/mailinglists.html
+
+To subscribe: mail -s subscribe gtk-list-request@gnome.org < /dev/null
+(Send mail to gtk-list-request@gnome.org with the subject "subscribe")
+
+Installation
+============
+
+See the file 'INSTALL'
+
+Notes about GLib 2.10
+=====================
+
+* The functions g_snprintf() and g_vsnprintf() have been removed from
+ the gprintf.h header, since they are already declared in glib.h. This
+ doesn't break documented use of gprintf.h, but people have been known
+ to include gprintf.h without including glib.h.
+
+* The Unicode support has been updated to Unicode 4.1. This adds several
+ new members to the GUnicodeBreakType enumeration.
+
+* The support for Solaris threads has been retired. Solaris has provided
+ POSIX threads for long enough now to have them available on every
+ Solaris platform.
+
+* 'make check' has been changed to validate translations by calling
+ msgfmt with the -c option. As a result, it may fail on systems with
+ older gettext implementations (GNU gettext < 0.14.1, or Solaris gettext).
+ 'make check' will also fail on systems where the C compiler does not
+ support ELF visibility attributes.
+
+* The GMemChunk API has been deprecated in favour of a new 'slice
+ allocator'. See the g_slice documentation for more details.
+
+* A new type, GInitiallyUnowned, has been introduced, which is
+ intended to serve as a common implementation of the 'floating reference'
+ concept that is e.g. used by GtkObject. Note that changing the
+ inheritance hierarchy of a type can cause problems for language
+ bindings and other code which needs to work closely with the type
+ system. Therefore, switching to GInitiallyUnowned should be done
+ carefully. g_object_compat_control() has been added to GLib 2.8.5
+ to help with the transition.
+
+Notes about GLib 2.6.0
+======================
+
+* GLib 2.6 introduces the concept of 'GLib filename encoding', which is the
+ on-disk encoding on Unix, but UTF-8 on Windows. All GLib functions
+ returning or accepting pathnames have been changed to expect
+ filenames in this encoding, and the common POSIX functions dealing
+ with pathnames have been wrapped. These wrappers are declared in the
+ header <glib/gstdio.h> which must be included explicitly; it is not
+ included through <glib.h>.
+
+ On current (NT-based) Windows versions, where the on-disk file names
+ are Unicode, these wrappers use the wide-character API in the C
+ library. Thus applications can handle file names containing any
+ Unicode characters through GLib's own API and its POSIX wrappers,
+ not just file names restricted to characters in the system codepage.
+
+ To keep binary compatibility with applications compiled against
+ older versions of GLib, the Windows DLL still provides entry points
+ with the old semantics using the old names, and applications
+ compiled against GLib 2.6 will actually use new names for the
+ functions. This is transparent to the programmer.
+
+ When compiling against GLib 2.6, applications intended to be
+ portable to Windows must take the UTF-8 file name encoding into
+ consideration, and use the gstdio wrappers to access files whose
+ names have been constructed from strings returned from GLib.
+
+* Likewise, g_get_user_name() and g_get_real_name() have been changed
+ to return UTF-8 on Windows, while keeping the old semantics for
+ applications compiled against older versions of GLib.
+
+* The GLib uses an '_' prefix to indicate private symbols that
+ must not be used by applications. On some platforms, symbols beginning
+ with prefixes such as _g will be exported from the library, on others not.
+ In no case can applications use these private symbols. In addition to that,
+ GLib+ 2.6 makes several symbols private which were not in any installed
+ header files and were never intended to be exported.
+
+* To reduce code size and improve efficiency, GLib, when compiled
+ with the GNU toolchain, has separate internal and external entry
+ points for exported functions. The internal names, which begin with
+ IA__, may be seen when debugging a GLib program.
+
+* On Windows, GLib no longer opens a console window when printing
+ warning messages if stdout or stderr are invalid, as they are in
+ "Windows subsystem" (GUI) applications. Simply redirect stdout or
+ stderr if you need to see them.
+
+* The child watch functionality tends to reveal a bug in many
+ thread implementations (in particular the older LinuxThreads
+ implementation on Linux) where it's not possible to call waitpid()
+ for a child created in a different thread. For this reason, for
+ maximum portability, you should structure your code to fork all
+ child processes that you want to wait for from the main thread.
+
+* A problem was recently discovered with g_signal_connect_object();
+ it doesn't actually disconnect the signal handler once the object being
+ connected to dies, just disables it. See the API docs for the function
+ for further details and the correct workaround that will continue to
+ work with future versions of GLib.
+
+How to report bugs
+==================
+
+Bugs should be reported to the GNOME bug tracking system.
+(http://bugzilla.gnome.org, product glib.) You will need
+to create an account for yourself.
+
+In the bug report please include:
+
+* Information about your system. For instance:
+
+ - What operating system and version
+ - For Linux, what version of the C library
+
+ And anything else you think is relevant.
+
+* How to reproduce the bug.
+
+ If you can reproduce it with one of the test programs that are built
+ in the tests/ subdirectory, that will be most convenient. Otherwise,
+ please include a short test program that exhibits the behavior.
+ As a last resort, you can also provide a pointer to a larger piece
+ of software that can be downloaded.
+
+* If the bug was a crash, the exact text that was printed out
+ when the crash occured.
+
+* Further information such as stack traces may be useful, but
+ is not necessary.
+
+Patches
+=======
+
+Patches should also be submitted to bugzilla.gnome.org. If the
+patch fixes an existing bug, add the patch as an attachment
+to that bug report.
+
+Otherwise, enter a new bug report that describes the patch,
+and attach the patch to that bug report.
+
+Bug reports containing patches should include the PATCH keyword
+in their keyword fields. If the patch adds to or changes the GLib
+programming interface, the API keyword should also be included.
+
+Patches should be in unified diff form. (The -u option to GNU
+diff.)
diff --git a/trunk/README.win32 b/trunk/README.win32
new file mode 100644
index 000000000..b48bc2044
--- /dev/null
+++ b/trunk/README.win32
@@ -0,0 +1,336 @@
+Tor Lillqvist <tml@iki.fi>
+Hans Breuer <hans@breuer.org>
+
+The general parts, and the section about gcc and autoconfiscated build
+are by Tor Lillqvist. The sections about MSVC build is by Hans Breuer.
+
+General
+=======
+
+For prebuilt binaries (DLLs and EXEs) and developer packages (headers,
+import libraries) of GLib, GTK+, GIMP etc for Windows, surf to
+http://www.gimp.org/win32/downloads.html . They are for "native"
+Windows meaning they use the Win32 API and Microsoft C runtime library
+only, no POSIX (Unix) emulation layer (like Cygwin).
+
+To build GLib on Win32, you can use either gcc or the Microsoft
+compiler and tools. Both the compiler from MSVC 5.0 and from MSVC 6.0
+have been used successfully.
+
+But note that to just *use* GLib on Windows, there is no need to build
+it yourself. Prepackaged runtime and developer packages are available
+from the website above. On Unix, it is quite normal that system admins
+build and install libraries like GLib themselves without bothering to
+look for prebuilt packages, especially if prebuilt packages tend to
+use installation paths that don't conform to local customs.
+
+On Windows setting up a correct build environment can be quite a task,
+especially if you are used to just type "./configure; make" on Unix,
+and expect things to work as smoothly on Windows.
+
+The following preprocessor macros are to be used for conditional
+compilation related to Win32 in GLib-using code:
+
+- G_OS_WIN32 is defined when compiling for native Win32, without
+ any POSIX emulation, other than to the extent provided by the
+ bundled Microsoft C library (msvcrt.dll).
+
+- G_WITH_CYGWIN is defined if compiling for the Cygwin
+ environment. Note that G_OS_WIN32 is *not* defined in that case, as
+ Cygwin is supposed to behave like Unix. G_OS_UNIX *is* defined when
+ compiling for Cygwin.
+
+- G_PLATFORM_WIN32 is defined when either G_OS_WIN32 or G_WITH_CYGWIN
+ is defined.
+
+These macros are defined in glibconfig.h, and are thus (indirectly)
+available in all source files that include <glib.h> or GTK+ headers.
+
+Additionally, there are the compiler-specific macros:
+- __GNUC__ is defined when using gcc
+- _MSC_VER is defined when using the Microsoft compiler
+- __DMC__ is defined when using the Digital Mars C/C++ compiler
+
+G_OS_WIN32 implies using the Microsoft C runtime MSVCRT.DLL. GLib is
+not known to work with the older CRTDLL.DLL runtime, or the static
+Microsoft C runtime libraries LIBC.LIB and LIBCMT.LIB. It apparently
+does work with the debugging version of MSVCRT.DLL,
+MSVCRTD.DLL. Presumably, if compiled with MSVC.NET, it also works with
+MSVCR70.DLL. Please note that it's dubious if you would be allowed by
+the license to distrubute a GLib linked to MSVCR70.DLL, as it is not
+part of the operating system, but of the MSVC product. MSVCRT.DLL is
+part of Windows.
+
+Building software that use GLib or GTK+
+=======================================
+
+Even building software that just *uses* GLib or GTK+ also require to
+have the right compiler set up the right way, so if you intend to use
+gcc, follow the relevant instructions below in that case, too.
+
+Tor uses gcc with the -mms-bitfields flag (used to be called
+-fnative-struct in gcc 2.x), which means that in order to use the
+prebuilt DLLs (especially of GTK+), if you compile your code with gcc,
+you *must* also use that flag. This flag means that the struct layout
+rules are identical to those used by MSVC. This is essential if the
+same DLLs are to be usable both from gcc- and MSVC-compiled code. This
+definitely is something one wants.
+
+Building GLib
+=============
+
+Again, first decide whether you really want to do this.
+
+Before building GLib you must also have the libiconv library and GNU
+gettext. Get prebuilt binaries of libiconv (1.9.1 or newer), and
+gettext-runtime (0.13.1 or newer) from www.gimp.org/win32/downloads.html.
+
+Autoconfiscated build (with gcc)
+================================
+
+Tor uses gcc 3.3.1. Somewhat earlier or later versions presumably also
+work.
+
+You can either use gcc running on Cygwin, or the "pure" mingw
+gcc. Using the latter might work better, or at least did at some
+point. You should be running Cygwin, or maybe cross-compiling from
+real Unix, for the configure script to work, obviously. It is also
+possible to use MSYS.
+
+If you want to use mingw's gcc, install gcc, Win32 headers and
+binutils from www.mingw.org. Set up your PATH so that the mingw gcc is
+the one that gets used, and not Cygwin's gcc. Even if you run the
+mingw gcc, you still want to have Cygwin to run make in.
+
+Tor invokes configure using:
+
+CC='gcc -mcpu=pentium3' CPPFLAGS='-I/target/include'
+ CFLAGS=-O3 LDFLAGS='-L/target/lib' ./configure --with-libiconv
+ --disable-gtk-doc --prefix=/target --host=i386-pc-mingw32
+
+(on a single line). The /target/include mentioned contains the header
+files for libintl and libiconv, and the (import) libraries are in
+/target/lib. This happens to be in the same tree where he configures
+GLib to be installed, but doesn't have to be.
+
+Please note that the ./configure mechanism should not blindly be used
+to build a GLib to be distributed to other developers because it
+produces a compiler-dependent glibconfig.h (and config.h, but that
+shouldn't matter, as it isn't seen by GLib-using applications). For
+instance, the typedef for gint64 is long long with gcc, but __int64
+with MSVC.
+
+Except for this and a few other minor issues, there really shouldn't
+be any reason to distribute separate GLib headers and DLLs for gcc and
+MSVC users, as the compilers generate code that uses the same C
+runtime library. The DLL generated by either compiler is binary
+compatible with the other one. Thus one either has to manually edit
+glibconfig.h afterwards, or use the supplied glibconfig.h.win32 which
+has been produced by running configure twice, once using gcc and once
+using MSVC, and merging the resulting files with diff -D.
+
+For GLib, the DLL is called
+libglib-2.0-0.dll, and the import libraries libglib-2.0.dll.a and
+glib-2.0.lib. Note that the "2.0" is part of the "basename" of the
+library, it is not something that libtool has tucked on. The -0 suffix
+is the value of "LT_CURRENT - LT_AGE". The 0 is *not* simply the micro
+version number of GLib, although, for GLib 2.2.0, it happens to be the
+same. The LT_CURRENT - LT_AGE value will on purpose be kept as zero as
+long as binary compatibility is maintained. For the gory details, see
+configure.in and libtool documentation.
+
+If you want to run the Cygwin-hosted gcc, and still want to produce
+code that does not use Cygwin, but the msvcrt runtime, in theory it
+should work to use the -no-cygwin flag, but Tor hasn't tested that
+lately.
+
+If you would want to use the Cygwin tools to generate a GLib that
+*does* use the Cygwin runtime, the normal Unix configuration method
+should work as if on Unix. Note that successfully producing shared
+libraries (DLLs) for Cygwin most probably requires you to have a very
+new libtool. (And a new libtool probably requires rather new autoconf
+and automake.) Tor hasn't tested this in a while, either.
+
+Cross-compiling
+===============
+
+It is possible to build GLib using a cross compiler. See
+docs/reference/glib/html/glib-cross-compiling.html (part of the
+GLib reference manual) for more information.
+
+Building with MSVC
+==================
+
+If you are building from a CVS snapshot, you will not have any
+makefile.msc files. You should copy the corresponding makefile.msc.in
+file to that name, and replace any @...@ strings with the correct
+value.
+
+This is done automatically when an official GLib source distribution
+package is built, so if you get GLib from a source distribution
+package, there should be makefile.msc files ready to use (after some
+editing).
+
+The hand-written makefile.msc files, and the stuff in the "build"
+subdirectory, produce DLLs and import libraries that match what the
+so-called autoconfiscated build produces.
+
+All the MSVC makefiles are for the command line build with nmake. If
+you want to use the VC-UI you can simply create wrapper .dsp makefiles
+(read the VC docs how to do so).
+
+Some modules may require Perl to auto-generate files. The goal (at
+least Hans's) is to not require any more tools.
+
+Build with:
+
+nmake -f makefile.msc
+ or
+nmake -f makefile.msc DEBUG=1
+
+[
+ The former will create 'release' versions of the DLLs. If you
+ plan to distribute you DLLs please use this command. The latter
+ will create DLLs with debug information _and_ link them with
+ msvcrtd.dll instead of msvcrt.dll.
+ Beware: There are known problems with mixing DLLs in one
+ application, which are build against different runtimes.
+ Especially the index-to-file mapping used by 'unix-style' file
+ operation - _open() _pipe() etc. - breaks sometimes in strange
+ ways (for example the Gimp plug-in communication).
+]
+
+Required libraries (not build from cvs)
+------------------
+ libintl (gnu-intl), libiconv
+ libtiff, libpng, zlib, libjpeg
+
+are available pre-built from the website mentioned above.
+
+Versioning
+----------
+Instead of the Unix and auto* way of tracking versions and resolving
+dependencies (configure; make; make install) involving autoconf,
+automake, libtool and friends the MSVC build uses a different
+approach.
+
+The core of it's versioning is the file build/win32/module.defs.
+It contains entries of the form MODULE_VER, e.g.:
+
+ GLIB_VER = 2.0
+ LIBICONV_VER = 1.3
+
+and the placement of these modules defined as MODULE, e.g.:
+
+ GLIB = $(TOP)/glib
+ LIBICONV = $(TOP)/libiconv-$(LIBICONV_VER)
+
+whereas TOP is defined as the relative path from the respective
+module directory to your top build directory. Every makefile.msc
+needs to define TOP before including the common make file part
+make.msc, which than includes module.defs, like:
+
+TOP = ../..
+!INCLUDE $(TOP)/glib/build/win32/make.msc
+
+(Taken from gtk+/gdk/makefile.msc)
+
+With this provision it is possible to create almost placement
+independent makefiles without requiring to 'install' the libraries and
+headers into a common place (as it is done on Unix, and as Tor does
+when producing his zipfiles with prebuilt GLib, GTK+ etc).
+
+Special Files
+-------------
+ config.h.win32.in : @XXX_MAJOR_VERSION@ needs to be replaced by
+the current version/build number. The resulting file is to be saved
+as 'config.h.win32'. This should be automatically done if a package
+gets build on the Unix platform.
+
+ makefile.msc.in : @XXX_MAJOR_VERSION@ to be replaced. Save as
+makefile.msc.
+
+ <module>.def : every function which should be used from the outside of
+a dll needs to be marked for 'export'. It is common that one needs to change
+these files after some api changes occured. If there are variables to be
+exported another mechanism is needed, like :
+
+ #ifdef G_OS_WIN32
+ # ifdef GDK_COMPILATION
+ # define GDKVAR __declspec(dllexport)
+ # else
+ # define GDKVAR extern __declspec(dllimport)
+ # endif
+ #else
+ # define GDKVAR extern
+ #endif
+
+
+
+Directory Structure
+-------------------
+all modules should be build in a common directory tree otherwise you
+need to adapt the file 'module.defs'. They are listed here in increasing
+dependencies order.
+
+<common rootdir without spaces>
+ |
+ +- glib
+ | |
+ | +- build : [this module lives in the cvs root dir]
+ | | +- win32
+ | | .\module.defs : defines (relative) locations of the headers
+ | | and libs and version numbers to be include
+ | | in dll names
+ | | .\make.msc : include by almost every 'makefile.msc'
+ | |
+ | | .\README.WIN32 : more information how to build
+ | | .\glibconfig.h.win32.in : similar to config.h.win32.in
+ | | .\makefile.msc : master makefile, sub dir makefiles should work
+ | |
+ | +- glib
+ | +- gmodule
+ | +- gthread : does _not_ depend on pthread anymore
+ | +- gobject
+ |
+ +- pango
+ | +- pango : 'native' build does not require extra libs and
+ | | includes the minimal required text renderer
+ | | (there is also a currently slightly broken FreeType2
+ | | based implementation for win32)
+ | +- modules (not yet build)
+ |
+ +- atk
+ | +- atk
+ | .\makefile.msc : build here
+ |
+ +- gtk+
+ | | .\config.h.win32 : for all the below
+ | |
+ | +- gdk-pixbuf
+ | | .\gdk_pixbuf.rc.in : version resource for the DLLs. Needs
+ | | to be converted (filled with version info)
+ | | as described above.
+ | |
+ | +- gdk
+ | | | .\makefile.msc : some auto-generation is needed to build in the
+ | | | in the subdirectory
+ | | +- win32
+ | |
+ | +- gtk
+
+ |
+ +- gimp
+ | .\makefile.msc : master makefile to build The Gimp. The makefiles
+ | from the sub dirs should work stand alone, but than
+ | the user needs to know the build order
+
+ |
+ +- dia : additionally depends on libart_lgpl (in cvs)
+ | and libxml2 ( see http://www.xmlsoft.org/ )
+ +- lib
+ +- app
+ +- objects
+ +- plug-ins
+ +- python
+
diff --git a/trunk/acglib.m4 b/trunk/acglib.m4
new file mode 100644
index 000000000..530c0af0d
--- /dev/null
+++ b/trunk/acglib.m4
@@ -0,0 +1,131 @@
+## Portability defines that help interoperate with classic and modern autoconfs
+ifdef([AC_TR_SH],[
+define([GLIB_TR_SH],[AC_TR_SH([$1])])
+define([GLIB_TR_CPP],[AC_TR_CPP([$1])])
+], [
+define([GLIB_TR_SH],
+ [patsubst(translit([[$1]], [*+], [pp]), [[^a-zA-Z0-9_]], [_])])
+define([GLIB_TR_CPP],
+ [patsubst(translit([[$1]],
+ [*abcdefghijklmnopqrstuvwxyz],
+ [PABCDEFGHIJKLMNOPQRSTUVWXYZ]),
+ [[^A-Z0-9_]], [_])])
+])
+
+# GLIB_AC_DIVERT_BEFORE_HELP(STUFF)
+# ---------------------------------
+# Put STUFF early enough so that they are available for $ac_help expansion.
+# Handle both classic (<= v2.13) and modern autoconf
+AC_DEFUN([GLIB_AC_DIVERT_BEFORE_HELP],
+[ifdef([m4_divert_text], [m4_divert_text([NOTICE],[$1])],
+ [ifdef([AC_DIVERT], [AC_DIVERT([NOTICE],[$1])],
+ [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)dnl
+$1
+AC_DIVERT_POP()])])])
+
+dnl GLIB_IF_VAR_EQ (ENV_VAR, VALUE [, EQUALS_ACTION] [, ELSE_ACTION])
+AC_DEFUN([GLIB_IF_VAR_EQ],[
+ case "$[$1]" in
+ "[$2]"[)]
+ [$3]
+ ;;
+ *[)]
+ [$4]
+ ;;
+ esac
+])
+dnl GLIB_STR_CONTAINS (SRC_STRING, SUB_STRING [, CONTAINS_ACTION] [, ELSE_ACTION])
+AC_DEFUN([GLIB_STR_CONTAINS],[
+ case "[$1]" in
+ *"[$2]"*[)]
+ [$3]
+ ;;
+ *[)]
+ [$4]
+ ;;
+ esac
+])
+dnl GLIB_ADD_TO_VAR (ENV_VARIABLE, CHECK_STRING, ADD_STRING)
+AC_DEFUN([GLIB_ADD_TO_VAR],[
+ GLIB_STR_CONTAINS($[$1], [$2], [$1]="$[$1]", [$1]="$[$1] [$3]")
+])
+
+# GLIB_SIZEOF (INCLUDES, TYPE, ALIAS)
+# ---------------------------------------------------------------
+# The definition here is based of that of AC_CHECK_SIZEOF
+AC_DEFUN([GLIB_SIZEOF],
+[AS_LITERAL_IF([$3], [],
+ [AC_FATAL([$0: requires literal arguments])])dnl
+AC_CACHE_CHECK([size of $2], AS_TR_SH([glib_cv_sizeof_$3]),
+[ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ _AC_COMPUTE_INT([(long) (sizeof ($2))],
+ [AS_TR_SH([glib_cv_sizeof_$3])],
+ [AC_INCLUDES_DEFAULT([$1])],
+ [AC_MSG_ERROR([cannot compute sizeof ($2), 77])])
+])dnl
+AC_DEFINE_UNQUOTED(GLIB_TR_CPP(glib_sizeof_$3), $AS_TR_SH([glib_cv_sizeof_$3]),
+ [The size of $3, as computed by sizeof.])
+])# GLIB_SIZEOF
+
+dnl GLIB_BYTE_CONTENTS (INCLUDES, TYPE, ALIAS, N_BYTES, INITIALIZER)
+AC_DEFUN([GLIB_BYTE_CONTENTS],
+[pushdef([glib_ByteContents], GLIB_TR_SH([glib_cv_byte_contents_$3]))dnl
+AC_CACHE_CHECK([byte contents of $5], glib_ByteContents,
+[AC_TRY_RUN([#include <stdio.h>
+$1
+main()
+{
+ static $2 tv = $5;
+ char *p = (char*) &tv;
+ int i;
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ for (i = 0; i < $4; i++)
+ fprintf(f, "%s%d", i?",":"", *(p++));
+ fprintf(f, "\n");
+ exit(0);
+}],
+ [glib_ByteContents=`cat conftestval` dnl''
+],
+ [glib_ByteContents=no],
+ [glib_ByteContents=no])])
+AC_DEFINE_UNQUOTED(GLIB_TR_CPP(glib_byte_contents_$3), [$[]glib_ByteContents],
+ [Byte contents of $3])
+popdef([glib_ByteContents])dnl
+])
+
+# GLIB_CHECK_VALUE(SYMBOL, INCLUDES, ACTION-IF-FAIL)
+# ---------------------------------------------------------------
+AC_DEFUN([GLIB_CHECK_VALUE],
+[AC_CACHE_CHECK([value of $1], AS_TR_SH([glib_cv_value_$1]),
+ [_AC_COMPUTE_INT([$1], AS_TR_SH([glib_cv_value_$1]), [$2], [$3])])
+])dnl
+
+# GLIB_CHECK_COMPILE_WARNINGS(PROGRAM, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# ---------------------------------------------------------------------
+# Try to compile PROGRAM, check for warnings
+m4_define([GLIB_CHECK_COMPILE_WARNINGS],
+[m4_ifvaln([$1], [AC_LANG_CONFTEST([$1])])dnl
+rm -f conftest.$ac_objext
+glib_ac_compile_save="$ac_compile"
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext'
+AS_IF([_AC_EVAL_STDERR($ac_compile) &&
+ AC_TRY_COMMAND([(if test -s conftest.err; then false ; else true; fi)])],
+ [$2],
+ [echo "$as_me: failed program was:" >&AS_MESSAGE_LOG_FD
+cat conftest.$ac_ext >&AS_MESSAGE_LOG_FD
+m4_ifvaln([$3],[$3])dnl])dnl
+ac_compile="$glib_ac_compile_save"
+rm -f conftest.$ac_objext conftest.err m4_ifval([$1], [conftest.$ac_ext])[]dnl
+])# GLIB_CHECK_COMPILE_WARNINGS
+
+# GLIB_ASSERT_SET(VARIABLE)
+# -------------------------
+AC_DEFUN([GLIB_ASSERT_SET],
+[if test "x${$1+set}" != "xset" ; then
+ AC_MSG_ERROR($1 [must be set in cache file when cross-compiling.])
+fi
+])dnl
diff --git a/trunk/acinclude.m4 b/trunk/acinclude.m4
new file mode 100644
index 000000000..f86034d75
--- /dev/null
+++ b/trunk/acinclude.m4
@@ -0,0 +1,448 @@
+dnl @synopsis AC_FUNC_VSNPRINTF_C99
+dnl
+dnl Check whether there is a vsnprintf() function with C99 semantics installed.
+dnl
+AC_DEFUN([AC_FUNC_VSNPRINTF_C99],
+[AC_CACHE_CHECK(for C99 vsnprintf,
+ ac_cv_func_vsnprintf_c99,
+[AC_TRY_RUN(
+[#include <stdio.h>
+#include <stdarg.h>
+
+int
+doit(char * s, ...)
+{
+ char buffer[32];
+ va_list args;
+ int r;
+
+ va_start(args, s);
+ r = vsnprintf(buffer, 5, s, args);
+ va_end(args);
+
+ if (r != 7)
+ exit(1);
+
+ /* AIX 5.1 and Solaris seems to have a half-baked vsnprintf()
+ implementation. The above will return 7 but if you replace
+ the size of the buffer with 0, it borks! */
+ va_start(args, s);
+ r = vsnprintf(buffer, 0, s, args);
+ va_end(args);
+
+ if (r != 7)
+ exit(1);
+
+ exit(0);
+}
+
+int
+main(void)
+{
+ doit("1234567");
+ exit(1);
+}], ac_cv_func_vsnprintf_c99=yes, ac_cv_func_vsnprintf_c99=no, ac_cv_func_vsnprintf_c99=no)])
+dnl Note that the default is to be pessimistic in the case of cross compilation.
+dnl If you know that the target has a C99 vsnprintf(), you can get around this
+dnl by setting ac_func_vsnprintf_c99 to yes, as described in the Autoconf manual.
+if test $ac_cv_func_vsnprintf_c99 = yes; then
+ AC_DEFINE(HAVE_C99_VSNPRINTF, 1,
+ [Define if you have a version of the vsnprintf function
+ with semantics as specified by the ISO C99 standard.])
+fi
+])# AC_FUNC_VSNPRINTF_C99
+
+
+dnl @synopsis AC_FUNC_SNPRINTF_C99
+dnl
+dnl Check whether there is a snprintf() function with C99 semantics installed.
+dnl
+AC_DEFUN([AC_FUNC_SNPRINTF_C99],
+[AC_CACHE_CHECK(for C99 snprintf,
+ ac_cv_func_snprintf_c99,
+[AC_TRY_RUN(
+[#include <stdio.h>
+#include <stdarg.h>
+
+int
+doit()
+{
+ char buffer[32];
+ va_list args;
+ int r;
+
+ r = snprintf(buffer, 5, "1234567");
+
+ if (r != 7)
+ exit(1);
+
+ r = snprintf(buffer, 0, "1234567");
+
+ if (r != 7)
+ exit(1);
+
+ r = snprintf(NULL, 0, "1234567");
+
+ if (r != 7)
+ exit(1);
+
+ exit(0);
+}
+
+int
+main(void)
+{
+ doit();
+ exit(1);
+}], ac_cv_func_snprintf_c99=yes, ac_cv_func_snprintf_c99=no, ac_cv_func_snprintf_c99=no)])
+dnl Note that the default is to be pessimistic in the case of cross compilation.
+dnl If you know that the target has a C99 snprintf(), you can get around this
+dnl by setting ac_func_snprintf_c99 to yes, as described in the Autoconf manual.
+if test $ac_cv_func_snprintf_c99 = yes; then
+ AC_DEFINE(HAVE_C99_SNPRINTF, 1,
+ [Define if you have a version of the snprintf function
+ with semantics as specified by the ISO C99 standard.])
+fi
+])# AC_FUNC_SNPRINTF_C99
+
+
+dnl @synopsis AC_FUNC_PRINTF_UNIX98
+dnl
+dnl Check whether the printf() family supports Unix98 %n$ positional parameters
+dnl
+AC_DEFUN([AC_FUNC_PRINTF_UNIX98],
+[AC_CACHE_CHECK(whether printf supports positional parameters,
+ ac_cv_func_printf_unix98,
+[AC_TRY_RUN(
+[#include <stdio.h>
+
+int
+main (void)
+{
+ char buffer[128];
+
+ sprintf (buffer, "%2\$d %3\$d %1\$d", 1, 2, 3);
+ if (strcmp ("2 3 1", buffer) == 0)
+ exit (0);
+ exit (1);
+}], ac_cv_func_printf_unix98=yes, ac_cv_func_printf_unix98=no, ac_cv_func_printf_unix98=no)])
+dnl Note that the default is to be pessimistic in the case of cross compilation.
+dnl If you know that the target printf() supports positional parameters, you can get around
+dnl this by setting ac_func_printf_unix98 to yes, as described in the Autoconf manual.
+if test $ac_cv_func_printf_unix98 = yes; then
+ AC_DEFINE(HAVE_UNIX98_PRINTF, 1,
+ [Define if your printf function family supports positional parameters
+ as specified by Unix98.])
+fi
+])# AC_FUNC_PRINTF_UNIX98
+
+# Checks the location of the XML Catalog
+# Usage:
+# JH_PATH_XML_CATALOG([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# Defines XMLCATALOG and XML_CATALOG_FILE substitutions
+AC_DEFUN([JH_PATH_XML_CATALOG],
+[
+ # check for the presence of the XML catalog
+ AC_ARG_WITH([xml-catalog],
+ AC_HELP_STRING([--with-xml-catalog=CATALOG],
+ [path to xml catalog to use]),,
+ [with_xml_catalog=/etc/xml/catalog])
+ jh_found_xmlcatalog=true
+ XML_CATALOG_FILE="$with_xml_catalog"
+ AC_SUBST([XML_CATALOG_FILE])
+ AC_MSG_CHECKING([for XML catalog ($XML_CATALOG_FILE)])
+ if test -f "$XML_CATALOG_FILE"; then
+ AC_MSG_RESULT([found])
+ else
+ jh_found_xmlcatalog=false
+ AC_MSG_RESULT([not found])
+ fi
+
+ # check for the xmlcatalog program
+ AC_PATH_PROG(XMLCATALOG, xmlcatalog, no)
+ if test "x$XMLCATALOG" = xno; then
+ jh_found_xmlcatalog=false
+ fi
+
+ if $jh_found_xmlcatalog; then
+ ifelse([$1],,[:],[$1])
+ else
+ ifelse([$2],,[AC_MSG_ERROR([could not find XML catalog])],[$2])
+ fi
+])
+
+# Checks if a particular URI appears in the XML catalog
+# Usage:
+# JH_CHECK_XML_CATALOG(URI, [FRIENDLY-NAME], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+AC_DEFUN([JH_CHECK_XML_CATALOG],
+[
+ AC_REQUIRE([JH_PATH_XML_CATALOG],[JH_PATH_XML_CATALOG(,[:])])dnl
+ AC_MSG_CHECKING([for ifelse([$2],,[$1],[$2]) in XML catalog])
+ if $jh_found_xmlcatalog && \
+ AC_RUN_LOG([$XMLCATALOG --noout "$XML_CATALOG_FILE" "$1" >&2]); then
+ AC_MSG_RESULT([found])
+ ifelse([$3],,,[$3
+])dnl
+ else
+ AC_MSG_RESULT([not found])
+ ifelse([$4],,
+ [AC_MSG_ERROR([could not find ifelse([$2],,[$1],[$2]) in XML catalog])],
+ [$4])
+ fi
+])
+
+
+# signed.m4 serial 1 (gettext-0.10.40)
+dnl Copyright (C) 2001-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([bh_C_SIGNED],
+[
+ AC_CACHE_CHECK([for signed], bh_cv_c_signed,
+ [AC_TRY_COMPILE(, [signed char x;], bh_cv_c_signed=yes, bh_cv_c_signed=no)])
+ if test $bh_cv_c_signed = no; then
+ AC_DEFINE(signed, ,
+ [Define to empty if the C compiler doesn't support this keyword.])
+ fi
+])
+
+
+# longlong.m4 serial 4
+dnl Copyright (C) 1999-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_LONG_LONG if 'long long' works.
+
+AC_DEFUN([jm_AC_TYPE_LONG_LONG],
+[
+ AC_CACHE_CHECK([for long long], ac_cv_type_long_long,
+ [AC_TRY_LINK([long long ll = 1LL; int i = 63;],
+ [long long llmax = (long long) -1;
+ return ll << i | ll >> i | llmax / ll | llmax % ll;],
+ ac_cv_type_long_long=yes,
+ ac_cv_type_long_long=no)])
+ if test $ac_cv_type_long_long = yes; then
+ AC_DEFINE(HAVE_LONG_LONG, 1,
+ [Define if you have the 'long long' type.])
+ fi
+])
+
+
+# longdouble.m4 serial 1 (gettext-0.11.6)
+dnl Copyright (C) 2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether the compiler supports the 'long double' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_LONGDOUBLE],
+[
+ AC_CACHE_CHECK([for long double], gt_cv_c_long_double,
+ [if test "$GCC" = yes; then
+ gt_cv_c_long_double=yes
+ else
+ AC_TRY_COMPILE([
+ /* The Stardent Vistra knows sizeof(long double), but does not support it. */
+ long double foo = 0.0;
+ /* On Ultrix 4.3 cc, long double is 4 and double is 8. */
+ int array [2*(sizeof(long double) >= sizeof(double)) - 1];
+ ], ,
+ gt_cv_c_long_double=yes, gt_cv_c_long_double=no)
+ fi])
+ if test $gt_cv_c_long_double = yes; then
+ AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.])
+ fi
+])
+
+
+
+# wchar_t.m4 serial 1 (gettext-0.11.6)
+dnl Copyright (C) 2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether <stddef.h> has the 'wchar_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WCHAR_T],
+[
+ AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t,
+ [AC_TRY_COMPILE([#include <stddef.h>
+ wchar_t foo = (wchar_t)'\0';], ,
+ gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)])
+ if test $gt_cv_c_wchar_t = yes; then
+ AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.])
+ fi
+])
+
+
+# wint_t.m4 serial 1
+dnl Copyright (C) 2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether <wchar.h> has the 'wint_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WINT_T],
+[
+ AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t,
+ [AC_TRY_COMPILE([#include <wchar.h>
+ wint_t foo = (wchar_t)'\0';], ,
+ gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)])
+ if test $gt_cv_c_wint_t = yes; then
+ AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.])
+ fi
+])
+
+
+# intmax_t.m4 serial 1
+dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+AC_PREREQ(2.13)
+
+# Define intmax_t to 'long' or 'long long'
+# if it is not already defined in <stdint.h> or <inttypes.h>.
+
+AC_DEFUN([jm_AC_TYPE_INTMAX_T],
+[
+ dnl For simplicity, we assume that a header file defines 'intmax_t' if and
+ dnl only if it defines 'uintmax_t'.
+ AC_REQUIRE([jm_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([jm_AC_HEADER_STDINT_H])
+ if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then
+ AC_REQUIRE([jm_AC_TYPE_LONG_LONG])
+ test $ac_cv_type_long_long = yes \
+ && ac_type='long long' \
+ || ac_type='long'
+ AC_DEFINE_UNQUOTED(intmax_t, $ac_type,
+ [Define to long or long long if <inttypes.h> and <stdint.h> don't define.])
+ else
+ AC_DEFINE(HAVE_INTMAX_T, 1,
+ [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+ fi
+])
+
+dnl An alternative would be to explicitly test for 'intmax_t'.
+
+AC_DEFUN([gt_AC_TYPE_INTMAX_T],
+[
+ AC_REQUIRE([jm_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([jm_AC_HEADER_STDINT_H])
+ AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t,
+ [AC_TRY_COMPILE([
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+], [intmax_t x = -1;], gt_cv_c_intmax_t=yes, gt_cv_c_intmax_t=no)])
+ if test $gt_cv_c_intmax_t = yes; then
+ AC_DEFINE(HAVE_INTMAX_T, 1,
+ [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+ else
+ AC_REQUIRE([jm_AC_TYPE_LONG_LONG])
+ test $ac_cv_type_long_long = yes \
+ && ac_type='long long' \
+ || ac_type='long'
+ AC_DEFINE_UNQUOTED(intmax_t, $ac_type,
+ [Define to long or long long if <stdint.h> and <inttypes.h> don't define.])
+ fi
+])
+
+
+# stdint_h.m4 serial 3 (gettext-0.11.6)
+dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([jm_AC_HEADER_STDINT_H],
+[
+ AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h,
+ [AC_TRY_COMPILE(
+ [#include <sys/types.h>
+#include <stdint.h>],
+ [uintmax_t i = (uintmax_t) -1;],
+ jm_ac_cv_header_stdint_h=yes,
+ jm_ac_cv_header_stdint_h=no)])
+ if test $jm_ac_cv_header_stdint_h = yes; then
+ AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1,
+ [Define if <stdint.h> exists, doesn't clash with <sys/types.h>,
+ and declares uintmax_t. ])
+ fi
+])
+
+
+# inttypes_h.m4 serial 5 (gettext-0.11.6)
+dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([jm_AC_HEADER_INTTYPES_H],
+[
+ AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h,
+ [AC_TRY_COMPILE(
+ [#include <sys/types.h>
+#include <inttypes.h>],
+ [uintmax_t i = (uintmax_t) -1;],
+ jm_ac_cv_header_inttypes_h=yes,
+ jm_ac_cv_header_inttypes_h=no)])
+ if test $jm_ac_cv_header_inttypes_h = yes; then
+ AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1,
+ [Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
+ and declares uintmax_t. ])
+ fi
+])
+
+
diff --git a/trunk/autogen.sh b/trunk/autogen.sh
new file mode 100755
index 000000000..a9baabfd1
--- /dev/null
+++ b/trunk/autogen.sh
@@ -0,0 +1,98 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+ORIGDIR=`pwd`
+cd $srcdir
+PROJECT=GLib
+TEST_TYPE=-f
+FILE=glib/glib.h
+
+DIE=0
+
+have_libtool=false
+if libtoolize --version < /dev/null > /dev/null 2>&1 ; then
+ libtool_version=`libtoolize --version | sed 's/^[^0-9]*\([0-9.][0-9.]*\).*/\1/'`
+ case $libtool_version in
+ 1.4*|1.5*)
+ have_libtool=true
+ ;;
+ esac
+fi
+if $have_libtool ; then : ; else
+ echo
+ echo "You must have libtool 1.4 installed to compile $PROJECT."
+ echo "Install the appropriate package for your distribution,"
+ echo "or get the source tarball at http://ftp.gnu.org/gnu/libtool/"
+ DIE=1
+fi
+
+(gtkdocize --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "You must have gtk-doc installed to compile $PROJECT."
+ echo "Install the appropriate package for your distribution,"
+ echo "or get the source tarball at ftp://ftp.gnome.org/pub/GNOME/sources/gtk-doc/"
+ DIE=1
+}
+
+(autoconf --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "You must have autoconf installed to compile $PROJECT."
+ echo "Install the appropriate package for your distribution,"
+ echo "or get the source tarball at http://ftp.gnu.org/gnu/autoconf/"
+ DIE=1
+}
+
+if automake-1.7 --version < /dev/null > /dev/null 2>&1 ; then
+ AUTOMAKE=automake-1.7
+ ACLOCAL=aclocal-1.7
+else
+ echo
+ echo "You must have automake 1.7.x installed to compile $PROJECT."
+ echo "Install the appropriate package for your distribution,"
+ echo "or get the source tarball at http://ftp.gnu.org/gnu/automake/"
+ DIE=1
+fi
+
+if test "$DIE" -eq 1; then
+ exit 1
+fi
+
+test $TEST_TYPE $FILE || {
+ echo "You must run this script in the top-level $PROJECT directory"
+ exit 1
+}
+
+if test -z "$AUTOGEN_SUBDIR_MODE"; then
+ if test -z "$*"; then
+ echo "I am going to run ./configure with no arguments - if you wish "
+ echo "to pass any to it, please specify them on the $0 command line."
+ fi
+fi
+
+rm -rf autom4te.cache
+
+# README and INSTALL are required by automake, but may be deleted by clean
+# up rules. to get automake to work, simply touch these here, they will be
+# regenerated from their corresponding *.in files by ./configure anyway.
+touch README INSTALL
+
+$ACLOCAL $ACLOCAL_FLAGS || exit $?
+
+libtoolize --force || exit $?
+gtkdocize || exit $?
+
+autoheader || exit $?
+
+$AUTOMAKE --add-missing || exit $?
+autoconf || exit $?
+cd $ORIGDIR || exit $?
+
+if test -z "$AUTOGEN_SUBDIR_MODE"; then
+ $srcdir/configure --enable-maintainer-mode $AUTOGEN_CONFIGURE_ARGS "$@" || exit $?
+
+ echo
+ echo "Now type 'make' to compile $PROJECT."
+fi
diff --git a/trunk/config.h.win32.in b/trunk/config.h.win32.in
new file mode 100644
index 000000000..8f3b7213e
--- /dev/null
+++ b/trunk/config.h.win32.in
@@ -0,0 +1,584 @@
+/* config.h.win32.in Merged from two versions generated by configure for gcc and MSVC. */
+/* config.h. Generated by configure. */
+/* config.h.in. Generated from configure.in by autoheader. */
+
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+ systems. This function is required for `alloca.c' support on those systems.
+ */
+/* #undef CRAY_STACKSEG_END */
+
+/* Define to 1 if using `alloca.c'. */
+/* #undef C_ALLOCA */
+
+/* Whether to disable memory pools */
+/* #undef DISABLE_MEM_POOLS */
+
+/* Whether to enable GC friendliness by default */
+/* #undef ENABLE_GC_FRIENDLY_DEFAULT */
+
+/* always defined to indicate that i18n is enabled */
+#define ENABLE_NLS 1
+
+/* Define the gettext package to be used */
+#define GETTEXT_PACKAGE "@GETTEXT_PACKAGE@"
+
+/* Define to the GLIB binary age */
+#define GLIB_BINARY_AGE @GLIB_BINARY_AGE@
+
+/* Byte contents of gmutex */
+/* #undef GLIB_BYTE_CONTENTS_GMUTEX */
+
+/* Define to the GLIB interface age */
+#define GLIB_INTERFACE_AGE @GLIB_INTERFACE_AGE@
+
+/* Define the location where the catalogs will be installed */
+#define GLIB_LOCALE_DIR "NONE/lib/locale"
+
+/* Define to the GLIB major version */
+#define GLIB_MAJOR_VERSION @GLIB_MAJOR_VERSION@
+
+/* Define to the GLIB micro version */
+#define GLIB_MICRO_VERSION @GLIB_MICRO_VERSION@
+
+/* Define to the GLIB minor version */
+#define GLIB_MINOR_VERSION @GLIB_MINOR_VERSION@
+
+/* The size of gmutex, as computed by sizeof. */
+/* #undef GLIB_SIZEOF_GMUTEX */
+
+/* The size of system_thread, as computed by sizeof. */
+#define GLIB_SIZEOF_SYSTEM_THREAD 4
+
+/* alpha atomic implementation */
+/* #undef G_ATOMIC_ALPHA */
+
+/* i486 atomic implementation */
+#ifndef _MSC_VER
+#define G_ATOMIC_I486 1
+#endif /* _MSC_VER */
+
+/* ia64 atomic implementation */
+/* #undef G_ATOMIC_IA64 */
+
+/* powerpc atomic implementation */
+/* #undef G_ATOMIC_POWERPC */
+
+/* s390 atomic implementation */
+/* #undef G_ATOMIC_S390 */
+
+/* sparcv9 atomic implementation */
+/* #undef G_ATOMIC_SPARCV9 */
+
+/* x86_64 atomic implementation */
+/* #undef G_ATOMIC_X86_64 */
+
+/* Whether glib was compiled with debugging enabled */
+#define G_COMPILED_WITH_DEBUGGING "yes"
+
+/* Have inline keyword */
+#ifndef _MSC_VER
+#define G_HAVE_INLINE 1
+#else /* _MSC_VER */
+/* #undef G_HAVE_INLINE */
+#endif /* _MSC_VER */
+
+/* Have __inline keyword */
+#define G_HAVE___INLINE 1
+
+/* Have __inline__ keyword */
+#if !defined(_MSC_VER) && !defined(__DMC__)
+#define G_HAVE___INLINE__ 1
+#else /* _MSC_VER or __DMC__ */
+/* #undef G_HAVE___INLINE__ */
+#endif /* _MSC_VER or __DMC__ */
+
+/* Source file containing theread implementation */
+#define G_THREAD_SOURCE "gthread-win32.c"
+
+/* A 'va_copy' style function */
+#ifndef _MSC_VER
+#define G_VA_COPY va_copy
+#else /* _MSC_VER */
+/* #undef G_VA_COPY */
+#endif /* _MSC_VER */
+
+/* 'va_lists' cannot be copies as values */
+/* #undef G_VA_COPY_AS_ARRAY */
+
+/* Define to 1 if you have `alloca', as a function or macro. */
+#define HAVE_ALLOCA 1
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+ */
+/* #undef HAVE_ALLOCA_H */
+
+/* Define to 1 if you have the `atexit' function. */
+#define HAVE_ATEXIT 1
+
+/* Define to 1 if you have the `bind_textdomain_codeset' function. */
+#define HAVE_BIND_TEXTDOMAIN_CODESET 1
+
+/* Define if you have a version of the snprintf function with semantics as
+ specified by the ISO C99 standard. */
+/* #undef HAVE_C99_SNPRINTF */
+
+/* Define if you have a version of the vsnprintf function with semantics as
+ specified by the ISO C99 standard. */
+/* #undef HAVE_C99_VSNPRINTF */
+
+/* Define to 1 if you have the `clock_gettime' function. */
+/* #undef HAVE_CLOCK_GETTIME */
+
+/* Have nl_langinfo (CODESET) */
+/* #undef HAVE_CODESET */
+
+/* Define to 1 if you have the <crt_externs.h> header file. */
+/* #undef HAVE_CRT_EXTERNS_H */
+
+/* Define to 1 if you have the `dcgettext' function. */
+#define HAVE_DCGETTEXT 1
+
+/* Define to 1 if you have the <dirent.h> header file. */
+#define HAVE_DIRENT_H 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+/* #undef HAVE_DLFCN_H */
+
+/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
+/* #undef HAVE_DOPRNT */
+
+/* define for working do while(0) macros */
+#define HAVE_DOWHILE_MACROS 1
+
+/* Define to 1 if you have the `fdwalk' function. */
+/* #undef HAVE_FDWALK */
+
+/* Define to 1 if you have the <float.h> header file. */
+#define HAVE_FLOAT_H 1
+
+/* Define to 1 if you have the `getcwd' function. */
+#define HAVE_GETCWD 1
+
+/* Define to 1 if you have the `getc_unlocked' function. */
+/* #undef HAVE_GETC_UNLOCKED */
+
+/* Define to 1 if you have the `getpagesize' function. */
+#if !defined(_MSC_VER) && !defined(__DMC__)
+#define HAVE_GETPAGESIZE 1
+#else
+/* #undef HAVE_GETPAGESIZE */
+#endif
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#define HAVE_GETTEXT 1
+
+/* define to use system printf */
+/* #undef HAVE_GOOD_PRINTF */
+
+/* define to support printing 64-bit integers with format I64 */
+#define HAVE_INT64_AND_I64 1
+
+/* Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>. */
+#ifndef _MSC_VER
+#define HAVE_INTMAX_T 1
+#else /* _MSC_VER */
+/* #undef HAVE_INTMAX_T */
+#endif /* _MSC_VER */
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#ifndef _MSC_VER
+#define HAVE_INTTYPES_H 1
+#else /* _MSC_VER */
+/* #undef HAVE_INTTYPES_H */
+#endif /* _MSC_VER */
+
+/* Define if <inttypes.h> exists, doesn't clash with <sys/types.h>, and
+ declares uintmax_t. */
+#ifndef _MSC_VER
+#define HAVE_INTTYPES_H_WITH_UINTMAX 1
+#else /* _MSC_VER */
+/* #undef HAVE_INTTYPES_H_WITH_UINTMAX */
+#endif /* _MSC_VER */
+
+/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
+/* #undef HAVE_LANGINFO_CODESET */
+
+/* Define to 1 if you have the <langinfo.h> header file. */
+/* #undef HAVE_LANGINFO_H */
+
+/* Define if your <locale.h> file defines LC_MESSAGES. */
+/* #undef HAVE_LC_MESSAGES */
+
+/* Define to 1 if you have the <limits.h> header file. */
+#define HAVE_LIMITS_H 1
+
+/* Define to 1 if you have the <locale.h> header file. */
+#define HAVE_LOCALE_H 1
+
+/* Define to 1 if you have the `localtime_r' function. */
+/* #undef HAVE_LOCALTIME_R */
+
+/* Define if you have the 'long double' type. */
+#define HAVE_LONG_DOUBLE 1
+
+/* Define if you have the 'long long' type. */
+#ifndef _MSC_VER
+#define HAVE_LONG_LONG 1
+#else /* _MSC_VER */
+/* #undef HAVE_LONG_LONG */
+#endif /* _MSC_VER */
+
+/* define if system printf can print long long */
+#define HAVE_LONG_LONG_FORMAT 1
+
+/* Define to 1 if you have the `lstat' function. */
+/* #undef HAVE_LSTAT */
+
+/* Define to 1 if you have the <malloc.h> header file. */
+#define HAVE_MALLOC_H 1
+
+/* Define to 1 if you have the `memalign' function. */
+/* #undef HAVE_MEMALIGN */
+
+/* Define to 1 if you have the `memmove' function. */
+#define HAVE_MEMMOVE 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have a working `mmap' system call. */
+/* #undef HAVE_MMAP */
+
+/* Have a monotonic clock */
+/* #undef HAVE_MONOTONIC_CLOCK */
+
+/* Define to 1 if you have the `nanosleep' function. */
+/* #undef HAVE_NANOSLEEP */
+
+/* Define to 1 if you have the `nl_langinfo' function. */
+/* #undef HAVE_NL_LANGINFO */
+
+/* Have non-POSIX function getpwuid_r */
+/* #undef HAVE_NONPOSIX_GETPWUID_R */
+
+/* Define to 1 if you have the `nsleep' function. */
+/* #undef HAVE_NSLEEP */
+
+/* Define to 1 if you have the `on_exit' function. */
+/* #undef HAVE_ON_EXIT */
+
+/* Define to 1 if you have the `poll' function. */
+/* #undef HAVE_POLL */
+
+/* Have POSIX function getpwuid_r */
+/* #undef HAVE_POSIX_GETPWUID_R */
+
+/* Define to 1 if you have the `posix_memalign' function. */
+/* #undef HAVE_POSIX_MEMALIGN */
+
+/* Have function pthread_attr_setstacksize */
+/* #undef HAVE_PTHREAD_ATTR_SETSTACKSIZE */
+
+/* Define to 1 if the system has the type `ptrdiff_t'. */
+#define HAVE_PTRDIFF_T 1
+
+/* Define to 1 if you have the <pwd.h> header file. */
+/* #undef HAVE_PWD_H */
+
+/* Define to 1 if you have the `readlink' function. */
+/* #undef HAVE_READLINK */
+
+/* Define to 1 if you have the <sched.h> header file. */
+/* #undef HAVE_SCHED_H */
+
+/* Define to 1 if you have the `setenv' function. */
+/* #undef HAVE_SETENV */
+
+/* Define to 1 if you have the `setlocale' function. */
+#define HAVE_SETLOCALE 1
+
+/* Define to 1 if you have the `snprintf' function. */
+#ifndef _MSC_VER
+#define HAVE_SNPRINTF 1
+#ifdef __DMC__
+#define snprintf _snprintf
+#endif
+#else /* _MSC_VER */
+/* #undef HAVE_SNPRINTF */
+#endif /* _MSC_VER */
+
+/* Define to 1 if you have the <stddef.h> header file. */
+#define HAVE_STDDEF_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#ifndef _MSC_VER
+#define HAVE_STDINT_H 1
+#else /* _MSC_VER */
+/* #undef HAVE_STDINT_H */
+#endif /* _MSC_VER */
+
+/* Define if <stdint.h> exists, doesn't clash with <sys/types.h>, and declares
+ uintmax_t. */
+#ifndef _MSC_VER
+#define HAVE_STDINT_H_WITH_UINTMAX 1
+#else /* _MSC_VER */
+/* #undef HAVE_STDINT_H_WITH_UINTMAX */
+#endif /* _MSC_VER */
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `stpcpy' function. */
+/* #undef HAVE_STPCPY */
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#if !defined(_MSC_VER) && !defined(__DMC__)
+#define HAVE_STRCASECMP 1
+#else /* _MSC_VER or __DMC__ */
+/* #undef HAVE_STRCASECMP */
+#endif /* _MSC_VER or __DMC__ */
+
+/* Define to 1 if you have the `strerror' function. */
+#define HAVE_STRERROR 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#if !defined(_MSC_VER) && !defined(__DMC__)
+#define HAVE_STRINGS_H 1
+#else /* _MSC_VER or __DMC__ */
+/* #undef HAVE_STRINGS_H */
+#endif /* _MSC_VER or __DMC__ */
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Have functions strlcpy and strlcat */
+/* #undef HAVE_STRLCPY */
+
+/* Define to 1 if you have the `strncasecmp' function. */
+#if !defined(_MSC_VER) && !defined(__DMC__)
+#define HAVE_STRNCASECMP 1
+#else /* _MSC_VER or __DMC__ */
+/* #undef HAVE_STRNCASECMP */
+#endif /* _MSC_VER or __DMC__ */
+
+/* Define to 1 if you have the `strsignal' function. */
+/* #undef HAVE_STRSIGNAL */
+
+/* Define to 1 if you have the `symlink' function. */
+/* #undef HAVE_SYMLINK */
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#if !defined(_MSC_VER) && !defined(__DMC__)
+#define HAVE_SYS_PARAM_H 1
+#else /* _MSC_VER or __DMC__ */
+/* #undef HAVE_SYS_PARAM_H */
+#endif /* _MSC_VER or __DMC__ */
+
+/* Define to 1 if you have the <sys/poll.h> header file. */
+/* #undef HAVE_SYS_POLL_H */
+
+/* found fd_set in sys/select.h */
+/* #undef HAVE_SYS_SELECT_H */
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/times.h> header file. */
+/* #undef HAVE_SYS_TIMES_H */
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#ifndef _MSC_VER
+#define HAVE_SYS_TIME_H 1
+#else /* _MSC_VER */
+/* #undef HAVE_SYS_TIME_H */
+#endif /* _MSC_VER */
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+/* #undef HAVE_SYS_WAIT_H */
+
+/* Define to 1 if you have the `timegm' function. */
+/* #undef HAVE_TIMEGM */
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#ifndef _MSC_VER
+#define HAVE_UNISTD_H 1
+#else /* _MSC_VER */
+/* #undef HAVE_UNISTD_H */
+#endif /* _MSC_VER */
+
+/* Define if your printf function family supports positional parameters as
+ specified by Unix98. */
+/* #undef HAVE_UNIX98_PRINTF */
+
+/* Define to 1 if you have the `unsetenv' function. */
+/* #undef HAVE_UNSETENV */
+
+/* Define to 1 if you have the `valloc' function. */
+/* #undef HAVE_VALLOC */
+
+/* Define to 1 if you have the <values.h> header file. */
+#if !defined(_MSC_VER) && !defined(__DMC__)
+#define HAVE_VALUES_H 1
+#else /* _MSC_VER or __DMC__ */
+/* #undef HAVE_VALUES_H */
+#endif /* _MSC_VER or __DMC__ */
+
+/* Define to 1 if you have the `vasprintf' function. */
+#define HAVE_VASPRINTF 1
+
+/* Define to 1 if you have the `vprintf' function. */
+#define HAVE_VPRINTF 1
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#ifndef _MSC_VER
+#define HAVE_VSNPRINTF 1
+#ifdef __DMC__
+#define vsnprintf _vsnprintf
+#endif
+#else /* _MSC_VER */
+/* #undef HAVE_VSNPRINTF */
+#endif /* _MSC_VER */
+
+/* Define if you have the 'wchar_t' type. */
+#define HAVE_WCHAR_T 1
+
+/* Define to 1 if you have the `wcslen' function. */
+#define HAVE_WCSLEN 1
+
+/* Define if you have the 'wint_t' type. */
+#define HAVE_WINT_T 1
+
+/* Have a working bcopy */
+/* #undef HAVE_WORKING_BCOPY */
+
+/* Define to 1 if you have the `_NSGetEnviron' function. */
+/* #undef HAVE__NSGETENVIRON */
+
+/* Do we cache iconv descriptors */
+#define NEED_ICONV_CACHE 1
+
+/* didn't find fd_set */
+#define NO_FD_SET 1
+
+/* global 'sys_errlist' not found */
+#define NO_SYS_ERRLIST 1
+
+/* global 'sys_siglist' not found */
+#define NO_SYS_SIGLIST 1
+
+/* global 'sys_siglist' not declared */
+#define NO_SYS_SIGLIST_DECL 1
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "http://bugzilla.gnome.org/enter_bug.cgi?product=glib"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "glib"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "glib @GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@.@GLIB_MICRO_VERSION@"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "glib"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@.@GLIB_MICRO_VERSION@"
+
+/* Maximum POSIX RT priority */
+/* #undef POSIX_MAX_PRIORITY */
+
+/* define if posix_memalign() can allocate any size */
+/* #undef POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS */
+
+/* Minimum POSIX RT priority */
+/* #undef POSIX_MIN_PRIORITY */
+
+/* The POSIX RT yield function */
+/* #undef POSIX_YIELD_FUNC */
+
+/* whether realloc (NULL,) works */
+#define REALLOC_0_WORKS 1
+
+/* Define if you have correct malloc prototypes */
+#ifndef _MSC_VER
+#define SANE_MALLOC_PROTOS 1
+#else /* _MSC_VER */
+/* #undef SANE_MALLOC_PROTOS */
+#endif /* _MSC_VER */
+
+/* The size of a `char', as computed by sizeof. */
+#define SIZEOF_CHAR 1
+
+/* The size of a `int', as computed by sizeof. */
+#define SIZEOF_INT 4
+
+/* The size of a `long', as computed by sizeof. */
+#define SIZEOF_LONG 4
+
+/* The size of a `long long', as computed by sizeof. */
+#ifndef _MSC_VER
+#define SIZEOF_LONG_LONG 8
+#else /* _MSC_VER */
+#define SIZEOF_LONG_LONG 0
+#endif /* _MSC_VER */
+
+/* The size of a `short', as computed by sizeof. */
+#define SIZEOF_SHORT 2
+
+/* The size of a `size_t', as computed by sizeof. */
+#define SIZEOF_SIZE_T 4
+
+/* The size of a `void *', as computed by sizeof. */
+#define SIZEOF_VOID_P 4
+
+/* The size of a `__int64', as computed by sizeof. */
+#define SIZEOF___INT64 8
+
+/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at run-time.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown */
+/* #undef STACK_DIRECTION */
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Using GNU libiconv */
+#define USE_LIBICONV_GNU 1
+
+/* Using a native implementation of iconv in a separate library */
+/* #undef USE_LIBICONV_NATIVE */
+
+/* using the system-supplied PCRE library */
+/* #undef USE_SYSTEM_PCRE */
+
+/* Define to 1 if your processor stores words with the most significant byte
+ first (like Motorola and SPARC, unlike Intel and VAX). */
+/* #undef WORDS_BIGENDIAN */
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to long or long long if <inttypes.h> and <stdint.h> don't define. */
+#ifndef _MSC_VER
+/* #undef intmax_t */
+#else /* _MSC_VER */
+#define intmax_t __int64
+#endif /* _MSC_VER */
+
+/* Define to empty if the C compiler doesn't support this keyword. */
+/* #undef signed */
+
+/* Define to `unsigned' if <sys/types.h> does not define. */
+/* #undef size_t */
diff --git a/trunk/configure.in b/trunk/configure.in
new file mode 100644
index 000000000..93faabe9d
--- /dev/null
+++ b/trunk/configure.in
@@ -0,0 +1,2995 @@
+# Process this file with autoconf to produce a configure script.
+# require autoconf 2.54
+AC_PREREQ(2.54)
+
+dnl ***********************************
+dnl *** include special GLib macros ***
+dnl ***********************************
+
+m4_define(glib_configure_in)
+m4_include(acglib.m4)dnl
+m4_include(glib/libcharset/codeset.m4)dnl
+m4_include(glib/libcharset/glibc21.m4)dnl
+m4_include(m4macros/glib-gettext.m4)dnl
+
+#
+# The following version number definitions apply to GLib, GModule, GObject
+# and GThread as a whole, so if changes occoured in any of them, they are all
+# treated with the same interface and binary age.
+#
+# Making releases:
+# glib_micro_version += 1;
+# glib_interface_age += 1;
+# glib_binary_age += 1;
+# if any functions have been added, set glib_interface_age to 0.
+# if backwards compatibility has been broken,
+# set glib_binary_age _and_ glib_interface_age to 0.
+#
+m4_define([glib_major_version], [2])
+m4_define([glib_minor_version], [13])
+m4_define([glib_micro_version], [4])
+m4_define([glib_interface_age], [0])
+m4_define([glib_binary_age],
+ [m4_eval(100 * glib_minor_version + glib_micro_version)])
+m4_define([glib_version],
+ [glib_major_version.glib_minor_version.glib_micro_version])
+
+# libtool version related macros
+m4_define([glib_lt_release], [glib_major_version.glib_minor_version])
+m4_define([glib_lt_current],
+ [m4_eval(100 * glib_minor_version + glib_micro_version - glib_interface_age)])
+m4_define([glib_lt_revision], [glib_interface_age])
+m4_define([glib_lt_age], [m4_eval(glib_binary_age - glib_interface_age)])
+m4_define([glib_lt_current_minus_age],
+ [m4_eval(glib_lt_current - glib_lt_age)])
+
+# if the minor version number is odd, then we want debugging. Otherwise
+# we only want minimal debugging support.
+m4_define([glib_debug_default],
+ [m4_if(m4_eval(glib_minor_version % 2), [1], [yes], [minimum])])dnl
+
+
+AC_INIT(glib, [glib_version],
+ [http://bugzilla.gnome.org/enter_bug.cgi?product=glib])
+
+AC_CONFIG_SRCDIR([glib/glib.h])
+
+# Save this value here, since automake will set cflags later
+cflags_set=${CFLAGS+set}
+
+AM_INIT_AUTOMAKE([no-define])
+
+# Specify a configuration file
+AM_CONFIG_HEADER([config.h])
+
+
+GLIB_MAJOR_VERSION=glib_major_version
+GLIB_MINOR_VERSION=glib_minor_version
+GLIB_MICRO_VERSION=glib_micro_version
+GLIB_INTERFACE_AGE=glib_interface_age
+GLIB_BINARY_AGE=glib_binary_age
+GLIB_VERSION=glib_version
+
+AC_SUBST(GLIB_MAJOR_VERSION)
+AC_SUBST(GLIB_MINOR_VERSION)
+AC_SUBST(GLIB_MICRO_VERSION)
+AC_SUBST(GLIB_VERSION)
+AC_SUBST(GLIB_INTERFACE_AGE)
+AC_SUBST(GLIB_BINARY_AGE)
+
+AC_DEFINE(GLIB_MAJOR_VERSION, [glib_major_version],
+ [Define to the GLIB major version])
+AC_DEFINE(GLIB_MINOR_VERSION, [glib_minor_version],
+ [Define to the GLIB minor version])
+AC_DEFINE(GLIB_MICRO_VERSION, [glib_micro_version],
+ [Define to the GLIB micro version])
+AC_DEFINE(GLIB_INTERFACE_AGE, [glib_interface_age],
+ [Define to the GLIB interface age])
+AC_DEFINE(GLIB_BINARY_AGE, [glib_binary_age],
+ [Define to the GLIB binary age])
+
+# libtool versioning
+LT_RELEASE=glib_lt_release
+LT_CURRENT=glib_lt_current
+LT_REVISION=glib_lt_revision
+LT_AGE=glib_lt_age
+LT_CURRENT_MINUS_AGE=glib_lt_current_minus_age
+AC_SUBST(LT_RELEASE)
+AC_SUBST(LT_CURRENT)
+AC_SUBST(LT_REVISION)
+AC_SUBST(LT_AGE)
+AC_SUBST(LT_CURRENT_MINUS_AGE)
+
+dnl Initialize maintainer mode
+AM_MAINTAINER_MODE
+
+AC_CANONICAL_HOST
+
+AC_MSG_CHECKING([for the BeOS])
+case $host in
+ *-*-beos*)
+ glib_native_beos="yes"
+ ;;
+ *)
+ glib_native_beos="no"
+ ;;
+esac
+AC_MSG_RESULT([$glib_native_beos])
+
+dnl
+
+AC_MSG_CHECKING([for Win32])
+case "$host" in
+ *-*-mingw*)
+ glib_native_win32=yes
+ GLIB_DEF=glib.def
+ GMODULE_DEF=gmodule.def
+ GOBJECT_DEF=gobject.def
+ GTHREAD_DEF=gthread.def
+ TESTGMODULE_EXP=testgmodule.exp
+ glib_pid_type='void *'
+ ;;
+ *)
+ glib_native_win32=no
+ GLIB_DEF=
+ GMODULE_DEF=
+ GOBJECT_DEF=
+ GTHREAD_DEF=
+ TESTGMODULE_EXP=
+ glib_pid_type=int
+ ;;
+esac
+case $host in
+ *-*-linux*)
+ glib_os_linux=yes
+ ;;
+esac
+
+AC_MSG_RESULT([$glib_native_win32])
+
+glib_have_carbon=no
+AC_MSG_CHECKING([for Mac OS X Carbon support])
+AC_TRY_CPP([
+#include <Carbon/Carbon.h>
+#include <CoreServices/CoreServices.h>
+], glib_have_carbon=yes)
+
+AC_MSG_RESULT([$glib_have_carbon])
+
+AM_CONDITIONAL(OS_WIN32, [test "$glib_native_win32" = "yes"])
+AM_CONDITIONAL(OS_UNIX, [test "$glib_native_win32" != "yes"])
+AM_CONDITIONAL(OS_LINUX, [test "$glib_os_linux" = "yes"])
+AM_CONDITIONAL(OS_CARBON, [test "$glib_have_carbon" = "yes"])
+AC_SUBST(GLIB_DEF)
+AC_SUBST(GMODULE_DEF)
+AC_SUBST(GOBJECT_DEF)
+AC_SUBST(GTHREAD_DEF)
+AC_SUBST(TESTGMODULE_EXP)
+
+if test "$glib_native_win32" = "yes"; then
+ AC_CHECK_TOOL(WINDRES, windres, no)
+ if test "$WINDRES" = no; then
+ AC_MSG_ERROR([*** Could not find an implementation of windres in your PATH.])
+ fi
+ AC_CHECK_TOOL(NM, nm, no)
+ if test "$NM" = no; then
+ AC_MSG_ERROR([*** Could not find an implementation of nm in your PATH.])
+ fi
+ AC_CHECK_TOOL(RANLIB, ranlib, :)
+ AC_CHECK_PROG(ms_librarian, [lib.exe], [yes], [no])
+fi
+AM_CONDITIONAL(MS_LIB_AVAILABLE, [test x$ms_librarian = xyes])
+
+if test "$glib_native_win32" != yes; then
+ # libtool option to control which symbols are exported
+ # right now, symbols starting with _ are not exported
+ LIBTOOL_EXPORT_OPTIONS='-export-symbols-regex "^g.*"'
+else
+ # We currently use .def files on Windows
+ LIBTOOL_EXPORT_OPTIONS=
+fi
+AC_SUBST(LIBTOOL_EXPORT_OPTIONS)
+
+if test "x$glib_have_carbon" = "xyes"; then
+ AC_DEFINE(HAVE_CARBON, 1, [define to 1 if Carbon is available])
+ LDFLAGS="$LDFLAGS -framework Carbon"
+fi
+
+
+dnl declare --enable-* args and collect ac_help strings
+AC_ARG_ENABLE(debug,
+ AC_HELP_STRING([--enable-debug=@<:@no/minimum/yes@:>@],
+ [turn on debugging @<:@default=glib_debug_default@:>@]),,
+ enable_debug=glib_debug_default)
+
+AC_ARG_ENABLE(gc_friendly,
+ [AC_HELP_STRING([--enable-gc-friendly],
+ [turn on garbage collector friendliness [default=no]])],,
+ [enable_gc_friendly=no])
+AC_ARG_ENABLE(mem_pools,
+ [AC_HELP_STRING([--disable-mem-pools],
+ [disable all glib memory pools])],,
+ [disable_mem_pools=no])
+AC_ARG_ENABLE(threads,
+ [AC_HELP_STRING([--enable-threads],
+ [turn on basic thread support [default=yes]
+([=no] will override --with-threads)])],,
+ [enable_threads=yes])
+AC_ARG_ENABLE(rebuilds,
+ [AC_HELP_STRING([--disable-rebuilds],
+ [disable all source autogeneration rules])],,
+ [enable_rebuilds=yes])
+AC_ARG_ENABLE(visibility,
+ [AC_HELP_STRING([--disable-visibility],
+ [don't use ELF visibility attributes])],,
+ [enable_visibility=yes])
+
+if test "x$enable_threads" != "xyes"; then
+ enable_threads=no
+fi
+
+AC_DEFINE_UNQUOTED(G_COMPILED_WITH_DEBUGGING, ["${enable_debug}"],
+ [Whether glib was compiled with debugging enabled])
+
+AC_MSG_CHECKING([whether to enable garbage collector friendliness])
+if test "x$enable_gc_friendly" = "xyes"; then
+ AC_DEFINE(ENABLE_GC_FRIENDLY_DEFAULT, 1, [Whether to enable GC friendliness by default])
+ AC_MSG_RESULT([yes])
+else
+ AC_MSG_RESULT([no])
+fi
+
+AC_MSG_CHECKING([whether to disable memory pools])
+if test "x$disable_mem_pools" = "xno"; then
+ AC_MSG_RESULT([no])
+else
+ AC_DEFINE(DISABLE_MEM_POOLS, [1], [Whether to disable memory pools])
+ AC_SUBST(DISABLE_MEM_POOLS)
+ AC_MSG_RESULT([yes])
+fi
+
+if test "$glib_native_win32" = "yes"; then
+ if test x$enable_static = xyes -o x$enable_static = x; then
+ AC_MSG_WARN([Disabling static library build, must build as DLL on Windows.])
+ enable_static=no
+ fi
+ if test x$enable_shared = xno; then
+ AC_MSG_WARN([Enabling shared library build, must build as DLL on Windows.])
+ fi
+ enable_shared=yes
+fi
+
+dnl Checks for programs.
+AC_PROG_CC
+
+dnl Check for a working C++ compiler, but do not bail out, if none is found.
+AC_CHECK_PROGS(CXX, [$CCC c++ g++ gcc CC cxx cc++ cl], [gcc])
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+AC_TRY_COMPILE(,[class a { int b; } c;], ,CXX=)
+AM_CONDITIONAL(HAVE_CXX, [test "$CXX" != ""])
+AC_LANG_RESTORE
+
+AM_PROG_CC_STDC
+AC_PROG_INSTALL
+
+AC_SYS_LARGEFILE
+
+#
+# Find pkg-config
+#
+AC_PATH_PROG(PKG_CONFIG, [pkg-config], [no])
+if test x$PKG_CONFIG = xno ; then
+ AC_MSG_ERROR([*** pkg-config not found. See http://www.freedesktop.org/software/pkgconfig/])
+fi
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.14 ; then
+ :
+else
+ AC_MSG_ERROR([*** pkg-config too old; version 0.14 or better required.])
+fi
+
+if test "x$enable_debug" = "xyes"; then
+ if test x$cflags_set != xset ; then
+ case " $CFLAGS " in
+ *[[\ \ ]]-g[[\ \ ]]*) ;;
+ *) CFLAGS="$CFLAGS -g" ;;
+ esac
+ fi
+
+ GLIB_DEBUG_FLAGS="-DG_ENABLE_DEBUG"
+else
+ GLIB_DEBUG_FLAGS="-DG_DISABLE_CAST_CHECKS"
+
+ if test "x$enable_debug" = "xno"; then
+ GLIB_DEBUG_FLAGS="$GLIB_DEBUG_FLAGS -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS"
+ fi
+fi
+
+if test "x$enable_visibility" = "xno"; then
+ GLIB_DEBUG_FLAGS="$GLIB_DEBUG_FLAGS -DDISABLE_VISIBILITY"
+fi
+
+# Ensure MSVC-compatible struct packing convention is used when
+# compiling for Win32 with gcc.
+# What flag to depends on gcc version: gcc3 uses "-mms-bitfields", while
+# gcc2 uses "-fnative-struct".
+if test x"$glib_native_win32" = xyes; then
+ if test x"$GCC" = xyes; then
+ msnative_struct=''
+ AC_MSG_CHECKING([how to get MSVC-compatible struct packing])
+ if test -z "$ac_cv_prog_CC"; then
+ our_gcc="$CC"
+ else
+ our_gcc="$ac_cv_prog_CC"
+ fi
+ case `$our_gcc --version | sed -e 's,\..*,.,' -e q` in
+ 2.)
+ if $our_gcc -v --help 2>/dev/null | grep fnative-struct >/dev/null; then
+ msnative_struct='-fnative-struct'
+ fi
+ ;;
+ *)
+ if $our_gcc -v --help 2>/dev/null | grep ms-bitfields >/dev/null; then
+ msnative_struct='-mms-bitfields'
+ fi
+ ;;
+ esac
+ if test x"$msnative_struct" = x ; then
+ AC_MSG_RESULT([no way])
+ AC_MSG_WARN([produced libraries might be incompatible with MSVC-compiled code])
+ else
+ CFLAGS="$CFLAGS $msnative_struct"
+ AC_MSG_RESULT([${msnative_struct}])
+ fi
+ fi
+fi
+
+AC_EXEEXT
+
+# define a MAINT-like variable REBUILD which is set if Perl
+# and awk are found, so autogenerated sources can be rebuilt
+AC_PROG_AWK
+AC_CHECK_PROGS(PERL, [perl5 perl])
+# We would like indent, but don't require it.
+AC_CHECK_PROG(INDENT, indent, indent)
+REBUILD=\#
+if test "x$enable_rebuilds" = "xyes" && \
+ test -n "$PERL" && \
+ $PERL -e 'exit !($] >= 5.002)' > /dev/null 2>&1 && \
+ test -n "$AWK" ; then
+ REBUILD=
+fi
+AC_SUBST(REBUILD)
+
+# Need full path to Perl for glib-mkenums
+#
+if test "x$PERL" != x ; then
+ AC_PATH_PROG(PERL_PATH, [$PERL])
+fi
+if test "x$PERL_PATH" = x ; then
+ PERL_PATH="/usr/bin/env perl"
+fi
+AC_SUBST(PERL_PATH)
+
+dnl ***********************
+dnl *** Tests for iconv ***
+dnl ***********************
+dnl
+dnl We do this before the gettext checks, to avoid distortion
+
+AC_ARG_WITH(libiconv,
+ [AC_HELP_STRING([--with-libiconv=@<:@no/gnu/native@:>@],
+ [use the libiconv library])],,
+ [with_libiconv=maybe])
+
+found_iconv=no
+case $with_libiconv in
+ maybe)
+ # Check in the C library first
+ AC_CHECK_FUNC(iconv_open, [with_libiconv=no; found_iconv=yes])
+ # Check if we have GNU libiconv
+ if test $found_iconv = "no"; then
+ AC_CHECK_LIB(iconv, libiconv_open, [with_libiconv=gnu; found_iconv=yes])
+ fi
+ # Check if we have a iconv in -liconv, possibly from vendor
+ if test $found_iconv = "no"; then
+ AC_CHECK_LIB(iconv, iconv_open, [with_libiconv=native; found_iconv=yes])
+ fi
+ ;;
+ no)
+ AC_CHECK_FUNC(iconv_open, [with_libiconv=no; found_iconv=yes])
+ ;;
+ gnu|yes)
+ AC_CHECK_LIB(iconv, libiconv_open, [with_libiconv=gnu; found_iconv=yes])
+ ;;
+ native)
+ AC_CHECK_LIB(iconv, iconv_open, [with_libiconv=native; found_iconv=yes])
+ ;;
+esac
+
+if test "x$found_iconv" = "xno" ; then
+ AC_MSG_ERROR([*** No iconv() implementation found in C library or libiconv])
+fi
+
+jm_GLIBC21
+AC_ARG_ENABLE(iconv-cache,
+ [AC_HELP_STRING([--enable-iconv-cache=@<:@yes/no/auto@:>@],
+ [cache iconv descriptors [default=auto]])],,
+ [enable_iconv_cache=auto])
+
+AC_MSG_CHECKING([Whether to cache iconv descriptors])
+case $enable_iconv_cache in
+ auto)
+ if test $ac_cv_gnu_library_2_1 = yes; then
+ enable_iconv_cache=no
+ else
+ enable_iconv_cache=yes
+ fi
+ ;;
+ yes|no)
+ ;;
+ *) AC_MSG_ERROR([Value given to --enable-iconv-cache must be one of yes, no or auto])
+ ;;
+esac
+
+if test $enable_iconv_cache = yes; then
+ AC_DEFINE(NEED_ICONV_CACHE,1,[Do we cache iconv descriptors])
+fi
+
+AC_MSG_RESULT($enable_iconv_cache)
+
+
+dnl
+dnl gettext support
+dnl
+
+ALL_LINGUAS="am ar az be be@latin bg bn bn_IN bs ca cs cy da de dz el en_CA en_GB eo es et eu fa fi fr ga gl gu he hi hr hu hy id is it ja ka ko ku lt lv mg mk ml mn ms nb ne nl nn or pa pl pt pt_BR ro ru rw sk sl sq sr sr@Latn sr@ije sv ta te th tl tr tt uk vi wa xh yi zh_CN zh_HK zh_TW"
+GLIB_GNU_GETTEXT
+
+if test "$gt_cv_have_gettext" != "yes" ; then
+ AC_MSG_ERROR([
+*** You must have either have gettext support in your C library, or use the
+*** GNU gettext library. (http://www.gnu.org/software/gettext/gettext.html
+])
+fi
+
+LIBS="$INTLLIBS $LIBS"
+
+GETTEXT_PACKAGE=glib20
+AC_SUBST(GETTEXT_PACKAGE)
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, ["$GETTEXT_PACKAGE"],
+ [Define the gettext package to be used])
+
+GLIB_DEFINE_LOCALEDIR(GLIB_LOCALE_DIR)
+
+dnl
+dnl Now we are done with gettext checks, figure out ICONV_LIBS
+dnl
+
+if test x$with_libiconv != xno ; then
+ case " $INTLLIBS " in
+ *[[\ \ ]]-liconv[[\ \ ]]*) ;;
+ *) ICONV_LIBS="-liconv" ;;
+ esac
+fi
+AC_SUBST(ICONV_LIBS)
+
+case $with_libiconv in
+ gnu)
+ AC_DEFINE(USE_LIBICONV_GNU, 1, [Using GNU libiconv])
+ ;;
+ native)
+ AC_DEFINE(USE_LIBICONV_NATIVE, 1, [Using a native implementation of iconv in a separate library])
+ ;;
+esac
+
+dnl Initialize libtool
+AM_DISABLE_STATIC
+AC_LIBTOOL_WIN32_DLL
+AM_PROG_LIBTOOL
+
+if test "x$GCC" = "xyes"; then
+ case " $CFLAGS " in
+ *[[\ \ ]]-Wall[[\ \ ]]*) ;;
+ *) CFLAGS="$CFLAGS -Wall" ;;
+ esac
+fi
+
+dnl
+dnl DU4 native cc currently needs -std1 for ANSI mode (instead of K&R)
+dnl
+if test $cross_compiling != yes ; then
+ AC_MSG_CHECKING([for extra flags to get ANSI library prototypes])
+ glib_save_LIBS=$LIBS
+ LIBS="$LIBS -lm"
+ AC_TRY_RUN([#include <math.h>
+ int main (void) { return (log(1) != log(1.)); }],
+ AC_MSG_RESULT(none needed),
+ glib_save_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS -std1"
+ AC_TRY_RUN([#include <math.h>
+ int main (void) { return (log(1) != log(1.)); }],
+ AC_MSG_RESULT(-std1),
+ AC_MSG_RESULT()
+ CFLAGS=$glib_save_CFLAGS
+ AC_MSG_WARN(
+ [No ANSI prototypes found in library. (-std1 didn't work.)])
+ )
+ )
+ LIBS=$glib_save_LIBS
+fi
+
+dnl NeXTStep cc seems to need this
+AC_MSG_CHECKING([for extra flags for POSIX compliance])
+AC_TRY_COMPILE([#include <dirent.h>], [DIR *dir;],
+ AC_MSG_RESULT(none needed),
+ glib_save_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS -posix"
+ AC_TRY_COMPILE([#include <dirent.h>], [DIR *dir;],
+ AC_MSG_RESULT(-posix),
+ AC_MSG_RESULT()
+ CFLAGS=$glib_save_CFLAGS
+ AC_MSG_WARN([Could not determine POSIX flag. (-posix didn't work.)])))
+
+# Checks for header files.
+AC_HEADER_STDC
+
+# Checks for library functions.
+AC_FUNC_VPRINTF
+AC_FUNC_MMAP
+AC_FUNC_ALLOCA
+AC_CHECK_FUNCS(posix_memalign)
+AC_CHECK_FUNCS(memalign)
+AC_CHECK_FUNCS(valloc)
+
+AC_CHECK_FUNCS(atexit on_exit)
+
+AC_CHECK_FUNCS(timegm)
+
+AC_CHECK_SIZEOF(char)
+AC_CHECK_SIZEOF(short)
+AC_CHECK_SIZEOF(long)
+AC_CHECK_SIZEOF(int)
+AC_CHECK_SIZEOF(void *)
+AC_CHECK_SIZEOF(long long)
+AC_CHECK_SIZEOF(__int64)
+
+if test x$ac_cv_sizeof_long = x8 || test x$ac_cv_sizeof_long_long = x8 || test x$ac_cv_sizeof___int64 = x8 ; then
+ :
+else
+ AC_MSG_ERROR([
+*** GLib requires a 64 bit type. You might want to consider
+*** using the GNU C compiler.
+])
+fi
+
+if test x$glib_native_win32 != xyes && test x$ac_cv_sizeof_long_long = x8; then
+ # long long is a 64 bit integer.
+ AC_MSG_CHECKING(for format to printf and scanf a guint64)
+ AC_CACHE_VAL(glib_cv_long_long_format,[
+ for format in ll q I64; do
+ AC_TRY_RUN([#include <stdio.h>
+ int main()
+ {
+ long long b, a = -0x3AFAFAFAFAFAFAFALL;
+ char buffer[1000];
+ sprintf (buffer, "%${format}u", a);
+ sscanf (buffer, "%${format}u", &b);
+ exit (b!=a);
+ }
+ ],
+ [glib_cv_long_long_format=${format}
+ break],
+ [],[:])
+ done])
+ if test -n "$glib_cv_long_long_format"; then
+ AC_MSG_RESULT(%${glib_cv_long_long_format}u)
+ AC_DEFINE(HAVE_LONG_LONG_FORMAT,1,[define if system printf can print long long])
+ if test x"$glib_cv_long_long_format" = xI64; then
+ AC_DEFINE(HAVE_INT64_AND_I64,1,[define to support printing 64-bit integers with format I64])
+ fi
+ else
+ AC_MSG_RESULT(none)
+ fi
+elif test x$ac_cv_sizeof___int64 = x8; then
+ # __int64 is a 64 bit integer.
+ AC_MSG_CHECKING(for format to printf and scanf a guint64)
+ # We know this is MSVCRT.DLL, and what the formats are
+ glib_cv_long_long_format=I64
+ AC_MSG_RESULT(%${glib_cv_long_long_format}u)
+ AC_DEFINE(HAVE_LONG_LONG_FORMAT,1,[define if system printf can print long long])
+ AC_DEFINE(HAVE_INT64_AND_I64,1,[define to support printing 64-bit integers with format I64])
+fi
+
+dnl long doubles were not used, and a portability problem
+dnl AC_C_LONG_DOUBLE
+AC_C_CONST
+
+dnl ok, here we try to check whether the systems prototypes for
+dnl malloc and friends actually match the prototypes provided
+dnl by gmem.h (keep in sync). i currently only know how to check
+dnl this reliably with gcc (-Werror), improvements for other
+dnl compilers are apprechiated.
+SANE_MALLOC_PROTOS=no
+AC_MSG_CHECKING([if malloc() and friends prototypes are gmem.h compatible])
+glib_save_CFLAGS=$CFLAGS
+if test "x$GCC" = "xyes"; then
+ CFLAGS="$CFLAGS -Werror"
+ AC_TRY_COMPILE([#include <stdlib.h>], [
+ void* (*my_calloc_p) (size_t, size_t) = calloc;
+ void* (*my_malloc_p) (size_t) = malloc;
+ void (*my_free_p) (void*) = free;
+ void* (*my_realloc_p) (void*, size_t) = realloc;
+ my_calloc_p = 0;
+ my_malloc_p = 0;
+ my_free_p = 0;
+ my_realloc_p = 0;
+ ],
+ AC_DEFINE(SANE_MALLOC_PROTOS, 1,
+ [Define if you have correct malloc prototypes])
+ SANE_MALLOC_PROTOS=yes)
+fi
+AC_MSG_RESULT($SANE_MALLOC_PROTOS)
+CFLAGS=$glib_save_CFLAGS
+
+dnl
+dnl check in which direction the stack grows
+dnl
+AC_CACHE_CHECK([for growing stack pointer],glib_cv_stack_grows,[
+ AC_TRY_RUN([
+ volatile int *a = 0, *b = 0;
+ void foo (void);
+ int main () { volatile int y = 7; a = &y; foo (); return b > a; }
+ void foo (void) { volatile int x = 5; b = &x; }
+ ],
+ glib_cv_stack_grows=no
+ ,
+ glib_cv_stack_grows=yes
+ ,)
+])
+
+dnl AC_C_INLINE is useless to us since it bails out too early, we need to
+dnl truely know which ones of `inline', `__inline' and `__inline__' are
+dnl actually supported.
+AC_CACHE_CHECK([for __inline],glib_cv_has__inline,[
+ AC_COMPILE_IFELSE([
+ __inline int foo () { return 0; }
+ int main () { return foo (); }
+ ],
+ glib_cv_has__inline=yes
+ ,
+ glib_cv_has__inline=no
+ ,)
+])
+case x$glib_cv_has__inline in
+xyes) AC_DEFINE(G_HAVE___INLINE,1,[Have __inline keyword])
+esac
+AC_CACHE_CHECK([for __inline__],glib_cv_has__inline__,[
+ AC_COMPILE_IFELSE([
+ __inline__ int foo () { return 0; }
+ int main () { return foo (); }
+ ],
+ glib_cv_has__inline__=yes
+ ,
+ glib_cv_has__inline__=no
+ ,)
+])
+case x$glib_cv_has__inline__ in
+xyes) AC_DEFINE(G_HAVE___INLINE__,1,[Have __inline__ keyword])
+esac
+AC_CACHE_CHECK([for inline], glib_cv_hasinline,[
+ AC_COMPILE_IFELSE([
+ #undef inline
+ inline int foo () { return 0; }
+ int main () { return foo (); }
+ ],
+ glib_cv_hasinline=yes
+ ,
+ glib_cv_hasinline=no
+ ,)
+])
+case x$glib_cv_hasinline in
+xyes) AC_DEFINE(G_HAVE_INLINE,1,[Have inline keyword])
+esac
+
+# if we can use inline functions in headers
+AC_MSG_CHECKING(if inline functions in headers work)
+AC_LINK_IFELSE([
+#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
+# endif
+#endif
+
+int glib_test_func2 (int);
+
+static inline int
+glib_test_func1 (void) {
+ return glib_test_func2 (1);
+}
+
+int
+main (void) {
+ int i = 1;
+}],[g_can_inline=yes],[g_can_inline=no])
+AC_MSG_RESULT($g_can_inline)
+
+dnl *** check for working do while(0) macros ***
+AC_CACHE_CHECK([for working do while(0) macros], g_support_dowhile_macros, [
+ AC_TRY_COMPILE([],[
+ #define STMT_START do
+ #define STMT_END while(0)
+ #define STMT_TEST STMT_START { i = 0; } STMT_END
+ int main(void) { int i = 1; STMT_TEST; return i; }],
+ [g_support_dowhile_macros=yes],
+ [g_support_dowhile_macros=no],
+ [g_support_dowhile_macros=yes])
+])
+if test x$g_support_dowhile_macros = xyes; then
+ AC_DEFINE(HAVE_DOWHILE_MACROS, 1, [define for working do while(0) macros])
+fi
+
+# check for flavours of varargs macros
+AC_MSG_CHECKING(for ISO C99 varargs macros in C)
+AC_TRY_COMPILE([],[
+int a(int p1, int p2, int p3);
+#define call_a(...) a(1,__VA_ARGS__)
+call_a(2,3);
+],g_have_iso_c_varargs=yes,g_have_iso_c_varargs=no)
+AC_MSG_RESULT($g_have_iso_c_varargs)
+
+AC_MSG_CHECKING(for ISO C99 varargs macros in C++)
+if test "$CXX" = ""; then
+dnl No C++ compiler
+ g_have_iso_cxx_varargs=no
+else
+ AC_LANG_CPLUSPLUS
+ AC_TRY_COMPILE([],[
+int a(int p1, int p2, int p3);
+#define call_a(...) a(1,__VA_ARGS__)
+call_a(2,3);
+],g_have_iso_cxx_varargs=yes,g_have_iso_cxx_varargs=no)
+ AC_LANG_C
+fi
+AC_MSG_RESULT($g_have_iso_cxx_varargs)
+
+AC_MSG_CHECKING(for GNUC varargs macros)
+AC_TRY_COMPILE([],[
+int a(int p1, int p2, int p3);
+#define call_a(params...) a(1,params)
+call_a(2,3);
+],g_have_gnuc_varargs=yes,g_have_gnuc_varargs=no)
+AC_MSG_RESULT($g_have_gnuc_varargs)
+
+# check for GNUC visibility support
+AC_MSG_CHECKING(for GNUC visibility attribute)
+GLIB_CHECK_COMPILE_WARNINGS([
+void
+__attribute__ ((visibility ("hidden")))
+ f_hidden (void)
+{
+}
+void
+__attribute__ ((visibility ("internal")))
+ f_internal (void)
+{
+}
+void
+__attribute__ ((visibility ("protected")))
+ f_protected (void)
+{
+}
+void
+__attribute__ ((visibility ("default")))
+ f_default (void)
+{
+}
+int main (int argc, char **argv)
+{
+ f_hidden();
+ f_internal();
+ f_protected();
+ f_default();
+ return 0;
+}
+],g_have_gnuc_visibility=yes,g_have_gnuc_visibility=no)
+AC_MSG_RESULT($g_have_gnuc_visibility)
+AM_CONDITIONAL(HAVE_GNUC_VISIBILITY, [test x$g_have_gnuc_visibility = xyes])
+
+AC_MSG_CHECKING([whether using Sun Studio C compiler])
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#if defined(__SUNPRO_C) || (__SUNPRO_C >= 0x550)
+#else
+# include "error: this is not Sun Studio."
+#endif
+]], [[]])], [ g_have_sunstudio_visibility=yes ], [ g_have_sunstudio_visibility=no ])
+AC_MSG_RESULT($g_have_sunstudio_visibility)
+AM_CONDITIONAL(HAVE_SUNSTUDIO_VISIBILITY, [test x$g_have_sunstudio_visibility = xyes])
+
+# check for bytesex stuff
+AC_C_BIGENDIAN
+
+# check for header files
+AC_CHECK_HEADERS([dirent.h float.h limits.h pwd.h sys/param.h sys/poll.h])
+AC_CHECK_HEADERS([sys/time.h sys/times.h sys/wait.h unistd.h values.h])
+AC_CHECK_HEADERS([sys/select.h sys/types.h stdint.h sched.h malloc.h])
+
+# Checks for libcharset
+jm_LANGINFO_CODESET
+jm_GLIBC21
+AC_CHECK_HEADERS([stddef.h stdlib.h string.h])
+AC_CHECK_FUNCS(setlocale)
+
+# check additional type sizes
+AC_CHECK_SIZEOF(size_t)
+
+dnl Try to figure out whether gsize, gssize should be long or int
+AC_MSG_CHECKING([for the appropriate definition for size_t])
+
+case $ac_cv_sizeof_size_t in
+ $ac_cv_sizeof_short)
+ glib_size_type=short
+ ;;
+ $ac_cv_sizeof_int)
+ glib_size_type=int
+ ;;
+ $ac_cv_sizeof_long)
+ glib_size_type=long
+ ;;
+ *) AC_MSG_ERROR([No type matching size_t in size])
+ ;;
+esac
+
+dnl If int/long are the same size, we see which one produces
+dnl warnings when used in the location as size_t. (This matters
+dnl on AIX with xlc)
+dnl
+if test $ac_cv_sizeof_size_t = $ac_cv_sizeof_int &&
+ test $ac_cv_sizeof_size_t = $ac_cv_sizeof_long ; then
+ GLIB_CHECK_COMPILE_WARNINGS([
+#if defined(_AIX) && !defined(__GNUC__)
+#pragma options langlvl=stdc89
+#endif
+#include <stddef.h>
+int main ()
+{
+ size_t s = 1;
+ unsigned int *size_int = &s;
+ return (int)*size_int;
+}
+ ],glib_size_type=int,
+ [GLIB_CHECK_COMPILE_WARNINGS([
+#if defined(_AIX) && !defined(__GNUC__)
+#pragma options langlvl=stdc89
+#endif
+#include <stddef.h>
+int main ()
+{
+ size_t s = 1;
+ unsigned long *size_long = &s;
+ return (int)*size_long;
+}
+ ],glib_size_type=long)])
+fi
+
+AC_MSG_RESULT(unsigned $glib_size_type)
+
+# Check for some functions
+AC_CHECK_FUNCS(lstat strerror strsignal memmove vsnprintf stpcpy strcasecmp strncasecmp poll getcwd vasprintf setenv unsetenv getc_unlocked readlink symlink fdwalk)
+# Check for high-resolution sleep functions
+AC_CHECK_FUNCS(nanosleep nsleep)
+
+AC_CHECK_HEADERS(crt_externs.h)
+AC_CHECK_FUNCS(_NSGetEnviron)
+
+AC_FUNC_VSNPRINTF_C99
+AC_FUNC_PRINTF_UNIX98
+
+#
+# Check whether to use an included printf
+#
+
+AC_ARG_ENABLE(included-printf,
+ [AC_HELP_STRING([--enable-included-printf],
+ [use included printf [default=auto]])],
+ enable_included_printf="$enableval")
+
+need_included_printf=no
+if test "x$enable_included_printf" = "xyes" ; then
+ need_included_printf=yes
+fi
+if test "$ac_cv_func_vsnprintf_c99" != "yes" ; then
+ need_included_printf=yes
+fi
+if test "$ac_cv_func_printf_unix98" != "yes" ; then
+ need_included_printf=yes
+fi
+if test "x$ac_cv_sizeof_long_long" = "x8" &&
+ test -z "$glib_cv_long_long_format" ; then
+ need_included_printf=yes
+fi
+
+if test "x$enable_included_printf" = "xno" &&
+ test "x$need_included_printf" = "xyes" ; then
+ AC_MSG_ERROR([
+*** Your C library's printf doesn't appear to have the features that
+*** GLib needs, but you specified --enable-included-printf=no.])
+fi
+
+enable_included_printf=$need_included_printf
+
+AM_CONDITIONAL(HAVE_GOOD_PRINTF, test "$enable_included_printf" != "yes")
+if test "$enable_included_printf" != "yes" ; then
+ AC_DEFINE(HAVE_GOOD_PRINTF,1,[define to use system printf])
+else
+ if test -z "$glib_cv_long_long_format" ; then
+ glib_cv_long_long_format="ll"
+ fi
+ AC_DEFINE(HAVE_VASPRINTF,1)
+fi
+
+# Checks needed for gnulib vasnprintf
+bh_C_SIGNED
+jm_AC_TYPE_LONG_LONG
+gt_TYPE_LONGDOUBLE
+gt_TYPE_WCHAR_T
+gt_TYPE_WINT_T
+AC_TYPE_SIZE_T
+AC_CHECK_TYPES(ptrdiff_t)
+jm_AC_TYPE_INTMAX_T
+AC_CHECK_FUNCS([snprintf wcslen])
+AC_FUNC_SNPRINTF_C99
+
+# Check if bcopy can be used for overlapping copies, if memmove isn't found.
+# The check is borrowed from the PERL Configure script.
+if test "$ac_cv_func_memmove" != "yes"; then
+ AC_CACHE_CHECK(whether bcopy can handle overlapping copies,
+ glib_cv_working_bcopy,[AC_TRY_RUN([
+ int main() {
+ char buf[128], abc[128], *b;
+ int len, off, align;
+ bcopy("abcdefghijklmnopqrstuvwxyz0123456789", abc, 36);
+ for (align = 7; align >= 0; align--) {
+ for (len = 36; len; len--) {
+ b = buf+align; bcopy(abc, b, len);
+ for (off = 1; off <= len; off++) {
+ bcopy(b, b+off, len); bcopy(b+off, b, len);
+ if (bcmp(b, abc, len)) return(1);
+ }
+ }
+ }
+ return(0);
+ }],glib_cv_working_bcopy=yes,glib_cv_working_bcopy=no)])
+
+ GLIB_ASSERT_SET(glib_cv_working_bcopy)
+ if test "$glib_cv_working_bcopy" = "yes"; then
+ AC_DEFINE(HAVE_WORKING_BCOPY,1,[Have a working bcopy])
+ fi
+fi
+
+# Check for sys_errlist
+AC_MSG_CHECKING(for sys_errlist)
+AC_TRY_LINK(, [
+extern char *sys_errlist[];
+extern int sys_nerr;
+sys_errlist[sys_nerr-1][0] = 0;
+], glib_ok=yes, glib_ok=no)
+AC_MSG_RESULT($glib_ok)
+if test "$glib_ok" = "no"; then
+ AC_DEFINE(NO_SYS_ERRLIST,1,[global 'sys_errlist' not found])
+fi
+
+# Check for sys_siglist
+AC_MSG_CHECKING(for sys_siglist)
+AC_TRY_LINK(, [
+extern char *sys_siglist[];
+exit (sys_siglist[0]);
+], glib_ok=yes, glib_ok=no)
+AC_MSG_RESULT($glib_ok)
+if test "$glib_ok" = "no"; then
+ AC_DEFINE(NO_SYS_SIGLIST,1,[global 'sys_siglist' not found])
+fi
+
+# Check for sys_siglist decl (see Tue Jan 19 00:44:24 1999 in changelog)
+AC_MSG_CHECKING(for sys_siglist declaration)
+AC_TRY_COMPILE([#include <signal.h>], [
+strlen (sys_siglist[0]);
+], glib_ok=yes, glib_ok=no)
+AC_MSG_RESULT($glib_ok)
+if test "$glib_ok" = "no"; then
+ AC_DEFINE(NO_SYS_SIGLIST_DECL,1,[global 'sys_siglist' not declared])
+fi
+
+# Check if <sys/select.h> needs to be included for fd_set
+AC_MSG_CHECKING([for fd_set])
+AC_TRY_COMPILE([#include <sys/types.h>],
+ [fd_set readMask, writeMask;], gtk_ok=yes, gtk_ok=no)
+if test "$gtk_ok" = "yes"; then
+ AC_MSG_RESULT([yes, found in sys/types.h])
+else
+ AC_EGREP_HEADER(fd_set, sys/select.h, gtk_ok=yes)
+ if test "$gtk_ok" = "yes"; then
+ # *** FIXME: give it a different name
+ AC_DEFINE(HAVE_SYS_SELECT_H,1,[found fd_set in sys/select.h])
+ AC_MSG_RESULT([yes, found in sys/select.h])
+ else
+ AC_DEFINE(NO_FD_SET,1,[didn't find fd_set])
+ AC_MSG_RESULT(no)
+ fi
+fi
+
+dnl *** check for sane realloc() ***
+AC_CACHE_CHECK([whether realloc (NULL,) will work],glib_cv_sane_realloc,[
+ AC_TRY_RUN([#include <stdlib.h>
+ int main() {
+ return realloc (0, sizeof (int)) == 0;
+ }],
+ [glib_cv_sane_realloc=yes],
+ [glib_cv_sane_realloc=no],
+ [glib_cv_sane_realloc=yes])
+])
+if test x$glib_cv_sane_realloc = xyes; then
+ AC_DEFINE(REALLOC_0_WORKS,1,[whether realloc (NULL,) works])
+fi
+
+dnl Check for nl_langinfo and CODESET
+AC_CACHE_CHECK([for nl_langinfo (CODESET)],glib_cv_langinfo_codeset,[
+ AC_TRY_COMPILE([#include <langinfo.h>],
+ [char *codeset = nl_langinfo (CODESET);],
+ [glib_cv_langinfo_codeset=yes],
+ [glib_cv_langinfo_codeset=no])])
+if test x$glib_cv_langinfo_codeset = xyes; then
+ AC_DEFINE(HAVE_CODESET,1,[Have nl_langinfo (CODESET)])
+fi
+
+dnl ****************************************
+dnl *** posix_memalign ***
+dnl ****************************************
+AC_MSG_CHECKING(for a compliant posix_memalign() implementation)
+AC_CACHE_VAL(glib_cv_compliant_posix_memalign,[
+ glib_cv_compliant_posix_memalign=0
+ if test "$ac_cv_func_posix_memalign" = "yes" ; then
+ AC_TRY_RUN([
+ #define _XOPEN_SOURCE 600
+ #include <stdlib.h> /* posix_memalign() should be defined here */
+ /* some systems break if #include <malloc.h> used */
+ static void test_memalign (size_t boundary, size_t size) {
+ void *mem = 0;
+ if (posix_memalign (&mem, boundary, size) != 0 || !mem)
+ exit (1);
+ else
+ free (mem);
+ }
+ int main() {
+ test_memalign ( 128, 128 - 2 * sizeof (void*));
+ test_memalign ( 256, 256 - 2 * sizeof (void*));
+ test_memalign ( 512, 512 - 2 * sizeof (void*));
+ test_memalign ( 1024, 1024 - 2 * sizeof (void*));
+ test_memalign ( 2048, 2048 - 2 * sizeof (void*));
+ test_memalign ( 4096, 4096 - 2 * sizeof (void*));
+ test_memalign ( 8192, 8192 - 2 * sizeof (void*));
+ test_memalign (16384, 16384 - 2 * sizeof (void*));
+ test_memalign (32768, 32768 - 2 * sizeof (void*));
+ exit (0); /* success */
+ }
+ ],
+ [glib_cv_compliant_posix_memalign=1], [], [:])
+ :
+ fi
+ ])
+if test "$glib_cv_compliant_posix_memalign" = "1"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS, 1, [define if posix_memalign() can allocate any size])
+else
+ AC_MSG_RESULT(no)
+fi
+
+
+dnl ****************************************
+dnl *** strlcpy/strlcat ***
+dnl ****************************************
+# Check for strlcpy
+AC_CACHE_CHECK([for OpenBSD strlcpy/strlcat],glib_cv_have_strlcpy,[
+AC_TRY_RUN([#include <stdlib.h>
+#include <string.h>
+int main() {
+ char p[10];
+ (void) strlcpy (p, "hi", 10);
+ if (strlcat (p, "bye", 0) != 3)
+ return 1;
+ return 0;
+}], glib_cv_have_strlcpy=yes,
+ glib_cv_have_strlcpy=no,
+ glib_cv_have_strlcpy=no)])
+if test "$glib_cv_have_strlcpy" = "yes"; then
+ AC_DEFINE(HAVE_STRLCPY,1,[Have functions strlcpy and strlcat])
+fi
+
+
+dnl **********************
+dnl *** va_copy checks ***
+dnl **********************
+dnl we currently check for all three va_copy possibilities, so we get
+dnl all results in config.log for bug reports.
+AC_CACHE_CHECK([for an implementation of va_copy()],glib_cv_va_copy,[
+ AC_LINK_IFELSE([#include <stdarg.h>
+#include <stdlib.h>
+ void f (int i, ...) {
+ va_list args1, args2;
+ va_start (args1, i);
+ va_copy (args2, args1);
+ if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
+ exit (1);
+ va_end (args1); va_end (args2);
+ }
+ int main() {
+ f (0, 42);
+ return 0;
+ }],
+ [glib_cv_va_copy=yes],
+ [glib_cv_va_copy=no])
+])
+AC_CACHE_CHECK([for an implementation of __va_copy()],glib_cv___va_copy,[
+ AC_LINK_IFELSE([#include <stdarg.h>
+#include <stdlib.h>
+ void f (int i, ...) {
+ va_list args1, args2;
+ va_start (args1, i);
+ __va_copy (args2, args1);
+ if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
+ exit (1);
+ va_end (args1); va_end (args2);
+ }
+ int main() {
+ f (0, 42);
+ return 0;
+ }],
+ [glib_cv___va_copy=yes],
+ [glib_cv___va_copy=no])
+])
+
+if test "x$glib_cv_va_copy" = "xyes"; then
+ g_va_copy_func=va_copy
+else if test "x$glib_cv___va_copy" = "xyes"; then
+ g_va_copy_func=__va_copy
+fi
+fi
+
+if test -n "$g_va_copy_func"; then
+ AC_DEFINE_UNQUOTED(G_VA_COPY,$g_va_copy_func,[A 'va_copy' style function])
+fi
+
+AC_CACHE_CHECK([whether va_lists can be copied by value],glib_cv_va_val_copy,[
+ AC_TRY_RUN([#include <stdarg.h>
+#include <stdlib.h>
+ void f (int i, ...) {
+ va_list args1, args2;
+ va_start (args1, i);
+ args2 = args1;
+ if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
+ exit (1);
+ va_end (args1); va_end (args2);
+ }
+ int main() {
+ f (0, 42);
+ return 0;
+ }],
+ [glib_cv_va_val_copy=yes],
+ [glib_cv_va_val_copy=no],
+ [glib_cv_va_val_copy=yes])
+])
+
+if test "x$glib_cv_va_val_copy" = "xno"; then
+ AC_DEFINE(G_VA_COPY_AS_ARRAY,1, ['va_lists' cannot be copies as values])
+fi
+
+dnl ***********************
+dnl *** g_module checks ***
+dnl ***********************
+G_MODULE_LIBS=
+G_MODULE_LIBS_EXTRA=
+G_MODULE_PLUGIN_LIBS=
+if test x"$glib_native_win32" = xyes; then
+ dnl No use for this on Win32
+ G_MODULE_LDFLAGS=
+else
+ export SED
+ G_MODULE_LDFLAGS=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
+fi
+dnl G_MODULE_IMPL= don't reset, so cmd-line can override
+G_MODULE_NEED_USCORE=0
+G_MODULE_BROKEN_RTLD_GLOBAL=0
+G_MODULE_HAVE_DLERROR=0
+dnl *** force native WIN32 shared lib loader
+if test -z "$G_MODULE_IMPL"; then
+ case "$host" in
+ *-*-mingw*|*-*-cygwin*) G_MODULE_IMPL=G_MODULE_IMPL_WIN32 ;;
+ esac
+fi
+dnl *** force native AIX library loader
+dnl *** dlopen() filepath must be of the form /path/libname.a(libname.so)
+if test -z "$G_MODULE_IMPL"; then
+ case "$host" in
+ *-*-aix*) G_MODULE_IMPL=G_MODULE_IMPL_AR ;;
+ esac
+fi
+dnl *** dlopen() and dlsym() in system libraries
+if test -z "$G_MODULE_IMPL"; then
+ AC_CHECK_FUNC(dlopen,
+ [AC_CHECK_FUNC(dlsym,
+ [G_MODULE_IMPL=G_MODULE_IMPL_DL],[])],
+ [])
+fi
+dnl *** load_image (BeOS)
+if test -z "$G_MODULE_IMPL" && test "x$glib_native_beos" = "xyes"; then
+ AC_CHECK_LIB(root, load_image,
+ [G_MODULE_LIBS="-lbe -lroot -lglib-2.0 "
+ G_MODULE_LIBS_EXTRA="-L\$(top_builddir_full)/.libs"
+ G_MODULE_PLUGIN_LIBS="-L\$(top_builddir_full)/gmodule/.libs -lgmodule"
+ G_MODULE_IMPL=G_MODULE_IMPL_BEOS],
+ [])
+fi
+dnl *** NSLinkModule (dyld) in system libraries (Darwin)
+if test -z "$G_MODULE_IMPL"; then
+ AC_CHECK_FUNC(NSLinkModule,
+ [G_MODULE_IMPL=G_MODULE_IMPL_DYLD
+ G_MODULE_NEED_USCORE=1],
+ [])
+fi
+dnl *** dlopen() and dlsym() in libdl
+if test -z "$G_MODULE_IMPL"; then
+ AC_CHECK_LIB(dl, dlopen,
+ [AC_CHECK_LIB(dl, dlsym,
+ [G_MODULE_LIBS=-ldl
+ G_MODULE_IMPL=G_MODULE_IMPL_DL],[])],
+ [])
+fi
+dnl *** shl_load() in libdld (HP-UX)
+if test -z "$G_MODULE_IMPL"; then
+ AC_CHECK_LIB(dld, shl_load,
+ [G_MODULE_LIBS=-ldld
+ G_MODULE_IMPL=G_MODULE_IMPL_DLD],
+ [])
+fi
+dnl *** additional checks for G_MODULE_IMPL_DL
+if test "$G_MODULE_IMPL" = "G_MODULE_IMPL_DL"; then
+ LIBS_orig="$LIBS"
+ LDFLAGS_orig="$LDFLAGS"
+ LIBS="$G_MODULE_LIBS $LIBS"
+ LDFLAGS="$LDFLAGS $G_MODULE_LDFLAGS"
+dnl *** check for OSF1/5.0 RTLD_GLOBAL brokenness
+ echo "void glib_plugin_test(void) { }" > plugin.c
+ ${SHELL} ./libtool --mode=compile ${CC} -shared \
+ -export-dynamic -o plugin.o plugin.c 2>&1 >/dev/null
+ AC_CACHE_CHECK([for RTLD_GLOBAL brokenness],
+ glib_cv_rtldglobal_broken,[
+ AC_TRY_RUN([
+#include <dlfcn.h>
+#ifndef RTLD_GLOBAL
+# define RTLD_GLOBAL 0
+#endif
+#ifndef RTLD_LAZY
+# define RTLD_LAZY 0
+#endif
+int glib_plugin_test;
+int main () {
+ void *handle, *global, *local;
+ global = &glib_plugin_test;
+ handle = dlopen ("./.libs/plugin.o", RTLD_GLOBAL | RTLD_LAZY);
+ if (!handle) return 0;
+ local = dlsym (handle, "glib_plugin_test");
+ return global == local;
+} ],
+ [glib_cv_rtldglobal_broken=no],
+ [glib_cv_rtldglobal_broken=yes],
+ [glib_cv_rtldglobal_broken=no])
+ rm -f plugin.c plugin.o plugin.lo .libs/plugin.o
+ rmdir .libs 2>/dev/null
+ ])
+ if test "x$glib_cv_rtldglobal_broken" = "xyes"; then
+ G_MODULE_BROKEN_RTLD_GLOBAL=1
+ else
+ G_MODULE_BROKEN_RTLD_GLOBAL=0
+ fi
+dnl *** check whether we need preceeding underscores
+ AC_CACHE_CHECK([for preceeding underscore in symbols],
+ glib_cv_uscore,[
+ AC_TRY_RUN([#include <dlfcn.h>
+ int glib_underscore_test (void) { return 42; }
+ int main() {
+ void *f1 = (void*)0, *f2 = (void*)0, *handle;
+ handle = dlopen ((void*)0, 0);
+ if (handle) {
+ f1 = dlsym (handle, "glib_underscore_test");
+ f2 = dlsym (handle, "_glib_underscore_test");
+ } return (!f2 || f1);
+ }],
+ [glib_cv_uscore=yes],
+ [glib_cv_uscore=no],
+ [])
+ rm -f plugin.c plugin.$ac_objext plugin.lo
+ ])
+ GLIB_ASSERT_SET(glib_cv_uscore)
+ if test "x$glib_cv_uscore" = "xyes"; then
+ G_MODULE_NEED_USCORE=1
+ else
+ G_MODULE_NEED_USCORE=0
+ fi
+
+ LDFLAGS="$LDFLAGS_orig"
+dnl *** check for having dlerror()
+ AC_CHECK_FUNC(dlerror,
+ [G_MODULE_HAVE_DLERROR=1],
+ [G_MODULE_HAVE_DLERROR=0])
+ LIBS="$LIBS_orig"
+fi
+dnl *** done, have we got an implementation?
+if test -z "$G_MODULE_IMPL"; then
+ G_MODULE_IMPL=0
+ G_MODULE_SUPPORTED=false
+else
+ G_MODULE_SUPPORTED=true
+fi
+
+AC_MSG_CHECKING(for the suffix of shared libraries)
+export SED
+shrext_cmds=`./libtool --config | grep '^shrext_cmds='`
+eval $shrext_cmds
+module=yes eval std_shrext=$shrext_cmds
+# chop the initial dot
+glib_gmodule_suffix=`echo $std_shrext | sed 's/^\.//'`
+AC_MSG_RESULT(.$glib_gmodule_suffix)
+# any reason it may fail?
+if test "x$glib_gmodule_suffix" = x; then
+ AC_MSG_ERROR(Cannot determine shared library suffix from libtool)
+fi
+
+AC_SUBST(G_MODULE_SUPPORTED)
+AC_SUBST(G_MODULE_IMPL)
+AC_SUBST(G_MODULE_LIBS)
+AC_SUBST(G_MODULE_LIBS_EXTRA)
+AC_SUBST(G_MODULE_PLUGIN_LIBS)
+AC_SUBST(G_MODULE_LDFLAGS)
+AC_SUBST(G_MODULE_HAVE_DLERROR)
+AC_SUBST(G_MODULE_BROKEN_RTLD_GLOBAL)
+AC_SUBST(G_MODULE_NEED_USCORE)
+AC_SUBST(GLIB_DEBUG_FLAGS)
+
+dnl **********************
+dnl *** g_spawn checks ***
+dnl **********************
+
+AC_MSG_CHECKING(for gspawn implementation)
+case "$host" in
+ *-*-mingw*)
+ GSPAWN=gspawn-win32.lo
+ ;;
+ *)
+ GSPAWN=gspawn.lo
+ ;;
+esac
+AC_MSG_RESULT($GSPAWN)
+AC_SUBST(GSPAWN)
+
+dnl *************************
+dnl *** GIOChannel checks ***
+dnl *************************
+
+AC_MSG_CHECKING(for GIOChannel implementation)
+case "$host" in
+ *-*-mingw*)
+ GIO=giowin32.lo
+ ;;
+ *)
+ GIO=giounix.lo
+ ;;
+esac
+AC_MSG_RESULT($GIO)
+AC_SUBST(GIO)
+
+dnl ****************************************
+dnl *** platform dependent source checks ***
+dnl ****************************************
+
+AC_MSG_CHECKING(for platform-dependent source)
+case "$host" in
+ *-*-cygwin*|*-*-mingw*)
+ PLATFORMDEP=gwin32.lo
+ ;;
+ *)
+ PLATFORMDEP=
+ ;;
+esac
+AC_MSG_RESULT($PLATFORMDEP)
+AC_SUBST(PLATFORMDEP)
+
+AC_MSG_CHECKING([whether to compile timeloop])
+case "$host" in
+ *-*-cygwin*|*-*-mingw*|*-*-minix)
+ enable_timeloop=no
+ ;;
+ *)
+ enable_timeloop=yes
+ ;;
+esac
+AC_MSG_RESULT($enable_timeloop)
+AM_CONDITIONAL(ENABLE_TIMELOOP, test x$enable_timeloop = xyes)
+
+AC_MSG_CHECKING([if building for some Win32 platform])
+case "$host" in
+ *-*-mingw*|*-*-cygwin*)
+ platform_win32=yes
+ ;;
+ *)
+ platform_win32=no
+ ;;
+esac
+AC_MSG_RESULT($platform_win32)
+AM_CONDITIONAL(PLATFORM_WIN32, test x$platform_win32 = xyes)
+
+dnl ***********************
+dnl *** g_thread checks ***
+dnl ***********************
+
+AC_ARG_WITH(threads,
+ [AC_HELP_STRING([--with-threads=@<:@none/posix/dce/win32@:>@],
+ [specify a thread implementation to use])],
+ [if test "x$with_threads" = x; then
+ want_threads=yes
+ else
+ want_threads=$with_threads
+ fi],
+ [want_threads=yes])
+if test "x$enable_threads" = "xno"; then
+ want_threads=no
+fi
+
+dnl error and warning message
+dnl *************************
+
+THREAD_NO_IMPLEMENTATION="You do not have any known thread system on your
+ computer. GLib will not have a default thread implementation."
+
+FLAG_DOES_NOT_WORK="I can't find the MACRO to enable thread safety on your
+ platform (normally it's "_REENTRANT"). I'll not use any flag on
+ compilation now, but then your programs might not work.
+ Please provide information on how it is done on your system."
+
+LIBS_NOT_FOUND_1="I can't find the libraries for the thread implementation
+ "
+
+LIBS_NOT_FOUND_2=". Please choose another thread implementation or
+ provide information on your thread implementation.
+ You can also run 'configure --disable-threads'
+ to compile without thread support."
+
+FUNC_NO_GETPWUID_R="the 'g_get_(user_name|real_name|home_dir|tmp_dir)'
+ functions will not be MT-safe during their first call because
+ there is no working 'getpwuid_r' on your system."
+
+FUNC_NO_LOCALTIME_R="the 'g_date_set_time' function will not be MT-safe
+ because there is no 'localtime_r' on your system."
+
+POSIX_NO_YIELD="I can not find a yield functions for your platform. A rather
+ crude surrogate will be used. If you happen to know a
+ yield function for your system, please inform the GLib
+ developers."
+
+POSIX_NO_PRIORITIES="I can not find the minimal and maximal priorities for
+ threads on your system. Thus threads can only have the default
+ priority. If you happen to know these main/max
+ priorities, please inform the GLib developers."
+
+AIX_COMPILE_INFO="AIX's C compiler needs to be called by a different name, when
+ linking threaded applications. As GLib cannot do that
+ automatically, you will get an linkg error everytime you are
+ not using the right compiler. In that case you have to relink
+ with the right compiler. Ususally just '_r' is appended
+ to the compiler name."
+
+dnl determination of thread implementation
+dnl ***************************************
+
+# have_threads=no means no thread support
+# have_threads=none means no default thread implementation
+
+have_threads=no
+if test "x$want_threads" = xyes || test "x$want_threads" = xposix \
+ || test "x$want_threads" = xdce; then
+ # -D_POSIX4_DRAFT_SOURCE -D_POSIX4A_DRAFT10_SOURCE is for DG/UX
+ # -U_OSF_SOURCE is for Digital UNIX 4.0d
+ GTHREAD_COMPILE_IMPL_DEFINES="-D_POSIX4_DRAFT_SOURCE -D_POSIX4A_DRAFT10_SOURCE -U_OSF_SOURCE"
+ glib_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES"
+ if test "x$have_threads" = xno; then
+ AC_TRY_COMPILE([#include <pthread.h>],
+ [pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;],
+ have_threads=posix)
+ fi
+ if test "x$have_threads" = xno; then
+ AC_TRY_COMPILE([#include <pthread.h>],
+ [pthread_mutex_t m;
+ pthread_mutex_init (&m, pthread_mutexattr_default);],
+ have_threads=dce)
+ fi
+ # Tru64Unix requires -pthread to find pthread.h. See #103020
+ CPPFLAGS="$CPPFLAGS -pthread"
+ if test "x$have_threads" = xno; then
+ AC_TRY_COMPILE([#include <pthread.h>],
+ [pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;],
+ have_threads=posix)
+ fi
+ CPPFLAGS="$glib_save_CPPFLAGS"
+fi
+if test "x$want_threads" = xyes || test "x$want_threads" = xwin32; then
+ case $host in
+ *-*-mingw*)
+ have_threads=win32
+ ;;
+ esac
+fi
+if test "x$want_threads" = xnone; then
+ have_threads=none
+fi
+
+AC_MSG_CHECKING(for thread implementation)
+
+if test "x$have_threads" = xno && test "x$want_threads" != xno; then
+ AC_MSG_RESULT(none available)
+ AC_MSG_WARN($THREAD_NO_IMPLEMENTATION)
+else
+ AC_MSG_RESULT($have_threads)
+fi
+
+
+dnl determination of G_THREAD_CFLAGS
+dnl ********************************
+
+G_THREAD_LIBS=
+G_THREAD_LIBS_EXTRA=
+G_THREAD_CFLAGS=
+
+dnl
+dnl Test program for basic POSIX threads functionality
+dnl
+m4_define([glib_thread_test],[
+#include <pthread.h>
+int check_me = 0;
+void* func(void* data) {check_me = 42; return &check_me;}
+int main()
+ { pthread_t t;
+ void *ret;
+ pthread_create (&t, $1, func, 0);
+ pthread_join (t, &ret);
+ return (check_me != 42 || ret != &check_me);
+}])
+
+dnl
+dnl Test program for sched_get_priority_min()
+dnl
+m4_define([glib_sched_priority_test],[
+#include <sched.h>
+#include <errno.h>
+int main() {
+ errno = 0;
+ return sched_get_priority_min(SCHED_OTHER)==-1
+ && errno != 0;
+}])
+
+if test x"$have_threads" != xno; then
+
+ if test x"$have_threads" = xposix; then
+ # First we test for posix, whether -pthread or -pthreads do the trick as
+ # both CPPFLAG and LIBS.
+ # One of them does for most gcc versions and some other platforms/compilers
+ # too and could be considered as the canonical way to go.
+ case $host in
+ *-*-cygwin*|*-*-darwin*)
+ # skip cygwin and darwin -pthread or -pthreads test
+ ;;
+ *-solaris*)
+ # These compiler/linker flags work with both Sun Studio and gcc
+ # Sun Studio expands -mt to -D_REENTRANT and -lthread
+ # gcc expands -pthreads to -D_REENTRANT -D_PTHREADS -lpthread
+ G_THREAD_CFLAGS="-D_REENTRANT -D_PTHREADS"
+ G_THREAD_LIBS="-lpthread -lthread"
+ ;;
+ *)
+ for flag in pthread pthreads mt; do
+ glib_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -$flag"
+ AC_TRY_RUN(glib_thread_test(0),
+ glib_flag_works=yes,
+ glib_flag_works=no,
+ [AC_LINK_IFELSE(glib_thread_test(0),
+ glib_flag_works=yes,
+ glib_flag_works=no)])
+ CFLAGS="$glib_save_CFLAGS"
+ if test $glib_flag_works = yes ; then
+ G_THREAD_CFLAGS=-$flag
+ G_THREAD_LIBS=-$flag
+ break;
+ fi
+ done
+ ;;
+ esac
+ fi
+
+ if test x"$G_THREAD_CFLAGS" = x; then
+
+ # The canonical -pthread[s] does not work. Try something different.
+
+ case $host in
+ *-aix*)
+ if test x"$GCC" = xyes; then
+ # GCC 3.0 and above needs -pthread.
+ # Should be coverd by the case above.
+ # GCC 2.x and below needs -mthreads
+ G_THREAD_CFLAGS="-mthreads"
+ G_THREAD_LIBS=$G_THREAD_CFLAGS
+ else
+ # We are probably using the aix compiler. Normaly a
+ # program would have to be compiled with the _r variant
+ # of the corresponding compiler, but we as GLib cannot
+ # do that: but the good news is that for compiling the
+ # only difference is the added -D_THREAD_SAFE compile
+ # option. This is according to the "C for AIX User's
+ # Guide".
+ G_THREAD_CFLAGS="-D_THREAD_SAFE"
+ fi
+ ;;
+ *-dg-dgux*) # DG/UX
+ G_THREAD_CFLAGS="-D_REENTRANT -D_POSIX4A_DRAFT10_SOURCE"
+ ;;
+ *-osf*)
+ # So we are using dce threads. posix threads are already
+ # catched above.
+ G_THREAD_CFLAGS="-threads"
+ G_THREAD_LIBS=$G_THREAD_CFLAGS
+ ;;
+ *-sysv5uw7*) # UnixWare 7
+ # We are not using gcc with -pthread. Catched above.
+ G_THREAD_CFLAGS="-Kthread"
+ G_THREAD_LIBS=$G_THREAD_CFLAGS
+ ;;
+ *-mingw*)
+ # No flag needed when using MSVCRT.DLL
+ G_THREAD_CFLAGS=""
+ ;;
+ *)
+ G_THREAD_CFLAGS="-D_REENTRANT" # good default guess otherwise
+ ;;
+ esac
+
+ fi
+
+ # if we are not finding the localtime_r function, then we probably are
+ # not using the proper multithread flag
+
+ glib_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS"
+
+ # First we test, whether localtime_r is declared in time.h
+ # directly. Then we test whether a macro localtime_r exists, in
+ # which case localtime_r in the test program is replaced and thus
+ # if we still find localtime_r in the output, it is not defined as
+ # a macro.
+
+ AC_EGREP_CPP([[^a-zA-Z1-9_]localtime_r[^a-zA-Z1-9_]], [#include <time.h>], ,
+ [AC_EGREP_CPP([[^a-zA-Z1-9_]localtime_r[^a-zA-Z1-9_]], [#include <time.h>
+ localtime_r(a,b)],
+ AC_MSG_WARN($FLAG_DOES_NOT_WORK))])
+
+ CPPFLAGS="$glib_save_CPPFLAGS"
+
+ AC_MSG_CHECKING(thread related cflags)
+ AC_MSG_RESULT($G_THREAD_CFLAGS)
+ CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS"
+fi
+
+dnl determination of G_THREAD_LIBS
+dnl ******************************
+
+mutex_has_default=no
+case $have_threads in
+ posix|dce)
+ glib_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES"
+ if test x"$G_THREAD_LIBS" = x; then
+ case $host in
+ *-aix*)
+ # We are not using gcc (would have set G_THREAD_LIBS) and thus
+ # probably using the aix compiler.
+ AC_MSG_WARN($AIX_COMPILE_INFO)
+ ;;
+ *)
+ G_THREAD_LIBS=error
+ glib_save_LIBS="$LIBS"
+ for thread_lib in "" pthread pthread32 pthreads thread dce; do
+ if test x"$thread_lib" = x; then
+ add_thread_lib=""
+ IN=""
+ else
+ add_thread_lib="-l$thread_lib"
+ IN=" in -l$thread_lib"
+ fi
+ if test x"$have_threads" = xposix; then
+ defattr=0
+ else
+ defattr=pthread_attr_default
+ fi
+
+ LIBS="$add_thread_lib $glib_save_LIBS"
+
+ AC_MSG_CHECKING(for pthread_create/pthread_join$IN)
+ AC_TRY_RUN(glib_thread_test($defattr),
+ glib_result=yes,
+ glib_result=no,
+ [AC_LINK_IFELSE(glib_thread_test($defattr),
+ glib_result=yes,
+ glib_result=no)])
+ AC_MSG_RESULT($glib_result)
+
+ if test "$glib_result" = "yes" ; then
+ G_THREAD_LIBS="$add_thread_lib"
+ break
+ fi
+ done
+ if test "x$G_THREAD_LIBS" = xerror; then
+ AC_MSG_ERROR($LIBS_NOT_FOUND_1$have_threads$LIBS_NOT_FOUND_2)
+ fi
+ LIBS="$glib_save_LIBS"
+ ;;
+ esac
+ fi
+
+ glib_save_LIBS="$LIBS"
+ for thread_lib in "" rt rte; do
+ if test x"$thread_lib" = x; then
+ add_thread_lib=""
+ IN=""
+ else
+ add_thread_lib="-l$thread_lib"
+ IN=" in -l$thread_lib"
+ fi
+ LIBS="$add_thread_lib $glib_save_LIBS"
+
+ AC_MSG_CHECKING(for sched_get_priority_min$IN)
+ AC_TRY_RUN(glib_sched_priority_test,
+ glib_result=yes,
+ glib_result=no,
+ [AC_LINK_IFELSE(glib_sched_priority_test,
+ glib_result=yes,
+ glib_result=no)])
+ AC_MSG_RESULT($glib_result)
+
+ if test "$glib_result" = "yes" ; then
+ G_THREAD_LIBS="$G_THREAD_LIBS $add_thread_lib"
+ posix_priority_min="sched_get_priority_min(SCHED_OTHER)"
+ posix_priority_max="sched_get_priority_max(SCHED_OTHER)"
+ break
+ fi
+ done
+ LIBS="$glib_save_LIBS"
+ mutex_has_default=yes
+ mutex_default_type='pthread_mutex_t'
+ mutex_default_init='PTHREAD_MUTEX_INITIALIZER'
+ mutex_header_file='pthread.h'
+ if test "x$have_threads" = "xposix"; then
+ g_threads_impl="POSIX"
+ else
+ g_threads_impl="DCE"
+ have_threads="posix"
+ fi
+ AC_SUBST(GTHREAD_COMPILE_IMPL_DEFINES)
+ CPPFLAGS="$glib_save_CPPFLAGS"
+ ;;
+ win32)
+ g_threads_impl="WIN32"
+ ;;
+ none|no)
+ g_threads_impl="NONE"
+ ;;
+ *)
+ g_threads_impl="NONE"
+ G_THREAD_LIBS=error
+ ;;
+esac
+
+if test "x$G_THREAD_LIBS" = xerror; then
+ AC_MSG_ERROR($LIBS_NOT_FOUND_1$have_threads$LIBS_NOT_FOUND_2)
+fi
+
+case $host in
+ *-*-beos*)
+ G_THREAD_LIBS="-lbe -lroot -lglib-2.0 "
+ G_THREAD_LIBS_EXTRA="-L\$(top_builddir_full)/.libs"
+ ;;
+ *)
+ ;;
+esac
+
+AC_MSG_CHECKING(thread related libraries)
+AC_MSG_RESULT($G_THREAD_LIBS)
+
+dnl check for mt safe function variants and some posix functions
+dnl ************************************************************
+
+if test x"$have_threads" != xno; then
+ glib_save_LIBS="$LIBS"
+ # we are not doing the following for now, as this might require glib
+ # to always be linked with the thread libs on some platforms.
+ # LIBS="$LIBS $G_THREAD_LIBS"
+ AC_CHECK_FUNCS(localtime_r)
+ if test "$ac_cv_header_pwd_h" = "yes"; then
+ AC_CACHE_CHECK([for posix getpwuid_r],
+ ac_cv_func_posix_getpwuid_r,
+ [AC_TRY_RUN([
+#include <errno.h>
+#include <pwd.h>
+int main () {
+ char buffer[10000];
+ struct passwd pwd, *pwptr = &pwd;
+ int error;
+ errno = 0;
+ error = getpwuid_r (0, &pwd, buffer,
+ sizeof (buffer), &pwptr);
+ return (error < 0 && errno == ENOSYS)
+ || error == ENOSYS;
+} ],
+ [ac_cv_func_posix_getpwuid_r=yes],
+ [ac_cv_func_posix_getpwuid_r=no])])
+ GLIB_ASSERT_SET(ac_cv_func_posix_getpwuid_r)
+ if test "$ac_cv_func_posix_getpwuid_r" = yes; then
+ AC_DEFINE(HAVE_POSIX_GETPWUID_R,1,
+ [Have POSIX function getpwuid_r])
+ else
+ AC_CACHE_CHECK([for nonposix getpwuid_r],
+ ac_cv_func_nonposix_getpwuid_r,
+ [AC_TRY_LINK([#include <pwd.h>],
+ [char buffer[10000];
+ struct passwd pwd;
+ getpwuid_r (0, &pwd, buffer,
+ sizeof (buffer));],
+ [ac_cv_func_nonposix_getpwuid_r=yes],
+ [ac_cv_func_nonposix_getpwuid_r=no])])
+ GLIB_ASSERT_SET(ac_cv_func_nonposix_getpwuid_r)
+ if test "$ac_cv_func_nonposix_getpwuid_r" = yes; then
+ AC_DEFINE(HAVE_NONPOSIX_GETPWUID_R,1,
+ [Have non-POSIX function getpwuid_r])
+ fi
+ fi
+ fi
+ LIBS="$G_THREAD_LIBS $LIBS"
+ if test x"$have_threads" = xposix; then
+ glib_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES"
+ dnl we might grow sizeof(pthread_t) later on, so use a dummy name here
+ GLIB_SIZEOF([#include <pthread.h>], pthread_t, system_thread)
+ # This is not AC_CHECK_FUNC to also work with function
+ # name mangling in header files.
+ AC_MSG_CHECKING(for pthread_attr_setstacksize)
+ AC_TRY_LINK([#include <pthread.h>],
+ [pthread_attr_t t; pthread_attr_setstacksize(&t,0)],
+ [AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_PTHREAD_ATTR_SETSTACKSIZE,1,
+ [Have function pthread_attr_setstacksize])],
+ [AC_MSG_RESULT(no)])
+ AC_MSG_CHECKING(for minimal/maximal thread priority)
+ if test x"$posix_priority_min" = x; then
+ AC_EGREP_CPP(PX_PRIO_MIN,[#include <pthread.h>
+ PX_PRIO_MIN],,[
+ posix_priority_min=PX_PRIO_MIN
+ posix_priority_max=PX_PRIO_MAX])
+ fi
+ if test x"$posix_priority_min" = x; then
+ # AIX
+ AC_EGREP_CPP(PTHREAD_PRIO_MIN,[#include <pthread.h>
+ PTHREAD_PRIO_MIN],,[
+ posix_priority_min=PTHREAD_PRIO_MIN
+ posix_priority_max=PTHREAD_PRIO_MAX])
+ fi
+ if test x"$posix_priority_min" = x; then
+ AC_EGREP_CPP(PRI_OTHER_MIN,[#include <pthread.h>
+ PRI_OTHER_MIN],,[
+ posix_priority_min=PRI_OTHER_MIN
+ posix_priority_max=PRI_OTHER_MAX])
+ fi
+ if test x"$posix_priority_min" = x; then
+ AC_MSG_RESULT(none found)
+ AC_MSG_WARN($POSIX_NO_PRIORITIES)
+ posix_priority_min=-1
+ posix_priority_max=-1
+ else
+ AC_MSG_RESULT($posix_priority_min/$posix_priority_max)
+ AC_MSG_CHECKING(for pthread_setschedparam)
+ AC_TRY_LINK([#include <pthread.h>],
+ [pthread_t t; pthread_setschedparam(t, 0, NULL)],
+ [AC_MSG_RESULT(yes)
+ AC_DEFINE_UNQUOTED(POSIX_MIN_PRIORITY,$posix_priority_min,[Minimum POSIX RT priority])
+ AC_DEFINE_UNQUOTED(POSIX_MAX_PRIORITY,$posix_priority_max,[Maximum POSIX RT priority])],
+ [AC_MSG_RESULT(no)
+ AC_MSG_WARN($POSIX_NO_PRIORITIES)])
+ fi
+ posix_yield_func=none
+ AC_MSG_CHECKING(for posix yield function)
+ for yield_func in sched_yield pthread_yield_np pthread_yield \
+ thr_yield; do
+ AC_TRY_LINK([#include <pthread.h>],
+ [$yield_func()],
+ [posix_yield_func="$yield_func"
+ break])
+ done
+ if test x"$posix_yield_func" = xnone; then
+ AC_MSG_RESULT(none found)
+ AC_MSG_WARN($POSIX_NO_YIELD)
+ posix_yield_func="g_usleep(1000)"
+ else
+ AC_MSG_RESULT($posix_yield_func)
+ posix_yield_func="$posix_yield_func()"
+ fi
+ AC_DEFINE_UNQUOTED(POSIX_YIELD_FUNC,$posix_yield_func,[The POSIX RT yield function])
+ CPPFLAGS="$glib_save_CPPFLAGS"
+
+ elif test x"$have_threads" = xwin32; then
+ # It's a pointer to a private struct
+ GLIB_SIZEOF(,struct _GThreadData *, system_thread)
+ fi
+
+ LIBS="$glib_save_LIBS"
+
+ # now spit out all the warnings.
+ if test "$ac_cv_func_posix_getpwuid_r" != "yes" &&
+ test "$ac_cv_func_nonposix_getpwuid_r" != "yes"; then
+ AC_MSG_WARN($FUNC_NO_GETPWUID_R)
+ fi
+ if test "$ac_cv_func_localtime_r" != "yes"; then
+ AC_MSG_WARN($FUNC_NO_LOCALTIME_R)
+ fi
+fi
+
+if test x"$glib_cv_sizeof_system_thread" = x; then
+ # use a pointer as a fallback.
+ GLIB_SIZEOF(,void *, system_thread)
+fi
+
+#
+# Hack to deal with:
+#
+# a) GCC < 3.3 for Linux doesn't include -lpthread when
+# building shared libraries with linux.
+#
+case $host in
+ *-*-linux*)
+ G_THREAD_LIBS_FOR_GTHREAD="`echo $G_THREAD_LIBS | sed s/-pthread/-lpthread/`"
+ ;;
+ *)
+ G_THREAD_LIBS_FOR_GTHREAD="$G_THREAD_LIBS"
+ ;;
+esac
+
+AC_DEFINE_UNQUOTED(G_THREAD_SOURCE,"gthread-$have_threads.c",
+ [Source file containing theread implementation])
+AC_SUBST(G_THREAD_CFLAGS)
+AC_SUBST(G_THREAD_LIBS)
+AC_SUBST(G_THREAD_LIBS_FOR_GTHREAD)
+AC_SUBST(G_THREAD_LIBS_EXTRA)
+
+dnl **********************************************
+dnl *** GDefaultMutex setup and initialization ***
+dnl **********************************************
+dnl
+dnl if mutex_has_default = yes, we also got
+dnl mutex_default_type, mutex_default_init and mutex_header_file
+if test $mutex_has_default = yes ; then
+ glib_save_CPPFLAGS="$CPPFLAGS"
+ glib_save_LIBS="$LIBS"
+ LIBS="$G_THREAD_LIBS $LIBS"
+ CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES"
+ GLIB_SIZEOF([#include <$mutex_header_file>],
+ $mutex_default_type,
+ gmutex)
+ GLIB_BYTE_CONTENTS([#include <$mutex_header_file>],
+ $mutex_default_type,
+ gmutex,
+ $glib_cv_sizeof_gmutex,
+ $mutex_default_init)
+ if test x"$glib_cv_byte_contents_gmutex" = xno; then
+ mutex_has_default=no
+ fi
+ CPPFLAGS="$glib_save_CPPFLAGS"
+ LIBS="$glib_save_LIBS"
+fi
+
+AC_CHECK_FUNCS(clock_gettime, [], [
+ AC_CHECK_LIB(rt, clock_gettime, [
+ AC_DEFINE(HAVE_CLOCK_GETTIME, 1)
+ G_THREAD_LIBS="$G_THREAD_LIBS -lrt"
+ G_THREAD_LIBS_FOR_GTHREAD="$G_THREAD_LIBS_FOR_GTHREAD -lrt"
+ ])
+])
+
+AC_CACHE_CHECK(for monotonic clocks,
+ glib_cv_monotonic_clock,AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include <time.h>
+#include <unistd.h>
+int main() {
+#if !(defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK >= 0 && defined(CLOCK_MONOTONIC))
+ #error No monotonic clock
+#endif
+ return 0;
+}
+]])],glib_cv_monotonic_clock=yes,glib_cv_monotonic_clock=no))
+if test "$glib_cv_monotonic_clock" = "yes"; then
+ AC_DEFINE(HAVE_MONOTONIC_CLOCK,1,[Have a monotonic clock])
+fi
+
+
+dnl ********************************
+dnl *** g_atomic_* tests for gcc ***
+dnl ********************************
+
+AC_MSG_CHECKING([whether to use assembler code for atomic operations])
+
+if test x"$GCC" = xyes; then
+ case $host_cpu in
+ i386)
+ AC_MSG_RESULT([none])
+ glib_memory_barrier_needed=no
+ ;;
+ i?86)
+ AC_MSG_RESULT([i486])
+ AC_DEFINE_UNQUOTED(G_ATOMIC_I486, 1,
+ [i486 atomic implementation])
+ glib_memory_barrier_needed=no
+ ;;
+ sparc*)
+ SPARCV9_WARNING="Try to rerun configure with CFLAGS='-mcpu=v9',
+ when you are using a sparc with v9 instruction set (most
+ sparcs nowadays). This will make the code for atomic
+ operations much faster. The resulting code will not run
+ on very old sparcs though."
+
+ AC_LINK_IFELSE([[
+ main ()
+ {
+ int tmp1, tmp2, tmp3;
+ __asm__ __volatile__("casx [%2], %0, %1"
+ : "=&r" (tmp1), "=&r" (tmp2) : "r" (&tmp3));
+ }]],
+ AC_MSG_RESULT([sparcv9])
+ AC_DEFINE_UNQUOTED(G_ATOMIC_SPARCV9, 1,
+ [sparcv9 atomic implementation]),
+ AC_MSG_RESULT([no])
+ AC_MSG_WARN([[$SPARCV9_WARNING]]))
+ glib_memory_barrier_needed=yes
+ ;;
+ alpha*)
+ AC_MSG_RESULT([alpha])
+ AC_DEFINE_UNQUOTED(G_ATOMIC_ALPHA, 1,
+ [alpha atomic implementation])
+ glib_memory_barrier_needed=yes
+ ;;
+ x86_64)
+ AC_MSG_RESULT([x86_64])
+ AC_DEFINE_UNQUOTED(G_ATOMIC_X86_64, 1,
+ [x86_64 atomic implementation])
+ glib_memory_barrier_needed=no
+ ;;
+ powerpc*)
+ AC_MSG_RESULT([powerpc])
+ AC_DEFINE_UNQUOTED(G_ATOMIC_POWERPC, 1,
+ [powerpc atomic implementation])
+ glib_memory_barrier_needed=yes
+ ;;
+ ia64)
+ AC_MSG_RESULT([ia64])
+ AC_DEFINE_UNQUOTED(G_ATOMIC_IA64, 1,
+ [ia64 atomic implementation])
+ glib_memory_barrier_needed=yes
+ ;;
+ s390|s390x)
+ AC_MSG_RESULT([s390])
+ AC_DEFINE_UNQUOTED(G_ATOMIC_S390, 1,
+ [s390 atomic implementation])
+ glib_memory_barrier_needed=no
+ ;;
+ *)
+ AC_MSG_RESULT([none])
+ glib_memory_barrier_needed=yes
+ ;;
+ esac
+fi
+
+dnl ****************************************
+dnl *** GLib POLL* compatibility defines ***
+dnl ****************************************
+
+glib_poll_includes=["
+#include <sys/types.h>
+#include <sys/poll.h>
+"]
+
+if test $ac_cv_header_sys_types_h = yes &&
+ test $ac_cv_header_sys_poll_h = yes ; then
+ glib_failed=false
+ GLIB_CHECK_VALUE(POLLIN, $glib_poll_includes, glib_failed=true)
+ GLIB_CHECK_VALUE(POLLOUT, $glib_poll_includes, glib_failed=true)
+ GLIB_CHECK_VALUE(POLLPRI, $glib_poll_includes, glib_failed=true)
+ GLIB_CHECK_VALUE(POLLERR, $glib_poll_includes, glib_failed=true)
+ GLIB_CHECK_VALUE(POLLHUP, $glib_poll_includes, glib_failed=true)
+ GLIB_CHECK_VALUE(POLLNVAL, $glib_poll_includes, glib_failed=true)
+ if $glib_failed ; then
+ AC_MSG_ERROR([Could not determine values for POLL* constants])
+ fi
+else
+ glib_cv_value_POLLIN=1
+ glib_cv_value_POLLOUT=4
+ glib_cv_value_POLLPRI=2
+ glib_cv_value_POLLERR=8
+ glib_cv_value_POLLHUP=16
+ glib_cv_value_POLLNVAL=32
+fi
+
+AC_MSG_CHECKING([for broken poll])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <stdlib.h>
+ #include <fcntl.h>
+ #include <poll.h>
+ #ifdef HAVE_SYS_POLL_H
+ #include <sys/poll.h>
+ #endif
+ int main(void) {
+ struct pollfd fds[1];
+ int fd;
+ fd = open("/dev/null", 1);
+ fds[0].fd = fd;
+ fds[0].events = POLLIN;
+ fds[0].revents = 0;
+ if (poll(fds, 1, 0) < 0 || (fds[0].revents & POLLNVAL) != 0) {
+ exit(1); /* Does not work for devices -- fail */
+ }
+ exit(0);
+ }]])],
+ [broken_poll=no],
+ [broken_poll=yes
+ AC_DEFINE(BROKEN_POLL,1,[poll doesn't work on devices])],
+ [broken_poll="no (cross compiling)"])
+AC_MSG_RESULT($broken_poll)
+
+dnl *********************
+dnl *** GRegex checks ***
+dnl *********************
+PCRE_REQUIRED_VERSION=7.0
+
+# Check if we should compile GRegex
+AC_ARG_ENABLE(regex, AC_HELP_STRING([--disable-regex],
+ [disable the compilation of GRegex]),
+[case "${enableval}" in
+ yes) enable_regex=true ;;
+ no) enable_regex=false ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-regex) ;;
+esac],
+[enable_regex=true])
+
+AM_CONDITIONAL(ENABLE_REGEX, $enable_regex)
+
+if test x$enable_regex = xtrue; then
+ # Check if we should use the internal or the system-supplied pcre
+ AC_ARG_WITH(pcre,
+ [AC_HELP_STRING([--with-pcre=@<:@internal/system@:>@],
+ [specify whether to use the internal or the
+ system-supplied PCRE library])])
+
+ AM_CONDITIONAL(USE_SYSTEM_PCRE, [test "x$with_pcre" = xsystem])
+
+ if test "x$with_pcre" = xsystem; then
+ PKG_CHECK_MODULES(PCRE,
+ libpcre >= $PCRE_REQUIRED_VERSION)
+ AC_CACHE_CHECK([for Unicode support in PCRE],glib_cv_pcre_has_unicode,[
+ CFLAGS="$CFLAGS $PCRE_CFLAGS" LDFLAGS="$LDFLAGS $PCRE_LIBS"
+ AC_TRY_RUN([#include <pcre.h>
+ int main () {
+ int support;
+ pcre_config (PCRE_CONFIG_UTF8, &support);
+ if (!support)
+ return 1;
+ pcre_config (PCRE_CONFIG_UNICODE_PROPERTIES, &support);
+ if (!support)
+ return 1;
+ return 0;
+ }],
+ glib_cv_pcre_has_unicode=yes,
+ glib_cv_pcre_has_unicode=no,
+ glib_cv_pcre_has_unicode=yes)])
+ if test "$glib_cv_pcre_has_unicode" = "no"; then
+ AC_MSG_ERROR([*** The system-supplied PCRE does not support Unicode properties or UTF-8.])
+ fi
+ AC_SUBST(PCRE_CFLAGS)
+ AC_SUBST(PCRE_LIBS)
+ AC_DEFINE(USE_SYSTEM_PCRE, [], [using the system-supplied PCRE library])
+ else
+ # If using gcc 4 pass -Wno-pointer-sign when compiling the internal PCRE
+ if test x"$GCC" = xyes; then
+ AC_MSG_CHECKING([whether compiler understands -Wno-pointer-sign])
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Wno-pointer-sign"
+ AC_TRY_COMPILE([],[],[PCRE_WARN_CFLAGS="$PCRE_WARN_CFLAGS -Wno-pointer-sign"
+ AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)])
+ CFLAGS="$save_CFLAGS"
+ fi
+ fi
+ AC_SUBST(PCRE_WARN_CFLAGS)
+else
+ AM_CONDITIONAL(USE_SYSTEM_PCRE, false])
+fi
+
+dnl **********************
+dnl *** Win32 API libs ***
+dnl **********************
+
+case $host in
+ *-*-cygwin*)
+ G_LIBS_EXTRA="-luser32 -lkernel32"
+ ;;
+ *-*-mingw*)
+ G_LIBS_EXTRA="-lws2_32 -lole32"
+ ;;
+ *)
+ G_LIBS_EXTRA=""
+ ;;
+esac
+AC_SUBST(G_LIBS_EXTRA)
+
+dnl If the system doesn't define EILSEQ, we should define EILSEQ ourselves
+dnl since we need it for g_iconv()
+
+AC_MSG_CHECKING([for EILSEQ])
+AC_TRY_COMPILE([
+#include <errno.h>
+],
+[
+int error = EILSEQ;
+], have_eilseq=yes, have_eilseq=no);
+AC_MSG_RESULT($have_eilseq)
+
+dnl ******************************************************************
+dnl *** Look for glib-genmarshal in PATH if we are cross-compiling ***
+dnl ******************************************************************
+
+AM_CONDITIONAL(CROSS_COMPILING, test $cross_compiling = yes)
+
+if test $cross_compiling = yes; then
+ AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal, no)
+ if test x$GLIB_GENMARSHAL = xno; then
+ AC_MSG_ERROR(Could not find a glib-genmarshal in your PATH)
+ fi
+fi
+
+dnl **************************
+dnl *** Checks for gtk-doc ***
+dnl **************************
+
+GTK_DOC_CHECK([1.4])
+
+AC_ARG_ENABLE(man,
+ [AC_HELP_STRING([--enable-man],
+ [regenerate man pages from Docbook [default=no]])],enable_man=yes,
+ enable_man=no)
+
+if test "${enable_man}" != no; then
+dnl
+dnl Check for xsltproc
+dnl
+AC_PATH_PROG([XSLTPROC], [xsltproc])
+ if test -z "$XSLTPROC"; then
+ enable_man=no
+ fi
+
+ dnl check for DocBook DTD and stylesheets in the local catalog.
+ JH_CHECK_XML_CATALOG([-//OASIS//DTD DocBook XML V4.1.2//EN],
+ [DocBook XML DTD V4.1.2],,enable_man=no)
+ JH_CHECK_XML_CATALOG([http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl],
+ [DocBook XSL Stylesheets],,enable_man=no)
+fi
+
+AM_CONDITIONAL(ENABLE_MAN, test x$enable_man != xno)
+
+dnl ******************************
+dnl *** output the whole stuff ***
+dnl ******************************
+
+dnl this section will only be run if config.status is invoked with no
+dnl arguments, or with "glibconfig.h" as an argument.
+AC_CONFIG_COMMANDS([glibconfig.h],
+[
+ outfile=glibconfig.h-tmp
+ cat > $outfile <<\_______EOF
+/* glibconfig.h
+ *
+ * This is a generated file. Please modify 'configure.in'
+ */
+
+#ifndef __G_LIBCONFIG_H__
+#define __G_LIBCONFIG_H__
+
+#include <glib/gmacros.h>
+
+_______EOF
+
+ if test x$glib_limits_h = xyes; then
+ echo '#include <limits.h>' >> $outfile
+ fi
+ if test x$glib_float_h = xyes; then
+ echo '#include <float.h>' >> $outfile
+ fi
+ if test x$glib_values_h = xyes; then
+ echo '#include <values.h>' >> $outfile
+ fi
+ if test "$glib_header_alloca_h" = "yes"; then
+ echo '#define GLIB_HAVE_ALLOCA_H' >> $outfile
+ fi
+ if test x$glib_sys_poll_h = xyes; then
+ echo '#define GLIB_HAVE_SYS_POLL_H' >> $outfile
+ fi
+
+ cat >> $outfile <<_______EOF
+
+G_BEGIN_DECLS
+
+#define G_MINFLOAT $glib_mf
+#define G_MAXFLOAT $glib_Mf
+#define G_MINDOUBLE $glib_md
+#define G_MAXDOUBLE $glib_Md
+#define G_MINSHORT $glib_ms
+#define G_MAXSHORT $glib_Ms
+#define G_MAXUSHORT $glib_Mus
+#define G_MININT $glib_mi
+#define G_MAXINT $glib_Mi
+#define G_MAXUINT $glib_Mui
+#define G_MINLONG $glib_ml
+#define G_MAXLONG $glib_Ml
+#define G_MAXULONG $glib_Mul
+
+_______EOF
+
+
+ ### this should always be true in a modern C/C++ compiler
+ cat >>$outfile <<_______EOF
+typedef signed char gint8;
+typedef unsigned char guint8;
+_______EOF
+
+
+ if test -n "$gint16"; then
+ cat >>$outfile <<_______EOF
+typedef signed $gint16 gint16;
+typedef unsigned $gint16 guint16;
+#define G_GINT16_MODIFIER $gint16_modifier
+#define G_GINT16_FORMAT $gint16_format
+#define G_GUINT16_FORMAT $guint16_format
+_______EOF
+ fi
+
+
+ if test -n "$gint32"; then
+ cat >>$outfile <<_______EOF
+typedef signed $gint32 gint32;
+typedef unsigned $gint32 guint32;
+#define G_GINT32_MODIFIER $gint32_modifier
+#define G_GINT32_FORMAT $gint32_format
+#define G_GUINT32_FORMAT $guint32_format
+_______EOF
+ fi
+
+ cat >>$outfile <<_______EOF
+#define G_HAVE_GINT64 1 /* deprecated, always true */
+
+${glib_extension}typedef signed $gint64 gint64;
+${glib_extension}typedef unsigned $gint64 guint64;
+
+#define G_GINT64_CONSTANT(val) $gint64_constant
+#define G_GUINT64_CONSTANT(val) $guint64_constant
+_______EOF
+
+ if test x$gint64_format != x ; then
+ cat >>$outfile <<_______EOF
+#define G_GINT64_MODIFIER $gint64_modifier
+#define G_GINT64_FORMAT $gint64_format
+#define G_GUINT64_FORMAT $guint64_format
+_______EOF
+ else
+ cat >>$outfile <<_______EOF
+#undef G_GINT64_MODIFIER
+#undef G_GINT64_FORMAT
+#undef G_GUINT64_FORMAT
+_______EOF
+ fi
+
+ cat >>$outfile <<_______EOF
+
+#define GLIB_SIZEOF_VOID_P $glib_void_p
+#define GLIB_SIZEOF_LONG $glib_long
+#define GLIB_SIZEOF_SIZE_T $glib_size_t
+
+_______EOF
+
+ cat >>$outfile <<_______EOF
+typedef signed $glib_size_type_define gssize;
+typedef unsigned $glib_size_type_define gsize;
+#define G_GSIZE_MODIFIER $gsize_modifier
+#define G_GSSIZE_FORMAT $gssize_format
+#define G_GSIZE_FORMAT $gsize_format
+
+#define G_MAXSIZE G_MAXU$glib_msize_type
+_______EOF
+
+ if test -z "$glib_unknown_void_p"; then
+ cat >>$outfile <<_______EOF
+
+#define GPOINTER_TO_INT(p) ((gint) ${glib_gpi_cast} (p))
+#define GPOINTER_TO_UINT(p) ((guint) ${glib_gpui_cast} (p))
+
+#define GINT_TO_POINTER(i) ((gpointer) ${glib_gpi_cast} (i))
+#define GUINT_TO_POINTER(u) ((gpointer) ${glib_gpui_cast} (u))
+_______EOF
+ else
+ echo '#error SIZEOF_VOID_P unknown - This should never happen' >>$outfile
+ fi
+
+
+
+ cat >>$outfile <<_______EOF
+$glib_atexit
+$glib_memmove
+$glib_defines
+$glib_os
+
+$glib_vacopy
+
+#ifdef __cplusplus
+#define G_HAVE_INLINE 1
+#else /* !__cplusplus */
+$glib_inline
+#endif /* !__cplusplus */
+
+#ifdef __cplusplus
+#define G_CAN_INLINE 1
+_______EOF
+
+ if test x$g_can_inline = xyes ; then
+ cat >>$outfile <<_______EOF
+#else /* !__cplusplus */
+#define G_CAN_INLINE 1
+_______EOF
+ fi
+
+ cat >>$outfile <<_______EOF
+#endif
+
+_______EOF
+
+ if test x$g_have_iso_c_varargs = xyes ; then
+ cat >>$outfile <<_______EOF
+#ifndef __cplusplus
+# define G_HAVE_ISO_VARARGS 1
+#endif
+_______EOF
+ fi
+ if test x$g_have_iso_cxx_varargs = xyes ; then
+ cat >>$outfile <<_______EOF
+#ifdef __cplusplus
+# define G_HAVE_ISO_VARARGS 1
+#endif
+_______EOF
+ fi
+ if test x$g_have_gnuc_varargs = xyes ; then
+ cat >>$outfile <<_______EOF
+
+/* gcc-2.95.x supports both gnu style and ISO varargs, but if -ansi
+ * is passed ISO vararg support is turned off, and there is no work
+ * around to turn it on, so we unconditionally turn it off.
+ */
+#if __GNUC__ == 2 && __GNUC_MINOR__ == 95
+# undef G_HAVE_ISO_VARARGS
+#endif
+
+#define G_HAVE_GNUC_VARARGS 1
+_______EOF
+ fi
+
+ case x$g_stack_grows in
+ xyes) echo "#define G_HAVE_GROWING_STACK 1" >>$outfile ;;
+ *) echo "#define G_HAVE_GROWING_STACK 0" >>$outfile ;;
+ esac
+
+
+ echo >>$outfile
+ if test x$g_have_eilseq = xno; then
+ cat >>$outfile <<_______EOF
+#ifndef EILSEQ
+/* On some systems, like SunOS and NetBSD, EILSEQ is not defined.
+ * The correspondence between this and the corresponding definition
+ * in libiconv is essential.
+ */
+# define EILSEQ ENOENT
+#endif
+_______EOF
+
+ fi
+
+ if test x$g_have_gnuc_visibility = xyes; then
+ cat >>$outfile <<_______EOF
+#define G_HAVE_GNUC_VISIBILITY 1
+_______EOF
+ fi
+ cat >>$outfile <<_______EOF
+#if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
+#define G_GNUC_INTERNAL __hidden
+#elif defined (__GNUC__) && defined (G_HAVE_GNUC_VISIBILITY)
+#define G_GNUC_INTERNAL __attribute__((visibility("hidden")))
+#else
+#define G_GNUC_INTERNAL
+#endif
+_______EOF
+
+
+ echo >>$outfile
+ if test x$g_mutex_has_default = xyes; then
+ cat >>$outfile <<_______EOF
+$g_enable_threads_def G_THREADS_ENABLED
+#define G_THREADS_IMPL_$g_threads_impl_def
+typedef struct _GStaticMutex GStaticMutex;
+struct _GStaticMutex
+{
+ struct _GMutex *runtime_mutex;
+ union {
+ char pad[[$g_mutex_sizeof]];
+ double dummy_double;
+ void *dummy_pointer;
+ long dummy_long;
+ } static_mutex;
+};
+#define G_STATIC_MUTEX_INIT { NULL, { { $g_mutex_contents} } }
+#define g_static_mutex_get_mutex(mutex) \\
+ (g_thread_use_default_impl ? ((GMutex*) ((mutex)->static_mutex.pad)) : \\
+ g_static_mutex_get_mutex_impl_shortcut (&((mutex)->runtime_mutex)))
+_______EOF
+ else
+ cat >>$outfile <<_______EOF
+$g_enable_threads_def G_THREADS_ENABLED
+#define G_THREADS_IMPL_$g_threads_impl_def
+typedef struct _GMutex* GStaticMutex;
+#define G_STATIC_MUTEX_INIT NULL
+#define g_static_mutex_get_mutex(mutex) \\
+ (g_static_mutex_get_mutex_impl_shortcut (mutex))
+_______EOF
+ fi
+
+ cat >>$outfile <<_______EOF
+/* This represents a system thread as used by the implementation. An
+ * alien implementaion, as loaded by g_thread_init can only count on
+ * "sizeof (gpointer)" bytes to store their info. We however need more
+ * for some of our native implementations. */
+typedef union _GSystemThread GSystemThread;
+union _GSystemThread
+{
+ char data[[$g_system_thread_sizeof]];
+ double dummy_double;
+ void *dummy_pointer;
+ long dummy_long;
+};
+_______EOF
+ if test x"$g_memory_barrier_needed" != xno; then
+ echo >>$outfile
+ echo "#define G_ATOMIC_OP_MEMORY_BARRIER_NEEDED 1" >>$outfile
+ fi
+
+ echo >>$outfile
+ g_bit_sizes="16 32 64"
+ for bits in $g_bit_sizes; do
+ cat >>$outfile <<_______EOF
+#define GINT${bits}_TO_${g_bs_native}(val) ((gint${bits}) (val))
+#define GUINT${bits}_TO_${g_bs_native}(val) ((guint${bits}) (val))
+#define GINT${bits}_TO_${g_bs_alien}(val) ((gint${bits}) GUINT${bits}_SWAP_LE_BE (val))
+#define GUINT${bits}_TO_${g_bs_alien}(val) (GUINT${bits}_SWAP_LE_BE (val))
+_______EOF
+ done
+
+ cat >>$outfile <<_______EOF
+#define GLONG_TO_LE(val) ((glong) GINT${glongbits}_TO_LE (val))
+#define GULONG_TO_LE(val) ((gulong) GUINT${glongbits}_TO_LE (val))
+#define GLONG_TO_BE(val) ((glong) GINT${glongbits}_TO_BE (val))
+#define GULONG_TO_BE(val) ((gulong) GUINT${glongbits}_TO_BE (val))
+#define GINT_TO_LE(val) ((gint) GINT${gintbits}_TO_LE (val))
+#define GUINT_TO_LE(val) ((guint) GUINT${gintbits}_TO_LE (val))
+#define GINT_TO_BE(val) ((gint) GINT${gintbits}_TO_BE (val))
+#define GUINT_TO_BE(val) ((guint) GUINT${gintbits}_TO_BE (val))
+#define G_BYTE_ORDER $g_byte_order
+
+#define GLIB_SYSDEF_POLLIN =$g_pollin
+#define GLIB_SYSDEF_POLLOUT =$g_pollout
+#define GLIB_SYSDEF_POLLPRI =$g_pollpri
+#define GLIB_SYSDEF_POLLHUP =$g_pollhup
+#define GLIB_SYSDEF_POLLERR =$g_pollerr
+#define GLIB_SYSDEF_POLLNVAL =$g_pollnval
+
+#define G_MODULE_SUFFIX "$g_module_suffix"
+
+typedef $g_pid_type GPid;
+
+G_END_DECLS
+
+#endif /* GLIBCONFIG_H */
+_______EOF
+
+
+ if cmp -s $outfile glibconfig.h; then
+ AC_MSG_NOTICE([glibconfig.h is unchanged])
+ rm -f $outfile
+ else
+ mv $outfile glibconfig.h
+ fi
+],[
+
+# Note that if two cases are the same, case goes with the first one.
+# Note also that this is inside an AC_OUTPUT_COMMAND. We do not depend
+# on variable expansion in case labels. Look at the generated config.status
+# for a hint.
+
+if test "x${ac_cv_working_alloca_h+set}" = xset ; then
+ glib_header_alloca_h="$ac_cv_working_alloca_h"
+else
+ glib_header_alloca_h="$ac_cv_header_alloca_h"
+fi
+
+case xyes in
+x$ac_cv_header_float_h)
+ glib_float_h=yes
+ glib_mf=FLT_MIN glib_Mf=FLT_MAX
+ glib_md=DBL_MIN glib_Md=DBL_MAX
+ ;;
+x$ac_cv_header_values_h)
+ glib_values_h=yes
+ glib_mf=MINFLOAT glib_Mf=MAXFLOAT
+ glib_md=MINDOUBLE glib_Md=MAXDOUBLE
+ ;;
+esac
+
+case xyes in
+x$ac_cv_header_limits_h)
+ glib_limits_h=yes
+ glib_ms=SHRT_MIN glib_Ms=SHRT_MAX glib_Mus=USHRT_MAX
+ glib_mi=INT_MIN glib_Mi=INT_MAX glib_Mui=UINT_MAX
+ glib_ml=LONG_MIN glib_Ml=LONG_MAX glib_Mul=ULONG_MAX
+ ;;
+x$ac_cv_header_values_h)
+ glib_values_h=yes
+ glib_ms=MINSHORT glib_Ms=MAXSHORT glib_Mus="(((gushort)G_MAXSHORT)*2+1)"
+ glib_mi=MININT glib_Mi=MAXINT glib_Mui="(((guint)G_MAXINT)*2+1)"
+ glib_ml=MINLONG glib_Ml=MAXLONG glib_Mul="(((gulong)G_MAXLONG)*2+1)"
+ ;;
+esac
+
+if test x$ac_cv_header_sys_poll_h = xyes ; then
+ glib_sys_poll_h=yes
+fi
+
+case 2 in
+$ac_cv_sizeof_short)
+ gint16=short
+ gint16_modifier='"h"'
+ gint16_format='"hi"'
+ guint16_format='"hu"'
+ ;;
+$ac_cv_sizeof_int)
+ gint16=int
+ gint16_modifier='""'
+ gint16_format='"i"'
+ guint16_format='"u"'
+ ;;
+esac
+case 4 in
+$ac_cv_sizeof_short)
+ gint32=short
+ gint32_modifier='"h"'
+ gint32_format='"hi"'
+ guint32_format='"hu"'
+ ;;
+$ac_cv_sizeof_int)
+ gint32=int
+ gint32_modifier='""'
+ gint32_format='"i"'
+ guint32_format='"u"'
+ ;;
+$ac_cv_sizeof_long)
+ gint32=long
+ gint32_modifier='"l"'
+ gint32_format='"li"'
+ guint32_format='"lu"'
+ ;;
+esac
+case 8 in
+$ac_cv_sizeof_int)
+ gint64=int
+ gint64_modifier='""'
+ gint64_format='"i"'
+ guint64_format='"u"'
+ glib_extension=
+ gint64_constant='(val)'
+ guint64_constant='(val)'
+ ;;
+$ac_cv_sizeof_long)
+ gint64=long
+ gint64_modifier='"l"'
+ gint64_format='"li"'
+ guint64_format='"lu"'
+ glib_extension=
+ gint64_constant='(val##L)'
+ guint64_constant='(val##UL)'
+ ;;
+$ac_cv_sizeof_long_long)
+ gint64='long long'
+ if test -n "$glib_cv_long_long_format"; then
+ gint64_modifier='"'$glib_cv_long_long_format'"'
+ gint64_format='"'$glib_cv_long_long_format'i"'
+ guint64_format='"'$glib_cv_long_long_format'u"'
+ fi
+ glib_extension='G_GNUC_EXTENSION '
+ gint64_constant='(G_GNUC_EXTENSION (val##LL))'
+ guint64_constant='(G_GNUC_EXTENSION (val##ULL))'
+ ;;
+$ac_cv_sizeof___int64)
+ gint64='__int64'
+ if test -n "$glib_cv_long_long_format"; then
+ gint64_modifier='"'$glib_cv_long_long_format'"'
+ gint64_format='"'$glib_cv_long_long_format'i"'
+ guint64_format='"'$glib_cv_long_long_format'u"'
+ fi
+ glib_extension=
+ gint64_constant='(val##i64)'
+ guint64_constant='(val##ui64)'
+ ;;
+esac
+glib_size_t=$ac_cv_sizeof_size_t
+glib_size_type_define=$glib_size_type
+glib_void_p=$ac_cv_sizeof_long
+glib_long=$ac_cv_sizeof_void_p
+
+case $glib_size_type in
+short)
+ gsize_modifier='"h"'
+ gsize_format='"hu"'
+ gssize_format='"hi"'
+ glib_msize_type='SHRT'
+ ;;
+int)
+ gsize_modifier='""'
+ gsize_format='"u"'
+ gssize_format='"i"'
+ glib_msize_type='INT'
+ ;;
+long)
+ gsize_modifier='"l"'
+ gsize_format='"lu"'
+ gssize_format='"li"'
+ glib_msize_type='LONG'
+ ;;
+esac
+
+gintbits=`expr $ac_cv_sizeof_int \* 8`
+glongbits=`expr $ac_cv_sizeof_long \* 8`
+
+
+case $ac_cv_sizeof_void_p in
+$ac_cv_sizeof_int) glib_gpi_cast='' glib_gpui_cast='' ;;
+$ac_cv_sizeof_long) glib_gpi_cast='(glong)' glib_gpui_cast='(gulong)' ;;
+*) glib_unknown_void_p=yes ;;
+esac
+
+
+case xyes in
+x$ac_cv_func_atexit)
+ glib_atexit="
+#ifdef NeXT /* @#%@! NeXTStep */
+# define g_ATEXIT(proc) (!atexit (proc))
+#else
+# define g_ATEXIT(proc) (atexit (proc))
+#endif"
+ ;;
+x$ac_cv_func_on_exit)
+ glib_atexit="
+#define g_ATEXIT(proc) (on_exit ((void (*)(int, void*))(proc), NULL))"
+ ;;
+esac
+
+case xyes in
+x$ac_cv_func_memmove)
+ glib_memmove='
+#define g_memmove(dest,src,len) G_STMT_START { memmove ((dest), (src), (len)); } G_STMT_END'
+ ;;
+x$glib_cv_working_bcopy)
+ glib_memmove="
+/* memmove isn't available, but bcopy can copy overlapping memory regions */
+#define g_memmove(d,s,n) G_STMT_START { bcopy ((s), (d), (n)); } G_STMT_END"
+ ;;
+*)
+ glib_memmove="
+/* memmove isn't found and bcopy can't copy overlapping memory regions,
+ * so we have to roll our own copy routine. */
+void g_memmove (void* dest, const void * src, unsigned long len);"
+ ;;
+esac
+
+glib_defines="
+#define GLIB_MAJOR_VERSION $GLIB_MAJOR_VERSION
+#define GLIB_MINOR_VERSION $GLIB_MINOR_VERSION
+#define GLIB_MICRO_VERSION $GLIB_MICRO_VERSION
+"
+
+case xyes in
+x$glib_cv_va_copy) glib_vacopy='#define G_VA_COPY va_copy' ;;
+x$glib_cv___va_copy) glib_vacopy='#define G_VA_COPY __va_copy' ;;
+*) glib_vacopy=''
+esac
+
+if test x$glib_cv_va_val_copy = xno; then
+ glib_vacopy="\$glib_vacopy
+#define G_VA_COPY_AS_ARRAY 1"
+fi
+
+if test x$glib_cv_hasinline = xyes; then
+ glib_inline='#define G_HAVE_INLINE 1'
+fi
+if test x$glib_cv_has__inline = xyes; then
+ glib_inline="\$glib_inline
+#define G_HAVE___INLINE 1"
+fi
+if test x$glib_cv_has__inline__ = xyes; then
+ glib_inline="\$glib_inline
+#define G_HAVE___INLINE__ 1"
+fi
+
+g_have_gnuc_varargs=$g_have_gnuc_varargs
+g_have_iso_c_varargs=$g_have_iso_c_varargs
+g_have_iso_cxx_varargs=$g_have_iso_cxx_varargs
+
+g_can_inline=$g_can_inline
+g_have_gnuc_visibility=$g_have_gnuc_visibility
+g_have_sunstudio_visibility=$g_have_sunstudio_visibility
+
+case xyes in
+x$ac_cv_c_bigendian)
+ g_byte_order=G_BIG_ENDIAN
+ g_bs_native=BE
+ g_bs_alien=LE
+ ;;
+*)
+ g_byte_order=G_LITTLE_ENDIAN
+ g_bs_native=LE
+ g_bs_alien=BE
+ ;;
+esac
+
+g_pollin=$glib_cv_value_POLLIN
+g_pollout=$glib_cv_value_POLLOUT
+g_pollpri=$glib_cv_value_POLLPRI
+g_pollhup=$glib_cv_value_POLLHUP
+g_pollerr=$glib_cv_value_POLLERR
+g_pollnval=$glib_cv_value_POLLNVAL
+
+g_stack_grows=$glib_cv_stack_grows
+
+g_have_eilseq=$have_eilseq
+
+case x$have_threads in
+xno) g_enable_threads_def="#undef";;
+*) g_enable_threads_def="#define";;
+esac
+
+g_threads_impl_def=$g_threads_impl
+
+g_mutex_has_default="$mutex_has_default"
+g_mutex_sizeof="$glib_cv_sizeof_gmutex"
+g_system_thread_sizeof="$glib_cv_sizeof_system_thread"
+g_mutex_contents="$glib_cv_byte_contents_gmutex"
+
+g_memory_barrier_needed="$glib_memory_barrier_needed"
+
+g_module_suffix="$glib_gmodule_suffix"
+
+g_pid_type="$glib_pid_type"
+case $host in
+ *-*-beos*)
+ glib_os="#define G_OS_BEOS"
+ ;;
+ *-*-cygwin*)
+ glib_os="#define G_OS_UNIX
+#define G_PLATFORM_WIN32
+#define G_WITH_CYGWIN"
+ ;;
+ *-*-mingw*)
+ glib_os="#define G_OS_WIN32
+#define G_PLATFORM_WIN32"
+ ;;
+ *)
+ glib_os="#define G_OS_UNIX"
+ ;;
+esac
+])
+
+AC_CONFIG_FILES([
+glib-2.0.pc
+glib-2.0-uninstalled.pc
+gmodule-2.0.pc
+gmodule-export-2.0.pc
+gmodule-no-export-2.0.pc
+gmodule-2.0-uninstalled.pc
+gmodule-no-export-2.0-uninstalled.pc
+gthread-2.0.pc
+gthread-2.0-uninstalled.pc
+gobject-2.0.pc
+gobject-2.0-uninstalled.pc
+glib-zip
+glib-gettextize
+Makefile
+build/Makefile
+build/win32/Makefile
+build/win32/dirent/Makefile
+build/win32/vs8/Makefile
+glib/Makefile
+glib/libcharset/Makefile
+glib/gnulib/Makefile
+glib/pcre/Makefile
+glib/update-pcre/Makefile
+gmodule/Makefile
+gmodule/gmoduleconf.h
+gobject/Makefile
+gobject/glib-mkenums
+gthread/Makefile
+po/Makefile.in
+docs/Makefile
+docs/reference/Makefile
+docs/reference/glib/Makefile
+docs/reference/glib/version.xml
+docs/reference/gobject/Makefile
+docs/reference/gobject/version.xml
+tests/Makefile
+tests/gobject/Makefile
+tests/refcount/Makefile
+m4macros/Makefile
+])
+
+AC_CONFIG_COMMANDS([chmod-scripts],
+[chmod 0755 glib-zip
+chmod 0755 glib-gettextize
+chmod 0755 gobject/glib-mkenums])
+
+# we want to invoke this macro solely so that the config.status script
+# and automake generated makefiles know about these generated files.
+# They are only needed to distcheck the package
+if false; then
+ AC_CONFIG_FILES([
+ INSTALL
+ README
+ config.h.win32
+ glibconfig.h.win32
+ glib/makefile.msc
+ glib/glib.rc
+ gmodule/makefile.msc
+ gmodule/gmodule.rc
+ gobject/makefile.msc
+ gobject/gobject.rc
+ gthread/makefile.msc
+ gthread/gthread.rc
+ tests/makefile.msc
+ ])
+fi
+
+AC_OUTPUT
diff --git a/trunk/debian/README.debian b/trunk/debian/README.debian
new file mode 100644
index 000000000..571f84d09
--- /dev/null
+++ b/trunk/debian/README.debian
@@ -0,0 +1,30 @@
+glib CVS snapshots for Debian
+-----------------------------
+
+This is GLib version 1.1. GLib, is a library which includes support
+routines for C such as lists, trees, hashes, memory allocation, and
+many other things.
+
+Versions of GLib prior to 1.1.0 are distributed with GTK+ versions 1.1.0
+and earlier.
+
+This is a snapshot of GLib from the main CVS archive, built into a
+Debian package. This package is not guaranteed to work, as it was
+built automatically. You're on your own, mister or missus!
+
+The GIMP Tool Kit (gtk) is a set of widgets to help you program
+programs for the X Windowing System easily and powerfully.
+
+gtk is the moving force behind The GNU Image Manipulation Program (The
+GIMP) -- the number one freely-available image editing and creation
+program available.
+
+gtk is rapidly under development, and the source tree has officially
+been separated from The GIMP now, as other teams of programmers
+are beginning to write software using its great widget set -- like
+GNOME, a desktop interface for X, and gzilla, a freely available
+web browser for X.
+
+Ben Gertzfield <che@debian.org>, Tue, 17 Nov 1998 00:06:12 -0800
+
+
diff --git a/trunk/debian/build b/trunk/debian/build
new file mode 100755
index 000000000..1bd8a50e9
--- /dev/null
+++ b/trunk/debian/build
@@ -0,0 +1,62 @@
+#!/usr/bin/perl -w
+
+ # Adjust debian/changelog and build a new
+ # Debian package of a CVS archive.
+
+ # Written 17 November 1998 by Ben Gertzfield
+ # <che@debian.org>
+
+ # This work is released under the GNU
+ # General Public License, version 2 or
+ # later.
+
+use strict;
+use diagnostics;
+use File::Copy;
+
+my $maintainer = 'Ben Gertzfield <che@debian.org>';
+
+my @date = localtime;
+
+my $datestr = sprintf("%d%.2d%.2d", $date[5] + 1900, $date[4] + 1, $date[3]);
+my $revision = '01';
+
+open (CHANGELOG, 'debian/changelog') or die "Couldn't open debian/changelog: $!\n";
+
+$_ = <CHANGELOG>;
+chomp;
+
+close CHANGELOG;
+
+my ($package, $last_date, $last_revision) = /^(.*?) \((.*?)\.(.*)?\)/;
+
+if ($last_date eq $datestr) {
+ $revision = sprintf("%.2d", $last_revision + 1);
+}
+
+my $new_version = "$datestr.$revision";
+
+copy('debian/changelog', 'debian/changelog.old') or die "Couldn't copy debian/changelog to debian/changelog.old: $!\n";
+
+open(NEWCHANGELOG, ">debian/changelog") or die "Couldn't open debian/changelog for writing: $!\n";
+
+print NEWCHANGELOG "$package ($new_version) unstable; urgency=low\n\n * CVS snapshot build at " . scalar localtime() . "\n\n -- $maintainer " . `date -R` . "\n";
+
+open(OLDCHANGELOG, "debian/changelog.old") or die "Couldn't open debian/changelog.old: $!\n";
+
+while (<OLDCHANGELOG>) {
+ print NEWCHANGELOG;
+}
+
+close OLDCHANGELOG;
+close NEWCHANGELOG;
+
+unlink('debian/changelog.old') or die "Couldn't unlink debian/changelog.old: $!\n";
+
+open(NEWVERSION, '>debian/version') or die "Couldn't open debian/version for writing: $!\n";
+print NEWVERSION "$new_version\n";
+close NEWVERSION;
+
+system('dpkg-buildpackage -b -rfakeroot -us -uc');
+unlink 'debian/version' or die "Couldn't unlink debian/version: $!\n";
+
diff --git a/trunk/debian/changelog b/trunk/debian/changelog
new file mode 100644
index 000000000..6b5e22d09
--- /dev/null
+++ b/trunk/debian/changelog
@@ -0,0 +1,10 @@
+glib-cvs (19981116.01) unstable; urgency=low
+
+ * Testing the CVS build scripts
+
+ -- Ben Gertzfield <che@debian.org> Tue, 17 Nov 1998 00:07:26 -0800
+
+Local variables:
+mode: debian-changelog
+add-log-mailing-address: "che@debian.org"
+End:
diff --git a/trunk/debian/control b/trunk/debian/control
new file mode 100644
index 000000000..8185a5025
--- /dev/null
+++ b/trunk/debian/control
@@ -0,0 +1,53 @@
+Source: glib-cvs
+Priority: extra
+Section: libs
+Maintainer: Ben Gertzfield <che@debian.org>
+Standards-Version: 2.4.0.0
+
+Package: libglib-cvs-1.1
+Architecture: any
+Section: libs
+Depends: ${shlibs:Depends}
+Suggests: libgtk-cvs-1.1
+Conflicts: libglib1.1
+Description: CVS build of the GLib library of C routines
+ **THIS IS NOT AN OFFICIAL DEBIAN PACKAGE! THIS IS AN AUTOMATED CVS
+ BUILD OF THE GLIB LIBRARIES! BEWARE! IT MAY NOT WORK!**
+ .
+ GLib is a library containing many useful C routines for things such
+ as trees, hashes, and lists. GLib was previously distributed with
+ the GTK+ toolkit, but has been split off as of the developers' version
+ 1.1.0.
+
+Package: libglib-cvs-dev
+Architecture: any
+Section: devel
+Conflicts: libgtk-dev, libglib-dev
+Provides: libglib-dev
+Replaces: libglib-dev
+Depends: libglib-cvs-1.1 (=${Source-Version})
+Suggests: libgtk-cvs-dev, libgtk-cvs-1.1-doc
+Description: CVS header files and static libraries for the GLib library
+ **THIS IS NOT AN OFFICIAL DEBIAN PACKAGE! THIS IS AN AUTOMATED CVS
+ BUILD OF THE GLIB LIBRARIES! BEWARE! IT MAY NOT WORK!**
+ .
+ This package contains the header files and static libraries for the
+ GLib C library.
+ .
+ Install this package if you wish to develop your own X programs using
+ the GTK+ widget toolkit, or wish to develop plug-ins for The GIMP.
+
+Package: libglib-cvs-dbg
+Architecture: any
+Section: devel
+Conflicts: libgtk-dev, libglib-dbg
+Depends: libglib-cvs-1.1 (=${Source-Version}), libglib-cvs-dev (=${Source-Version})
+Description: CVS debugging static libraries for the GLib library
+ **THIS IS NOT AN OFFICIAL DEBIAN PACKAGE! THIS IS AN AUTOMATED CVS
+ BUILD OF THE GLIB LIBRARIES! BEWARE! IT MAY NOT WORK!**
+ .
+ This package contains the debugging static libraries for the GLib C
+ library.
+ .
+ The debugging libraries are installed as /usr/lib/libglib_g.a -- link
+ specifically with them if you want to debug.
diff --git a/trunk/debian/copyright b/trunk/debian/copyright
new file mode 100644
index 000000000..27fab203e
--- /dev/null
+++ b/trunk/debian/copyright
@@ -0,0 +1,8 @@
+This package was debianized by Ben Gertzfield <che@debian.org>
+on Tue, 17 Nov 1998 00:16:10 -0800
+
+It was downloaded from the CVS archives at cvs.gimp.org.
+
+It may be redistributed under the terms of the GNU LGPL, Version 2 or
+later, found on Debian systems in the file /usr/doc/copyright/LGPL.
+
diff --git a/trunk/debian/libglib-cvs-dev.files b/trunk/debian/libglib-cvs-dev.files
new file mode 100644
index 000000000..4d95cfe74
--- /dev/null
+++ b/trunk/debian/libglib-cvs-dev.files
@@ -0,0 +1,9 @@
+usr/lib/libglib.so
+usr/lib/libglib.a
+usr/lib/libgmodule.so
+usr/lib/libgmodule.a
+usr/include/glib.h
+usr/include/gmodule.h
+usr/bin/glib-config
+usr/lib/glib/
+usr/share/aclocal/glib.m4
diff --git a/trunk/debian/postinst b/trunk/debian/postinst
new file mode 100644
index 000000000..0cd5f28c9
--- /dev/null
+++ b/trunk/debian/postinst
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+set -e
+
+ldconfig
+
+#DEBHELPER#
diff --git a/trunk/debian/rules b/trunk/debian/rules
new file mode 100755
index 000000000..7f06abbcf
--- /dev/null
+++ b/trunk/debian/rules
@@ -0,0 +1,126 @@
+#!/usr/bin/make -f
+
+# debian/rules file for CVS glib1.1 Debian package
+# based on glib+ debian/rules file
+# written April 1998 by Ben Gertzfield <che@debian.org>
+
+build: build-stamp
+build-stamp:
+ dh_testdir
+ ./autogen.sh --prefix=/usr
+ $(MAKE)
+ touch build-stamp
+
+build-dbg: build-dbg-stamp
+build-dbg-stamp:
+ dh_testdir
+ ./configure --prefix=/usr --enable-debug=yes
+ $(MAKE)
+ touch build-dbg-stamp
+
+clean:
+ dh_testdir
+ dh_testroot
+ rm -f build-stamp build-dbg-stamp install-stamp install-dbg-stamp
+ # Add here commands to clean up after the build process.
+ -$(MAKE) clean
+ -$(MAKE) distclean
+ find . -name '*.o' -o -name '_libs' -o -name '*.lo' -o -name '*.a' -o -name '.deps' | xargs rm -rf
+ dh_clean
+
+clean-dbg:
+ dh_testdir
+ dh_testroot
+ rm -f build-stamp build-dbg-stamp install-stamp install-dbg-stamp
+ # Add here commands to clean up after the build process.
+ -$(MAKE) clean
+ -$(MAKE) distclean
+ find . -name '*.o' -o -name '_libs' -o -name '*.lo' -o -name '*.a' -o -name '.deps' | xargs rm -rf
+ dh_clean -k
+
+install: install-stamp
+install-stamp: build
+ dh_testdir
+ dh_testroot
+ dh_clean
+ $(MAKE) prefix=`pwd`/debian/tmp/usr install
+ touch install-stamp
+
+install-dbg: install-dbg-stamp
+install-dbg-stamp: build-dbg
+ dh_testdir
+ dh_testroot
+ dh_clean -k
+ $(MAKE) prefix=`pwd`/debian/libglib-cvs-dbg/usr install
+ touch install-dbg-stamp
+
+# Build architecture-independent files here.
+binary-indep:
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install libglib-cvs-dev libglib-cvs-1.1 libglib-cvs-dbg
+
+libglib-cvs-1.1: build
+ dh_testdir -plibglib-cvs-1.1
+ dh_testroot -plibglib-cvs-1.1
+ dh_installdirs -plibglib-cvs-1.1
+ # Add here commands to install the files into debian/tmp
+ rm -rf debian/tmp/usr/bin debian/tmp/usr/include debian/tmp/usr/info debian/tmp/usr/lib/glib debian/tmp/usr/share debian/tmp/usr/man debian/tmp/usr/lib/*.la
+ dh_installdocs -plibglib-cvs-1.1
+ dh_installchangelogs -plibglib-cvs-1.1
+ dh_strip -plibglib-cvs-1.1
+ dh_compress -plibglib-cvs-1.1
+ dh_fixperms -plibglib-cvs-1.1
+ dh_installdeb -plibglib-cvs-1.1
+ dh_shlibdeps -plibglib-cvs-1.1
+ dh_gencontrol -plibglib-cvs-1.1
+ dh_makeshlibs -plibglib-cvs-1.1 -V 'libglib-cvs-1.1 (='`cat debian/version`')'
+ dh_md5sums -plibglib-cvs-1.1
+ dh_builddeb -plibglib-cvs-1.1
+
+libglib-cvs-dev: build
+ dh_testdir -plibglib-cvs-dev
+ dh_testroot -plibglib-cvs-dev
+ dh_clean -plibglib-cvs-dev -k
+ dh_installdirs -plibglib-cvs-dev
+ # Add here commands to install the files into debian/tmp
+ dh_movefiles -plibglib-cvs-dev
+ cp glib-config debian/tmp/usr/bin
+ dh_installdocs -plibglib-cvs-dev
+ dh_undocumented -plibglib-cvs-dev glib-config.1
+ dh_installchangelogs -plibglib-cvs-dev
+ dh_strip -plibglib-cvs-dev
+ dh_compress -plibglib-cvs-dev
+ dh_fixperms -plibglib-cvs-dev
+ dh_installdeb -plibglib-cvs-dev
+ dh_shlibdeps -plibglib-cvs-dev
+ dh_gencontrol -plibglib-cvs-dev
+ dh_md5sums -plibglib-cvs-dev
+ dh_builddeb -plibglib-cvs-dev
+
+libglib-cvs-dbg: clean-dbg install-dbg
+ dh_testdir -plibglib-cvs-dbg
+ dh_testroot -plibglib-cvs-dbg
+ dh_installdirs -plibglib-cvs-dbg
+ # Add here commands to install the files into debian/libglib-cvs-dbg
+ rm -rf debian/libglib-cvs-dbg/usr/bin debian/libglib-cvs-dbg/usr/include debian/libglib-cvs-dbg/usr/info debian/libglib-cvs-dbg/usr/lib/glib debian/libglib-cvs-dbg/usr/man debian/libglib-cvs-dbg/usr/share debian/libglib-cvs-dbg/usr/lib/*.{la,so*}
+ for file in `find debian/libglib-cvs-dbg/usr/lib -name '*.a'` ; do \
+ mv $$file debian/libglib-cvs-dbg/usr/lib/`basename $$file .a`_g.a; \
+ done
+ dh_installdocs -plibglib-cvs-dbg
+ dh_installchangelogs -plibglib-cvs-dbg
+ dh_compress -plibglib-cvs-dbg
+ dh_fixperms -plibglib-cvs-dbg
+ dh_installdeb -plibglib-cvs-dbg
+ dh_shlibdeps -plibglib-cvs-dbg
+ dh_gencontrol -plibglib-cvs-dbg
+ dh_makeshlibs -plibglib-cvs-dbg -V
+ dh_md5sums -plibglib-cvs-dbg
+ dh_builddeb -plibglib-cvs-dbg
+
+source diff:
+ @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary
diff --git a/trunk/docs/Makefile.am b/trunk/docs/Makefile.am
new file mode 100644
index 000000000..c44793630
--- /dev/null
+++ b/trunk/docs/Makefile.am
@@ -0,0 +1,10 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = reference
+
+EXTRA_DIST = debugging.txt macros.txt
+
+files:
+ @files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \
+ echo $$p; \
+ done
diff --git a/trunk/docs/debugging.txt b/trunk/docs/debugging.txt
new file mode 100644
index 000000000..8ab202804
--- /dev/null
+++ b/trunk/docs/debugging.txt
@@ -0,0 +1,41 @@
+
+Traps (G_BREAKPOINT) and traces for the debuging
+================================================
+
+Some code portions contain trap variables that can be set during
+debugging time if G_ENABLE_DEBUG has been defined upon compilation
+(use the --enable-debug=yes option to configure for this, macros.txt
+covers more details).
+Such traps lead to immediate code halts to examine the current
+program state and backtrace.
+Currently, the following trap variables exist:
+
+static volatile gulong g_trap_free_size;
+static volatile gulong g_trap_realloc_size;
+static volatile gulong g_trap_malloc_size;
+ If set to a size > 0, g_free(), g_realloc() and g_malloc()
+ respectively, will be intercepted if the size matches the
+ size of the corresponding memory block to free/reallocate/allocate.
+ This will only work with g_mem_set_vtable (glib_mem_profiler_table)
+ upon startup though, because memory profiling is required to match
+ on the memory block sizes.
+static volatile GObject *g_trap_object_ref;
+ If set to a valid object pointer, ref/unref will be intercepted
+ with G_BREAKPOINT ();
+static volatile gpointer *g_trap_instance_signals;
+static volatile gpointer *g_trace_instance_signals;
+ If set to a valid instance pointer, debugging messages
+ will be spewed about emissions of signals on this instance.
+ For g_trap_instance_signals matches, the emissions will
+ also be intercepted with G_BREAKPOINT ();
+
+Environment variables for debugging
+===================================
+When G_ENABLE_DEBUG was defined upon compilation, the GObject library
+supports an environment variable GOBJECT_DEBUG that can be set to a
+combination of the flags passed in to g_type_init() (currently
+"objects" and "signals") to trigger debugging messages about
+object bookkeeping and signal emissions during runtime.
+
+
+2000/02/04 Tim Janik
diff --git a/trunk/docs/macros.txt b/trunk/docs/macros.txt
new file mode 100644
index 000000000..8b4202987
--- /dev/null
+++ b/trunk/docs/macros.txt
@@ -0,0 +1,81 @@
+
+
+GLib's configure options and corresponding macros
+=================================================
+
+--enable-debug=no
+ -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS
+--enable-debug=minimum [default for stable branches]
+ none
+--enable-debug=yes [default for development branches]
+ -DG_ENABLE_DEBUG -g
+--enable-gc-friendly=yes
+ #define ENABLE_GC_FRIENDLY_DEFAULT 1
+--disable-mem-pools=yes
+ #define DISABLE_MEM_POOLS 1
+
+Besides these, there are some local feature specific options, but my main
+focus here is to concentrate on macros that affect overall GLib behaviour
+and/or third party code.
+
+
+Notes on GLib's internal and global macros
+==========================================
+
+
+ENABLE_GC_FRIENDLY_DEFAULT
+ Newly allocated memory that isn't directly initialized, as well
+ as memory being freed should be reset to 0. The point here is to
+ allow memory checkers and similar programs that use bohem GC alike
+ algorithms to produce more accurate results.
+ This can also be accomplished by setting the environment variable
+ G_DEBUG=gc-friendly.
+DISABLE_MEM_POOLS
+ Many small chunks of memory are often allocated via collective pools
+ in GLib and are cached after release to speed up reallocations.
+ For sparse memory systems this behaviour is often inferior, so
+ memory pools can be disabled to avoid excessive caching and force
+ atomic maintenance of chunks through the g_malloc/g_free.
+ Code currently affected by this macro:
+ - GList, GSList, GNode allocations
+ - GMemChunks become basically non-effective
+ - GSignal disables all caching (potentially very slow)
+ - GType doesn't honour the GTypeInfo n_preallocs field anymore
+ - the GBSearchArray flag G_BSEARCH_ALIGN_POWER2 becomes non-functional
+G_DISABLE_ASSERT
+ The g_assert() and g_assert_not_reached() become non-functional
+ with this define. The motivation is to speed up end-user apps by
+ avoiding expensive checks.
+ This macro can affect third-party code. --enable-debug=no will only
+ disable the assertion macros for GLib itself, but third-party code
+ that passes -DG_DISABLE_ASSERT to the compiler upon its own build
+ will end up with the non-functional variants after including glib.h
+ as well.
+ NOTE: Code inside the assertion macros should not have side effects
+ that affect the operation of the program.
+G_DISABLE_CHECKS
+ This macro is similar to G_DISABLE_ASSERT, it affects third-party
+ code as mentioned above and the NOTE about G_DISABLE_ASSERT applies
+ too. The macros that become non-functional here are
+ g_return_if_fail(), g_return_val_if_fail(), g_return_if_reached() and
+ g_return_val_if_reached().
+ Additionally the glib_mem_profiler_table and g_mem_profile() from
+ gmem.h become non-functional if this macro is supplied.
+ This macro also switches off certain checks in the GSignal code.
+G_ENABLE_DEBUG
+ Quite a bit of additional debugging code is compiled into GLib for this
+ macro, and since it is a globally visible define, third-party code may
+ be affected by it similar to G_DISABLE_ASSERT.
+ The additional code executed/compiled for this macro currently involve:
+ - extra validity checks for GDate
+ - memory profiling traps in gmem.c (consult debugging.txt for details)
+ - BREAKPOINT abortion for fatal log levels in gmessage.c instead of
+ plain abort() to allow debuggers trapping and overriding them
+ - added verbosity of gscanner.c to catch deprecated code paths
+ - added verbosity of gutils.c to catch deprecated code paths
+ - object ref/unref traps (consult debugging.txt) and object bookkeeping
+ in gobject.c
+ - extra validity checks in gsignal.c
+
+
+2000/12/28 Tim Janik
diff --git a/trunk/docs/reference/AUTHORS b/trunk/docs/reference/AUTHORS
new file mode 100644
index 000000000..64f46b74b
--- /dev/null
+++ b/trunk/docs/reference/AUTHORS
@@ -0,0 +1,7 @@
+Damon Chaplin <damon@karuna.freeserve.co.uk> and others.
+
+See:
+
+ http://www.gtk.org/rdp/status.html
+
+for a complete list.
diff --git a/trunk/docs/reference/COPYING b/trunk/docs/reference/COPYING
new file mode 100644
index 000000000..df952d3ca
--- /dev/null
+++ b/trunk/docs/reference/COPYING
@@ -0,0 +1,30 @@
+This work may be reproduced and distributed in whole or in part, in
+any medium, physical or electronic, so as long as this copyright
+notice remains intact and unchanged on all copies. Commercial
+redistribution is permitted and encouraged, but you may not
+redistribute, in whole or in part, under terms more restrictive than
+those under which you received it. If you redistribute a modified or
+translated version of this work, you must also make the source code to
+the modified or translated version available in electronic form
+without charge. However, mere aggregation as part of a larger work
+shall not count as a modification for this purpose.
+
+All code examples in this work are placed into the public domain,
+and may be used, modified and redistributed without restriction.
+
+BECAUSE THIS WORK IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE WORK, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE WORK "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. SHOULD THE WORK PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY REPAIR OR CORRECTION.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE WORK AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+WORK, EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
diff --git a/trunk/docs/reference/ChangeLog b/trunk/docs/reference/ChangeLog
new file mode 100644
index 000000000..3ec5bf067
--- /dev/null
+++ b/trunk/docs/reference/ChangeLog
@@ -0,0 +1,3025 @@
+2007-06-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.4 ===
+
+2007-06-04 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.3 ===
+
+2007-06-04 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt:
+ * glib/tmpl/misc_utils.sgml: Add g_get_special_user_dir()
+ and GUserDirectory.
+
+2007-05-30 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/i18n.sgml: Add some hints about
+ xgettext invokation.
+
+2007-05-30 Dan Winship <danw@novell.com>
+
+ * glib/glib-sections.txt:
+ * glib/tmpl/keyfile.sgml: add G_KEY_FILE_DESKTOP_* macros
+
+2007-05-26 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/objects.sgml: Fix a typo
+
+2007-05-22 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.2 ===
+
+2007-05-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/messages.sgml: Fix a typo (#436547,
+ Guillaume Desmottes)
+
+2007-05-14 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/running.sgml: Document g_slice_debug_tree_statistics
+ as debug-only functionality.
+
+2007-05-11 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/option.sgml: Document new G_OPTION_ARG_REMAINING
+ functionality.
+
+2007-05-03 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/glib-sections.txt:
+ * glib/tmpl/messages.sgml:
+ Add g_unichar_ismark().
+
+2007-05-03 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.1 ===
+
+2007-04-30 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add new regex functions
+
+2007-04-30 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt:
+ * glib/tmpl/gregex.sgml: Update for the GRegex/GMatchInfo
+ split.
+
+2007-04-24 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add g_option_context_get_help.
+
+2007-04-11 Emmanuele Bassi <ebassi@gnome.org>
+
+ * glib/glib-sections.txt: Add new hash functions.
+
+2007-04-02 Ryan Lortie <desrt@desrt.ca>
+
+ * gobject/tmpl/objects.sgml: Document ->constructed().
+
+2007-03-18 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/thread_pools.sgml:
+ * glib/tmpl/strings.sgml:
+ * glib/tmpl/string_chunks.sgml:
+ * glib/tmpl/spawn.sgml:
+ * glib/tmpl/patterns.sgml:
+ * glib/tmpl/modules.sgml:
+ * glib/tmpl/memory_slices.sgml:
+ * glib/tmpl/memory.sgml:
+ * glib/tmpl/gregex.sgml: Trivial cleanups
+
+2007-03-16 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.0 ===
+
+Fri Mar 16 16:04:42 2007 Tim Janik <timj@gtk.org>
+
+ * glib/tmpl/scanner.sgml: some fixups, mention that changing scanner
+ config during the parsing phase is supported behavior.
+
+2007-03-15 Marco Barisione <marco@barisione.org>
+
+ Add GRegex for regular expression matching. (#50075)
+
+ * glib/Makefile.am:
+ * glib/glib-docs.sgml:
+ * glib/glib-sections.txt:
+ * glib/tmpl/glib-unused.sgml:
+ * glib/regex-syntax.sgml:
+ * glib/tmpl/gregex-unused.sgml:
+ * glib/tmpl/gregex.sgml: Add GRegex.
+
+ * glib/building.sgml: Document build options for GRegex.
+
+2007-03-14 Stefan Kost <ensonic@users.sf.net>
+
+ * gobject/tmpl/gparamspec.sgml:
+ Readd docs for G_PARAM_STATIC_NICK and add docs for new
+ G_PARAM_STATIC_STRINGS (fixes #418021).
+
+2007-03-06 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/threads.sgml: Document G_ERRORCHECK_MUTEXES. (#412145)
+
+ * glib/tmpl/trees-nary.sgml: Fix a typo in the docs for
+ g_node_first_child(). (#409395, Vincent Untz)
+
+2007-02-11 Stefan Kost <ensonic@users.sf.net>
+
+ * gobject/tut_gobject.xml:
+ * gobject/tut_gsignal.xml:
+ * gobject/tut_gtype.xml:
+ * gobject/tut_howto.xml:
+ * gobject/tut_intro.xml:
+ * gobject/tut_tools.xml:
+ Format XML to be more editable. Describe Interfaces better. Add a
+ footnote at first occurance of 'maman_'.
+
+2007-02-08 Stefan Kost <ensonic@users.sf.net>
+
+ * gobject/tut_gobject.xml:
+ * gobject/tut_gsignal.xml:
+ * gobject/tut_gtype.xml:
+ * gobject/tut_howto.xml:
+ * gobject/tut_tools.xml:
+ Unify spelling of GObject and GType. Improve some wording. Update the
+ usage of private data. Make tables use row-spans and add id's to them.
+
+2007-01-30 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/gsignal.sgml: Correct a typo.
+ (#401994, Mariano Suarez-Alvarez)
+
+2007-01-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/macros_misc.sgml: Document G_GNUC_INTERNAL
+ support for Sun Studio.
+
+2007-01-23 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/objects.sgml: Document
+ g_object_class_override_property as 2.4 addition (#399940,
+ Ian Turner)
+
+2007-01-17 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/tmpl/macros_misc.sgml: Put back G_GNUC_HAVE_VISIBILITY
+ doc that was removed accidentally.
+
+2007-01-15 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/gparamspec.sgml; Document G_PARAM_STATIC_NICK.
+ (#396564, Vincent Untz)
+
+2007-01-12 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/keyfile.sgml: Small clarifications.
+
+2007-01-03 Behdad Esfahbod <behdad@gnome.org>
+
+ * glib/glib-sections.txt: Add g_unichar_iszerowidth.
+
+ * glib/tmpl/glib-unused.sgml:
+ * glib/tmpl/keyfile.sgml:
+ * glib/tmpl/macros_misc.sgml:
+ * glib/tmpl/messages.sgml:
+ * glib/tmpl/unicode.sgml:
+ Template changes.
+
+2007-01-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/running.sgml: Remove C99ism from example.
+
+2006-12-31 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/threads.sgml: Fix whitespace. (#391116)
+
+2006-12-28 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/gtype.sgml: Updates
+
+ * gobject/tmpl/gtypemodule.sgml: Document dynamic type
+ registration macros.
+
+ * gobject/gobject-docs.sgml: Add "Since 2.14" index
+ * gobject/gobject-sections.txt: Add dynamic type macros
+
+2006-12-28 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/objects.sgml: Clarify a detail about
+ g_object_set_data_full. (#343750, Christian Neumair)
+
+Wed Dec 27 15:56:53 2006 Tim Janik <timj@gtk.org>
+
+ * glib/tmpl/memory_slices.sgml:
+ * glib/running.sgml: document G_SLICE=debug-blocks.
+
+2006-12-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/running.sgml:
+ * glib/tmpl/option.sgml:
+ * glib/tmpl/date.sgml: Add hints for locale-dependent functions.
+
+2006-12-18 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/keyfile.sgml: Small clarification (#369908,
+ Tapani Pälli)
+
+2006-12-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/spawn.sgml: Refer to g_child_watch_add() in addition
+ to waitpid().
+
+ * gobject/tmpl/objects.sgml: Expand GObject::notify
+ documentation. (#381722, Nickolay V. Shmyrev)
+
+ * gobject/tmpl/gparamspec.sgml: Add canonical-parameter-name id.
+
+2006-12-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-docs.sgml: Add a "Since 2.14" section.
+
+ * glib/glib-sections.txt: Add g_string_chunk_clear.
+
+2006-12-14 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/*.xml: s/Gnome/GNOME/g (#352156, Guillaume Desmottes)
+
+ * glib/tmpl/keyfile.sgml: Clarify the behaviour
+ wrt. to duplicate keys and groups.
+
+2006-12-13 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/modules.sgml: Point out that valid symbols may be NULL.
+
+2006-10-08 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/unicode.sgml: Document GUnicodeType.
+
+2006-10-08 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add g_unichar_get_script() and
+ GUnicodeScript.
+
+ * glib/tmpl/unicode.sgml: Document GUnicodeScript
+
+ * gobject/tmpl/enumerations_flags.sgml: Add a hint about
+ the requirement that enum and flags values must be static.
+
+2006-10-01 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/option.sgml: Improve example. (#367625, Ross Burton)
+
+Mon Sep 11 14:57:46 2006 Tim Janik <timj@imendio.com>
+
+ * glib/running.sgml: documented G_DEBUG flags resident-modules
+ and bind-now-modules, patch by Christian Persch on bug #345099.
+
+2006-09-10 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add new functions
+
+2006-08-28 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/compiling.sgml: Add a note about G_DISABLE_DEPRECATED.
+ (#353172, Matt Barnes)
+
+Wed Aug 16 13:55:39 2006 Tim Janik <timj@imendio.com>
+
+ * glib/tmpl/trash_stack.sgml: added notes about complexity.
+
+2006-08-15 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.12.2 ===
+
+2006-08-10 Josh Parsons <josh.parsons@stonebow.otago.ac.nz>
+
+ * gobject/tmpl/gtype.sgml:
+ * glib/tmpl/threads.sgml: Style and grammar fixes.
+
+2006-08-05 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/messages.sgml: Add some hints
+ about making warnings fatal. (#348785, Matt
+ Barnes)
+
+2006-07-22 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.12.1 ===
+
+2006-07-20 Tor Lillqvist <tml@novell.com>
+
+ * glib/tmpl/date.sgml: Improve doc for
+ g_date_strftime(). (#346197)
+
+2006-07-05 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/base64.sgml: Remove bogus reference
+ to nonexisting function. (#346660, Mark Drago)
+
+2006-07-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.12.0 ===
+
+2006-06-20 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.4 ===
+
+2006-06-12 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.3 ===
+
+2006-06-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.2 ===
+
+2006-06-01 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add new hash table functions.
+ Add new g_source functions.
+
+Wed May 31 11:35:48 2006 Tim Janik <timj@gtk.org>
+
+ * gobject/tmpl/gtype.sgml (Note): amend G_TYPE_CHAR according to #303622.
+
+2006-05-28 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/markup.sgml: Document G_MARKUP_TREAT_CDATA_AS_TEXT.
+
+2006-05-16 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add g_ascii_strtoll
+
+2006-05-15 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.1 ===
+
+2006-05-13 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Document new api.
+
+2006-05-11 Bastien Nocera <hadess@hadess.net>
+
+ * glib/tmpl/option.sgml: add documentation for G_OPTION_ARG_INT64
+
+2006-05-10 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/gtype.sgml: Updates
+
+2006-05-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.0 ===
+
+2006-05-02 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/gtypemodule.sgml: Document a little
+ pitfall with the last unref for an object.
+
+2006-04-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/unicode.sgml: Mention that GLib 2.12 will
+ support UCD 5.0.
+
+2006-04-21 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/gobject-sections.txt:
+ * gobject/tmpl/objects.sgml:
+ * gobject/tmpl/gtype.sgml: Additions
+
+ * glib/glib-docs.sgml:
+ * gobject/gobject-docs.sgml: Add 2.12 indices.
+
+ * gobject/tmpl/gtype.sgml: Document g_type_register_static_simple
+
+2006-04-19 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/objects.sgml: Add some missing Since: 2.8 tags
+
+2006-04-18 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add new keyfile api
+
+2006-04-18 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tut_gobject.xml: Say that ref/unref are thread-safe now.
+ (#322883, Christophe Fergeau)
+
+2006-04-05 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/signals.sgml: Document class_offset 0.
+ and that class_closure may be NULL.
+
+2006-04-04 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt:
+ * glib/glib-docs.sgml: Add Base64 section
+
+2006-04-03 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/objects.sgml: Add some verbiage to
+ g_object_ref_sink_docs. (#336677)
+
+2006-03-30 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/objects.sgml: Update the floating docs wrt
+ to GInitiallyUnowned.
+
+ * gobject/tmpl/param_value_types.sgml:
+ * gobject/tmpl/objects.sgml:
+ * gobject/tmpl/gtype.sgml: Additions
+
+ * glib/tmpl/messages.sgml: Cleanup
+
+ * glib/tmpl/memory_slices.sgml: Adapt to a parameter name change
+
+ * glib/tmpl/linked_lists_double.sgml: Document g_list_free1
+
+2006-03-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/option.sgml: Document floating point arguments
+
+Fri Mar 24 15:22:04 2006 Tim Janik <timj@imendio.com>
+
+ * glib/tmpl/atomic_operations.sgml: some wording fixups.
+
+2006-03-20 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/types.sgml: Document G_HAVE_GINT64 as deprecated.
+ (#335294, Richard Laager)
+
+2006-03-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/option.sgml: Hint that @error should
+ be set in error cases. (#334646, Christian Persch)
+
+2006-03-09 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/templ/timers.sgml: Mention that the second
+ parameter of g_timer_elapsed can be NULL (#333916,
+ Christian Neumair)
+
+2006-03-07 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.10.1 ===
+
+2006-02-24 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.10.0 ===
+
+2006-02-22 Stefan Kost <ensonic@users.sf.net>
+
+ * gobject/tmpl/gtype.sgml:
+ add @since: for _add_private, _GET_PRIVATE
+ * gobject/tut_gobject.xml:
+ fix example to use ->priv and not ->private
+ * gobject/tut_howto.xml:
+ fix g_type_class_add_private example
+
+2006-02-14 Tor Lillqvist <tml@novell.com>
+
+ * glib/tmpl/iochannels.sgml: Document some Windows-specific issues.
+
+ * glib/glib-sections.txt: Move three Windows-specific functions
+ that now are documented from being Private to the correct section.
+
+2006-02-10 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.6 ===
+
+2006-02-10 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/date.sgml: Fix a typo (#329123, Kjartan Maraas)
+
+2006-01-27 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.5 ===
+
+2006-01-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt:
+ * glib/tmpl/memory.sgml: Document g_mem_gc_friendly.
+
+2006-01-26 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tut_tools.xml: Mention g_trap_object_ref
+
+ * glib/running.sgml: Add g_trap variables to the index.
+ Mention conditional breakpoints as an alternative.
+
+Wed Jan 25 17:32:22 2006 Tim Janik <timj@gtk.org>
+
+ * glib/tmpl/memory_slices.sgml: link to G_DEBUG/G_SLICE where appropriate.
+
+Wed Jan 25 17:12:47 2006 Tim Janik <timj@gtk.org>
+
+ * glib/running.sgml: documented G_SLICE=always-malloc and
+ G_DEBUG=gc-friendly. added anchors for each env var.
+
+2006-01-18 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.4 ===
+
+2006-01-18 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/scanner.sgml: Add a note explaining peculiarities
+ of peek_token wrt to scope changes. (#307922)
+
+2006-01-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/memory.sgml: Add a note about casting the results
+ of g_new() and g_new0().
+
+2006-01-16 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.3 ===
+
+2006-01-12 Federico Mena Quintero <federico@ximian.com>
+
+ * glib/file-name-encodings.sxd: Replaced with the correct file.
+
+ * glib/file-name-encodings.png: Huh? This was a 6-byte file.
+ Replaced it with the correct one.
+
+2006-01-07 Stefan Kost <ensonic@users.sf.net>
+
+ * gobject/tut_gtype.xml:
+ fix internal link, little XXX cleanup
+
+2006-01-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.2 ===
+
+2006-01-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add new API
+
+2006-01-02 Stepan Kasal <kasal@ucw.cz>
+
+ * glib/glib-docs.sgml (glib-Windows-Compatability-Functions): Rename
+ (glib-Windows-Compatibility-Functions): , ie. s/Compata/Compati/
+ * glib/glib-sections.txt: s/Compata/Compati/
+
+2005-12-24 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/gobject-sections.txt:
+ * gobject/tmpl/param_value_types.sgml: Document GType
+ paramspecs
+
+2005-12-20 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: add g_thread_pool_set_sort_function.
+
+2005-12-19 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/*.sgml: Update versioned deprecation
+
+ * gobject/tmpl/gboxed.sgml: Document G_TYPE_HASH_TABLE.
+
+ * glib/glib-sections.txt: Add g_list_free1
+
+ * glib/glib-overrides.txt: Remove G_THREADS_IMPL_SOLARIS
+
+2005-12-14 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt:
+ * glib/tmpl/atomic_operations.sgml: Document new atomic
+ operations.
+
+2005-12-14 Federico Mena Quintero <federico@ximian.com>
+
+ * glib/building.sgml: Clarify exactly what happens when you use --enable-gc-friendly.
+
+Mon Dec 12 15:31:41 2005 Tim Janik <timj@imendio.com>
+
+ * gobject/tmpl/objects.sgml: corrected floating reference documentation.
+
+2005-12-09 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.1 ===
+
+2005-12-07 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/gparamspec.sgml:
+ * gobject/tmpl/gtype.sgml: Document n_preallocs as
+ ignored.
+
+2005-12-05 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Updates
+
+ * glib/tmpl/memory_slices.sgml: Fix a small formatting
+ problem.
+
+ * glib/tmpl/trees-nary.sgml:
+ * glib/tmpl/linked_lists_single.sgml:
+ * glib/tmpl/linked_lists_double.sgml:
+ * glib/tmpl/caches.sgml:
+ * glib/tmpl/strings.sgml:
+ * glib/tmpl/scanner.sgml:
+ * glib/tmpl/main.sgml: Add versioned deprecation.
+
+Mon Dec 5 15:53:37 2005 Tim Janik <timj@imendio.com>
+
+ * glib/tmpl/memory_slices.sgml: updates to new g_slice API
+ and minor fixes.
+
+2005-12-05 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/generic_values.sgml:
+ * glib/tmpl/trees-nary.sgml:
+ * glib/tmpl/linked_lists_double.sgml:
+ * glib/tmpl/linked_lists_single.sgml:
+ * glib/tmpl/memory_chunks.sgml:
+ * glib/tmpl/allocators.sgml:
+ * glib/tmpl/macros_misc.sgml: Updates
+
+ * glib/Makefile.am: Ignore gmirroringtable.h
+
+2005-12-04 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/macros_misc.sgml: Document G_GNUC_WARN_UNUSED_RESULT.
+
+2005-12-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/caches.sgml: Document g_cache_value_foreach
+ as deprecated; document g_cache_key_foreach more thorougly
+
+ * glib/glib-sections.txt:
+ * glib/tmpl/linked_lists_single.sgml: Add g_slist_free1.
+
+ * glib/tmpl/memory_chunks.sgml: Document GMemChunk
+ as deprecated.
+
+ * glib/glib-docs.sgml:
+ * glib/glib-sections.txt:
+ * glib/tmpl/memory_slices.sgml: Document the slice
+ allocator.
+
+2005-12-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/building.sgml:
+ * glib/tmpl/threads.sgml:
+ * glib/glib-sections.txt: Remove G_THREADS_IMPL_SOLARIS
+
+ * glib/tmpl/types.sgml: Document G_GUINT64_CONSTANT.
+
+2005-11-27 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/gobject-sections.txt:
+ * gobject/tmpl/gboxed.sgml: Add g_object_ref_sink,
+ g_object_is_floating, g_param_spec_ref_sink,
+ G_TYPE_HASH_TABLE
+
+2005-11-22 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add g_hash_table_ref
+ and g_hash_table_unref
+
+2005-11-17 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.0 ===
+
+2005-11-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/date.sgml:
+ * glib/glib-sections.txt: Add g_date_set_time_t,
+ g_date_set_time_val and g_thread_foreach
+
+2005-11-08 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/threads.sgml: Improve GOnce docs.
+ (#320950, Christophe Fergeau)
+
+2005-11-04 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/running.sgml: Document fatal_criticals.
+
+2005-10-26 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/gobject-sections.txt:
+ * gobject/tmpl/generic_values.sgml: Document g_value_set_instance(),
+ (#319885, Milosz Derezynski)
+
+2005-10-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/unicode.sgml: Add a footnote about surrogate
+ pairs. (#317683, Behdad Esfahbod)
+
+2005-10-05 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/compiling.sgml: Document gmodule-no-export-2.0
+
+2005-10-01 Davyd Madeley <davyd@fugro-fsi.com.au>
+
+ * glib/tmpl/string_utils.sgml: Minor documentation improvements for
+ g_strchug, g_strchomp and g_strstrip. Brought forward from glib-2-8.
+
+2005-08-31 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/quarks.sgml:
+ * glib/glib-sections.txt: Add string interning functions.
+
+2005-08-30 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/arrays.sgml:
+ * glib/tmpl/arrays_pointer.sgml:
+ * glib/tmpl/arrays_byte.sgml: Enhance sort() documentation.
+ (#314839, Behdad Esfahbod)
+
+2005-08-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-docs.sgml:
+ * gobject/gobject-docs.sgml: Add indices for new
+ symbols in 2.10
+
+ Improvements pointed out by Behdad Esfahbod (#314460):
+
+ * glib/tmpl/strings.sgml: Fix up some character/byte
+ sloppyness.
+
+ * glib/tmpl/iochannels.sgml: Don't mention deprecated
+ functions in the introduction.
+
+2005-08-23 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.8.1 ===
+
+2005-08-22 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/date.sgml: Point out time_t vs GTime pitfalls.
+
+2005-08-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-gettexttize.xml:
+ * gobject/glib-genmarshal.xml:
+ * gobject/glib-mkenums.xml: Fix some trivial
+ formatting problems. (#313099, Stepan Kasal)
+
+ * glib/tmpl/modules.sgml: Document that file_name can
+ be NULL. (#313143, Gustavo Carneiro)
+
+ * glib/tmpl/linked_lists_single.sgml:
+ * glib/tmpl/linked_lists_double.sgml: Clarify docs
+ a little. (#311727, Tristan van Berkom)
+
+2005-08-12 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.8.0 ===
+
+2005-08-10 Stepan Kasal <kasal@ucw.cz>
+
+ Fix typos: Invokation --> Invocation (in various places)
+
+ * glib/tmpl/error_reporting.sgml: Fix a typo.
+ * gobject/tut_howto.xml: Several typos and stylistic changes.
+
+2005-08-05 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/gparamspec.sgml:
+ * glib/tmpl/types.sgml:
+ * glib/tmpl/option.sgml: Small fixes.
+
+ * gobject/tmpl/generic_values.sgml: Small fixes
+
+2005-08-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.7 ===
+
+2005-08-03 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.6 ===
+
+2005-08-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.5 ===
+
+Sat Jul 30 23:40:35 2005 Tim Janik <timj@gtk.org>
+
+ * glib/tmpl/datalist.sgml:
+ * glib/tmpl/datalset.sgml: document non-thread-safety for
+ _foreach() functions.
+
+2005-07-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/arrays.sgml: One more improvement.
+
+2005-07-25 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/arrays.sgml: Add some details. (#311310,
+ Jochen Baier)
+
+2005-07-21 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.4 ===
+
+2005-07-20 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/macros_misc.sgml: Add some discouraging
+ comments to the G_INLINE_FUNC macros. (#310836,
+ Callum McKenzie)
+
+2005-07-19 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/byte_order.sgml: Add docs for #307047,
+ Bryan Silverthorn.
+
+2005-07-15 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.3 ===
+
+2005-07-13 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-overrides.txt: Add G_VA_COPY
+
+ * glib/tmpl/option.sgml: Document that short names must
+ be printable ASCII characters != '-'.
+
+2005-07-08 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.2 ===
+
+2005-07-08 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/gobject-docs.sgml:
+ * glib/glib-docs.sgml: Add the "new in 2.8" index.
+
+2005-07-05 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/objects.sgml: Add an example
+ for using a custom constructor.
+
+2005-06-30 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.1 ===
+
+2005-06-29 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/threads.sgml:
+ * glib/tmpl/option.sgml:
+ * glib/tmpl/fileutils.sgml:
+ * glib/tmpl/iochannels.sgml:
+ * glib/tmpl/hooks.sgml:
+ * glib/tmpl/misc_utils.sgml:
+ * glib/tmpl/date.sgml:
+ * glib/glib-sections.txt: Updates
+
+2005-06-24 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add GMappedFile functions.
+
+2005-06-18 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/option.sgml (GOptionFlags): document
+ G_OPTION_FLAG_NO_ARG and G_OPTION_FLAG_FILENAME (Dan Winship)
+
+2005-06-16 Mathieu Lacage <mathieu@gnome.org>
+
+ * gobject/tut_gtype.xml: fix typo reported by Hong Gang XU.
+
+2005-06-10 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.0 ===
+
+2005-06-09 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add g_chdir
+
+ * glib/tmpl/threads.sgml: Document that stack size
+ will be ignored if the underlying thread implementation
+ doesn't support stack sizes.
+
+2005-06-07 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add g_utf8_collate_key_for_filename.
+
+2005-05-25 Mathieu Lacage <mathieu@gnome.org>
+
+ * gobject/tut_*.xml: fix lots of typos,
+ some of which were reported by Leonardo Boshell.
+
+2005-05-23 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/threads.sgml: Point out exceptions to the
+ general GLib data structure locking rules.
+
+2005-05-20 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/threads.sgml: Add a paragraph about thread
+ safety of GLib data structures.
+
+ * glib/compiling.sgml: Update an example from 1.3 to 2.x
+
+2005-05-13 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/glib-genmarshal.1:
+ * gobject/glib-genmarshal.xml: Mention 64bit integer
+ types.
+
+2005-05-10 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/markup.sgml: Fix sloppy language, pointed out by
+ Daniel Vaillard.
+
+2005-05-09 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/value_collection.sgml:
+ * gobject/tmpl/gboxed.sgml:
+ * gobject/tmpl/enumerations_flags.sgml:
+ * gobject/tmpl/objects.sgml: Add long descriptions.
+
+2005-05-05 Owen Taylor <otaylor@redhat.com>
+
+ * glib/Makefile.am glib/glib-sections.txt gobject/gobject-sections.txt:
+ Update
+
+ * gobject/tmpl/objects.sgml: Document toggle-references.
+
+2005-05-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/hash_tables.sgml: Move some docs inline.
+
+ * glib/tmpl/windows.sgml:
+ * gobject/tmpl/signals.sgml:
+ * gobject/tmpl/generic_values.sgml:
+ * gobject/tmpl/gtype.sgml:
+ * gobject/tmpl/value_arrays.sgml:
+ * gobject/tmpl/param_value_types.sgml:
+ * gobject/tmpl/gtypemodule.sgml:
+ * gobject/tmpl/enumerations_flags.sgml: Small additions.
+
+2005-05-01 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/completions.sgml: Document
+ strncmp_func.
+
+ glib/glib-sections.txt: Add new API.
+
+2005-04-29 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/gboxed.sgml:
+ * gobject/gobject-sections.txt: Add G_TYPE_DATE.
+
+2005-04-23 Stefan Kost <ensonic@users.sf.net>
+
+ * gobject/tut_gtype.xml:
+ * gobject/tut_howto.xml:
+ all interface examples use 'interface' instead of 'class'
+
+2005-04-22 Stefan Kost <ensonic@users.sf.net>
+
+ * gobject/Makefile.am:
+ * gobject/gobject-docs.sgml:
+ * gobject/tut_gobject.xml:
+ * gobject/tut_gsignal.xml:
+ * gobject/tut_gtype.xml:
+ * gobject/tut_howto.xml:
+ * gobject/tut_intro.xml:
+ * gobject/tut_tools.xml:
+ merged in docs form the gobject tutorial
+
+2005-03-29 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/arrays_pointer.sgml: Clarify the docs for
+ g_ptr_array_free and g_ptr_array_remove_range. (#170148,
+ #170149, Jared Lash)
+
+2005-03-29 Tor Lillqvist <tml@novell.com>
+
+ * glib/tmpl/spawn.sgml: Add Win32 warnings regarding the child
+ setup function.
+
+2005-03-21 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt:
+ * glib/tmpl/memory.sgml: Document g_try_new, g_try_new0
+ and g_try_renew, g_try_malloc0.
+
+2005-03-20 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/gparamspec.sgml: Document G_PARAM_SPEC_STATIC_
+ flags.
+
+2005-03-08 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt:
+ * glib/tmpl/macros_misc.sgml: Document G_GNUC_NULL_TERMINATED.
+
+2005-03-07 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/gtype.sgml:
+ * gobject/tmpl/param_value_types.sgml:
+ * gobject/tmpl/gparamspec.sgml: Apply patches by
+ Stefan Kost to document naming restrictions. (#167614)
+
+2005-02-10 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/option.sgml: Fix a typo. (#166985)
+
+2005-02-07 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add g_listenv.
+
+2005-02-04 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/linked_lists_double.sgml:
+ * glib/tmpl/linked_lists_single.sgml: Add a note
+ regarding inefficiency of repeated appends. (#166271,
+ Olivier Sessink)
+
+2005-02-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/quarks.sgml: Add a warning against
+ using g_quark_from_static_string() in dynamically
+ loaded modules.
+
+2005-02-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/misc_utils.sgml:
+ * glib/tmpl/hash_tables.sgml: Move some doc
+ comments inline.
+
+2005-01-16 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/enumerations_flags.sgml: Fix an
+ example. (#164269, Sebastien Bacher)
+
+2005-01-07 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.6.1 ===
+
+2005-01-06 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/keyfile.sgml: Add hint about group name
+ case sensitivity. (#163029, Bastien Nocera)
+
+2005-01-04 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/signals.sgml: Small addition. (#145158,
+ Mariano Su??rez-Alvarez)
+
+2004-12-20 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/signals.sgml: Fix a typo. (#161713,
+ Vincent Untz)
+
+2004-12-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/misc_utils.sgml: Clarify g_get_prgname docs.
+ (#161480, Danny Milo)
+
+2004-12-16 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/version.sgml: Improve wording. (#161484,
+ Christian Biere)
+
+ * === Released 2.6.0 ===
+
+2004-12-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add g_rmdir
+
+2004-12-15 Alexander Larsson <alexl@redhat.com>
+
+ * glib/glib-sections.txt:
+ Add g_filename_display_basename
+
+2004-12-15 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/generic_values.sgml: Document some return
+ values. (#161345, Stefan Kost)
+
+2004-12-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.7 ===
+
+2004-12-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/building.sgml:
+ * glib/tmpl/linked_lists_single.sgml:
+ * glib/tmpl/linked_lists_double.sgml:
+ * glib/tmpl/trees-nary.sgml: Add some warnings regarding
+ --disable-mem-pools.
+
+2004-12-01 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/iochannels.sgml: Fix a typo. (#160162, Tom Copeland)
+
+2004-11-30 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/building.sgml: Document --enable-man and --disable-visibility.
+
+2004-11-28 Tor Lillqvist <tml@iki.fi>
+
+ * glib/tmpl/misc_utils.sgml: Document encoding of g_get_user_name(),
+ g_get_real_name(), g_get_tmp_dir() and g_get_current_dir().
+
+2004-11-28 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/macros_misc.sgml: Document G_GNUC_MALLOC.
+
+ * glib/glib-sections.txt: Add G_GNUC_MALLOC
+
+2004-11-12 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.6 ===
+
+2004-11-08 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/trees-nary.sgml: Document G_TRAVERSE_LEAVES and
+ G_TRAVERSE_NON_LEAVES
+
+ * glib/tmpl/hooks.sgml:
+ * glib/tmpl/iochannels.sgml: Updates
+
+2004-11-04 Tor Lillqvist <tml@iki.fi>
+
+ * glib/tmpl/windows.sgml: Improve G_WIN32_HAVE_WIDECHAR_API
+ documentation.
+
+ * glib/tmpl/option.sgml: Document G_OPTION_FLAG_REVERSE.
+
+2004-11-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.5 ===
+
+2004-11-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add g_get_filename_charsets and
+ g_filename_display_name.
+
+2004-11-01 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/option.sgml: Updates
+
+2004-10-31 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/windows.sgml: Document G_WIN32_IS_NT_BASED,
+ G_WIN32_HAVE_WIDECHAR_API.
+
+ * glib/glib-sections.txt: Add g_lstat
+
+ * glib/running.sgml: Document G_WIN32_PRETEND_WIN9X.
+
+2004-10-29 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/option.sgml: Add an example.
+
+ * glib/glib-sections.txt: Add G_OPTION_REMAINING
+
+ * glib/tmpl/option.sgml: Add docs.
+
+2004-10-28 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/keyfile.sgml: Add some introductory notes.
+
+2004-10-27 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.4 ===
+
+2004-10-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/fileutils.sgml: Add some intro.
+
+2004-10-26 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/gobject-docs.sgml: Add an index for 2.6 additions.
+
+ * gobject/gobject-sections.txt: Additions.
+
+ * gobject/Makefile.am (IGNORE_HFILES): Add gobjectalias.h
+
+ * glib/tmpl/main.sgml: Document GChildWatchFunc
+
+ * glib/tmpl/keyfile.sgml: New template.
+
+ * glib/glib-sections.txt: Additions.
+
+ * glib/tmpl/macros_misc.sgml: Document some more of
+ the macros.
+
+2004-10-25 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-docs.sgml: Add GKeyFile section, add
+ index for 2.6 additions.
+
+2004-10-23 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/gtype.sgml (GTypeInterfaceCheckData):
+ Rename first parameter.
+
+ * glib/glib-sections.txt: Add GKeyFile section.
+
+2004-10-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/macros.sgml:
+ * glib/glib-sections.txt: Document G_IS_DIR_SEPARATOR.
+
+2004-10-05 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/objects.sgml: Improve the docs for
+ g_object_get_property(). (#153424, Stefan Kost)
+
+2004-10-03 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/tmpl/signals.sgml: Improve docs for
+ g_signal_add_emission_hook. (#154299, Nickolay V. Shmyrev)
+
+2004-09-20 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/messages.sgml: Correct the docs for the default log
+ handler wrt to which messages go to stderr. (#153041, Philippe Blain)
+
+Sun Sep 19 23:15:17 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/patterns.sgml: Point to g_utf8_strreverse() for
+ reversing UTF-8 strings. (#153091, Adam Hooper)
+
+2004-09-18 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.3 ===
+
+2004-09-16 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/Makefile.am: Ignore galias.h
+
+ * glib/glib-sections.txt: Updates.
+
+2004-09-09 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/misc_utils.sgml: Add a hint about $HOME to the
+ docs of g_get_home_dir().
+
+Thu Sep 9 00:11:19 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib-sections.txt: Add g_strv_length().
+
+2004-09-07 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt: Add g_get_language_names().
+
+Mon Sep 6 01:56:13 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/messages.sgml: Remove excess markup and fix a markup
+ error.
+
+Sun Sep 5 01:44:23 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib-sections.txt:
+ * glib/tmpl/messages.sgml: Document g_log_set_default_handler().
+
+Wed Sep 1 20:27:59 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib-sections.txt: Add g_date_get_iso8601_week_of_year.
+
+Sun Aug 29 23:50:45 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/fileutils.sgml: Fix a typo. (#151109, Stepan Kasal)
+
+2004-08-27 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/fileutils.sgml: Add G_FILE_ERROR_NOSYS.
+
+2004-08-25 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.2 ===
+
+2004-08-23 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/warnings.sgml: Add an example for
+ g_on_error_query() usage. (#148716, Christian Persch)
+
+2004-08-12 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/threads.sgml: Document the necessity to call
+ g_thread_init() when using threads
+ (even non-gthreads). (#149490, Vincent Untz)
+
+
+Tue Aug 3 16:43:22 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib-sections.txt: Add a section for GOption.
+ * glib/glib-docs.sgml: Include GOption section.
+ * glib/tmpl/option.sgml: New template.
+
+Tue Aug 3 15:34:16 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib-sections.txt: Add a separate section for
+ version information.
+ * glib/glib-docs.sgml: Include version section.
+ * glib/tmpl/version.sgml: New template.
+
+2004-08-02 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/glib-sections.txt:
+ * glib/tmpl/macros_misc.sgml: Document G_GNUC_INTERNAL.
+
+2004-08-01 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.1 ===
+
+2004-07-28 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/misc_utils.sgml: Clarify docs for
+ g_get_real_name(). (#143552, Danek Duvall)
+
+Fri Jul 23 10:38:24 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/limits.sgml: Fix docs for G_MAXSIZE. (#148262,
+ Christophe Fergeau)
+
+Sun Jul 18 18:03:08 2004 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * === Released 2.5.0 ===
+
+2004-07-09 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/arrays.sgml: Improve g_array_free() docs. (#146875,
+ Ed Griffiths)
+
+Tue Jul 6 00:54:38 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/gobject-sections.txt:
+ * gobject/tmpl/gtypemodule.sgml: Add g_type_module_register_enum()
+ and g_type_module_register_flags().
+
+Mon Jul 5 18:49:56 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/messages.sgml:
+ * glib/glib-sections.txt: Add g_debug.
+
+2004-06-15 Federico Mena Quintero <federico@ximian.com>
+
+ * glib/tmpl/conversions.sgml: New section on file name encodings.
+
+ * glib/file-name-encodings.sxd: New diagram of how file name
+ encodings work.
+
+ * glib/file-name-encodings.png: Same as above, for inclusion in
+ the generated docs.
+
+ * glib/Makefile.am (HTML_IMAGES): Add file-name-encodings.png.
+ (EXTRA_DIST): Add the new images.
+
+ * glib/running.sgml: Add ids to the corresponding paragraphs that
+ describe G_FILENAME_ENCODING and G_BROKEN_FILENAMES, to be able to
+ reference them from elsewhere.
+
+Thu Jun 10 21:29:55 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/modules.sgml: Add an example for GModule
+ usage. (#144127, Tommi Komulainen)
+
+Sun Jun 6 23:20:42 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gtype.sgml: Fix the docs for G_DEFINE_TYPE()
+ and friends. (#143800, Crispin Flowerday)
+
+2004-05-05 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject/gobject-docs.sgml:
+ * glib/glib-docs.sgml: Add multiple indices.
+
+2004-04-30 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.4.1 ===
+
+2004-04-23 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/running.sgml: Document LIBCHARSET_ALIAS_DIR.
+
+2004-04-15 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/tmpl/types.sgml: Correct the description of the
+ gfloat and gdouble ranges.
+
+Tue Mar 16 12:06:09 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.4.0 ===
+
+Sun Mar 14 11:00:41 2004 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/tmpl/signals.sgml: Document the fact that
+ g_signal_connect_object() does *not* remove the signal
+ when the object is disconnected currently and describe
+ a workaround to prevent memory leaks.
+
+Tue Mar 9 09:16:11 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.3.6 ===
+
+Mon Mar 8 08:32:36 2004 Owen Taylor <otaylor@redhat.com>
+
+ * glib/tmpl/main.sgml: Reference g_source_set_callback(),
+ not g_source_attach(). (Takeshi AIHANA)
+
+2004-02-29 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * glib/glib-overrides.txt, glib/glib-sections.txt,
+ glib/tmpl/atomic_operations.sgml: Updated according to code changes.
+
+Sun Feb 29 02:35:00 2004 Sven Herzberg <herzi@gnome-de.org>
+
+ * glib/tmpl/limits.sgml: exchange non-existing G_MAX_DOUBLE for
+ G_MAXDOUBLE (fixes #135723)
+
+Fri Feb 27 22:10:25 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/modules.sgml: Reformat a bit.
+
+Fri Feb 27 22:05:23 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/limits.sgml: Document G_MAXSIZE.
+
+2004-02-26 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * glib/tmpl/threads.sgml: Updated to reflect removal of the PID
+ niceness surrogate for thread priorities.
+
+ * glib/glib-overrides.txt, glib/glib-sections.txt,
+ glib/glib-docs.sgml, glib/tmpl/atomic_operations.sgml: Add docs
+ for atomic operations.
+
+Tue Feb 24 14:09:21 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.3.3 ===
+
+ * glib/glib-sections.txt: Updates.
+
+Sun Feb 22 00:59:11 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/trees-nary.sgml: Document GCopyFunc.
+
+Sun Feb 22 00:54:17 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib-sections.txt: Add GCopyFunc and g_node_copy_deep.
+
+2004-02-18 Sebastian Wilhelmi <seppi@seppi.de>
+
+ * glib/glib-sections.txt: Add the new g_rand_* functions
+
+Sat Feb 14 01:25:23 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib-sections.txt: Add GPid, GChildWatchFunc,
+ g_child_watch_source_new, g_child_watch_add,
+ g_child_watch_add_full.
+
+Fri Feb 13 23:16:25 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/macros_misc.sgml: Fix a typo.
+
+Sat Feb 7 01:02:06 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/numerical.sgml: Fix some external links.
+
+Thu Feb 5 00:54:43 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib-sections.txt: Add g_completion_complete_utf8.
+
+Fri Jan 30 23:25:58 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/iochannels.sgml:
+ * glib/tmpl/main.sgml: Remove references to deprecated GTK+ and
+ GDK functions. (#130756, Vincent Untz)
+
+Wed Jan 28 01:39:59 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib-sections.txt: Add g_strsplit_set. (Soeren Sandmann)
+
+Thu Jan 22 14:51:19 2004 Owen Taylor <otaylor@redhat.com>
+
+ * glib/glib-sections.txt glib/tmpl/timers.sgml: Document
+ g_timer_continue. (Tim-Philipp M??ller)
+
+Sun Jan 11 01:25:44 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gtype.sgml: Improve docs for G_DEFINE_TYPE_* macros.
+
+Sun Jan 11 01:25:29 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/gobject-sections.txt: Add G_DEFINE_TYPE_EXTENDED.
+
+Sat Jan 10 02:18:32 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gtype.sgml: Document the new GType boilerplate macros
+ with an example.
+
+Sat Jan 10 01:36:01 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gtype.sgml: Document g_type_class_peek_static.
+
+Sat Jan 10 01:23:58 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/gobject-sections.txt: Add g_type_class_peek_static,
+ G_DEFINE_TYPE, G_DEFINE_TYPE_WITH_CODE, G_DEFINE_ABSTRACT_TYPE,
+ G_DEFINE_ABSTRACT_TYPE_WITH_CODE, G_IMPLEMENT_INTERFACE.
+
+
+Sat Jan 10 01:23:01 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/objects.sgml: Update docs of g_object_connect.
+
+Fri Jan 9 23:40:23 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gboxed.sgml:
+ * gobject/gobject-sections.txt: Add G_TYPE_STRV and GStrv.
+
+Fri Dec 26 02:04:49 2003 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib-sections.txt: Add g_ptr_array_foreach().
+
+Sun Dec 21 01:01:34 2003 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/misc_utils.sgml: Document the encoding of
+ g_get_real_name().
+
+Fri Dec 19 21:40:00 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/signals.sgml: Rewording.
+
+Tue Dec 2 02:31:15 2003 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/limits.sgml:
+ * glib/glib-sections.txt: Add G_{MIN,MAX,MAXU}INT{8,16,32}.
+
+Thu Nov 6 01:42:36 2003 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib-sections.txt: Add an i18n section.
+ * glib/glib-docs.sgml: Include the corresponding entity.
+ * glib/tmpl/i18n.sgml: Template for i18n section.
+
+Thu Nov 6 00:56:04 2003 Matthias Clasen <maclas@gmx.de>
+
+ * glib/running.sgml: Document G_FILENAME_ENCODING.
+
+Sat Oct 25 01:07:45 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gparamspec.sgml:
+ * gobject/tmpl/objects.sgml: Additions.
+
+Thu Oct 23 14:27:54 2003 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/Makefile.am: Add a dist-hook so that the
+ man pages get distributed.
+
+ * glib/Makefile.am: Add a dist-hook so that the
+ man pages get distributed.
+
+ * glib/Makefile.am (content_files): Add cross.sgml.
+
+ * gobject/Makefile.am (INCLUDES): Add $(top_srcdir)/glib,
+ and (for gobject.cI) $(srcdir)
+
+Tue Oct 21 23:29:54 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gtypemodule.sgml:
+ * gobject/tmpl/enumerations_flags.sgml:
+ * gobject/tmpl/gtype.sgml: Additions.
+
+Tue Oct 21 23:09:15 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gparamspec.sgml:
+ * gobject/tmpl/param_value_types.sgml:
+ * gobject/tmpl/gtype.sgml:
+ * gobject/tmpl/signals.sgml: Add "Since 2.4" markers where
+ appropriate.
+
+Tue Oct 14 17:45:33 2003 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/gobject-sections.txt gobject/tmpl/objects.sgml
+ gobject/tmpl/param_value_types.sgml gobject/tmpl/gparamspec.sgml:
+ Document interface properties and GParamSpecOverride.
+
+Mon Oct 20 22:05:37 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/objects.sgml:
+ * gobject/tmpl/enumerations_flags.sgml:
+ * gobject/tmpl/gtypeplugin.sgml: Additions.
+
+Mon Oct 20 22:04:45 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/gobject-sections.txt: Add GObjectConstructParam.
+
+Mon Oct 20 20:38:06 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/gobject.i: Removed...
+ * gobject/gobject.cI: ...and readded.
+ * gobject/gobject.types: Change to the standard file
+ extension for included hunks of C code.
+
+Mon Oct 20 20:34:33 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/Makefile.am (INCLUDES): Add $(top_builddir)/glib
+ as an include dir again, this time for real.
+
+Mon Oct 20 01:12:46 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gtype.sgml:
+ * gobject/tmpl/param_value_types.sgml:
+ * gobject/tmpl/value_arrays.sgml: Additions.
+
+ * gobject/tmpl/gboxed.sgml:
+ * gobject/gobject-sections.txt: Remove prematurely added
+ GStrv documentation.
+
+Sun Oct 19 22:18:28 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/Makefile.am (INCLUDES): Add $(top_builddir)/glib
+ as an include dir. (#124934, Mariano Su??rez-Alvarez)
+
+Sun Oct 19 00:33:28 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gtype.sgml:
+ * gobject/tmpl/generic_values.sgml:
+ * gobject/tmpl/objects.sgml:
+ * gobject/tmpl/signals.sgml: Additions.
+
+Sat Oct 18 01:30:47 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gboxed.sgml:
+ * gobject/tmpl/gtypeplugin.sgml:
+ * gobject/tmpl/enumerations_flags.sgml: Additions.
+
+Sat Oct 18 00:04:22 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/gobject.types: List GObject here, since the
+ documentation misses the notify signal otherwise. Needs
+ a little bit of a hack to work around a gtkdoc-scangobj
+ limitation, see the comment in gobject/gobject.i.
+
+ * gobject/gobject.i: New file, containing a trivial
+ g_object_get_type() function.
+
+Fri Oct 17 00:23:51 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/Makefile.am (GTKDOC_LIBS):
+ (INCLUDES): Add the necessary stuff to compile gobject-scan.
+
+ * gobject/gobject.types: Add g_type_module_get_type() and
+ g_type_plugin_get_type().
+
+Thu Oct 16 01:02:04 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gparamspec.sgml: Additions, document
+ GParamSpecPool.
+
+Wed Oct 15 00:56:30 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gclosure.sgml: Improvements from Owen's feedback.
+
+Tue Oct 14 02:35:45 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/gobject-sections.txt: Move the g_cclosure_marshal_*
+ functions to a non-private subsection, since these functions
+ are not private.
+
+Tue Oct 14 02:35:16 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gclosure.sgml: Fill in.
+
+Sun Oct 5 23:23:53 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/glib-sections.txt:
+ * gobject/gobject-sections.txt: Fix includes.
+
+ * gobject/tmpl/value_collection.sgml: Add docs found in the
+ header.
+
+Thu Oct 2 01:22:46 2003 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/gobject-sections.txt gobject/tmpl/gtype.sgml:
+ Add g_type_add/remove_interface_check()
+
+2003-09-30 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gparamspec.sgml:
+ * gobject/tmpl/signals.sgml: Additions.
+
+ * glib/glib-sections.txt: Add g_unichar_get_mirror_char and
+ g_static_mutex_get_mutex_impl_shortcut.
+
+Mon Sep 29 10:55:23 2003 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/gobject-sections.txt gobject/tmpl/gtype.sgml:
+ Docs for g_type_default_interface_ref(), etc.
+
+Fri Sep 12 16:29:29 2003 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/tmpl/signals.sgml: Add docs for
+ g_signal_accumulator_true_handled.
+
+2003-09-12 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/gobject-sections.txt: Add new g_value_take_x() functions.
+
+ * gobject/tmpl/param_value_types.sgml: Document new g_value_take_x()
+ functions. (#100948)
+
+2003-08-05 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/string_utils.sgml: Add note about in-place editing to g_strdelimit() doc.
+ (#118875, Thomas Vander Stichele)
+
+2003-07-30 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/misc_utils.sgml: Move g_getenv() docs inline.
+
+ * glib/tmpl/string_utils.sgml: Small fixes.
+
+ * glib/glib-docs.sgml: Add paragraph about multi-threading policy.
+
+ * glib/glib-sections.txt: Rename g_read_link to g_file_read_link.
+
+2003-07-29 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/macros_misc.sgml: Document G_GINT{16,32,64}_MODIFIER, add note about scanning.
+
+ * glib/glib-sections.txt: Add G_GINT{16,32,64}_MODIFIER.
+
+2003-07-28 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib-sections.txt: Add g_setenv(), g_unsetenv() and g_read_link(). (#100763, #72545)
+
+2003-07-26 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/arrays.sgml:
+ * glib/tmpl/arrays_byte.sgml:
+ * glib/tmpl/arrays_pointer.sgml:
+ * glib/glib-sections.txt: Add g_{,byte,pointer}_array_remove_range. (#94879, Nalin Dahyabhai)
+
+ * glib/tmpl/messages.sgml: Remove the note about the message length restriction.
+
+2003-07-24 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/messages.sgml: Mention the restriction on message length. (#118043, Martyn Russell)
+
+2003-07-18 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/arrays_pointer.sgml: Add a note about double indirection in
+ g_ptr_array_sort[_with_data](). (#113697, Owen Taylor)
+
+2003-07-12 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/string_utils.sgml: Add a paragraph about string precision, add links to it.
+ Remove markup which is now handled better by gtk-doc.
+
+2003-07-09 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/threads.sgml: Document GOnce, GOnceStatus, G_ONCE_INIT, g_once and g_once_impl.
+
+ * glib/glib-sections.txt: Add GOnce, GOnceStatus, G_ONCE_INIT, g_once and g_once_impl.
+
+2003-07-02 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/string_utils.sgml: Move g_strfreev() docs inline.
+
+2003-06-19 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/misc_utils.sgml: Move g_path_get_basename() docs inline.
+
+2003-06-18 Matthias Clasen <maclas@gmx.de>
+
+o * glib/glib-sections.txt: Add g_thread_init_glib to silence gtk-doc.
+
+ * gobject/Makefile.am: Add rule to regenerate man pages from
+ Docbook.
+ (man_MANS): Add glib-mkenums.1, glib-genmarshal.1 and gobject-query.1.
+ (content_files): Add glib-mkenums.xml, glib-genmarshal.xml and
+ gobject-query.xml.
+
+ * gobject/glib-mkenums.xml:
+ * gobject/glib-genmarshal.xml:
+ * gobject/gobject-query.xml: New refentries.
+
+ * gobject/glib-mkenums.1:
+ * gobject/glib-genmarshal.1:
+ * gobject/gobject-query.1: Man pages generated from the .xml
+ sources.
+
+ * gobject/gobject-docs.sgml: Include glib-mkenums.xml,
+ glib-genmarshal.xml and gobject-query.xml.
+
+2003-06-17 Matthias Clasen <maclas@gmx.de>
+
+ * glib/Makefile.am: Add rule to regenerate man pages from
+ Docbook.
+ (man_MANS): Add glib-gettextize.1.
+ (content_files): Add glib-gettextize.xml.
+
+ * glib/glib-gettextize.xml: New refentry.
+
+ * glib/glib-gettextize.1: Man page generated from the .xml source.
+
+ * glib/glib-docs.sgml: Include glib-gettextize.xml.
+
+2003-06-17 Matthias Clasen <mc2@YAST_ASK>
+
+ * gobject/gobject-docs.sgml:
+ * glib/glib-docs.sgml: Add an autogenerated index.
+
+2003-06-17 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/macros_misc.sgml: Document G_GNUC_DEPRECATED.
+
+2003-06-11 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/objects.sgml: A small addition.
+
+Sun Jun 8 12:28:39 2003 Owen Taylor <otaylor@redhat.com>
+
+ * glib/tmpl/error_reporting.sgml: XML fix.
+
+ * glib/glib-sections.txt: Updated.
+
+2003-06-06 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/limits.sgml: Correct the documentation for
+ G_MINFLOAT and G_MINDOUBLE. (#114513, Christophe Fergeau)
+
+ * glib/glib-sections.txt: Add g_vasprintf().
+
+ * glib/tmpl/string_utils.sgml: Add a hint about g_vasprintf() to
+ the g_strdup_printf() docs.
+
+2003-05-28 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/string_utils.sgml: Document that g_strdup() and
+ g_strndup() accept NULL. (#106987, Christian Biere)
+
+2003-05-12 Matthias Clasen <maclas@gmx.de>
+
+ * glib/cross.sgml: Fix a duplicate id left by copy-and-paste.
+ (#112785, Owen Taylor)
+
+2003-04-18 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/signals.sgml: Correct the documentation
+ GSignalEmissionHook (#110906) and some cleanups.
+
+2003-04-11 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gparamspec.sgml: Fix a few typos.
+
+2003-04-09 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib-docs.sgml: Move dependencies to building.sgml.
+
+ * glib/building.sgml: Move stuff from INSTALL here.
+
+2003-04-08 Matthias Clasen <maclas@gmx.de>
+
+ * glib/cross.sgml: New file; cross-compilation information.
+ * glib/glib-docs.sgml: Include cross.sgml.
+
+2003-04-07 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/enumerations_flags.sgml: Additions.
+
+2003-04-01 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/error_reporting.sgml:
+ * glib/tmpl/random_numbers.sgml:
+ * glib/tmpl/arrays_pointer.sgml:
+ * glib/tmpl/arrays.sgml: Fix formatting of examples.
+
+2003-04-01 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib-sections.txt: Add g_string_chunk_insert_len.
+
+2003-03-28 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/param_value_types.sgml: Additions.
+
+2003-03-25 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/objects.sgml: Additions.
+
+2003-03-24 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/objects.sgml: Additions.
+
+Mon Mar 10 11:33:10 2003 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/tmpl/gtype.sgml gobject/gobject-sections.txt:
+ Document private instance data.
+
+2003-02-11 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/string_utils.sgml: Fix an off-by-one error in the
+ g_strescape() docs. (#105431, Phillip Vandry)
+
+2003-02-07 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gtypemodule.sgml:
+ * gobject/tmpl/gtype.sgml:
+ * gobject/tmpl/gclosure.sgml:
+ * gobject/tmpl/param_value_types.sgml:
+ * gobject/tmpl/gparamspec.sgml:
+ * gobject/tmpl/objects.sgml:
+ * gobject/tmpl/signals.sgml: Move all docs out-of-line. Boy, what
+ a waste of time.
+
+2003-01-21 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/strings.sgml: Document the return value of g_string_free().
+
+2003-01-15 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gtype.sgml: Fix the description of
+ G_TYPE_FUNDAMENTAL. (#103119, Josh Parsons)
+
+2003-01-01 Tor Lillqvist <tml@iki.fi>
+
+ * glib/tmpl/messages.sgml: Remove comment that only stdout would
+ be used on Windows, no longer true.
+
+2002-12-15 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/param_value_types.sgml: Move some docs inline.
+
+2002-12-15 Matthias Clasen <maclas@gmx.de>
+
+ * glib/Makefile.am (IGNORE_HFILES): Add gprintfint.h and trio.
+
+2002-12-13 Matthias Clasen <maclas@gmx.de>
+
+ * glib/Makefile.am (MKDB_OPTIONS): Add --ignore-files=trio to
+ avoid gtk-doc warnings about doxygen comments.
+
+Tue Dec 10 11:55:28 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/tmpl/timers.sgml: Improve docs for return value
+ and @microseconds out parameter. (Reported by
+ Dennis Haney, #100841)
+
+2002-12-10 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/generic_values.sgml:
+ * gobject/tmpl/gtype.sgml:
+ * gobject/tmpl/enumerations_flags.sgml: Add docs.
+
+2002-12-09 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gtype.sgml:
+ * gobject/tmpl/enumerations_flags.sgml: Add docs.
+
+ * gobject/tmpl/gtype.sgml:
+ * gobject/tmpl/gtypeplugin.sgml:
+ * gobject/tmpl/gtypemodule.sgml:
+ * gobject/gobject-sections.txt: Add GTypeClass, GTypePluginClass
+ and GTypeModuleClass.
+
+ * gobject/tmpl/gboxed.sgml:
+ * gobject/tmpl/enumerations_flags.sgml:
+ * gobject/tmpl/gclosure.sgml:
+ * gobject/tmpl/param_value_types.sgml: Add docs.
+
+2002-12-06 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gparamspec.sgml: Typo fix.
+
+2002-12-05 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/strings.sgml:
+ * glib/tmpl/scanner.sgml:
+ * glib/tmpl/main.sgml:
+ * glib/tmpl/macros_misc.sgml:
+ * glib/tmpl/hash_tables.sgml: Add Since and Deprecation info
+ for symbols documented in the templates.
+
+2002-12-04 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gtype.sgml: Add docs.
+
+2002-12-02 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/signals.sgml: Add docs.
+
+2002-12-01 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/gobject-sections.txt: Mark g_signal_handlers_destroy as
+ private.
+
+ * gobject/tmpl/signals.sgml: Move some docs inline.
+
+2002-11-29 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/main.sgml: Write something about GSourceDummyMarshal.
+
+ * glib/tmpl/date.sgml:
+ * glib/tmpl/string_utils.sgml: Remove redundant docs.
+
+ * glib/glib-sections.txt: Add g_ascii_strtoull and
+ g_get_application_name.
+
+2002-11-28 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/strings.sgml:
+ * glib/tmpl/string_utils.sgml:
+ * glib/tmpl/misc_utils.sgml: Move some docs inline.
+
+2002-11-23 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/tmpl/gclosure.sgml:
+ * gobject/tmpl/signals.sgml:
+ * gobject/tmpl/gparamspec.sgml:
+ * gobject/tmpl/value_collection.sgml:
+ * gobject/tmpl/generic_values.sgml:
+ * gobject/tmpl/param_value_types.sgml:
+ * gobject/tmpl/gboxed.sgml:
+ * gobject/tmpl/enumerations_flags.sgml:
+ * gobject/tmpl/objects.sgml:
+ * gobject/tmpl/gtypemodule.sgml:
+ * gobject/tmpl/gtypeplugin.sgml: Add missing short descriptions,
+ standardize them to start with a capital and end without a period.
+
+ * glib/tmpl/arrays.sgml:
+ * glib/tmpl/memory_chunks.sgml:
+ * glib/tmpl/macros.sgml: Remove periods from titles in examples.
+
+ * glib/building.sgml: Explain --enable-include-printf.
+
+ * glib/Makefile.am (extra_files):
+ * gobject/Makefile.am (extra_files): Add version.xml.in.
+
+ * glib/Makefile.am (content_files):
+ * gobject/Makefile.am (content_files): Add version.xml.
+
+ * glib/version.xml.in:
+ * gobject/version.xml.in: New files to let configure dump the version in.
+
+ * glib/glib-docs.sgml:
+ * gobject/gobject-docs.sgml: Add version information.
+
+
+Thu Nov 21 15:52:04 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/tmpl/iochannels.sgml: Add helpful comments about
+ the encoding of a new iochannel. (Amaury Jacquot,
+ #96444)
+
+2002-11-21 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/string_utils.sgml: Add note on including gprintf.h,
+ move some docs inline.
+
+ * glib/glib-sections.txt: Add g_printf, g_vprintf, g_fprintf,
+ g_vfprintf, g_sprintf, g_vsprintf.
+
+2002-11-20 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/macros_misc.sgml: Document G_LIKELY, G_UNLIKELY.
+
+ * glib/glib-sections.txt: Add G_LIKELY, G_UNLIKELY.
+
+2002-10-20 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/Makefile.am (SCANOBJ_FILES):
+ * glib/Makefile.am (SCANOBJ_FILES): Add $(DOC_MODULE).prerequisites.
+
+2002-10-15 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/gobject-sections.txt: Add g_type_interface_prerequisites.
+
+2002-10-14 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/Makefile.am (dist-hook):
+ * glib/Makefile.am (dist-hook): Dist the xml/*.xml, not
+ sgml/*.sgml. (#95678, Owen Taylor)
+
+2002-10-14 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/Makefile.am (SCANOBJ_FILES):
+ * glib/Makefile.am (SCANOBJ_FILES): Add $(DOC_MODULE).interfaces.
+
+2002-09-16 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/messages.sgml: Replace G_LOG_FLAG_RECURSIVE by
+ G_LOG_FLAG_RECURSION throughout. (#93390)
+
+2002-08-12 Matthias Clasen <maclas@gmx.de>
+
+ * glib/glib-sections.txt: Add g_markup_parse_context_get_element
+ and g_utf8_strreverse.
+
+Thu Jul 25 18:58:29 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib/tmpl/threads.sgml: Fix reference to non-existing
+ @priority parameter. (#88500, Linux Walleij)
+
+2002-06-03 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/gobject-docs.sgml:
+ * glib/glib-docs.sgml:
+ * glib/tmpl/macros.sgml:
+ * glib/tmpl/string_utils.sgml: Replace homegrown "nbsp", "hash"
+ and "percent" entities by standard ISO entities "nbsp", "num" and
+ "percnt".
+
+2002-05-30 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/string_utils.sgml:
+ * glib/tmpl/threads.sgml: Small formatting fixes.
+
+2002-05-26 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/conversions.sgml: Add GIConv.
+
+ * glib/tmpl/main.sgml: Fix references to nonexisting functions
+ g_main_loop_destroy(), g_source_add(), g_source_connect().
+
+
+ * glib/glib-sections.txt: Add GIConv, g_str_has_prefix, g_str_has_suffix.
+
+ * glib/tmpl/linked_lists_single.sgml:
+ * glib/tmpl/linked_lists_double.sgml: GListAllocator doesn't exist.
+
+ * glib/glib-docs.sgml: Declare hash entity.
+
+ * glib/tmpl/macros.sgml: Escape # in #ifdef to suppress erroneous links.
+
+2002-05-25 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/Makefile.am, gobject/gobject-docs.sgml, gobject/tmpl/*:
+ * glib/Makefile.am, glib/glib-docs.sgml, glib/tmpl/*: Produce XML,
+ not SGML.
+
+2002-05-21 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/markup.sgml: Updates.
+
+Sat May 18 00:44:35 2002 Tim Janik <timj@gtk.org>
+
+ [merged from stable]
+
+ * glib/tmpl/scanner.sgml: fix documentation for g_scanner_unexp_token().
+
+2002-05-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/threads.sgml: Clarify recursion issues with
+ GMutex. (#78171)
+
+2002-04-24 Matthias Clasen <maclas@gmx.de>
+
+ * gobject/gobject-sections.txt:
+ * gobject/tmpl/gtype.sgml: Updates.
+
+2002-04-21 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/strings.sgml: Fix the description of g_string_assign. (#78728)
+
+2002-04-18 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/error_reporting.sgml:
+ * glib/tmpl/threads.sgml:
+ * glib/tmpl/arrays_pointer.sgml:
+ * glib/tmpl/arrays_byte.sgml:
+ * glib/tmpl/memory_chunks.sgml: s/<!>/<!-- -->/g throughout the
+ documentation to bring the produced Docbook closer to XML.
+
+2002-03-25 Sven Neumann <sven@gimp.org>
+
+ * glib/tmpl/scanner.sgml: Fixed documentation about unused struct
+ fields and added a note about proper g_scanner_unexp_token() usage.
+
+2002-03-11 Matthias Clasen <maclas@gmx.de>
+
+ * glib/tmpl/string_utils.sgml: Add a note about g_strreverse() and
+ UTF-8.
+
+2002-02-21 Matthias Clasen <maclas@gmx.de>
+
+ * glib/Makefile.am (IGNORE_HFILES): Add gdebug.h.
+
+ * glib/running.sgml: Document the G_DEBUG environment variable.
+
+ * glib/tmpl/threads.sgml: Replace g_thread_wait() by
+ g_thread_join() in two places.
+
+2002-02-20 Sven Neumann <sven@gimp.org>
+
+ * gobject/gobject-sections.txt
+ * gobject/tmpl/generic_values.sgml
+ * gobject/tmpl/param_value_types.sgml: updated for GValue changes.
+
+Tue Feb 19 17:45:43 2002 Tim Janik <timj@gtk.org>
+
+ * gobject/tmpl/generic_values.sgml: added GValue documentation.
+
+Thu Feb 7 12:07:06 2002 Tim Janik <timj@gtk.org>
+
+ * gobject/tmpl/generic_values.sgml: document value transformation.
+
+Mon Feb 4 17:55:39 2002 Tim Janik <timj@gtk.org>
+
+ * gobject/tmpl/closures.sgml: doc common functions like ref/
+ sink/unref/invalidate.
+
+ * gobject/tmpl/objects.sgml: document g_object_watch_closure() and
+ qdata functions.
+
+Tue Jan 29 12:00:59 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/gobject-sections.txt: Updated.
+
+ * glib/running.sgml glib/changes-2.0.sgml: SGML fixes.
+
+2002-01-28 Ron Steinke <rsteinke@w-link.net>
+
+ * glib/iochannel.sgml: Changed #IOChannelError to
+ #GIOChannelError in one place
+
+2002-01-16 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/building.sgml, glib/compiling.sgml,
+ glib/running.sgml, glib/resources.sgml,
+ glib/changes-2.0.sgml: New files.
+
+ * glib/Makefile.am (content_files): Add new files.
+
+ * glib/glib-docs.sgml: Add an Overview chapter.
+
+2002-01-08 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/threads.sgml: Name the right function.
+
+2001-12-23 Matthias Clasen <matthias@poet.de>
+
+ * glib/tmpl/main.sgml, glib/tmpl/string_utils.sgml,
+ glib/tmpl/strings.sgml: Replace references to deprecated
+ functions.
+
+2001-12-21 Matthias Clasen <matthias@poet.de>
+
+ * glib/glib-sections.txt: Move g_get_charset() to the
+ Charset conversion section. (#65630)
+
+Wed Dec 19 23:07:53 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/tmpl/messages.sgml glib/tmpl/string_utils.sgml:
+ SGML fixes.
+
+ * gobject/gobject-sections.txt glib/glib-sectoins.txt: Small updates.
+
+2001-12-15 Matthias Clasen <matthias@poet.de>
+
+ * glib/tmpl/caches.sgml: GCs are cached by GTK, not by GDK.
+
+2001-12-14 Matthias Clasen <matthias@poet.de>
+
+ * glib/tmpl/memory.sgml: Typo fixes.
+
+2001-12-13 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/completion.sgml, glib/tmpl/date.sgml,
+ glib/tmpl/fileutils.sgml, glib/tmpl/iochannels.sgml,
+ glib/tmpl/macros.sgml, glib/tmpl/memory.sgml,
+ glib/tmpl/misc_utils.sgml, glib/tmpl/warnings.sgml,
+ glib/tmpl/windows.sgml: Revert mistaken change: it is UNIX, not Unix.
+
+ * glib/tmpl/memory_chunks.sgml,
+ glib/tmpl/date.sgml, glib/tmpl/threads.sgml,
+ glib/tmpl/gtype.sgml: Trivial markup fixes.
+
+2001-12-12 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/string_utils.sgml: Correct docs for g_[v]snprintf.
+
+2001-12-12 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/allocators.sgml, glib/tmpl/arrays.sgml,
+ glib/tmpl/arrays_byte.sgml, glib/tmpl/arrays_pointer.sgml,
+ glib/tmpl/caches.sgml, glib/tmpl/completion.sgml,
+ glib/tmpl/conversions.sgml,
+ glib/tmpl/datalist.sgml, glib/tmpl/date.sgml,
+ glib/tmpl/error_reporting.sgml, glib/tmpl/fileutils.sgml,
+ glib/tmpl/hash_tables.sgml,
+ glib/tmpl/hooks.sgml, glib/tmpl/macros.sgml,
+ glib/tmpl/macros_misc.sgml, glib/tmpl/main.sgml, glib/tmpl/markup.sgml,
+ glib/tmpl/memory.sgml, glib/tmpl/memory_chunks.sgml,
+ glib/tmpl/messages.sgml, glib/tmpl/misc_utils.sgml,
+ glib/tmpl/modules.sgml, glib/tmpl/numerical.sgml,
+ glib/tmpl/patterns.sgml, glib/tmpl/queue.sgml,
+ glib/tmpl/shell.sgml, glib/tmpl/spawn.sgml,
+ glib/tmpl/string_utils.sgml, glib/tmpl/thread_pools.sgml,
+ glib/tmpl/threads.sgml, glib/tmpl/timers.sgml,
+ glib/tmpl/trees-binary.sgml, glib/tmpl/trees-nary.sgml,
+ glib/tmpl/type_conversion.sgml, glib/tmpl/unicode.sgml,
+ glib/tmpl/warnings.sgml, glib/tmpl/windows.sgml:
+ Improve markup of examples, general consistency improvements.
+
+2001-12-06 Havoc Pennington <hp@redhat.com>
+
+ * glib/tmpl/messages.sgml: improve g_log_set_handler docs
+
+Wed Nov 28 18:50:19 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/glib-sections.txt: Update.
+
+2001-11-28 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/date.sgml: Fix g_usleep docs.
+
+2001-11-26 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/trees-binary.sgml: Document G_LEVEL_ORDER better.
+
+2001-11-22 Matthias Clasen <matthiasc@poet.de>
+
+ Fixes for #61284:
+
+ * glib/tmpl/windows.sgml: Document G_WIN32_DLLMAIN_FOR_DLL_NAME.
+
+ * glib/tmpl/fileutils.sgml: Document GDir.
+
+ * glib/tmpl/limits.sgml: Document G_MININT64, G_MAXINT64, G_MAXUINT64.
+
+Thu Nov 22 12:56:57 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/gobject-sections.txt: Update.
+
+ * glib/tmpl/{spawn.sgml,patterns.sgml}: SGML fixes.
+
+ * glib/glib-sections.txt: Updated.
+
+ * glib/Makefile.am (IGNORE_HFILES): Don't scan
+ headers in build/
+
+Sat Nov 17 17:24:19 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/glib-sections.txt: Remove g_log_domain_glib
+
+2001-11-15 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/iochannels.sgml: Document GIOFlags, fix typos.
+
+ * glib/tmpl/conversions.sgml, glib/tmpl/unicode.sgml,
+ glib/tmpl/spawn.sgml, glib/tmpl/fileutils.sgml,
+ glib/tmpl/shell.sgml, glib/tmpl/windows.sgml: Add
+ some missing short and long descriptions.
+
+2001-11-14 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/Makefile.am (MKDB_OPTIONS): Add --sgml-mode.
+
+ * glib/tmpl/patterns.sgml: Document UTF-8 support.
+
+Wed Nov 14 03:19:49 2001 Tim Janik <timj@gtk.org>
+
+ * gobject/tmpl/param_value_types.sgml: more docs.
+
+Tue Nov 13 21:31:58 2001 Tim Janik <timj@gtk.org>
+
+ * gobject/tmpl/param_value_types.sgml: list parameter and
+ value types.
+
+ * gobject/tmpl/gparamspec.sgml: more docs for g_param_spec*()
+ functions.
+
+ * gobject/*: section cleanups.
+
+Tue Nov 13 19:49:16 2001 Tim Janik <timj@gtk.org>
+
+ * gobject/tmpl/gparamspec.sgml: param spec updates.
+
+2001-11-12 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/markup.sgml: Remove excess listitem from long
+ description.
+
+2001-11-11 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/unicode.sgml: Document GNormalizeMode enum.
+
+ * glib/tmpl/spawn.sgml: Document GSpawnFlags flags.
+
+ * glib/tmpl/error_reporting.sgml: Document GError struct.
+
+ * glib/tmpl/main.sgml: Document GMainContext, GSource and
+ GSourceCallbackFuncs structs.
+
+2001-10-31 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/messages.sgml, glib/tmpl/unicode.sgml:
+ Document g_log_domain_glib, gunichar, gunichar2, GUnicodeType,
+ GUnicodeBreakType.
+
+Fri Oct 26 11:42:50 2001 Owen Taylor <otaylor@redhat.com>
+
+ * */Makefile.am: Remove $(srcdir)/html before building
+ HTML to prevent stale files. Dist all files in html/
+
+2001-10-25 Havoc Pennington <hp@pobox.com>
+
+ * glib/tmpl/string_utils.sgml: docs on why the deprecated
+ functions are deprecated.
+
+2001-10-15 Sven Neumann <sven@gimp.org>
+
+ * glib/tmpl/random_numbers.sgml: fixed typo.
+
+Sat Oct 13 06:58:23 2001 Tim Janik <timj@gtk.org>
+
+ * glib/tmpl/patterns.sgml: amended documentation.
+
+2001-10-11 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/patterns.sgml, glib/tmpl/shell.sgml: Updates.
+
+2001-10-05 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/hooks.sgml: Document G_HOOK_FLAG_USER_SHIFT.
+
+ * glib/tmpl/trash_stacks.sgml: Document trash stacks.
+
+ * glib/tmpl/async_queues.sgml, glib/tmpl/caches.sgml,
+ glib/tmpl/completion.sgml, glib/tmpl/patterns.sgml,
+ glib/tmpl/numerical.sgml, glib/tmpl/random_numbers.sgml,
+ glib/tmpl/relations.sgml, glib/tmpl/modules.sgml: Update.
+
+2001-10-05 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/conversions.sgml: Update.
+
+ * glib/tmpl/patterns.sgml: Update.
+
+2001-10-05 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/hooks.sgml, glib/tmpl/spawn.sgml,
+ glib/tmpl/macros_misc.sgml: Update.
+
+ * glib/tmpl/linked_lists_double.sgml, glib/tmpl/trees-binary.sgml,
+ glib/glib-sections.txt: Document GCompareDataFunc.
+
+2001-10-02 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/iochannel.sgml, glib/tmpl/macros_misc.sgml,
+ glib/tmpl/queue.sgml: update docs.
+
+ * glib/tmpl/modules.sgml, glib/tmpl/threads.sgml: Remove
+ references to glib-config.
+
+2001-10-01 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/iochannels.sgml, glib/tmpl/shell.sgml,
+ glib/tmpl/spawn.sgml, glib/tmpl/memory.sgml,
+ glib/tmpl/macros.sgml, glib/tmpl/completion.sgml,
+ glib/tmpl/main.sgml, glib/tmpl/messages.sgml,
+ glib/tmpl/misc_utils.sgml, glib/tmpl/threads.sgml,
+ glib/tmpl/trees-nary.sgml, glib/tmpl/string_utils.sgml:
+ More markup fixes and completions.
+
+Mon Oct 1 15:59:46 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/tmpl/strings.sgml docs/glib-sections.txt: Rename
+ g_string_printfa(). to g_string_append_printf().
+
+2001-10-01 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/glib-sections.txt: Move all *_error_quark()
+ functions to the 'Private' sections. (#61472)
+
+2001-10-01 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/macros.sgml (G_CONST_RETURN): document
+ allowed uses for 'out' parameters.
+
+2001-10-01 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/caches.sgml, glib/tmpl/datalist.sgml,
+ glib/tmpl/hash_tables.sgml, glib/tmpl/messages.sgml,
+ glib/tmpl/misc_utils.sgml: consistently refer to GTK+.
+
+ * glib/tmpl/error_reporting.sgml, glib/tmpl/fileutils.sgml,
+ glib/tmpl/windows.sgml, glib/tmpl/modules.sgml,
+ glib/tmpl/linked_lists_single.sgml, glib/tmpl/trees-nary.sgml,
+ glib/tmpl/trees-binary.sgml, glib/tmpl/timers.sgml: Markup fixes.
+
+2001-09-30 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/arrays.sgml,glib/tmpl/arrays_byte.sgml
+ glib/tmpl/arrays_pointer.sgml, glib/tmpl/caches.sgml,
+ glib/tmpl/datalist.sgml, glib/tmpl/date.sgml,
+ glib/tmpl/datasets.sgml, glib/tmpl/type_conversion.sgml,
+ glib/tmpl/memory.sgml, glib/tmpl/hash_tables.sgml:
+ Markup fixes and a few additions.
+
+2001-09-27 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/macros.sgml, glib/tmpl/macros_misc.sgml,
+ glib/tmpl/scanner.sgml: Additions and markup fixes.
+
+2001-09-27 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/warnings.sgml, glib/tmpl/linked_lists_double.sgml,
+ glib/tmpl/completion.sgml, glib/tmpl/strings.sgml: Documented
+ some functions, markup fixes.
+ * glib/tmpl/patterns.sgml: New file.
+ * glib/glib-docs.sgml: Add entity for patterns.sgml.
+
+2001-09-26 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/glib-sections.txt: Add g_mem_is_system_malloc.
+
+2001-09-25 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/glib-sections.txt: Add a missing SECTION
+ endtag. (#61126)
+
+2001-09-17 Darin Adler <darin@bentspoon.com>
+
+ * glib/tmpl/string_utils.sgml: Fix a typo and change
+ documentation for g_ascii_isdigit and g_ascii_isxdigit
+ to reflect the fact that the standard isdigit and
+ isxdigit are already locale-independent.
+
+Wed Sep 5 05:24:07 2001 Tim Janik <timj@gtk.org>
+
+ * gobject/tmpl/gboxed.sgml: documented some functions.
+
+ * gobject/tmpl/objects.sgml: some fixups.
+
+Mon Sep 10 11:37:02 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/glib-sections.txt: Update.
+
+Sat Sep 8 14:13:44 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/Makefile.am (IGNORE_HFILES): Add
+ gbsearcharray.h.
+
+ * gobject/Makefile.am (IGNORE_HFILES): Remove
+ gbsearcharray.h.
+
+2001-08-15 Ron Stenike <rsteinke@w-link.net>
+
+ * docs/reference/glib/glib-sections.txt: Added
+ declarations for g_io_channel_[set,get]_close_on_unref
+
+Sun Aug 12 10:03:42 2001 Owen Taylor <otaylor@redhat.com>
+
+ * */Makefile.am: Set GPATH to fix srcdir != builddir
+ problems with GNU make.
+
+Sun Aug 12 02:24:36 2001 Tim Janik <timj@gtk.org>
+
+ * gobject/tmpl/value_arrays.sgml: document value arrays.
+
+2001-08-06 Sven Neumann <sven@gimp.org>
+
+ * docs/reference/gobject/gobject-sections.txt
+ * docs/reference/gobject/tmpl/objects.sgml: added documentation for
+ g_object_[add|remove]_weak_pointer().
+
+2001-07-19 Darin Adler <darin@bentspoon.com>
+
+ reviewed by: <delete if not using a buddy>
+
+ * glib/tmpl/string_utils.sgml:
+
+2001-06-03 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/caches.sgml, glib/tmpl/main.sgml,
+ gobject/gobject-docs.sgml, gobject/tmpl/generic_values.sgml,
+ gobject/tmpl/gtypemodule.sgml, gobject/tmpl/signals.sgml,
+ gobject/tmpl/types.sgml: fix some typos.
+
+Thu Jun 28 17:43:29 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/tmpl/memory.sgml glib/tmpl/macros_misc.sgml: Add
+ notes about inclusion of string.h to docs on g_memmove,
+ G_VA_COPY. (#54411)
+
+Tue Jun 26 12:28:20 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/Makefile.am: Fix problem with glibconfig.h
+
+2001-06-26 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/threads.sgml (example): Corrected.
+
+2001-06-07 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/glib-sections.txt, glib/tmpl/date.sgml: Add g_time_val_add.
+
+ * glib/tmpl/threads.sgml: Updated.
+
+2001-05-23 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/arrays.sgml, glib/tmpl/arrays_pointers.sgml,
+ glib/tmpl/arrays_byte.sgml: Corrected documentation for the
+ ..._sized_new functions. Discovered by noon@users.sourceforge.net.
+
+2001-05-19 Havoc Pennington <hp@pobox.com>
+
+ * glib/Makefile.am (IGNORE_HFILES): add glibintl.h
+
+ * glib/tmpl/*.sgml: fix various missing docs
+
+2001-05-18 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/glib-overrides.txt, glib/glib-sections.txt,
+ glib/tmpl/thread_pools.sgml, glib/tmpl/threads.sgml: Updated.
+
+2001-05-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/thread_pools.sgml, glib/tmpl/thread_pools.sgml:
+ Updates after some renaming took place.
+
+2001-05-08 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/threads.sgml, glib/glib-overrides.txt: Updated.
+
+ * glib/tmpl/threads.sgml: Clarification for g_mutex_trylock.
+
+2001-04-19 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/hash_tables.sgml, glib/tmpl/misc_utils.sgml,
+ glib/tmpl/scanner.sgml: Changes due to deprecation update.
+
+Mon Apr 16 12:18:26 2001 Owen Taylor <otaylor@redhat.com>
+
+ * {glib,gobject}/Makefile.am (tmpl-build.stamp): More tweaks
+ from GTK+. Reenable $(HTML_IMAGES) with shell portability fixes.
+
+Wed Apr 4 00:56:00 2001 Tim Janik <timj@gtk.org>
+
+ * gobject/Makefile.am: disabled "for i in $(HTML_IMAGES) ;"
+ dist-hook because $(HTML_IMAGES) is empty.
+
+Tue Apr 3 11:51:02 2001 Owen Taylor <otaylor@redhat.com>
+
+ * {glib,gobject}/Makefile.am (sgml-build.stamp): Add
+ explicit path to tmpl files in dependencies.
+
+ * glib/glib.types gobject/gobject.types: empty files
+ to keep generic makefiles happy.
+
+2001-04-03 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/glib-sections.txt: Removed
+ g_static_private_(get|set)_for_thread.
+
+ * glib/tmpl/threads.sgml: Updated.
+
+ * glib/tmpl/thread_pools.sgml: Added GThreadPool documentation.
+
+Mon Mar 26 14:20:36 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/Makefile.am (SCAN_OPTIONS): Add --deprecated-guards
+
+Sat Mar 17 17:51:17 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/Makefile.am glib/Makefile.am: A couple
+ of small fixes.
+
+2001-03-08 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/threads.sgml: Spelling corrections.
+
+Wed Mar 7 15:02:17 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/Makefile.am: Revert Tim's last commit to
+ get rid of 7+ unnecessary / broken changes. Add
+ back the useful part. Also fix problem with grep,
+ add dependency on template files.
+
+ * gobject/gobject-sections.txt: Remove double
+ value_types names which was screwing up builds.
+
+ * glib/Makefile.am: Propagate changes from
+ gobject/Makefile.am
+
+2001-03-07 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/threads.sgml: Fixed stupid typo.
+
+2001-03-07 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/threads.sgml: Completed.
+
+Wed Mar 7 09:33:27 2001 Tim Janik <timj@gtk.org>
+
+ * gobject/Makefile.am: shuffled rules to avoid excessive
+ rebuilds.
+
+ * gobject/gobject-sections.txt: updates.
+
+ * gobject/tmpl/*: bunch of updates, added another patch
+ from Eric Lemings <eric.b.lemings@lmco.com>.
+
+2001-03-07 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/glib-sections.txt, glib/tmpl/messages.sgml: Removed
+ g_log_domain_gmodule.
+
+2001-02-23 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/threads.sgml: Big update. Almost ready.
+
+ * glib/tmpl/async_queues.sgml: Typo.
+
+ * glib/glib-sections.txt: Added g_static_rec_mutex_init,
+ g_static_rec_mutex_free, g_static_rw_lock_init,
+ g_static_private_init and g_static_private_free.
+
+ * glib/glib-overrides.txt: Added g_thread_yield and g_thread_exit.
+
+Fri Feb 16 06:52:20 2001 Tim Janik <timj@gtk.org>
+
+ * gobject/tmpl/types.sgml: incorporated huge docu patch from Eric
+ Lemings <eric.b.lemings@lmco.com> with a bunch of editing on my part.
+
+Mon Feb 12 12:42:45 2001 Owen Taylor <otaylor@redhat.com>
+
+ * {glib,gobject}/Makefile.am: The ultimate gtk-doc makefile.
+
+2001-02-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/threads.sgml, glib/glib-sections.txt: Added
+ documentation for g_static_mutex_init().
+
+Wed Jan 31 07:14:22 2001 Tim Janik <timj@gtk.org>
+
+ * gobject/Makefile.am: adapt to work with new CVS gtk-doc, leaving the old
+ rules in place caused bogus recursions. main changes:
+ - add to conditionalized section:
+ all-local:
+ $(MAKE) scan
+ $(MAKE) templates
+ $(MAKE) sgml
+ $(MAKE) html.stamp
+ html.stamp: sgml.stamp $(EXTRA_SGML_FILES)
+ $(MAKE) html
+ DOC_STAMPS= html.stamp sgml.stamp
+ - change:
+ maintainer-clean-local: clean
+ - cd $(srcdir) && rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
+ + cd $(srcdir) && rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt $(DOC_STAMPS)
+
+ * glib/Makefile.am (maintainer-clean-local): dito.
+
+Wed Jan 31 06:21:32 2001 Tim Janik <timj@gtk.org>
+
+ * gobject/tmpl/types.sgml: applied docu patch from Eric Lemings
+ <eric.b.lemings@lmco.com>, did some more editing.
+
+2001-01-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/glib-sections.txt, glib/tmpl/threads.sgml: Added
+ g_static_mutex_free().
+
+Tue Jan 9 03:10:38 2001 Tim Janik <timj@gtk.org>
+
+ * gobject/tmpl/types.sgml: added some function documentations.
+
+ * gobject/gobject-sections.txt: buncha fixups.
+
+Fri Jan 5 15:47:10 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib/glib-sections.txt glib/tmpl/* glib/Makefile.am: Updated.
+
+2000-12-22 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/glib-sections.txt: Added G_MODULE_SUFFIX.
+
+ * glib/tmpl/modules.sgml: Updated.
+
+2000-12-19 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/glib-sections.txt: Added g_rand_boolean and
+ g_random_boolean macros.
+
+ * glib/tmpl/random_numbers.sgml: Updated.
+
+Tue Dec 5 15:41:23 2000 Owen Taylor <otaylor@redhat.com>
+
+ * glib/Makefile.am glib/mainloop-states*: add images
+
+ * glib/glib-sections.txt: Updated
+
+ * glib/tmpl/main.sgml: More documentation, move function
+ docs to .c file.
+
+Mon Nov 13 00:18:55 2000 Owen Taylor <otaylor@redhat.com>
+
+ * glib/glib-sections.sgml: Move conversion functions
+ into GConv section.
+
+ * gobject/gobject-docs.sgml: Fix some malformed sgml.
+
+Sun Nov 5 13:24:50 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/Makefile.am gobject/gobject-sections.sgml: Updates
+ * gobject/tmpl/g{boxed,type{plugin,module}}.sgml: added
+
+2000-11-05 Havoc Pennington <hp@pobox.com>
+
+ * glib/tmpl/markup.sgml: Write docs
+
+2000-11-05 Havoc Pennington <hp@pobox.com>
+
+ * glib/glib-sections.txt: remove parens from section name,
+ confuses gtk-doc
+
+ * glib/glib-docs.sgml: Add the new files here, doh.
+
+ * glib/tmpl/shell.sgml: add gshell.[hc] docs
+
+2000-11-05 Havoc Pennington <hp@pobox.com>
+
+ * glib/tmpl/error_reporting.sgml: fixes
+
+2000-11-05 Havoc Pennington <hp@pobox.com>
+
+ * glib/tmpl/spawn.sgml, glib/tmpl/markup.sgml,
+ glib/tmpl/fileutils.sgml: Added
+
+ * glib/Makefile.am: Add new files
+
+ * glib/glib-sections.txt: Add stuff from -unused
+
+Fri Nov 3 07:33:15 2000 Tim Janik <timj@gtk.org>
+
+ * gobject/gobject-docs.sgml: added &gobject-closures; section.
+
+ * gobject/Makefile.am (tmpl_sources): add tmpl/clsoures.sgml
+
+ * gobject/gobject-sections.txt: added Closure section.
+
+ * gobject/tmpl/closures.sgml: new file with template description
+ for GClosure functions.
+
+2000-11-02 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/glib-unused.sgml: Remove superfluous GSearchFunc.
+
+ * glib/tmpl/async_queues.sgml, glib/glib-sections.txt: Added
+ documentation for asynchronous queues.
+
+2000-10-31 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/linked_lists_single.sgml: This time the right fix.
+
+ * glib/tmpl/scanner.sgml, glib/tmpl/strings.sgml: Changed
+ parameter names.
+
+ * glib/tmpl/string_utils.sgml: Corrected the documentation of
+ g_strescape and added those of g_strcompress.
+
+2000-10-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/limits.sgml: Added documentation for
+ G_MAXU(INT|SHORT|LONG).
+
+ * glib/tmpl/macros_misc.sgml: Added documentation for
+ G_G(U)INT(16|32|64)_FORMAT.
+
+ * glib/tmpl/types.sgml: Mention G_MAXU(INT|SHORT|LONG) in
+ documentation for gu(int|short|long).
+
+ * glib/glib-sections.txt, glib/tmpl/linked_lists_double.sgml,
+ glib/tmpl/caches.sgml: Move GCompareFunc to GList and introduce
+ and document GEqualFunc in GHashTable.
+
+ * glib/tmpl/caches.sgml, glib/tmpl/hash_tables.sgml,
+ glib/tmpl/relations.sgml : Changed to reflect the changed API
+ (GCompareFunc -> GEqualFunc).
+
+ * glib/tmpl/linked_lists_single.sgml, glib/tmpl/threads.sgml: Typo
+ fixes.
+
+Mon Oct 30 11:13:12 2000 Tim Janik <timj@gtk.org>
+
+ * gobject/tmpl/signals.sgml: start at general description.
+
+ * gobject/gobject-docs.sgml: added introduction.
+
+Mon Oct 30 06:01:43 2000 Tim Janik <timj@gtk.org>
+
+ * gobject/gobject-sections.txt: opened up a new section on signals.
+
+2000-10-27 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/tmpl/misc_utils.sgml: Removed the win32 limitation.
+
+ * glib/glib-sections.txt, glib/tmpl/hash_tables.sgml,
+ glib/tmpl/macros_misc.sgml, glib/tmpl/misc_utils.sgml,
+ glib/tmpl/scanner.sgml: Document the recently deprecated functions
+ as such.
+
+2000-10-15 Raja R Harinath <harinath@cs.umn.edu>
+
+ 'make distcheck' fixes.
+ * glib/Makefile.am (EXTRA_DIST): Add $(DOC_MODULE)-decl.txt.
+ (html): Run 'gtkdoc-fixxref' in $(srcdir).
+ (dist-check-gtkdoc): Add missing quote.
+ (dist-hook): Copy in dependency order, so that none of the
+ makerules are fired in a tarball build.
+
+ * gobject/Makefile.am: Likewise.
+
+2000-10-13 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/glib-sections.txt: Added misc items.
+
+ * glib/tmpl/random_numbers.sgml: Documentation for the random
+ number generator.
+
+2000-10-09 Raja R Harinath <harinath@cs.umn.edu>
+
+ * gobject/Makefile.am (DOC_SOURCE_DIR): Don't set to
+ $top_srcdir)/gobject.
+ * glib/Makefile.am (DOC_SOURCE_DIR): Don't set to $(top_srcdir),
+
+2000-09-29 Jonathan Blandford <jrb@redhat.com>
+
+ * glib/tmpl/trees-nary.sgml: Add g_node_insert_after().
+
+Thu Sep 7 12:35:35 2000 Owen Taylor <otaylor@redhat.com>
+
+ * Some further makefile improvement.
+
+ * Restore all the docs that mysteriously vanished earlier.
+
+Wed Sep 6 10:59:45 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/Makefile.am glib/Makefile.am: Improve
+ separation of generic non-generic parts and dependencies.
+
+Tue Sep 5 20:03:25 2000 Owen Taylor <otaylor@redhat.com>
+
+ * Moved into glib source tree, updated glib-sections.txt
+ and Makefile.am for glib-1.3.x.
+
+2000-07-01 Damon Chaplin <damon@helixcode.com>
+
+ * tmpl/string_utils.sgml: updated g_strndup.
+
+2000-06-11 Damon Chaplin <damon@helixcode.com>
+
+ * tmpl/messages.sgml: updated a bit more.
+
+2000-06-11 Damon Chaplin <damon@helixcode.com>
+
+ * tmpl/messages.sgml: updated a few bits about log handlers & flags.
+
+2000-04-16 Damon Chaplin <damon@helixcode.com>
+
+ * tmpl/linked_lists_single.sgml:
+ * tmpl/linked_lists_double.sgml:
+ * tmpl/trees-nary.sgml: updated.
+
+ * tmpl/modules.sgml: described g_module_build_path().
+
+ * tmpl/date.sgml: made short description lower case and end in a '.'.
+
+ * glib-sections.txt: rearranged GDate section.
+
+ * tmpl/arrays.sgml:
+ * tmpl/arrays_byte.sgml:
+ * tmpl/arrays_pointer.sgml: updated.
+
+2000-02-21 Damon Chaplin <damon@helixcode.com>
+
+ * tmpl/main.sgml: updated the g_source_remove_by_XXX() descriptions
+ to note that only the first source found is removed.
+
+2000-01-25 Damon Chaplin <damon@karuna.freeserve.co.uk>
+
+ * tmpl/misc_utils.sgml: g_bit_nth_lsf/msf docs from
+ Nils Rennebarth <nils@ipe.uni-stuttgart.de>, and updates for
+ GVoidFunc & GFreeFunc.
+
+1999-12-02 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib-sections.txt, tmpl/threads.sgml: Removed
+ G_THREADS_IMPL_NSPR. Shouldn't be used anyway.
+
+ * glib-overrides.txt: New file, that makes most of the thread
+ related macros look like functions.
+
+ * Makefile.am: Added glib-overrides.txt to EXTRA_DIST.
+
+ * tmpl/threads.sgml: Minor updates.
+
+Tue Aug 17 08:42:17 1999 Owen Taylor <otaylor@redhat.com>
+
+ * tmpl/datasets.sgml: Added missing </para>
+ * tmpl/timers.sgml: Added missing </para>
+ * tmpl/misc_utils.sgml: Added missing </para>
+ * tmpl/linked_lists_double.sgml: Added missing </para>
+ * tmpl/linked_lists_single.sgml: Added missing </para>
+ * tmpl/threads.sgml: Removed extra <para>s.
+ * tmpl/main.sgml: Added missing </para>
+
+Wed Aug 18 23:38:52 1999 Owen Taylor <otaylor@redhat.com>
+
+ * README: Added some simple build instructions.
+
+Wed Aug 18 23:11:28 1999 Owen Taylor <otaylor@redhat.com>
+
+ * Import into CVS of glib-reference-1.1.3
+ Filled in some basic contents for AUTHORS
+ README, and README.cvs
+
diff --git a/trunk/docs/reference/Makefile.am b/trunk/docs/reference/Makefile.am
new file mode 100644
index 000000000..c5c7e965a
--- /dev/null
+++ b/trunk/docs/reference/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = glib gobject
diff --git a/trunk/docs/reference/NEWS b/trunk/docs/reference/NEWS
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/trunk/docs/reference/NEWS
diff --git a/trunk/docs/reference/README b/trunk/docs/reference/README
new file mode 100644
index 000000000..895028105
--- /dev/null
+++ b/trunk/docs/reference/README
@@ -0,0 +1,63 @@
+This package contains the reference documentation
+for GLib. For more information about Glib,
+see:
+
+ http://www.gtk.org
+
+For information about contributing to the
+GLib/GTK+ reference documentation project, see:
+
+ http://www.gtk.org/rdp/
+
+The GLib reference documentation is freely redistributable,
+see the file COPYING for details.
+
+
+REQUIREMENTS
+============
+
+To build the documentation, you must have the gtk-doc
+package installed. To rebuild the template files,
+you must have the current version of the GLib
+header files installed.
+
+
+BUILD
+=====
+
+First, run configure to generate the makefiles for this
+module. There is one option specific to this package
+
+ --with-html-dir=DIR top of installed HTML documentation tree
+
+
+The Makefiles for this module define three targets:
+
+ templates:
+
+ Scan the headers and merge the results with the current
+ template files
+
+ sgml:
+
+ Generate SGML files using the DocBook DTD from
+ the template files
+
+ html:
+
+ Generate HTML from the SGML files.
+
+To build the documentation, do:
+
+ make sgml
+ make html
+
+You should only run the 'make templates' step if you
+need to regenerate the templates for a more recent
+version of the GLib sources.
+
+
+INSTALLATION
+============
+
+ make install
diff --git a/trunk/docs/reference/glib/Makefile.am b/trunk/docs/reference/glib/Makefile.am
new file mode 100644
index 000000000..d6eb74ee1
--- /dev/null
+++ b/trunk/docs/reference/glib/Makefile.am
@@ -0,0 +1,97 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = 1.6
+
+# The name of the module.
+DOC_MODULE=glib
+
+# The top-level SGML file.
+DOC_MAIN_SGML_FILE=glib-docs.sgml
+
+# Extra options to supply to gtkdoc-scan
+SCAN_OPTIONS=--deprecated-guards="G_DISABLE_DEPRECATED"
+
+# The directory containing the source code. Relative to $(srcdir)
+DOC_SOURCE_DIR=../../..
+
+# Used for dependencies
+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= \
+ build \
+ gobject \
+ config.h \
+ gdatasetprivate.h \
+ glibintl.h \
+ gbsearcharray.h \
+ gmoduleconf.h \
+ gunibreak.h \
+ gunicomp.h \
+ gunidecomp.h \
+ gunichartables.h \
+ glibconfig-sysdefs.h \
+ gdebug.h \
+ gprintfint.h \
+ galias.h \
+ gmirroringtable.h \
+ gscripttable.h \
+ glib-mirroring-tab \
+ gnulib \
+ pcre \
+ update-pcre
+
+# Extra options to supply to gtkdoc-mkdb
+MKDB_OPTIONS=--sgml-mode --output-format=xml --ignore-files=trio
+
+# Images to copy into HTML directory
+HTML_IMAGES = \
+ file-name-encodings.png \
+ mainloop-states.gif
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE)
+content_files = \
+ cross.sgml \
+ running.sgml \
+ building.sgml \
+ changes.sgml \
+ compiling.sgml \
+ resources.sgml \
+ regex-syntax.sgml \
+ version.xml \
+ glib-gettextize.xml
+
+# Extra options to supply to gtkdoc-fixref
+FIXXREF_OPTIONS=
+
+# include common portion ...
+include $(top_srcdir)/gtk-doc.make
+
+# Other files to distribute
+EXTRA_DIST += \
+ file-name-encodings.png \
+ file-name-encodings.sxd \
+ mainloop-states.fig \
+ mainloop-states.png \
+ mainloop-states.eps \
+ version.xml.in
+
+########################################################################
+
+man_MANS = glib-gettextize.1
+
+if ENABLE_MAN
+
+%.1 : %.xml
+ @XSLTPROC@ -nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $<
+
+endif
+
+BUILT_EXTRA_DIST = $(man_MANS)
+
+dist-hook-local: $(BUILT_EXTRA_DIST)
+ files='$(BUILT_EXTRA_DIST)'; \
+ for f in $$files; do \
+ if test -f $$f; then d=.; else d=$(srcdir); fi; \
+ cp $$d/$$f $(distdir) || exit 1; done
+
diff --git a/trunk/docs/reference/glib/building.sgml b/trunk/docs/reference/glib/building.sgml
new file mode 100644
index 000000000..ccd734e88
--- /dev/null
+++ b/trunk/docs/reference/glib/building.sgml
@@ -0,0 +1,509 @@
+<refentry id="glib-building" revision="16 Jan 2002">
+<refmeta>
+<refentrytitle>Compiling the GLib package</refentrytitle>
+<manvolnum>3</manvolnum>
+<refmiscinfo>GLib Library</refmiscinfo>
+</refmeta>
+
+<refnamediv>
+<refname>Compiling the GLib Package</refname>
+<refpurpose>
+How to compile GLib itself
+</refpurpose>
+ </refnamediv>
+
+ <refsect1 id="building">
+ <title>Building the Library on UNIX</title>
+ <para>
+ On UNIX, GLib uses the standard GNU build system,
+ using <application>autoconf</application> for package
+ configuration and resolving portability issues,
+ <application>automake</application> for building makefiles
+ that comply with the GNU Coding Standards, and
+ <application>libtool</application> for building shared
+ libraries on multiple platforms. The normal sequence for
+ compiling and installing the GLib library is thus:
+
+ <literallayout>
+ <userinput>./configure</userinput>
+ <userinput>make</userinput>
+ <userinput>make install</userinput>
+ </literallayout>
+ </para>
+
+ <para>
+ The standard options provided by <application>GNU
+ autoconf</application> may be passed to the
+ <command>configure</command> script. Please see the
+ <application>autoconf</application> documentation or run
+ <command>./configure --help</command> for information about
+ the standard options.
+ </para>
+ <para>
+ The GTK+ documentation contains
+ <ulink url="../gtk/gtk-building.html">further details</ulink>
+ about the build process and ways to influence it.
+ </para>
+ </refsect1>
+ <refsect1 id="dependencies">
+ <title>Dependencies</title>
+ <para>
+ Before you can compile the GLib library, you need to have
+ various other tools and libraries installed on your
+ system. The two tools needed during the build process (as
+ differentiated from the tools used in when creating GLib
+ mentioned above such as <application>autoconf</application>)
+ are <command>pkg-config</command> and GNU make.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <ulink
+ url="http://www.freedesktop.org/software/pkgconfig/">pkg-config</ulink>
+ is a tool for tracking the compilation flags needed for
+ libraries that are used by the GLib library. (For each
+ library, a small <literal>.pc</literal> text file is
+ installed in a standard location that contains the compilation
+ flags needed for that library along with version number
+ information.) The version of <command>pkg-config</command>
+ needed to build GLib is mirrored in the
+ <filename>dependencies</filename> directory
+ on the <ulink url="ftp://ftp.gtk.org/pub/gtk/v2.2/">GTK+ FTP
+ site.</ulink>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The GTK+ makefiles will mostly work with different versions
+ of <command>make</command>, however, there tends to be
+ a few incompatibilities, so the GTK+ team recommends
+ installing <ulink url="http://www.gnu.org/software/make">GNU
+ make</ulink> if you don't already have it on your system
+ and using it. (It may be called <command>gmake</command>
+ rather than <command>make</command>.)
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ GLib depends on a number of other libraries.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ The <ulink url="http://www.gnu.org/software/libiconv/">GNU
+ libiconv library</ulink> is needed to build GLib if your
+ system doesn't have the <function>iconv()</function>
+ function for doing conversion between character
+ encodings. Most modern systems should have
+ <function>iconv()</function>, however many older systems lack
+ an <function>iconv()</function> implementation. On such systems,
+ you must install the libiconv library. This can be found at:
+ <ulink url="http://www.gnu.org/software/libiconv">http://www.gnu.org/software/libiconv</ulink>.
+ </para>
+ <para>
+ If your system has an <function>iconv()</function> implementation but
+ you want to use libiconv instead, you can pass the
+ --with-libiconv option to configure. This forces
+ libiconv to be used.
+ </para>
+ <para>
+ Note that if you have libiconv installed in your default include
+ search path (for instance, in <filename>/usr/local/</filename>), but
+ don't enable it, you will get an error while compiling GLib because
+ the <filename>iconv.h</filename> that libiconv installs hides the
+ system iconv.
+ </para>
+ <para>
+ If you are using the native iconv implementation on Solaris
+ instead of libiconv, you'll need to make sure that you have
+ the converters between locale encodings and UTF-8 installed.
+ At a minimum you'll need the SUNWuiu8 package. You probably
+ should also install the SUNWciu8, SUNWhiu8, SUNWjiu8, and
+ SUNWkiu8 packages.
+ </para>
+ <para>
+ The native iconv on Compaq Tru64 doesn't contain support for
+ UTF-8, so you'll need to use GNU libiconv instead. (When
+ using GNU libiconv for GLib, you'll need to use GNU libiconv
+ for GNU gettext as well.) This probably applies to related
+ operating systems as well.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The libintl library from the <ulink
+ url="http://www.gtk.org/software/gettext">GNU gettext
+ package</ulink> is needed if your system doesn't have the
+ <function>gettext()</function> functionality for handling
+ message translation databases.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A thread implementation is needed, unless you want to compile GLib
+ without thread support, which is not recommended. The thread support
+ in GLib can be based upon several native thread implementations,
+ e.g. POSIX threads, DCE threads or Solaris threads.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ GRegex uses the the <ulink url="http://www.pcre.org/">PCRE library</ulink>
+ for regular expression matching. The default is to use the internal
+ version of PCRE that is patched to use GLib for memory management
+ and Unicode handling. If you prefer to use the system-supplied PCRE
+ library you can pass the --with-pcre=system option to configure,
+ but it is not recommended.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ </refsect1>
+ <refsect1 id="extra-configuration-options">
+ <title>Extra Configuration Options</title>
+
+ <para>
+ In addition to the normal options, the
+ <command>configure</command> script in the GLib
+ library supports these additional arguments:
+
+ <cmdsynopsis>
+ <command>configure</command>
+ <group>
+ <arg>--enable-debug=[no|minimum|yes]</arg>
+ </group>
+ <group>
+ <arg>--disable-gc-friendly</arg>
+ <arg>--enable-gc-friendly</arg>
+ </group>
+ <group>
+ <arg>--disable-mem-pools</arg>
+ <arg>--enable-mem-pools</arg>
+ </group>
+ <group>
+ <arg>--disable-threads</arg>
+ <arg>--enable-threads</arg>
+ </group>
+ <group>
+ <arg>--with-threads=[none|posix|dce|win32]</arg>
+ </group>
+ <group>
+ <arg>--disable-regex</arg>
+ <arg>--enable-regex</arg>
+ </group>
+ <group>
+ <arg>--with-pcre=[internal|system]</arg>
+ </group>
+ <group>
+ <arg>--disable-included-printf</arg>
+ <arg>--enable-included-printf</arg>
+ </group>
+ <group>
+ <arg>--disable-visibility</arg>
+ <arg>--enable-visibility</arg>
+ </group>
+ <group>
+ <arg>--disable-gtk-doc</arg>
+ <arg>--enable-gtk-doc</arg>
+ </group>
+ <group>
+ <arg>--disable-man</arg>
+ <arg>--enable-man</arg>
+ </group>
+ </cmdsynopsis>
+ </para>
+
+ <formalpara>
+ <title><systemitem>--enable-debug</systemitem></title>
+
+ <para>
+ Turns on various amounts of debugging support. Setting this to 'no'
+ disables g_assert(), g_return_if_fail(), g_return_val_if_fail() and
+ all cast checks between different object types. Setting it to 'minimum' disables only cast checks. Setting it to 'yes' enables
+ <link linkend="GLIB-Debug-Options">runtime debugging</link>.
+ The default is 'minimum'.
+ Note that 'no' is fast, but dangerous as it tends to destabilize
+ even mostly bug-free software by changing the effect of many bugs
+ from simple warnings into fatal crashes. Thus
+ <option>--enable-debug=no</option> should <emphasis>not</emphasis>
+ be used for stable releases of GLib.
+ </para>
+ </formalpara>
+
+ <formalpara>
+ <title><systemitem>--disable-gc-friendly</systemitem> and
+ <systemitem>--enable-gc-friendly</systemitem></title>
+
+ <para>
+ By default, and with <systemitem>--disable-gc-friendly</systemitem>
+ as well, Glib does not clear the memory for certain objects before they
+ are freed. For example, Glib may decide to recycle GList nodes by
+ putting them in a free list. However, memory profiling and debugging tools like <ulink
+ url="http://www.valgrind.org">Valgrind</ulink> work better if an
+ application does not keep dangling pointers to freed memory (even
+ though these pointers are no longer dereferenced), or invalid pointers inside
+ uninitialized memory. The
+ <systemitem>--enable-gc-friendly</systemitem> option makes Glib clear
+ memory in these situations:
+ </para>
+ </formalpara>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ When shrinking a GArray, Glib will clear the memory no longer
+ available in the array: shrink an array from 10 bytes to 7, and
+ the last 3 bytes will be cleared. This includes removals of single and multiple elements.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ When growing a GArray, Glib will clear the new chunk of memory.
+ Grow an array from 7 bytes to 10 bytes, and the last 3 bytes will be cleared.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The above applies to GPtrArray as well.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ When freeing a node from a GHashTable, Glib will first clear
+ the node, which used to have pointers to the key and the value
+ stored at that node.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ When destroying or removing a GTree node, Glib will clear the node,
+ which used to have pointers to the node's value, and the left and right subnodes.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ Since clearing the memory has a cost,
+ <systemitem>--disable-gc-friendly</systemitem> is the default.
+ </para>
+
+ <formalpara>
+ <title><systemitem>--disable-mem-pools</systemitem> and
+ <systemitem>--enable-mem-pools</systemitem></title>
+
+ <para>
+ Many small chunks of memory are often allocated via collective pools
+ in GLib and are cached after release to speed up reallocations.
+ For sparse memory systems this behaviour is often inferior, so
+ memory pools can be disabled to avoid excessive caching and force
+ atomic maintenance of chunks through the <function>g_malloc()</function>
+ and <function>g_free()</function> functions. Code currently affected by
+ this:
+ <itemizedlist>
+ <listitem>
+ <para>
+ <structname>GList</structname>, <structname>GSList</structname>,
+ <structname>GNode</structname>, <structname>GHash</structname>
+ allocations. The functions g_list_push_allocator(),
+ g_list_pop_allocator(), g_slist_push_allocator(),
+ g_slist_pop_allocator(), g_node_push_allocator() and
+ g_node_pop_allocator() are not available
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <structname>GMemChunk</structname>s become basically non-effective
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <structname>GSignal</structname> disables all caching (potentially
+ very slow)
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <structname>GType</structname> doesn't honour the
+ <structname>GTypeInfo</structname>
+ <structfield>n_preallocs</structfield> field anymore
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ the <structname>GBSearchArray</structname> flag
+ <literal>G_BSEARCH_ALIGN_POWER2</literal> becomes non-functional
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </formalpara>
+
+ <formalpara>
+ <title><systemitem>--disable-threads</systemitem> and
+ <systemitem>--enable-threads</systemitem></title>
+
+ <para>
+ Do not compile GLib to be multi thread safe. GLib
+ will be slightly faster then. This is however not
+ recommended, as many programs rely on GLib being
+ multi thread safe.
+ </para>
+ </formalpara>
+
+ <formalpara>
+ <title><systemitem>--with-threads</systemitem></title>
+
+ <para>
+ Specify a thread implementation to use.
+ <itemizedlist>
+ <listitem><para>
+ 'posix' and 'dce' can be used interchangeable
+ to mean the different versions of Posix
+ threads. configure tries to find out, which
+ one is installed.
+ </para></listitem>
+
+ <listitem><para>
+ 'none' means that GLib will be thread safe,
+ but does not have a default thread
+ implementation. This has to be supplied to
+ <function>g_thread_init()</function> by the programmer.
+ </para></listitem>
+ </itemizedlist>
+
+ </para>
+ </formalpara>
+
+ <formalpara>
+ <title><systemitem>--disable-regex</systemitem> and
+ <systemitem>--enable-regex</systemitem></title>
+
+ <para>
+ Do not compile GLib with regular expression support.
+ GLib will be smaller because it will not need the
+ PCRE library. This is however not recommended, as
+ programs may need GRegex.
+ </para>
+ </formalpara>
+
+ <formalpara>
+ <title><systemitem>--with-pcre</systemitem></title>
+
+ <para>
+ Specify whether to use the internal or the system-supplied
+ PCRE library.
+ <itemizedlist>
+ <listitem><para>
+ 'internal' means that GRegex will be compiled to use
+ the internal PCRE library.
+ </para></listitem>
+
+ <listitem><para>
+ 'system' means that GRegex will be compiled to use
+ the system-supplied PCRE library.
+ </para></listitem>
+ </itemizedlist>
+ Using the internal PCRE is the preferred solution:
+ <itemizedlist>
+ <listitem>
+ <para>
+ System-supplied PCRE has a separated copy of the big tables
+ used for Unicode handling.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Some systems have PCRE libraries compiled without some needed
+ features, such as UTF-8 and Unicode support.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ PCRE uses some global variables for memory management and
+ other features. In the rare case of a program using both
+ GRegex and PCRE (maybe indirectly through a library),
+ this variables could lead to problems when they are modified.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </formalpara>
+
+ <formalpara>
+ <title><systemitem>--disable-included-printf</systemitem> and
+ <systemitem>--enable-included-printf</systemitem></title>
+
+ <para>
+ By default the <command>configure</command> script will try
+ to auto-detect whether the C library provides a suitable set
+ of <function>printf()</function> functions. In detail,
+ <command>configure</command> checks that the semantics of
+ <function>snprintf()</function> are as specified by C99 and
+ that positional parameters as specified in the Single Unix
+ Specification are supported. If this not the case, GLib will
+ include an implementation of the <function>printf()</function>
+ family.
+ These options can be used to explicitly control whether
+ an implementation fo the <function>printf()</function> family
+ should be included or not.
+ </para>
+ </formalpara>
+
+ <formalpara>
+ <title><systemitem>--disable-visibility</systemitem> and
+ <systemitem>--enable-visibility</systemitem></title>
+
+ <para>
+ By default, GLib uses ELF visibility attributes to optimize
+ PLT table entries if the compiler supports ELF visibility
+ attributes. A side-effect of the way in which this is currently
+ implemented is that any header change forces a full
+ recompilation, and missing includes may go unnoticed.
+ Therefore, it makes sense to turn this feature off while
+ doing GLib development, even if the compiler supports ELF
+ visibility attributes. The <option>--disable-visibility</option>
+ option allows to do that.
+ </para>
+ </formalpara>
+
+ <formalpara>
+ <title><systemitem>--disable-gtk-doc</systemitem> and
+ <systemitem>--enable-gtk-doc</systemitem></title>
+
+ <para>
+ By default the <command>configure</command> script will try
+ to auto-detect whether the
+ <application>gtk-doc</application> package is installed. If
+ it is, then it will use it to extract and build the
+ documentation for the GLib library. These options
+ can be used to explicitly control whether
+ <application>gtk-doc</application> should be
+ used or not. If it is not used, the distributed,
+ pre-generated HTML files will be installed instead of
+ building them on your machine.
+ </para>
+ </formalpara>
+
+ <formalpara>
+ <title><systemitem>--disable-man</systemitem> and
+ <systemitem>--enable-man</systemitem></title>
+
+ <para>
+ By default the <command>configure</command> script will try
+ to auto-detect whether <application>xsltproc</application>
+ and the necessary Docbook stylesheets are installed. If
+ they are, then it will use them to rebuild the included
+ man pages from the XML sources. These options can be used
+ to explicitly control whether man pages should be rebuilt
+ used or not. The distribution includes pre-generated man
+ pages.
+ </para>
+ </formalpara>
+
+ </refsect1>
+
+</refentry>
diff --git a/trunk/docs/reference/glib/changes.sgml b/trunk/docs/reference/glib/changes.sgml
new file mode 100644
index 000000000..1dbb74a44
--- /dev/null
+++ b/trunk/docs/reference/glib/changes.sgml
@@ -0,0 +1,178 @@
+<refentry id="glib-changes" revision="17 Jan 2002">
+<refmeta>
+<refentrytitle>Changes to GLib</refentrytitle>
+<manvolnum>3</manvolnum>
+<refmiscinfo>Changes to GLib</refmiscinfo>
+</refmeta>
+
+<refnamediv>
+<refname>Changes to GLib</refname>
+<refpurpose>
+Incompatible changes made between successing versions of GLib
+</refpurpose>
+</refnamediv>
+
+
+<refsect1>
+<title>Incompatible changes from 2.0 to 2.2</title>
+
+<itemizedlist>
+
+<listitem>
+<para>
+GLib changed the seeding algorithm for the pseudo-random number
+generator Mersenne Twister, as used by <structname>GRand</structname>
+and <structname>GRandom</structname>. This was necessary, because some
+seeds would yield very bad pseudo-random streams. Also the
+pseudo-random integers generated by
+<function>g_rand*_int_range()</function> will have a
+slightly better equal distribution with the new version of GLib.
+</para>
+
+<para>
+Further information can be found at the website of the Mersenne
+Twister random number generator at <ulink
+url="http://www.math.keio.ac.jp/~matumoto/emt.html">http://www.math.keio.ac.jp/~matumoto/emt.html</ulink>.
+</para>
+
+<para>
+The original seeding and generation algorithms, as found in GLib
+2.0.x, can be used instead of the new ones by setting the environment
+variable <envar>G_RANDOM_VERSION</envar> to the value of '2.0'. Use
+the GLib-2.0 algorithms only if you have sequences of numbers generated
+with Glib-2.0 that you need to reproduce exactly.
+</para>
+
+</listitem>
+
+</itemizedlist>
+
+</refsect1>
+
+<refsect1>
+<title>Incompatible changes from 1.2 to 2.0</title>
+
+<para>
+The <ulink url="http://developer.gnome.org/dotplan/porting/">GNOME 2.0
+porting guide</ulink> on <ulink
+url="http://developer.gnome.org">http://developer.gnome.org</ulink>
+has some more detailed discussion of porting from 1.2 to 2.0.
+See the section on GLib.
+</para>
+
+<itemizedlist>
+
+<listitem>
+<para>
+The event loop functionality <structname>GMain</structname> has extensively
+been revised to support multiple separate main loops in separate threads.
+All sources (timeouts, idle functions, etc.) are associated with a
+<structname>GMainContext</structname>.
+</para>
+
+<para>
+Compatibility functions exist so that most application code dealing with
+the main loop will continue to work. However, code that creates new custom
+types of sources will require modification.
+</para>
+
+<para>
+The main changes here are:
+
+ <itemizedlist>
+
+ <listitem>
+ <para>
+ Sources are now exposed as <type>GSource *</type>, rather than simply as
+ numeric ids.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ New types of sources are created by structure "derivation" from
+ <structname>GSource</structname>, so the <literal>source_data</literal>
+ parameter to the <structname>GSource</structname> virtual functions has been
+ replaced with a <type>GSource *</type>.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Sources are first created, then later added to a specific
+ <structname>GMainContext</structname>.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Dispatching has been modified so both the callback and data are passed
+ in to the <function>dispatch()</function> virtual function.
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ To go along with this change, the vtable for
+ <structname>GIOChannel</structname> has changed and
+ <function>add_watch()</function> has been replaced by
+ <function>create_watch()</function>.
+</para>
+</listitem>
+
+<listitem>
+<para>
+<function>g_list_foreach()</function> and
+<function>g_slist_foreach()</function> have been changed so they
+are now safe against removal of the current item, not the next item.
+</para>
+
+<para>
+It's not recommended to mutate the list in the callback to these
+functions in any case.
+</para>
+</listitem>
+
+<listitem>
+<para>
+<structname>GDate</structname> now works in UTF-8, not in the current locale.
+If you want to use it with the encoding of the locale, you need to convert
+strings using <function>g_locale_to_utf8()</function> first.
+</para>
+</listitem>
+
+<listitem>
+<para>
+<function>g_strsplit()</function> has been fixed to:
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ include trailing empty tokens, rather than stripping them
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ split into a maximum of <literal>max_tokens</literal> tokens, rather
+ than <literal>max_tokens + 1</literal>
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ Code depending on either of these bugs will need to be fixed.
+</para>
+</listitem>
+
+<listitem>
+<para>
+Deprecated functions that got removed:
+<function>g_set_error_handler()</function>,
+<function>g_set_warning_handler()</function>,
+<function>g_set_message_handler()</function>, use
+<function>g_log_set_handler()</function> instead.
+</para>
+</listitem>
+</itemizedlist>
+
+</refsect1>
+
+</refentry>
diff --git a/trunk/docs/reference/glib/compiling.sgml b/trunk/docs/reference/glib/compiling.sgml
new file mode 100644
index 000000000..9459b60db
--- /dev/null
+++ b/trunk/docs/reference/glib/compiling.sgml
@@ -0,0 +1,72 @@
+<refentry id="glib-compiling" revision="17 Jan 2002">
+<refmeta>
+<refentrytitle>Compiling GLib Applications</refentrytitle>
+<manvolnum>3</manvolnum>
+<refmiscinfo>GLib Library</refmiscinfo>
+</refmeta>
+
+<refnamediv>
+<refname>Compiling GLib Applications</refname>
+<refpurpose>
+How to compile your GLib application
+</refpurpose>
+</refnamediv>
+
+<refsect1>
+<title>Compiling GLib Applications on UNIX</title>
+
+<para>
+To compile a GLib application, you need to tell the compiler where to
+find the GLib header files and libraries. This is done with the
+<application>pkg-config</application> utility.
+</para>
+<para>
+The following interactive shell session demonstrates how
+<application>pkg-config</application> is used (the actual output on
+your system may be different):
+<programlisting>
+$ pkg-config --cflags glib-2.0
+ -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
+$ pkg-config --libs glib-2.0
+ -L/usr/lib -lm -lglib-2.0
+</programlisting>
+</para>
+<para>
+If your application uses threads or <structname>GObject</structname>
+features, it must be compiled and linked with the options returned by the
+following <application>pkg-config</application> invocations:
+<programlisting>
+$ pkg-config --cflags --libs gthread-2.0
+$ pkg-config --cflags --libs gobject-2.0
+</programlisting>
+</para>
+<para>
+If your application uses modules, it must be compiled and linked with the options
+returned by one of the following <application>pkg-config</application> invocations:
+<programlisting>
+$ pkg-config --cflags --libs gmodule-no-export-2.0
+$ pkg-config --cflags --libs gmodule-2.0
+</programlisting>
+The difference between the two is that gmodule-2.0 adds <option>--export-dynamic</option>
+to the linker flags, which is often not needed.
+</para>
+<para>
+The simplest way to compile a program is to use the "backticks"
+feature of the shell. If you enclose a command in backticks
+(<emphasis>not single quotes</emphasis>), then its output will be
+substituted into the command line before execution. So to compile
+a GLib Hello, World, you would type the following:
+<programlisting>
+$ cc `pkg-config --cflags --libs glib-2.0` hello.c -o hello
+</programlisting>
+</para>
+
+<para>
+If you want to make sure that your program doesn't use any deprecated
+functions, you can define the preprocessor symbol G_DISABLE_DEPRECATED
+by using the command line option <literal>-DG_DISABLE_DEPRECATED=1</literal>.
+</para>
+
+</refsect1>
+
+</refentry>
diff --git a/trunk/docs/reference/glib/cross.sgml b/trunk/docs/reference/glib/cross.sgml
new file mode 100644
index 000000000..4f39f9419
--- /dev/null
+++ b/trunk/docs/reference/glib/cross.sgml
@@ -0,0 +1,187 @@
+<refentry id="glib-cross-compiling" revision="8 Apr 2003">
+<refmeta>
+<refentrytitle>Cross-compiling the GLib package</refentrytitle>
+<manvolnum>3</manvolnum>
+<refmiscinfo>GLib Library</refmiscinfo>
+</refmeta>
+
+<refnamediv>
+<refname>Cross-compiling the GLib Package</refname>
+<refpurpose>
+How to cross-compile GLib
+</refpurpose>
+</refnamediv>
+
+ <refsect1 id="cross">
+ <title>Building the Library for a different architecture</title>
+ <para>
+ Cross-compilation is the process of compiling a program or
+ library on a different architecture or operating system then
+ it will be run upon. GLib is slightly more difficult to
+ cross-compile than many packages because much of GLib is
+ about hiding differences between different systems.
+ </para>
+ <para>
+ These notes cover things specific to cross-compiling GLib;
+ for general information about cross-compilation, see the
+ <application>autoconf</application> info pages.
+ </para>
+ <para>
+ GLib tries to detect as much information as possible about
+ the target system by compiling and linking programs without
+ actually running anything; however, some information GLib
+ needs is not available this way. This information needs
+ to be provided to the configure script via a "cache file"
+ or by setting the cache variables in your environment.
+ </para>
+ <para>
+ As an example of using a cache file, to cross compile for
+ the "MingW32" Win32 runtine environment on a Linux system,
+ create a file 'win32.cache' with the following contents:
+ </para>
+ <programlisting>
+glib_cv_long_long_format=I64
+glib_cv_stack_grows=no
+ </programlisting>
+ <para>
+ Then execute the following commands:
+ </para>
+ <programlisting>
+PATH=/path/to/mingw32-compiler/bin:$PATH
+chmod a-w win32.cache # prevent configure from changing it
+./configure --cache-file=win32.cache --host=mingw32
+ </programlisting>
+ <para>
+ The complete list of cache file variables follows. Most
+ of these won't need to be set in most cases.
+ </para>
+ </refsect1>
+ <refsect1 id="cache-file-variables">
+ <title>Cache file variables</title>
+ <formalpara>
+ <title>glib_cv_long_long_format=[ll/q/I64]</title>
+
+ <para>
+ Format used by <function>printf()</function> and
+ <function>scanf()</function> for 64 bit integers. "ll" is
+ the C99 standard, and what is used by the 'trio' library
+ that GLib builds if your <function>printf()</function> is
+ insufficiently capable.
+ Doesn't need to be set if you are compiling using trio.
+ </para>
+ </formalpara>
+ <formalpara>
+ <title>glib_cv_stack_grows=[yes/no]</title>
+
+ <para>
+ Whether the stack grows up or down. Most places will want "no",
+ A few architectures, such as PA-RISC need "yes".
+ </para>
+ </formalpara>
+ <formalpara>
+ <title>glib_cv_working_bcopy=[yes/no]</title>
+
+ <para>
+ Whether your <function>bcopy()</function> can handle overlapping
+ copies. Only needs to be set if you don't have
+ <function>memmove()</function>. (Very unlikely)
+ </para>
+ </formalpara>
+ <formalpara>
+ <title>glib_cv_sane_realloc=[yes/np]</title>
+
+ <para>
+ Whether your <function>realloc()</function> conforms to ANSI C
+ and can handle <literal>NULL</literal> as the first argument.
+ Defaults to "yes" and probably doesn't need to be set.
+ </para>
+ </formalpara>
+ <formalpara>
+ <title>glib_cv_have_strlcpy=[yes/no]</title>
+
+ <para>
+ Whether you have <function>strlcpy()</function> that matches
+ OpenBSD. Defaults to "no", which is safe, since GLib uses a
+ built-in version in that case.
+ </para>
+ </formalpara>
+ <formalpara>
+ <title>glib_cv_va_val_copy=[yes/no]</title>
+
+ <para>
+ Whether <type>va_list</type> can be copied as a pointer. If set
+ to "no", then <function>memcopy()</function> will be used. Only
+ matters if you don't have <function>va_copy()</function> or
+ <function>__va_copy()</function>. (So, doesn't matter for GCC.)
+ Defaults to "yes" which is slightly more common than "no".
+ </para>
+ </formalpara>
+ <formalpara>
+ <title>glib_cv_rtldglobal_broken=[yes/no]</title>
+
+ <para>
+ Whether you have a bug found in OSF/1 v5.0. Defaults to "no".
+ </para>
+ </formalpara>
+ <formalpara>
+ <title>glib_cv_uscore=[yes/no]</title>
+
+ <para>
+ Whether an underscore needs to be prepended to symbols when
+ looking them up via <function>dlsym()</function>. Only needs to
+ be set if your system uses
+ <function>dlopen()</function>/<function>dlsym()</function>.
+ </para>
+ </formalpara>
+ <formalpara>
+ <title>ac_cv_func_posix_getpwuid_r=[yes/no]</title>
+
+ <para>
+ Whether you have a getpwuid_r function (in your C library,
+ not your thread library) that conforms to the POSIX spec.
+ (Takes a 'struct passwd **' as the final argument)
+ </para>
+ </formalpara>
+ <formalpara>
+ <title>ac_cv_func_nonposix_getpwuid_r=[yes/no]</title>
+
+ <para>
+ Whether you have some variant of <function>getpwuid_r()</function>
+ that doesn't conform to to the POSIX spec, but GLib might be able
+ to use (or might segfault.) Only needs to be set if
+ <literal>ac_cv_func_posix_getpwuid_r</literal> is not set. It's
+ safest to set this to "no".
+ </para>
+ </formalpara>
+ <formalpara>
+ <title>glib_cv_use_pid_surrogate=[yes/no]</title>
+
+ <para>
+ Whether to use a <function>setpriority()</function> on the PID of
+ the thread as a method for setting the priority of threads. This
+ only needs to be set when using POSIX threads.
+ </para>
+ </formalpara>
+ <formalpara>
+ <title>ac_cv_func_printf_unix98=[yes/no]</title>
+
+ <para>
+ Whether your <function>printf()</function> family supports Unix98
+ style <literal>%N$</literal> positional parameters. Defaults to
+ "no".
+ </para>
+ </formalpara>
+ <formalpara>
+ <title>ac_cv_func_vsnprintf_c99=[yes/no]</title>
+
+ <para>
+ Whether you have a <function>vsnprintf()</function> with C99
+ semantics. (C99 semantics means returning the number of bytes
+ that would have been written had the output buffer had enough
+ space.) Defaults to "no".
+ </para>
+ </formalpara>
+
+ </refsect1>
+
+</refentry>
diff --git a/trunk/docs/reference/glib/file-name-encodings.png b/trunk/docs/reference/glib/file-name-encodings.png
new file mode 100644
index 000000000..7adbcea39
--- /dev/null
+++ b/trunk/docs/reference/glib/file-name-encodings.png
Binary files differ
diff --git a/trunk/docs/reference/glib/file-name-encodings.sxd b/trunk/docs/reference/glib/file-name-encodings.sxd
new file mode 100644
index 000000000..46750dc17
--- /dev/null
+++ b/trunk/docs/reference/glib/file-name-encodings.sxd
Binary files differ
diff --git a/trunk/docs/reference/glib/glib-docs.sgml b/trunk/docs/reference/glib/glib-docs.sgml
new file mode 100644
index 000000000..1b12ed5b5
--- /dev/null
+++ b/trunk/docs/reference/glib/glib-docs.sgml
@@ -0,0 +1,223 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
+<!ENTITY glib-Basic-Types SYSTEM "xml/types.xml">
+<!ENTITY glib-Limits-of-Basic-Types SYSTEM "xml/limits.xml">
+<!ENTITY glib-Standard-Macros SYSTEM "xml/macros.xml">
+<!ENTITY glib-Type-Conversion-Macros SYSTEM "xml/type_conversion.xml">
+<!ENTITY glib-Byte-Order-Macros SYSTEM "xml/byte_order.xml">
+<!ENTITY glib-Numerical-Definitions SYSTEM "xml/numerical.xml">
+<!ENTITY glib-Miscellaneous-Macros SYSTEM "xml/macros_misc.xml">
+<!ENTITY glib-Atomic-Operations SYSTEM "xml/atomic_operations.xml">
+<!ENTITY glib-Memory-Allocation SYSTEM "xml/memory.xml">
+<!ENTITY glib-Error-Reporting SYSTEM "xml/error_reporting.xml">
+<!ENTITY glib-Warnings-and-Assertions SYSTEM "xml/warnings.xml">
+<!ENTITY glib-Message-Logging SYSTEM "xml/messages.xml">
+<!ENTITY glib-Pattern-Matching SYSTEM "xml/patterns.xml">
+<!ENTITY glib-Timers SYSTEM "xml/timers.xml">
+<!ENTITY glib-String-Utility-Functions SYSTEM "xml/string_utils.xml">
+<!ENTITY glib-Character-Set-Conversion SYSTEM "xml/conversions.xml">
+<!ENTITY glib-Unicode-Manipulation SYSTEM "xml/unicode.xml">
+<!ENTITY glib-Random-Numbers SYSTEM "xml/random_numbers.xml">
+<!ENTITY glib-Miscellaneous-Utility-Functions SYSTEM "xml/misc_utils.xml">
+<!ENTITY glib-Date-and-Time-Functions SYSTEM "xml/date.xml">
+<!ENTITY glib-The-Main-Event-Loop SYSTEM "xml/main.xml">
+<!ENTITY glib-Threads SYSTEM "xml/threads.xml">
+<!ENTITY glib-Thread-Pools SYSTEM "xml/thread_pools.xml">
+<!ENTITY glib-Async-Queues SYSTEM "xml/async_queues.xml">
+<!ENTITY glib-IO-Channels SYSTEM "xml/iochannels.xml">
+<!ENTITY glib-Hook-Functions SYSTEM "xml/hooks.xml">
+<!ENTITY glib-Lexical-Scanner SYSTEM "xml/scanner.xml">
+<!ENTITY glib-Dynamic-Loading-of-Modules SYSTEM "xml/modules.xml">
+<!ENTITY glib-Automatic-String-Completion SYSTEM "xml/completion.xml">
+<!ENTITY glib-Windows-Compatibility-Functions SYSTEM "xml/windows.xml">
+<!ENTITY glib-Memory-Chunks SYSTEM "xml/memory_chunks.xml">
+<!ENTITY glib-Memory-Slices SYSTEM "xml/memory_slices.xml">
+<!ENTITY glib-Doubly-Linked-Lists SYSTEM "xml/linked_lists_double.xml">
+<!ENTITY glib-Singly-Linked-Lists SYSTEM "xml/linked_lists_single.xml">
+<!ENTITY glib-Double-ended-Queues SYSTEM "xml/queue.xml">
+<!ENTITY glib-Sequences SYSTEM "xml/sequence.xml">
+<!ENTITY glib-Trash-Stacks SYSTEM "xml/trash_stack.xml">
+<!ENTITY glib-Hash-Tables SYSTEM "xml/hash_tables.xml">
+<!ENTITY glib-Strings SYSTEM "xml/strings.xml">
+<!ENTITY glib-String-Chunks SYSTEM "xml/string_chunks.xml">
+<!ENTITY glib-Arrays SYSTEM "xml/arrays.xml">
+<!ENTITY glib-Pointer-Arrays SYSTEM "xml/arrays_pointer.xml">
+<!ENTITY glib-Byte-Arrays SYSTEM "xml/arrays_byte.xml">
+<!ENTITY glib-Balanced-Binary-Trees SYSTEM "xml/trees-binary.xml">
+<!ENTITY glib-N-ary-Trees SYSTEM "xml/trees-nary.xml">
+<!ENTITY glib-Quarks SYSTEM "xml/quarks.xml">
+<!ENTITY glib-Keyed-Data-Lists SYSTEM "xml/datalist.xml">
+<!ENTITY glib-Datasets SYSTEM "xml/datasets.xml">
+<!ENTITY glib-Relations-and-Tuples SYSTEM "xml/relations.xml">
+<!ENTITY glib-Caches SYSTEM "xml/caches.xml">
+<!ENTITY glib-Memory-Allocators SYSTEM "xml/allocators.xml">
+<!ENTITY glib-Spawn SYSTEM "xml/spawn.xml">
+<!ENTITY glib-Fileutils SYSTEM "xml/fileutils.xml">
+<!ENTITY glib-Shell SYSTEM "xml/shell.xml">
+<!ENTITY glib-Option SYSTEM "xml/option.xml">
+<!ENTITY glib-Markup SYSTEM "xml/markup.xml">
+<!ENTITY glib-Keyfile SYSTEM "xml/keyfile.xml">
+<!ENTITY glib-Bookmarkfile SYSTEM "xml/bookmarkfile.xml">
+<!ENTITY glib-Base64 SYSTEM "xml/base64.xml">
+<!ENTITY glib-i18n SYSTEM "xml/i18n.xml">
+<!ENTITY glib-Regex SYSTEM "xml/gregex.xml">
+<!ENTITY glib-Version SYSTEM "xml/version.xml">
+
+<!ENTITY glib-Compiling SYSTEM "compiling.sgml">
+<!ENTITY glib-Building SYSTEM "building.sgml">
+<!ENTITY glib-Cross SYSTEM "cross.sgml">
+<!ENTITY glib-Running SYSTEM "running.sgml">
+<!ENTITY glib-Resources SYSTEM "resources.sgml">
+<!ENTITY glib-Changes SYSTEM "changes.sgml">
+<!ENTITY glib-RegexSyntax SYSTEM "regex-syntax.sgml">
+
+<!ENTITY glib-gettextize SYSTEM "glib-gettextize.xml">
+
+<!ENTITY version SYSTEM "version.xml">
+]>
+<book id="index">
+ <bookinfo>
+ <title>GLib Reference Manual</title>
+ <releaseinfo>for GLib &version;</releaseinfo>
+ </bookinfo>
+
+ <chapter id="glib">
+ <title>GLib Overview</title>
+ <para>
+GLib is a general-purpose utility library, which provides many useful data
+types, macros, type conversions, string utilities, file utilities, a main
+loop abstraction, and so on. It works on many UNIX-like platforms, Windows,
+OS/2 and BeOS. GLib is released under the GNU Library General Public License
+(GNU LGPL).
+ </para>
+ <para>
+The general policy of GLib is that all functions are invisibly threadsafe with the
+exception of data structure manipulation functions, where, if you have two threads
+manipulating the <emphasis>same</emphasis> data structure, they must use a lock to
+synchronize their operation.
+ </para>
+
+ &glib-Building;
+ &glib-Cross;
+ &glib-Compiling;
+ &glib-Running;
+ &glib-Changes;
+ &glib-RegexSyntax;
+ &glib-Resources;
+
+ </chapter>
+
+ <chapter id="glib-fundamentals">
+ <title>GLib Fundamentals</title>
+ &glib-Version;
+ &glib-Basic-Types;
+ &glib-Limits-of-Basic-Types;
+ &glib-Standard-Macros;
+ &glib-Type-Conversion-Macros;
+ &glib-Byte-Order-Macros;
+ &glib-Numerical-Definitions;
+ &glib-Miscellaneous-Macros;
+ &glib-Atomic-Operations;
+ </chapter>
+
+ <chapter id="glib-core">
+ <title>GLib Core Application Support</title>
+ &glib-The-Main-Event-Loop;
+ &glib-Threads;
+ &glib-Thread-Pools;
+ &glib-Async-Queues;
+ &glib-Dynamic-Loading-of-Modules;
+ &glib-Memory-Allocation;
+ &glib-IO-Channels;
+ &glib-Error-Reporting;
+ &glib-Warnings-and-Assertions;
+ &glib-Message-Logging;
+ </chapter>
+
+ <chapter id="glib-utilities">
+ <title>GLib Utilities</title>
+ &glib-String-Utility-Functions;
+ &glib-Character-Set-Conversion;
+ &glib-Unicode-Manipulation;
+ &glib-Base64;
+ &glib-i18n;
+ &glib-Date-and-Time-Functions;
+ &glib-Random-Numbers;
+ &glib-Hook-Functions;
+ &glib-Miscellaneous-Utility-Functions;
+ &glib-Lexical-Scanner;
+ &glib-Automatic-String-Completion;
+ &glib-Timers;
+ &glib-Spawn;
+ &glib-Fileutils;
+ &glib-Shell;
+ &glib-Option;
+ &glib-Pattern-Matching;
+ &glib-Regex;
+ &glib-Markup;
+ &glib-Keyfile;
+ &glib-Bookmarkfile;
+ &glib-Windows-Compatibility-Functions;
+ </chapter>
+
+ <chapter id="glib-data-types">
+ <title>GLib Data Types</title>
+ &glib-Memory-Slices;
+ &glib-Memory-Chunks;
+ &glib-Doubly-Linked-Lists;
+ &glib-Singly-Linked-Lists;
+ &glib-Double-ended-Queues;
+ &glib-Sequences;
+ &glib-Trash-Stacks;
+ &glib-Hash-Tables;
+ &glib-Strings;
+ &glib-String-Chunks;
+ &glib-Arrays;
+ &glib-Pointer-Arrays;
+ &glib-Byte-Arrays;
+ &glib-Balanced-Binary-Trees;
+ &glib-N-ary-Trees;
+ &glib-Quarks;
+ &glib-Keyed-Data-Lists;
+ &glib-Datasets;
+ &glib-Relations-and-Tuples;
+ &glib-Caches;
+ &glib-Memory-Allocators;
+ </chapter>
+
+ <chapter id="tools">
+ <title>GLib Tools</title>
+
+ &glib-gettextize;
+ </chapter>
+
+ <index>
+ <title>Index</title>
+ </index>
+ <index role="deprecated">
+ <title>Index of deprecated symbols</title>
+ </index>
+ <index role="2.2">
+ <title>Index of new symbols in 2.2</title>
+ </index>
+ <index role="2.4">
+ <title>Index of new symbols in 2.4</title>
+ </index>
+ <index role="2.6">
+ <title>Index of new symbols in 2.6</title>
+ </index>
+ <index role="2.8">
+ <title>Index of new symbols in 2.8</title>
+ </index>
+ <index role="2.10">
+ <title>Index of new symbols in 2.10</title>
+ </index>
+ <index role="2.12">
+ <title>Index of new symbols in 2.12</title>
+ </index>
+ <index role="2.14">
+ <title>Index of new symbols in 2.14</title>
+ </index>
+
+</book>
diff --git a/trunk/docs/reference/glib/glib-gettextize.1 b/trunk/docs/reference/glib/glib-gettextize.1
new file mode 100644
index 000000000..f8bfb9e74
--- /dev/null
+++ b/trunk/docs/reference/glib/glib-gettextize.1
@@ -0,0 +1,51 @@
+.\" ** You probably do not want to edit this file directly **
+.\" It was generated using the DocBook XSL Stylesheets (version 1.69.0).
+.\" Instead of manually editing it, you probably should edit the DocBook XML
+.\" source for it and then use the DocBook XSL Stylesheets to regenerate it.
+.TH "GLIB\-GETTEXTIZE" "1" "08/15/2005" "" ""
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+glib\-gettextize \- gettext internationalization utility
+.SH "SYNOPSIS"
+.HP 16
+\fBglib\-gettextize\fR [option...] [directory]
+.SH "DESCRIPTION"
+.PP
+\fBglib\-gettextize\fR
+helps to prepare a source package for being internationalized through
+gettext. It is a variant of the
+\fBgettextize\fR
+that ships with
+gettext.
+.PP
+\fBglib\-gettextize\fR
+differs from
+\fBgettextize\fR
+in that it doesn't create an
+\fIintl/\fR
+subdirectory and doesn't modify
+\fIpo/ChangeLog\fR
+(note that newer versions of
+\fBgettextize\fR
+behave like this when called with the
+\fB\-\-no\-changelog\fR
+option).
+.SS "Options"
+.TP
+\fB\-\-help\fR
+print help and exit
+.TP
+\fB\-\-version\fR
+print version information and exit
+.TP
+\fB\-c\fR, \fB\-\-copy\fR
+copy files instead of making symlinks
+.TP
+\fB\-f\fR, \fB\-\-force\fR
+force writing of new files even if old ones exist
+.SH "SEE ALSO"
+.PP
+ \fBgettextize\fR(1)
diff --git a/trunk/docs/reference/glib/glib-gettextize.xml b/trunk/docs/reference/glib/glib-gettextize.xml
new file mode 100644
index 000000000..c92dc571e
--- /dev/null
+++ b/trunk/docs/reference/glib/glib-gettextize.xml
@@ -0,0 +1,76 @@
+<refentry id="glib-gettextize">
+
+<refmeta>
+<refentrytitle>glib-gettextize</refentrytitle>
+<manvolnum>1</manvolnum>
+</refmeta>
+
+<refnamediv>
+<refname>glib-gettextize</refname>
+<refpurpose>gettext internationalization utility</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<cmdsynopsis>
+<command>glib-gettextize</command>
+<arg choice="opt" rep="repeat">option</arg>
+<arg choice="opt">directory</arg>
+</cmdsynopsis>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+<para><command>glib-gettextize</command> helps to prepare a source package for being
+internationalized through <application>gettext</application>.
+It is a variant of the <command>gettextize</command> that ships with
+<application>gettext</application>.
+</para>
+
+<para><command>glib-gettextize</command> differs
+from <command>gettextize</command> in that it doesn't create an
+<filename>intl/</filename> subdirectory and doesn't modify
+<filename>po/ChangeLog</filename> (note that newer versions of
+<command>gettextize</command> behave like this when called with the
+<option>--no-changelog</option> option).
+</para>
+<refsect2><title>Options</title>
+<variablelist>
+
+<varlistentry>
+<term><option>--help</option></term>
+<listitem><para>
+print help and exit
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--version</option></term>
+<listitem><para>
+print version information and exit
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>-c</option>, <option>--copy</option></term>
+<listitem><para>
+copy files instead of making symlinks
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>-f</option>, <option>--force</option></term>
+<listitem><para>
+force writing of new files even if old ones exist
+</para></listitem>
+</varlistentry>
+</variablelist>
+</refsect2>
+</refsect1>
+
+<refsect1><title>See also</title>
+<para>
+<command>gettextize</command>(1)
+</para>
+</refsect1>
+</refentry>
+
+
diff --git a/trunk/docs/reference/glib/glib-overrides.txt b/trunk/docs/reference/glib/glib-overrides.txt
new file mode 100644
index 000000000..7dd58e811
--- /dev/null
+++ b/trunk/docs/reference/glib/glib-overrides.txt
@@ -0,0 +1,307 @@
+# This file makes most of the thread related macros look like
+# functions, which they really were, if possible easy.
+
+# default thread implementation
+
+<MACRO>
+<NAME>G_THREADS_IMPL_POSIX</NAME>
+#define G_THREADS_IMPL_POSIX
+</MACRO>
+
+<MACRO>
+<NAME>G_THREADS_IMPL_NONE</NAME>
+#define G_THREADS_IMPL_NONE
+</MACRO>
+
+# threads supported?
+
+<FUNCTION>
+<NAME>g_thread_supported</NAME>
+<RETURNS>gboolean</RETURNS>
+</FUNCTION>
+
+# GMutex
+
+<FUNCTION>
+<NAME>g_mutex_new</NAME>
+<RETURNS>GMutex *</RETURNS>
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_mutex_lock</NAME>
+<RETURNS>void</RETURNS>
+GMutex *mutex
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_mutex_trylock</NAME>
+<RETURNS>gboolean</RETURNS>
+GMutex *mutex
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_mutex_unlock</NAME>
+<RETURNS>void</RETURNS>
+GMutex *mutex
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_mutex_free</NAME>
+<RETURNS>void</RETURNS>
+GMutex *mutex
+</FUNCTION>
+
+# GStaticMutex
+
+<STRUCT>
+<NAME>GStaticMutex</NAME>
+</STRUCT>
+
+<MACRO>
+<NAME>G_STATIC_MUTEX_INIT</NAME>
+#define G_STATIC_MUTEX_INIT
+</MACRO>
+
+<FUNCTION>
+<NAME>g_static_mutex_lock</NAME>
+<RETURNS>void</RETURNS>
+GStaticMutex* mutex
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_static_mutex_trylock</NAME>
+<RETURNS>gboolean</RETURNS>
+GStaticMutex* mutex
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_static_mutex_unlock</NAME>
+<RETURNS>void</RETURNS>
+GStaticMutex* mutex
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_static_mutex_get_mutex</NAME>
+<RETURNS>GMutex *</RETURNS>
+GStaticMutex* mutex
+</FUNCTION>
+
+# GThread
+
+<FUNCTION>
+<NAME>g_thread_yield</NAME>
+<RETURNS>void</RETURNS>
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_thread_create</NAME>
+<RETURNS>GThread *</RETURNS>
+GThreadFunc func
+gpointer data,
+gboolean joinable,
+GError **error
+</FUNCTION>
+
+# G_LOCK_* macros
+
+<MACRO>
+<NAME>G_LOCK_DEFINE</NAME>
+#define G_LOCK_DEFINE(name)
+</MACRO>
+
+<MACRO>
+<NAME>G_LOCK_DEFINE_STATIC</NAME>
+#define G_LOCK_DEFINE_STATIC(name)
+</MACRO>
+
+<MACRO>
+<NAME>G_LOCK_EXTERN</NAME>
+#define G_LOCK_EXTERN(name)
+</MACRO>
+
+<MACRO>
+<NAME>G_LOCK</NAME>
+#define G_LOCK(name)
+</MACRO>
+
+<MACRO>
+<NAME>G_UNLOCK</NAME>
+#define G_UNLOCK(name)
+</MACRO>
+
+<MACRO>
+<NAME>G_TRYLOCK</NAME>
+#define G_TRYLOCK(name)
+</MACRO>
+
+# GCond
+
+<FUNCTION>
+<NAME>g_cond_new</NAME>
+<RETURNS>GCond*</RETURNS>
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_cond_signal</NAME>
+<RETURNS>void</RETURNS>
+GCond *cond
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_cond_broadcast</NAME>
+<RETURNS>void</RETURNS>
+GCond *cond
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_cond_wait</NAME>
+<RETURNS>void</RETURNS>
+GCond *cond, GMutex *mutex
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_cond_timed_wait</NAME>
+<RETURNS>gboolean</RETURNS>
+GCond *cond, GMutex *mutex, GTimeVal *abs_time
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_cond_free</NAME>
+<RETURNS>void</RETURNS>
+GCond *cond
+</FUNCTION>
+
+# GPrivate
+
+<FUNCTION>
+<NAME>g_private_new</NAME>
+<RETURNS>GPrivate*</RETURNS>
+GDestroyNotify destructor
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_private_get</NAME>
+<RETURNS>gpointer</RETURNS>
+GPrivate *private_key
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_private_set</NAME>
+<RETURNS>void</RETURNS>
+GPrivate *private_key, gpointer data
+</FUNCTION>
+
+# GStaticPrivate
+
+<MACRO>
+<NAME>G_STATIC_PRIVATE_INIT</NAME>
+#define G_STATIC_PRIVATE_INIT
+</MACRO>
+
+# Definitions for different operating systems
+
+<MACRO>
+<NAME>G_OS_UNIX</NAME>
+#define G_OS_UNIX
+</MACRO>
+
+<MACRO>
+<NAME>G_OS_WIN32</NAME>
+#define G_OS_WIN32
+</MACRO>
+
+<MACRO>
+<NAME>G_OS_BEOS</NAME>
+#define G_OS_BEOS
+</MACRO>
+
+# g_ascii_isxxx
+
+<FUNCTION>
+<NAME>g_ascii_isalnum</NAME>
+<RETURNS>gboolean</RETURNS>
+gchar c
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_ascii_isalpha</NAME>
+<RETURNS>gboolean</RETURNS>
+gchar c
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_ascii_iscntrl</NAME>
+<RETURNS>gboolean</RETURNS>
+gchar c
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_ascii_isdigit</NAME>
+<RETURNS>gboolean</RETURNS>
+gchar c
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_ascii_isgraph</NAME>
+<RETURNS>gboolean</RETURNS>
+gchar c
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_ascii_islower</NAME>
+<RETURNS>gboolean</RETURNS>
+gchar c
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_ascii_isprint</NAME>
+<RETURNS>gboolean</RETURNS>
+gchar c
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_ascii_ispunct</NAME>
+<RETURNS>gboolean</RETURNS>
+gchar c
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_ascii_isspace</NAME>
+<RETURNS>gboolean</RETURNS>
+gchar c
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_ascii_isupper</NAME>
+<RETURNS>gboolean</RETURNS>
+gchar c
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_ascii_isxdigit</NAME>
+<RETURNS>gboolean</RETURNS>
+gchar c
+</FUNCTION>
+
+# g_atomic
+
+<FUNCTION>
+<NAME>g_atomic_int_inc</NAME>
+<RETURNS>void</RETURNS>
+gint *atomic
+</FUNCTION>
+
+<FUNCTION>
+<NAME>g_atomic_int_dec_and_test</NAME>
+<RETURNS>gboolean</RETURNS>
+gint *atomic
+</FUNCTION>
+
+<STRUCT>
+<NAME>GIConv</NAME>
+</STRUCT>
+
+<MACRO>
+<NAME>G_VA_COPY</NAME>
+#define G_VA_COPY(ap1,ap2)
+</MACRO>
diff --git a/trunk/docs/reference/glib/glib-sections.txt b/trunk/docs/reference/glib/glib-sections.txt
new file mode 100644
index 000000000..991290270
--- /dev/null
+++ b/trunk/docs/reference/glib/glib-sections.txt
@@ -0,0 +1,2479 @@
+<INCLUDE>glib.h</INCLUDE>
+
+<SECTION>
+<TITLE>Basic Types</TITLE>
+<FILE>types</FILE>
+gboolean
+gpointer
+gconstpointer
+gchar
+guchar
+
+<SUBSECTION>
+gint
+guint
+gshort
+gushort
+glong
+gulong
+
+<SUBSECTION>
+gint8
+guint8
+gint16
+guint16
+gint32
+guint32
+
+<SUBSECTION>
+G_HAVE_GINT64
+gint64
+guint64
+G_GINT64_CONSTANT
+G_GUINT64_CONSTANT
+
+<SUBSECTION>
+gfloat
+gdouble
+
+<SUBSECTION>
+gsize
+gssize
+
+<SUBSECTION Private>
+GLIB_SIZEOF_VOID_P
+GLIB_SIZEOF_LONG
+GLIB_SIZEOF_SIZE_T
+</SECTION>
+
+<SECTION>
+<TITLE>Limits of Basic Types</TITLE>
+<FILE>limits</FILE>
+G_MININT
+G_MAXINT
+G_MAXUINT
+
+<SUBSECTION>
+G_MINSHORT
+G_MAXSHORT
+G_MAXUSHORT
+
+<SUBSECTION>
+G_MINLONG
+G_MAXLONG
+G_MAXULONG
+
+<SUBSECTION>
+G_MININT8
+G_MAXINT8
+G_MAXUINT8
+
+<SUBSECTION>
+G_MININT16
+G_MAXINT16
+G_MAXUINT16
+
+<SUBSECTION>
+G_MININT32
+G_MAXINT32
+G_MAXUINT32
+
+<SUBSECTION>
+G_MININT64
+G_MAXINT64
+G_MAXUINT64
+
+<SUBSECTION>
+G_MAXSIZE
+
+<SUBSECTION>
+G_MINFLOAT
+G_MAXFLOAT
+
+<SUBSECTION>
+G_MINDOUBLE
+G_MAXDOUBLE
+</SECTION>
+
+<SECTION>
+<TITLE>Version Information</TITLE>
+<FILE>version</FILE>
+glib_major_version
+glib_minor_version
+glib_micro_version
+glib_binary_age
+glib_interface_age
+glib_check_version
+
+<SUBSECTION>
+GLIB_MAJOR_VERSION
+GLIB_MINOR_VERSION
+GLIB_MICRO_VERSION
+GLIB_CHECK_VERSION
+</SECTION>
+
+<SECTION>
+<TITLE>Standard Macros</TITLE>
+<FILE>macros</FILE>
+<SUBSECTION>
+G_OS_WIN32
+G_OS_BEOS
+G_OS_UNIX
+
+<SUBSECTION>
+G_DIR_SEPARATOR
+G_DIR_SEPARATOR_S
+G_IS_DIR_SEPARATOR
+G_SEARCHPATH_SEPARATOR
+G_SEARCHPATH_SEPARATOR_S
+
+<SUBSECTION>
+TRUE
+FALSE
+
+<SUBSECTION>
+NULL
+
+<SUBSECTION>
+MIN
+MAX
+
+<SUBSECTION>
+ABS
+CLAMP
+
+<SUBSECTION>
+G_STRUCT_MEMBER
+G_STRUCT_MEMBER_P
+G_STRUCT_OFFSET
+
+<SUBSECTION>
+G_MEM_ALIGN
+
+<SUBSECTION>
+G_CONST_RETURN
+
+</SECTION>
+
+<SECTION>
+<TITLE>Type Conversion Macros</TITLE>
+<FILE>type_conversion</FILE>
+GINT_TO_POINTER
+GPOINTER_TO_INT
+
+<SUBSECTION>
+GUINT_TO_POINTER
+GPOINTER_TO_UINT
+GSIZE_TO_POINTER
+GPOINTER_TO_SIZE
+</SECTION>
+
+<SECTION>
+<TITLE>Byte Order Macros</TITLE>
+<FILE>byte_order</FILE>
+G_BYTE_ORDER
+G_LITTLE_ENDIAN
+G_BIG_ENDIAN
+G_PDP_ENDIAN
+
+<SUBSECTION>
+g_htonl
+g_htons
+g_ntohl
+g_ntohs
+
+<SUBSECTION>
+GINT_FROM_BE
+GINT_FROM_LE
+GINT_TO_BE
+GINT_TO_LE
+
+<SUBSECTION>
+GUINT_FROM_BE
+GUINT_FROM_LE
+GUINT_TO_BE
+GUINT_TO_LE
+
+<SUBSECTION>
+GLONG_FROM_BE
+GLONG_FROM_LE
+GLONG_TO_BE
+GLONG_TO_LE
+
+<SUBSECTION>
+GULONG_FROM_BE
+GULONG_FROM_LE
+GULONG_TO_BE
+GULONG_TO_LE
+
+<SUBSECTION>
+GINT16_FROM_BE
+GINT16_FROM_LE
+GINT16_TO_BE
+GINT16_TO_LE
+
+<SUBSECTION>
+GUINT16_FROM_BE
+GUINT16_FROM_LE
+GUINT16_TO_BE
+GUINT16_TO_LE
+
+<SUBSECTION>
+GINT32_FROM_BE
+GINT32_FROM_LE
+GINT32_TO_BE
+GINT32_TO_LE
+
+<SUBSECTION>
+GUINT32_FROM_BE
+GUINT32_FROM_LE
+GUINT32_TO_BE
+GUINT32_TO_LE
+
+<SUBSECTION>
+GINT64_FROM_BE
+GINT64_FROM_LE
+GINT64_TO_BE
+GINT64_TO_LE
+
+<SUBSECTION>
+GUINT64_FROM_BE
+GUINT64_FROM_LE
+GUINT64_TO_BE
+GUINT64_TO_LE
+
+<SUBSECTION>
+GUINT16_SWAP_BE_PDP
+GUINT16_SWAP_LE_BE
+GUINT16_SWAP_LE_PDP
+
+<SUBSECTION>
+GUINT32_SWAP_BE_PDP
+GUINT32_SWAP_LE_BE
+GUINT32_SWAP_LE_PDP
+
+<SUBSECTION>
+GUINT64_SWAP_LE_BE
+
+<SUBSECTION Private>
+GUINT16_SWAP_LE_BE_CONSTANT
+GUINT32_SWAP_LE_BE_CONSTANT
+GUINT64_SWAP_LE_BE_CONSTANT
+GUINT16_SWAP_LE_BE_IA32
+GUINT32_SWAP_LE_BE_IA32
+GUINT64_SWAP_LE_BE_IA32
+GUINT16_SWAP_LE_BE_IA64
+GUINT32_SWAP_LE_BE_IA64
+GUINT64_SWAP_LE_BE_IA64
+GUINT32_SWAP_LE_BE_X86_64
+GUINT64_SWAP_LE_BE_X86_64
+
+</SECTION>
+
+<SECTION>
+<TITLE>Numerical Definitions</TITLE>
+<FILE>numerical</FILE>
+G_IEEE754_FLOAT_BIAS
+G_IEEE754_DOUBLE_BIAS
+GFloatIEEE754
+GDoubleIEEE754
+
+<SUBSECTION>
+<SUBSECTION>
+G_E
+G_LN2
+G_LN10
+G_PI
+G_PI_2
+G_PI_4
+G_SQRT2
+G_LOG_2_BASE_10
+</SECTION>
+
+<SECTION>
+<TITLE>Miscellaneous Macros</TITLE>
+<FILE>macros_misc</FILE>
+G_INLINE_FUNC
+
+<SUBSECTION>
+G_STMT_START
+G_STMT_END
+
+<SUBSECTION>
+G_BEGIN_DECLS
+G_END_DECLS
+
+<SUBSECTION>
+G_N_ELEMENTS
+
+<SUBSECTION>
+G_VA_COPY
+
+<SUBSECTION>
+G_STRINGIFY
+
+<SUBSECTION>
+G_GNUC_EXTENSION
+G_GNUC_CONST
+G_GNUC_PURE
+G_GNUC_MALLOC
+G_GNUC_DEPRECATED
+G_GNUC_NORETURN
+G_GNUC_UNUSED
+G_GNUC_PRINTF
+G_GNUC_SCANF
+G_GNUC_FORMAT
+G_GNUC_NULL_TERMINATED
+G_GNUC_WARN_UNUSED_RESULT
+G_GNUC_FUNCTION
+G_GNUC_PRETTY_FUNCTION
+G_GNUC_NO_INSTRUMENT
+G_HAVE_GNUC_VISIBILITY
+G_GNUC_INTERNAL
+G_GNUC_MAY_ALIAS
+
+<SUBSECTION>
+G_LIKELY
+G_UNLIKELY
+
+<SUBSECTION>
+G_STRLOC
+G_STRFUNC
+
+<SUBSECTION>
+G_GINT16_MODIFIER
+G_GINT16_FORMAT
+G_GUINT16_FORMAT
+G_GINT32_MODIFIER
+G_GINT32_FORMAT
+G_GUINT32_FORMAT
+G_GINT64_MODIFIER
+G_GINT64_FORMAT
+G_GUINT64_FORMAT
+G_GSIZE_MODIFIER
+G_GSIZE_FORMAT
+G_GSSIZE_FORMAT
+
+<SUBSECTION Private>
+GLIB_VAR
+G_STRINGIFY_ARG
+G_HAVE_INLINE
+G_CAN_INLINE
+inline
+G_HAVE___INLINE
+G_HAVE___INLINE__
+G_HAVE_GNUC_VARARGS
+G_HAVE_ISO_VARARGS
+G_HAVE_GROWING_STACK
+</SECTION>
+
+<SECTION>
+<TITLE>Error Reporting</TITLE>
+<FILE>error_reporting</FILE>
+GError
+g_error_new
+g_error_new_literal
+g_error_free
+g_error_copy
+g_error_matches
+g_set_error
+g_propagate_error
+g_clear_error
+</SECTION>
+
+<SECTION>
+<TITLE>The Main Event Loop</TITLE>
+<FILE>main</FILE>
+GMainLoop
+g_main_loop_new
+g_main_loop_ref
+g_main_loop_unref
+g_main_loop_run
+g_main_loop_quit
+g_main_loop_is_running
+g_main_loop_get_context
+g_main_new
+g_main_destroy
+g_main_run
+g_main_quit
+g_main_is_running
+
+<SUBSECTION>
+G_PRIORITY_HIGH
+G_PRIORITY_DEFAULT
+G_PRIORITY_HIGH_IDLE
+G_PRIORITY_DEFAULT_IDLE
+G_PRIORITY_LOW
+
+<SUBSECTION>
+GMainContext
+g_main_context_new
+g_main_context_ref
+g_main_context_unref
+g_main_context_default
+g_main_context_iteration
+g_main_iteration
+g_main_context_pending
+g_main_pending
+g_main_context_find_source_by_id
+g_main_context_find_source_by_user_data
+g_main_context_find_source_by_funcs_user_data
+g_main_context_wakeup
+g_main_context_acquire
+g_main_context_release
+g_main_context_is_owner
+g_main_context_wait
+g_main_context_prepare
+g_main_context_query
+g_main_context_check
+g_main_context_dispatch
+g_main_context_set_poll_func
+g_main_context_get_poll_func
+GPollFunc
+g_main_context_add_poll
+g_main_context_remove_poll
+g_main_depth
+g_main_current_source
+g_main_set_poll_func
+
+<SUBSECTION>
+g_timeout_source_new
+g_timeout_source_new_seconds
+g_timeout_add
+g_timeout_add_full
+g_timeout_add_seconds
+
+<SUBSECTION>
+g_idle_source_new
+g_idle_add
+g_idle_add_full
+g_idle_remove_by_data
+
+<SUBSECTION>
+GPid
+GChildWatchFunc
+g_child_watch_source_new
+g_child_watch_add
+g_child_watch_add_full
+<SUBSECTION>
+GPollFD
+
+<SUBSECTION>
+GSource
+GSourceDummyMarshal
+GSourceFuncs
+GSourceCallbackFuncs
+g_source_new
+g_source_ref
+g_source_unref
+g_source_set_funcs
+g_source_attach
+g_source_destroy
+g_source_is_destroyed
+g_source_set_priority
+g_source_get_priority
+g_source_set_can_recurse
+g_source_get_can_recurse
+g_source_get_id
+g_source_get_context
+g_source_set_callback
+GSourceFunc
+g_source_set_callback_indirect
+g_source_add_poll
+g_source_remove_poll
+g_source_get_current_time
+g_source_remove
+g_source_remove_by_funcs_user_data
+g_source_remove_by_user_data
+
+<SUBSECTION Private>
+GLIB_HAVE_SYS_POLL_H
+GLIB_HAVE_ALLOCA_H
+alloca
+GLIB_SYSDEF_POLLERR
+GLIB_SYSDEF_POLLHUP
+GLIB_SYSDEF_POLLIN
+GLIB_SYSDEF_POLLNVAL
+GLIB_SYSDEF_POLLOUT
+GLIB_SYSDEF_POLLPRI
+G_WIN32_MSG_HANDLE
+g_idle_funcs
+g_timeout_funcs
+g_child_watch_funcs
+</SECTION>
+
+<SECTION>
+<TITLE>Threads</TITLE>
+<FILE>threads</FILE>
+<SUBSECTION>
+G_THREADS_ENABLED
+G_THREADS_IMPL_POSIX
+G_THREADS_IMPL_NONE
+
+<SUBSECTION>
+G_THREAD_ERROR
+GThreadError
+
+<SUBSECTION>
+GThreadFunctions
+g_thread_init
+g_thread_supported
+
+<SUBSECTION>
+GThreadFunc
+GThreadPriority
+GThread
+g_thread_create
+g_thread_create_full
+g_thread_self
+g_thread_join
+g_thread_set_priority
+g_thread_yield
+g_thread_exit
+g_thread_foreach
+
+<SUBSECTION>
+GMutex
+g_mutex_new
+g_mutex_lock
+g_mutex_trylock
+g_mutex_unlock
+g_mutex_free
+
+<SUBSECTION>
+GStaticMutex
+G_STATIC_MUTEX_INIT
+g_static_mutex_init
+g_static_mutex_lock
+g_static_mutex_trylock
+g_static_mutex_unlock
+g_static_mutex_get_mutex
+g_static_mutex_free
+
+<SUBSECTION>
+G_LOCK_DEFINE
+G_LOCK_DEFINE_STATIC
+G_LOCK_EXTERN
+G_LOCK
+G_TRYLOCK
+G_UNLOCK
+
+<SUBSECTION>
+GStaticRecMutex
+G_STATIC_REC_MUTEX_INIT
+g_static_rec_mutex_init
+g_static_rec_mutex_lock
+g_static_rec_mutex_trylock
+g_static_rec_mutex_unlock
+g_static_rec_mutex_lock_full
+g_static_rec_mutex_unlock_full
+g_static_rec_mutex_free
+
+<SUBSECTION>
+GStaticRWLock
+G_STATIC_RW_LOCK_INIT
+g_static_rw_lock_init
+g_static_rw_lock_reader_lock
+g_static_rw_lock_reader_trylock
+g_static_rw_lock_reader_unlock
+g_static_rw_lock_writer_lock
+g_static_rw_lock_writer_trylock
+g_static_rw_lock_writer_unlock
+g_static_rw_lock_free
+
+<SUBSECTION>
+GCond
+g_cond_new
+g_cond_signal
+g_cond_broadcast
+g_cond_wait
+g_cond_timed_wait
+g_cond_free
+
+<SUBSECTION>
+GPrivate
+g_private_new
+g_private_get
+g_private_set
+
+<SUBSECTION>
+GStaticPrivate
+G_STATIC_PRIVATE_INIT
+g_static_private_init
+g_static_private_get
+g_static_private_set
+g_static_private_free
+
+<SUBSECTION>
+GOnce
+GOnceStatus
+G_ONCE_INIT
+g_once
+
+<SUBSECTION Private>
+G_THREAD_ECF
+G_THREAD_CF
+G_THREAD_UF
+g_static_mutex_get_mutex_impl
+g_static_mutex_get_mutex_impl_shortcut
+G_MUTEX_DEBUG_MAGIC
+g_thread_init_with_errorcheck_mutexes
+G_LOCK_NAME
+glib_dummy_decl
+GSystemThread
+g_thread_use_default_impl
+g_threads_got_initialized
+g_thread_functions_for_glib_use
+g_thread_init_glib
+g_thread_error_quark
+g_once_impl
+atexit
+g_system_thread_assign
+g_system_thread_equal
+g_system_thread_equal_simple
+</SECTION>
+
+<SECTION>
+<TITLE>Thread Pools</TITLE>
+<FILE>thread_pools</FILE>
+GThreadPool
+g_thread_pool_new
+g_thread_pool_push
+g_thread_pool_set_max_threads
+g_thread_pool_get_max_threads
+g_thread_pool_get_num_threads
+g_thread_pool_unprocessed
+g_thread_pool_free
+g_thread_pool_set_max_unused_threads
+g_thread_pool_get_max_unused_threads
+g_thread_pool_get_num_unused_threads
+g_thread_pool_stop_unused_threads
+g_thread_pool_set_sort_function
+g_thread_pool_set_max_idle_time
+g_thread_pool_get_max_idle_time
+</SECTION>
+
+<SECTION>
+<TITLE>Asynchronous Queues</TITLE>
+<FILE>async_queues</FILE>
+GAsyncQueue
+g_async_queue_new
+g_async_queue_ref
+g_async_queue_unref
+g_async_queue_push
+g_async_queue_push_sorted
+g_async_queue_pop
+g_async_queue_try_pop
+g_async_queue_timed_pop
+g_async_queue_length
+g_async_queue_sort
+
+<SUBSECTION>
+g_async_queue_lock
+g_async_queue_unlock
+g_async_queue_ref_unlocked
+g_async_queue_unref_and_unlock
+g_async_queue_push_unlocked
+g_async_queue_push_sorted_unlocked
+g_async_queue_pop_unlocked
+g_async_queue_try_pop_unlocked
+g_async_queue_timed_pop_unlocked
+g_async_queue_length_unlocked
+g_async_queue_sort_unlocked
+</SECTION>
+
+<SECTION>
+<TITLE>Atomic Operations</TITLE>
+<FILE>atomic_operations</FILE>g
+g_atomic_int_get
+g_atomic_int_set
+g_atomic_int_add
+g_atomic_int_exchange_and_add
+g_atomic_int_compare_and_exchange
+g_atomic_pointer_get
+g_atomic_pointer_set
+g_atomic_pointer_compare_and_exchange
+g_atomic_int_inc
+g_atomic_int_dec_and_test
+</SECTION>
+
+<SECTION>
+<TITLE>IO Channels</TITLE>
+<FILE>iochannels</FILE>
+GIOChannel
+
+<SUBSECTION>
+g_io_channel_unix_new
+g_io_channel_unix_get_fd
+g_io_channel_win32_new_fd
+g_io_channel_win32_new_socket
+g_io_channel_win32_new_messages
+
+<SUBSECTION>
+g_io_channel_init
+
+<SUBSECTION>
+g_io_channel_new_file
+g_io_channel_read_chars
+g_io_channel_read_unichar
+g_io_channel_read_line
+g_io_channel_read_line_string
+g_io_channel_read_to_end
+g_io_channel_write_chars
+g_io_channel_write_unichar
+g_io_channel_flush
+g_io_channel_seek_position
+GSeekType
+g_io_channel_shutdown
+
+<SUBSECTION>
+GIOStatus
+GIOChannelError
+G_IO_CHANNEL_ERROR
+g_io_channel_error_from_errno
+
+<SUBSECTION>
+g_io_channel_ref
+g_io_channel_unref
+
+<SUBSECTION>
+g_io_create_watch
+g_io_add_watch
+g_io_add_watch_full
+GIOCondition
+GIOFunc
+
+<SUBSECTION>
+GIOFuncs
+
+<SUBSECTION>
+g_io_channel_get_buffer_size
+g_io_channel_set_buffer_size
+g_io_channel_get_buffer_condition
+g_io_channel_get_flags
+g_io_channel_set_flags
+GIOFlags
+g_io_channel_get_line_term
+g_io_channel_set_line_term
+g_io_channel_get_buffered
+g_io_channel_set_buffered
+g_io_channel_get_encoding
+g_io_channel_set_encoding
+g_io_channel_get_close_on_unref
+g_io_channel_set_close_on_unref
+
+<SUBSECTION Private>
+g_io_channel_win32_poll
+g_io_channel_win32_make_pollfd
+g_io_channel_win32_get_fd
+
+<SUBSECTION>
+g_io_channel_read
+GIOError
+g_io_channel_write
+g_io_channel_seek
+g_io_channel_close
+
+<SUBSECTION Private>
+g_io_channel_error_quark
+g_io_watch_funcs
+</SECTION>
+
+<SECTION>
+<TITLE>Memory Allocation</TITLE>
+<FILE>memory</FILE>
+g_new
+g_new0
+g_renew
+g_try_new
+g_try_new0
+g_try_renew
+
+<SUBSECTION>
+g_malloc
+g_malloc0
+g_realloc
+g_try_malloc
+g_try_malloc0
+g_try_realloc
+
+<SUBSECTION>
+g_free
+g_mem_gc_friendly
+
+<SUBSECTION>
+g_alloca
+g_newa
+
+<SUBSECTION>
+g_memmove
+g_memdup
+
+<SUBSECTION>
+GMemVTable
+g_mem_set_vtable
+g_mem_is_system_malloc
+
+<SUBSECTION>
+glib_mem_profiler_table
+g_mem_profile
+</SECTION>
+
+<SECTION>
+<TITLE>Warnings and Assertions</TITLE>
+<FILE>warnings</FILE>
+g_print
+g_set_print_handler
+GPrintFunc
+
+<SUBSECTION>
+g_printerr
+g_set_printerr_handler
+
+<SUBSECTION>
+g_return_if_fail
+g_return_val_if_fail
+g_return_if_reached
+g_return_val_if_reached
+
+<SUBSECTION>
+g_assert
+g_assert_not_reached
+
+<SUBSECTION>
+g_on_error_query
+g_on_error_stack_trace
+
+<SUBSECTION>
+G_BREAKPOINT
+
+<SUBSECTION Private>
+g_return_if_fail_warning
+g_assert_warning
+</SECTION>
+
+<SECTION>
+<TITLE>Glob-style pattern matching</TITLE>
+<FILE>patterns</FILE>
+GPatternSpec
+g_pattern_spec_new
+g_pattern_spec_free
+g_pattern_spec_equal
+g_pattern_match
+g_pattern_match_string
+g_pattern_match_simple
+</SECTION>
+
+<SECTION>
+<TITLE>Perl-compatible regular expressions</TITLE>
+<FILE>gregex</FILE>
+GRegexError
+G_REGEX_ERROR
+GRegexCompileFlags
+GRegexMatchFlags
+GRegex
+GRegexEvalCallback
+g_regex_new
+g_regex_ref
+g_regex_unref
+g_regex_get_pattern
+g_regex_get_max_backref
+g_regex_get_capture_count
+g_regex_get_string_number
+g_regex_escape_string
+g_regex_match_simple
+g_regex_match
+g_regex_match_full
+g_regex_match_all
+g_regex_match_all_full
+g_regex_split_simple
+g_regex_split
+g_regex_split_full
+g_regex_replace
+g_regex_replace_literal
+g_regex_replace_eval
+g_regex_check_replacement
+GMatchInfo
+g_match_info_get_regex
+g_match_info_get_string
+g_match_info_free
+g_match_info_matches
+g_match_info_next
+g_match_info_get_match_count
+g_match_info_is_partial_match
+g_match_info_expand_references
+g_match_info_fetch
+g_match_info_fetch_pos
+g_match_info_fetch_named
+g_match_info_fetch_named_pos
+g_match_info_fetch_all
+<SUBSECTION Private>
+g_regex_error_quark
+</SECTION>
+
+<SECTION>
+<TITLE>Message Logging</TITLE>
+<FILE>messages</FILE>
+G_LOG_DOMAIN
+G_LOG_FATAL_MASK
+G_LOG_LEVEL_USER_SHIFT
+GLogFunc
+GLogLevelFlags
+
+<SUBSECTION>
+g_log
+g_logv
+g_message
+g_warning
+g_critical
+g_error
+g_debug
+
+<SUBSECTION>
+g_log_set_handler
+g_log_remove_handler
+g_log_set_always_fatal
+g_log_set_fatal_mask
+g_log_default_handler
+g_log_set_default_handler
+</SECTION>
+
+<SECTION>
+<TITLE>Timers</TITLE>
+<FILE>timers</FILE>
+GTimer
+g_timer_new
+g_timer_start
+g_timer_stop
+g_timer_continue
+g_timer_elapsed
+g_timer_reset
+g_timer_destroy
+</SECTION>
+
+<SECTION>
+<TITLE>Spawning Processes</TITLE>
+<FILE>spawn</FILE>
+GSpawnError
+G_SPAWN_ERROR
+GSpawnFlags
+GSpawnChildSetupFunc
+g_spawn_async_with_pipes
+g_spawn_async
+g_spawn_sync
+g_spawn_command_line_async
+g_spawn_command_line_sync
+g_spawn_close_pid
+<SUBSECTION Private>
+g_spawn_error_quark
+</SECTION>
+
+<SECTION>
+<TITLE>Simple XML Subset Parser</TITLE>
+<FILE>markup</FILE>
+GMarkupError
+G_MARKUP_ERROR
+GMarkupParseFlags
+GMarkupParseContext
+GMarkupParser
+g_markup_escape_text
+g_markup_printf_escaped
+g_markup_vprintf_escaped
+g_markup_parse_context_end_parse
+g_markup_parse_context_free
+g_markup_parse_context_get_position
+g_markup_parse_context_get_element
+g_markup_parse_context_new
+g_markup_parse_context_parse
+<SUBSECTION Private>
+g_markup_error_quark
+</SECTION>
+
+
+<SECTION>
+<TITLE>Shell-related Utilities</TITLE>
+<FILE>shell</FILE>
+GShellError
+G_SHELL_ERROR
+g_shell_parse_argv
+g_shell_quote
+g_shell_unquote
+<SUBSECTION Private>
+g_shell_error_quark
+</SECTION>
+
+
+<SECTION>
+<TITLE>Commandline option parser</TITLE>
+<FILE>option</FILE>
+GOptionError
+G_OPTION_ERROR
+GOptionArgFunc
+GOptionContext
+g_option_context_new
+g_option_context_set_summary
+g_option_context_get_summary
+g_option_context_set_description
+g_option_context_get_description
+GTranslateFunc
+g_option_context_set_translate_func
+g_option_context_set_translation_domain
+g_option_context_free
+g_option_context_parse
+g_option_context_set_help_enabled
+g_option_context_get_help_enabled
+g_option_context_set_ignore_unknown_options
+g_option_context_get_ignore_unknown_options
+g_option_context_get_help
+GOptionArg
+GOptionFlags
+G_OPTION_REMAINING
+GOptionEntry
+g_option_context_add_main_entries
+GOptionGroup
+g_option_context_add_group
+g_option_context_set_main_group
+g_option_context_get_main_group
+g_option_group_new
+g_option_group_free
+g_option_group_add_entries
+GOptionParseFunc
+g_option_group_set_parse_hooks
+GOptionErrorFunc
+g_option_group_set_error_hook
+g_option_group_set_translate_func
+g_option_group_set_translation_domain
+<SUBSECTION Private>
+g_option_error_quark
+</SECTION>
+
+
+<SECTION>
+<TITLE>File Utilities</TITLE>
+<FILE>fileutils</FILE>
+<INCLUDE>glib.h,glib/gstdio.h</INCLUDE>
+GFileError
+G_FILE_ERROR
+GFileTest
+g_file_error_from_errno
+g_file_get_contents
+g_file_set_contents
+g_file_test
+g_mkstemp
+g_file_open_tmp
+g_file_read_link
+g_mkdir_with_parents
+
+<SUBSECTION>
+GDir
+g_dir_open
+g_dir_read_name
+g_dir_rewind
+g_dir_close
+
+<SUBSECTION>
+GMappedFile
+g_mapped_file_new
+g_mapped_file_free
+g_mapped_file_get_length
+g_mapped_file_get_contents
+
+<SUBSECTION>
+g_open
+g_rename
+g_mkdir
+g_stat
+g_lstat
+g_unlink
+g_remove
+g_rmdir
+g_fopen
+g_freopen
+g_chmod
+g_access
+g_creat
+g_chdir
+
+<SUBSECTION Private>
+g_file_error_quark
+</SECTION>
+
+
+<SECTION>
+<TITLE>String Utility Functions</TITLE>
+<FILE>string_utils</FILE>
+<INCLUDE>glib.h,glib/gprintf.h</INCLUDE>
+g_strdup
+g_strndup
+g_strdupv
+g_strnfill
+g_stpcpy
+g_strstr_len
+g_strrstr
+g_strrstr_len
+g_str_has_prefix
+g_str_has_suffix
+
+<SUBSECTION>
+g_strlcpy
+g_strlcat
+
+<SUBSECTION>
+g_strdup_printf
+g_strdup_vprintf
+g_printf
+g_vprintf
+g_fprintf
+g_vfprintf
+g_sprintf
+g_vsprintf
+g_snprintf
+g_vsnprintf
+g_vasprintf
+g_printf_string_upper_bound
+
+<SUBSECTION>
+g_ascii_isalnum
+g_ascii_isalpha
+g_ascii_iscntrl
+g_ascii_isdigit
+g_ascii_isgraph
+g_ascii_islower
+g_ascii_isprint
+g_ascii_ispunct
+g_ascii_isspace
+g_ascii_isupper
+g_ascii_isxdigit
+
+<SUBSECTION>
+g_ascii_digit_value
+g_ascii_xdigit_value
+
+<SUBSECTION>
+g_ascii_strcasecmp
+g_ascii_strncasecmp
+
+<SUBSECTION>
+g_ascii_strup
+g_ascii_strdown
+
+<SUBSECTION>
+g_ascii_tolower
+g_ascii_toupper
+
+<SUBSECTION>
+g_string_ascii_up
+g_string_ascii_down
+
+<SUBSECTION>
+g_strup
+g_strdown
+
+<SUBSECTION>
+g_strcasecmp
+g_strncasecmp
+
+<SUBSECTION>
+g_strreverse
+
+<SUBSECTION>
+g_ascii_strtoll
+g_ascii_strtoull
+G_ASCII_DTOSTR_BUF_SIZE
+g_ascii_strtod
+g_ascii_dtostr
+g_ascii_formatd
+g_strtod
+
+<SUBSECTION>
+g_strchug
+g_strchomp
+g_strstrip
+
+<SUBSECTION>
+g_strdelimit
+G_STR_DELIMITERS
+g_strescape
+g_strcompress
+g_strcanon
+g_strsplit
+g_strsplit_set
+g_strfreev
+g_strconcat
+g_strjoin
+g_strjoinv
+g_strv_length
+
+<SUBSECTION>
+g_strerror
+g_strsignal
+
+<SUBSECTION Private>
+GAsciiType
+</SECTION>
+
+<SECTION>
+<TITLE>Date and Time Functions</TITLE>
+<FILE>date</FILE>
+G_USEC_PER_SEC
+GTimeVal
+g_get_current_time
+g_usleep
+g_time_val_add
+g_time_val_from_iso8601
+g_time_val_to_iso8601
+
+<SUBSECTION>
+GDate
+GTime
+GDateDMY
+GDateDay
+GDateMonth
+GDateYear
+GDateWeekday
+
+<SUBSECTION>
+G_DATE_BAD_DAY
+G_DATE_BAD_JULIAN
+G_DATE_BAD_YEAR
+
+<SUBSECTION>
+g_date_new
+g_date_new_dmy
+g_date_new_julian
+g_date_clear
+g_date_free
+
+<SUBSECTION>
+g_date_set_day
+g_date_set_month
+g_date_set_year
+g_date_set_dmy
+g_date_set_julian
+g_date_set_time
+g_date_set_time_t
+g_date_set_time_val
+g_date_set_parse
+
+<SUBSECTION>
+g_date_add_days
+g_date_subtract_days
+g_date_add_months
+g_date_subtract_months
+g_date_add_years
+g_date_subtract_years
+g_date_days_between
+g_date_compare
+g_date_clamp
+g_date_order
+
+<SUBSECTION>
+g_date_get_day
+g_date_get_month
+g_date_get_year
+g_date_get_julian
+g_date_get_weekday
+g_date_get_day_of_year
+
+<SUBSECTION>
+g_date_get_days_in_month
+g_date_is_first_of_month
+g_date_is_last_of_month
+g_date_is_leap_year
+g_date_get_monday_week_of_year
+g_date_get_monday_weeks_in_year
+g_date_get_sunday_week_of_year
+g_date_get_sunday_weeks_in_year
+g_date_get_iso8601_week_of_year
+
+<SUBSECTION>
+g_date_strftime
+g_date_to_struct_tm
+
+<SUBSECTION>
+g_date_valid
+g_date_valid_day
+g_date_valid_month
+g_date_valid_year
+g_date_valid_dmy
+g_date_valid_julian
+g_date_valid_weekday
+
+<SUBSECTION Private>
+g_date_weekday
+g_date_month
+g_date_year
+g_date_day
+g_date_julian
+g_date_day_of_year
+g_date_monday_week_of_year
+g_date_sunday_week_of_year
+g_date_days_in_month
+g_date_monday_weeks_in_year
+g_date_sunday_weeks_in_year
+tm
+</SECTION>
+
+<SECTION>
+<TITLE>Hook Functions</TITLE>
+<FILE>hooks</FILE>
+GHookList
+GHookFinalizeFunc
+GHook
+GHookFunc
+GHookCheckFunc
+
+<SUBSECTION>
+g_hook_list_init
+g_hook_list_invoke
+g_hook_list_invoke_check
+g_hook_list_marshal
+GHookMarshaller
+g_hook_list_marshal_check
+GHookCheckMarshaller
+g_hook_list_clear
+
+<SUBSECTION>
+g_hook_alloc
+g_hook_append
+g_hook_prepend
+g_hook_insert_before
+g_hook_insert_sorted
+GHookCompareFunc
+g_hook_compare_ids
+
+<SUBSECTION>
+g_hook_get
+g_hook_find
+GHookFindFunc
+g_hook_find_data
+g_hook_find_func
+g_hook_find_func_data
+
+<SUBSECTION>
+g_hook_first_valid
+g_hook_next_valid
+
+GHookFlagMask
+G_HOOK_FLAGS
+G_HOOK_FLAG_USER_SHIFT
+
+<SUBSECTION>
+G_HOOK
+G_HOOK_IS_VALID
+G_HOOK_ACTIVE
+G_HOOK_IN_CALL
+G_HOOK_IS_UNLINKED
+
+<SUBSECTION>
+g_hook_ref
+g_hook_unref
+
+g_hook_free
+g_hook_destroy
+g_hook_destroy_link
+</SECTION>
+
+<SECTION>
+<TITLE>Miscellaneous Utility Functions</TITLE>
+<FILE>misc_utils</FILE>
+g_get_application_name
+g_set_application_name
+g_get_prgname
+g_set_prgname
+g_getenv
+g_setenv
+g_unsetenv
+g_listenv
+g_get_user_name
+g_get_real_name
+g_get_user_cache_dir
+g_get_user_data_dir
+g_get_user_config_dir
+GUserDirectory
+g_get_user_special_dir
+g_get_system_data_dirs
+g_get_system_config_dirs
+
+<SUBSECTION>
+g_get_host_name
+g_get_home_dir
+g_get_tmp_dir
+g_get_current_dir
+g_basename
+g_dirname
+g_path_is_absolute
+g_path_skip_root
+g_path_get_basename
+g_path_get_dirname
+g_build_filename
+g_build_filenamev
+g_build_path
+g_build_pathv
+
+<SUBSECTION>
+g_find_program_in_path
+
+<SUBSECTION>
+g_bit_nth_lsf
+g_bit_nth_msf
+g_bit_storage
+
+<SUBSECTION>
+g_spaced_primes_closest
+
+<SUBSECTION>
+g_atexit
+
+<SUBSECTION>
+g_parse_debug_string
+GDebugKey
+
+<SUBSECTION>
+GVoidFunc
+GFreeFunc
+
+<SUBSECTION>
+g_qsort_with_data
+
+<SUBSECTION>
+g_nullify_pointer
+
+<SUBSECTION Private>
+G_NATIVE_ATEXIT
+g_ATEXIT
+g_win32_get_system_data_dirs_for_module
+ATEXIT
+
+</SECTION>
+
+<SECTION>
+<TITLE>Lexical Scanner</TITLE>
+<FILE>scanner</FILE>
+GScanner
+GScannerConfig
+g_scanner_new
+g_scanner_destroy
+
+<SUBSECTION>
+g_scanner_input_file
+g_scanner_sync_file_offset
+g_scanner_input_text
+g_scanner_peek_next_token
+g_scanner_get_next_token
+g_scanner_eof
+
+<SUBSECTION>
+g_scanner_cur_line
+g_scanner_cur_position
+g_scanner_cur_token
+g_scanner_cur_value
+
+<SUBSECTION>
+g_scanner_set_scope
+g_scanner_scope_add_symbol
+g_scanner_scope_foreach_symbol
+g_scanner_scope_lookup_symbol
+g_scanner_scope_remove_symbol
+g_scanner_add_symbol
+g_scanner_remove_symbol
+g_scanner_foreach_symbol
+
+<SUBSECTION>
+g_scanner_freeze_symbol_table
+g_scanner_thaw_symbol_table
+g_scanner_lookup_symbol
+
+<SUBSECTION>
+g_scanner_warn
+g_scanner_error
+g_scanner_unexp_token
+GScannerMsgFunc
+
+<SUBSECTION>
+G_CSET_a_2_z
+G_CSET_A_2_Z
+G_CSET_DIGITS
+G_CSET_LATINC
+G_CSET_LATINS
+GTokenType
+GTokenValue
+GErrorType
+
+</SECTION>
+
+<SECTION>
+<TITLE>Key-value file parser</TITLE>
+<FILE>keyfile</FILE>
+GKeyFile
+G_KEY_FILE_ERROR
+GKeyFileError
+GKeyFileFlags
+
+<SUBSECTION>
+g_key_file_new
+g_key_file_free
+g_key_file_set_list_separator
+g_key_file_load_from_file
+g_key_file_load_from_data
+g_key_file_load_from_data_dirs
+g_key_file_to_data
+g_key_file_get_start_group
+g_key_file_get_groups
+g_key_file_get_keys
+g_key_file_has_group
+g_key_file_has_key
+
+<SUBSECTION>
+g_key_file_get_value
+g_key_file_get_string
+g_key_file_get_locale_string
+g_key_file_get_boolean
+g_key_file_get_integer
+g_key_file_get_double
+g_key_file_get_string_list
+g_key_file_get_locale_string_list
+g_key_file_get_boolean_list
+g_key_file_get_integer_list
+g_key_file_get_double_list
+g_key_file_get_comment
+
+<SUBSECTION>
+g_key_file_set_value
+g_key_file_set_string
+g_key_file_set_locale_string
+g_key_file_set_boolean
+g_key_file_set_integer
+g_key_file_set_double
+g_key_file_set_string_list
+g_key_file_set_locale_string_list
+g_key_file_set_boolean_list
+g_key_file_set_integer_list
+g_key_file_set_double_list
+g_key_file_set_comment
+g_key_file_remove_group
+g_key_file_remove_key
+g_key_file_remove_comment
+
+<SUBSECTION>
+G_KEY_FILE_DESKTOP_GROUP
+G_KEY_FILE_DESKTOP_KEY_TYPE
+G_KEY_FILE_DESKTOP_KEY_VERSION
+G_KEY_FILE_DESKTOP_KEY_NAME
+G_KEY_FILE_DESKTOP_KEY_GENERIC_NAME
+G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY
+G_KEY_FILE_DESKTOP_KEY_COMMENT
+G_KEY_FILE_DESKTOP_KEY_ICON
+G_KEY_FILE_DESKTOP_KEY_HIDDEN
+G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN
+G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN
+G_KEY_FILE_DESKTOP_KEY_TRY_EXEC
+G_KEY_FILE_DESKTOP_KEY_EXEC
+G_KEY_FILE_DESKTOP_KEY_PATH
+G_KEY_FILE_DESKTOP_KEY_TERMINAL
+G_KEY_FILE_DESKTOP_KEY_MIME_TYPE
+G_KEY_FILE_DESKTOP_KEY_CATEGORIES
+G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY
+G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS
+G_KEY_FILE_DESKTOP_KEY_URL
+G_KEY_FILE_DESKTOP_TYPE_APPLICATION
+G_KEY_FILE_DESKTOP_TYPE_LINK
+G_KEY_FILE_DESKTOP_TYPE_DIRECTORY
+
+<SUBSECTION Private>
+g_key_file_error_quark
+</SECTION>
+
+<SECTION>
+<TITLE>Bookmark file parser</TITLE>
+<FILE>bookmarkfile</FILE>
+GBookmarkFile
+G_BOOKMARK_FILE_ERROR
+GBookmarkFileError
+g_bookmark_file_new
+g_bookmark_file_free
+g_bookmark_file_load_from_file
+g_bookmark_file_load_from_data
+g_bookmark_file_load_from_data_dirs
+g_bookmark_file_to_data
+g_bookmark_file_to_file
+g_bookmark_file_has_item
+g_bookmark_file_has_group
+g_bookmark_file_has_application
+g_bookmark_file_get_size
+g_bookmark_file_get_uris G_GNUC_MALLOC
+
+<SUBSECTION>
+g_bookmark_file_get_title
+g_bookmark_file_get_description
+g_bookmark_file_get_mime_type
+g_bookmark_file_get_is_private
+g_bookmark_file_get_icon
+g_bookmark_file_get_added
+g_bookmark_file_get_modified
+g_bookmark_file_get_visited
+g_bookmark_file_get_groups
+g_bookmark_file_get_applications
+g_bookmark_file_get_app_info
+
+<SUBSECTION>
+g_bookmark_file_set_title
+g_bookmark_file_set_description
+g_bookmark_file_set_mime_type
+g_bookmark_file_set_is_private
+g_bookmark_file_set_icon
+g_bookmark_file_set_added
+g_bookmark_file_set_groups
+g_bookmark_file_set_modified
+g_bookmark_file_set_visited
+g_bookmark_file_set_app_info
+g_bookmark_file_add_group
+g_bookmark_file_add_application
+g_bookmark_file_remove_group
+g_bookmark_file_remove_application
+g_bookmark_file_remove_item
+g_bookmark_file_move_item
+
+<SUBSECTION Private>
+g_bookmark_file_error_quark
+</SECTION>
+
+<SECTION>
+<TITLE>Dynamic Loading of Modules</TITLE>
+<FILE>modules</FILE>
+<INCLUDE>gmodule.h</INCLUDE>
+GModule
+g_module_supported
+g_module_build_path
+g_module_open
+GModuleFlags
+g_module_symbol
+g_module_name
+g_module_make_resident
+g_module_close
+g_module_error
+<SUBSECTION>
+GModuleCheckInit
+GModuleUnload
+G_MODULE_SUFFIX
+G_MODULE_EXPORT
+G_MODULE_IMPORT
+</SECTION>
+
+<SECTION>
+<TITLE>Automatic String Completion</TITLE>
+<FILE>completion</FILE>
+GCompletion
+g_completion_new
+GCompletionFunc
+g_completion_add_items
+g_completion_remove_items
+g_completion_clear_items
+g_completion_complete
+g_completion_complete_utf8
+g_completion_set_compare
+GCompletionStrncmpFunc
+g_completion_free
+</SECTION>
+
+<SECTION>
+<TITLE>Windows Compatibility Functions</TITLE>
+<FILE>windows</FILE>
+MAXPATHLEN
+pipe
+
+g_win32_error_message
+g_win32_getlocale
+g_win32_get_package_installation_directory
+g_win32_get_package_installation_subdirectory
+g_win32_get_windows_version
+g_win32_locale_filename_from_utf8
+G_WIN32_DLLMAIN_FOR_DLL_NAME
+G_WIN32_HAVE_WIDECHAR_API
+G_WIN32_IS_NT_BASED
+
+<SUBSECTION Private>
+g_win32_ftruncate
+
+</SECTION>
+
+# Data Structures
+
+<SECTION>
+<TITLE>Memory Chunks</TITLE>
+<FILE>memory_chunks</FILE>
+GMemChunk
+G_ALLOC_AND_FREE
+G_ALLOC_ONLY
+
+<SUBSECTION>
+g_mem_chunk_new
+g_mem_chunk_alloc
+g_mem_chunk_alloc0
+g_mem_chunk_free
+g_mem_chunk_destroy
+
+<SUBSECTION>
+g_mem_chunk_create
+g_chunk_new
+g_chunk_new0
+g_chunk_free
+
+<SUBSECTION>
+g_mem_chunk_reset
+g_mem_chunk_clean
+g_blow_chunks
+
+<SUBSECTION>
+g_mem_chunk_info
+g_mem_chunk_print
+
+</SECTION>
+
+<SECTION>
+<TITLE>Memory Slices</TITLE>
+<FILE>memory_slices</FILE>
+g_slice_alloc
+g_slice_alloc0
+g_slice_free1
+g_slice_free_chain_with_offset
+
+<SUBSECTION>
+g_slice_new
+g_slice_new0
+g_slice_free
+g_slice_free_chain
+
+<SUBSECTION Private>
+GSliceConfig
+g_slice_set_config
+g_slice_get_config
+g_slice_get_config_state
+</SECTION>
+
+<SECTION>
+<TITLE>Doubly-Linked Lists</TITLE>
+<FILE>linked_lists_double</FILE>
+GList
+
+<SUBSECTION>
+g_list_append
+g_list_prepend
+g_list_insert
+g_list_insert_before
+g_list_insert_sorted
+g_list_remove
+g_list_remove_link
+g_list_delete_link
+g_list_remove_all
+g_list_free
+
+<SUBSECTION>
+g_list_alloc
+g_list_free_1
+g_list_free1
+
+<SUBSECTION>
+g_list_length
+g_list_copy
+g_list_reverse
+g_list_sort
+GCompareFunc
+g_list_insert_sorted_with_data
+g_list_sort_with_data
+GCompareDataFunc
+g_list_concat
+g_list_foreach
+GFunc
+
+<SUBSECTION>
+g_list_first
+g_list_last
+g_list_previous
+g_list_next
+g_list_nth
+g_list_nth_data
+g_list_nth_prev
+
+<SUBSECTION>
+g_list_find
+g_list_find_custom
+g_list_position
+g_list_index
+
+<SUBSECTION>
+g_list_push_allocator
+g_list_pop_allocator
+</SECTION>
+
+<SECTION>
+<TITLE>Singly-Linked Lists</TITLE>
+<FILE>linked_lists_single</FILE>
+GSList
+
+<SUBSECTION>
+g_slist_alloc
+g_slist_append
+g_slist_prepend
+g_slist_insert
+g_slist_insert_before
+g_slist_insert_sorted
+g_slist_remove
+g_slist_remove_link
+g_slist_delete_link
+g_slist_remove_all
+g_slist_free
+g_slist_free_1
+g_slist_free1
+
+<SUBSECTION>
+g_slist_length
+g_slist_copy
+g_slist_reverse
+g_slist_insert_sorted_with_data
+g_slist_sort
+g_slist_sort_with_data
+g_slist_concat
+g_slist_foreach
+
+<SUBSECTION>
+g_slist_last
+g_slist_next
+g_slist_nth
+g_slist_nth_data
+
+<SUBSECTION>
+g_slist_find
+g_slist_find_custom
+g_slist_position
+g_slist_index
+
+<SUBSECTION>
+g_slist_push_allocator
+g_slist_pop_allocator
+</SECTION>
+
+<SECTION>
+<TITLE>Double-ended Queues</TITLE>
+<FILE>queue</FILE>
+
+GQueue
+g_queue_new
+g_queue_free
+G_QUEUE_INIT
+g_queue_init
+g_queue_clear
+g_queue_is_empty
+g_queue_get_length
+g_queue_reverse
+g_queue_copy
+g_queue_foreach
+g_queue_find
+g_queue_find_custom
+g_queue_sort
+g_queue_push_head
+g_queue_push_tail
+g_queue_push_nth
+g_queue_pop_head
+g_queue_pop_tail
+g_queue_pop_nth
+g_queue_peek_head
+g_queue_peek_tail
+g_queue_peek_nth
+g_queue_index
+g_queue_remove
+g_queue_remove_all
+g_queue_insert_before
+g_queue_insert_after
+g_queue_insert_sorted
+g_queue_push_head_link
+g_queue_push_tail_link
+g_queue_push_nth_link
+g_queue_pop_head_link
+g_queue_pop_tail_link
+g_queue_pop_nth_link
+g_queue_peek_head_link
+g_queue_peek_tail_link
+g_queue_peek_nth_link
+g_queue_link_index
+g_queue_unlink
+g_queue_delete_link
+</SECTION>
+
+<SECTION>
+<TITLE>Sequences</TITLE>
+<FILE>sequence</FILE>
+
+GSequence
+GSequenceIter
+GSequenceIterCompareFunc
+
+<SUBSECTION>
+g_sequence_new
+g_sequence_free
+g_sequence_get_length
+g_sequence_foreach
+g_sequence_foreach_range
+g_sequence_sort
+g_sequence_sort_iter
+
+<SUBSECTION>
+g_sequence_get_begin_iter
+g_sequence_get_end_iter
+g_sequence_get_iter_at_pos
+g_sequence_append
+g_sequence_prepend
+g_sequence_insert_before
+g_sequence_move
+g_sequence_swap
+g_sequence_insert_sorted
+g_sequence_insert_sorted_iter
+g_sequence_sort_changed
+g_sequence_sort_changed_iter
+g_sequence_remove
+g_sequence_remove_range
+g_sequence_move_range
+g_sequence_search
+g_sequence_search_iter
+
+<SUBSECTION>
+g_sequence_get
+g_sequence_set
+
+<SUBSECTION>
+g_sequence_iter_is_begin
+g_sequence_iter_is_end
+g_sequence_iter_next
+g_sequence_iter_prev
+g_sequence_iter_get_position
+g_sequence_iter_move
+g_sequence_iter_get_sequence
+
+<SUBSECTION>
+g_sequence_iter_compare
+g_sequence_range_get_midpoint
+</SECTION>
+
+<SECTION>
+<TITLE>Trash Stacks</TITLE>
+<FILE>trash_stack</FILE>
+GTrashStack
+
+g_trash_stack_push
+g_trash_stack_pop
+g_trash_stack_peek
+g_trash_stack_height
+</SECTION>
+
+<SECTION>
+<TITLE>Hash Tables</TITLE>
+<FILE>hash_tables</FILE>
+GHashTable
+g_hash_table_new
+g_hash_table_new_full
+GHashFunc
+GEqualFunc
+g_hash_table_insert
+g_hash_table_replace
+g_hash_table_size
+g_hash_table_lookup
+g_hash_table_lookup_extended
+g_hash_table_foreach
+g_hash_table_find
+GHFunc
+g_hash_table_remove
+g_hash_table_steal
+g_hash_table_foreach_remove
+g_hash_table_foreach_steal
+g_hash_table_remove_all
+g_hash_table_steal_all
+g_hash_table_get_keys
+g_hash_table_get_values
+GHRFunc
+g_hash_table_freeze
+g_hash_table_thaw
+g_hash_table_destroy
+g_hash_table_ref
+g_hash_table_unref
+
+<SUBSECTION>
+g_direct_equal
+g_direct_hash
+g_int_equal
+g_int_hash
+g_str_equal
+g_str_hash
+
+</SECTION>
+
+<SECTION>
+<TITLE>Strings</TITLE>
+<FILE>strings</FILE>
+GString
+g_string_new
+g_string_new_len
+g_string_sized_new
+g_string_assign
+g_string_sprintf
+g_string_sprintfa
+g_string_printf
+g_string_append_printf
+g_string_append
+g_string_append_c
+g_string_append_unichar
+g_string_append_len
+g_string_prepend
+g_string_prepend_c
+g_string_prepend_unichar
+g_string_prepend_len
+g_string_insert
+g_string_insert_c
+g_string_insert_unichar
+g_string_insert_len
+g_string_erase
+g_string_truncate
+g_string_set_size
+g_string_free
+
+<SUBSECTION>
+g_string_up
+g_string_down
+
+<SUBSECTION>
+g_string_hash
+g_string_equal
+
+</SECTION>
+
+<SECTION>
+<TITLE>String Chunks</TITLE>
+<FILE>string_chunks</FILE>
+GStringChunk
+g_string_chunk_new
+g_string_chunk_insert
+g_string_chunk_insert_const
+g_string_chunk_insert_len
+g_string_chunk_clear
+g_string_chunk_free
+
+</SECTION>
+
+<SECTION>
+<TITLE>Arrays</TITLE>
+<FILE>arrays</FILE>
+GArray
+g_array_new
+g_array_sized_new
+g_array_append_val
+g_array_append_vals
+g_array_prepend_val
+g_array_prepend_vals
+g_array_insert_val
+g_array_insert_vals
+g_array_remove_index
+g_array_remove_index_fast
+g_array_remove_range
+g_array_sort
+g_array_sort_with_data
+g_array_index
+g_array_set_size
+g_array_free
+</SECTION>
+
+<SECTION>
+<TITLE>Pointer Arrays</TITLE>
+<FILE>arrays_pointer</FILE>
+GPtrArray
+g_ptr_array_new
+g_ptr_array_sized_new
+g_ptr_array_add
+g_ptr_array_remove
+g_ptr_array_remove_index
+g_ptr_array_remove_fast
+g_ptr_array_remove_index_fast
+g_ptr_array_remove_range
+g_ptr_array_sort
+g_ptr_array_sort_with_data
+g_ptr_array_set_size
+g_ptr_array_index
+g_ptr_array_free
+g_ptr_array_foreach
+
+</SECTION>
+
+<SECTION>
+<TITLE>Byte Arrays</TITLE>
+<FILE>arrays_byte</FILE>
+GByteArray
+g_byte_array_new
+g_byte_array_sized_new
+g_byte_array_append
+g_byte_array_prepend
+g_byte_array_remove_index
+g_byte_array_remove_index_fast
+g_byte_array_remove_range
+g_byte_array_sort
+g_byte_array_sort_with_data
+g_byte_array_set_size
+g_byte_array_free
+
+</SECTION>
+
+<SECTION>
+<TITLE>Balanced Binary Trees</TITLE>
+<FILE>trees-binary</FILE>
+GTree
+g_tree_new
+g_tree_new_with_data
+g_tree_new_full
+g_tree_insert
+g_tree_replace
+g_tree_nnodes
+g_tree_height
+g_tree_lookup
+g_tree_lookup_extended
+g_tree_foreach
+g_tree_traverse
+GTraverseFunc
+GTraverseType
+g_tree_search
+g_tree_remove
+g_tree_steal
+g_tree_destroy
+</SECTION>
+
+<SECTION>
+<TITLE>N-ary Trees</TITLE>
+<FILE>trees-nary</FILE>
+GNode
+g_node_new
+g_node_copy
+GCopyFunc
+g_node_copy_deep
+
+<SUBSECTION>
+g_node_insert
+g_node_insert_before
+g_node_insert_after
+g_node_append
+g_node_prepend
+
+<SUBSECTION>
+g_node_insert_data
+g_node_insert_data_before
+g_node_append_data
+g_node_prepend_data
+
+<SUBSECTION>
+g_node_reverse_children
+g_node_traverse
+GTraverseFlags
+GNodeTraverseFunc
+g_node_children_foreach
+GNodeForeachFunc
+
+<SUBSECTION>
+g_node_get_root
+g_node_find
+g_node_find_child
+g_node_child_index
+g_node_child_position
+g_node_first_child
+g_node_last_child
+g_node_nth_child
+g_node_first_sibling
+g_node_next_sibling
+g_node_prev_sibling
+g_node_last_sibling
+
+<SUBSECTION>
+G_NODE_IS_LEAF
+G_NODE_IS_ROOT
+g_node_depth
+g_node_n_nodes
+g_node_n_children
+g_node_is_ancestor
+g_node_max_height
+
+<SUBSECTION>
+g_node_unlink
+g_node_destroy
+
+<SUBSECTION>
+g_node_push_allocator
+g_node_pop_allocator
+</SECTION>
+
+
+<SECTION>
+<TITLE>Quarks</TITLE>
+<FILE>quarks</FILE>
+GQuark
+g_quark_from_string
+g_quark_from_static_string
+g_quark_to_string
+g_quark_try_string
+g_intern_string
+g_intern_static_string
+</SECTION>
+
+<SECTION>
+<TITLE>Keyed Data Lists</TITLE>
+<FILE>datalist</FILE>
+GData
+g_datalist_init
+
+<SUBSECTION>
+g_datalist_id_set_data
+g_datalist_id_set_data_full
+g_datalist_id_get_data
+g_datalist_id_remove_data
+g_datalist_id_remove_no_notify
+
+<SUBSECTION>
+g_datalist_set_data
+g_datalist_set_data_full
+g_datalist_get_data
+g_datalist_remove_data
+g_datalist_remove_no_notify
+
+<SUBSECTION>
+g_datalist_foreach
+g_datalist_clear
+g_datalist_set_flags
+g_datalist_unset_flags
+g_datalist_get_flags
+G_DATALIST_FLAGS_MASK
+</SECTION>
+
+
+<SECTION>
+<TITLE>Datasets</TITLE>
+<FILE>datasets</FILE>
+g_dataset_id_set_data
+g_dataset_id_set_data_full
+GDestroyNotify
+g_dataset_id_get_data
+g_dataset_id_remove_data
+g_dataset_id_remove_no_notify
+
+<SUBSECTION>
+g_dataset_set_data
+g_dataset_set_data_full
+g_dataset_get_data
+g_dataset_remove_data
+g_dataset_remove_no_notify
+
+<SUBSECTION>
+g_dataset_foreach
+GDataForeachFunc
+g_dataset_destroy
+
+</SECTION>
+
+<SECTION>
+<TITLE>Relations and Tuples</TITLE>
+<FILE>relations</FILE>
+GRelation
+g_relation_new
+g_relation_index
+g_relation_insert
+g_relation_exists
+g_relation_count
+g_relation_select
+g_relation_delete
+g_relation_destroy
+
+<SUBSECTION>
+g_relation_print
+
+<SUBSECTION>
+GTuples
+g_tuples_destroy
+g_tuples_index
+</SECTION>
+
+<SECTION>
+<TITLE>Caches</TITLE>
+<FILE>caches</FILE>
+GCache
+g_cache_new
+g_cache_insert
+g_cache_remove
+g_cache_destroy
+
+<SUBSECTION>
+g_cache_key_foreach
+g_cache_value_foreach
+
+<SUBSECTION>
+GCacheDestroyFunc
+GCacheDupFunc
+GCacheNewFunc
+</SECTION>
+
+<SECTION>
+<TITLE>Memory Allocators</TITLE>
+<FILE>allocators</FILE>
+GAllocator
+g_allocator_new
+g_allocator_free
+
+<SUBSECTION Private>
+G_ALLOCATOR_LIST
+G_ALLOCATOR_NODE
+G_ALLOCATOR_SLIST
+</SECTION>
+
+<SECTION>
+<TITLE>Random Numbers</TITLE>
+<FILE>random_numbers</FILE>
+GRand
+g_rand_new_with_seed
+g_rand_new_with_seed_array
+g_rand_new
+g_rand_copy
+g_rand_free
+g_rand_set_seed
+g_rand_set_seed_array
+g_rand_boolean
+g_rand_int
+g_rand_int_range
+g_rand_double
+g_rand_double_range
+g_random_set_seed
+g_random_boolean
+g_random_int
+g_random_int_range
+g_random_double
+g_random_double_range
+</SECTION>
+
+<SECTION>
+<TITLE>Character Set Conversion</TITLE>
+<FILE>conversions</FILE>
+g_convert
+g_convert_with_fallback
+GIConv
+g_convert_with_iconv
+G_CONVERT_ERROR
+g_iconv_open
+g_iconv
+g_iconv_close
+g_locale_to_utf8
+g_filename_to_utf8
+g_filename_from_utf8
+g_filename_from_uri
+g_filename_to_uri
+g_get_filename_charsets
+g_filename_display_name
+g_filename_display_basename
+g_uri_list_extract_uris
+g_locale_from_utf8
+GConvertError
+
+<SUBSECTION>
+g_get_charset
+
+<SUBSECTION Private>
+g_convert_error_quark
+</SECTION>
+
+<SECTION>
+<TITLE>Unicode Manipulation</TITLE>
+<FILE>unicode</FILE>
+gunichar
+gunichar2
+
+<SUBSECTION>
+g_unichar_validate
+g_unichar_isalnum
+g_unichar_isalpha
+g_unichar_iscntrl
+g_unichar_isdefined
+g_unichar_isdigit
+g_unichar_isgraph
+g_unichar_islower
+g_unichar_ismark
+g_unichar_isprint
+g_unichar_ispunct
+g_unichar_isspace
+g_unichar_istitle
+g_unichar_isupper
+g_unichar_isxdigit
+g_unichar_iswide
+g_unichar_iswide_cjk
+g_unichar_iszerowidth
+g_unichar_toupper
+g_unichar_tolower
+g_unichar_totitle
+g_unichar_digit_value
+g_unichar_xdigit_value
+GUnicodeType
+g_unichar_type
+GUnicodeBreakType
+g_unichar_break_type
+g_unicode_canonical_ordering
+g_unicode_canonical_decomposition
+g_unichar_get_mirror_char
+GUnicodeScript
+g_unichar_get_script
+
+<SUBSECTION>
+g_utf8_next_char
+g_utf8_get_char
+g_utf8_get_char_validated
+g_utf8_offset_to_pointer
+g_utf8_pointer_to_offset
+g_utf8_prev_char
+g_utf8_find_next_char
+g_utf8_find_prev_char
+g_utf8_strlen
+g_utf8_strncpy
+g_utf8_strchr
+g_utf8_strrchr
+g_utf8_strreverse
+g_utf8_validate
+
+<SUBSECTION>
+g_utf8_strup
+g_utf8_strdown
+g_utf8_casefold
+g_utf8_normalize
+GNormalizeMode
+g_utf8_collate
+g_utf8_collate_key
+g_utf8_collate_key_for_filename
+
+<SUBSECTION>
+g_utf8_to_utf16
+g_utf8_to_ucs4
+g_utf8_to_ucs4_fast
+g_utf16_to_ucs4
+g_utf16_to_utf8
+g_ucs4_to_utf16
+g_ucs4_to_utf8
+g_unichar_to_utf8
+</SECTION>
+
+<SECTION>
+<TITLE>I18N</TITLE>
+<FILE>i18n</FILE>
+<INCLUDE>glib.h,glib/gi18n.h</INCLUDE>
+_
+Q_
+N_
+g_strip_context
+<SUBSECTION>
+g_get_language_names
+</SECTION>
+
+<SECTION>
+<TITLE>Base64 Encoding</TITLE>
+<FILE>base64</FILE>
+g_base64_encode_step
+g_base64_encode_close
+g_base64_encode
+g_base64_decode_step
+g_base64_decode
+</SECTION>
diff --git a/trunk/docs/reference/glib/glib.types b/trunk/docs/reference/glib/glib.types
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/trunk/docs/reference/glib/glib.types
diff --git a/trunk/docs/reference/glib/mainloop-states.eps b/trunk/docs/reference/glib/mainloop-states.eps
new file mode 100644
index 000000000..b3d159bc9
--- /dev/null
+++ b/trunk/docs/reference/glib/mainloop-states.eps
@@ -0,0 +1,306 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: mainloop-stages.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 3c
+%%CreationDate: Wed Nov 29 12:23:52 2000
+%%For: otaylor@fresnel.labs.redhat.com (Owen Taylor)
+%%BoundingBox: 0 0 503 291
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+newpath 0 291 moveto 0 0 lineto 503 0 lineto 503 291 lineto closepath clip newpath
+-106.0 402.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+ bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+ 4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+%%Page: 1 1
+10 setmiterlimit
+ 0.06000 0.06000 sc
+%
+% Fig objects follow
+%
+/Times-Roman ff 270.00 scf sf
+9300 6225 m
+gs 1 -1 sc (Initial[n+1]) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+9300 6540 m
+gs 1 -1 sc (\(Recursion\)) dup sw pop 2 div neg 0 rm col0 sh gr
+% Polyline
+15.000 slw
+ [60] 0 sd
+n 1905 6000 m 1800 6000 1800 6420 105 arcto 4 {pop} repeat
+ 1800 6525 3120 6525 105 arcto 4 {pop} repeat
+ 3225 6525 3225 6105 105 arcto 4 {pop} repeat
+ 3225 6000 1905 6000 105 arcto 4 {pop} repeat
+ cp gs col0 s gr [] 0 sd
+% Polyline
+ [60] 0 sd
+gs clippath
+3865 5498 m 3806 5431 l 3688 5535 l 3808 5490 l 3747 5602 l cp
+3184 5976 m 3243 6043 l 3361 5939 l 3242 5985 l 3302 5872 l cp
+eoclip
+n 3225 6000 m
+ 3825 5475 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 3302 5872 m 3242 5985 l 3361 5939 l 3302 5872 l cp gs 0.00 setgray ef gr col0 s
+% arrowhead
+n 3747 5602 m 3808 5490 l 3688 5535 l 3747 5602 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+n 4980 5775 m 4875 5775 4875 6270 105 arcto 4 {pop} repeat
+ 4875 6375 6870 6375 105 arcto 4 {pop} repeat
+ 6975 6375 6975 5880 105 arcto 4 {pop} repeat
+ 6975 5775 4980 5775 105 arcto 4 {pop} repeat
+ cp gs col0 s gr
+% Polyline
+ [60] 0 sd
+gs clippath
+8457 5969 m 8515 5900 l 8394 5799 l 8458 5911 l 8337 5868 l cp
+8042 5505 m 7984 5574 l 8105 5675 l 8042 5564 l 8162 5606 l cp
+eoclip
+n 8025 5550 m
+ 8475 5925 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 8162 5606 m 8042 5564 l 8105 5675 l 8162 5606 l cp gs 0.00 setgray ef gr col0 s
+% arrowhead
+n 8337 5868 m 8458 5911 l 8394 5799 l 8337 5868 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+ [60] 0 sd
+n 8580 5850 m 8475 5850 8475 6570 105 arcto 4 {pop} repeat
+ 8475 6675 10020 6675 105 arcto 4 {pop} repeat
+ 10125 6675 10125 5955 105 arcto 4 {pop} repeat
+ 10125 5850 8580 5850 105 arcto 4 {pop} repeat
+ cp gs col0 s gr [] 0 sd
+% Polyline
+n 7155 3825 m 7050 3825 7050 4320 105 arcto 4 {pop} repeat
+ 7050 4425 9045 4425 105 arcto 4 {pop} repeat
+ 9150 4425 9150 3930 105 arcto 4 {pop} repeat
+ 9150 3825 7155 3825 105 arcto 4 {pop} repeat
+ cp gs col0 s gr
+% Polyline
+n 5055 2100 m 4950 2100 4950 2595 105 arcto 4 {pop} repeat
+ 4950 2700 6945 2700 105 arcto 4 {pop} repeat
+ 7050 2700 7050 2205 105 arcto 4 {pop} repeat
+ 7050 2100 5055 2100 105 arcto 4 {pop} repeat
+ cp gs col0 s gr
+% Polyline
+n 2730 3900 m 2625 3900 2625 4395 105 arcto 4 {pop} repeat
+ 2625 4500 4620 4500 105 arcto 4 {pop} repeat
+ 4725 4500 4725 4005 105 arcto 4 {pop} repeat
+ 4725 3900 2730 3900 105 arcto 4 {pop} repeat
+ cp gs col0 s gr
+% Polyline
+ [60] 0 sd
+n 8580 1875 m 8475 1875 8475 2295 105 arcto 4 {pop} repeat
+ 8475 2400 9645 2400 105 arcto 4 {pop} repeat
+ 9750 2400 9750 1980 105 arcto 4 {pop} repeat
+ 9750 1875 8580 1875 105 arcto 4 {pop} repeat
+ cp gs col0 s gr [] 0 sd
+% Polyline
+ [60] 0 sd
+gs clippath
+8518 2419 m 8451 2358 l 8345 2474 l 8460 2416 l 8412 2534 l cp
+8003 2848 m 8070 2909 l 8176 2793 l 8062 2852 l 8109 2733 l cp
+eoclip
+n 8047 2868 m
+ 8475 2400 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 8109 2733 m 8062 2852 l 8176 2793 l 8109 2733 l cp gs 0.00 setgray ef gr col0 s
+% arrowhead
+n 8412 2534 m 8460 2416 l 8345 2474 l 8412 2534 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+2 slj
+gs clippath
+3340 4475 m 3252 4494 l 3286 4648 l 3305 4522 l 3374 4629 l cp
+eoclip
+n 4875 6075 m 4874 6075 l 4872 6074 l 4868 6073 l 4861 6072 l 4852 6070 l
+ 4839 6067 l 4824 6064 l 4805 6059 l 4783 6054 l 4759 6048 l
+ 4731 6041 l 4701 6033 l 4669 6025 l 4635 6015 l 4600 6004 l
+ 4563 5993 l 4526 5981 l 4487 5967 l 4448 5953 l 4408 5937 l
+ 4367 5920 l 4326 5901 l 4284 5881 l 4241 5859 l 4198 5835 l
+ 4154 5809 l 4109 5781 l 4063 5749 l 4016 5715 l 3968 5678 l
+ 3920 5638 l 3872 5595 l 3825 5550 l 3780 5503 l 3737 5455 l
+ 3697 5407 l 3660 5359 l 3626 5312 l 3594 5266 l 3566 5221 l
+ 3540 5177 l 3516 5134 l 3494 5091 l 3474 5049 l 3455 5008 l
+ 3438 4967 l 3422 4927 l 3408 4888 l 3394 4849 l 3382 4812 l
+ 3371 4775 l 3360 4740 l 3350 4706 l 3342 4674 l 3334 4644 l
+ 3327 4616 l 3321 4592 l 3316 4570 l 3311 4551 l 3308 4536 l
+ 3305 4523 l 3303 4514 l
+ 3300 4500 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3374 4629 m 3305 4522 l 3286 4648 l 3374 4629 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+2 slj
+gs clippath
+6943 6114 m 6978 6197 l 7123 6135 l 6995 6141 l 7087 6052 l cp
+eoclip
+n 8475 4500 m 8475 4501 l 8475 4503 l 8475 4508 l 8475 4515 l 8474 4525 l
+ 8474 4538 l 8473 4553 l 8472 4573 l 8470 4594 l 8468 4619 l
+ 8465 4646 l 8462 4675 l 8457 4706 l 8452 4739 l 8445 4773 l
+ 8437 4808 l 8427 4845 l 8416 4882 l 8403 4921 l 8388 4961 l
+ 8370 5002 l 8350 5045 l 8326 5090 l 8299 5137 l 8268 5186 l
+ 8232 5237 l 8192 5290 l 8148 5345 l 8100 5400 l 8057 5445 l
+ 8013 5490 l 7968 5533 l 7923 5573 l 7878 5612 l 7833 5649 l
+ 7789 5684 l 7745 5717 l 7701 5749 l 7658 5779 l 7615 5807 l
+ 7573 5834 l 7531 5861 l 7489 5886 l 7447 5910 l 7407 5933 l
+ 7366 5955 l 7327 5977 l 7288 5997 l 7250 6017 l 7214 6035 l
+ 7180 6052 l 7147 6068 l 7117 6083 l 7090 6096 l 7065 6108 l
+ 7043 6118 l 7025 6127 l 7010 6134 l 6998 6140 l 6989 6144 l
+
+ 6975 6150 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 7087 6052 m 6995 6141 l 7123 6135 l 7087 6052 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+2 slj
+gs clippath
+8433 3848 m 8521 3831 l 8493 3676 l 8471 3803 l 8404 3693 l cp
+eoclip
+n 7050 2400 m 7051 2400 l 7054 2401 l 7058 2401 l 7066 2403 l 7076 2404 l
+ 7090 2407 l 7107 2410 l 7127 2414 l 7150 2418 l 7177 2424 l
+ 7206 2430 l 7238 2437 l 7271 2445 l 7306 2454 l 7343 2463 l
+ 7381 2474 l 7419 2486 l 7458 2499 l 7498 2513 l 7538 2528 l
+ 7579 2545 l 7621 2564 l 7663 2585 l 7706 2608 l 7750 2634 l
+ 7795 2662 l 7841 2694 l 7887 2728 l 7933 2766 l 7980 2807 l
+ 8025 2850 l 8068 2895 l 8109 2942 l 8147 2988 l 8181 3034 l
+ 8213 3080 l 8241 3125 l 8267 3169 l 8290 3212 l 8311 3254 l
+ 8330 3296 l 8347 3337 l 8362 3377 l 8376 3417 l 8389 3456 l
+ 8401 3494 l 8412 3532 l 8421 3569 l 8430 3604 l 8438 3637 l
+ 8445 3669 l 8451 3698 l 8457 3725 l 8461 3748 l 8465 3768 l
+ 8468 3785 l 8471 3799 l 8472 3809 l
+ 8475 3825 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 8404 3693 m 8471 3803 l 8493 3676 l 8404 3693 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+2 slj
+gs clippath
+4970 2442 m 4959 2353 l 4803 2372 l 4928 2403 l 4814 2461 l cp
+eoclip
+n 3375 3900 m 3375 3899 l 3376 3897 l 3377 3892 l 3378 3886 l 3380 3876 l
+ 3383 3863 l 3386 3848 l 3391 3828 l 3396 3806 l 3402 3781 l
+ 3409 3753 l 3417 3722 l 3425 3689 l 3435 3655 l 3446 3619 l
+ 3457 3581 l 3469 3543 l 3483 3504 l 3497 3464 l 3513 3423 l
+ 3530 3383 l 3549 3341 l 3569 3299 l 3591 3257 l 3615 3214 l
+ 3641 3170 l 3669 3125 l 3701 3080 l 3735 3034 l 3772 2988 l
+ 3812 2941 l 3855 2895 l 3900 2850 l 3950 2804 l 4001 2762 l
+ 4052 2723 l 4102 2687 l 4152 2655 l 4201 2625 l 4248 2599 l
+ 4295 2576 l 4340 2555 l 4385 2536 l 4429 2519 l 4472 2504 l
+ 4515 2490 l 4557 2477 l 4598 2466 l 4638 2456 l 4677 2447 l
+ 4715 2439 l 4751 2432 l 4784 2426 l 4815 2420 l 4843 2415 l
+ 4868 2411 l 4890 2408 l 4908 2406 l 4922 2404 l 4933 2402 l
+
+ 4950 2400 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4814 2461 m 4928 2403 l 4803 2372 l 4814 2461 l cp gs 0.00 setgray ef gr col0 s
+/Times-Roman ff 360.00 scf sf
+5925 6225 m
+gs 1 -1 sc (Initial[n]) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 360.00 scf sf
+8100 4275 m
+gs 1 -1 sc (Dispatching) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 360.00 scf sf
+3675 4350 m
+gs 1 -1 sc (Prepared) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 360.00 scf sf
+5925 2550 m
+gs 1 -1 sc (Polling) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+4050 3300 m
+gs 1 -1 sc (query\(\)) col0 sh gr
+/Times-Roman ff 270.00 scf sf
+7800 3225 m
+gs 1 -1 sc (check\(\)) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+2475 6375 m
+gs 1 -1 sc (Working) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+3900 5400 m
+gs 1 -1 sc (prepare\(\)) col0 sh gr
+/Times-Roman ff 270.00 scf sf
+8025 5325 m
+gs 1 -1 sc (dispatch\(\)) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+9150 2250 m
+gs 1 -1 sc (Working) dup sw pop 2 div neg 0 rm col0 sh gr
+$F2psEnd
+rs
diff --git a/trunk/docs/reference/glib/mainloop-states.fig b/trunk/docs/reference/glib/mainloop-states.fig
new file mode 100644
index 000000000..6acbedb88
--- /dev/null
+++ b/trunk/docs/reference/glib/mainloop-states.fig
@@ -0,0 +1,65 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+6 8625 6000 9975 6600
+4 1 0 50 0 0 18 0.0000 4 240 1290 9300 6225 Initial[n+1]\001
+4 1 0 50 0 0 18 0.0000 4 255 1335 9300 6540 (Recursion)\001
+-6
+2 4 1 2 0 7 50 0 -1 4.000 0 0 7 0 0 5
+ 3225 6525 3225 6000 1800 6000 1800 6525 3225 6525
+2 1 1 2 0 7 50 0 -1 4.000 0 0 -1 1 1 2
+ 1 1 2.00 90.00 120.00
+ 1 1 2.00 90.00 120.00
+ 3225 6000 3825 5475
+2 4 0 2 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 6975 6375 6975 5775 4875 5775 4875 6375 6975 6375
+2 1 1 2 0 7 50 0 -1 4.000 0 0 -1 1 1 2
+ 1 1 2.00 90.00 120.00
+ 1 1 2.00 90.00 120.00
+ 8025 5550 8475 5925
+2 4 1 2 0 7 50 0 -1 4.000 0 0 7 0 0 5
+ 10125 6675 10125 5850 8475 5850 8475 6675 10125 6675
+2 4 0 2 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 9150 4425 9150 3825 7050 3825 7050 4425 9150 4425
+2 4 0 2 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 7050 2700 7050 2100 4950 2100 4950 2700 7050 2700
+2 4 0 2 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 4725 4500 4725 3900 2625 3900 2625 4500 4725 4500
+2 4 1 2 0 7 50 0 -1 4.000 0 0 7 0 0 5
+ 9750 2400 9750 1875 8475 1875 8475 2400 9750 2400
+2 1 1 2 0 7 50 0 -1 4.000 0 0 -1 1 1 2
+ 1 1 2.00 90.00 120.00
+ 1 1 2.00 90.00 120.00
+ 8047 2868 8475 2400
+3 2 0 2 0 7 50 0 -1 0.000 0 1 0 3
+ 1 1 2.00 90.00 120.00
+ 4875 6075 3825 5550 3300 4500
+ 0.000 -1.000 0.000
+3 2 0 2 0 7 50 0 -1 0.000 0 1 0 3
+ 1 1 2.00 90.00 120.00
+ 8475 4500 8100 5400 6975 6150
+ 0.000 -1.000 0.000
+3 2 0 2 0 7 50 0 -1 0.000 0 1 0 3
+ 1 1 2.00 90.00 120.00
+ 7050 2400 8025 2850 8475 3825
+ 0.000 -1.000 0.000
+3 2 0 2 0 7 50 0 -1 0.000 0 1 0 3
+ 1 1 2.00 90.00 120.00
+ 3375 3900 3900 2850 4950 2400
+ 0.000 -1.000 0.000
+4 1 0 50 0 0 24 0.0000 4 315 1290 5925 6225 Initial[n]\001
+4 1 0 50 0 0 24 0.0000 4 330 1770 8100 4275 Dispatching\001
+4 1 0 50 0 0 24 0.0000 4 330 1320 3675 4350 Prepared\001
+4 1 0 50 0 0 24 0.0000 4 330 1050 5925 2550 Polling\001
+4 0 0 50 0 0 18 0.0000 4 255 825 4050 3300 query()\001
+4 2 0 50 0 0 18 0.0000 4 255 855 7800 3225 check()\001
+4 1 0 50 0 0 18 0.0000 4 255 990 2475 6375 Working\001
+4 0 0 50 0 0 18 0.0000 4 255 1050 3900 5400 prepare()\001
+4 2 0 50 0 0 18 0.0000 4 255 1140 8025 5325 dispatch()\001
+4 1 0 50 0 0 18 0.0000 4 255 990 9150 2250 Working\001
diff --git a/trunk/docs/reference/glib/mainloop-states.gif b/trunk/docs/reference/glib/mainloop-states.gif
new file mode 100644
index 000000000..0ba1a8999
--- /dev/null
+++ b/trunk/docs/reference/glib/mainloop-states.gif
Binary files differ
diff --git a/trunk/docs/reference/glib/mainloop-states.png b/trunk/docs/reference/glib/mainloop-states.png
new file mode 100644
index 000000000..4e9fc9d9a
--- /dev/null
+++ b/trunk/docs/reference/glib/mainloop-states.png
Binary files differ
diff --git a/trunk/docs/reference/glib/regex-syntax.sgml b/trunk/docs/reference/glib/regex-syntax.sgml
new file mode 100644
index 000000000..1b9e52343
--- /dev/null
+++ b/trunk/docs/reference/glib/regex-syntax.sgml
@@ -0,0 +1,2704 @@
+<refentry id="glib-regex-syntax" revision="11 Jul 2006">
+<refmeta>
+<refentrytitle>Regular expression syntax</refentrytitle>
+</refmeta>
+
+<!--
+Based on the man page for pcrepattern.
+
+Remember to sync this document with the file docs/pcrepattern.3 in the
+pcre package when upgrading to a newer version of pcre.
+
+In sync with PCRE 7.0
+-->
+
+<refnamediv>
+<refname>Regular expression syntax</refname>
+<refpurpose>
+Syntax and semantics of the regular expressions supported by GRegex
+</refpurpose>
+</refnamediv>
+
+<refsect1>
+<title>GRegex regular expression details</title>
+<para>
+A regular expression is a pattern that is matched against a
+string from left to right. Most characters stand for themselves in a
+pattern, and match the corresponding characters in the string. As a
+trivial example, the pattern
+</para>
+
+<programlisting>
+The quick brown fox
+</programlisting>
+
+<para>
+matches a portion of a string that is identical to itself. When
+caseless matching is specified (the <varname>G_REGEX_CASELESS</varname> flag), letters are
+matched independently of case.
+</para>
+
+<para>
+The power of regular expressions comes from the ability to include
+alternatives and repetitions in the pattern. These are encoded in the
+pattern by the use of metacharacters, which do not stand for themselves
+but instead are interpreted in some special way.
+</para>
+
+<para>
+There are two different sets of metacharacters: those that are recognized
+anywhere in the pattern except within square brackets, and those
+that are recognized in square brackets. Outside square brackets, the
+metacharacters are as follows:
+</para>
+
+<table frame="all" colsep="1" rowsep="1">
+<title>Metacharacters outside square brackets</title>
+<tgroup cols="2">
+<colspec colnum="1" align="center"/>
+<thead>
+ <row>
+ <entry>Character</entry>
+ <entry>Meaning</entry>
+ </row>
+</thead>
+<tbody>
+ <row>
+ <entry>\</entry>
+ <entry>general escape character with several uses</entry>
+ </row>
+ <row>
+ <entry>^</entry>
+ <entry>assert start of string (or line, in multiline mode)</entry>
+ </row>
+ <row>
+ <entry>$</entry>
+ <entry>assert end of string (or line, in multiline mode)</entry>
+ </row>
+ <row>
+ <entry>.</entry>
+ <entry>match any character except newline (by default)</entry>
+ </row>
+ <row>
+ <entry>[</entry>
+ <entry>start character class definition</entry>
+ </row>
+ <row>
+ <entry>|</entry>
+ <entry>start of alternative branch</entry>
+ </row>
+ <row>
+ <entry>(</entry>
+ <entry>start subpattern</entry>
+ </row>
+ <row>
+ <entry>)</entry>
+ <entry>end subpattern</entry>
+ </row>
+ <row>
+ <entry>?</entry>
+ <entry>extends the meaning of (, or 0/1 quantifier, or quantifier minimizer</entry>
+ </row>
+ <row>
+ <entry>*</entry>
+ <entry>0 or more quantifier</entry>
+ </row>
+ <row>
+ <entry>+</entry>
+ <entry>1 or more quantifier, also "possessive quantifier"</entry>
+ </row>
+ <row>
+ <entry>{</entry>
+ <entry>start min/max quantifier</entry>
+ </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+Part of a pattern that is in square brackets is called a "character
+class". In a character class the only metacharacters are:
+</para>
+
+<table frame="all" colsep="1" rowsep="1">
+<title>Metacharacters inside square brackets</title>
+<tgroup cols="2">
+<colspec colnum="1" align="center"/>
+<thead>
+ <row>
+ <entry>Character</entry>
+ <entry>Meaning</entry>
+ </row>
+</thead>
+<tbody>
+ <row>
+ <entry>\</entry>
+ <entry>general escape character</entry>
+ </row>
+ <row>
+ <entry>^</entry>
+ <entry>negate the class, but only if the first character</entry>
+ </row>
+ <row>
+ <entry>-</entry>
+ <entry>indicates character range</entry>
+ </row>
+ <row>
+ <entry>[</entry>
+ <entry>POSIX character class (only if followed by POSIX syntax)</entry>
+ </row>
+ <row>
+ <entry>]</entry>
+ <entry>terminates the character class</entry>
+ </row>
+</tbody>
+</tgroup>
+</table>
+</refsect1>
+
+<refsect1>
+<title>Backslash</title>
+<para>
+The backslash character has several uses. Firstly, if it is followed by
+a non-alphanumeric character, it takes away any special meaning that
+character may have. This use of backslash as an escape character
+applies both inside and outside character classes.
+</para>
+
+<para>
+For example, if you want to match a * character, you write \* in the
+pattern. This escaping action applies whether or not the following
+character would otherwise be interpreted as a metacharacter, so it is
+always safe to precede a non-alphanumeric with backslash to specify
+that it stands for itself. In particular, if you want to match a
+backslash, you write \\.
+</para>
+
+<para>
+If a pattern is compiled with the <varname>G_REGEX_EXTENDED</varname>
+option, whitespace in the pattern (other than in a character class) and
+characters between a # outside a character class and the next newline
+are ignored.
+An escaping backslash can be used to include a whitespace or # character
+as part of the pattern.
+</para>
+
+<para>
+If you want to remove the special meaning from a sequence of characters,
+you can do so by putting them between \Q and \E.
+The \Q...\E sequence is recognized both inside and outside character
+classes.
+</para>
+
+<refsect2>
+<title>Non-printing characters</title>
+<para>
+A second use of backslash provides a way of encoding non-printing
+characters in patterns in a visible manner. There is no restriction on the
+appearance of non-printing characters, apart from the binary zero that
+terminates a pattern, but when a pattern is being prepared by text
+editing, it is usually easier to use one of the following escape
+sequences than the binary character it represents:
+</para>
+
+<table frame="all" colsep="1" rowsep="1">
+<title>Non-printing characters</title>
+<tgroup cols="2">
+<colspec colnum="1" align="center"/>
+<thead>
+ <row>
+ <entry>Escape</entry>
+ <entry>Meaning</entry>
+ </row>
+</thead>
+<tbody>
+ <row>
+ <entry>\a</entry>
+ <entry>alarm, that is, the BEL character (hex 07)</entry>
+ </row>
+ <row>
+ <entry>\cx</entry>
+ <entry>"control-x", where x is any character</entry>
+ </row>
+ <row>
+ <entry>\e</entry>
+ <entry>escape (hex 1B)</entry>
+ </row>
+ <row>
+ <entry>\f</entry>
+ <entry>formfeed (hex 0C)</entry>
+ </row>
+ <row>
+ <entry>\n</entry>
+ <entry>newline (hex 0A)</entry>
+ </row>
+ <row>
+ <entry>\r</entry>
+ <entry>carriage return (hex 0D)</entry>
+ </row>
+ <row>
+ <entry>\t</entry>
+ <entry>tab (hex 09)</entry>
+ </row>
+ <row>
+ <entry>\ddd</entry>
+ <entry>character with octal code ddd, or backreference</entry>
+ </row>
+ <row>
+ <entry>\xhh</entry>
+ <entry>character with hex code hh</entry>
+ </row>
+ <row>
+ <entry>\x{hhh..}</entry>
+ <entry>character with hex code hhh..</entry>
+ </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The precise effect of \cx is as follows: if x is a lower case letter,
+it is converted to upper case. Then bit 6 of the character (hex 40) is
+inverted. Thus \cz becomes hex 1A, but \c{ becomes hex 3B, while \c;
+becomes hex 7B.
+</para>
+
+<para>
+After \x, from zero to two hexadecimal digits are read (letters can be
+in upper or lower case). Any number of hexadecimal digits may appear
+between \x{ and }, but the value of the character code
+must be less than 2**31 (that is, the maximum hexadecimal value is
+7FFFFFFF). If characters other than hexadecimal digits appear between
+\x{ and }, or if there is no terminating }, this form of escape is not
+recognized. Instead, the initial \x will be interpreted as a basic hexadecimal
+escape, with no following digits, giving a character whose
+value is zero.
+</para>
+
+<para>
+Characters whose value is less than 256 can be defined by either of the
+two syntaxes for \x. There is no difference
+in the way they are handled. For example, \xdc is exactly the same as
+\x{dc}.
+</para>
+
+<para>
+After \0 up to two further octal digits are read. If there are fewer
+than two digits, just those that are present are used.
+Thus the sequence \0\x\07 specifies two binary zeros followed by a BEL
+character (code value 7). Make sure you supply two digits after the
+initial zero if the pattern character that follows is itself an octal
+digit.
+</para>
+
+<para>
+The handling of a backslash followed by a digit other than 0 is complicated.
+Outside a character class, GRegex reads it and any following digits as a
+decimal number. If the number is less than 10, or if there
+have been at least that many previous capturing left parentheses in the
+expression, the entire sequence is taken as a back reference. A
+description of how this works is given later, following the discussion
+of parenthesized subpatterns.
+</para>
+
+<para>
+Inside a character class, or if the decimal number is greater than 9
+and there have not been that many capturing subpatterns, GRegex re-reads
+up to three octal digits following the backslash, and uses them to generate
+a data character. Any subsequent digits stand for themselves. For example:
+</para>
+
+<table frame="all" colsep="1" rowsep="1">
+<title>Non-printing characters</title>
+<tgroup cols="2">
+<colspec colnum="1" align="center"/>
+<thead>
+ <row>
+ <entry>Escape</entry>
+ <entry>Meaning</entry>
+ </row>
+</thead>
+<tbody>
+ <row>
+ <entry>\040</entry>
+ <entry>is another way of writing a space</entry>
+ </row>
+ <row>
+ <entry>\40</entry>
+ <entry>is the same, provided there are fewer than 40 previous capturing subpatterns</entry>
+ </row>
+ <row>
+ <entry>\7</entry>
+ <entry>is always a back reference</entry>
+ </row>
+ <row>
+ <entry>\11</entry>
+ <entry>might be a back reference, or another way of writing a tab</entry>
+ </row>
+ <row>
+ <entry>\011</entry>
+ <entry>is always a tab</entry>
+ </row>
+ <row>
+ <entry>\0113</entry>
+ <entry>is a tab followed by the character "3"</entry>
+ </row>
+ <row>
+ <entry>\113</entry>
+ <entry>might be a back reference, otherwise the character with octal code 113</entry>
+ </row>
+ <row>
+ <entry>\377</entry>
+ <entry>might be a back reference, otherwise the byte consisting entirely of 1 bits</entry>
+ </row>
+ <row>
+ <entry>\81</entry>
+ <entry>is either a back reference, or a binary zero followed by the two characters "8" and "1"</entry>
+ </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+Note that octal values of 100 or greater must not be introduced by a
+leading zero, because no more than three octal digits are ever read.
+</para>
+
+<para>
+All the sequences that define a single character can be used both inside
+and outside character classes. In addition, inside a character class, the
+sequence \b is interpreted as the backspace character (hex 08), and the
+sequences \R and \X are interpreted as the characters "R" and "X", respectively.
+Outside a character class, these sequences have different meanings (see below).
+</para>
+</refsect2>
+
+<refsect2>
+<title>Absolute and relative back references</title>
+<para>
+The sequence \g followed by a positive or negative number, optionally enclosed
+in braces, is an absolute or relative back reference. Back references are
+discussed later, following the discussion of parenthesized subpatterns.
+</para>
+</refsect2>
+
+<refsect2>
+<title>Generic character types</title>
+
+<para>
+Another use of backslash is for specifying generic character types.
+The following are always recognized:
+</para>
+
+<table frame="all" colsep="1" rowsep="1">
+<title>Generic characters</title>
+<tgroup cols="2">
+<colspec colnum="1" align="center"/>
+<thead>
+ <row>
+ <entry>Escape</entry>
+ <entry>Meaning</entry>
+ </row>
+</thead>
+<tbody>
+ <row>
+ <entry>\d</entry>
+ <entry>any decimal digit</entry>
+ </row>
+ <row>
+ <entry>\D</entry>
+ <entry>any character that is not a decimal digit</entry>
+ </row>
+ <row>
+ <entry>\s</entry>
+ <entry>any whitespace character</entry>
+ </row>
+ <row>
+ <entry>\S</entry>
+ <entry>any character that is not a whitespace character</entry>
+ </row>
+ <row>
+ <entry>\w</entry>
+ <entry>any "word" character</entry>
+ </row>
+ <row>
+ <entry>\W</entry>
+ <entry>any "non-word" character</entry>
+ </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+Each pair of escape sequences partitions the complete set of characters
+into two disjoint sets. Any given character matches one, and only one,
+of each pair.
+</para>
+
+<para>
+These character type sequences can appear both inside and outside character
+classes. They each match one character of the appropriate type.
+If the current matching point is at the end of the passed string, all
+of them fail, since there is no character to match.
+</para>
+
+<para>
+For compatibility with Perl, \s does not match the VT character (code
+11). This makes it different from the the POSIX "space" class. The \s
+characters are HT (9), LF (10), FF (12), CR (13), and space (32).
+</para>
+
+<para>
+A "word" character is an underscore or any character less than 256 that
+is a letter or digit.</para>
+
+<para>
+Characters with values greater than 128 never match \d,
+\s, or \w, and always match \D, \S, and \W.
+</para>
+</refsect2>
+
+<refsect2>
+<title>Newline sequences</title>
+<para>Outside a character class, the escape sequence \R matches any Unicode
+newline sequence.
+This particular group matches either the two-character sequence CR followed by
+LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab,
+U+000B), FF (formfeed, U+000C), CR (carriage return, U+000D), NEL (next
+line, U+0085), LS (line separator, U+2028), or PS (paragraph separator, U+2029).
+The two-character sequence is treated as a single unit that
+cannot be split. Inside a character class, \R matches the letter "R".</para>
+</refsect2>
+
+<refsect2>
+<title>Unicode character properties</title>
+<para>
+To support generic character types there are three additional escape
+sequences, they are:
+</para>
+
+<table frame="all" colsep="1" rowsep="1">
+<title>Generic character types</title>
+<tgroup cols="2">
+<colspec colnum="1" align="center"/>
+<thead>
+ <row>
+ <entry>Escape</entry>
+ <entry>Meaning</entry>
+ </row>
+</thead>
+<tbody>
+ <row>
+ <entry>\p{xx}</entry>
+ <entry>a character with the xx property</entry>
+ </row>
+ <row>
+ <entry>\P{xx}</entry>
+ <entry>a character without the xx property</entry>
+ </row>
+ <row>
+ <entry>\X</entry>
+ <entry>an extended Unicode sequence</entry>
+ </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The property names represented by xx above are limited to the Unicode
+script names, the general category properties, and "Any", which matches
+any character (including newline). Other properties such as "InMusicalSymbols"
+are not currently supported. Note that \P{Any} does not match any characters,
+so always causes a match failure.
+</para>
+
+<para>
+Sets of Unicode characters are defined as belonging to certain scripts. A
+character from one of these sets can be matched using a script name. For
+example, \p{Greek} or \P{Han}.
+</para>
+
+<para>
+Those that are not part of an identified script are lumped together as
+"Common". The current list of scripts is:
+</para>
+
+<itemizedlist>
+<listitem><para>Arabic</para></listitem>
+<listitem><para>Armenian</para></listitem>
+<listitem><para>Balinese</para></listitem>
+<listitem><para>Bengali</para></listitem>
+<listitem><para>Bopomofo</para></listitem>
+<listitem><para>Braille</para></listitem>
+<listitem><para>Buginese</para></listitem>
+<listitem><para>Buhid</para></listitem>
+<listitem><para>Canadian_Aboriginal</para></listitem>
+<listitem><para>Cherokee</para></listitem>
+<listitem><para>Common</para></listitem>
+<listitem><para>Coptic</para></listitem>
+<listitem><para>Cuneiform</para></listitem>
+<listitem><para>Cypriot</para></listitem>
+<listitem><para>Cyrillic</para></listitem>
+<listitem><para>Deseret</para></listitem>
+<listitem><para>Devanagari</para></listitem>
+<listitem><para>Ethiopic</para></listitem>
+<listitem><para>Georgian</para></listitem>
+<listitem><para>Glagolitic</para></listitem>
+<listitem><para>Gothic</para></listitem>
+<listitem><para>Greek</para></listitem>
+<listitem><para>Gujarati</para></listitem>
+<listitem><para>Gurmukhi</para></listitem>
+<listitem><para>Han</para></listitem>
+<listitem><para>Hangul</para></listitem>
+<listitem><para>Hanunoo</para></listitem>
+<listitem><para>Hebrew</para></listitem>
+<listitem><para>Hiragana</para></listitem>
+<listitem><para>Inherited</para></listitem>
+<listitem><para>Kannada</para></listitem>
+<listitem><para>Katakana</para></listitem>
+<listitem><para>Kharoshthi</para></listitem>
+<listitem><para>Khmer</para></listitem>
+<listitem><para>Lao</para></listitem>
+<listitem><para>Latin</para></listitem>
+<listitem><para>Limbu</para></listitem>
+<listitem><para>Linear_B</para></listitem>
+<listitem><para>Malayalam</para></listitem>
+<listitem><para>Mongolian</para></listitem>
+<listitem><para>Myanmar</para></listitem>
+<listitem><para>New_Tai_Lue</para></listitem>
+<listitem><para>Nko</para></listitem>
+<listitem><para>Ogham</para></listitem>
+<listitem><para>Old_Italic</para></listitem>
+<listitem><para>Old_Persian</para></listitem>
+<listitem><para>Oriya</para></listitem>
+<listitem><para>Osmanya</para></listitem>
+<listitem><para>Phags_Pa</para></listitem>
+<listitem><para>Phoenician</para></listitem>
+<listitem><para>Runic</para></listitem>
+<listitem><para>Shavian</para></listitem>
+<listitem><para>Sinhala</para></listitem>
+<listitem><para>Syloti_Nagri</para></listitem>
+<listitem><para>Syriac</para></listitem>
+<listitem><para>Tagalog</para></listitem>
+<listitem><para>Tagbanwa</para></listitem>
+<listitem><para>Tai_Le</para></listitem>
+<listitem><para>Tamil</para></listitem>
+<listitem><para>Telugu</para></listitem>
+<listitem><para>Thaana</para></listitem>
+<listitem><para>Thai</para></listitem>
+<listitem><para>Tibetan</para></listitem>
+<listitem><para>Tifinagh</para></listitem>
+<listitem><para>Ugaritic</para></listitem>
+<listitem><para>Yi</para></listitem>
+</itemizedlist>
+
+<para>
+Each character has exactly one general category property, specified by a
+two-letter abbreviation. For compatibility with Perl, negation can be specified
+by including a circumflex between the opening brace and the property name. For
+example, \p{^Lu} is the same as \P{Lu}.
+</para>
+
+<para>
+If only one letter is specified with \p or \P, it includes all the general
+category properties that start with that letter. In this case, in the absence
+of negation, the curly brackets in the escape sequence are optional; these two
+examples have the same effect:
+</para>
+
+<programlisting>
+\p{L}
+\pL
+</programlisting>
+
+<para>
+The following general category property codes are supported:
+</para>
+
+<table frame="all" colsep="1" rowsep="1">
+<title>Property codes</title>
+<tgroup cols="2">
+<colspec colnum="1" align="center"/>
+<thead>
+ <row>
+ <entry>Code</entry>
+ <entry>Meaning</entry>
+ </row>
+</thead>
+<tbody>
+ <row>
+ <entry>C</entry>
+ <entry>Other</entry>
+ </row>
+ <row>
+ <entry>Cc</entry>
+ <entry>Control</entry>
+ </row>
+ <row>
+ <entry>Cf</entry>
+ <entry>Format</entry>
+ </row>
+ <row>
+ <entry>Cn</entry>
+ <entry>Unassigned</entry>
+ </row>
+ <row>
+ <entry>Co</entry>
+ <entry>Private use</entry>
+ </row>
+ <row>
+ <entry>Cs</entry>
+ <entry>Surrogate</entry>
+ </row>
+ <row>
+ <entry>L</entry>
+ <entry>Letter</entry>
+ </row>
+ <row>
+ <entry>Ll</entry>
+ <entry>Lower case letter</entry>
+ </row>
+ <row>
+ <entry>Lm</entry>
+ <entry>Modifier letter</entry>
+ </row>
+ <row>
+ <entry>Lo</entry>
+ <entry>Other letter</entry>
+ </row>
+ <row>
+ <entry>Lt</entry>
+ <entry>Title case letter</entry>
+ </row>
+ <row>
+ <entry>Lu</entry>
+ <entry>Upper case letter</entry>
+ </row>
+ <row>
+ <entry>M</entry>
+ <entry>Mark</entry>
+ </row>
+ <row>
+ <entry>Mc</entry>
+ <entry>Spacing mark</entry>
+ </row>
+ <row>
+ <entry>Me</entry>
+ <entry>Enclosing mark</entry>
+ </row>
+ <row>
+ <entry>Mn</entry>
+ <entry>Non-spacing mark</entry>
+ </row>
+ <row>
+ <entry>N</entry>
+ <entry>Number</entry>
+ </row>
+ <row>
+ <entry>Nd</entry>
+ <entry>Decimal number</entry>
+ </row>
+ <row>
+ <entry>Nl</entry>
+ <entry>Letter number</entry>
+ </row>
+ <row>
+ <entry>No</entry>
+ <entry>Other number</entry>
+ </row>
+ <row>
+ <entry>P</entry>
+ <entry>Punctuation</entry>
+ </row>
+ <row>
+ <entry>Pc</entry>
+ <entry>Connector punctuation</entry>
+ </row>
+ <row>
+ <entry>Pd</entry>
+ <entry>Dash punctuation</entry>
+ </row>
+ <row>
+ <entry>Pe</entry>
+ <entry>Close punctuation</entry>
+ </row>
+ <row>
+ <entry>Pf</entry>
+ <entry>Final punctuation</entry>
+ </row>
+ <row>
+ <entry>Pi</entry>
+ <entry>Initial punctuation</entry>
+ </row>
+ <row>
+ <entry>Po</entry>
+ <entry>Other punctuation</entry>
+ </row>
+ <row>
+ <entry>Ps</entry>
+ <entry>Open punctuation</entry>
+ </row>
+ <row>
+ <entry>S</entry>
+ <entry>Symbol</entry>
+ </row>
+ <row>
+ <entry>Sc</entry>
+ <entry>Currency symbol</entry>
+ </row>
+ <row>
+ <entry>Sk</entry>
+ <entry>Modifier symbol</entry>
+ </row>
+ <row>
+ <entry>Sm</entry>
+ <entry>Mathematical symbol</entry>
+ </row>
+ <row>
+ <entry>So</entry>
+ <entry>Other symbol</entry>
+ </row>
+ <row>
+ <entry>Z</entry>
+ <entry>Separator</entry>
+ </row>
+ <row>
+ <entry>Zl</entry>
+ <entry>Line separator</entry>
+ </row>
+ <row>
+ <entry>Zp</entry>
+ <entry>Paragraph separator</entry>
+ </row>
+ <row>
+ <entry>Zs</entry>
+ <entry>Space separator</entry>
+ </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The special property L&amp; is also supported: it matches a character that has
+the Lu, Ll, or Lt property, in other words, a letter that is not classified as
+a modifier or "other".
+</para>
+
+<para>
+The long synonyms for these properties that Perl supports (such as \ep{Letter})
+are not supported by GRegex, nor is it permitted to prefix any of these
+properties with "Is".
+</para>
+
+<para>
+No character that is in the Unicode table has the Cn (unassigned) property.
+Instead, this property is assumed for any code point that is not in the
+Unicode table.
+</para>
+
+<para>
+Specifying caseless matching does not affect these escape sequences.
+For example, \p{Lu} always matches only upper case letters.
+</para>
+
+<para>
+The \X escape matches any number of Unicode characters that form an
+extended Unicode sequence. \X is equivalent to
+</para>
+
+<programlisting>
+(?&gt;\PM\pM*)
+</programlisting>
+
+<para>
+That is, it matches a character without the "mark" property, followed
+by zero or more characters with the "mark" property, and treats the
+sequence as an atomic group (see below). Characters with the "mark"
+property are typically accents that affect the preceding character.
+</para>
+
+<para>
+Matching characters by Unicode property is not fast, because GRegex has
+to search a structure that contains data for over fifteen thousand
+characters. That is why the traditional escape sequences such as \d and
+\w do not use Unicode properties.
+</para>
+</refsect2>
+
+<refsect2>
+<title>Simple assertions</title>
+<para>
+The final use of backslash is for certain simple assertions. An
+assertion specifies a condition that has to be met at a particular point in
+a match, without consuming any characters from the string. The
+use of subpatterns for more complicated assertions is described below.
+The backslashed assertions are:
+</para>
+
+<table frame="all" colsep="1" rowsep="1">
+<title>Simple assertions</title>
+<tgroup cols="2">
+<colspec colnum="1" align="center"/>
+<thead>
+ <row>
+ <entry>Escape</entry>
+ <entry>Meaning</entry>
+ </row>
+</thead>
+<tbody>
+ <row>
+ <entry>\b</entry>
+ <entry>matches at a word boundary</entry>
+ </row>
+ <row>
+ <entry>\B</entry>
+ <entry>matches when not at a word boundary</entry>
+ </row>
+ <row>
+ <entry>\A</entry>
+ <entry>matches at the start of the string</entry>
+ </row>
+ <row>
+ <entry>\Z</entry>
+ <entry>matches at the end of the string or before a newline at the end of the string</entry>
+ </row>
+ <row>
+ <entry>\z</entry>
+ <entry>matches only at the end of the string</entry>
+ </row>
+ <row>
+ <entry>\G</entry>
+ <entry>matches at first matching position in the string</entry>
+ </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+These assertions may not appear in character classes (but note that \b
+has a different meaning, namely the backspace character, inside a
+character class).
+</para>
+
+<para>
+A word boundary is a position in the string where the current
+character and the previous character do not both match \w or \W (i.e.
+one matches \w and the other matches \W), or the start or end of the
+string if the first or last character matches \w, respectively.
+</para>
+
+<para>
+The \A, \Z, and \z assertions differ from the traditional circumflex
+and dollar (described in the next section) in that they only ever match
+at the very start and end of the string, whatever options are
+set. Thus, they are independent of multiline mode. These three assertions
+are not affected by the <varname>G_REGEX_MATCH_NOTBOL</varname> or <varname>G_REGEX_MATCH_NOTEOL</varname> options,
+which affect only the behaviour of the circumflex and dollar metacharacters.
+However, if the start_position argument of a matching function is non-zero,
+indicating that matching is to start at a point other than the beginning of
+the string, \A can never match. The difference between \Z and \z is
+that \Z matches before a newline at the end of the string as well at the
+very end, whereas \z matches only at the end.
+</para>
+
+<para>
+The \G assertion is true only when the current matching position is at
+the start point of the match, as specified by the start_position argument
+to the matching functions. It differs from \A when the value of startoffset is
+non-zero.
+</para>
+
+<para>
+Note, however, that the interpretation of \G, as the start of the
+current match, is subtly different from Perl’s, which defines it as the
+end of the previous match. In Perl, these can be different when the
+previously matched string was empty.
+</para>
+
+<para>
+If all the alternatives of a pattern begin with \G, the expression is
+anchored to the starting match position, and the "anchored" flag is set
+in the compiled regular expression.
+</para>
+</refsect2>
+</refsect1>
+
+<refsect1>
+<title>Circumflex and dollar</title>
+<para>
+Outside a character class, in the default matching mode, the circumflex
+character is an assertion that is true only if the current matching
+point is at the start of the string. If the start_position argument to
+the matching functions is non-zero, circumflex can never match if the
+<varname>G_REGEX_MULTILINE</varname> option is unset. Inside a character class, circumflex
+has an entirely different meaning (see below).
+</para>
+
+<para>
+Circumflex need not be the first character of the pattern if a number
+of alternatives are involved, but it should be the first thing in each
+alternative in which it appears if the pattern is ever to match that
+branch. If all possible alternatives start with a circumflex, that is,
+if the pattern is constrained to match only at the start of the string,
+it is said to be an "anchored" pattern. (There are also other
+constructs that can cause a pattern to be anchored.)
+</para>
+
+<para>
+A dollar character is an assertion that is true only if the current
+matching point is at the end of the string, or immediately
+before a newline at the end of the string (by default). Dollar need not
+be the last character of the pattern if a number of alternatives are
+involved, but it should be the last item in any branch in which it
+appears. Dollar has no special meaning in a character class.
+</para>
+
+<para>
+The meaning of dollar can be changed so that it matches only at the
+very end of the string, by setting the <varname>G_REGEX_DOLLAR_ENDONLY</varname> option at
+compile time. This does not affect the \Z assertion.
+</para>
+
+<para>
+The meanings of the circumflex and dollar characters are changed if the
+<varname>G_REGEX_MULTILINE</varname> option is set. When this is the case,
+a circumflex matches immediately after internal newlines as well as at the
+start of the string. It does not match after a newline that ends the string.
+A dollar matches before any newlines in the string, as well as at the very
+end, when <varname>G_REGEX_MULTILINE</varname> is set. When newline is
+specified as the two-character sequence CRLF, isolated CR and LF characters
+do not indicate newlines.
+</para>
+
+<para>
+For example, the pattern /^abc$/ matches the string "def\nabc" (where
+\n represents a newline) in multiline mode, but not otherwise. Consequently,
+patterns that are anchored in single line mode because all branches start with
+^ are not anchored in multiline mode, and a match for circumflex is possible
+when the <varname>start_position</varname> argument of a matching function
+is non-zero. The <varname>G_REGEX_DOLLAR_ENDONLY</varname> option is ignored
+if <varname>G_REGEX_MULTILINE</varname> is set.
+</para>
+
+<para>
+Note that the sequences \A, \Z, and \z can be used to match the start and
+end of the string in both modes, and if all branches of a pattern start with
+\A it is always anchored, whether or not <varname>G_REGEX_MULTILINE</varname>
+is set.
+</para>
+</refsect1>
+
+<refsect1>
+<title>Full stop (period, dot)</title>
+<para>
+Outside a character class, a dot in the pattern matches any one character
+in the string, including a non-printing character, but not (by
+default) newline. In UTF-8 a character might be more than one byte long.
+</para>
+
+<para>
+When a line ending is defined as a single character, dot never matches that
+character; when the two-character sequence CRLF is used, dot does not match CR
+if it is immediately followed by LF, but otherwise it matches all characters
+(including isolated CRs and LFs). When any Unicode line endings are being
+recognized, dot does not match CR or LF or any of the other line ending
+characters.
+</para>
+
+<para>
+If the <varname>G_REGEX_DOTALL</varname> flag is set, dots match newlines
+as well. The handling of dot is entirely independent of the handling of circumflex
+and dollar, the only relationship being that they both involve newline
+characters. Dot has no special meaning in a character class.
+</para>
+
+<para>
+The behaviour of dot with regard to newlines can be changed. If the
+<varname>G_REGEX_DOTALL</varname> option is set, a dot matches any one
+character, without exception. If newline is defined as the two-character
+sequence CRLF, it takes two dots to match it.
+</para>
+
+<para>
+The handling of dot is entirely independent of the handling of circumflex and
+dollar, the only relationship being that they both involve newlines. Dot has no
+special meaning in a character class.
+</para>
+</refsect1>
+
+<refsect1>
+<title>Matching a single byte</title>
+<para>
+Outside a character class, the escape sequence \C matches any one byte,
+both in and out of UTF-8 mode. Unlike a dot, it always matches any line
+ending characters.
+The feature is provided in Perl in order to match individual bytes in
+UTF-8 mode. Because it breaks up UTF-8 characters into individual
+bytes, what remains in the string may be a malformed UTF-8 string. For
+this reason, the \C escape sequence is best avoided.
+</para>
+
+<para>
+GRegex does not allow \C to appear in lookbehind assertions (described
+below), because in UTF-8 mode this would make it impossible to calculate
+the length of the lookbehind.
+</para>
+</refsect1>
+
+<refsect1>
+<title>Square brackets and character classes</title>
+<para>
+An opening square bracket introduces a character class, terminated by a
+closing square bracket. A closing square bracket on its own is not special. If a closing square bracket is required as a member of the class,
+it should be the first data character in the class (after an initial
+circumflex, if present) or escaped with a backslash.
+</para>
+
+<para>
+A character class matches a single character in the string. A matched character
+must be in the set of characters defined by the class, unless the first
+character in the class definition is a circumflex, in which case the
+string character must not be in the set defined by the class. If a
+circumflex is actually required as a member of the class, ensure it is
+not the first character, or escape it with a backslash.
+</para>
+
+<para>
+For example, the character class [aeiou] matches any lower case vowel,
+while [^aeiou] matches any character that is not a lower case vowel.
+Note that a circumflex is just a convenient notation for specifying the
+characters that are in the class by enumerating those that are not. A
+class that starts with a circumflex is not an assertion: it still consumes
+a character from the string, and therefore it fails if the current pointer
+is at the end of the string.
+</para>
+
+<para>
+In UTF-8 mode, characters with values greater than 255 can be included
+in a class as a literal string of bytes, or by using the \x{ escaping
+mechanism.
+</para>
+
+<para>
+When caseless matching is set, any letters in a class represent both
+their upper case and lower case versions, so for example, a caseless
+[aeiou] matches "A" as well as "a", and a caseless [^aeiou] does not
+match "A", whereas a caseful version would.
+</para>
+
+<para>
+Characters that might indicate line breaks are never treated
+in any special way when matching character classes, whatever line-ending
+sequence is in use, and whatever setting of the <varname>G_REGEX_DOTALL</varname>
+and <varname>G_REGEX_MULTILINE</varname> options is used. A class such as [^a]
+always matches one of these characters.
+</para>
+
+<para>
+The minus (hyphen) character can be used to specify a range of characters in
+a character class. For example, [d-m] matches any letter
+between d and m, inclusive. If a minus character is required in a
+class, it must be escaped with a backslash or appear in a position
+where it cannot be interpreted as indicating a range, typically as the
+first or last character in the class.
+</para>
+
+<para>
+It is not possible to have the literal character "]" as the end character
+of a range. A pattern such as [W-]46] is interpreted as a class of
+two characters ("W" and "-") followed by a literal string "46]", so it
+would match "W46]" or "-46]". However, if the "]" is escaped with a
+backslash it is interpreted as the end of range, so [W-\]46] is interpreted
+as a class containing a range followed by two other characters.
+The octal or hexadecimal representation of "]" can also be used to end
+a range.
+</para>
+
+<para>
+Ranges operate in the collating sequence of character values. They can
+also be used for characters specified numerically, for example
+[\000-\037]. In UTF-8 mode, ranges can include characters whose values
+are greater than 255, for example [\x{100}-\x{2ff}].
+</para>
+
+<para>
+The character types \d, \D, \p, \P, \s, \S, \w, and \W may also appear
+in a character class, and add the characters that they match to the
+class. For example, [\dABCDEF] matches any hexadecimal digit. A
+circumflex can conveniently be used with the upper case character types to
+specify a more restricted set of characters than the matching lower
+case type. For example, the class [^\W_] matches any letter or digit,
+but not underscore.
+</para>
+
+<para>
+The only metacharacters that are recognized in character classes are
+backslash, hyphen (only where it can be interpreted as specifying a
+range), circumflex (only at the start), opening square bracket (only
+when it can be interpreted as introducing a POSIX class name - see the
+next section), and the terminating closing square bracket. However,
+escaping other non-alphanumeric characters does no harm.
+</para>
+</refsect1>
+
+<refsect1>
+<title>Posix character classes</title>
+<para>
+GRegex supports the POSIX notation for character classes. This uses names
+enclosed by [: and :] within the enclosing square brackets. For example,
+</para>
+
+<programlisting>
+[01[:alpha:]%]
+</programlisting>
+
+<para>
+matches "0", "1", any alphabetic character, or "%". The supported class
+names are
+</para>
+
+<table frame="all" colsep="1" rowsep="1">
+<title>Posix classes</title>
+<tgroup cols="2">
+<colspec colnum="1" align="center"/>
+<thead>
+ <row>
+ <entry>Name</entry>
+ <entry>Meaning</entry>
+ </row>
+</thead>
+<tbody>
+ <row>
+ <entry>alnum</entry>
+ <entry>letters and digits</entry>
+ </row>
+ <row>
+ <entry>alpha</entry>
+ <entry>letters</entry>
+ </row>
+ <row>
+ <entry>ascii</entry>
+ <entry>character codes 0 - 127</entry>
+ </row>
+ <row>
+ <entry>blank</entry>
+ <entry>space or tab only</entry>
+ </row>
+ <row>
+ <entry>cntrl</entry>
+ <entry>control characters</entry>
+ </row>
+ <row>
+ <entry>digit</entry>
+ <entry>decimal digits (same as \d)</entry>
+ </row>
+ <row>
+ <entry>graph</entry>
+ <entry>printing characters, excluding space</entry>
+ </row>
+ <row>
+ <entry>lower</entry>
+ <entry>lower case letters</entry>
+ </row>
+ <row>
+ <entry>print</entry>
+ <entry>printing characters, including space</entry>
+ </row>
+ <row>
+ <entry>punct</entry>
+ <entry>printing characters, excluding letters and digits</entry>
+ </row>
+ <row>
+ <entry>space</entry>
+ <entry>white space (not quite the same as \s)</entry>
+ </row>
+ <row>
+ <entry>upper</entry>
+ <entry>upper case letters</entry>
+ </row>
+ <row>
+ <entry>word</entry>
+ <entry>"word" characters (same as \w)</entry>
+ </row>
+ <row>
+ <entry>xdigit</entry>
+ <entry>hexadecimal digits</entry>
+ </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13),
+and space (32). Notice that this list includes the VT character (code
+11). This makes "space" different to \s, which does not include VT (for
+Perl compatibility).
+</para>
+
+<para>
+The name "word" is a Perl extension, and "blank" is a GNU extension.
+Another Perl extension is negation, which is indicated by a ^ character
+after the colon. For example,
+</para>
+
+<programlisting>
+[12[:^digit:]]
+</programlisting>
+
+<para>
+matches "1", "2", or any non-digit. GRegex also recognize the
+POSIX syntax [.ch.] and [=ch=] where "ch" is a "collating element", but
+these are not supported, and an error is given if they are encountered.
+</para>
+
+<para>
+In UTF-8 mode, characters with values greater than 128 do not match any
+of the POSIX character classes.
+</para>
+</refsect1>
+
+<refsect1>
+<title>Vertical bar</title>
+<para>
+Vertical bar characters are used to separate alternative patterns. For
+example, the pattern
+</para>
+
+<programlisting>
+ gilbert|sullivan
+</programlisting>
+
+<para>
+matches either "gilbert" or "sullivan". Any number of alternatives may
+appear, and an empty alternative is permitted (matching the empty
+string). The matching process tries each alternative in turn, from
+left to right, and the first one that succeeds is used. If the alternatives are within a subpattern (defined below), "succeeds" means matching the rest of the main pattern as well as the alternative in the subpattern.
+</para>
+</refsect1>
+
+<refsect1>
+<title>Internal option setting</title>
+<para>
+The settings of the <varname>G_REGEX_CASELESS</varname>, <varname>G_REGEX_MULTILINE</varname>, <varname>G_REGEX_MULTILINE</varname>,
+and <varname>G_REGEX_EXTENDED</varname> options can be changed from within the pattern by a
+sequence of Perl-style option letters enclosed between "(?" and ")". The
+option letters are
+</para>
+
+<table frame="all" colsep="1" rowsep="1">
+<title>Option settings</title>
+<tgroup cols="2">
+<colspec colnum="1" align="center"/>
+<thead>
+ <row>
+ <entry>Option</entry>
+ <entry>Flag</entry>
+ </row>
+</thead>
+<tbody>
+ <row>
+ <entry>i</entry>
+ <entry><varname>G_REGEX_CASELESS</varname></entry>
+ </row>
+ <row>
+ <entry>m</entry>
+ <entry><varname>G_REGEX_MULTILINE</varname></entry>
+ </row>
+ <row>
+ <entry>s</entry>
+ <entry><varname>G_REGEX_DOTALL</varname></entry>
+ </row>
+ <row>
+ <entry>x</entry>
+ <entry><varname>G_REGEX_EXTENDED</varname></entry>
+ </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+For example, (?im) sets caseless, multiline matching. It is also
+possible to unset these options by preceding the letter with a hyphen, and a
+combined setting and unsetting such as (?im-sx), which sets <varname>G_REGEX_CASELESS</varname>
+and <varname>G_REGEX_MULTILINE</varname> while unsetting <varname>G_REGEX_DOTALL</varname> and <varname>G_REGEX_EXTENDED</varname>,
+is also permitted. If a letter appears both before and after the
+hyphen, the option is unset.
+</para>
+
+<para>
+When an option change occurs at top level (that is, not inside subpattern
+parentheses), the change applies to the remainder of the pattern
+that follows.
+</para>
+
+<para>
+An option change within a subpattern (see below for a description of subpatterns)
+affects only that part of the current pattern that follows it, so
+</para>
+
+<programlisting>
+(a(?i)b)c
+</programlisting>
+
+<para>
+matches abc and aBc and no other strings (assuming <varname>G_REGEX_CASELESS</varname> is not
+used). By this means, options can be made to have different settings
+in different parts of the pattern. Any changes made in one alternative
+do carry on into subsequent branches within the same subpattern. For
+example,
+</para>
+
+<programlisting>
+(a(?i)b|c)
+</programlisting>
+
+<para>
+matches "ab", "aB", "c", and "C", even though when matching "C" the
+first branch is abandoned before the option setting. This is because
+the effects of option settings happen at compile time. There would be
+some very weird behaviour otherwise.
+</para>
+
+<para>
+The options <varname>G_REGEX_UNGREEDY</varname> and
+<varname>G_REGEX_EXTRA</varname> and <varname>G_REGEX_DUPNAMES</varname>
+can be changed in the same way as the Perl-compatible options by using
+the characters U, X and J respectively.
+</para>
+</refsect1>
+
+<refsect1>
+<title>Subpatterns</title>
+<para>
+Subpatterns are delimited by parentheses (round brackets), which can be
+nested. Turning part of a pattern into a subpattern does two things:
+</para>
+
+<itemizedlist>
+<listitem><para>
+It localizes a set of alternatives. For example, the pattern
+cat(aract|erpillar|) matches one of the words "cat", "cataract", or
+"caterpillar". Without the parentheses, it would match "cataract",
+"erpillar" or an empty string.
+</para></listitem>
+<listitem><para>
+It sets up the subpattern as a capturing subpattern. This means
+that, when the whole pattern matches, that portion of the
+string that matched the subpattern can be obtained using <function>g_regex_fetch()</function>.
+Opening parentheses are counted from left to right (starting from 1, as
+subpattern 0 is the whole matched string) to obtain numbers for the
+capturing subpatterns.
+</para></listitem>
+</itemizedlist>
+
+<para>
+For example, if the string "the red king" is matched against the pattern
+</para>
+
+<programlisting>
+the ((red|white) (king|queen))
+</programlisting>
+
+<para>
+the captured substrings are "red king", "red", and "king", and are numbered 1, 2, and 3, respectively.
+</para>
+
+<para>
+The fact that plain parentheses fulfil two functions is not always
+helpful. There are often times when a grouping subpattern is required
+without a capturing requirement. If an opening parenthesis is followed
+by a question mark and a colon, the subpattern does not do any capturing,
+and is not counted when computing the number of any subsequent
+capturing subpatterns. For example, if the string "the white queen" is
+matched against the pattern
+</para>
+
+<programlisting>
+the ((?:red|white) (king|queen))
+</programlisting>
+
+<para>
+the captured substrings are "white queen" and "queen", and are numbered
+1 and 2. The maximum number of capturing subpatterns is 65535.
+</para>
+
+<para>
+As a convenient shorthand, if any option settings are required at the
+start of a non-capturing subpattern, the option letters may appear
+between the "?" and the ":". Thus the two patterns
+</para>
+
+<programlisting>
+(?i:saturday|sunday)
+(?:(?i)saturday|sunday)
+</programlisting>
+
+<para>
+match exactly the same set of strings. Because alternative branches are
+tried from left to right, and options are not reset until the end of
+the subpattern is reached, an option setting in one branch does affect
+subsequent branches, so the above patterns match "SUNDAY" as well as
+"Saturday".
+</para>
+</refsect1>
+
+<refsect1>
+<title>Named subpatterns</title>
+<para>
+Identifying capturing parentheses by number is simple, but it can be
+very hard to keep track of the numbers in complicated regular expressions.
+Furthermore, if an expression is modified, the numbers may
+change. To help with this difficulty, GRegex supports the naming of
+subpatterns. A subpattern can be named in one of three ways: (?&lt;name&gt;...) or
+(?'name'...) as in Perl, or (?P&lt;name&gt;...) as in Python.
+References to capturing parentheses from other
+parts of the pattern, such as backreferences, recursion, and conditions,
+can be made by name as well as by number.
+</para>
+
+<para>
+Names consist of up to 32 alphanumeric characters and underscores. Named
+capturing parentheses are still allocated numbers as well as names, exactly as
+if the names were not present.
+By default, a name must be unique within a pattern, but it is possible to relax
+this constraint by setting the <varname>G_REGEX_DUPNAMES</varname> option at
+compile time. This can be useful for patterns where only one instance of the
+named parentheses can match. Suppose you want to match the name of a weekday,
+either as a 3-letter abbreviation or as the full name, and in both cases you
+want to extract the abbreviation. This pattern (ignoring the line breaks) does
+the job:
+</para>
+
+<programlisting>
+(?&lt;DN&gt;Mon|Fri|Sun)(?:day)?|
+(?&lt;DN&gt;Tue)(?:sday)?|
+(?&lt;DN&gt;Wed)(?:nesday)?|
+(?&lt;DN&gt;Thu)(?:rsday)?|
+(?&lt;DN&gt;Sat)(?:urday)?
+</programlisting>
+
+<para>
+There are five capturing substrings, but only one is ever set after a match.
+The function for extracting the data by name returns the substring
+for the first (and in this example, the only) subpattern of that name that
+matched. This saves searching to find which numbered subpattern it was. If you
+make a reference to a non-unique named subpattern from elsewhere in the
+pattern, the one that corresponds to the lowest number is used.
+</para>
+</refsect1>
+
+<refsect1>
+<title>Repetition</title>
+<para>
+Repetition is specified by quantifiers, which can follow any of the
+following items:
+</para>
+
+<itemizedlist>
+<listitem><para>a literal data character</para></listitem>
+<listitem><para>the dot metacharacter</para></listitem>
+<listitem><para>the \C escape sequence</para></listitem>
+<listitem><para>the \X escape sequence (in UTF-8 mode)</para></listitem>
+<listitem><para>the \R escape sequence</para></listitem>
+<listitem><para>an escape such as \d that matches a single character</para></listitem>
+<listitem><para>a character class</para></listitem>
+<listitem><para>a back reference (see next section)</para></listitem>
+<listitem><para>a parenthesized subpattern (unless it is an assertion)</para></listitem>
+</itemizedlist>
+
+<para>
+The general repetition quantifier specifies a minimum and maximum number
+of permitted matches, by giving the two numbers in curly brackets
+(braces), separated by a comma. The numbers must be less than 65536,
+and the first must be less than or equal to the second. For example:
+</para>
+
+<programlisting>
+z{2,4}
+</programlisting>
+
+<para>
+matches "zz", "zzz", or "zzzz". A closing brace on its own is not a
+special character. If the second number is omitted, but the comma is
+present, there is no upper limit; if the second number and the comma
+are both omitted, the quantifier specifies an exact number of required
+matches. Thus
+</para>
+
+<programlisting>
+[aeiou]{3,}
+</programlisting>
+
+<para>
+matches at least 3 successive vowels, but may match many more, while
+</para>
+
+<programlisting>
+\d{8}
+</programlisting>
+
+<para>
+matches exactly 8 digits. An opening curly bracket that appears in a
+position where a quantifier is not allowed, or one that does not match
+the syntax of a quantifier, is taken as a literal character. For example,
+{,6} is not a quantifier, but a literal string of four characters.
+</para>
+
+<para>
+In UTF-8 mode, quantifiers apply to UTF-8 characters rather than to
+individual bytes. Thus, for example, \x{100}{2} matches two UTF-8
+characters, each of which is represented by a two-byte sequence. Similarly,
+\X{3} matches three Unicode extended sequences, each of which may be
+several bytes long (and they may be of different lengths).
+</para>
+
+<para>
+The quantifier {0} is permitted, causing the expression to behave as if
+the previous item and the quantifier were not present.
+</para>
+
+<para>
+For convenience, the three most common quantifiers have single-character
+abbreviations:
+</para>
+
+<table frame="all" colsep="1" rowsep="1">
+<title>Abbreviations for quantifiers</title>
+<tgroup cols="2">
+<colspec colnum="1" align="center"/>
+<thead>
+ <row>
+ <entry>Abbreviation</entry>
+ <entry>Meaning</entry>
+ </row>
+</thead>
+<tbody>
+ <row>
+ <entry>*</entry>
+ <entry>is equivalent to {0,}</entry>
+ </row>
+ <row>
+ <entry>+</entry>
+ <entry>is equivalent to {1,}</entry>
+ </row>
+ <row>
+ <entry>?</entry>
+ <entry>is equivalent to {0,1}</entry>
+ </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+It is possible to construct infinite loops by following a subpattern
+that can match no characters with a quantifier that has no upper limit,
+for example:
+</para>
+
+<programlisting>
+(a?)*
+</programlisting>
+
+<para>
+Because there are cases where this can be useful, such patterns are
+accepted, but if any repetition of the subpattern does in fact match
+no characters, the loop is forcibly broken.
+</para>
+
+<para>
+By default, the quantifiers are "greedy", that is, they match as much
+as possible (up to the maximum number of permitted times), without
+causing the rest of the pattern to fail. The classic example of where
+this gives problems is in trying to match comments in C programs. These
+appear between /* and */ and within the comment, individual * and /
+characters may appear. An attempt to match C comments by applying the
+pattern
+</para>
+
+<programlisting>
+/\*.*\*/
+</programlisting>
+
+<para>
+to the string
+</para>
+
+<programlisting>
+/* first comment */ not comment /* second comment */
+</programlisting>
+
+<para>
+fails, because it matches the entire string owing to the greediness of
+the .* item.
+</para>
+
+<para>
+However, if a quantifier is followed by a question mark, it ceases to
+be greedy, and instead matches the minimum number of times possible, so
+the pattern
+</para>
+
+<programlisting>
+/\*.*?\*/
+</programlisting>
+
+<para>
+does the right thing with the C comments. The meaning of the various
+quantifiers is not otherwise changed, just the preferred number of
+matches. Do not confuse this use of question mark with its use as a
+quantifier in its own right. Because it has two uses, it can sometimes
+appear doubled, as in
+</para>
+
+<programlisting>
+\d??\d
+</programlisting>
+
+<para>
+which matches one digit by preference, but can match two if that is the
+only way the rest of the pattern matches.
+</para>
+
+<para>
+If the <varname>G_REGEX_UNGREEDY</varname> flag is set, the quantifiers are not greedy
+by default, but individual ones can be made greedy by following them with
+a question mark. In other words, it inverts the default behaviour.
+</para>
+
+<para>
+When a parenthesized subpattern is quantified with a minimum repeat
+count that is greater than 1 or with a limited maximum, more memory is
+required for the compiled pattern, in proportion to the size of the
+minimum or maximum.
+</para>
+
+<para>
+If a pattern starts with .* or .{0,} and the <varname>G_REGEX_DOTALL</varname> flag
+is set, thus allowing the dot to match newlines, the
+pattern is implicitly anchored, because whatever follows will be tried
+against every character position in the string, so there is no
+point in retrying the overall match at any position after the first.
+GRegex normally treats such a pattern as though it were preceded by \A.
+</para>
+
+<para>
+In cases where it is known that the string contains no newlines, it
+is worth setting <varname>G_REGEX_DOTALL</varname> in order to obtain this optimization,
+or alternatively using ^ to indicate anchoring explicitly.
+</para>
+
+<para>
+However, there is one situation where the optimization cannot be used.
+When .* is inside capturing parentheses that are the subject of a
+backreference elsewhere in the pattern, a match at the start may fail
+where a later one succeeds. Consider, for example:
+</para>
+
+<programlisting>
+(.*)abc\1
+</programlisting>
+
+<para>
+If the string is "xyz123abc123" the match point is the fourth character.
+For this reason, such a pattern is not implicitly anchored.
+</para>
+
+<para>
+When a capturing subpattern is repeated, the value captured is the
+substring that matched the final iteration. For example, after
+</para>
+
+<programlisting>
+(tweedle[dume]{3}\s*)+
+</programlisting>
+
+<para>
+has matched "tweedledum tweedledee" the value of the captured substring
+is "tweedledee". However, if there are nested capturing subpatterns,
+the corresponding captured values may have been set in previous iterations.
+For example, after
+</para>
+
+<programlisting>
+/(a|(b))+/
+</programlisting>
+
+<para>
+matches "aba" the value of the second captured substring is "b".
+</para>
+</refsect1>
+
+<refsect1>
+<title>Atomic grouping and possessive quantifiers</title>
+<para>
+With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy")
+repetition, failure of what follows normally causes the repeated
+item to be re-evaluated to see if a different number
+of repeats allows the rest of the pattern to match. Sometimes it
+is useful to prevent this, either to change the nature of the
+match, or to cause it fail earlier than it otherwise might, when the
+author of the pattern knows there is no point in carrying on.
+</para>
+
+<para>
+Consider, for example, the pattern \d+foo when applied to the string
+</para>
+
+<programlisting>
+123456bar
+</programlisting>
+
+<para>
+After matching all 6 digits and then failing to match "foo", the normal
+action of the matcher is to try again with only 5 digits matching the
+\d+ item, and then with 4, and so on, before ultimately failing.
+"Atomic grouping" (a term taken from Jeffrey Friedl’s book) provides
+the means for specifying that once a subpattern has matched, it is not
+to be re-evaluated in this way.
+</para>
+
+<para>
+If we use atomic grouping for the previous example, the matcher
+give up immediately on failing to match "foo" the first time. The notation
+is a kind of special parenthesis, starting with (?&gt; as in this
+example:
+</para>
+
+<programlisting>
+(?>\d+)foo
+</programlisting>
+
+<para>
+This kind of parenthesis "locks up" the part of the pattern it contains
+once it has matched, and a failure further into the pattern is
+prevented from backtracking into it. Backtracking past it to previous
+items, however, works as normal.
+</para>
+
+<para>
+An alternative description is that a subpattern of this type matches
+the string of characters that an identical standalone pattern would
+match, if anchored at the current point in the string.
+</para>
+
+<para>
+Atomic grouping subpatterns are not capturing subpatterns. Simple cases
+such as the above example can be thought of as a maximizing repeat that
+must swallow everything it can. So, while both \d+ and \d+? are prepared
+to adjust the number of digits they match in order to make the
+rest of the pattern match, (?>\d+) can only match an entire sequence of
+digits.
+</para>
+
+<para>
+Atomic groups in general can of course contain arbitrarily complicated
+subpatterns, and can be nested. However, when the subpattern for an
+atomic group is just a single repeated item, as in the example above, a
+simpler notation, called a "possessive quantifier" can be used. This
+consists of an additional + character following a quantifier. Using
+this notation, the previous example can be rewritten as
+</para>
+
+<programlisting>
+\d++foo
+</programlisting>
+
+<para>
+Possessive quantifiers are always greedy; the setting of the
+<varname>G_REGEX_UNGREEDY</varname> option is ignored. They are a convenient notation for the
+simpler forms of atomic group. However, there is no difference in the
+meaning of a possessive quantifier and the equivalent
+atomic group, though there may be a performance difference;
+possessive quantifiers should be slightly faster.
+</para>
+
+<para>
+The possessive quantifier syntax is an extension to the Perl syntax.
+It was invented by Jeffrey Friedl in the first edition of his book and
+then implemented by Mike McCloskey in Sun's Java package.
+It ultimately found its way into Perl at release 5.10.
+</para>
+
+<para>
+GRegex has an optimization that automatically "possessifies" certain simple
+pattern constructs. For example, the sequence A+B is treated as A++B because
+there is no point in backtracking into a sequence of A's when B must follow.
+</para>
+
+<para>
+When a pattern contains an unlimited repeat inside a subpattern that
+can itself be repeated an unlimited number of times, the use of an
+atomic group is the only way to avoid some failing matches taking a
+very long time indeed. The pattern
+</para>
+
+<programlisting>
+(\D+|&lt;\d+&gt;)*[!?]
+</programlisting>
+
+<para>
+matches an unlimited number of substrings that either consist of non-
+digits, or digits enclosed in &lt;&gt;, followed by either ! or ?. When it
+matches, it runs quickly. However, if it is applied to
+</para>
+
+<programlisting>
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+</programlisting>
+
+<para>
+it takes a long time before reporting failure. This is because the
+string can be divided between the internal \D+ repeat and the external
+* repeat in a large number of ways, and all have to be tried. (The
+example uses [!?] rather than a single character at the end, because
+GRegex has an optimization that allows for fast failure
+when a single character is used. It remember the last single character
+that is required for a match, and fail early if it is not present
+in the string.) If the pattern is changed so that it uses an atomic
+group, like this:
+</para>
+
+<programlisting>
+((?>\D+)|&lt;\d+&gt;)*[!?]
+</programlisting>
+
+<para>
+sequences of non-digits cannot be broken, and failure happens quickly.
+</para>
+</refsect1>
+
+<refsect1>
+<title>Back references</title>
+<para>
+Outside a character class, a backslash followed by a digit greater than
+0 (and possibly further digits) is a back reference to a capturing subpattern
+earlier (that is, to its left) in the pattern, provided there have been that
+many previous capturing left parentheses.
+</para>
+
+<para>
+However, if the decimal number following the backslash is less than 10,
+it is always taken as a back reference, and causes an error only if
+there are not that many capturing left parentheses in the entire pattern.
+In other words, the parentheses that are referenced need not be
+to the left of the reference for numbers less than 10. A "forward back
+reference" of this type can make sense when a repetition is involved and
+the subpattern to the right has participated in an earlier iteration.
+</para>
+
+<para>
+It is not possible to have a numerical "forward back reference" to subpattern
+whose number is 10 or more using this syntax because a sequence such as \e50 is
+interpreted as a character defined in octal. See the subsection entitled
+"Non-printing characters" above for further details of the handling of digits
+following a backslash. There is no such problem when named parentheses are used.
+A back reference to any subpattern is possible using named parentheses (see below).
+</para>
+
+<para>
+Another way of avoiding the ambiguity inherent in the use of digits following a
+backslash is to use the \g escape sequence (introduced in Perl 5.10.)
+This escape must be followed by a positive or a negative number,
+optionally enclosed in braces.
+</para>
+
+<para>
+A positive number specifies an absolute reference without the ambiguity that is
+present in the older syntax. It is also useful when literal digits follow the
+reference. A negative number is a relative reference. Consider "(abc(def)ghi)\g{-1}",
+the sequence \g{-1} is a reference to the most recently started capturing
+subpattern before \g, that is, is it equivalent to \2. Similarly, \g{-2}
+would be equivalent to \1. The use of relative references can be helpful in
+long patterns, and also in patterns that are created by joining together
+fragments that contain references within themselves.
+</para>
+
+<para>
+A back reference matches whatever actually matched the capturing subpattern
+in the current string, rather than anything matching
+the subpattern itself (see "Subpatterns as subroutines" below for a way
+of doing that). So the pattern
+</para>
+
+<programlisting>
+(sens|respons)e and \1ibility
+</programlisting>
+
+<para>
+matches "sense and sensibility" and "response and responsibility", but
+not "sense and responsibility". If caseful matching is in force at the
+time of the back reference, the case of letters is relevant. For example,
+</para>
+
+<programlisting>
+((?i)rah)\s+\1
+</programlisting>
+
+<para>
+matches "rah rah" and "RAH RAH", but not "RAH rah", even though the
+original capturing subpattern is matched caselessly.
+</para>
+
+<para>
+Back references to named subpatterns use the Perl syntax \k&lt;name&gt; or \k'name'
+or the Python syntax (?P=name). We could rewrite the above example in either of
+the following ways:
+</para>
+
+<programlisting>
+(?&lt;p1&gt;(?i)rah)\s+\k&lt;p1&gt;
+(?P&lt;p1&gt;(?i)rah)\s+(?P=p1)
+</programlisting>
+
+<para>
+A subpattern that is referenced by name may appear in the pattern before or
+after the reference.
+</para>
+
+<para>
+There may be more than one back reference to the same subpattern. If a
+subpattern has not actually been used in a particular match, any back
+references to it always fail. For example, the pattern
+</para>
+
+<programlisting>
+(a|(bc))\2
+</programlisting>
+
+<para>
+always fails if it starts to match "a" rather than "bc". Because there
+may be many capturing parentheses in a pattern, all digits following
+the backslash are taken as part of a potential back reference number.
+If the pattern continues with a digit character, some delimiter must be
+used to terminate the back reference. If the <varname>G_REGEX_EXTENDED</varname> flag is
+set, this can be whitespace. Otherwise an empty comment (see "Comments" below) can be used.
+</para>
+
+<para>
+A back reference that occurs inside the parentheses to which it refers
+fails when the subpattern is first used, so, for example, (a\1) never
+matches. However, such references can be useful inside repeated subpatterns.
+For example, the pattern
+</para>
+
+<programlisting>
+(a|b\1)+
+</programlisting>
+
+<para>
+matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration
+of the subpattern, the back reference matches the character
+string corresponding to the previous iteration. In order for this to
+work, the pattern must be such that the first iteration does not need
+to match the back reference. This can be done using alternation, as in
+the example above, or by a quantifier with a minimum of zero.
+</para>
+</refsect1>
+
+<refsect1>
+<title>Assertions</title>
+<para>
+An assertion is a test on the characters following or preceding the
+current matching point that does not actually consume any characters.
+The simple assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are
+described above.
+</para>
+
+<para>
+More complicated assertions are coded as subpatterns. There are two
+kinds: those that look ahead of the current position in the
+string, and those that look behind it. An assertion subpattern is
+matched in the normal way, except that it does not cause the current
+matching position to be changed.
+</para>
+
+<para>
+Assertion subpatterns are not capturing subpatterns, and may not be
+repeated, because it makes no sense to assert the same thing several
+times. If any kind of assertion contains capturing subpatterns within
+it, these are counted for the purposes of numbering the capturing
+subpatterns in the whole pattern. However, substring capturing is carried
+out only for positive assertions, because it does not make sense for
+negative assertions.
+</para>
+
+<refsect2>
+<title>Lookahead assertions</title>
+<para>
+Lookahead assertions start with (?= for positive assertions and (?! for
+negative assertions. For example,
+</para>
+
+<programlisting>
+\w+(?=;)
+</programlisting>
+
+<para>
+matches a word followed by a semicolon, but does not include the semicolon
+in the match, and
+</para>
+
+<programlisting>
+foo(?!bar)
+</programlisting>
+
+<para>
+matches any occurrence of "foo" that is not followed by "bar". Note
+that the apparently similar pattern
+</para>
+
+<programlisting>
+(?!foo)bar
+</programlisting>
+
+<para>
+does not find an occurrence of "bar" that is preceded by something
+other than "foo"; it finds any occurrence of "bar" whatsoever, because
+the assertion (?!foo) is always true when the next three characters are
+"bar". A lookbehind assertion is needed to achieve the other effect.
+</para>
+
+<para>
+If you want to force a matching failure at some point in a pattern, the
+most convenient way to do it is with (?!) because an empty string
+always matches, so an assertion that requires there not to be an empty
+string must always fail.
+</para>
+</refsect2>
+
+<refsect2>
+<title>Lookbehind assertions</title>
+<para>
+Lookbehind assertions start with (?&lt;= for positive assertions and (?&lt;!
+for negative assertions. For example,
+</para>
+
+<programlisting>
+(?&lt;!foo)bar
+</programlisting>
+
+<para>
+does find an occurrence of "bar" that is not preceded by "foo". The
+contents of a lookbehind assertion are restricted such that all the
+strings it matches must have a fixed length. However, if there are
+several top-level alternatives, they do not all have to have the same
+fixed length. Thus
+</para>
+
+<programlisting>
+(?&lt;=bullock|donkey)
+</programlisting>
+
+<para>
+is permitted, but
+</para>
+
+<programlisting>
+(?&lt;!dogs?|cats?)
+</programlisting>
+
+<para>
+causes an error at compile time. Branches that match different length
+strings are permitted only at the top level of a lookbehind assertion.
+An assertion such as
+</para>
+
+<programlisting>
+(?&lt;=ab(c|de))
+</programlisting>
+
+<para>
+is not permitted, because its single top-level branch can match two
+different lengths, but it is acceptable if rewritten to use two top-
+level branches:
+</para>
+
+<programlisting>
+(?&lt;=abc|abde)
+</programlisting>
+
+<para>
+The implementation of lookbehind assertions is, for each alternative,
+to temporarily move the current position back by the fixed length and
+then try to match. If there are insufficient characters before the
+current position, the assertion fails.
+</para>
+
+<para>
+GRegex does not allow the \C escape (which matches a single byte in UTF-8
+mode) to appear in lookbehind assertions, because it makes it impossible
+to calculate the length of the lookbehind. The \X and \R escapes, which can
+match different numbers of bytes, are also not permitted.
+</para>
+
+<para>
+Possessive quantifiers can be used in conjunction with lookbehind assertions to
+specify efficient matching at the end of the subject string. Consider a simple
+pattern such as
+</para>
+
+<programlisting>
+abcd$
+</programlisting>
+
+<para>
+when applied to a long string that does not match. Because matching
+proceeds from left to right, GRegex will look for each "a" in the string
+and then see if what follows matches the rest of the pattern. If the
+pattern is specified as
+</para>
+
+<programlisting>
+^.*abcd$
+</programlisting>
+
+<para>
+the initial .* matches the entire string at first, but when this fails
+(because there is no following "a"), it backtracks to match all but the
+last character, then all but the last two characters, and so on. Once
+again the search for "a" covers the entire string, from right to left,
+so we are no better off. However, if the pattern is written as
+</para>
+
+<programlisting>
+^.*+(?&lt;=abcd)
+</programlisting>
+
+<para>
+there can be no backtracking for the .*+ item; it can match only the
+entire string. The subsequent lookbehind assertion does a single test
+on the last four characters. If it fails, the match fails immediately.
+For long strings, this approach makes a significant difference to the
+processing time.
+</para>
+</refsect2>
+
+<refsect2>
+<title>Using multiple assertions</title>
+<para>
+Several assertions (of any sort) may occur in succession. For example,
+</para>
+
+<programlisting>
+(?&lt;=\d{3})(?&lt;!999)foo
+</programlisting>
+
+<para>
+matches "foo" preceded by three digits that are not "999". Notice that
+each of the assertions is applied independently at the same point in
+the string. First there is a check that the previous three
+characters are all digits, and then there is a check that the same
+three characters are not "999". This pattern does not match "foo" preceded
+by six characters, the first of which are digits and the last
+three of which are not "999". For example, it doesn’t match "123abcfoo".
+A pattern to do that is
+</para>
+
+<programlisting>
+(?&lt;=\d{3}...)(?&lt;!999)foo
+</programlisting>
+
+<para>
+This time the first assertion looks at the preceding six characters,
+checking that the first three are digits, and then the second assertion
+checks that the preceding three characters are not "999".
+</para>
+
+<para>
+Assertions can be nested in any combination. For example,
+</para>
+
+<programlisting>
+(?&lt;=(?&lt;!foo)bar)baz
+</programlisting>
+
+<para>
+matches an occurrence of "baz" that is preceded by "bar" which in turn
+is not preceded by "foo", while
+</para>
+
+<programlisting>
+(?&lt;=\d{3}(?!999)...)foo
+</programlisting>
+
+<para>
+is another pattern that matches "foo" preceded by three digits and any
+three characters that are not "999".
+</para>
+</refsect2>
+</refsect1>
+
+<refsect1>
+<title>Conditional subpatterns</title>
+<para>
+It is possible to cause the matching process to obey a subpattern
+conditionally or to choose between two alternative subpatterns, depending
+on the result of an assertion, or whether a previous capturing subpattern
+matched or not. The two possible forms of conditional subpattern are
+</para>
+
+<programlisting>
+(?(condition)yes-pattern)
+(?(condition)yes-pattern|no-pattern)
+</programlisting>
+
+<para>
+If the condition is satisfied, the yes-pattern is used; otherwise the
+no-pattern (if present) is used. If there are more than two alternatives
+in the subpattern, a compile-time error occurs.
+</para>
+
+<para>
+There are four kinds of condition: references to subpatterns, references to
+recursion, a pseudo-condition called DEFINE, and assertions.
+</para>
+
+<refsect2>
+<title>Checking for a used subpattern by number</title>
+<para>
+If the text between the parentheses consists of a sequence of digits, the
+condition is true if the capturing subpattern of that number has previously
+matched.
+</para>
+
+<para>
+Consider the following pattern, which contains non-significant white space
+to make it more readable (assume the <varname>G_REGEX_EXTENDED</varname>)
+and to divide it into three parts for ease of discussion:
+</para>
+
+<programlisting>
+( \( )? [^()]+ (?(1) \) )
+</programlisting>
+
+<para>
+The first part matches an optional opening parenthesis, and if that
+character is present, sets it as the first captured substring. The second
+part matches one or more characters that are not parentheses. The
+third part is a conditional subpattern that tests whether the first set
+of parentheses matched or not. If they did, that is, if string started
+with an opening parenthesis, the condition is true, and so the yes-pattern
+is executed and a closing parenthesis is required. Otherwise,
+since no-pattern is not present, the subpattern matches nothing. In
+other words, this pattern matches a sequence of non-parentheses,
+optionally enclosed in parentheses.
+</para>
+</refsect2>
+
+<refsect2>
+<title>Checking for a used subpattern by name</title>
+<para>
+Perl uses the syntax (?(&lt;name&gt;)...) or (?('name')...) to test for a used
+subpattern by name, the Python syntax (?(name)...) is also recognized. However,
+there is a possible ambiguity with this syntax, because subpattern names may
+consist entirely of digits. GRegex looks first for a named subpattern; if it
+cannot find one and the name consists entirely of digits, GRegex looks for a
+subpattern of that number, which must be greater than zero. Using subpattern
+names that consist entirely of digits is not recommended.
+</para>
+
+<para>
+Rewriting the above example to use a named subpattern gives this:
+</para>
+
+<programlisting>
+(?&lt;OPEN&gt; \( )? [^()]+ (?(&lt;OPEN&gt;) \) )
+</programlisting>
+</refsect2>
+
+<refsect2>
+<title>Checking for pattern recursion</title>
+<para>
+If the condition is the string (R), and there is no subpattern with the name R,
+the condition is true if a recursive call to the whole pattern or any
+subpattern has been made. If digits or a name preceded by ampersand follow the
+letter R, for example:
+</para>
+
+<programlisting>
+(?(R3)...)
+(?(R&amp;name)...)
+</programlisting>
+
+<para>
+the condition is true if the most recent recursion is into the subpattern whose
+number or name is given. This condition does not check the entire recursion
+stack.
+</para>
+
+<para>
+At "top level", all these recursion test conditions are false. Recursive
+patterns are described below.
+</para>
+</refsect2>
+
+<refsect2>
+<title>Defining subpatterns for use by reference only</title>
+<para>
+If the condition is the string (DEFINE), and there is no subpattern with the
+name DEFINE, the condition is always false. In this case, there may be only one
+alternative in the subpattern. It is always skipped if control reaches this
+point in the pattern; the idea of DEFINE is that it can be used to define
+"subroutines" that can be referenced from elsewhere. (The use of "subroutines"
+is described below.) For example, a pattern to match an IPv4 address could be
+written like this (ignore whitespace and line breaks):
+</para>
+
+<programlisting>
+(?(DEFINE) (?&lt;byte&gt; 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) )
+\b (?&amp;byte) (\.(?&amp;byte)){3} \b
+</programlisting>
+
+<para>
+The first part of the pattern is a DEFINE group inside which a another group
+named "byte" is defined. This matches an individual component of an IPv4
+address (a number less than 256). When matching takes place, this part of the
+pattern is skipped because DEFINE acts like a false condition.
+</para>
+
+<para>
+The rest of the pattern uses references to the named group to match the four
+dot-separated components of an IPv4 address, insisting on a word boundary at
+each end.
+</para>
+</refsect2>
+
+<refsect2>
+<title>Assertion conditions</title>
+<para>
+If the condition is not in any of the above formats, it must be an
+assertion. This may be a positive or negative lookahead or lookbehind
+assertion. Consider this pattern, again containing non-significant
+white space, and with the two alternatives on the second line:
+</para>
+
+<programlisting>
+(?(?=[^a-z]*[a-z])
+\d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )
+</programlisting>
+
+<para>
+The condition is a positive lookahead assertion that matches an
+optional sequence of non-letters followed by a letter. In other words,
+it tests for the presence of at least one letter in the string. If a
+letter is found, the string is matched against the first alternative;
+otherwise it is matched against the second. This pattern matches
+strings in one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are
+letters and dd are digits.
+</para>
+</refsect2>
+</refsect1>
+
+<refsect1>
+<title>Comments</title>
+<para>
+The sequence (?# marks the start of a comment that continues up to the
+next closing parenthesis. Nested parentheses are not permitted. The
+characters that make up a comment play no part in the pattern matching
+at all.
+</para>
+
+<para>
+If the <varname>G_REGEX_EXTENDED</varname> option is set, an unescaped #
+character outside a character class introduces a comment that continues to
+immediately after the next newline in the pattern.
+</para>
+</refsect1>
+
+<refsect1>
+<title>Recursive patterns</title>
+<para>
+Consider the problem of matching a string in parentheses, allowing for
+unlimited nested parentheses. Without the use of recursion, the best
+that can be done is to use a pattern that matches up to some fixed
+depth of nesting. It is not possible to handle an arbitrary nesting
+depth.
+</para>
+
+<para>
+For some time, Perl has provided a facility that allows regular expressions to
+recurse (amongst other things). It does this by interpolating Perl code in the
+expression at run time, and the code can refer to the expression itself. A Perl
+pattern using code interpolation to solve the parentheses problem can be
+created like this:
+</para>
+
+<programlisting>
+$re = qr{\( (?: (?&gt;[^()]+) | (?p{$re}) )* \)}x;
+</programlisting>
+
+<para>
+The (?p{...}) item interpolates Perl code at run time, and in this case refers
+recursively to the pattern in which it appears.
+</para>
+
+<para>
+Obviously, GRegex cannot support the interpolation of Perl code. Instead, it
+supports special syntax for recursion of the entire pattern, and also for
+individual subpattern recursion. This kind of recursion was introduced into
+Perl at release 5.10.
+</para>
+
+<para>
+A special item that consists of (? followed by a number greater than zero and a
+closing parenthesis is a recursive call of the subpattern of the given number,
+provided that it occurs inside that subpattern. (If not, it is a "subroutine"
+call, which is described in the next section.) The special item (?R) or (?0) is
+a recursive call of the entire regular expression.
+</para>
+
+<para>
+In GRegex (like Python, but unlike Perl), a recursive subpattern call is always
+treated as an atomic group. That is, once it has matched some of the subject
+string, it is never re-entered, even if it contains untried alternatives and
+there is a subsequent matching failure.
+</para>
+
+<para>
+This pattern solves the nested parentheses problem (assume the
+<varname>G_REGEX_EXTENDED</varname> option is set so that white space is
+ignored):
+</para>
+
+<programlisting>
+\( ( (?&gt;[^()]+) | (?R) )* \)
+</programlisting>
+
+<para>
+First it matches an opening parenthesis. Then it matches any number of
+substrings which can either be a sequence of non-parentheses, or a
+recursive match of the pattern itself (that is, a correctly parenthesized
+substring). Finally there is a closing parenthesis.
+</para>
+
+<para>
+If this were part of a larger pattern, you would not want to recurse
+the entire pattern, so instead you could use this:
+</para>
+
+<programlisting>
+( \( ( (?&gt;[^()]+) | (?1) )* \) )
+</programlisting>
+
+<para>
+We have put the pattern into parentheses, and caused the recursion to
+refer to them instead of the whole pattern. In a larger pattern, keeping
+track of parenthesis numbers can be tricky. It may be more convenient to
+use named parentheses instead.
+The Perl syntax for this is (?&amp;name); GRegex also supports the(?P>name)
+syntac. We could rewrite the above example as follows:
+</para>
+
+<programlisting>
+(?&lt;pn&gt; \( ( (?&gt;[^()]+) | (?&amp;pn) )* \) )
+</programlisting>
+
+<para>
+If there is more than one subpattern with the same name, the earliest one is
+used. This particular example pattern contains nested unlimited repeats, and so
+the use of atomic grouping for matching strings of non-parentheses is important
+when applying the pattern to strings that do not match.
+For example, when this pattern is applied to
+</para>
+
+<programlisting>
+(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
+</programlisting>
+
+<para>
+it yields "no match" quickly. However, if atomic grouping is not used,
+the match runs for a very long time indeed because there are so many
+different ways the + and * repeats can carve up the string, and all
+have to be tested before failure can be reported.
+</para>
+
+<para>
+At the end of a match, the values set for any capturing subpatterns are
+those from the outermost level of the recursion at which the subpattern
+value is set.
+
+<!-- Callouts are not supported by GRegex
+If you want to obtain intermediate values, a callout
+function can be used (see below and the pcrecallout documentation). -->
+
+If the pattern above is matched against
+</para>
+
+<programlisting>
+(ab(cd)ef)
+</programlisting>
+
+<para>
+the value for the capturing parentheses is "ef", which is the last
+value taken on at the top level. If additional parentheses are added,
+giving
+</para>
+
+<programlisting>
+\( ( ( (?&gt;[^()]+) | (?R) )* ) \)
+ ^ ^
+ ^ ^
+</programlisting>
+
+<para>
+the string they capture is "ab(cd)ef", the contents of the top level
+parentheses.
+</para>
+
+<para>
+Do not confuse the (?R) item with the condition (R), which tests for
+recursion. Consider this pattern, which matches text in angle brackets,
+allowing for arbitrary nesting. Only digits are allowed in nested
+brackets (that is, when recursing), whereas any characters are permitted
+at the outer level.
+</para>
+
+<programlisting>
+&lt; (?: (?(R) \d++ | [^&lt;&gt;]*+) | (?R)) * &gt;
+</programlisting>
+
+<para>
+In this pattern, (?(R) is the start of a conditional subpattern, with
+two different alternatives for the recursive and non-recursive cases.
+The (?R) item is the actual recursive call.
+</para>
+</refsect1>
+
+<refsect1>
+<title>Subpatterns as subroutines</title>
+<para>
+If the syntax for a recursive subpattern reference (either by number or
+by name) is used outside the parentheses to which it refers, it operates
+like a subroutine in a programming language. The "called" subpattern may
+be defined before or after the reference. An earlier example pointed out
+that the pattern
+</para>
+
+<programlisting>
+(sens|respons)e and \1ibility
+</programlisting>
+
+<para>
+matches "sense and sensibility" and "response and responsibility", but
+not "sense and responsibility". If instead the pattern
+</para>
+
+<programlisting>
+(sens|respons)e and (?1)ibility
+</programlisting>
+
+<para>
+is used, it does match "sense and responsibility" as well as the other
+two strings. Another example is given in the discussion of DEFINE above.
+</para>
+
+<para>
+Like recursive subpatterns, a "subroutine" call is always treated as an atomic
+group. That is, once it has matched some of the string, it is never
+re-entered, even if it contains untried alternatives and there is a subsequent
+matching failure.
+</para>
+
+<para>
+When a subpattern is used as a subroutine, processing options such as
+case-independence are fixed when the subpattern is defined. They cannot be
+changed for different calls. For example, consider this pattern:
+</para>
+
+<programlisting>
+(abc)(?i:(?1))
+</programlisting>
+
+<para>
+It matches "abcabc". It does not match "abcABC" because the change of
+processing option does not affect the called subpattern.
+</para>
+</refsect1>
+
+<!-- Callouts are not supported by GRegex
+<refsect1>
+<title>Callouts</title>
+<para>
+Perl has a feature whereby using the sequence (?{...}) causes arbitrary
+Perl code to be obeyed in the middle of matching a regular expression.
+This makes it possible, amongst other things, to extract different substrings that match the same pair of parentheses when there is a repetition.
+</para>
+
+<para>
+PCRE provides a similar feature, but of course it cannot obey arbitrary
+Perl code. The feature is called "callout". The caller of PCRE provides
+an external function by putting its entry point in the global variable
+pcre_callout. By default, this variable contains NULL, which disables
+all calling out.
+</para>
+
+<para>
+Within a regular expression, (?C) indicates the points at which the
+external function is to be called. If you want to identify different
+callout points, you can put a number less than 256 after the letter C.
+The default value is zero. For example, this pattern has two callout
+points:
+</para>
+
+<programlisting>
+(?C1)abc(?C2)def
+</programlisting>
+
+<para>
+If the PCRE_AUTO_CALLOUT flag is passed to pcre_compile(), callouts are
+automatically installed before each item in the pattern. They are all
+numbered 255.
+</para>
+
+<para>
+During matching, when PCRE reaches a callout point (and pcre_callout is
+set), the external function is called. It is provided with the number
+of the callout, the position in the pattern, and, optionally, one item
+of data originally supplied by the caller of pcre_exec(). The callout
+function may cause matching to proceed, to backtrack, or to fail altogether. A complete description of the interface to the callout function
+is given in the pcrecallout documentation.
+</para>
+</refsect1>
+-->
+
+<refsect1>
+<title>Copyright</title>
+<para>
+This document was copied and adapted from the PCRE documentation,
+specifically from the man page for pcrepattern.
+The original copyright note is:
+</para>
+
+<programlisting>
+Copyright (c) 1997-2006 University of Cambridge.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the name of Google
+ Inc. nor the names of their contributors may be used to endorse or
+ promote products derived from this software without specific prior
+ written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+</programlisting>
+</refsect1>
+
+</refentry>
diff --git a/trunk/docs/reference/glib/resources.sgml b/trunk/docs/reference/glib/resources.sgml
new file mode 100644
index 000000000..8d29eda16
--- /dev/null
+++ b/trunk/docs/reference/glib/resources.sgml
@@ -0,0 +1,111 @@
+<refentry id="glib-resources" revision="17 Jan 2002">
+<refmeta>
+<refentrytitle>Mailing lists and bug reports</refentrytitle>
+<manvolnum>3</manvolnum>
+<refmiscinfo>Mailing lists and bug reports</refmiscinfo>
+</refmeta>
+
+<refnamediv>
+<refname>Mailing lists and bug reports</refname>
+<refpurpose>
+Getting help with GLib
+</refpurpose>
+</refnamediv>
+
+<refsect1>
+<title>Filing a bug report or feature request</title>
+
+<para>
+If you encounter a bug, misfeature, or missing feature in GLib, please
+file a bug report on
+<ulink url="http://bugzilla.gnome.org">http://bugzilla.gnome.org</ulink>.
+We'd also appreciate reports of incomplete or misleading information in
+the GLib documentation; file those against the "docs" component of the "glib"
+product in Bugzilla.
+</para>
+
+<para>
+Don't hesitate to file a bug report, even if you think we may know
+about it already, or aren't sure of the details. Just give us as much
+information as you have, and if it's already fixed or has already been
+discussed, we'll add a note to that effect in the report.
+</para>
+
+<para>
+The bug tracker should definitely be used for feature requests, it's
+not only for bugs. We track all GLib development in Bugzilla, so it's
+the way to be sure the GLib developers won't forget about an issue.
+</para>
+
+</refsect1>
+
+<refsect1>
+<title>Submitting Patches</title>
+
+<para>
+If you develop a bugfix or enhancement for GLib, please file that in
+Bugzilla as well. Bugzilla allows you to attach files; please attach a
+patch generated by the <command>diff</command> utility, using the
+<option>-u</option> option to make the patch more readable. All patches
+must be offered under the terms of the GNU LGPL license, so be sure you
+are authorized to give us the patch under those terms.
+</para>
+
+<para>
+If you want to discuss your patch before or after developing it, mail
+<ulink url="mailto:gtk-devel-list@gnome.org">gtk-devel-list@gnome.org</ulink>.
+But be sure to file the Bugzilla report as well; if the patch is only on the
+list and not in Bugzilla, it's likely to slip through the cracks.
+</para>
+
+</refsect1>
+
+<refsect1>
+<title>Mailing lists</title>
+
+<para>
+There are several mailing lists dedicated to GTK+ and related
+libraries. Discussion of GLib generally takes place on these lists.
+You can subscribe or view the archives of these lists on
+<ulink url="http://mail.gnome.org">http://mail.gnome.org</ulink>.
+</para>
+
+<para>
+<variablelist>
+
+<varlistentry>
+<term><ulink url="mailto:gtk-list@gnome.org">gtk-list@gnome.org</ulink></term>
+<listitem><para>
+gtk-list covers general GTK+ (and GLib) topics; questions about using GLib
+in programs, GLib from a user standpoint, announcements of GLib-related projects
+would all be on-topic. The bulk of the traffic consists of GTK+ programming
+questions.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><ulink url="mailto:gtk-devel-list@gnome.org">gtk-devel-list@gnome.org</ulink></term>
+<listitem><para>
+gtk-devel-list is for discussion of work on GTK+ (and GLib) itself, it is
+<emphasis>not</emphasis> for asking questions about how to use GTK+ (or GLib)
+in applications. gtk-devel-list is appropriate for discussion of patches,
+bugs, proposed features, and so on.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><ulink url="mailto:gtk-doc-list@gnome.org">gtk-doc-list@gnome.org</ulink></term>
+<listitem><para>
+gtk-doc-list is for discussion of the <application>gtk-doc</application>
+documentation system (used to document GTK+ and Glib), and for work on the GTK+
+(and GLib) documentation.
+</para></listitem>
+</varlistentry>
+
+</variablelist>
+</para>
+
+</refsect1>
+
+
+</refentry>
diff --git a/trunk/docs/reference/glib/running.sgml b/trunk/docs/reference/glib/running.sgml
new file mode 100644
index 000000000..a8952d2ee
--- /dev/null
+++ b/trunk/docs/reference/glib/running.sgml
@@ -0,0 +1,275 @@
+<refentry id="glib-running" revision="17 Jan 2002">
+<refmeta>
+<refentrytitle>Running GLib Applications</refentrytitle>
+<manvolnum>3</manvolnum>
+<refmiscinfo>GLib Library</refmiscinfo>
+</refmeta>
+
+<refnamediv>
+<refname>Running GLib Applications</refname>
+<refpurpose>
+How to run and debug your GLib application
+</refpurpose>
+</refnamediv>
+
+<refsect1>
+<title>Running and debugging GLib Applications</title>
+
+<refsect2>
+<title>Environment variables</title>
+
+<para>
+GLib inspects a few of environment variables in addition to standard
+variables like <envar>LANG</envar>, <envar>PATH</envar> or <envar>HOME</envar>.
+</para>
+
+<formalpara id="G_FILENAME_ENCODING">
+ <title><envar>G_FILENAME_ENCODING</envar></title>
+
+ <para>
+ This environment variable can be set to a comma-separated list of character
+ set names. GLib assumes that filenames are encoded in the first character
+ set from that list rather than in UTF-8. The special token "@locale" can be
+ used to specify the character set for the current locale.
+ </para>
+</formalpara>
+
+<formalpara id="G_BROKEN_FILENAMES">
+ <title><envar>G_BROKEN_FILENAMES</envar></title>
+
+ <para>
+ If this environment variable is set, GLib assumes that filenames are in
+ the locale encoding rather than in UTF-8. G_FILENAME_ENCODING takes
+ priority over G_BROKEN_FILENAMES.
+ </para>
+</formalpara>
+
+<formalpara id="G_MESSAGES_PREFIXED">
+ <title><envar>G_MESSAGES_PREFIXED</envar></title>
+
+ <para>
+ A list of log levels for which messages should be prefixed by the
+ program name and PID of the application. The default is to prefix
+ everything except <literal>G_LOG_LEVEL_MESSAGE</literal> and <literal>G_LOG_LEVEL_INFO</literal>.
+ </para>
+</formalpara>
+
+<formalpara id="G_DEBUG">
+ <title><envar>G_DEBUG</envar></title>
+ <para>
+ If GLib has been configured with <option>--enable-debug=yes</option>,
+ this variable can be set to a list of debug options, which cause GLib
+ to print out different types of debugging information.
+ <variablelist>
+ <varlistentry>
+ <term>fatal_warnings</term>
+ <listitem><para>Causes GLib to abort the program at the first call
+ to <link linkend="g-warning">g_warning</link>() or
+ <link linkend="g-critical">g_critical</link>(). This option is
+ special in that it doesn't require GLib to be configured with
+ debugging support.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>fatal_criticals</term>
+ <listitem><para>Causes GLib to abort the program at the first call
+ to <link linkend="g-critical">g_critical</link>(). This option is
+ special in that it doesn't require GLib to be configured with
+ debugging support.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>gc-friendly</term>
+ <listitem>
+ <para>
+ Newly allocated memory that isn't directly initialized, as well
+ as memory being freed will be reset to 0. The point here is to
+ allow memory checkers and similar programs that use bohem GC alike
+ algorithms to produce more accurate results.
+ This option is special in that it doesn't require GLib to be
+ configured with debugging support.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>resident-modules</term>
+ <listitem>
+ <para>
+ All modules loaded by GModule will be made resident. This can be useful
+ for tracking memory leaks in modules which are later unloaded; but it can
+ also hide bugs where code is accessed after the module would have normally
+ been unloaded.
+ This option is special in that it doesn't require GLib to be
+ configured with debugging support.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>bind-now-modules</term>
+ <listitem>
+ <para>
+ All modules loaded by GModule will bind their symbols at load time, even
+ when the code uses %G_MODULE_BIND_LAZY.
+ This option is special in that it doesn't require GLib to be
+ configured with debugging support.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+</formalpara>
+
+<formalpara id="G_SLICE">
+ <title><envar>G_SLICE</envar></title>
+ <para>
+ This environment variable allows reconfiguration of the GSlice
+ memory allocator.
+ <variablelist>
+ <varlistentry>
+ <term>always-malloc</term>
+ <listitem>
+ <para>
+ This will cause all slices allocated through g_slice_alloc() and
+ released by g_slice_free1() to be actually allocated via direct
+ calls to g_malloc() and g_free().
+ This is most useful for memory checkers and similar programs that
+ use Bohem GC alike algorithms to produce more accurate results.
+ It can also be in conjunction with debugging features of the system's
+ malloc implementation such as glibc's MALLOC_CHECK_=2 to debug
+ erroneous slice allocation code, allthough <literal>debug-blocks</literal>
+ usually is a better suited debugging tool.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>debug-blocks</term>
+ <listitem>
+ <para>
+ Using this option (present since GLib-2.13) engages extra code
+ which performs sanity checks on the released memory slices.
+ Invalid slice adresses or slice sizes will be reported and lead to
+ a program halt.
+ This option should only be used in debugging scenarios, because it
+ significantly degrades GSlice performance. Extra per slice memory
+ is requied to do the necessary bookeeping, and multi-thread scalability
+ is given up to perform global slice validation.
+ This option is mostly useful in scenarios where program crashes are encountered
+ while GSlice is in use, but crashes cannot be reproduced with G_SLICE=always-malloc.
+ A potential cause for such a situation that will be caught by G_SLICE=debug-blocks
+ is e.g.:
+ <programlisting>
+ void *slist = g_slist_alloc(); /* void* gives up type-safety */
+ g_list_free (slist); /* corruption: sizeof (GSList) != sizeof (GList) */
+ </programlisting>
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+</formalpara>
+
+<formalpara id="G_RANDOM_VERSION">
+ <title><envar>G_RANDOM_VERSION</envar></title>
+
+ <para>
+ If this environment variable is set to '2.0', the outdated
+ pseudo-random number seeding and generation algorithms from
+ GLib-2.0 are used instead of the new better ones. Use the GLib-2.0
+ algorithms only if you have sequences of numbers generated with
+ Glib-2.0 that you need to reproduce exactly.
+ </para>
+</formalpara>
+
+<formalpara id="LIBCHARSET_ALIAS_DIR">
+ <title><envar>LIBCHARSET_ALIAS_DIR</envar></title>
+
+ <para>
+ Allows to specify a nonstandard location for the
+ <filename>charset.aliases</filename> file that is used by the
+ character set conversion routines. The default location is the
+ <replaceable>libdir</replaceable> specified at compilation time.
+ </para>
+</formalpara>
+
+<formalpara id="G_WIN32_PRETEND_WIN9X">
+ <title><envar>G_WIN32_PRETEND_WIN9X</envar></title>
+
+ <para>
+ Setting this variable to any value forces g_win32_get_windows_version()
+ to return a version code for Windows 9x. This is mainly an internal
+ debugging aid for GTK+ and GLib developers, to be able to check the
+ code paths for Windows 9x.
+ </para>
+</formalpara>
+
+</refsect2>
+
+<refsect2 id="setlocale">
+<title>Locale</title>
+
+<para>
+A number of interfaces in GLib depend on the current locale in which
+an application is running. Therefore, most GLib-using applications should
+call <function>setlocale (LC_ALL, "")</function> to set up the current
+locale.
+</para>
+
+</refsect2>
+
+<refsect2>
+<title>Traps and traces</title>
+
+<para>
+<indexterm><primary>g_trap_free_size</primary></indexterm>
+<indexterm><primary>g_trap_realloc_size</primary></indexterm>
+<indexterm><primary>g_trap_malloc_size</primary></indexterm>
+Some code portions contain trap variables that can be set during debugging
+time if GLib has been configured with <option>--enable-debug=yes</option>.
+Such traps lead to immediate code halts to examine the current program state
+and backtrace.
+</para>
+
+<para>
+Currently, the following trap variables exist:
+<programlisting>
+static volatile gulong g_trap_free_size;
+static volatile gulong g_trap_realloc_size;
+static volatile gulong g_trap_malloc_size;
+</programlisting>
+If set to a size > 0, <link linkend="g-free">g_free</link>(),
+<link linkend="g-realloc">g_realloc</link>() and
+<link linkend="g-malloc">g_malloc</link>() will be intercepted if the size
+matches the size of the corresponding memory block. This will only work with
+<literal>g_mem_set_vtable (glib_mem_profiler_table)</literal> upon startup
+though, because memory profiling is required to match on the memory block sizes.
+</para>
+<para>
+Note that many modern debuggers support conditional breakpoints, which achieve
+pretty much the same. E.g. in gdb, you can do
+<programlisting>
+break g_malloc
+condition 1 n_bytes == 20
+</programlisting>
+to break only on g_malloc() calls where the size of the allocated memory block
+is 20.
+</para>
+</refsect2>
+
+<refsect2>
+<title>Memory statistics</title>
+
+<para>
+g_mem_profile() will output a summary g_malloc() memory usage, if memory
+profiling has been enabled by calling
+<literal>g_mem_set_vtable (glib_mem_profiler_table)</literal> upon startup.
+</para>
+
+<para>
+If GLib has been configured with <option>--enable-debug=yes</option>,
+then g_slice_debug_tree_statistics() can be called in a debugger to
+output details about the memory usage of the slice allocator.
+</para>
+
+</refsect2>
+</refsect1>
+</refentry>
diff --git a/trunk/docs/reference/glib/tmpl/allocators.sgml b/trunk/docs/reference/glib/tmpl/allocators.sgml
new file mode 100644
index 000000000..038f63e79
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/allocators.sgml
@@ -0,0 +1,57 @@
+<!-- ##### SECTION Title ##### -->
+Memory Allocators
+
+<!-- ##### SECTION Short_Description ##### -->
+deprecated way to allocate chunks of memory for #GList, #GSList and #GNode.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+</para>
+<para>
+Prior to 2.10, #GAllocator was used as an efficient way to allocate
+small pieces of memory for use with the #GList, #GSList and #GNode data
+structures. Since 2.10, it has been completely replaced by the
+<link linkend="glib-Memory-Slices">slice allocator</link> and deprecated.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GAllocator ##### -->
+<para>
+The <structname>GAllocator</structname> struct contains private data. and
+should only be accessed using the following functions.
+</para>
+
+
+<!-- ##### FUNCTION g_allocator_new ##### -->
+<para>
+Creates a new #GAllocator.
+</para>
+
+@name: the name of the #GAllocator. This name is used to set the name of the
+#GMemChunk used by the #GAllocator, and is only used for debugging.
+@n_preallocs: the number of elements in each block of memory allocated.
+Larger blocks mean less calls to g_malloc(), but some memory may be wasted.
+(GLib uses 128 elements per block by default.) The value must be between 1
+and 65535.
+@Returns: a new #GAllocator.
+@Deprecated: 2.10: Use the <link linkend="glib-Memory-Slices">slice allocator</link>
+instead
+
+
+<!-- ##### FUNCTION g_allocator_free ##### -->
+<para>
+Frees all of the memory allocated by the #GAllocator.
+</para>
+
+@allocator: a #GAllocator.
+@Deprecated: 2.10: Use the <link linkend="glib-Memory-Slices">slice allocator</link>
+instead
+
+
diff --git a/trunk/docs/reference/glib/tmpl/arrays.sgml b/trunk/docs/reference/glib/tmpl/arrays.sgml
new file mode 100644
index 000000000..57b0e3680
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/arrays.sgml
@@ -0,0 +1,309 @@
+<!-- ##### SECTION Title ##### -->
+Arrays
+
+<!-- ##### SECTION Short_Description ##### -->
+arrays of arbitrary elements which grow automatically as elements are added.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+Arrays are similar to standard C arrays, except that they grow automatically
+as elements are added.
+</para>
+<para>
+Array elements can be of any size (though all elements of one array are the
+same size), and the array can be automatically cleared to '0's and
+zero-terminated.
+</para>
+<para>
+To create a new array use g_array_new().
+</para>
+<para>
+To add elements to an array, use g_array_append_val(), g_array_append_vals(),
+g_array_prepend_val(), and g_array_prepend_vals().
+</para>
+<para>
+To access an element of an array, use g_array_index().
+</para>
+<para>
+To set the size of an array, use g_array_set_size().
+</para>
+<para>
+To free an array, use g_array_free().
+</para>
+<example>
+<title>Using a <structname>GArray</structname> to store <type>gint</type> values</title>
+<programlisting>
+ GArray *garray;
+ gint i;
+
+ /* We create a new array to store gint values.
+ We don't want it zero-terminated or cleared to 0's. */
+ garray = g_array_new (FALSE, FALSE, sizeof (gint));
+ for (i = 0; i &lt; 10000; i++)
+ g_array_append_val (garray, i);
+
+ for (i = 0; i &lt; 10000; i++)
+ if (g_array_index (garray, gint, i) != i)
+ g_print ("ERROR: got &percnt;d instead of &percnt;d\n",
+ g_array_index (garray, gint, i), i);
+
+ g_array_free (garray, TRUE);
+</programlisting></example>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GArray ##### -->
+<para>
+Contains the public fields of an <link linkend="glib-arrays">Array</link>.
+</para>
+
+@data: a pointer to the element data. The data may be moved as elements are
+added to the #GArray.
+@len: the number of elements in the #GArray.
+
+<!-- ##### FUNCTION g_array_new ##### -->
+<para>
+Creates a new #GArray.
+</para>
+
+@zero_terminated: %TRUE if the array should have an extra element at the end
+which is set to 0.
+@clear_: %TRUE if #GArray elements should be automatically cleared to 0
+when they are allocated.
+@element_size: the size of each element in bytes.
+@Returns: the new #GArray.
+
+
+<!-- ##### FUNCTION g_array_sized_new ##### -->
+<para>
+Creates a new #GArray with @reserved_size elements
+preallocated. This avoids frequent reallocation, if you are going to
+add many elements to the array. Note however that the size of the
+array is still 0.
+</para>
+
+@zero_terminated: %TRUE if the array should have an extra element at the end with all bits cleared.
+@clear_: %TRUE if all bits in the array should be cleared to 0 on allocation.
+@element_size: size of each element in the array.
+@reserved_size: number of elements preallocated.
+@Returns: the new #GArray.
+
+
+<!-- ##### MACRO g_array_append_val ##### -->
+<para>
+Adds the value on to the end of the array.
+The array will grow in size automatically if necessary.
+</para>
+<note>
+<para>
+g_array_append_val() is a macro which uses a reference to the value
+parameter @v. This means that you cannot use it with literal values
+such as "27". You must use variables.
+</para>
+</note>
+
+@a: a #GArray.
+@v: the value to append to the #GArray.
+@Returns: the #GArray.
+
+
+<!-- ##### FUNCTION g_array_append_vals ##### -->
+<para>
+Adds @len elements onto the end of the array.
+</para>
+
+@array: a #GArray.
+@data: a pointer to the elements to append to the end of the array.
+@len: the number of elements to append.
+@Returns: the #GArray.
+
+
+<!-- ##### MACRO g_array_prepend_val ##### -->
+<para>
+Adds the value on to the start of the array.
+The array will grow in size automatically if necessary.
+</para>
+<para>
+This operation is slower than g_array_append_val() since the existing elements
+in the array have to be moved to make space for the new element.
+</para>
+<note>
+<para>
+g_array_prepend_val() is a macro which uses a reference to the value
+parameter @v. This means that you cannot use it with literal values
+such as "27". You must use variables.
+</para>
+</note>
+
+@a: a #GArray.
+@v: the value to prepend to the #GArray.
+@Returns: the #GArray.
+
+
+<!-- ##### FUNCTION g_array_prepend_vals ##### -->
+<para>
+Adds @len elements onto the start of the array.
+</para>
+<para>
+This operation is slower than g_array_append_vals() since the existing elements
+in the array have to be moved to make space for the new elements.
+</para>
+
+@array: a #GArray.
+@data: a pointer to the elements to prepend to the start of the array.
+@len: the number of elements to prepend.
+@Returns: the #GArray.
+
+
+<!-- ##### MACRO g_array_insert_val ##### -->
+<para>
+Inserts an element into an array at the given index.
+</para>
+<note>
+<para>
+g_array_insert_val() is a macro which uses a reference to the value
+parameter @v. This means that you cannot use it with literal values
+such as "27". You must use variables.
+</para>
+</note>
+
+@a: a #GArray.
+@i: the index to place the element at.
+@v: the value to insert into the array.
+@Returns: the #GArray.
+
+
+<!-- ##### FUNCTION g_array_insert_vals ##### -->
+<para>
+Inserts @len elements into a #GArray at the given index.
+</para>
+
+@array: a #GArray.
+@index_: the index to place the elements at.
+@data: a pointer to the elements to insert.
+@len: the number of elements to insert.
+@Returns: the #GArray.
+
+
+<!-- ##### FUNCTION g_array_remove_index ##### -->
+<para>
+Removes the element at the given index from a #GArray.
+The following elements are moved down one place.
+</para>
+
+@array: a #GArray.
+@index_: the index of the element to remove.
+@Returns: the #GArray.
+
+
+<!-- ##### FUNCTION g_array_remove_index_fast ##### -->
+<para>
+Removes the element at the given index from a #GArray.
+The last element in the array is used to fill in the space, so this function
+does not preserve the order of the #GArray. But it is faster than
+g_array_remove_index().
+</para>
+
+@array: a @GArray.
+@index_: the index of the element to remove.
+@Returns: the #GArray.
+
+
+<!-- ##### FUNCTION g_array_remove_range ##### -->
+<para>
+Removes the given number of elements starting at the given index from a
+#GArray. The following elements are moved to close the gap.
+</para>
+
+@array: a @GArray.
+@index_: the index of the first element to remove.
+@length: the number of elements to remove.
+@Returns: the #GArray.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_array_sort ##### -->
+<para>
+Sorts a #GArray using @compare_func which should be a qsort()-style comparison
+function (returns less than zero for first arg is less than second arg,
+zero for equal, greater zero if first arg is greater than second arg).
+</para>
+<para>
+If two array elements compare equal, their order in the sorted array is
+undefined.
+</para>
+
+@array: a #GArray.
+@compare_func: comparison function.
+
+
+<!-- ##### FUNCTION g_array_sort_with_data ##### -->
+<para>
+Like g_array_sort(), but the comparison function receives an extra user data
+argument.
+</para>
+
+@array: a #GArray.
+@compare_func: comparison function.
+@user_data: data to pass to @compare_func.
+
+
+<!-- ##### MACRO g_array_index ##### -->
+<para>
+Returns the element of a #GArray at the given index.
+The return value is cast to the given type.
+
+<example>
+<title>Getting a pointer to an element in a <structname>GArray</structname></title>
+<programlisting>
+ EDayViewEvent *event;
+
+ /* This gets a pointer to the 3rd element in the array of EDayViewEvent
+ structs. */
+ event = &amp;g_array_index (events, EDayViewEvent, 3);
+</programlisting>
+</example>
+</para>
+
+@a: a #GArray.
+@t: the type of the elements.
+@i: the index of the element to return.
+@Returns: the element of the #GArray at the index given by @i.
+
+
+<!-- ##### FUNCTION g_array_set_size ##### -->
+<para>
+Sets the size of the array, expanding it if necessary.
+If the array was created with @clear_ set to %TRUE, the new elements are set to 0.
+</para>
+
+@array: a #GArray.
+@length: the new size of the #GArray.
+@Returns: the #GArray.
+
+
+<!-- ##### FUNCTION g_array_free ##### -->
+<para>
+Frees the memory allocated for the #GArray.
+If @free_segment is %TRUE it frees the memory block holding the elements
+as well. Pass %FALSE if you want to free the #GArray wrapper but preserve
+the underlying array for use elsewhere.
+</para>
+<note>
+<para>
+If array elements contain dynamically-allocated memory, they should be freed
+first.
+</para>
+</note>
+
+@array: a #GArray.
+@free_segment: if %TRUE the actual element data is freed as well.
+@Returns: the element data if @free_segment is %FALSE, otherwise %NULL
+
+
diff --git a/trunk/docs/reference/glib/tmpl/arrays_byte.sgml b/trunk/docs/reference/glib/tmpl/arrays_byte.sgml
new file mode 100644
index 000000000..7524853c4
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/arrays_byte.sgml
@@ -0,0 +1,191 @@
+<!-- ##### SECTION Title ##### -->
+Byte Arrays
+
+<!-- ##### SECTION Short_Description ##### -->
+arrays of bytes, which grow automatically as elements are added.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+#GByteArray is based on #GArray, to provide arrays of bytes which grow
+automatically as elements are added.
+</para>
+<para>
+To create a new #GByteArray use g_byte_array_new().
+</para>
+<para>
+To add elements to a #GByteArray, use g_byte_array_append(), and
+g_byte_array_prepend().
+</para>
+<para>
+To set the size of a #GByteArray, use g_byte_array_set_size().
+</para>
+<para>
+To free a #GByteArray, use g_byte_array_free().
+</para>
+
+<example>
+<title>Using a <structname>GByteArray</structname></title>
+<programlisting>
+ GByteArray *gbarray;
+ gint i;
+
+ gbarray = g_byte_array_new (<!-- -->);
+ for (i = 0; i &lt; 10000; i++)
+ g_byte_array_append (gbarray, (guint8*) "abcd", 4);
+
+ for (i = 0; i &lt; 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);
+</programlisting></example>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GByteArray ##### -->
+<para>
+The <structname>GByteArray</structname> struct allows access to the public fields of a <structname>GByteArray</structname>.
+</para>
+
+@data: a pointer to the element data. The data may be moved as elements are
+added to the #GByteArray.
+@len: the number of elements in the #GByteArray.
+
+<!-- ##### FUNCTION g_byte_array_new ##### -->
+<para>
+Creates a new #GByteArray.
+</para>
+
+@Returns: the new #GByteArray.
+
+
+<!-- ##### FUNCTION g_byte_array_sized_new ##### -->
+<para>
+Creates a new #GByteArray with @reserved_size bytes preallocated. This
+avoids frequent reallocation, if you are going to add many bytes to
+the array. Note however that the size of the array is still 0.
+</para>
+
+@reserved_size: number of bytes preallocated.
+@Returns: the new #GByteArray.
+
+
+<!-- ##### FUNCTION g_byte_array_append ##### -->
+<para>
+Adds the given bytes to the end of the #GByteArray.
+The array will grow in size automatically if necessary.
+</para>
+
+@array: a #GByteArray.
+@data: the byte data to be added.
+@len: the number of bytes to add.
+@Returns: the #GByteArray.
+
+
+<!-- ##### FUNCTION g_byte_array_prepend ##### -->
+<para>
+Adds the given data to the start of the #GByteArray.
+The array will grow in size automatically if necessary.
+</para>
+
+@array: a #GByteArray.
+@data: the byte data to be added.
+@len: the number of bytes to add.
+@Returns: the #GByteArray.
+
+
+<!-- ##### FUNCTION g_byte_array_remove_index ##### -->
+<para>
+Removes the byte at the given index from a #GByteArray.
+The following bytes are moved down one place.
+</para>
+
+@array: a #GByteArray.
+@index_: the index of the byte to remove.
+@Returns: the #GByteArray.
+
+
+<!-- ##### FUNCTION g_byte_array_remove_index_fast ##### -->
+<para>
+Removes the byte at the given index from a #GByteArray.
+The last element in the array is used to fill in the space, so this function
+does not preserve the order of the #GByteArray. But it is faster than
+g_byte_array_remove_index().
+</para>
+
+@array: a #GByteArray.
+@index_: the index of the byte to remove.
+@Returns: the #GByteArray.
+
+
+<!-- ##### FUNCTION g_byte_array_remove_range ##### -->
+<para>
+Removes the given number of bytes starting at the given index from a
+#GByteArray. The following elements are moved to close the gap.
+</para>
+
+@array: a @GByteArray.
+@index_: the index of the first byte to remove.
+@length: the number of bytes to remove.
+@Returns: the #GByteArray.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_byte_array_sort ##### -->
+<para>
+Sorts a byte array, using @compare_func which should be a qsort()-style
+comparison function (returns less than zero for first arg is less than second
+arg, zero for equal, greater than zero if first arg is greater than second
+arg).
+</para>
+<para>
+If two array elements compare equal, their order in the sorted array is
+undefined.
+</para>
+
+@array: a #GByteArray.
+@compare_func: comparison function.
+
+
+<!-- ##### FUNCTION g_byte_array_sort_with_data ##### -->
+<para>
+Like g_byte_array_sort(), but the comparison function takes an extra user data
+argument.
+</para>
+
+@array: a #GByteArray.
+@compare_func: comparison function.
+@user_data: data to pass to @compare_func.
+
+
+<!-- ##### FUNCTION g_byte_array_set_size ##### -->
+<para>
+Sets the size of the #GByteArray, expanding it if necessary.
+</para>
+
+@array: a #GByteArray.
+@length: the new size of the #GByteArray.
+@Returns: the #GByteArray.
+
+
+<!-- ##### FUNCTION g_byte_array_free ##### -->
+<para>
+Frees the memory allocated by the #GByteArray.
+If @free_segment is %TRUE it frees the actual byte data.
+</para>
+
+@array: a #GByteArray.
+@free_segment: if %TRUE the actual byte data is freed as well.
+@Returns: the element data if @free_segment is %FALSE, otherwise %NULL
+
+
diff --git a/trunk/docs/reference/glib/tmpl/arrays_pointer.sgml b/trunk/docs/reference/glib/tmpl/arrays_pointer.sgml
new file mode 100644
index 000000000..139c9cee4
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/arrays_pointer.sgml
@@ -0,0 +1,248 @@
+<!-- ##### SECTION Title ##### -->
+Pointer Arrays
+
+<!-- ##### SECTION Short_Description ##### -->
+arrays of pointers to any type of data, which grow automatically as new
+elements are added.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+Pointer Arrays are similar to Arrays but are used only for storing pointers.
+</para>
+<note>
+<para>
+If you remove elements from the array, elements at the end of the array
+are moved into the space previously occupied by the removed element.
+This means that you should not rely on the index of particular elements
+remaining the same. You should also be careful when deleting elements while
+iterating over the array.
+</para>
+</note>
+<para>
+To create a pointer array, use g_ptr_array_new().
+</para>
+<para>
+To add elements to a pointer array, use g_ptr_array_add().
+</para>
+<para>
+To remove elements from a pointer array, use g_ptr_array_remove(),
+g_ptr_array_remove_index() or g_ptr_array_remove_index_fast().
+</para>
+<para>
+To access an element of a pointer array, use g_ptr_array_index().
+</para>
+<para>
+To set the size of a pointer array, use g_ptr_array_set_size().
+</para>
+<para>
+To free a pointer array, use g_ptr_array_free().
+</para>
+<example>
+<title>Using a <structname>GPtrArray</structname></title>
+<programlisting>
+ GPtrArray *gparray;
+ gchar *string1 = "one", *string2 = "two", *string3 = "three";
+
+ gparray = g_ptr_array_new (<!-- -->);
+ g_ptr_array_add (gparray, (gpointer) string1);
+ g_ptr_array_add (gparray, (gpointer) string2);
+ g_ptr_array_add (gparray, (gpointer) string3);
+
+ if (g_ptr_array_index (gparray, 0) != (gpointer) string1)
+ g_print ("ERROR: got &percnt;p instead of &percnt;p\n",
+ g_ptr_array_index (gparray, 0), string1);
+
+ g_ptr_array_free (gparray, TRUE);
+</programlisting></example>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GPtrArray ##### -->
+<para>
+Contains the public fields of a pointer array.
+</para>
+
+@pdata: points to the array of pointers, which may be moved when the array grows.
+@len: number of pointers in the array.
+
+<!-- ##### FUNCTION g_ptr_array_new ##### -->
+<para>
+Creates a new #GPtrArray.
+</para>
+
+@Returns: the new #GPtrArray.
+
+
+<!-- ##### FUNCTION g_ptr_array_sized_new ##### -->
+<para>
+Creates a new #GPtrArray with @reserved_size pointers
+preallocated. This avoids frequent reallocation, if you are going to
+add many pointers to the array. Note however that the size of the
+array is still 0.
+</para>
+
+@reserved_size: number of pointers preallocated.
+@Returns: the new #GPtrArray.
+
+
+<!-- ##### FUNCTION g_ptr_array_add ##### -->
+<para>
+Adds a pointer to the end of the pointer array.
+The array will grow in size automatically if necessary.
+</para>
+
+@array: a #GPtrArray.
+@data: the pointer to add.
+
+
+<!-- ##### FUNCTION g_ptr_array_remove ##### -->
+<para>
+Removes the first occurrence of the given pointer from the pointer array.
+The following elements are moved down one place.
+</para>
+<para>
+It returns %TRUE if the pointer was removed, or %FALSE if the pointer
+was not found.
+</para>
+
+@array: a #GPtrArray.
+@data: the pointer to remove.
+@Returns: %TRUE if the pointer is removed. %FALSE if the pointer is not found
+in the array.
+
+
+<!-- ##### FUNCTION g_ptr_array_remove_index ##### -->
+<para>
+Removes the pointer at the given index from the pointer array.
+The following elements are moved down one place.
+</para>
+
+@array: a #GPtrArray.
+@index_: the index of the pointer to remove.
+@Returns: the pointer which was removed.
+
+
+<!-- ##### FUNCTION g_ptr_array_remove_fast ##### -->
+<para>
+Removes the first occurrence of the given pointer from the pointer array.
+The last element in the array is used to fill in the space, so this function
+does not preserve the order of the array. But it is faster than
+g_ptr_array_remove().
+</para>
+<para>
+It returns %TRUE if the pointer was removed, or %FALSE if the pointer
+was not found.
+</para>
+
+@array: a #GPtrArray.
+@data: the pointer to remove.
+@Returns: %TRUE if the pointer was found in the array.
+
+
+<!-- ##### FUNCTION g_ptr_array_remove_index_fast ##### -->
+<para>
+Removes the pointer at the given index from the pointer array.
+The last element in the array is used to fill in the space, so this function
+does not preserve the order of the array. But it is faster than
+g_ptr_array_remove_index().
+</para>
+
+@array: a #GPtrArray.
+@index_: the index of the pointer to remove.
+@Returns: the pointer which was removed.
+
+
+<!-- ##### FUNCTION g_ptr_array_remove_range ##### -->
+<para>
+Removes the given number of pointers starting at the given index from a
+#GPtrArray. The following elements are moved to close the gap.
+</para>
+
+@array: a @GPtrArray.
+@index_: the index of the first pointer to remove.
+@length: the number of pointers to remove.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_ptr_array_sort ##### -->
+<para>
+Sorts the array, using @compare_func which should be a qsort()-style comparison
+function (returns less than zero for first arg is less than second arg,
+zero for equal, greater than zero if irst arg is greater than second arg).
+</para>
+<para>
+If two array elements compare equal, their order in the sorted array is
+undefined.
+</para>
+<note><para>
+The comparison function for g_ptr_array_sort() doesn't take the pointers
+from the array as arguments, it takes pointers to the pointers in the array.
+</para></note>
+
+@array: a #GPtrArray.
+@compare_func: comparison function.
+
+
+<!-- ##### FUNCTION g_ptr_array_sort_with_data ##### -->
+<para>
+Like g_ptr_array_sort(), but the comparison function has an extra user data
+argument.
+</para>
+<note><para>
+The comparison function for g_ptr_array_sort_with_data() doesn't take the
+pointers from the array as arguments, it takes pointers to the pointers in
+the array.
+</para></note>
+
+@array: a #GPtrArray.
+@compare_func: comparison function.
+@user_data: data to pass to @compare_func.
+
+
+<!-- ##### FUNCTION g_ptr_array_set_size ##### -->
+<para>
+Sets the size of the array, expanding it if necessary.
+New elements are set to %NULL.
+</para>
+
+@array: a #GPtrArray.
+@length: the new length of the pointer array.
+
+
+<!-- ##### MACRO g_ptr_array_index ##### -->
+<para>
+Returns the pointer at the given index of the pointer array.
+</para>
+
+@array: a #GPtrArray.
+@index_: the index of the pointer to return.
+@Returns: the pointer at the given index.
+
+
+<!-- ##### FUNCTION g_ptr_array_free ##### -->
+<para>
+Frees all of the memory allocated for the pointer array.
+</para>
+
+@array: a #GPtrArray.
+@free_seg: if %TRUE the array of pointers (@pdata) is freed.
+@Returns: %NULL if @free_seg is %TRUE, otherwise the array of
+pointers (@pdata) is returned.
+
+
+<!-- ##### FUNCTION g_ptr_array_foreach ##### -->
+<para>
+
+</para>
+
+@array:
+@func:
+@user_data:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/async_queues.sgml b/trunk/docs/reference/glib/tmpl/async_queues.sgml
new file mode 100644
index 000000000..269a82ab7
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/async_queues.sgml
@@ -0,0 +1,233 @@
+<!-- ##### SECTION Title ##### -->
+Asynchronous Queues
+
+<!-- ##### SECTION Short_Description ##### -->
+asynchronous communication between threads.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+Often you need to communicate between different threads. In general
+it's safer not to do this by shared memory, but by explicit message
+passing. These messages only make sense asynchronously for
+multi-threaded applications though, as a synchronous operation could as
+well be done in the same thread.
+</para>
+
+<para>
+Asynchronous queues are an exception from most other GLib data
+structures, as they can be used simultaneously from multiple threads
+without explicit locking and they bring their own builtin reference
+counting. This is because the nature of an asynchronous queue is that
+it will always be used by at least 2 concurrent threads.
+</para>
+
+<para>
+For using an asynchronous queue you first have to create one with
+g_async_queue_new(). A newly-created queue will get the reference
+count 1. Whenever another thread is creating a new reference of (that
+is, pointer to) the queue, it has to increase the reference count
+(using g_async_queue_ref()). Also, before removing this reference, the
+reference count has to be decreased (using
+g_async_queue_unref()). After that the queue might no longer exist so
+you must not access it after that point.
+</para>
+
+<para>
+A thread, which wants to send a message to that queue simply calls
+g_async_queue_push() to push the message to the queue.
+</para>
+
+<para>
+A thread, which is expecting messages from an asynchronous queue
+simply calls g_async_queue_pop() for that queue. If no message is
+available in the queue at that point, the thread is now put to sleep
+until a message arrives. The message will be removed from the queue
+and returned. The functions g_async_queue_try_pop() and
+g_async_queue_timed_pop() can be used to only check for the presence
+of messages or to only wait a certain time for messages respectively.
+</para>
+
+<para>
+For almost every function there exist two variants, one that locks the
+queue and one that doesn't. That way you can hold the queue lock
+(acquire it with g_async_queue_lock() and release it with
+g_async_queue_unlock()) over multiple queue accessing
+instructions. This can be necessary to ensure the integrity of the
+queue, but should only be used when really necessary, as it can make
+your life harder if used unwisely. Normally you should only use the
+locking function variants (those without the suffix _unlocked)
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GAsyncQueue ##### -->
+<para>
+The #GAsyncQueue struct is an opaque data structure, which represents
+an asynchronous queue. It should only be accessed through the
+<function>g_async_queue_*</function> functions.
+</para>
+
+
+<!-- ##### FUNCTION g_async_queue_new ##### -->
+
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_async_queue_ref ##### -->
+
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_async_queue_unref ##### -->
+
+
+@queue:
+
+
+<!-- ##### FUNCTION g_async_queue_push ##### -->
+
+
+@queue:
+@data:
+
+
+<!-- ##### FUNCTION g_async_queue_push_sorted ##### -->
+<para>
+
+</para>
+
+@queue:
+@data:
+@func:
+@user_data:
+
+
+<!-- ##### FUNCTION g_async_queue_pop ##### -->
+
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_async_queue_try_pop ##### -->
+
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_async_queue_timed_pop ##### -->
+
+
+@queue:
+@end_time:
+@Returns:
+
+
+<!-- ##### FUNCTION g_async_queue_length ##### -->
+
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_async_queue_sort ##### -->
+<para>
+
+</para>
+
+@queue:
+@func:
+@user_data:
+
+
+<!-- ##### FUNCTION g_async_queue_lock ##### -->
+
+
+@queue:
+
+
+<!-- ##### FUNCTION g_async_queue_unlock ##### -->
+
+
+@queue:
+
+
+<!-- ##### FUNCTION g_async_queue_ref_unlocked ##### -->
+
+
+@queue:
+
+
+<!-- ##### FUNCTION g_async_queue_unref_and_unlock ##### -->
+
+
+@queue:
+
+
+<!-- ##### FUNCTION g_async_queue_push_unlocked ##### -->
+
+
+@queue:
+@data:
+
+
+<!-- ##### FUNCTION g_async_queue_push_sorted_unlocked ##### -->
+<para>
+
+</para>
+
+@queue:
+@data:
+@func:
+@user_data:
+
+
+<!-- ##### FUNCTION g_async_queue_pop_unlocked ##### -->
+
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_async_queue_try_pop_unlocked ##### -->
+
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_async_queue_timed_pop_unlocked ##### -->
+
+
+@queue:
+@end_time:
+@Returns:
+
+
+<!-- ##### FUNCTION g_async_queue_length_unlocked ##### -->
+
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_async_queue_sort_unlocked ##### -->
+<para>
+
+</para>
+
+@queue:
+@func:
+@user_data:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/atomic_operations.sgml b/trunk/docs/reference/glib/tmpl/atomic_operations.sgml
new file mode 100644
index 000000000..ad3e04b6f
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/atomic_operations.sgml
@@ -0,0 +1,183 @@
+<!-- ##### SECTION Title ##### -->
+Atomic Operations
+
+<!-- ##### SECTION Short_Description ##### -->
+basic atomic integer and pointer operations
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The following functions can be used to atomically access integers and
+pointers. They are implemented as inline assembler function on most
+platforms and use slower fall-backs otherwise. Using them can sometimes
+save you from using a performance-expensive #GMutex to protect the
+integer or pointer.
+</para>
+
+<para>
+The most important usage is reference counting. Using
+g_atomic_int_inc() and g_atomic_int_dec_and_test() makes reference
+counting a very fast operation.
+</para>
+
+<note>
+<para>
+You must not directly read integers or pointers concurrently accessed
+by multiple threads, but use the atomic accessor functions instead.
+That is, always use g_atomic_int_get() and g_atomic_pointer_get() for
+read outs.
+They provide the neccessary synchonization mechanisms like memory
+barriers to access memory locations concurrently.
+</para>
+</note>
+
+<note>
+<para>
+If you are using those functions for anything apart from simple
+reference counting, you should really be aware of the implications of
+doing that. There are literally thousands of ways to shoot yourself in
+the foot. So if in doubt, use a #GMutex. If you don't know, what
+memory barriers are, do not use anything but g_atomic_int_inc() and
+g_atomic_int_dec_and_test().
+</para>
+</note>
+
+<note>
+<para>
+It is not safe to set an integer or pointer just by assigning to it,
+when it is concurrently accessed by other threads with the following
+functions. Use g_atomic_int_compare_and_exchange() or
+g_atomic_pointer_compare_and_exchange() respectively.
+</para>
+</note>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+<variablelist>
+
+<varlistentry>
+<term>#GMutex</term>
+<listitem><para>GLib mutual exclusions.</para></listitem>
+</varlistentry>
+
+</variablelist>
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### FUNCTION g_atomic_int_get ##### -->
+<para>
+Reads the value of the integer pointed to by @atomic. Also acts as
+a memory barrier.
+</para>
+
+@atomic: a pointer to an integer
+@Returns: the value of *@atomic
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_atomic_int_set ##### -->
+<para>
+Sets the value of the integer pointed to by @atomic.
+Also acts as a memory barrier.
+</para>
+
+@atomic: a pointer to an integer
+@newval: the new value
+@Since: 2.10
+
+
+<!-- ##### FUNCTION g_atomic_int_add ##### -->
+<para>
+Atomically adds @val to the integer pointed to by @atomic.
+Also acts as a memory barrier.
+</para>
+
+@atomic: a pointer to an integer.
+@val: the value to add to *@atomic.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_atomic_int_exchange_and_add ##### -->
+<para>
+Atomically adds @val to the integer pointed to by @atomic. It returns
+the value of *@atomic just before the addition took place.
+Also acts as a memory barrier.
+</para>
+
+@atomic: a pointer to an integer.
+@val: the value to add to *@atomic.
+@Returns: the value of *@atomic before the addition.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_atomic_int_compare_and_exchange ##### -->
+<para>
+Compares @oldval with the integer pointed to by @atomic and
+if they are equal, atomically exchanges *@atomic with @newval.
+Also acts as a memory barrier.
+</para>
+
+@atomic: a pointer to an integer.
+@oldval: the assumed old value of *@atomic.
+@newval: the new value of *@atomic.
+@Returns: %TRUE, if *@atomic was equal @oldval. %FALSE otherwise.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_atomic_pointer_get ##### -->
+<para>
+Reads the value of the pointer pointed to by @atomic. Also acts as
+a memory barrier.
+</para>
+
+@atomic: a pointer to a #gpointer.
+@Returns: the value to add to *@atomic.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_atomic_pointer_set ##### -->
+<para>
+Sets the value of the pointer pointed to by @atomic.
+Also acts as a memory barrier.
+</para>
+
+@atomic: a pointer to a #gpointer
+@newval: the new value
+@Since: 2.10
+
+
+<!-- ##### FUNCTION g_atomic_pointer_compare_and_exchange ##### -->
+<para>
+Compares @oldval with the pointer pointed to by @atomic and
+if they are equal, atomically exchanges *@atomic with @newval.
+Also acts as a memory barrier.
+</para>
+
+@atomic: a pointer to a #gpointer.
+@oldval: the assumed old value of *@atomic.
+@newval: the new value of *@atomic.
+@Returns: %TRUE, if *@atomic was equal @oldval. %FALSE otherwise.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_atomic_int_inc ##### -->
+<para>
+Atomically increments the integer pointed to by @atomic by 1.
+</para>
+
+@atomic: a pointer to an integer.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_atomic_int_dec_and_test ##### -->
+<para>
+Atomically decrements the integer pointed to by @atomic by 1.
+</para>
+
+@atomic: a pointer to an integer.
+@Returns: %TRUE, if the integer pointed to by @atomic is 0 after
+decrementing it.
+@Since: 2.4
+
+
diff --git a/trunk/docs/reference/glib/tmpl/base64.sgml b/trunk/docs/reference/glib/tmpl/base64.sgml
new file mode 100644
index 000000000..787be6d39
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/base64.sgml
@@ -0,0 +1,94 @@
+<!-- ##### SECTION Title ##### -->
+Base64 Encoding
+
+<!-- ##### SECTION Short_Description ##### -->
+encodes and decodes data in Base64 format
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+Base64 is an encoding that allows to encode a sequence of arbitrary
+bytes as a sequence of printable ASCII characters. For the definition
+of Base64, see <ulink url="http://www.ietf.org/rfc/rfc1421.txt">RFC
+1421</ulink> or <ulink url="http://www.ietf.org/rfc/rfc2045.txt">RFC
+2045</ulink>. Base64 is most commonly used as a MIME transfer encoding
+for email.
+</para>
+
+<para>
+GLib supports incremental encoding using g_base64_encode_step() and
+g_base64_encode_close(). Incremental decoding can be done with
+g_base64_decode_step(). To encode or decode data in one go, use
+g_base64_encode() or g_base64_decode().
+</para>
+
+<para>
+Support for Base64 encoding has been added in GLib 2.12.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### FUNCTION g_base64_encode_step ##### -->
+<para>
+
+</para>
+
+@in:
+@len:
+@break_lines:
+@out:
+@state:
+@save:
+@Returns:
+
+
+<!-- ##### FUNCTION g_base64_encode_close ##### -->
+<para>
+
+</para>
+
+@break_lines:
+@out:
+@state:
+@save:
+@Returns:
+
+
+<!-- ##### FUNCTION g_base64_encode ##### -->
+<para>
+
+</para>
+
+@data:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_base64_decode_step ##### -->
+<para>
+
+</para>
+
+@in:
+@len:
+@out:
+@state:
+@save:
+@Returns:
+
+
+<!-- ##### FUNCTION g_base64_decode ##### -->
+<para>
+
+</para>
+
+@text:
+@out_len:
+@Returns:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/bookmarkfile.sgml b/trunk/docs/reference/glib/tmpl/bookmarkfile.sgml
new file mode 100644
index 000000000..5542b98cc
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/bookmarkfile.sgml
@@ -0,0 +1,552 @@
+<!-- ##### SECTION Title ##### -->
+Bookmark file parser
+
+<!-- ##### SECTION Short_Description ##### -->
+parses files containing bookmarks
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+#GBookmarkFile lets you parse, edit or create files containing bookmarks
+to URI, along with some meta-data about the resource pointed by the URI like
+its MIME type, the application that is registering the bookmark and the
+icon that should be used to represent the bookmark. The data is stored using
+the
+<ulink url="http://www.gnome.org/~ebassi/bookmark-spec">Desktop Bookmark
+Specification</ulink>.
+</para>
+
+<para>
+The syntax of the bookmark files is described in detail inside the Desktop
+Bookmark Specification, here is a quick summary: bookmark files use a sub-class
+of the
+<ulink url="">XML Bookmark Exchange Language</ulink> specification, consisting
+of valid UTF-8 encoded XML, under the <literal>xbel</literal> root element;
+each bookmark is stored inside a <literal>bookmark</literal> element, using
+its URI: no relative paths can be used inside a bookmark file. The bookmark
+may have a user defined title and description, to be used instead of the URI.
+Under the <literal>metadata</literal> element, with its <literal>owner</literal>
+attribute set to <literal>http://freedesktop.org</literal>, is stored the
+meta-data about a resource pointed by its URI. The meta-data consists of
+the resource's MIME type; the applications that have registered a bookmark;
+the groups to which a bookmark belongs to; a visibility flag, used to set
+the bookmark as "private" to the applications and groups that has it
+registered; the URI and MIME type of an icon, to be used when displaying the
+bookmark inside a GUI.
+</para>
+
+<informalexample><programlisting>
+<![CDATA[
+<?xml version="1.0"?>
+<!DOCTYPE xbel PUBLIC
+ "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks">
+ <bookmark href="file:///home/ebassi/bookmark-spec/bookmark-spec.xml">
+ <title>Desktop Bookmarks Spec</title>
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type>text/xml</mime:mime-type>
+ <bookmark:applications>
+ <bookmark:application name="GEdit" count="2" exec="gedit %u" timestamp="1115726763"/>
+ <bookmark:application name="GViM" count="7" exec="gvim %f" timestamp="1115726812"/>
+ </bookmark:applications>
+ <bookmark:groups>
+ <bookmark:group>Editors</bookmark:group>
+ </bookmark:groups>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
+]]>
+</programlisting></informalexample>
+
+<para>
+A bookmark file might contain more than one bookmark; each bookmark is accessed
+through its URI.
+</para>
+
+<para>
+The important caveat of bookmark files is that when you add a new bookmark you
+must also add the application that is registering it, using
+g_bookmark_file_add_application() or g_bookmark_file_set_app_info(). If a
+bookmark has no applications then it won't be dumped when creating the
+on disk representation, using g_bookmark_file_to_data() or
+g_bookmark_file_to_file().
+</para>
+
+<para>
+The #GBookmarkFile parser was added in GLib 2.12.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GBookmarkFile ##### -->
+<para>
+The <structname>GBookmarkFile</structname> struct contains only private data
+and should not be used directly.
+</para>
+
+
+<!-- ##### MACRO G_BOOKMARK_FILE_ERROR ##### -->
+<para>
+Error domain for bookmark file parsing. Errors in this domain will be
+from the #GBookmarkFileError enumeration. See #GError for informations
+on error domains.
+</para>
+
+
+
+<!-- ##### ENUM GBookmarkFileError ##### -->
+<para>
+Error codes returned by bookmark file parsing.
+</para>
+
+@G_BOOKMARK_FILE_ERROR_INVALID_URI: URI was ill-formed
+@G_BOOKMARK_FILE_ERROR_INVALID_VALUE: a requested field was not found
+@G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED: a requested application did not
+register a bookmark
+@G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND: a requested URI was not found
+@G_BOOKMARK_FILE_ERROR_READ: document was ill formed
+@G_BOOKMARK_FILE_ERROR_UNKNOWN_ENCODING: the text being parsed was in an
+unknown encoding
+@G_BOOKMARK_FILE_ERROR_WRITE: an error occurred while writing
+@G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND: requested file was not found
+
+<!-- ##### FUNCTION g_bookmark_file_new ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_free ##### -->
+<para>
+
+</para>
+
+@bookmark:
+
+
+<!-- ##### FUNCTION g_bookmark_file_load_from_file ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@filename:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_load_from_data ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@data:
+@length:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_load_from_data_dirs ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@file:
+@full_path:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_to_data ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@length:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_to_file ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@filename:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_has_item ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_has_group ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@group:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_has_application ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@name:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_get_size ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_get_uris ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@length:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_get_title ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_get_description ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_get_mime_type ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_get_is_private ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_get_icon ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@href:
+@mime_type:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_get_added ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_get_modified ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_get_visited ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_get_groups ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@length:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_get_applications ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@length:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_get_app_info ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@name:
+@exec:
+@count:
+@stamp:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_set_title ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@title:
+
+
+<!-- ##### FUNCTION g_bookmark_file_set_description ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@description:
+
+
+<!-- ##### FUNCTION g_bookmark_file_set_mime_type ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@mime_type:
+
+
+<!-- ##### FUNCTION g_bookmark_file_set_is_private ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@is_private:
+
+
+<!-- ##### FUNCTION g_bookmark_file_set_icon ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@href:
+@mime_type:
+
+
+<!-- ##### FUNCTION g_bookmark_file_set_added ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@added:
+
+
+<!-- ##### FUNCTION g_bookmark_file_set_groups ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@groups:
+@length:
+
+
+<!-- ##### FUNCTION g_bookmark_file_set_modified ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@modified:
+
+
+<!-- ##### FUNCTION g_bookmark_file_set_visited ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@visited:
+
+
+<!-- ##### FUNCTION g_bookmark_file_set_app_info ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@name:
+@exec:
+@count:
+@stamp:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_add_group ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@group:
+
+
+<!-- ##### FUNCTION g_bookmark_file_add_application ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@name:
+@exec:
+
+
+<!-- ##### FUNCTION g_bookmark_file_remove_group ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@group:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_remove_application ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@name:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_remove_item ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@uri:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bookmark_file_move_item ##### -->
+<para>
+
+</para>
+
+@bookmark:
+@old_uri:
+@new_uri:
+@error:
+@Returns:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/byte_order.sgml b/trunk/docs/reference/glib/tmpl/byte_order.sgml
new file mode 100644
index 000000000..e146a6505
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/byte_order.sgml
@@ -0,0 +1,553 @@
+<!-- ##### SECTION Title ##### -->
+Byte Order Macros
+
+<!-- ##### SECTION Short_Description ##### -->
+a portable way to convert between different byte orders.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+These macros provide a portable way to determine the host byte order
+and to convert values between different byte orders.
+</para>
+<para>
+The byte order is the order in which bytes are stored to create larger
+data types such as the #gint and #glong values.
+The host byte order is the byte order used on the current machine.
+</para>
+<para>
+Some processors store the most significant bytes (i.e. the bytes that
+hold the largest part of the value) first. These are known as big-endian
+processors.
+</para>
+<para>
+Other processors (notably the x86 family) store the most significant byte
+last. These are known as little-endian processors.
+</para>
+<para>
+Finally, to complicate matters, some other processors store the bytes in
+a rather curious order known as PDP-endian. For a 4-byte word, the 3rd
+most significant byte is stored first, then the 4th, then the 1st and finally
+the 2nd.
+</para>
+<para>
+Obviously there is a problem when these different processors communicate
+with each other, for example over networks or by using binary file formats.
+This is where these macros come in.
+They are typically used to convert values into a byte order
+which has been agreed on for use when communicating between different
+processors. The Internet uses what is known as 'network byte order'
+as the standard byte order (which is in fact the big-endian byte order).
+</para>
+<para>
+Note that the byte order conversion macros may evaluate their arguments
+multiple times, thus you should not use them with arguments which have
+side-effects.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO G_BYTE_ORDER ##### -->
+<para>
+The host byte order.
+This can be either #G_LITTLE_ENDIAN or #G_BIG_ENDIAN (support for
+#G_PDP_ENDIAN may be added in future.)
+</para>
+
+
+
+<!-- ##### MACRO G_LITTLE_ENDIAN ##### -->
+<para>
+Specifies one of the possible types of byte order.
+See #G_BYTE_ORDER.
+</para>
+
+
+
+<!-- ##### MACRO G_BIG_ENDIAN ##### -->
+<para>
+Specifies one of the possible types of byte order.
+See #G_BYTE_ORDER.
+</para>
+
+
+
+<!-- ##### MACRO G_PDP_ENDIAN ##### -->
+<para>
+Specifies one of the possible types of byte order (currently unused).
+See #G_BYTE_ORDER.
+</para>
+
+
+
+<!-- ##### MACRO g_htonl ##### -->
+<para>
+Converts a 32-bit integer value from host to network byte order.
+</para>
+
+@val: a 32-bit integer value in host byte order.
+@Returns: @val converted to network byte order.
+
+
+<!-- ##### MACRO g_htons ##### -->
+<para>
+Converts a 16-bit integer value from host to network byte order.
+</para>
+
+@val: a 16-bit integer value in host byte order.
+@Returns: @val converted to network byte order.
+
+
+<!-- ##### MACRO g_ntohl ##### -->
+<para>
+Converts a 32-bit integer value from network to host byte order.
+</para>
+
+@val: a 32-bit integer value in network byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO g_ntohs ##### -->
+<para>
+Converts a 16-bit integer value from network to host byte order.
+</para>
+
+@val: a 16-bit integer value in network byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GINT_FROM_BE ##### -->
+<para>
+Converts a #gint value from big-endian to host byte order.
+</para>
+
+@val: a #gint value in big-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GINT_FROM_LE ##### -->
+<para>
+Converts a #gint value from little-endian to host byte order.
+</para>
+
+@val: a #gint value in little-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GINT_TO_BE ##### -->
+<para>
+Converts a #gint value from host byte order to big-endian.
+</para>
+
+@val: a #gint value in host byte order.
+@Returns: @val converted to big-endian byte order.
+
+
+<!-- ##### MACRO GINT_TO_LE ##### -->
+<para>
+Converts a #gint value from host byte order to little-endian.
+</para>
+
+@val: a #gint value in host byte order.
+@Returns: @val converted to little-endian byte order.
+
+
+<!-- ##### MACRO GUINT_FROM_BE ##### -->
+<para>
+Converts a #guint value from big-endian to host byte order.
+</para>
+
+@val: a #guint value in big-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GUINT_FROM_LE ##### -->
+<para>
+Converts a #guint value from little-endian to host byte order.
+</para>
+
+@val: a #guint value in little-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GUINT_TO_BE ##### -->
+<para>
+Converts a #guint value from host byte order to big-endian.
+</para>
+
+@val: a #guint value in host byte order.
+@Returns: @val converted to big-endian byte order.
+
+
+<!-- ##### MACRO GUINT_TO_LE ##### -->
+<para>
+Converts a #guint value from host byte order to little-endian.
+</para>
+
+@val: a #guint value in host byte order.
+@Returns: @val converted to little-endian byte order.
+
+
+<!-- ##### MACRO GLONG_FROM_BE ##### -->
+<para>
+Converts a #glong value from big-endian to the host byte order.
+</para>
+
+@val: a #glong value in big-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GLONG_FROM_LE ##### -->
+<para>
+Converts a #glong value from little-endian to host byte order.
+</para>
+
+@val: a #glong value in little-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GLONG_TO_BE ##### -->
+<para>
+Converts a #glong value from host byte order to big-endian.
+</para>
+
+@val: a #glong value in host byte order.
+@Returns: @val converted to big-endian byte order.
+
+
+<!-- ##### MACRO GLONG_TO_LE ##### -->
+<para>
+Converts a #glong value from host byte order to little-endian.
+</para>
+
+@val: a #glong value in host byte order.
+@Returns: @val converted to little-endian.
+
+
+<!-- ##### MACRO GULONG_FROM_BE ##### -->
+<para>
+Converts a #gulong value from big-endian to host byte order.
+</para>
+
+@val: a #gulong value in big-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GULONG_FROM_LE ##### -->
+<para>
+Converts a #gulong value from little-endian to host byte order.
+</para>
+
+@val: a #gulong value in little-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GULONG_TO_BE ##### -->
+<para>
+Converts a #gulong value from host byte order to big-endian.
+</para>
+
+@val: a #gulong value in host byte order.
+@Returns: @val converted to big-endian.
+
+
+<!-- ##### MACRO GULONG_TO_LE ##### -->
+<para>
+Converts a #gulong value from host byte order to little-endian.
+</para>
+
+@val: a #gulong value in host byte order.
+@Returns: @val converted to little-endian.
+
+
+<!-- ##### MACRO GINT16_FROM_BE ##### -->
+<para>
+Converts a #gint16 value from big-endian to host byte order.
+</para>
+
+@val: a #gint16 value in big-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GINT16_FROM_LE ##### -->
+<para>
+Converts a #gint16 value from little-endian to host byte order.
+</para>
+
+@val: a #gint16 value in little-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GINT16_TO_BE ##### -->
+<para>
+Converts a #gint16 value from host byte order to big-endian.
+</para>
+
+@val: a #gint16 value in host byte order.
+@Returns: @val converted to big-endian.
+
+
+<!-- ##### MACRO GINT16_TO_LE ##### -->
+<para>
+Converts a #gint16 value from host byte order to little-endian.
+</para>
+
+@val: a #gint16 value in host byte order.
+@Returns: @val converted to little-endian.
+
+
+<!-- ##### MACRO GUINT16_FROM_BE ##### -->
+<para>
+Converts a #guint16 value from big-endian to host byte order.
+</para>
+
+@val: a #guint16 value in big-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GUINT16_FROM_LE ##### -->
+<para>
+Converts a #guint16 value from little-endian to host byte order.
+</para>
+
+@val: a #guint16 value in little-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GUINT16_TO_BE ##### -->
+<para>
+Converts a #guint16 value from host byte order to big-endian.
+</para>
+
+@val: a #guint16 value in host byte order.
+@Returns: @val converted to big-endian.
+
+
+<!-- ##### MACRO GUINT16_TO_LE ##### -->
+<para>
+Converts a #guint16 value from host byte order to little-endian.
+</para>
+
+@val: a #guint16 value in host byte order.
+@Returns: @val converted to little-endian.
+
+
+<!-- ##### MACRO GINT32_FROM_BE ##### -->
+<para>
+Converts a #gint32 value from big-endian to host byte order.
+</para>
+
+@val: a #gint32 value in big-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GINT32_FROM_LE ##### -->
+<para>
+Converts a #gint32 value from little-endian to host byte order.
+</para>
+
+@val: a #gint32 value in little-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GINT32_TO_BE ##### -->
+<para>
+Converts a #gint32 value from host byte order to big-endian.
+</para>
+
+@val: a #gint32 value in host byte order.
+@Returns: @val converted to big-endian.
+
+
+<!-- ##### MACRO GINT32_TO_LE ##### -->
+<para>
+Converts a #gint32 value from host byte order to little-endian.
+</para>
+
+@val: a #gint32 value in host byte order.
+@Returns: @val converted to little-endian.
+
+
+<!-- ##### MACRO GUINT32_FROM_BE ##### -->
+<para>
+Converts a #guint32 value from big-endian to host byte order.
+</para>
+
+@val: a #guint32 value in big-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GUINT32_FROM_LE ##### -->
+<para>
+Converts a #guint32 value from little-endian to host byte order.
+</para>
+
+@val: a #guint32 value in little-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GUINT32_TO_BE ##### -->
+<para>
+Converts a #guint32 value from host byte order to big-endian.
+</para>
+
+@val: a #guint32 value in host byte order.
+@Returns: @val converted to big-endian.
+
+
+<!-- ##### MACRO GUINT32_TO_LE ##### -->
+<para>
+Converts a #guint32 value from host byte order to little-endian.
+</para>
+
+@val: a #guint32 value in host byte order.
+@Returns: @val converted to little-endian.
+
+
+<!-- ##### MACRO GINT64_FROM_BE ##### -->
+<para>
+Converts a #gint64 value from big-endian to host byte order.
+</para>
+
+@val: a #gint64 value in big-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GINT64_FROM_LE ##### -->
+<para>
+Converts a #gint64 value from little-endian to host byte order.
+</para>
+
+@val: a #gint64 value in little-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GINT64_TO_BE ##### -->
+<para>
+Converts a #gint64 value from host byte order to big-endian.
+</para>
+
+@val: a #gint64 value in host byte order.
+@Returns: @val converted to big-endian.
+
+
+<!-- ##### MACRO GINT64_TO_LE ##### -->
+<para>
+Converts a #gint64 value from host byte order to little-endian.
+</para>
+
+@val: a #gint64 value in host byte order.
+@Returns: @val converted to little-endian.
+
+
+<!-- ##### MACRO GUINT64_FROM_BE ##### -->
+<para>
+Converts a #guint64 value from big-endian to host byte order.
+</para>
+
+@val: a #guint64 value in big-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GUINT64_FROM_LE ##### -->
+<para>
+Converts a #guint64 value from little-endian to host byte order.
+</para>
+
+@val: a #guint64 value in little-endian byte order.
+@Returns: @val converted to host byte order.
+
+
+<!-- ##### MACRO GUINT64_TO_BE ##### -->
+<para>
+Converts a #guint64 value from host byte order to big-endian.
+</para>
+
+@val: a #guint64 value in host byte order.
+@Returns: @val converted to big-endian.
+
+
+<!-- ##### MACRO GUINT64_TO_LE ##### -->
+<para>
+Converts a #guint64 value from host byte order to little-endian.
+</para>
+
+@val: a #guint64 value in host byte order.
+@Returns: @val converted to little-endian.
+
+
+<!-- ##### MACRO GUINT16_SWAP_BE_PDP ##### -->
+<para>
+Converts a #guint16 value between big-endian and pdp-endian byte order.
+The conversion is symmetric so it can be used both ways.
+</para>
+
+@val: a #guint16 value in big-endian or pdp-endian byte order.
+@Returns: @val converted to the opposite byte order.
+
+
+<!-- ##### MACRO GUINT16_SWAP_LE_BE ##### -->
+<para>
+Converts a #guint16 value between little-endian and big-endian byte order.
+The conversion is symmetric so it can be used both ways.
+</para>
+
+@val: a #guint16 value in little-endian or big-endian byte order.
+@Returns: @val converted to the opposite byte order.
+
+
+<!-- ##### MACRO GUINT16_SWAP_LE_PDP ##### -->
+<para>
+Converts a #guint16 value between little-endian and pdp-endian byte order.
+The conversion is symmetric so it can be used both ways.
+</para>
+
+@val: a #guint16 value in little-endian or pdp-endian byte order.
+@Returns: @val converted to the opposite byte order.
+
+
+<!-- ##### MACRO GUINT32_SWAP_BE_PDP ##### -->
+<para>
+Converts a #guint32 value between big-endian and pdp-endian byte order.
+The conversion is symmetric so it can be used both ways.
+</para>
+
+@val: a #guint32 value in big-endian or pdp-endian byte order.
+@Returns: @val converted to the opposite byte order.
+
+
+<!-- ##### MACRO GUINT32_SWAP_LE_BE ##### -->
+<para>
+Converts a #guint32 value between little-endian and big-endian byte order.
+The conversion is symmetric so it can be used both ways.
+</para>
+
+@val: a #guint32 value in little-endian or big-endian byte order.
+@Returns: @val converted to the opposite byte order.
+
+
+<!-- ##### MACRO GUINT32_SWAP_LE_PDP ##### -->
+<para>
+Converts a #guint32 value between little-endian and pdp-endian byte order.
+The conversion is symmetric so it can be used both ways.
+</para>
+
+@val: a #guint32 value in little-endian or pdp-endian byte order.
+@Returns: @val converted to the opposite byte order.
+
+
+<!-- ##### MACRO GUINT64_SWAP_LE_BE ##### -->
+<para>
+Converts a #guint64 value between little-endian and big-endian byte order.
+The conversion is symmetric so it can be used both ways.
+</para>
+
+@val: a #guint64 value in little-endian or big-endian byte order.
+@Returns: @val converted to the opposite byte order.
+
+
diff --git a/trunk/docs/reference/glib/tmpl/caches.sgml b/trunk/docs/reference/glib/tmpl/caches.sgml
new file mode 100644
index 000000000..ebac3d0b4
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/caches.sgml
@@ -0,0 +1,162 @@
+<!-- ##### SECTION Title ##### -->
+Caches
+
+<!-- ##### SECTION Short_Description ##### -->
+caches allow sharing of complex data structures to save resources.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+A #GCache allows sharing of complex data structures, in order to save
+system resources.
+</para>
+<para>
+GTK+ uses caches for #GtkStyles and #GdkGCs. These consume a lot of
+resources, so a #GCache is used to see if a #GtkStyle or #GdkGC with the
+required properties already exists. If it does, then the existing
+object is used instead of creating a new one.
+</para>
+<para>
+#GCache uses keys and values.
+A #GCache key describes the properties of a particular resource.
+A #GCache value is the actual resource.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GCache ##### -->
+<para>
+The #GCache struct is an opaque data structure containing information about
+a #GCache. It should only be accessed via the following functions.
+</para>
+
+
+<!-- ##### FUNCTION g_cache_new ##### -->
+<para>
+Creates a new #GCache.
+</para>
+
+@value_new_func: a function to create a new object given a key.
+This is called by g_cache_insert() if an object with the given key
+does not already exist.
+@value_destroy_func: a function to destroy an object. It is
+called by g_cache_remove() when the object is no longer needed (i.e. its
+reference count drops to 0).
+@key_dup_func: a function to copy a key. It is called by
+g_cache_insert() if the key does not already exist in the #GCache.
+@key_destroy_func: a function to destroy a key. It is
+called by g_cache_remove() when the object is no longer needed (i.e. its
+reference count drops to 0).
+@hash_key_func: a function to create a hash value from a key.
+@hash_value_func: a function to create a hash value from a value.
+@key_equal_func: a function to compare two keys. It should return %TRUE if
+the two keys are equivalent.
+@Returns: a new #GCache.
+
+
+<!-- ##### FUNCTION g_cache_insert ##### -->
+<para>
+Gets the value corresponding to the given key, creating it if necessary.
+It first checks if the value already exists in the #GCache, by using
+the @key_equal_func function passed to g_cache_new().
+If it does already exist it is returned, and its reference count is increased
+by one.
+If the value does not currently exist, if is created by calling the
+@value_new_func. The key is duplicated by calling
+@key_dup_func and the duplicated key and value are inserted
+into the #GCache.
+</para>
+
+@cache: a #GCache.
+@key: a key describing a #GCache object.
+@Returns: a pointer to a #GCache value.
+
+
+<!-- ##### FUNCTION g_cache_remove ##### -->
+<para>
+Decreases the reference count of the given value.
+If it drops to 0 then the value and its corresponding key are destroyed,
+using the @value_destroy_func and @key_destroy_func passed to g_cache_new().
+</para>
+
+@cache: a #GCache.
+@value: the value to remove.
+
+
+<!-- ##### FUNCTION g_cache_destroy ##### -->
+<para>
+Frees the memory allocated for the #GCache.
+</para>
+<para>
+Note that it does not destroy the keys and values which were contained in the
+#GCache.
+</para>
+
+@cache: a #GCache.
+
+
+<!-- ##### FUNCTION g_cache_key_foreach ##### -->
+<para>
+Calls the given function for each of the keys in the #GCache.
+</para>
+<note><para>@func is passed three parameters, the value and key of a
+cache entry and the @user_data. The order of value and key is different
+from the order in which g_hash_table_foreach() passes key-value pairs
+to its callback function !
+</para></note>
+
+@cache: a #GCache.
+@func: the function to call with each #GCache key.
+@user_data: user data to pass to the function.
+
+
+<!-- ##### FUNCTION g_cache_value_foreach ##### -->
+<para>
+Calls the given function for each of the values in the #GCache.
+</para>
+
+@cache: a #GCache.
+@func: the function to call with each #GCache value.
+@user_data: user data to pass to the function.
+@Deprecated: 2.10: The reason is that it passes pointers to internal data
+structures to @func; use g_cache_key_foreach() instead
+
+
+<!-- ##### USER_FUNCTION GCacheDestroyFunc ##### -->
+<para>
+Specifies the type of the @value_destroy_func and @key_destroy_func functions
+passed to g_cache_new().
+The functions are passed a pointer to the #GCache key or #GCache value and
+should free any memory and other resources associated with it.
+</para>
+
+@value: the #GCache value to destroy.
+
+
+<!-- ##### USER_FUNCTION GCacheDupFunc ##### -->
+<para>
+Specifies the type of the @key_dup_func function passed to g_cache_new().
+The function is passed a key (<emphasis>not</emphasis> a value as the prototype implies) and
+should return a duplicate of the key.
+</para>
+
+@value: the #GCache key to destroy (<emphasis>not</emphasis> a #GCache value as it seems).
+@Returns: a copy of the #GCache key.
+
+
+<!-- ##### USER_FUNCTION GCacheNewFunc ##### -->
+<para>
+Specifies the type of the @value_new_func function passed to g_cache_new().
+It is passed a #GCache key and should create the value corresponding to the
+key.
+</para>
+
+@key: a #GCache key.
+@Returns: a new #GCache value corresponding to the key.
+
+
diff --git a/trunk/docs/reference/glib/tmpl/completion.sgml b/trunk/docs/reference/glib/tmpl/completion.sgml
new file mode 100644
index 000000000..85de592ed
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/completion.sgml
@@ -0,0 +1,158 @@
+<!-- ##### SECTION Title ##### -->
+Automatic String Completion
+
+<!-- ##### SECTION Short_Description ##### -->
+support for automatic completion using a group of target strings.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+#GCompletion provides support for automatic completion of a string using
+any group of target strings. It is typically used for file name completion
+as is common in many UNIX shells.
+</para>
+<para>
+A #GCompletion is created using g_completion_new().
+Target items are added and removed with
+g_completion_add_items(), g_completion_remove_items() and
+g_completion_clear_items().
+A completion attempt is requested with g_completion_complete() or
+g_completion_complete_utf8().
+When no longer needed, the #GCompletion is freed with g_completion_free().
+</para>
+<para>
+Items in the completion can be simple strings (e.g. filenames),
+or pointers to arbitrary data structures. If data structures are used
+you must provide a #GCompletionFunc in g_completion_new(),
+which retrieves the item's string from the data structure.
+You can change the way in which strings are compared by setting
+a different #GCompletionStrncmpFunc in g_completion_set_compare().
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GCompletion ##### -->
+<para>
+The data structure used for automatic completion.
+</para>
+
+@items: list of target items (strings or data structures).
+@func: function which is called to get the string associated with a target
+ item. It is %NULL if the target items are strings.
+@prefix: the last prefix passed to g_completion_complete() or
+ g_completion_complete_utf8().
+@cache: the list of items which begin with @prefix.
+@strncmp_func: The function to use when comparing strings.
+ Use g_completion_set_compare() to modify this function.
+
+<!-- ##### FUNCTION g_completion_new ##### -->
+<para>
+Creates a new #GCompletion.
+</para>
+
+@func: the function to be called to return the string representing an item
+in the #GCompletion, or %NULL if strings are going to be used as the
+#GCompletion items.
+@Returns: the new #GCompletion.
+
+
+<!-- ##### USER_FUNCTION GCompletionFunc ##### -->
+<para>
+Specifies the type of the function passed to g_completion_new().
+It should return the string corresponding to the given target item.
+This is used when you use data structures as #GCompletion items.
+</para>
+
+@Param1: the completion item.
+@Returns: the string corresponding to the item.
+
+
+<!-- ##### FUNCTION g_completion_add_items ##### -->
+<para>
+Adds items to the #GCompletion.
+</para>
+
+@cmp: the #GCompletion.
+@items: the list of items to add.
+
+
+<!-- ##### FUNCTION g_completion_remove_items ##### -->
+<para>
+Removes items from a #GCompletion.
+</para>
+
+@cmp: the #GCompletion.
+@items: the items to remove.
+
+
+<!-- ##### FUNCTION g_completion_clear_items ##### -->
+<para>
+Removes all items from the #GCompletion.
+</para>
+
+@cmp: the #GCompletion.
+
+
+<!-- ##### FUNCTION g_completion_complete ##### -->
+<para>
+Attempts to complete the string @prefix using the #GCompletion target items.
+</para>
+
+@cmp: the #GCompletion.
+@prefix: the prefix string, typically typed by the user, which is compared
+with each of the items.
+@new_prefix: if non-%NULL, returns the longest prefix which is common to all
+items that matched @prefix, or %NULL if no items matched @prefix.
+This string should be freed when no longer needed.
+@Returns: the list of items whose strings begin with @prefix. This should
+not be changed.
+
+
+<!-- ##### FUNCTION g_completion_complete_utf8 ##### -->
+<para>
+
+</para>
+
+@cmp:
+@prefix:
+@new_prefix:
+@Returns:
+
+
+<!-- ##### FUNCTION g_completion_set_compare ##### -->
+<para>
+Sets the function to use for string comparisons. The default
+string comparison function is strncmp().
+</para>
+
+@cmp: a #GCompletion.
+@strncmp_func: the string comparison function.
+
+
+<!-- ##### USER_FUNCTION GCompletionStrncmpFunc ##### -->
+<para>
+Specifies the type of the function passed to g_completion_set_compare().
+This is used when you use strings as #GCompletion items.
+</para>
+
+@s1: string to compare with @s2.
+@s2: string to compare with @s1.
+@n: maximal number of bytes to compare.
+@Returns: an integer less than, equal to, or greater than zero if the
+first @n bytes of @s1 is found, respectively, to be less than, to match,
+or to be greater than the first @n bytes of @s2.
+
+
+<!-- ##### FUNCTION g_completion_free ##### -->
+<para>
+Frees all memory used by the #GCompletion.
+</para>
+
+@cmp: the #GCompletion.
+
+
diff --git a/trunk/docs/reference/glib/tmpl/conversions.sgml b/trunk/docs/reference/glib/tmpl/conversions.sgml
new file mode 100644
index 000000000..41a633216
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/conversions.sgml
@@ -0,0 +1,400 @@
+<!-- ##### SECTION Title ##### -->
+Character Set Conversion
+
+<!-- ##### SECTION Short_Description ##### -->
+convert strings between different character sets using <function>iconv()</function>.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+
+</para>
+
+ <refsect2 id="file-name-encodings">
+ <title>File Name Encodings</title>
+
+ <para>
+ Historically, Unix has not had a defined encoding for file
+ names: a file name is valid as long as it does not have path
+ separators in it ("/"). However, displaying file names may
+ require conversion: from the character set in which they were
+ created, to the character set in which the application
+ operates. Consider the Spanish file name
+ "<filename>Presentaci&oacute;n.sxi</filename>". If the
+ application which created it uses ISO-8859-1 for its encoding,
+ then the actual file name on disk would look like this:
+ </para>
+
+ <programlisting id="filename-iso8859-1">
+Character: P r e s e n t a c i &oacute; n . s x i
+Hex code: 50 72 65 73 65 6e 74 61 63 69 f3 6e 2e 73 78 69
+ </programlisting>
+
+ <para>
+ However, if the application use UTF-8, the actual file name on
+ disk would look like this:
+ </para>
+
+ <programlisting id="filename-utf-8">
+Character: P r e s e n t a c i &oacute; n . s x i
+Hex code: 50 72 65 73 65 6e 74 61 63 69 c3 b3 6e 2e 73 78 69
+ </programlisting>
+
+ <para>
+ Glib uses UTF-8 for its strings, and GUI toolkits like GTK+
+ that use Glib do the same thing. If you get a file name from
+ the file system, for example, from
+ <function>readdir(3)</function> or from <link
+ linkend="g_dir_read_name"><function>g_dir_read_name()</function></link>,
+ and you wish to display the file name to the user, you
+ <emphasis>will</emphasis> need to convert it into UTF-8. The
+ opposite case is when the user types the name of a file he
+ wishes to save: the toolkit will give you that string in
+ UTF-8 encoding, and you will need to convert it to the
+ character set used for file names before you can create the
+ file with <function>open(2)</function> or
+ <function>fopen(3)</function>.
+ </para>
+
+ <para>
+ By default, Glib assumes that file names on disk are in UTF-8
+ encoding. This is a valid assumption for file systems which
+ were created relatively recently: most applications use UTF-8
+ encoding for their strings, and that is also what they use for
+ the file names they create. However, older file systems may
+ still contain file names created in "older" encodings, such as
+ ISO-8859-1. In this case, for compatibility reasons, you may
+ want to instruct Glib to use that particular encoding for file
+ names rather than UTF-8. You can do this by specifying the
+ encoding for file names in the <link
+ linkend="G_FILENAME_ENCODING"><envar>G_FILENAME_ENCODING</envar></link>
+ environment variable. For example, if your installation uses
+ ISO-8859-1 for file names, you can put this in your
+ <filename>~/.profile</filename>:
+ </para>
+
+ <programlisting>
+export G_FILENAME_ENCODING=ISO-8859-1
+ </programlisting>
+
+ <para>
+ Glib provides the functions <link
+ linkend="g_filename_to_utf8"><function>g_filename_to_utf8()</function></link>
+ and <link
+ linkend="g_filename_from_utf8"><function>g_filename_from_utf8()</function></link>
+ to perform the necessary conversions. These functions convert
+ file names from the encoding specified in
+ <envar>G_FILENAME_ENCODING</envar> to UTF-8 and vice-versa.
+ <xref linkend="file-name-encodings-diagram"/> illustrates how
+ these functions are used to convert between UTF-8 and the
+ encoding for file names in the file system.
+ </para>
+
+ <figure id="file-name-encodings-diagram">
+ <title>Conversion between File Name Encodings</title>
+ <graphic fileref="file-name-encodings.png" format="PNG"/>
+ </figure>
+
+ <refsect3 id="file-name-encodings-checklist">
+ <title>Checklist for Application Writers</title>
+
+ <para>
+ This section is a practical summary of the detailed
+ description above. You can use this as a checklist of
+ things to do to make sure your applications process file
+ name encodings correctly.
+ </para>
+
+ <orderedlist>
+ <listitem>
+ <para>
+ If you get a file name from the file system from a
+ function such as <function>readdir(3)</function> or
+ <function>gtk_file_chooser_get_filename()</function>,
+ you do not need to do any conversion to pass that
+ file name to functions like <function>open(2)</function>,
+ <function>rename(2)</function>, or
+ <function>fopen(3)</function> &mdash; those are "raw"
+ file names which the file system understands.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ If you need to display a file name, convert it to UTF-8
+ first by using <link
+ linkend="g_filename_to_utf8"><function>g_filename_to_utf8()</function></link>.
+ If conversion fails, display a string like
+ "<literal>Unknown file name</literal>". <emphasis>Do
+ not</emphasis> convert this string back into the
+ encoding used for file names if you wish to pass it to
+ the file system; use the original file name instead.
+ For example, the document window of a word processor
+ could display "Unknown file name" in its title bar but
+ still let the user save the file, as it would keep the
+ raw file name internally. This can happen if the user
+ has not set the <envar>G_FILENAME_ENCODING</envar>
+ environment variable even though he has files whose
+ names are not encoded in UTF-8.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ If your user interface lets the user type a file name
+ for saving or renaming, convert it to the encoding used
+ for file names in the file system by using <link
+ linkend="g_filename_from_utf8"><function>g_filename_from_utf8()</function></link>.
+ Pass the converted file name to functions like
+ <function>fopen(3)</function>. If conversion fails, ask
+ the user to enter a different file name. This can
+ happen if the user types Japanese characters when
+ <envar>G_FILENAME_ENCODING</envar> is set to
+ <literal>ISO-8859-1</literal>, for example.
+ </para>
+ </listitem>
+ </orderedlist>
+ </refsect3>
+ </refsect2>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### FUNCTION g_convert ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@to_codeset:
+@from_codeset:
+@bytes_read:
+@bytes_written:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_convert_with_fallback ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@to_codeset:
+@from_codeset:
+@fallback:
+@bytes_read:
+@bytes_written:
+@error:
+@Returns:
+
+
+<!-- ##### STRUCT GIConv ##### -->
+<para>
+The <structname>GIConv</structname> struct wraps an
+<function>iconv()</function> conversion descriptor. It contains private data
+and should only be accessed using the following functions.
+</para>
+
+
+<!-- ##### FUNCTION g_convert_with_iconv ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@converter:
+@bytes_read:
+@bytes_written:
+@error:
+@Returns:
+
+
+<!-- ##### MACRO G_CONVERT_ERROR ##### -->
+<para>
+Error domain for character set conversions. Errors in this domain will
+be from the #GConvertError enumeration. See #GError for information on
+error domains.
+</para>
+
+
+
+<!-- ##### FUNCTION g_iconv_open ##### -->
+<para>
+
+</para>
+
+@to_codeset:
+@from_codeset:
+@Returns:
+
+
+<!-- ##### FUNCTION g_iconv ##### -->
+<para>
+
+</para>
+
+@converter:
+@inbuf:
+@inbytes_left:
+@outbuf:
+@outbytes_left:
+@Returns:
+
+
+<!-- ##### FUNCTION g_iconv_close ##### -->
+<para>
+
+</para>
+
+@converter:
+@Returns:
+
+
+<!-- ##### FUNCTION g_locale_to_utf8 ##### -->
+<para>
+
+</para>
+
+@opsysstring:
+@len:
+@bytes_read:
+@bytes_written:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_filename_to_utf8 ##### -->
+<para>
+
+</para>
+
+@opsysstring:
+@len:
+@bytes_read:
+@bytes_written:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_filename_from_utf8 ##### -->
+<para>
+
+</para>
+
+@utf8string:
+@len:
+@bytes_read:
+@bytes_written:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_filename_from_uri ##### -->
+<para>
+
+</para>
+
+@uri:
+@hostname:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_filename_to_uri ##### -->
+<para>
+
+</para>
+
+@filename:
+@hostname:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_get_filename_charsets ##### -->
+<para>
+
+</para>
+
+@charsets:
+@Returns:
+
+
+<!-- ##### FUNCTION g_filename_display_name ##### -->
+<para>
+
+</para>
+
+@filename:
+@Returns:
+
+
+<!-- ##### FUNCTION g_filename_display_basename ##### -->
+<para>
+
+</para>
+
+@filename:
+@Returns:
+
+
+<!-- ##### FUNCTION g_uri_list_extract_uris ##### -->
+<para>
+
+</para>
+
+@uri_list:
+@Returns:
+
+
+<!-- ##### FUNCTION g_locale_from_utf8 ##### -->
+<para>
+
+</para>
+
+@utf8string:
+@len:
+@bytes_read:
+@bytes_written:
+@error:
+@Returns:
+
+
+<!-- ##### ENUM GConvertError ##### -->
+<para>
+Error codes returned by character set conversion routines.
+</para>
+
+@G_CONVERT_ERROR_NO_CONVERSION: Conversion between the requested character sets
+is not supported.
+@G_CONVERT_ERROR_ILLEGAL_SEQUENCE: Invalid byte sequence in conversion input.
+@G_CONVERT_ERROR_FAILED: Conversion failed for some reason.
+@G_CONVERT_ERROR_PARTIAL_INPUT: Partial character sequence at end of input.
+@G_CONVERT_ERROR_BAD_URI: URI is invalid.
+@G_CONVERT_ERROR_NOT_ABSOLUTE_PATH: Pathname is not an absolute path.
+
+<!-- ##### FUNCTION g_get_charset ##### -->
+<para>
+
+</para>
+
+@charset:
+@Returns:
+
+
+<!--
+Local variables:
+mode: sgml
+sgml-parent-document: ("../glib-docs.sgml" "book" "refentry")
+End:
+-->
+
+
diff --git a/trunk/docs/reference/glib/tmpl/datalist.sgml b/trunk/docs/reference/glib/tmpl/datalist.sgml
new file mode 100644
index 000000000..9a44bf407
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/datalist.sgml
@@ -0,0 +1,244 @@
+<!-- ##### SECTION Title ##### -->
+Keyed Data Lists
+
+<!-- ##### SECTION Short_Description ##### -->
+lists of data elements which are accessible by a string or #GQuark identifier.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+Keyed data lists provide lists of arbitrary data elements which can be accessed
+either with a string or with a #GQuark corresponding to the
+string.
+</para>
+<para>
+The #GQuark methods are quicker, since the strings have to be converted to
+#GQuarks anyway.
+</para>
+<para>
+Data lists are used for associating arbitrary data with
+#GObjects, using g_object_set_data() and related functions.
+</para>
+
+<para>
+To create a datalist, use g_datalist_init().
+</para>
+<para>
+To add data elements to a datalist use g_datalist_id_set_data(),
+g_datalist_id_set_data_full(), g_datalist_set_data()
+and g_datalist_set_data_full().
+</para>
+<para>
+To get data elements from a datalist use g_datalist_id_get_data() and
+g_datalist_get_data().
+</para>
+<para>
+To iterate over all data elements in a datalist use g_datalist_foreach() (not thread-safe).
+</para>
+<para>
+To remove data elements from a datalist use g_datalist_id_remove_data() and
+g_datalist_remove_data().
+</para>
+<para>
+To remove all data elements from a datalist, use g_datalist_clear().
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GData ##### -->
+<para>
+The #GData struct is an opaque data structure to represent a
+<link linkend="glib-Keyed-Data-Lists">Keyed Data List</link>.
+It should only be accessed via the following functions.
+</para>
+
+
+<!-- ##### FUNCTION g_datalist_init ##### -->
+<para>
+Resets the datalist to %NULL.
+It does not free any memory or call any destroy functions.
+</para>
+
+@datalist: a pointer to a pointer to a datalist.
+
+
+<!-- ##### MACRO g_datalist_id_set_data ##### -->
+<para>
+Sets the data corresponding to the given #GQuark id.
+Any previous data with the same key is removed, and its
+destroy function is called.
+</para>
+
+@dl: a datalist.
+@q: the #GQuark to identify the data element.
+@d: the data element, or %NULL to remove any previous element
+corresponding to @q.
+
+
+<!-- ##### FUNCTION g_datalist_id_set_data_full ##### -->
+<para>
+Sets the data corresponding to the given #GQuark id, and the function to
+be called when the element is removed from the datalist.
+Any previous data with the same key is removed, and its
+destroy function is called.
+</para>
+
+@datalist: a datalist.
+@key_id: the #GQuark to identify the data element.
+@data: the data element or %NULL to remove any previous element
+corresponding to @key_id.
+@destroy_func: the function to call when the data element is removed. This
+function will be called with the data element and can be used to free any
+memory allocated for it. If @data is %NULL, then @destroy_func must
+also be %NULL.
+
+
+<!-- ##### FUNCTION g_datalist_id_get_data ##### -->
+<para>
+Retrieves the data element corresponding to @key_id.
+</para>
+
+@datalist: a datalist.
+@key_id: the #GQuark identifying a data element.
+@Returns: the data element, or %NULL if it is not found.
+
+
+<!-- ##### MACRO g_datalist_id_remove_data ##### -->
+<para>
+Removes an element, using its #GQuark identifier.
+</para>
+
+@dl: a datalist.
+@q: the #GQuark identifying the data element.
+
+
+<!-- ##### FUNCTION g_datalist_id_remove_no_notify ##### -->
+<para>
+Removes an element, without calling its destroy notification function.
+</para>
+
+@datalist: a datalist.
+@key_id: the #GQuark identifying a data element.
+@Returns: the data previously stored at @key_id, or %NULL if none.
+
+
+<!-- ##### MACRO g_datalist_set_data ##### -->
+<para>
+Sets the data element corresponding to the given string identifier.
+</para>
+
+@dl: a datalist.
+@k: the string to identify the data element.
+@d: the data element, or %NULL to remove any previous element
+corresponding to @k.
+
+
+<!-- ##### MACRO g_datalist_set_data_full ##### -->
+<para>
+Sets the data element corresponding to the given string identifier, and the
+function to be called when the data element is removed.
+</para>
+
+@dl: a datalist.
+@k: the string to identify the data element.
+@d: the data element, or %NULL to remove any previous element corresponding to
+@k.
+@f: the function to call when the data element is removed. This
+function will be called with the data element and can be used to free any
+memory allocated for it. If @d is %NULL, then @f must also be %NULL.
+
+
+<!-- ##### MACRO g_datalist_get_data ##### -->
+<para>
+Gets a data element, using its string identifer.
+This is slower than g_datalist_id_get_data() because the string is first
+converted to a #GQuark.
+</para>
+
+@dl: a datalist.
+@k: the string identifying a data element.
+@Returns: the data element, or %NULL if it is not found.
+
+
+<!-- ##### MACRO g_datalist_remove_data ##### -->
+<para>
+Removes an element using its string identifier.
+The data element's destroy function is called if it has been set.
+</para>
+
+@dl: a datalist.
+@k: the string identifying the data element.
+
+
+<!-- ##### MACRO g_datalist_remove_no_notify ##### -->
+<para>
+Removes an element, without calling its destroy notifier.
+</para>
+
+@dl: a datalist.
+@k: the string identifying the data element.
+
+
+<!-- ##### FUNCTION g_datalist_foreach ##### -->
+<para>
+Calls the given function for each data element of the datalist.
+The function is called with each data element's #GQuark id and data,
+together with the given @user_data parameter.
+Note that this function is NOT thread-safe. So unless @datalist
+can be protected from any modifications during invocation of this
+function, it should not be called.
+</para>
+
+@datalist: a datalist.
+@func: the function to call for each data element.
+@user_data: user data to pass to the function.
+
+
+<!-- ##### FUNCTION g_datalist_clear ##### -->
+<para>
+Frees all the data elements of the datalist.
+The data elements' destroy functions are called if they have been set.
+</para>
+
+@datalist: a datalist.
+
+
+<!-- ##### FUNCTION g_datalist_set_flags ##### -->
+<para>
+
+</para>
+
+@datalist:
+@flags:
+
+
+<!-- ##### FUNCTION g_datalist_unset_flags ##### -->
+<para>
+
+</para>
+
+@datalist:
+@flags:
+
+
+<!-- ##### FUNCTION g_datalist_get_flags ##### -->
+<para>
+
+</para>
+
+@datalist:
+@Returns:
+
+
+<!-- ##### MACRO G_DATALIST_FLAGS_MASK ##### -->
+<para>
+
+</para>
+
+
+
diff --git a/trunk/docs/reference/glib/tmpl/datasets.sgml b/trunk/docs/reference/glib/tmpl/datasets.sgml
new file mode 100644
index 000000000..a2603becd
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/datasets.sgml
@@ -0,0 +1,212 @@
+<!-- ##### SECTION Title ##### -->
+Datasets
+
+<!-- ##### SECTION Short_Description ##### -->
+associate groups of data elements with particular memory locations.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+Datasets associate groups of data elements with particular memory locations.
+These are useful if you need to associate data with a structure returned
+from an external library. Since you cannot modify the structure, you use
+its location in memory as the key into a dataset, where you can associate
+any number of data elements with it.
+</para>
+<para>
+There are two forms of most of the dataset functions.
+The first form uses strings to identify the data elements associated with
+a location. The second form uses #GQuark identifiers, which are created
+with a call to g_quark_from_string() or g_quark_from_static_string().
+The second form is quicker, since it does not require looking up the string
+in the hash table of #GQuark identifiers.
+</para>
+<para>
+There is no function to create a dataset. It is automatically created as
+soon as you add elements to it.
+</para>
+<para>
+To add data elements to a dataset use g_dataset_id_set_data(),
+g_dataset_id_set_data_full(), g_dataset_set_data()
+and g_dataset_set_data_full().
+</para>
+<para>
+To get data elements from a dataset use g_dataset_id_get_data() and
+g_dataset_get_data().
+</para>
+<para>
+To iterate over all data elements in a dataset use g_dataset_foreach() (not thread-safe).
+</para>
+<para>
+To remove data elements from a dataset use g_dataset_id_remove_data() and
+g_dataset_remove_data().
+</para>
+<para>
+To destroy a dataset, use g_dataset_destroy().
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO g_dataset_id_set_data ##### -->
+<para>
+Sets the data element associated with the given #GQuark id.
+Any previous data with the same key is removed, and its destroy function
+is called.
+</para>
+
+@l: the location identifying the dataset.
+@k: the #GQuark id to identify the data element.
+@d: the data element.
+
+
+<!-- ##### FUNCTION g_dataset_id_set_data_full ##### -->
+<para>
+Sets the data element associated with the given #GQuark id, and also the
+function to call when the data element is destroyed.
+Any previous data with the same key is removed, and its
+destroy function is called.
+</para>
+
+@dataset_location: the location identifying the dataset.
+@key_id: the #GQuark id to identify the data element.
+@data: the data element.
+@destroy_func: the function to call when the data element is removed. This
+function will be called with the data element and can be used to free any
+memory allocated for it.
+
+
+<!-- ##### USER_FUNCTION GDestroyNotify ##### -->
+<para>
+Specifies the type of function which is called when a data element is
+destroyed. It is passed the pointer to the data element and should free
+any memory and resources allocated for it.
+</para>
+
+@data: the data element.
+
+
+<!-- ##### FUNCTION g_dataset_id_get_data ##### -->
+<para>
+Gets the data element corresponding to a #GQuark.
+</para>
+
+@dataset_location: the location identifying the dataset.
+@key_id: the #GQuark id to identify the data element.
+@Returns: the data element corresponding to the #GQuark, or %NULL if it is
+not found.
+
+
+<!-- ##### MACRO g_dataset_id_remove_data ##### -->
+<para>
+Removes a data element from a dataset.
+The data element's destroy function is called if it has been set.
+</para>
+
+@l: the location identifying the dataset.
+@k: the #GQuark id identifying the data element.
+
+
+<!-- ##### FUNCTION g_dataset_id_remove_no_notify ##### -->
+<para>
+Removes an element, without calling its destroy notification function.
+</para>
+
+@dataset_location: the location identifying the dataset.
+@key_id: the #GQuark ID identifying the data element.
+@Returns: the data previously stored at @key_id, or %NULL if none.
+
+
+<!-- ##### MACRO g_dataset_set_data ##### -->
+<para>
+Sets the data corresponding to the given string identifier.
+</para>
+
+@l: the location identifying the dataset.
+@k: the string to identify the data element.
+@d: the data element.
+
+
+<!-- ##### MACRO g_dataset_set_data_full ##### -->
+<para>
+Sets the data corresponding to the given string identifier, and the function
+to call when the data element is destroyed.
+</para>
+
+@l: the location identifying the dataset.
+@k: the string to identify the data element.
+@d: the data element.
+@f: the function to call when the data element is removed. This
+function will be called with the data element and can be used to free any
+memory allocated for it.
+
+
+<!-- ##### MACRO g_dataset_get_data ##### -->
+<para>
+Gets the data element corresponding to a string.
+</para>
+
+@l: the location identifying the dataset.
+@k: the string identifying the data element.
+@Returns: the data element corresponding to the string, or %NULL if it is not
+found.
+
+
+<!-- ##### MACRO g_dataset_remove_data ##### -->
+<para>
+Removes a data element corresponding to a string.
+Its destroy function is called if it has been set.
+</para>
+
+@l: the location identifying the dataset.
+@k: the string identifying the data element.
+
+
+<!-- ##### MACRO g_dataset_remove_no_notify ##### -->
+<para>
+Removes an element, without calling its destroy notifier.
+</para>
+
+@l: the location identifying the dataset.
+@k: the string identifying the data element.
+
+
+<!-- ##### FUNCTION g_dataset_foreach ##### -->
+<para>
+Calls the given function for each data element which is associated with the
+given location.
+Note that this function is NOT thread-safe. So unless @datalist
+can be protected from any modifications during invocation of this
+function, it should not be called.
+</para>
+
+@dataset_location: the location identifying the dataset.
+@func: the function to call for each data element.
+@user_data: user data to pass to the function.
+
+
+<!-- ##### USER_FUNCTION GDataForeachFunc ##### -->
+<para>
+Specifies the type of function passed to g_dataset_foreach().
+It is called with each #GQuark id and associated data element,
+together with the @user_data parameter supplied to g_dataset_foreach().
+</para>
+
+@key_id: the #GQuark id to identifying the data element.
+@data: the data element.
+@user_data: user data passed to g_dataset_foreach().
+
+
+<!-- ##### FUNCTION g_dataset_destroy ##### -->
+<para>
+Destroys the dataset, freeing all memory allocated, and calling any
+destroy functions set for data elements.
+</para>
+
+@dataset_location: the location identifying the dataset.
+
+
diff --git a/trunk/docs/reference/glib/tmpl/date.sgml b/trunk/docs/reference/glib/tmpl/date.sgml
new file mode 100644
index 000000000..9879963d8
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/date.sgml
@@ -0,0 +1,793 @@
+<!-- ##### SECTION Title ##### -->
+Date and Time Functions
+
+<!-- ##### SECTION Short_Description ##### -->
+calendrical calculations and miscellaneous time stuff.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The #GDate data structure represents a day between January 1, Year 1,
+and sometime a few thousand years in the future (right now it will go
+to the year 65535 or so, but g_date_set_parse() only parses up to the
+year 8000 or so - just count on "a few thousand"). #GDate is meant to
+represent everyday dates, not astronomical dates or historical dates
+or ISO timestamps or the like. It extrapolates the current Gregorian
+calendar forward and backward in time; there is no attempt to change
+the calendar to match time periods or locations. #GDate does not store
+time information; it represents a <emphasis>day</emphasis>.
+</para>
+
+<para>
+The #GDate implementation has several nice features; it is only a
+64-bit struct, so storing large numbers of dates is very efficient. It
+can keep both a Julian and day-month-year representation of the date,
+since some calculations are much easier with one representation or the
+other. A Julian representation is simply a count of days since some
+fixed day in the past; for #GDate the fixed day is January 1, 1 AD.
+("Julian" dates in the #GDate API aren't really Julian dates in the
+technical sense; technically, Julian dates count from the start of the
+Julian period, Jan 1, 4713 BC).
+</para>
+
+<para>
+#GDate is simple to use. First you need a "blank" date; you can get a
+dynamically allocated date from g_date_new(), or you can declare an
+automatic variable or array and initialize it to a sane state by
+calling g_date_clear(). A cleared date is sane; it's safe to call
+g_date_set_dmy() and the other mutator functions to initialize the
+value of a cleared date. However, a cleared date is initially
+<emphasis>invalid</emphasis>, meaning that it doesn't represent a day
+that exists. It is undefined to call any of the date calculation
+routines on an invalid date. If you obtain a date from a user or other
+unpredictable source, you should check its validity with the
+g_date_valid() predicate. g_date_valid() is also used to check for
+errors with g_date_set_parse() and other functions that can
+fail. Dates can be invalidated by calling g_date_clear() again.
+</para>
+
+<para>
+<emphasis>It is very important to use the API to access the #GDate
+struct.</emphasis> Often only the day-month-year or only the Julian
+representation is valid. Sometimes neither is valid. Use the API.
+</para>
+
+<para>
+GLib doesn't contain any time-manipulation functions; however, there
+is a #GTime typedef and a #GTimeVal struct which represents a more
+precise time (with microseconds). You can request the current time as
+a #GTimeVal with g_get_current_time().
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO G_USEC_PER_SEC ##### -->
+<para>
+Number of microseconds in one second (1 million). This macro is provided for
+code readability.
+</para>
+
+
+
+<!-- ##### STRUCT GTimeVal ##### -->
+<para>
+Represents a precise time, with seconds and microseconds.
+Similar to the <structname>struct timeval</structname> returned by
+the <function>gettimeofday()</function> UNIX call.
+</para>
+
+@tv_sec: seconds.
+@tv_usec: microseconds.
+
+<!-- ##### FUNCTION g_get_current_time ##### -->
+<para>
+</para>
+
+@result:
+
+
+<!-- ##### FUNCTION g_usleep ##### -->
+<para>
+Pauses the current thread for the given number of microseconds. There
+are 1 million microseconds per second (represented by the
+#G_USEC_PER_SEC macro). g_usleep() may have limited precision,
+depending on hardware and operating system; don't rely on the exact
+length of the sleep.
+</para>
+
+@microseconds: number of microseconds to pause.
+
+
+<!-- ##### FUNCTION g_time_val_add ##### -->
+<para>
+
+</para>
+
+@time_:
+@microseconds:
+
+
+<!-- ##### FUNCTION g_time_val_from_iso8601 ##### -->
+<para>
+
+</para>
+
+@iso_date:
+@time_:
+@Returns:
+
+
+<!-- ##### FUNCTION g_time_val_to_iso8601 ##### -->
+<para>
+
+</para>
+
+@time_:
+@Returns:
+
+
+<!-- ##### STRUCT GDate ##### -->
+<para>
+Represents a day between January 1, Year 1 and a few thousand years in
+the future. None of its members should be accessed directly. If the
+<structname>GDate</structname> is obtained from g_date_new(), it will
+be safe to mutate but invalid and thus not safe for calendrical computations.
+If it's declared on the stack, it will contain garbage so must be
+initialized with g_date_clear(). g_date_clear() makes the date invalid
+but sane. An invalid date doesn't represent a day, it's "empty." A
+date becomes valid after you set it to a Julian day or you set a day,
+month, and year.
+</para>
+
+@julian_days: the Julian representation of the date
+@julian: this bit is set if @julian_days is valid
+@dmy: this is set if @day, @month and @year are valid
+@day: the day of the day-month-year representation of the date, as
+ a number between 1 and 31
+@month: the day of the day-month-year representation of the date, as
+ a number between 1 and 12
+@year: the day of the day-month-year representation of the date
+
+<!-- ##### TYPEDEF GTime ##### -->
+<para>
+Simply a replacement for <type>time_t</type>. It has been deprected
+since it is <emphasis>not</emphasis> equivalent to <type>time_t</type>
+on 64-bit platforms with a 64-bit <type>time_t</type>.
+Unrelated to #GTimer.
+</para>
+
+
+<para>
+Note that <type>GTime</type> is defined to always be a 32bit integer,
+unlike <type>time_t</type> which may be 64bit on some systems.
+Therefore, <type>GTime</type> will overflow in the year 2038, and
+you cannot use the address of a <type>GTime</type> variable as argument
+to the UNIX time() function. Instead, do the following:
+<informalexample>
+<programlisting>
+time_t ttime;
+GTime gtime;
+
+time (&amp;ttime);
+gtime = (GTime)ttime;
+</programlisting>
+</informalexample>
+</para>
+
+
+<!-- ##### ENUM GDateDMY ##### -->
+<para>
+This enumeration isn't used in the API, but may be useful if you need
+to mark a number as a day, month, or year.
+</para>
+
+@G_DATE_DAY: a day
+@G_DATE_MONTH: a month
+@G_DATE_YEAR: a year
+
+<!-- ##### TYPEDEF GDateDay ##### -->
+<para>
+Integer representing a day of the month; between 1 and
+31. #G_DATE_BAD_DAY represents an invalid day of the month.
+</para>
+
+
+<!-- ##### ENUM GDateMonth ##### -->
+<para>
+Enumeration representing a month; values are #G_DATE_JANUARY,
+#G_DATE_FEBRUARY, etc. #G_DATE_BAD_MONTH is the invalid value.
+</para>
+
+@G_DATE_BAD_MONTH: invalid value.
+@G_DATE_JANUARY: January.
+@G_DATE_FEBRUARY: February.
+@G_DATE_MARCH: March.
+@G_DATE_APRIL: April.
+@G_DATE_MAY: May.
+@G_DATE_JUNE: June.
+@G_DATE_JULY: July.
+@G_DATE_AUGUST: August.
+@G_DATE_SEPTEMBER: September.
+@G_DATE_OCTOBER: October.
+@G_DATE_NOVEMBER: November.
+@G_DATE_DECEMBER: December.
+
+<!-- ##### TYPEDEF GDateYear ##### -->
+<para>
+Integer representing a year; #G_DATE_BAD_YEAR is the invalid
+value. The year must be 1 or higher; negative (BC) years are not
+allowed. The year is represented with four digits.
+</para>
+
+
+<!-- ##### ENUM GDateWeekday ##### -->
+<para>
+Enumeration representing a day of the week; #G_DATE_MONDAY,
+#G_DATE_TUESDAY, etc. #G_DATE_BAD_WEEKDAY is an invalid weekday.
+</para>
+
+@G_DATE_BAD_WEEKDAY: invalid value.
+@G_DATE_MONDAY: Monday.
+@G_DATE_TUESDAY: Tuesday.
+@G_DATE_WEDNESDAY: Wednesday.
+@G_DATE_THURSDAY: Thursday.
+@G_DATE_FRIDAY: Friday.
+@G_DATE_SATURDAY: Saturday.
+@G_DATE_SUNDAY: Sunday.
+
+<!-- ##### MACRO G_DATE_BAD_DAY ##### -->
+<para>
+Represents an invalid #GDateDay.
+</para>
+
+
+
+<!-- ##### MACRO G_DATE_BAD_JULIAN ##### -->
+<para>
+Represents an invalid Julian day number.
+</para>
+
+
+
+<!-- ##### MACRO G_DATE_BAD_YEAR ##### -->
+<para>
+Represents an invalid year.
+</para>
+
+
+
+<!-- ##### FUNCTION g_date_new ##### -->
+<para>
+Allocates a #GDate and initializes it to a sane state. The new date will
+be cleared (as if you'd called g_date_clear()) but invalid (it won't
+represent an existing day). Free the return value with g_date_free().
+</para>
+
+@Returns: a newly-allocated #GDate.
+
+
+<!-- ##### FUNCTION g_date_new_dmy ##### -->
+<para>
+Like g_date_new(), but also sets the value of the date. Assuming the
+day-month-year triplet you pass in represents an existing day, the
+returned date will be valid.
+</para>
+
+@day: day of the month.
+@month: month of the year.
+@year: year
+@Returns: a newly-allocated #GDate initialized with @day, @month, and @year.
+
+
+<!-- ##### FUNCTION g_date_new_julian ##### -->
+<para>
+Like g_date_new(), but also sets the value of the date. Assuming the
+Julian day number you pass in is valid (greater than 0, less than an
+unreasonably large number), the returned date will be valid.
+</para>
+
+@julian_day: days since January 1, Year 1.
+@Returns: a newly-allocated #GDate initialized with @julian_day.
+
+
+<!-- ##### FUNCTION g_date_clear ##### -->
+<para>
+Initializes one or more #GDate structs to a sane but invalid
+state. The cleared dates will not represent an existing date, but will
+not contain garbage. Useful to init a date declared on the stack.
+Validity can be tested with g_date_valid().
+</para>
+
+@date: pointer to one or more dates to clear.
+@n_dates: number of dates to clear.
+
+
+<!-- ##### FUNCTION g_date_free ##### -->
+<para>
+Frees a #GDate returned from g_date_new().
+</para>
+
+@date: a #GDate.
+
+
+<!-- ##### FUNCTION g_date_set_day ##### -->
+<para>
+Sets the day of the month for a #GDate. If the resulting day-month-year
+triplet is invalid, the date will be invalid.
+</para>
+
+@date: a #GDate.
+@day: day to set.
+
+
+<!-- ##### FUNCTION g_date_set_month ##### -->
+<para>
+Sets the month of the year for a #GDate. If the resulting
+day-month-year triplet is invalid, the date will be invalid.
+</para>
+
+@date: a #GDate.
+@month: month to set.
+
+
+<!-- ##### FUNCTION g_date_set_year ##### -->
+<para>
+Sets the year for a #GDate. If the resulting day-month-year triplet is
+invalid, the date will be invalid.
+</para>
+
+@date: a #GDate.
+@year: year to set.
+
+
+<!-- ##### FUNCTION g_date_set_dmy ##### -->
+<para>
+Sets the value of a #GDate from a day, month, and year. The day-month-year
+triplet must be valid; if you aren't sure it is, call g_date_valid_dmy() to
+check before you set it.
+</para>
+
+@date: a #GDate.
+@day: day.
+@month: month.
+@y: year.
+
+
+<!-- ##### FUNCTION g_date_set_julian ##### -->
+<para>
+Sets the value of a #GDate from a Julian day number.
+</para>
+
+@date: a #GDate.
+@julian_date: Julian day number (days since January 1, Year 1).
+
+
+<!-- ##### FUNCTION g_date_set_time ##### -->
+<para>
+
+</para>
+
+@date:
+@time_:
+
+
+<!-- ##### FUNCTION g_date_set_time_t ##### -->
+<para>
+
+</para>
+
+@date:
+@timet:
+
+
+<!-- ##### FUNCTION g_date_set_time_val ##### -->
+<para>
+
+</para>
+
+@date:
+@timeval:
+
+
+<!-- ##### FUNCTION g_date_set_parse ##### -->
+<para>
+Parses a user-inputted string @str, and try to figure out what date it
+represents, taking the <link linkend="setlocale">current locale</link>
+into account. If the string is successfully parsed, the date will be
+valid after the call. Otherwise, it will be invalid. You should check
+using g_date_valid() to see whether the parsing succeeded.
+</para>
+
+<para>
+This function is not appropriate for file formats and the like; it
+isn't very precise, and its exact behavior varies with the
+locale. It's intended to be a heuristic routine that guesses what the
+user means by a given string (and it does work pretty well in that
+capacity).
+</para>
+
+@date: a #GDate to fill in.
+@str: string to parse.
+
+
+<!-- ##### FUNCTION g_date_add_days ##### -->
+<para>
+Increments a date some number of days. To move forward by weeks, add
+weeks*7 days. The date must be valid.
+</para>
+
+@date: a #GDate to increment.
+@n_days: number of days to move the date forward.
+
+
+<!-- ##### FUNCTION g_date_subtract_days ##### -->
+<para>
+Moves a date some number of days into the past. To move by weeks, just
+move by weeks*7 days. The date must be valid.
+</para>
+
+@date: a #GDate to decrement.
+@n_days: number of days to move.
+
+
+<!-- ##### FUNCTION g_date_add_months ##### -->
+<para>
+Increments a date by some number of months. If the day of the month is
+greater than 28, this routine may change the day of the month (because
+the destination month may not have the current day in it). The date
+must be valid.
+</para>
+
+@date: a #GDate to increment.
+@n_months: number of months to move forward.
+
+
+<!-- ##### FUNCTION g_date_subtract_months ##### -->
+<para>
+Moves a date some number of months into the past. If the current day of
+the month doesn't exist in the destination month, the day of the month
+may change. The date must be valid.
+</para>
+
+@date: a #GDate to decrement.
+@n_months: number of months to move.
+
+
+<!-- ##### FUNCTION g_date_add_years ##### -->
+<para>
+Increments a date by some number of years. If the date is February 29,
+and the destination year is not a leap year, the date will be changed
+to February 28. The date must be valid.
+</para>
+
+@date: a #GDate to increment.
+@n_years: number of years to move forward.
+
+
+<!-- ##### FUNCTION g_date_subtract_years ##### -->
+<para>
+Moves a date some number of years into the past. If the current day
+doesn't exist in the destination year (i.e. it's February 29 and you
+move to a non-leap-year) then the day is changed to February 29. The date
+must be valid.
+</para>
+
+@date: a #GDate to decrement.
+@n_years: number of years to move.
+
+
+<!-- ##### FUNCTION g_date_days_between ##### -->
+<para>
+Computes the number of days between two dates.
+If @date2 is prior to @date1, the returned value is negative.
+Both dates must be valid.
+</para>
+
+@date1: the first date.
+@date2: the second date.
+@Returns: the number of days between @date1 and @date2.
+
+
+<!-- ##### FUNCTION g_date_compare ##### -->
+<para>
+<function>qsort()</function>-style comparsion function for dates. Both
+dates must be valid.
+</para>
+
+@lhs: first date to compare.
+@rhs: second date to compare.
+@Returns: 0 for equal, less than zero if @lhs is less than @rhs,
+greater than zero if @lhs is greater than @rhs.
+
+
+<!-- ##### FUNCTION g_date_clamp ##### -->
+<para>
+If @date is prior to @min_date, sets @date equal to @min_date.
+If @date falls after @max_date, sets @date equal to @max_date.
+Either @min_date and @max_date may be %NULL. All non-%NULL dates
+must be valid.
+</para>
+
+@date: a #GDate to clamp.
+@min_date: minimum accepted value for @date.
+@max_date: maximum accepted value for @date.
+
+
+<!-- ##### FUNCTION g_date_order ##### -->
+<para>
+Checks if @date1 is less than or equal to @date2,
+and swap the values if this is not the case.
+</para>
+
+@date1: the first date.
+@date2: the second date.
+
+
+<!-- ##### FUNCTION g_date_get_day ##### -->
+<para>
+Returns the day of the month. The date must be valid.
+</para>
+
+@date: a #GDate to extract the day of the month from.
+@Returns: day of the month.
+
+
+<!-- ##### FUNCTION g_date_get_month ##### -->
+<para>
+Returns the month of the year. The date must be valid.
+</para>
+
+@date: a #GDate to get the month from.
+@Returns: month of the year as a #GDateMonth.
+
+
+<!-- ##### FUNCTION g_date_get_year ##### -->
+<para>
+Returns the year of a #GDate. The date must be valid.
+</para>
+
+@date: a #GDate.
+@Returns: year in which the date falls.
+
+
+<!-- ##### FUNCTION g_date_get_julian ##### -->
+<para>
+Returns the Julian day or "serial number" of the #GDate. The
+Julian day is simply the number of days since January 1, Year 1; i.e.,
+January 1, Year 1 is Julian day 1; January 2, Year 1 is Julian day 2,
+etc. The date must be valid.
+</para>
+
+@date: a #GDate to extract the Julian day from.
+@Returns: Julian day.
+
+
+<!-- ##### FUNCTION g_date_get_weekday ##### -->
+<para>
+Returns the day of the week for a #GDate. The date must be valid.
+</para>
+
+@date: a #GDate.
+@Returns: day of the week as a #GDateWeekday.
+
+
+<!-- ##### FUNCTION g_date_get_day_of_year ##### -->
+<para>
+Returns the day of the year, where Jan 1 is the first day of the
+year. The date must be valid.
+</para>
+
+@date: a #GDate to extract day of year from.
+@Returns: day of the year.
+
+
+<!-- ##### FUNCTION g_date_get_days_in_month ##### -->
+<para>
+Returns the number of days in a month, taking leap years into account.
+</para>
+
+@month: month.
+@year: year.
+@Returns: number of days in @month during the @year.
+
+
+<!-- ##### FUNCTION g_date_is_first_of_month ##### -->
+<para>
+Returns %TRUE if the date is on the first of a month. The date must be valid.
+</para>
+
+@date: a #GDate to check.
+@Returns: %TRUE if the date is the first of the month.
+
+
+<!-- ##### FUNCTION g_date_is_last_of_month ##### -->
+<para>
+Returns %TRUE if the date is the last day of the month. The date must be valid.
+</para>
+
+@date: a #GDate to check.
+@Returns: %TRUE if the date is the last day of the month.
+
+
+<!-- ##### FUNCTION g_date_is_leap_year ##### -->
+<para>
+Returns %TRUE if the year is a leap year.
+</para>
+
+@year: year to check.
+@Returns: %TRUE if the year is a leap year.
+
+
+<!-- ##### FUNCTION g_date_get_monday_week_of_year ##### -->
+<para>
+Returns the week of the year, where weeks are understood to start on
+Monday. If the date is before the first Monday of the year, return
+0. The date must be valid.
+</para>
+
+@date: a #GDate.
+@Returns: week of the year.
+
+
+<!-- ##### FUNCTION g_date_get_monday_weeks_in_year ##### -->
+<para>
+Returns the number of weeks in the year, where weeks are taken to start
+on Monday. Will be 52 or 53. The date must be valid. (Years always have 52
+7-day periods, plus 1 or 2 extra days depending on whether it's a leap
+year. This function is basically telling you how many Mondays are in
+the year, i.e. there are 53 Mondays if one of the extra days happens
+to be a Monday.)
+</para>
+
+@year: a year.
+@Returns: number of Mondays in the year.
+
+
+<!-- ##### FUNCTION g_date_get_sunday_week_of_year ##### -->
+<para>
+Returns the week of the year during which this date falls, if weeks
+are understood to being on Sunday. The date must be valid. Can return 0 if
+the day is before the first Sunday of the year.
+</para>
+
+@date: a #GDate.
+@Returns: week number.
+
+
+<!-- ##### FUNCTION g_date_get_sunday_weeks_in_year ##### -->
+<para>
+Returns the number of weeks in the year, where weeks are taken to start
+on Sunday. Will be 52 or 53. The date must be valid. (Years always have 52
+7-day periods, plus 1 or 2 extra days depending on whether it's a leap
+year. This function is basically telling you how many Sundays are in
+the year, i.e. there are 53 Sundays if one of the extra days happens
+to be a Sunday.)
+</para>
+
+@year: year to count weeks in.
+@Returns: number of weeks.
+
+
+<!-- ##### FUNCTION g_date_get_iso8601_week_of_year ##### -->
+<para>
+
+</para>
+
+@date:
+@Returns:
+
+
+<!-- ##### FUNCTION g_date_strftime ##### -->
+<para>
+Generates a printed representation of the date, in a
+<link linkend="setlocale">locale</link>-specific way. Works just like
+the platform's C library strftime() function, but only accepts date-related
+formats; time-related formats give undefined results. Date must be valid.
+Unlike strftime() (which uses the locale encoding), works on a UTF-8 format
+string and stores a UTF-8 result.
+</para>
+
+<para>
+This function does not provide any conversion specifiers in addition
+to those implemented by the platform's C library. For example, don't
+expect that using g_date_strftime() would make the %F provided by the C99
+strftime() work on Windows where the C library only complies to C89.
+</para>
+
+@s: destination buffer.
+@slen: buffer size.
+@format: format string.
+@date: valid #GDate.
+@Returns: number of characters written to the buffer, or 0 the buffer was too small.
+
+
+<!-- ##### FUNCTION g_date_to_struct_tm ##### -->
+<para>
+Fills in the date-related bits of a <structname>struct tm</structname>
+using the @date value. Initializes the non-date parts with something
+sane but meaningless.
+</para>
+
+@date: a #GDate to set the <structname>struct tm</structname> from.
+@tm: <structname>struct tm</structname> to fill.
+
+
+<!-- ##### FUNCTION g_date_valid ##### -->
+<para>
+Returns %TRUE if the #GDate represents an existing day. The date must not
+contain garbage; it should have been initialized with g_date_clear()
+if it wasn't allocated by one of the g_date_new() variants.
+</para>
+
+@date: a #GDate to check.
+@Returns: Whether the date is valid.
+
+
+<!-- ##### FUNCTION g_date_valid_day ##### -->
+<para>
+Returns %TRUE if the day of the month is valid (a day is valid if it's
+between 1 and 31 inclusive).
+</para>
+
+@day: day to check.
+@Returns: %TRUE if the day is valid.
+
+
+<!-- ##### FUNCTION g_date_valid_month ##### -->
+<para>
+Returns %TRUE if the month value is valid. The 12 #GDateMonth
+enumeration values are the only valid months.
+</para>
+
+@month: month.
+@Returns: %TRUE if the month is valid.
+
+
+<!-- ##### FUNCTION g_date_valid_year ##### -->
+<para>
+Returns %TRUE if the year is valid. Any year greater than 0 is valid,
+though there is a 16-bit limit to what #GDate will understand.
+</para>
+
+@year: year.
+@Returns: %TRUE if the year is valid.
+
+
+<!-- ##### FUNCTION g_date_valid_dmy ##### -->
+<para>
+Returns %TRUE if the day-month-year triplet forms a valid, existing day
+in the range of days #GDate understands (Year 1 or later, no more than
+a few thousand years in the future).
+</para>
+
+@day: day.
+@month: month.
+@year: year.
+@Returns: %TRUE if the date is a valid one.
+
+
+<!-- ##### FUNCTION g_date_valid_julian ##### -->
+<para>
+Returns %TRUE if the Julian day is valid. Anything greater than zero is basically a
+valid Julian, though there is a 32-bit limit.
+</para>
+
+@julian_date: Julian day to check.
+@Returns: %TRUE if the Julian day is valid.
+
+
+<!-- ##### FUNCTION g_date_valid_weekday ##### -->
+<para>
+Returns %TRUE if the weekday is valid. The 7 #GDateWeekday enumeration
+values are the only valid weekdays.
+</para>
+
+@weekday: weekday.
+@Returns: %TRUE if the weekday is valid.
+
+
diff --git a/trunk/docs/reference/glib/tmpl/error_reporting.sgml b/trunk/docs/reference/glib/tmpl/error_reporting.sgml
new file mode 100644
index 000000000..5ea9e147f
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/error_reporting.sgml
@@ -0,0 +1,470 @@
+<!-- ##### SECTION Title ##### -->
+Error Reporting
+
+<!-- ##### SECTION Short_Description ##### -->
+a system for reporting errors.
+
+<!-- ##### SECTION Long_Description ##### -->
+
+<para>
+GLib provides a standard method of reporting errors from a called function to
+the calling code. (This is the same problem solved by exceptions in other
+languages.) It's important to understand that this method is both a
+<emphasis>data type</emphasis> (the #GError object) and a <emphasis>set of
+rules.</emphasis> If you use #GError incorrectly, then your code will not
+properly interoperate with other code that uses #GError, and users of your API
+will probably get confused.
+</para>
+
+<para>
+First and foremost: <emphasis>#GError should only be used to report
+recoverable runtime errors, never to report programming errors.</emphasis> If
+the programmer has screwed up, then you should use g_warning(),
+g_return_if_fail(), g_assert(), g_error(), or some similar facility.
+(Incidentally, remember that the g_error() function should
+<emphasis>only</emphasis> be used for programming errors, it should not be used
+to print any error reportable via #GError.)
+</para>
+
+<para>
+Examples of recoverable runtime errors are "file not found" or "failed to parse
+input." Examples of programming errors are "NULL passed to strcmp()" or
+"attempted to free the same pointer twice." These two kinds of errors are
+fundamentally different: runtime errors should be handled or reported to the
+user, programming errors should be eliminated by fixing the bug in the program.
+This is why most functions in GLib and GTK+ do not use the #GError facility.
+</para>
+
+<para>
+Functions that can fail take a return location for a #GError as their last argument.
+For example:
+<informalexample><programlisting>
+gboolean g_file_get_contents (const gchar *filename,
+ gchar **contents,
+ gsize *length,
+ GError **error);
+</programlisting></informalexample>
+If you pass a non-%NULL value for the <literal>error</literal> argument, it should
+point to a location where an error can be placed. For example:
+<informalexample><programlisting>
+gchar *contents;
+GError *err = NULL;
+g_file_get_contents ("foo.txt", &amp;contents, NULL, &amp;err);
+g_assert ((contents == NULL &amp;&amp; err != NULL) || (contents != NULL &amp;&amp; err == NULL));
+if (err != NULL)
+ {
+ /* Report error to user, and free error */
+ g_assert (contents == NULL);
+ fprintf (stderr, "Unable to read file: &percnt;s\n", err->message);
+ g_error_free (err);
+ }
+else
+ {
+ /* Use file contents */
+ g_assert (contents != NULL);
+ }
+</programlisting></informalexample>
+Note that <literal>err != NULL</literal> in this example is a
+<emphasis>reliable</emphasis> indicator of whether
+g_file_get_contents() failed. Additionally, g_file_get_contents() returns
+a boolean which indicates whether it was successful.
+</para>
+
+<para>
+Because g_file_get_contents() returns %FALSE on failure, if you are only
+interested in whether it failed and don't need to display an error message, you
+can pass %NULL for the <literal>error</literal> argument:
+<informalexample><programlisting>
+if (g_file_get_contents ("foo.txt", &amp;contents, NULL, NULL)) /* ignore errors */
+ /* no error occurred */ ;
+else
+ /* error */ ;
+</programlisting></informalexample>
+</para>
+
+<para>
+The #GError object contains three fields: <literal>domain</literal> indicates
+the module the error-reporting function is located in, <literal>code</literal>
+indicates the specific error that occurred, and <literal>message</literal> is a
+user-readable error message with as many details as possible. Several functions
+are provided to deal with an error received from a called function:
+g_error_matches() returns %TRUE if the error matches a given domain and code,
+g_propagate_error() copies an error into an error location (so the calling
+function will receive it), and g_clear_error() clears an error location by
+freeing the error and resetting the location to %NULL. To display an error to the
+user, simply display <literal>error-&gt;message</literal>, perhaps along with
+additional context known only to the calling function (the file being opened, or
+whatever -- though in the g_file_get_contents() case,
+<literal>error-&gt;message</literal> already contains a filename).
+</para>
+
+<para>
+When implementing a function that can report errors, the basic tool is
+g_set_error(). Typically, if a fatal error occurs you want to g_set_error(),
+then return immediately. g_set_error() does nothing if the error location passed
+to it is %NULL. Here's an example:
+<informalexample><programlisting>
+gint
+foo_open_file (GError **error)
+{
+ gint fd;
+
+ fd = open ("file.txt", O_RDONLY);
+
+ if (fd &lt; 0)
+ {
+ g_set_error (error,
+ FOO_ERROR, /* error domain */
+ FOO_ERROR_BLAH, /* error code */
+ "Failed to open file: &percnt;s", /* error message format string */
+ g_strerror (errno));
+ return -1;
+ }
+ else
+ return fd;
+}
+</programlisting></informalexample>
+</para>
+
+<para>
+Things are somewhat more complicated if you yourself call another function that
+can report a #GError. If the sub-function indicates fatal errors in some way
+other than reporting a #GError, such as by returning %TRUE on success, you can
+simply do the following:
+<informalexample><programlisting>
+gboolean
+my_function_that_can_fail (GError **err)
+{
+ g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+ if (!sub_function_that_can_fail (err))
+ {
+ /* assert that error was set by the sub-function */
+ g_assert (err == NULL || *err != NULL);
+ return FALSE;
+ }
+
+ /* otherwise continue, no error occurred */
+ g_assert (err == NULL || *err == NULL);
+}
+</programlisting></informalexample>
+</para>
+
+<para>
+If the sub-function does not indicate errors other than by reporting a #GError,
+you need to create a temporary #GError since the passed-in one may be %NULL.
+g_propagate_error() is intended for use in this case.
+<informalexample><programlisting>
+gboolean
+my_function_that_can_fail (GError **err)
+{
+ GError *tmp_error;
+
+ g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+ tmp_error = NULL;
+ sub_function_that_can_fail (&amp;tmp_error);
+
+ if (tmp_error != NULL)
+ {
+ /* store tmp_error in err, if err != NULL,
+ * otherwise call g_error_free(<!-- -->) on tmp_error
+ */
+ g_propagate_error (err, tmp_error);
+ return FALSE;
+ }
+
+ /* otherwise continue, no error occurred */
+}
+</programlisting></informalexample>
+</para>
+
+<para>
+Error pileups are always a bug. For example, this code is incorrect:
+<informalexample><programlisting>
+gboolean
+my_function_that_can_fail (GError **err)
+{
+ GError *tmp_error;
+
+ g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+ tmp_error = NULL;
+ sub_function_that_can_fail (&amp;tmp_error);
+ other_function_that_can_fail (&amp;tmp_error);
+
+ if (tmp_error != NULL)
+ {
+ g_propagate_error (err, tmp_error);
+ return FALSE;
+ }
+}
+</programlisting></informalexample>
+<literal>tmp_error</literal> should be checked immediately after
+<function>sub_function_that_can_fail()</function>, and either cleared or propagated upward. The rule
+is: <emphasis>after each error, you must either handle the error, or return it to the
+calling function</emphasis>. Note that passing %NULL for the error location is the
+equivalent of handling an error by always doing nothing about it. So the
+following code is fine, assuming errors in <function>sub_function_that_can_fail()</function> are not
+fatal to <function>my_function_that_can_fail()</function>:
+<informalexample><programlisting>
+gboolean
+my_function_that_can_fail (GError **err)
+{
+ GError *tmp_error;
+
+ g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+ sub_function_that_can_fail (NULL); /* ignore errors */
+
+ tmp_error = NULL;
+ other_function_that_can_fail (&amp;tmp_error);
+
+ if (tmp_error != NULL)
+ {
+ g_propagate_error (err, tmp_error);
+ return FALSE;
+ }
+}
+</programlisting></informalexample>
+</para>
+
+<para>
+Note that passing %NULL for the error location <emphasis>ignores</emphasis>
+errors; it's equivalent to <literal>try { sub_function_that_can_fail (); } catch
+(...) {}</literal> in C++. It does <emphasis>not</emphasis> mean to leave errors
+unhandled; it means to handle them by doing nothing.
+</para>
+
+<para>
+Error domains and codes are conventionally named as follows:
+<itemizedlist>
+<listitem>
+<para>
+The error domain is called
+<literal>&lt;NAMESPACE&gt;_&lt;MODULE&gt;_ERROR</literal>, for example
+%G_EXEC_ERROR or %G_THREAD_ERROR.
+</para>
+</listitem>
+<listitem>
+<para>
+The error codes are in an enumeration called
+<literal>&lt;Namespace&gt;&lt;Module&gt;Error</literal>; for example,
+#GThreadError or #GSpawnError.
+</para>
+</listitem>
+<listitem>
+<para>
+Members of the error code enumeration are called <literal>&lt;NAMESPACE&gt;_&lt;MODULE&gt;_ERROR_&lt;CODE&gt;</literal>, for example %G_SPAWN_ERROR_FORK or %G_THREAD_ERROR_AGAIN.
+</para>
+</listitem>
+<listitem>
+<para>
+If there's a "generic" or "unknown" error code for unrecoverable errors it
+doesn't make sense to distinguish with specific codes, it should be called
+<literal>&lt;NAMESPACE&gt;_&lt;MODULE&gt;_ERROR_FAILED</literal>, for
+example %G_SPAWN_ERROR_FAILED or %G_THREAD_ERROR_FAILED.
+</para>
+</listitem>
+</itemizedlist>
+</para>
+
+<para>
+Summary of rules for use of #GError:
+ <itemizedlist>
+ <listitem>
+ <para>
+ Do not report programming errors via #GError.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ The last argument of a function that returns an error should be a
+ location where a #GError can be placed (i.e. "#GError** error"). If
+ #GError is used with varargs, the #GError** should be the last
+ argument before the "...".
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ The caller may pass %NULL for the #GError** if they are not interested
+ in details of the exact error that occurred.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ If %NULL is passed for the #GError** argument, then errors should
+ not be returned to the caller, but your function should still
+ abort and return if an error occurs. That is, control flow should
+ not be affected by whether the caller wants to get a #GError.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ If a #GError is reported, then your function by definition
+ <emphasis>had a fatal failure and did not complete whatever it was supposed
+ to do</emphasis>. If the failure was not fatal, then you handled it
+ and you should not report it. If it was fatal, then you must report it
+ and discontinue whatever you were doing immediately.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ A #GError* must be initialized to %NULL before passing its address to
+ a function that can report errors.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ "Piling up" errors is always a bug. That is, if you assign a new
+ #GError to a #GError* that is non-%NULL, thus overwriting the previous
+ error, it indicates that you should have aborted the operation instead
+ of continuing. If you were able to continue, you should have cleared
+ the previous error with g_clear_error(). g_set_error() will complain
+ if you pile up errors.
+ </para>
+ </listitem>
+
+
+ <listitem>
+ <para>
+ By convention, if you return a boolean value indicating success
+ then %TRUE means success and %FALSE means failure. If %FALSE is returned,
+ the error <emphasis>must</emphasis> be set to a non-%NULL value.
+ </para>
+ </listitem>
+
+
+ <listitem>
+ <para>
+ A %NULL return value is also frequently used to mean that an error
+ occurred. You should make clear in your documentation whether %NULL is
+ a valid return value in non-error cases; if %NULL is a valid value,
+ then users must check whether an error was returned to see if the
+ function succeeded.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ When implementing a function that can report errors, you may want to
+ add a check at the top of your function that the error return location
+ is either %NULL or contains a %NULL error
+ (e.g. <literal>g_return_if_fail (error == NULL || *error ==
+ NULL);</literal>).
+ </para>
+ </listitem>
+
+
+</itemizedlist>
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GError ##### -->
+<para>
+The <structname>GError</structname> structure contains
+information about an error that has occurred.
+</para>
+
+@domain: error domain, e.g. #G_FILE_ERROR.
+@code: error code, e.g. %G_FILE_ERROR_NOENT.
+@message: human-readable informative error message.
+
+<!-- ##### FUNCTION g_error_new ##### -->
+<para>
+
+</para>
+
+@domain:
+@code:
+@format:
+@Varargs:
+@Returns:
+
+
+<!-- ##### FUNCTION g_error_new_literal ##### -->
+<para>
+
+</para>
+
+@domain:
+@code:
+@message:
+@Returns:
+
+
+<!-- ##### FUNCTION g_error_free ##### -->
+<para>
+
+</para>
+
+@error:
+
+
+<!-- ##### FUNCTION g_error_copy ##### -->
+<para>
+
+</para>
+
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_error_matches ##### -->
+<para>
+
+</para>
+
+@error:
+@domain:
+@code:
+@Returns:
+
+
+<!-- ##### FUNCTION g_set_error ##### -->
+<para>
+
+</para>
+
+@err:
+@domain:
+@code:
+@format:
+@Varargs:
+
+
+<!-- ##### FUNCTION g_propagate_error ##### -->
+<para>
+
+</para>
+
+@dest:
+@src:
+
+
+<!-- ##### FUNCTION g_clear_error ##### -->
+<para>
+
+</para>
+
+@err: <!--
+Local variables:
+mode: sgml
+sgml-parent-document: ("../glib-docs.sgml" "book" "refsect2" "")
+End:
+-->
+
+
diff --git a/trunk/docs/reference/glib/tmpl/fileutils.sgml b/trunk/docs/reference/glib/tmpl/fileutils.sgml
new file mode 100644
index 000000000..b6f5b6bba
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/fileutils.sgml
@@ -0,0 +1,457 @@
+<!-- ##### SECTION Title ##### -->
+File Utilities
+
+<!-- ##### SECTION Short_Description ##### -->
+various file-related functions.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+There is a group of functions which wrap the common POSIX functions
+dealing with filenames (g_open(), g_rename(), g_mkdir(), g_stat(),
+g_unlink(), g_remove(), g_fopen(), g_freopen()). The point of these
+wrappers is to make it possible to handle file names with any Unicode
+characters in them on Windows without having to use ifdefs and the
+wide character API in the application code.
+</para>
+<para>
+The pathname argument should be in the GLib file name encoding. On
+POSIX this is the actual on-disk encoding which might correspond to
+the locale settings of the process (or the
+<envar>G_FILENAME_ENCODING</envar> environment variable), or not.
+</para>
+<para>
+On Windows the GLib file name encoding is UTF-8. Note that the
+Microsoft C library does not use UTF-8, but has separate APIs for
+current system code page and wide characters (UTF-16). The GLib
+wrappers call the wide character API if present (on modern Windows
+systems), otherwise convert to/from the system code page.
+</para>
+
+<para>
+Another group of functions allows to open and read directories
+in the GLib file name encoding. These are g_dir_open(),
+g_dir_read_name(), g_dir_rewind(), g_dir_close().
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### ENUM GFileError ##### -->
+<para>
+Values corresponding to <literal>errno</literal> codes returned from file operations
+on UNIX. Unlike <literal>errno</literal> codes, #GFileError values are available on
+all systems, even Windows. The exact meaning of each code depends on what
+sort of file operation you were performing; the UNIX documentation
+gives more details. The following error code descriptions come
+from the GNU C Library manual, and are under the copyright
+of that manual.
+</para>
+
+<para>
+It's not very portable to make detailed assumptions about exactly
+which errors will be returned from a given operation. Some errors
+don't occur on some systems, etc., sometimes there are subtle
+differences in when a system will report a given error, etc.
+</para>
+
+@G_FILE_ERROR_EXIST: Operation not permitted; only the owner of the
+ file (or other resource) or processes with special privileges can
+ perform the operation.
+@G_FILE_ERROR_ISDIR: File is a directory; you cannot open a directory
+ for writing, or create or remove hard links to it.
+@G_FILE_ERROR_ACCES: Permission denied; the file permissions do not
+ allow the attempted operation.
+@G_FILE_ERROR_NAMETOOLONG: Filename too long.
+@G_FILE_ERROR_NOENT: No such file or directory. This is a "file
+ doesn't exist" error for ordinary files that are referenced in
+ contexts where they are expected to already exist.
+@G_FILE_ERROR_NOTDIR: A file that isn't a directory was specified when
+ a directory is required.
+@G_FILE_ERROR_NXIO: No such device or address. The system tried to
+ use the device represented by a file you specified, and it
+ couldn't find the device. This can mean that the device file was
+ installed incorrectly, or that the physical device is missing or
+ not correctly attached to the computer.
+@G_FILE_ERROR_NODEV: This file is of a type that doesn't support
+ mapping.
+@G_FILE_ERROR_ROFS: The directory containing the new link can't be
+ modified because it's on a read-only file system.
+@G_FILE_ERROR_TXTBSY: Text file busy.
+@G_FILE_ERROR_FAULT: You passed in a pointer to bad memory.
+ (GLib won't reliably return this, don't pass in pointers to bad
+ memory.)
+@G_FILE_ERROR_LOOP: Too many levels of symbolic links were encountered
+ in looking up a file name. This often indicates a cycle of symbolic
+ links.
+@G_FILE_ERROR_NOSPC: No space left on device; write operation on a
+ file failed because the disk is full.
+@G_FILE_ERROR_NOMEM: No memory available. The system cannot allocate
+ more virtual memory because its capacity is full.
+@G_FILE_ERROR_MFILE: The current process has too many files open and
+ can't open any more. Duplicate descriptors do count toward this
+ limit.
+@G_FILE_ERROR_NFILE: There are too many distinct file openings in the
+ entire system.
+@G_FILE_ERROR_BADF: Bad file descriptor; for example, I/O on a
+ descriptor that has been closed or reading from a descriptor open
+ only for writing (or vice versa).
+@G_FILE_ERROR_INVAL: Invalid argument. This is used to indicate
+ various kinds of problems with passing the wrong argument to a
+ library function.
+@G_FILE_ERROR_PIPE: Broken pipe; there is no process reading from the
+ other end of a pipe. Every library function that returns this
+ error code also generates a `SIGPIPE' signal; this signal
+ terminates the program if not handled or blocked. Thus, your
+ program will never actually see this code unless it has handled or
+ blocked `SIGPIPE'.
+@G_FILE_ERROR_AGAIN: Resource temporarily unavailable; the call might
+ work if you try again later.
+@G_FILE_ERROR_INTR: Interrupted function call; an asynchronous signal
+ occurred and prevented completion of the call. When this
+ happens, you should try the call again.
+@G_FILE_ERROR_IO: Input/output error; usually used for physical read
+ or write errors. i.e. the disk or other physical device hardware
+ is returning errors.
+@G_FILE_ERROR_PERM: Operation not permitted; only the owner of the
+ file (or other resource) or processes with special privileges can
+ perform the operation.
+@G_FILE_ERROR_NOSYS: Function not implemented; this indicates that the
+ system is missing some functionality.
+@G_FILE_ERROR_FAILED: Does not correspond to a UNIX error code; this
+ is the standard "failed for unspecified reason" error code present in
+ all #GError error code enumerations. Returned if no specific
+ code applies.
+
+<!-- ##### MACRO G_FILE_ERROR ##### -->
+<para>
+Error domain for file operations. Errors in this domain will
+be from the #GFileError enumeration. See #GError for information on
+error domains.
+</para>
+
+
+
+<!-- ##### ENUM GFileTest ##### -->
+<para>
+A test to perform on a file using g_file_test().
+</para>
+
+@G_FILE_TEST_IS_REGULAR: %TRUE if the file is a regular file (not a symlink or directory)
+@G_FILE_TEST_IS_SYMLINK: %TRUE if the file is a symlink.
+@G_FILE_TEST_IS_DIR: %TRUE if the file is a directory.
+@G_FILE_TEST_IS_EXECUTABLE: %TRUE if the file is executable.
+@G_FILE_TEST_EXISTS: %TRUE if the file exists. It may or may not be a regular file.
+
+<!-- ##### FUNCTION g_file_error_from_errno ##### -->
+<para>
+
+</para>
+
+@err_no:
+@Returns:
+
+
+<!-- ##### FUNCTION g_file_get_contents ##### -->
+<para>
+
+</para>
+
+@filename:
+@contents:
+@length:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_file_set_contents ##### -->
+<para>
+
+</para>
+
+@filename:
+@contents:
+@length:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_file_test ##### -->
+<para>
+
+</para>
+
+@filename:
+@test:
+@Returns:
+
+
+<!-- ##### FUNCTION g_mkstemp ##### -->
+<para>
+
+</para>
+
+@tmpl:
+@Returns:
+
+
+<!-- ##### FUNCTION g_file_open_tmp ##### -->
+<para>
+
+</para>
+
+@tmpl:
+@name_used:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_file_read_link ##### -->
+<para>
+
+</para>
+
+@filename:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_mkdir_with_parents ##### -->
+<para>
+
+</para>
+
+@pathname:
+@mode:
+@Returns:
+
+
+<!-- ##### STRUCT GDir ##### -->
+<para>
+An opaque structure representing an opened directory.
+</para>
+
+
+<!-- ##### FUNCTION g_dir_open ##### -->
+<para>
+
+</para>
+
+@path:
+@flags:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_dir_read_name ##### -->
+<para>
+
+</para>
+
+@dir:
+@Returns:
+
+
+<!-- ##### FUNCTION g_dir_rewind ##### -->
+<para>
+
+</para>
+
+@dir:
+
+
+<!-- ##### FUNCTION g_dir_close ##### -->
+<para>
+
+</para>
+
+@dir:
+
+
+<!-- ##### STRUCT GMappedFile ##### -->
+<para>
+The #GMappedFile represents a file mapping created with
+g_mapped_file_new(). It has only private members and should
+not be accessed directly.
+</para>
+
+
+<!-- ##### FUNCTION g_mapped_file_new ##### -->
+<para>
+
+</para>
+
+@filename:
+@writable:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_mapped_file_free ##### -->
+<para>
+
+</para>
+
+@file:
+
+
+<!-- ##### FUNCTION g_mapped_file_get_length ##### -->
+<para>
+
+</para>
+
+@file:
+@Returns:
+
+
+<!-- ##### FUNCTION g_mapped_file_get_contents ##### -->
+<para>
+
+</para>
+
+@file:
+@Returns:
+
+
+<!-- ##### FUNCTION g_open ##### -->
+<para>
+
+</para>
+
+@filename:
+@flags:
+@mode:
+@Returns:
+
+
+<!-- ##### FUNCTION g_rename ##### -->
+<para>
+
+</para>
+
+@oldfilename:
+@newfilename:
+@Returns:
+
+
+<!-- ##### FUNCTION g_mkdir ##### -->
+<para>
+
+</para>
+
+@filename:
+@mode:
+@Returns:
+
+
+<!-- ##### FUNCTION g_stat ##### -->
+<para>
+
+</para>
+
+@filename:
+@buf:
+@Returns:
+
+
+<!-- ##### FUNCTION g_lstat ##### -->
+<para>
+
+</para>
+
+@filename:
+@buf:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unlink ##### -->
+<para>
+
+</para>
+
+@filename:
+@Returns:
+
+
+<!-- ##### FUNCTION g_remove ##### -->
+<para>
+
+</para>
+
+@filename:
+@Returns:
+
+
+<!-- ##### FUNCTION g_rmdir ##### -->
+<para>
+
+</para>
+
+@filename:
+@Returns:
+
+
+<!-- ##### FUNCTION g_fopen ##### -->
+<para>
+
+</para>
+
+@filename:
+@mode:
+@Returns:
+
+
+<!-- ##### FUNCTION g_freopen ##### -->
+<para>
+
+</para>
+
+@filename:
+@mode:
+@stream:
+@Returns:
+
+
+<!-- ##### FUNCTION g_chmod ##### -->
+<para>
+
+</para>
+
+@filename:
+@mode:
+@Returns:
+
+
+<!-- ##### FUNCTION g_access ##### -->
+<para>
+
+</para>
+
+@filename:
+@mode:
+@Returns:
+
+
+<!-- ##### FUNCTION g_creat ##### -->
+<para>
+
+</para>
+
+@filename:
+@mode:
+@Returns:
+
+
+<!-- ##### FUNCTION g_chdir ##### -->
+<para>
+
+</para>
+
+@path:
+@Returns:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/glib-unused.sgml b/trunk/docs/reference/glib/tmpl/glib-unused.sgml
new file mode 100644
index 000000000..d49f6cb3c
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/glib-unused.sgml
@@ -0,0 +1,918 @@
+<!-- ##### SECTION ./tmpl/desktop_entry.sgml:Long_Description ##### -->
+<para>
+The "GDesktopEntry" parser is intended to parse files written to
+the <ulink
+url="http://www.freedesktop.org/Standards/desktop-entry-spec">Desktop
+Entry Specification</ulink>. It supports deserialization of
+desktop entries from files and in-memory data. Desktop entries
+are used for a variety of things including menus, application
+MIME type registration, and launchers.
+</para>
+
+<para>
+To load an existing desktop entry from a data directory (as
+returned by g_get_user_data_dir() and g_get_system_data_dirs())
+use g_desktop_entry_new_from_data_dirs(). To load an existing
+desktop entry from an arbitrary location on the file system use
+g_desktop_entry_new_from_file(). If the desktop entry is already
+in memory use g_desktop_entry_new_from_data(). Once the desktop
+entry is loaded its keys can be queried using the g_desktop_entry_get
+family of functions.
+</para>
+
+<para>
+To create a new desktop entry first call g_desktop_entry_new().
+Then, call the g_desktop_entry_set family of functions. Next,
+call g_desktop_entry_to_data() to output the desktop entry to
+a byte array, which can be written to disk or sent over a
+network. Finally, call g_desktop_entry_free() to deallocate the
+#GDesktopEntry object returned by g_desktop_entry_new().
+</para>
+
+
+<!-- ##### SECTION ./tmpl/desktop_entry.sgml:See_Also ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### SECTION ./tmpl/desktop_entry.sgml:Short_Description ##### -->
+serializes and deserializes a desktop entry.
+
+
+<!-- ##### SECTION ./tmpl/desktop_entry.sgml:Title ##### -->
+Desktop Entry Parser
+
+
+<!-- ##### SECTION ./tmpl/glib-unused.sgml:Stability_Level ##### -->
+
+
+
+<!-- ##### ENUM GChannelError ##### -->
+<para>
+
+</para>
+
+@G_CHANNEL_ERROR_ACCES:
+@G_CHANNEL_ERROR_BADF:
+@G_CHANNEL_ERROR_DEADLK:
+@G_CHANNEL_ERROR_FAULT:
+@G_CHANNEL_ERROR_INVAL:
+@G_CHANNEL_ERROR_IO:
+@G_CHANNEL_ERROR_ISDIR:
+@G_CHANNEL_ERROR_MFILE:
+@G_CHANNEL_ERROR_NOLCK:
+@G_CHANNEL_ERROR_NOSPC:
+@G_CHANNEL_ERROR_PERM:
+@G_CHANNEL_ERROR_PIPE:
+@G_CHANNEL_ERROR_SPIPE:
+@G_CHANNEL_ERROR_ENCODE_RW:
+@G_CHANNEL_ERROR_FAILED:
+
+<!-- ##### ENUM GChannelStatus ##### -->
+<para>
+
+</para>
+
+@G_CHANNEL_STATUS_NORMAL:
+@G_CHANNEL_STATUS_EOF:
+@G_CHANNEL_STATUS_PARTIAL_CHARS:
+@G_CHANNEL_STATUS_AGAIN:
+@G_CHANNEL_STATUS_INTR:
+@G_CHANNEL_STATUS_ERROR:
+@G_CHANNEL_STATUS_BAD_INPUT:
+
+<!-- ##### USER_FUNCTION GCompareFuncData ##### -->
+<para>
+
+</para>
+
+@a:
+@b:
+@user_data:
+@Returns:
+
+<!-- ##### USER_FUNCTION GCompletionStrcmpFunc ##### -->
+<para>
+
+</para>
+
+@s1:
+@s2:
+@Returns:
+
+<!-- ##### STRUCT GDesktopEntry ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### ENUM GDesktopEntryError ##### -->
+<para>
+Error codes returned by desktop entry parsing.
+</para>
+
+@G_DESKTOP_ENTRY_ERROR_UNKNOWN_ENCODING: text being parsed is not UTF-8 and
+cannot be guessed.
+@G_DESKTOP_ENTRY_ERROR_BAD_START_GROUP: desktop entry does not start with a
+legal start group.
+@G_DESKTOP_ENTRY_ERROR_PARSE: desktop entry is empty or contains invalid
+data.
+@G_DESKTOP_ENTRY_ERROR_NOT_FOUND: valid desktop entry could not be found.
+@G_DESKTOP_ENTRY_ERROR_KEY_NOT_FOUND: desktop entry does not have requested
+key.
+@G_DESKTOP_ENTRY_ERROR_GROUP_NOT_FOUND: desktop entry does not have requested
+group
+@G_DESKTOP_ENTRY_ERROR_INVALID_VALUE: desktop entry contains key which has
+value that cannot be validated.
+
+<!-- ##### ENUM GDesktopEntryFlags ##### -->
+<para>
+#GDesktopEntry supports a few flags for tweaking performance during
+deserialization. #G_DESKTOP_ENTRY_DISCARD_COMMENTS and
+#G_DESKTOP_ENTRY_DISCARD_TRANSLATIONS will reduce memory footprint,
+and #G_DESKTOP_ENTRY_GENERATE_LOOKUP_MAP will increase key lookup speed.
+</para>
+
+@G_DESKTOP_ENTRY_NONE: use parser defaults
+@G_DESKTOP_ENTRY_DISCARD_COMMENTS: Discard all lines that are blank
+or start with "#".
+@G_DESKTOP_ENTRY_DISCARD_TRANSLATIONS: Only retain translations that
+are returned by g_get_language_names().
+@G_DESKTOP_ENTRY_GENERATE_LOOKUP_MAP: Generate a lookup map for key names to make lookups constant time at the cost of more memory.
+
+<!-- ##### USER_FUNCTION GErrorFunc ##### -->
+<para>
+Specifies the type of function passed to g_set_error_handler().
+</para>
+
+@str: the error message.
+
+<!-- ##### USER_FUNCTION GHookFreeFunc ##### -->
+<para>
+
+</para>
+
+@hook_list:
+@hook:
+
+<!-- ##### ENUM GIOFileMode ##### -->
+<para>
+
+</para>
+
+@G_IO_FILE_MODE_READ:
+@G_IO_FILE_MODE_WRITE:
+@G_IO_FILE_MODE_APPEND:
+@G_IO_FILE_MODE_READ_WRITE:
+@G_IO_FILE_MODE_READ_WRITE_TRUNCATE:
+@G_IO_FILE_MODE_READ_WRITE_APPEND:
+
+<!-- ##### ENUM GMatchType ##### -->
+<para>
+Enumeration representing different kinds of patterns. This is only used
+internally for optimizing the match algorithm.
+</para>
+
+@G_MATCH_ALL: a general pattern.
+@G_MATCH_ALL_TAIL: a general pattern which contains a fixed part matching
+the end of the string.
+@G_MATCH_HEAD: a pattern matching every string with a certain prefix.
+@G_MATCH_TAIL: a pattern matching every string with a certain suffix.
+@G_MATCH_EXACT: a pattern matching exactly one string.
+@G_MATCH_LAST:
+
+<!-- ##### USER_FUNCTION GWarningFunc ##### -->
+<para>
+Specifies the type of function passed to g_set_warning_handler().
+</para>
+
+@str: the warning message.
+
+<!-- ##### MACRO G_CHANNEL_ERROR ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO G_DESKTOP_ENTRY_ERROR ##### -->
+<para>
+Error domain for desktop entry parsing. Errors in this domain will
+be from the #GDesktopEntryError enumeration. See #GError for information on
+error domains.
+</para>
+
+
+<!-- ##### MACRO G_HOOK_DEFERRED_DESTROY ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO G_IO_CHANNEL_DEFAULT_LINE_TERM ##### -->
+<para>
+One of %G_IO_CHANNEL_UNIX_LINE_TERM, %G_IO_CHANNEL_DOS_LINE_TERM,
+or %G_IO_CHANNEL_MACINTOSH_LINE_TERM (unimplemented)
+depending on the system type.
+</para>
+
+
+<!-- ##### MACRO G_IO_CHANNEL_DOS_LINE_TERM ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO G_IO_CHANNEL_ENCODE_RAW ##### -->
+<para>
+Encoding for nonbuffered IO. With this encoding, data must be
+read using g_io_channel_read_chars(); the other functions will
+not work.
+</para>
+
+
+<!-- ##### MACRO G_IO_CHANNEL_MACINTOSH_LINE_TERM ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO G_IO_CHANNEL_UNIX_LINE_TERM ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO NAME_MAX ##### -->
+<para>
+Provided for UNIX emulation on Windows; equivalent to UNIX macro
+%NAME_MAX, which is the maximum length of a single path component.
+i.e. just the <filename>foo</filename> in <filename>/usr/bin/foo</filename>.
+</para>
+
+
+<!-- ##### MACRO access ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO close ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### FUNCTION closedir ##### -->
+<para>
+Provided for UNIX emulation on Windows; see documentation for <function>closedir()</function>
+in any UNIX manual.
+</para>
+
+@Param1:
+@Returns:
+
+<!-- ##### MACRO fdopen ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO ftruncate ##### -->
+<para>
+Provided for UNIX emulation on Windows; see documentation for ftruncate()
+in any UNIX manual.
+</para>
+
+@fd:
+@size:
+
+<!-- ##### FUNCTION g_channel_error_from_errno ##### -->
+<para>
+
+</para>
+
+@en:
+@Returns:
+
+<!-- ##### FUNCTION g_channel_error_quark ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+<!-- ##### FUNCTION g_convert_error_quark ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_escape_strings ##### -->
+<para>
+
+</para>
+
+@entry:
+@should_escape:
+
+<!-- ##### FUNCTION g_desktop_entry_free ##### -->
+<para>
+
+</para>
+
+@entry:
+
+<!-- ##### FUNCTION g_desktop_entry_get_boolean ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_get_boolean_list ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@length:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_get_groups ##### -->
+<para>
+
+</para>
+
+@entry:
+@length:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_get_integer ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_get_integer_list ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@length:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_get_keys ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@length:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_get_locale_string ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@locale:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_get_locale_string_list ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@locale:
+@length:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_get_start_group ##### -->
+<para>
+
+</para>
+
+@entry:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_get_string ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_get_string_list ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@length:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_has_group ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_has_key ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_new ##### -->
+<para>
+
+</para>
+
+@flags:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_new_from_data ##### -->
+<para>
+
+</para>
+
+@data:
+@length:
+@legal_start_groups:
+@flags:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_new_from_data_dirs ##### -->
+<para>
+
+</para>
+
+@file:
+@full_path:
+@legal_start_groups:
+@flags:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_new_from_file ##### -->
+<para>
+
+</para>
+
+@file:
+@legal_start_groups:
+@flags:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_desktop_entry_remove_group ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@error:
+
+<!-- ##### FUNCTION g_desktop_entry_remove_key ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@error:
+
+<!-- ##### FUNCTION g_desktop_entry_set_boolean ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@boolean:
+@error:
+
+<!-- ##### FUNCTION g_desktop_entry_set_boolean_list ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@list:
+@length:
+@error:
+
+<!-- ##### FUNCTION g_desktop_entry_set_integer ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@integer:
+@error:
+
+<!-- ##### FUNCTION g_desktop_entry_set_integer_list ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@list:
+@length:
+@error:
+
+<!-- ##### FUNCTION g_desktop_entry_set_locale_string ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@locale:
+@string:
+@error:
+
+<!-- ##### FUNCTION g_desktop_entry_set_locale_string_list ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@locale:
+@list:
+@length:
+@error:
+
+<!-- ##### FUNCTION g_desktop_entry_set_string ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@string:
+@error:
+
+<!-- ##### FUNCTION g_desktop_entry_set_string_list ##### -->
+<para>
+
+</para>
+
+@entry:
+@group_name:
+@key:
+@list:
+@length:
+@error:
+
+<!-- ##### FUNCTION g_desktop_entry_to_data ##### -->
+<para>
+
+</para>
+
+@entry:
+@length:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_file_replace ##### -->
+<para>
+
+</para>
+
+@filename:
+@contents:
+@length:
+@error:
+@Returns:
+
+<!-- ##### FUNCTION g_io_channel_error_quark ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+<!-- ##### VARIABLE g_log_domain_glib ##### -->
+<para>
+The log domain used for messages logged by GLib itself.
+</para>
+
+
+<!-- ##### FUNCTION g_main_add_poll ##### -->
+<para>
+Adds a file descriptor to be polled.
+This is usually combined with g_source_add() 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.
+</para>
+
+@fd: a #GPollFD, which is a file descriptor together with a bitwise
+combination of #GIOCondition flags determining which events to poll for.
+@priority: the priority of the poll, which should be the same as the priority
+used for g_source_add() to ensure that the file descriptor is polled whenever
+the results may be needed.
+See #G_PRIORITY_DEFAULT, #G_PRIORITY_DEFAULT_IDLE, #G_PRIORITY_HIGH,
+#G_PRIORITY_HIGH_IDLE, and #G_PRIORITY_LOW.
+
+<!-- ##### FUNCTION g_main_context_get ##### -->
+<para>
+
+</para>
+
+@thread:
+@Returns:
+
+<!-- ##### FUNCTION g_main_loop_destroy ##### -->
+<para>
+
+</para>
+
+@loop:
+
+<!-- ##### FUNCTION g_main_remove_poll ##### -->
+<para>
+Removes a file descriptor from the list being polled.
+</para>
+
+@fd: the #GPollFD to remove.
+
+<!-- ##### FUNCTION g_main_win32_get_poll_func ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+<!-- ##### FUNCTION g_mem_check ##### -->
+<para>
+Checks if the given memory has already been freed. If it has it outputs
+a warning message.
+To use this function you must configure glib with the flag
+'--enable-mem-check=yes' before compiling.
+</para>
+
+@mem: the memory to check.
+
+<!-- ##### FUNCTION g_regex_error_quark ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+<!-- ##### FUNCTION g_regex_free ##### -->
+<para>
+
+</para>
+
+@regex:
+
+<!-- ##### FUNCTION g_scanner_stat_mode ##### -->
+<para>
+Gets the file attributes.
+This is the <structfield>st_mode</structfield> field from the
+<structname>stat</structname> structure. See the <function>stat()</function>
+documentation.
+</para>
+
+@filename: the file name.
+@Returns: the file attributes.
+
+<!-- ##### FUNCTION g_set_error_handler ##### -->
+<para>
+Sets the function to be called to handle error messages.
+This function is deprecated in favour of the new logging facilities.
+</para>
+
+@func: the function to be called to handle error messages.
+@Returns: the old error handler.
+
+<!-- ##### FUNCTION g_set_message_handler ##### -->
+<para>
+Sets the function to be called to handle messages.
+This function is deprecated in favour of the new logging facilities.
+</para>
+
+@func: the function to be called to handle normal messages.
+@Returns: the old message handler.
+
+<!-- ##### FUNCTION g_set_warning_handler ##### -->
+<para>
+Sets the function to be called to handle warning messages.
+This function is deprecated in favour of the new logging facilities.
+</para>
+
+@func: the function to be called to handle warning messages.
+@Returns: the old warning handler.
+
+<!-- ##### FUNCTION g_source_add ##### -->
+<para>
+</para>
+
+@priority:
+@can_recurse:
+@funcs:
+@source_data:
+@user_data:
+@notify:
+@Returns:
+@source:
+@context:
+
+<!-- ##### FUNCTION g_source_connect ##### -->
+<para>
+
+</para>
+
+@source:
+@func:
+@data:
+@notify:
+
+<!-- ##### FUNCTION g_source_connect_indirect ##### -->
+<para>
+
+</para>
+
+@source:
+@callback_data:
+@callback_funcs:
+
+<!-- ##### FUNCTION g_source_remove_by_source_data ##### -->
+<para>
+Removes the first event source found with the given source data.
+</para>
+<para>
+Event sources are sorted with the highest priority first. Sources with equal
+priority are stored in the order in which they were added.
+</para>
+
+@source_data: the source data, which contains information specific to the
+type of source.
+@Returns: TRUE if an event source was found and removed.
+
+<!-- ##### FUNCTION g_static_private_get_for_thread ##### -->
+<para>
+
+</para>
+
+@private_key:
+@thread:
+@Returns:
+
+<!-- ##### FUNCTION g_static_private_set_for_thread ##### -->
+<para>
+
+</para>
+
+@private_key:
+@thread:
+@data:
+@notify:
+
+<!-- ##### MACRO g_string ##### -->
+<para>
+Turns the argument into a string literal by using the '#' stringizing operator.
+</para>
+
+@x: text to convert to a literal string.
+
+<!-- ##### MACRO getcwd ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO getpid ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO lseek ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO open ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### FUNCTION opendir ##### -->
+<para>
+Provided for UNIX emulation on Windows; see documentation for <function>opendir()</function>
+in any UNIX manual.
+</para>
+
+@Param1:
+@Returns:
+
+<!-- ##### MACRO pclose ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO pipe ##### -->
+<para>
+Provided for UNIX emulation on Windows; see documentation for pipe()
+in any UNIX manual.
+</para>
+
+@phandles: file descriptors, the first one for reading, the second one for writing.
+
+<!-- ##### MACRO popen ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO read ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO readdir ##### -->
+<para>
+Provided for UNIX emulation on Windows; see documentation for <function>readdir()</function>
+in any UNIX manual.
+</para>
+
+
+<!-- ##### FUNCTION rewinddir ##### -->
+<para>
+Provided for UNIX emulation on Windows; see documentation for <function>rewinddir()</function>
+in any UNIX manual.
+</para>
+
+@Param1:
+
+<!-- ##### MACRO write ##### -->
+<para>
+
+</para>
+
+
diff --git a/trunk/docs/reference/glib/tmpl/gregex.sgml b/trunk/docs/reference/glib/tmpl/gregex.sgml
new file mode 100644
index 000000000..a862946bf
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/gregex.sgml
@@ -0,0 +1,596 @@
+<!-- ##### SECTION Title ##### -->
+Perl-compatible regular expressions
+
+<!-- ##### SECTION Short_Description ##### -->
+matches strings against regular expressions.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The <function>g_regex_*()</function> functions implement regular
+expression pattern matching using syntax and semantics similar to
+Perl regular expression.
+</para>
+<para>
+Some functions accept a <parameter>start_position</parameter> argument,
+setting it differs from just passing over a shortened string and setting
+#G_REGEX_MATCH_NOTBOL in the case of a pattern that begins with any kind
+of lookbehind assertion.
+For example, consider the pattern "\Biss\B" which finds occurrences of "iss"
+in the middle of words. ("\B" matches only if the current position in the
+subject is not a word boundary.) When applied to the string "Mississipi"
+from the fourth byte, namely "issipi", it does not match, because "\B" is
+always false at the start of the subject, which is deemed to be a word
+boundary. However, if the entire string is passed , but with
+<parameter>start_position</parameter> set to 4, it finds the second
+occurrence of "iss" because it is able to look behind the starting point
+to discover that it is preceded by a letter.
+</para>
+<para>
+Note that, unless you set the #G_REGEX_RAW flag, all the strings passed
+to these functions must be encoded in UTF-8. The lengths and the positions
+inside the strings are in bytes and not in characters, so, for instance,
+"\xc3\xa0" (i.e. "&agrave;") is two bytes long but it is treated as a single
+character. If you set #G_REGEX_RAW the strings can be non-valid UTF-8
+strings and a byte is treated as a character, so "\xc3\xa0" is two bytes
+and two characters long.
+</para>
+<para>
+When matching a pattern, "\n" matches only against a "\n" character in the
+string, and "\r" matches only a "\r" character. To match any newline sequence
+use "\R". This particular group matches either the two-character sequence
+CR + LF ("\r\n"), or one of the single characters LF (linefeed, U+000A, "\n"), VT
+(vertical tab, U+000B, "\v"), FF (formfeed, U+000C, "\f"), CR (carriage return,
+U+000D, "\r"), NEL (next line, U+0085), LS (line separator, U+2028), or PS
+(paragraph separator, U+2029).
+</para>
+<para>
+The behaviour of the dot, circumflex, and dollar metacharacters are affected by
+newline characters, the default is to recognize any newline character (the same
+characters recognized by "\R"). This can be changed with #G_REGEX_NEWLINE_CR,
+#G_REGEX_NEWLINE_LF and #G_REGEX_NEWLINE_CRLF compile options,
+and with #G_REGEX_MATCH_NEWLINE_ANY, #G_REGEX_MATCH_NEWLINE_CR,
+#G_REGEX_MATCH_NEWLINE_LF and #G_REGEX_MATCH_NEWLINE_CRLF match options.
+These settings are also relevant when compiling a pattern if
+#G_REGEX_EXTENDED is set, and an unescaped "#" outside a character class is
+encountered. This indicates a comment that lasts until after the next
+newline.
+</para>
+<para>
+Creating and manipulating the same #GRegex structure from different
+threads is not a problem as #GRegex does not modify its internal
+state between creation and destruction, on the other hand #GMatchInfo is
+not threadsafe.
+</para>
+<para>
+The regular expressions low level functionalities are obtained through
+the excellent <ulink url="http://www.pcre.org/">PCRE</ulink> library
+written by Philip Hazel.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### ENUM GRegexError ##### -->
+<para>
+Error codes returned by regular expressions functions.
+</para>
+
+@G_REGEX_ERROR_COMPILE: Compilation of the regular expression in g_regex_new() failed.
+@G_REGEX_ERROR_OPTIMIZE: Optimization of the regular expression failed.
+@G_REGEX_ERROR_REPLACE: Replacement failed due to an ill-formed replacement string.
+@G_REGEX_ERROR_MATCH: The match process failed.
+@Since: 2.14
+
+<!-- ##### MACRO G_REGEX_ERROR ##### -->
+<para>
+Error domain for regular expressions. Errors in this domain will be from the #GRegexError enumeration. See #GError for information on error domains.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### ENUM GRegexCompileFlags ##### -->
+<para>
+Flags specifying compile-time options.
+</para>
+
+@G_REGEX_CASELESS: Letters in the pattern match both upper and lower case
+letters. It be changed within a pattern by a "(?i)" option setting.
+@G_REGEX_MULTILINE: By default, GRegex treats the strings as consisting
+of a single line of characters (even if it actually contains newlines).
+The "start of line" metacharacter ("^") matches only at the start of the
+string, while the "end of line" metacharacter ("$") matches only at the
+end of the string, or before a terminating newline (unless
+#G_REGEX_DOLLAR_ENDONLY is set). When #G_REGEX_MULTILINE is set,
+the "start of line" and "end of line" constructs match immediately following
+or immediately before any newline in the string, respectively, as well
+as at the very start and end. This can be changed within a pattern by a
+"(?m)" option setting.
+@G_REGEX_DOTALL: A dot metacharater (".") in the pattern matches all
+characters, including newlines. Without it, newlines are excluded. This
+option can be changed within a pattern by a ("?s") option setting.
+@G_REGEX_EXTENDED: Whitespace data characters in the pattern are
+totally ignored except when escaped or inside a character class.
+Whitespace does not include the VT character (code 11). In addition,
+characters between an unescaped "#" outside a character class and
+the next newline character, inclusive, are also ignored. This can be
+changed within a pattern by a "(?x)" option setting.
+@G_REGEX_ANCHORED: The pattern is forced to be "anchored", that is,
+it is constrained to match only at the first matching point in the string
+that is being searched. This effect can also be achieved by appropriate
+constructs in the pattern itself such as the "^" metacharater.
+@G_REGEX_DOLLAR_ENDONLY: A dollar metacharacter ("$") in the pattern
+matches only at the end of the string. Without this option, a dollar also
+matches immediately before the final character if it is a newline (but
+not before any other newlines). This option is ignored if
+#G_REGEX_MULTILINE is set.
+@G_REGEX_UNGREEDY: Inverts the "greediness" of the
+quantifiers so that they are not greedy by default, but become greedy
+if followed by "?". It can also be set by a "(?U)" option setting within
+the pattern.
+@G_REGEX_RAW: Usually strings must be valid UTF-8 strings, using this
+flag they are considered as a raw sequence of bytes.
+@G_REGEX_NO_AUTO_CAPTURE: Disables the use of numbered capturing
+parentheses in the pattern. Any opening parenthesis that is not followed
+by "?" behaves as if it were followed by "?:" but named parentheses can
+still be used for capturing (and they acquire numbers in the usual way).
+@G_REGEX_OPTIMIZE: Optimize the regular expression. If the pattern will
+be used many times, then it may be worth the effort to optimize it to
+improve the speed of matches.
+@G_REGEX_DUPNAMES: Names used to identify capturing subpatterns need not
+be unique. This can be helpful for certain types of pattern when it is known
+that only one instance of the named subpattern can ever be matched.
+@G_REGEX_NEWLINE_CR: Usually any newline character is recognized, if this
+option is set, the only recognized newline character is '\r'.
+@G_REGEX_NEWLINE_LF: Usually any newline character is recognized, if this
+option is set, the only recognized newline character is '\n'.
+@G_REGEX_NEWLINE_CRLF: Usually any newline character is recognized, if this
+option is set, the only recognized newline character sequence is '\r\n'.
+@Since: 2.14
+
+<!-- ##### ENUM GRegexMatchFlags ##### -->
+<para>
+Flags specifying match-time options.
+</para>
+
+@G_REGEX_MATCH_ANCHORED: The pattern is forced to be "anchored", that is,
+it is constrained to match only at the first matching point in the string
+that is being searched. This effect can also be achieved by appropriate
+constructs in the pattern itself such as the "^" metacharater.
+@G_REGEX_MATCH_NOTBOL: Specifies that first character of the string is
+not the beginning of a line, so the circumflex metacharacter should not
+match before it. Setting this without G_REGEX_MULTILINE (at compile time)
+causes circumflex never to match. This option affects only the behaviour of
+the circumflex metacharacter, it does not affect "\A".
+@G_REGEX_MATCH_NOTEOL: Specifies that the end of the subject string is
+not the end of a line, so the dollar metacharacter should not match it nor
+(except in multiline mode) a newline immediately before it. Setting this
+without G_REGEX_MULTILINE (at compile time) causes dollar never to match.
+This option affects only the behaviour of the dollar metacharacter, it does
+not affect "\Z" or "\z".
+@G_REGEX_MATCH_NOTEMPTY: An empty string is not considered to be a valid
+match if this option is set. If there are alternatives in the pattern, they
+are tried. If all the alternatives match the empty string, the entire match
+fails. For example, if the pattern "a?b?" is applied to a string not beginning
+with "a" or "b", it matches the empty string at the start of the string.
+With this flag set, this match is not valid, so GRegex searches further
+into the string for occurrences of "a" or "b".
+@G_REGEX_MATCH_PARTIAL: Turns on the partial matching feature, for more
+documentation on partial matching see g_regex_is_partial_match().
+@G_REGEX_MATCH_NEWLINE_CR: Overrides the newline definition set when creating
+a new #GRegex, setting the '\r' character as line terminator.
+@G_REGEX_MATCH_NEWLINE_LF: Overrides the newline definition set when creating
+a new #GRegex, setting the '\n' character as line terminator.
+@G_REGEX_MATCH_NEWLINE_CRLF: Overrides the newline definition set when creating
+a new #GRegex, setting the '\r\n' characters as line terminator.
+@G_REGEX_MATCH_NEWLINE_ANY: Overrides the newline definition set when creating
+a new #GRegex, any newline character or character sequence is recognized.
+@Since: 2.14
+
+<!-- ##### STRUCT GRegex ##### -->
+<para>
+A GRegex is the "compiled" form of a regular expression pattern. This
+structure is opaque and its fields cannot be accessed directly.
+</para>
+
+@Since: 2.14
+
+<!-- ##### USER_FUNCTION GRegexEvalCallback ##### -->
+<para>
+Specifies the type of the function passed to g_regex_replace_eval().
+It is called for each occurance of the pattern in the string passed
+to g_regex_replace_eval(), and it should append the replacement to
+@result.
+</para>
+
+@match_info:
+@result:
+@user_data:
+@Returns: %FALSE to continue the replacement process, %TRUE to stop it
+@Since: 2.14
+<!-- # Unused Parameters # -->
+@Param1: the #GMatchInfo generated by the match. Use g_match_info_get_regex()
+and g_match_info_get_string() if you need the #GRegex or the matched
+string.
+@Param2: a #GString containing the new string
+@Param3: user data passed to g_regex_replace_eval()
+
+
+<!-- ##### FUNCTION g_regex_new ##### -->
+<para>
+
+</para>
+
+@pattern:
+@compile_options:
+@match_options:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_ref ##### -->
+<para>
+
+</para>
+
+@regex:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_unref ##### -->
+<para>
+
+</para>
+
+@regex:
+
+
+<!-- ##### FUNCTION g_regex_get_pattern ##### -->
+<para>
+
+</para>
+
+@regex:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_get_max_backref ##### -->
+<para>
+
+</para>
+
+@regex:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_get_capture_count ##### -->
+<para>
+
+</para>
+
+@regex:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_get_string_number ##### -->
+<para>
+
+</para>
+
+@regex:
+@name:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_escape_string ##### -->
+<para>
+
+</para>
+
+@string:
+@length:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_match_simple ##### -->
+<para>
+
+</para>
+
+@pattern:
+@string:
+@compile_options:
+@match_options:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_match ##### -->
+<para>
+
+</para>
+
+@regex:
+@string:
+@match_options:
+@match_info:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_match_full ##### -->
+<para>
+
+</para>
+
+@regex:
+@string:
+@string_len:
+@start_position:
+@match_options:
+@match_info:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_match_all ##### -->
+<para>
+
+</para>
+
+@regex:
+@string:
+@match_options:
+@match_info:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_match_all_full ##### -->
+<para>
+
+</para>
+
+@regex:
+@string:
+@string_len:
+@start_position:
+@match_options:
+@match_info:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_split_simple ##### -->
+<para>
+
+</para>
+
+@pattern:
+@string:
+@compile_options:
+@match_options:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_split ##### -->
+<para>
+
+</para>
+
+@regex:
+@string:
+@match_options:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_split_full ##### -->
+<para>
+
+</para>
+
+@regex:
+@string:
+@string_len:
+@start_position:
+@match_options:
+@max_tokens:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_replace ##### -->
+<para>
+
+</para>
+
+@regex:
+@string:
+@string_len:
+@start_position:
+@replacement:
+@match_options:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_replace_literal ##### -->
+<para>
+
+</para>
+
+@regex:
+@string:
+@string_len:
+@start_position:
+@replacement:
+@match_options:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_replace_eval ##### -->
+<para>
+
+</para>
+
+@regex:
+@string:
+@string_len:
+@start_position:
+@match_options:
+@eval:
+@user_data:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_regex_check_replacement ##### -->
+<para>
+
+</para>
+
+@replacement:
+@has_references:
+@error:
+@Returns:
+
+
+<!-- ##### STRUCT GMatchInfo ##### -->
+<para>
+#GMatchInfo is used to retrieve information about the regular expression match
+which created it.
+This structure is opaque and its fields cannot be accessed directly.
+</para>
+
+@Since: 2.14
+
+<!-- ##### FUNCTION g_match_info_get_regex ##### -->
+<para>
+
+</para>
+
+@match_info:
+@Returns:
+
+
+<!-- ##### FUNCTION g_match_info_get_string ##### -->
+<para>
+
+</para>
+
+@match_info:
+@Returns:
+
+
+<!-- ##### FUNCTION g_match_info_free ##### -->
+<para>
+
+</para>
+
+@match_info:
+
+
+<!-- ##### FUNCTION g_match_info_matches ##### -->
+<para>
+
+</para>
+
+@match_info:
+@Returns:
+
+
+<!-- ##### FUNCTION g_match_info_next ##### -->
+<para>
+
+</para>
+
+@match_info:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_match_info_get_match_count ##### -->
+<para>
+
+</para>
+
+@match_info:
+@Returns:
+
+
+<!-- ##### FUNCTION g_match_info_is_partial_match ##### -->
+<para>
+
+</para>
+
+@match_info:
+@Returns:
+
+
+<!-- ##### FUNCTION g_match_info_expand_references ##### -->
+<para>
+
+</para>
+
+@match_info:
+@string_to_expand:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_match_info_fetch ##### -->
+<para>
+
+</para>
+
+@match_info:
+@match_num:
+@Returns:
+
+
+<!-- ##### FUNCTION g_match_info_fetch_pos ##### -->
+<para>
+
+</para>
+
+@match_info:
+@match_num:
+@start_pos:
+@end_pos:
+@Returns:
+
+
+<!-- ##### FUNCTION g_match_info_fetch_named ##### -->
+<para>
+
+</para>
+
+@match_info:
+@name:
+@Returns:
+
+
+<!-- ##### FUNCTION g_match_info_fetch_named_pos ##### -->
+<para>
+
+</para>
+
+@match_info:
+@name:
+@start_pos:
+@end_pos:
+@Returns:
+
+
+<!-- ##### FUNCTION g_match_info_fetch_all ##### -->
+<para>
+
+</para>
+
+@match_info:
+@Returns:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/hash_tables.sgml b/trunk/docs/reference/glib/tmpl/hash_tables.sgml
new file mode 100644
index 000000000..67d72eb4b
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/hash_tables.sgml
@@ -0,0 +1,395 @@
+<!-- ##### SECTION Title ##### -->
+Hash Tables
+
+<!-- ##### SECTION Short_Description ##### -->
+associations between keys and values so that given a key the value
+can be found quickly.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+A #GHashTable provides associations between keys and values which
+is optimized so that given a key, the associated value can be found
+very quickly.
+</para>
+<para>
+Note that neither keys nor values are copied when inserted into the
+#GHashTable, so they must exist for the lifetime of the #GHashTable.
+This means that the use of static strings is OK, but temporary
+strings (i.e. those created in buffers and those returned by GTK+ widgets)
+should be copied with g_strdup() before being inserted.
+</para>
+<para>
+If keys or values are dynamically allocated, you must be careful to ensure
+that they are freed when they are removed from the #GHashTable, and also
+when they are overwritten by new insertions into the #GHashTable.
+It is also not advisable to mix static strings and dynamically-allocated
+strings in a #GHashTable, because it then becomes difficult to determine
+whether the string should be freed.
+</para>
+<para>
+To create a #GHashTable, use g_hash_table_new().
+</para>
+<para>
+To insert a key and value into a #GHashTable, use g_hash_table_insert().
+</para>
+<para>
+To lookup a value corresponding to a given key, use g_hash_table_lookup()
+and g_hash_table_lookup_extended().
+</para>
+<para>
+To remove a key and value, use g_hash_table_remove().
+</para>
+<para>
+To call a function for each key and value pair use g_hash_table_foreach().
+</para>
+<para>
+To destroy a #GHashTable use g_hash_table_destroy().
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GHashTable ##### -->
+<para>
+The <structname>GHashTable</structname> struct is an opaque data structure to represent a
+<link linkend="glib-Hash-Tables">Hash Table</link>.
+It should only be accessed via the following functions.
+</para>
+
+
+<!-- ##### FUNCTION g_hash_table_new ##### -->
+<para>
+
+</para>
+
+@hash_func:
+@key_equal_func:
+@Returns:
+
+
+<!-- ##### FUNCTION g_hash_table_new_full ##### -->
+<para>
+
+</para>
+
+@hash_func:
+@key_equal_func:
+@key_destroy_func:
+@value_destroy_func:
+@Returns:
+
+
+<!-- ##### USER_FUNCTION GHashFunc ##### -->
+<para>
+Specifies the type of the hash function which is passed to
+g_hash_table_new() when a #GHashTable is created.
+</para>
+<para>
+The function is passed a key and should return a #guint hash value.
+The functions g_direct_hash(), g_int_hash() and g_str_hash() provide
+hash functions which can be used when the key is a #gpointer, #gint, and
+#gchar* respectively.
+</para>
+<para>
+FIXME: Need more here.
+The hash values should be evenly distributed over a fairly large range?
+The modulus is taken with the hash table size (a prime number)
+to find the 'bucket' to place each key into.
+The function should also be very fast, since it is called for each key
+lookup.
+</para>
+
+@key: a key.
+@Returns: the hash value corresponding to the key.
+
+
+<!-- ##### USER_FUNCTION GEqualFunc ##### -->
+<para>
+Specifies the type of a function used to test two values for
+equality. The function should return %TRUE if both values are equal and
+%FALSE otherwise.
+</para>
+
+@a: a value.
+@b: a value to compare with.
+@Returns: %TRUE if @a = @b; %FALSE otherwise.
+
+
+<!-- ##### FUNCTION g_hash_table_insert ##### -->
+<para>
+
+</para>
+
+@hash_table:
+@key:
+@value:
+
+
+<!-- ##### FUNCTION g_hash_table_replace ##### -->
+<para>
+
+</para>
+
+@hash_table:
+@key:
+@value:
+
+
+<!-- ##### FUNCTION g_hash_table_size ##### -->
+<para>
+
+</para>
+
+@hash_table:
+@Returns:
+
+
+<!-- ##### FUNCTION g_hash_table_lookup ##### -->
+<para>
+
+</para>
+
+@hash_table:
+@key:
+@Returns:
+
+
+<!-- ##### FUNCTION g_hash_table_lookup_extended ##### -->
+<para>
+
+</para>
+
+@hash_table:
+@lookup_key:
+@orig_key:
+@value:
+@Returns:
+
+
+<!-- ##### FUNCTION g_hash_table_foreach ##### -->
+<para>
+
+</para>
+
+@hash_table:
+@func:
+@user_data:
+
+
+<!-- ##### FUNCTION g_hash_table_find ##### -->
+<para>
+
+</para>
+
+@hash_table:
+@predicate:
+@user_data:
+@Returns:
+
+
+<!-- ##### USER_FUNCTION GHFunc ##### -->
+<para>
+Specifies the type of the function passed to g_hash_table_foreach().
+It is called with each key/value pair, together with the @user_data parameter
+which is passed to g_hash_table_foreach().
+</para>
+
+@key: a key.
+@value: the value corresponding to the key.
+@user_data: user data passed to g_hash_table_foreach().
+
+
+<!-- ##### FUNCTION g_hash_table_remove ##### -->
+<para>
+
+</para>
+
+@hash_table:
+@key:
+@Returns:
+
+
+<!-- ##### FUNCTION g_hash_table_steal ##### -->
+<para>
+
+</para>
+
+@hash_table:
+@key:
+@Returns:
+
+
+<!-- ##### FUNCTION g_hash_table_foreach_remove ##### -->
+<para>
+
+</para>
+
+@hash_table:
+@func:
+@user_data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_hash_table_foreach_steal ##### -->
+<para>
+
+</para>
+
+@hash_table:
+@func:
+@user_data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_hash_table_remove_all ##### -->
+<para>
+
+</para>
+
+@hash_table:
+
+
+<!-- ##### FUNCTION g_hash_table_steal_all ##### -->
+<para>
+
+</para>
+
+@hash_table:
+
+
+<!-- ##### FUNCTION g_hash_table_get_keys ##### -->
+<para>
+
+</para>
+
+@hash_table:
+@Returns:
+
+
+<!-- ##### FUNCTION g_hash_table_get_values ##### -->
+<para>
+
+</para>
+
+@hash_table:
+@Returns:
+
+
+<!-- ##### USER_FUNCTION GHRFunc ##### -->
+<para>
+Specifies the type of the function passed to g_hash_table_foreach_remove().
+It is called with each key/value pair, together with the @user_data parameter
+passed to g_hash_table_foreach_remove().
+It should return %TRUE if the key/value pair should be removed from the
+#GHashTable.
+</para>
+
+@key: a key.
+@value: the value associated with the key.
+@user_data: user data passed to g_hash_table_remove().
+@Returns: %TRUE if the key/value pair should be removed from the #GHashTable.
+
+
+<!-- ##### MACRO g_hash_table_freeze ##### -->
+<para>
+This function is deprecated and will be removed in the next major
+ release of GLib. It does nothing.
+</para>
+
+@hash_table: a #GHashTable
+
+
+<!-- ##### MACRO g_hash_table_thaw ##### -->
+<para>
+This function is deprecated and will be removed in the next major
+ release of GLib. It does nothing.
+</para>
+
+@hash_table: a #GHashTable
+
+
+<!-- ##### FUNCTION g_hash_table_destroy ##### -->
+<para>
+
+</para>
+
+@hash_table:
+
+
+<!-- ##### FUNCTION g_hash_table_ref ##### -->
+<para>
+
+</para>
+
+@hash_table:
+@Returns:
+
+
+<!-- ##### FUNCTION g_hash_table_unref ##### -->
+<para>
+
+</para>
+
+@hash_table:
+
+
+<!-- ##### FUNCTION g_direct_equal ##### -->
+<para>
+
+</para>
+
+@v1:
+@v2:
+@Returns:
+
+
+<!-- ##### FUNCTION g_direct_hash ##### -->
+<para>
+
+</para>
+
+@v:
+@Returns:
+
+
+<!-- ##### FUNCTION g_int_equal ##### -->
+<para>
+
+</para>
+
+@v1:
+@v2:
+@Returns:
+
+
+<!-- ##### FUNCTION g_int_hash ##### -->
+<para>
+
+</para>
+
+@v:
+@Returns:
+
+
+<!-- ##### FUNCTION g_str_equal ##### -->
+<para>
+</para>
+
+@v1:
+@v2:
+@Returns:
+
+
+<!-- ##### FUNCTION g_str_hash ##### -->
+<para>
+</para>
+
+@v:
+@Returns:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/hooks.sgml b/trunk/docs/reference/glib/tmpl/hooks.sgml
new file mode 100644
index 000000000..a2e658769
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/hooks.sgml
@@ -0,0 +1,467 @@
+<!-- ##### SECTION Title ##### -->
+Hook Functions
+
+<!-- ##### SECTION Short_Description ##### -->
+support for manipulating lists of hook functions.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The #GHookList, #GHook and their related functions provide support for
+lists of hook functions. Functions can be added and removed from the lists,
+and the list of hook functions can be invoked.
+
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GHookList ##### -->
+<para>
+The <structname>GHookList</structname> struct represents a
+list of hook functions.
+</para>
+
+@seq_id: the next free #GHook id.
+@hook_size: the size of the #GHookList elements, in bytes.
+@is_setup: 1 if the #GHookList has been initialized.
+@hooks: the first #GHook element in the list.
+@dummy3:
+@finalize_hook: the function to call to finalize a #GHook element. The
+default behaviour is to call the hooks <function>destroy</function> function.
+@dummy:
+
+<!-- ##### USER_FUNCTION GHookFinalizeFunc ##### -->
+<para>
+Defines the type of function to be called when a hook in a
+list of hooks gets finalized.
+</para>
+
+@hook_list: a #GHookList.
+@hook: the hook in @hook_list that gets finalized.
+
+
+<!-- ##### STRUCT GHook ##### -->
+<para>
+The <structname>GHook</structname> struct represents a single hook
+function in a #GHookList.
+</para>
+
+@data: data which is passed to func when this hook is invoked.
+@next: pointer to the next hook in the list.
+@prev: pointer to the previous hook in the list.
+@ref_count: the reference count of this hook.
+@hook_id: the id of this hook, which is unique within its list.
+@flags: flags which are set for this hook. See #GHookFlagMask for
+predefined flags.
+@func: the function to call when this hook is invoked. The possible
+signatures for this function are #GHookFunc and #GHookCheckFunc.
+@destroy: the default <function>finalize_hook</function> function of a
+#GHookList calls this member of the hook that is being finalized.
+
+<!-- ##### USER_FUNCTION GHookFunc ##### -->
+<para>
+Defines the type of a hook function that can be invoked
+by g_hook_list_invoke().
+</para>
+
+@data: the data field of the #GHook is passed to the hook function here.
+
+
+<!-- ##### USER_FUNCTION GHookCheckFunc ##### -->
+<para>
+Defines the type of a hook function that can be invoked
+by g_hook_list_invoke_check().
+</para>
+
+@data: the data field of the #GHook is passed to the hook function here.
+@Returns: %FALSE if the #GHook should be destroyed.
+
+
+<!-- ##### FUNCTION g_hook_list_init ##### -->
+<para>
+Initializes a #GHookList.
+This must be called before the #GHookList is used.
+</para>
+
+@hook_list: a #GHookList.
+@hook_size: the size of each element in the #GHookList, typically
+<literal>sizeof (GHook)</literal>.
+
+
+<!-- ##### FUNCTION g_hook_list_invoke ##### -->
+<para>
+Calls all of the #GHook functions in a #GHookList.
+</para>
+
+@hook_list: a #GHookList.
+@may_recurse: %TRUE if functions which are already running (e.g. in another
+thread) can be called. If set to %FALSE, these are skipped.
+
+
+<!-- ##### FUNCTION g_hook_list_invoke_check ##### -->
+<para>
+Calls all of the #GHook functions in a #GHookList.
+Any function which returns %TRUE is removed from the #GHookList.
+</para>
+
+@hook_list: a #GHookList.
+@may_recurse: %TRUE if functions which are already running (e.g. in another
+thread) can be called. If set to %FALSE, these are skipped.
+
+
+<!-- ##### FUNCTION g_hook_list_marshal ##### -->
+<para>
+Calls a function on each valid #GHook.
+</para>
+
+@hook_list: a #GHookList.
+@may_recurse: %TRUE if hooks which are currently running (e.g. in another
+thread) are considered valid. If set to %FALSE, these are skipped.
+@marshaller: the function to call for each #GHook.
+@marshal_data: data to pass to @marshaller.
+
+
+<!-- ##### USER_FUNCTION GHookMarshaller ##### -->
+<para>
+Defines the type of function used by g_hook_list_marshal().
+</para>
+
+@hook: a #GHook.
+@marshal_data: user data.
+
+
+<!-- ##### FUNCTION g_hook_list_marshal_check ##### -->
+<para>
+Calls a function on each valid #GHook and destroys it if the
+function returns %FALSE.
+</para>
+
+@hook_list: a #GHookList.
+@may_recurse: %TRUE if hooks which are currently running (e.g. in another
+thread) are considered valid. If set to %FALSE, these are skipped.
+@marshaller: the function to call for each #GHook.
+@marshal_data: data to pass to @marshaller.
+
+
+<!-- ##### USER_FUNCTION GHookCheckMarshaller ##### -->
+<para>
+Defines the type of function used by g_hook_list_marshal_check().
+</para>
+
+@hook: a #GHook.
+@marshal_data: user data.
+@Returns: %FALSE if @hook should be destroyed.
+
+
+<!-- ##### FUNCTION g_hook_list_clear ##### -->
+<para>
+Removes all the #GHook elements from a #GHookList.
+</para>
+
+@hook_list: a #GHookList.
+
+
+<!-- ##### FUNCTION g_hook_alloc ##### -->
+<para>
+Allocates space for a #GHook and initializes it.
+</para>
+
+@hook_list: a #GHookList.
+@Returns: a new #GHook.
+
+
+<!-- ##### MACRO g_hook_append ##### -->
+<para>
+Appends a #GHook onto the end of a #GHookList.
+</para>
+
+@hook_list: a #GHookList.
+@hook: the #GHook to add to the end of @hook_list.
+
+
+<!-- ##### FUNCTION g_hook_prepend ##### -->
+<para>
+Prepends a #GHook on the start of a #GHookList.
+</para>
+
+@hook_list: a #GHookList.
+@hook: the #GHook to add to the start of @hook_list.
+
+
+<!-- ##### FUNCTION g_hook_insert_before ##### -->
+<para>
+Inserts a #GHook into a #GHookList, before a given #GHook.
+</para>
+
+@hook_list: a #GHookList.
+@sibling: the #GHook to insert the new #GHook before.
+@hook: the #GHook to insert.
+
+
+<!-- ##### FUNCTION g_hook_insert_sorted ##### -->
+<para>
+Inserts a #GHook into a #GHookList, sorted by the given function.
+</para>
+
+@hook_list: a #GHookList.
+@hook: the #GHook to insert.
+@func: the comparison function used to sort the #GHook elements.
+
+
+<!-- ##### USER_FUNCTION GHookCompareFunc ##### -->
+<para>
+Defines the type of function used to compare #GHook elements in
+g_hook_insert_sorted().
+</para>
+
+@new_hook: the #GHook being inserted.
+@sibling: the #GHook to compare with @new_hook.
+@Returns: a value &lt;= 0 if @new_hook should be before @sibling.
+
+
+<!-- ##### FUNCTION g_hook_compare_ids ##### -->
+<para>
+Compares the ids of two #GHook elements, returning a negative value
+if the second id is greater than the first.
+</para>
+
+@new_hook: a #GHook.
+@sibling: a #GHook to compare with @new_hook.
+@Returns: a value &lt;= 0 if the id of @sibling is >= the id of @new_hook.
+
+
+<!-- ##### FUNCTION g_hook_get ##### -->
+<para>
+Returns the #GHook with the given id, or %NULL if it is not found.
+</para>
+
+@hook_list: a #GHookList.
+@hook_id: a hook id.
+@Returns: the #GHook with the given id, or %NULL if it is not found.
+
+
+<!-- ##### FUNCTION g_hook_find ##### -->
+<para>
+Finds a #GHook in a #GHookList using the given function to test for a match.
+</para>
+
+@hook_list: a #GHookList.
+@need_valids: %TRUE if #GHook elements which have been destroyed should be
+skipped.
+@func: the function to call for each #GHook, which should return %TRUE when
+the #GHook has been found.
+@data: the data to pass to @func.
+@Returns: the found #GHook or %NULL if no matching #GHook is found.
+
+
+<!-- ##### USER_FUNCTION GHookFindFunc ##### -->
+<para>
+Defines the type of the function passed to g_hook_find().
+</para>
+
+@hook: a #GHook.
+@data: user data passed to g_hook_find_func().
+@Returns: %TRUE if the required #GHook has been found.
+
+
+<!-- ##### FUNCTION g_hook_find_data ##### -->
+<para>
+Finds a #GHook in a #GHookList with the given data.
+</para>
+
+@hook_list: a #GHookList.
+@need_valids: %TRUE if #GHook elements which have been destroyed should be
+skipped.
+@data: the data to find.
+@Returns: the #GHook with the given @data or %NULL if no matching
+#GHook is found.
+
+
+<!-- ##### FUNCTION g_hook_find_func ##### -->
+<para>
+Finds a #GHook in a #GHookList with the given function.
+</para>
+
+@hook_list: a #GHookList.
+@need_valids: %TRUE if #GHook elements which have been destroyed should be
+skipped.
+@func: the function to find.
+@Returns: the #GHook with the given @func or %NULL if no matching
+#GHook is found.
+
+
+<!-- ##### FUNCTION g_hook_find_func_data ##### -->
+<para>
+Finds a #GHook in a #GHookList with the given function and data.
+</para>
+
+@hook_list: a #GHookList.
+@need_valids: %TRUE if #GHook elements which have been destroyed should be
+skipped.
+@func: the function to find.
+@data: the data to find.
+@Returns: the #GHook with the given @func and @data or %NULL if no matching
+#GHook is found.
+
+
+<!-- ##### FUNCTION g_hook_first_valid ##### -->
+<para>
+Returns the first #GHook in a #GHookList which has not been destroyed.
+The reference count for the #GHook is incremented, so you must call
+g_hook_unref() to restore it when no longer needed. (Or call
+g_hook_next_valid() if you are stepping through the #GHookList.)
+</para>
+
+@hook_list: a #GHookList.
+@may_be_in_call: %TRUE if hooks which are currently running (e.g. in another
+thread) are considered valid. If set to %FALSE, these are skipped.
+@Returns: the first valid #GHook, or %NULL if none are valid.
+
+
+<!-- ##### FUNCTION g_hook_next_valid ##### -->
+<para>
+Returns the next #GHook in a #GHookList which has not been destroyed.
+The reference count for the #GHook is incremented, so you must call
+g_hook_unref() to restore it when no longer needed. (Or continue to call
+g_hook_next_valid() until %NULL is returned.)
+
+</para>
+
+@hook_list: a #GHookList.
+@hook: the current #GHook.
+@may_be_in_call: %TRUE if hooks which are currently running (e.g. in another
+thread) are considered valid. If set to %FALSE, these are skipped.
+@Returns: the next valid #GHook, or %NULL if none are valid.
+
+
+<!-- ##### ENUM GHookFlagMask ##### -->
+<para>
+Flags used internally in the #GHook implementation.
+</para>
+
+@G_HOOK_FLAG_ACTIVE: set if the hook has not been destroyed.
+@G_HOOK_FLAG_IN_CALL: set if the hook is currently being run.
+@G_HOOK_FLAG_MASK: A mask covering all bits reserved for
+ hook flags; see #G_HOOK_FLAGS_USER_SHIFT
+
+<!-- ##### MACRO G_HOOK_FLAGS ##### -->
+<para>
+Returns the flags of a hook.
+</para>
+
+@hook: a #GHook.
+
+
+<!-- ##### MACRO G_HOOK_FLAG_USER_SHIFT ##### -->
+<para>
+The position of the first bit which is not reserved for internal
+use be the #GHook implementation, i.e.
+<literal>1 &lt;&lt; G_HOOK_FLAG_USER_SHIFT</literal> is the first bit
+which can be used for application-defined flags.
+</para>
+
+
+
+<!-- ##### MACRO G_HOOK ##### -->
+<para>
+Casts a pointer to a <literal>GHook*</literal>.
+</para>
+
+@hook: a pointer.
+
+
+<!-- ##### MACRO G_HOOK_IS_VALID ##### -->
+<para>
+Returns %TRUE if the #GHook is valid, i.e. it is in a #GHookList, it is active
+and it has not been destroyed.
+</para>
+
+@hook: a #GHook.
+@Returns: %TRUE if the #GHook is valid.
+
+
+<!-- ##### MACRO G_HOOK_ACTIVE ##### -->
+<para>
+Returns %TRUE if the #GHook is active, which is normally %TRUE until the #GHook
+is destroyed.
+</para>
+
+@hook: a #GHook.
+@Returns: %TRUE if the #GHook is active.
+
+
+<!-- ##### MACRO G_HOOK_IN_CALL ##### -->
+<para>
+Returns %TRUE if the #GHook function is currently executing.
+</para>
+
+@hook: a #GHook.
+@Returns: %TRUE if the #GHook function is currently executing.
+
+
+<!-- ##### MACRO G_HOOK_IS_UNLINKED ##### -->
+<para>
+Returns %TRUE if the #GHook is not in a #GHookList.
+
+</para>
+
+@hook: a #GHook.
+@Returns: %TRUE if the #GHook is not in a #GHookList.
+
+
+<!-- ##### FUNCTION g_hook_ref ##### -->
+<para>
+Increments the reference count for a #GHook.
+</para>
+
+@hook_list: a #GHookList.
+@hook: the #GHook to increment the reference count of.
+@Returns: the @hook that was passed in (since 2.6)
+
+
+<!-- ##### FUNCTION g_hook_unref ##### -->
+<para>
+Decrements the reference count of a #GHook.
+If the reference count falls to 0, the #GHook is removed from the #GHookList
+and g_hook_free() is called to free it.
+</para>
+
+@hook_list: a #GHookList.
+@hook: the #GHook to unref.
+
+
+<!-- ##### FUNCTION g_hook_free ##### -->
+<para>
+Calls the #GHookList @hook_free function if it exists, and frees the memory
+allocated for the #GHook.
+</para>
+
+@hook_list: a #GHookList.
+@hook: the #GHook to free.
+
+
+<!-- ##### FUNCTION g_hook_destroy ##### -->
+<para>
+Destroys a #GHook, given its ID.
+</para>
+
+@hook_list: a #GHookList.
+@hook_id: a hook ID.
+@Returns: %TRUE if the #GHook was found in the #GHookList and destroyed.
+
+
+<!-- ##### FUNCTION g_hook_destroy_link ##### -->
+<para>
+Removes one #GHook from a #GHookList, marking it inactive and calling
+g_hook_unref() on it.
+</para>
+
+@hook_list: a #GHookList.
+@hook: the #GHook to remove.
+
+
diff --git a/trunk/docs/reference/glib/tmpl/i18n.sgml b/trunk/docs/reference/glib/tmpl/i18n.sgml
new file mode 100644
index 000000000..a2ba21419
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/i18n.sgml
@@ -0,0 +1,112 @@
+<!-- ##### SECTION Title ##### -->
+Internationalization
+
+<!-- ##### SECTION Short_Description ##### -->
+gettext support macros.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+GLib doesn't force any particular localization method upon its users.
+But since GLib itself is localized using the gettext() mechanism, it seems
+natural to offer the de-facto standard gettext() support macros in an
+easy-to-use form.
+</para>
+<para>
+In order to use these macros in an application, you must include
+<filename>glib/gi18n.h</filename>. For use in a library, must include
+<filename>glib/gi18n-lib.h</filename> <emphasis>after</emphasis> defining
+the GETTEXT_PACKAGE macro suitably for your library:
+<informalexample><programlisting>
+&num;define GETTEXT_PACKAGE "gtk20"
+&num;include &lt;glib/gi18n-lib.h&gt;
+</programlisting></informalexample>
+The gettext manual covers details of how to set up message extraction
+with xgettext.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+The gettext manual.
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO _ ##### -->
+<para>
+Marks a string for translation, gets replaced with the translated string
+at runtime.
+</para>
+
+@String: the string to be translated
+@Since: 2.4
+
+
+<!-- ##### MACRO Q_ ##### -->
+<para>
+Like _(), but applies g_strip_context() to the translation. This has the
+advantage that the string can be adorned with a prefix to guarantee
+uniqueness and provide context to the translator.
+</para>
+<para>
+One use case given in the gettext manual is GUI translation, where one could
+e.g. disambiguate two "Open" menu entries as "File|Open" and "Printer|Open".
+Another use case is the string "Russian" which may have to be translated
+differently depending on whether it's the name of a character set or a
+language. This could be solved by using "charset|Russian" and
+"language|Russian".
+</para>
+<note><para>
+If you are using the Q_() macro, you need to make sure that you
+pass <option>--keyword=Q_</option> to xgettext when extracting messages.
+</para></note>
+
+@String: the string to be translated, with a '|'-separated prefix which
+ must not be translated
+@Since: 2.4
+
+
+<!-- ##### MACRO N_ ##### -->
+<para>
+Marks a string for translation, gets replaced with the untranslated string
+at runtime. This is useful in situations where the translated strings can't
+be directly used, e.g. in string array initializers.
+</para>
+<informalexample><programlisting>
+ {
+ static const char *messages[] = {
+ N_("some very meaningful message"),
+ N_("and another one")
+ };
+ const char *string;
+ ...
+ string
+ = index &gt; 1 ? _("a default message") : gettext (messages[index]);
+<!-- -->
+ fputs (string);
+ ...
+ }
+</programlisting></informalexample>
+
+@String: the string to be translated
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_strip_context ##### -->
+<para>
+
+</para>
+
+@msgid:
+@msgval:
+@Returns:
+
+
+<!-- ##### FUNCTION g_get_language_names ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/iochannels.sgml b/trunk/docs/reference/glib/tmpl/iochannels.sgml
new file mode 100644
index 000000000..3fe9ea833
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/iochannels.sgml
@@ -0,0 +1,682 @@
+<!-- ##### SECTION Title ##### -->
+IO Channels
+
+<!-- ##### SECTION Short_Description ##### -->
+portable support for using files, pipes and sockets.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The #GIOChannel data type aims to provide a portable method for using file
+descriptors, pipes, and sockets, and integrating them into the
+<link linkend="glib-The-Main-Event-Loop">main event loop</link>.
+Currently full support is available on UNIX platforms, support for
+Windows is only partially complete.
+</para>
+<para>
+To create a new #GIOChannel on UNIX systems use g_io_channel_unix_new().
+This works for plain file descriptors, pipes and sockets.
+Alternatively, a channel can be created for a file in a system independent
+manner using g_io_channel_new_file().
+</para>
+<para>
+Once a #GIOChannel has been created, it can be used in a generic manner
+with the functions g_io_channel_read_chars(), g_io_channel_write_chars(),
+g_io_channel_seek_position(), and g_io_channel_shutdown().
+</para>
+<para>
+To add a #GIOChannel to the
+<link linkend="glib-The-Main-Event-Loop">main event loop</link>
+use g_io_add_watch() or g_io_add_watch_full(). Here you specify which events
+you are interested in on the #GIOChannel, and provide a function to be
+called whenever these events occur.
+</para>
+<para>
+#GIOChannel instances are created with an initial reference count of 1.
+g_io_channel_ref() and g_io_channel_unref() can be used to increment or
+decrement the reference count respectively. When the reference count falls
+to 0, the #GIOChannel is freed. (Though it isn't closed automatically,
+unless it was created using g_io_channel_new_from_file().)
+Using g_io_add_watch() or g_io_add_watch_full() increments a channel's
+reference count.
+</para>
+<para>
+The new functions g_io_channel_read_chars(), g_io_channel_read_line(),
+g_io_channel_read_line_string(), g_io_channel_read_to_end(),
+g_io_channel_write_chars(), g_io_channel_seek_position(),
+and g_io_channel_flush() should not be mixed with the
+deprecated functions g_io_channel_read(), g_io_channel_write(),
+and g_io_channel_seek() on the same channel.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+<variablelist>
+
+<varlistentry>
+<term>gtk_input_add_full(), gtk_input_remove(), gdk_input_add(),
+gdk_input_add_full(), gdk_input_remove()</term>
+<listitem><para>
+Convenience functions for creating #GIOChannel instances and adding them to the
+<link linkend="glib-The-Main-Event-Loop">main event loop</link>.
+</para></listitem>
+</varlistentry>
+
+</variablelist>
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GIOChannel ##### -->
+<para>
+A data structure representing an IO Channel. The fields should be considered
+private and should only be accessed with the following functions.
+</para>
+
+
+<!-- ##### FUNCTION g_io_channel_unix_new ##### -->
+<para>
+Creates a new #GIOChannel given a file descriptor.
+On UNIX systems this works for plain files, pipes, and sockets.
+</para>
+<para>
+The returned #GIOChannel has a reference count of 1.
+</para>
+<para>
+The default encoding for #GIOChannel is UTF-8. If your application
+is reading output from a command using via pipe, you may need to
+set the encoding to the encoding of the current locale (see
+g_get_charset()) with the g_io_channel_set_encoding() function.
+</para>
+<para>
+If you want to read raw binary data without interpretation, then
+call the g_io_channel_set_encoding() function with %NULL for the
+encoding argument.
+</para>
+<para>
+This function is available in GLib on Windows, too, but you should
+avoid using it on Windows. The domain of file descriptors and sockets
+overlap. There is no way for GLib to know which one you mean in case
+the argument you pass to this function happens to be both a valid file
+descriptor and socket. If that happens a warning is issued, and GLib
+assumes that it is the file descriptor you mean.
+</para>
+
+@fd: a file descriptor.
+@Returns: a new #GIOChannel.
+
+
+<!-- ##### FUNCTION g_io_channel_unix_get_fd ##### -->
+<para>
+Returns the file descriptor of the #GIOChannel.
+</para>
+<para>
+On Windows this function returns the file descriptor or socket of the #GIOChannel.
+</para>
+
+@channel: a #GIOChannel, created with g_io_channel_unix_new().
+@Returns: the file descriptor of the #GIOChannel.
+
+
+<!-- ##### FUNCTION g_io_channel_win32_new_fd ##### -->
+<para>
+Creates a new #GIOChannel given a file descriptor on Windows. This works for
+file descriptors from the C runtime.
+</para>
+<para>
+This function works for file descriptors as returned by the open(),
+creat(), pipe() and fileno() calls in the Microsoft C runtime. In
+order to meaningfully use this function your code should use the same
+C runtime as GLib uses, which is msvcrt.dll. Note that in current
+Microsoft compilers it is near impossible to convince it to build code
+that would use msvcrt.dll. The last Microsoft compiler version that
+supported using msvcrt.dll as the C runtime was version 6. The GNU
+compiler and toolchain for Windows, also known as Mingw, fully
+supports msvcrt.dll.
+</para>
+<para>
+If you have created a #GIOChannel for a file descriptor and started
+watching (polling) it, you shouldn't call read() on the file
+descriptor. This is because adding polling for a file descriptor is
+implemented in GLib on Windows 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().
+</para>
+<para>
+This function is available only in GLib on Windows.
+</para>
+
+@fd: a C library file descriptor.
+@Returns: a new #GIOChannel.
+
+
+<!-- ##### FUNCTION g_io_channel_win32_new_socket ##### -->
+<para>
+Creates a new #GIOChannel given a socket on Windows.
+</para>
+<para>
+This function works for sockets created by Winsock. It's available
+only in GLib on Windows.
+</para>
+<para>
+Polling a #GSource created to watch a channel for a socket puts the
+socket in non-blocking mode. This is a side-effect of the
+implementation and unavoidable.
+</para>
+
+@socket:
+@Returns: a new #GIOChannel.
+<!-- # Unused Parameters # -->
+@fd: a Winsock socket.
+
+
+<!-- ##### FUNCTION g_io_channel_win32_new_messages ##### -->
+<para>
+Creates a new #GIOChannel given a window handle on Windows.
+</para>
+<para>
+This function creates a #GIOChannel that can be used to poll for
+Windows messages for the window in question.
+</para>
+
+@hwnd: a window handle.
+@Returns: a new #GIOChannel.
+
+
+<!-- ##### FUNCTION g_io_channel_init ##### -->
+<para>
+Initializes a #GIOChannel struct. This is called by each of the above functions
+when creating a #GIOChannel, and so is not often needed by the application
+programmer (unless you are creating a new type of #GIOChannel).
+</para>
+
+@channel: a #GIOChannel.
+
+
+<!-- ##### FUNCTION g_io_channel_new_file ##### -->
+<para>
+</para>
+
+@filename:
+@mode:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_read_chars ##### -->
+<para>
+
+</para>
+
+@channel:
+@buf:
+@count:
+@bytes_read:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_read_unichar ##### -->
+<para>
+
+</para>
+
+@channel:
+@thechar:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_read_line ##### -->
+<para>
+
+</para>
+
+@channel:
+@str_return:
+@length:
+@terminator_pos:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_read_line_string ##### -->
+<para>
+
+</para>
+
+@channel:
+@buffer:
+@terminator_pos:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_read_to_end ##### -->
+<para>
+
+</para>
+
+@channel:
+@str_return:
+@length:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_write_chars ##### -->
+<para>
+
+</para>
+
+@channel:
+@buf:
+@count:
+@bytes_written:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_write_unichar ##### -->
+<para>
+
+</para>
+
+@channel:
+@thechar:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_flush ##### -->
+<para>
+
+</para>
+
+@channel:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_seek_position ##### -->
+<para>
+
+</para>
+
+@channel:
+@offset:
+@type:
+@error:
+@Returns:
+
+
+<!-- ##### ENUM GSeekType ##### -->
+<para>
+An enumeration specifying the base position for a g_io_channel_seek_position()
+operation.
+</para>
+
+@G_SEEK_CUR: the current position in the file.
+@G_SEEK_SET: the start of the file.
+@G_SEEK_END: the end of the file.
+
+<!-- ##### FUNCTION g_io_channel_shutdown ##### -->
+<para>
+
+</para>
+
+@channel:
+@flush:
+@err:
+@Returns:
+
+
+<!-- ##### ENUM GIOStatus ##### -->
+<para>
+Stati returned by most of the #GIOFuncs functions.
+</para>
+
+@G_IO_STATUS_ERROR: An error occurred.
+@G_IO_STATUS_NORMAL: Success.
+@G_IO_STATUS_EOF: End of file.
+@G_IO_STATUS_AGAIN: Resource temporarily unavailable.
+
+<!-- ##### ENUM GIOChannelError ##### -->
+<para>
+Error codes returned by #GIOChannel operations.
+</para>
+
+@G_IO_CHANNEL_ERROR_FBIG: File too large.
+@G_IO_CHANNEL_ERROR_INVAL: Invalid argument.
+@G_IO_CHANNEL_ERROR_IO: IO error.
+@G_IO_CHANNEL_ERROR_ISDIR: File is a directory.
+@G_IO_CHANNEL_ERROR_NOSPC: No space left on device.
+@G_IO_CHANNEL_ERROR_NXIO: No such device or address.
+@G_IO_CHANNEL_ERROR_OVERFLOW: Value too large for defined datatype.
+@G_IO_CHANNEL_ERROR_PIPE: Broken pipe.
+@G_IO_CHANNEL_ERROR_FAILED: Some other error.
+
+<!-- ##### MACRO G_IO_CHANNEL_ERROR ##### -->
+<para>
+Error domain for #GIOChannel operations. Errors in this domain will
+be from the #GIOChannelError enumeration. See #GError for information on
+error domains.
+</para>
+
+
+
+<!-- ##### FUNCTION g_io_channel_error_from_errno ##### -->
+<para>
+
+</para>
+
+@en:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_ref ##### -->
+<para>
+Increments the reference count of a #GIOChannel.
+</para>
+
+@channel: a #GIOChannel.
+@Returns: the @channel that was passed in (since 2.6)
+
+
+<!-- ##### FUNCTION g_io_channel_unref ##### -->
+<para>
+Decrements the reference count of a #GIOChannel.
+</para>
+
+@channel: a #GIOChannel.
+
+
+<!-- ##### FUNCTION g_io_create_watch ##### -->
+<para>
+Creates a #GSource that's dispatched when @condition is met for the given
+@channel. For example, if condition is #G_IO_IN, the source will be dispatched
+when there's data available for reading. g_io_add_watch() is a simpler
+interface to this same functionality, for the case where you want to add the
+source to the default main loop at the default priority.
+</para>
+<para>
+On Windows, polling a #GSource created to watch a channel for a socket
+puts the socket in non-blocking mode. This is a side-effect of the
+implementation and unavoidable.
+</para>
+
+@channel: a #GIOChannel to watch
+@condition: conditions to watch for
+@Returns: a new #GSource
+
+
+<!-- ##### FUNCTION g_io_add_watch ##### -->
+<para>
+Adds the #GIOChannel into the
+<link linkend="glib-The-Main-Event-Loop">main event loop</link>
+with the default priority.
+</para>
+
+@channel: a #GIOChannel.
+@condition: the condition to watch for.
+@func: the function to call when the condition is satisfied.
+@user_data: user data to pass to @func.
+@Returns: the event source id.
+
+
+<!-- ##### FUNCTION g_io_add_watch_full ##### -->
+<para>
+Adds the #GIOChannel into the
+<link linkend="glib-The-Main-Event-Loop">main event loop</link>
+with the given priority.
+</para>
+
+@channel: a #GIOChannel.
+@priority: the priority of the #GIOChannel source.
+@condition: the condition to watch for.
+@func: the function to call when the condition is satisfied.
+@user_data: user data to pass to @func.
+@notify: the function to call when the source is removed.
+@Returns: the event source id.
+
+
+<!-- ##### ENUM GIOCondition ##### -->
+<para>
+A bitwise combination representing a condition to watch for on an event
+source.
+</para>
+
+@G_IO_IN: There is data to read.
+@G_IO_OUT: Data can be written (without blocking).
+@G_IO_PRI: There is urgent data to read.
+@G_IO_ERR: Error condition.
+@G_IO_HUP: Hung up (the connection has been broken, usually for pipes
+ and sockets).
+@G_IO_NVAL: Invalid request. The file descriptor is not open.
+
+<!-- ##### USER_FUNCTION GIOFunc ##### -->
+<para>
+Specifies the type of function passed to g_io_add_watch() or
+g_io_add_watch_full(), which is called when the requested condition on a
+#GIOChannel is satisfied.
+</para>
+
+@source: the #GIOChannel event source.
+@condition: the condition which has been satisfied.
+@data: user data set in g_io_add_watch() or g_io_add_watch_full().
+@Returns: the function should return %FALSE if the event source should be
+removed.
+
+
+<!-- ##### STRUCT GIOFuncs ##### -->
+<para>
+A table of functions used to handle different types of #GIOChannel in a
+generic way.
+</para>
+
+@io_read:
+@io_write:
+@io_seek:
+@io_close:
+@io_create_watch:
+@io_free:
+@io_set_flags:
+@io_get_flags:
+
+<!-- ##### FUNCTION g_io_channel_get_buffer_size ##### -->
+<para>
+
+</para>
+
+@channel:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_set_buffer_size ##### -->
+<para>
+
+</para>
+
+@channel:
+@size:
+
+
+<!-- ##### FUNCTION g_io_channel_get_buffer_condition ##### -->
+<para>
+
+</para>
+
+@channel:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_get_flags ##### -->
+<para>
+
+</para>
+
+@channel:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_set_flags ##### -->
+<para>
+
+</para>
+
+@channel:
+@flags:
+@error:
+@Returns:
+
+
+<!-- ##### ENUM GIOFlags ##### -->
+<para>
+Specifies properties of a #GIOChannel. Some of the flags can only
+be read with g_io_channel_get_flags(), but not changed with
+g_io_channel_set_flags().
+</para>
+
+@G_IO_FLAG_APPEND: turns on append mode, corresponds to %O_APPEND (see the
+ documentation of the UNIX <function>open()</function> syscall).
+@G_IO_FLAG_NONBLOCK: turns on nonblocking mode, corresponds to
+ %O_NONBLOCK/%O_NDELAY (see the documentation of the UNIX
+ <function>open()</function> syscall).
+@G_IO_FLAG_IS_READABLE: indicates that the io channel is readable. This flag
+ can not be changed.
+@G_IO_FLAG_IS_WRITEABLE: indicates that the io channel is writable. This flag
+ can not be changed.
+@G_IO_FLAG_IS_SEEKABLE: indicates that the io channel is seekable, i.e. that
+ g_io_channel_seek_position() can be used on it. This flag can not be changed.
+@G_IO_FLAG_MASK:
+@G_IO_FLAG_GET_MASK:
+@G_IO_FLAG_SET_MASK:
+
+<!-- ##### FUNCTION g_io_channel_get_line_term ##### -->
+<para>
+
+</para>
+
+@channel:
+@length:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_set_line_term ##### -->
+<para>
+
+</para>
+
+@channel:
+@line_term:
+@length:
+
+
+<!-- ##### FUNCTION g_io_channel_get_buffered ##### -->
+<para>
+
+</para>
+
+@channel:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_set_buffered ##### -->
+<para>
+
+</para>
+
+@channel:
+@buffered:
+
+
+<!-- ##### FUNCTION g_io_channel_get_encoding ##### -->
+<para>
+
+</para>
+
+@channel:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_set_encoding ##### -->
+<para>
+
+</para>
+
+@channel:
+@encoding:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_get_close_on_unref ##### -->
+<para>
+
+</para>
+
+@channel:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_set_close_on_unref ##### -->
+<para>
+
+</para>
+
+@channel:
+@do_close:
+
+
+<!-- ##### FUNCTION g_io_channel_read ##### -->
+<para>
+</para>
+
+@channel:
+@buf:
+@count:
+@bytes_read:
+@Returns:
+
+
+<!-- ##### ENUM GIOError ##### -->
+<para>
+#GIOError is only used by the deprecated functions g_io_channel_read(),
+g_io_channel_write(), and g_io_channel_seek().
+</para>
+
+@G_IO_ERROR_NONE: no error
+@G_IO_ERROR_AGAIN: an EAGAIN error occurred
+@G_IO_ERROR_INVAL: an EINVAL error occurred
+@G_IO_ERROR_UNKNOWN: another error occurred
+
+<!-- ##### FUNCTION g_io_channel_write ##### -->
+<para>
+</para>
+
+@channel:
+@buf:
+@count:
+@bytes_written:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_seek ##### -->
+<para>
+</para>
+
+@channel:
+@offset:
+@type.
+@type:
+@Returns:
+
+
+<!-- ##### FUNCTION g_io_channel_close ##### -->
+<para>
+</para>
+
+@channel:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/keyfile.sgml b/trunk/docs/reference/glib/tmpl/keyfile.sgml
new file mode 100644
index 000000000..4f34c8a38
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/keyfile.sgml
@@ -0,0 +1,863 @@
+<!-- ##### SECTION Title ##### -->
+Key-value file parser
+
+<!-- ##### SECTION Short_Description ##### -->
+parses <filename>.ini</filename>-like config files
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+#GKeyFile lets you parse, edit or create files containing groups of
+key-value pairs, which we call <firstterm>key files</firstterm> for
+lack of a better name. Several freedesktop.org specifications use
+key files now, e.g the
+<ulink url="http://freedesktop.org/Standards/desktop-entry-spec">Desktop
+Entry Specification</ulink> and the
+<ulink url="http://freedesktop.org/Standards/icon-theme-spec">Icon
+Theme Specification</ulink>.
+</para>
+
+<para>
+The syntax of key files is described in detail in the
+<ulink url="http://freedesktop.org/Standards/desktop-entry-spec">Desktop
+Entry Specification</ulink>, here is a quick summary: Key files
+consists of groups of key-value pairs, interspersed with comments.
+</para>
+
+<informalexample><programlisting>
+# this is just an example
+# there can be comments before the first group
+
+[First Group]
+
+Name=Key File Example\tthis value shows\nescaping
+
+# localized strings are stored in multiple key-value pairs
+Welcome=Hello
+Welcome[de]=Hallo
+Welcome[fr]=Bonjour
+Welcome[it]=Ciao
+
+[Another Group]
+
+Numbers=2;20;-200;0
+
+Booleans=true;false;true;true
+
+</programlisting></informalexample>
+
+<para>
+Lines beginning with a '#' and blank lines are considered comments.
+</para>
+
+<para>
+Groups are started by a header line containing the group name enclosed
+in '[' and ']', and ended implicitly by the start of the next group or
+the end of the file. Each key-value pair must be contained in a group.
+</para>
+
+<para>
+Key-value pairs generally have the form <literal>key=value</literal>,
+with the exception of localized strings, which have the form
+<literal>key[locale]=value</literal>. Space before and after the
+'=' character are ignored. Newline, tab, carriage return and backslash
+characters in value are escaped as \n, \t, \r, and \\, respectively.
+To preserve leading spaces in values, these can also be escaped as \s.
+</para>
+
+<para>
+Key files can store strings (possibly with localized variants), integers,
+booleans and lists of these. Lists are separated by a separator character,
+typically ';' or ','. To use the list separator character in a value in
+a list, it has to be escaped by prefixing it with a backslash.
+</para>
+
+<para>
+This syntax is obviously inspired by the <filename>.ini</filename>
+files commonly met on Windows, but there are some important differences:
+<itemizedlist>
+<listitem><para>
+<filename>.ini</filename> files use the ';' character to begin comments,
+ key files use the '#' character.
+</para></listitem>
+<listitem><para>
+Key files allow only comments before the first group.
+</para></listitem>
+<listitem><para>
+Key files are always encoded in UTF-8.
+</para></listitem>
+<listitem><para>
+Key and Group names are case-sensitive, for example a group called
+<literal>[GROUP]</literal> is a different group from <literal>[group]</literal>.
+</para></listitem>
+</itemizedlist>
+</para>
+
+<para>
+Note that in contrast to the
+<ulink url="http://freedesktop.org/Standards/desktop-entry-spec">Desktop
+Entry Specification</ulink>, groups in key files may contain the same
+key multiple times; the last entry wins. Key files may also contain
+multiple groups with the same name; they are merged together.
+Another difference is that keys and group names in key files are not
+restricted to ASCII characters.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GKeyFile ##### -->
+<para>
+The <structname>GKeyFile</structname> struct contains only private fields
+and should not be used directly.
+</para>
+
+
+<!-- ##### MACRO G_KEY_FILE_ERROR ##### -->
+<para>
+Error domain for key file parsing. Errors in this domain will
+be from the #GKeyFileError enumeration. See #GError for information on
+error domains.
+</para>
+
+
+
+<!-- ##### ENUM GKeyFileError ##### -->
+<para>
+Error codes returned by key file parsing.
+</para>
+
+@G_KEY_FILE_ERROR_UNKNOWN_ENCODING: the text being parsed was in an unknown encoding
+@G_KEY_FILE_ERROR_PARSE: document was ill-formed
+@G_KEY_FILE_ERROR_NOT_FOUND: the file was not found
+@G_KEY_FILE_ERROR_KEY_NOT_FOUND: a requested key was not found
+@G_KEY_FILE_ERROR_GROUP_NOT_FOUND: a requested group was not found
+@G_KEY_FILE_ERROR_INVALID_VALUE: a value could not be parsed
+
+<!-- ##### ENUM GKeyFileFlags ##### -->
+<para>
+Flags which influence the parsing.
+</para>
+
+@G_KEY_FILE_NONE: No flags, default behaviour
+@G_KEY_FILE_KEEP_COMMENTS: Use this flag if you plan to write the (possibly modified)
+ contents of the key file back to a file; otherwise all comments will be lost when
+ the key file is written back.
+@G_KEY_FILE_KEEP_TRANSLATIONS: Use this flag if you plan to write the (possibly modified)
+ contents of the key file back to a file; otherwise only the translations for the current
+ language will be written back.
+
+<!-- ##### FUNCTION g_key_file_new ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_free ##### -->
+<para>
+
+</para>
+
+@key_file:
+
+
+<!-- ##### FUNCTION g_key_file_set_list_separator ##### -->
+<para>
+
+</para>
+
+@key_file:
+@separator:
+
+
+<!-- ##### FUNCTION g_key_file_load_from_file ##### -->
+<para>
+
+</para>
+
+@key_file:
+@file:
+@flags:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_load_from_data ##### -->
+<para>
+
+</para>
+
+@key_file:
+@data:
+@length:
+@flags:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_load_from_data_dirs ##### -->
+<para>
+
+</para>
+
+@key_file:
+@file:
+@full_path:
+@flags:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_to_data ##### -->
+<para>
+
+</para>
+
+@key_file:
+@length:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_get_start_group ##### -->
+<para>
+
+</para>
+
+@key_file:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_get_groups ##### -->
+<para>
+
+</para>
+
+@key_file:
+@length:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_get_keys ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@length:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_has_group ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_has_key ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_get_value ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_get_string ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_get_locale_string ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@locale:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_get_boolean ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_get_integer ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_get_double ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_get_string_list ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@length:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_get_locale_string_list ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@locale:
+@length:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_get_boolean_list ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@length:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_get_integer_list ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@length:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_get_double_list ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@length:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_get_comment ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_key_file_set_value ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@value:
+
+
+<!-- ##### FUNCTION g_key_file_set_string ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@string:
+
+
+<!-- ##### FUNCTION g_key_file_set_locale_string ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@locale:
+@string:
+
+
+<!-- ##### FUNCTION g_key_file_set_boolean ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@value:
+
+
+<!-- ##### FUNCTION g_key_file_set_integer ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@value:
+
+
+<!-- ##### FUNCTION g_key_file_set_double ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@value:
+
+
+<!-- ##### FUNCTION g_key_file_set_string_list ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@list:
+@length:
+
+
+<!-- ##### FUNCTION g_key_file_set_locale_string_list ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@locale:
+@list:
+@length:
+
+
+<!-- ##### FUNCTION g_key_file_set_boolean_list ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@list:
+@length:
+
+
+<!-- ##### FUNCTION g_key_file_set_integer_list ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@list:
+@length:
+
+
+<!-- ##### FUNCTION g_key_file_set_double_list ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@list:
+@length:
+
+
+<!-- ##### FUNCTION g_key_file_set_comment ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@comment:
+@error:
+
+
+<!-- ##### FUNCTION g_key_file_remove_group ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@error:
+
+
+<!-- ##### FUNCTION g_key_file_remove_key ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@error:
+
+
+<!-- ##### FUNCTION g_key_file_remove_comment ##### -->
+<para>
+
+</para>
+
+@key_file:
+@group_name:
+@key:
+@error:
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_GROUP ##### -->
+<para>
+The name of the main group of a desktop entry file, as defined in the
+<ulink url="http://freedesktop.org/Standards/desktop-entry-spec">Desktop
+Entry Specification</ulink>. Consult the specification for more
+details about the meanings of the keys below.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_TYPE ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a string giving the type of the desktop entry. Usually
+<link linkend="G-KEY-FILE-DESKTOP-TYPE-APPLICATION:CAPS"><literal>G_KEY_FILE_DESKTOP_TYPE_APPLICATION</literal></link>,
+<link linkend="G-KEY-FILE-DESKTOP-TYPE-LINK:CAPS"><literal>G_KEY_FILE_DESKTOP_TYPE_LINK</literal></link>, or
+<link linkend="G-KEY-FILE-DESKTOP-TYPE-DIRECTORY:CAPS"><literal>G_KEY_FILE_DESKTOP_TYPE_DIRECTORY</literal></link>.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_VERSION ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a string giving the version of the Desktop
+Entry Specification used for the desktop entry file.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_NAME ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a localized string giving the specific name of the
+desktop entry.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_GENERIC_NAME ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a localized string giving the generic name of the
+desktop entry.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a boolean stating whether the desktop entry should be
+shown in menus.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_COMMENT ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a localized string giving the tooltip for the desktop
+entry.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_ICON ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a localized string giving the name of the icon to be
+displayed for the desktop entry.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_HIDDEN ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a boolean stating whether the desktop entry has been
+deleted by the user.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a list of strings identifying the environments that
+should display the desktop entry.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a list of strings identifying the environments that
+should not display the desktop entry.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_TRY_EXEC ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a string giving the file name of a binary on disk
+used to determine if the program is actually installed. It is only
+valid for desktop entries with the <literal>Application</literal>
+type.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_EXEC ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a string giving the command line to execute. It is only
+valid for desktop entries with the <literal>Application</literal>
+type.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_PATH ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a string containing the working directory to run the
+program in. It is only valid for desktop entries with the
+<literal>Application</literal> type.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_TERMINAL ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a boolean stating whether the program should be
+run in a terminal window. It is only valid for desktop entries with
+the <literal>Application</literal> type.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_MIME_TYPE ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a list of strings giving the MIME types supported
+by this desktop entry.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_CATEGORIES ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a list of strings giving the categories in which the
+desktop entry should be shown in a menu.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a boolean stating whether the application supports
+the <ulink
+url="http://www.freedesktop.org/Standards/startup-notification-spec">Startup
+Notification Protocol Specification</ulink>.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is string identifying the WM class or name hint of a
+window that the application will create, which can be used to emulate
+Startup Notification with older applications.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_KEY_URL ##### -->
+<para>
+A key under <link
+linkend="G-KEY-FILE-DESKTOP-GROUP:CAPS"><literal>G_KEY_FILE_DESKTOP_GROUP</literal></link>
+whose value is a string giving the URL to access. It is only valid
+for desktop entries with the <literal>Link</literal> type.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_TYPE_APPLICATION ##### -->
+<para>
+The value of the <link
+linkend="G-KEY-FILE-DESKTOP-KEY-TYPE:CAPS"><literal>G_KEY_FILE_DESKTOP_KEY_TYPE</literal></link>
+key for desktop entries representing applications.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_TYPE_LINK ##### -->
+<para>
+The value of the <link
+linkend="G-KEY-FILE-DESKTOP-KEY-TYPE:CAPS"><literal>G_KEY_FILE_DESKTOP_KEY_TYPE</literal></link>
+key for desktop entries representing links to documents.
+</para>
+
+@Since: 2.14
+
+
+<!-- ##### MACRO G_KEY_FILE_DESKTOP_TYPE_DIRECTORY ##### -->
+<para>
+The value of the <link
+linkend="G-KEY-FILE-DESKTOP-KEY-TYPE:CAPS"><literal>G_KEY_FILE_DESKTOP_KEY_TYPE</literal></link>
+key for desktop entries representing directories.
+</para>
+
+@Since: 2.14
+
+
diff --git a/trunk/docs/reference/glib/tmpl/limits.sgml b/trunk/docs/reference/glib/tmpl/limits.sgml
new file mode 100644
index 000000000..038b5b404
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/limits.sgml
@@ -0,0 +1,220 @@
+<!-- ##### SECTION Title ##### -->
+Limits of Basic Types
+
+<!-- ##### SECTION Short_Description ##### -->
+portable method of determining the limits of the standard types.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+These macros provide a portable method to determine the limits of some of
+the standard integer and floating point types.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO G_MININT ##### -->
+<para>
+The minimum value which can be held in a #gint.
+</para>
+
+
+
+<!-- ##### MACRO G_MAXINT ##### -->
+<para>
+The maximum value which can be held in a #gint.
+</para>
+
+
+
+<!-- ##### MACRO G_MAXUINT ##### -->
+<para>
+The maximum value which can be held in a #guint.
+</para>
+
+
+
+<!-- ##### MACRO G_MINSHORT ##### -->
+<para>
+The minimum value which can be held in a #gshort.
+</para>
+
+
+
+<!-- ##### MACRO G_MAXSHORT ##### -->
+<para>
+The maximum value which can be held in a #gshort.
+</para>
+
+
+
+<!-- ##### MACRO G_MAXUSHORT ##### -->
+<para>
+The maximum value which can be held in a #gushort.
+</para>
+
+
+
+<!-- ##### MACRO G_MINLONG ##### -->
+<para>
+The minimum value which can be held in a #glong.
+</para>
+
+
+
+<!-- ##### MACRO G_MAXLONG ##### -->
+<para>
+The maximum value which can be held in a #glong.
+</para>
+
+
+
+<!-- ##### MACRO G_MAXULONG ##### -->
+<para>
+The maximum value which can be held in a #gulong.
+</para>
+
+
+
+<!-- ##### MACRO G_MININT8 ##### -->
+<para>
+The minimum value which can be held in a #gint8.
+</para>
+
+@Since: 2.4
+
+
+<!-- ##### MACRO G_MAXINT8 ##### -->
+<para>
+The maximum value which can be held in a #gint8.
+</para>
+
+@Since: 2.4
+
+
+<!-- ##### MACRO G_MAXUINT8 ##### -->
+<para>
+The maximum value which can be held in a #guint8.
+</para>
+
+@Since: 2.4
+
+
+<!-- ##### MACRO G_MININT16 ##### -->
+<para>
+The minimum value which can be held in a #gint16.
+</para>
+
+@Since: 2.4
+
+
+<!-- ##### MACRO G_MAXINT16 ##### -->
+<para>
+The maximum value which can be held in a #gint16.
+</para>
+
+@Since: 2.4
+
+
+<!-- ##### MACRO G_MAXUINT16 ##### -->
+<para>
+The maximum value which can be held in a #guint16.
+</para>
+
+@Since: 2.4
+
+
+<!-- ##### MACRO G_MININT32 ##### -->
+<para>
+The minimum value which can be held in a #gint32.
+</para>
+
+@Since: 2.4
+
+
+<!-- ##### MACRO G_MAXINT32 ##### -->
+<para>
+The maximum value which can be held in a #gint32.
+</para>
+
+@Since: 2.4
+
+
+<!-- ##### MACRO G_MAXUINT32 ##### -->
+<para>
+The maximum value which can be held in a #guint32.
+</para>
+
+@Since: 2.4
+
+
+<!-- ##### MACRO G_MININT64 ##### -->
+<para>
+The minimum value which can be held in a #gint64.
+</para>
+
+
+
+<!-- ##### MACRO G_MAXINT64 ##### -->
+<para>
+The maximum value which can be held in a #gint64.
+</para>
+
+
+
+<!-- ##### MACRO G_MAXUINT64 ##### -->
+<para>
+The maximum value which can be held in a #guint64.
+</para>
+
+
+
+<!-- ##### MACRO G_MAXSIZE ##### -->
+<para>
+The maximum value which can be held in a #gsize.
+</para>
+
+@Since: 2.4
+
+
+<!-- ##### MACRO G_MINFLOAT ##### -->
+<para>
+The minimum positive value which can be held in a #gfloat.
+</para>
+<para>
+If you are interested in the smallest value which can be held in a #gfloat,
+use -G_MAX_FLOAT.
+</para>
+
+
+
+<!-- ##### MACRO G_MAXFLOAT ##### -->
+<para>
+The maximum value which can be held in a #gfloat.
+</para>
+
+
+
+<!-- ##### MACRO G_MINDOUBLE ##### -->
+<para>
+The minimum positive value which can be held in a #gdouble.
+</para>
+<para>
+If you are interested in the smallest value which can be held in a #gdouble,
+use -G_MAXDOUBLE.
+</para>
+
+
+
+<!-- ##### MACRO G_MAXDOUBLE ##### -->
+<para>
+The maximum value which can be held in a #gdouble.
+</para>
+
+
+
diff --git a/trunk/docs/reference/glib/tmpl/linked_lists_double.sgml b/trunk/docs/reference/glib/tmpl/linked_lists_double.sgml
new file mode 100644
index 000000000..b83025e5d
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/linked_lists_double.sgml
@@ -0,0 +1,544 @@
+<!-- ##### SECTION Title ##### -->
+Doubly-Linked Lists
+
+<!-- ##### SECTION Short_Description ##### -->
+linked lists containing integer values or pointers to data, with the ability
+to iterate over the list in both directions.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The #GList structure and its associated functions provide a standard
+doubly-linked list data structure.
+</para>
+<para>
+Each element in the list contains a piece of data, together with pointers
+which link to the previous and next elements in the list.
+Using these pointers it is possible to move through the list in both
+directions (unlike the
+<link linkend="glib-Singly-Linked-lists">Singly-Linked Lists</link>
+which only allows movement through the list in the forward direction).
+</para>
+<para>
+The data contained in each element can be either integer values, by using one
+of the
+<link linkend="glib-Type-Conversion-Macros">Type Conversion Macros</link>,
+or simply pointers to any type of data.
+</para>
+<para>
+List elements are allocated from the <link linkend="glib-Memory-Slices">slice
+allocator</link>, which is more efficient than allocating elements
+individually.
+</para>
+<para>
+Note that most of the #GList functions expect to be passed a pointer to
+the first element in the list. The functions which insert elements return
+the new start of the list, which may have changed.
+</para>
+<para>
+There is no function to create a #GList. %NULL is considered to be the empty
+list so you simply set a #GList* to %NULL.
+</para>
+<para>
+To add elements, use g_list_append(), g_list_prepend(), g_list_insert()
+and g_list_insert_sorted().
+</para>
+<para>
+To remove elements, use g_list_remove().
+</para>
+<para>
+To find elements in the list use g_list_first(), g_list_last(), g_list_next(),
+g_list_previous(), g_list_nth(), g_list_nth_data(), g_list_find() and
+g_list_find_custom().
+</para>
+<para>
+To find the index of an element use g_list_position() and g_list_index().
+</para>
+<para>
+To call a function for each element in the list use g_list_foreach().
+</para>
+<para>
+To free the entire list, use g_list_free().
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GList ##### -->
+<para>
+The #GList struct is used for each element in a doubly-linked list.
+</para>
+
+@data: holds the element's data, which can be a pointer to any kind of data,
+ or any integer value using the
+ <link linkend="glib-Type-Conversion-Macros">Type Conversion Macros</link>.
+@next: contains the link to the next element in the list.
+@prev: contains the link to the previous element in the list.
+
+<!-- ##### FUNCTION g_list_append ##### -->
+<para>
+Adds a new element on to the end of the list.
+</para>
+<note>
+<para>
+The return value is the new start of the list, which may have changed, so
+make sure you store the new value.
+</para>
+</note>
+<note>
+<para>
+Note that g_list_append() has to traverse the entire list to find the end,
+which is inefficient when adding multiple elements. A common idiom to
+avoid the inefficiency is to prepend the elements and reverse the list
+when all elements have been added.
+</para>
+</note>
+<informalexample><programlisting>
+ /* Notice that these are initialized to the empty list. */
+ GList *list = NULL, *number_list = NULL;
+
+ /* This is a list of strings. */
+ list = g_list_append (list, "first");
+ list = g_list_append (list, "second");
+
+ /* This is a list of integers. */
+ number_list = g_list_append (number_list, GINT_TO_POINTER (27));
+ number_list = g_list_append (number_list, GINT_TO_POINTER (14));
+</programlisting></informalexample>
+
+@list: a pointer to a #GList.
+@data: the data for the new element.
+@Returns: the new start of the #GList.
+
+
+<!-- ##### FUNCTION g_list_prepend ##### -->
+<para>
+Adds a new element on to the start of the list.
+</para>
+<note>
+<para>
+The return value is the new start of the list, which may have changed, so
+make sure you store the new value.
+</para>
+</note>
+<informalexample><programlisting>
+ /* Notice that it is initialized to the empty list. */
+ GList *list = NULL;
+ list = g_list_prepend (list, "last");
+ list = g_list_prepend (list, "first");
+</programlisting></informalexample>
+
+@list: a pointer to a #GList.
+@data: the data for the new element.
+@Returns: the new start of the #GList.
+
+
+<!-- ##### FUNCTION g_list_insert ##### -->
+<para>
+Inserts a new element into the list at the given position.
+</para>
+
+@list: a pointer to a #GList.
+@data: the data for the new element.
+@position: the position to insert the element. If this is negative, or is
+larger than the number of elements in the list, the new element is added on
+to the end of the list.
+@Returns: the new start of the #GList.
+
+
+<!-- ##### FUNCTION g_list_insert_before ##### -->
+<para>
+Inserts a new element into the list before the given position.
+</para>
+
+@list: a pointer to a #GList.
+@sibling: the list element before which the new element is inserted
+ or %NULL to insert at the end of the list.
+@data: the data for the new element.
+@Returns: the new start of the #GList.
+
+
+<!-- ##### FUNCTION g_list_insert_sorted ##### -->
+<para>
+Inserts a new element into the list, using the given comparison function
+to determine its position.
+</para>
+
+@list: a pointer to a #GList.
+@data: the data for the new element.
+@func: the function to compare elements in the list. It should return a
+number > 0 if the first parameter comes after the second parameter in
+the sort order.
+@Returns: the new start of the #GList.
+
+
+<!-- ##### FUNCTION g_list_remove ##### -->
+<para>
+Removes an element from a #GList.
+If two elements contain the same data, only the first is removed.
+If none of the elements contain the data, the #GList is unchanged.
+</para>
+
+@list: a #GList.
+@data: the data of the element to remove.
+@Returns: the new start of the #GList.
+
+
+<!-- ##### FUNCTION g_list_remove_link ##### -->
+<para>
+Removes an element from a #GList, without freeing the element.
+The removed element's prev and next links are set to %NULL, so that it becomes a
+self-contained list with one element.
+</para>
+
+@list: a #GList.
+@llink: an element in the #GList.
+@Returns: the new start of the #GList, without the element.
+
+
+<!-- ##### FUNCTION g_list_delete_link ##### -->
+<para>
+Deletes the node @link_ from @list.
+</para>
+
+@list: a #GList.
+@link_: node to delete from @list.
+@Returns: the new head of @list.
+
+
+<!-- ##### FUNCTION g_list_remove_all ##### -->
+<para>
+Removes all list nodes with data equal to @data. Returns the new
+head of the list. Contrast with g_list_remove() which removes only
+the first node matching the given data.
+</para>
+
+@list: a #GList.
+@data: data to remove.
+@Returns: new head of @list.
+
+
+<!-- ##### FUNCTION g_list_free ##### -->
+<para>
+Frees all of the memory used by a #GList.
+The freed elements are returned to the slice allocator.
+</para>
+<note>
+<para>
+If list elements contain dynamically-allocated memory, they should be freed
+first.
+</para>
+</note>
+
+@list: a #GList.
+
+
+<!-- ##### FUNCTION g_list_alloc ##### -->
+<para>
+Allocates space for one #GList element.
+It is called by g_list_append(), g_list_prepend(), g_list_insert() and
+g_list_insert_sorted() and so is rarely used on its own.
+</para>
+
+@Returns: a pointer to the newly-allocated #GList element.
+
+
+<!-- ##### FUNCTION g_list_free_1 ##### -->
+<para>
+Frees one #GList element.
+It is usually used after g_list_remove_link().
+</para>
+
+@list: a #GList element.
+
+
+<!-- ##### MACRO g_list_free1 ##### -->
+<para>
+Another name for g_list_free_1().
+</para>
+
+
+
+<!-- ##### FUNCTION g_list_length ##### -->
+<para>
+Gets the number of elements in a #GList.
+</para>
+
+@list: a #GList.
+@Returns: the number of elements in the #GList.
+
+
+<!-- ##### FUNCTION g_list_copy ##### -->
+<para>
+Copies a #GList.
+</para>
+<para>
+Note that this is a "shallow" copy. If the list elements consist of pointers
+to data, the pointers are copied but the actual data isn't.
+</para>
+
+@list: a #GList.
+@Returns: a copy of @list.
+
+
+<!-- ##### FUNCTION g_list_reverse ##### -->
+<para>
+Reverses a #GList.
+It simply switches the next and prev pointers of each element.
+</para>
+
+@list: a #GList.
+@Returns: the start of the reversed #GList.
+
+
+<!-- ##### FUNCTION g_list_sort ##### -->
+<para>
+Sorts a #GList using the given comparison function.
+</para>
+
+@list: a #GList.
+@compare_func: the comparison function used to sort the #GList.
+This function is passed the data from 2 elements of the #GList and should
+return 0 if they are equal, a negative value if the first element
+comes before the second, or a positive value if the first element
+comes after the second.
+@Returns: the start of the sorted #GList.
+
+
+<!-- ##### USER_FUNCTION GCompareFunc ##### -->
+<para>
+Specifies the type of a comparison function used to compare two
+values. The function should return a negative integer if the first
+value comes before the second, 0 if they are equal, or a positive
+integer if the first value comes after the second.
+</para>
+
+@a: a value.
+@b: a value to compare with.
+@Returns: negative value if @a &lt; @b; zero if @a = @b; positive value
+if @a > @b.
+
+
+<!-- ##### FUNCTION g_list_insert_sorted_with_data ##### -->
+<para>
+Inserts a new element into the list, using the given comparison function
+to determine its position.
+</para>
+
+@list: a pointer to a #GList.
+@data: the data for the new element.
+@func: the function to compare elements in the list. It should return a
+number > 0 if the first parameter comes after the second parameter in
+the sort order.
+@user_data: user data to pass to comparison function.
+@Returns: the new start of the #GList.
+@Since 2.10
+
+
+<!-- ##### FUNCTION g_list_sort_with_data ##### -->
+<para>
+Like g_list_sort(), but the comparison function accepts a user data argument.
+</para>
+
+@list: a #GList.
+@compare_func: comparison function.
+@user_data: user data to pass to comparison function.
+@Returns: the new head of @list.
+
+
+<!-- ##### USER_FUNCTION GCompareDataFunc ##### -->
+<para>
+Specifies the type of a comparison function used to compare two
+values. The function should return a negative integer if the first
+value comes before the second, 0 if they are equal, or a positive
+integer if the first value comes after the second.
+</para>
+
+@a: a value.
+@b: a value to compare with.
+@user_data: user data to pass to comparison function.
+@Returns: negative value if @a &lt; @b; zero if @a = @b; positive value
+if @a > @b.
+
+
+<!-- ##### FUNCTION g_list_concat ##### -->
+<para>
+Adds the second #GList onto the end of the first #GList.
+Note that the elements of the second #GList are not copied.
+They are used directly.
+</para>
+
+@list1: a #GList.
+@list2: the #GList to add to the end of the first #GList.
+@Returns: the start of the new #GList.
+
+
+<!-- ##### FUNCTION g_list_foreach ##### -->
+<para>
+Calls a function for each element of a #GList.
+</para>
+
+@list: a #GList.
+@func: the function to call with each element's data.
+@user_data: user data to pass to the function.
+
+
+<!-- ##### USER_FUNCTION GFunc ##### -->
+<para>
+Specifies the type of functions passed to g_list_foreach() and
+g_slist_foreach().
+</para>
+
+@data: the element's data.
+@user_data: user data passed to g_list_foreach() or g_slist_foreach().
+
+
+<!-- ##### FUNCTION g_list_first ##### -->
+<para>
+Gets the first element in a #GList.
+</para>
+
+@list: a #GList.
+@Returns: the first element in a #GList, or %NULL if the #GList has no elements.
+
+
+<!-- ##### FUNCTION g_list_last ##### -->
+<para>
+Gets the last element in a #GList.
+</para>
+
+@list: a #GList.
+@Returns: the last element in the #GList, or %NULL if the #GList has no
+elements.
+
+
+<!-- ##### MACRO g_list_previous ##### -->
+<para>
+A convenience macro to gets the previous element in a #GList.
+</para>
+
+@list: an element in a #GList.
+@Returns: the previous element, or %NULL if there are no previous elements.
+
+
+<!-- ##### MACRO g_list_next ##### -->
+<para>
+A convenience macro to gets the next element in a #GList.
+</para>
+
+@list: an element in a #GList.
+@Returns: the next element, or %NULL if there are no more elements.
+
+
+<!-- ##### FUNCTION g_list_nth ##### -->
+<para>
+Gets the element at the given position in a #GList.
+</para>
+
+@list: a #GList.
+@n: the position of the element, counting from 0.
+@Returns: the element, or %NULL if the position is off the end of the #GList.
+
+
+<!-- ##### FUNCTION g_list_nth_data ##### -->
+<para>
+Gets the data of the element at the given position.
+</para>
+
+@list: a #GList.
+@n: the position of the element.
+@Returns: the element's data, or %NULL if the position is off the end of the
+#GList.
+
+
+<!-- ##### FUNCTION g_list_nth_prev ##### -->
+<para>
+Gets the element @n places before @list.
+</para>
+
+@list: a #GList.
+@n: the position of the element, counting from 0.
+@Returns: the element, or %NULL if the position is off the end of the #GList.
+
+
+<!-- ##### FUNCTION g_list_find ##### -->
+<para>
+Finds the element in a #GList which contains the given data.
+</para>
+
+@list: a #GList.
+@data: the element data to find.
+@Returns: the found #GList element, or %NULL if it is not found.
+
+
+<!-- ##### FUNCTION g_list_find_custom ##### -->
+<para>
+Finds an element in a #GList, using a supplied function to find the desired
+element.
+It iterates over the list, calling the given function which should return 0
+when the desired element is found.
+The function takes two #gconstpointer arguments, the #GList element's data as
+the first argument and the given user data.
+</para>
+
+@list: a #GList.
+@data: user data passed to the function.
+@func: the function to call for each element. It should return 0 when the
+desired element is found.
+@Returns: the found #GList element, or %NULL if it is not found.
+
+
+<!-- ##### FUNCTION g_list_position ##### -->
+<para>
+Gets the position of the given element in the #GList (starting from 0).
+</para>
+
+@list: a #GList.
+@llink: an element in the #GList.
+@Returns: the position of the element in the #GList, or -1 if the element is
+not found.
+
+
+<!-- ##### FUNCTION g_list_index ##### -->
+<para>
+Gets the position of the element containing the given data (starting from 0).
+</para>
+
+@list: a #GList.
+@data: the data to find.
+@Returns: the index of the element containing the data, or -1 if the data
+is not found.
+
+
+<!-- ##### FUNCTION g_list_push_allocator ##### -->
+<para>
+Sets the allocator to use to allocate #GList elements.
+Use g_list_pop_allocator() to restore the previous allocator.
+</para>
+<para>
+Note that this function is not available if GLib has been compiled
+with <option>--disable-mem-pools</option>
+</para>
+
+@allocator: the #GAllocator to use when allocating #GList elements.
+@Deprecated: 2.10: It does nothing, since #GList has been
+converted to the <link linkend="glib-Memory-Slices">slice allocator</link>
+
+
+<!-- ##### FUNCTION g_list_pop_allocator ##### -->
+<para>
+Restores the previous #GAllocator, used when allocating #GList elements.
+</para>
+<para>
+Note that this function is not available if GLib has been compiled
+with <option>--disable-mem-pools</option>
+</para>
+
+@Deprecated: 2.10: It does nothing, since #GList has been
+converted to the <link linkend="glib-Memory-Slices">slice allocator</link>
+
+
diff --git a/trunk/docs/reference/glib/tmpl/linked_lists_single.sgml b/trunk/docs/reference/glib/tmpl/linked_lists_single.sgml
new file mode 100644
index 000000000..ec56c08c9
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/linked_lists_single.sgml
@@ -0,0 +1,469 @@
+<!-- ##### SECTION Title ##### -->
+Singly-Linked Lists
+
+<!-- ##### SECTION Short_Description ##### -->
+linked lists containing integer values or pointers to data, limited to
+iterating over the list in one direction.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The #GSList structure and its associated functions provide a standard
+singly-linked list data structure.
+</para>
+<para>
+Each element in the list contains a piece of data, together with a pointer
+which links to the next element in the list.
+Using this pointer it is possible to move through the list in one
+direction only (unlike the
+<link linkend="glib-Doubly-Linked-lists">Doubly-Linked Lists</link>
+which allow movement in both directions).
+</para>
+<para>
+The data contained in each element can be either integer values, by using one
+of the
+<link linkend="glib-Type-Conversion-Macros">Type Conversion Macros</link>,
+or simply pointers to any type of data.
+</para>
+<para>
+List elements are allocated from the <link linkend="glib-Memory-Slices">slice
+allocator</link>, which is more efficient than allocating elements
+individually.
+</para>
+<para>
+Note that most of the #GSList functions expect to be passed a pointer to
+the first element in the list. The functions which insert elements return
+the new start of the list, which may have changed.
+</para>
+<para>
+There is no function to create a #GSList. %NULL is considered to be the empty
+list so you simply set a #GSList* to %NULL.
+</para>
+<para>
+To add elements, use g_slist_append(), g_slist_prepend(), g_slist_insert()
+and g_slist_insert_sorted().
+</para>
+<para>
+To remove elements, use g_slist_remove().
+</para>
+<para>
+To find elements in the list use g_slist_last(), g_slist_next(),
+g_slist_nth(), g_slist_nth_data(), g_slist_find() and
+g_slist_find_custom().
+</para>
+<para>
+To find the index of an element use g_slist_position() and g_slist_index().
+</para>
+<para>
+To call a function for each element in the list use g_slist_foreach().
+</para>
+<para>
+To free the entire list, use g_slist_free().
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GSList ##### -->
+<para>
+The #GSList struct is used for each element in the singly-linked list.
+</para>
+
+@data: holds the element's data, which can be a pointer to any kind of data,
+ or any integer value using the
+ <link linkend="glib-Type-Conversion-Macros">Type Conversion Macros</link>.
+@next: contains the link to the next element in the list.
+
+<!-- ##### FUNCTION g_slist_alloc ##### -->
+<para>
+Allocates space for one #GSList element.
+It is called by the g_slist_append(), g_slist_prepend(), g_slist_insert() and
+g_slist_insert_sorted() functions and so is rarely used on its own.
+</para>
+
+@Returns: a pointer to the newly-allocated #GSList element.
+
+
+<!-- ##### FUNCTION g_slist_append ##### -->
+<para>
+Adds a new element on to the end of the list.
+</para>
+<note>
+<para>
+The return value is the new start of the list, which may have changed, so
+make sure you store the new value.
+</para>
+</note>
+<note>
+<para>
+Note that g_slist_append() has to traverse the entire list to find the end,
+which is inefficient when adding multiple elements. A common idiom to
+avoid the inefficiency is to prepend the elements and reverse the list
+when all elements have been added.
+</para>
+</note>
+<informalexample><programlisting>
+ /* Notice that these are initialized to the empty list. */
+ GSList *list = NULL, *number_list = NULL;
+
+ /* This is a list of strings. */
+ list = g_slist_append (list, "first");
+ list = g_slist_append (list, "second");
+
+ /* This is a list of integers. */
+ number_list = g_slist_append (number_list, GINT_TO_POINTER (27));
+ number_list = g_slist_append (number_list, GINT_TO_POINTER (14));
+</programlisting></informalexample>
+
+@list: a #GSList.
+@data: the data for the new element.
+@Returns: the new start of the #GSList.
+
+
+<!-- ##### FUNCTION g_slist_prepend ##### -->
+<para>
+Adds a new element on to the start of the list.
+</para>
+<note>
+<para>
+The return value is the new start of the list, which may have changed, so
+make sure you store the new value.
+</para>
+</note>
+<informalexample><programlisting>
+ /* Notice that it is initialized to the empty list. */
+ GSList *list = NULL;
+ list = g_slist_prepend (list, "last");
+ list = g_slist_prepend (list, "first");
+</programlisting></informalexample>
+
+@list: a #GSList.
+@data: the data for the new element.
+@Returns: the new start of the #GSList.
+
+
+<!-- ##### FUNCTION g_slist_insert ##### -->
+<para>
+Inserts a new element into the list at the given position.
+</para>
+
+@list: a #GSList.
+@data: the data for the new element.
+@position: the position to insert the element. If this is negative, or is
+larger than the number of elements in the list, the new element is added on
+to the end of the list.
+@Returns: the new start of the #GSList.
+
+
+<!-- ##### FUNCTION g_slist_insert_before ##### -->
+<para>
+Inserts a node before @sibling containing @data. Returns the new head of the list.
+</para>
+
+@slist: a #GSList.
+@sibling: node to insert @data before.
+@data: data to put in the newly-inserted node.
+@Returns: new head of the list.
+
+
+<!-- ##### FUNCTION g_slist_insert_sorted ##### -->
+<para>
+Inserts a new element into the list, using the given comparison function
+to determine its position.
+</para>
+
+@list: a #GSList.
+@data: the data for the new element.
+@func: the function to compare elements in the list. It should return a
+number > 0 if the first parameter comes after the second parameter in
+the sort order.
+@Returns: the new start of the #GSList.
+
+
+<!-- ##### FUNCTION g_slist_remove ##### -->
+<para>
+Removes an element from a #GSList.
+If two elements contain the same data, only the first is removed.
+If none of the elements contain the data, the #GSList is unchanged.
+</para>
+
+@list: a #GSList.
+@data: the data of the element to remove.
+@Returns: the new start of the #GSList.
+
+
+<!-- ##### FUNCTION g_slist_remove_link ##### -->
+<para>
+Removes an element from a #GSList, without freeing the element.
+The removed element's next link is set to %NULL, so that it becomes a
+self-contained list with one element.
+</para>
+
+@list: a #GSList.
+@link_: an element in the #GSList.
+@Returns: the new start of the #GSList, without the element.
+
+
+<!-- ##### FUNCTION g_slist_delete_link ##### -->
+<para>
+Deletes a node of @list. Returns the new list head.
+</para>
+
+@list: a #GSList.
+@link_: node to delete.
+@Returns: new head of @list.
+
+
+<!-- ##### FUNCTION g_slist_remove_all ##### -->
+<para>
+Removes all list nodes with data equal to @data. Returns the new
+head of the list. Contrast with g_slist_remove() which removes only
+the first node matching the given data.
+</para>
+
+@list: a #GSList.
+@data: data to remove.
+@Returns: new head of @list.
+
+
+<!-- ##### FUNCTION g_slist_free ##### -->
+<para>
+Frees all of the memory used by a #GSList.
+The freed elements are returned to the slice allocator.
+</para>
+
+@list: a #GSList.
+
+
+<!-- ##### FUNCTION g_slist_free_1 ##### -->
+<para>
+Frees one #GSList element.
+It is usually used after g_slist_remove_link().
+</para>
+
+@list: a #GSList element.
+
+
+<!-- ##### MACRO g_slist_free1 ##### -->
+<para>
+A macro which does the same as g_slist_free_1().
+</para>
+
+@Since: 2.10
+
+
+<!-- ##### FUNCTION g_slist_length ##### -->
+<para>
+Gets the number of elements in a #GSList.
+</para>
+
+@list: a #GSList.
+@Returns: the number of elements in the #GSList.
+
+
+<!-- ##### FUNCTION g_slist_copy ##### -->
+<para>
+Copies a #GSList.
+</para>
+<para>
+Note that this is a "shallow" copy. If the list elements consist of pointers
+to data, the pointers are copied but the actual data isn't.
+</para>
+
+@list: a #GSList.
+@Returns: a copy of @list.
+
+
+<!-- ##### FUNCTION g_slist_reverse ##### -->
+<para>
+Reverses a #GSList.
+</para>
+
+@list: a #GSList.
+@Returns: the start of the reversed #GSList.
+
+
+<!-- ##### FUNCTION g_slist_insert_sorted_with_data ##### -->
+<para>
+Inserts a new element into the list, using the given comparison function
+to determine its position.
+</para>
+
+@list: a #GSList.
+@data: the data for the new element.
+@func: the function to compare elements in the list. It should return a
+number > 0 if the first parameter comes after the second parameter in
+the sort order.
+@user_data: data to pass to comparison function.
+@Returns: the new start of the #GSList.
+@Since 2.10
+
+
+<!-- ##### FUNCTION g_slist_sort ##### -->
+<para>
+Sorts a #GSList using the given comparison function.
+</para>
+
+@list: a #GSList.
+@compare_func: the comparison function used to sort the #GSList.
+This function is passed the data from 2 elements of the #GSList and should
+return 0 if they are equal, a negative value if the first element
+comes before the second, or a positive value if the first element
+comes after the second.
+@Returns: the start of the sorted #GSList.
+
+
+<!-- ##### FUNCTION g_slist_sort_with_data ##### -->
+<para>
+Like g_slist_sort(), but the sort function accepts a user data argument.
+</para>
+
+@list: a #GSList
+@compare_func: comparison function.
+@user_data: data to pass to comparison function.
+@Returns: new head of the list.
+
+
+<!-- ##### FUNCTION g_slist_concat ##### -->
+<para>
+Adds the second #GSList onto the end of the first #GSList.
+Note that the elements of the second #GSList are not copied.
+They are used directly.
+</para>
+
+@list1: a #GSList.
+@list2: the #GSList to add to the end of the first #GSList.
+@Returns: the start of the new #GSList.
+
+
+<!-- ##### FUNCTION g_slist_foreach ##### -->
+<para>
+Calls a function for each element of a #GSList.
+</para>
+
+@list: a #GSList.
+@func: the function to call with each element's data.
+@user_data: user data to pass to the function.
+
+
+<!-- ##### FUNCTION g_slist_last ##### -->
+<para>
+Gets the last element in a #GSList.
+</para>
+
+@list: a #GSList.
+@Returns: the last element in the #GSList, or %NULL if the #GSList has no
+elements.
+
+
+<!-- ##### MACRO g_slist_next ##### -->
+<para>
+A convenience macro to gets the next element in a #GSList.
+</para>
+
+@slist: an element in a #GSList.
+@Returns: the next element, or %NULL if there are no more elements.
+
+
+<!-- ##### FUNCTION g_slist_nth ##### -->
+<para>
+Gets the element at the given position in a #GSList.
+</para>
+
+@list: a #GSList.
+@n: the position of the element, counting from 0.
+@Returns: the element, or %NULL if the position is off the end of the #GSList.
+
+
+<!-- ##### FUNCTION g_slist_nth_data ##### -->
+<para>
+Gets the data of the element at the given position.
+</para>
+
+@list: a #GSList.
+@n: the position of the element.
+@Returns: the element's data, or %NULL if the position is off the end of the
+#GSList.
+
+
+<!-- ##### FUNCTION g_slist_find ##### -->
+<para>
+Finds the element in a #GSList which contains the given data.
+</para>
+
+@list: a #GSList.
+@data: the element data to find.
+@Returns: the found #GSList element, or %NULL if it is not found.
+
+
+<!-- ##### FUNCTION g_slist_find_custom ##### -->
+<para>
+Finds an element in a #GSList, using a supplied function to find the desired
+element.
+It iterates over the list, calling the given function which should return 0
+when the desired element is found.
+The function takes two #gconstpointer arguments, the #GSList element's data as
+the first argument and the given user data.
+</para>
+
+@list: a #GSList.
+@data: user data passed to the function.
+@func: the function to call for each element. It should return 0 when the
+desired element is found.
+@Returns: the found #GSList element, or %NULL if it is not found.
+
+
+<!-- ##### FUNCTION g_slist_position ##### -->
+<para>
+Gets the position of the given element in the #GSList (starting from 0).
+</para>
+
+@list: a #GSList.
+@llink: an element in the #GSList.
+@Returns: the position of the element in the #GSList, or -1 if the element
+is not found.
+
+
+<!-- ##### FUNCTION g_slist_index ##### -->
+<para>
+Gets the position of the element containing the given data (starting from 0).
+</para>
+
+@list: a #GSList.
+@data: the data to find.
+@Returns: the index of the element containing the data, or -1 if the data
+is not found.
+
+
+<!-- ##### FUNCTION g_slist_push_allocator ##### -->
+<para>
+Sets the allocator to use to allocate #GSList elements.
+Use g_slist_pop_allocator() to restore the previous allocator.
+</para>
+<para>
+Note that this function is not available if GLib has been compiled
+with <option>--disable-mem-pools</option>
+</para>
+
+@dummy: the #GAllocator to use when allocating #GSList elements.
+@Deprecated: 2.10: It does nothing, since #GSList has been
+converted to the <link linkend="glib-Memory-Slices">slice allocator</link>
+
+
+<!-- ##### FUNCTION g_slist_pop_allocator ##### -->
+<para>
+Restores the previous #GAllocator, used when allocating #GSList elements.
+</para>
+<para>
+Note that this function is not available if GLib has been compiled
+with <option>--disable-mem-pools</option>
+</para>
+
+@Deprecated: 2.10: It does nothing, since #GSList has been
+converted to the <link linkend="glib-Memory-Slices">slice allocator</link>
+
+
diff --git a/trunk/docs/reference/glib/tmpl/macros.sgml b/trunk/docs/reference/glib/tmpl/macros.sgml
new file mode 100644
index 000000000..e453ed2f5
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/macros.sgml
@@ -0,0 +1,227 @@
+<!-- ##### SECTION Title ##### -->
+Standard Macros
+
+<!-- ##### SECTION Short_Description ##### -->
+commonly-used macros.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+These macros provide a few commonly-used features.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO G_OS_WIN32 ##### -->
+<para>
+This macro is defined only on Windows. So you can bracket
+Windows-specific code in "&num;ifdef G_OS_WIN32".
+</para>
+
+
+
+<!-- ##### MACRO G_OS_BEOS ##### -->
+<para>
+This macro is defined only on BeOS. So you can bracket
+BeOS-specific code in "&num;ifdef G_OS_BEOS".
+</para>
+
+
+
+<!-- ##### MACRO G_OS_UNIX ##### -->
+<para>
+This macro is defined only on UNIX. So you can bracket
+UNIX-specific code in "&num;ifdef G_OS_UNIX".
+</para>
+
+
+
+<!-- ##### MACRO G_DIR_SEPARATOR ##### -->
+<para>
+The directory separator character.
+This is '/' on UNIX machines and '\' under Windows.
+</para>
+
+
+
+<!-- ##### MACRO G_DIR_SEPARATOR_S ##### -->
+<para>
+The directory separator as a string.
+This is "/" on UNIX machines and "\" under Windows.
+</para>
+
+
+
+<!-- ##### MACRO G_IS_DIR_SEPARATOR ##### -->
+<para>
+Checks whether a character is a directory
+separator. It returns %TRUE for '/' on UNIX
+machines and for '\' or '/' under Windows.
+</para>
+
+@c: a character
+@Since: 2.6
+
+
+<!-- ##### MACRO G_SEARCHPATH_SEPARATOR ##### -->
+<para>
+The search path separator character.
+This is ':' on UNIX machines and ';' under Windows.
+</para>
+
+
+
+<!-- ##### MACRO G_SEARCHPATH_SEPARATOR_S ##### -->
+<para>
+The search path separator as a string.
+This is ":" on UNIX machines and ";" under Windows.
+</para>
+
+
+
+<!-- ##### MACRO TRUE ##### -->
+<para>
+Defines the %TRUE value for the #gboolean type.
+</para>
+
+
+
+<!-- ##### MACRO FALSE ##### -->
+<para>
+Defines the %FALSE value for the #gboolean type.
+</para>
+
+
+
+<!-- ##### MACRO NULL ##### -->
+<para>
+Defines the standard %NULL pointer.
+</para>
+
+
+
+<!-- ##### MACRO MIN ##### -->
+<para>
+Calculates the minimum of @a and @b.
+</para>
+
+@a: a numeric value.
+@b: a numeric value.
+@Returns: the minimum of @a and @b.
+
+
+<!-- ##### MACRO MAX ##### -->
+<para>
+Calculates the maximum of @a and @b.
+</para>
+
+@a: a numeric value.
+@b: a numeric value.
+@Returns: the maximum of @a and @b.
+
+
+<!-- ##### MACRO ABS ##### -->
+<para>
+Calculates the absolute value of @a.
+The absolute value is simply the number with any negative sign taken away.
+</para>
+<para>
+For example,
+<itemizedlist>
+<listitem><para>
+ABS(-10) is 10.
+</para></listitem>
+<listitem><para>
+ABS(10) is also 10.
+</para></listitem>
+</itemizedlist>
+</para>
+
+@a: a numeric value.
+@Returns: the absolute value of @a.
+
+
+<!-- ##### MACRO CLAMP ##### -->
+<para>
+Ensures that @x is between the limits set by @low and @high.
+</para>
+<para>
+For example,
+<itemizedlist>
+<listitem><para>
+CLAMP(5, 10, 15) is 10.
+</para></listitem>
+<listitem><para>
+CLAMP(15, 5, 10) is 10.
+</para></listitem>
+<listitem><para>
+CLAMP(20, 15, 25) is 20.
+</para></listitem>
+</itemizedlist>
+</para>
+
+@x: the value to clamp.
+@low: the minimum value allowed.
+@high: the maximum value allowed.
+@Returns: the value of @x clamped to the range between @low and @high.
+
+
+<!-- ##### MACRO G_STRUCT_MEMBER ##### -->
+<para>
+Returns a member of a structure at a given offset, using the given type.
+</para>
+
+@member_type: the type of the struct field.
+@struct_p: a pointer to a struct.
+@struct_offset: the offset of the field from the start of the struct, in bytes.
+@Returns: the struct member.
+
+
+<!-- ##### MACRO G_STRUCT_MEMBER_P ##### -->
+<para>
+Returns an untyped pointer to a given offset of a struct.
+</para>
+
+@struct_p: a pointer to a struct.
+@struct_offset: the offset from the start of the struct, in bytes.
+@Returns: an untyped pointer to @struct_p plus @struct_offset bytes.
+
+
+<!-- ##### MACRO G_STRUCT_OFFSET ##### -->
+<para>
+Returns the offset, in bytes, of a member of a struct.
+</para>
+
+@struct_type: a structure type, e.g. <structname>GtkWidget</structname>.
+@member: a field in the structure, e.g. <structfield>window</structfield>.
+@Returns: the offset of @member from the start of @struct_type.
+
+
+<!-- ##### MACRO G_MEM_ALIGN ##### -->
+<para>
+Indicates the number of bytes to which memory will be aligned on the
+current platform.
+</para>
+
+
+
+<!-- ##### MACRO G_CONST_RETURN ##### -->
+<para>
+If %G_DISABLE_CONST_RETURNS is defined, this macro expands to nothing.
+By default, the macro expands to <literal>const</literal>. The macro
+should be used in place of <literal>const</literal> for functions that
+return a value that should not be modified. The purpose of this macro is
+to allow us to turn on <literal>const</literal> for returned constant
+strings by default, while allowing programmers who find that annoying to
+turn it off. This macro should only be used for return values and for
+<emphasis>out</emphasis> parameters, it doesn't make sense for
+<emphasis>in</emphasis> parameters.
+</para>
+
+
+
diff --git a/trunk/docs/reference/glib/tmpl/macros_misc.sgml b/trunk/docs/reference/glib/tmpl/macros_misc.sgml
new file mode 100644
index 000000000..1bbfd137a
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/macros_misc.sgml
@@ -0,0 +1,548 @@
+<!-- ##### SECTION Title ##### -->
+Miscellaneous Macros
+
+<!-- ##### SECTION Short_Description ##### -->
+specialized macros which are not used often.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+These macros provide more specialized features which are not needed so often
+by application programmers.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO G_INLINE_FUNC ##### -->
+<para>
+This macro is used to export function prototypes so they can be linked
+with an external version when no inlining is performed. The file which
+implements the functions should define %G_IMPLEMENTS_INLINES
+before including the headers which contain %G_INLINE_FUNC declarations.
+Since inlining is very compiler-dependent using these macros correctly
+is very difficult. Their use is strongly discouraged.
+</para>
+<para>
+This macro is often mistaken for a replacement for the inline keyword;
+inline is already declared in a portable manner in the glib headers
+and can be used normally.
+</para>
+
+
+
+<!-- ##### MACRO G_STMT_START ##### -->
+<para>
+Used within multi-statement macros so that they can be used in places where
+only one statement is expected by the compiler.
+</para>
+
+
+
+<!-- ##### MACRO G_STMT_END ##### -->
+<para>
+Used within multi-statement macros so that they can be used in places where
+only one statement is expected by the compiler.
+</para>
+
+
+
+<!-- ##### MACRO G_BEGIN_DECLS ##### -->
+<para>
+Used (along with #G_END_DECLS) to bracket header files. If the
+compiler in use is a C++ compiler, adds <literal>extern "C"</literal>
+around the header.
+</para>
+
+
+
+<!-- ##### MACRO G_END_DECLS ##### -->
+<para>
+Used (along with #G_BEGIN_DECLS) to bracket header files. If the
+compiler in use is a C++ compiler, adds <literal>extern "C"</literal>
+around the header.
+</para>
+
+
+
+<!-- ##### MACRO G_N_ELEMENTS ##### -->
+<para>
+Determines the number of elements in an array. The array must be
+declared so the compiler knows its size at compile-time; this
+macro will not work on an array allocated on the heap, only static
+arrays or arrays on the stack.
+</para>
+
+@arr: the array
+
+
+<!-- ##### MACRO G_VA_COPY ##### -->
+<para>
+Portable way to copy <type>va_list</type> variables.
+</para>
+<para>
+In order to use this function, you must include <filename>string.h</filename>
+yourself, because this macro may use <function>memmove()</function> and GLib
+does not include <function>string.h</function> for you.
+</para>
+
+@ap1: the <type>va_list</type> variable to place a copy of @ap2 in.
+@ap2: a <type>va_list</type>.
+
+
+<!-- ##### MACRO G_STRINGIFY ##### -->
+<para>
+Accepts a macro or a string and converts it into a string.
+</para>
+
+@macro_or_string: a macro or a string.
+
+
+<!-- ##### MACRO G_GNUC_EXTENSION ##### -->
+<para>
+Expands to <literal>__extension__</literal> when <command>gcc</command> is
+used as the compiler.
+This simply tells <command>gcc</command> not to warn about the following non-standard code
+when compiling with the <option>-pedantic</option> option.
+</para>
+
+
+
+<!-- ##### MACRO G_GNUC_CONST ##### -->
+<para>
+Expands to the GNU C <literal>const</literal> function attribute if the compiler is
+<command>gcc</command>. Declaring a function as const enables better optimization of calls
+to the function. A const function doesn't examine any values except its parameters, and has no
+effects except its return value. See the GNU C documentation for details.
+</para>
+<note><para>
+A function that has pointer arguments and examines the data pointed to
+must <emphasis>not</emphasis> be declared const. Likewise, a function that
+calls a non-const function usually must not be const. It doesn't make sense
+for a const function to return void.
+</para></note>
+
+
+
+<!-- ##### MACRO G_GNUC_PURE ##### -->
+<para>
+Expands to the GNU C <literal>pure</literal> function attribute if the compiler is
+<command>gcc</command>. Declaring a function as pure enables better optimization of
+calls to the function. A pure function has no effects except its return value and the
+return value depends only on the parameters and/or global variables.
+See the GNU C documentation for details.
+</para>
+
+
+
+<!-- ##### MACRO G_GNUC_MALLOC ##### -->
+<para>
+Expands to the GNU C <literal>malloc</literal> function attribute if the compiler is
+<command>gcc</command>. Declaring a function as malloc enables better optimization of the
+function. A function can have the malloc attribute if it returns a pointer which is guaranteed
+to not alias with any other pointer when the function returns (in practice, this means newly
+allocated memory).
+See the GNU C documentation for details.
+</para>
+
+@Since: 2.6
+
+
+<!-- ##### MACRO G_GNUC_DEPRECATED ##### -->
+<para>
+Expands to the GNU C <literal>deprecated</literal> attribute if the compiler
+is <command>gcc</command>.
+It can be used to mark typedefs, variables and functions as deprecated.
+When called with the <option>-Wdeprecated</option> option, the compiler will
+generate warnings when deprecated interfaces are used.
+See the GNU C documentation for details.
+</para>
+
+@Since: 2.2
+
+
+<!-- ##### MACRO G_GNUC_NORETURN ##### -->
+<para>
+Expands to the GNU C <literal>noreturn</literal> function attribute if the
+compiler is <command>gcc</command>. It is used for declaring functions which never return.
+It enables optimization of the function, and avoids possible compiler
+warnings. See the GNU C documentation for details.
+</para>
+
+
+
+<!-- ##### MACRO G_GNUC_UNUSED ##### -->
+<para>
+Expands to the GNU C <literal>unused</literal> function attribute if the compiler is
+<command>gcc</command>. It is used for declaring functions which may never be used.
+It avoids possible compiler warnings. See the GNU C documentation for details.
+</para>
+
+
+
+<!-- ##### MACRO G_GNUC_PRINTF ##### -->
+<para>
+Expands to the GNU C <literal>format</literal> function attribute if the compiler is
+<command>gcc</command>. This is used for declaring functions which take a variable number of
+arguments, with the same syntax as <function>printf()</function>.
+It allows the compiler to type-check the arguments passed to the function.
+See the GNU C documentation for details.
+</para>
+<informalexample><programlisting>
+gint g_snprintf (gchar *string,
+ gulong n,
+ gchar const *format,
+ ...) G_GNUC_PRINTF (3, 4);
+</programlisting></informalexample>
+
+@format_idx: the index of the argument corresponding to the format string.
+(The arguments are numbered from 1).
+@arg_idx: the index of the first of the format arguments.
+
+
+<!-- ##### MACRO G_GNUC_SCANF ##### -->
+<para>
+Expands to the GNU C <literal>format</literal> function attribute if the compiler is <command>gcc</command>.
+This is used for declaring functions which take a variable number of
+arguments, with the same syntax as <function>scanf()</function>.
+It allows the compiler to type-check the arguments passed to the function.
+See the GNU C documentation for details.
+</para>
+
+@format_idx: the index of the argument corresponding to the format string.
+(The arguments are numbered from 1).
+@arg_idx: the index of the first of the format arguments.
+
+
+<!-- ##### MACRO G_GNUC_FORMAT ##### -->
+<para>
+Expands to the GNU C <literal>format_arg</literal> function attribute if the compiler is <command>gcc</command>.
+This function attribute specifies that a function takes a format
+string for a <function>printf()</function>, <function>scanf()</function>,
+<function>strftime()</function> or <function>strfmon()</function> style
+function and modifies it, so that the result can be passed to a
+<function>printf()</function>, <function>scanf()</function>,
+<function>strftime()</function> or <function>strfmon()</function> style
+function (with the remaining arguments to the format function the same as
+they would have been for the unmodified string).
+See the GNU C documentation for details.
+</para>
+<informalexample><programlisting>
+gchar *g_dgettext (gchar *domain_name, gchar *msgid) G_GNUC_FORMAT (2);
+</programlisting></informalexample>
+
+@arg_idx: the index of the argument.
+
+
+<!-- ##### MACRO G_GNUC_NULL_TERMINATED ##### -->
+<para>
+Expands to the GNU C <literal>sentinel</literal> function attribute if the
+compiler is <command>gcc</command>, or "" if it isn't. This function attribute
+only applies to variadic functions and instructs the compiler to check that
+the argument list is terminated with an explicit %NULL.
+See the GNU C documentation for details.
+</para>
+
+Since: 2.8
+
+
+
+<!-- ##### MACRO G_GNUC_WARN_UNUSED_RESULT ##### -->
+<para>
+Expands to the GNU C <literal>warn_unused_ersult</literal> function attribute
+if the compiler is <command>gcc</command>, or "" if it isn't. This function
+attribute makes the compiler emit a warning if the result of a function call
+is ignored. See the GNU C documentation for details.
+</para>
+
+@Since: 2.10
+
+
+<!-- ##### MACRO G_GNUC_FUNCTION ##### -->
+<para>
+Expands to the GNU C <literal>__FUNCTION__</literal> variable if the
+compiler is <command>gcc</command>, or "" if it isn't. The GNU C
+<literal>__FUNCTION__</literal> variable contains the name of the
+current function. See the GNU C documentation for details.
+</para>
+
+
+
+<!-- ##### MACRO G_GNUC_PRETTY_FUNCTION ##### -->
+<para>
+Expands to the GNU C <literal>__PRETTY_FUNCTION__</literal> variable
+if the compiler is <command>gcc</command>, or "" if it isn't.
+The GNU C <literal>__PRETTY_FUNCTION__</literal> variable contains the
+name of the current function. For a C program this is the same as the
+<literal>__FUNCTION__</literal> variable but for C++ it also includes
+extra information such as the class and function prototype. See the
+GNU C documentation for details.
+</para>
+
+
+
+<!-- ##### MACRO G_GNUC_NO_INSTRUMENT ##### -->
+<para>
+Expands to the GNU C <literal>no_instrument_function</literal> function
+attribute if the compiler is <command>gcc</command>. Functions with this
+attribute will not be
+instrumented for profiling, when the compiler is called with the
+<option>-finstrument-functions</option> option.
+See the GNU C documentation for details.
+</para>
+
+
+
+<!-- ##### MACRO G_HAVE_GNUC_VISIBILITY ##### -->
+<para>
+This macro is defined as 1 if the the compiler supports ELF visibility
+attributes (currently only <command>gcc</command>).
+</para>
+
+Since: 2.6
+
+
+
+<!-- ##### MACRO G_GNUC_INTERNAL ##### -->
+<para>
+This attribute can be used for marking library functions as being used
+internally to the library only, which may allow the compiler to handle
+function calls more efficiently.
+Note that static functions do not need to be marked as internal in this way.
+See the GNU C documentation for details.
+</para>
+<para>
+When using a compiler that supports the GNU C hidden visibility attribute,
+this macro expands to <literal>__attribute__((visibility("hidden")))</literal>.
+When using the Sun Studio compiler, it expands to <literal>__hidden</literal>.
+</para>
+<para>
+Note that for portability, the attribute should be placed before the
+function declaration. While GCC allows the macro after the declaration,
+Sun Studio does not.
+</para>
+<informalexample><programlisting>
+G_GNUC_INTERNAL
+void _g_log_fallback_handler (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *message,
+ gpointer unused_data);
+</programlisting></informalexample>
+
+Since: 2.6
+
+
+
+<!-- ##### MACRO G_GNUC_MAY_ALIAS ##### -->
+<para>
+
+</para>
+
+
+
+<!-- ##### FUNCTION G_LIKELY ##### -->
+<para>
+Hints the compiler that the expression is likely to evaluate to a true
+value. The compiler may use this information for optimizations.
+</para>
+<informalexample><programlisting>
+if (G_LIKELY (random () != 1))
+ g_print ("not one");
+</programlisting></informalexample>
+
+@Returns:
+@Since: 2.2
+<!-- # Unused Parameters # -->
+@expr: the expression
+
+
+<!-- ##### MACRO G_UNLIKELY ##### -->
+<para>
+Hints the compiler that the expression is unlikely to evaluate to a true
+value. The compiler may use this information for optimizations.
+</para>
+<informalexample><programlisting>
+if (G_UNLIKELY (random () == 1))
+ g_print ("a random one");
+</programlisting></informalexample>
+
+@expr: the expression
+@Since: 2.2
+
+
+<!-- ##### MACRO G_STRLOC ##### -->
+<para>
+Expands to a string identifying the current code position.
+</para>
+
+
+
+<!-- ##### MACRO G_STRFUNC ##### -->
+<para>
+Expands to a string identifying the current function.
+</para>
+
+@Since: 2.4
+
+
+<!-- ##### MACRO G_GINT16_MODIFIER ##### -->
+<para>
+The platform dependent length modifier for constructing printf() conversion
+specifiers for values of type #gint16 or #guint16. It is a string literal,
+but doesn't include the percent-sign, such that you can add precision and
+length modifiers between percent-sign and conversion specifier and append a
+conversion specifier.
+</para>
+
+<para>
+The following example prints "0x7b";
+<informalexample>
+<programlisting>
+gint16 value = 123;
+g_print ("%#" G_GINT16_MODIFIER "x", value);
+</programlisting>
+</informalexample>
+</para>
+
+@Since: 2.4
+
+
+<!-- ##### MACRO G_GINT16_FORMAT ##### -->
+<para>
+This is the platform dependent conversion specifier for scanning and
+printing values of type #gint16. It is a string literal, but doesn't
+include the percent-sign, such that you can add precision and length
+modifiers between percent-sign and conversion specifier.
+</para>
+
+<para>
+<informalexample>
+<programlisting>
+gint16 in;
+gint32 out;
+sscanf ("42", "%" G_GINT16_FORMAT, &amp;in)
+out = in * 1000;
+g_print ("%" G_GINT32_FORMAT, out);
+</programlisting>
+</informalexample>
+</para>
+
+
+
+<!-- ##### MACRO G_GUINT16_FORMAT ##### -->
+<para>
+This is the platform dependent conversion specifier for scanning and
+printing values of type #guint16. See also #G_GINT16_FORMAT.
+</para>
+
+
+
+<!-- ##### MACRO G_GINT32_MODIFIER ##### -->
+<para>
+The platform dependent length modifier for constructing printf() conversion
+specifiers for values of type #gint32 or #guint32. See also #G_GINT16_MODIFIER.
+</para>
+
+@Since: 2.4
+
+
+<!-- ##### MACRO G_GINT32_FORMAT ##### -->
+<para>
+This is the platform dependent conversion specifier for scanning and
+printing values of type #gint32. See also #G_GINT16_FORMAT.
+</para>
+
+
+
+<!-- ##### MACRO G_GUINT32_FORMAT ##### -->
+<para>
+This is the platform dependent conversion specifier for scanning and
+printing values of type #guint32. See also #G_GINT16_FORMAT.
+</para>
+
+
+
+<!-- ##### MACRO G_GINT64_MODIFIER ##### -->
+<para>
+The platform dependent length modifier for constructing printf() conversion
+specifiers for values of type #gint64 or #guint64. See also #G_GINT16_MODIFIER.
+</para>
+
+<note>
+<para>
+Some platforms do not support printing 64 bit integers,
+even though the types are supported. On such platforms #G_GINT64_MODIFIER
+is not defined.
+</para>
+</note>
+
+@Since: 2.4
+
+
+<!-- ##### MACRO G_GINT64_FORMAT ##### -->
+<para>
+This is the platform dependent conversion specifier for scanning and
+printing values of type #gint64. See also #G_GINT16_FORMAT.
+</para>
+
+<note>
+<para>
+Some platforms do not support scanning and printing 64 bit integers,
+even though the types are supported. On such platforms #G_GINT64_FORMAT
+is not defined. Note that scanf() may not support 64 bit integers, even
+if #G_GINT64_FORMAT is defined. Due to its weak error handling, scanf() is not
+recommended for parsing anyway; consider using g_strtoull() instead.
+</para>
+</note>
+
+
+
+<!-- ##### MACRO G_GUINT64_FORMAT ##### -->
+<para>
+This is the platform dependent conversion specifier for scanning and
+printing values of type #guint64. See also #G_GINT16_FORMAT.
+</para>
+
+<note>
+<para>
+Some platforms do not support scanning and printing 64 bit integers,
+even though the types are supported. On such platforms #G_GUINT64_FORMAT
+is not defined. Note that scanf() may not support 64 bit integers, even
+if #G_GINT64_FORMAT is defined. Due to its weak error handling, scanf() is not
+recommended for parsing anyway; consider using g_strtoull() instead.
+</para>
+</note>
+
+
+
+<!-- ##### MACRO G_GSIZE_MODIFIER ##### -->
+<para>
+The platform dependent length modifier for constructing printf() conversion
+specifiers for values of type #gsize or #gssize. See also #G_GINT16_MODIFIER.
+</para>
+
+@Since: 2.6
+
+
+<!-- ##### MACRO G_GSIZE_FORMAT ##### -->
+<para>
+This is the platform dependent conversion specifier for scanning and
+printing values of type #gsize. See also #G_GINT16_FORMAT.
+</para>
+
+@Since: 2.6
+
+
+<!-- ##### MACRO G_GSSIZE_FORMAT ##### -->
+<para>
+This is the platform dependent conversion specifier for scanning and
+printing values of type #gssize. See also #G_GINT16_FORMAT.
+</para>
+
+@Since: 2.6
+
+
diff --git a/trunk/docs/reference/glib/tmpl/main.sgml b/trunk/docs/reference/glib/tmpl/main.sgml
new file mode 100644
index 000000000..4d41c6ea5
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/main.sgml
@@ -0,0 +1,1037 @@
+<!-- ##### SECTION Title ##### -->
+The Main Event Loop
+
+<!-- ##### SECTION Short_Description ##### -->
+manages all available sources of events.
+
+<!-- ##### SECTION Long_Description ##### -->
+ <para>
+ The main event loop manages all the available sources of events for
+ GLib and GTK+ applications. These events can come from any number of
+ different types of sources such as file descriptors (plain files,
+ pipes or sockets) and timeouts. New types of event sources can also
+ be added using g_source_attach().
+ </para>
+ <para>
+ To allow multiple independent sets of sources to be handled in
+ different threads, each source is associated with a #GMainContext.
+ A #GMainContext can only be running in a single thread, but
+ sources can be added to it and removed from it from other threads.
+ </para>
+ <para>
+ Each event source is assigned a priority. The default priority,
+ #G_PRIORITY_DEFAULT, is 0. Values less than 0 denote higher
+ priorities. Values greater than 0 denote lower priorities. Events
+ from high priority sources are always processed before events from
+ lower priority sources.
+ </para>
+ <para>
+ Idle functions can also be added, and assigned a priority. These will
+ be run whenever no events with a higher priority are ready to be
+ processed.
+ </para>
+ <para>
+ The #GMainLoop data type represents a main event loop. A #GMainLoop
+ is created with g_main_loop_new(). After adding the initial event sources,
+ g_main_loop_run() is called. This continuously checks for new events from
+ each of the event sources and dispatches them. Finally, the
+ processing of an event from one of the sources leads to a call to
+ g_main_loop_quit() to exit the main loop, and g_main_loop_run() returns.
+ </para>
+ <para>
+ It is possible to create new instances of #GMainLoop recursively.
+ This is often used in GTK+ applications when showing modal dialog
+ boxes. Note that event sources are associated with a particular
+ #GMainContext, and will be checked and dispatched for all main
+ loops associated with that #GMainContext.
+ </para>
+ <para>
+ GTK+ contains wrappers of some of these functions, e.g. gtk_main(),
+ gtk_main_quit() and gtk_events_pending().
+ </para>
+ <refsect2>
+ <title>Creating new sources types</title>
+ <para>
+ One of the unusual features of the GTK+ main loop functionality
+ is that new types of event source can be created and used in
+ addition to the builtin type of event source. A new event source
+ type is used for handling GDK events. A new source type is
+ created by <firstterm>deriving</firstterm> from the #GSource
+ structure. The derived type of source is represented by a
+ structure that has the #GSource structure as a first element,
+ and other elements specific to the new source type. To create
+ an instance of the new source type, call g_source_new() passing
+ in the size of the derived structure and a table of functions.
+ These #GSourceFuncs determine the behavior of the new source
+ types.
+ </para>
+ <para>
+ New source types basically interact with with the main context
+ in two ways. Their prepare function in #GSourceFuncs can set
+ a timeout to determine the maximum amount of time that the
+ main loop will sleep before checking the source again. In
+ addition, or as well, the source can add file descriptors to
+ the set that the main context checks using g_source_add_poll().
+ </para>
+ </refsect2>
+ <refsect2>
+ <title>Customizing the main loop iteration</title>
+ <para>
+ Single iterations of a #GMainContext can be run with
+ g_main_context_iteration(). In some cases, more detailed control
+ of exactly how the details of the main loop work is desired,
+ for instance, when integrating the #GMainLoop with an external
+ main loop. In such cases, you can call the component functions
+ of g_main_context_iteration() directly. These functions
+ are g_main_context_prepare(), g_main_context_query(),
+ g_main_context_check() and g_main_context_dispatch().
+ </para>
+ <para>
+ The operation of these functions can best be seen in terms
+ of a state diagram, as shown in <xref linkend="mainloop-states"/>.
+ </para>
+ <figure id="mainloop-states">
+ <title>States of a Main Context</title>
+ <graphic fileref="mainloop-states.gif" format="GIF"></graphic>
+ </figure>
+ </refsect2>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GMainLoop ##### -->
+<para>
+The <structname>GMainLoop</structname> struct is an opaque data type
+representing the main event loop of a GLib or GTK+ application.
+</para>
+
+
+<!-- ##### FUNCTION g_main_loop_new ##### -->
+<para>
+
+</para>
+
+@context:
+@is_running:
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_loop_ref ##### -->
+<para>
+
+</para>
+
+@loop:
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_loop_unref ##### -->
+<para>
+
+</para>
+
+@loop:
+
+
+<!-- ##### FUNCTION g_main_loop_run ##### -->
+<para>
+
+</para>
+
+@loop:
+
+
+<!-- ##### FUNCTION g_main_loop_quit ##### -->
+<para>
+
+</para>
+
+@loop:
+
+
+<!-- ##### FUNCTION g_main_loop_is_running ##### -->
+<para>
+
+</para>
+
+@loop:
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_loop_get_context ##### -->
+<para>
+
+</para>
+
+@loop:
+@Returns:
+
+
+<!-- ##### MACRO g_main_new ##### -->
+<para>
+Creates a new #GMainLoop for the default main loop.
+</para>
+
+@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.
+@Returns: a new #GMainLoop.
+@Deprecated: 2.2: Use g_main_loop_new() instead.
+
+
+<!-- ##### MACRO g_main_destroy ##### -->
+<para>
+Frees the memory allocated for the #GMainLoop.
+</para>
+
+@loop: a #GMainLoop.
+@Deprecated: 2.2: Use g_main_loop_unref() instead.
+
+
+<!-- ##### MACRO g_main_run ##### -->
+<para>
+Runs a main loop until it stops running.
+</para>
+
+@loop: a #GMainLoop.
+@Deprecated: 2.2: Use g_main_loop_run() instead.
+
+
+<!-- ##### MACRO g_main_quit ##### -->
+<para>
+Stops the #GMainLoop. If g_main_run() was called to run the #GMainLoop,
+it will now return.
+</para>
+
+@loop: a #GMainLoop.
+@Deprecated: 2.2: Use g_main_loop_quit() instead.
+
+
+<!-- ##### MACRO g_main_is_running ##### -->
+<para>
+Checks if the main loop is running.
+</para>
+
+@loop: a #GMainLoop.
+@Returns: %TRUE if the main loop is running.
+@Deprecated: 2.2: USe g_main_loop_is_running() instead.
+
+
+<!-- ##### MACRO G_PRIORITY_HIGH ##### -->
+<para>
+Use this for high priority event sources.
+It is not used within GLib or GTK+.
+</para>
+
+
+
+<!-- ##### MACRO G_PRIORITY_DEFAULT ##### -->
+<para>
+Use this for default priority event sources.
+In GLib this priority is used when adding timeout functions with
+g_timeout_add().
+In GDK this priority is used for events from the X server.
+</para>
+
+
+
+<!-- ##### MACRO G_PRIORITY_HIGH_IDLE ##### -->
+<para>
+Use this for high priority idle functions.
+GTK+ uses #G_PRIORITY_HIGH_IDLE + 10 for resizing operations, and
+#G_PRIORITY_HIGH_IDLE + 20 for redrawing operations. (This is done to
+ensure that any pending resizes are processed before any pending redraws,
+so that widgets are not redrawn twice unnecessarily.)
+</para>
+
+
+
+<!-- ##### MACRO G_PRIORITY_DEFAULT_IDLE ##### -->
+<para>
+Use this for default priority idle functions.
+In GLib this priority is used when adding idle functions with g_idle_add().
+</para>
+
+
+
+<!-- ##### MACRO G_PRIORITY_LOW ##### -->
+<para>
+Use this for very low priority background tasks.
+It is not used within GLib or GTK+.
+</para>
+
+
+
+<!-- ##### STRUCT GMainContext ##### -->
+<para>
+The <structname>GMainContext</structname> struct is an opaque data type
+representing a set of sources to be handled in a main loop.
+</para>
+
+
+<!-- ##### FUNCTION g_main_context_new ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_context_ref ##### -->
+<para>
+
+</para>
+
+@context:
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_context_unref ##### -->
+<para>
+
+</para>
+
+@context:
+
+
+<!-- ##### FUNCTION g_main_context_default ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_context_iteration ##### -->
+<para>
+
+</para>
+
+@context:
+@may_block:
+@Returns:
+
+
+<!-- ##### MACRO g_main_iteration ##### -->
+<para>
+Runs a single iteration for the default #GMainContext.
+</para>
+
+@may_block: set to %TRUE if it should block (i.e. wait) until an event source
+becomes ready. It will return after an event source has been processed.
+If set to %FALSE it will return immediately if no event source is ready to be
+processed.
+@Returns: %TRUE if more events are pending.
+@Deprecated: 2.2: Use g_main_context_iteration() instead.
+
+
+<!-- ##### FUNCTION g_main_context_pending ##### -->
+<para>
+
+</para>
+
+@context:
+@Returns:
+
+
+<!-- ##### MACRO g_main_pending ##### -->
+<para>
+Checks if any events are pending for the default #GMainContext
+(i.e. ready to be processed).
+</para>
+
+@Returns: %TRUE if any events are pending.
+@Deprecated: 2.2: Use g_main_context_pending() instead.
+
+
+<!-- ##### FUNCTION g_main_context_find_source_by_id ##### -->
+<para>
+
+</para>
+
+@context:
+@source_id:
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_context_find_source_by_user_data ##### -->
+<para>
+
+</para>
+
+@context:
+@user_data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_context_find_source_by_funcs_user_data ##### -->
+<para>
+
+</para>
+
+@context:
+@funcs:
+@user_data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_context_wakeup ##### -->
+<para>
+
+</para>
+
+@context:
+
+
+<!-- ##### FUNCTION g_main_context_acquire ##### -->
+<para>
+
+</para>
+
+@context:
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_context_release ##### -->
+<para>
+
+</para>
+
+@context:
+
+
+<!-- ##### FUNCTION g_main_context_is_owner ##### -->
+<para>
+
+</para>
+
+@context:
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_context_wait ##### -->
+<para>
+
+</para>
+
+@context:
+@cond:
+@mutex:
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_context_prepare ##### -->
+<para>
+
+</para>
+
+@context:
+@priority:
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_context_query ##### -->
+<para>
+
+</para>
+
+@context:
+@max_priority:
+@timeout_:
+@fds:
+@n_fds:
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_context_check ##### -->
+<para>
+
+</para>
+
+@context:
+@max_priority:
+@fds:
+@n_fds:
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_context_dispatch ##### -->
+<para>
+
+</para>
+
+@context:
+
+
+<!-- ##### FUNCTION g_main_context_set_poll_func ##### -->
+<para>
+
+</para>
+
+@context:
+@func:
+
+
+<!-- ##### FUNCTION g_main_context_get_poll_func ##### -->
+<para>
+
+</para>
+
+@context:
+@Returns:
+
+
+<!-- ##### USER_FUNCTION GPollFunc ##### -->
+<para>
+Specifies the type of function passed to g_main_context_set_poll_func().
+The semantics of the function should match those of the
+<function>poll()</function> system call.
+</para>
+
+@ufds: an array of #GPollFD elements.
+@nfsd: the number of elements in @ufds.
+@timeout_: the maximum time to wait for an event of the file descriptors.
+ A negative value indicates an infinite timeout.
+@Returns: the number of #GPollFD elements which have events or errors reported,
+or -1 if an error occurred.
+
+
+<!-- ##### FUNCTION g_main_context_add_poll ##### -->
+<para>
+
+</para>
+
+@context:
+@fd:
+@priority:
+
+
+<!-- ##### FUNCTION g_main_context_remove_poll ##### -->
+<para>
+
+</para>
+
+@context:
+@fd:
+
+
+<!-- ##### FUNCTION g_main_depth ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_main_current_source ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### MACRO g_main_set_poll_func ##### -->
+<para>
+Sets the function to use for the handle polling of file descriptors
+for the default main context.
+</para>
+
+@func: the function to call to poll all file descriptors.
+@Deprecated: 2.2: Use g_main_context_set_poll_func() instead.
+
+
+<!-- ##### FUNCTION g_timeout_source_new ##### -->
+<para>
+
+</para>
+
+@interval:
+@Returns:
+
+
+<!-- ##### FUNCTION g_timeout_source_new_seconds ##### -->
+<para>
+
+</para>
+
+@interval:
+@Returns:
+
+
+<!-- ##### FUNCTION g_timeout_add ##### -->
+<para>
+</para>
+
+@interval:
+@function:
+@data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_timeout_add_full ##### -->
+<para>
+</para>
+
+@priority:
+@interval:
+@function:
+@data:
+@notify:
+@Returns:
+
+
+<!-- ##### FUNCTION g_timeout_add_seconds ##### -->
+<para>
+
+</para>
+
+@interval:
+@function:
+@data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_idle_source_new ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_idle_add ##### -->
+<para>
+</para>
+
+@function:
+@data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_idle_add_full ##### -->
+<para>
+</para>
+
+@priority:
+@function:
+@data:
+@notify:
+@Returns:
+
+
+<!-- ##### FUNCTION g_idle_remove_by_data ##### -->
+<para>
+</para>
+
+@data:
+@Returns:
+
+
+<!-- ##### TYPEDEF GPid ##### -->
+<para>
+A type which is used to hold a process identification.
+On Unix, processes are identified by a process id (an
+integer), while Windows uses process handles (which are
+pointers).
+</para>
+
+
+<!-- ##### USER_FUNCTION GChildWatchFunc ##### -->
+<para>
+The type of functions to be called when a child exists.
+</para>
+
+@pid: the process id of the child process
+@status: Status information about the child process,
+ see waitpid(2) for more information about this field
+@data: user data passed to g_child_watch_add()
+
+
+<!-- ##### FUNCTION g_child_watch_source_new ##### -->
+<para>
+
+</para>
+
+@pid:
+@Returns:
+
+
+<!-- ##### FUNCTION g_child_watch_add ##### -->
+<para>
+
+</para>
+
+@pid:
+@function:
+@data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_child_watch_add_full ##### -->
+<para>
+
+</para>
+
+@priority:
+@pid:
+@function:
+@data:
+@notify:
+@Returns:
+
+
+<!-- ##### STRUCT GPollFD ##### -->
+<para>
+
+<informaltable pgwide="1" frame="none" role="struct">
+<tgroup cols="2"><colspec colwidth="2*"/><colspec colwidth="8*"/>
+<tbody>
+
+<row>
+<entry>#gint fd;</entry>
+<entry>the file descriptor to poll (or a <type>HANDLE</type> on Win32 platforms).</entry>
+</row>
+
+<row>
+<entry>#gushort events;</entry>
+<entry>a bitwise combination of flags from #GIOCondition, specifying which
+events should be polled for. Typically for reading from a file descriptor
+you would use %G_IO_IN | %G_IO_HUP | %G_IO_ERR, and for writing you would use
+%G_IO_OUT | %G_IO_ERR.
+</entry>
+</row>
+
+<row>
+<entry>#gushort revents;</entry>
+<entry>a bitwise combination of flags from #GIOCondition, returned from the
+<function>poll()</function> function to indicate which events occurred.
+</entry>
+</row>
+</tbody></tgroup></informaltable>
+
+</para>
+
+@revents:
+
+<!-- ##### STRUCT GSource ##### -->
+<para>
+The <structname>GSource</structname> struct is an opaque data type representing
+an event source.
+</para>
+
+
+<!-- ##### USER_FUNCTION GSourceDummyMarshal ##### -->
+<para>
+This is just a placeholder for #GClosureMarshal, which cannot be used here
+for dependency reasons.
+</para>
+
+
+
+<!-- ##### STRUCT GSourceFuncs ##### -->
+<para>
+The #GSourceFuncs struct contains a table of functions used to handle
+event sources in a generic manner.
+
+<informaltable pgwide="1" frame="none" role="struct">
+<tgroup cols="2"><colspec colwidth="2*"/><colspec colwidth="8*"/>
+<tbody>
+
+<row>
+<entry>prepare</entry>
+<entry>
+Called before all the file descriptors are polled.
+If the source can determine that it is ready here (without waiting for the
+results of the <function>poll()</function> call) it should return %TRUE.
+It can also return a @timeout_ value which should be the maximum timeout
+(in milliseconds) which should be passed to the <function>poll()</function> call.
+The actual timeout used will be -1 if all sources returned -1, or it will
+be the minimum of all the @timeout_ values returned which were >= 0.
+</entry>
+</row>
+
+<row>
+<entry>check</entry>
+<entry>
+Called after all the file descriptors are polled.
+The source should return %TRUE if it is ready to be dispatched.
+Note that some time may have passed since the previous prepare function was
+called, so the source should be checked again here.
+</entry>
+</row>
+
+<row>
+<entry>dispatch</entry>
+<entry>
+Called to dispatch the event source, after it has returned %TRUE in
+either its @prepare or its @check function. The @dispatch function is
+passed in a callback function and data. The callback function may be
+%NULL if the source was never connected to a callback using
+g_source_set_callback(). The @dispatch function should call the
+callback function with @user_data and whatever additional parameters are
+needed for this type of event source.
+</entry>
+</row>
+
+<row>
+<entry>finalize</entry>
+<entry>
+Called when the source is finalized.
+</entry>
+</row>
+</tbody></tgroup></informaltable>
+</para>
+
+<para>
+For idle sources, the prepare and check functions always return %TRUE to
+indicate that the source is always ready to be processed.
+The prepare function also returns a timeout value of 0 to ensure that the
+<function>poll()</function> call doesn't block (since that would be time
+wasted which could have been spent running the idle function).
+</para>
+<para>
+For timeout sources, the prepare and check functions both return %TRUE if the
+timeout interval has expired. The prepare function also returns a timeout
+value to ensure that the <function>poll()</function> call doesn't block too
+long and miss the next timeout.
+</para>
+<para>
+For file descriptor sources, the prepare function typically returns %FALSE,
+since it must wait until <function>poll()</function> has been called before
+it knows whether any events need to be processed. It sets the returned
+timeout to -1 to indicate that it doesn't mind how long the
+<function>poll()</function> call blocks.
+In the check function, it tests the results of the <function>poll()</function>
+call to see if the required condition has been met, and returns %TRUE if so.
+</para>
+
+@prepare:
+@check:
+@dispatch:
+@finalize:
+@closure_callback:
+@closure_marshal:
+
+<!-- ##### STRUCT GSourceCallbackFuncs ##### -->
+<para>
+The <structname>GSourceCallbackFuncs</structname> struct contains
+functions for managing callback objects.
+</para>
+
+@ref: Called when a reference is added to the callback object.
+@unref: Called when a reference to the callback object is dropped.
+@get: Called to extract the callback function and data from the callback object.
+
+<!-- ##### FUNCTION g_source_new ##### -->
+<para>
+
+</para>
+
+@source_funcs:
+@struct_size:
+@Returns:
+
+
+<!-- ##### FUNCTION g_source_ref ##### -->
+<para>
+
+</para>
+
+@source:
+@Returns:
+
+
+<!-- ##### FUNCTION g_source_unref ##### -->
+<para>
+
+</para>
+
+@source:
+
+
+<!-- ##### FUNCTION g_source_set_funcs ##### -->
+<para>
+
+</para>
+
+@source:
+@funcs:
+
+
+<!-- ##### FUNCTION g_source_attach ##### -->
+<para>
+
+</para>
+
+@source:
+@context:
+@Returns:
+
+
+<!-- ##### FUNCTION g_source_destroy ##### -->
+<para>
+
+</para>
+
+@source:
+
+
+<!-- ##### FUNCTION g_source_is_destroyed ##### -->
+<para>
+
+</para>
+
+@source:
+@Returns:
+
+
+<!-- ##### FUNCTION g_source_set_priority ##### -->
+<para>
+
+</para>
+
+@source:
+@priority:
+
+
+<!-- ##### FUNCTION g_source_get_priority ##### -->
+<para>
+
+</para>
+
+@source:
+@Returns:
+
+
+<!-- ##### FUNCTION g_source_set_can_recurse ##### -->
+<para>
+
+</para>
+
+@source:
+@can_recurse:
+
+
+<!-- ##### FUNCTION g_source_get_can_recurse ##### -->
+<para>
+
+</para>
+
+@source:
+@Returns:
+
+
+<!-- ##### FUNCTION g_source_get_id ##### -->
+<para>
+
+</para>
+
+@source:
+@Returns:
+
+
+<!-- ##### FUNCTION g_source_get_context ##### -->
+<para>
+
+</para>
+
+@source:
+@Returns:
+
+
+<!-- ##### FUNCTION g_source_set_callback ##### -->
+<para>
+
+</para>
+
+@source:
+@func:
+@data:
+@notify:
+
+
+<!-- ##### USER_FUNCTION GSourceFunc ##### -->
+<para>
+Specifies the type of function passed to g_timeout_add(), g_timeout_add_full(),
+g_idle_add(), and g_idle_add_full().
+</para>
+
+@data: data passed to the function, set when the source was created with one
+of the above functions.
+@Returns: it should return %FALSE if the source should be removed.
+
+
+<!-- ##### FUNCTION g_source_set_callback_indirect ##### -->
+<para>
+
+</para>
+
+@source:
+@callback_data:
+@callback_funcs:
+
+
+<!-- ##### FUNCTION g_source_add_poll ##### -->
+<para>
+
+</para>
+
+@source:
+@fd:
+
+
+<!-- ##### FUNCTION g_source_remove_poll ##### -->
+<para>
+
+</para>
+
+@source:
+@fd:
+
+
+<!-- ##### FUNCTION g_source_get_current_time ##### -->
+<para>
+
+</para>
+
+@source:
+@timeval:
+
+
+<!-- ##### FUNCTION g_source_remove ##### -->
+<para>
+</para>
+
+@tag:
+@Returns:
+
+
+<!-- ##### FUNCTION g_source_remove_by_funcs_user_data ##### -->
+<para>
+</para>
+
+@funcs:
+@user_data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_source_remove_by_user_data ##### -->
+<para>
+</para>
+
+@user_data:
+@Returns:
+
+<!--
+Local variables:
+mode: sgml
+sgml-parent-document: ("../glib-docs.sgml" "book" "refsect2" "")
+End:
+-->
+
+
diff --git a/trunk/docs/reference/glib/tmpl/markup.sgml b/trunk/docs/reference/glib/tmpl/markup.sgml
new file mode 100644
index 000000000..a186a912f
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/markup.sgml
@@ -0,0 +1,254 @@
+<!-- ##### SECTION Title ##### -->
+Simple XML Subset Parser
+
+<!-- ##### SECTION Short_Description ##### -->
+parses a subset of XML.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The "GMarkup" parser is intended to parse a simple markup format
+that's a subset of XML. This is a small, efficient, easy-to-use
+parser. It should not be used if you expect to interoperate with other
+applications generating full-scale XML. However, it's very useful for
+application data files, config files, etc. where you know your
+application will be the only one writing the file. Full-scale XML
+parsers should be able to parse the subset used by GMarkup, so you can
+easily migrate to full-scale XML at a later time if the need arises.
+</para>
+
+<para>
+GMarkup is not guaranteed to signal an error on all invalid XML; the
+parser may accept documents that an XML parser would not. However, XML
+documents which are not well-formed<footnote id="wellformed">Being wellformed
+is a weaker condition than being valid. See the
+<ulink url="http://www.w3.org/TR/REC-xml/">XML specification</ulink> for
+definitions of these terms.</footnote> are not considered valid GMarkup
+documents.
+</para>
+
+<para>
+Simplifications to XML include:
+<itemizedlist>
+<listitem>
+<para>
+Only UTF-8 encoding is allowed.
+</para>
+</listitem>
+<listitem>
+<para>
+No user-defined entities.
+</para>
+</listitem>
+<listitem>
+<para>
+Processing instructions, comments and the doctype declaration are "passed
+through" but are not interpreted in any way.
+</para>
+</listitem>
+<listitem>
+<para>
+No DTD or validation.
+</para>
+</listitem>
+</itemizedlist>
+</para>
+
+<para>
+The markup format does support:
+<itemizedlist>
+<listitem>
+<para>
+Elements
+</para>
+</listitem>
+<listitem>
+<para>
+Attributes
+</para>
+</listitem>
+<listitem>
+<para>
+5 standard entities: <literal>&amp;amp; &amp;lt; &amp;gt; &amp;quot; &amp;apos;</literal>
+</para>
+</listitem>
+<listitem>
+<para>
+Character references
+</para>
+</listitem>
+<listitem>
+<para>
+Sections marked as CDATA
+</para>
+</listitem>
+</itemizedlist>
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### ENUM GMarkupError ##### -->
+<para>
+Error codes returned by markup parsing.
+</para>
+
+@G_MARKUP_ERROR_BAD_UTF8: text being parsed was not valid UTF-8
+@G_MARKUP_ERROR_EMPTY: document contained nothing, or only whitespace
+@G_MARKUP_ERROR_PARSE: document was ill-formed
+@G_MARKUP_ERROR_UNKNOWN_ELEMENT: error should be set by #GMarkupParser functions; element wasn't known
+@G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE: error should be set by #GMarkupParser functions; attribute wasn't known
+@G_MARKUP_ERROR_INVALID_CONTENT: error should be set by #GMarkupParser functions; something was wrong with contents of the document, e.g. invalid attribute value
+
+<!-- ##### MACRO G_MARKUP_ERROR ##### -->
+<para>
+Error domain for markup parsing. Errors in this domain will
+be from the #GMarkupError enumeration. See #GError for information on
+error domains.
+</para>
+
+
+
+<!-- ##### ENUM GMarkupParseFlags ##### -->
+<para>
+Flags that affect the behaviour of the parser.
+</para>
+
+@G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG: flag you should not use.
+@G_MARKUP_TREAT_CDATA_AS_TEXT: When this flag is set, CDATA marked
+ sections are not passed literally to the @passthrough function of
+ the parser. Instead, the content of the section (without the
+ <literal>&lt;![CDATA[</literal> and <literal>]]&gt;</literal>) is
+ passed to the @text function. This flag was added in GLib 2.12.
+
+<!-- ##### STRUCT GMarkupParseContext ##### -->
+<para>
+A parse context is used to parse a stream of bytes that you expect to
+contain marked-up text. See g_markup_parse_context_new(),
+#GMarkupParser, and so on for more details.
+</para>
+
+
+<!-- ##### STRUCT GMarkupParser ##### -->
+<para>
+Any of the fields in #GMarkupParser can be %NULL, in which case they
+will be ignored. Except for the @error function, any of these
+callbacks can set an error; in particular the
+%G_MARKUP_ERROR_UNKNOWN_ELEMENT, %G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE,
+and %G_MARKUP_ERROR_INVALID_CONTENT errors are intended to be set
+from these callbacks. If you set an error from a callback,
+g_markup_parse_context_parse() will report that error back to its caller.
+</para>
+
+@start_element: Callback to invoke when the opening tag of an element
+ is seen.
+@end_element: Callback to invoke when the closing tag of an element is seen.
+ Note that this is also called for empty tags like
+ <literal>&lt;empty/&gt;</literal>.
+@text: Callback to invoke when some text is seen (text is always
+ inside an element). Note that the text of an element may be spread
+ over multiple calls of this function. If the %G_MARKUP_TREAT_CDATA_AS_TEXT
+ flag is set, this function is also called for the content of CDATA marked
+ sections.
+@passthrough: Callback to invoke for comments, processing instructions
+ and doctype declarations; if you're re-writing the parsed document,
+ write the passthrough text back out in the same position. If the
+ %G_MARKUP_TREAT_CDATA_AS_TEXT flag is not set, this function is also
+ called for CDATA marked sections.
+@error: Callback to invoke when an error occurs.
+
+<!-- ##### FUNCTION g_markup_escape_text ##### -->
+<para>
+
+</para>
+
+@text:
+@length:
+@Returns:
+
+
+<!-- ##### FUNCTION g_markup_printf_escaped ##### -->
+<para>
+
+</para>
+
+@format:
+@Varargs:
+@Returns:
+
+
+<!-- ##### FUNCTION g_markup_vprintf_escaped ##### -->
+<para>
+
+</para>
+
+@format:
+@args:
+@Returns:
+
+
+<!-- ##### FUNCTION g_markup_parse_context_end_parse ##### -->
+<para>
+
+</para>
+
+@context:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_markup_parse_context_free ##### -->
+<para>
+
+</para>
+
+@context:
+
+
+<!-- ##### FUNCTION g_markup_parse_context_get_position ##### -->
+<para>
+
+</para>
+
+@context:
+@line_number:
+@char_number:
+
+
+<!-- ##### FUNCTION g_markup_parse_context_get_element ##### -->
+<para>
+
+</para>
+
+@context:
+@Returns:
+
+
+<!-- ##### FUNCTION g_markup_parse_context_new ##### -->
+<para>
+
+</para>
+
+@parser:
+@flags:
+@user_data:
+@user_data_dnotify:
+@Returns:
+
+
+<!-- ##### FUNCTION g_markup_parse_context_parse ##### -->
+<para>
+
+</para>
+
+@context:
+@text:
+@text_len:
+@error:
+@Returns:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/memory.sgml b/trunk/docs/reference/glib/tmpl/memory.sgml
new file mode 100644
index 000000000..622e05598
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/memory.sgml
@@ -0,0 +1,333 @@
+<!-- ##### SECTION Title ##### -->
+Memory Allocation
+
+<!-- ##### SECTION Short_Description ##### -->
+general memory-handling.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+These functions provide support for allocating and freeing memory.
+</para>
+<note>
+<para>
+If any call to allocate memory fails, the application is terminated.
+This also means that there is no need to check if the call succeeded.
+</para>
+</note>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO g_new ##### -->
+<para>
+Allocates @n_structs elements of type @struct_type.
+The returned pointer is cast to a pointer to the given type.
+If @n_structs is 0 it returns %NULL.
+</para>
+<para>
+Since the returned pointer is already casted to the right type,
+it is normally unnecessary to cast it explicitly, and doing
+so might hide memory allocation errors.
+</para>
+
+@struct_type: the type of the elements to allocate.
+@n_structs: the number of elements to allocate.
+@Returns: a pointer to the allocated memory, cast to a pointer to @struct_type.
+
+
+<!-- ##### MACRO g_new0 ##### -->
+<para>
+Allocates @n_structs elements of type @struct_type, initialized to 0's.
+The returned pointer is cast to a pointer to the given type.
+If @n_structs is 0 it returns %NULL.
+</para>
+<para>
+Since the returned pointer is already casted to the right type,
+it is normally unnecessary to cast it explicitly, and doing
+so might hide memory allocation errors.
+</para>
+
+@struct_type: the type of the elements to allocate.
+@n_structs: the number of elements to allocate.
+@Returns: a pointer to the allocated memory, cast to a pointer to @struct_type.
+
+
+<!-- ##### MACRO g_renew ##### -->
+<para>
+Reallocates the memory pointed to by @mem, so that it now has space for
+@n_structs elements of type @struct_type. It returns the new address of
+the memory, which may have been moved.
+</para>
+
+@struct_type: the type of the elements to allocate.
+@mem: the currently allocated memory.
+@n_structs: the number of elements to allocate.
+@Returns: a pointer to the new allocated memory, cast to a pointer to @struct_type.
+
+
+<!-- ##### MACRO g_try_new ##### -->
+<para>
+Attempts to allocate @n_structs elements of type @struct_type, and returns
+%NULL on failure. Contrast with g_new(), which aborts the program on failure.
+The returned pointer is cast to a pointer to the given type.
+If @n_structs is 0 it returns %NULL.
+</para>
+
+@struct_type: the type of the elements to allocate.
+@n_structs: the number of elements to allocate.
+@Returns: a pointer to the allocated memory, cast to a pointer to @struct_type.
+@Since: 2.8
+
+
+<!-- ##### MACRO g_try_new0 ##### -->
+<para>
+Attempts to allocate @n_structs elements of type @struct_type, initialized
+to 0's, and returns %NULL on failure. Contrast with g_new0(), which aborts
+the program on failure.
+The returned pointer is cast to a pointer to the given type.
+If @n_counts is 0 it returns %NULL.
+</para>
+
+@struct_type: the type of the elements to allocate.
+@n_structs: the number of elements to allocate.
+@Returns: a pointer to the allocated memory, cast to a pointer to @struct_type.
+@Since: 2.8
+
+
+<!-- ##### MACRO g_try_renew ##### -->
+<para>
+Attempts to reallocate the memory pointed to by @mem, so that it now has
+space for @n_structs elements of type @struct_type, and returns %NULL on
+failure. Contrast with g_renew(), which aborts the program on failure.
+It returns the new address of the memory, which may have been moved.
+</para>
+
+@struct_type: the type of the elements to allocate.
+@mem: the currently allocated memory.
+@n_structs: the number of elements to allocate.
+@Returns: a pointer to the new allocated memory, cast to a pointer to @struct_type.
+@Since: 2.8
+
+
+<!-- ##### FUNCTION g_malloc ##### -->
+<para>
+Allocates @n_bytes bytes of memory.
+If @n_bytes is 0 it returns %NULL.
+</para>
+
+@n_bytes: the number of bytes to allocate.
+@Returns: a pointer to the allocated memory.
+
+
+<!-- ##### FUNCTION g_malloc0 ##### -->
+<para>
+Allocates @n_bytes bytes of memory, initialized to 0's.
+If @n_bytes is 0 it returns %NULL.
+</para>
+
+@n_bytes: the number of bytes to allocate.
+@Returns: a pointer to the allocated memory.
+
+
+<!-- ##### FUNCTION g_realloc ##### -->
+<para>
+Reallocates the memory pointed to by @mem, so that it now has space for
+@n_bytes bytes of memory. It returns the new address of the memory, which may
+have been moved. @mem may be %NULL, in which case it's considered to
+have zero-length. @n_bytes may be 0, in which case %NULL will be returned.
+</para>
+
+@mem: the memory to reallocate.
+@n_bytes: new size of the memory in bytes.
+@Returns: the new address of the allocated memory.
+
+
+<!-- ##### FUNCTION g_try_malloc ##### -->
+<para>
+Attempts to allocate @n_bytes, and returns %NULL on failure.
+Contrast with g_malloc(), which aborts the program on failure.
+</para>
+
+@n_bytes: number of bytes to allocate.
+@Returns: the allocated memory, or %NULL.
+
+
+<!-- ##### FUNCTION g_try_malloc0 ##### -->
+<para>
+Attempts to allocate @n_bytes, initialized to 0's, and returns %NULL on
+failure. Contrast with g_malloc0(), which aborts the program on failure.
+</para>
+
+@n_bytes: number of bytes to allocate.
+@Returns: the allocated memory, or %NULL.
+@Since: 2.8
+
+
+<!-- ##### FUNCTION g_try_realloc ##### -->
+<para>
+Attempts to realloc @mem to a new size, @n_bytes, and returns %NULL
+on failure. Contrast with g_realloc(), which aborts the program
+on failure. If @mem is %NULL, behaves the same as g_try_malloc().
+</para>
+
+@mem: previously-allocated memory, or %NULL.
+@n_bytes: number of bytes to allocate.
+@Returns: the allocated memory, or %NULL.
+
+
+<!-- ##### FUNCTION g_free ##### -->
+<para>
+Frees the memory pointed to by @mem.
+If @mem is %NULL it simply returns.
+</para>
+
+@mem: the memory to free.
+
+
+<!-- ##### VARIABLE g_mem_gc_friendly ##### -->
+<para>
+This variable is %TRUE if the <envar>G_DEBUG</envar> environment variable
+includes the key <link linkend="G_DEBUG">gc-friendly</link>.
+</para>
+
+
+<!-- ##### MACRO g_alloca ##### -->
+<para>
+Allocates @size bytes on the stack; these bytes will be freed when the current
+stack frame is cleaned up. This macro essentially just wraps the alloca()
+function present on most UNIX variants.
+Thus it provides the same advantages and pitfalls as alloca():
+<variablelist>
+ <varlistentry><term></term><listitem><para>
+ + alloca() is very fast, as on most systems it's implemented by just adjusting
+ the stack pointer register.
+ </para></listitem></varlistentry>
+ <varlistentry><term></term><listitem><para>
+ + It doesn't cause any memory fragmentation, within its scope, separate alloca()
+ blocks just build up and are released together at function end.
+ </para></listitem></varlistentry>
+ <varlistentry><term></term><listitem><para>
+ - Allocation sizes have to fit into the current stack frame. For instance in a
+ threaded environment on Linux, the per-thread stack size is limited to 2 Megabytes,
+ so be sparse with alloca() uses.
+ </para></listitem></varlistentry>
+ <varlistentry><term></term><listitem><para>
+ - Allocation failure due to insufficient stack space is not indicated with a %NULL
+ return like e.g. with malloc(). Instead, most systems probably handle it the same
+ way as out of stack space situations from infinite function recursion, i.e.
+ with a segmentation fault.
+ </para></listitem></varlistentry>
+ <varlistentry><term></term><listitem><para>
+ - Special care has to be taken when mixing alloca() with GNU C variable sized arrays.
+ Stack space allocated with alloca() in the same scope as a variable sized array
+ will be freed together with the variable sized array upon exit of that scope, and
+ not upon exit of the enclosing function scope.
+ </para></listitem></varlistentry>
+</variablelist>
+
+</para>
+
+@size: number of bytes to allocate.
+@Returns: space for @size bytes, allocated on the stack
+
+
+<!-- ##### MACRO g_newa ##### -->
+<para>
+Wraps g_alloca() in a more typesafe manner.
+</para>
+
+@struct_type: Type of memory chunks to be allocated
+@n_structs: Number of chunks to be allocated
+@Returns: Pointer to stack space for @n_structs chunks of type @struct_type
+
+
+<!-- ##### MACRO g_memmove ##### -->
+<para>
+
+</para>
+
+@dest:
+@src:
+@len:
+
+
+<!-- ##### FUNCTION g_memdup ##### -->
+<para>
+Allocates @byte_size bytes of memory, and copies @byte_size bytes into it
+from @mem. If @mem is %NULL it returns %NULL.
+</para>
+
+@mem: the memory to copy.
+@byte_size: the number of bytes to copy.
+@Returns: a pointer to the newly-allocated copy of the memory, or %NULL if @mem
+is %NULL.
+
+
+<!-- ##### STRUCT GMemVTable ##### -->
+<para>
+A set of functions used to perform memory allocation. The same #GMemVTable must
+be used for all allocations in the same program; a call to g_mem_set_vtable(),
+if it exists, should be prior to any use of GLib.
+</para>
+
+@malloc: function to use for allocating memory.
+@realloc: function to use for reallocating memory.
+@free: function to use to free memory.
+@calloc: function to use for allocating zero-filled memory.
+@try_malloc: function to use for allocating memory without a default error handler.
+@try_realloc: function to use for reallocating memory without a default error handler.
+
+<!-- ##### FUNCTION g_mem_set_vtable ##### -->
+<para>
+Sets the #GMemVTable to use for memory allocation. You can use this to provide
+custom memory allocation routines. <emphasis>This function must be called
+before using any other GLib functions.</emphasis> The @vtable only needs to
+provide malloc(), realloc(), and free() functions; GLib can provide default
+implementations of the others. The malloc() and realloc() implementations
+should return %NULL on failure, GLib will handle error-checking for you.
+@vtable is copied, so need not persist after this function has been called.
+</para>
+
+@vtable: table of memory allocation routines.
+
+
+<!-- ##### FUNCTION g_mem_is_system_malloc ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### VARIABLE glib_mem_profiler_table ##### -->
+<para>
+A #GMemVTable containing profiling variants of the memory
+allocation functions. Use them together with g_mem_profile()
+in order to get information about the memory allocation pattern
+of your program.
+</para>
+
+
+<!-- ##### FUNCTION g_mem_profile ##### -->
+<para>
+Outputs a summary of memory usage.
+</para>
+<para>
+It outputs the frequency of allocations of different sizes,
+the total number of bytes which have been allocated,
+the total number of bytes which have been freed,
+and the difference between the previous two values, i.e. the number of bytes
+still in use.
+</para>
+<para>
+Note that this function will not output anything unless you have
+previously installed the #glib_mem_profiler_table with g_mem_set_vtable().
+</para>
+
+
+
diff --git a/trunk/docs/reference/glib/tmpl/memory_chunks.sgml b/trunk/docs/reference/glib/tmpl/memory_chunks.sgml
new file mode 100644
index 000000000..08c2e2ed6
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/memory_chunks.sgml
@@ -0,0 +1,331 @@
+<!-- ##### SECTION Title ##### -->
+Memory Chunks
+
+<!-- ##### SECTION Short_Description ##### -->
+deprecated way to allocate groups of equal-sized chunks of memory.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+Memory chunks provide an space-efficient way to allocate equal-sized
+pieces of memory, called atoms. However, due to the administrative
+overhead (in particular for #G_ALLOC_AND_FREE, and when used from multiple
+threads), they are in practise often slower than direct use of g_malloc().
+Therefore, memory chunks have been deprecated in favor of the
+<link linkend="glib-Memory-Slices">slice allocator</link>,
+which has been added in 2.10. All internal uses of memory chunks in
+GLib have been converted to the <literal>g_slice</literal> API.
+</para>
+<para>
+There are two types of memory chunks, #G_ALLOC_ONLY, and #G_ALLOC_AND_FREE.
+<itemizedlist>
+<listitem><para>
+#G_ALLOC_ONLY chunks only allow allocation of atoms. The atoms can never
+be freed individually. The memory chunk can only be free in its entirety.
+</para></listitem>
+<listitem><para>
+#G_ALLOC_AND_FREE chunks do allow atoms to be freed individually.
+The disadvantage of this is that the memory chunk has to keep track of which
+atoms have been freed. This results in more memory being used and a slight
+degradation in performance.
+</para></listitem>
+
+</itemizedlist>
+</para>
+<para>
+To create a memory chunk use g_mem_chunk_new() or the convenience macro
+g_mem_chunk_create().
+</para>
+<para>
+To allocate a new atom use g_mem_chunk_alloc(), g_mem_chunk_alloc0(),
+or the convenience macros g_chunk_new() or g_chunk_new0().
+</para>
+<para>
+To free an atom use g_mem_chunk_free(), or the convenience macro
+g_chunk_free(). (Atoms can only be freed if the memory chunk is created
+with the type set to #G_ALLOC_AND_FREE.)
+</para>
+<para>
+To free any blocks of memory which are no longer being used, use
+g_mem_chunk_clean(). To clean all memory chunks, use g_blow_chunks().
+</para>
+<para>
+To reset the memory chunk, freeing all of the atoms, use g_mem_chunk_reset().
+</para>
+<para>
+To destroy a memory chunk, use g_mem_chunk_destroy().
+</para>
+<para>
+To help debug memory chunks, use g_mem_chunk_info() and g_mem_chunk_print().
+</para>
+
+<example>
+<title>Using a <structname>GMemChunk</structname></title>
+<programlisting>
+ GMemChunk *mem_chunk;
+ gchar *mem[10000];
+ gint i;
+
+ /* Create a GMemChunk with atoms 50 bytes long, and memory blocks holding
+ 100 bytes. Note that this means that only 2 atoms fit into each memory
+ block and so isn't very efficient. */
+ mem_chunk = g_mem_chunk_new ("test mem chunk", 50, 100, G_ALLOC_AND_FREE);
+
+ /* Now allocate 10000 atoms. */
+ for (i = 0; i &lt; 10000; i++)
+ {
+ mem[i] = g_chunk_new (gchar, mem_chunk);
+
+ /* Fill in the atom memory with some junk. */
+ for (j = 0; j &lt; 50; j++)
+ mem[i][j] = i * j;
+ }
+
+ /* Now free all of the atoms. Note that since we are going to destroy the
+ GMemChunk, this wouldn't normally be used. */
+ for (i = 0; i &lt; 10000; i++)
+ {
+ g_mem_chunk_free (mem_chunk, mem[i]);
+ }
+
+ /* We are finished with the GMemChunk, so we destroy it. */
+ g_mem_chunk_destroy (mem_chunk);
+</programlisting></example>
+
+<example>
+<title>Using a <structname>GMemChunk</structname> with data structures</title>
+<programlisting>
+ GMemChunk *array_mem_chunk;
+ GRealArray *array;
+
+ /* Create a GMemChunk to hold GRealArray structures, using the
+ g_mem_chunk_create(<!-- -->) convenience macro. We want 1024 atoms in each
+ memory block, and we want to be able to free individual atoms. */
+ array_mem_chunk = g_mem_chunk_create (GRealArray, 1024, G_ALLOC_AND_FREE);
+
+ /* Allocate one atom, using the g_chunk_new(<!-- -->) convenience macro. */
+ array = g_chunk_new (GRealArray, array_mem_chunk);
+
+ /* We can now use array just like a normal pointer to a structure. */
+ 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;
+
+ /* We can free the element, so it can be reused. */
+ g_chunk_free (array, array_mem_chunk);
+
+ /* We destroy the GMemChunk when we are finished with it. */
+ g_mem_chunk_destroy (array_mem_chunk);
+</programlisting></example>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GMemChunk ##### -->
+<para>
+The #GMemChunk struct is an opaque data structure representing a memory
+chunk. It should be accessed only through the use of the following functions.
+</para>
+
+
+<!-- ##### MACRO G_ALLOC_AND_FREE ##### -->
+<para>
+Specifies the type of a #GMemChunk.
+Used in g_mem_chunk_new() and g_mem_chunk_create() to specify that atoms
+will be freed individually.
+</para>
+
+
+
+<!-- ##### MACRO G_ALLOC_ONLY ##### -->
+<para>
+Specifies the type of a #GMemChunk.
+Used in g_mem_chunk_new() and g_mem_chunk_create() to specify that atoms
+will never be freed individually.
+</para>
+
+
+
+<!-- ##### FUNCTION g_mem_chunk_new ##### -->
+<para>
+Creates a new #GMemChunk.
+</para>
+
+@name: a string to identify the #GMemChunk. It is not copied so it
+should be valid for the lifetime of the #GMemChunk. It is only used in
+g_mem_chunk_print(), which is used for debugging.
+@atom_size: the size, in bytes, of each element in the #GMemChunk.
+@area_size: the size, in bytes, of each block of memory allocated to contain
+the atoms.
+@type: the type of the #GMemChunk.
+#G_ALLOC_AND_FREE is used if the atoms will be freed individually.
+#G_ALLOC_ONLY should be used if atoms will never be freed individually.
+#G_ALLOC_ONLY is quicker, since it does not need to track free atoms,
+but it obviously wastes memory if you no longer need many of the atoms.
+@Returns: the new #GMemChunk.
+@Deprecated: 2.10: Use the <link linkend="glib-Memory-Slices">slice allocator</link>
+ instead
+
+
+<!-- ##### FUNCTION g_mem_chunk_alloc ##### -->
+<para>
+Allocates an atom of memory from a #GMemChunk.
+</para>
+
+@mem_chunk: a #GMemChunk.
+@Returns: a pointer to the allocated atom.
+@Deprecated: 2.10: Use g_slice_alloc() instead
+
+
+<!-- ##### FUNCTION g_mem_chunk_alloc0 ##### -->
+<para>
+Allocates an atom of memory from a #GMemChunk, setting the memory to 0.
+</para>
+
+@mem_chunk: a #GMemChunk.
+@Returns: a pointer to the allocated atom.
+@Deprecated: 2.10: Use g_slice_alloc0() instead
+
+
+<!-- ##### FUNCTION g_mem_chunk_free ##### -->
+<para>
+Frees an atom in a #GMemChunk.
+This should only be called if the #GMemChunk was created with
+#G_ALLOC_AND_FREE. Otherwise it will simply return.
+</para>
+
+@mem_chunk: a #GMemChunk.
+@mem: a pointer to the atom to free.
+@Deprecated: 2.10: Use g_slice_free1() instead
+
+
+<!-- ##### FUNCTION g_mem_chunk_destroy ##### -->
+<para>
+Frees all of the memory allocated for a #GMemChunk.
+</para>
+
+@mem_chunk: a #GMemChunk.
+@Deprecated: 2.10: Use the <link linkend="glib-Memory-Slices">slice
+ allocator</link> instead
+
+
+<!-- ##### MACRO g_mem_chunk_create ##### -->
+<para>
+A convenience macro for creating a new #GMemChunk.
+It calls g_mem_chunk_new(), using the given type to create the #GMemChunk
+name. The atom size is determined using <function>sizeof()</function>, and the
+area size is calculated by multiplying the @pre_alloc parameter with
+the atom size.
+</para>
+
+@type: the type of the atoms, typically a structure name.
+@pre_alloc: the number of atoms to store in each block of memory.
+@alloc_type: the type of the #GMemChunk.
+#G_ALLOC_AND_FREE is used if the atoms will be freed individually.
+#G_ALLOC_ONLY should be used if atoms will never be freed individually.
+#G_ALLOC_ONLY is quicker, since it does not need to track free atoms,
+but it obviously wastes memory if you no longer need many of the atoms.
+@Returns: the new #GMemChunk.
+@Deprecated: 2.10: Use the <link linkend="glib-Memory-Slices">slice
+ allocator</link> instead
+
+
+<!-- ##### MACRO g_chunk_new ##### -->
+<para>
+A convenience macro to allocate an atom of memory from a #GMemChunk.
+It calls g_mem_chunk_alloc() and casts the returned atom to a pointer to
+the given type, avoiding a type cast in the source code.
+</para>
+
+@type: the type of the #GMemChunk atoms, typically a structure name.
+@chunk: a #GMemChunk.
+@Returns: a pointer to the allocated atom, cast to a pointer to @type.
+@Deprecated: 2.10: Use g_slice_new() instead
+
+
+<!-- ##### MACRO g_chunk_new0 ##### -->
+<para>
+A convenience macro to allocate an atom of memory from a #GMemChunk.
+It calls g_mem_chunk_alloc0() and casts the returned atom to a pointer to
+the given type, avoiding a type cast in the source code.
+</para>
+
+@type: the type of the #GMemChunk atoms, typically a structure name.
+@chunk: a #GMemChunk.
+@Returns: a pointer to the allocated atom, cast to a pointer to @type.
+@Deprecated: 2.10: Use g_slice_new0() instead
+
+
+<!-- ##### MACRO g_chunk_free ##### -->
+<para>
+A convenience macro to free an atom of memory from a #GMemChunk.
+It simply switches the arguments and calls g_mem_chunk_free()
+It is included simply to complement the other convenience macros, g_chunk_new()
+and g_chunk_new0().
+</para>
+
+@mem: a pointer to the atom to be freed.
+@mem_chunk: a #GMemChunk.
+@Deprecated: 2.10: Use g_slice_free() instead
+
+
+<!-- ##### FUNCTION g_mem_chunk_reset ##### -->
+<para>
+Resets a GMemChunk to its initial state.
+It frees all of the currently allocated blocks of memory.
+</para>
+
+@mem_chunk: a #GMemChunk.
+@Deprecated: 2.10: Use the <link linkend="glib-Memory-Slices">slice
+ allocator</link> instead
+
+
+<!-- ##### FUNCTION g_mem_chunk_clean ##### -->
+<para>
+Frees any blocks in a #GMemChunk which are no longer being used.
+</para>
+
+@mem_chunk: a #GMemChunk.
+@Deprecated: 2.10: Use the <link linkend="glib-Memory-Slices">slice
+ allocator</link> instead
+
+
+<!-- ##### FUNCTION g_blow_chunks ##### -->
+<para>
+Calls g_mem_chunk_clean() on all #GMemChunk objects.
+</para>
+
+@Deprecated: 2.10: Use the <link linkend="glib-Memory-Slices">slice
+ allocator</link> instead
+
+
+<!-- ##### FUNCTION g_mem_chunk_info ##### -->
+<para>
+Outputs debugging information for all #GMemChunk objects currently in use.
+It outputs the number of #GMemChunk objects currently allocated,
+and calls g_mem_chunk_print() to output information on each one.
+</para>
+
+@Deprecated: 2.10: Use the <link linkend="glib-Memory-Slices">slice
+ allocator</link> instead
+
+
+<!-- ##### FUNCTION g_mem_chunk_print ##### -->
+<para>
+Outputs debugging information for a #GMemChunk.
+It outputs the name of the #GMemChunk (set with g_mem_chunk_new()),
+the number of bytes used, and the number of blocks of memory allocated.
+</para>
+
+@mem_chunk: a #GMemChunk.
+@Deprecated: 2.10: Use the <link linkend="glib-Memory-Slices">slice
+ allocator</link> instead
+
+
diff --git a/trunk/docs/reference/glib/tmpl/memory_slices.sgml b/trunk/docs/reference/glib/tmpl/memory_slices.sgml
new file mode 100644
index 000000000..372192c51
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/memory_slices.sgml
@@ -0,0 +1,221 @@
+<!-- ##### SECTION Title ##### -->
+Memory Slices
+
+<!-- ##### SECTION Short_Description ##### -->
+efficient way to allocate groups of equal-sized chunks of memory.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+Memory slices provide a space-efficient and multi-processing scalable
+way to allocate equal-sized pieces of memory, just like the original
+#GMemChunks (from GLib &lt;= 2.8), while avoiding their excessive
+memory-waste, scalability and performance problems.
+</para>
+
+<para>
+To achieve these goals, the slice allocator uses a sophisticated,
+layered design that has been inspired by Bonwick's slab allocator
+<footnote><para>
+<ulink url="http://citeseer.ist.psu.edu/bonwick94slab.html">[Bonwick94]</ulink> Jeff Bonwick, The slab allocator: An object-caching kernel
+memory allocator. USENIX 1994, and
+<ulink url="http://citeseer.ist.psu.edu/bonwick01magazines.html">[Bonwick01]</ulink> Bonwick and Jonathan Adams, Magazines and vmem: Extending the
+slab allocator to many cpu's and arbitrary resources. USENIX 2001
+</para></footnote>.
+It uses posix_memalign() to optimize allocations of many equally-sized
+chunks, and has per-thread free lists (the so-called magazine layer)
+to quickly satisfy allocation requests of already known structure sizes.
+This is accompanied by extra caching logic to keep freed memory around
+for some time before returning it to the system. Memory that is unused
+due to alignment constraints is used for cache colorization (random
+distribution of chunk addresses) to improve CPU cache utilization. The
+caching layer of the slice allocator adapts itself to high lock contention
+to improve scalability.
+</para>
+
+<para>
+The slice allocator can allocate blocks as small as two pointers, and
+unlike malloc(), it does not reserve extra space per block. For large block
+sizes, g_slice_new() and g_slice_alloc() will automatically delegate to the
+system malloc() implementation. For newly written code it is recommended
+to use the new <literal>g_slice</literal> API instead of g_malloc() and
+friends, as long as objects are not resized during their lifetime and the
+object size used at allocation time is still available when freeing.
+</para>
+
+<example>
+<title>Using the slice allocator</title>
+<programlisting>
+ gchar *mem[10000];
+ gint i;
+
+ /* Allocate 10000 blocks. */
+ for (i = 0; i &lt; 10000; i++)
+ {
+ mem[i] = g_slice_alloc (50);
+
+ /* Fill in the memory with some junk. */
+ for (j = 0; j &lt; 50; j++)
+ mem[i][j] = i * j;
+ }
+
+ /* Now free all of the blocks. */
+ for (i = 0; i &lt; 10000; i++)
+ {
+ g_slice_free1 (50, mem[i]);
+ }
+</programlisting></example>
+
+<example>
+<title>Using the slice allocator with data structures</title>
+<programlisting>
+ GRealArray *array;
+
+ /* Allocate one block, using the g_slice_new(<!-- -->) macro. */
+ array = g_slice_new (GRealArray);
+
+ /* We can now use array just like a normal pointer to a structure. */
+ 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;
+
+ /* We can free the block, so it can be reused. */
+ g_slice_free (GRealArray, array);
+</programlisting></example>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### FUNCTION g_slice_alloc ##### -->
+<para>
+Allocates a block of memory from the slice allocator.
+The block adress handed out is guaranteed to be aligned
+to at least <literal>2 * sizeof (void*)</literal>.
+Note that the underlying slice allocation mechanism can
+be changed with the <link linkend="G_SLICE">G_SLICE=always-malloc</link>
+environment variable.
+</para>
+
+@block_size: the number of bytes to allocate
+@Returns: a pointer to the allocated memory block
+@Since: 2.10
+
+
+<!-- ##### FUNCTION g_slice_alloc0 ##### -->
+<para>
+Allocates a block of memory via g_slice_alloc()
+and initialize the returned memory to 0.
+Note that the underlying slice allocation mechanism can
+be changed with the <link linkend="G_SLICE">G_SLICE=always-malloc</link>
+environment variable.
+</para>
+
+@block_size: the number of bytes to allocate
+@Returns: a pointer to the allocated block
+@Since: 2.10
+
+
+<!-- ##### FUNCTION g_slice_free1 ##### -->
+<para>
+Frees a block of memory. The memory must have been allocated via
+g_slice_alloc() or g_slice_alloc0()
+and the @block_size has to match the size specified upon allocation.
+Note that the exact release behaviour can be changed with the
+<link linkend="G_DEBUG">G_DEBUG=gc-friendly</link> environment variable,
+also see <link linkend="G_SLICE">G_SLICE</link> for related debugging options.
+</para>
+
+@block_size: the size of the block
+@mem_block: a pointer to the block to free
+@Since: 2.10
+
+
+<!-- ##### FUNCTION g_slice_free_chain_with_offset ##### -->
+<para>
+Frees a linked list of memory blocks of structure type @type.
+The memory blocks must be equal-sized, allocated via
+g_slice_alloc() or g_slice_alloc0()
+and linked together by a @next pointer (similar to #GSList). The offset
+of the @next field in each block is passed as third argument.
+Note that the exact release behaviour can be changed with the
+<link linkend="G_DEBUG">G_DEBUG=gc-friendly</link> environment variable,
+also see <link linkend="G_SLICE">G_SLICE</link> for related debugging options.
+</para>
+
+@block_size: the size of the blocks
+@mem_chain: a pointer to the first block of the chain
+@next_offset: the offset of the @next field in the blocks
+@Since: 2.10
+
+
+<!-- ##### MACRO g_slice_new ##### -->
+<para>
+A convenience macro to allocate a block of memory from the slice allocator.
+It calls g_slice_alloc() with <literal>sizeof (@type)</literal> and casts
+the returned pointer to a pointer of the given type, avoiding a type cast
+in the source code.
+Note that the underlying slice allocation mechanism can
+be changed with the <link linkend="G_SLICE">G_SLICE=always-malloc</link>
+environment variable.
+</para>
+
+@type: the type to allocate, typically a structure name
+@Returns: a pointer to the allocated block, cast to a pointer to @type.
+@Since: 2.10
+
+
+<!-- ##### MACRO g_slice_new0 ##### -->
+<para>
+A convenience macro to allocate a block of memory from the slice allocator
+and set the memory to 0. It calls g_slice_alloc0() with
+<literal>sizeof (@type)</literal> and casts the returned pointer to a pointer
+of the given type, avoiding a type cast in the source code.
+Note that the underlying slice allocation mechanism can
+be changed with the <link linkend="G_SLICE">G_SLICE=always-malloc</link>
+environment variable.
+</para>
+
+@type: the type to allocate, typically a structure name
+@Returns: a pointer to the allocated block, cast to a pointer to @type.
+@Since: 2.10
+
+
+<!-- ##### MACRO g_slice_free ##### -->
+<para>
+A convenience macro to free a block of memory that has been allocated
+from the slice allocator. It calls g_slice_free1() using
+<literal>sizeof (type)</literal> as the block size.
+Note that the exact release behaviour can be changed with the
+<link linkend="G_DEBUG">G_DEBUG=gc-friendly</link> environment variable,
+also see <link linkend="G_SLICE">G_SLICE</link> for related debugging options.
+</para>
+
+@type: the type of the block to free, typically a structure name
+@mem: a pointer to the block to free
+@Since: 2.10
+
+
+<!-- ##### MACRO g_slice_free_chain ##### -->
+<para>
+Frees a linked list of memory blocks of structure type @type.
+The memory blocks must be equal-sized, allocated via
+g_slice_alloc() or g_slice_alloc0() and linked together by a
+@next pointer (similar to #GSList). The name of the
+@next field in @type is passed as third argument.
+Note that the exact release behaviour can be changed with the
+<link linkend="G_DEBUG">G_DEBUG=gc-friendly</link> environment variable,
+also see <link linkend="G_SLICE">G_SLICE</link> for related debugging options.
+</para>
+
+@type: the type of the @mem_chain blocks
+@mem_chain: a pointer to the first block of the chain
+@next: the field name of the next pointer in @type
+@Since: 2.10
+
+
diff --git a/trunk/docs/reference/glib/tmpl/messages.sgml b/trunk/docs/reference/glib/tmpl/messages.sgml
new file mode 100644
index 000000000..305fcd636
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/messages.sgml
@@ -0,0 +1,292 @@
+<!-- ##### SECTION Title ##### -->
+Message Logging
+
+<!-- ##### SECTION Short_Description ##### -->
+versatile support for logging messages with different levels of importance.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+These functions provide support for logging error messages or messages
+used for debugging.
+</para>
+
+<para>
+There are several built-in levels of messages, defined in #GLogLevelFlags.
+These can be extended with user-defined levels.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO G_LOG_DOMAIN ##### -->
+<para>
+Defines the log domain.
+For applications, this is typically left as the default %NULL (or "") domain.
+Libraries should define this so that any messages which they log can
+be differentiated from messages from other libraries and application code.
+But be careful not to define it in any public header files.
+</para>
+<para>
+For example, GTK+ uses this in its Makefile.am:
+</para>
+<informalexample><programlisting>
+INCLUDES = -DG_LOG_DOMAIN=\"Gtk\"
+</programlisting></informalexample>
+
+
+
+<!-- ##### MACRO G_LOG_FATAL_MASK ##### -->
+<para>
+GLib log levels that are considered fatal by default.
+</para>
+
+
+
+<!-- ##### MACRO G_LOG_LEVEL_USER_SHIFT ##### -->
+<para>
+Log level shift offset for user defined log levels (0-7 are used by GLib).
+</para>
+
+
+
+<!-- ##### USER_FUNCTION GLogFunc ##### -->
+<para>
+Specifies the prototype of log handler functions.
+</para>
+
+@log_domain: the log domain of the message.
+@log_level: the log level of the message (including the fatal and recursion
+flags).
+@message: the message to process.
+@user_data: user data, set in g_log_set_handler().
+
+
+<!-- ##### ENUM GLogLevelFlags ##### -->
+<para>
+Flags specifying the level of log messages.
+</para>
+
+@G_LOG_FLAG_RECURSION:
+@G_LOG_FLAG_FATAL:
+@G_LOG_LEVEL_ERROR:
+@G_LOG_LEVEL_CRITICAL:
+@G_LOG_LEVEL_WARNING:
+@G_LOG_LEVEL_MESSAGE:
+@G_LOG_LEVEL_INFO:
+@G_LOG_LEVEL_DEBUG:
+@G_LOG_LEVEL_MASK:
+
+<!-- ##### FUNCTION g_log ##### -->
+<para>
+Logs an error or debugging message.
+If the log level has been set as fatal, the abort()
+function is called to terminate the program.
+</para>
+
+@log_domain: the log domain, usually #G_LOG_DOMAIN.
+@log_level: the log level, either from #GLogLevelFlags or a user-defined level.
+@format: the message format. See the printf()
+documentation.
+@Varargs: the parameters to insert into the format string.
+
+
+<!-- ##### FUNCTION g_logv ##### -->
+<para>
+Logs an error or debugging message.
+If the log level has been set as fatal, the abort()
+function is called to terminate the program.
+</para>
+
+@log_domain: the log domain.
+@log_level: the log level.
+@format: the message format. See the printf()
+documentation.
+@args: the parameters to insert into the format string.
+
+
+<!-- ##### MACRO g_message ##### -->
+<para>
+A convenience function/macro to log a normal message.
+</para>
+
+@...: format string, followed by parameters to insert into the format string (as with printf())
+
+
+<!-- ##### MACRO g_warning ##### -->
+<para>
+A convenience function/macro to log a warning message.
+</para>
+
+<para>
+You can make warnings fatal at runtime by setting the %G_DEBUG environment
+variable (see <ulink url="glib-running.html">Running GLib Applications</ulink>).
+</para>
+
+@...: format string, followed by parameters to insert into the format string (as with printf())
+
+
+<!-- ##### MACRO g_critical ##### -->
+<para>
+Logs a "critical warning" (#G_LOG_LEVEL_CRITICAL). It's more or less
+application-defined what constitutes a critical vs. a regular
+warning. You could call g_log_set_always_fatal() to make critical
+warnings exit the program, then use g_critical() for fatal errors, for
+example.
+</para>
+
+<para>
+You can also make critical warnings fatal at runtime by setting
+the %G_DEBUG environment variable (see
+<ulink url="glib-running.html">Running GLib Applications</ulink>).
+</para>
+
+@...: format string, followed by parameters to insert into the format string (as with printf())
+
+
+<!-- ##### MACRO g_error ##### -->
+<para>
+A convenience function/macro to log an error message.
+Error messages are always fatal, resulting in a call to
+abort() to terminate the application.
+This function will result in a core dump; don't use it for errors you
+expect. Using this function indicates a bug in your program, i.e. an
+assertion failure.
+</para>
+
+@...: format string, followed by parameters to insert into the format string (as with printf())
+
+
+<!-- ##### MACRO g_debug ##### -->
+<para>
+A convenience function/macro to log a debug message.
+</para>
+
+@...: format string, followed by parameters to insert into the format string (as with printf())
+@Since: 2.6
+
+
+<!-- ##### FUNCTION g_log_set_handler ##### -->
+<para>
+Sets the log handler for a domain and a set of log levels.
+To handle fatal and recursive messages the @log_levels parameter
+must be combined with the #G_LOG_FLAG_FATAL and #G_LOG_FLAG_RECURSION
+bit flags.
+</para>
+<para>
+Note that since the #G_LOG_LEVEL_ERROR log level is always fatal, if
+you want to set a handler for this log level you must combine it with
+#G_LOG_FLAG_FATAL.
+</para>
+
+<example>
+<title>Adding a log handler for all warning messages in the default
+(application) domain</title>
+<programlisting>
+ g_log_set_handler (NULL, G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL
+ | G_LOG_FLAG_RECURSION, my_log_handler, NULL);
+</programlisting>
+</example>
+
+<example>
+<title>Adding a log handler for all critical messages from GTK+</title>
+<programlisting>
+ g_log_set_handler ("Gtk", G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_FATAL
+ | G_LOG_FLAG_RECURSION, my_log_handler, NULL);
+</programlisting>
+</example>
+
+<example>
+<title>Adding a log handler for <emphasis>all</emphasis> messages from
+GLib</title>
+<programlisting>
+ g_log_set_handler ("GLib", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL
+ | G_LOG_FLAG_RECURSION, my_log_handler, NULL);
+</programlisting>
+</example>
+
+@log_domain: the log domain, or %NULL for the default "" application domain.
+@log_levels: the log levels to apply the log handler for. To handle fatal
+and recursive messages as well, combine the log levels with the
+#G_LOG_FLAG_FATAL and #G_LOG_FLAG_RECURSION bit flags.
+@log_func: the log handler function.
+@user_data: data passed to the log handler.
+@Returns: the id of the new handler.
+
+
+<!-- ##### FUNCTION g_log_remove_handler ##### -->
+<para>
+Removes the log handler.
+</para>
+
+@log_domain: the log domain.
+@handler_id: the id of the handler, which was returned in g_log_set_handler().
+
+
+<!-- ##### FUNCTION g_log_set_always_fatal ##### -->
+<para>
+Sets the message levels which are always fatal, in any log domain.
+When a message with any of these levels is logged the program terminates.
+You can only set the levels defined by GLib to be fatal.
+%G_LOG_LEVEL_ERROR is always fatal.
+</para>
+
+<para>
+You can also make some message levels
+fatal at runtime by setting the %G_DEBUG environment variable (see
+<ulink url="glib-running.html">Running GLib Applications</ulink>).
+</para>
+
+@fatal_mask: the mask containing bits set for each level of error which is
+to be fatal.
+@Returns: the old fatal mask.
+
+
+<!-- ##### FUNCTION g_log_set_fatal_mask ##### -->
+<para>
+Sets the log levels which are fatal in the given domain.
+%G_LOG_LEVEL_ERROR is always fatal.
+</para>
+
+@log_domain: the log domain.
+@fatal_mask: the new fatal mask.
+@Returns: the old fatal mask for the log domain.
+
+
+<!-- ##### FUNCTION g_log_default_handler ##### -->
+<para>
+The default log handler set up by GLib; g_log_set_default_handler()
+allows to install an alternate default log handler.
+This is used if no log handler has been set for the particular log domain
+and log level combination. It outputs the message to stderr or stdout
+and if the log level is fatal it calls abort().
+</para>
+<para>
+stderr is used for levels %G_LOG_LEVEL_ERROR, %G_LOG_LEVEL_CRITICAL,
+%G_LOG_LEVEL_WARNING and %G_LOG_LEVEL_MESSAGE. stdout is used for the rest.
+</para>
+
+@log_domain: the log domain of the message.
+@log_level: the level of the message.
+@message: the message.
+@unused_data: data passed from g_log() which is unused.
+
+
+<!-- ##### FUNCTION g_log_set_default_handler ##### -->
+<para>
+Installs a default log handler which is used if no
+log handler has been set for the particular log domain
+and log level combination. By default, GLib uses
+g_log_default_handler() as default log handler.
+</para>
+
+@log_func: the log handler function.
+@user_data: data passed to the log handler.
+@Returns: the previous default log handler
+@Since: 2.6
+
+
diff --git a/trunk/docs/reference/glib/tmpl/misc_utils.sgml b/trunk/docs/reference/glib/tmpl/misc_utils.sgml
new file mode 100644
index 000000000..f0f322389
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/misc_utils.sgml
@@ -0,0 +1,423 @@
+<!-- ##### SECTION Title ##### -->
+Miscellaneous Utility Functions
+
+<!-- ##### SECTION Short_Description ##### -->
+a selection of portable utility functions.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+These are portable utility functions.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### FUNCTION g_get_application_name ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_set_application_name ##### -->
+<para>
+
+</para>
+
+@application_name:
+
+
+<!-- ##### FUNCTION g_get_prgname ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_set_prgname ##### -->
+<para>
+
+</para>
+
+@prgname:
+
+
+<!-- ##### FUNCTION g_getenv ##### -->
+<para>
+
+</para>
+
+@variable:
+@Returns:
+
+
+<!-- ##### FUNCTION g_setenv ##### -->
+<para>
+
+</para>
+
+@variable:
+@value:
+@overwrite:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unsetenv ##### -->
+<para>
+
+</para>
+
+@variable:
+
+
+<!-- ##### FUNCTION g_listenv ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_get_user_name ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_get_real_name ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_get_user_cache_dir ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_get_user_data_dir ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_get_user_config_dir ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### ENUM GUserDirectory ##### -->
+<para>
+
+</para>
+
+@G_USER_DIRECTORY_DESKTOP:
+@G_USER_DIRECTORY_DOCUMENTS:
+@G_USER_DIRECTORY_DOWNLOAD:
+@G_USER_DIRECTORY_MUSIC:
+@G_USER_DIRECTORY_PICTURES:
+@G_USER_DIRECTORY_PUBLIC_SHARE:
+@G_USER_DIRECTORY_TEMPLATES:
+@G_USER_DIRECTORY_VIDEOS:
+@G_USER_N_DIRECTORIES:
+
+<!-- ##### FUNCTION g_get_user_special_dir ##### -->
+<para>
+
+</para>
+
+@directory:
+@Returns:
+
+
+<!-- ##### FUNCTION g_get_system_data_dirs ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_get_system_config_dirs ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_get_host_name ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_get_home_dir ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_get_tmp_dir ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_get_current_dir ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_basename ##### -->
+
+
+@file_name:
+@Returns:
+
+
+<!-- ##### MACRO g_dirname ##### -->
+<para>
+This function is deprecated and will be removed in the next major
+release of GLib. Use g_path_get_dirname() instead.
+</para>
+
+<para>
+Gets the directory components of a file name.
+If the file name has no directory components "." is returned.
+The returned string should be freed when no longer needed.
+</para>
+
+@Returns: the directory components of the file.
+
+
+<!-- ##### FUNCTION g_path_is_absolute ##### -->
+<para>
+
+</para>
+
+@file_name:
+@Returns:
+
+
+<!-- ##### FUNCTION g_path_skip_root ##### -->
+<para>
+
+</para>
+
+@file_name:
+@Returns:
+
+
+<!-- ##### FUNCTION g_path_get_basename ##### -->
+<para>
+
+</para>
+
+@file_name:
+@Returns:
+
+
+<!-- ##### FUNCTION g_path_get_dirname ##### -->
+<para>
+
+</para>
+
+@file_name:
+@Returns:
+
+
+<!-- ##### FUNCTION g_build_filename ##### -->
+<para>
+
+</para>
+
+@first_element:
+@Varargs:
+@Returns:
+
+
+<!-- ##### FUNCTION g_build_filenamev ##### -->
+<para>
+
+</para>
+
+@args:
+@Returns:
+
+
+<!-- ##### FUNCTION g_build_path ##### -->
+<para>
+
+</para>
+
+@separator:
+@first_element:
+@Varargs:
+@Returns:
+
+
+<!-- ##### FUNCTION g_build_pathv ##### -->
+<para>
+
+</para>
+
+@separator:
+@args:
+@Returns:
+
+
+<!-- ##### FUNCTION g_find_program_in_path ##### -->
+<para>
+
+</para>
+
+@program:
+@Returns:
+
+
+<!-- ##### FUNCTION g_bit_nth_lsf ##### -->
+<para>
+Find the position of the first bit set in @mask, searching from (but not
+including) @nth_bit upwards. Bits are numbered from 0 (least significant)
+to sizeof(#gulong) * 8 - 1 (31 or 63, usually). To start searching from the
+0th bit, set @nth_bit to -1.
+</para>
+
+@mask: a #gulong containing flags.
+@nth_bit: the index of the bit to start the search from.
+@Returns: the index of the first bit set which is higher than @nth_bit.
+
+
+<!-- ##### FUNCTION g_bit_nth_msf ##### -->
+<para>
+Find the position of the first bit set in @mask, searching from (but not
+including) @nth_bit downwards. Bits are numbered from 0 (least significant)
+to sizeof(#gulong) * 8 - 1 (31 or 63, usually). To start searching from the
+last bit, set @nth_bit to -1 or GLIB_SIZEOF_LONG * 8.
+</para>
+
+@mask: a #gulong containing flags.
+@nth_bit: the index of the bit to start the search from.
+@Returns: the index of the first bit set which is lower than @nth_bit.
+
+
+<!-- ##### FUNCTION g_bit_storage ##### -->
+<para>
+Gets the number of bits used to hold @number,
+e.g. if @number is 4, 3 bits are needed.
+</para>
+
+@number: a guint.
+@Returns: the number of bits used to hold @number.
+
+
+<!-- ##### FUNCTION g_spaced_primes_closest ##### -->
+<para>
+Gets the smallest prime number from a built-in array of primes which
+is larger than @num. This is used within GLib to calculate the optimum
+size of a #GHashTable.
+</para>
+<para>
+The built-in array of primes ranges from 11 to 13845163 such that
+each prime is approximately 1.5-2 times the previous prime.
+</para>
+
+@num: a #guint.
+@Returns: the smallest prime number from a built-in array of primes which is
+larger than @num.
+
+
+<!-- ##### FUNCTION g_atexit ##### -->
+<para>
+
+</para>
+
+@func:
+
+
+<!-- ##### FUNCTION g_parse_debug_string ##### -->
+<para>
+
+</para>
+
+@string:
+@keys:
+@nkeys:
+@Returns:
+
+
+<!-- ##### STRUCT GDebugKey ##### -->
+<para>
+Associates a string with a bit flag.
+Used in g_parse_debug_string().
+</para>
+
+@key: the string
+@value: the flag
+
+<!-- ##### USER_FUNCTION GVoidFunc ##### -->
+<para>
+Declares a type of function which takes no arguments and has no return value.
+It is used to specify the type function passed to g_atexit().
+</para>
+
+
+
+<!-- ##### USER_FUNCTION GFreeFunc ##### -->
+<para>
+Declares a type of function which takes an arbitrary data pointer argument
+and has no return value. It is not currently used in GLib or GTK+.
+</para>
+
+@data: a data pointer.
+
+
+<!-- ##### FUNCTION g_qsort_with_data ##### -->
+<para>
+
+</para>
+
+@pbase:
+@total_elems:
+@size:
+@compare_func:
+@user_data:
+
+
+<!-- ##### FUNCTION g_nullify_pointer ##### -->
+<para>
+
+</para>
+
+@nullify_location:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/modules.sgml b/trunk/docs/reference/glib/tmpl/modules.sgml
new file mode 100644
index 000000000..50d602a9e
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/modules.sgml
@@ -0,0 +1,291 @@
+<!-- ##### SECTION Title ##### -->
+Dynamic Loading of Modules
+
+<!-- ##### SECTION Short_Description ##### -->
+portable method for dynamically loading 'plug-ins'.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+These functions provide a portable way to dynamically load object files
+(commonly known as 'plug-ins').
+The current implementation supports all systems that provide
+an implementation of dlopen() (e.g. Linux/Sun), as well as HP-UX via its
+shl_load() mechanism, and Windows platforms via DLLs.
+</para>
+
+<para>
+A program which wants to use these functions must be linked to the
+libraries output by the command <command>pkg-config --libs gmodule-2.0</command>.
+</para>
+
+<para>
+To use them you must first determine whether dynamic loading
+is supported on the platform by calling g_module_supported().
+If it is, you can open a module with g_module_open(),
+find the module's symbols (e.g. function names) with g_module_symbol(),
+and later close the module with g_module_close().
+g_module_name() will return the file name of a currently opened module.
+</para>
+<para>
+If any of the above functions fail, the error status can be found with
+g_module_error().
+</para>
+<para>
+The #GModule implementation features reference counting for opened modules,
+and supports hook functions within a module which are called when the
+module is loaded and unloaded (see #GModuleCheckInit and #GModuleUnload).
+</para>
+<para>
+If your module introduces static data to common subsystems in the running
+program, e.g. through calling <literal>g_quark_from_static_string ("my-module-stuff")</literal>,
+it must ensure that it is never unloaded, by calling g_module_make_resident().
+</para>
+
+<para>
+<example>
+<title>Calling a function defined in a <structname>GModule</structname></title>
+<programlisting>
+/* the function signature for 'say_hello' */
+typedef void (* SayHelloFunc) (const char *message);
+
+gboolean
+just_say_hello (const char *filename, GError **error)
+{
+ SayHelloFunc say_hello;
+ GModule *module;
+
+ module = g_module_open (filename, G_MODULE_BIND_LAZY);
+ if (!module)
+ {
+ g_set_error (error, FOO_ERROR, FOO_ERROR_BLAH,
+ "&percnt;s", g_module_error (<!-- -->));
+ return FALSE;
+ }
+
+ if (!g_module_symbol (module, "say_hello", (gpointer *)&amp;say_hello))
+ {
+ g_set_error (error, SAY_ERROR, SAY_ERROR_OPEN,
+ "&percnt;s: &percnt;s", filename, g_module_error (<!-- -->));
+ if (!g_module_close (module))
+ g_warning ("&percnt;s: &percnt;s", filename, g_module_error (<!-- -->));
+ return FALSE;
+ }
+
+ if (say_hello == NULL)
+ {
+ g_set_error (error, SAY_ERROR, SAY_ERROR_OPEN, "symbol say_hello is NULL");
+ if (!g_module_close (module))
+ g_warning ("&percnt;s: &percnt;s", filename, g_module_error (<!-- -->));
+ return FALSE;
+ }
+
+ if (say_hello == NULL)
+ {
+ g_set_error (error, SAY_ERROR, SAY_ERROR_OPEN, "symbol say_hello is NULL");
+ if (!g_module_close (module))
+ g_warning ("&percnt;s: &percnt;s", filename, g_module_error (<!-- -->));
+ return FALSE;
+ }
+
+ /* call our function in the module */
+ say_hello ("Hello world!");
+
+ if (!g_module_close (module))
+ g_warning ("&percnt;s: &percnt;s", filename, g_module_error (<!-- -->));
+
+ return TRUE;
+}
+</programlisting>
+</example>
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GModule ##### -->
+<para>
+The #GModule struct is an opaque data structure to represent a
+<link linkend="glib-Dynamic-Loading-of-Modules">Dynamically-Loaded Module</link>.
+It should only be accessed via the following functions.
+</para>
+
+
+<!-- ##### FUNCTION g_module_supported ##### -->
+<para>
+Checks if modules are supported on the current platform.
+</para>
+
+@Returns: %TRUE if modules are supported.
+
+
+<!-- ##### FUNCTION g_module_build_path ##### -->
+<para>
+A portable way to build the filename of a module. The platform-specific
+prefix and suffix are added to the filename, if needed, and the result is
+added to the directory, using the correct separator character.
+</para>
+<para>
+The directory should specify the directory where the module can be found.
+It can be %NULL or an empty string to indicate that the module is in a standard
+platform-specific directory, though this is not recommended since the
+wrong module may be found.
+</para>
+<para>
+For example, calling g_module_build_path() on a Linux system with a @directory
+of <filename>/lib</filename> and a @module_name of "mylibrary" will return
+<filename>/lib/libmylibrary.so</filename>. On a Windows system, using
+<filename>\Windows</filename> as the directory it will return
+<filename>\Windows\mylibrary.dll</filename>.
+</para>
+
+@directory: the directory where the module is. This can be %NULL or the empty
+string to indicate that the standard platform-specific directories will be
+used, though that is not recommended.
+@module_name: the name of the module.
+@Returns: the complete path of the module, including the standard library
+prefix and suffix. This should be freed when no longer needed.
+
+
+<!-- ##### FUNCTION g_module_open ##### -->
+<para>
+Opens a module. If the module has already been opened, its reference
+count is incremented.
+</para>
+
+<para>
+First of all g_module_open() tries to open @file_name as a module. If
+that fails and @file_name has the ".la"-suffix (and is a libtool archive)
+it tries to open the corresponding module. If that fails and it doesn't
+have the proper module suffix for the platform (#G_MODULE_SUFFIX), this
+suffix will be appended and the corresponding module will be opended. If
+that fails and @file_name doesn't have the ".la"-suffix, this suffix is
+appended and g_module_open() tries to open the corresponding module. If
+eventually that fails as well, %NULL is returned.
+</para>
+
+@file_name: the name of the file containing the module, or %NULL to obtain
+ a #GModule representing the main program itself.
+@flags: the flags used for opening the module. This can be the logical
+OR of any of the #GModuleFlags.
+@Returns: a #GModule on success, or %NULL on failure.
+
+
+<!-- ##### ENUM GModuleFlags ##### -->
+<para>
+Flags passed to g_module_open(). Note that these flags are
+not supported on all platforms.
+</para>
+
+@G_MODULE_BIND_LAZY: specifies that symbols are only resolved when needed.
+ The default action is to bind all symbols when the module is loaded.
+@G_MODULE_BIND_LOCAL: specifies that symbols in the module should
+ not be added to the global name space. The default action on most
+ platforms is to place symbols in the module in the global name space,
+ which may cause conflicts with existing symbols.
+@G_MODULE_BIND_MASK: mask for all flags.
+
+<!-- ##### FUNCTION g_module_symbol ##### -->
+<para>
+Gets a symbol pointer from a module.
+</para>
+<para>
+Note that a valid symbol can be %NULL.
+</para>
+<para>
+Note that a valid symbol can be %NULL.
+</para>
+
+@module: a #GModule.
+@symbol_name: the name of the symbol to find.
+@symbol: returns the pointer to the symbol value.
+@Returns: %TRUE on success.
+
+
+<!-- ##### FUNCTION g_module_name ##### -->
+<para>
+Gets the filename from a #GModule.
+</para>
+
+@module: a #GModule.
+@Returns: the filename of the module, or "main" if the module is the main
+program itself.
+
+
+<!-- ##### FUNCTION g_module_make_resident ##### -->
+<para>
+Ensures that a module will never be unloaded.
+Any future g_module_close() calls on the module will be ignored.
+</para>
+
+@module: a #GModule to make permanently resident.
+
+
+<!-- ##### FUNCTION g_module_close ##### -->
+<para>
+Closes a module.
+</para>
+
+@module: a #GModule to close.
+@Returns: %TRUE on success.
+
+
+<!-- ##### FUNCTION g_module_error ##### -->
+<para>
+Gets a string describing the last module error.
+</para>
+
+@Returns: a string describing the last module error.
+
+
+<!-- ##### USER_FUNCTION GModuleCheckInit ##### -->
+<para>
+Specifies the type of the module initialization function.
+If a module contains a function named g_module_check_init() it is called
+automatically when the module is loaded. It is passed the #GModule structure
+and should return %NULL on success or a string describing the initialization
+error.
+</para>
+
+@module: the #GModule corresponding to the module which has just been loaded.
+@Returns: %NULL on success, or a string describing the initialization error.
+
+
+<!-- ##### USER_FUNCTION GModuleUnload ##### -->
+<para>
+Specifies the type of the module function called when it is unloaded.
+If a module contains a function named g_module_unload() it is called
+automatically when the module is unloaded.
+It is passed the #GModule structure.
+</para>
+
+@module: the #GModule about to be unloaded.
+
+
+<!-- ##### MACRO G_MODULE_SUFFIX ##### -->
+<para>
+Expands to the proper shared library suffix for the current platform
+without the leading dot. For the most Unices and Linux this is "so",
+for some HP-UX versions this is "sl" and for Windows this is "dll".
+</para>
+
+
+
+<!-- ##### MACRO G_MODULE_EXPORT ##### -->
+<para>
+Used to declare functions exported by modules.
+</para>
+
+
+
+<!-- ##### MACRO G_MODULE_IMPORT ##### -->
+<para>
+Used to declare functions imported from modules.
+</para>
+
+
+
diff --git a/trunk/docs/reference/glib/tmpl/numerical.sgml b/trunk/docs/reference/glib/tmpl/numerical.sgml
new file mode 100644
index 000000000..d9c5ac24c
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/numerical.sgml
@@ -0,0 +1,122 @@
+<!-- ##### SECTION Title ##### -->
+Numerical Definitions
+
+<!-- ##### SECTION Short_Description ##### -->
+mathematical constants, and floating point decomposition.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+GLib offers mathematical constants such as #G_PI for the value of pi;
+many platforms have these in the C library, but some don't, the GLib
+versions always exist.
+</para>
+
+<para>
+The #GFloatIEEE754 and #GDoubleIEEE754 unions are used to access the
+ sign, mantissa and exponent of IEEE floats and doubles. These
+ unions are defined as appropriate for a given platform.
+ IEEE floats and doubles are supported (used for
+ storage) by at least Intel, PPC and Sparc, for reference: <ulink url="http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html">http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html</ulink>
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+<ulink url="http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html">http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html</ulink>
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO G_IEEE754_FLOAT_BIAS ##### -->
+<para>
+See <ulink url="http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html">http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html</ulink>
+</para>
+
+
+
+<!-- ##### MACRO G_IEEE754_DOUBLE_BIAS ##### -->
+<para>
+See <ulink url="http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html">http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html</ulink>
+</para>
+
+
+
+<!-- ##### UNION GFloatIEEE754 ##### -->
+<para>
+The #GFloatIEEE754 and #GDoubleIEEE754 unions are used to access the
+ sign, mantissa and exponent of IEEE floats and doubles. These
+ unions are defined as appropriate for a given platform.
+ IEEE floats and doubles are supported (used for
+ storage) by at least Intel, PPC and Sparc, for reference:
+<ulink url="http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html">http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html</ulink>
+</para>
+
+
+<!-- ##### UNION GDoubleIEEE754 ##### -->
+<para>
+The #GFloatIEEE754 and #GDoubleIEEE754 unions are used to access the
+ sign, mantissa and exponent of IEEE floats and doubles. These
+ unions are defined as appropriate for a given platform.
+ IEEE floats and doubles are supported (used for
+ storage) by at least Intel, PPC and Sparc, for reference:
+<ulink url="http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html">http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html</ulink>
+</para>
+
+
+<!-- ##### MACRO G_E ##### -->
+<para>
+The base of natural logarithms.
+</para>
+
+
+
+<!-- ##### MACRO G_LN2 ##### -->
+<para>
+The natural logarithm of 2.
+</para>
+
+
+
+<!-- ##### MACRO G_LN10 ##### -->
+<para>
+The natural logarithm of 10.
+</para>
+
+
+
+<!-- ##### MACRO G_PI ##### -->
+<para>
+The value of pi (ratio of circle's circumference to its diameter).
+</para>
+
+
+
+<!-- ##### MACRO G_PI_2 ##### -->
+<para>
+Pi divided by 2.
+</para>
+
+
+
+<!-- ##### MACRO G_PI_4 ##### -->
+<para>
+Pi divided by 4.
+</para>
+
+
+
+<!-- ##### MACRO G_SQRT2 ##### -->
+<para>
+The square root of two.
+</para>
+
+
+
+<!-- ##### MACRO G_LOG_2_BASE_10 ##### -->
+<para>
+Used for fooling around with float formats, see
+<ulink url="http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html">http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html</ulink>
+</para>
+
+
+
diff --git a/trunk/docs/reference/glib/tmpl/option.sgml b/trunk/docs/reference/glib/tmpl/option.sgml
new file mode 100644
index 000000000..9dc78ead9
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/option.sgml
@@ -0,0 +1,599 @@
+<!-- ##### SECTION Title ##### -->
+Commandline option parser
+
+<!-- ##### SECTION Short_Description ##### -->
+parses commandline options
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The GOption commandline parser is intended to be a simpler replacement for the
+popt library. It supports short and long commandline options, as shown in the
+following example:
+</para>
+
+<para>
+<literal>testtreemodel -r 1 --max-size 20 --rand --display=:1.0 -vb -- file1 file2</literal>
+</para>
+
+<para>
+The example demonstrates a number of features of the GOption commandline parser
+<itemizedlist>
+<listitem><para>
+ Options can be single letters, prefixed by a single dash. Multiple
+ short options can be grouped behind a single dash.
+</para></listitem>
+<listitem><para>
+ Long options are prefixed by two consecutive dashes.
+</para></listitem>
+<listitem><para>
+ Options can have an extra argument, which can be a number, a string or a
+ filename. For long options, the extra argument can be appended with an
+ equals sign after the option name.
+</para></listitem>
+<listitem><para>
+ Non-option arguments are returned to the application as rest arguments.
+</para></listitem>
+<listitem><para>
+ An argument consisting solely of two dashes turns off further parsing,
+ any remaining arguments (even those starting with a dash) are returned
+ to the application as rest arguments.
+</para></listitem>
+</itemizedlist>
+</para>
+
+<para>
+Another important feature of GOption is that it can automatically generate
+nicely formatted help output. Unless it is explicitly turned off with
+g_option_context_set_help_enabled(), GOption will recognize the
+<option>--help</option>, <option>-?</option>, <option>--help-all</option>
+and <option>--help-</option><replaceable>groupname</replaceable> options
+(where <replaceable>groupname</replaceable> is the name of a #GOptionGroup)
+and write a text similar to the one shown in the following example to stdout.
+</para>
+
+<informalexample><screen>
+Usage:
+ testtreemodel [OPTION...] - test tree model performance
+
+Help Options:
+ -?, --help Show help options
+ --help-all Show all help options
+ --help-gtk Show GTK+ Options
+
+Application Options:
+ -r, --repeats=N Average over N repetitions
+ -m, --max-size=M Test up to 2^M items
+ --display=DISPLAY X display to use
+ -v, --verbose Be verbose
+ -b, --beep Beep when done
+ --rand Randomize the data
+</screen></informalexample>
+
+<para>
+GOption groups options in #GOptionGroup<!-- -->s, which makes it easy to
+incorporate options from multiple sources. The intended use for this is
+to let applications collect option groups from the libraries it uses,
+add them to their #GOptionContext, and parse all options by a single call
+to g_option_context_parse(). See gtk_get_option_group() for an example.
+</para>
+
+<para>
+If an option is declared to be of type string or filename, GOption takes
+care of converting it to the right encoding; strings are returned in UTF-8,
+filenames are returned in the GLib filename encoding. Note that this only
+works if setlocale() has been called before g_option_context_parse().
+</para>
+
+<para>
+Here is a complete example of setting up GOption to parse the example
+commandline above and produce the example help output.
+</para>
+<informalexample><programlisting>
+static gint repeats = 2;
+static gint max_size = 8;
+static gboolean verbose = FALSE;
+static gboolean beep = FALSE;
+static gboolean rand = FALSE;
+
+static GOptionEntry entries[] =
+{
+ { "repeats", 'r', 0, G_OPTION_ARG_INT, &amp;repeats, "Average over N repetitions", "N" },
+ { "max-size", 'm', 0, G_OPTION_ARG_INT, &amp;max_size, "Test up to 2^M items", "M" },
+ { "verbose", 'v', 0, G_OPTION_ARG_NONE, &amp;verbose, "Be verbose", NULL },
+ { "beep", 'b', 0, G_OPTION_ARG_NONE, &amp;beep, "Beep when done", NULL },
+ { "rand", 0, 0, G_OPTION_ARG_NONE, &amp;rand, "Randomize the data", NULL },
+ { NULL }
+};
+
+int
+main (int argc, char *argv[])
+{
+ GError *error = NULL;
+ GOptionContext *context;
+
+ context = g_option_context_new ("- test tree model performance");
+ g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
+ g_option_context_add_group (context, gtk_get_option_group (TRUE));
+ g_option_context_parse (context, &amp;argc, &amp;argv, &amp;error);
+
+ /* ... */
+
+}
+</programlisting></informalexample>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### ENUM GOptionError ##### -->
+<para>
+Error codes returned by option parsing.
+</para>
+
+@G_OPTION_ERROR_UNKNOWN_OPTION: An option was not known to the parser.
+ This error will only be reported, if the parser hasn't been instructed
+ to ignore unknown options, see g_option_context_set_ignore_unknown_options().
+@G_OPTION_ERROR_BAD_VALUE: A value couldn't be parsed.
+@G_OPTION_ERROR_FAILED: A #GOptionArgFunc callback failed.
+
+<!-- ##### MACRO G_OPTION_ERROR ##### -->
+<para>
+Error domain for option parsing. Errors in this domain will
+be from the #GOptionError enumeration. See #GError for information on
+error domains.
+</para>
+
+
+
+<!-- ##### USER_FUNCTION GOptionArgFunc ##### -->
+<para>
+The type of function to be passed as callback for %G_OPTION_ARG_CALLBACK
+options.
+</para>
+
+@option_name: The name of the option being parsed. This will be either a
+ single dash followed by a single letter (for a short name) or two dashes
+ followed by a long option name.
+@value: The value to be parsed.
+@data: User data added to the #GOptionGroup containing the option when it
+ was created with g_option_group_new()
+@error: A return location for errors. The error code %G_OPTION_ERROR_FAILED
+ is intended to be used for errors in #GOptionArgFunc callbacks.
+@Returns: %TRUE if the option was successfully parsed, %FALSE if an error
+ occurred, in which case @error should be set with g_set_error()
+
+
+<!-- ##### STRUCT GOptionContext ##### -->
+<para>
+A <structname>GOptionContext</structname> struct defines which options
+are accepted by the commandline option parser. The struct has only private
+fields and should not be directly accessed.
+</para>
+
+
+<!-- ##### FUNCTION g_option_context_new ##### -->
+<para>
+
+</para>
+
+@parameter_string:
+@Returns:
+
+
+<!-- ##### FUNCTION g_option_context_set_summary ##### -->
+<para>
+
+</para>
+
+@context:
+@summary:
+
+
+<!-- ##### FUNCTION g_option_context_get_summary ##### -->
+<para>
+
+</para>
+
+@context:
+@Returns:
+
+
+<!-- ##### FUNCTION g_option_context_set_description ##### -->
+<para>
+
+</para>
+
+@context:
+@description:
+
+
+<!-- ##### FUNCTION g_option_context_get_description ##### -->
+<para>
+
+</para>
+
+@context:
+@Returns:
+
+
+<!-- ##### USER_FUNCTION GTranslateFunc ##### -->
+<para>
+The type of functions which are used to translate user-visible
+strings, for <option>--help</option> output.
+</para>
+
+@str: the untranslated string
+@data: user data specified when installing the function, e.g.
+ in g_option_group_set_translate_func()
+@Returns: a translation of the string for the current locale.
+ The returned string is owned by GLib and must not be freed.
+
+
+<!-- ##### FUNCTION g_option_context_set_translate_func ##### -->
+<para>
+
+</para>
+
+@context:
+@func:
+@data:
+@destroy_notify:
+
+
+<!-- ##### FUNCTION g_option_context_set_translation_domain ##### -->
+<para>
+
+</para>
+
+@context:
+@domain:
+
+
+<!-- ##### FUNCTION g_option_context_free ##### -->
+<para>
+
+</para>
+
+@context:
+
+
+<!-- ##### FUNCTION g_option_context_parse ##### -->
+<para>
+
+</para>
+
+@context:
+@argc:
+@argv:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_option_context_set_help_enabled ##### -->
+<para>
+
+</para>
+
+@context:
+@help_enabled:
+
+
+<!-- ##### FUNCTION g_option_context_get_help_enabled ##### -->
+<para>
+
+</para>
+
+@context:
+@Returns:
+
+
+<!-- ##### FUNCTION g_option_context_set_ignore_unknown_options ##### -->
+<para>
+
+</para>
+
+@context:
+@ignore_unknown:
+
+
+<!-- ##### FUNCTION g_option_context_get_ignore_unknown_options ##### -->
+<para>
+
+</para>
+
+@context:
+@Returns:
+
+
+<!-- ##### FUNCTION g_option_context_get_help ##### -->
+<para>
+
+</para>
+
+@context:
+@main_help:
+@group:
+@Returns:
+
+
+<!-- ##### ENUM GOptionArg ##### -->
+<para>
+The #GOptionArg enum values determine which type of extra argument the
+options expect to find. If an option expects an extra argument, it
+can be specified in several ways; with a short option:
+<option>-x arg</option>, with a long option: <option>--name arg</option>
+or combined in a single argument: <option>--name=arg</option>.
+</para>
+
+@G_OPTION_ARG_NONE: No extra argument. This is useful for simple flags.
+@G_OPTION_ARG_STRING: The option takes a string argument.
+@G_OPTION_ARG_INT: The option takes an integer argument.
+@G_OPTION_ARG_CALLBACK: The option provides a callback to parse the
+ extra argument.
+@G_OPTION_ARG_FILENAME: The option takes a filename as argument.
+@G_OPTION_ARG_STRING_ARRAY: The option takes a string argument, multiple
+ uses of the option are collected into an array of strings.
+@G_OPTION_ARG_FILENAME_ARRAY: The option takes a filename as argument,
+ multiple uses of the option are collected into an array of strings.
+@G_OPTION_ARG_DOUBLE: The option takes a double argument. The argument
+ can be formatted either for the user's locale or for the "C" locale. Since 2.12
+@G_OPTION_ARG_INT64: The option takes a 64-bit integer. Like %G_OPTION_ARG_INT
+ but for larger numbers. The number can be in decimal base, or in hexadecimal
+ (when prefixed with <literal>0x</literal>, for example, <literal>0xffffffff</literal>).
+ Since 2.12
+
+<!-- ##### ENUM GOptionFlags ##### -->
+<para>
+Flags which modify individual options.
+</para>
+
+@G_OPTION_FLAG_HIDDEN: The option doesn't appear in <option>--help</option>
+ output.
+@G_OPTION_FLAG_IN_MAIN: The option appears in the main section of the
+ <option>--help</option> output, even if it is defined in a group.
+@G_OPTION_FLAG_REVERSE: For options of the %G_OPTION_ARG_NONE kind, this flag
+ indicates that the sense of the option is reversed.
+@G_OPTION_FLAG_NO_ARG: For options of the %G_OPTION_ARG_CALLBACK kind,
+ this flag indicates that the callback does not take any argument
+ (like a %G_OPTION_ARG_NONE option). Since 2.8
+@G_OPTION_FLAG_FILENAME: For options of the %G_OPTION_ARG_CALLBACK
+ kind, this flag indicates that the argument should be passed to the
+ callback in the GLib filename encoding rather than UTF-8. Since 2.8
+@G_OPTION_FLAG_OPTIONAL_ARG: For options of the %G_OPTION_ARG_CALLBACK
+ kind, this flag indicates that the argument supply is optional. If no argument
+ is given then data of %GOptionParseFunc will be set to NULL. Since 2.8
+@G_OPTION_FLAG_NOALIAS: This flag turns off the automatic conflict resolution
+ which prefixes long option names with <literal>groupname-</literal> if
+ there is a conflict. This option should only be used in situations where
+ aliasing is necessary to model some legacy commandline interface. It is
+ not safe to use this option, unless all option groups are under your
+ direct control. Since 2.8.
+
+<!-- ##### MACRO G_OPTION_REMAINING ##### -->
+<para>
+If a long option in the main group has this name, it is not treated as a
+regular option. Instead it collects all non-option arguments which would
+otherwise be left in <literal>argv</literal>. The option must be of type
+%G_OPTION_ARG_CALLBACK, %G_OPTION_ARG_STRING_ARRAY
+or %G_OPTION_ARG_FILENAME_ARRAY.
+</para>
+
+<para>
+Using #G_OPTION_REMAINING instead of simply scanning <literal>argv</literal>
+for leftover arguments has the advantage that GOption takes care of
+necessary encoding conversions for strings or filenames.
+</para>
+
+@Since: 2.6
+
+
+<!-- ##### STRUCT GOptionEntry ##### -->
+<para>
+A <structname>GOptionEntry</structname> defines a single option.
+To have an effect, they must be added to a #GOptionGroup with
+g_option_context_add_main_entries() or g_option_group_add_entries().
+</para>
+
+@long_name: The long name of an option can be used to specify it
+ in a commandline as --<replaceable>long_name</replaceable>. Every
+ option must have a long name. To resolve conflicts if multiple
+ option groups contain the same long name, it is also possible to
+ specify the option as
+ --<replaceable>groupname</replaceable>-<replaceable>long_name</replaceable>.
+@short_name: If an option has a short name, it can be specified
+ -<replaceable>short_name</replaceable> in a commandline. @short_name must be
+ a printable ASCII character different from '-', or zero if the option has no
+ short name.
+@flags: Flags from #GOptionFlags.
+@arg: The type of the option, as a #GOptionArg.
+@arg_data: If the @arg type is %G_OPTION_ARG_CALLBACK, then @arg_data must
+ point to a #GOptionArgFunc callback function, which will be called to handle
+ the extra argument. Otherwise, @arg_data is a pointer to a location to store
+ the value, the required type of the location depends on the @arg type:
+ <variablelist>
+ <varlistentry>
+ <term>%G_OPTION_ARG_NONE</term>
+ <listitem><para>%gboolean</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>%G_OPTION_ARG_STRING</term>
+ <listitem><para>%gchar*</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>%G_OPTION_ARG_INT</term>
+ <listitem><para>%gint</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>%G_OPTION_ARG_FILENAME</term>
+ <listitem><para>%gchar*</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>%G_OPTION_ARG_STRING_ARRAY</term>
+ <listitem><para>%gchar**</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>%G_OPTION_ARG_FILENAME_ARRAY</term>
+ <listitem><para>%gchar**</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>%G_OPTION_ARG_DOUBLE</term>
+ <listitem><para>%gdouble</para></listitem>
+ </varlistentry>
+ </variablelist>
+@description: the description for the option in <option>--help</option>
+ output. The @description is translated using the @translate_func of the
+ group, see g_option_group_set_translation_domain().
+@arg_description: The placeholder to use for the extra argument parsed
+ by the option in <option>--help</option>
+ output. The @arg_description is translated using the @translate_func of the
+ group, see g_option_group_set_translation_domain().
+
+<!-- ##### FUNCTION g_option_context_add_main_entries ##### -->
+<para>
+
+</para>
+
+@context:
+@entries:
+@translation_domain:
+
+
+<!-- ##### STRUCT GOptionGroup ##### -->
+<para>
+A <structname>GOptionGroup</structname> struct defines the options in a single
+group. The struct has only private fields and should not be directly accessed.
+</para>
+<para>
+All options in a group share the same translation function. Libaries which
+need to parse commandline options are expected to provide a function for
+getting a <structname>GOptionGroup</structname> holding their options, which
+the application can then add to its #GOptionContext.
+</para>
+
+
+<!-- ##### FUNCTION g_option_context_add_group ##### -->
+<para>
+
+</para>
+
+@context:
+@group:
+
+
+<!-- ##### FUNCTION g_option_context_set_main_group ##### -->
+<para>
+
+</para>
+
+@context:
+@group:
+
+
+<!-- ##### FUNCTION g_option_context_get_main_group ##### -->
+<para>
+
+</para>
+
+@context:
+@Returns:
+
+
+<!-- ##### FUNCTION g_option_group_new ##### -->
+<para>
+
+</para>
+
+@name:
+@description:
+@help_description:
+@user_data:
+@destroy:
+@Returns:
+
+
+<!-- ##### FUNCTION g_option_group_free ##### -->
+<para>
+
+</para>
+
+@group:
+
+
+<!-- ##### FUNCTION g_option_group_add_entries ##### -->
+<para>
+
+</para>
+
+@group:
+@entries:
+
+
+<!-- ##### USER_FUNCTION GOptionParseFunc ##### -->
+<para>
+The type of function that can be called before and after parsing.
+</para>
+
+@context: The active #GOptionContext
+@group: The group to which the function belongs
+@data: User data added to the #GOptionGroup containing the option when it
+ was created with g_option_group_new()
+@error: A return location for error details
+@Returns: %TRUE if the function completed successfully, %FALSE if an error
+ occurred, in which case @error should be set with g_set_error()
+
+
+<!-- ##### FUNCTION g_option_group_set_parse_hooks ##### -->
+<para>
+
+</para>
+
+@group:
+@pre_parse_func:
+@post_parse_func:
+
+
+<!-- ##### USER_FUNCTION GOptionErrorFunc ##### -->
+<para>
+The type of function to be used as callback when a parse error occurs.
+</para>
+
+@context: The active #GOptionContext
+@group: The group to which the function belongs
+@data: User data added to the #GOptionGroup containing the option when it
+ was created with g_option_group_new()
+@error: The #GError containing details about the parse error
+
+
+<!-- ##### FUNCTION g_option_group_set_error_hook ##### -->
+<para>
+
+</para>
+
+@group:
+@error_func:
+
+
+<!-- ##### FUNCTION g_option_group_set_translate_func ##### -->
+<para>
+
+</para>
+
+@group:
+@func:
+@data:
+@destroy_notify:
+
+
+<!-- ##### FUNCTION g_option_group_set_translation_domain ##### -->
+<para>
+
+</para>
+
+@group:
+@domain:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/patterns.sgml b/trunk/docs/reference/glib/tmpl/patterns.sgml
new file mode 100644
index 000000000..0ebd7940e
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/patterns.sgml
@@ -0,0 +1,124 @@
+<!-- ##### SECTION Title ##### -->
+Glob-style pattern matching
+
+<!-- ##### SECTION Short_Description ##### -->
+matches strings against patterns containing '*' (wildcard) and '?' (joker).
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The <function>g_pattern_match*</function> functions match a string
+against a pattern containing '*' and '?' wildcards with similar semantics
+as the standard glob() function: '*' matches an arbitrary, possibly empty,
+string, '?' matches an arbitrary character.
+</para>
+<para>
+Note that in contrast to glob(), the '/' character
+<emphasis>can</emphasis> be matched by the wildcards, there are no
+'[...]' character ranges and '*' and '?' can <emphasis>not</emphasis>
+be escaped to include them literally in a pattern.
+</para>
+<para>
+When multiple strings must be matched against the same pattern, it
+is better to compile the pattern to a #GPatternSpec using
+g_pattern_spec_new() and use g_pattern_match_string() instead of
+g_pattern_match_simple(). This avoids the overhead of repeated
+pattern compilation.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GPatternSpec ##### -->
+<para>
+A <structname>GPatternSpec</structname> is the 'compiled' form of a pattern.
+This structure is opaque and its fields cannot be accessed directly.
+</para>
+
+
+<!-- ##### FUNCTION g_pattern_spec_new ##### -->
+<para>
+Compiles a pattern to a #GPatternSpec.
+</para>
+
+@pattern: a zero-terminated UTF-8 encoded string.
+@Returns: a newly-allocated #GPatternSpec.
+
+
+<!-- ##### FUNCTION g_pattern_spec_free ##### -->
+<para>
+Frees the memory allocated for the #GPatternSpec.
+</para>
+
+@pspec: a #GPatternSpec.
+
+
+<!-- ##### FUNCTION g_pattern_spec_equal ##### -->
+<para>
+Compares two compiled pattern specs and returns whether they
+will match the same set of strings.
+</para>
+
+@pspec1: a #GPatternSpec.
+@pspec2: another #GPatternSpec.
+@Returns: Whether the compiled patterns are equal.
+
+
+<!-- ##### FUNCTION g_pattern_match ##### -->
+<para>
+Matches a string against a compiled pattern. Passing the correct length of the
+string given is mandatory. The reversed string can be omitted by passing %NULL,
+this is more efficient if the reversed version of the string to be matched is
+not at hand, as g_pattern_match() will only construct it if the compiled pattern
+requires reverse matches.
+</para>
+<para>
+Note that, if the user code will (possibly) match a string against a multitude
+of patterns containing wildcards, chances are high that some patterns will
+require a reversed string. In this case, it's more efficient to provide the
+reversed string to avoid multiple constructions thereof in the various calls to
+g_pattern_match().
+</para>
+<para>
+Note also that the reverse of a UTF-8 encoded string can in general
+<emphasis>not</emphasis> be obtained by g_strreverse().
+This works only if the string doesn't contain any multibyte characters.
+Glib offers the g_utf8_strreverse() function to reverse UTF-8 encoded strings.
+</para>
+
+@pspec: a #GPatternSpec.
+@string_length: the length of @string.
+@string: the UTF-8 encoded string to match.
+@string_reversed: the reverse of @string or %NULL.
+@Returns: %TRUE if @string matches @pspec.
+
+
+<!-- ##### FUNCTION g_pattern_match_string ##### -->
+<para>
+Matches a string against a compiled pattern. If the string is to
+be matched against more than one pattern, consider using
+g_pattern_match() instead while supplying the reversed string.
+</para>
+
+@pspec: a #GPatternSpec.
+@string: the UTF-8 encoded string to match.
+@Returns: %TRUE if @string matches @pspec.
+
+
+<!-- ##### FUNCTION g_pattern_match_simple ##### -->
+<para>
+Matches a string against a pattern given as a string.
+If this function is to be called in a loop, it's more efficient to compile
+the pattern once with g_pattern_spec_new() and call g_pattern_match_string()
+repetively.
+</para>
+
+@pattern: the UTF-8 encoded pattern.
+@string: the UTF-8 encoded string to match.
+@Returns: %TRUE if @string matches @pspec.
+
+
diff --git a/trunk/docs/reference/glib/tmpl/quarks.sgml b/trunk/docs/reference/glib/tmpl/quarks.sgml
new file mode 100644
index 000000000..6803cde25
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/quarks.sgml
@@ -0,0 +1,123 @@
+<!-- ##### SECTION Title ##### -->
+Quarks
+
+<!-- ##### SECTION Short_Description ##### -->
+a 2-way association between a string and a unique integer identifier.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+Quarks are associations between strings and integer identifiers.
+Given either the string or the #GQuark identifier it is possible to
+retrieve the other.
+</para>
+<para>
+Quarks are used for both
+<link linkend="glib-datasets">Datasets</link> and
+<link linkend="glib-keyed-data-lists">Keyed Data Lists</link>.
+</para>
+<para>
+To create a new quark from a string, use g_quark_from_string() or
+g_quark_from_static_string().
+</para>
+<para>
+To find the string corresponding to a given #GQuark, use g_quark_to_string().
+</para>
+<para>
+To find the #GQuark corresponding to a given string, use g_quark_try_string().
+</para>
+<para>
+Another use for the string pool maintained for the quark functions is string
+interning, using g_intern_string() or g_intern_static_string(). An interned string
+is a canonical representation for a string. One important advantage of interned strings
+is that they can be compared for equality by a simple pointer comparision, rather than
+using strcmp().
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### TYPEDEF GQuark ##### -->
+<para>
+A GQuark is an integer which uniquely identifies a particular string.
+</para>
+
+
+<!-- ##### FUNCTION g_quark_from_string ##### -->
+<para>
+Gets the #GQuark identifying the given string.
+If the string does not currently have an associated #GQuark, a new
+#GQuark is created, using a copy of the string.
+</para>
+
+@string: a string.
+@Returns: the #GQuark identifying the string.
+
+
+<!-- ##### FUNCTION g_quark_from_static_string ##### -->
+<para>
+Gets the #GQuark identifying the given (static) string.
+If the string does not currently have an associated #GQuark, a new
+#GQuark is created, linked to the given string.
+</para>
+<para>
+Note that this function is identical to g_quark_from_string() except
+that if a new #GQuark is created the string itself is used rather than
+a copy. This saves memory, but can only be used if the string will
+<emphasis>always</emphasis> exist. It can be used with statically
+allocated strings in the main program, but not with statically
+allocated memory in dynamically loaded modules, if you expect to
+ever unload the module again (e.g. do not use this function in
+GTK+ theme engines).
+</para>
+
+@string: a string.
+@Returns: the #GQuark identifying the string.
+
+
+<!-- ##### FUNCTION g_quark_to_string ##### -->
+<para>
+Gets the string associated with the given #GQuark.
+</para>
+
+@quark: a #GQuark.
+@Returns: the string associated with the #GQuark.
+
+
+<!-- ##### FUNCTION g_quark_try_string ##### -->
+<para>
+Gets the #GQuark associated with the given string, or 0 if the string has
+no associated #GQuark.
+</para>
+<para>
+If you want the GQuark to be created if it doesn't already exist, use
+g_quark_from_string() or g_quark_from_static_string().
+</para>
+
+@string: a string.
+@Returns: the #GQuark associated with the string, or 0 if there is no
+#GQuark associated with the string.
+
+
+<!-- ##### FUNCTION g_intern_string ##### -->
+<para>
+
+</para>
+
+@string:
+@Returns:
+
+
+<!-- ##### FUNCTION g_intern_static_string ##### -->
+<para>
+
+</para>
+
+@string:
+@Returns:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/queue.sgml b/trunk/docs/reference/glib/tmpl/queue.sgml
new file mode 100644
index 000000000..688357d4b
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/queue.sgml
@@ -0,0 +1,432 @@
+<!-- ##### SECTION Title ##### -->
+Double-ended Queues
+
+<!-- ##### SECTION Short_Description ##### -->
+double-ended queue data structure.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The #GQueue structure and its associated functions provide a standard
+queue data structure. Internally, #GQueue uses the same data structure as
+#GList to store elements.
+</para>
+<para>
+The data contained in each element can be either integer values, by using one
+of the
+<link linkend="glib-Type-Conversion-Macros">Type Conversion Macros</link>,
+or simply pointers to any type of data.
+</para>
+<para>
+To create a new #GQueue, use g_queue_new().
+</para>
+<para>
+To initialize a statically-allocated #GQueue, use #G_QUEUE_INIT or
+g_queue_init().
+</para>
+<para>
+To add elements, use g_queue_push_head(), g_queue_push_head_link(),
+g_queue_push_tail() and g_queue_push_tail_link().
+</para>
+<para>
+To remove elements, use g_queue_pop_head() and g_queue_pop_tail().
+</para>
+<para>
+To free the entire queue, use g_queue_free().
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GQueue ##### -->
+<para>
+Contains the public fields of a <link linkend="glib-queues">Queue</link>.
+</para>
+
+@head: a pointer to the first element of the queue.
+@tail: a pointer to the last element of the queue.
+@length: the number of elements in the queue.
+
+<!-- ##### FUNCTION g_queue_new ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_free ##### -->
+<para>
+
+</para>
+
+@queue:
+
+
+<!-- ##### MACRO G_QUEUE_INIT ##### -->
+<para>
+A statically-allocated #GQueue must be initialized with this macro before it
+can be used. This macro can be used to initialize a variable, but it cannot
+be assigned to a variable. In that case you have to use g_queue_init().
+</para>
+
+<informalexample>
+<programlisting>
+GQueue my_queue = G_QUEUE_INIT;
+</programlisting>
+</informalexample>
+
+@Since: 2.14
+
+
+<!-- ##### FUNCTION g_queue_init ##### -->
+<para>
+
+</para>
+
+@queue:
+
+
+<!-- ##### FUNCTION g_queue_clear ##### -->
+<para>
+
+</para>
+
+@queue:
+
+
+<!-- ##### FUNCTION g_queue_is_empty ##### -->
+<para>
+
+</para>
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_get_length ##### -->
+<para>
+
+</para>
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_reverse ##### -->
+<para>
+
+</para>
+
+@queue:
+
+
+<!-- ##### FUNCTION g_queue_copy ##### -->
+<para>
+
+</para>
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_foreach ##### -->
+<para>
+
+</para>
+
+@queue:
+@func:
+@user_data:
+
+
+<!-- ##### FUNCTION g_queue_find ##### -->
+<para>
+
+</para>
+
+@queue:
+@data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_find_custom ##### -->
+<para>
+
+</para>
+
+@queue:
+@data:
+@func:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_sort ##### -->
+<para>
+
+</para>
+
+@queue:
+@compare_func:
+@user_data:
+
+
+<!-- ##### FUNCTION g_queue_push_head ##### -->
+<para>
+
+</para>
+
+@queue:
+@data:
+
+
+<!-- ##### FUNCTION g_queue_push_tail ##### -->
+<para>
+
+</para>
+
+@queue:
+@data:
+
+
+<!-- ##### FUNCTION g_queue_push_nth ##### -->
+<para>
+
+</para>
+
+@queue:
+@data:
+@n:
+
+
+<!-- ##### FUNCTION g_queue_pop_head ##### -->
+<para>
+
+</para>
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_pop_tail ##### -->
+<para>
+
+</para>
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_pop_nth ##### -->
+<para>
+
+</para>
+
+@queue:
+@n:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_peek_head ##### -->
+<para>
+
+</para>
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_peek_tail ##### -->
+<para>
+
+</para>
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_peek_nth ##### -->
+<para>
+
+</para>
+
+@queue:
+@n:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_index ##### -->
+<para>
+
+</para>
+
+@queue:
+@data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_remove ##### -->
+<para>
+
+</para>
+
+@queue:
+@data:
+
+
+<!-- ##### FUNCTION g_queue_remove_all ##### -->
+<para>
+
+</para>
+
+@queue:
+@data:
+
+
+<!-- ##### FUNCTION g_queue_insert_before ##### -->
+<para>
+
+</para>
+
+@queue:
+@sibling:
+@data:
+
+
+<!-- ##### FUNCTION g_queue_insert_after ##### -->
+<para>
+
+</para>
+
+@queue:
+@sibling:
+@data:
+
+
+<!-- ##### FUNCTION g_queue_insert_sorted ##### -->
+<para>
+
+</para>
+
+@queue:
+@data:
+@func:
+@user_data:
+
+
+<!-- ##### FUNCTION g_queue_push_head_link ##### -->
+<para>
+
+</para>
+
+@queue:
+@link_:
+
+
+<!-- ##### FUNCTION g_queue_push_tail_link ##### -->
+<para>
+
+</para>
+
+@queue:
+@link_:
+
+
+<!-- ##### FUNCTION g_queue_push_nth_link ##### -->
+<para>
+
+</para>
+
+@queue:
+@n:
+@link_:
+
+
+<!-- ##### FUNCTION g_queue_pop_head_link ##### -->
+<para>
+
+</para>
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_pop_tail_link ##### -->
+<para>
+
+</para>
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_pop_nth_link ##### -->
+<para>
+
+</para>
+
+@queue:
+@n:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_peek_head_link ##### -->
+<para>
+
+</para>
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_peek_tail_link ##### -->
+<para>
+
+</para>
+
+@queue:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_peek_nth_link ##### -->
+<para>
+
+</para>
+
+@queue:
+@n:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_link_index ##### -->
+<para>
+
+</para>
+
+@queue:
+@link_:
+@Returns:
+
+
+<!-- ##### FUNCTION g_queue_unlink ##### -->
+<para>
+
+</para>
+
+@queue:
+@link_:
+
+
+<!-- ##### FUNCTION g_queue_delete_link ##### -->
+<para>
+
+</para>
+
+@queue:
+@link_:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/random_numbers.sgml b/trunk/docs/reference/glib/tmpl/random_numbers.sgml
new file mode 100644
index 000000000..947897ef0
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/random_numbers.sgml
@@ -0,0 +1,206 @@
+<!-- ##### SECTION Title ##### -->
+Random Numbers
+
+<!-- ##### SECTION Short_Description ##### -->
+pseudo-random number generator.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The following functions allow you to use a portable, fast and good
+pseudo-random number generator (PRNG). It uses the Mersenne Twister
+PRNG, which was originally developed by Makoto Matsumoto and Takuji
+Nishimura. Further information can be found at <ulink
+url="http://www.math.keio.ac.jp/~matumoto/emt.html"
+>www.math.keio.ac.jp/~matumoto/emt.html</ulink>.
+</para>
+
+<para>
+If you just need a random number, you simply call the
+<function>g_random_*</function> functions, which will create a globally
+used #GRand and use the according <function>g_rand_*</function> functions
+internally. Whenever you need a stream of reproducible random numbers, you
+better create a #GRand yourself and use the <function>g_rand_*</function>
+functions directly, which will also be slightly faster. Initializing a #GRand
+with a certain seed will produce exactly the same series of random numbers
+on all platforms. This can thus be used as a seed for e.g. games.
+</para>
+
+<para>
+The <function>g_rand*_range</function> functions will return high quality
+equally distributed random numbers, whereas for example the
+<literal>(g_random_int()&percnt;max)</literal> approach often doesn't
+yield equally distributed numbers.
+</para>
+
+<para>
+GLib changed the seeding algorithm for the pseudo-random number
+generator Mersenne Twister, as used by <structname>GRand</structname>
+and <structname>GRandom</structname>. This was necessary, because some
+seeds would yield very bad pseudo-random streams. Also the
+pseudo-random integers generated by
+<function>g_rand*_int_range()</function> will have a
+slightly better equal distribution with the new version of GLib.
+</para>
+
+<para>
+The original seeding and generation algorithms, as found in GLib 2.0.x,
+can be used instead of the new ones by setting the environment variable
+<envar>G_RANDOM_VERSION</envar> to the value of '2.0'. Use the
+GLib-2.0 algorithms only if you have sequences of numbers generated
+with Glib-2.0 that you need to reproduce exactly.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GRand ##### -->
+<para>
+The #GRand struct is an opaque data structure. It should only be
+accessed through the <function>g_rand_*</function> functions.
+</para>
+
+
+<!-- ##### FUNCTION g_rand_new_with_seed ##### -->
+
+
+@seed:
+@Returns:
+
+
+<!-- ##### FUNCTION g_rand_new_with_seed_array ##### -->
+<para>
+
+</para>
+
+@seed:
+@seed_length:
+@Returns:
+
+
+<!-- ##### FUNCTION g_rand_new ##### -->
+
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_rand_copy ##### -->
+<para>
+
+</para>
+
+@rand_:
+@Returns:
+
+
+<!-- ##### FUNCTION g_rand_free ##### -->
+
+
+@rand_:
+
+
+<!-- ##### FUNCTION g_rand_set_seed ##### -->
+
+
+@rand_:
+@seed:
+
+
+<!-- ##### FUNCTION g_rand_set_seed_array ##### -->
+<para>
+
+</para>
+
+@rand_:
+@seed:
+@seed_length:
+
+
+<!-- ##### MACRO g_rand_boolean ##### -->
+<para>
+Returns a random #gboolean from @rand_. This corresponds to a unbiased
+coin toss.
+</para>
+
+@rand_: a #GRand.
+@Returns: a random #gboolean.
+
+
+<!-- ##### FUNCTION g_rand_int ##### -->
+
+
+@rand_:
+@Returns:
+
+
+<!-- ##### FUNCTION g_rand_int_range ##### -->
+
+
+@rand_:
+@begin:
+@end:
+@Returns:
+
+
+<!-- ##### FUNCTION g_rand_double ##### -->
+
+
+@rand_:
+@Returns:
+
+
+<!-- ##### FUNCTION g_rand_double_range ##### -->
+
+
+@rand_:
+@begin:
+@end:
+@Returns:
+
+
+<!-- ##### FUNCTION g_random_set_seed ##### -->
+
+
+@seed:
+
+
+<!-- ##### MACRO g_random_boolean ##### -->
+<para>
+Returns a random #gboolean. This corresponds to a unbiased coin toss.
+</para>
+
+@Returns: a random #gboolean.
+
+
+<!-- ##### FUNCTION g_random_int ##### -->
+
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_random_int_range ##### -->
+
+
+@begin:
+@end:
+@Returns:
+
+
+<!-- ##### FUNCTION g_random_double ##### -->
+
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_random_double_range ##### -->
+
+
+@begin:
+@end:
+@Returns:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/relations.sgml b/trunk/docs/reference/glib/tmpl/relations.sgml
new file mode 100644
index 000000000..0cf2873b5
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/relations.sgml
@@ -0,0 +1,204 @@
+<!-- ##### SECTION Title ##### -->
+Relations and Tuples
+
+<!-- ##### SECTION Short_Description ##### -->
+tables of data which can be indexed on any number of fields.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+A #GRelation is a table of data which can be indexed on any number of fields,
+rather like simple database tables. A #GRelation contains a number of
+records, called tuples. Each record contains a number of fields.
+Records are not ordered, so it is not possible to find the record at a
+particular index.
+</para>
+<para>
+Note that #GRelation tables are currently limited to 2 fields.
+</para>
+<para>
+To create a GRelation, use g_relation_new().
+</para>
+<para>
+To specify which fields should be indexed, use g_relation_index().
+Note that this must be called before any tuples are added to the #GRelation.
+</para>
+<para>
+To add records to a #GRelation use g_relation_insert().
+</para>
+<para>
+To determine if a given record appears in a #GRelation, use
+g_relation_exists(). Note that fields are compared directly, so pointers
+must point to the exact same position (i.e. different copies of the same
+string will not match.)
+</para>
+<para>
+To count the number of records which have a particular value in a given
+field, use g_relation_count().
+</para>
+<para>
+To get all the records which have a particular value in a given field,
+use g_relation_select(). To access fields of the resulting records,
+use g_tuples_index(). To free the resulting records use g_tuples_destroy().
+</para>
+<para>
+To delete all records which have a particular value in a given field,
+use g_relation_delete().
+</para>
+<para>
+To destroy the #GRelation, use g_relation_destroy().
+</para>
+<para>
+To help debug #GRelation objects, use g_relation_print().
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GRelation ##### -->
+<para>
+The #GRelation struct is an opaque data structure to represent a
+<link linkend="glib-Relations-and-Tuples">Relation</link>.
+It should only be accessed via the following functions.
+</para>
+
+
+<!-- ##### FUNCTION g_relation_new ##### -->
+<para>
+Creates a new #GRelation with the given number of fields.
+Note that currently the number of fields must be 2.
+</para>
+
+@fields: the number of fields.
+@Returns: a new #GRelation.
+
+
+<!-- ##### FUNCTION g_relation_index ##### -->
+<para>
+Creates an index on the given field.
+Note that this must be called before any records are added to the #GRelation.
+</para>
+
+@relation: a #GRelation.
+@field: the field to index, counting from 0.
+@hash_func: a function to produce a hash value from the field data.
+@key_equal_func: a function to compare two values of the given field.
+
+
+<!-- ##### FUNCTION g_relation_insert ##### -->
+<para>
+Inserts a record into a #GRelation.
+</para>
+
+@relation: a #GRelation.
+@Varargs: the fields of the record to add. These must match the number of
+fields in the #GRelation, and of type #gpointer or #gconstpointer.
+
+
+<!-- ##### FUNCTION g_relation_exists ##### -->
+<para>
+Returns %TRUE if a record with the given values exists in a #GRelation.
+Note that the values are compared directly, so that, for example, two
+copies of the same string will not match.
+</para>
+
+@relation: a #GRelation.
+@Varargs: the fields of the record to compare. The number must match the
+number of fields in the #GRelation.
+@Returns: %TRUE if a record matches.
+
+
+<!-- ##### FUNCTION g_relation_count ##### -->
+<para>
+Returns the number of tuples in a #GRelation that have the given value
+in the given field.
+</para>
+
+@relation: a #GRelation.
+@key: the value to compare with.
+@field: the field of each record to match.
+@Returns: the number of matches.
+
+
+<!-- ##### FUNCTION g_relation_select ##### -->
+<para>
+Returns all of the tuples which have the given key in the given field.
+Use g_tuples_index() to access the returned records.
+The returned records should be freed with g_tuples_destroy().
+</para>
+
+@relation: a #GRelation.
+@key: the value to compare with.
+@field: the field of each record to match.
+@Returns: the records (tuples) that matched.
+
+
+<!-- ##### FUNCTION g_relation_delete ##### -->
+<para>
+Deletes any records from a #GRelation that have the given key value in
+the given field.
+</para>
+
+@relation: a #GRelation.
+@key: the value to compare with.
+@field: the field of each record to match.
+@Returns: the number of records deleted.
+
+
+<!-- ##### FUNCTION g_relation_destroy ##### -->
+<para>
+Destroys the #GRelation, freeing all memory allocated.
+However, it does not free memory allocated for the
+tuple data, so you should free that first if appropriate.
+</para>
+
+@relation: a #GRelation.
+
+
+<!-- ##### FUNCTION g_relation_print ##### -->
+<para>
+Outputs information about all records in a #GRelation, as well as the indexes.
+It is for debugging.
+</para>
+
+@relation: a #GRelation.
+
+
+<!-- ##### STRUCT GTuples ##### -->
+<para>
+The #GTuples struct is used to return records (or tuples) from the
+#GRelation by g_relation_select().
+It only contains one public member - the number of records that matched.
+To access the matched records, you must use g_tuples_index().
+</para>
+
+@len: the number of records that matched.
+
+<!-- ##### FUNCTION g_tuples_destroy ##### -->
+<para>
+Frees the records which were returned by g_relation_select().
+This should always be called after g_relation_select() when you are
+finished with the records.
+The records are not removed from the #GRelation.
+</para>
+
+@tuples: the tuple data to free.
+
+
+<!-- ##### FUNCTION g_tuples_index ##### -->
+<para>
+Gets a field from the records returned by g_relation_select().
+It returns the given field of the record at the given index.
+The returned value should not be changed.
+</para>
+
+@tuples: the tuple data, returned by g_relation_select().
+@index_: the index of the record.
+@field: the field to return.
+@Returns: the field of the record.
+
+
diff --git a/trunk/docs/reference/glib/tmpl/scanner.sgml b/trunk/docs/reference/glib/tmpl/scanner.sgml
new file mode 100644
index 000000000..5f7ed576c
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/scanner.sgml
@@ -0,0 +1,604 @@
+<!-- ##### SECTION Title ##### -->
+Lexical Scanner
+
+<!-- ##### SECTION Short_Description ##### -->
+a general purpose lexical scanner.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The #GScanner and its associated functions provide a general purpose
+lexical scanner.
+</para>
+
+<!--
+FIXME: really needs an example and more detail, but I don't completely
+understand it myself. Look at gtkrc.c for some code using the scanner.
+-->
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GScanner ##### -->
+<para>
+The data structure representing a lexical scanner.
+</para>
+<para>
+You should set <structfield>input_name</structfield> after creating
+the scanner, since it is used by the default message handler when
+displaying warnings and errors. If you are scanning a file, the file
+name would be a good choice.
+</para>
+<para>
+The <structfield>user_data</structfield> and
+<structfield>max_parse_errors</structfield> fields are not used.
+If you need to associate extra data with the scanner you can place them here.
+</para>
+<para>
+If you want to use your own message handler you can set the
+<structfield>msg_handler</structfield> field. The type of the message
+handler function is declared by #GScannerMsgFunc.
+</para>
+
+@user_data:
+@max_parse_errors:
+@parse_errors:
+@input_name:
+@qdata:
+@config:
+@token: token parsed by the last g_scanner_get_next_token()
+@value: value of the last token from g_scanner_get_next_token()
+@line: line number of the last token from g_scanner_get_next_token()
+@position: char number of the last token from g_scanner_get_next_token()
+@next_token: token parsed by the last g_scanner_peek_next_token()
+@next_value: value of the last token from g_scanner_peek_next_token()
+@next_line: line number of the last token from g_scanner_peek_next_token()
+@next_position: char number of the last token from g_scanner_peek_next_token()
+@symbol_table:
+@input_fd:
+@text:
+@text_end:
+@buffer:
+@scope_id:
+@msg_handler: function to handle GScanner message output
+
+<!-- ##### STRUCT GScannerConfig ##### -->
+<para>
+Specifies the #GScanner parser configuration. Most settings can be changed during
+the parsing phase and will affect the lexical parsing of the next unpeeked token.
+</para>
+<para>
+<structfield>cset_skip_characters</structfield> specifies which characters
+should be skipped by the scanner (the default is the whitespace characters:
+space, tab, carriage-return and line-feed).
+</para>
+<para>
+<structfield>cset_identifier_first</structfield> specifies the characters
+which can start identifiers (the default is #G_CSET_a_2_z, "_", and
+#G_CSET_A_2_Z).
+</para>
+<para>
+<structfield>cset_identifier_nth</structfield> specifies the characters
+which can be used in identifiers, after the first character (the default
+is #G_CSET_a_2_z, "_0123456789", #G_CSET_A_2_Z, #G_CSET_LATINS,
+#G_CSET_LATINC).
+</para>
+<para>
+<structfield>cpair_comment_single</structfield> specifies the characters
+at the start and end of single-line comments. The default is "#\n" which
+means that single-line comments start with a '#' and continue until a '\n'
+(end of line).
+</para>
+<para>
+<structfield>case_sensitive</structfield> specifies if symbols are
+case sensitive (the default is %FALSE).
+</para>
+<para>
+<structfield>skip_comment_multi</structfield> specifies if multi-line
+comments are skipped and not returned as tokens (the default is %TRUE).
+</para>
+<para>
+<structfield>skip_comment_single</structfield> specifies if single-line
+comments are skipped and not returned as tokens (the default is %TRUE).
+</para>
+<para>
+<structfield>scan_comment_multi</structfield> specifies if multi-line
+comments are recognized (the default is %TRUE).
+</para>
+<para>
+<structfield>scan_identifier</structfield> specifies if identifiers
+are recognized (the default is %TRUE).
+</para>
+<para>
+<structfield>scan_identifier_1char</structfield> specifies if single-character
+identifiers are recognized (the default is %FALSE).
+</para>
+<para>
+<structfield>scan_identifier_NULL</structfield> specifies if
+<literal>NULL</literal> is reported as #G_TOKEN_IDENTIFIER_NULL.
+(the default is %FALSE).
+</para>
+<para>
+<structfield>scan_symbols</structfield> specifies if symbols are
+recognized (the default is %TRUE).
+</para>
+<para>
+<structfield>scan_binary</structfield> specifies if binary numbers
+are recognized (the default is %FALSE).
+</para>
+<para>
+<structfield>scan_octal</structfield> specifies if octal numbers
+are recognized (the default is %TRUE).
+</para>
+<para>
+<structfield>scan_float</structfield> specifies if floating point numbers
+are recognized (the default is %TRUE).
+</para>
+<para>
+<structfield>scan_hex</structfield> specifies if hexadecimal numbers
+are recognized (the default is %TRUE).
+</para>
+<para>
+<structfield>scan_hex_dollar</structfield> specifies if '$' is recognized
+as a prefix for hexadecimal numbers (the default is %FALSE).
+</para>
+<para>
+<structfield>scan_string_sq</structfield> specifies if strings can be
+enclosed in single quotes (the default is %TRUE).
+</para>
+<para>
+<structfield>scan_string_dq</structfield> specifies if strings can be
+enclosed in double quotes (the default is %TRUE).
+</para>
+<para>
+<structfield>numbers_2_int</structfield> specifies if binary, octal and
+hexadecimal numbers are reported as #G_TOKEN_INT (the default is %TRUE).
+</para>
+<para>
+<structfield>int_2_float</structfield> specifies if all numbers are
+reported as #G_TOKEN_FLOAT (the default is %FALSE).
+</para>
+<para>
+<structfield>identifier_2_string</structfield> specifies if identifiers
+are reported as strings (the default is %FALSE).
+</para>
+<para>
+<structfield>char_2_token</structfield> specifies if characters
+are reported by setting <literal>token = ch</literal> or as #G_TOKEN_CHAR
+(the default is %TRUE).
+</para>
+<para>
+<structfield>symbol_2_token</structfield> specifies if symbols
+are reported by setting <literal>token = v_symbol</literal> or as
+#G_TOKEN_SYMBOL (the default is %FALSE).
+</para>
+<para>
+<structfield>scope_0_fallback</structfield> specifies if a symbol
+is searched for in the default scope in addition to the current scope
+(the default is %FALSE).
+</para>
+
+@cset_skip_characters:
+@cset_identifier_first:
+@cset_identifier_nth:
+@cpair_comment_single:
+@case_sensitive:
+@skip_comment_multi:
+@skip_comment_single:
+@scan_comment_multi:
+@scan_identifier:
+@scan_identifier_1char:
+@scan_identifier_NULL:
+@scan_symbols:
+@scan_binary:
+@scan_octal:
+@scan_float:
+@scan_hex:
+@scan_hex_dollar:
+@scan_string_sq:
+@scan_string_dq:
+@numbers_2_int:
+@int_2_float:
+@identifier_2_string:
+@char_2_token:
+@symbol_2_token:
+@scope_0_fallback:
+@store_int64:
+@padding_dummy:
+
+<!-- ##### FUNCTION g_scanner_new ##### -->
+<para>
+Creates a new #GScanner.
+The @config_templ structure specifies the initial settings of the scanner,
+which are copied into the #GScanner <structfield>config</structfield> field.
+If you pass %NULL then the default settings are used.
+</para>
+
+@config_templ: the initial scanner settings.
+@Returns: the new #GScanner.
+
+
+<!-- ##### FUNCTION g_scanner_destroy ##### -->
+<para>
+Frees all memory used by the #GScanner.
+</para>
+
+@scanner: a #GScanner.
+
+
+<!-- ##### FUNCTION g_scanner_input_file ##### -->
+<para>
+Prepares to scan a file.
+</para>
+
+@scanner: a #GScanner.
+@input_fd: a file descriptor.
+
+
+<!-- ##### FUNCTION g_scanner_sync_file_offset ##### -->
+<para>
+Rewinds the filedescriptor to the current buffer position and blows
+the file read ahead buffer. This is useful for third party uses of
+the scanners filedescriptor, which hooks onto the current scanning
+position.
+</para>
+
+@scanner: a #GScanner.
+
+
+<!-- ##### FUNCTION g_scanner_input_text ##### -->
+<para>
+Prepares to scan a text buffer.
+</para>
+
+@scanner: a #GScanner.
+@text: the text buffer to scan.
+@text_len: the length of the text buffer.
+
+
+<!-- ##### FUNCTION g_scanner_peek_next_token ##### -->
+<para>
+Parses the next token, without removing it from the input stream.
+The token data is placed in the
+<structfield>next_token</structfield>,
+<structfield>next_value</structfield>,
+<structfield>next_line</structfield>, and
+<structfield>next_position</structfield> fields of the #GScanner structure.
+</para>
+<para>
+Note that, while the token is not removed from the input stream (i.e.
+the next call to g_scanner_get_next_token() will return the same token),
+it will not be reevaluated. This can lead to surprising results when
+changing scope or the scanner configuration after peeking the next token.
+Getting the next token after switching the scope or configuration will
+return whatever was peeked before, regardless of any symbols that may
+have been added or removed in the new scope.
+</para>
+
+@scanner: a #GScanner.
+@Returns: the type of the token.
+
+
+<!-- ##### FUNCTION g_scanner_get_next_token ##### -->
+<para>
+Parses the next token just like g_scanner_peek_next_token() and also
+removes it from the input stream.
+The token data is placed in the
+<structfield>token</structfield>,
+<structfield>value</structfield>,
+<structfield>line</structfield>, and
+<structfield>position</structfield> fields of the #GScanner structure.
+</para>
+
+@scanner: a #GScanner.
+@Returns: the type of the token.
+
+
+<!-- ##### FUNCTION g_scanner_eof ##### -->
+<para>
+Returns %TRUE if the scanner has reached the end of the file or text buffer.
+</para>
+
+@scanner: a #GScanner.
+@Returns: %TRUE if the scanner has reached the end of the file or text buffer.
+
+
+<!-- ##### FUNCTION g_scanner_cur_line ##### -->
+<para>
+Returns the current line in the input stream (counting from 1).
+This is the line of the last token parsed via g_scanner_get_next_token().
+</para>
+
+@scanner: a #GScanner.
+@Returns: the current line.
+
+
+<!-- ##### FUNCTION g_scanner_cur_position ##### -->
+<para>
+Returns the current position in the current line (counting from 0).
+This is the position of the last token parsed via g_scanner_get_next_token().
+</para>
+
+@scanner: a #GScanner.
+@Returns: the current position on the line.
+
+
+<!-- ##### FUNCTION g_scanner_cur_token ##### -->
+<para>
+Gets the current token type.
+This is simply the <structfield>token</structfield> field in the #GScanner
+structure.
+</para>
+
+@scanner: a #GScanner.
+@Returns: the current token type.
+
+
+<!-- ##### FUNCTION g_scanner_cur_value ##### -->
+<para>
+Gets the current token value.
+This is simply the <structfield>value</structfield> field in the #GScanner
+structure.
+</para>
+
+@scanner: a #GScanner.
+@Returns: the current token value.
+
+
+<!-- ##### FUNCTION g_scanner_set_scope ##### -->
+<para>
+Sets the current scope.
+</para>
+
+@scanner: a #GScanner.
+@scope_id: the new scope id.
+@Returns: the old scope id.
+
+
+<!-- ##### FUNCTION g_scanner_scope_add_symbol ##### -->
+<para>
+Adds a symbol to the given scope.
+</para>
+
+@scanner: a #GScanner.
+@scope_id: the scope id.
+@symbol: the symbol to add.
+@value: the value of the symbol.
+
+
+<!-- ##### FUNCTION g_scanner_scope_foreach_symbol ##### -->
+<para>
+Calls the given function for each of the symbol/value pairs in the
+given scope of the #GScanner. The function is passed the symbol and
+value of each pair, and the given @user_data parameter.
+</para>
+
+@scanner: a #GScanner.
+@scope_id: the scope id.
+@func: the function to call for each symbol/value pair.
+@user_data: user data to pass to the function.
+
+
+<!-- ##### FUNCTION g_scanner_scope_lookup_symbol ##### -->
+<para>
+Looks up a symbol in a scope and return its value. If the
+symbol is not bound in the scope, %NULL is returned.
+</para>
+
+@scanner: a #GScanner.
+@scope_id: the scope id.
+@symbol: the symbol to look up.
+@Returns: the value of @symbol in the given scope, or %NULL
+if @symbol is not bound in the given scope.
+
+
+<!-- ##### FUNCTION g_scanner_scope_remove_symbol ##### -->
+<para>
+Removes a symbol from a scope.
+</para>
+
+@scanner: a #GScanner.
+@scope_id: the scope id.
+@symbol: the symbol to remove.
+
+
+<!-- ##### MACRO g_scanner_add_symbol ##### -->
+<para>
+Adds a symbol to the default scope.
+</para>
+
+@scanner: a #GScanner.
+@symbol: the symbol to add.
+@value: the value of the symbol.
+@Deprecated: 2.2: Use g_scanner_scope_add_symbol() instead.
+
+
+<!-- ##### MACRO g_scanner_remove_symbol ##### -->
+<para>
+Removes a symbol from the default scope.
+</para>
+
+@scanner: a #GScanner.
+@symbol: the symbol to remove.
+@Deprecated: 2.2: Use g_scanner_scope_remove_symbol() instead.
+
+
+<!-- ##### MACRO g_scanner_foreach_symbol ##### -->
+<para>
+Calls a function for each symbol in the default scope.
+</para>
+
+@scanner: a #GScanner.
+@func: the function to call with each symbol.
+@data: data to pass to the function.
+@Deprecated: 2.2: Use g_scanner_scope_foreach_symbol() instead.
+
+
+<!-- ##### MACRO g_scanner_freeze_symbol_table ##### -->
+<para>
+There is no reason to use this macro, since it does nothing.
+</para>
+
+@scanner: a #GScanner.
+@Deprecated: 2.2: This macro does nothing.
+
+
+<!-- ##### MACRO g_scanner_thaw_symbol_table ##### -->
+<para>
+There is no reason to use this macro, since it does nothing.
+</para>
+
+@scanner: a #GScanner.
+@Deprecated: 2.2: This macro does nothing.
+
+
+<!-- ##### FUNCTION g_scanner_lookup_symbol ##### -->
+<para>
+Looks up a symbol in the current scope and return its value. If the
+symbol is not bound in the current scope, %NULL is returned.
+</para>
+
+@scanner: a #GScanner.
+@symbol: the symbol to look up.
+@Returns: the value of @symbol in the current scope, or %NULL
+if @symbol is not bound in the current scope.
+
+
+<!-- ##### FUNCTION g_scanner_warn ##### -->
+<para>
+Outputs a warning message, via the #GScanner message handler.
+</para>
+
+@scanner: a #GScanner.
+@format: the message format. See the <function>printf()</function>
+documentation.
+@Varargs: the parameters to insert into the format string.
+
+
+<!-- ##### FUNCTION g_scanner_error ##### -->
+<para>
+Outputs an error message, via the #GScanner message handler.
+</para>
+
+@scanner: a #GScanner.
+@format: the message format. See the <function>printf()</function>
+documentation.
+@Varargs: the parameters to insert into the format string.
+
+
+<!-- ##### FUNCTION g_scanner_unexp_token ##### -->
+<para>
+Outputs a message through the scanner's msg_handler, resulting from an
+unexpected token in the input stream.
+Note that you should not call g_scanner_peek_next_token() followed by
+g_scanner_unexp_token() without an intermediate call to
+g_scanner_get_next_token(), as g_scanner_unexp_token() evaluates the
+scanner's current token (not the peeked token) to construct part
+of the message.
+</para>
+
+@scanner: a #GScanner.
+@expected_token: the expected token.
+@identifier_spec: a string describing how the scanner's user refers to
+ identifiers (%NULL defaults to "identifier").
+ This is used if @expected_token is #G_TOKEN_IDENTIFIER
+ or #G_TOKEN_IDENTIFIER_NULL.
+@symbol_spec: a string describing how the scanner's user refers to
+ symbols (%NULL defaults to "symbol").
+ This is used if @expected_token is #G_TOKEN_SYMBOL or
+ any token value greater than #G_TOKEN_LAST.
+@symbol_name: the name of the symbol, if the scanner's current token
+ is a symbol.
+@message: a message string to output at the end of the warning/error, or %NULL.
+@is_error: if %TRUE it is output as an error. If %FALSE it is output as a
+ warning.
+
+
+<!-- ##### USER_FUNCTION GScannerMsgFunc ##### -->
+<para>
+Specifies the type of the message handler function.
+</para>
+
+@scanner: a #GScanner.
+@message: the message.
+@error: %TRUE if the message signals an error, %FALSE if it
+ signals a warning.
+
+
+<!-- ##### MACRO G_CSET_a_2_z ##### -->
+<para>
+The set of lowercase ASCII alphabet characters.
+Used for specifying valid identifier characters in #GScannerConfig.
+</para>
+
+
+
+<!-- ##### MACRO G_CSET_A_2_Z ##### -->
+<para>
+The set of uppercase ASCII alphabet characters.
+Used for specifying valid identifier characters in #GScannerConfig.
+</para>
+
+
+
+<!-- ##### MACRO G_CSET_DIGITS ##### -->
+<para>
+The set of digits.
+Used for specifying valid identifier characters in #GScannerConfig.
+</para>
+
+
+
+<!-- ##### MACRO G_CSET_LATINC ##### -->
+<para>
+The set of uppercase ISO 8859-1 alphabet characters which are
+not ASCII characters.
+Used for specifying valid identifier characters in #GScannerConfig.
+</para>
+
+
+
+<!-- ##### MACRO G_CSET_LATINS ##### -->
+<para>
+The set of lowercase ISO 8859-1 alphabet characters which are
+not ASCII characters.
+Used for specifying valid identifier characters in #GScannerConfig.
+</para>
+
+
+
+<!-- ##### ENUM GTokenType ##### -->
+<para>
+The possible types of token returned from each g_scanner_get_next_token() call.
+</para>
+
+@G_TOKEN_EOF: the end of the file.
+@G_TOKEN_LEFT_PAREN: a '(' character.
+@G_TOKEN_LEFT_CURLY: a '{' character.
+@G_TOKEN_RIGHT_CURLY: a '}' character.
+
+<!-- ##### UNION GTokenValue ##### -->
+<para>
+A union holding the value of the token.
+</para>
+
+
+<!-- ##### ENUM GErrorType ##### -->
+<para>
+The possible errors, used in the <structfield>v_error</structfield> field
+of #GTokenValue, when the token is a #G_TOKEN_ERROR.
+</para>
+
+@G_ERR_UNKNOWN: unknown error.
+@G_ERR_UNEXP_EOF: unexpected end of file.
+@G_ERR_UNEXP_EOF_IN_STRING: unterminated string constant.
+@G_ERR_UNEXP_EOF_IN_COMMENT: unterminated comment.
+@G_ERR_NON_DIGIT_IN_CONST: non-digit character in a number.
+@G_ERR_DIGIT_RADIX: digit beyond radix in a number.
+@G_ERR_FLOAT_RADIX: non-decimal floating point number.
+@G_ERR_FLOAT_MALFORMED: malformed floating point number.
+
diff --git a/trunk/docs/reference/glib/tmpl/sequence.sgml b/trunk/docs/reference/glib/tmpl/sequence.sgml
new file mode 100644
index 000000000..3f5007649
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/sequence.sgml
@@ -0,0 +1,432 @@
+<!-- ##### SECTION Title ##### -->
+Sequences
+
+<!-- ##### SECTION Short_Description ##### -->
+scalable lists
+
+<!-- ##### SECTION Long_Description ##### -->
+
+<para>
+The #GSequence data structure has the API of a list, but is
+implemented internally with a balanced binary tree. This means that it
+is possible to maintain a sorted list of n elements in time O(n log
+n). The data contained in each element can be either integer values, by
+using of the
+<link linkend="glib-Type-Conversion-Macros">Type Conversion Macros</link>,
+or simply pointers to any type of data.
+</para>
+
+<para>
+A #GSequence is accessed through <firstterm>iterators</firstterm>,
+represented by a #GSequenceIter. An iterator represents a position
+between two elements of the sequence. For example, the
+<firstterm>begin</firstterm> iterator represents the gap immediately
+before the first element of the sequence, and the
+<firstterm>end</firstterm> iterator represents the gap immediately
+after the last element. In an empty sequence, the begin and end
+iterators are the same.
+</para>
+
+<para>
+Some methods on #GSequence operate on ranges of items. For example
+g_sequence_foreach_range() will call a user-specified function on each
+element with the given range. The range is delimited by the gaps
+represented by the passed-in iterators, so if you pass in the begin
+and end iterators, the range in question is the entire sequence.
+</para>
+
+
+<para>
+The function g_sequence_get() is used with an iterator to access the
+element immediately following the gap that the iterator
+represents. The iterator is said to <firstterm>point</firstterm> to
+that element.
+</para>
+
+<para>
+Iterators are stable across most operations on a #GSequence. For
+example an iterator pointing to some element of a sequence will
+continue to point to that element even after the sequence is
+sorted. Even moving an element to another sequence using for example
+g_sequence_move_range() will not invalidate the iterators pointing to
+it. The only operation that will invalidate an iterator is when the
+element it points to is removed from any sequence.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GSequence ##### -->
+<para>
+The <structname>GSequence</structname> struct is an opaque data type
+representing a <link linkend="glib-Sequences">Sequence</link> data type.
+</para>
+
+
+<!-- ##### TYPEDEF GSequenceIter ##### -->
+<para>
+The <structname>GSequenceIter</structname> struct is an opaque data
+type representing an iterator pointing into a #GSequence.
+</para>
+
+
+<!-- ##### USER_FUNCTION GSequenceIterCompareFunc ##### -->
+<para>
+A #GSequenceIterCompareFunc is a function used to compare
+iterators. It must return zero if the iterators compare equal, a
+negative value if @a comes before @b, and a positive value if @b comes
+before @a.
+</para>
+
+@a: a #GSequenceIter
+@b: a #GSequenceIter
+@data: user data
+@Returns: zero if the iterators are equal, a negative value if @a
+comes before @b, and a positive value if @b comes before @a.
+
+
+<!-- ##### FUNCTION g_sequence_new ##### -->
+<para>
+
+</para>
+
+@data_destroy:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_free ##### -->
+<para>
+
+</para>
+
+@seq:
+
+
+<!-- ##### FUNCTION g_sequence_get_length ##### -->
+<para>
+
+</para>
+
+@seq:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_foreach ##### -->
+<para>
+
+</para>
+
+@seq:
+@func:
+@user_data:
+
+
+<!-- ##### FUNCTION g_sequence_foreach_range ##### -->
+<para>
+
+</para>
+
+@begin:
+@end:
+@func:
+@user_data:
+
+
+<!-- ##### FUNCTION g_sequence_sort ##### -->
+<para>
+
+</para>
+
+@seq:
+@cmp_func:
+@cmp_data:
+
+
+<!-- ##### FUNCTION g_sequence_sort_iter ##### -->
+<para>
+
+</para>
+
+@seq:
+@cmp_func:
+@cmp_data:
+
+
+<!-- ##### FUNCTION g_sequence_get_begin_iter ##### -->
+<para>
+
+</para>
+
+@seq:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_get_end_iter ##### -->
+<para>
+
+</para>
+
+@seq:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_get_iter_at_pos ##### -->
+<para>
+
+</para>
+
+@seq:
+@pos:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_append ##### -->
+<para>
+
+</para>
+
+@seq:
+@data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_prepend ##### -->
+<para>
+
+</para>
+
+@seq:
+@data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_insert_before ##### -->
+<para>
+
+</para>
+
+@iter:
+@data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_move ##### -->
+<para>
+
+</para>
+
+@src:
+@dest:
+
+
+<!-- ##### FUNCTION g_sequence_swap ##### -->
+<para>
+
+</para>
+
+@a:
+@b:
+
+
+<!-- ##### FUNCTION g_sequence_insert_sorted ##### -->
+<para>
+
+</para>
+
+@seq:
+@data:
+@cmp_func:
+@cmp_data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_insert_sorted_iter ##### -->
+<para>
+
+</para>
+
+@seq:
+@data:
+@iter_cmp:
+@cmp_data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_sort_changed ##### -->
+<para>
+
+</para>
+
+@iter:
+@cmp_func:
+@cmp_data:
+
+
+<!-- ##### FUNCTION g_sequence_sort_changed_iter ##### -->
+<para>
+
+</para>
+
+@iter:
+@iter_cmp:
+@cmp_data:
+
+
+<!-- ##### FUNCTION g_sequence_remove ##### -->
+<para>
+
+</para>
+
+@iter:
+
+
+<!-- ##### FUNCTION g_sequence_remove_range ##### -->
+<para>
+
+</para>
+
+@begin:
+@end:
+
+
+<!-- ##### FUNCTION g_sequence_move_range ##### -->
+<para>
+
+</para>
+
+@dest:
+@begin:
+@end:
+
+
+<!-- ##### FUNCTION g_sequence_search ##### -->
+<para>
+
+</para>
+
+@seq:
+@data:
+@cmp_func:
+@cmp_data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_search_iter ##### -->
+<para>
+
+</para>
+
+@seq:
+@data:
+@iter_cmp:
+@cmp_data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_get ##### -->
+<para>
+
+</para>
+
+@iter:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_set ##### -->
+<para>
+
+</para>
+
+@iter:
+@data:
+
+
+<!-- ##### FUNCTION g_sequence_iter_is_begin ##### -->
+<para>
+
+</para>
+
+@iter:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_iter_is_end ##### -->
+<para>
+
+</para>
+
+@iter:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_iter_next ##### -->
+<para>
+
+</para>
+
+@iter:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_iter_prev ##### -->
+<para>
+
+</para>
+
+@iter:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_iter_get_position ##### -->
+<para>
+
+</para>
+
+@iter:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_iter_move ##### -->
+<para>
+
+</para>
+
+@iter:
+@delta:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_iter_get_sequence ##### -->
+<para>
+
+</para>
+
+@iter:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_iter_compare ##### -->
+<para>
+
+</para>
+
+@a:
+@b:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sequence_range_get_midpoint ##### -->
+<para>
+
+</para>
+
+@begin:
+@end:
+@Returns:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/shell.sgml b/trunk/docs/reference/glib/tmpl/shell.sgml
new file mode 100644
index 000000000..b2304e639
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/shell.sgml
@@ -0,0 +1,68 @@
+<!-- ##### SECTION Title ##### -->
+Shell-related Utilities
+
+<!-- ##### SECTION Short_Description ##### -->
+shell-like commandline handling.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### ENUM GShellError ##### -->
+<para>
+Error codes returned by shell functions.
+</para>
+
+@G_SHELL_ERROR_BAD_QUOTING: Mismatched or otherwise mangled quoting.
+@G_SHELL_ERROR_EMPTY_STRING: String to be parsed was empty.
+@G_SHELL_ERROR_FAILED: Some other error.
+
+<!-- ##### MACRO G_SHELL_ERROR ##### -->
+<para>
+Error domain for shell functions. Errors in this domain will
+be from the #GShellError enumeration. See #GError for information on
+error domains.
+</para>
+
+
+
+<!-- ##### FUNCTION g_shell_parse_argv ##### -->
+<para>
+
+</para>
+
+@command_line:
+@argcp:
+@argvp:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_shell_quote ##### -->
+<para>
+
+</para>
+
+@unquoted_string:
+@Returns:
+
+
+<!-- ##### FUNCTION g_shell_unquote ##### -->
+<para>
+
+</para>
+
+@quoted_string:
+@error:
+@Returns:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/spawn.sgml b/trunk/docs/reference/glib/tmpl/spawn.sgml
new file mode 100644
index 000000000..4dd647e5e
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/spawn.sgml
@@ -0,0 +1,183 @@
+<!-- ##### SECTION Title ##### -->
+Spawning Processes
+
+<!-- ##### SECTION Short_Description ##### -->
+process launching with fork()/exec().
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### ENUM GSpawnError ##### -->
+<para>
+Error codes returned by spawning processes.
+</para>
+
+@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 directory 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: execv() returned %ENAMETOOLONG.
+@G_SPAWN_ERROR_NOENT: execv() returned %ENOENT.
+@G_SPAWN_ERROR_NOMEM: execv() returned %ENOMEM.
+@G_SPAWN_ERROR_NOTDIR: execv() returned %ENOTDIR.
+@G_SPAWN_ERROR_LOOP: execv() returned %ELOOP.
+@G_SPAWN_ERROR_TXTBUSY: execv() returned %ETXTBUSY.
+@G_SPAWN_ERROR_IO: execv() returned %EIO.
+@G_SPAWN_ERROR_NFILE: execv() returned %ENFILE.
+@G_SPAWN_ERROR_MFILE: execv() returned %EMFILE.
+@G_SPAWN_ERROR_INVAL: execv() returned %EINVAL.
+@G_SPAWN_ERROR_ISDIR: execv() returned %EISDIR.
+@G_SPAWN_ERROR_LIBBAD: execv() returned %ELIBBAD.
+@G_SPAWN_ERROR_FAILED: Some other fatal failure, <literal>error-&gt;message</literal> should explain.
+
+<!-- ##### MACRO G_SPAWN_ERROR ##### -->
+<para>
+Error domain for spawning processes. Errors in this domain will
+be from the #GSpawnError enumeration. See #GError for information on
+error domains.
+</para>
+
+
+
+<!-- ##### ENUM GSpawnFlags ##### -->
+<para>
+Flags passed to g_spawn_sync(), g_spawn_async() and g_spawn_async_with_pipes().
+</para>
+
+@G_SPAWN_LEAVE_DESCRIPTORS_OPEN: 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_DO_NOT_REAP_CHILD: the child will not be automatically reaped; you
+ must use g_child_watch_add() yourself (or call waitpid()
+ or handle <literal>SIGCHLD</literal> yourself), or the child will become a zombie.
+@G_SPAWN_SEARCH_PATH: <literal>argv[0]</literal> need not be an absolute path,
+ it will be looked for in the user's <envar>PATH</envar>.
+@G_SPAWN_STDOUT_TO_DEV_NULL: 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: the child's standard error will be discarded.
+@G_SPAWN_CHILD_INHERITS_STDIN: the child will inherit the parent's standard
+ input (by default, the child's standard input is attached to
+ <filename>/dev/null</filename>).
+@G_SPAWN_FILE_AND_ARGV_ZERO: the first element of <literal>argv</literal> 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
+ <literal>argv[0]</literal> as the file to execute, and passes all of
+ <literal>argv</literal> to the child.
+
+<!-- ##### USER_FUNCTION GSpawnChildSetupFunc ##### -->
+<para>
+Specifies the type of the setup function passed to g_spawn_async(),
+g_spawn_sync() and g_spawn_async_with_pipes(). On POSIX platforms it
+is called in the child after GLib has performed all the setup it plans
+to perform but before calling exec(). On POSIX actions taken in this
+function will thus only affect the child, not the parent.
+</para>
+
+<para>
+On Windows the function is called in the parent. Its usefulness on
+Windows is thus questionable. In many cases executing the child setup
+function in the parent can have ill effects, and you should be very
+careful when porting software to Windows that uses child setup
+functions.
+</para>
+
+@user_data: user data to pass to the function.
+
+
+<!-- ##### FUNCTION g_spawn_async_with_pipes ##### -->
+<para>
+
+</para>
+
+@working_directory:
+@argv:
+@envp:
+@flags:
+@child_setup:
+@user_data:
+@child_pid:
+@standard_input:
+@standard_output:
+@standard_error:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_spawn_async ##### -->
+<para>
+
+</para>
+
+@working_directory:
+@argv:
+@envp:
+@flags:
+@child_setup:
+@user_data:
+@child_pid:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_spawn_sync ##### -->
+<para>
+
+</para>
+
+@working_directory:
+@argv:
+@envp:
+@flags:
+@child_setup:
+@user_data:
+@standard_output:
+@standard_error:
+@exit_status:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_spawn_command_line_async ##### -->
+<para>
+
+</para>
+
+@command_line:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_spawn_command_line_sync ##### -->
+<para>
+
+</para>
+
+@command_line:
+@standard_output:
+@standard_error:
+@exit_status:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_spawn_close_pid ##### -->
+<para>
+
+</para>
+
+@pid:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/string_chunks.sgml b/trunk/docs/reference/glib/tmpl/string_chunks.sgml
new file mode 100644
index 000000000..6674d16de
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/string_chunks.sgml
@@ -0,0 +1,132 @@
+<!-- ##### SECTION Title ##### -->
+String Chunks
+
+<!-- ##### SECTION Short_Description ##### -->
+efficient storage of groups of strings.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+String chunks are used to store groups of strings.
+Memory is allocated in blocks, and as strings are added to the #GStringChunk
+they are copied into the next free position in a block. When a block is
+full a new block is allocated.
+</para>
+<para>
+When storing a large number of strings, string chunks are more efficient
+than using g_strdup() since fewer calls to malloc() are needed, and less
+memory is wasted in memory allocation overheads.
+</para>
+<para>
+By adding strings with g_string_chunk_insert_const() it is also possible
+to remove duplicates.
+</para>
+<para>
+To create a new #GStringChunk use g_string_chunk_new().
+</para>
+<para>
+To add strings to a #GStringChunk use g_string_chunk_insert().
+</para>
+<para>
+To add strings to a #GStringChunk, but without duplicating strings which are
+already in the #GStringChunk, use g_string_chunk_insert_const().
+</para>
+<para>
+To free the entire #GStringChunk use g_string_chunk_free().
+It is not possible to free individual strings.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GStringChunk ##### -->
+<para>
+An opaque data structure representing String Chunks.
+It should only be accessed by using the following functions.
+</para>
+
+
+<!-- ##### FUNCTION g_string_chunk_new ##### -->
+<para>
+Creates a new #GStringChunk.
+</para>
+
+@size: the default size of the blocks of memory which are allocated to store
+the strings. If a particular string is larger than this default size, a larger
+block of memory will be allocated for it.
+@Returns: a new #GStringChunk.
+
+
+<!-- ##### FUNCTION g_string_chunk_insert ##### -->
+<para>
+Adds a copy of @string to the #GStringChunk.
+It returns a pointer to the new copy of the string in the #GStringChunk.
+The characters in the string can be changed, if necessary, though you
+should not change anything after the end of the string.
+</para>
+<para>
+Unlike g_string_chunk_insert_const(), this function does not check for
+duplicates. Also strings added with g_string_chunk_insert() will not be
+searched by g_string_chunk_insert_const() when looking for duplicates.
+</para>
+
+@chunk: a #GStringChunk.
+@string: the string to add.
+@Returns: a pointer to the copy of @string within the #GStringChunk.
+
+
+<!-- ##### FUNCTION g_string_chunk_insert_const ##### -->
+<para>
+Adds a copy of @string to the #GStringChunk, unless the same string has
+already been added to the #GStringChunk with g_string_chunk_insert_const().
+</para>
+<para>
+This function is useful if you need to copy a large number of strings
+but do not want to waste space storing duplicates. But you must remember
+that there may be several pointers to the same string, and so any changes
+made to the strings should be done very carefully.
+</para>
+<para>
+Note that g_string_chunk_insert_const() will not return a pointer to a string
+added with g_string_chunk_insert(), even if they do match.
+</para>
+
+@chunk: a #GStringChunk.
+@string: the string to add.
+@Returns: a pointer to the new or existing copy of @string within the
+#GStringChunk.
+
+
+<!-- ##### FUNCTION g_string_chunk_insert_len ##### -->
+<para>
+
+</para>
+
+@chunk:
+@string:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_chunk_clear ##### -->
+<para>
+
+</para>
+
+@chunk:
+
+
+<!-- ##### FUNCTION g_string_chunk_free ##### -->
+<para>
+Frees all memory allocated by the #GStringChunk.
+After calling g_string_chunk_free() it is not safe to
+access any of the strings which were contained within it.
+</para>
+
+@chunk: a #GStringChunk
+
+
diff --git a/trunk/docs/reference/glib/tmpl/string_utils.sgml b/trunk/docs/reference/glib/tmpl/string_utils.sgml
new file mode 100644
index 000000000..0ab262dfb
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/string_utils.sgml
@@ -0,0 +1,942 @@
+<!-- ##### SECTION Title ##### -->
+String Utility Functions
+
+<!-- ##### SECTION Short_Description ##### -->
+various string-related functions.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+This section describes a number of utility functions for creating,
+duplicating, and manipulating strings.
+</para>
+<para>
+Note that the functions g_printf(), g_fprintf(), g_sprintf(), g_snprintf(),
+g_vprintf(), g_vfprintf(), g_vsprintf() and g_vsnprintf() are declared in
+the header <filename>gprintf.h</filename> which is <emphasis>not</emphasis>
+included in <filename>glib.h</filename> (otherwise using
+<filename>glib.h</filename> would drag in <filename>stdio.h</filename>), so
+you'll have to explicitly include <literal>&lt;glib/gprintf.h&gt;</literal>
+in order to use the GLib printf() functions.
+</para>
+<para id="string-precision">
+While you may use the printf() functions to format UTF-8 strings, notice that
+the precision of a <literal>&percnt;Ns</literal> parameter is interpreted as the
+number of <emphasis>bytes</emphasis>, not <emphasis>characters</emphasis> to print.
+On top of that, the GNU libc implementation of the printf() functions has the "feature"
+that it checks that the string given for the <literal>&percnt;Ns</literal> parameter
+consists of a whole number of characters in the current encoding. So, unless you
+are sure you are always going to be in an UTF-8 locale or your know your text is restricted
+to ASCII, avoid using <literal>&percnt;Ns</literal>.
+If your intention is to format strings for a certain number of columns, then
+<literal>&percnt;Ns</literal> is not a correct solution anyway, since it fails to take
+wide characters (see g_unichar_iswide()) into account.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### FUNCTION g_strdup ##### -->
+<para>
+Duplicates a string.
+If @str is %NULL it returns %NULL.
+The returned string should be freed when no longer needed.
+</para>
+
+@str: the string to duplicate.
+@Returns: a newly-allocated copy of @str.
+
+
+<!-- ##### FUNCTION g_strndup ##### -->
+<para>
+
+</para>
+
+@str:
+@n:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strdupv ##### -->
+<para>
+</para>
+
+@str_array:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strnfill ##### -->
+<para>
+
+</para>
+
+@length:
+@fill_char:
+@Returns:
+
+
+<!-- ##### FUNCTION g_stpcpy ##### -->
+<para>
+
+</para>
+
+@dest:
+@src:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strstr_len ##### -->
+<para>
+
+</para>
+
+@haystack:
+@haystack_len:
+@needle:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strrstr ##### -->
+<para>
+
+</para>
+
+@haystack:
+@needle:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strrstr_len ##### -->
+<para>
+
+</para>
+
+@haystack:
+@haystack_len:
+@needle:
+@Returns:
+
+
+<!-- ##### FUNCTION g_str_has_prefix ##### -->
+<para>
+
+</para>
+
+@str:
+@prefix:
+@Returns:
+
+
+<!-- ##### FUNCTION g_str_has_suffix ##### -->
+<para>
+
+</para>
+
+@str:
+@suffix:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strlcpy ##### -->
+<para>
+Portability wrapper that calls strlcpy() on systems which have it, and emulates
+strlcpy() otherwise. Copies @src to @dest; @dest is guaranteed to be
+nul-terminated; @src must be nul-terminated; @dest_size is the buffer size, not
+the number of chars to copy. Caveat: strlcpy() is supposedly more secure than
+strcpy() or strncpy(), but if you really want to avoid screwups, g_strdup() is
+an even better idea.
+</para>
+
+@dest: destination buffer
+@src: source buffer
+@dest_size: length of @dest in bytes
+@Returns: length of @src
+
+
+<!-- ##### FUNCTION g_strlcat ##### -->
+<para>
+Portability wrapper that calls strlcat() on systems which have it, and emulates it otherwise.
+Appends nul-terminated @src string to @dest, guaranteeing
+nul-termination for @dest. The total size of @dest won't exceed
+@dest_size. Caveat: this is supposedly a more secure alternative to strcat() or
+strncat(), but for real security g_strconcat() is harder to mess up.
+</para>
+
+@dest: destination buffer, already containing one nul-terminated string
+@src: source buffer
+@dest_size: length of @dest buffer in bytes (not length of existing string inside @dest)
+@Returns: length of @src plus initial length of string in @dest
+
+
+<!-- ##### FUNCTION g_strdup_printf ##### -->
+<para>
+Similar to the standard C sprintf() function
+but safer, since it calculates the maximum space required and allocates
+memory to hold the result.
+The returned string should be freed when no longer needed.
+</para>
+
+@format: a standard printf() format string, but notice
+ <link linkend="string-precision">string precision pitfalls</link>.
+@Varargs: the parameters to insert into the format string.
+@Returns: a newly-allocated string holding the result.
+
+
+<!-- ##### FUNCTION g_strdup_vprintf ##### -->
+<para>
+Similar to the standard C vsprintf() function
+but safer, since it calculates the maximum space required and allocates
+memory to hold the result.
+The returned string should be freed when no longer needed.
+</para>
+<para>
+See also g_vasprintf(), which offers the same functionality, but additionally
+returns the length of the allocated string.
+</para>
+
+@format: a standard printf() format string, but notice
+ <link linkend="string-precision">string precision pitfalls</link>.
+@args: the list of parameters to insert into the format string.
+@Returns: a newly-allocated string holding the result.
+
+
+<!-- ##### FUNCTION g_printf ##### -->
+<para>
+
+</para>
+
+@format:
+@Varargs:
+@Returns:
+
+
+<!-- ##### FUNCTION g_vprintf ##### -->
+<para>
+
+</para>
+
+@format:
+@args:
+@Returns:
+
+
+<!-- ##### FUNCTION g_fprintf ##### -->
+<para>
+
+</para>
+
+@file:
+@format:
+@Varargs:
+@Returns:
+
+
+<!-- ##### FUNCTION g_vfprintf ##### -->
+<para>
+
+</para>
+
+@file:
+@format:
+@args:
+@Returns:
+
+
+<!-- ##### FUNCTION g_sprintf ##### -->
+<para>
+
+</para>
+
+@string:
+@format:
+@Varargs:
+@Returns:
+
+
+<!-- ##### FUNCTION g_vsprintf ##### -->
+<para>
+
+</para>
+
+@string:
+@format:
+@args:
+@Returns:
+
+
+<!-- ##### FUNCTION g_snprintf ##### -->
+<para>
+</para>
+
+@string:
+@n:
+@format:
+@Varargs:
+@Returns:
+
+
+<!-- ##### FUNCTION g_vsnprintf ##### -->
+<para>
+</para>
+
+@string:
+@n:
+@format:
+@args:
+@Returns:
+
+
+<!-- ##### FUNCTION g_vasprintf ##### -->
+<para>
+
+</para>
+
+@string:
+@format:
+@args:
+@Returns:
+
+
+<!-- ##### FUNCTION g_printf_string_upper_bound ##### -->
+<para>
+Calculates the maximum space needed to store the output of the sprintf()
+function.
+</para>
+
+@format: the format string. See the printf() documentation.
+@args: the parameters to be inserted into the format string.
+@Returns: the maximum space needed to store the formatted string.
+
+
+<!-- ##### FUNCTION g_ascii_isalnum ##### -->
+<para>
+Determines whether a character is alphanumeric.
+</para>
+<para>
+Unlike the standard C library isalnum() function, this only
+recognizes standard ASCII letters and ignores the locale, returning
+%FALSE for all non-ASCII characters. Also unlike the standard
+library function, this takes a <type>char</type>, not an <type>int</type>,
+so don't call it on %EOF but no need to cast to #guchar before passing a
+possibly non-ASCII character in.
+</para>
+
+@c: any character
+@Returns: %TRUE if @c is an ASCII alphanumeric character
+
+
+<!-- ##### FUNCTION g_ascii_isalpha ##### -->
+<para>
+Determines whether a character is alphabetic (i.e. a letter).
+</para>
+<para>
+Unlike the standard C library isalpha() function, this only
+recognizes standard ASCII letters and ignores the locale, returning
+%FALSE for all non-ASCII characters. Also unlike the standard
+library function, this takes a <type>char</type>, not an <type>int</type>,
+so don't call it on %EOF but no need to cast to #guchar before passing a
+possibly non-ASCII character in.
+</para>
+
+@c: any character
+@Returns: %TRUE if @c is an ASCII alphabetic character
+
+
+<!-- ##### FUNCTION g_ascii_iscntrl ##### -->
+<para>
+Determines whether a character is a control character.
+</para>
+<para>
+Unlike the standard C library iscntrl() function, this only
+recognizes standard ASCII control characters and ignores the locale,
+returning %FALSE for all non-ASCII characters. Also unlike the standard
+library function, this takes a <type>char</type>, not an <type>int</type>,
+so don't call it on %EOF but no need to cast to #guchar before passing a
+possibly non-ASCII character in.
+</para>
+
+@c: any character
+@Returns: %TRUE if @c is an ASCII control character.
+
+
+<!-- ##### FUNCTION g_ascii_isdigit ##### -->
+<para>
+Determines whether a character is digit (0-9).
+</para>
+<para>
+Unlike the standard C library isdigit() function,
+this takes a <type>char</type>, not an <type>int</type>, so don't call it
+on %EOF but no need to cast to #guchar before passing a possibly
+non-ASCII character in.
+</para>
+
+@c: any character
+@Returns: %TRUE if @c is an ASCII digit.
+
+
+<!-- ##### FUNCTION g_ascii_isgraph ##### -->
+<para>
+Determines whether a character is a printing character and not a space.
+</para>
+<para>
+Unlike the standard C library isgraph() function,
+this only recognizes standard ASCII characters and ignores the locale,
+returning %FALSE for all non-ASCII characters. Also unlike the standard
+library function, this takes a <type>char</type>, not an <type>int</type>,
+so don't call it on %EOF but no need to cast to #guchar before passing a
+possibly non-ASCII character in.
+</para>
+
+@c: any character
+@Returns: %TRUE if @c is an ASCII printing character other than space.
+
+
+<!-- ##### FUNCTION g_ascii_islower ##### -->
+<para>
+Determines whether a character is an ASCII lower case letter.
+</para>
+<para>
+Unlike the standard C library islower() function,
+this only recognizes standard ASCII letters and ignores the locale,
+returning %FALSE for all non-ASCII characters. Also unlike the standard
+library function, this takes a <type>char</type>, not an <type>int</type>,
+so don't call it on %EOF but no need to worry about casting to #guchar
+before passing a possibly non-ASCII character in.
+</para>
+
+@c: any character
+@Returns: %TRUE if @c is an ASCII lower case letter
+
+
+<!-- ##### FUNCTION g_ascii_isprint ##### -->
+<para>
+Determines whether a character is a printing character.
+</para>
+<para>
+Unlike the standard C library isprint() function,
+this only recognizes standard ASCII characters and ignores the locale,
+returning %FALSE for all non-ASCII characters. Also unlike the standard
+library function, this takes a <type>char</type>, not an <type>int</type>,
+so don't call it on %EOF but no need to cast to #guchar before passing a
+possibly non-ASCII character in.
+</para>
+
+@c: any character
+@Returns: %TRUE if @c is an ASCII printing character.
+
+
+<!-- ##### FUNCTION g_ascii_ispunct ##### -->
+<para>
+Determines whether a character is a punctuation character.
+</para>
+<para>
+Unlike the standard C library ispunct() function,
+this only recognizes standard ASCII letters and ignores the locale,
+returning %FALSE for all non-ASCII characters. Also unlike the standard
+library function, this takes a <type>char</type>, not an <type>int</type>,
+so don't call it on %EOF but no need to cast to #guchar before passing a
+possibly non-ASCII character in.
+</para>
+
+@c: any character
+@Returns: %TRUE if @c is an ASCII punctuation character.
+
+
+<!-- ##### FUNCTION g_ascii_isspace ##### -->
+<para>
+Determines whether a character is a white-space character.
+</para>
+<para>
+Unlike the standard C library isspace() function,
+this only recognizes standard ASCII white-space and ignores the locale,
+returning %FALSE for all non-ASCII characters. Also unlike the standard
+library function, this takes a <type>char</type>, not an <type>int</type>,
+so don't call it on %EOF but no need to cast to #guchar before passing a
+possibly non-ASCII character in.
+</para>
+
+@c: any character
+@Returns: %TRUE if @c is an ASCII white-space character
+
+
+<!-- ##### FUNCTION g_ascii_isupper ##### -->
+<para>
+Determines whether a character is an ASCII upper case letter.
+</para>
+<para>
+Unlike the standard C library isupper() function,
+this only recognizes standard ASCII letters and ignores the locale,
+returning %FALSE for all non-ASCII characters. Also unlike the standard
+library function, this takes a <type>char</type>, not an <type>int</type>,
+so don't call it on %EOF but no need to worry about casting to #guchar
+before passing a possibly non-ASCII character in.
+</para>
+
+@c: any character
+@Returns: %TRUE if @c is an ASCII upper case letter
+
+
+<!-- ##### FUNCTION g_ascii_isxdigit ##### -->
+<para>
+Determines whether a character is a hexadecimal-digit character.
+</para>
+<para>
+Unlike the standard C library isxdigit() function,
+this takes a <type>char</type>, not an <type>int</type>, so
+don't call it on %EOF but no need to cast to #guchar before passing a
+possibly non-ASCII character in.
+</para>
+
+@c: any character
+@Returns: %TRUE if @c is an ASCII hexadecimal-digit character.
+
+
+<!-- ##### FUNCTION g_ascii_digit_value ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_ascii_xdigit_value ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_ascii_strcasecmp ##### -->
+<para>
+
+</para>
+
+@s1:
+@s2:
+@Returns:
+
+
+<!-- ##### FUNCTION g_ascii_strncasecmp ##### -->
+<para>
+
+</para>
+
+@s1:
+@s2:
+@n:
+@Returns:
+
+
+<!-- ##### FUNCTION g_ascii_strup ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_ascii_strdown ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_ascii_tolower ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_ascii_toupper ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_ascii_up ##### -->
+<para>
+
+</para>
+
+@string:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_ascii_down ##### -->
+<para>
+
+</para>
+
+@string:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strup ##### -->
+<para>
+</para>
+
+@string:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strdown ##### -->
+<para>
+</para>
+
+@string:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strcasecmp ##### -->
+<para>
+</para>
+
+@s1:
+@s2:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strncasecmp ##### -->
+<para>
+</para>
+
+@s1:
+@s2:
+@n:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strreverse ##### -->
+<para>
+Reverses all of the bytes in a string.
+For example, <literal>g_strreverse ("abcdef")</literal> will result in "fedcba".
+</para>
+<para>
+Note that g_strreverse() doesn't work on UTF-8 strings containing multibyte characters.
+For that purpose, use g_utf8_strreverse().
+</para>
+
+@string: the string to reverse.
+@Returns: the same pointer passed in as @string.
+
+
+<!-- ##### FUNCTION g_ascii_strtoll ##### -->
+<para>
+
+</para>
+
+@nptr:
+@endptr:
+@base:
+@Returns:
+
+
+<!-- ##### FUNCTION g_ascii_strtoull ##### -->
+<para>
+
+</para>
+
+@nptr:
+@endptr:
+@base:
+@Returns:
+
+
+<!-- ##### MACRO G_ASCII_DTOSTR_BUF_SIZE ##### -->
+<para>
+A good size for a buffer to be passed into g_ascii_dtostr().
+It is guaranteed to be enough for all output of that function on systems with
+ 64bit IEEE-compatible doubles.
+</para>
+<para>
+The typical usage would be something like:
+<informalexample><programlisting>
+ char buf[G_ASCII_DTOSTR_BUF_SIZE];
+
+ fprintf (out, "value=&percnt;s\n", g_ascii_dtostr (buf, sizeof (buf), value));
+</programlisting></informalexample>
+</para>
+
+
+
+<!-- ##### FUNCTION g_ascii_strtod ##### -->
+<para>
+
+</para>
+
+@nptr:
+@endptr:
+@Returns:
+
+
+<!-- ##### FUNCTION g_ascii_dtostr ##### -->
+<para>
+
+</para>
+
+@buffer:
+@buf_len:
+@d:
+@Returns:
+
+
+<!-- ##### FUNCTION g_ascii_formatd ##### -->
+<para>
+
+</para>
+
+@buffer:
+@buf_len:
+@format:
+@d:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strtod ##### -->
+<para>
+
+</para>
+
+@nptr:
+@endptr:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strchug ##### -->
+<para>
+Removes leading whitespace from a string, by moving the rest of the
+characters forward.
+</para>
+<para>
+This function doesn't allocate or reallocate any memory; it modifies @string
+in place. The pointer to @string is returned to allow the nesting of functions.
+</para>
+<para>
+Also see g_strchomp() and g_strstrip().
+</para>
+
+@string: a string to remove the leading whitespace from.
+@Returns: @string.
+
+
+<!-- ##### FUNCTION g_strchomp ##### -->
+<para>
+Removes trailing whitespace from a string.
+</para>
+<para>
+This function doesn't allocate or reallocate any memory; it modifies @string in
+place. The pointer to @string is returned to allow the nesting of functions.
+</para>
+<para>
+Also see g_strchug() and g_strstrip().
+</para>
+
+@string: a string to remove the trailing whitespace from.
+@Returns: @string.
+
+
+<!-- ##### MACRO g_strstrip ##### -->
+<para>
+Removes leading and trailing whitespace from a string. See g_strchomp() and
+g_strchug().
+</para>
+
+@string: a string to remove the leading and trailing whitespace from.
+
+
+<!-- ##### FUNCTION g_strdelimit ##### -->
+<para>
+Converts any delimiter characters in @string to @new_delimiter.
+Any characters in @string which are found in @delimiters are changed
+to the @new_delimiter character. Modifies @string in place, and returns
+@string itself, not a copy. The return value is to allow nesting such as
+<literal>g_ascii_strup (g_strdelimit (str, "abc", '?'))</literal>.
+</para>
+
+@string: the string to convert.
+@delimiters: a string containing the current delimiters, or %NULL to use the
+standard delimiters defined in #G_STR_DELIMITERS.
+@new_delimiter: the new delimiter character.
+@Returns: @string.
+
+
+<!-- ##### MACRO G_STR_DELIMITERS ##### -->
+<para>
+The standard delimiters, used in g_strdelimit().
+</para>
+
+
+
+<!-- ##### FUNCTION g_strescape ##### -->
+<para>
+Escapes the special characters '\b', '\f', '\n', '\r', '\t', '\' and
+'&quot;' in the string @source by inserting a '\' before
+them. Additionally all characters in the range 0x01-0x1F (everything
+below SPACE) and in the range 0x7F-0xFF (all non-ASCII chars) are
+replaced with a '\' followed by their octal representation. Characters
+supplied in @exceptions are not escaped.
+</para>
+
+<para>
+g_strcompress() does the reverse conversion.
+</para>
+
+@source: a string to escape.
+@exceptions: a string of characters not to escape in @source.
+@Returns: a newly-allocated copy of @source with certain
+characters escaped. See above.
+
+
+<!-- ##### FUNCTION g_strcompress ##### -->
+<para>
+Replaces all escaped characters with their one byte equivalent. It
+does the reverse conversion of g_strescape().
+</para>
+
+@source: a string to compress.
+@Returns: a newly-allocated copy of @source with all escaped
+character compressed.
+
+
+<!-- ##### FUNCTION g_strcanon ##### -->
+<para>
+For each character in @string, if the character is not in @valid_chars,
+replaces the character with @substitutor. Modifies @string in place,
+and return @string itself, not a copy. The return value is to allow
+nesting such as <literal>g_ascii_strup (g_strcanon (str, "abc", '?'))</literal>.
+</para>
+
+@string: a nul-terminated array of bytes.
+@valid_chars: bytes permitted in @string.
+@substitutor: replacement character for disallowed bytes.
+@Returns: @string.
+
+
+<!-- ##### FUNCTION g_strsplit ##### -->
+<para>
+</para>
+
+@string:
+@delimiter:
+@max_tokens:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strsplit_set ##### -->
+<para>
+
+</para>
+
+@string:
+@delimiters:
+@max_tokens:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strfreev ##### -->
+<para>
+
+</para>
+
+@str_array:
+
+
+<!-- ##### FUNCTION g_strconcat ##### -->
+<para>
+Concatenates all of the given strings into one long string. The returned string
+should be freed when no longer needed.
+</para>
+
+<warning><para>
+The variable argument list <emphasis>must</emphasis> end with %NULL.
+If you forget the %NULL, g_strconcat() will start appending
+random memory junk to your string.
+</para></warning>
+
+@string1: The first string to add, which must not be %NULL.
+@Varargs: a %NULL-terminated list of strings to append to the string.
+@Returns: a newly-allocated string containing all the string arguments.
+
+
+<!-- ##### FUNCTION g_strjoin ##### -->
+<para>
+Joins a number of strings together to form one long string, with the optional
+@separator inserted between each of them.
+</para>
+
+@separator: a string to insert between each of the strings, or %NULL.
+@Varargs: a %NULL-terminated list of strings to join.
+@Returns: a newly-allocated string containing all of the strings joined
+together, with @separator between them.
+
+
+<!-- ##### FUNCTION g_strjoinv ##### -->
+<para>
+Joins a number of strings together to form one long string, with the optional
+@separator inserted between each of them.
+</para>
+
+@separator: a string to insert between each of the strings, or %NULL.
+@str_array: a %NULL-terminated array of strings to join.
+@Returns: a newly-allocated string containing all of the strings joined
+together, with @separator between them.
+
+
+<!-- ##### FUNCTION g_strv_length ##### -->
+<para>
+
+</para>
+
+@str_array:
+@Returns:
+
+
+<!-- ##### FUNCTION g_strerror ##### -->
+<para>
+Returns a string corresponding to the given error code, e.g. "no such process".
+You should use this function in preference to strerror(), because it returns a
+string in UTF-8 encoding, and since not all platforms support the
+strerror() function.
+</para>
+
+@errnum: the system error number. See the standard C %errno
+documentation.
+@Returns: a UTF-8 string describing the error code.
+If the error code is unknown, it returns "unknown error (&lt;code&gt;)".
+The string can only be used until the next call to g_strerror().
+
+
+<!-- ##### FUNCTION g_strsignal ##### -->
+<para>
+Returns a string describing the given signal, e.g. "Segmentation fault".
+You should use this function in preference to strsignal(), because it returns a
+string in UTF-8 encoding, and since not all platforms support the
+strsignal() function.
+</para>
+
+@signum: the signal number. See the <literal>signal</literal>
+documentation.
+@Returns: a UTF-8 string describing the signal.
+If the signal is unknown, it returns "unknown signal (&lt;signum&gt;)".
+The string can only be used until the next call to g_strsignal().
+
+
diff --git a/trunk/docs/reference/glib/tmpl/strings.sgml b/trunk/docs/reference/glib/tmpl/strings.sgml
new file mode 100644
index 000000000..9c57c2106
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/strings.sgml
@@ -0,0 +1,309 @@
+<!-- ##### SECTION Title ##### -->
+Strings
+
+<!-- ##### SECTION Short_Description ##### -->
+text buffers which grow automatically as text is added.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+A #GString is similar to a standard C string, except that it grows automatically
+as text is appended or inserted. Also, it stores the length of the string, so
+can be used for binary data with embedded nul bytes.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GString ##### -->
+<para>
+The #GString struct contains the public fields of a #GString.
+</para>
+
+@str: points to the character data. It may move as text is added.
+The <structfield>str</structfield> field is nul-terminated and so
+can be used as an ordinary C string.
+@len: contains the length of the string, not including the terminating nul byte.
+@allocated_len:
+
+<!-- ##### FUNCTION g_string_new ##### -->
+<para>
+
+</para>
+
+@init:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_new_len ##### -->
+<para>
+
+</para>
+
+@init:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_sized_new ##### -->
+<para>
+
+</para>
+
+@dfl_size:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_assign ##### -->
+<para>
+
+</para>
+
+@string:
+@rval:
+@Returns:
+
+
+<!-- ##### MACRO g_string_sprintf ##### -->
+<para>
+
+</para>
+
+
+
+<!-- ##### MACRO g_string_sprintfa ##### -->
+<para>
+
+</para>
+
+
+
+<!-- ##### FUNCTION g_string_printf ##### -->
+<para>
+
+</para>
+
+@string:
+@format:
+@Varargs:
+
+
+<!-- ##### FUNCTION g_string_append_printf ##### -->
+<para>
+
+</para>
+
+@string:
+@format:
+@Varargs:
+
+
+<!-- ##### FUNCTION g_string_append ##### -->
+<para>
+
+</para>
+
+@string:
+@val:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_append_c ##### -->
+<para>
+
+</para>
+
+@string:
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_append_unichar ##### -->
+<para>
+
+</para>
+
+@string:
+@wc:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_append_len ##### -->
+<para>
+
+</para>
+
+@string:
+@val:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_prepend ##### -->
+<para>
+
+</para>
+
+@string:
+@val:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_prepend_c ##### -->
+<para>
+
+</para>
+
+@string:
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_prepend_unichar ##### -->
+<para>
+
+</para>
+
+@string:
+@wc:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_prepend_len ##### -->
+<para>
+
+</para>
+
+@string:
+@val:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_insert ##### -->
+<para>
+
+</para>
+
+@string:
+@pos:
+@val:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_insert_c ##### -->
+<para>
+
+</para>
+
+@string: a #GString.
+@pos: the position to insert the byte.
+@c: the byte to insert.
+@Returns: the #GString.
+
+
+<!-- ##### FUNCTION g_string_insert_unichar ##### -->
+<para>
+
+</para>
+
+@string:
+@pos:
+@wc:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_insert_len ##### -->
+<para>
+
+</para>
+
+@string:
+@pos:
+@val:
+@len:
+@Returns:
+o
+
+
+<!-- ##### FUNCTION g_string_erase ##### -->
+<para>
+
+</para>
+
+@string:
+@pos:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_truncate ##### -->
+<para>
+
+</para>
+
+@string:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_set_size ##### -->
+<para>
+
+</para>
+
+@string:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_free ##### -->
+<para>
+
+</para>
+
+@string:
+@free_segment:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_up ##### -->
+<para>
+</para>
+
+@string:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_down ##### -->
+<para>
+</para>
+
+@string:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_hash ##### -->
+<para>
+
+</para>
+
+@str:
+@Returns:
+
+
+<!-- ##### FUNCTION g_string_equal ##### -->
+<para>
+Compares two strings for equality, returning %TRUE if they are equal.
+For use with #GHashTable.
+</para>
+
+@v: a #GString
+@v2: another #GString
+@Returns: %TRUE if they strings are the same length and contain the same bytes.
+
+
diff --git a/trunk/docs/reference/glib/tmpl/thread_pools.sgml b/trunk/docs/reference/glib/tmpl/thread_pools.sgml
new file mode 100644
index 000000000..8336b2d66
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/thread_pools.sgml
@@ -0,0 +1,202 @@
+<!-- ##### SECTION Title ##### -->
+Thread Pools
+
+<!-- ##### SECTION Short_Description ##### -->
+pools of threads to execute work concurrently.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+Sometimes you wish to asynchronously fork out the execution of work and
+continue working in your own thread. If that will happen often, the
+overhead of starting and destroying a thread each time might be too
+high. In such cases reusing already started threads seems like a good
+idea. And it indeed is, but implementing this can be tedious and
+error-prone.
+</para>
+
+<para>
+Therefore GLib provides thread pools for your convenience. An added
+advantage is, that the threads can be shared between the different
+subsystems of your program, when they are using GLib.
+</para>
+
+<para>
+To create a new thread pool, you use g_thread_pool_new(). It is
+destroyed by g_thread_pool_free().
+</para>
+
+<para>
+If you want to execute a certain task within a thread pool, you call
+g_thread_pool_push().
+</para>
+
+<para>
+To get the current number of running threads you call
+g_thread_pool_get_num_threads(). To get the number of still
+unprocessed tasks you call g_thread_pool_unprocessed(). To control the
+maximal number of threads for a thread pool, you use
+g_thread_pool_get_max_threads() and g_thread_pool_set_max_threads().
+</para>
+
+<para>
+Finally you can control the number of unused threads, that are kept
+alive by GLib for future use. The current number can be fetched with
+g_thread_pool_get_num_unused_threads(). The maximal number can be
+controlled by g_thread_pool_get_max_unused_threads() and
+g_thread_pool_set_max_unused_threads(). All currently unused threads
+can be stopped by calling g_thread_pool_stop_unused_threads().
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+<variablelist>
+
+<varlistentry>
+<term>#GThread</term>
+<listitem><para>GLib thread system.</para></listitem>
+</varlistentry>
+
+</variablelist>
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GThreadPool ##### -->
+<para>
+The #GThreadPool struct represents a thread pool. It has six public
+read-only members, but the underlying struct is bigger, so you must not copy
+this struct.
+</para>
+
+@func: the function to execute in the threads of this pool
+@user_data: the user data for the threads of this pool
+@exclusive: are all threads exclusive to this pool
+
+<!-- ##### FUNCTION g_thread_pool_new ##### -->
+<para>
+
+</para>
+
+@func:
+@user_data:
+@max_threads:
+@exclusive:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_thread_pool_push ##### -->
+<para>
+
+</para>
+
+@pool:
+@data:
+@error:
+
+
+<!-- ##### FUNCTION g_thread_pool_set_max_threads ##### -->
+<para>
+
+</para>
+
+@pool:
+@max_threads:
+@error:
+
+
+<!-- ##### FUNCTION g_thread_pool_get_max_threads ##### -->
+<para>
+
+</para>
+
+@pool:
+@Returns:
+
+
+<!-- ##### FUNCTION g_thread_pool_get_num_threads ##### -->
+<para>
+
+</para>
+
+@pool:
+@Returns:
+
+
+<!-- ##### FUNCTION g_thread_pool_unprocessed ##### -->
+<para>
+
+</para>
+
+@pool:
+@Returns:
+
+
+<!-- ##### FUNCTION g_thread_pool_free ##### -->
+<para>
+
+</para>
+
+@pool:
+@immediate:
+@wait_:
+
+
+<!-- ##### FUNCTION g_thread_pool_set_max_unused_threads ##### -->
+<para>
+
+</para>
+
+@max_threads:
+
+
+<!-- ##### FUNCTION g_thread_pool_get_max_unused_threads ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_thread_pool_get_num_unused_threads ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_thread_pool_stop_unused_threads ##### -->
+<para>
+
+</para>
+
+
+
+<!-- ##### FUNCTION g_thread_pool_set_sort_function ##### -->
+<para>
+
+</para>
+
+@pool:
+@func:
+@user_data:
+
+
+<!-- ##### FUNCTION g_thread_pool_set_max_idle_time ##### -->
+<para>
+
+</para>
+
+@interval:
+
+
+<!-- ##### FUNCTION g_thread_pool_get_max_idle_time ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/threads.sgml b/trunk/docs/reference/glib/tmpl/threads.sgml
new file mode 100644
index 000000000..0eed7a740
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/threads.sgml
@@ -0,0 +1,1715 @@
+<!-- ##### SECTION Title ##### -->
+Threads
+
+<!-- ##### SECTION Short_Description ##### -->
+
+thread abstraction; including threads, different mutexes, conditions
+and thread private data.
+
+<!-- ##### SECTION Long_Description ##### -->
+
+<para>
+Threads act almost like processes, but unlike processes all threads of
+one process share the same memory. This is good, as it provides easy
+communication between the involved threads via this shared memory, and
+it is bad, because strange things (so called "Heisenbugs") might
+happen if the program is not carefully designed. In particular, due to
+the concurrent nature of threads, no assumptions on the order of
+execution of code running in different threads can be made, unless
+order is explicitly forced by the programmer through synchronization
+primitives.
+</para>
+
+<para>
+The aim of the thread related functions in GLib is to provide a
+portable means for writing multi-threaded software. There are
+primitives for mutexes to protect the access to portions of memory
+(#GMutex, #GStaticMutex, #G_LOCK_DEFINE, #GStaticRecMutex and
+#GStaticRWLock). There are primitives for condition variables to allow
+synchronization of threads (#GCond). There are primitives
+for thread-private data - data that every thread has a private instance of
+(#GPrivate, #GStaticPrivate). Last but definitely not least there are
+primitives to portably create and manage threads (#GThread).
+</para>
+
+<para>
+You must call g_thread_init() before executing any other GLib
+functions in a threaded GLib program. After that, GLib is completely
+thread safe (all global data is automatically locked), but individual
+data structure instances are not automatically locked for performance
+reasons. So, for example you must coordinate accesses to the same
+#GHashTable from multiple threads. The two notable exceptions from
+this rule are #GMainLoop and #GAsyncQueue,
+which <emphasis>are</emphasis> threadsafe and needs no further
+application-level locking to be accessed from multiple threads.
+</para>
+
+<para>
+To help debugging problems in multithreaded applications, GLib supports
+error-checking mutexes that will give you helpful error messages on
+common problems. To use error-checking mutexes, define the symbol
+#G_ERRORCHECK_MUTEXES when compiling the application.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+<variablelist>
+
+<varlistentry>
+<term>#GThreadPool</term>
+<listitem><para>Thread pools.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>#GAsyncQueue</term>
+<listitem><para>Send asynchronous messages between threads.</para></listitem>
+</varlistentry>
+
+</variablelist>
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO G_THREADS_ENABLED ##### -->
+
+<para>
+This macro is defined if GLib was compiled with thread support. This
+does not necessarily mean that there is a thread implementation
+available, but it does mean that the infrastructure is in place and
+that once you provide a thread implementation to g_thread_init(), GLib
+will be multi-thread safe. If #G_THREADS_ENABLED is not defined, then
+Glib is not, and cannot be, multi-thread safe.
+</para>
+
+
+
+<!-- ##### MACRO G_THREADS_IMPL_POSIX ##### -->
+
+<para>
+This macro is defined if POSIX style threads are used.
+</para>
+
+
+
+<!-- ##### MACRO G_THREADS_IMPL_NONE ##### -->
+
+<para>
+This macro is defined if no thread implementation is used. You can,
+however, provide one to g_thread_init() to make GLib multi-thread safe.
+</para>
+
+
+
+<!-- ##### MACRO G_THREAD_ERROR ##### -->
+<para>
+The error domain of the GLib thread subsystem.
+</para>
+
+
+
+<!-- ##### ENUM GThreadError ##### -->
+<para>
+Possible errors of thread related functions.
+</para>
+
+@G_THREAD_ERROR_AGAIN: a thread couldn't be created due to resource
+shortage. Try again later.
+
+<!-- ##### STRUCT GThreadFunctions ##### -->
+
+<para>
+This function table is used by g_thread_init() to initialize the
+thread system. The functions in the table are directly used by their
+g_* prepended counterparts (described in this document). For example,
+if you call g_mutex_new() then mutex_new() from the table provided to
+g_thread_init() will be called.
+</para>
+
+<note>
+<para>
+Do not use this struct unless you know what you are doing.
+</para>
+</note>
+
+@mutex_new:
+@mutex_lock:
+@mutex_trylock:
+@mutex_unlock:
+@mutex_free:
+@cond_new:
+@cond_signal:
+@cond_broadcast:
+@cond_wait:
+@cond_timed_wait:
+@cond_free:
+@private_new:
+@private_get:
+@private_set:
+@thread_create:
+@thread_yield:
+@thread_join:
+@thread_exit:
+@thread_set_priority:
+@thread_self:
+@thread_equal:
+
+<!-- ##### FUNCTION g_thread_init ##### -->
+
+<para>
+If you use GLib from more than one thread, you must initialize
+the thread system by calling g_thread_init(). Most of the time you
+will only have to call <literal>g_thread_init (NULL)</literal>.
+</para>
+
+<note>
+<para>
+Do not call g_thread_init() with a non-%NULL parameter unless you
+really know what you are doing.
+</para>
+</note>
+
+<note>
+<para>
+g_thread_init() must not be called directly or indirectly as a
+callback from GLib. Also no mutexes may be currently locked while
+calling g_thread_init().
+</para>
+</note>
+
+<para>
+g_thread_init() might only be called once. On the second call
+it will abort with an error. If you want to make sure that the thread
+system is initialized, you can do this:
+</para>
+
+<para>
+<informalexample>
+<programlisting>
+if (!g_thread_supported (<!-- -->)) g_thread_init (NULL);
+</programlisting>
+</informalexample>
+</para>
+
+<para>
+After that line, either the thread system is initialized or, if no
+thread system is available in GLib (i.e. either #G_THREADS_ENABLED is
+not defined or #G_THREADS_IMPL_NONE is defined), the program will
+abort.
+</para>
+
+<para>
+If no thread system is available and @vtable is %NULL or if not all
+elements of @vtable are non-%NULL, then g_thread_init() will abort.
+</para>
+
+<note>
+<para>
+To use g_thread_init() in your program, you have to link with the
+libraries that the command <command>pkg-config --libs gthread-2.0</command>
+outputs. This is not the case for all the other thread related functions of
+GLib. Those can be used without having to link with the thread libraries.
+</para>
+</note>
+
+@vtable: a function table of type #GThreadFunctions, that provides the
+entry points to the thread system to be used.
+
+
+<!-- ##### FUNCTION g_thread_supported ##### -->
+<para>
+This function returns %TRUE if the thread system is initialized, and
+%FALSE if it is not.
+</para>
+
+<note>
+<para>
+This function is actually a macro. Apart from taking the address of it
+you can however use it as if it was a function.
+</para>
+</note>
+
+@Returns: %TRUE, if the thread system is initialized.
+
+
+<!-- ##### USER_FUNCTION GThreadFunc ##### -->
+<para>
+Specifies the type of the @func functions passed to
+g_thread_create() or g_thread_create_full().
+</para>
+
+@data: data passed to the thread.
+@Returns: the return value of the thread, which will be returned by
+g_thread_join().
+
+
+<!-- ##### ENUM GThreadPriority ##### -->
+<para>
+Specifies the priority of a thread.
+</para>
+
+<note>
+<para>
+It is not guaranteed that threads with different priorities really
+behave accordingly. On some systems (e.g. Linux) there are no thread
+priorities. On other systems (e.g. Solaris) there doesn't seem to be
+different scheduling for different priorities. All in all try to avoid
+being dependent on priorities.
+</para>
+</note>
+
+@G_THREAD_PRIORITY_LOW: a priority lower than normal
+@G_THREAD_PRIORITY_NORMAL: the default priority
+@G_THREAD_PRIORITY_HIGH: a priority higher than normal
+@G_THREAD_PRIORITY_URGENT: the highest priority
+
+<!-- ##### STRUCT GThread ##### -->
+<para>
+The #GThread struct represents a running thread. It has three public
+read-only members, but the underlying struct is bigger, so you must
+not copy this struct.
+</para>
+
+<note>
+<para>
+Resources for a joinable thread are not fully released until
+g_thread_join() is called for that thread.
+</para>
+</note>
+
+
+<!-- ##### FUNCTION g_thread_create ##### -->
+<para>
+This function creates a new thread with the default priority.
+</para>
+
+<para>
+If @joinable is %TRUE, you can wait for this threads termination
+calling g_thread_join(). Otherwise the thread will just disappear when
+it terminates.
+</para>
+
+<para>
+The new thread executes the function @func with the argument
+@data. If the thread was created successfully, it is returned.
+</para>
+
+<para>
+@error can be %NULL to ignore errors, or non-%NULL to report errors. The
+error is set, if and only if the function returns %NULL.
+</para>
+
+@func: a function to execute in the new thread.
+@data: an argument to supply to the new thread.
+@joinable: should this thread be joinable?
+@error: return location for error.
+@Returns: the new #GThread on success.
+
+
+<!-- ##### FUNCTION g_thread_create_full ##### -->
+<para>
+This function creates a new thread with the priority @priority. If the
+underlying thread implementation supports it, the thread gets a stack
+size of @stack_size or the default value for the current platform, if
+@stack_size is 0.
+</para>
+
+<para>
+If @joinable is %TRUE, you can wait for this threads termination
+calling g_thread_join(). Otherwise the thread will just disappear when
+it terminates. If @bound is %TRUE, this thread will be scheduled in
+the system scope, otherwise the implementation is free to do
+scheduling in the process scope. The first variant is more expensive
+resource-wise, but generally faster. On some systems (e.g. Linux) all
+threads are bound.
+</para>
+
+<para>
+The new thread executes the function @func with the argument
+@data. If the thread was created successfully, it is returned.
+</para>
+
+<para>
+@error can be %NULL to ignore errors, or non-%NULL to report errors. The
+error is set, if and only if the function returns %NULL.
+</para>
+
+<note>
+<para>
+It is not guaranteed that threads with different priorities really
+behave accordingly. On some systems (e.g. Linux) there are no thread
+priorities. On other systems (e.g. Solaris) there doesn't seem to be
+different scheduling for different priorities. All in all try to avoid
+being dependent on priorities. Use %G_THREAD_PRIORITY_NORMAL here as a
+default.
+</para>
+</note>
+
+<note>
+<para>
+Only use g_thread_create_full() if you really can't use
+g_thread_create() instead. g_thread_create() does not take
+@stack_size, @bound, and @priority as arguments, as they should only
+be used in cases in which it is unavoidable.
+</para>
+</note>
+
+@func: a function to execute in the new thread.
+@data: an argument to supply to the new thread.
+@stack_size: a stack size for the new thread.
+@joinable: should this thread be joinable?
+@bound: should this thread be bound to a system thread?
+@priority: a priority for the thread.
+@error: return location for error.
+@Returns: the new #GThread on success.
+
+
+<!-- ##### FUNCTION g_thread_self ##### -->
+<para>
+This functions returns the #GThread corresponding to the calling thread.
+</para>
+
+@Returns: the current thread.
+
+
+<!-- ##### FUNCTION g_thread_join ##### -->
+<para>
+Waits until @thread finishes, i.e. the function @func, as given
+to g_thread_create(), returns or g_thread_exit() is called by
+@thread. All resources of @thread including the #GThread struct are
+released. @thread must have been created with @joinable=%TRUE in
+g_thread_create(). The value returned by @func or given to
+g_thread_exit() by @thread is returned by this function.
+</para>
+
+@thread: a #GThread to be waited for.
+@Returns: the return value of the thread.
+
+
+<!-- ##### FUNCTION g_thread_set_priority ##### -->
+<para>
+Changes the priority of @thread to @priority.
+</para>
+
+<note>
+<para>
+It is not guaranteed that threads with different priorities really
+behave accordingly. On some systems (e.g. Linux) there are no thread
+priorities. On other systems (e.g. Solaris) there doesn't seem to be
+different scheduling for different priorities. All in all try to avoid
+being dependent on priorities.
+</para>
+</note>
+
+@thread: a #GThread.
+@priority: a new priority for @thread.
+
+
+<!-- ##### FUNCTION g_thread_yield ##### -->
+<para>
+Gives way to other threads waiting to be scheduled.
+</para>
+
+<para>
+This function is often used as a method to make busy wait less
+evil. But in most cases you will encounter, there are better methods
+to do that. So in general you shouldn't use this function.
+</para>
+
+
+
+<!-- ##### FUNCTION g_thread_exit ##### -->
+<para>
+Exits the current thread. If another thread is waiting for that thread
+using g_thread_join() and the current thread is joinable, the waiting
+thread will be woken up and get @retval as the return value of
+g_thread_join(). If the current thread is not joinable, @retval is
+ignored. Calling
+</para>
+
+<para>
+<informalexample>
+<programlisting>
+g_thread_exit (retval);
+</programlisting>
+</informalexample>
+</para>
+
+<para>
+is equivalent to calling
+</para>
+
+<para>
+<informalexample>
+<programlisting>
+return retval;
+</programlisting>
+</informalexample>
+</para>
+
+<para>
+in the function @func, as given to g_thread_create().
+</para>
+
+<note>
+<para>
+Never call g_thread_exit() from within a thread of a #GThreadPool, as
+that will mess up the bookkeeping and lead to funny and unwanted results.
+</para>
+</note>
+
+@retval: the return value of this thread.
+
+
+<!-- ##### FUNCTION g_thread_foreach ##### -->
+<para>
+
+</para>
+
+@thread_func:
+@user_data:
+
+
+<!-- ##### STRUCT GMutex ##### -->
+
+<para>
+The #GMutex struct is an opaque data structure to represent a mutex
+(mutual exclusion). It can be used to protect data against shared
+access. Take for example the following function:
+
+<example>
+<title>A function which will not work in a threaded environment</title>
+<programlisting>
+ int give_me_next_number (<!-- -->)
+ {
+ static int current_number = 0;
+
+ /* now do a very complicated calculation to calculate the new number,
+ this might for example be a random number generator */
+ current_number = calc_next_number (current_number);
+ return current_number;
+ }
+</programlisting>
+</example>
+</para>
+
+<para>
+It is easy to see that this won't work in a multi-threaded
+application. There current_number must be protected against shared
+access. A first naive implementation would be:
+</para>
+
+<para>
+<example>
+<title>The wrong way to write a thread-safe function</title>
+<programlisting>
+ int give_me_next_number (<!-- -->)
+ {
+ static int current_number = 0;
+ int ret_val;
+ static GMutex * mutex = NULL;
+
+ if (!mutex)
+ mutex = g_mutex_new (<!-- -->);
+ g_mutex_lock (mutex);
+ ret_val = current_number = calc_next_number (current_number);
+ g_mutex_unlock (mutex);
+ return ret_val;
+ }
+</programlisting>
+</example>
+</para>
+
+<para>
+This looks like it would work, but there is a race condition while
+constructing the mutex and this code cannot work reliable. Please do
+not use such constructs in your own programs! One working solution is:
+</para>
+
+<para>
+<example>
+<title>A correct thread-safe function</title>
+<programlisting>
+ static GMutex *give_me_next_number_mutex = NULL;
+
+ /* this function must be called before any call to give_me_next_number (<!-- -->)
+ it must be called exactly once. */
+ void init_give_me_next_number (<!-- -->)
+ {
+ g_assert (give_me_next_number_mutex == NULL);
+ give_me_next_number_mutex = g_mutex_new (<!-- -->);
+ }
+
+ int give_me_next_number (<!-- -->)
+ {
+ static int current_number = 0;
+ int ret_val;
+
+ g_mutex_lock (give_me_next_number_mutex);
+ ret_val = current_number = calc_next_number (current_number);
+ g_mutex_unlock (give_me_next_number_mutex);
+ return ret_val;
+ }
+</programlisting>
+</example>
+</para>
+
+<para>
+#GStaticMutex provides a simpler and safer way of doing this.
+</para>
+
+<para>
+If you want to use a mutex, and your code should also work without
+calling g_thread_init() first, then you can not use a #GMutex, as
+g_mutex_new() requires that the thread system be initialized. Use a
+#GStaticMutex instead.
+</para>
+
+<para>
+A #GMutex should only be accessed via the following functions.
+</para>
+
+<note>
+<para>
+All of the <function>g_mutex_*</function> functions are actually macros.
+Apart from taking their addresses, you can however use them as if they
+were functions.
+</para>
+</note>
+
+
+<!-- ##### FUNCTION g_mutex_new ##### -->
+
+<para>
+Creates a new #GMutex.
+</para>
+
+<note>
+<para>
+This function will abort if g_thread_init() has not been called yet.
+</para>
+</note>
+
+@Returns: a new #GMutex.
+
+
+<!-- ##### FUNCTION g_mutex_lock ##### -->
+
+<para>
+Locks @mutex. If @mutex is already locked by another thread, the
+current thread will block until @mutex is unlocked by the other
+thread.
+</para>
+
+<para>
+This function can be used even if g_thread_init() has not yet been
+called, and, in that case, will do nothing.
+</para>
+
+<note>
+<para>
+#GMutex is neither guaranteed to be recursive nor to be non-recursive,
+i.e. a thread could deadlock while calling g_mutex_lock(), if it
+already has locked @mutex. Use #GStaticRecMutex, if you need recursive
+mutexes.
+</para>
+</note>
+
+@mutex: a #GMutex.
+
+
+<!-- ##### FUNCTION g_mutex_trylock ##### -->
+
+<para>
+Tries to lock @mutex. If @mutex is already locked by another
+thread, it immediately returns %FALSE. Otherwise it locks @mutex
+and returns %TRUE.
+</para>
+
+<para>
+This function can be used even if g_thread_init() has not yet been
+called, and, in that case, will immediately return %TRUE.
+</para>
+
+<note>
+<para>
+#GMutex is neither guaranteed to be recursive nor to be non-recursive,
+i.e. the return value of g_mutex_trylock() could be both %FALSE or
+%TRUE, if the current thread already has locked @mutex. Use
+#GStaticRecMutex, if you need recursive mutexes.
+</para>
+</note>
+
+@mutex: a #GMutex.
+@Returns: %TRUE, if @mutex could be locked.
+
+
+<!-- ##### FUNCTION g_mutex_unlock ##### -->
+
+<para>
+Unlocks @mutex. If another thread is blocked in a g_mutex_lock() call
+for @mutex, it will be woken and can lock @mutex itself.
+</para>
+
+<para>
+This function can be used even if g_thread_init() has not yet been
+called, and, in that case, will do nothing.
+</para>
+
+@mutex: a #GMutex.
+
+
+<!-- ##### FUNCTION g_mutex_free ##### -->
+
+<para>
+Destroys @mutex.
+</para>
+
+@mutex: a #GMutex.
+
+
+<!-- ##### STRUCT GStaticMutex ##### -->
+
+<para>
+A #GStaticMutex works like a #GMutex, but it has one significant
+advantage. It doesn't need to be created at run-time like a #GMutex,
+but can be defined at compile-time. Here is a shorter, easier and
+safer version of our <function>give_me_next_number()</function> example:
+</para>
+
+<para>
+<example>
+<title>Using <structname>GStaticMutex</structname> to simplify thread-safe programming</title>
+<programlisting>
+ int give_me_next_number (<!-- -->)
+ {
+ static int current_number = 0;
+ int ret_val;
+ static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
+
+ g_static_mutex_lock (&amp;mutex);
+ ret_val = current_number = calc_next_number (current_number);
+ g_static_mutex_unlock (&amp;mutex);
+ return ret_val;
+ }
+</programlisting>
+</example>
+</para>
+
+<para>
+Sometimes you would like to dynamically create a mutex. If you don't
+want to require prior calling to g_thread_init(), because your code
+should also be usable in non-threaded programs, you are not able to
+use g_mutex_new() and thus #GMutex, as that requires a prior call to
+g_thread_init(). In theses cases you can also use a #GStaticMutex. It
+must be initialized with g_static_mutex_init() before using it and
+freed with with g_static_mutex_free() when not needed anymore to free
+up any allocated resources.
+</para>
+
+<para>
+Even though #GStaticMutex is not opaque, it should only be used with
+the following functions, as it is defined differently on different
+platforms.
+</para>
+
+<para>
+All of the <function>g_static_mutex_*</function> functions can also be
+used even if g_thread_init() has not yet been called.
+</para>
+
+<note>
+<para>
+All of the <function>g_static_mutex_*</function> functions are actually
+macros. Apart from taking their addresses, you can however use them
+as if they were functions.
+</para>
+</note>
+
+
+<!-- ##### MACRO G_STATIC_MUTEX_INIT ##### -->
+
+<para>
+A #GStaticMutex must be initialized with this macro, before it can be
+used. This macro can used be to initialize a variable, but it cannot
+be assigned to a variable. In that case you have to use
+g_static_mutex_init().
+</para>
+
+<para>
+<informalexample>
+<programlisting>
+GStaticMutex my_mutex = G_STATIC_MUTEX_INIT;
+</programlisting>
+</informalexample>
+</para>
+
+
+
+<!-- ##### FUNCTION g_static_mutex_init ##### -->
+<para>
+Initializes @mutex. Alternatively you can initialize it with
+#G_STATIC_MUTEX_INIT.
+</para>
+
+@mutex: a #GStaticMutex to be initialized.
+
+
+<!-- ##### FUNCTION g_static_mutex_lock ##### -->
+<para>
+Works like g_mutex_lock(), but for a #GStaticMutex.
+</para>
+
+@mutex: a #GStaticMutex.
+
+
+<!-- ##### FUNCTION g_static_mutex_trylock ##### -->
+
+<para>
+Works like g_mutex_trylock(), but for a #GStaticMutex.
+</para>
+
+@mutex: a #GStaticMutex.
+@Returns: %TRUE, if the #GStaticMutex could be locked.
+
+
+<!-- ##### FUNCTION g_static_mutex_unlock ##### -->
+
+<para>
+Works like g_mutex_unlock(), but for a #GStaticMutex.
+</para>
+
+@mutex: a #GStaticMutex.
+
+
+<!-- ##### FUNCTION g_static_mutex_get_mutex ##### -->
+
+<para>
+For some operations (like g_cond_wait()) you must have a #GMutex
+instead of a #GStaticMutex. This function will return the
+corresponding #GMutex for @mutex.
+</para>
+
+@mutex: a #GStaticMutex.
+@Returns: the #GMutex corresponding to @mutex.
+
+
+<!-- ##### FUNCTION g_static_mutex_free ##### -->
+<para>
+Releases all resources allocated to @mutex.
+</para>
+
+<para>
+You don't have to call this functions for a #GStaticMutex with an
+unbounded lifetime, i.e. objects declared 'static', but if you have a
+#GStaticMutex as a member of a structure and the structure is freed,
+you should also free the #GStaticMutex.
+</para>
+
+@mutex: a #GStaticMutex to be freed.
+
+
+<!-- ##### MACRO G_LOCK_DEFINE ##### -->
+
+<para>
+The %G_LOCK_* macros provide a convenient interface to #GStaticMutex
+with the advantage that they will expand to nothing in programs
+compiled against a thread-disabled GLib, saving code and memory
+there. #G_LOCK_DEFINE defines a lock. It can appear anywhere variable
+definitions may appear in programs, i.e. in the first block of a
+function or outside of functions. The @name parameter will be mangled
+to get the name of the #GStaticMutex. This means that you can use
+names of existing variables as the parameter - e.g. the name of the
+variable you intent to protect with the lock. Look at our
+<function>give_me_next_number()</function> example using the %G_LOCK_* macros:
+</para>
+
+<para>
+<example>
+<title>Using the %G_LOCK_* convenience macros</title>
+<programlisting>
+G_LOCK_DEFINE (current_number);
+
+int give_me_next_number (<!-- -->)
+ {
+ static int current_number = 0;
+ int ret_val;
+
+ G_LOCK (current_number);
+ ret_val = current_number = calc_next_number (current_number);
+ G_UNLOCK (current_number);
+ return ret_val;
+ }
+</programlisting>
+</example>
+</para>
+
+@name: the name of the lock.
+
+
+<!-- ##### MACRO G_LOCK_DEFINE_STATIC ##### -->
+
+<para>
+This works like #G_LOCK_DEFINE, but it creates a static object.
+</para>
+
+@name: the name of the lock.
+
+
+<!-- ##### MACRO G_LOCK_EXTERN ##### -->
+
+<para>
+This declares a lock, that is defined with #G_LOCK_DEFINE in another module.
+</para>
+
+@name: the name of the lock.
+
+
+<!-- ##### MACRO G_LOCK ##### -->
+
+<para>
+Works like g_mutex_lock(), but for a lock defined with #G_LOCK_DEFINE.
+</para>
+
+@name: the name of the lock.
+
+
+<!-- ##### MACRO G_TRYLOCK ##### -->
+
+<para>
+Works like g_mutex_trylock(), but for a lock defined with #G_LOCK_DEFINE.
+</para>
+
+@name: the name of the lock.
+@Returns: %TRUE, if the lock could be locked.
+
+
+<!-- ##### MACRO G_UNLOCK ##### -->
+
+<para>
+Works like g_mutex_unlock(), but for a lock defined with #G_LOCK_DEFINE.
+</para>
+
+@name: the name of the lock.
+
+
+<!-- ##### STRUCT GStaticRecMutex ##### -->
+<para>
+A #GStaticRecMutex works like a #GStaticMutex, but it can be locked
+multiple times by one thread. If you enter it n times, you have to
+unlock it n times again to let other threads lock it. An exception is
+the function g_static_rec_mutex_unlock_full(): that allows you to
+unlock a #GStaticRecMutex completely returning the depth, (i.e. the
+number of times this mutex was locked). The depth can later be used to
+restore the state of the #GStaticRecMutex by calling
+g_static_rec_mutex_lock_full().
+</para>
+
+<para>
+Even though #GStaticRecMutex is not opaque, it should only be used with
+the following functions.
+</para>
+
+<para>
+All of the <function>g_static_rec_mutex_*</function> functions can
+be used even if g_thread_init() has not been called.
+</para>
+
+
+<!-- ##### MACRO G_STATIC_REC_MUTEX_INIT ##### -->
+<para>
+A #GStaticRecMutex must be initialized with this macro before it can
+be used. This macro can used be to initialize a variable, but it
+cannot be assigned to a variable. In that case you have to use
+g_static_rec_mutex_init().
+</para>
+
+<para>
+<informalexample>
+<programlisting>
+GStaticRecMutex my_mutex = G_STATIC_REC_MUTEX_INIT;
+</programlisting>
+</informalexample>
+</para>
+
+
+
+<!-- ##### FUNCTION g_static_rec_mutex_init ##### -->
+<para>
+A #GStaticRecMutex must be initialized with this function before it
+can be used. Alternatively you can initialize it with
+#G_STATIC_REC_MUTEX_INIT.
+</para>
+
+@mutex: a #GStaticRecMutex to be initialized.
+
+
+<!-- ##### FUNCTION g_static_rec_mutex_lock ##### -->
+<para>
+Locks @mutex. If @mutex is already locked by another thread, the
+current thread will block until @mutex is unlocked by the other
+thread. If @mutex is already locked by the calling thread, this
+functions increases the depth of @mutex and returns immediately.
+</para>
+
+@mutex: a #GStaticRecMutex to lock.
+
+
+<!-- ##### FUNCTION g_static_rec_mutex_trylock ##### -->
+<para>
+Tries to lock @mutex. If @mutex is already locked by another thread,
+it immediately returns %FALSE. Otherwise it locks @mutex and returns
+%TRUE. If @mutex is already locked by the calling thread, this
+functions increases the depth of @mutex and immediately returns %TRUE.
+</para>
+
+@mutex: a #GStaticRecMutex to lock.
+@Returns: %TRUE, if @mutex could be locked.
+
+
+<!-- ##### FUNCTION g_static_rec_mutex_unlock ##### -->
+<para>
+Unlocks @mutex. Another thread can will be allowed to lock @mutex only
+when it has been unlocked as many times as it had been locked
+before. If @mutex is completely unlocked and another thread is blocked
+in a g_static_rec_mutex_lock() call for @mutex, it will be woken and
+can lock @mutex itself.
+</para>
+
+@mutex: a #GStaticRecMutex to unlock.
+
+
+<!-- ##### FUNCTION g_static_rec_mutex_lock_full ##### -->
+<para>
+Works like calling g_static_rec_mutex_lock() for @mutex @depth times.
+</para>
+
+@mutex: a #GStaticRecMutex to lock.
+@depth: number of times this mutex has to be unlocked to be completely unlocked.
+
+
+<!-- ##### FUNCTION g_static_rec_mutex_unlock_full ##### -->
+<para>
+Completely unlocks @mutex. If another thread is blocked in a
+g_static_rec_mutex_lock() call for @mutex, it will be woken and can
+lock @mutex itself. This function returns the number of times that
+@mutex has been locked by the current thread. To restore the state
+before the call to g_static_rec_mutex_unlock_full() you can call
+g_static_rec_mutex_lock_full() with the depth returned by this
+function.
+</para>
+
+@mutex: a #GStaticRecMutex to completely unlock.
+@Returns: number of times @mutex has been locked by the current thread.
+
+
+<!-- ##### FUNCTION g_static_rec_mutex_free ##### -->
+<para>
+Releases all resources allocated to a #GStaticRecMutex.
+</para>
+
+<para>
+You don't have to call this functions for a #GStaticRecMutex with an
+unbounded lifetime, i.e. objects declared 'static', but if you have a
+#GStaticRecMutex as a member of a structure and the structure is
+freed, you should also free the #GStaticRecMutex.
+</para>
+
+@mutex: a #GStaticRecMutex to be freed.
+
+
+<!-- ##### STRUCT GStaticRWLock ##### -->
+<para>
+The #GStaticRWLock struct represents a read-write lock. A read-write
+lock can be used for protecting data that some portions of code only
+read from, while others also write. In such situations it is
+desirable that several readers can read at once, whereas of course
+only one writer may write at a time. Take a look at the following
+example:
+
+<example>
+<title>An array with access functions</title>
+<programlisting>
+ GStaticRWLock rwlock = G_STATIC_RW_LOCK_INIT;
+
+ GPtrArray *array;
+
+ gpointer my_array_get (guint index)
+ {
+ gpointer retval = NULL;
+
+ if (!array)
+ return NULL;
+
+ g_static_rw_lock_reader_lock (&amp;rwlock);
+
+ if (index &lt; array->len)
+ retval = g_ptr_array_index (array, index);
+
+ g_static_rw_lock_reader_unlock (&amp;rwlock);
+
+ return retval;
+ }
+
+ void my_array_set (guint index, gpointer data)
+ {
+ g_static_rw_lock_writer_lock (&amp;rwlock);
+
+ if (!array)
+ array = g_ptr_array_new (<!-- -->);
+
+ if (index >= array->len)
+ g_ptr_array_set_size (array, index+1);
+
+ g_ptr_array_index (array, index) = data;
+
+ g_static_rw_lock_writer_unlock (&amp;rwlock);
+ }
+</programlisting>
+</example>
+</para>
+
+<para>
+This example shows an array which can be accessed by many readers
+(the <function>my_array_get()</function> function) simultaneously,
+whereas the writers (the <function>my_array_set()</function> function)
+will only be allowed once at a time and only if no readers currently access
+the array. This is because of the potentially dangerous resizing of the
+array. Using these functions is fully multi-thread safe now.
+</para>
+
+<para>
+Most of the time, writers should have precedence over readers. That
+means, for this implementation, that as soon as a writer wants to lock
+the data, no other reader is allowed to lock the data, whereas, of
+course, the readers that already have locked the data are allowed to
+finish their operation. As soon as the last reader unlocks the data,
+the writer will lock it.
+</para>
+
+<para>
+Even though #GStaticRWLock is not opaque, it should only be used with
+the following functions.
+</para>
+
+<para>
+All of the <function>g_static_rw_lock_*</function> functions can be
+used even if g_thread_init() has not been called.
+</para>
+
+<note>
+<para>
+A read-write lock has a higher overhead than a mutex. For example, both
+g_static_rw_lock_reader_lock() and g_static_rw_lock_reader_unlock()
+have to lock and unlock a #GStaticMutex, so it takes at least twice the
+time to lock and unlock a #GStaticRWLock that it does to lock and unlock a
+#GStaticMutex. So only data structures that are accessed by multiple
+readers, and which keep the lock for a considerable time justify a
+#GStaticRWLock. The above example most probably would fare better with
+a #GStaticMutex.
+</para>
+</note>
+
+
+<!-- ##### MACRO G_STATIC_RW_LOCK_INIT ##### -->
+<para>
+A #GStaticRWLock must be initialized with this macro before it can
+be used. This macro can used be to initialize a variable, but it
+cannot be assigned to a variable. In that case you have to use
+g_static_rw_lock_init().
+</para>
+
+<para>
+<informalexample>
+<programlisting>
+GStaticRWLock my_lock = G_STATIC_RW_LOCK_INIT;
+</programlisting>
+</informalexample>
+</para>
+
+
+
+<!-- ##### FUNCTION g_static_rw_lock_init ##### -->
+<para>
+A #GStaticRWLock must be initialized with this function before it can
+be used. Alternatively you can initialize it with
+#G_STATIC_RW_LOCK_INIT.
+</para>
+
+@lock: a #GStaticRWLock to be initialized.
+
+
+<!-- ##### FUNCTION g_static_rw_lock_reader_lock ##### -->
+<para>
+Locks @lock for reading. There may be unlimited concurrent locks for
+reading of a #GStaticRWLock at the same time. If @lock is already
+locked for writing by another thread or if another thread is already
+waiting to lock @lock for writing, this function will block until
+@lock is unlocked by the other writing thread and no other writing
+threads want to lock @lock. This lock has to be unlocked by
+g_static_rw_lock_reader_unlock().
+</para>
+
+<para>
+#GStaticRWLock is not recursive. It might seem to be possible to
+recursively lock for reading, but that can result in a deadlock, due
+to writer preference.
+</para>
+
+@lock: a #GStaticRWLock to lock for reading.
+
+
+<!-- ##### FUNCTION g_static_rw_lock_reader_trylock ##### -->
+<para>
+Tries to lock @lock for reading. If @lock is already locked for
+writing by another thread or if another thread is already waiting to
+lock @lock for writing, immediately returns %FALSE. Otherwise locks
+@lock for reading and returns %TRUE. This lock has to be unlocked by
+g_static_rw_lock_reader_unlock().
+</para>
+
+@lock: a #GStaticRWLock to lock for reading.
+@Returns: %TRUE, if @lock could be locked for reading.
+
+
+<!-- ##### FUNCTION g_static_rw_lock_reader_unlock ##### -->
+<para>
+Unlocks @lock. If a thread waits to lock @lock for writing and all
+locks for reading have been unlocked, the waiting thread is woken up
+and can lock @lock for writing.
+</para>
+
+@lock: a #GStaticRWLock to unlock after reading.
+
+
+<!-- ##### FUNCTION g_static_rw_lock_writer_lock ##### -->
+<para>
+Locks @lock for writing. If @lock is already locked for writing or
+reading by other threads, this function will block until @lock is
+completely unlocked and then lock @lock for writing. While this
+functions waits to lock @lock, no other thread can lock @lock for
+reading. When @lock is locked for writing, no other thread can lock
+@lock (neither for reading nor writing). This lock has to be unlocked
+by g_static_rw_lock_writer_unlock().
+</para>
+
+@lock: a #GStaticRWLock to lock for writing.
+
+
+<!-- ##### FUNCTION g_static_rw_lock_writer_trylock ##### -->
+<para>
+Tries to lock @lock for writing. If @lock is already locked (for
+either reading or writing) by another thread, it immediately returns
+%FALSE. Otherwise it locks @lock for writing and returns %TRUE. This
+lock has to be unlocked by g_static_rw_lock_writer_unlock().
+</para>
+
+@lock: a #GStaticRWLock to lock for writing.
+@Returns: %TRUE, if @lock could be locked for writing.
+
+
+<!-- ##### FUNCTION g_static_rw_lock_writer_unlock ##### -->
+<para>
+Unlocks @lock. If a thread is waiting to lock @lock for writing and
+all locks for reading have been unlocked, the waiting thread is woken
+up and can lock @lock for writing. If no thread is waiting to lock
+@lock for writing, and some thread or threads are waiting to lock @lock
+for reading, the waiting threads are woken up and can lock @lock for
+reading.
+</para>
+
+@lock: a #GStaticRWLock to unlock after writing.
+
+
+<!-- ##### FUNCTION g_static_rw_lock_free ##### -->
+<para>
+Releases all resources allocated to @lock.
+</para>
+
+<para>
+You don't have to call this functions for a #GStaticRWLock with an
+unbounded lifetime, i.e. objects declared 'static', but if you have a
+#GStaticRWLock as a member of a structure, and the structure is freed,
+you should also free the #GStaticRWLock.
+</para>
+
+@lock: a #GStaticRWLock to be freed.
+
+
+<!-- ##### STRUCT GCond ##### -->
+
+<para>
+The #GCond struct is an opaque data structure that represents a
+condition. Threads can block on a #GCond if they find a certain
+condition to be false. If other threads change the state of this
+condition they signal the #GCond, and that causes the waiting threads
+to be woken up.
+</para>
+
+<para>
+<example>
+<title>Using GCond to block a thread until a condition is satisfied</title>
+<programlisting>
+GCond* data_cond = NULL; /* Must be initialized somewhere */
+GMutex* data_mutex = NULL; /* Must be initialized somewhere */
+gpointer current_data = NULL;
+
+void push_data (gpointer data)
+{
+ g_mutex_lock (data_mutex);
+ current_data = data;
+ g_cond_signal (data_cond);
+ g_mutex_unlock (data_mutex);
+}
+
+gpointer pop_data (<!-- -->)
+{
+ gpointer data;
+
+ g_mutex_lock (data_mutex);
+ while (!current_data)
+ g_cond_wait (data_cond, data_mutex);
+ data = current_data;
+ current_data = NULL;
+ g_mutex_unlock (data_mutex);
+ return data;
+}
+</programlisting>
+</example>
+</para>
+
+<para>
+Whenever a thread calls <function>pop_data()</function> now, it will
+wait until current_data is non-%NULL, i.e. until some other thread
+has called <function>push_data()</function>.
+</para>
+
+<note>
+<para>
+It is important to use the g_cond_wait() and g_cond_timed_wait()
+functions only inside a loop which checks for the condition to be
+true. It is not guaranteed that the waiting thread will find the
+condition fulfilled after it wakes up, even if the signaling thread
+left the condition in that state: another thread may have altered the
+condition before the waiting thread got the chance to be woken up,
+even if the condition itself is protected by a #GMutex, like above.
+</para>
+</note>
+
+<para>
+A #GCond should only be accessed via the following functions.
+</para>
+
+<note>
+<para>
+All of the <function>g_cond_*</function> functions are actually macros.
+Apart from taking their addresses, you can however use them as if they
+were functions.
+</para>
+</note>
+
+
+<!-- ##### FUNCTION g_cond_new ##### -->
+
+<para>
+Creates a new #GCond. This function will abort, if g_thread_init()
+has not been called yet.
+</para>
+
+@Returns: a new #GCond.
+
+
+<!-- ##### FUNCTION g_cond_signal ##### -->
+<para>
+If threads are waiting for @cond, exactly one of them is woken up. It
+is good practice to hold the same lock as the waiting thread while
+calling this function, though not required.
+</para>
+
+<para>
+This function can be used even if g_thread_init() has not yet been called,
+and, in that case, will do nothing.
+</para>
+
+@cond: a #GCond.
+
+
+<!-- ##### FUNCTION g_cond_broadcast ##### -->
+
+<para>
+If threads are waiting for @cond, all of them are woken up. It is good
+practice to lock the same mutex as the waiting threads, while calling
+this function, though not required.
+</para>
+
+<para>
+This function can be used even if g_thread_init() has not yet been called,
+and, in that case, will do nothing.
+</para>
+
+@cond: a #GCond.
+
+
+<!-- ##### FUNCTION g_cond_wait ##### -->
+
+<para>
+Waits until this thread is woken up on @cond. The @mutex is unlocked
+before falling asleep and locked again before resuming.
+</para>
+
+<para>
+This function can be used even if g_thread_init() has not yet been
+called, and, in that case, will immediately return.
+</para>
+
+@cond: a #GCond.
+@mutex: a #GMutex, that is currently locked.
+
+
+<!-- ##### FUNCTION g_cond_timed_wait ##### -->
+
+<para>
+Waits until this thread is woken up on @cond, but not longer than
+until the time specified by @abs_time. The @mutex is
+unlocked before falling asleep and locked again before resuming.
+</para>
+
+<para>
+If @abs_time is %NULL, g_cond_timed_wait() acts like g_cond_wait().
+</para>
+
+<para>
+This function can be used even if g_thread_init() has not yet been
+called, and, in that case, will immediately return %TRUE.
+</para>
+
+<para>
+To easily calculate @abs_time a combination of g_get_current_time()
+and g_time_val_add() can be used.
+</para>
+
+@cond: a #GCond.
+@mutex: a #GMutex that is currently locked.
+@abs_time: a #GTimeVal, determining the final time.
+@Returns: %TRUE if @cond was signalled, or %FALSE on timeout.
+
+
+<!-- ##### FUNCTION g_cond_free ##### -->
+
+<para>
+Destroys the #GCond.
+</para>
+
+@cond: a #GCond.
+
+
+<!-- ##### STRUCT GPrivate ##### -->
+<para>
+The #GPrivate struct is an opaque data structure to represent a thread
+private data key. Threads can thereby obtain and set a pointer which
+is private to the current thread.
+Take our <function>give_me_next_number()</function> example from above.
+Suppose we don't want <literal>current_number</literal> to be shared
+between the threads, but instead to be private to each thread. This can be
+done as follows:
+
+<example>
+<title>Using GPrivate for per-thread data</title>
+<programlisting>
+ GPrivate* current_number_key = NULL; /* Must be initialized somewhere */
+ /* with g_private_new (g_free); */
+
+ int give_me_next_number (<!-- -->)
+ {
+ int *current_number = g_private_get (current_number_key);
+
+ if (!current_number)
+ {
+ current_number = g_new (int, 1);
+ *current_number = 0;
+ g_private_set (current_number_key, current_number);
+ }
+ *current_number = calc_next_number (*current_number);
+ return *current_number;
+ }
+</programlisting>
+</example>
+</para>
+
+<para>
+Here the pointer belonging to the key <literal>current_number_key</literal>
+is read. If it is %NULL, it has not been set yet. Then get memory for an
+integer value, assign this memory to the pointer and write the pointer
+back. Now we have an integer value that is private to the current thread.
+</para>
+
+<para>
+The #GPrivate struct should only be accessed via the following functions.
+</para>
+
+<note>
+<para>
+All of the <function>g_private_*</function> functions are actually macros.
+Apart from taking their addresses, you can however use them as if they were
+functions.
+</para>
+</note>
+
+
+<!-- ##### FUNCTION g_private_new ##### -->
+
+<para>
+Creates a new #GPrivate. If @destructor is non-%NULL, it is a pointer
+to a destructor function. Whenever a thread ends and the corresponding
+pointer keyed to this instance of #GPrivate is non-%NULL, the
+destructor is called with this pointer as the argument.
+</para>
+
+<note>
+<para>
+@destructor is used quite differently from @notify in
+g_static_private_set().
+</para>
+</note>
+
+<note>
+<para>
+A #GPrivate can not be freed. Reuse it instead, if you can, to avoid
+shortage, or use #GStaticPrivate.
+</para>
+</note>
+
+<note>
+<para>
+This function will abort if g_thread_init() has not been called yet.
+</para>
+</note>
+
+@destructor: a function to destroy the data keyed to #GPrivate when a
+thread ends.
+@Returns: a new #GPrivate.
+
+
+<!-- ##### FUNCTION g_private_get ##### -->
+
+<para>
+Returns the pointer keyed to @private_key for the current thread.
+If g_private_set() hasn't been called for the
+current @private_key and thread yet, this pointer will be %NULL.
+</para>
+
+<para>
+This function can be used even if g_thread_init() has not yet been
+called, and, in that case, will return the value of @private_key casted to #gpointer.
+</para>
+
+@private_key: a #GPrivate.
+@Returns: the corresponding pointer.
+
+
+<!-- ##### FUNCTION g_private_set ##### -->
+
+<para>
+Sets the pointer keyed to @private_key for the current thread.
+</para>
+
+<para>
+This function can be used even if g_thread_init() has not yet been
+called, and, in that case, will set @private_key to @data casted to #GPrivate*.
+</para>
+
+@private_key: a #GPrivate.
+@data: the new pointer.
+
+
+<!-- ##### STRUCT GStaticPrivate ##### -->
+
+<para>
+A #GStaticPrivate works almost like a #GPrivate, but it has one
+significant advantage. It doesn't need to be created at run-time like
+a #GPrivate, but can be defined at compile-time. This is similar to
+the difference between #GMutex and #GStaticMutex. Now look at our
+<function>give_me_next_number()</function> example with #GStaticPrivate:
+</para>
+
+<para>
+<example>
+<title>Using GStaticPrivate for per-thread data</title>
+<programlisting>
+ int give_me_next_number (<!-- -->)
+ {
+ static GStaticPrivate current_number_key = G_STATIC_PRIVATE_INIT;
+ int *current_number = g_static_private_get (&amp;current_number_key);
+
+ if (!current_number)
+ {
+ current_number = g_new (int,1);
+ *current_number = 0;
+ g_static_private_set (&amp;current_number_key, current_number, g_free);
+ }
+ *current_number = calc_next_number (*current_number);
+ return *current_number;
+ }
+</programlisting>
+</example>
+</para>
+
+
+<!-- ##### MACRO G_STATIC_PRIVATE_INIT ##### -->
+<para>
+Every #GStaticPrivate must be initialized with this macro, before it can
+be used.
+</para>
+
+<para>
+<informalexample>
+<programlisting>
+GStaticPrivate my_private = G_STATIC_PRIVATE_INIT;
+</programlisting>
+</informalexample>
+</para>
+
+
+
+<!-- ##### FUNCTION g_static_private_init ##### -->
+<para>
+Initializes @private_key. Alternatively you can initialize it with
+#G_STATIC_PRIVATE_INIT.
+</para>
+
+@private_key: a #GStaticPrivate to be initialized.
+
+
+<!-- ##### FUNCTION g_static_private_get ##### -->
+<para>
+Works like g_private_get() only for a #GStaticPrivate.
+</para>
+
+<para>
+This function works even if g_thread_init() has not yet been called.
+</para>
+
+@private_key: a #GStaticPrivate.
+@Returns: the corresponding pointer.
+
+
+<!-- ##### FUNCTION g_static_private_set ##### -->
+<para>
+Sets the pointer keyed to @private_key for the current thread and the
+function @notify to be called with that pointer (%NULL or non-%NULL),
+whenever the pointer is set again or whenever the current thread ends.
+</para>
+
+<para>
+This function works even if g_thread_init() has not yet been
+called. If g_thread_init() is called later, the @data keyed to
+@private_key will be inherited only by the main thread, i.e. the one that
+called g_thread_init().
+</para>
+
+<note>
+<para>
+@notify is used quite differently from @destructor in
+g_private_new().
+</para>
+</note>
+
+@private_key: a #GStaticPrivate.
+@data: the new pointer.
+@notify: a function to be called with the pointer whenever the
+current thread ends or sets this pointer again.
+
+
+<!-- ##### FUNCTION g_static_private_free ##### -->
+<para>
+Releases all resources allocated to @private_key.
+</para>
+
+<para>
+You don't have to call this functions for a #GStaticPrivate with an
+unbounded lifetime, i.e. objects declared 'static', but if you have a
+#GStaticPrivate as a member of a structure and the structure is freed,
+you should also free the #GStaticPrivate.
+</para>
+
+@private_key: a #GStaticPrivate to be freed.
+
+
+<!-- ##### STRUCT GOnce ##### -->
+<para>
+A <structname>GOnce</structname> struct controls a one-time initialization
+function. Any one-time initialization function must have its own unique
+<structname>GOnce</structname> struct.
+</para>
+
+@status: the status of the #GOnce
+@retval: the value returned by the call to the function, if @status
+ is %G_ONCE_STATUS_READY
+@Since: 2.4
+
+<!-- ##### ENUM GOnceStatus ##### -->
+<para>
+The possible statuses of a one-time initialization function controlled by a #GOnce struct.
+</para>
+
+@G_ONCE_STATUS_NOTCALLED: the function has not been called yet.
+@G_ONCE_STATUS_PROGRESS: the function call is currently in progress.
+@G_ONCE_STATUS_READY: the function has been called.
+@Since: 2.4
+
+<!-- ##### MACRO G_ONCE_INIT ##### -->
+<para>
+A #GOnce must be initialized with this macro before it can be used.
+</para>
+<para>
+<informalexample>
+<programlisting>
+GOnce my_once = G_ONCE_INIT;
+</programlisting>
+</informalexample>
+</para>
+
+@Since: 2.4
+
+
+<!-- ##### MACRO g_once ##### -->
+<para>
+The first call to this routine by a process with a given #GOnce struct calls
+@func with the given argument. Thereafter, subsequent calls to g_once() with
+the same #GOnce struct do not call @func again, but return the stored result
+of the first call. On return from g_once(), the status of @once will be
+%G_ONCE_STATUS_READY.
+</para>
+<para>
+For example, a mutex or a thread-specific data key must be created exactly
+once. In a threaded environment, calling g_once() ensures that the
+initialization is serialized across multiple threads.
+</para>
+<note><para>
+Calling g_once() recursively on the same #GOnce struct in @func will lead
+to a deadlock.
+</para></note>
+<para>
+<informalexample>
+<programlisting>
+gpointer
+get_debug_flags ()
+{
+ static GOnce my_once = G_ONCE_INIT;
+
+ g_once (&amp;my_once, parse_debug_flags, NULL);
+
+ return my_once.retval;
+}
+</programlisting>
+</informalexample>
+</para>
+
+@once: a #GOnce structure
+@func: the #GThreadFunc function associated to @once. This function is
+ called only once, regardless of the number of times it and its
+ associated #GOnce struct are passed to g_once() .
+@arg: data to be passed to @func
+@Since: 2.4
+
+
diff --git a/trunk/docs/reference/glib/tmpl/timers.sgml b/trunk/docs/reference/glib/tmpl/timers.sgml
new file mode 100644
index 000000000..b14a8db54
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/timers.sgml
@@ -0,0 +1,102 @@
+<!-- ##### SECTION Title ##### -->
+Timers
+
+<!-- ##### SECTION Short_Description ##### -->
+
+keep track of elapsed time.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+#GTimer records a start time, and counts microseconds elapsed since that time.
+This is done somewhat differently on different platforms, and can be tricky to
+get exactly right, so #GTimer provides a portable/convenient interface.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GTimer ##### -->
+<para>
+Opaque datatype that records a start time.
+</para>
+
+
+<!-- ##### FUNCTION g_timer_new ##### -->
+<para>
+Creates a new timer, and starts timing (i.e. g_timer_start() is implicitly
+called for you).
+</para>
+
+@Returns: a new #GTimer.
+
+
+<!-- ##### FUNCTION g_timer_start ##### -->
+<para>
+Marks a start time, so that future calls to g_timer_elapsed() will report the
+time since g_timer_start() was called. g_timer_new() automatically marks the
+start time, so no need to call g_timer_start() immediately after creating the
+timer.
+</para>
+
+@timer: a #GTimer.
+
+
+<!-- ##### FUNCTION g_timer_stop ##### -->
+<para>
+Marks an end time, so calls to g_timer_elapsed() will return the difference
+between this end time and the start time.
+</para>
+
+@timer: a #GTimer.
+
+
+<!-- ##### FUNCTION g_timer_continue ##### -->
+<para>
+Resumes a timer that has previously been stopped with g_timer_stop().
+g_timer_stop() must be called before using this function.
+</para>
+
+@timer: a #GTimer.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_timer_elapsed ##### -->
+<para>
+If @timer has been started but not stopped, obtains the time since the timer was
+started. If @timer has been stopped, obtains the elapsed time between the time
+it was started and the time it was stopped. The return value is the number of
+seconds elapsed, including any fractional part. The @microseconds
+out parameter is essentially useless.
+</para>
+
+@timer: a #GTimer.
+@microseconds: return location for the fractional part of seconds elapsed,
+ in microseconds (that is, the total number of microseconds elapsed, modulo
+ 1000000), or %NULL
+@Returns: seconds elapsed as a floating point value, including
+ any fractional part.
+
+
+<!-- ##### FUNCTION g_timer_reset ##### -->
+<para>
+This function is useless; it's fine to call g_timer_start() on an
+already-started timer to reset the start time, so g_timer_reset() serves no
+purpose.
+</para>
+
+@timer: a #GTimer.
+
+
+<!-- ##### FUNCTION g_timer_destroy ##### -->
+<para>
+Destroys a timer, freeing associated resources.
+</para>
+
+@timer: a #GTimer to destroy.
+
+
diff --git a/trunk/docs/reference/glib/tmpl/trash_stack.sgml b/trunk/docs/reference/glib/tmpl/trash_stack.sgml
new file mode 100644
index 000000000..d862b5e89
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/trash_stack.sgml
@@ -0,0 +1,74 @@
+<!-- ##### SECTION Title ##### -->
+Trash Stacks
+
+<!-- ##### SECTION Short_Description ##### -->
+maintain a stack of unused allocated memory chunks.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+A #GTrashStack is an efficient way to keep a stack of unused allocated
+memory chunks. Each memory chunk is required to be large enough to hold
+a #gpointer. This allows the stack to be maintained without any space
+overhead, since the stack pointers can be stored inside the memory chunks.
+</para>
+<para>
+There is no function to create a #GTrashStack. A %NULL #GTrashStack*
+is a perfectly valid empty stack.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GTrashStack ##### -->
+<para>
+Each piece of memory that is pushed onto the stack
+is cast to a <structname>GTrashStack*</structname>.
+</para>
+
+@next: pointer to the previous element of the stack,
+gets stored in the first <literal>sizeof (gpointer)</literal>
+bytes of the element.
+
+<!-- ##### FUNCTION g_trash_stack_push ##### -->
+<para>
+Pushes a piece of memory onto a #GTrashStack.
+</para>
+
+@stack_p: a pointer to a #GTrashStack.
+@data_p: the piece of memory to push on the stack.
+
+
+<!-- ##### FUNCTION g_trash_stack_pop ##### -->
+<para>
+Pops a piece of memory off a #GTrashStack.
+</para>
+
+@stack_p: a pointer to a #GTrashStack.
+@Returns: the element at the top of the stack.
+
+
+<!-- ##### FUNCTION g_trash_stack_peek ##### -->
+<para>
+Returns the element at the top of a #GTrashStack which may be %NULL.
+</para>
+
+@stack_p: a pointer to a #GTrashStack.
+@Returns: the element at the top of the stack.
+
+
+<!-- ##### FUNCTION g_trash_stack_height ##### -->
+<para>
+Returns the height of a #GTrashStack.
+Note that execution of this function is of O(N) complexity
+where N denotes the number of items on the stack.
+</para>
+
+@stack_p: a pointer to a #GTrashStack.
+@Returns: the height of the stack.
+
+
diff --git a/trunk/docs/reference/glib/tmpl/trees-binary.sgml b/trunk/docs/reference/glib/tmpl/trees-binary.sgml
new file mode 100644
index 000000000..6d36ad72a
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/trees-binary.sgml
@@ -0,0 +1,233 @@
+<!-- ##### SECTION Title ##### -->
+Balanced Binary Trees
+
+<!-- ##### SECTION Short_Description ##### -->
+a sorted collection of key/value pairs optimized for searching
+and traversing in order.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The #GTree structure and its associated functions provide a sorted collection
+of key/value pairs optimized for searching and traversing in order.
+</para>
+<para>
+To create a new #GTree use g_tree_new().
+</para>
+<para>
+To insert a key/value pair into a #GTree use g_tree_insert().
+</para>
+<para>
+To lookup the value corresponding to a given key, use g_tree_lookup() and
+g_tree_lookup_extended().
+</para>
+<para>
+To find out the number of nodes in a #GTree, use g_tree_nnodes().
+To get the height of a #GTree, use g_tree_height().
+</para>
+<para>
+To traverse a #GTree, calling a function for each node visited in the
+traversal, use g_tree_foreach().
+</para>
+<para>
+To remove a key/value pair use g_tree_remove().
+</para>
+<para>
+To destroy a #GTree, use g_tree_destroy().
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GTree ##### -->
+<para>
+The <structname>GTree</structname> struct is an opaque data structure representing a
+<link linkend="glib-Balanced-Binary-Trees">Balanced Binary Tree</link>.
+It should be accessed only by using the following functions.
+</para>
+
+
+<!-- ##### FUNCTION g_tree_new ##### -->
+<para>
+
+</para>
+
+@key_compare_func:
+@Returns:
+
+
+<!-- ##### FUNCTION g_tree_new_with_data ##### -->
+<para>
+
+</para>
+
+@key_compare_func:
+@key_compare_data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_tree_new_full ##### -->
+<para>
+
+</para>
+
+@key_compare_func:
+@key_compare_data:
+@key_destroy_func:
+@value_destroy_func:
+@Returns:
+
+
+<!-- ##### FUNCTION g_tree_insert ##### -->
+<para>
+
+</para>
+
+@tree:
+@key:
+@value:
+
+
+<!-- ##### FUNCTION g_tree_replace ##### -->
+<para>
+
+</para>
+
+@tree:
+@key:
+@value:
+
+
+<!-- ##### FUNCTION g_tree_nnodes ##### -->
+<para>
+
+</para>
+
+@tree:
+@Returns:
+
+
+<!-- ##### FUNCTION g_tree_height ##### -->
+<para>
+
+</para>
+
+@tree:
+@Returns:
+
+
+<!-- ##### FUNCTION g_tree_lookup ##### -->
+<para>
+
+</para>
+
+@tree:
+@key:
+@Returns:
+
+
+<!-- ##### FUNCTION g_tree_lookup_extended ##### -->
+
+
+@tree:
+@lookup_key:
+@orig_key:
+@value:
+@Returns:
+
+
+<!-- ##### FUNCTION g_tree_foreach ##### -->
+<para>
+
+</para>
+
+@tree:
+@func:
+@user_data:
+
+
+<!-- ##### FUNCTION g_tree_traverse ##### -->
+<para>
+
+</para>
+
+@tree:
+@traverse_func:
+@traverse_type:
+@user_data:
+
+
+<!-- ##### USER_FUNCTION GTraverseFunc ##### -->
+<para>
+Specifies the type of function passed to g_tree_traverse().
+It is passed the key and value of each node, together with
+the @user_data parameter passed to g_tree_traverse().
+If the function returns %TRUE, the traversal is stopped.
+</para>
+
+@key: a key of a #GTree node.
+@value: the value corresponding to the key.
+@data: user data passed to g_tree_traverse().
+@Returns: %TRUE to stop the traversal.
+
+
+<!-- ##### ENUM GTraverseType ##### -->
+<para>
+Specifies the type of traveral performed by g_tree_traverse(),
+g_node_traverse() and g_node_find().
+</para>
+
+@G_IN_ORDER: vists a node's left child first, then the node itself, then its
+ right child. This is the one to use if you want the output sorted according
+ to the compare function.
+@G_PRE_ORDER: visits a node, then its children.
+@G_POST_ORDER: visits the node's children, then the node itself.
+@G_LEVEL_ORDER: is not implemented for
+ <link linkend="glib-Balanced-Binary-Trees">Balanced Binary Trees</link>.
+ For <link linkend="glib-N-ary-Trees">N-ary Trees</link>, it vists the root
+ node first, then its children, then its grandchildren, and so on. Note that
+ this is less efficient than the other orders.
+
+<!-- ##### FUNCTION g_tree_search ##### -->
+<para>
+
+</para>
+
+@tree:
+@search_func:
+@user_data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_tree_remove ##### -->
+<para>
+
+</para>
+
+@tree:
+@key:
+@Returns:
+
+
+<!-- ##### FUNCTION g_tree_steal ##### -->
+<para>
+
+</para>
+
+@tree:
+@key:
+@Returns:
+
+
+<!-- ##### FUNCTION g_tree_destroy ##### -->
+<para>
+
+</para>
+
+@tree:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/trees-nary.sgml b/trunk/docs/reference/glib/tmpl/trees-nary.sgml
new file mode 100644
index 000000000..17265cb62
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/trees-nary.sgml
@@ -0,0 +1,543 @@
+<!-- ##### SECTION Title ##### -->
+N-ary Trees
+
+<!-- ##### SECTION Short_Description ##### -->
+trees of data with any number of branches.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The #GNode struct and its associated functions provide a N-ary tree data
+structure, where nodes in the tree can contain arbitrary data.
+</para>
+<para>
+To create a new tree use g_node_new().
+</para>
+<para>
+To insert a node into a tree use g_node_insert(), g_node_insert_before(),
+g_node_append() and g_node_prepend().
+</para>
+<para>
+To create a new node and insert it into a tree use g_node_insert_data(),
+g_node_insert_data_before(), g_node_append_data() and g_node_prepend_data().
+</para>
+<para>
+To reverse the children of a node use g_node_reverse_children().
+</para>
+<para>
+To find a node use g_node_get_root(), g_node_find(), g_node_find_child(),
+g_node_child_index(), g_node_child_position(),
+g_node_first_child(), g_node_last_child(),
+g_node_nth_child(), g_node_first_sibling(), g_node_prev_sibling(),
+g_node_next_sibling() or g_node_last_sibling().
+</para>
+<para>
+To get information about a node or tree use G_NODE_IS_LEAF(),
+G_NODE_IS_ROOT(), g_node_depth(), g_node_n_nodes(), g_node_n_children(),
+g_node_is_ancestor() or g_node_max_height().
+</para>
+<para>
+To traverse a tree, calling a function for each node visited in the
+traversal, use g_node_traverse() or g_node_children_foreach().
+</para>
+<para>
+To remove a node or subtree from a tree use g_node_unlink() or
+g_node_destroy().
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GNode ##### -->
+<para>
+The <structname>GNode</structname> struct represents one node in a
+<link linkend="glib-N-ary-Trees">N-ary Tree</link>.
+fields
+</para>
+
+@data: contains the actual data of the node.
+@next: points to the node's next sibling (a sibling is another
+ <structname>GNode</structname> with the same parent).
+@prev: points to the node's previous sibling.
+@parent: points to the parent of the <structname>GNode</structname>,
+ or is %NULL if the <structname>GNode</structname> is the root of the tree.
+@children: The <structfield>children</structfield> field points to the first
+ child of the <structname>GNode</structname>. The other children are accessed
+ by using the <structfield>next</structfield> pointer of each child.
+
+<!-- ##### FUNCTION g_node_new ##### -->
+<para>
+Creates a new #GNode containing the given data.
+Used to create the first node in a tree.
+</para>
+
+@data: the data of the new node.
+@Returns: a new #GNode.
+
+
+<!-- ##### FUNCTION g_node_copy ##### -->
+<para>
+Recursively copies a #GNode (but does not deep-copy the data inside the nodes,
+see g_node_copy_deep() if you need that).
+</para>
+
+@node: a #GNode.
+@Returns: a new #GNode containing the same data pointers.
+
+
+<!-- ##### USER_FUNCTION GCopyFunc ##### -->
+<para>
+A function of this signature is used to copy the node data when doing a deep-copy
+of a tree.
+</para>
+
+@src: A pointer to the data which should be copied.
+@data: Additional data.
+@Returns: A pointer to the copy.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_node_copy_deep ##### -->
+<para>
+
+</para>
+
+@node:
+@copy_func:
+@data:
+@Returns:
+
+
+<!-- ##### FUNCTION g_node_insert ##### -->
+<para>
+Inserts a #GNode beneath the parent at the given position.
+</para>
+
+@parent: the #GNode to place @node under.
+@position: the position to place @node at, with respect to its siblings.
+If position is -1, @node is inserted as the last child of @parent.
+@node: the #GNode to insert.
+@Returns: the inserted #GNode.
+
+
+<!-- ##### FUNCTION g_node_insert_before ##### -->
+<para>
+Inserts a #GNode beneath the parent before the given sibling.
+</para>
+
+@parent: the #GNode to place @node under.
+@sibling: the sibling #GNode to place @node before. If sibling is %NULL,
+the node is inserted as the last child of @parent.
+@node: the #GNode to insert.
+@Returns: the inserted #GNode.
+
+
+<!-- ##### FUNCTION g_node_insert_after ##### -->
+<para>
+Inserts a #GNode beneath the parent after the given sibling.
+</para>
+
+@parent: the #GNode to place @node under.
+@sibling: the sibling #GNode to place @node after. If sibling is %NULL,
+the node is inserted as the first child of @parent.
+@node: the #GNode to insert.
+@Returns: the inserted #GNode.
+
+
+<!-- ##### MACRO g_node_append ##### -->
+<para>
+Inserts a #GNode as the last child of the given parent.
+</para>
+
+@parent: the #GNode to place the new #GNode under.
+@node: the #GNode to insert.
+@Returns: the inserted #GNode.
+
+
+<!-- ##### FUNCTION g_node_prepend ##### -->
+<para>
+Inserts a #GNode as the first child of the given parent.
+</para>
+
+@parent: the #GNode to place the new #GNode under.
+@node: the #GNode to insert.
+@Returns: the inserted #GNode.
+
+
+<!-- ##### MACRO g_node_insert_data ##### -->
+<para>
+Inserts a new #GNode at the given position.
+</para>
+
+@parent: the #GNode to place the new #GNode under.
+@position: the position to place the new #GNode at.
+If position is -1, the new #GNode is inserted as the last child of @parent.
+@data: the data for the new #GNode.
+@Returns: the new #GNode.
+
+
+<!-- ##### MACRO g_node_insert_data_before ##### -->
+<para>
+Inserts a new #GNode before the given sibling.
+</para>
+
+@parent: the #GNode to place the new #GNode under.
+@sibling: the sibling #GNode to place the new #GNode before.
+@data: the data for the new #GNode.
+@Returns: the new #GNode.
+
+
+<!-- ##### MACRO g_node_append_data ##### -->
+<para>
+Inserts a new #GNode as the last child of the given parent.
+</para>
+
+@parent: the #GNode to place the new #GNode under.
+@data: the data for the new #GNode.
+@Returns: the new #GNode.
+
+
+<!-- ##### MACRO g_node_prepend_data ##### -->
+<para>
+Inserts a new #GNode as the first child of the given parent.
+</para>
+
+@parent: the #GNode to place the new #GNode under.
+@data: the data for the new #GNode.
+@Returns: the new #GNode.
+
+
+<!-- ##### FUNCTION g_node_reverse_children ##### -->
+<para>
+Reverses the order of the children of a #GNode.
+(It doesn't change the order of the grandchildren.)
+</para>
+
+@node: a #GNode.
+
+
+<!-- ##### FUNCTION g_node_traverse ##### -->
+<para>
+Traverses a tree starting at the given root #GNode.
+It calls the given function for each node visited.
+The traversal can be halted at any point by returning %TRUE from @func.
+</para>
+
+@root: the root #GNode of the tree to traverse.
+@order: the order in which nodes are visited - %G_IN_ORDER, %G_PRE_ORDER,
+%G_POST_ORDER, or %G_LEVEL_ORDER.
+@flags: which types of children are to be visited, one of %G_TRAVERSE_ALL,
+%G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES.
+@max_depth: the maximum depth of the traversal. Nodes below this
+depth will not be visited. If max_depth is -1 all nodes in the tree are
+visited. If depth is 1, only the root is visited. If depth is 2, the root
+and its children are visited. And so on.
+@func: the function to call for each visited #GNode.
+@data: user data to pass to the function.
+
+
+<!-- ##### ENUM GTraverseFlags ##### -->
+<para>
+Specifies which nodes are visited during several of the tree functions,
+including g_node_traverse() and g_node_find().
+</para>
+
+@G_TRAVERSE_LEAVES: only leaf nodes should be visited. This name has been
+ introduced in 2.6, for older version use %G_TRAVERSE_LEAFS.
+@G_TRAVERSE_NON_LEAVES: only non-leaf nodes should be visited. This name
+ has been introduced in 2.6, for older version use %G_TRAVERSE_NON_LEAFS.
+@G_TRAVERSE_ALL: all nodes should be visited.
+@G_TRAVERSE_MASK:
+@G_TRAVERSE_LEAFS: identical to %G_TRAVERSE_LEAVES
+@G_TRAVERSE_NON_LEAFS: identical to %G_TRAVERSE_NON_LEAVES
+
+<!-- ##### USER_FUNCTION GNodeTraverseFunc ##### -->
+<para>
+Specifies the type of function passed to g_node_traverse().
+The function is called with each of the nodes visited, together with the
+user data passed to g_node_traverse().
+If the function returns %TRUE, then the traversal is stopped.
+</para>
+
+@node: a #GNode.
+@data: user data passed to g_node_traverse().
+@Returns: %TRUE to stop the traversal.
+
+
+<!-- ##### FUNCTION g_node_children_foreach ##### -->
+<para>
+Calls a function for each of the children of a #GNode.
+Note that it doesn't descend beneath the child nodes.
+</para>
+
+@node: a #GNode.
+@flags: which types of children are to be visited, one of %G_TRAVERSE_ALL,
+%G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES.
+@func: the function to call for each visited node.
+@data: user data to pass to the function.
+
+
+<!-- ##### USER_FUNCTION GNodeForeachFunc ##### -->
+<para>
+Specifies the type of function passed to g_node_children_foreach().
+The function is called with each child node, together with the user data
+passed to g_node_children_foreach().
+</para>
+
+@node: a #GNode.
+@data: user data passed to g_node_children_foreach().
+
+
+<!-- ##### FUNCTION g_node_get_root ##### -->
+<para>
+Gets the root of a tree.
+</para>
+
+@node: a #GNode.
+@Returns: the root of the tree.
+
+
+<!-- ##### FUNCTION g_node_find ##### -->
+<para>
+Finds a #GNode in a tree.
+</para>
+
+@root: the root #GNode of the tree to search.
+@order: the order in which nodes are visited - %G_IN_ORDER, %G_PRE_ORDER,
+%G_POST_ORDER, or %G_LEVEL_ORDER.
+@flags: which types of children are to be searched, one of %G_TRAVERSE_ALL,
+%G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES.
+@data: the data to find.
+@Returns: the found #GNode, or %NULL if the data is not found.
+
+
+<!-- ##### FUNCTION g_node_find_child ##### -->
+<para>
+Finds the first child of a #GNode with the given data.
+</para>
+
+@node: a #GNode.
+@flags: which types of children are to be searched, one of %G_TRAVERSE_ALL,
+%G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES.
+@data: the data to find.
+@Returns: the found child #GNode, or %NULL if the data is not found.
+
+
+<!-- ##### FUNCTION g_node_child_index ##### -->
+<para>
+Gets the position of the first child of a #GNode which contains the given data.
+</para>
+
+@node: a #GNode.
+@data: the data to find.
+@Returns: the index of the child of @node which contains @data, or -1
+if the data is not found.
+
+
+<!-- ##### FUNCTION g_node_child_position ##### -->
+<para>
+Gets the position of a #GNode with respect to its siblings.
+@child must be a child of @node.
+The first child is numbered 0, the second 1, and so on.
+</para>
+
+@node: a #GNode.
+@child: a child of @node.
+@Returns: the position of @child with respect to its siblings.
+
+
+<!-- ##### MACRO g_node_first_child ##### -->
+<para>
+Gets the first child of a #GNode.
+</para>
+
+@node: a #GNode.
+@Returns: the first child of @node, or %NULL if @node is %NULL or has no children.
+
+
+<!-- ##### FUNCTION g_node_last_child ##### -->
+<para>
+Gets the last child of a #GNode.
+</para>
+
+@node: a #GNode (must not be %NULL).
+@Returns: the last child of @node, or %NULL if @node has no children.
+
+
+<!-- ##### FUNCTION g_node_nth_child ##### -->
+<para>
+Gets a child of a #GNode, using the given index.
+The first child is at index 0. If the index is too big, %NULL is returned.
+</para>
+
+@node: a #GNode.
+@n: the index of the desired child.
+@Returns: the child of @node at index @n.
+
+
+<!-- ##### FUNCTION g_node_first_sibling ##### -->
+<para>
+Gets the first sibling of a #GNode.
+This could possibly be the node itself.
+</para>
+
+@node: a #GNode.
+@Returns: the first sibling of @node.
+
+
+<!-- ##### MACRO g_node_next_sibling ##### -->
+<para>
+Gets the next sibling of a #GNode.
+</para>
+
+@node: a #GNode.
+@Returns: the next sibling of @node, or %NULL if @node is %NULL.
+
+
+<!-- ##### MACRO g_node_prev_sibling ##### -->
+<para>
+Gets the previous sibling of a #GNode.
+</para>
+
+@node: a #GNode.
+@Returns: the previous sibling of @node, or %NULL if @node is %NULL.
+
+
+<!-- ##### FUNCTION g_node_last_sibling ##### -->
+<para>
+Gets the last sibling of a #GNode.
+This could possibly be the node itself.
+</para>
+
+@node: a #GNode.
+@Returns: the last sibling of @node.
+
+
+<!-- ##### MACRO G_NODE_IS_LEAF ##### -->
+<para>
+Returns %TRUE if a #GNode is a leaf node.
+</para>
+
+@node: a #GNode.
+@Returns: %TRUE if the #GNode is a leaf node (i.e. it has no children).
+
+
+<!-- ##### MACRO G_NODE_IS_ROOT ##### -->
+<para>
+Returns %TRUE if a #GNode is the root of a tree.
+</para>
+
+@node: a #GNode.
+@Returns: %TRUE if the #GNode is the root of a tree (i.e. it has no parent
+or siblings).
+
+
+<!-- ##### FUNCTION g_node_depth ##### -->
+<para>
+Gets the depth of a #GNode.
+</para>
+<para>
+If @node is %NULL the depth is 0.
+The root node has a depth of 1.
+For the children of the root node the depth is 2. And so on.
+</para>
+
+@node: a #GNode.
+@Returns: the depth of the #GNode.
+
+
+<!-- ##### FUNCTION g_node_n_nodes ##### -->
+<para>
+Gets the number of nodes in a tree.
+</para>
+
+@root: a #GNode.
+@flags: which types of children are to be counted, one of %G_TRAVERSE_ALL,
+%G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES.
+@Returns: the number of nodes in the tree.
+
+
+<!-- ##### FUNCTION g_node_n_children ##### -->
+<para>
+Gets the number of children of a #GNode.
+</para>
+
+@node: a #GNode.
+@Returns: the number of children of @node.
+
+
+<!-- ##### FUNCTION g_node_is_ancestor ##### -->
+<para>
+Returns %TRUE if @node is an ancestor of @descendant.
+This is true if node is the parent of @descendant, or if node is the
+grandparent of @descendant etc.
+</para>
+
+@node: a #GNode.
+@descendant: a #GNode.
+@Returns: %TRUE if @node is an ancestor of @descendant.
+
+
+<!-- ##### FUNCTION g_node_max_height ##### -->
+<para>
+Gets the maximum height of all branches beneath a #GNode.
+This is the maximum distance from the #GNode to all leaf nodes.
+</para>
+<para>
+If @root is %NULL, 0 is returned. If @root has no children, 1 is returned.
+If @root has children, 2 is returned. And so on.
+</para>
+
+@root: a #GNode.
+@Returns: the maximum height of the tree beneath @root.
+
+
+<!-- ##### FUNCTION g_node_unlink ##### -->
+<para>
+Unlinks a #GNode from a tree, resulting in two separate trees.
+</para>
+
+@node: the #GNode to unlink, which becomes the root of a new tree.
+
+
+<!-- ##### FUNCTION g_node_destroy ##### -->
+<para>
+Removes the #GNode and its children from the tree, freeing any memory
+allocated.
+</para>
+
+@root: the root of the tree/subtree to destroy.
+
+
+<!-- ##### FUNCTION g_node_push_allocator ##### -->
+<para>
+Sets the allocator to use to allocate #GNode elements.
+Use g_node_pop_allocator() to restore the previous allocator.
+</para>
+<para>
+Note that this function is not available if GLib has been compiled
+with <option>--disable-mem-pools</option>
+</para>
+
+@dummy: the #GAllocator to use when allocating #GNode elements.
+@Deprecated: 2.10: It does nothing, since #GNode has been converted
+ to the <link linkend="glib-Memory-Slices">slice allocator</link>
+
+
+<!-- ##### FUNCTION g_node_pop_allocator ##### -->
+<para>
+Restores the previous #GAllocator, used when allocating #GNode elements.
+</para>
+<para>
+Note that this function is not available if GLib has been compiled
+with <option>--disable-mem-pools</option>
+</para>
+
+@Deprecated: 2.10: It does nothing, since #GNode has been converted
+ to the <link linkend="glib-Memory-Slices">slice allocator</link>
+
+
diff --git a/trunk/docs/reference/glib/tmpl/type_conversion.sgml b/trunk/docs/reference/glib/tmpl/type_conversion.sgml
new file mode 100644
index 000000000..6d204e5be
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/type_conversion.sgml
@@ -0,0 +1,123 @@
+<!-- ##### SECTION Title ##### -->
+Type Conversion Macros
+
+<!-- ##### SECTION Short_Description ##### -->
+
+portably storing integers in pointer variables.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+Many times GLib, GTK+, and other libraries allow you to pass "user
+data" to a callback, in the form of a void pointer. From time to time
+you want to pass an integer instead of a pointer. You could allocate
+an integer, with something like:
+<informalexample><programlisting>
+ int *ip = g_new (int, 1);
+ *ip = 42;
+</programlisting></informalexample>
+But this is inconvenient, and it's annoying to have to free the
+memory at some later time.
+</para>
+<para>
+Pointers are always at least 32 bits in size (on all platforms GLib
+intends to support). Thus you can store at least 32-bit integer values
+in a pointer value. Naively, you might try this, but it's incorrect:
+<informalexample><programlisting>
+ gpointer p;
+ int i;
+ p = (void*) 42;
+ i = (int) p;
+</programlisting></informalexample>
+Again, that example was <emphasis>not</emphasis> correct, don't copy it.
+The problem is that on some systems you need to do this:
+<informalexample><programlisting>
+ gpointer p;
+ int i;
+ p = (void*) (long) 42;
+ i = (int) (long) p;
+</programlisting></informalexample>
+So GPOINTER_TO_INT(), GINT_TO_POINTER(), etc. do the right thing
+on the current platform.
+</para>
+<para>
+<warning>
+<para>
+YOU MAY NOT STORE POINTERS IN INTEGERS. THIS IS NOT PORTABLE IN ANY
+WAY SHAPE OR FORM. These macros <emphasis>ONLY</emphasis> allow
+storing integers in pointers, and only preserve 32 bits of the
+integer; values outside the range of a 32-bit integer will be mangled.
+</para>
+</warning>
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO GINT_TO_POINTER ##### -->
+<para>
+Stuffs an integer into a pointer type.
+</para>
+<para>
+Remember, YOU MAY NOT STORE POINTERS IN INTEGERS. THIS IS NOT PORTABLE
+IN ANY WAY SHAPE OR FORM. These macros <emphasis>ONLY</emphasis> allow
+storing integers in pointers, and only preserve 32 bits of the
+integer; values outside the range of a 32-bit integer will be mangled.
+</para>
+
+@i: integer to stuff into a pointer.
+
+
+<!-- ##### MACRO GPOINTER_TO_INT ##### -->
+<para>
+Extracts an integer from a pointer. The integer must have
+been stored in the pointer with GINT_TO_POINTER().
+</para>
+<para>
+Remember, YOU MAY NOT STORE POINTERS IN INTEGERS. THIS IS NOT PORTABLE
+IN ANY WAY SHAPE OR FORM. These macros <emphasis>ONLY</emphasis> allow
+storing integers in pointers, and only preserve 32 bits of the
+integer; values outside the range of a 32-bit integer will be mangled.
+</para>
+
+@p: pointer containing an integer.
+
+
+<!-- ##### MACRO GUINT_TO_POINTER ##### -->
+<para>
+Stuffs an unsigned integer into a pointer type.
+</para>
+
+@u: unsigned integer to stuff into the pointer.
+
+
+<!-- ##### MACRO GPOINTER_TO_UINT ##### -->
+<para>
+Extracts an unsigned integer from a pointer. The integer must have
+been stored in the pointer with GUINT_TO_POINTER().
+</para>
+
+@p: pointer to extract an unsigned integer from.
+
+
+<!-- ##### MACRO GSIZE_TO_POINTER ##### -->
+<para>
+Stuffs a #gsize into a pointer type.
+</para>
+
+@s: #gsize to stuff into the pointer.
+
+
+<!-- ##### MACRO GPOINTER_TO_SIZE ##### -->
+<para>
+Extracts a #gsize from a pointer. The #gsize must have
+been stored in the pointer with GSIZE_TO_POINTER().
+</para>
+
+@p: pointer to extract a #gsize from.
+
+
diff --git a/trunk/docs/reference/glib/tmpl/types.sgml b/trunk/docs/reference/glib/tmpl/types.sgml
new file mode 100644
index 000000000..f1c9544e0
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/types.sgml
@@ -0,0 +1,234 @@
+<!-- ##### SECTION Title ##### -->
+Basic Types
+
+<!-- ##### SECTION Short_Description ##### -->
+standard GLib types, defined for ease-of-use and portability.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+GLib defines a number of commonly used types, which can be divided into
+4 groups:
+
+<itemizedlist>
+<listitem><para>
+New types which are not part of standard C - #gboolean, #gsize, #gssize.
+</para></listitem>
+
+<listitem><para>
+Integer types which are guaranteed to be the same size across all platforms -
+#gint8, #guint8, #gint16, #guint16, #gint32, #guint32, #gint64, #guint64.
+</para></listitem>
+
+<listitem><para>
+Types which are easier to use than their standard C counterparts -
+#gpointer, #gconstpointer, #guchar, #guint, #gushort, #gulong.
+</para></listitem>
+
+<listitem><para>
+Types which correspond exactly to standard C types, but are included
+for completeness - #gchar, #gint, #gshort, #glong, #gfloat, #gdouble.
+</para></listitem>
+</itemizedlist>
+
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### TYPEDEF gboolean ##### -->
+<para>
+A standard <type>boolean</type> type.
+Variables of this type should only contain the value %TRUE or %FALSE.
+</para>
+
+
+<!-- ##### TYPEDEF gpointer ##### -->
+<para>
+An untyped pointer.
+#gpointer looks better and is easier to use than <type>void*</type>.
+</para>
+
+
+<!-- ##### TYPEDEF gconstpointer ##### -->
+<para>
+An untyped pointer to constant data.
+The data pointed to should not be changed.
+</para>
+<para>
+This is typically used in function prototypes to indicate that the
+data pointed to will not be altered by the function.
+</para>
+
+
+<!-- ##### TYPEDEF gchar ##### -->
+<para>
+Corresponds to the standard C <type>char</type> type.
+</para>
+
+
+<!-- ##### TYPEDEF guchar ##### -->
+<para>
+Corresponds to the standard C <type>unsigned char</type> type.
+</para>
+
+
+<!-- ##### TYPEDEF gint ##### -->
+<para>
+Corresponds to the standard C <type>int</type> type.
+Values of this type can range from #G_MININT to #G_MAXINT.
+</para>
+
+
+<!-- ##### TYPEDEF guint ##### -->
+<para>
+Corresponds to the standard C <type>unsigned int</type> type.
+Values of this type can range from 0 to #G_MAXUINT.
+</para>
+
+
+<!-- ##### TYPEDEF gshort ##### -->
+<para>
+Corresponds to the standard C <type>short</type> type.
+Values of this type can range from #G_MINSHORT to #G_MAXSHORT.
+</para>
+
+
+<!-- ##### TYPEDEF gushort ##### -->
+<para>
+Corresponds to the standard C <type>unsigned short</type> type.
+Values of this type can range from 0 to #G_MAXUSHORT.
+</para>
+
+
+<!-- ##### TYPEDEF glong ##### -->
+<para>
+Corresponds to the standard C <type>long</type> type.
+Values of this type can range from #G_MINLONG to #G_MAXLONG.
+</para>
+
+
+<!-- ##### TYPEDEF gulong ##### -->
+<para>
+Corresponds to the standard C <type>unsigned long</type> type.
+Values of this type can range from 0 to #G_MAXULONG.
+</para>
+
+
+<!-- ##### TYPEDEF gint8 ##### -->
+<para>
+A signed integer guaranteed to be 8 bits on all platforms.
+Values of this type can range from -128 to 127.
+</para>
+
+
+<!-- ##### TYPEDEF guint8 ##### -->
+<para>
+An unsigned integer guaranteed to be 8 bits on all platforms.
+Values of this type can range from 0 to 255.
+</para>
+
+
+<!-- ##### TYPEDEF gint16 ##### -->
+<para>
+A signed integer guaranteed to be 16 bits on all platforms.
+Values of this type can range from -32,768 to 32,767.
+</para>
+
+
+<!-- ##### TYPEDEF guint16 ##### -->
+<para>
+An unsigned integer guaranteed to be 16 bits on all platforms.
+Values of this type can range from 0 to 65,535.
+</para>
+
+
+<!-- ##### TYPEDEF gint32 ##### -->
+<para>
+A signed integer guaranteed to be 32 bits on all platforms.
+Values of this type can range from -2,147,483,648 to 2,147,483,647.
+</para>
+
+
+<!-- ##### TYPEDEF guint32 ##### -->
+<para>
+An unsigned integer guaranteed to be 32 bits on all platforms.
+Values of this type can range from 0 to 4,294,967,295.
+</para>
+
+
+<!-- ##### MACRO G_HAVE_GINT64 ##### -->
+<para>
+This macro is defined if 64-bit signed and unsigned integers are available
+on the platform.
+</para>
+
+@Deprecated: GLib requires 64-bit integer support since version 2.0, therefore
+%G_HAVE_GINT64 is <emphasis>always</emphasis> defined.
+
+
+<!-- ##### TYPEDEF gint64 ##### -->
+<para>
+A signed integer guaranteed to be 64 bits on all platforms.
+Values of this type can range from -9,223,372,036,854,775,808 to
+9,223,372,036,854,775,807.
+</para>
+
+
+<!-- ##### FUNCTION guint64 ##### -->
+<para>
+An unsigned integer guaranteed to be 64 bits on all platforms.
+Values of this type can range from 0 to 18,446,744,073,709,551,615.
+</para>
+
+@Returns:
+
+
+<!-- ##### MACRO G_GINT64_CONSTANT ##### -->
+<para>
+This macro is used to insert 64-bit integer literals into the source code.
+</para>
+
+@val: a literal integer value, e.g. 0x1d636b02300a7aa7U.
+
+
+<!-- ##### MACRO G_GUINT64_CONSTANT ##### -->
+<para>
+This macro is used to insert 64-bit unsigned integer literals into the
+source code.
+</para>
+
+@val: a literal integer value, e.g. 0x1d636b02300a7aa7U.
+@Since: 2.10
+
+
+<!-- ##### TYPEDEF gfloat ##### -->
+<para>
+Corresponds to the standard C <type>float</type> type.
+Values of this type can range from -#G_MAXFLOAT to #G_MAXFLOAT.
+</para>
+
+
+<!-- ##### TYPEDEF gdouble ##### -->
+<para>
+Corresponds to the standard C <type>double</type> type.
+Values of this type can range from -#G_MAXDOUBLE to #G_MAXDOUBLE.
+</para>
+
+
+<!-- ##### TYPEDEF gsize ##### -->
+<para>
+An unsigned 32-bit integer intended to represent sizes of data structures.
+</para>
+
+
+<!-- ##### TYPEDEF gssize ##### -->
+<para>
+A signed 32-bit integer intended to represent sizes of data structures.
+</para>
+
+
diff --git a/trunk/docs/reference/glib/tmpl/unicode.sgml b/trunk/docs/reference/glib/tmpl/unicode.sgml
new file mode 100644
index 000000000..3f712af5a
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/unicode.sgml
@@ -0,0 +1,831 @@
+<!-- ##### SECTION Title ##### -->
+Unicode Manipulation
+
+<!-- ##### SECTION Short_Description ##### -->
+functions operating on Unicode characters and UTF-8 strings.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+This section describes a number of functions for dealing with
+Unicode characters and strings. There are analogues of the
+traditional <filename>ctype.h</filename> character classification
+and case conversion functions, UTF-8 analogues of some string utility
+functions, functions to perform normalization, case conversion and
+collation on UTF-8 strings and finally functions to convert between
+the UTF-8, UTF-16 and UCS-4 encodings of Unicode.
+</para>
+
+<para>
+The implementations of the Unicode functions in GLib are based
+on the Unicode Character Data tables, which are available from
+<ulink url="http://www.unicode.org">www.unicode.org</ulink>.
+GLib 2.8 supports Unicode 4.0, GLib 2.10 supports Unicode 4.1,
+GLib 2.12 supports Unicode 5.0.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+<variablelist>
+
+<varlistentry>
+<term>g_locale_to_utf8(), g_locale_from_utf8()</term>
+<listitem><para>
+Convenience functions for converting between UTF-8 and the locale encoding.
+</para></listitem>
+</varlistentry>
+
+</variablelist>
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### TYPEDEF gunichar ##### -->
+<para>
+A type which can hold any UCS-4 character code.
+</para>
+
+
+<!-- ##### TYPEDEF gunichar2 ##### -->
+<para>
+A type which can hold any UTF-16 code
+point<footnote id="utf16_surrogate_pairs">UTF-16 also has so called
+<firstterm>surrogate pairs</firstterm> to encode characters beyond the
+BMP as pairs of 16bit numbers. Surrogate pairs cannot be stored in a
+single gunichar2 field, but all GLib functions accepting gunichar2 arrays
+will correctly interpret surrogate pairs.</footnote>.
+</para>
+
+
+<!-- ##### FUNCTION g_unichar_validate ##### -->
+<para>
+
+</para>
+
+@ch:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_isalnum ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_isalpha ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_iscntrl ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_isdefined ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_isdigit ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_isgraph ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_islower ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_ismark ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_isprint ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_ispunct ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_isspace ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_istitle ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_isupper ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_isxdigit ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_iswide ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_iswide_cjk ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_iszerowidth ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_toupper ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_tolower ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_totitle ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_digit_value ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_xdigit_value ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### ENUM GUnicodeType ##### -->
+<para>
+These are the possible character classifications from the
+Unicode specification.
+See <ulink url="http://www.unicode.org/Public/UNIDATA/UnicodeData.html"
+>http://www.unicode.org/Public/UNIDATA/UnicodeData.html</ulink>.
+</para>
+
+@G_UNICODE_CONTROL: General category "Other, Control" (Cc)
+@G_UNICODE_FORMAT: General category "Other, Format" (Cf)
+@G_UNICODE_UNASSIGNED: General category "Other, Not Assigned" (Cn)
+@G_UNICODE_PRIVATE_USE: General category "Other, Private Use" (Co)
+@G_UNICODE_SURROGATE: General category "Other, Surrogate" (Cs)
+@G_UNICODE_LOWERCASE_LETTER: General category "Letter, Lowercase" (Ll)
+@G_UNICODE_MODIFIER_LETTER: General category "Letter, Modifier" (Lm)
+@G_UNICODE_OTHER_LETTER: General category "Letter, Other" (Lo)
+@G_UNICODE_TITLECASE_LETTER: General category "Letter, Titlecase" (Lt)
+@G_UNICODE_UPPERCASE_LETTER: General category "Letter, Uppercase" (Lu)
+@G_UNICODE_COMBINING_MARK: General category "Mark, Spacing Combining" (Mc)
+@G_UNICODE_ENCLOSING_MARK: General category "Mark, Enclosing" (Me)
+@G_UNICODE_NON_SPACING_MARK: General category "Mark, Nonspacing" (Mn)
+@G_UNICODE_DECIMAL_NUMBER: General category "Number, Decimal Digit" (Nd)
+@G_UNICODE_LETTER_NUMBER: General category "Number, Letter" (Nl)
+@G_UNICODE_OTHER_NUMBER: General category "Number, Other" (No)
+@G_UNICODE_CONNECT_PUNCTUATION: General category "Punctuation, Connector" (Pc)
+@G_UNICODE_DASH_PUNCTUATION: General category "Punctuation, Dash" (Pd)
+@G_UNICODE_CLOSE_PUNCTUATION: General category "Punctuation, Close" (Pe)
+@G_UNICODE_FINAL_PUNCTUATION: General category "Punctuation, Final quote" (Pf)
+@G_UNICODE_INITIAL_PUNCTUATION: General category "Punctuation, Initial quote" (Pi)
+@G_UNICODE_OTHER_PUNCTUATION: General category "Punctuation, Other" (Po)
+@G_UNICODE_OPEN_PUNCTUATION: General category "Punctuation, Open" (Ps)
+@G_UNICODE_CURRENCY_SYMBOL: General category "Symbol, Currency" (Sc)
+@G_UNICODE_MODIFIER_SYMBOL: General category "Symbol, Modifier" (Sk)
+@G_UNICODE_MATH_SYMBOL: General category "Symbol, Math" (Sm)
+@G_UNICODE_OTHER_SYMBOL: General category "Symbol, Other" (So)
+@G_UNICODE_LINE_SEPARATOR: General category "Separator, Line" (Zl)
+@G_UNICODE_PARAGRAPH_SEPARATOR: General category "Separator, Paragraph" (Zp)
+@G_UNICODE_SPACE_SEPARATOR: General category "Separator, Space" (Zs)
+
+<!-- ##### FUNCTION g_unichar_type ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### ENUM GUnicodeBreakType ##### -->
+<para>
+These are the possible line break classifications.
+The five Hangul types were added in Unicode 4.1, so, has been
+introduced in GLib 2.10. Note that new types may be added in the future.
+Applications should be ready to handle unknown values.
+They may be regarded as %G_UNICODE_BREAK_UNKNOWN.
+See <ulink url="http://www.unicode.org/unicode/reports/tr14/"
+>http://www.unicode.org/unicode/reports/tr14/</ulink>.
+</para>
+
+@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:
+@G_UNICODE_BREAK_NEXT_LINE:
+@G_UNICODE_BREAK_WORD_JOINER:
+@G_UNICODE_BREAK_HANGUL_L_JAMO:
+@G_UNICODE_BREAK_HANGUL_V_JAMO:
+@G_UNICODE_BREAK_HANGUL_T_JAMO:
+@G_UNICODE_BREAK_HANGUL_LV_SYLLABLE:
+@G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE:
+
+<!-- ##### FUNCTION g_unichar_break_type ##### -->
+<para>
+
+</para>
+
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unicode_canonical_ordering ##### -->
+<para>
+
+</para>
+
+@string:
+@len:
+
+
+<!-- ##### FUNCTION g_unicode_canonical_decomposition ##### -->
+<para>
+
+</para>
+
+@ch:
+@result_len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_get_mirror_char ##### -->
+<para>
+
+</para>
+
+@ch:
+@mirrored_ch:
+@Returns:
+
+
+<!-- ##### ENUM GUnicodeScript ##### -->
+<para>
+The #GUnicodeScript enumeration identifies different writing
+systems. The values correspond to the names as defined in the
+Unicode standard. The enumeration has been added in GLib 2.14.
+Note that new types may be added in the future. Applications
+should be ready to handle unknown values.
+See <ulink
+url="http://www.unicode.org/reports/tr24/">Unicode Standard Annex
+#24: Script names</ulink>.
+</para>
+
+@G_UNICODE_SCRIPT_INVALID_CODE: a value never returned from g_unichar_get_script()
+@G_UNICODE_SCRIPT_COMMON: a character used by multiple different scripts
+@G_UNICODE_SCRIPT_INHERITED: a mark glyph that takes its script from the
+ base glyph to which it is attached
+@G_UNICODE_SCRIPT_ARABIC: Arabic
+@G_UNICODE_SCRIPT_ARMENIAN: Armenian
+@G_UNICODE_SCRIPT_BENGALI: Bengali
+@G_UNICODE_SCRIPT_BOPOMOFO: Bopomofo
+@G_UNICODE_SCRIPT_CHEROKEE: Cherokee
+@G_UNICODE_SCRIPT_COPTIC: Coptic
+@G_UNICODE_SCRIPT_CYRILLIC: Cyrillic
+@G_UNICODE_SCRIPT_DESERET: Deseret
+@G_UNICODE_SCRIPT_DEVANAGARI: Devanagari
+@G_UNICODE_SCRIPT_ETHIOPIC: Ethiopic
+@G_UNICODE_SCRIPT_GEORGIAN: Georgian
+@G_UNICODE_SCRIPT_GOTHIC: Gothic
+@G_UNICODE_SCRIPT_GREEK: Greek
+@G_UNICODE_SCRIPT_GUJARATI: Gujarati
+@G_UNICODE_SCRIPT_GURMUKHI: Gurmukhi
+@G_UNICODE_SCRIPT_HAN: Han
+@G_UNICODE_SCRIPT_HANGUL: Hangul
+@G_UNICODE_SCRIPT_HEBREW: Hebrew
+@G_UNICODE_SCRIPT_HIRAGANA: Hiragana
+@G_UNICODE_SCRIPT_KANNADA: Kannada
+@G_UNICODE_SCRIPT_KATAKANA: Katakana
+@G_UNICODE_SCRIPT_KHMER: Khmer
+@G_UNICODE_SCRIPT_LAO: Lao
+@G_UNICODE_SCRIPT_LATIN: Latin
+@G_UNICODE_SCRIPT_MALAYALAM: Malayalam
+@G_UNICODE_SCRIPT_MONGOLIAN: Mongolian
+@G_UNICODE_SCRIPT_MYANMAR: Myanmar
+@G_UNICODE_SCRIPT_OGHAM: Ogham
+@G_UNICODE_SCRIPT_OLD_ITALIC: Old Italic
+@G_UNICODE_SCRIPT_ORIYA: Oriya
+@G_UNICODE_SCRIPT_RUNIC: Runic
+@G_UNICODE_SCRIPT_SINHALA: Sinhala
+@G_UNICODE_SCRIPT_SYRIAC: Syriac
+@G_UNICODE_SCRIPT_TAMIL: Tamil
+@G_UNICODE_SCRIPT_TELUGU: Telugu
+@G_UNICODE_SCRIPT_THAANA: Thaana
+@G_UNICODE_SCRIPT_THAI: Thai
+@G_UNICODE_SCRIPT_TIBETAN: Tibetan
+@G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL:
+ Canadian Aboriginal
+@G_UNICODE_SCRIPT_YI: Yi
+@G_UNICODE_SCRIPT_TAGALOG: Tagalog
+@G_UNICODE_SCRIPT_HANUNOO: Hanunoo
+@G_UNICODE_SCRIPT_BUHID: Buhid
+@G_UNICODE_SCRIPT_TAGBANWA: Tagbanwa
+@G_UNICODE_SCRIPT_BRAILLE: Braille
+@G_UNICODE_SCRIPT_CYPRIOT: Cypriot
+@G_UNICODE_SCRIPT_LIMBU: Limbu
+@G_UNICODE_SCRIPT_OSMANYA: Osmanya
+@G_UNICODE_SCRIPT_SHAVIAN: Shavian
+@G_UNICODE_SCRIPT_LINEAR_B: Linear B
+@G_UNICODE_SCRIPT_TAI_LE: Tai Le
+@G_UNICODE_SCRIPT_UGARITIC: Ugaritic
+@G_UNICODE_SCRIPT_NEW_TAI_LUE: New Tai Lue
+@G_UNICODE_SCRIPT_BUGINESE: Buginese
+@G_UNICODE_SCRIPT_GLAGOLITIC: Glagolitic
+@G_UNICODE_SCRIPT_TIFINAGH: Tifinagh
+@G_UNICODE_SCRIPT_SYLOTI_NAGRI: Syloti Nagri
+@G_UNICODE_SCRIPT_OLD_PERSIAN: Old Persian
+@G_UNICODE_SCRIPT_KHAROSHTHI: Kharoshthi
+@G_UNICODE_SCRIPT_UNKNOWN: an unassigned code point
+@G_UNICODE_SCRIPT_BALINESE: Balinese
+@G_UNICODE_SCRIPT_CUNEIFORM: Cuneiform
+@G_UNICODE_SCRIPT_PHOENICIAN: Phoenician
+@G_UNICODE_SCRIPT_PHAGS_PA: Phags-pa
+@G_UNICODE_SCRIPT_NKO: N'Ko
+
+<!-- ##### FUNCTION g_unichar_get_script ##### -->
+<para>
+
+</para>
+
+@ch:
+@Returns:
+
+
+<!-- ##### MACRO g_utf8_next_char ##### -->
+<para>
+Skips to the next character in a UTF-8 string. The string must be
+valid; this macro is as fast as possible, and has no error-checking.
+You would use this macro to iterate over a string character by
+character. The macro returns the start of the next UTF-8 character.
+Before using this macro, use g_utf8_validate() to validate strings
+that may contain invalid UTF-8.
+</para>
+
+@p: Pointer to the start of a valid UTF-8 character.
+
+
+<!-- ##### FUNCTION g_utf8_get_char ##### -->
+<para>
+
+</para>
+
+@p:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_get_char_validated ##### -->
+<para>
+
+</para>
+
+@p:
+@max_len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_offset_to_pointer ##### -->
+<para>
+
+</para>
+
+@str:
+@offset:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_pointer_to_offset ##### -->
+<para>
+
+</para>
+
+@str:
+@pos:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_prev_char ##### -->
+<para>
+
+</para>
+
+@p:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_find_next_char ##### -->
+<para>
+
+</para>
+
+@p:
+@end:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_find_prev_char ##### -->
+<para>
+
+</para>
+
+@str:
+@p:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_strlen ##### -->
+<para>
+
+</para>
+
+@p:
+@max:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_strncpy ##### -->
+<para>
+
+</para>
+
+@dest:
+@src:
+@n:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_strchr ##### -->
+<para>
+
+</para>
+
+@p:
+@len:
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_strrchr ##### -->
+<para>
+
+</para>
+
+@p:
+@len:
+@c:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_strreverse ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_validate ##### -->
+<para>
+
+</para>
+
+@str:
+@max_len:
+@end:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_strup ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_strdown ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_casefold ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_normalize ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@mode:
+@Returns:
+
+
+<!-- ##### ENUM GNormalizeMode ##### -->
+<para>
+Defines how a Unicode string is transformed in a canonical
+form, standardizing such issues as whether a character with an accent is
+represented as a base character and combining accent or as a single precomposed
+character. Unicode strings should generally be normalized before comparing them.
+</para>
+
+@G_NORMALIZE_DEFAULT: standardize differences that do not affect the
+ text content, such as the above-mentioned accent representation.
+@G_NORMALIZE_NFD: another name for %G_NORMALIZE_DEFAULT.
+@G_NORMALIZE_DEFAULT_COMPOSE: like %G_NORMALIZE_DEFAULT, but with composed
+ forms rather than a maximally decomposed form.
+@G_NORMALIZE_NFC: another name for %G_NORMALIZE_DEFAULT_COMPOSE.
+@G_NORMALIZE_ALL: beyond %G_NORMALIZE_DEFAULT also standardize the
+ "compatibility" characters in Unicode, such as SUPERSCRIPT THREE to the
+ standard forms (in this case DIGIT THREE). Formatting information may be
+ lost but for most text operations such characters should be considered the
+ same.
+@G_NORMALIZE_NFKD: another name for %G_NORMALIZE_ALL.
+@G_NORMALIZE_ALL_COMPOSE: like %G_NORMALIZE_ALL, but with composed
+ forms rather than a maximally decomposed form.
+@G_NORMALIZE_NFKC: another name for %G_NORMALIZE_ALL_COMPOSE.
+
+<!-- ##### FUNCTION g_utf8_collate ##### -->
+<para>
+
+</para>
+
+@str1:
+@str2:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_collate_key ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_collate_key_for_filename ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_to_utf16 ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@items_read:
+@items_written:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_to_ucs4 ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@items_read:
+@items_written:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf8_to_ucs4_fast ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@items_written:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf16_to_ucs4 ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@items_read:
+@items_written:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_utf16_to_utf8 ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@items_read:
+@items_written:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_ucs4_to_utf16 ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@items_read:
+@items_written:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_ucs4_to_utf8 ##### -->
+<para>
+
+</para>
+
+@str:
+@len:
+@items_read:
+@items_written:
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_unichar_to_utf8 ##### -->
+<para>
+
+</para>
+
+@c:
+@outbuf:
+@Returns:
+
+
diff --git a/trunk/docs/reference/glib/tmpl/version.sgml b/trunk/docs/reference/glib/tmpl/version.sgml
new file mode 100644
index 000000000..f46c1e1a5
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/version.sgml
@@ -0,0 +1,139 @@
+<!-- ##### SECTION Title ##### -->
+Version Information
+
+<!-- ##### SECTION Short_Description ##### -->
+Variables and functions to check the GLib version
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+GLib provides version information, primarily useful in configure checks
+for builds that have a configure script. Applications will not
+typically use the features described here.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### VARIABLE glib_major_version ##### -->
+<para>
+The major version number of the GLib library.
+(e.g. in GLib version 1.2.5 this is 1.)
+</para>
+
+<para>
+This variable is in the library, so represents the
+GLib library you have linked against. Contrast with the
+#GLIB_MAJOR_VERSION macro, which represents the major version of the
+GLib headers you have included.
+</para>
+
+
+<!-- ##### VARIABLE glib_minor_version ##### -->
+<para>
+The minor version number of the GLib library.
+(e.g. in GLib version 1.2.5 this is 2.)
+</para>
+
+<para>
+This variable is in the library, so represents the
+GLib library you have linked against. Contrast with the
+#GLIB_MINOR_VERSION macro, which represents the minor version of the
+GLib headers you have included.
+</para>
+
+
+<!-- ##### VARIABLE glib_micro_version ##### -->
+<para>
+The micro version number of the GLib library.
+(e.g. in GLib version 1.2.5 this is 5.)
+</para>
+
+<para>
+This variable is in the library, so represents the GLib library you
+have linked against. Contrast with the #GLIB_MICRO_VERSION macro, which
+represents the micro version of the GLib headers you have included.
+</para>
+
+
+<!-- ##### VARIABLE glib_binary_age ##### -->
+<para>
+This is the binary age passed to <application>libtool</application>. If
+<application>libtool</application> means nothing to you, don't worry
+about it. ;-)
+</para>
+
+
+<!-- ##### VARIABLE glib_interface_age ##### -->
+<para>
+This is the interface age passed to <application>libtool</application>. If
+<application>libtool</application> means nothing to you, don't worry
+about it. ;-)
+</para>
+
+
+<!-- ##### FUNCTION glib_check_version ##### -->
+<para>
+
+</para>
+
+@required_major:
+@required_minor:
+@required_micro:
+@Returns:
+
+
+<!-- ##### MACRO GLIB_MAJOR_VERSION ##### -->
+<para>
+The major version number of the GLib library.
+Like #glib_major_version, but from the headers used at
+application compile time, rather than from the library linked against
+at application run time.
+</para>
+
+
+
+<!-- ##### MACRO GLIB_MINOR_VERSION ##### -->
+<para>
+The minor version number of the GLib library.
+Like #gtk_minor_version, but from the headers used at
+application compile time, rather than from the library linked against
+at application run time.
+</para>
+
+
+
+<!-- ##### MACRO GLIB_MICRO_VERSION ##### -->
+<para>
+The micro version number of the GLib library.
+Like #gtk_micro_version, but from the headers used at
+application compile time, rather than from the library linked against
+at application run time.
+</para>
+
+
+
+<!-- ##### MACRO GLIB_CHECK_VERSION ##### -->
+<para>
+Checks the version of the GLib library.
+Returns %TRUE if the version of the GLib header files is the same
+as or newer than the passed-in version.
+
+<example>
+<title>Checking the version of the GLib library</title>
+<programlisting>
+ if (!GLIB_CHECK_VERSION (1, 2, 0))
+ g_error ("GLib version 1.2.0 or above is needed");
+</programlisting>
+</example>
+</para>
+
+@major: the major version number.
+@minor: the minor version number.
+@micro: the micro version number.
+
+
diff --git a/trunk/docs/reference/glib/tmpl/warnings.sgml b/trunk/docs/reference/glib/tmpl/warnings.sgml
new file mode 100644
index 000000000..110bc7186
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/warnings.sgml
@@ -0,0 +1,229 @@
+<!-- ##### SECTION Title ##### -->
+Message Output and Debugging Functions
+
+<!-- ##### SECTION Short_Description ##### -->
+functions to output messages and help debug applications.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+These functions provide support for outputting messages.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### FUNCTION g_print ##### -->
+<para>
+Outputs a formatted message via the print handler.
+The default print handler simply outputs the message to stdout.
+</para>
+<para>
+g_print() should not be used from within libraries for debugging messages,
+since it may be redirected by applications to special purpose message
+windows or even files.
+Instead, libraries should use g_log(), or the convenience functions
+g_message(), g_warning() and g_error().
+</para>
+
+@format: the message format. See the printf() documentation.
+@Varargs: the parameters to insert into the format string.
+
+
+<!-- ##### FUNCTION g_set_print_handler ##### -->
+<para>
+Sets the print handler.
+Any messages passed to g_print() will be output via the new handler.
+The default handler simply outputs the message to stdout.
+By providing your own handler you can redirect the output, to a GTK+
+widget or a log file for example.
+</para>
+
+@func: the new print handler.
+@Returns: the old print handler.
+
+
+<!-- ##### USER_FUNCTION GPrintFunc ##### -->
+<para>
+Specifies the type of the print handler functions.
+These are called with the complete formatted string to output.
+</para>
+
+@string: the message to be output.
+
+
+<!-- ##### FUNCTION g_printerr ##### -->
+<para>
+Outputs a formatted message via the error message handler.
+The default handler simply outputs the message to stderr.
+</para>
+<para>
+g_printerr() should not be used from within libraries. Instead g_log() should
+be used, or the convenience functions g_message(), g_warning() and g_error().
+</para>
+
+@format: the message format. See the printf() documentation.
+@Varargs: the parameters to insert into the format string.
+
+
+<!-- ##### FUNCTION g_set_printerr_handler ##### -->
+<para>
+Sets the handler for printing error messages.
+Any messages passed to g_printerr() will be output via the new handler.
+The default handler simply outputs the message to stderr.
+By providing your own handler you can redirect the output, to a GTK+
+widget or a log file for example.
+</para>
+
+@func: the new error message handler.
+@Returns: the old error message handler.
+
+
+<!-- ##### MACRO g_return_if_fail ##### -->
+<para>
+Returns from the current function if the expression is not true.
+If the expression evaluates to %FALSE, a critical message is logged and
+the function returns. This can only be used in functions which do not return
+a value.
+</para>
+
+@expr: the expression to check.
+
+
+<!-- ##### MACRO g_return_val_if_fail ##### -->
+<para>
+Returns from the current function, returning the value @val, if the expression
+is not true.
+If the expression evaluates to %FALSE, a critical message is logged and
+@val is returned.
+</para>
+
+@expr: the expression to check.
+@val: the value to return from the current function if the expression is not
+true.
+
+
+<!-- ##### MACRO g_return_if_reached ##### -->
+<para>
+Logs a critical message and returns from the current function.
+This can only be used in functions which do not return a value.
+</para>
+
+
+
+<!-- ##### MACRO g_return_val_if_reached ##### -->
+<para>
+Logs a critical message and returns @val.
+</para>
+
+@val: the value to return from the current function.
+
+
+<!-- ##### MACRO g_assert ##### -->
+<para>
+Debugging macro to terminate the application if the assertion fails.
+If the assertion fails (i.e. the expression is not true), an error message
+is logged and the application is terminated.
+</para>
+<para>
+The macro can be turned off in final releases of code by defining
+#G_DISABLE_ASSERT when compiling the application.
+</para>
+
+@expr: the expression to check.
+
+
+<!-- ##### MACRO g_assert_not_reached ##### -->
+<para>
+Debugging macro to terminate the application if it is ever reached.
+If it is reached, an error message is logged and the application is terminated.
+</para>
+<para>
+The macro can be turned off in final releases of code by defining
+#G_DISABLE_ASSERT when compiling the application.
+</para>
+
+
+
+<!-- ##### FUNCTION g_on_error_query ##### -->
+<para>
+Prompts the user with <computeroutput>[E]xit, [H]alt, show [S]tack trace or [P]roceed</computeroutput>.
+This function is intended to be used for debugging use only. The following
+example shows how it can be used together with the g_log() functions.
+</para>
+<informalexample><programlisting>
+&num;include &lt;glib.h&gt;
+
+static void
+log_handler (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *message,
+ gpointer user_data)
+{
+ g_log_default_handler (log_domain, log_level, message, user_data);
+
+ g_on_error_query (MY_PROGRAM_NAME);
+}
+
+int main (int argc, char *argv[])
+{
+ g_log_set_handler (MY_LOG_DOMAIN,
+ G_LOG_LEVEL_WARNING |
+ G_LOG_LEVEL_ERROR |
+ G_LOG_LEVEL_CRITICAL,
+ log_handler,
+ NULL);
+
+ /* ... */
+</programlisting></informalexample>
+<para>
+If [E]xit is selected, the application terminates with a call to
+<function>_exit(0)</function>.
+</para>
+<para>
+If [H]alt is selected, the application enters an infinite loop.
+The infinite loop can only be stopped by killing the application,
+or by setting #glib_on_error_halt to %FALSE (possibly via a debugger).
+</para>
+<para>
+If [S]tack trace is selected, g_on_error_stack_trace() is called. This
+invokes <command>gdb</command>, which attaches to the current process and shows a stack trace.
+The prompt is then shown again.
+</para>
+<para>
+If [P]roceed is selected, the function returns.
+</para>
+<para>
+This function may cause different actions on non-UNIX platforms.
+</para>
+
+@prg_name: the program name, needed by <command>gdb</command> for the [S]tack trace option.
+If @prg_name is %NULL, g_get_prgname() is called to get the program name
+(which will work correctly if gdk_init() or gtk_init() has been called).
+
+
+<!-- ##### FUNCTION g_on_error_stack_trace ##### -->
+<para>
+Invokes <command>gdb</command>, which attaches to the current process and shows a stack trace.
+Called by g_on_error_query() when the [S]tack trace option is selected.
+</para>
+<para>
+This function may cause different actions on non-UNIX platforms.
+</para>
+
+@prg_name: the program name, needed by <command>gdb</command> for the [S]tack trace option.
+If @prg_name is %NULL, g_get_prgname() is called to get the program name
+(which will work correctly if gdk_init() or gtk_init() has been called).
+
+
+<!-- ##### MACRO G_BREAKPOINT ##### -->
+<para>
+Inserts a breakpoint instruction into the code (on x86 machines only).
+</para>
+
+
+
diff --git a/trunk/docs/reference/glib/tmpl/windows.sgml b/trunk/docs/reference/glib/tmpl/windows.sgml
new file mode 100644
index 000000000..34ea322e6
--- /dev/null
+++ b/trunk/docs/reference/glib/tmpl/windows.sgml
@@ -0,0 +1,128 @@
+<!-- ##### SECTION Title ##### -->
+Windows Compatibility Functions
+
+<!-- ##### SECTION Short_Description ##### -->
+UNIX emulation on Windows.
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+These functions provide some level of UNIX emulation on the Windows platform.
+If your application really needs the POSIX APIs, we suggest you try the Cygwin
+project.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO MAXPATHLEN ##### -->
+<para>
+Provided for UNIX emulation on Windows; equivalent to UNIX
+macro %MAXPATHLEN, which is the maximum length of a filename
+(including full path).
+</para>
+
+
+
+<!-- ##### FUNCTION g_win32_error_message ##### -->
+<para>
+
+</para>
+
+@error:
+@Returns:
+
+
+<!-- ##### FUNCTION g_win32_getlocale ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_win32_get_package_installation_directory ##### -->
+<para>
+
+</para>
+
+@package:
+@dll_name:
+@Returns:
+
+
+<!-- ##### FUNCTION g_win32_get_package_installation_subdirectory ##### -->
+<para>
+
+</para>
+
+@package:
+@dll_name:
+@subdir:
+@Returns:
+
+
+<!-- ##### FUNCTION g_win32_get_windows_version ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+
+<!-- ##### FUNCTION g_win32_locale_filename_from_utf8 ##### -->
+<para>
+
+</para>
+
+@utf8filename:
+@Returns:
+
+
+<!-- ##### MACRO G_WIN32_DLLMAIN_FOR_DLL_NAME ##### -->
+<para>
+On Windows, this macro defines a DllMain() function that stores the actual
+DLL name that the code being compiled will be included in.
+</para>
+<para>
+On non-Windows platforms, expands to nothing.
+</para>
+
+@static: empty or "static".
+@dll_name: the name of the (pointer to the) char array where the DLL name
+ will be stored. If this is used, you must also include
+ <filename>windows.h</filename>. If you need a more complex DLL entry
+ point function, you cannot use this.
+
+
+<!-- ##### MACRO G_WIN32_HAVE_WIDECHAR_API ##### -->
+<para>
+On Windows, this macro defines an expression which evaluates to %TRUE
+if the code is running on a version of Windows where the wide
+character versions of the Win32 API functions, and the wide chaacter
+versions of the C library functions work. (They are always present in
+the DLLs, but don't work on Windows 9x and Me.)
+</para>
+<para>
+On non-Windows platforms, it is not defined.
+</para>
+
+@Since: 2.6
+
+
+<!-- ##### MACRO G_WIN32_IS_NT_BASED ##### -->
+<para>
+On Windows, this macro defines an expression which evaluates to %TRUE
+if the code is running on an NT-based Windows operating system.
+</para>
+<para>
+On non-Windows platforms, it is not defined.
+</para>
+
+@Since: 2.6
+
+
diff --git a/trunk/docs/reference/glib/version.xml.in b/trunk/docs/reference/glib/version.xml.in
new file mode 100644
index 000000000..af9b9c467
--- /dev/null
+++ b/trunk/docs/reference/glib/version.xml.in
@@ -0,0 +1 @@
+@GLIB_VERSION@
diff --git a/trunk/docs/reference/gobject/Makefile.am b/trunk/docs/reference/gobject/Makefile.am
new file mode 100644
index 000000000..c1cc1f118
--- /dev/null
+++ b/trunk/docs/reference/gobject/Makefile.am
@@ -0,0 +1,80 @@
+## Process this file with automake to produce Makefile.in
+
+# The name of the module.
+DOC_MODULE=gobject
+
+# The top-level SGML file.
+DOC_MAIN_SGML_FILE=gobject-docs.sgml
+
+# Extra options to supply to gtkdoc-scan
+SCAN_OPTIONS=
+
+# The directory containing the source code. Relative to $(srcdir)
+DOC_SOURCE_DIR=../../../gobject
+
+HFILE_GLOB=$(top_srcdir)/gobject/*.h
+CFILE_GLOB=$(top_srcdir)/gobject/*.c
+
+# Headers to ignore
+IGNORE_HFILES=gobjectalias.h
+
+# CFLAGS and LDFLAGS for compiling scan program. Only needed
+# if $(DOC_MODULE).types is non-empty.
+INCLUDES = \
+ -I$(srcdir) \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/glib \
+ -I$(top_builddir) \
+ -I$(top_builddir)/glib \
+ $(GLIB_DEBUG_FLAGS)
+GTKDOC_LIBS = \
+ $(top_builddir)/glib/libglib-2.0.la \
+ $(top_builddir)/gobject/libgobject-2.0.la
+
+# Extra options to supply to gtkdoc-mkdb
+MKDB_OPTIONS=
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE)
+content_files = version.xml \
+ glib-mkenums.xml \
+ glib-genmarshal.xml \
+ gobject-query.xml \
+ tut_gobject.xml \
+ tut_gsignal.xml \
+ tut_gtype.xml \
+ tut_howto.xml \
+ tut_intro.xml \
+ tut_tools.xml
+
+# Images to copy into HTML directory
+HTML_IMAGES = \
+ $(srcdir)/images/glue.png
+
+# Extra options to supply to gtkdoc-fixref
+FIXXREF_OPTIONS=--extra-dir=$(srcdir)/../glib/html
+
+include $(top_srcdir)/gtk-doc.make
+
+# Other files to distribute
+EXTRA_DIST += \
+ gobject.cI \
+ version.xml.in
+
+########################################################################
+
+man_MANS = glib-mkenums.1 glib-genmarshal.1 gobject-query.1
+
+if ENABLE_MAN
+
+%.1 : %.xml
+ @XSLTPROC@ -nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $<
+
+endif
+
+BUILT_EXTRA_DIST = $(man_MANS)
+
+dist-hook-local: $(BUILT_EXTRA_DIST)
+ files='$(BUILT_EXTRA_DIST)'; \
+ for f in $$files; do \
+ if test -f $$f; then d=.; else d=$(srcdir); fi; \
+ cp $$d/$$f $(distdir) || exit 1; done
diff --git a/trunk/docs/reference/gobject/glib-genmarshal.1 b/trunk/docs/reference/gobject/glib-genmarshal.1
new file mode 100644
index 000000000..29860a52d
--- /dev/null
+++ b/trunk/docs/reference/gobject/glib-genmarshal.1
@@ -0,0 +1,201 @@
+.\" ** You probably do not want to edit this file directly **
+.\" It was generated using the DocBook XSL Stylesheets (version 1.69.1).
+.\" Instead of manually editing it, you probably should edit the DocBook XML
+.\" source for it and then use the DocBook XSL Stylesheets to regenerate it.
+.TH "GLIB\-GENMARSHAL" "1" "08/22/2005" "" ""
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+glib\-genmarshal \- C code marshaller generation utility for GLib closures
+.SH "SYNOPSIS"
+.HP 16
+\fBglib\-genmarshal\fR [options...] [files...]
+.SH "DESCRIPTION"
+.PP
+\fBglib\-genmarshal\fR
+is a small utility that generates C code marshallers for callback functions of the GClosure mechanism in the GObject sublibrary of GLib. The marshaller functions have a standard signature, they get passed in the invoking closure, an array of value structures holding the callback function parameters and a value structure for the return value of the callback. The marshaller is then responsible to call the respective C code function of the closure with all the parameters on the stack and to collect its return value.
+.SH "INVOCATION"
+.PP
+\fBglib\-genmarshal\fR
+takes a list of marshallers to generate as input. The marshaller list is either read from standard input or from files passed as additional arguments on the command line.
+.SS "Options"
+.TP
+\fB\-\-header\fR
+Generate header file contents of the marshallers.
+.TP
+\fB\-\-body\fR
+Generate C code file contents of the marshallers.
+.TP
+\fB\-\-prefix=string\fR, \fB\-\-prefix string\fR
+Specify marshaller prefix. The default prefix is
+`g_cclosure_marshal'.
+.TP
+\fB\-\-skip\-source\fR
+Skip source location remarks in generated comments.
+.TP
+\fB\-\-nostdinc\fR
+Do not use the standard marshallers of the GObject library, and skip
+\fIgmarshal.h\fR
+include directive in generated header files.
+.TP
+\fB\-\-g\-fatal\-warnings\fR
+Make warnings fatal, that is, exit immediately once a warning occurs.
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+Print brief help and exit.
+.TP
+\fB\-v\fR, \fB\-\-version\fR
+Print version and exit.
+.SS "Marshaller list format"
+.PP
+The marshaller lists are processed line by line, a line can contain a comment in the form of
+.sp
+.nf
+# this is a comment
+.fi
+.sp
+or a marshaller specification of the form
+.sp
+.nf
+\fIRTYPE\fR:\fIPTYPE\fR
+\fIRTYPE\fR:\fIPTYPE\fR,\fIPTYPE\fR
+\fIRTYPE\fR:\fIPTYPE\fR,\fIPTYPE\fR,\fIPTYPE\fR
+.fi
+.sp
+(up to 16
+\fIPTYPE\fRs may be present).
+.PP
+The
+\fIRTYPE\fR
+part specifies the callback's return type and the
+\fIPTYPE\fRs right to the colon specify the callback's parameter list, except for the first and the last arguments which are always pointers.
+.SS "Parameter types"
+.PP
+Currently, the following types are supported:
+.TP
+\fIVOID\fR
+indicates no return type, or no extra parameters. If
+\fIVOID\fR
+is used as the parameter list, no additional parameters may be present.
+.TP
+\fIBOOLEAN\fR
+for boolean types (gboolean)
+.TP
+\fICHAR\fR
+for signed char types (gchar)
+.TP
+\fIUCHAR\fR
+for unsigned char types (guchar)
+.TP
+\fIINT\fR
+for signed integer types (gint)
+.TP
+\fIUINT\fR
+for unsigned integer types (guint)
+.TP
+\fILONG\fR
+for signed long integer types (glong)
+.TP
+\fIULONG\fR
+for unsigned long integer types (gulong)
+.TP
+\fIINT64\fR
+for signed 64bit integer types (gint64)
+.TP
+\fIUINT64\fR
+for unsigned 64bit integer types (guint64)
+.TP
+\fIENUM\fR
+for enumeration types (gint)
+.TP
+\fIFLAGS\fR
+for flag enumeration types (guint)
+.TP
+\fIFLOAT\fR
+for single\-precision float types (gfloat)
+.TP
+\fIDOUBLE\fR
+for double\-precision float types (gdouble)
+.TP
+\fISTRING\fR
+for string types (gchar*)
+.TP
+\fIBOXED\fR
+for boxed (anonymous but reference counted) types (GBoxed*)
+.TP
+\fIPARAM\fR
+for GParamSpec or derived types (GParamSpec*)
+.TP
+\fIPOINTER\fR
+for anonymous pointer types (gpointer)
+.TP
+\fIOBJECT\fR
+for GObject or derived types (GObject*)
+.TP
+\fINONE\fR
+deprecated alias for
+\fIVOID\fR
+.TP
+\fIBOOL\fR
+deprecated alias for
+\fIBOOLEAN\fR
+.SH "EXAMPLE"
+.PP
+To generate marshallers for the following callback functions:
+.sp
+.nf
+void foo (gpointer data1,
+ gpointer data2);
+void bar (gpointer data1,
+ gint param1,
+ gpointer data2);
+gfloat baz (gpointer data1,
+ gboolean param1,
+ guchar param2,
+ gpointer data2);
+.fi
+.PP
+The marshaller list has to look like this:
+.sp
+.nf
+VOID:VOID
+VOID:INT
+FLOAT:BOOLEAN,UCHAR
+.fi
+.PP
+The generated marshallers have the arguments encoded in their function name. For this particular list, they are
+.sp
+.nf
+g_cclosure_marshal_VOID__VOID(),
+g_cclosure_marshal_VOID__INT(),
+g_cclosure_marshal_FLOAT__BOOLEAN_UCHAR().
+.fi
+.PP
+They can be used directly for GClosures or be passed in as the GSignalCMarshaller c_marshaller; argument upon creation of signals:
+.sp
+.nf
+GClosure *cc_foo, *cc_bar, *cc_baz;
+
+cc_foo = g_cclosure_new (NULL, foo, NULL);
+g_closure_set_marshal (cc_foo, g_cclosure_marshal_VOID__VOID);
+cc_bar = g_cclosure_new (NULL, bar, NULL);
+g_closure_set_marshal (cc_bar, g_cclosure_marshal_VOID__INT);
+cc_baz = g_cclosure_new (NULL, baz, NULL);
+g_closure_set_marshal (cc_baz, g_cclosure_marshal_FLOAT__BOOLEAN_UCHAR);
+.fi
+.SH "SEE ALSO"
+.PP
+\fBglib\-mkenums\fR(1)
+.SH "BUGS"
+.PP
+None known yet.
+.SH "AUTHOR"
+.PP
+\fBglib\-genmarshal\fR
+has been written by Tim Janik
+<timj@gtk.org>.
+.PP
+This manual page was provided by Tim Janik
+<timj@gtk.org>.
diff --git a/trunk/docs/reference/gobject/glib-genmarshal.xml b/trunk/docs/reference/gobject/glib-genmarshal.xml
new file mode 100644
index 000000000..3bce42b17
--- /dev/null
+++ b/trunk/docs/reference/gobject/glib-genmarshal.xml
@@ -0,0 +1,347 @@
+<refentry id="glib-genmarshal">
+
+<refmeta>
+<refentrytitle>glib-genmarshal</refentrytitle>
+<manvolnum>1</manvolnum>
+</refmeta>
+
+<refnamediv>
+<refname>glib-genmarshal</refname>
+<refpurpose>C code marshaller generation utility for GLib closures</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<cmdsynopsis>
+<command>glib-genmarshal</command>
+<arg choice="opt" rep="repeat">options</arg>
+<arg choice="opt" rep="repeat">files</arg>
+</cmdsynopsis>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+<para><command>glib-genmarshal</command> is a small utility that generates C code
+marshallers for callback functions of the GClosure mechanism in the GObject
+sublibrary of GLib. The marshaller functions have a standard signature,
+they get passed in the invoking closure, an array of value structures holding
+the callback function parameters and a value structure for the return value
+of the callback. The marshaller is then responsible to call the respective C
+code function of the closure with all the parameters on the stack and to
+collect its return value.
+</para>
+</refsect1>
+
+<refsect1><title>Invocation</title>
+<para><command>glib-genmarshal</command> takes a list of marshallers to generate as
+input. The marshaller list is either read from standard input or from files
+passed as additional arguments on the command line.
+</para>
+
+<refsect2><title>Options</title>
+<variablelist>
+
+<varlistentry>
+<term><option>--header</option></term>
+<listitem><para>
+Generate header file contents of the marshallers.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--body</option></term>
+<listitem><para>
+Generate C code file contents of the marshallers.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--prefix=string</option>, <option>--prefix string</option></term>
+<listitem><para>
+Specify marshaller prefix. The default prefix is <literal>`g_cclosure_marshal'</literal>.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--skip-source</option></term>
+<listitem><para>
+Skip source location remarks in generated comments.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--nostdinc</option></term>
+<listitem><para>
+Do not use the standard marshallers of the GObject library, and skip
+<filename>gmarshal.h</filename> include directive in generated header files.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--g-fatal-warnings</option></term>
+<listitem><para>
+Make warnings fatal, that is, exit immediately once a warning occurs.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>-h</option>, <option>--help</option></term>
+<listitem><para>
+Print brief help and exit.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>-v</option>, <option>--version</option></term>
+<listitem><para>
+Print version and exit.
+</para></listitem>
+</varlistentry>
+
+</variablelist>
+</refsect2>
+
+<refsect2><title>Marshaller list format</title>
+<para>
+The marshaller lists are processed line by line, a line can contain a
+comment in the form of
+<programlisting>
+# this is a comment
+</programlisting>
+or a marshaller specification of the form
+<programlisting>
+<replaceable>RTYPE</replaceable>:<replaceable>PTYPE</replaceable>
+<replaceable>RTYPE</replaceable>:<replaceable>PTYPE</replaceable>,<replaceable>PTYPE</replaceable>
+<replaceable>RTYPE</replaceable>:<replaceable>PTYPE</replaceable>,<replaceable>PTYPE</replaceable>,<replaceable>PTYPE</replaceable>
+</programlisting>
+(up to 16 <replaceable>PTYPE</replaceable>s may be present).
+</para>
+<para>
+The <replaceable>RTYPE</replaceable> part specifies the callback's return
+type and the <replaceable>PTYPE</replaceable>s right to the colon specify
+the callback's parameter list, except for the first and the last arguments
+which are always pointers.
+</para>
+</refsect2>
+<refsect2><title>Parameter types</title>
+<para>
+Currently, the following types are supported:
+<variablelist>
+<varlistentry>
+<term><replaceable>VOID</replaceable></term>
+<listitem><para>
+indicates no return type, or no extra parameters.
+If <replaceable>VOID</replaceable> is used as the parameter list, no
+additional parameters may be present.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>BOOLEAN</replaceable></term>
+<listitem><para>
+for boolean types (gboolean)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>CHAR</replaceable></term>
+<listitem><para>
+for signed char types (gchar)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>UCHAR</replaceable></term>
+<listitem><para>
+for unsigned char types (guchar)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>INT</replaceable></term>
+<listitem><para>
+for signed integer types (gint)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>UINT</replaceable></term>
+<listitem><para>
+for unsigned integer types (guint)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>LONG</replaceable></term>
+<listitem><para>
+for signed long integer types (glong)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>ULONG</replaceable></term>
+<listitem><para>
+for unsigned long integer types (gulong)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>INT64</replaceable></term>
+<listitem><para>
+for signed 64bit integer types (gint64)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>UINT64</replaceable></term>
+<listitem><para>
+for unsigned 64bit integer types (guint64)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>ENUM</replaceable></term>
+<listitem><para>
+for enumeration types (gint)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>FLAGS</replaceable></term>
+<listitem><para>
+for flag enumeration types (guint)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>FLOAT</replaceable></term>
+<listitem><para>
+for single-precision float types (gfloat)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>DOUBLE</replaceable></term>
+<listitem><para>
+for double-precision float types (gdouble)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>STRING</replaceable></term>
+<listitem><para>
+for string types (gchar*)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>BOXED</replaceable></term>
+<listitem><para>
+for boxed (anonymous but reference counted) types (GBoxed*)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>PARAM</replaceable></term>
+<listitem><para>
+for GParamSpec or derived types (GParamSpec*)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>POINTER</replaceable></term>
+<listitem><para>
+for anonymous pointer types (gpointer)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>OBJECT</replaceable></term>
+<listitem><para>
+for GObject or derived types (GObject*)
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>NONE</replaceable></term>
+<listitem><para>
+deprecated alias for <replaceable>VOID</replaceable>
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><replaceable>BOOL</replaceable></term>
+<listitem><para>
+deprecated alias for <replaceable>BOOLEAN</replaceable>
+</para></listitem>
+</varlistentry>
+</variablelist>
+</para>
+</refsect2>
+</refsect1>
+<refsect1><title>Example</title>
+<para>
+To generate marshallers for the following callback functions:
+</para>
+<programlisting>
+void foo (gpointer data1,
+ gpointer data2);
+void bar (gpointer data1,
+ gint param1,
+ gpointer data2);
+gfloat baz (gpointer data1,
+ gboolean param1,
+ guchar param2,
+ gpointer data2);
+</programlisting>
+<para>
+The marshaller list has to look like this:
+</para>
+<programlisting>
+VOID:VOID
+VOID:INT
+FLOAT:BOOLEAN,UCHAR
+</programlisting>
+<para>
+The generated marshallers have the arguments encoded in their function name.
+For this particular list, they are
+</para>
+<programlisting>
+g_cclosure_marshal_VOID__VOID(),
+g_cclosure_marshal_VOID__INT(),
+g_cclosure_marshal_FLOAT__BOOLEAN_UCHAR().
+</programlisting>
+<para>
+They can be used directly for GClosures or be passed in as the
+GSignalCMarshaller c_marshaller; argument upon creation of signals:
+</para>
+<programlisting>
+GClosure *cc_foo, *cc_bar, *cc_baz;
+
+cc_foo = g_cclosure_new (NULL, foo, NULL);
+g_closure_set_marshal (cc_foo, g_cclosure_marshal_VOID__VOID);
+cc_bar = g_cclosure_new (NULL, bar, NULL);
+g_closure_set_marshal (cc_bar, g_cclosure_marshal_VOID__INT);
+cc_baz = g_cclosure_new (NULL, baz, NULL);
+g_closure_set_marshal (cc_baz, g_cclosure_marshal_FLOAT__BOOLEAN_UCHAR);
+</programlisting>
+</refsect1>
+<refsect1><title>See also</title>
+<para>
+<command>glib-mkenums</command>(1)
+</para>
+</refsect1>
+<refsect1><title>Bugs</title>
+<para>
+None known yet.
+</para>
+</refsect1>
+<refsect1><title>Author</title>
+<para><command>glib-genmarshal</command> has been written by Tim Janik
+<email>timj@gtk.org</email>.
+</para>
+<para>
+This manual page was provided by Tim Janik <email>timj@gtk.org</email>.
+</para>
+</refsect1>
+</refentry>
+
+
diff --git a/trunk/docs/reference/gobject/glib-mkenums.1 b/trunk/docs/reference/gobject/glib-mkenums.1
new file mode 100644
index 000000000..c69d98d62
--- /dev/null
+++ b/trunk/docs/reference/gobject/glib-mkenums.1
@@ -0,0 +1,166 @@
+.\" ** You probably do not want to edit this file directly **
+.\" It was generated using the DocBook XSL Stylesheets (version 1.69.0).
+.\" Instead of manually editing it, you probably should edit the DocBook XML
+.\" source for it and then use the DocBook XSL Stylesheets to regenerate it.
+.TH "GLIB\-MKENUMS" "1" "08/15/2005" "" ""
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+glib\-mkenums \- C language enum description generation utility
+.SH "SYNOPSIS"
+.HP 13
+\fBglib\-mkenums\fR [options...] [files...]
+.SH "DESCRIPTION"
+.PP
+\fBglib\-mkenums\fR
+is a small perl\-script utility that parses C code to extract enum definitions and produces enum descriptions based on text templates specified by the user. Most frequently this script is used to produce C code that contains enum values as strings so programs can provide value name strings for introspection.
+.SH "INVOCATION"
+.PP
+\fBglib\-mkenums\fR
+takes a list of valid C code files as input. The options specified control the text that is output, certain substitutions are performed on the text templates for keywords enclosed in @ characters.
+.SS "Options"
+.TP
+\fB\-\-fhead\fR \fItext\fR
+Put out
+\fItext\fR
+prior to processing input files.
+.TP
+\fB\-\-fprod\fR \fItext\fR
+Put out
+\fItext\fR
+everytime a new input file is being processed.
+.TP
+\fB\-\-ftail\fR \fItext\fR
+Put out
+\fItext\fR
+after all input files have been processed.
+.TP
+\fB\-\-eprod\fR \fItext\fR
+Put out
+\fItext\fR
+everytime an enum is encountered in the input files.
+.TP
+\fB\-\-vhead\fR \fItext\fR
+Put out
+\fItext\fR
+before iterating over the set of values of an enum.
+.TP
+\fB\-\-vprod\fR \fItext\fR
+Put out
+\fItext\fR
+for every value of an enum.
+.TP
+\fB\-\-vtail\fR \fItext\fR
+Put out
+\fItext\fR
+after iterating over all values of an enum.
+.TP
+\fB\-\-comments\fR \fItext\fR
+Template for auto\-generated comments, the default (for C code generations) is
+"/* @comment@ */".
+.TP
+\fB\-\-template\fR \fIfile\fR
+Read templates from the given file. The templates are enclosed in specially\-formatted C comments
+
+.nf
+
+/*** BEGIN section ***/
+/*** END section ***/
+
+.fi
+
+where section may be
+file\-header,
+file\-production,
+file\-tail,
+enumeration\-production,
+value\-header,
+value\-production,
+value\-tail
+or
+comment.
+.TP
+\fB\-\-help\fR
+Print brief help and exit.
+.TP
+\fB\-\-version\fR
+Print version and exit.
+.SS "Production text substitutions"
+.PP
+Certain keywords enclosed in @ characters will be substituted in the emitted text. For the substitution examples of the keywords below, the following example enum definition is assumed:
+
+.nf
+
+typedef enum
+{
+ PREFIX_THE_XVALUE = 1 << 3,
+ PREFIX_ANOTHER_VALUE = 1 << 4
+} PrefixTheXEnum;
+
+.fi
+
+.TP
+@EnumName@
+The name of the enum currently being processed, enum names are assumed to be properly namespaced and to use mixed capitalization to separate words (e.g. PrefixTheXEnum).
+.TP
+@enum_name@
+The enum name with words lowercase and word\-separated by underscores (e.g. prefix_the_xenum).
+.TP
+@ENUMNAME@
+The enum name with words uppercase and word\-separated by underscores (e.g. PREFIX_THE_XENUM).
+.TP
+@ENUMSHORT@
+The enum name with words uppercase and word\-separated by underscores, prefix stripped (e.g. THE_XENUM).
+.TP
+@VALUENAME@
+The enum value name currently being processed with words uppercase and word\-separated by underscores, this is the assumed literal notation of enum values in the C sources (e.g. PREFIX_THE_XVALUE).
+.TP
+@valuenick@
+A nick name for the enum value currently being processed, this is usually generated by stripping common prefix words of all the enum values of the current enum, the words are lowercase and underscores are substituted by a minus (e.g. the\-xvalue).
+.TP
+@type@
+This is substituted either by "enum" or "flags", depending on whether the enum value definitions contained bit\-shift operators or not (e.g. flags).
+.TP
+@Type@
+The same as
+@type@
+with the first letter capitalized (e.g. Flags).
+.TP
+@TYPE@
+The same as
+@type@
+with all letters uppercased (e.g. FLAGS).
+.TP
+@filename@
+The name of the input file currently being processed (e.g. foo.h).
+
+.SS "Trigraph extensions"
+.PP
+Some C comments are treated specially in the parsed enum definitions, such comments start out with the trigraph sequence
+/*<
+and end with the trigraph sequence
+>*/. Per enum definition, the options "skip" and "flags" can be specified, to indicate this enum definition to be skipped, or for it to be treated as a flags definition, or to specify the common prefix to be stripped from all values to generate value nicknames, respectively. The "lowercase_name" option can be used to specify the word separation used in the *_get_type() function. For instance, /*< lowercase_name=gnome_vfs_uri_hide_options >*/.
+.PP
+Per value definition, the options "skip" and "nick" are supported. The former causes the value to be skipped, and the latter can be used to specify the otherwise auto\-generated nickname. Examples:
+
+.nf
+
+typedef enum /*< skip >*/
+{
+ PREFIX_FOO
+} PrefixThisEnumWillBeSkipped;
+typedef enum /*< flags,prefix=PREFIX >*/
+{
+ PREFIX_THE_ZEROTH_VALUE, /*< skip >*/
+ PREFIX_THE_FIRST_VALUE,
+ PREFIX_THE_SECOND_VALUE,
+ PREFIX_THE_THIRD_VALUE, /*< nick=the\-last\-value >*/
+} PrefixTheFlagsEnum;
+
+.fi
+
+.SH "SEE ALSO"
+.PP
+\fBglib\-genmarshal\fR(1)
diff --git a/trunk/docs/reference/gobject/glib-mkenums.xml b/trunk/docs/reference/gobject/glib-mkenums.xml
new file mode 100644
index 000000000..40bf59c0a
--- /dev/null
+++ b/trunk/docs/reference/gobject/glib-mkenums.xml
@@ -0,0 +1,272 @@
+<refentry id="glib-mkenums">
+
+<refmeta>
+<refentrytitle>glib-mkenums</refentrytitle>
+<manvolnum>1</manvolnum>
+</refmeta>
+
+<refnamediv>
+<refname>glib-mkenums</refname>
+<refpurpose>C language enum description generation utility</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<cmdsynopsis>
+<command>glib-mkenums</command>
+<arg choice="opt" rep="repeat">options</arg>
+<arg choice="opt" rep="repeat">files</arg>
+</cmdsynopsis>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+<para><command>glib-mkenums</command> is a small perl-script utility that parses C
+code to extract enum definitions and produces enum descriptions based on text
+templates specified by the user. Most frequently this script is used to
+produce C code that contains enum values as strings so programs can provide
+value name strings for introspection.
+</para>
+</refsect1>
+
+<refsect1><title>Invocation</title>
+<para><command>glib-mkenums</command> takes a list of valid C code files as
+input. The options specified control the text that is output, certain
+substitutions are performed on the text templates for keywords enclosed
+in @ characters.
+</para>
+
+<refsect2><title>Options</title>
+<variablelist>
+
+<varlistentry>
+<term><option>--fhead</option> <replaceable>text</replaceable></term>
+<listitem><para>
+Put out <replaceable>text</replaceable> prior to processing input files.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--fprod</option> <replaceable>text</replaceable></term>
+<listitem><para>
+Put out <replaceable>text</replaceable> everytime a new input file
+is being processed.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--ftail</option> <replaceable>text</replaceable></term>
+<listitem><para>
+Put out <replaceable>text</replaceable> after all input files have been
+processed.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--eprod</option> <replaceable>text</replaceable></term>
+<listitem><para>
+Put out <replaceable>text</replaceable> everytime an enum is encountered
+in the input files.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--vhead</option> <replaceable>text</replaceable></term>
+<listitem><para>
+Put out <replaceable>text</replaceable> before iterating over the set of
+values of an enum.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--vprod</option> <replaceable>text</replaceable></term>
+<listitem><para>
+Put out <replaceable>text</replaceable> for every value of an enum.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--vtail</option> <replaceable>text</replaceable></term>
+<listitem><para>
+Put out <replaceable>text</replaceable> after iterating over all values
+of an enum.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--comments</option> <replaceable>text</replaceable></term>
+<listitem><para>
+Template for auto-generated comments, the default (for C code generations) is
+<literal>"/* @comment@ */"</literal>.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--template</option> <replaceable>file</replaceable></term>
+<listitem><para>
+Read templates from the given file. The templates are enclosed in
+specially-formatted C comments
+<programlisting>
+/*** BEGIN section ***/
+/*** END section ***/
+</programlisting>
+where section may be <literal>file-header</literal>,
+<literal>file-production</literal>, <literal>file-tail</literal>,
+<literal>enumeration-production</literal>, <literal>value-header</literal>,
+<literal>value-production</literal>, <literal>value-tail</literal> or
+<literal>comment</literal>.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--help</option></term>
+<listitem><para>
+Print brief help and exit.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--version</option></term>
+<listitem><para>
+Print version and exit.
+</para></listitem>
+</varlistentry>
+
+</variablelist>
+</refsect2>
+
+<refsect2><title>Production text substitutions</title>
+<para>
+Certain keywords enclosed in @ characters will be substituted in the
+emitted text. For the substitution examples of the keywords below,
+the following example enum definition is assumed:
+<programlisting>
+typedef enum
+{
+ PREFIX_THE_XVALUE = 1 &lt;&lt; 3,
+ PREFIX_ANOTHER_VALUE = 1 &lt;&lt; 4
+} PrefixTheXEnum;
+</programlisting>
+<variablelist>
+<varlistentry>
+<term>@EnumName@</term>
+<listitem><para>
+The name of the enum currently being processed, enum names are assumed to be
+properly namespaced and to use mixed capitalization to separate
+words (e.g. PrefixTheXEnum).
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>@enum_name@</term>
+<listitem><para>
+The enum name with words lowercase and word-separated by underscores
+(e.g. prefix_the_xenum).
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>@ENUMNAME@</term>
+<listitem><para>
+The enum name with words uppercase and word-separated by underscores
+(e.g. PREFIX_THE_XENUM).
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>@ENUMSHORT@</term>
+<listitem><para>
+The enum name with words uppercase and word-separated by underscores,
+prefix stripped (e.g. THE_XENUM).
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>@VALUENAME@</term>
+<listitem><para>
+The enum value name currently being processed with words uppercase and
+word-separated by underscores,
+this is the assumed literal notation of enum values in the C sources
+(e.g. PREFIX_THE_XVALUE).
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>@valuenick@</term>
+<listitem><para>
+A nick name for the enum value currently being processed, this is usually
+generated by stripping common prefix words of all the enum values of the
+current enum, the words are lowercase and underscores are substituted by a
+minus (e.g. the-xvalue).
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>@type@</term>
+<listitem><para>
+This is substituted either by "enum" or "flags", depending on whether the
+enum value definitions contained bit-shift operators or not (e.g. flags).
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>@Type@</term>
+<listitem><para>
+The same as <literal>@type@</literal> with the first letter capitalized (e.g. Flags).
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>@TYPE@</term>
+<listitem><para>
+The same as <literal>@type@</literal> with all letters uppercased (e.g. FLAGS).
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>@filename@</term>
+<listitem><para>
+The name of the input file currently being processed (e.g. foo.h).
+</para></listitem>
+</varlistentry>
+</variablelist>
+</para>
+</refsect2>
+<refsect2><title>Trigraph extensions</title>
+<para>
+Some C comments are treated specially in the parsed enum definitions,
+such comments start out with the trigraph sequence <literal>/*&lt;</literal>
+and end with the trigraph sequence <literal>&gt;*/</literal>.
+Per enum definition, the options "skip" and "flags" can be specified, to
+indicate this enum definition to be skipped, or for it to be treated as
+a flags definition, or to specify the common prefix to be stripped from
+all values to generate value nicknames, respectively. The "lowercase_name"
+option can be used to specify the word separation used in the *_get_type()
+function. For instance, /*&lt; lowercase_name=gnome_vfs_uri_hide_options &gt;*/.
+</para>
+<para>
+Per value definition, the options "skip" and "nick" are supported.
+The former causes the value to be skipped, and the latter can be used to
+specify the otherwise auto-generated nickname.
+Examples:
+<programlisting>
+typedef enum /*&lt; skip &gt;*/
+{
+ PREFIX_FOO
+} PrefixThisEnumWillBeSkipped;
+typedef enum /*&lt; flags,prefix=PREFIX &gt;*/
+{
+ PREFIX_THE_ZEROTH_VALUE, /*&lt; skip &gt;*/
+ PREFIX_THE_FIRST_VALUE,
+ PREFIX_THE_SECOND_VALUE,
+ PREFIX_THE_THIRD_VALUE, /*&lt; nick=the-last-value &gt;*/
+} PrefixTheFlagsEnum;
+</programlisting>
+</para>
+</refsect2>
+</refsect1>
+<refsect1><title>See also</title>
+<para><command>glib-genmarshal</command>(1)
+</para>
+</refsect1>
+</refentry>
+
+
diff --git a/trunk/docs/reference/gobject/gobject-docs.sgml b/trunk/docs/reference/gobject/gobject-docs.sgml
new file mode 100644
index 000000000..5b01ea090
--- /dev/null
+++ b/trunk/docs/reference/gobject/gobject-docs.sgml
@@ -0,0 +1,152 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
+<!ENTITY gobject-GType SYSTEM "xml/gtype.xml">
+<!ENTITY gobject-GTypePlugin SYSTEM "xml/gtypeplugin.xml">
+<!ENTITY gobject-GTypeModule SYSTEM "xml/gtypemodule.xml">
+<!ENTITY gobject-The-Base-Object-Type SYSTEM "xml/objects.xml">
+<!ENTITY gobject-Enumeration-and-Flag-Types SYSTEM "xml/enumerations_flags.xml">
+<!ENTITY gobject-Boxed-Types SYSTEM "xml/gboxed.xml">
+<!ENTITY gobject-Generic-values SYSTEM "xml/generic_values.xml">
+<!ENTITY gobject-param-value-types SYSTEM "xml/param_value_types.xml">
+<!ENTITY gobject-GParamSpec SYSTEM "xml/gparamspec.xml">
+<!ENTITY gobject-Varargs-Value-Collection SYSTEM "xml/value_collection.xml">
+<!ENTITY gobject-Signals SYSTEM "xml/signals.xml">
+<!ENTITY gobject-Closures SYSTEM "xml/gclosure.xml">
+<!ENTITY gobject-Value-Arrays SYSTEM "xml/value_arrays.xml">
+<!ENTITY glib-mkenums SYSTEM "glib-mkenums.xml">
+<!ENTITY glib-genmarshal SYSTEM "glib-genmarshal.xml">
+<!ENTITY gobject-query SYSTEM "gobject-query.xml">
+<!ENTITY version SYSTEM "version.xml">
+
+<!ENTITY tutorial-Intro SYSTEM "tut_intro.xml">
+<!ENTITY tutorial-GType SYSTEM "tut_gtype.xml">
+<!ENTITY tutorial-GObject SYSTEM "tut_gobject.xml">
+<!ENTITY tutorial-GSignal SYSTEM "tut_gsignal.xml">
+<!ENTITY tutorial-HowTo SYSTEM "tut_howto.xml">
+<!ENTITY tutorial-Tools SYSTEM "tut_tools.xml">
+
+]>
+<book id="index">
+ <bookinfo>
+ <title>GObject Reference Manual</title>
+ <releaseinfo>for GLib &version;</releaseinfo>
+ </bookinfo>
+
+ <preface>
+ <title>Introduction</title>
+ <para>
+ Most modern programming languages come with their own native object
+ systems and additional fundamental algorithmic language constructs.
+ Just as GLib serves as an implementation of such fundamental
+ types and algorithms (linked lists, hash tables and so forth), the
+ GLib Object System provides the required implementations of a
+ flexible extensible and intentionally easy to map (into other
+ languages) object oriented framework for C.
+ The substantial elements that are provided can be summarized as:
+ <itemizedlist>
+ <listitem><para>
+ A generic type system to register arbitrary single-inherited
+ flat and deep derived types as well as interfaces for
+ structured types.
+ It takes care of creation, initialization and memory management
+ of the assorted object and class structures, maintains
+ parent/child relationships and deals with dynamic implementations
+ of such types. That is, their type specific implementations are
+ relocatable/unloadable during runtime.
+ </para></listitem>
+ <listitem><para>
+ A collection of fundamental type implementations, such as integers,
+ doubles, enums and structured types, to name a few.
+ </para></listitem>
+ <listitem><para>
+ A sample fundamental type implementation to base object hierarchies
+ upon - the GObject fundamental type.
+ </para></listitem>
+ <listitem><para>
+ A signal system that allows very flexible user customization of
+ virtual/overridable object methods and can serve as a powerful
+ notification mechanism.
+ </para></listitem>
+ <listitem><para>
+ An extensible parameter/value system, supporting all the provided
+ fundamental types that can be used to generically handle object
+ properties or otherwise parameterized types.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+ </preface>
+
+ <part label="I">
+ <title>Concepts</title>
+
+ &tutorial-Intro;
+ &tutorial-GType;
+ &tutorial-GObject;
+ &tutorial-GSignal;
+ </part>
+ <reference label="II">
+ <title>API Reference</title>
+
+ &gobject-GType;
+ &gobject-GTypePlugin;
+ &gobject-GTypeModule;
+ &gobject-The-Base-Object-Type;
+ &gobject-Enumeration-and-Flag-Types;
+ &gobject-Boxed-Types;
+ &gobject-Generic-values;
+ &gobject-param-value-types;
+ &gobject-Varargs-Value-Collection;
+ &gobject-GParamSpec;
+ &gobject-Signals;
+ &gobject-Closures;
+ &gobject-Value-Arrays;
+
+ </reference>
+ <reference label="III">
+ <title>Tools Reference</title>
+
+ &glib-mkenums;
+ &glib-genmarshal;
+ &gobject-query;
+ </reference>
+ <part label="IV">
+ <title>Tutorial</title>
+
+ &tutorial-HowTo;
+ </part>
+ <part label="V">
+ <title>Related Tools</title>
+
+ &tutorial-Tools;
+ </part>
+
+ <index>
+ <title>Index</title>
+ </index>
+ <index role="deprecated">
+ <title>Index of deprecated symbols</title>
+ </index>
+ <index role="2.2">
+ <title>Index of new symbols in 2.2</title>
+ </index>
+ <index role="2.4">
+ <title>Index of new symbols in 2.4</title>
+ </index>
+ <index role="2.6">
+ <title>Index of new symbols in 2.6</title>
+ </index>
+ <index role="2.8">
+ <title>Index of new symbols in 2.8</title>
+ </index>
+ <index role="2.10">
+ <title>Index of new symbols in 2.10</title>
+ </index>
+ <index role="2.12">
+ <title>Index of new symbols in 2.12</title>
+ </index>
+ <index role="2.14">
+ <title>Index of new symbols in 2.14</title>
+ </index>
+
+</book>
diff --git a/trunk/docs/reference/gobject/gobject-overrides.txt b/trunk/docs/reference/gobject/gobject-overrides.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/trunk/docs/reference/gobject/gobject-overrides.txt
diff --git a/trunk/docs/reference/gobject/gobject-query.1 b/trunk/docs/reference/gobject/gobject-query.1
new file mode 100644
index 000000000..9c8ca1f2a
--- /dev/null
+++ b/trunk/docs/reference/gobject/gobject-query.1
@@ -0,0 +1,80 @@
+.\"Generated by db2man.xsl. Don't modify this, modify the source.
+.de Sh \" Subsection
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Ip \" List item
+.br
+.ie \\n(.$>=3 .ne \\$3
+.el .ne 3
+.IP "\\$1" \\$2
+..
+.TH "GOBJECT-QUERY" 1 "" "" ""
+.SH NAME
+gobject-query \- display a tree of types
+.SH "SYNOPSIS"
+
+.nf
+\fBgobject-query\fR froots [options...]
+.fi
+
+.nf
+\fBgobject-query\fR tree [options...]
+.fi
+
+.SH "DESCRIPTION"
+
+.PP
+ \fBgobject-query\fR is a small utility that draws a tree of types\&.
+
+.SH "INVOCATION"
+
+.PP
+ \fBgobject-query\fR takes a mandatory argument that specifies whether it should iterate over the fundamental types or print a type tree\&.
+
+.SS "Options"
+
+.TP
+\fBfroots\fR
+iterate over fundamental roots
+
+.TP
+\fBtree\fR
+print type tree
+
+.TP
+\fB-r\fR \fItype\fR
+specify the root type
+
+.TP
+\fB-n\fR
+don't descend type tree
+
+.TP
+\fB-b\fR \fIstring\fR
+specify indent string
+
+.TP
+\fB-i\fR \fIstring\fR
+specify incremental indent string
+
+.TP
+\fB-s\fR \fInumber\fR
+specify line spacing
+
+.TP
+\fB-h\fR, \fB--help\fR
+Print brief help and exit\&.
+
+.TP
+\fB-v\fR, \fB--version\fR
+Print version and exit\&.
+
diff --git a/trunk/docs/reference/gobject/gobject-query.xml b/trunk/docs/reference/gobject/gobject-query.xml
new file mode 100644
index 000000000..af6fccccc
--- /dev/null
+++ b/trunk/docs/reference/gobject/gobject-query.xml
@@ -0,0 +1,111 @@
+<refentry id="gobject-query">
+
+<refmeta>
+<refentrytitle>gobject-query</refentrytitle>
+<manvolnum>1</manvolnum>
+</refmeta>
+
+<refnamediv>
+<refname>gobject-query</refname>
+<refpurpose>display a tree of types</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<cmdsynopsis>
+<command>gobject-query</command>
+<arg choice="plain">froots</arg>
+<arg choice="opt" rep="repeat">options</arg>
+</cmdsynopsis>
+<cmdsynopsis>
+<command>gobject-query</command>
+<arg choice="plain">tree</arg>
+<arg choice="opt" rep="repeat">options</arg>
+</cmdsynopsis>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+<para>
+<command>gobject-query</command> is a small utility that draws a tree of
+types.
+</para>
+</refsect1>
+
+<refsect1><title>Invocation</title>
+<para>
+<command>gobject-query</command> takes a mandatory argument that specifies
+whether it should iterate over the fundamental types or print a type tree.
+</para>
+
+<refsect2><title>Options</title>
+<variablelist>
+
+<varlistentry>
+<term><option>froots</option></term>
+<listitem><para>
+iterate over fundamental roots
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>tree</option></term>
+<listitem><para>
+print type tree
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>-r</option> <replaceable>type</replaceable></term>
+<listitem><para>
+specify the root type
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>-n</option></term>
+<listitem><para>
+don't descend type tree
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>-b</option> <replaceable>string</replaceable></term>
+<listitem><para>
+specify indent string
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>-i</option> <replaceable>string</replaceable></term>
+<listitem><para>
+specify incremental indent string
+</para></listitem>
+</varlistentry>
+
+
+<varlistentry>
+<term><option>-s</option> <replaceable>number</replaceable></term>
+<listitem><para>
+specify line spacing
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>-h</option>, <option>--help</option></term>
+<listitem><para>
+Print brief help and exit.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>-v</option>, <option>--version</option></term>
+<listitem><para>
+Print version and exit.
+</para></listitem>
+</varlistentry>
+
+</variablelist>
+</refsect2>
+</refsect1>
+</refentry>
+
+
diff --git a/trunk/docs/reference/gobject/gobject-sections.txt b/trunk/docs/reference/gobject/gobject-sections.txt
new file mode 100644
index 000000000..271405953
--- /dev/null
+++ b/trunk/docs/reference/gobject/gobject-sections.txt
@@ -0,0 +1,837 @@
+<INCLUDE>glib-object.h</INCLUDE>
+
+<SECTION>
+<FILE>gtype</FILE>
+<TITLE>Type Information</TITLE>
+GType
+G_TYPE_FUNDAMENTAL
+G_TYPE_FUNDAMENTAL_MAX
+G_TYPE_MAKE_FUNDAMENTAL
+G_TYPE_IS_ABSTRACT
+G_TYPE_IS_DERIVED
+G_TYPE_IS_FUNDAMENTAL
+G_TYPE_IS_VALUE_TYPE
+G_TYPE_HAS_VALUE_TABLE
+G_TYPE_IS_CLASSED
+G_TYPE_IS_INSTANTIATABLE
+G_TYPE_IS_DERIVABLE
+G_TYPE_IS_DEEP_DERIVABLE
+G_TYPE_IS_INTERFACE
+GTypeInterface
+GTypeInstance
+GTypeClass
+GTypeInfo
+GTypeFundamentalInfo
+GInterfaceInfo
+GTypeValueTable
+G_TYPE_FROM_INSTANCE
+G_TYPE_FROM_CLASS
+G_TYPE_FROM_INTERFACE
+G_TYPE_INSTANCE_GET_CLASS
+G_TYPE_INSTANCE_GET_INTERFACE
+G_TYPE_INSTANCE_GET_PRIVATE
+G_TYPE_CHECK_INSTANCE
+G_TYPE_CHECK_INSTANCE_CAST
+G_TYPE_CHECK_INSTANCE_TYPE
+G_TYPE_CHECK_CLASS_CAST
+G_TYPE_CHECK_CLASS_TYPE
+G_TYPE_CHECK_VALUE
+G_TYPE_CHECK_VALUE_TYPE
+G_TYPE_FLAG_RESERVED_ID_BIT
+g_type_init
+GTypeDebugFlags
+g_type_init_with_debug_flags
+g_type_name
+g_type_qname
+g_type_from_name
+g_type_parent
+g_type_depth
+g_type_next_base
+g_type_is_a
+g_type_class_ref
+g_type_class_peek
+g_type_class_peek_static
+g_type_class_unref
+g_type_class_peek_parent
+g_type_class_add_private
+g_type_interface_peek
+g_type_interface_peek_parent
+g_type_default_interface_ref
+g_type_default_interface_peek
+g_type_default_interface_unref
+g_type_children
+g_type_interfaces
+g_type_interface_prerequisites
+g_type_set_qdata
+g_type_get_qdata
+g_type_query
+GTypeQuery
+GBaseInitFunc
+GBaseFinalizeFunc
+GClassInitFunc
+GClassFinalizeFunc
+GInstanceInitFunc
+GInterfaceInitFunc
+GInterfaceFinalizeFunc
+GTypeClassCacheFunc
+GTypeFlags
+GTypeFundamentalFlags
+g_type_register_static
+g_type_register_static_simple
+g_type_register_dynamic
+g_type_register_fundamental
+g_type_add_interface_static
+g_type_add_interface_dynamic
+g_type_interface_add_prerequisite
+g_type_get_plugin
+g_type_interface_get_plugin
+g_type_fundamental_next
+g_type_fundamental
+g_type_create_instance
+g_type_free_instance
+g_type_add_class_cache_func
+g_type_remove_class_cache_func
+g_type_class_unref_uncached
+g_type_add_interface_check
+g_type_remove_interface_check
+GTypeInterfaceCheckFunc
+g_type_value_table_peek
+
+G_DEFINE_TYPE
+G_DEFINE_TYPE_WITH_CODE
+G_DEFINE_ABSTRACT_TYPE
+G_DEFINE_ABSTRACT_TYPE_WITH_CODE
+G_IMPLEMENT_INTERFACE
+G_DEFINE_TYPE_EXTENDED
+
+<SUBSECTION Private>
+G_TYPE_FUNDAMENTAL_SHIFT
+g_type_check_instance
+g_type_check_instance_cast
+g_type_check_instance_is_a
+g_type_check_class_cast
+g_type_check_class_is_a
+g_type_check_is_value_type
+g_type_check_value
+g_type_check_value_holds
+g_type_instance_get_private
+g_type_test_flags
+g_type_name_from_instance
+g_type_name_from_class
+
+<SUBSECTION>
+G_TYPE_INVALID
+G_TYPE_NONE
+G_TYPE_INTERFACE
+G_TYPE_CHAR
+G_TYPE_UCHAR
+G_TYPE_BOOLEAN
+G_TYPE_INT
+G_TYPE_UINT
+G_TYPE_LONG
+G_TYPE_ULONG
+G_TYPE_INT64
+G_TYPE_UINT64
+G_TYPE_ENUM
+G_TYPE_FLAGS
+G_TYPE_FLOAT
+G_TYPE_DOUBLE
+G_TYPE_STRING
+G_TYPE_POINTER
+G_TYPE_BOXED
+G_TYPE_PARAM
+G_TYPE_OBJECT
+G_TYPE_GTYPE
+
+<SUBSECTION>
+G_TYPE_RESERVED_GLIB_FIRST
+G_TYPE_RESERVED_GLIB_LAST
+G_TYPE_RESERVED_BSE_FIRST
+G_TYPE_RESERVED_BSE_LAST
+G_TYPE_RESERVED_USER_FIRST
+
+<SUBSECTION Private>
+GOBJECT_VAR
+g_value_c_init
+g_value_types_init
+g_enum_types_init
+g_param_type_init
+g_boxed_type_init
+g_object_type_init
+g_param_spec_types_init
+g_value_transforms_init
+g_signal_init
+g_gtype_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gtypeplugin</FILE>
+<TITLE>GTypePlugin</TITLE>
+GTypePlugin
+GTypePluginClass
+GTypePluginUse
+GTypePluginUnuse
+GTypePluginCompleteTypeInfo
+GTypePluginCompleteInterfaceInfo
+g_type_plugin_use
+g_type_plugin_unuse
+g_type_plugin_complete_type_info
+g_type_plugin_complete_interface_info
+<SUBSECTION Standard>
+G_TYPE_PLUGIN
+G_IS_TYPE_PLUGIN
+G_TYPE_TYPE_PLUGIN
+g_type_plugin_get_type
+G_TYPE_PLUGIN_CLASS
+G_IS_TYPE_PLUGIN_CLASS
+G_TYPE_PLUGIN_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>gtypemodule</FILE>
+<TITLE>GTypeModule</TITLE>
+GTypeModule
+GTypeModuleClass
+g_type_module_use
+g_type_module_unuse
+g_type_module_set_name
+g_type_module_register_type
+g_type_module_add_interface
+g_type_module_register_enum
+g_type_module_register_flags
+
+G_DEFINE_DYNAMIC_TYPE
+G_DEFINE_DYNAMIC_TYPE_EXTENDED
+
+<SUBSECTION Standard>
+G_TYPE_MODULE
+G_IS_TYPE_MODULE
+G_TYPE_TYPE_MODULE
+g_type_module_get_type
+G_TYPE_MODULE_CLASS
+G_IS_TYPE_MODULE_CLASS
+G_TYPE_MODULE_GET_CLASS
+</SECTION>
+
+<SECTION>
+<TITLE>The Base Object Type</TITLE>
+<FILE>objects</FILE>
+GObject
+GObjectClass
+GObjectConstructParam
+GObjectGetPropertyFunc
+GObjectSetPropertyFunc
+GObjectFinalizeFunc
+G_TYPE_IS_OBJECT
+G_OBJECT
+G_IS_OBJECT
+G_OBJECT_CLASS
+G_IS_OBJECT_CLASS
+G_OBJECT_GET_CLASS
+G_OBJECT_TYPE
+G_OBJECT_TYPE_NAME
+G_OBJECT_CLASS_TYPE
+G_OBJECT_CLASS_NAME
+g_object_class_install_property
+g_object_class_find_property
+g_object_class_list_properties
+g_object_class_override_property
+g_object_interface_install_property
+g_object_interface_find_property
+g_object_interface_list_properties
+g_object_new
+g_object_newv
+GParameter
+g_object_ref
+g_object_unref
+g_object_ref_sink
+GInitiallyUnowned
+GInitiallyUnownedClass
+G_TYPE_INITIALLY_UNOWNED
+g_object_is_floating
+g_object_force_floating
+GWeakNotify
+g_object_weak_ref
+g_object_weak_unref
+g_object_add_weak_pointer
+g_object_remove_weak_pointer
+GToggleNotify
+g_object_add_toggle_ref
+g_object_remove_toggle_ref
+g_object_connect
+g_object_disconnect
+g_object_set
+g_object_get
+g_object_notify
+g_object_freeze_notify
+g_object_thaw_notify
+g_object_get_data
+g_object_set_data
+g_object_set_data_full
+g_object_steal_data
+g_object_get_qdata
+g_object_set_qdata
+g_object_set_qdata_full
+g_object_steal_qdata
+g_object_set_property
+g_object_get_property
+g_object_new_valist
+g_object_set_valist
+g_object_get_valist
+g_object_watch_closure
+g_object_run_dispose
+G_OBJECT_WARN_INVALID_PROPERTY_ID
+
+<SUBSECTION Standard>
+G_INITIALLY_UNOWNED
+G_INITIALLY_UNOWNED_CLASS
+G_INITIALLY_UNOWNED_GET_CLASS
+G_IS_INITIALLY_UNOWNED
+G_IS_INITIALLY_UNOWNED_CLASS
+
+<SUBSECTION Private>
+G_OBJECT_WARN_INVALID_PSPEC
+g_initially_unowned_get_type
+g_object_compat_control
+</SECTION>
+
+<SECTION>
+<TITLE>Enumeration and Flag Types</TITLE>
+<FILE>enumerations_flags</FILE>
+GEnumClass
+GFlagsClass
+G_ENUM_CLASS_TYPE
+G_ENUM_CLASS_TYPE_NAME
+G_TYPE_IS_ENUM
+G_ENUM_CLASS
+G_IS_ENUM_CLASS
+G_TYPE_IS_FLAGS
+G_FLAGS_CLASS
+G_IS_FLAGS_CLASS
+G_FLAGS_CLASS_TYPE
+G_FLAGS_CLASS_TYPE_NAME
+GEnumValue
+GFlagsValue
+g_enum_get_value
+g_enum_get_value_by_name
+g_enum_get_value_by_nick
+g_flags_get_first_value
+g_flags_get_value_by_name
+g_flags_get_value_by_nick
+g_enum_register_static
+g_flags_register_static
+g_enum_complete_type_info
+g_flags_complete_type_info
+</SECTION>
+
+<SECTION>
+<FILE>gboxed</FILE>
+<TITLE>Boxed Types</TITLE>
+GBoxedCopyFunc
+GBoxedFreeFunc
+g_boxed_copy
+g_boxed_free
+g_boxed_type_register_static
+g_pointer_type_register_static
+
+<SUBSECTION>
+G_TYPE_HASH_TABLE
+G_TYPE_DATE
+G_TYPE_GSTRING
+G_TYPE_STRV
+GStrv
+
+<SUBSECTION Standard>
+G_TYPE_IS_BOXED
+
+<SUBSECTION Private>
+g_gstring_get_type
+g_strv_get_type
+g_date_get_type
+g_hash_table_get_type
+</SECTION>
+
+<SECTION>
+<TITLE>Generic values</TITLE>
+<FILE>generic_values</FILE>
+G_VALUE_HOLDS
+G_VALUE_TYPE
+G_VALUE_TYPE_NAME
+G_TYPE_IS_VALUE
+G_TYPE_IS_VALUE_ABSTRACT
+G_IS_VALUE
+GValue
+G_TYPE_VALUE
+G_TYPE_VALUE_ARRAY
+g_value_init
+g_value_copy
+g_value_reset
+g_value_unset
+g_value_set_instance
+g_value_fits_pointer
+g_value_peek_pointer
+g_value_type_compatible
+g_value_type_transformable
+g_value_transform
+GValueTransform
+g_value_register_transform_func
+g_strdup_value_contents
+
+<SUBSECTION Private>
+G_VALUE_NOCOPY_CONTENTS
+g_value_get_type
+g_value_array_get_type
+</SECTION>
+
+<SECTION>
+<TITLE>Value arrays</TITLE>
+<FILE>value_arrays</FILE>
+GValueArray
+g_value_array_get_nth
+g_value_array_new
+g_value_array_copy
+g_value_array_free
+g_value_array_append
+g_value_array_prepend
+g_value_array_insert
+g_value_array_remove
+g_value_array_sort
+g_value_array_sort_with_data
+</SECTION>
+
+<SECTION>
+<TITLE>GParamSpec</TITLE>
+<FILE>gparamspec</FILE>
+G_TYPE_IS_PARAM
+G_PARAM_SPEC
+G_IS_PARAM_SPEC
+G_PARAM_SPEC_CLASS
+G_IS_PARAM_SPEC_CLASS
+G_PARAM_SPEC_GET_CLASS
+G_PARAM_SPEC_TYPE
+G_PARAM_SPEC_TYPE_NAME
+G_PARAM_SPEC_VALUE_TYPE
+GParamSpec
+GParamSpecClass
+GParamFlags
+G_PARAM_READWRITE
+G_PARAM_STATIC_STRINGS
+G_PARAM_MASK
+G_PARAM_USER_SHIFT
+g_param_spec_ref
+g_param_spec_unref
+g_param_spec_sink
+g_param_spec_ref_sink
+g_param_value_set_default
+g_param_value_defaults
+g_param_value_validate
+g_param_value_convert
+g_param_values_cmp
+g_param_spec_get_name
+g_param_spec_get_nick
+g_param_spec_get_blurb
+g_param_spec_get_qdata
+g_param_spec_set_qdata
+g_param_spec_set_qdata_full
+g_param_spec_steal_qdata
+g_param_spec_get_redirect_target
+g_param_spec_internal
+GParamSpecTypeInfo
+g_param_type_register_static
+GParamSpecPool
+g_param_spec_pool_new
+g_param_spec_pool_insert
+g_param_spec_pool_remove
+g_param_spec_pool_lookup
+g_param_spec_pool_list
+g_param_spec_pool_list_owned
+</SECTION>
+
+<SECTION>
+<TITLE>Standard Parameter and Value Types</TITLE>
+<FILE>param_value_types</FILE>
+
+<SUBSECTION gboolean>
+G_IS_PARAM_SPEC_BOOLEAN
+G_PARAM_SPEC_BOOLEAN
+G_VALUE_HOLDS_BOOLEAN
+G_TYPE_PARAM_BOOLEAN
+GParamSpecBoolean
+g_param_spec_boolean
+g_value_set_boolean
+g_value_get_boolean
+
+<SUBSECTION gchar>
+G_IS_PARAM_SPEC_CHAR
+G_PARAM_SPEC_CHAR
+G_VALUE_HOLDS_CHAR
+G_TYPE_PARAM_CHAR
+GParamSpecChar
+g_param_spec_char
+g_value_set_char
+g_value_get_char
+
+<SUBSECTION guchar>
+G_IS_PARAM_SPEC_UCHAR
+G_PARAM_SPEC_UCHAR
+G_VALUE_HOLDS_UCHAR
+G_TYPE_PARAM_UCHAR
+GParamSpecUChar
+g_param_spec_uchar
+g_value_set_uchar
+g_value_get_uchar
+
+<SUBSECTION gint>
+G_IS_PARAM_SPEC_INT
+G_PARAM_SPEC_INT
+G_VALUE_HOLDS_INT
+G_TYPE_PARAM_INT
+GParamSpecInt
+g_param_spec_int
+g_value_set_int
+g_value_get_int
+
+<SUBSECTION guint>
+G_IS_PARAM_SPEC_UINT
+G_PARAM_SPEC_UINT
+G_VALUE_HOLDS_UINT
+G_TYPE_PARAM_UINT
+GParamSpecUInt
+g_param_spec_uint
+g_value_set_uint
+g_value_get_uint
+
+<SUBSECTION glong>
+G_IS_PARAM_SPEC_LONG
+G_PARAM_SPEC_LONG
+G_VALUE_HOLDS_LONG
+G_TYPE_PARAM_LONG
+GParamSpecLong
+g_param_spec_long
+g_value_set_long
+g_value_get_long
+
+<SUBSECTION gulong>
+G_IS_PARAM_SPEC_ULONG
+G_PARAM_SPEC_ULONG
+G_VALUE_HOLDS_ULONG
+G_TYPE_PARAM_ULONG
+GParamSpecULong
+g_param_spec_ulong
+g_value_set_ulong
+g_value_get_ulong
+
+<SUBSECTION gint64>
+G_IS_PARAM_SPEC_INT64
+G_PARAM_SPEC_INT64
+G_VALUE_HOLDS_INT64
+G_TYPE_PARAM_INT64
+GParamSpecInt64
+g_param_spec_int64
+g_value_set_int64
+g_value_get_int64
+
+<SUBSECTION guint64>
+G_IS_PARAM_SPEC_UINT64
+G_PARAM_SPEC_UINT64
+G_VALUE_HOLDS_UINT64
+G_TYPE_PARAM_UINT64
+GParamSpecUInt64
+g_param_spec_uint64
+g_value_set_uint64
+g_value_get_uint64
+
+<SUBSECTION gfloat>
+G_IS_PARAM_SPEC_FLOAT
+G_PARAM_SPEC_FLOAT
+G_VALUE_HOLDS_FLOAT
+G_TYPE_PARAM_FLOAT
+GParamSpecFloat
+g_param_spec_float
+g_value_set_float
+g_value_get_float
+
+<SUBSECTION gdouble>
+G_IS_PARAM_SPEC_DOUBLE
+G_PARAM_SPEC_DOUBLE
+G_VALUE_HOLDS_DOUBLE
+G_TYPE_PARAM_DOUBLE
+GParamSpecDouble
+g_param_spec_double
+g_value_set_double
+g_value_get_double
+
+<SUBSECTION GEnum>
+G_IS_PARAM_SPEC_ENUM
+G_PARAM_SPEC_ENUM
+G_VALUE_HOLDS_ENUM
+G_TYPE_PARAM_ENUM
+GParamSpecEnum
+g_param_spec_enum
+g_value_set_enum
+g_value_get_enum
+
+<SUBSECTION GFLags>
+G_IS_PARAM_SPEC_FLAGS
+G_PARAM_SPEC_FLAGS
+G_VALUE_HOLDS_FLAGS
+G_TYPE_PARAM_FLAGS
+GParamSpecFlags
+g_param_spec_flags
+g_value_set_flags
+g_value_get_flags
+
+<SUBSECTION gchararray>
+G_IS_PARAM_SPEC_STRING
+G_PARAM_SPEC_STRING
+G_VALUE_HOLDS_STRING
+G_TYPE_PARAM_STRING
+GParamSpecString
+gchararray
+g_param_spec_string
+g_value_set_string
+g_value_set_static_string
+g_value_take_string
+g_value_set_string_take_ownership
+g_value_get_string
+g_value_dup_string
+
+<SUBSECTION GParamSpec>
+G_IS_PARAM_SPEC_PARAM
+G_PARAM_SPEC_PARAM
+G_VALUE_HOLDS_PARAM
+G_TYPE_PARAM_PARAM
+GParamSpecParam
+g_param_spec_param
+g_value_set_param
+g_value_take_param
+g_value_set_param_take_ownership
+g_value_get_param
+g_value_dup_param
+
+<SUBSECTION GBoxed>
+G_IS_PARAM_SPEC_BOXED
+G_PARAM_SPEC_BOXED
+G_VALUE_HOLDS_BOXED
+G_TYPE_PARAM_BOXED
+GParamSpecBoxed
+g_param_spec_boxed
+g_value_set_boxed
+g_value_set_static_boxed
+g_value_take_boxed
+g_value_set_boxed_take_ownership
+g_value_get_boxed
+g_value_dup_boxed
+
+<SUBSECTION gpointer>
+G_IS_PARAM_SPEC_POINTER
+G_PARAM_SPEC_POINTER
+G_VALUE_HOLDS_POINTER
+G_TYPE_PARAM_POINTER
+GParamSpecPointer
+g_param_spec_pointer
+g_value_set_pointer
+g_value_get_pointer
+
+<SUBSECTION GObject>
+G_IS_PARAM_SPEC_OBJECT
+G_PARAM_SPEC_OBJECT
+G_VALUE_HOLDS_OBJECT
+G_TYPE_PARAM_OBJECT
+GParamSpecObject
+g_param_spec_object
+g_value_set_object
+g_value_take_object
+g_value_set_object_take_ownership
+g_value_get_object
+g_value_dup_object
+
+<SUBSECTION gunichar>
+G_IS_PARAM_SPEC_UNICHAR
+G_PARAM_SPEC_UNICHAR
+G_TYPE_PARAM_UNICHAR
+GParamSpecUnichar
+g_param_spec_unichar
+
+<SUBSECTION GValueArray>
+G_IS_PARAM_SPEC_VALUE_ARRAY
+G_PARAM_SPEC_VALUE_ARRAY
+G_TYPE_PARAM_VALUE_ARRAY
+GParamSpecValueArray
+g_param_spec_value_array
+
+<SUBSECTION Override>
+G_IS_PARAM_SPEC_OVERRIDE
+G_PARAM_SPEC_OVERRIDE
+G_TYPE_PARAM_OVERRIDE
+GParamSpecOverride
+g_param_spec_override
+
+<SUBSECTION GType>
+G_IS_PARAM_SPEC_GTYPE
+G_PARAM_SPEC_GTYPE
+G_VALUE_HOLDS_GTYPE
+G_TYPE_PARAM_GTYPE
+GParamSpecGType
+g_param_spec_gtype
+g_value_get_gtype
+g_value_set_gtype
+
+<SUBSECTION Private>
+g_value_set_instance
+g_param_spec_types
+</SECTION>
+
+<SECTION>
+<TITLE>Varargs Value Collection</TITLE>
+<FILE>value_collection</FILE>
+<INCLUDE>glib-object.h,gobject/gvaluecollector.h</INCLUDE>
+GTypeCValue
+G_VALUE_COLLECT
+G_VALUE_LCOPY
+G_VALUE_COLLECT_FORMAT_MAX_LENGTH
+</SECTION>
+
+<SECTION>
+<TITLE>Signals</TITLE>
+<FILE>signals</FILE>
+GSignalInvocationHint
+GSignalAccumulator
+GSignalCMarshaller
+GSignalEmissionHook
+GSignalFlags
+GSignalMatchType
+GSignalQuery
+G_SIGNAL_TYPE_STATIC_SCOPE
+G_SIGNAL_MATCH_MASK
+G_SIGNAL_FLAGS_MASK
+g_signal_new
+g_signal_newv
+g_signal_new_valist
+g_signal_query
+g_signal_lookup
+g_signal_name
+g_signal_list_ids
+g_signal_emit
+g_signal_emit_by_name
+g_signal_emitv
+g_signal_emit_valist
+g_signal_connect
+g_signal_connect_after
+g_signal_connect_swapped
+g_signal_connect_object
+GConnectFlags
+g_signal_connect_data
+g_signal_connect_closure
+g_signal_connect_closure_by_id
+g_signal_handler_block
+g_signal_handler_unblock
+g_signal_handler_disconnect
+g_signal_handler_find
+g_signal_handlers_block_matched
+g_signal_handlers_unblock_matched
+g_signal_handlers_disconnect_matched
+g_signal_handler_is_connected
+g_signal_handlers_block_by_func
+g_signal_handlers_unblock_by_func
+g_signal_handlers_disconnect_by_func
+g_signal_has_handler_pending
+g_signal_stop_emission
+g_signal_stop_emission_by_name
+g_signal_override_class_closure
+g_signal_chain_from_overridden
+g_signal_add_emission_hook
+g_signal_remove_emission_hook
+g_signal_parse_name
+g_signal_get_invocation_hint
+g_signal_type_cclosure_new
+g_signal_accumulator_true_handled
+<SUBSECTION Private>
+g_signal_handlers_destroy
+</SECTION>
+
+<SECTION>
+<FILE>gclosure</FILE>
+<TITLE>Closures</TITLE>
+G_CLOSURE_NEEDS_MARSHAL
+G_CLOSURE_N_NOTIFIERS
+G_CCLOSURE_SWAP_DATA
+G_CALLBACK
+GCallback
+GClosure
+G_TYPE_CLOSURE
+GCClosure
+GClosureMarshal
+GClosureNotify
+g_cclosure_new
+g_cclosure_new_swap
+g_cclosure_new_object
+g_cclosure_new_object_swap
+g_closure_new_object
+g_closure_ref
+g_closure_sink
+g_closure_unref
+g_closure_invoke
+g_closure_invalidate
+g_closure_add_finalize_notifier
+g_closure_add_invalidate_notifier
+g_closure_remove_finalize_notifier
+g_closure_remove_invalidate_notifier
+g_closure_new_simple
+g_closure_set_marshal
+g_closure_add_marshal_guards
+g_closure_set_meta_marshal
+g_source_set_closure
+G_TYPE_IO_CHANNEL
+G_TYPE_IO_CONDITION
+
+<SUBSECTION>
+g_cclosure_marshal_VOID__VOID
+g_cclosure_marshal_VOID__BOOLEAN
+g_cclosure_marshal_VOID__CHAR
+g_cclosure_marshal_VOID__UCHAR
+g_cclosure_marshal_VOID__INT
+g_cclosure_marshal_VOID__UINT
+g_cclosure_marshal_VOID__LONG
+g_cclosure_marshal_VOID__ULONG
+g_cclosure_marshal_VOID__ENUM
+g_cclosure_marshal_VOID__FLAGS
+g_cclosure_marshal_VOID__FLOAT
+g_cclosure_marshal_VOID__DOUBLE
+g_cclosure_marshal_VOID__STRING
+g_cclosure_marshal_VOID__PARAM
+g_cclosure_marshal_VOID__BOXED
+g_cclosure_marshal_VOID__POINTER
+g_cclosure_marshal_VOID__OBJECT
+g_cclosure_marshal_STRING__OBJECT_POINTER
+g_cclosure_marshal_VOID__UINT_POINTER
+g_cclosure_marshal_BOOLEAN__FLAGS
+g_cclosure_marshal_BOOL__FLAGS
+
+<SUBSECTION Private>
+GClosureNotifyData
+g_closure_get_type
+g_cclosure_marshal_VOID__VOID
+g_cclosure_marshal_VOID__BOOLEAN
+g_cclosure_marshal_VOID__CHAR
+g_cclosure_marshal_VOID__UCHAR
+g_cclosure_marshal_VOID__INT
+g_cclosure_marshal_VOID__UINT
+g_cclosure_marshal_VOID__LONG
+g_cclosure_marshal_VOID__ULONG
+g_cclosure_marshal_VOID__ENUM
+g_cclosure_marshal_VOID__FLAGS
+g_cclosure_marshal_VOID__FLOAT
+g_cclosure_marshal_VOID__DOUBLE
+g_cclosure_marshal_VOID__STRING
+g_cclosure_marshal_VOID__PARAM
+g_cclosure_marshal_VOID__BOXED
+g_cclosure_marshal_VOID__POINTER
+g_cclosure_marshal_VOID__OBJECT
+g_cclosure_marshal_STRING__OBJECT_POINTER
+g_cclosure_marshal_VOID__UINT_POINTER
+g_cclosure_marshal_BOOLEAN__FLAGS
+g_cclosure_marshal_BOOL__FLAGS
+g_io_channel_get_type
+g_io_condition_get_type
+</SECTION>
diff --git a/trunk/docs/reference/gobject/gobject.cI b/trunk/docs/reference/gobject/gobject.cI
new file mode 100644
index 000000000..2976940e3
--- /dev/null
+++ b/trunk/docs/reference/gobject/gobject.cI
@@ -0,0 +1,11 @@
+/*
+ * This is a hack to work around a limitation of gtkdoc-scan: it insists
+ * on putting () behind every symbol listed in gobject.types. Thus we
+ * can't put G_TYPE_OBJECT there, but have to sneak a g_object_get_type()
+ * function in the generated source via an #include.
+ */
+GType
+g_object_get_type (void)
+{
+ return G_TYPE_OBJECT;
+}
diff --git a/trunk/docs/reference/gobject/gobject.types b/trunk/docs/reference/gobject/gobject.types
new file mode 100644
index 000000000..b8d745f46
--- /dev/null
+++ b/trunk/docs/reference/gobject/gobject.types
@@ -0,0 +1,6 @@
+#include <glib/glib-object.h>
+#include "gobject.cI"
+
+g_object_get_type
+g_type_module_get_type
+g_type_plugin_get_type
diff --git a/trunk/docs/reference/gobject/images/glue.png b/trunk/docs/reference/gobject/images/glue.png
new file mode 100644
index 000000000..f5f3aab2f
--- /dev/null
+++ b/trunk/docs/reference/gobject/images/glue.png
Binary files differ
diff --git a/trunk/docs/reference/gobject/tmpl/enumerations_flags.sgml b/trunk/docs/reference/gobject/tmpl/enumerations_flags.sgml
new file mode 100644
index 000000000..1293d2fd8
--- /dev/null
+++ b/trunk/docs/reference/gobject/tmpl/enumerations_flags.sgml
@@ -0,0 +1,311 @@
+<!-- ##### SECTION Title ##### -->
+Enums and Flags
+
+<!-- ##### SECTION Short_Description ##### -->
+Enumeration and flags types
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The GLib type system provides fundamental types for enumeration and flags types. (Flags types
+are like enumerations, but allow their values to be combined by bitwise or). A registered
+enumeration or flags type associates a name and a nickname with each allowed value, and
+the methods g_enum_get_value_by_name(), g_enum_get_value_by_nick(), g_flags_get_value_by_name()
+and g_flags_get_value_by_nick() can look up values by their name or nickname.
+When an enumeration or flags type is registered with the GLib type system, it can
+be used as value type for object properties, using g_param_spec_enum() or
+g_param_spec_flags().
+</para>
+<para>
+GObject ships with a utility called <link linkend="glib-mkenums">glib-mkenums</link> that can
+construct suitable type registration functions from C enumeration definitions.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+#GParamSpecEnum, #GParamSpecFlags, g_param_spec_enum(), g_param_spec_flags(),
+<link linkend="glib-mkenums">glib-mkenums</link>
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GEnumClass ##### -->
+<para>
+The class of an enumeration type holds information about its
+possible values.
+</para>
+
+@g_type_class: the parent class
+@minimum: the smallest possible value.
+@maximum: the largest possible value.
+@n_values: the number of possible values.
+@values: an array of #GEnumValue structs describing the
+individual values.
+
+<!-- ##### STRUCT GFlagsClass ##### -->
+<para>
+The class of a flags type holds information about its
+possible values.
+</para>
+
+@g_type_class: the parent class
+@mask: a mask covering all possible values.
+@n_values: the number of possible values.
+@values: an array of #GFlagsValue structs describing the
+individual values.
+
+<!-- ##### MACRO G_ENUM_CLASS_TYPE ##### -->
+<para>
+Returns the type identifier from a given #GEnumClass structure.
+</para>
+
+@class: a #GEnumClass
+
+
+<!-- ##### MACRO G_ENUM_CLASS_TYPE_NAME ##### -->
+<para>
+Returns the static type name from a given #GEnumClass structure.
+</para>
+
+@class: a #GEnumClass
+
+
+<!-- ##### MACRO G_TYPE_IS_ENUM ##### -->
+<para>
+Returns whether @type "is a" %G_TYPE_ENUM.
+</para>
+
+@type: a #GType ID.
+
+
+<!-- ##### MACRO G_ENUM_CLASS ##### -->
+<para>
+Casts a derived #GEnumClass structure into a #GEnumClass structure.
+</para>
+
+@class: a valid #GEnumClass
+
+
+<!-- ##### MACRO G_IS_ENUM_CLASS ##### -->
+<para>
+Checks whether @class "is a" valid #GEnumClass structure of type %G_TYPE_ENUM
+or derived.
+</para>
+
+@class: a #GEnumClass
+
+
+<!-- ##### MACRO G_TYPE_IS_FLAGS ##### -->
+<para>
+Returns whether @type "is a" %G_TYPE_FLAGS.
+</para>
+
+@type: a #GType ID.
+
+
+<!-- ##### MACRO G_FLAGS_CLASS ##### -->
+<para>
+Casts a derived #GFlagsClass structure into a #GFlagsClass structure.
+</para>
+
+@class: a valid #GFlagsClass
+
+
+<!-- ##### MACRO G_IS_FLAGS_CLASS ##### -->
+<para>
+Checks whether @class "is a" valid #GFlagsClass structure of type %G_TYPE_FLAGS
+or derived.
+</para>
+
+@class: a #GFlagsClass
+
+
+<!-- ##### MACRO G_FLAGS_CLASS_TYPE ##### -->
+<para>
+Returns the type identifier from a given #GFlagsClass structure.
+</para>
+
+@class: a #GFlagsClass
+
+
+<!-- ##### MACRO G_FLAGS_CLASS_TYPE_NAME ##### -->
+<para>
+Returns the static type name from a given #GFlagsClass structure.
+</para>
+
+@class: a #GFlagsClass
+
+
+<!-- ##### STRUCT GEnumValue ##### -->
+<para>
+A structure which contains a single enum value, it's name, and it's
+nickname.
+</para>
+
+@value: the enum value
+@value_name: the name of the value
+@value_nick: the nickname of the value
+
+<!-- ##### STRUCT GFlagsValue ##### -->
+<para>
+A structure which contains a single flags value, it's name, and it's
+nickname.
+</para>
+
+@value: the flags value
+@value_name: the name of the value
+@value_nick: the nickname of the value
+
+<!-- ##### FUNCTION g_enum_get_value ##### -->
+<para>
+Returns the #GEnumValue for a value.
+</para>
+
+@enum_class: a #GEnumClass
+@value: the value to look up
+@Returns: the #GEnumValue for @value, or %NULL if @value is not
+a member of the enumeration
+
+
+<!-- ##### FUNCTION g_enum_get_value_by_name ##### -->
+<para>
+Looks up a #GEnumValue by name.
+</para>
+
+@enum_class: a #GEnumClass
+@name: the name to look up
+@Returns: the #GEnumValue with name @name, or %NULL if the enumeration doesn'
+t have a member with that name
+
+
+<!-- ##### FUNCTION g_enum_get_value_by_nick ##### -->
+<para>
+Looks up a #GEnumValue by nickname.
+</para>
+
+@enum_class: a #GEnumClass
+@nick: the nickname to look up
+@Returns: the #GEnumValue with nickname @nick, or %NULL if the enumeration doesn'
+t have a member with that nickname
+
+
+<!-- ##### FUNCTION g_flags_get_first_value ##### -->
+<para>
+Returns the first #GFlagsValue which is set in @value.
+</para>
+
+@flags_class: a #GFlagsClass
+@value: the value
+@Returns: the first #GFlagsValue which is set in @value, or %NULL if none is set
+
+
+<!-- ##### FUNCTION g_flags_get_value_by_name ##### -->
+<para>
+Looks up a #GFlagsValue by name.
+</para>
+
+@flags_class: a #GFlagsClass
+@name: the name to look up
+@Returns: the #GFlagsValue with name @name, or %NULL if there is no flag with
+that name
+
+
+<!-- ##### FUNCTION g_flags_get_value_by_nick ##### -->
+<para>
+Looks up a #GFlagsValue by nickname.
+</para>
+
+@flags_class: a #GFlagsClass
+@nick: the nickname to look up
+@Returns: the #GFlagsValue with nickname @nick, or %NULL if there is no flag
+with that nickname
+
+
+<!-- ##### FUNCTION g_enum_register_static ##### -->
+<para>
+Registers a new static enumeration type with the name @name.
+</para>
+<para>
+It is normally more convenient to let <link linkend="glib-mkenums">glib-mkenums</link>
+generate a my_enum_get_type() function from a usual C enumeration definition
+than to write one yourself using g_enum_register_static().
+</para>
+
+@name: A nul-terminated string used as the name of the new type.
+@_static_values:
+@Returns: The new type identifier.
+<!-- # Unused Parameters # -->
+@const_static_values: An array of #GEnumValue structs for the possible
+ enumeration values. The array is terminated by a struct with all
+ members being 0. GObject keeps a reference to the data, so it cannot
+ be stack-allocated.
+
+
+<!-- ##### FUNCTION g_flags_register_static ##### -->
+<para>
+Registers a new static flags type with the name @name.
+</para>
+<para>
+It is normally more convenient to let <link linkend="glib-mkenums">glib-mkenums</link>
+generate a my_flags_get_type() function from a usual C enumeration definition
+than to write one yourself using g_flags_register_static().
+</para>
+
+@name: A nul-terminated string used as the name of the new type.
+@_static_values:
+@Returns: The new type identifier.
+<!-- # Unused Parameters # -->
+@const_static_values: An array of #GFlagsValue structs for the possible
+ flags values. The array is terminated by a struct with all members being 0.
+ GObject keeps a reference to the data, so it cannot be stack-allocated.
+
+
+<!-- ##### FUNCTION g_enum_complete_type_info ##### -->
+<para>
+This function is meant to be called from the complete_type_info() function
+of a #GTypePlugin implementation, as in the following example:
+<informalexample>
+<programlisting>
+static void
+my_enum_complete_type_info (GTypePlugin *plugin,
+ GType g_type,
+ GTypeInfo *info,
+ GTypeValueTable *value_table)
+{
+ static const GEnumValue values[] = {
+ { MY_ENUM_FOO, "MY_ENUM_FOO", "foo" },
+ { MY_ENUM_BAR, "MY_ENUM_BAR", "bar" },
+ { 0, NULL, NULL }
+ };
+
+ g_enum_complete_type_info (type, info, values);
+}
+</programlisting>
+</informalexample>
+</para>
+
+@g_enum_type: the type identifier of the type being completed
+@info: the #GTypeInfo struct to be filled in
+@_values:
+<!-- # Unused Parameters # -->
+@const_values: An array of #GEnumValue structs for the possible
+ enumeration values. The array is terminated by a struct with all
+ members being 0.
+
+
+<!-- ##### FUNCTION g_flags_complete_type_info ##### -->
+<para>
+This function is meant to be called from the complete_type_info() function
+of a #GTypePlugin implementation, see the example for
+g_enumeration_complete_type_info() above.
+</para>
+
+@g_flags_type: the type identifier of the type being completed
+@info: the #GTypeInfo struct to be filled in
+@_values:
+<!-- # Unused Parameters # -->
+@const_values: An array of #GFlagsValue structs for the possible
+ enumeration values. The array is terminated by a struct with all
+ members being 0.
+
+
diff --git a/trunk/docs/reference/gobject/tmpl/gboxed.sgml b/trunk/docs/reference/gobject/tmpl/gboxed.sgml
new file mode 100644
index 000000000..1a7702222
--- /dev/null
+++ b/trunk/docs/reference/gobject/tmpl/gboxed.sgml
@@ -0,0 +1,147 @@
+<!-- ##### SECTION Title ##### -->
+GBoxed
+
+<!-- ##### SECTION Short_Description ##### -->
+A mechanism to wrap opaque C structures registered by the type system
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+GBoxed is a generic wrapper mechanism for arbitrary C structures. The only
+thing the type system needs to know about the structures is how to copy and
+free them, beyond that they are treated as opaque chunks of memory.
+</para>
+<para>
+Boxed types are useful for simple value-holder structures like rectangles or
+points. They can also be used for wrapping structures defined in non-GObject
+based libraries.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+#GParamSpecBoxed, g_param_spec_boxed()
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### USER_FUNCTION GBoxedCopyFunc ##### -->
+<para>
+This function is provided by the user and should produce a copy of the passed
+in boxed structure.
+</para>
+
+@boxed: The boxed structure to be copied.
+@Returns: The newly created copy of the boxed structure.
+
+
+<!-- ##### USER_FUNCTION GBoxedFreeFunc ##### -->
+<para>
+This function is provided by the user and should free the boxed
+structure passed.
+</para>
+
+@boxed: The boxed structure to be freed.
+
+
+<!-- ##### FUNCTION g_boxed_copy ##### -->
+<para>
+Provide a copy of a boxed structure @src_boxed which is of type @boxed_type.
+</para>
+
+@boxed_type: The type of @src_boxed.
+@src_boxed: The boxed structure to be copied.
+@Returns: The newly created copy of the boxed structure.
+
+
+<!-- ##### FUNCTION g_boxed_free ##### -->
+<para>
+Free the boxed structure @boxed which is of type @boxed_type.
+</para>
+
+@boxed_type: The type of @boxed.
+@boxed: The boxed structure to be freed.
+
+
+<!-- ##### FUNCTION g_boxed_type_register_static ##### -->
+<para>
+This function creates a new %G_TYPE_BOXED derived type id for a new
+boxed type with name @name. Boxed type handling functions have to be
+provided to copy and free opaque boxed structures of this type.
+</para>
+
+@name: Name of the new boxed type.
+@boxed_copy: Boxed structure copy function.
+@boxed_free: Boxed structure free function.
+@Returns: New %G_TYPE_BOXED derived type id for @name.
+
+
+<!-- ##### FUNCTION g_pointer_type_register_static ##### -->
+<para>
+Creates a new %G_TYPE_POINTER derived type id for a new
+pointer type with name @name.
+</para>
+
+@name: the name of the new pointer type.
+@Returns: a new %G_TYPE_POINTER derived type id for @name.
+
+
+<!-- ##### MACRO G_TYPE_HASH_TABLE ##### -->
+<para>
+The #GType for a boxed type holding a #GHashTable reference.
+</para>
+
+@Since: 2.10
+
+
+<!-- ##### MACRO G_TYPE_DATE ##### -->
+<para>
+The #GType for #GDate.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_GSTRING ##### -->
+<para>
+The #GType for #GString.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_STRV ##### -->
+<para>
+The #GType for a boxed type holding a %NULL-terminated array of strings.
+</para>
+<para>
+The code fragments in the following example show the use of a property of
+type #G_TYPE_STRV with g_object_class_install_property(), g_object_set()
+and g_object_get().
+</para>
+<informalexample><programlisting>
+g_object_class_install_property (object_class,
+ PROP_AUTHORS,
+ g_param_spec_boxed ("authors",
+ _("Authors"),
+ _("List of authors"),
+ G_TYPE_STRV,
+ G_PARAM_READWRITE));
+
+
+gchar *authors[] = { "Owen", "Tim", NULL };
+g_object_set (obj, "authors", authors, NULL);
+
+
+gchar *writers[];
+g_object_get (obj, "authors", &amp;writers, NULL);
+/* do something with writers */
+g_strfreev (writers);
+</programlisting></informalexample>
+
+@Since: 2.4
+
+
+<!-- ##### TYPEDEF GStrv ##### -->
+<para>
+A C representable type name for #G_TYPE_STRV.
+</para>
+
+
diff --git a/trunk/docs/reference/gobject/tmpl/gclosure.sgml b/trunk/docs/reference/gobject/tmpl/gclosure.sgml
new file mode 100644
index 000000000..3c9d80ada
--- /dev/null
+++ b/trunk/docs/reference/gobject/tmpl/gclosure.sgml
@@ -0,0 +1,820 @@
+<!-- ##### SECTION Title ##### -->
+Closures
+
+<!-- ##### SECTION Short_Description ##### -->
+Functions as first-class objects
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+A #GClosure represents a callback supplied by the programmer. It will generally
+comprise a function of some kind and a marshaller used to call it. It is the
+reponsibility of the marshaller to convert the arguments for the invocation
+from #GValue<!-- -->s into a suitable form, perform the callback on the
+converted arguments, and transform the return value back into a #GValue.
+</para>
+<para>
+In the case of C programs, a closure usually just holds a pointer to a function
+and maybe a data argument, and the marshaller converts between #GValue<!-- -->
+and native C types. The GObject library provides the #GCClosure type for this
+purpose. Bindings for other languages need marshallers which
+convert between #GValue<!-- -->s and suitable representations in the runtime
+of the language in order to use functions written in that languages as
+callbacks.
+</para>
+<para>
+Within GObject, closures play an important role in the implementation of
+signals. When a signal is registered, the @c_marshaller argument to
+g_signal_new() specifies the default C marshaller for any closure which is
+connected to this signal. GObject provides a number of C marshallers
+for this purpose, see the g_cclosure_marshal_*() functions. Additional
+C marshallers can be generated with the <link linkend="glib-genmarshal"
+>glib-genmarshal</link> utility.
+Closures can be explicitly connected to signals with
+g_signal_connect_closure(), but it usually more convenient to let GObject
+create a closure automatically by using one of the g_signal_connect_*()
+functions which take a callback function/user data pair.
+</para>
+<para>
+Using closures has a number of important advantages over a simple
+callback function/data pointer combination:
+<itemizedlist>
+<listitem><para>
+Closures allow the callee to get the types of the callback parameters,
+which means that language bindings don't have to write individual glue
+for each callback type.
+</para></listitem>
+<listitem><para>
+The reference counting of #GClosure makes it easy to handle reentrancy
+right; if a callback is removed while it is being invoked, the closure
+and it's parameters won't be freed until the invocation finishes.
+</para></listitem>
+<listitem><para>
+g_closure_invalidate() and invalidation notifiers allow callbacks to be
+automatically removed when the objects they point to go away.
+</para></listitem>
+</itemizedlist>
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO G_CLOSURE_NEEDS_MARSHAL ##### -->
+<para>
+Returns %TRUE if a #GClosureMarshal marshaller has not yet been set on
+@closure. See g_closure_set_marshal().
+</para>
+
+@closure: a #GClosure
+
+
+<!-- ##### MACRO G_CLOSURE_N_NOTIFIERS ##### -->
+<para>
+Returns the total number of notifiers connected with the closure @cl.
+The count includes the meta marshaller, the finalize and invalidate notifiers
+and the marshal guards. Note that each guard counts as two notifiers.
+See g_closure_set_meta_marshal(), g_closure_add_finalize_notifier(),
+g_closure_add_invalidate_notifier() and g_closure_add_marshal_guards().
+</para>
+
+@cl: a #GClosure
+
+
+<!-- ##### MACRO G_CCLOSURE_SWAP_DATA ##### -->
+<para>
+Returns whether the user data of the #GCClosure should be passed as the
+first parameter to the callback. See g_cclosure_new_swap().
+</para>
+
+@cclosure: a #GCClosure
+
+
+<!-- ##### MACRO G_CALLBACK ##### -->
+<para>
+Cast a function pointer to a #GCallback.
+</para>
+
+@f: a function pointer.
+
+
+<!-- ##### USER_FUNCTION GCallback ##### -->
+<para>
+The type used for callback functions in structure definitions and function
+signatures. This doesn't mean that all callback functions must take no
+parameters and return void. The required signature of a callback function
+is determined by the context in which is used (e.g. the signal to which it
+is connected). Use G_CALLBACK() to cast the callback function to a #GCallback.
+</para>
+
+
+
+<!-- ##### STRUCT GClosure ##### -->
+<para>
+A #GClosure represents a callback supplied by the programmer.
+</para>
+
+@in_marshal: Indicates whether the closure is currently being invoked with
+ g_closure_invoke()
+@is_invalid: Indicates whether the closure has been invalidated by
+ g_closure_invalidate()
+
+<!-- ##### MACRO G_TYPE_CLOSURE ##### -->
+<para>
+The #GType for #GClosure.
+</para>
+
+
+
+<!-- ##### STRUCT GCClosure ##### -->
+<para>
+A #GCClosure is a specialization of #GClosure for C function callbacks.
+</para>
+
+@closure: the #GClosure
+@callback: the callback function
+
+<!-- ##### USER_FUNCTION GClosureMarshal ##### -->
+<para>
+The type used for marshaller functions.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: a #GValue to store the return value. May be %NULL if the
+ callback of @closure doesn't return a value.
+@n_param_values: the length of the @param_values array
+@param_values: an array of #GValue<!-- -->s holding the arguments on
+ which to invoke the callback of @closure
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller,
+ see g_closure_set_marshal() and g_closure_set_meta_marshal()
+
+
+<!-- ##### USER_FUNCTION GClosureNotify ##### -->
+<para>
+The type used for the various notification callbacks which can be registered
+on closures.
+</para>
+
+@data: data specified when registering the notification callback
+@closure: the #GClosure on which the notification is emitted
+
+
+<!-- ##### FUNCTION g_cclosure_new ##### -->
+<para>
+Creates a new closure which invokes @callback_func with @user_data as
+the last parameter.
+</para>
+
+@callback_func: the function to invoke
+@user_data: user data to pass to @callback_func
+@destroy_data: destroy notify to be called when @user_data is no longer used
+@Returns: a new #GCClosure
+
+
+<!-- ##### FUNCTION g_cclosure_new_swap ##### -->
+<para>
+Creates a new closure which invokes @callback_func with @user_data as
+the first parameter.
+</para>
+
+@callback_func: the function to invoke
+@user_data: user data to pass to @callback_func
+@destroy_data: destroy notify to be called when @user_data is no longer used
+@Returns: a new #GCClosure
+
+
+<!-- ##### FUNCTION g_cclosure_new_object ##### -->
+<para>
+A variant of g_cclosure_new() which uses @object as @user_data and calls
+g_object_watch_closure() on @object and the created closure. This function
+is useful when you have a callback closely associated with a #GObject,
+and want the callback to no longer run after the object is is freed.
+</para>
+
+@callback_func: the function to invoke
+@object: a #GObject pointer to pass to @callback_func
+@Returns: a new #GCClosure
+
+
+<!-- ##### FUNCTION g_cclosure_new_object_swap ##### -->
+<para>
+A variant of g_cclosure_new_swap() which uses @object as @user_data and calls
+g_object_watch_closure() on @object and the created closure. This function
+is useful when you have a callback closely associated with a #GObject,
+and want the callback to no longer run after the object is is freed.
+</para>
+
+@callback_func: the function to invoke
+@object: a #GObject pointer to pass to @callback_func
+@Returns: a new #GCClosure
+
+
+<!-- ##### FUNCTION g_closure_new_object ##### -->
+<para>
+A variant of g_closure_new_simple() which stores @object in the @data
+field of the closure and calls g_object_watch_closure() on @object and the
+created closure. This function is mainly useful when implementing new types
+of closures.
+</para>
+
+@sizeof_closure: the size of the structure to allocate, must be at least
+<literal>sizeof (GClosure)</literal>
+@object: a #GObject pointer to store in the @data field of the newly
+ allocated #GClosure
+@Returns: a newly allocated #GClosure
+
+
+<!-- ##### FUNCTION g_closure_ref ##### -->
+<para>
+Increments the reference count on a closure to force it staying
+alive while the caller holds a pointer to it.
+</para>
+
+@closure: #GClosure to increment the reference count on
+@Returns: The @closure passed in, for convenience
+
+
+<!-- ##### FUNCTION g_closure_sink ##### -->
+<para>
+Takes over the initial ownership of a closure.
+Each closure is initially created in a<firstterm>floating</firstterm> state,
+which means that the initial reference count is not owned by any caller.
+g_closure_sink() checks to see if the object is still floating, and if so,
+unsets the floating state and decreases the reference count. If the closure
+is not floating, g_closure_sink() does nothing. The reason for the existance
+of the floating state is to prevent cumbersome code sequences like:
+<programlisting>
+closure = g_cclosure_new (cb_func, cb_data);
+g_source_set_closure (source, closure);
+g_closure_unref (closure); /* XXX GObject doesn't really need this */
+</programlisting>
+Because g_source_set_closure() (and similar functions) take ownership of the
+initial reference count, if it is unowned, we instead can write:
+<programlisting>
+g_source_set_closure (source, g_cclosure_new (cb_func, cb_data));
+</programlisting>
+</para>
+<para>
+Generally, this function is used together with g_closure_ref(). Ane example
+of storing a closure for later notification looks like:
+<informalexample><programlisting>
+static GClosure *notify_closure = NULL;
+void
+foo_notify_set_closure (GClosure *closure)
+{
+ if (notify_closure)
+ g_closure_unref (notify_closure);
+ notify_closure = closure;
+ if (notify_closure)
+ {
+ g_closure_ref (notify_closure);
+ g_closure_sink (notify_closure);
+ }
+}
+</programlisting></informalexample>
+</para>
+<para>
+Because g_closure_sink() may decrement the reference count of a closure
+(if it hasn't been called on @closure yet) just like g_closure_unref(),
+g_closure_ref() should be called prior to this function.
+</para>
+
+@closure: #GClosure to decrement the initial reference count on, if it's
+ still being held
+
+
+<!-- ##### FUNCTION g_closure_unref ##### -->
+<para>
+Decrements the reference count of a closure after it was previously
+incremented by the same caller. If no other callers are using the closure,
+then the closure will be destroyed and freed.
+</para>
+
+@closure: #GClosure to decrement the reference count on
+
+
+<!-- ##### FUNCTION g_closure_invoke ##### -->
+<para>
+Invokes the closure, i.e. executes the callback represented by the @closure.
+</para>
+
+@closure: a #GClosure
+@return_value: a #GValue to store the return value. May be %NULL if the
+ callback of @closure doesn't return a value.
+@n_param_values: the length of the @param_values array
+@param_values: an array of #GValue<!-- -->s holding the arguments on
+ which to invoke the callback of @closure
+@invocation_hint: a context-dependent invocation hint
+
+
+<!-- ##### FUNCTION g_closure_invalidate ##### -->
+<para>
+Sets a flag on the closure to indicate that it's calling environment has
+become invalid, and thus causes any future invocations of g_closure_invoke()
+on this @closure to be ignored. Also, invalidation notifiers installed on
+the closure will be called at this point. Note that unless you are holding
+a reference to the closure yourself, the invalidation notifiers may unref
+the closure and cause it to be destroyed, so if you need to access the
+closure after calling g_closure_invalidate(), make sure that you've
+previously called g_closure_ref().
+</para>
+<para>
+Note that g_closure_invalidate() will also be called when the reference count
+of a closure drops to zero (unless it has already been invalidated before).
+</para>
+
+@closure: GClosure to invalidate
+
+
+<!-- ##### FUNCTION g_closure_add_finalize_notifier ##### -->
+<para>
+Registers a finalization notifier which will be called when the reference
+count of @closure goes down to 0. Multiple finalization notifiers on a
+single closure are invoked in unspecified order. If a single call to
+g_closure_unref() results in the closure being both invalidated and
+finalized, then the invalidate notifiers will be run before the finalize
+notifiers.
+</para>
+
+@closure: a #GClosure
+@notify_data: data to pass to @notify_func
+@notify_func: the callback function to register
+
+
+<!-- ##### FUNCTION g_closure_add_invalidate_notifier ##### -->
+<para>
+Registers an invalidation notifier which will be called when the @closure
+is invalidated with g_closure_invalidate(). Invalidation notifiers are
+invoked before finalization notifiers, in an unspecified order.
+</para>
+
+@closure: a #GClosure
+@notify_data: data to pass to @notify_func
+@notify_func: the callback function to register
+
+
+<!-- ##### FUNCTION g_closure_remove_finalize_notifier ##### -->
+<para>
+Removes a finalization notifier. Notifiers are automatically removed after
+they are run.
+</para>
+
+@closure: a #GClosure
+@notify_data: data which was passed to g_closure_add_finalize_notifier()
+ when registering @notify_func
+@notify_func: the callback function to remove
+
+
+<!-- ##### FUNCTION g_closure_remove_invalidate_notifier ##### -->
+<para>
+Removes a invalidation notifier. Notifiers are automatically removed after
+they are run.
+</para>
+
+@closure: a #GClosure
+@notify_data: data which was passed to g_closure_add_invalidate_notifier()
+ when registering @notify_func
+@notify_func: the callback function to remove
+
+
+<!-- ##### FUNCTION g_closure_new_simple ##### -->
+<para>
+Allocates a struct of the given size and initializes the initial part
+as a #GClosure. This function is mainly useful when implementing new types
+of closures.
+</para>
+<informalexample>
+<programlisting>
+typedef struct _MyClosure MyClosure;
+struct _MyClosure
+{
+ GClosure closure;
+ /* extra data goes here */
+};
+
+
+static void
+my_closure_finalize (gpointer notify_data,
+ GClosure *closure)
+{
+ MyClosure *my_closure = (MyClosure *)closure;
+
+ /* free extra data here */
+}
+
+MyClosure *my_closure_new (gpointer data)
+{
+ GClosure *closure;
+ MyClosure *my_closure;
+
+ closure = g_closure_new_simple (sizeof (MyClosure), data);
+ my_closure = (MyClosure *) closure;
+
+ / initialize extra data here */
+
+ g_closure_add_finalize_notifier (closure, notify_data,
+ my_closure_finalize);
+ return my_closure;
+}
+</programlisting>
+</informalexample>
+
+@sizeof_closure: the size of the structure to allocate, must be at least
+<literal>sizeof (GClosure)</literal>
+@data: data to store in the @data field of the newly allocated #GClosure
+@Returns: a newly allocated #GClosure
+
+
+<!-- ##### FUNCTION g_closure_set_marshal ##### -->
+<para>
+Sets the marshaller of @closure. The @marshal_data provides a way for a
+meta marshaller to provide additional information to the marshaller.
+(See g_closure_set_meta_marshal().) For GObject's C predefined marshallers
+(the g_cclosure_marshal_*() functions), what it provides is a callback
+function to use instead of @closure->callback.
+</para>
+
+@closure: a #GClosure
+@marshal: a #GClosureMarshal function
+
+
+<!-- ##### FUNCTION g_closure_add_marshal_guards ##### -->
+<para>
+Adds a pair of notifiers which get invoked before and after the closure
+callback, respectively. This is typically used to protect the extra arguments
+for the duration of the callback. See g_object_watch_closure() for an
+example of marshal guards.
+</para>
+
+@closure: a #GClosure
+@pre_marshal_data: data to pass to @pre_marshal_notify
+@pre_marshal_notify: a function to call before the closure callback
+@post_marshal_data: data to pass to @post_marshal_notify
+@post_marshal_notify: a function to call after the closure callback
+
+
+<!-- ##### FUNCTION g_closure_set_meta_marshal ##### -->
+<para>
+Sets the meta marshaller of @closure.
+A meta marshaller wraps @closure->marshal and modifies the way it is called
+in some fashion. The most common use of this facility is for C callbacks.
+The same marshallers (generated by
+<link linkend="glib-genmarshal">glib-genmarshal</link>) are used everywhere,
+but the way that we get the callback function differs. In most cases we want
+to use @closure->callback, but in other cases we want to use use some
+different technique to retrieve the callbakc function.
+</para>
+<para>
+For example, class closures for signals (see g_signal_type_cclosure_new())
+retrieve the callback function from a fixed offset in the class structure.
+The meta marshaller retrieves the right callback and passes it to the
+marshaller as the @marshal_data argument.
+</para>
+
+@closure: a #GClosure
+@marshal_data: context-dependent data to pass to @meta_marshal
+@meta_marshal: a #GClosureMarshal function
+
+
+<!-- ##### FUNCTION g_source_set_closure ##### -->
+<para>
+Set the callback for a source as a #GClosure.
+</para>
+<para>
+If the source is not one of the standard GLib types, the @closure_callback
+and @closure_marshal fields of the GSourceFuncs structure must have been
+filled in with pointers to appropriate functions.
+</para>
+
+@source: the source
+@closure: a #GClosure
+
+
+<!-- ##### MACRO G_TYPE_IO_CHANNEL ##### -->
+<para>
+The #GType for #GIOChannel.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_IO_CONDITION ##### -->
+<para>
+The #GType for #GIOCondition.
+</para>
+
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__VOID ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 1
+@param_values: a #GValue array holding only the instance
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__BOOLEAN ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, gboolean arg1, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the #gboolean parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__CHAR ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, gchar arg1, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the #gchar parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__UCHAR ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, guchar arg1, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the #guchar parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__INT ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, gint arg1, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the #gint parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__UINT ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, guint arg1, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the #guint parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__LONG ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, glong arg1, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the #glong parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__ULONG ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, gulong arg1, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the #gulong parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__ENUM ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, gint arg1, gpointer user_data)</literal> where the #gint parameter denotes an enumeration type..
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the enumeration parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__FLAGS ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, gint arg1, gpointer user_data)</literal> where the #gint parameter denotes a flags type
+denotes a flags type.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the flags parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__FLOAT ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, gfloat arg1, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the #gfloat parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__DOUBLE ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, gdouble arg1, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the #gdouble parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__STRING ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, const gchar *arg1, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the #gchar* parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__PARAM ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, GParamSpec *arg1, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the #GParamSpec* parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__BOXED ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, GBoxed *arg1, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the #GBoxed* parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__POINTER ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, gpointer arg1, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the #gpointer parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__OBJECT ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, GOBject *arg1, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 2
+@param_values: a #GValue array holding the instance and the #GObject* parameter
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_STRING__OBJECT_POINTER ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, GObject *arg1, gpointer arg2, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 3
+@param_values: a #GValue array holding instance, arg1 and arg2
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_VOID__UINT_POINTER ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>void (*callback) (gpointer instance, guint arg1, gpointer arg2, gpointer user_data)</literal>.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: ignored
+@n_param_values: 3
+@param_values: a #GValue array holding instance, arg1 and arg2
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### FUNCTION g_cclosure_marshal_BOOLEAN__FLAGS ##### -->
+<para>
+A marshaller for a #GCClosure with a callback of type
+<literal>gboolean (*callback) (gpointer instance, gint arg1, gpointer user_data)</literal> where the #gint parameter
+denotes a flags type.
+</para>
+
+@closure: the #GClosure to which the marshaller belongs
+@return_value: a #GValue which can store the returned #gboolean
+@n_param_values: 2
+@param_values: a #GValue array holding instance and arg1
+@invocation_hint: the invocation hint given as the the last argument
+ to g_closure_invoke()
+@marshal_data: additional data specified when registering the marshaller
+
+
+<!-- ##### MACRO g_cclosure_marshal_BOOL__FLAGS ##### -->
+<para>
+Another name for g_cclosure_marshal_BOOLEAN__FLAGS().
+</para>
+
+
+
diff --git a/trunk/docs/reference/gobject/tmpl/generic_values.sgml b/trunk/docs/reference/gobject/tmpl/generic_values.sgml
new file mode 100644
index 000000000..ec254f4e5
--- /dev/null
+++ b/trunk/docs/reference/gobject/tmpl/generic_values.sgml
@@ -0,0 +1,263 @@
+<!-- ##### SECTION Title ##### -->
+Generic Values
+
+<!-- ##### SECTION Short_Description ##### -->
+A polymorphic type that can hold values of any other type
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The #GValue structure is basically a variable container that consists
+of a type identifier and a specific value of that type.
+The type identifier within a #GValue structure always determines the
+type of the associated value.
+To create a undefined #GValue structure, simply create a zero-filled
+#GValue structure. To initialize the #GValue, use the g_value_init()
+function. A #GValue cannot be used until it is initialized.
+The basic type operations (such as freeing and copying) are determined
+by the #GTypeValueTable associated with the type ID stored in the #GValue.
+Other #GValue operations (such as converting values between types) are
+provided by this interface.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+The fundamental types which all support #GValue operations and thus
+can be used as a type initializer for g_value_init() are defined by
+a separate interface. See the <link
+linkend="gobject-Standard-Parameter-and-Value-Types">Standard Values
+API</link> for details.
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO G_VALUE_HOLDS ##### -->
+<para>
+Returns %TRUE if @value holds (or contains) a value of @type.
+This macro will also check for @value != %NULL and issue a
+warning if the check fails.
+</para>
+
+@value: A #GValue structure.
+@type: A #GType value.
+
+
+<!-- ##### MACRO G_VALUE_TYPE ##### -->
+<para>
+Returns the type identifier of @value.
+</para>
+
+@value: A #GValue structure.
+
+
+<!-- ##### MACRO G_VALUE_TYPE_NAME ##### -->
+<para>
+Returns the type name of @value.
+</para>
+
+@value: A #GValue structure.
+
+
+<!-- ##### MACRO G_TYPE_IS_VALUE ##### -->
+<para>
+Return whether the passed in type ID can be used for g_value_init().
+That is, this macro checks whether this type provides an implementation
+of the #GTypeValueTable functions required for a type to create a #GValue of.
+</para>
+
+@type: A #GType value.
+@Returns: Whether @type is suitable as a #GValue type.
+
+
+<!-- ##### MACRO G_TYPE_IS_VALUE_ABSTRACT ##### -->
+<para>
+Returns %TRUE if @type is an abstract value type. An abstract value type
+introduces a value table, but can't be used for g_value_init() and is normally
+used as an abstract base type for derived value types.
+</para>
+
+@type: A #GType value.
+
+
+<!-- ##### MACRO G_IS_VALUE ##### -->
+<para>
+Returns %TRUE if @value is a valid and initialized #GValue structure.
+</para>
+
+@value: A #GValue structure.
+
+
+<!-- ##### STRUCT GValue ##### -->
+<para>
+An opaque structure used to hold different types of values.
+The data within the structure has protected scope: it is accessible only
+to functions within a #GTypeValueTable structure, or implementations of
+the g_value_*() API. That is, code portions which implement new fundamental
+types.
+#GValue users can not make any assumptions about how data is stored
+within the 2 element @data union, and the @g_type member should
+only be accessed through the G_VALUE_TYPE() macro.
+</para>
+
+
+<!-- ##### MACRO G_TYPE_VALUE ##### -->
+<para>
+Returns the type ID of the "GValue" type which is a boxed type,
+used to pass around pointers to GValues.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_VALUE_ARRAY ##### -->
+<para>
+Returns the type ID of the "GValueArray" type which is a boxed type,
+used to pass around pointers to GValueArrays.
+</para>
+
+
+
+<!-- ##### FUNCTION g_value_init ##### -->
+<para>
+Initializes @value with the default value of @type.
+</para>
+
+@value: A zero-filled (uninitialized) #GValue structure.
+@g_type: Type the #GValue should hold values of.
+@Returns: the #GValue structure that has been passed in
+
+
+<!-- ##### FUNCTION g_value_copy ##### -->
+<para>
+Copies the value of @src_value into @dest_value.
+</para>
+
+@src_value: An initialized #GValue structure.
+@dest_value: An initialized #GValue structure of the same type as @src_value.
+
+
+<!-- ##### FUNCTION g_value_reset ##### -->
+<para>
+Clears the current value in @value and resets it to the default value
+(as if the value had just been initialized).
+</para>
+
+@value: An initialized #GValue structure.
+@Returns: the #GValue structure that has been passed in
+
+
+<!-- ##### FUNCTION g_value_unset ##### -->
+<para>
+Clears the current value in @value and "unsets" the type,
+this releases all resources associated with this GValue.
+An unset value is the same as an uninitialized (zero-filled)
+#GValue structure.
+</para>
+
+@value: An initialized #GValue structure.
+
+
+<!-- ##### FUNCTION g_value_set_instance ##### -->
+<para>
+Sets @value from an instantiatable type via the
+value_table's collect_value() function.
+</para>
+
+@value: An initialized #GValue structure.
+@instance: the instance
+
+
+<!-- ##### FUNCTION g_value_fits_pointer ##### -->
+<para>
+Determines if @value will fit inside the size of a pointer value.
+This is an internal function introduced mainly for C marshallers.
+</para>
+
+@value: An initialized #GValue structure.
+@Returns: %TRUE if @value will fit inside a pointer value.
+
+
+<!-- ##### FUNCTION g_value_peek_pointer ##### -->
+<para>
+Return the value contents as pointer. This function asserts that
+g_value_fits_pointer() returned %TRUE for the passed in value.
+This is an internal function introduced mainly for C marshallers.
+</para>
+
+@value: An initialized #GValue structure.
+@Returns: %TRUE if @value will fit inside a pointer value.
+
+
+<!-- ##### FUNCTION g_value_type_compatible ##### -->
+<para>
+Returns whether a #GValue of type @src_type can be copied into
+a #GValue of type @dest_type.
+</para>
+
+@src_type: source type to be copied.
+@dest_type: destination type for copying.
+@Returns: %TRUE if g_value_copy() is possible with @src_type and @dest_type.
+
+
+<!-- ##### FUNCTION g_value_type_transformable ##### -->
+<para>
+Check whether g_value_transform() is able to transform values
+of type @src_type into values of type @dest_type.
+</para>
+
+@src_type: Source type.
+@dest_type: Target type.
+@Returns: %TRUE if the transformation is possible, %FALSE otherwise.
+
+
+<!-- ##### FUNCTION g_value_transform ##### -->
+<para>
+Tries to cast the contents of @src_value into a type appropriate
+to store in @dest_value, e.g. to transform a %G_TYPE_INT value
+into a %G_TYPE_FLOAT value. Performing transformations between
+value types might incur precision lossage. Especially
+transformations into strings might reveal seemingly arbitrary
+results and shouldn't be relied upon for production code (such
+as rcfile value or object property serialization).
+</para>
+
+@src_value: Source value.
+@dest_value: Target value.
+@Returns: Whether a transformation rule was found and could be applied.
+ Upon failing transformations, @dest_value is left untouched.
+
+
+<!-- ##### USER_FUNCTION GValueTransform ##### -->
+<para>
+The type of value transformation functions which can be registered with
+g_value_register_transform_func().
+</para>
+
+@src_value: Source value.
+@dest_value: Target value.
+
+
+<!-- ##### FUNCTION g_value_register_transform_func ##### -->
+<para>
+Registers a value transformation function for use in g_value_transform().
+A previously registered transformation function for @src_type and @dest_type
+will be replaced.
+</para>
+
+@src_type: Source type.
+@dest_type: Target type.
+@transform_func: a function which transforms values of type @src_type
+ into value of type @dest_type
+
+
+<!-- ##### FUNCTION g_strdup_value_contents ##### -->
+<para>
+Return a newly allocated string, which describes the contents of a #GValue.
+The main purpose of this function is to describe #GValue contents for
+debugging output, the way in which the contents are described may change
+between different GLib versions.
+</para>
+
+@value: #GValue which contents are to be described.
+@Returns: Newly allocated string.
+
+
diff --git a/trunk/docs/reference/gobject/tmpl/gobject-unused.sgml b/trunk/docs/reference/gobject/tmpl/gobject-unused.sgml
new file mode 100644
index 000000000..e10d7c939
--- /dev/null
+++ b/trunk/docs/reference/gobject/tmpl/gobject-unused.sgml
@@ -0,0 +1,377 @@
+<!-- ##### SECTION ./tmpl/param_specs.sgml:Long_Description ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### SECTION ./tmpl/param_specs.sgml:See_Also ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### SECTION ./tmpl/param_specs.sgml:Short_Description ##### -->
+
+
+
+<!-- ##### SECTION ./tmpl/param_specs.sgml:Title ##### -->
+Parameter Specifications
+
+
+<!-- ##### STRUCT GBoxed ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### USER_FUNCTION GBoxedInitFunc ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+<!-- ##### STRUCT GParamSpecClosure ##### -->
+<para>
+
+</para>
+
+@parent_instance:
+
+<!-- ##### ENUM GTypeFundamentals ##### -->
+<para>
+The predefined identifiers of the reserved fundamental types.
+</para>
+
+@G_TYPE_INVALID: Usually a return value indicating an error.
+@G_TYPE_NONE: A synonym for the "void" type in C.
+@G_TYPE_INTERFACE: Root type of all interface types.
+@G_TYPE_CHAR: Identifier for the built-in type "gchar".
+@G_TYPE_UCHAR: Identifier for the built-in type "guchar".
+@G_TYPE_BOOLEAN: Identifier for the built-in type "gboolean".
+@G_TYPE_INT: Identifier for the built-in type "gint".
+@G_TYPE_UINT: Identifier for the built-in type "guint".
+@G_TYPE_LONG: Identifier for the built-in type "glong".
+@G_TYPE_ULONG: Identifier for the built-in type "gulong".
+@G_TYPE_INT64:
+@G_TYPE_UINT64:
+@G_TYPE_ENUM: Identifier for the "#GEnum" type.
+@G_TYPE_FLAGS: Identifier for the "#GFlags" type.
+@G_TYPE_FLOAT: Identifier for the built-in type "gfloat".
+@G_TYPE_DOUBLE: Identifier for the built-in type "gdouble".
+@G_TYPE_STRING: Identifier for a pointer to a null-terminated string "gchar*".
+@G_TYPE_POINTER: Identifier for anonymous pointers "void*".
+@G_TYPE_BOXED: Identifier for the "#GBoxed" type.
+@G_TYPE_PARAM: Identifier for the "#GParam" type.
+@G_TYPE_OBJECT: Identifier for the "#GObject" type.
+@G_TYPE_RESERVED_BSE_FIRST: First fundamental type ID reserved for BSE.
+@G_TYPE_RESERVED_BSE_LAST: Last fundamental type ID reserved for BSE.
+@G_TYPE_RESERVED_LAST_FUNDAMENTAL:
+@G_TYPE_CONSTANT_TYPES:
+@G_TYPE_CLOSURE:
+@G_TYPE_VALUE:
+@G_TYPE_VALUE_ARRAY:
+@G_TYPE_GSTRING:
+@G_TYPE_PARAM_CHAR:
+@G_TYPE_PARAM_UCHAR:
+@G_TYPE_PARAM_BOOLEAN:
+@G_TYPE_PARAM_INT:
+@G_TYPE_PARAM_UINT:
+@G_TYPE_PARAM_LONG:
+@G_TYPE_PARAM_ULONG:
+@G_TYPE_PARAM_INT64:
+@G_TYPE_PARAM_UINT64:
+@G_TYPE_PARAM_UNICHAR:
+@G_TYPE_PARAM_ENUM:
+@G_TYPE_PARAM_FLAGS:
+@G_TYPE_PARAM_FLOAT:
+@G_TYPE_PARAM_DOUBLE:
+@G_TYPE_PARAM_STRING:
+@G_TYPE_PARAM_PARAM:
+@G_TYPE_PARAM_BOXED:
+@G_TYPE_PARAM_POINTER:
+@G_TYPE_PARAM_VALUE_ARRAY:
+@G_TYPE_PARAM_CLOSURE:
+@G_TYPE_PARAM_OBJECT:
+
+<!-- ##### MACRO G_INITIALLY_UNOWNED ##### -->
+<para>
+Casts a #GInitiallyUnowned or derived pointer into a (GInitiallyUnowned*)
+pointer. Depending on the current debugging level, this function may invoke
+certain runtime checks to identify invalid casts.
+</para>
+
+@object: Object which is subject to casting
+
+<!-- ##### MACRO G_INITIALLY_UNOWNED_CLASS ##### -->
+<para>
+Casts a derived #GInitiallyUnownedClass structure into a
+#GInitiallyUnownedClass structure.
+</para>
+
+@class: a valid #GInitiallyUnownedClass
+
+<!-- ##### MACRO G_INITIALLY_UNOWNED_GET_CLASS ##### -->
+<para>
+Returns the class structure associated to a #GInitiallyUnowned instance.
+</para>
+
+@object: a #GInitiallyUnowned instance
+
+<!-- ##### MACRO G_IS_INITIALLY_UNOWNED ##### -->
+<para>
+Checks whether a valid #GTypeInstance pointer is of type
+%G_TYPE_INITIALLY_UNOWNED.
+</para>
+
+@object: Instance to check for being a %G_TYPE_INITIALLY_UNOWNED.
+
+<!-- ##### MACRO G_IS_INITIALLY_UNOWNED_CLASS ##### -->
+<para>
+Checks whether @class "is a" valid #GInitiallyUnownedClass structure of type
+%G_TYPE_INITIALLY_UNOWNED or derived.
+</para>
+
+@class: a #GInitiallyUnownedClass
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_CLOSURE ##### -->
+<para>
+
+</para>
+
+@pspec:
+
+<!-- ##### MACRO G_PARAM_SPEC_CLOSURE ##### -->
+<para>
+
+</para>
+
+@pspec:
+
+<!-- ##### MACRO G_TYPE_FUNDAMENTAL_LAST ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### MACRO G_TYPE_FUNDAMENTAL_SHIFT ##### -->
+<para>
+Shift value used in converting numbers to type IDs.
+</para>
+
+
+<!-- ##### FUNCTION g_closure_add_fnotify ##### -->
+<para>
+
+</para>
+
+@closure:
+@notify_data:
+@notify_func:
+
+<!-- ##### FUNCTION g_closure_add_inotify ##### -->
+<para>
+
+</para>
+
+@closure:
+@notify_data:
+@notify_func:
+
+<!-- ##### FUNCTION g_closure_remove_fnotify ##### -->
+<para>
+
+</para>
+
+@closure:
+@notify_data:
+@notify_func:
+
+<!-- ##### FUNCTION g_closure_remove_inotify ##### -->
+<para>
+
+</para>
+
+@closure:
+@notify_data:
+@notify_func:
+
+<!-- ##### FUNCTION g_param_spec_closure ##### -->
+<para>
+
+</para>
+
+@name:
+@nick:
+@blurb:
+@flags:
+@Returns:
+
+<!-- ##### FUNCTION g_param_spec_string_c ##### -->
+<para>
+
+</para>
+
+@name:
+@nick:
+@blurb:
+@default_value:
+@flags:
+@Returns:
+
+<!-- ##### FUNCTION g_signal_add_emission_hook_full ##### -->
+<para>
+
+</para>
+
+@signal_id:
+@closure:
+@Returns:
+
+<!-- ##### FUNCTION g_signal_handlers_destroy ##### -->
+<para>
+
+</para>
+
+@instance:
+
+<!-- ##### MACRO g_signal_newc ##### -->
+<para>
+
+</para>
+
+@Returns:
+@signal_name:
+@itype:
+@signal_flags:
+@class_offset:
+@accumulator:
+@accu_data:
+@c_marshaller:
+@return_type:
+@n_params:
+@Varargs:
+
+<!-- ##### FUNCTION g_type_check_class_cast ##### -->
+<para>
+</para>
+
+@g_class:
+@is_a_type:
+@Returns:
+
+<!-- ##### FUNCTION g_type_check_flags ##### -->
+<para>
+Determines whether a given set of #GTypeFlags and #GTypeFundamentalFlags
+are set for @type.
+</para>
+
+@type: The type to check for flags.
+@flags: Bitwise combination of #GTypeFlags and #GTypeFundamentalFlags.
+@Returns: #TRUE if all @flags are set for @type, #FALSE otherwise.
+
+<!-- ##### FUNCTION g_type_check_instance ##### -->
+<para>
+Private helper function to aid implementation of the G_TYPE_CHECK_INSTANCE()
+macro.
+</para>
+
+@instance: A valid #GTypeInstance structure.
+@Returns: #TRUE if @instance is valid, #FALSE otherwise.
+
+<!-- ##### FUNCTION g_type_check_instance_cast ##### -->
+<para>
+</para>
+
+@instance:
+@iface_type:
+@Returns:
+
+<!-- ##### FUNCTION g_type_check_value ##### -->
+<para>
+</para>
+
+@value:
+@Returns:
+
+<!-- ##### FUNCTION g_type_class_is_a ##### -->
+<para>
+</para>
+
+@g_class:
+@is_a_type:
+@Returns:
+
+<!-- ##### FUNCTION g_type_fundamental_last ##### -->
+<para>
+
+</para>
+
+@Returns:
+
+<!-- ##### FUNCTION g_type_instance_is_a ##### -->
+<para>
+Determines if @instance adheres to the interface exported
+by @iface_type. @iface_type is either a type that @instance
+is derived from, or an interface type that is supported by
+the anchestry of @instance.
+</para>
+
+@instance: A valid #GTypeInstance structure.
+@iface_type: A #GType value.
+@Returns: #TRUE if @instance conforms to @iface_type, #FALSE otherwise.
+
+<!-- ##### FUNCTION g_type_test_flags ##### -->
+<para>
+
+</para>
+
+@type:
+@flags:
+@Returns:
+
+<!-- ##### FUNCTION g_type_value_is_a ##### -->
+<para>
+Determines if @value is a #GValue whose type conforms to @type.
+</para>
+
+@value: A valid #GValue structure.
+@type: A #GType value.
+@Returns: #TRUE if @value is a #GValue of @type or #FALSE if not.
+
+<!-- ##### FUNCTION g_value_convert ##### -->
+<para>
+
+</para>
+
+@src_value:
+@dest_value:
+@Returns:
+
+<!-- ##### FUNCTION g_value_register_exchange_func ##### -->
+<para>
+
+</para>
+
+@value_type1:
+@value_type2:
+@func:
+
+<!-- ##### FUNCTION g_value_types_exchangable ##### -->
+<para>
+
+</para>
+
+@value_type1:
+@value_type2:
+@Returns:
+
+<!-- ##### FUNCTION g_values_exchange ##### -->
+<para>
+
+</para>
+
+@value1:
+@value2:
+@Returns:
+
diff --git a/trunk/docs/reference/gobject/tmpl/gparamspec.sgml b/trunk/docs/reference/gobject/tmpl/gparamspec.sgml
new file mode 100644
index 000000000..71c34c5c5
--- /dev/null
+++ b/trunk/docs/reference/gobject/tmpl/gparamspec.sgml
@@ -0,0 +1,532 @@
+<!-- ##### SECTION Title ##### -->
+GParamSpec
+
+<!-- ##### SECTION Short_Description ##### -->
+Metadata for parameter specifications
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+#GParamSpec is an object structure that encapsulates the metadata
+required to specify parameters, such as e.g. #GObject properties.
+</para>
+<para id="canonical-parameter-name">
+Parameter names need to start with a letter (a-z or A-Z). Subsequent
+characters can be letters, numbers or a '-'.
+All other characters are replaced by a '-' during construction.
+The result of this replacement is called the canonical name of the
+parameter.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+g_object_class_install_property(), g_object_set(), g_object_get(),
+g_object_set_property(), g_object_get_property(), g_value_register_transform_func()
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO G_TYPE_IS_PARAM ##### -->
+<para>
+Returns whether @type "is a" %G_TYPE_PARAM.
+</para>
+
+@type: a #GType ID
+
+
+<!-- ##### MACRO G_PARAM_SPEC ##### -->
+<para>
+Casts a derived #GParamSpec object (e.g. of type #GParamSpecInt) into
+a #GParamSpec object.
+</para>
+
+@pspec: a valid #GParamSpec
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC ##### -->
+<para>
+Checks whether @pspec "is a" valid #GParamSpec structure of type %G_TYPE_PARAM
+or derived.
+</para>
+
+@pspec: a #GParamSpec
+
+
+<!-- ##### MACRO G_PARAM_SPEC_CLASS ##### -->
+<para>
+Casts a derived #GParamSpecClass structure into a #GParamSpecClass structure.
+</para>
+
+@pclass: a valid #GParamSpecClass
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_CLASS ##### -->
+<para>
+Checks whether @pclass "is a" valid #GParamSpecClass structure of type
+%G_TYPE_PARAM or derived.
+</para>
+
+@pclass: a #GParamSpecClass
+
+
+<!-- ##### MACRO G_PARAM_SPEC_GET_CLASS ##### -->
+<para>
+Retrieves the #GParamSpecClass of a #GParamSpec.
+</para>
+
+@pspec: a valid #GParamSpec
+
+
+<!-- ##### MACRO G_PARAM_SPEC_TYPE ##### -->
+<para>
+Retrieves the #GType of this @pspec.
+</para>
+
+@pspec: a valid #GParamSpec
+
+
+<!-- ##### MACRO G_PARAM_SPEC_TYPE_NAME ##### -->
+<para>
+Retrieves the #GType name of this @pspec.
+</para>
+
+@pspec: a valid #GParamSpec
+
+
+<!-- ##### MACRO G_PARAM_SPEC_VALUE_TYPE ##### -->
+<para>
+Retrieves the #GType to initialize a #GValue for this parameter.
+</para>
+
+@pspec: a valid #GParamSpec
+
+
+<!-- ##### STRUCT GParamSpec ##### -->
+<para>
+All fields of the <structname>GParamSpec</structname> struct are private and
+should not be used directly, except for the following:
+</para>
+
+@g_type_instance: private #GTypeInstance portion
+@name: name of this parameter
+@flags: #GParamFlags flags for this parameter
+@value_type: the #GValue type for this parameter
+@owner_type: #GType type that uses (introduces) this paremeter
+
+<!-- ##### STRUCT GParamSpecClass ##### -->
+<para>
+The class structure for the <structname>GParamSpec</structname> type.
+Normally, <structname>GParamSpec</structname> classes are filled by
+g_param_type_register_static().
+</para>
+
+@g_type_class: the parent class
+@value_type: the #GValue type for this parameter
+@finalize: The instance finalization function (optional), should chain
+ up to the finalize method of the parent class.
+@value_set_default: Resets a @value to the default value for this type
+ (recommended, the default is g_value_reset()), see
+ g_param_value_set_default().
+@value_validate: Ensures that the contents of @value comply with the
+ specifications set out by this type (optional), see
+ g_param_value_set_validate().
+@values_cmp: Compares @value1 with @value2 according to this type
+ (recommended, the default is memcmp()), see g_param_values_cmp().
+
+<!-- ##### ENUM GParamFlags ##### -->
+<para>
+Through the #GParamFlags flag values, certain aspects of parameters
+can be configured.
+</para>
+
+@G_PARAM_READABLE: the parameter is readable
+@G_PARAM_WRITABLE: the parameter is writable
+@G_PARAM_CONSTRUCT: the parameter will be set upon object construction
+@G_PARAM_CONSTRUCT_ONLY: the parameter will only be set upon object construction
+@G_PARAM_LAX_VALIDATION: upon parameter conversion (see g_param_value_convert())
+ strict validation is not required
+@G_PARAM_STATIC_NAME: the string used as name when constructing the
+ parameter is guaranteed to remain valid and
+ unmodified for the lifetime of the parameter.
+ Since 2.8
+@G_PARAM_STATIC_BLURB: the string used as blurb when constructing the
+ parameter is guaranteed to remain valid and
+ unmodified for the lifetime of the parameter.
+ Since 2.8
+
+<!-- ##### MACRO G_PARAM_READWRITE ##### -->
+<para>
+#GParamFlags value alias for %G_PARAM_READABLE | %G_PARAM_WRITABLE.
+</para>
+
+
+
+<!-- ##### MACRO G_PARAM_STATIC_STRINGS ##### -->
+<para>
+#GParamFlags value alias for %G_PARAM_STATIC_NAME | %G_PARAM_STATIC_NICK | %G_PARAM_STATIC_BLURB.
+</para>
+
+
+
+<!-- ##### MACRO G_PARAM_MASK ##### -->
+<para>
+Mask containing the bits of #GParamSpec.flags which are reserved for GLib.
+</para>
+
+
+
+<!-- ##### MACRO G_PARAM_USER_SHIFT ##### -->
+<para>
+Minimum shift count to be used for user defined flags, to be stored in
+#GParamSpec.flags.
+</para>
+
+
+
+<!-- ##### FUNCTION g_param_spec_ref ##### -->
+<para>
+Increments the reference count of @pspec.
+</para>
+
+@pspec: a valid #GParamSpec
+@Returns: the #GParamSpec that was passed into this function
+
+
+<!-- ##### FUNCTION g_param_spec_unref ##### -->
+<para>
+Decrements the reference count of a @pspec.
+</para>
+
+@pspec: a valid #GParamSpec
+
+
+<!-- ##### FUNCTION g_param_spec_sink ##### -->
+<para>
+The initial reference count of a newly created #GParamSpec is 1, even
+though no one has explicitly called g_param_spec_ref() on it yet. So the
+initial reference count is flagged as "floating", until someone calls
+<literal>g_param_spec_ref (pspec); g_param_spec_sink (pspec);</literal>
+in sequence on it, taking over the initial reference count (thus
+ending up with a @pspec that has a reference count of 1 still, but is
+not flagged "floating" anymore).
+</para>
+
+@pspec: a valid #GParamSpec
+
+
+<!-- ##### FUNCTION g_param_spec_ref_sink ##### -->
+<para>
+Convenience function to ref and sink a #GParamSpec.
+</para>
+
+@pspec: a valid #GParamSpec
+@Returns: the #GParamSpec that was passed into this function
+@Since: 2.10
+
+
+<!-- ##### FUNCTION g_param_value_set_default ##### -->
+<para>
+Sets @value to its default value as specified in @pspec.
+</para>
+
+@pspec: a valid #GParamSpec
+@value: a #GValue of correct type for @pspec
+
+
+<!-- ##### FUNCTION g_param_value_defaults ##### -->
+<para>
+Checks whether @value contains the default value as specified in @pspec.
+</para>
+
+@pspec: a valid #GParamSpec
+@value: a #GValue of correct type for @pspec
+@Returns: whether @value contains the canonical default for this @pspec
+
+
+<!-- ##### FUNCTION g_param_value_validate ##### -->
+<para>
+Ensures that the contents of @value comply with the specifications
+set out by @pspec. For example, a #GParamSpecInt might require
+that integers stored in @value may not be smaller than -42 and not be
+greater than +42. If @value contains an integer outside of this range,
+it is modified accordingly, so the resulting value will fit into the
+range -42 .. +42.
+</para>
+
+@pspec: a valid #GParamSpec
+@value: a #GValue of correct type for @pspec
+@Returns: whether modifying @value was necessary to ensure validity
+
+
+<!-- ##### FUNCTION g_param_value_convert ##### -->
+<para>
+Transforms @src_value into @dest_value if possible, and then validates
+@dest_value, in order for it to conform to @pspec.
+If @strict_validation is %TRUE this function will only succeed if
+the transformed @dest_value complied to @pspec without modifications.
+
+See also g_value_type_transformable(), g_value_transform() and
+g_param_value_validate().
+</para>
+
+@pspec: a valid #GParamSpec
+@src_value: souce #GValue
+@dest_value: destination #GValue of correct type for @pspec
+@strict_validation: %TRUE requires @dest_value to conform to @pspec without modifications
+@Returns: %TRUE if transformation and validation were successful,
+ %FALSE otherwise and @dest_value is left untouched.
+
+
+<!-- ##### FUNCTION g_param_values_cmp ##### -->
+<para>
+Compares @value1 with @value2 according to @pspec, and return -1, 0 or +1,
+if @value1 is found to be less than, equal to or greater than @value2,
+respectively.
+</para>
+
+@pspec: a valid #GParamSpec
+@value1: a #GValue of correct type for @pspec
+@value2: a #GValue of correct type for @pspec
+@Returns: -1, 0 or +1, for a less than, equal to or greater than result
+
+
+<!-- ##### FUNCTION g_param_spec_get_name ##### -->
+<para>
+Returns the name of a #GParamSpec.
+</para>
+
+@pspec: a valid #GParamSpec
+@Returns: the name of @pspec.
+
+
+<!-- ##### FUNCTION g_param_spec_get_nick ##### -->
+<para>
+Returns the nickname of a #GParamSpec.
+</para>
+
+@pspec: a valid #GParamSpec
+@Returns: the nickname of @pspec.
+
+
+<!-- ##### FUNCTION g_param_spec_get_blurb ##### -->
+<para>
+Returns the short description of a #GParamSpec.
+</para>
+
+@pspec: a valid #GParamSpec
+@Returns: the short description of @pspec.
+
+
+<!-- ##### FUNCTION g_param_spec_get_qdata ##### -->
+<para>
+Gets back user data pointers stored via g_param_spec_set_qdata().
+</para>
+
+@pspec: a valid #GParamSpec
+@quark: a #GQuark, naming the user data pointer
+@Returns: the user data pointer set, or %NULL
+
+
+<!-- ##### FUNCTION g_param_spec_set_qdata ##### -->
+<para>
+Sets an opaque, named pointer on a #GParamSpec. The name is specified
+through a #GQuark (retrieved e.g. via g_quark_from_static_string()), and
+the pointer can be gotten back from the @pspec with g_param_spec_get_qdata().
+Setting a previously set user data pointer, overrides (frees)
+the old pointer set, using %NULL as pointer essentially
+removes the data stored.
+</para>
+
+@pspec: the #GParamSpec to set store a user data pointer
+@quark: a #GQuark, naming the user data pointer
+@data: an opaque user data pointer
+
+
+<!-- ##### FUNCTION g_param_spec_set_qdata_full ##### -->
+<para>
+This function works like g_param_spec_set_qdata(), but in addition,
+a <literal>void (*destroy) (gpointer)</literal> function may be
+specified which is called with @data as argument when the @pspec is
+finalized, or the data is being overwritten by a call to
+g_param_spec_set_qdata() with the same @quark.
+</para>
+
+@pspec: the #GParamSpec to set store a user data pointer
+@quark: a #GQuark, naming the user data pointer
+@data: an opaque user data pointer
+@destroy: function to invoke with @data as argument, when @data needs to
+ be freed
+
+
+<!-- ##### FUNCTION g_param_spec_steal_qdata ##### -->
+<para>
+Gets back user data pointers stored via g_param_spec_set_qdata() and
+removes the @data from @pspec without invoking it's destroy() function
+(if any was set).
+Usually, calling this function is only required to update
+user data pointers with a destroy notifier.
+</para>
+
+@pspec: the #GParamSpec to get a stored user data pointer from
+@quark: a #GQuark, naming the user data pointer
+@Returns: the user data pointer set, or %NULL
+
+
+<!-- ##### FUNCTION g_param_spec_get_redirect_target ##### -->
+<para>
+If the paramspec redirects operations to another paramspec,
+returns that paramspec. Redirect is used typically for
+providing a new implementation of a property in a derived
+type while preserving all the properties from the parent
+type. Redirection is established by creating a property
+of type #GParamSpecOverride. See g_object_override_property()
+for an example of the use of this capability.
+</para>
+
+@pspec: a #GParamSpec
+@Returns: paramspec to which requests on this paramspec should
+ be redirected, or %NULL if none.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_param_spec_internal ##### -->
+<para>
+Creates a new #GParamSpec instance.
+</para>
+<para>
+A property name consists of segments consisting of ASCII letters and
+digits, separated by either the '-' or '_' character. The first
+character of a property name must be a letter. Names which violate these
+rules lead to undefined behaviour.
+</para>
+<para>
+When creating and looking up a #GParamSpec, either separator can be used,
+but they cannot be mixed. Using '-' is considerably more efficient and in
+fact required when using property names as detail strings for signals.
+</para>
+
+@param_type: the #GType for the property; must be derived from #G_TYPE_PARAM
+@name: the canonical name of the property
+@nick: the nickname of the property
+@blurb: a short description of the property
+@flags: a combination of #GParamFlags
+@Returns: a newly allocated #GParamSpec instance
+
+
+<!-- ##### STRUCT GParamSpecTypeInfo ##### -->
+<para>
+This structure is used to provide the type system with the information
+required to initialize and destruct (finalize) a parameter's class and
+instances thereof.
+The initialized structure is passed to the g_param_type_register_static()
+The type system will perform a deep copy of this structure, so it's memory
+does not need to be persistent across invocation of
+g_param_type_register_static().
+</para>
+
+@instance_size: Size of the instance (object) structure.
+@n_preallocs: Prior to GLib 2.10, it specified the number of pre-allocated (cached) instances to reserve memory for (0 indicates no caching). Since GLib 2.10, it is ignored, since instances are allocated with the <link linkend="glib-Memory-Slices">slice allocator</link> now.
+@instance_init: Location of the instance initialization function (optional).
+@value_type: The #GType of values conforming to this #GParamSpec
+@finalize: The instance finalization function (optional).
+@value_set_default: Resets a @value to the default value for @pspec
+ (recommended, the default is g_value_reset()), see
+ g_param_value_set_default().
+@value_validate: Ensures that the contents of @value comply with the
+ specifications set out by @pspec (optional), see
+ g_param_value_set_validate().
+@values_cmp: Compares @value1 with @value2 according to @pspec
+ (recommended, the default is memcmp()), see g_param_values_cmp().
+
+<!-- ##### FUNCTION g_param_type_register_static ##### -->
+<para>
+Registers @name as the name of a new static type derived from
+#G_TYPE_PARAM. The type system uses the information contained in the
+#GParamSpecTypeInfo structure pointed to by @info to manage the #GParamSpec
+type and its instances.
+</para>
+
+@name: 0-terminated string used as the name of the new #GParamSpec type.
+@pspec_info: The #GParamSpecTypeInfo for this #GParamSpec type.
+@Returns: The new type identifier.
+
+
+<!-- ##### STRUCT GParamSpecPool ##### -->
+<para>
+A #GParamSpecPool maintains a collection of #GParamSpec<!-- -->s which can be
+quickly accessed by owner and name. The implementation of the #GObject property
+system uses such a pool to store the #GParamSpecs of the properties all object
+types.
+</para>
+
+
+<!-- ##### FUNCTION g_param_spec_pool_new ##### -->
+<para>
+Creates a new #GParamSpecPool.
+</para>
+<para>
+If @type_prefixing is %TRUE, lookups in the newly created pool will
+allow to specify the owner as a colon-separated prefix of the property name,
+like "GtkContainer:border-width". This feature is deprecated, so you should
+always set @type_prefixing to %FALSE.
+</para>
+
+@type_prefixing: Whether the pool will support type-prefixed property names.
+@Returns: a newly allocated #GParamSpecPool.
+
+
+<!-- ##### FUNCTION g_param_spec_pool_insert ##### -->
+<para>
+Inserts a #GParamSpec in the pool.
+</para>
+
+@pool: a #GParamSpecPool.
+@pspec: the #GParamSpec to insert
+@owner_type: a #GType identifying the owner of @pspec
+
+
+<!-- ##### FUNCTION g_param_spec_pool_remove ##### -->
+<para>
+Removes a #GParamSpec from the pool.
+</para>
+
+@pool: a #GParamSpecPool
+@pspec: the #GParamSpec to remove
+
+
+<!-- ##### FUNCTION g_param_spec_pool_lookup ##### -->
+<para>
+Looks up a #GParamSpec in the pool.
+</para>
+
+@pool: a #GParamSpecPool
+@param_name: the name to look for
+@owner_type: the owner to look for
+@walk_ancestors: If %TRUE, also try to find a #GParamSpec with @param_name
+ owned by an ancestor of @owner_type.
+@Returns: The found #GParamSpec, or %NULL if no matching #GParamSpec was found.
+
+
+<!-- ##### FUNCTION g_param_spec_pool_list ##### -->
+<para>
+Gets an array of all #GParamSpec<!-- -->s owned by @owner_type in the pool.
+</para>
+
+@pool: a #GParamSpecPool
+@owner_type: the owner to look for
+@n_pspecs_p: return location for the length of the returned array
+@Returns: a newly allocated array containing pointers to all
+ #GParamSpec<!-- -->s owned by @owner_type in the pool
+
+
+<!-- ##### FUNCTION g_param_spec_pool_list_owned ##### -->
+<para>
+Gets an #GList of all #GParamSpec<!-- -->s owned by @owner_type in the pool.
+</para>
+
+@pool: a #GParamSpecPool
+@owner_type: the owner to look for
+@Returns: a #GList of all #GParamSpec<!-- -->s owned by @owner_type in
+ the pool#GParamSpec<!-- -->s.
+
+
diff --git a/trunk/docs/reference/gobject/tmpl/gtype.sgml b/trunk/docs/reference/gobject/tmpl/gtype.sgml
new file mode 100644
index 000000000..26dfbd49d
--- /dev/null
+++ b/trunk/docs/reference/gobject/tmpl/gtype.sgml
@@ -0,0 +1,1847 @@
+<!-- ##### SECTION Title ##### -->
+GType
+
+<!-- ##### SECTION Short_Description ##### -->
+The GLib Runtime type identification and management system
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The GType API is the foundation of the GObject system. It provides the
+facilities for registering and managing all fundamental data types,
+user-defined object and interface types. Before using any GType
+or GObject functions, g_type_init() must be called to initialize the
+type system.
+</para>
+<para>
+For type creation and registration purposes, all types fall into one of
+two categories: static or dynamic. Static types are never loaded or
+unloaded at run-time as dynamic types may be. Static types are created
+with g_type_register_static() that gets type specific information passed
+in via a #GTypeInfo structure.
+Dynamic types are created with g_type_register_dynamic() which takes a
+#GTypePlugin structure instead. The remaining type information (the
+#GTypeInfo structure) is retrieved during runtime through #GTypePlugin
+and the g_type_plugin_*() API.
+These registration functions are usually called only once from a
+function whose only purpose is to return the type identifier for a
+specific class. Once the type (or class or interface) is registered,
+it may be instantiated, inherited, or implemented depending on exactly
+what sort of type it is.
+There is also a third registration function for registering fundamental
+types called g_type_register_fundamental() which requires both a #GTypeInfo
+structure and a #GTypeFundamentalInfo structure but it is seldom used
+since most fundamental types are predefined rather than user-defined.
+</para>
+<para>
+A final word about type names.
+Such an identifier needs to be at least three characters long. There is no
+upper length limit. The first character needs to be a letter (a-z or A-Z)
+or an underscore '_'. Subsequent characters can be letters, numbers or
+any of '-_+'.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### TYPEDEF GType ##### -->
+<para>
+A numerical value which represents the unique identifier of a registered
+type.
+</para>
+
+
+<!-- ##### MACRO G_TYPE_FUNDAMENTAL ##### -->
+<para>
+Returns the fundamental type which is the ancestor of @type.
+Fundamental types are types that serve as ultimate bases for the derived types,
+thus they are the roots of distinct inheritance hierarchies.
+</para>
+
+@type: A #GType value.
+
+
+<!-- ##### MACRO G_TYPE_FUNDAMENTAL_MAX ##### -->
+<para>
+An integer constant that represents the number of identifiers reserved
+for types that are assigned at compile-time.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_MAKE_FUNDAMENTAL ##### -->
+<para>
+Returns the type ID for the fundamental type number @x.
+Use g_type_fundamental_next() instead of this macro to create new fundamental
+types.
+</para>
+
+@x: the fundamental type number.
+
+
+<!-- ##### MACRO G_TYPE_IS_ABSTRACT ##### -->
+<para>
+Returns %TRUE if @type is an abstract type. An abstract type can not be
+instantiated and is normally used as an abstract base class for
+derived classes.
+</para>
+
+@type: A #GType value.
+
+
+<!-- ##### MACRO G_TYPE_IS_DERIVED ##### -->
+<para>
+Returns %TRUE if @type is derived (or in object-oriented terminology:
+inherited) from another type (this holds true for all non-fundamental
+types).
+</para>
+
+@type: A #GType value.
+
+
+<!-- ##### MACRO G_TYPE_IS_FUNDAMENTAL ##### -->
+<para>
+Returns %TRUE if @type is a fundamental type.
+</para>
+
+@type: A #GType value.
+
+
+<!-- ##### MACRO G_TYPE_IS_VALUE_TYPE ##### -->
+<para>
+Returns %TRUE if @type is a value type and can be used with
+g_value_init().
+</para>
+
+@type: A #GType value.
+
+
+<!-- ##### MACRO G_TYPE_HAS_VALUE_TABLE ##### -->
+<para>
+Returns %TRUE if @type has a #GTypeValueTable.
+</para>
+
+@type: A #GType value.
+
+
+<!-- ##### MACRO G_TYPE_IS_CLASSED ##### -->
+<para>
+Returns %TRUE if @type is a classed type.
+</para>
+
+@type: A #GType value.
+
+
+<!-- ##### MACRO G_TYPE_IS_INSTANTIATABLE ##### -->
+<para>
+Returns %TRUE if @type can be instantiated. Instantiation is the
+process of creating an instance (object) of this type.
+</para>
+
+@type: A #GType value.
+
+
+<!-- ##### MACRO G_TYPE_IS_DERIVABLE ##### -->
+<para>
+Returns %TRUE if @type is a derivable type. A derivable type can
+be used as the base class of a flat (single-level) class hierarchy.
+</para>
+
+@type: A #GType value.
+
+
+<!-- ##### MACRO G_TYPE_IS_DEEP_DERIVABLE ##### -->
+<para>
+Returns %TRUE if @type is a deep derivable type. A deep derivable type
+can be used as the base class of a deep (multi-level) class hierarchy.
+</para>
+
+@type: A #GType value.
+
+
+<!-- ##### MACRO G_TYPE_IS_INTERFACE ##### -->
+<para>
+Returns %TRUE if @type is an interface type.
+An interface type provides a pure API, the implementation
+of which is provided by another type (which is then said to conform
+to the interface). GLib interfaces are somewhat analogous to Java
+interfaces and C++ classes containing only pure virtual functions,
+with the difference that GType interfaces are not derivable (but see
+g_type_interface_add_prerequisite() for an alternative).
+</para>
+
+@type: A #GType value.
+
+
+<!-- ##### STRUCT GTypeInterface ##### -->
+<para>
+An opaque structure used as the base of all interface types.
+</para>
+
+
+<!-- ##### STRUCT GTypeInstance ##### -->
+<para>
+An opaque structure used as the base of all type instances.
+</para>
+
+
+<!-- ##### STRUCT GTypeClass ##### -->
+<para>
+An opaque structure used as the base of all classes.
+</para>
+
+
+<!-- ##### STRUCT GTypeInfo ##### -->
+<para>
+This structure is used to provide the type system with the information
+required to initialize and destruct (finalize) a type's class and
+its instances.
+The initialized structure is passed to the g_type_register_static() function
+(or is copied into the provided #GTypeInfo structure in the
+g_type_plugin_complete_type_info()). The type system will perform a deep
+copy of this structure, so its memory does not need to be persistent
+across invocation of g_type_register_static().
+</para>
+
+@class_size: Size of the class structure (required for interface, classed and instantiatable types).
+@base_init: Location of the base initialization function (optional).
+@base_finalize: Location of the base finalization function (optional).
+@class_init: Location of the class initialization function for
+ classed and types. Location of the default vtable inititalization
+ function for interface types. (optional) This function is used both
+ to fill in virtual functions in the class or default vtable, and
+ to do type-specific setup such as registering signals and object
+ properties.
+@class_finalize: Location of the class finalization function for
+ classed and types. Location fo the default vtable finalization
+ function for interface types. (optional)
+@class_data: User-supplied data passed to the class init/finalize functions.
+@instance_size: Size of the instance (object) structure (required for instantiatable types only).
+@n_preallocs: Prior to GLib 2.10, it specified the number of pre-allocated (cached) instances to reserve memory for (0 indicates no caching). Since GLib 2.10, it is ignored, since instances are allocated with the <link linkend="glib-Memory-Slices">slice allocator</link> now.
+@instance_init: Location of the instance initialization function (optional, for instantiatable types only).
+@value_table: A #GTypeValueTable function table for generic handling of GValues of this type (usually only
+ useful for fundamental types).
+
+<!-- ##### STRUCT GTypeFundamentalInfo ##### -->
+<para>
+A structure that provides information to the type system which is
+used specifically for managing fundamental types.
+</para>
+
+@type_flags: #GTypeFundamentalFlags describing the characteristics of the fundamental type
+
+<!-- ##### STRUCT GInterfaceInfo ##### -->
+<para>
+A structure that provides information to the type system which is
+used specifically for managing interface types.
+</para>
+
+@interface_init: location of the interface initialization function
+@interface_finalize: location of the interface finalization function
+@interface_data: user-supplied data passed to the interface init/finalize functions
+
+<!-- ##### STRUCT GTypeValueTable ##### -->
+<para>
+The #GTypeValueTable provides the functions required by the #GValue implementation,
+to serve as a container for values of a type.
+</para>
+
+@value_init: Default initialize @values contents by poking values
+ directly into the value-&gt;data array. The data array of
+ the #GValue passed into this function was zero-filled
+ with <function>memset()</function>, so no care has to
+ be taken to free any
+ old contents. E.g. for the implementation of a string
+ value that may never be %NULL, the implementation might
+ look like:
+<programlisting>
+{
+ value-&gt;data[0].v_pointer = g_strdup ("");
+}
+</programlisting>
+@value_free: Free any old contents that might be left in the
+ data array of the passed in @value. No resources may
+ remain allocated through the #GValue contents after
+ this function returns. E.g. for our above string type:
+<programlisting>
+{
+ /* only free strings without a specific flag for static storage */
+ if (!(value-&gt;data[1].v_uint &amp; G_VALUE_NOCOPY_CONTENTS))
+ g_free (value-&gt;data[0].v_pointer);
+}
+</programlisting>
+@value_copy: @dest_value is a #GValue with zero-filled data section
+ and @src_value is a properly setup #GValue of same or
+ derived type.
+ The purpose of this function is to copy the contents of
+ @src_value into @dest_value in a way, that even after
+ @src_value has been freed, the contents of @dest_value
+ remain valid. String type example:
+<programlisting>
+{
+ dest_value-&gt;data[0].v_pointer = g_strdup (src_value-&gt;data[0].v_pointer);
+}
+</programlisting>
+@value_peek_pointer: If the value contents fit into a pointer, such as objects
+ or strings, return this pointer, so the caller can peek at
+ the current contents. To extend on our above string example:
+<programlisting>
+{
+ return value-&gt;data[0].v_pointer;
+}
+</programlisting>
+@collect_format: A string format describing how to collect the contents of
+ this value bit-by-bit. Each character in the format represents
+ an argument to be collected, and the characters themselves indicate
+ the type of the argument. Currently supported arguments are:
+<variablelist>
+ <varlistentry><term></term><listitem><para>
+ 'i' - Integers. passed as collect_values[].v_int.
+ </para></listitem></varlistentry>
+ <varlistentry><term></term><listitem><para>
+ 'l' - Longs. passed as collect_values[].v_long.
+ </para></listitem></varlistentry>
+ <varlistentry><term></term><listitem><para>
+ 'd' - Doubles. passed as collect_values[].v_double.
+ </para></listitem></varlistentry>
+ <varlistentry><term></term><listitem><para>
+ 'p' - Pointers. passed as collect_values[].v_pointer.
+ </para></listitem></varlistentry>
+</variablelist>
+ It should be noted that for variable argument list construction,
+ ANSI C promotes every type smaller than an integer to an int, and
+ floats to doubles. So for collection of short int or char, 'i'
+ needs to be used, and for collection of floats 'd'.
+@collect_value: The collect_value() function is responsible for converting the
+ values collected from a variable argument list into contents
+ suitable for storage in a GValue. This function should setup
+ @value similar to value_init(); e.g. for a string value that
+ does not allow %NULL pointers, it needs to either spew an error,
+ or do an implicit conversion by storing an empty string.
+ The @value passed in to this function has a zero-filled data
+ array, so just like for value_init() it is guaranteed to not
+ contain any old contents that might need freeing.
+ @n_collect_values is exactly the string length of @collect_format,
+ and @collect_values is an array of unions #GTypeCValue with
+ length @n_collect_values, containing the collected values
+ according to @collect_format.
+ @collect_flags is an argument provided as a hint by the caller.
+ It may contain the flag #G_VALUE_NOCOPY_CONTENTS indicating,
+ that the collected value contents may be considered "static"
+ for the duration of the @value lifetime.
+ Thus an extra copy of the contents stored in @collect_values is
+ not required for assignment to @value.
+ For our above string example, we continue with:
+<programlisting>
+{
+ if (!collect_values[0].v_pointer)
+ value->data[0].v_pointer = g_strdup ("");
+ else if (collect_flags &amp; G_VALUE_NOCOPY_CONTENTS)
+ {
+ value-&gt;data[0].v_pointer = collect_values[0].v_pointer;
+ /* keep a flag for the value_free() implementation to not free this string */
+ value-&gt;data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
+ }
+ else
+ value-&gt;data[0].v_pointer = g_strdup (collect_values[0].v_pointer);
+
+ return NULL;
+}
+</programlisting>
+ It should be noted, that it is generally a bad idea to follow the
+ #G_VALUE_NOCOPY_CONTENTS hint for reference counted types. Due to
+ reentrancy requirements and reference count assertions performed
+ by the #GSignal code, reference counts should always be incremented
+ for reference counted contents stored in the value-&gt;data array.
+ To deviate from our string example for a moment, and taking a look
+ at an exemplary implementation for collect_value() of #GObject:
+<programlisting>
+{
+ if (collect_values[0].v_pointer)
+ {
+ GObject *object = G_OBJECT (collect_values[0].v_pointer);
+
+ /* never honour G_VALUE_NOCOPY_CONTENTS for ref-counted types */
+ value-&gt;data[0].v_pointer = g_object_ref (object);
+ return NULL;
+ }
+ else
+ return g_strdup_printf ("Object passed as invalid NULL pointer");
+}
+</programlisting>
+ The reference count for valid objects is always incremented,
+ regardless of @collect_flags. For invalid objects, the example
+ returns a newly allocated string without altering @value.
+ Upon success, collect_value() needs to return %NULL. If, however,
+ an error condition occurred, collect_value() may spew an
+ error by returning a newly allocated non-%NULL string, giving
+ a suitable description of the error condition.
+ The calling code makes no assumptions about the @value
+ contents being valid upon error returns, @value
+ is simply thrown away without further freeing. As such, it is
+ a good idea to not allocate #GValue contents, prior to returning
+ an error, however, collect_values() is not obliged to return
+ a correctly setup @value for error returns, simply because
+ any non-%NULL return is considered a fatal condition so further
+ program behaviour is undefined.
+@lcopy_format: Format description of the arguments to collect for @lcopy_value,
+ analogous to @collect_format. Usually, @lcopy_format string consists
+ only of 'p's to provide lcopy_value() with pointers to storage locations.
+@lcopy_value: This function is responsible for storing the @value contents into
+ arguments passed through a variable argument list which got
+ collected into @collect_values according to @lcopy_format.
+ @n_collect_values equals the string length of @lcopy_format,
+ and @collect_flags may contain #G_VALUE_NOCOPY_CONTENTS.
+ In contrast to collect_value(), lcopy_value() is obliged to
+ always properly support #G_VALUE_NOCOPY_CONTENTS.
+ Similar to collect_value() the function may prematurely abort
+ by returning a newly allocated string describing an error condition.
+ To complete the string example:
+<programlisting>
+{
+ gchar **string_p = collect_values[0].v_pointer;
+
+ if (!string_p)
+ return g_strdup_printf ("string location passed as NULL");
+
+ if (collect_flags &amp; G_VALUE_NOCOPY_CONTENTS)
+ *string_p = value-&gt;data[0].v_pointer;
+ else
+ *string_p = g_strdup (value-&gt;data[0].v_pointer);
+
+}
+</programlisting>
+ And an illustrative version of lcopy_value() for
+ reference-counted types:
+<programlisting>
+{
+ GObject **object_p = collect_values[0].v_pointer;
+
+ if (!object_p)
+ return g_strdup_printf ("object location passed as NULL");
+ if (!value-&gt;data[0].v_pointer)
+ *object_p = NULL;
+ else if (collect_flags &amp; G_VALUE_NOCOPY_CONTENTS) /* always honour */
+ *object_p = value-&gt;data[0].v_pointer;
+ else
+ *object_p = g_object_ref (value-&gt;data[0].v_pointer);
+ return NULL;
+}
+</programlisting>
+
+<!-- ##### MACRO G_TYPE_FROM_INSTANCE ##### -->
+<para>
+Returns the type identifier from a given @instance structure.
+<para>
+</para>
+This macro should only be used in type implementations.
+</para>
+
+@instance: Location of a valid #GTypeInstance structure.
+
+
+<!-- ##### MACRO G_TYPE_FROM_CLASS ##### -->
+<para>
+Returns the type identifier from a given @class structure.
+<para>
+</para>
+This macro should only be used in type implementations.
+</para>
+
+@g_class: Location of a valid #GTypeClass structure.
+
+
+<!-- ##### MACRO G_TYPE_FROM_INTERFACE ##### -->
+<para>
+Returns the type identifier from a given @interface structure.
+<para>
+</para>
+This macro should only be used in type implementations.
+</para>
+
+@g_iface: Location of a valid #GTypeInterface structure.
+
+
+<!-- ##### MACRO G_TYPE_INSTANCE_GET_CLASS ##### -->
+<para>
+Returns the class structure of a given @instance, casted
+to a specified ancestor type @g_type of the instance.
+</para>
+<warning><para>Note
+that while calling a GInstanceInitFunc(), the class pointer gets
+modified, so it might not always return the expected pointer.
+</para></warning>
+<para>
+This macro should only be used in type implementations.
+</para>
+
+@instance: Location of the #GTypeInstance structure.
+@g_type: The anchestor type of the class to be returned.
+@c_type: The corresponding C type of @g_type.
+
+
+<!-- ##### MACRO G_TYPE_INSTANCE_GET_INTERFACE ##### -->
+<para>
+Returns the interface structure for interface @g_type of a given @instance.
+<para>
+</para>
+This macro should only be used in type implementations.
+</para>
+
+@instance: Location of the #GTypeInstance structure.
+@g_type: The interface type to be returned.
+@c_type: The corresponding C type of @g_type.
+
+
+<!-- ##### MACRO G_TYPE_INSTANCE_GET_PRIVATE ##### -->
+<para>
+Gets the private structure for a particular type.
+The private structure must have been registered in the
+class_init function with g_type_class_add_private().
+</para>
+<para>
+This macro should only be used in type implementations.
+</para>
+
+@instance: the instance of a type deriving from @private_type.
+@g_type: the type identifying which private data to retrieve.
+@c_type: The C type for the private structure.
+@Since: 2.4
+
+
+<!-- ##### MACRO G_TYPE_CHECK_INSTANCE ##### -->
+<para>
+Returns %TRUE if @instance is a valid #GTypeInstance structure,
+otherwise emits a warning and returns %FALSE.
+<para>
+</para>
+This macro should only be used in type implementations.
+</para>
+
+@instance: Location of a #GTypeInstance structure.
+
+
+<!-- ##### MACRO G_TYPE_CHECK_INSTANCE_CAST ##### -->
+<para>
+Checks that @instance is an instance of the type identified by @g_type
+and emits a warning if this is not the case. Returns @instance casted
+to a pointer to @c_type.
+</para>
+<para>
+This macro should only be used in type implementations.
+</para>
+
+@instance: Location of a #GTypeInstance structure.
+@g_type: The type to be returned.
+@c_type: The corresponding C type of @g_type.
+
+
+<!-- ##### MACRO G_TYPE_CHECK_INSTANCE_TYPE ##### -->
+<para>
+Returns %TRUE if @instance is an instance of the type identified by @g_type.
+Otherwise emits a warning and returns %FALSE.
+</para>
+<para>
+This macro should only be used in type implementations.
+</para>
+
+@instance: Location of a #GTypeInstance structure.
+@g_type: The type to be checked
+
+
+<!-- ##### MACRO G_TYPE_CHECK_CLASS_CAST ##### -->
+<para>
+Checks that @g_class is a class structure of the type identified by @g_type
+and emits a warning if this is not the case. Returns @g_class casted
+to a pointer to @c_type.
+</para>
+<para>
+This macro should only be used in type implementations.
+</para>
+
+@g_class: Location of a #GTypeClass structure.
+@g_type: The type to be returned.
+@c_type: The corresponding C type of class structure of @g_type.
+
+
+<!-- ##### MACRO G_TYPE_CHECK_CLASS_TYPE ##### -->
+<para>
+Returns %TRUE if @g_class is a class structure of the type identified by
+@g_type. Otherwise emits a warning and returns %FALSE.
+</para>
+<para>
+This macro should only be used in type implementations.
+</para>
+
+@g_class: Location of a #GTypeClass structure.
+@g_type: The type to be checked.
+
+
+<!-- ##### MACRO G_TYPE_CHECK_VALUE ##### -->
+<para>
+Returns %TRUE if @value has been initialized to hold values
+of a value type.
+</para>
+<para>
+This macro should only be used in type implementations.
+</para>
+
+@value: a #GValue
+
+
+<!-- ##### MACRO G_TYPE_CHECK_VALUE_TYPE ##### -->
+<para>
+Returns %TRUE if @value has been initialized to hold values
+of type @g_type.
+</para>
+<para>
+This macro should only be used in type implementations.
+</para>
+
+@value: a #GValue
+@g_type: The type to be checked.
+
+
+<!-- ##### MACRO G_TYPE_FLAG_RESERVED_ID_BIT ##### -->
+<para>
+A bit in the type number that's supposed to be left untouched.
+</para>
+
+
+
+<!-- ##### FUNCTION g_type_init ##### -->
+<para>
+Prior to any use of the type system, g_type_init() has to be called to initialize
+the type system and assorted other code portions (such as the various fundamental
+type implementations or the signal system).
+</para>
+
+
+
+<!-- ##### ENUM GTypeDebugFlags ##### -->
+<para>
+The <type>GTypeDebugFlags</type> enumeration values can be passed to
+g_type_init_with_debug_flags() to trigger debugging messages during runtime.
+Note that the messages can also be triggered by setting the
+<envar>GOBJECT_DEBUG</envar> environment variable to a ':'-separated list of
+"objects" and "signals".
+
+</para>
+
+@G_TYPE_DEBUG_NONE: Print no messages.
+@G_TYPE_DEBUG_OBJECTS: Print messages about object bookkeeping.
+@G_TYPE_DEBUG_SIGNALS: Print messages about signal emissions.
+@G_TYPE_DEBUG_MASK: Mask covering all debug flags.
+
+<!-- ##### FUNCTION g_type_init_with_debug_flags ##### -->
+<para>
+Similar to g_type_init(), but additionally sets debug flags.
+</para>
+
+@debug_flags: Bitwise combination of #GTypeDebugFlags values for debugging purposes.
+
+
+<!-- ##### FUNCTION g_type_name ##### -->
+<para>
+Returns the unique name that is assigned to a type ID (this is the preferred method
+to find out whether a specific type has been registered for the passed in ID yet).
+</para>
+
+@type: Type to return name for.
+@Returns: Static type name or %NULL.
+
+
+<!-- ##### FUNCTION g_type_qname ##### -->
+<para>
+Return the corresponding quark of the type IDs name.
+</para>
+
+@type: Type to return quark of type name for.
+@Returns: The type names quark or 0.
+
+
+<!-- ##### FUNCTION g_type_from_name ##### -->
+<para>
+Lookup the type ID from a given type name, returning 0 if no type has been registered under this name
+(this is the preferred method to find out by name whether a specific type has been registered yet).
+</para>
+
+@name: Type name to lookup.
+@Returns: Corresponding type ID or 0.
+
+
+<!-- ##### FUNCTION g_type_parent ##### -->
+<para>
+Return the direct parent type of the passed in type.
+If the passed in type has no parent, i.e. is a fundamental type, 0 is returned.
+</para>
+
+@type: The derived type.
+@Returns: The parent type.
+
+
+<!-- ##### FUNCTION g_type_depth ##### -->
+<para>
+Returns the length of the ancestry of the passed in type. This includes the
+type itself, so that e.g. a fundamental type has depth 1.
+</para>
+
+@type: A #GType value.
+@Returns: The depth of @type.
+
+
+<!-- ##### FUNCTION g_type_next_base ##### -->
+<para>
+Given a @leaf_type and a @root_type which is contained in its anchestry, return
+the type that @root_type is the immediate parent of.
+In other words, this function determines the type that is derived directly from
+@root_type which is also a base class of @leaf_type. Given a root type and a
+leaf type, this function can be used to determine the types and order in which
+the leaf type is descended from the root type.
+</para>
+
+@leaf_type: Descendant of @root_type and the type to be returned.
+@root_type: Immediate parent of the returned type.
+@Returns: Immediate child of @root_type and anchestor of @leaf_type.
+
+
+<!-- ##### FUNCTION g_type_is_a ##### -->
+<para>
+If @is_a_type is a derivable type, check whether @type is a descendant of @is_a_type.
+If @is_a_type is an interface, check whether @type conforms to it.
+</para>
+
+@type: Type to check anchestry for.
+@is_a_type: Possible anchestor of @type or interface @type could conform to.
+@Returns: %TRUE if @type is_a @is_a_type holds true.
+
+
+<!-- ##### FUNCTION g_type_class_ref ##### -->
+<para>
+Increments the reference count of the class structure belonging to
+@type. This function will demand-create the class if it doesn't
+exist already.
+</para>
+
+@type: Type ID of a classed type.
+@Returns: The #GTypeClass structure for the given type ID.
+
+
+<!-- ##### FUNCTION g_type_class_peek ##### -->
+<para>
+This function is essentially the same as g_type_class_ref(), except that
+the classes reference count isn't incremented. As a consequence, this function
+may return %NULL if the class of the type passed in does not currently
+exist (hasn't been referenced before).
+</para>
+
+@type: Type ID of a classed type.
+@Returns: The #GTypeClass structure for the given type ID or %NULL
+ if the class does not currently exist.
+
+
+<!-- ##### FUNCTION g_type_class_peek_static ##### -->
+<para>
+A more efficient version of g_type_class_peek() which works only for
+static types.
+</para>
+
+@type: Type ID of a classed type.
+@Returns: The #GTypeClass structure for the given type ID or %NULL
+ if the class does not currently exist or is dynamically loaded.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_type_class_unref ##### -->
+<para>
+Decrements the reference count of the class structure being passed in.
+Once the last reference count of a class has been released, classes
+may be finalized by the type system, so further dereferencing of a
+class pointer after g_type_class_unref() are invalid.
+</para>
+
+@g_class: The #GTypeClass structure to unreference.
+
+
+<!-- ##### FUNCTION g_type_class_peek_parent ##### -->
+<para>
+This is a convenience function often needed in class initializers.
+It returns the class structure of the immediate parent type of the class passed in.
+Since derived classes hold
+a reference count on their parent classes as long as they are instantiated,
+the returned class will always exist. This function is essentially
+equivalent to:
+
+<programlisting>
+g_type_class_peek (g_type_parent (G_TYPE_FROM_CLASS (g_class)));
+</programlisting>
+
+</para>
+
+@g_class: The #GTypeClass structure to retrieve the parent class for.
+@Returns: The parent class of @g_class.
+
+
+<!-- ##### FUNCTION g_type_class_add_private ##### -->
+<para>
+Registers a private structure for a instantiatable type;
+when an object is allocated, the private structures for
+the type and and all of its parent types are allocated
+sequentially in the same memory block as the public
+structures. This function should be called in the
+type's class_init() function. The private structure can
+be retrieved using the G_TYPE_INSTANCE_GET_PRIVATE() macro.
+The following example shows attaching a private structure
+<structname>MyObjectPrivate</structname> to an object
+<structname>MyObject</structname> defined in the standard GObject
+fashion.
+</para>
+<programlisting>
+typedef struct _MyObjectPrivate MyObjectPrivate;
+
+struct _MyObjectPrivate {
+ int some_field;
+};
+
+&num;define MY_OBJECT_GET_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), MY_TYPE_OBJECT, MyObjectPrivate))
+
+static void
+my_object_class_init (MyObjectClass *klass)
+{
+ g_type_class_add_private (klass, sizeof (MyObjectPrivate));
+}
+
+static int
+my_object_get_some_field (MyObject *my_object)
+{
+ MyObjectPrivate *priv = MY_OBJECT_GET_PRIVATE (my_object);
+
+ return priv->some_field;
+}
+</programlisting>
+
+@g_class: class structure for an instantiatable type
+@private_size: size of private structure.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_type_interface_peek ##### -->
+<para>
+Returns the #GTypeInterface structure of an interface to which the passed in
+class conforms.
+</para>
+
+@instance_class: A #GTypeClass structure.
+@iface_type: An interface ID which this class conforms to.
+@Returns: The GTypeInterface structure of iface_type if implemented
+ by @instance_class, %NULL otherwise
+
+
+<!-- ##### FUNCTION g_type_interface_peek_parent ##### -->
+<para>
+Returns the corresponding #GTypeInterface structure of the parent type
+of the instance type to which @g_iface belongs. This is useful when
+deriving the implementation of an interface from the parent type and
+then possibly overriding some methods.
+</para>
+
+@g_iface: A #GTypeInterface structure.
+@Returns: The corresponding #GTypeInterface structure of the parent type
+ of the instance type to which @g_iface belongs, or %NULL if the parent type
+ doesn't conform to the interface.
+
+
+<!-- ##### FUNCTION g_type_default_interface_ref ##### -->
+<para>
+Increments the reference count for the interface type @g_type,
+and returns the default interface vtable for the type.
+</para>
+<para>
+If the type is not currently in use, then the default vtable
+for the type will be created and initalized by calling
+the base interface init and default vtable init functions for
+the type (the @<structfield>base_init</structfield>
+and <structfield>class_init</structfield> members of #GTypeInfo).
+Calling g_type_default_interface_ref() is useful when you
+want to make sure that signals and properties for an interface
+have been installed.
+</para>
+
+@g_type: an interface type
+@Returns: the default vtable for the interface; call
+ g_type_default_interface_unref() when you are done using
+ the interface.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_type_default_interface_peek ##### -->
+<para>
+If the interface type @g_type is currently in use, returns
+its default interface vtable.
+</para>
+
+@g_type: an interface type
+@Returns: the default vtable for the interface, or %NULL
+ if the type is not currently in use.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_type_default_interface_unref ##### -->
+<para>
+Decrements the reference count for the type corresponding to the
+interface default vtable @g_iface. If the type is dynamic, then
+when no one is using the interface and all references have
+been released, the finalize function for the interface's default
+vtable (the <structfield>class_finalize</structfield> member of
+#GTypeInfo) will be called.
+</para>
+
+@g_iface: the default vtable structure for a interface, as
+ returned by g_type_default_interface_ref()
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_type_children ##### -->
+<para>
+Return a newly allocated and 0-terminated array of type IDs, listing the
+child types of @type. The return value has to be g_free()ed after use.
+</para>
+
+@type: The parent type.
+@n_children: Optional #guint pointer to contain the number of child types.
+@Returns: Newly allocated and 0-terminated array of child types.
+
+
+<!-- ##### FUNCTION g_type_interfaces ##### -->
+<para>
+Return a newly allocated and 0-terminated array of type IDs, listing the
+interface types that @type conforms to. The return value has to be
+g_free()ed after use.
+</para>
+
+@type: The type to list interface types for.
+@n_interfaces: Optional #guint pointer to contain the number of interface types.
+@Returns: Newly allocated and 0-terminated array of interface types.
+
+
+<!-- ##### FUNCTION g_type_interface_prerequisites ##### -->
+<para>
+Returns the prerequisites of an interfaces type.
+</para>
+
+@interface_type: an interface type
+@n_prerequisites: location to return the number of prerequisites, or %NULL
+@Returns: a newly-allocated zero-terminated array of #GType containing
+ the prerequisites of @interface_type
+@Since: 2.2
+
+
+<!-- ##### FUNCTION g_type_set_qdata ##### -->
+<para>
+Attaches arbitrary data to a type.
+</para>
+
+@type: a #GType
+@quark: a #GQuark id to identify the data
+@data: the data
+
+
+<!-- ##### FUNCTION g_type_get_qdata ##### -->
+<para>
+Obtains data which has previously been attached to @type
+with g_type_set_qdata().
+</para>
+
+@type: a #GType
+@quark: a #GQuark id to identify the data
+@Returns: the data, or %NULL if no data was found
+
+
+<!-- ##### FUNCTION g_type_query ##### -->
+<para>
+Queries the type system for information about a specific type.
+This function will fill in a user-provided structure to hold type-specific
+information. If an invalid #GType is passed in, the @type member of the
+#GTypeQuery is 0. All members filled into the #GTypeQuery structure should
+be considered constant and have to be left untouched.
+</para>
+
+@type: the #GType value of a static, classed type.
+@query: A user provided structure that is filled in with constant values
+ upon success.
+
+
+<!-- ##### STRUCT GTypeQuery ##### -->
+<para>
+A structure holding information for a specific type. It is
+filled in by the g_type_query() function.
+</para>
+
+@type: the #GType value of the type.
+@type_name: the name of the type.
+@class_size: the size of the class structure.
+@instance_size: the size of the instance structure.
+
+<!-- ##### USER_FUNCTION GBaseInitFunc ##### -->
+<para>
+A callback function used by the type system to do base initialization
+of the class structures of derived types. It is called as part of the
+initialization process of all derived classes and should reallocate
+or reset all dynamic class members copied over from the parent class.
+For example, class members (such as strings) that are not sufficiently
+handled by a plain memory copy of the parent class into the derived class
+have to be altered. See GClassInitFunc() for a discussion of the class
+intialization process.
+</para>
+
+@g_class: The #GTypeClass structure to initialize.
+
+
+<!-- ##### USER_FUNCTION GBaseFinalizeFunc ##### -->
+<para>
+A callback function used by the type system to finalize those portions
+of a derived types class structure that were setup from the corresponding
+GBaseInitFunc() function. Class finalization basically works the inverse
+way in which class intialization is performed.
+See GClassInitFunc() for a discussion of the class intialization process.
+</para>
+
+@g_class: The #GTypeClass structure to finalize.
+
+
+<!-- ##### USER_FUNCTION GClassInitFunc ##### -->
+<para>
+A callback function used by the type system to initialize the class
+of a specific type. This function should initialize all static class
+members.
+The initialization process of a class involves:
+<variablelist>
+ <varlistentry><term></term><listitem><para>
+ 1 - Copying common members from the parent class over to the
+ derived class structure.
+ </para></listitem></varlistentry>
+ <varlistentry><term></term><listitem><para>
+ 2 - Zero initialization of the remaining members not copied
+ over from the parent class.
+ </para></listitem></varlistentry>
+ <varlistentry><term></term><listitem><para>
+ 3 - Invocation of the GBaseInitFunc() initializers of all parent
+ types and the class' type.
+ </para></listitem></varlistentry>
+ <varlistentry><term></term><listitem><para>
+ 4 - Invocation of the class' GClassInitFunc() initializer.
+ </para></listitem></varlistentry>
+</variablelist>
+Since derived classes are partially initialized through a memory copy
+of the parent class, the general rule is that GBaseInitFunc() and
+GBaseFinalizeFunc() should take care of necessary reinitialization
+and release of those class members that were introduced by the type
+that specified these GBaseInitFunc()/GBaseFinalizeFunc().
+GClassInitFunc() should only care about initializing static
+class members, while dynamic class members (such as allocated strings
+or reference counted resources) are better handled by a GBaseInitFunc()
+for this type, so proper initialization of the dynamic class members
+is performed for class initialization of derived types as well.
+An example may help to correspond the intend of the different class
+initializers:
+
+<programlisting>
+typedef struct {
+ GObjectClass parent_class;
+ gint static_integer;
+ gchar *dynamic_string;
+} TypeAClass;
+static void
+type_a_base_class_init (TypeAClass *class)
+{
+ class->dynamic_string = g_strdup ("some string");
+}
+static void
+type_a_base_class_finalize (TypeAClass *class)
+{
+ g_free (class->dynamic_string);
+}
+static void
+type_a_class_init (TypeAClass *class)
+{
+ class->static_integer = 42;
+}
+
+typedef struct {
+ TypeAClass parent_class;
+ gfloat static_float;
+ GString *dynamic_gstring;
+} TypeBClass;
+static void
+type_b_base_class_init (TypeBClass *class)
+{
+ class->dynamic_gstring = g_string_new ("some other string");
+}
+static void
+type_b_base_class_finalize (TypeBClass *class)
+{
+ g_string_free (class->dynamic_gstring);
+}
+static void
+type_b_class_init (TypeBClass *class)
+{
+ class->static_float = 3.14159265358979323846;
+}
+</programlisting>
+Initialization of TypeBClass will first cause initialization of
+TypeAClass (derived classes reference their parent classes, see
+g_type_class_ref() on this).
+Initialization of TypeAClass roughly involves zero-initializing its fields,
+then calling its GBaseInitFunc() type_a_base_class_init() to allocate
+its dynamic members (dynamic_string), and finally calling its GClassInitFunc()
+type_a_class_init() to initialize its static members (static_integer).
+The first step in the initialization process of TypeBClass is then
+a plain memory copy of the contents of TypeAClass into TypeBClass and
+zero-initialization of the remaining fields in TypeBClass.
+The dynamic members of TypeAClass within TypeBClass now need
+reinitialization which is performed by calling type_a_base_class_init()
+with an argument of TypeBClass.
+After that, the GBaseInitFunc() of TypeBClass, type_b_base_class_init()
+is called to allocate the dynamic members of TypeBClass (dynamic_gstring),
+and finally the GClassInitFunc() of TypeBClass, type_b_class_init(),
+is called to complete the initialization process with the static members
+(static_float).
+Corresponding finalization counter parts to the GBaseInitFunc() functions
+have to be provided to release allocated resources at class finalization
+time.
+</para>
+
+@g_class: The #GTypeClass structure to initialize.
+@class_data: The @class_data member supplied via the #GTypeInfo structure.
+
+
+<!-- ##### USER_FUNCTION GClassFinalizeFunc ##### -->
+<para>
+A callback function used by the type system to finalize a class.
+This function is rarely needed, as dynamically allocated class resources
+should be handled by GBaseInitFunc() and GBaseFinalizeFunc().
+Also, specification of a GClassFinalizeFunc() in the #GTypeInfo
+structure of a static type is invalid, because classes of static types
+will never be finalized (they are artificially kept alive when their
+reference count drops to zero).
+</para>
+
+@g_class: The #GTypeClass structure to finalize.
+@class_data: The @class_data member supplied via the #GTypeInfo structure.
+
+
+<!-- ##### USER_FUNCTION GInstanceInitFunc ##### -->
+<para>
+A callback function used by the type system to initialize a new
+instance of a type. This function initializes all instance members and
+allocates any resources required by it.
+Initialization of a derived instance involves calling all its parent
+types instance initializers, so the class member of the instance
+is altered during its initialization to always point to the class that
+belongs to the type the current initializer was introduced for.
+</para>
+
+@instance: The instance to initialize.
+@g_class: The class of the type the instance is created for.
+
+
+<!-- ##### USER_FUNCTION GInterfaceInitFunc ##### -->
+<para>
+A callback function used by the type system to initialize a new
+interface. This function should initialize all internal data and
+allocate any resources required by the interface.
+</para>
+
+@g_iface: The interface structure to initialize.
+@iface_data: The @class_data supplied via the #GTypeInfo structure.
+
+
+<!-- ##### USER_FUNCTION GInterfaceFinalizeFunc ##### -->
+<para>
+A callback function used by the type system to finalize an interface.
+This function should destroy any internal data and release any resources
+allocated by the corresponding GInterfaceInitFunc() function.
+</para>
+
+@g_iface: The interface structure to finalize.
+@iface_data: The @class_data supplied via the #GTypeInfo structure.
+
+
+<!-- ##### USER_FUNCTION GTypeClassCacheFunc ##### -->
+<para>
+A callback function which is called when the reference count of a class
+drops to zero. It may use g_type_class_ref() to prevent the class from
+being freed. You should not call g_type_class_unref() from a
+#GTypeClassCacheFunc function to prevent infinite recursion, use
+g_type_class_unref_uncached() instead.
+</para>
+<para>
+The functions have to check the class id passed in to figure
+whether they actually want to cache the class of this type, since all
+classes are routed through the same #GTypeClassCacheFunc chain.
+</para>
+
+@cache_data: data that was given to the g_type_add_class_cache_func() call
+@g_class: The #GTypeClass structure which is unreferenced
+@Returns: %TRUE to stop further #GTypeClassCacheFunc<!-- -->s from being
+called, %FALSE to continue.
+
+
+<!-- ##### ENUM GTypeFlags ##### -->
+<para>
+Bit masks used to check or determine characteristics of a type.
+</para>
+
+@G_TYPE_FLAG_ABSTRACT: Indicates an abstract type. No instances can be
+ created for an abstract type.
+@G_TYPE_FLAG_VALUE_ABSTRACT: Indicates an abstract value type, i.e. a type
+ that introduces a value table, but can't be used for
+ g_value_init().
+
+<!-- ##### ENUM GTypeFundamentalFlags ##### -->
+<para>
+Bit masks used to check or determine specific characteristics of a
+fundamental type.
+</para>
+
+@G_TYPE_FLAG_CLASSED: Indicates a classed type.
+@G_TYPE_FLAG_INSTANTIATABLE: Indicates an instantiable type (implies classed).
+@G_TYPE_FLAG_DERIVABLE: Indicates a flat derivable type.
+@G_TYPE_FLAG_DEEP_DERIVABLE: Indicates a deep derivable type (implies derivable).
+
+<!-- ##### FUNCTION g_type_register_static ##### -->
+<para>
+Registers @type_name as the name of a new static type derived from
+@parent_type. The type system uses the information contained in the
+#GTypeInfo structure pointed to by @info to manage the type and its
+instances (if not abstract). The value of @flags determines the nature
+(e.g. abstract or not) of the type.
+</para>
+
+@parent_type: Type from which this type will be derived.
+@type_name: 0-terminated string used as the name of the new type.
+@info: The #GTypeInfo structure for this type.
+@flags: Bitwise combination of #GTypeFlags values.
+@Returns: The new type identifier.
+
+
+<!-- ##### FUNCTION g_type_register_static_simple ##### -->
+<para>
+Registers @type_name as the name of a new static type derived from
+@parent_type. The value of @flags determines the nature (e.g.
+abstract or not) of the type. It works by filling a #GTypeInfo
+struct and calling g_type_info_register_static().
+</para>
+
+@parent_type: Type from which this type will be derived.
+@type_name: 0-terminated string used as the name of the new type.
+@class_size: Size of the class structure (see #GTypeInfo)
+@class_init: Location of the class initialization function (see #GTypeInfo)
+@instance_size: Size of the instance structure (see #GTypeInfo)
+@instance_init: Location of the instance initialization function (see #GTypeInfo)
+@flags: Bitwise combination of #GTypeFlags values.
+@Returns: The new type identifier.
+@Since: 2.12
+
+
+<!-- ##### FUNCTION g_type_register_dynamic ##### -->
+<para>
+Registers @type_name as the name of a new dynamic type derived from
+@parent_type. The type system uses the information contained in the
+#GTypePlugin structure pointed to by @plugin to manage the type and its
+instances (if not abstract). The value of @flags determines the nature
+(e.g. abstract or not) of the type.
+</para>
+
+@parent_type: Type from which this type will be derived.
+@type_name: 0-terminated string used as the name of the new type.
+@plugin: The #GTypePlugin structure to retrieve the #GTypeInfo from.
+@flags: Bitwise combination of #GTypeFlags values.
+@Returns: The new type identifier or #G_TYPE_INVALID if registration failed.
+
+
+<!-- ##### FUNCTION g_type_register_fundamental ##### -->
+<para>
+Registers @type_id as the predefined identifier and @type_name as the
+name of a fundamental type. The type system uses the information
+contained in the #GTypeInfo structure pointed to by @info and the
+#GTypeFundamentalInfo structure pointed to by @finfo to manage the
+type and its instances. The value of @flags determines additional
+characteristics of the fundamental type.
+</para>
+
+@type_id: A predefined #GTypeFundamentals value.
+@type_name: 0-terminated string used as the name of the new type.
+@info: The #GTypeInfo structure for this type.
+@finfo: The #GTypeFundamentalInfo structure for this type.
+@flags: Bitwise combination of #GTypeFlags values.
+@Returns: The predefined type identifier.
+
+
+<!-- ##### FUNCTION g_type_add_interface_static ##### -->
+<para>
+Adds the static @interface_type to @instantiable_type. The information
+contained in the #GTypeInterfaceInfo structure pointed to by @info
+is used to manage the relationship.
+</para>
+
+@instance_type: #GType value of an instantiable type.
+@interface_type: #GType value of an interface type.
+@info: The #GInterfaceInfo structure for this
+ (@instance_type, @interface_type) combination.
+
+
+<!-- ##### FUNCTION g_type_add_interface_dynamic ##### -->
+<para>
+Adds the dynamic @interface_type to @instantiable_type. The information
+contained in the #GTypePlugin structure pointed to by @plugin
+is used to manage the relationship.
+</para>
+
+@instance_type: the #GType value of an instantiable type.
+@interface_type: the #GType value of an interface type.
+@plugin: the #GTypePlugin structure to retrieve the #GInterfaceInfo from.
+
+
+<!-- ##### FUNCTION g_type_interface_add_prerequisite ##### -->
+<para>
+Adds @prerequisite_type to the list of prerequisites of @interface_type.
+This means that any type implementing @interface_type must also implement
+@prerequisite_type. Prerequisites can be thought of as an alternative to
+interface derivation (which GType doesn't support). An interface can have
+at most one instantiatable prerequisite type.
+</para>
+
+@interface_type: #GType value of an interface type.
+@prerequisite_type: #GType value of an interface or instantiatable type.
+
+
+<!-- ##### FUNCTION g_type_get_plugin ##### -->
+<para>
+Returns the #GTypePlugin structure for @type or
+%NULL if @type does not have a #GTypePlugin structure.
+</para>
+
+@type: The #GType to retrieve the plugin for.
+@Returns: The corresponding plugin if @type is a dynamic type,
+ %NULL otherwise.
+
+
+<!-- ##### FUNCTION g_type_interface_get_plugin ##### -->
+<para>
+Returns the #GTypePlugin structure for the dynamic interface
+@interface_type which has been added to @instance_type, or
+%NULL if @interface_type has not been added to @instance_type or does
+not have a #GTypePlugin structure. See g_type_add_interface_dynamic().
+</para>
+
+@instance_type: the #GType value of an instantiatable type.
+@interface_type: the #GType value of an interface type.
+@Returns: the #GTypePlugin for the dynamic interface @interface_type
+ of @instance_type.
+
+
+<!-- ##### FUNCTION g_type_fundamental_next ##### -->
+<para>
+Returns the next free fundamental type id which can be used to
+register a new fundamental type with g_type_register_fundamental().
+The returned type ID represents the highest currently registered
+fundamental type identifier.
+
+</para>
+
+@Returns: The nextmost fundamental type ID to be registered,
+ or 0 if the type system ran out of fundamental type IDs.
+
+
+<!-- ##### FUNCTION g_type_fundamental ##### -->
+<para>
+Internal function, used to extract the fundamental type ID portion.
+use G_TYPE_FUNDAMENTAL() instead.
+</para>
+
+@type_id: valid type ID
+@Returns: fundamental type ID
+
+
+<!-- ##### FUNCTION g_type_create_instance ##### -->
+<para>
+Creates and initializes an instance of @type if @type is valid and can
+be instantiated. The type system only performs basic allocation and
+structure setups for instances: actual instance creation should happen
+through functions supplied by the type's fundamental type implementation.
+So use of g_type_create_instance() is reserved for implementators of
+fundamental types only. E.g. instances of the #GObject hierarchy
+should be created via g_object_new() and <emphasis>never</emphasis>
+directly through g_type_create_instance() which doesn't handle
+things like singleton objects or object construction.
+Note: Do <emphasis>not</emphasis> use this function, unless you're
+implementing a fundamental type. Also language bindings should <emphasis>not</emphasis>
+use this function but g_object_new() instead.
+</para>
+
+@type: An instantiatable type to create an instance for.
+@Returns: An allocated and initialized instance, subject to further
+ treatment by the fundamental type implementation.
+
+
+<!-- ##### FUNCTION g_type_free_instance ##### -->
+<para>
+Frees an instance of a type, returning it to the instance pool for the type,
+if there is one.
+</para>
+<para>
+Like g_type_create_instance(), this function is reserved for implementors of
+fundamental types.
+</para>
+
+@instance: an instance of a type.
+
+
+<!-- ##### FUNCTION g_type_add_class_cache_func ##### -->
+<para>
+Adds a #GTypeClassCacheFunc to be called before the reference count of a class
+goes from one to zero. This can be used to prevent premature class destruction.
+All installed #GTypeClassCacheFunc functions will be chained until one of them
+returns %TRUE. The functions have to check the class id passed in to figure
+whether they actually want to cache the class of this type, since all classes
+are routed through the same #GTypeClassCacheFunc chain.
+</para>
+
+@cache_data: data to be passed to @cache_func
+@cache_func: a #GTypeClassCacheFunc
+
+
+<!-- ##### FUNCTION g_type_remove_class_cache_func ##### -->
+<para>
+Removes a previously installed #GTypeClassCacheFunc. The cache maintained
+by @cache_func has to be empty when calling g_type_remove_class_cache_func()
+to avoid leaks.
+</para>
+
+@cache_data: data that was given when adding @cache_func
+@cache_func: a #GTypeClassCacheFunc
+
+
+<!-- ##### FUNCTION g_type_class_unref_uncached ##### -->
+<para>
+A variant of g_type_class_unref() for use in #GTypeClassCacheFunc
+implementations. It unreferences a class without consulting the chain
+of #GTypeClassCacheFunc<!-- -->s, avoiding the recursion which would occur
+otherwise.
+</para>
+
+@g_class: The #GTypeClass structure to unreference.
+
+
+<!-- ##### FUNCTION g_type_add_interface_check ##### -->
+<para>
+Adds a function to be called after an interface vtable is
+initialized for any class (i.e. after the @interface_init
+member of #GInterfaceInfo has been called).
+</para>
+<para>
+This function is useful when you want to check an invariant
+that depends on the interfaces of a class. For instance,
+the implementation of #GObject uses this facility to check
+that an object implements all of the properties that are
+defined on its interfaces.
+</para>
+
+@check_data: data to pass to @check_func
+@check_func: function to be called after each interface
+ is initialized.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_type_remove_interface_check ##### -->
+<para>
+Removes an interface check function added with
+g_type_add_interface_check().
+</para>
+
+@check_data: callback data passed to g_type_add_interface_check()
+@check_func: callback function passed to g_type_add_interface_check()
+@Since: 2.4
+
+
+<!-- ##### USER_FUNCTION GTypeInterfaceCheckFunc ##### -->
+<para>
+A callback called after an interface vtable is initialized.
+See g_type_add_interface_check().
+</para>
+
+@check_data: data passed to g_type_add_interface_check().
+@g_iface: the interface that has been initialized
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_type_value_table_peek ##### -->
+<para>
+Returns the location of the #GTypeValueTable associated with @type.
+<emphasis>Note that this function should only be used from source code
+that implements or has internal knowledge of the implementation of
+@type.</emphasis>
+</para>
+
+@type: A #GType value.
+@Returns: Location of the #GTypeValueTable associated with @type or
+ %NULL if there is no #GTypeValueTable associated with @type.
+
+
+<!-- ##### MACRO G_DEFINE_TYPE ##### -->
+<para>
+A convenience macro for type implementations, which declares a
+class initialization function, an instance initialization function (see #GTypeInfo for information about
+these) and a static variable named @t_n<!-- -->_parent_class pointing to the parent class. Furthermore, it defines
+a *_get_type() function. See G_DEFINE_TYPE_EXTENDED() for an example.
+</para>
+
+@TN: The name of the new type, in Camel case.
+@t_n: The name of the new type, in lowercase, with words
+ separated by '_'.
+@T_P: The #GType of the parent type.
+@Since: 2.4
+
+
+<!-- ##### MACRO G_DEFINE_TYPE_WITH_CODE ##### -->
+<para>
+A convenience macro for type implementations.
+Similar to G_DEFINE_TYPE(), but allows to insert custom code into the
+*_get_type() function, e.g. interface implementations via G_IMPLEMENT_INTERFACE().
+See G_DEFINE_TYPE_EXTENDED() for an example.
+</para>
+
+@TN: The name of the new type, in Camel case.
+@t_n: The name of the new type in lowercase, with words separated by '_'.
+@T_P: The #GType of the parent type.
+@_C_: Custom code that gets inserted in the *_get_type() function.
+@Since: 2.4
+
+
+<!-- ##### MACRO G_DEFINE_ABSTRACT_TYPE ##### -->
+<para>
+A convenience macro for type implementations.
+Similar to G_DEFINE_TYPE(), but defines an abstract type.
+See G_DEFINE_TYPE_EXTENDED() for an example.
+</para>
+
+@TN: The name of the new type, in Camel case.
+@t_n: The name of the new type, in lowercase, with words
+ separated by '_'.
+@T_P: The #GType of the parent type.
+@Since: 2.4
+
+
+<!-- ##### MACRO G_DEFINE_ABSTRACT_TYPE_WITH_CODE ##### -->
+<para>
+A convenience macro for type implementations.
+Similar to G_DEFINE_TYPE_WITH_CODE(), but defines an abstract type and allows to
+insert custom code into the *_get_type() function, e.g. interface implementations
+via G_IMPLEMENT_INTERFACE(). See G_DEFINE_TYPE_EXTENDED() for an example.
+</para>
+
+@TN: The name of the new type, in Camel case.
+@t_n: The name of the new type, in lowercase, with words
+ separated by '_'.
+@T_P: The #GType of the parent type.
+@_C_: Custom code that gets inserted in the @type_name_get_type() function.
+@Since: 2.4
+
+
+<!-- ##### MACRO G_IMPLEMENT_INTERFACE ##### -->
+<para>
+A convenience macro to ease interface addition in the @_C_ section
+of G_DEFINE_TYPE_WITH_CODE() or G_DEFINE_ABSTRACT_TYPE_WITH_CODE().
+See G_DEFINE_TYPE_EXTENDED() for an example.
+</para>
+<para>
+Note that this macro can only be used together with the G_DEFINE_TYPE_*
+macros, since it depends on variable names from those macros.
+</para>
+
+@TYPE_IFACE: The #GType of the interface to add
+@iface_init: The interface init function
+@Since: 2.4
+
+
+<!-- ##### MACRO G_DEFINE_TYPE_EXTENDED ##### -->
+<para>
+The most general convenience macro for type implementations, on which
+G_DEFINE_TYPE(), etc are based.
+</para>
+<informalexample><programlisting>
+G_DEFINE_TYPE_EXTENDED (GtkGadget,
+ gtk_gadget,
+ GTK_TYPE_WIDGET,
+ 0,
+ G_IMPLEMENT_INTERFACE (TYPE_GIZMO,
+ gtk_gadget_gizmo_init));
+</programlisting>
+expands to
+<programlisting>
+static void gtk_gadget_init (GtkGadget *self);
+static void gtk_gadget_class_init (GtkGadgetClass *klass);
+static gpointer gtk_gadget_parent_class = NULL;
+static void gtk_gadget_class_intern_init (gpointer klass)
+{
+ gtk_gadget_parent_class = g_type_class_peek_parent (klass);
+ gtk_gadget_class_init ((GtkGadgetClass*) klass);
+}
+<!-- -->
+GType
+gtk_gadget_get_type (void)
+{
+ static GType g_define_type_id = 0;
+ if (G_UNLIKELY (g_define_type_id == 0))
+ {
+ static const GTypeInfo g_define_type_info = {
+ sizeof (GtkGadgetClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) gtk_gadget_class_intern_init,
+ (GClassFinalizeFunc) NULL,
+ NULL, /* class_data */
+ sizeof (GtkGadget),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) gtk_gadget_init,
+ };
+ g_define_type_id = g_type_register_static (GTK_TYPE_WIDGET, "GtkGadget", &amp;g_define_type_info, 0);
+ {
+ static const GInterfaceInfo g_implement_interface_info = {
+ (GInterfaceInitFunc) gtk_gadget_gizmo_init
+ };
+ g_type_add_interface_static (g_define_type_id, TYPE_GIZMO, &amp;g_implement_interface_info);
+ }
+ }
+ return g_define_type_id;
+}
+</programlisting>
+The only pieces which have to be manually provided are the definitions of the
+instance and class structure and the definitions of the instance and class
+init functions.
+</informalexample>
+
+@TN:
+@t_n:
+@T_P:
+@_f_:
+@_C_:
+@Since: 2.4
+<!-- # Unused Parameters # -->
+@TypeName: The name of the new type, in Camel case.
+@type_name: The name of the new type, in lowercase, with words
+ separated by '_'.
+@TYPE_PARENT: The #GType of the parent type.
+@flags: #GTypeFlags to pass to g_type_register_static()
+@CODE: Custom code that gets inserted in the *_get_type() function.
+
+
+<!-- ##### MACRO G_TYPE_INVALID ##### -->
+<para>
+An invalid #GType used as error return value in some functions which return
+a #GType.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_NONE ##### -->
+<para>
+A fundamental type which is used as a replacement for the C
+<literal>void</literal> return type.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_INTERFACE ##### -->
+<para>
+The fundamental type from which all interfaces are derived.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_CHAR ##### -->
+ <para>
+ The fundamental type corresponding to #gchar.
+ The type designated by G_TYPE_CHAR is unconditionally an 8-bit signed integer.
+ This may or may not be the same type a the C type "gchar".
+ </para>
+
+
+
+<!-- ##### MACRO G_TYPE_UCHAR ##### -->
+<para>
+The fundamental type corresponding to #guchar.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_BOOLEAN ##### -->
+<para>
+The fundamental type corresponding to #gboolean.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_INT ##### -->
+<para>
+The fundamental type corresponding to #gint.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_UINT ##### -->
+<para>
+The fundamental type corresponding to #guint.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_LONG ##### -->
+<para>
+The fundamental type corresponding to #glong.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_ULONG ##### -->
+<para>
+The fundamental type corresponding to #gulong.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_INT64 ##### -->
+<para>
+The fundamental type corresponding to #gint64.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_UINT64 ##### -->
+<para>
+The fundamental type corresponding to #guint64.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_ENUM ##### -->
+<para>
+The fundamental type from which all enumeration types are derived.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_FLAGS ##### -->
+<para>
+The fundamental type from which all flags types are derived.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_FLOAT ##### -->
+<para>
+The fundamental type corresponding to #gfloat.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_DOUBLE ##### -->
+<para>
+The fundamental type corresponding to #gdouble.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_STRING ##### -->
+<para>
+The fundamental type corresponding to nul-terminated C strings.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_POINTER ##### -->
+<para>
+The fundamental type corresponding to #gpointer.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_BOXED ##### -->
+<para>
+The fundamental type from which all boxed types are derived.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_PARAM ##### -->
+<para>
+The fundamental type from which all #GParamSpec types are derived.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_OBJECT ##### -->
+<para>
+The fundamental type for #GObject.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_GTYPE ##### -->
+<para>
+The type for #GType.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_RESERVED_GLIB_FIRST ##### -->
+<para>
+First fundamental type number to create a new fundamental type id with
+G_TYPE_MAKE_FUNDAMENTAL() reserved for GLib.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_RESERVED_GLIB_LAST ##### -->
+<para>
+Last fundamental type number reserved for GLib.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_RESERVED_BSE_FIRST ##### -->
+<para>
+First fundamental type number to create a new fundamental type id with
+G_TYPE_MAKE_FUNDAMENTAL() reserved for BSE.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_RESERVED_BSE_LAST ##### -->
+<para>
+Last fundamental type number reserved for BSE.
+</para>
+
+
+
+<!-- ##### MACRO G_TYPE_RESERVED_USER_FIRST ##### -->
+<para>
+First available fundamental type number to create new fundamental
+type id with G_TYPE_MAKE_FUNDAMENTAL().
+</para>
+
+<!--
+Local variables:
+mode: sgml
+sgml-parent-document: ("../gobject-docs.sgml" "book" "refsect2" "")
+End:
+-->
+
+
+
diff --git a/trunk/docs/reference/gobject/tmpl/gtypemodule.sgml b/trunk/docs/reference/gobject/tmpl/gtypemodule.sgml
new file mode 100644
index 000000000..3b2e9ee75
--- /dev/null
+++ b/trunk/docs/reference/gobject/tmpl/gtypemodule.sgml
@@ -0,0 +1,290 @@
+<!-- ##### SECTION Title ##### -->
+GTypeModule
+
+<!-- ##### SECTION Short_Description ##### -->
+Type loading modules
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+#GTypeModule provides a simple implementation of the #GTypePlugin
+interface. The model of #GTypeModule is a dynamically loaded module
+which implements some number of types and interface
+implementations. When the module is loaded, it registers its types
+and interfaces using g_type_module_register_type() and
+g_type_module_add_interface(). As long as any instances of these
+types and interface implementations are in use, the module is kept
+loaded. When the types and interfaces are gone, the module may be
+unloaded. If the types and interfaces become used again, the module
+will be reloaded. Note that the last unref can not happen in module
+code, since that would lead to the caller's code being unloaded before
+g_object_unref() returns to it.
+</para>
+<para>
+Keeping track of whether the module should be loaded or not is done by
+using a use count - it starts at zero, and whenever it is greater than
+zero, the module is loaded. The use count is maintained internally by
+the type system, but also can be explicitly controlled by
+g_type_module_use() and g_type_module_unuse(). Typically, when loading
+a module for the first type, g_type_module_use() will be used to load
+it so that it can initialize its types. At some later point, when the
+module no longer needs to be loaded except for the type
+implementations it contains, g_type_module_unuse() is called.
+</para>
+<para>
+#GTypeModule does not actually provide any implementation of module
+loading and unloading. To create a particular module type you must
+derive from #GTypeModule and implement the load and unload functions
+in #GTypeModuleClass.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+<variablelist>
+
+<varlistentry>
+<term>#GTypePlugin</term>
+<listitem><para>The abstract type loader interface.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>#GModule</term>
+<listitem><para>Portable mechanism for dynamically loaded modules.</para></listitem>
+</varlistentry>
+
+</variablelist>
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GTypeModule ##### -->
+<para>
+The members of the <structname>GTypeModule</structname> structure should not
+be accessed directly, except for the @name field.
+</para>
+
+@name: the name of the module
+
+<!-- ##### STRUCT GTypeModuleClass ##### -->
+<para>
+In order to implement dynamic loading of types based on #GTypeModule,
+the @load and @unload functions in #GTypeModuleClass must be implemented.
+</para>
+
+@parent_class: the parent class
+@load: loads the module and registers one or more types using
+ g_type_module_register_type().
+@unload: unloads the module
+
+<!-- ##### FUNCTION g_type_module_use ##### -->
+<para>
+Increases the use count of a #GTypeModule by one. If the
+use count was zero before, the plugin will be loaded.
+</para>
+
+@module: a #GTypeModule
+@Returns: %FALSE if the plugin needed to be loaded and
+ loading the plugin failed.
+
+
+<!-- ##### FUNCTION g_type_module_unuse ##### -->
+<para>
+Decreases the use count of a #GTypeModule by one. If the
+result is zero, the module will be unloaded. (However, the
+#GTypeModule will not be freed, and types associated with the
+#GTypeModule are not unregistered. Once a #GTypeModule is
+initialized, it must exist forever.)
+</para>
+
+@module: a #GTypeModule
+
+
+<!-- ##### FUNCTION g_type_module_set_name ##### -->
+<para>
+Sets the name for a #GTypeModule
+</para>
+
+@module: a #GTypeModule.
+@name: a human-readable name to use in error messages.
+
+
+<!-- ##### FUNCTION g_type_module_register_type ##### -->
+<para>
+Looks up or registers a type that is implemented with a particular
+type plugin. If a type with name @type_name was previously registered,
+the #GType identifier for the type is returned, otherwise the type
+is newly registered, and the resulting #GType identifier returned.
+</para>
+<para>
+When reregistering a type (typically because a module is unloaded
+then reloaded, and reinitialized), @module and @parent_type must
+be the same as they were previously.
+</para>
+<para>
+As long as any instances of the type exist, the type plugin will
+not be unloaded.
+</para>
+
+@module: a #GTypeModule
+@parent_type: the type for the parent class
+@type_name: name for the type
+@type_info: type information structure
+@flags: flags field providing details about the type
+@Returns: the new or existing type ID
+
+
+<!-- ##### FUNCTION g_type_module_add_interface ##### -->
+<para>
+Registers an additional interface for a type, whose interface
+lives in the given type plugin. If the interface was already registered
+for the type in this plugin, nothing will be done.
+</para>
+<para>
+As long as any instances of the type exist, the type plugin will
+not be unloaded.
+</para>
+
+@module: a #GTypeModule
+@instance_type: type to which to add the interface.
+@interface_type: interface type to add
+@interface_info: type information structure
+
+
+<!-- ##### FUNCTION g_type_module_register_enum ##### -->
+<para>
+Looks up or registers an enumeration that is implemented with a particular
+type plugin. If a type with name @type_name was previously registered,
+the #GType identifier for the type is returned, otherwise the type
+is newly registered, and the resulting #GType identifier returned.
+</para>
+<para>
+As long as any instances of the type exist, the type plugin will
+not be unloaded.
+</para>
+
+@module: a #GTypeModule
+@name: name for the type
+@_static_values:
+@Returns: the new or existing type ID
+@Since: 2.6
+<!-- # Unused Parameters # -->
+@const_static_values: an array of #GEnumValue structs for the possible
+ enumeration values. The array is terminated by a struct with all
+ members being 0.
+
+
+<!-- ##### FUNCTION g_type_module_register_flags ##### -->
+<para>
+Looks up or registers a flags type that is implemented with a particular
+type plugin. If a type with name @type_name was previously registered,
+the #GType identifier for the type is returned, otherwise the type
+is newly registered, and the resulting #GType identifier returned.
+</para>
+<para>
+As long as any instances of the type exist, the type plugin will
+not be unloaded.
+</para>
+
+@module: a #GTypeModule
+@name: name for the type
+@_static_values:
+@Returns: the new or existing type ID
+@Since: 2.6
+<!-- # Unused Parameters # -->
+@const_static_values: an array of #GFlagsValue structs for the possible
+ flags values. The array is terminated by a struct with all
+ members being 0.
+
+
+<!-- ##### MACRO G_DEFINE_DYNAMIC_TYPE ##### -->
+<para>
+A convenience macro for dynamic type implementations, which declares a
+class initialization function, an instance initialization function (see
+#GTypeInfo for information about these) and a static variable named
+@t_n<!-- -->_parent_class pointing to the parent class. Furthermore,
+it defines a <function>*_get_type()</function> and a static
+<function>*_register_type()</function> function for use in your
+<function>module_init()</function>.
+See G_DEFINE_DYNAMIC_TYPE_EXTENDED() for an example.
+</para>
+
+@TN: The name of the new type, in Camel case.
+@t_n: The name of the new type, in lowercase, with words
+ separated by '_'.
+@T_P: The #GType of the parent type.
+@Since: 2.14
+
+
+<!-- ##### MACRO G_DEFINE_DYNAMIC_TYPE_EXTENDED ##### -->
+<para>
+A more general version of G_DEFINE_DYNAMIC_TYPE() which
+allows to specify #GTypeFlags and custom code.
+</para>
+<informalexample><programlisting>
+G_DEFINE_DYNAMIC_TYPE_EXTENDED (GtkGadget,
+ gtk_gadget,
+ GTK_TYPE_THING,
+ 0,
+ G_IMPLEMENT_INTERFACE (TYPE_GIZMO,
+ gtk_gadget_gizmo_init));
+</programlisting>
+expands to
+<programlisting>
+static void gtk_gadget_init (GtkGadget *self);
+static void gtk_gadget_class_init (GtkGadgetClass *klass);
+static void gtk_gadget_class_finalize (GtkGadgetClass *klass);
+<!-- -->
+static gpointer gtk_gadget_parent_class = NULL;
+static GType gtk_gadget_type_id = 0;
+<!-- -->
+static void gtk_gadget_class_intern_init (gpointer klass)
+{
+ gtk_gadget_parent_class = g_type_class_peek_parent (klass);
+ gtk_gadget_class_init ((GtkGadgetClass*) klass);
+}
+<!-- -->
+GType
+gtk_gadget_get_type (void)
+{
+ return gtk_gadget_type_id;
+}
+<!-- -->
+static void
+gtk_gadget_register_type (GTypeModule *type_module)
+{
+ const GTypeInfo g_define_type_info = {
+ sizeof (GtkGadgetClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) gtk_gadget_class_intern_init,
+ (GClassFinalizeFunc) gtk_gadget_class_finalize,
+ NULL, /* class_data */
+ sizeof (GtkGadget),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) gtk_gadget_init,
+ NULL /* value_table */
+ };
+ gtk_gadget_type_id = g_type_module_register_type (type_module,
+ GTK_TYPE_THING,
+ GtkGadget,
+ &amp;g_define_type_info,
+ (GTypeFlags) flags);
+ {
+ const GInterfaceInfo g_implement_interface_info = {
+ (GInterfaceInitFunc) gtk_gadget_gizmo_init
+ };
+ g_type_add_interface_static (g_define_type_id, TYPE_GIZMO, &amp;g_implement_interface_info);
+ }
+}
+</programlisting>
+</informalexample>
+
+@TypeName: The name of the new type, in Camel case.
+@type_name: The name of the new type, in lowercase, with words
+ separated by '_'.
+@TYPE_PARENT: The #GType of the parent type.
+@flags: #GTypeFlags to pass to g_type_register_static()
+@CODE: Custom code that gets inserted in the *_get_type() function.
+@Since: 2.14
+
+
diff --git a/trunk/docs/reference/gobject/tmpl/gtypeplugin.sgml b/trunk/docs/reference/gobject/tmpl/gtypeplugin.sgml
new file mode 100644
index 000000000..07b535f7e
--- /dev/null
+++ b/trunk/docs/reference/gobject/tmpl/gtypeplugin.sgml
@@ -0,0 +1,187 @@
+<!-- ##### SECTION Title ##### -->
+GTypePlugin
+
+<!-- ##### SECTION Short_Description ##### -->
+An interface for dynamically loadable types
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The GObject type system supports dynamic loading of types. The #GTypePlugin
+interface is used to handle the lifecycle of dynamically loaded types.
+It goes as follows:
+</para>
+<para>
+<orderedlist>
+<listitem><para>
+ The type is initially introduced (usually upon loading the module
+ the first time, or by your main application that knows what modules
+ introduces what types), like this:
+<literal>new_type_id = g_type_register_dynamic (parent_type_id,
+ "TypeName",
+ new_type_plugin,
+ type_flags);
+</literal>
+ where <literal>new_type_plugin</literal> is an implementation of the
+ #GTypePlugin interface.
+</para></listitem>
+<listitem><para>
+ The type's implementation is referenced, e.g. through
+ g_type_class_ref() or through g_type_create_instance() (this is
+ being called by g_object_new()) or through one of the above done on
+ a type derived from <literal>new_type_id</literal>.
+</para></listitem>
+<listitem><para>
+ This causes the type system to load the type's implementation by calling
+ g_type_plugin_use() and g_type_plugin_complete_type_info() on
+ <literal>new_type_plugin</literal>.
+</para></listitem>
+<listitem><para>
+ At some point the type's implementation isn't required anymore, e.g. after
+ g_type_class_unref() or g_type_free_instance() (called when the reference
+ count of an instance drops to zero).
+</para></listitem>
+<listitem><para>
+ This causes the type system to throw away the information retrieved from
+ g_type_plugin_complete_type_info() and then it calls
+ g_type_plugin_unuse() on <literal>new_type_plugin</literal>.
+</para></listitem>
+<listitem><para>
+ Things may repeat from the second step.
+</para></listitem>
+</orderedlist>
+</para>
+<para>
+So basically, you need to implement a #GTypePlugin type that carries a
+use_count, once use_count goes from zero to one, you need to load the
+implementation to successfully handle the upcoming
+g_type_plugin_complete_type_info() call. Later, maybe after succeeding
+use/unuse calls, once use_count drops to zero, you can unload the
+implementation again. The type system makes sure to call g_type_plugin_use()
+and g_type_plugin_complete_type_info() again when the type is needed again.
+</para>
+<para>
+#GTypeModule is an implementation of #GTypePlugin that already implements
+most of this except for the actual module loading and unloading. It even
+handles multiple registered types per module.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+#GTypeModule and g_type_register_dynamic().
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GTypePlugin ##### -->
+<para>
+The <structname>GTypePlugin</structname> typedef is used as a placeholder
+for objects that implement the <structname>GTypePlugin</structname>
+interface.
+</para>
+
+
+<!-- ##### STRUCT GTypePluginClass ##### -->
+<para>
+The #GTypePlugin interface is used by the type system in order to handle
+the lifecycle of dynamically loaded types.
+</para>
+
+@use_plugin: Increases the use count of the plugin.
+@unuse_plugin: Decreases the use count of the plugin.
+@complete_type_info: Fills in the #GTypeInfo and
+ #GTypeValueTable structs for the type. The structs are initialized
+ with <literal>memset(s, 0, sizeof (s))</literal> before calling
+ this function.
+@complete_interface_info: Fills in missing parts of the #GInterfaceInfo
+ for the interface. The structs is initialized with
+ <literal>memset(s, 0, sizeof (s))</literal> before calling
+ this function.
+
+<!-- ##### USER_FUNCTION GTypePluginUse ##### -->
+<para>
+The type of the @use_plugin function of #GTypePluginClass, which gets called
+to increase the use count of @plugin.
+</para>
+
+@plugin: the #GTypePlugin whose use count should be increased
+
+
+<!-- ##### USER_FUNCTION GTypePluginUnuse ##### -->
+<para>
+The type of the @unuse_plugin function of #GTypePluginClass.
+</para>
+
+@plugin: the #GTypePlugin whose use count should be decreased
+
+
+<!-- ##### USER_FUNCTION GTypePluginCompleteTypeInfo ##### -->
+<para>
+The type of the @complete_type_info function of #GTypePluginClass.
+</para>
+
+@plugin: the #GTypePlugin
+@g_type: the #GType whose info is completed
+@info: the #GTypeInfo struct to fill in
+@value_table: the #GTypeValueTable to fill in
+
+
+<!-- ##### USER_FUNCTION GTypePluginCompleteInterfaceInfo ##### -->
+<para>
+The type of the @complete_interface_info function of #GTypePluginClass.
+</para>
+
+@plugin: the #GTypePlugin
+@instance_type: the #GType of an instantiable type to which the interface
+ is added
+@interface_type: the #GType of the interface whose info is completed
+@info: the #GInterfaceInfo to fill in
+
+
+<!-- ##### FUNCTION g_type_plugin_use ##### -->
+<para>
+Calls the @use_plugin function from the #GTypePluginClass of @plugin.
+There should be no need to use this function outside of the GObject
+type system itself.
+</para>
+
+@plugin: a #GTypePlugin
+
+
+<!-- ##### FUNCTION g_type_plugin_unuse ##### -->
+<para>
+Calls the @unuse_plugin function from the #GTypePluginClass of @plugin.
+There should be no need to use this function outside of the GObject
+type system itself.
+</para>
+
+@plugin: a #GTypePlugin
+
+
+<!-- ##### FUNCTION g_type_plugin_complete_type_info ##### -->
+<para>
+Calls the @complete_type_info function from the #GTypePluginClass of @plugin.
+There should be no need to use this function outside of the GObject
+type system itself.
+</para>
+
+@plugin: a #GTypePlugin
+@g_type: the #GType whose info is completed
+@info: the #GTypeInfo struct to fill in
+@value_table: the #GTypeValueTable to fill in
+
+
+<!-- ##### FUNCTION g_type_plugin_complete_interface_info ##### -->
+<para>
+Calls the @complete_interface_info function from the #GTypePluginClass
+of @plugin. There should be no need to use this function outside of the
+GObject type system itself.
+</para>
+
+@plugin: the #GTypePlugin
+@instance_type: the #GType of an instantiable type to which the interface
+ is added
+@interface_type: the #GType of the interface whose info is completed
+@info: the #GInterfaceInfo to fill in
+
+
diff --git a/trunk/docs/reference/gobject/tmpl/objects.sgml b/trunk/docs/reference/gobject/tmpl/objects.sgml
new file mode 100644
index 000000000..3fba8cc27
--- /dev/null
+++ b/trunk/docs/reference/gobject/tmpl/objects.sgml
@@ -0,0 +1,1111 @@
+<!-- ##### SECTION Title ##### -->
+GObject
+
+<!-- ##### SECTION Short_Description ##### -->
+The base object type
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+GObject is the fundamental type providing the common attributes and methods
+for all object types in GTK+, Pango and other libraries based on GObject.
+The GObject class provides methods for object construction and destruction,
+property access methods, and signal support.
+Signals are described in detail in <xref linkend="gobject-Signals"/>.
+</para>
+<para id="floating-ref">
+#GInitiallyUnowned is derived from #GObject. The only difference between
+the two is that the initial reference of a #GInitiallyUnowned is flagged
+as a <firstterm>floating</firstterm> reference.
+This means that it is not specifically claimed to be "owned" by
+any code portion. The main motivation for providing floating references is
+C convenience. In particular, it allows code to be written as:
+<example><programlisting>
+ container = create_container();
+ container_add_child (container, create_child());
+</programlisting></example>
+If <function>container_add_child()</function> will g_object_ref_sink() the
+passed in child, no reference of the newly created child is leaked.
+Without floating references, <function>container_add_child()</function>
+can only g_object_ref() the new child, so to implement this code without
+reference leaks, it would have to be written as:
+<example><programlisting>
+ Child *child;
+ container = create_container();
+ child = create_child();
+ container_add_child (container, child);
+ g_object_unref (child);
+</programlisting></example>
+The floating reference can be converted into
+an ordinary reference by calling g_object_ref_sink().
+For already sunken objects (objects that don't have a floating reference
+anymore), g_object_ref_sink() is equivalent to g_object_ref() and returns
+a new reference.
+Since floating references are useful almost exclusively for C convenience,
+language bindings that provide automated reference and memory ownership
+maintenance (such as smart pointers or garbage collection) therefore don't
+need to expose floating references in their API.
+</para>
+<para>
+Some object implementations may need to save an objects floating state
+across certain code portions (an example is #GtkMenu), to achive this, the
+following sequence can be used:
+</para>
+
+<example><programlisting>
+ /* save floating state */
+ gboolean was_floating = g_object_is_floating (object);
+ g_object_ref_sink (object);
+ /* protected code portion */
+ ...;
+ /* restore floating state */
+ if (was_floating)
+ g_object_force_floating (object);
+ g_obejct_unref (object); /* release previously acquired reference */
+</programlisting></example>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+#GParamSpecObject, g_param_spec_object()
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GObject ##### -->
+<para>
+All the fields in the <structname>GObject</structname> structure are private
+to the #GObject implementation and should never be accessed directly.
+</para>
+
+
+<!-- ##### SIGNAL GObject::notify ##### -->
+<para>
+The notify signal is emitted on an object when one of its properties
+has been changed. Note that getting this signal doesn't guarantee that the
+value of the property has actually changed, it may also be emitted when
+the setter for the property is called to reinstate the previous value.
+</para>
+<para>
+This signal is typically used to obtain change notification for a
+single property, by specifying the property name as a detail in the
+g_signal_connect() call, like this:
+<informalexample><programlisting>
+g_signal_connect (text_view->buffer, "notify::paste-target-list",
+ G_CALLBACK (gtk_text_view_target_list_notify),
+ text_view)
+</programlisting></informalexample>
+It is important to note that you must use
+<link linkend="canonical-parameter-name">canonical</link> parameter names as
+detail strings for the notify signal.
+</para>
+
+@pspec: the #GParamSpec of the property which changed
+@gobject: the object which received the signal.
+
+<!-- ##### STRUCT GObjectClass ##### -->
+<para>
+The class structure for the <structname>GObject</structname> type.
+</para>
+<example>
+<title>Implementing singletons using a constructor</title>
+<programlisting>
+static MySingleton *the_singleton = NULL;
+
+static GObject*
+my_singleton_constructor (GType type,
+ guint n_construct_params,
+ GObjectConstructParam *construct_params)
+{
+ GObject *object;
+
+ if (!the_singleton)
+ {
+ object = G_OBJECT_CLASS (parent_class)->constructor (type,
+ n_construct_params,
+ construct_params);
+ the_singleton = MY_SINGLETON (object);
+ }
+ else
+ object = g_object_ref (G_OBJECT (the_singleton));
+
+ return object;
+}
+</programlisting></example>
+
+@g_type_class: the parent class
+@constructor: the @constructor function is called by g_object_new () to
+ complete the object initialization after all the construction properties are
+ set. The first thing a @constructor implementation must do is chain up to the
+ @constructor of the parent class. Overriding @constructor should be rarely
+ needed, e.g. to handle construct properties, or to implement singletons.
+@set_property: the generic setter for all properties of this type. Should be
+ overridden for every type with properties. Implementations of @set_property
+ don't need to emit property change notification explicitly, this is handled
+ by the type system.
+@get_property: the generic getter for all properties of this type. Should be
+ overridden for every type with properties.
+@dispose: the @dispose function is supposed to drop all references to other
+ objects, but keep the instance otherwise intact, so that client method
+ invocations still work. It may be run multiple times (due to reference
+ loops). Before returning, @dispose should chain up to the @dispose method
+ of the parent class.
+@finalize: instance finalization function, should finish the finalization of
+ the instance begun in @dispose and chain up to the @finalize method of the
+ parent class.
+@dispatch_properties_changed: emits property change notification for a bunch
+ of properties. Overriding @dispatch_properties_changed should be rarely
+ needed.
+@notify: the class closure for the notify signal
+@constructed: the @constructed function is called by g_object_new() as the
+ final step of the object creation process. At the point of the call, all
+ construction properties have been set on the object. The purpose of this
+ call is to allow for object initialisation steps that can only be performed
+ after construction properties have been set. @constructed implementors
+ should chain up to the @constructed call of their parent class to allow it
+ to complete its initialisation.
+
+<!-- ##### STRUCT GObjectConstructParam ##### -->
+<para>
+The <structname>GObjectConstructParam</structname> struct is an auxiliary
+structure used to hand #GParamSpec/#GValue pairs to the @constructor of
+a #GObjectClass.
+</para>
+
+@pspec: the #GParamSpec of the construct parameter
+@value: the value to set the parameter to
+
+<!-- ##### USER_FUNCTION GObjectGetPropertyFunc ##### -->
+<para>
+The type of the @get_property function of #GObjectClass.
+</para>
+
+@object: a #GObject
+@property_id: the numeric id under which the property was registered with
+ g_object_class_install_property().
+@value: a #GValue to return the property value in
+@pspec: the #GParamSpec describing the property
+
+
+<!-- ##### USER_FUNCTION GObjectSetPropertyFunc ##### -->
+<para>
+The type of the @set_property function of #GObjectClass.
+</para>
+
+@object: a #GObject
+@property_id: the numeric id under which the property was registered with
+ g_object_class_install_property().
+@value: the new value for the property
+@pspec: the #GParamSpec describing the property
+
+
+<!-- ##### USER_FUNCTION GObjectFinalizeFunc ##### -->
+<para>
+The type of the @finalize function of #GObjectClass.
+</para>
+
+@object: the #GObject being finalized
+
+
+<!-- ##### MACRO G_TYPE_IS_OBJECT ##### -->
+<para>
+Returns a boolean value of %FALSE or %TRUE indicating whether
+the passed in type id is a %G_TYPE_OBJECT or derived from it.
+</para>
+
+@type: Type id to check for is a %G_TYPE_OBJECT relationship.
+@Returns: %FALSE or %TRUE, indicating whether @type is a %G_TYPE_OBJECT.
+
+
+<!-- ##### MACRO G_OBJECT ##### -->
+<para>
+Casts a #GObject or derived pointer into a (GObject*) pointer.
+Depending on the current debugging level, this function may invoke
+certain runtime checks to identify invalid casts.
+</para>
+
+@object: Object which is subject to casting.
+
+
+<!-- ##### MACRO G_IS_OBJECT ##### -->
+<para>
+Checks whether a valid #GTypeInstance pointer is of type %G_TYPE_OBJECT.
+</para>
+
+@object: Instance to check for being a %G_TYPE_OBJECT.
+
+
+<!-- ##### MACRO G_OBJECT_CLASS ##### -->
+<para>
+Casts a derived #GObjectClass structure into a #GObjectClass structure.
+</para>
+
+@class: a valid #GObjectClass
+
+
+<!-- ##### MACRO G_IS_OBJECT_CLASS ##### -->
+<para>
+Checks whether @class "is a" valid #GObjectClass structure of type
+%G_TYPE_OBJECT or derived.
+</para>
+
+@class: a #GObjectClass
+
+
+<!-- ##### MACRO G_OBJECT_GET_CLASS ##### -->
+<para>
+Returns the class structure associated to a #GObject instance.
+</para>
+
+@object: a #GObject instance.
+
+
+<!-- ##### MACRO G_OBJECT_TYPE ##### -->
+<para>
+Return the type id of an object.
+</para>
+
+@object: Object to return the type id for.
+@Returns: Type id of @object.
+
+
+<!-- ##### MACRO G_OBJECT_TYPE_NAME ##### -->
+<para>
+Returns the name of an object's type.
+</para>
+
+@object: Object to return the type name for.
+@Returns: Type name of @object. The string is owned by the type system and
+should not be freed.
+
+
+<!-- ##### MACRO G_OBJECT_CLASS_TYPE ##### -->
+<para>
+Return the type id of a class structure.
+</para>
+
+@class: a valid #GObjectClass
+@Returns: Type id of @class.
+
+
+<!-- ##### MACRO G_OBJECT_CLASS_NAME ##### -->
+<para>
+Return the name of a class structure's type.
+</para>
+
+@class: a valid #GObjectClass
+@Returns: Type name of @class. The string is owned by the type system and
+should not be freed.
+
+
+<!-- ##### FUNCTION g_object_class_install_property ##### -->
+<para>
+Installs a new property. This is usually done in the class initializer.
+</para>
+
+@oclass: a #GObjectClass
+@property_id: the id for the new property
+@pspec: the #GParamSpec for the new property
+
+
+<!-- ##### FUNCTION g_object_class_find_property ##### -->
+<para>
+Looks up the #GParamSpec for a property of a class.
+</para>
+
+@oclass: a #GObjectClass
+@property_name: the name of the property to look up
+@Returns: the #GParamSpec for the property, or %NULL if the class doesn't have
+a property of that name
+
+
+<!-- ##### FUNCTION g_object_class_list_properties ##### -->
+<para>
+Returns an array of #GParamSpec* for all properties of a class.
+</para>
+
+@oclass: a #GObjectClass
+@n_properties: return location for the length of the returned array
+@Returns: an array of #GParamSpec* which should be freed after use
+
+
+<!-- ##### FUNCTION g_object_class_override_property ##### -->
+<para>
+Registers @property_id as referring to a property with the
+name @name in a parent class or in an interface implemented
+by @oclass. This allows this class to <firstterm>override</firstterm>
+a property implementation in a parent class or to provide
+the implementation of a property from an interface.
+</para>
+<note>
+<para>
+Internally, overriding is implemented by creating a property of type
+#GParamSpecOverride; generally operations that query the properties of
+the object class, such as g_object_class_find_property() or
+g_object_class_list_properties() will return the overridden
+property. However, in one case, the @construct_properties argument of
+the @constructor virtual function, the #GParamSpecOverride is passed
+instead, so that the @param_id field of the #GParamSpec will be
+correct. For virtually all uses, this makes no difference. If you
+need to get the overridden property, you can call
+g_param_spec_get_redirect_target().
+</para>
+</note>
+
+@oclass: a #GObjectClass
+@property_id: the new property ID
+@name: the name of a property registered in a parent class or
+ in an interface of this class.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_object_interface_install_property ##### -->
+<para>
+Add a property to an interface; this is only useful for interfaces
+that are added to GObject-derived types. Adding a property to an
+interface forces all objects classes with that interface to have a
+compatible property. The compatible property could be a newly
+created #GParamSpec, but normally
+g_object_class_override_property() will be used so that the object
+class only needs to provide an implementation and inherits the
+property description, default value, bounds, and so forth from the
+interface property.
+</para>
+<para>
+This function is meant to be called from the interface's default
+vtable initialization function (the @class_init member of
+#GTypeInfo.) It must not be called after after @class_init has
+been called for any object types implementing this interface.
+</para>
+
+@g_iface: any interface vtable for the interface, or the default
+ vtable for the interface.
+@pspec: the #GParamSpec for the new property
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_object_interface_find_property ##### -->
+<para>
+Find the #GParamSpec with the given name for an
+interface. Generally, the interface vtable passed in as @g_iface
+will be the default vtable from g_type_default_interface_ref(), or,
+if you know the interface has already been loaded,
+g_type_default_interface_peek().
+</para>
+
+@g_iface: any interface vtable for the interface, or the default
+ vtable for the interface
+@property_name: name of a property to lookup.
+@Returns: the #GParamSpec for the property of the
+ interface with the name @property_name, or %NULL
+ if no such property exists.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_object_interface_list_properties ##### -->
+<para>
+Lists the properties of an interface.Generally, the interface
+vtable passed in as @g_iface will be the default vtable from
+g_type_default_interface_ref(), or, if you know the interface has
+already been loaded, g_type_default_interface_peek().
+</para>
+
+@g_iface: any interface vtable for the interface, or the default
+ vtable for the interface
+@n_properties_p: location to store number of properties returned.
+@Returns: a pointer to an array of pointers to #GParamSpec structures.
+ The paramspecs are owned by GLib, but the array should
+ be freed with g_free() when you are done with it.
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_object_new ##### -->
+<para>
+Creates a new instance of a #GObject subtype and sets its properties.
+</para>
+<para>
+Construction parameters (see #G_PARAM_CONSTRUCT, #G_PARAM_CONSTRUCT_ONLY)
+which are not explicitly specified are set to their default values.
+</para>
+
+@object_type: the type id of the #GObject subtype to instantiate
+@first_property_name: the name of the first property
+@Varargs: the value of the first property, followed optionally by more
+ name/value pairs, followed by %NULL
+@Returns: a new instance of @object_type
+
+
+<!-- ##### FUNCTION g_object_newv ##### -->
+<para>
+Creates a new instance of a #GObject subtype and sets its properties.
+</para>
+<para>
+Construction parameters (see #G_PARAM_CONSTRUCT, #G_PARAM_CONSTRUCT_ONLY)
+which are not explicitly specified are set to their default values.
+</para>
+
+@object_type: the type id of the #GObject subtype to instantiate
+@n_parameters: the length of the @parameters array
+@parameters: an array of #GParameter
+@Returns: a new instance of @object_type
+
+
+<!-- ##### STRUCT GParameter ##### -->
+<para>
+The <structname>GParameter</structname> struct is an auxiliary structure used
+to hand parameter name/value pairs to g_object_newv().
+</para>
+
+@name: the parameter name
+@value: the parameter value
+
+<!-- ##### FUNCTION g_object_ref ##### -->
+<para>
+Increases the reference count of @object.
+</para>
+
+@object: a #GObject
+@Returns: the same @object
+
+
+<!-- ##### FUNCTION g_object_unref ##### -->
+<para>
+Decreases the reference count of @object.
+When its reference count drops to 0, the object is finalized
+(i.e. its memory is freed).
+</para>
+
+@object: a #GObject
+
+
+<!-- ##### FUNCTION g_object_ref_sink ##### -->
+<para>
+Increase the reference count of @object, and possibly remove the
+<link linkend="floating-ref">floating</link> reference, if @object
+has a floating reference.
+</para>
+<para>
+In other words, if the object is floating, then this call "assumes
+ownership" of the floating reference, converting it to a normal reference
+by clearing the floating flag while leaving the reference count unchanged.
+If the object is not floating, then this call adds a new normal reference
+increasing the reference count by one.
+</para>
+
+@object: a #GObject
+@Returns: @object
+@Since: 2.10
+
+
+<!-- ##### TYPEDEF GInitiallyUnowned ##### -->
+<para>
+All the fields in the <structname>GInitiallyUnowned</structname> structure
+are private to the #GInitiallyUnowned implementation and should never be
+accessed directly.
+</para>
+
+
+<!-- ##### TYPEDEF GInitiallyUnownedClass ##### -->
+<para>
+The class structure for the <structname>GInitiallyUnowned</structname> type.
+</para>
+
+
+<!-- ##### MACRO G_TYPE_INITIALLY_UNOWNED ##### -->
+<para>
+The type for #GInitiallyUnowned.
+</para>
+
+
+
+<!-- ##### FUNCTION g_object_is_floating ##### -->
+<para>
+Checks wether @object has a <link linkend="floating-ref">floating</link>
+reference.
+</para>
+
+@object: a #GObject
+@Returns: %TRUE if @object has a floating reference
+@Since: 2.10
+
+
+<!-- ##### FUNCTION g_object_force_floating ##### -->
+<para>
+This function is intended for #GObject implementations to re-enforce a
+<link linkend="floating-ref">floating</link> object reference.
+Doing this is seldomly required, all
+#GInitiallyUnowned<!-- -->s are created with a floating reference which
+usually just needs to be sunken by calling g_object_ref_sink().
+</para>
+
+@object: a #GObject
+@Since: 2.10
+
+
+<!-- ##### USER_FUNCTION GWeakNotify ##### -->
+<para>
+A #GWeakNotify function can be added to an object as a callback that gets
+triggered when the object is finalized. Since the object is already being
+finalized when the #GWeakNotify is called, there's not much you could do
+with the object, apart from e.g. using its adress as hash-index or the like.
+</para>
+
+@data: data that was provided when the weak reference was established
+@where_the_object_was: the object being finalized
+
+
+<!-- ##### FUNCTION g_object_weak_ref ##### -->
+<para>
+Adds a weak reference callback to an object. Weak references are used for
+notification when an object is finalized. They are called "weak references"
+because they allow you to safely hold a pointer to an object without calling
+g_object_ref() (g_object_ref() adds a strong reference, that is, forces the
+object to stay alive).
+</para>
+
+@object: #GObject to reference weakly
+@notify: callback to invoke before the object is freed
+@data: extra data to pass to notify
+
+
+<!-- ##### FUNCTION g_object_weak_unref ##### -->
+<para>
+Removes a weak reference callback to an object.
+</para>
+
+@object: #GObject to remove a weak reference from
+@notify: callback to search for
+@data: data to search for
+
+
+<!-- ##### FUNCTION g_object_add_weak_pointer ##### -->
+<para>
+Adds a weak reference from weak_pointer to @object to indicate that
+the pointer located at @weak_pointer_location is only valid during the
+lifetime of @object. When the @object is finalized, @weak_pointer will
+be set to %NULL.
+</para>
+
+@object: The object that should be weak referenced.
+@weak_pointer_location: The memory address of a pointer.
+
+
+<!-- ##### FUNCTION g_object_remove_weak_pointer ##### -->
+<para>
+Removes a weak reference from @object that was previously added
+using g_object_add_weak_pointer(). The @weak_pointer_location has
+to match the one used with g_object_add_weak_pointer().
+</para>
+
+@object: The object that is weak referenced.
+@weak_pointer_location: The memory address of a pointer.
+
+
+<!-- ##### USER_FUNCTION GToggleNotify ##### -->
+<para>
+A callback function used for notification when the state
+of a toggle reference changes. See g_object_add_toggle_ref().
+</para>
+
+@data: Callback data passed to g_object_add_toggle_ref()
+@object: The object on which g_object_add_toggle_ref() was called.
+@is_last_ref: %TRUE if the toggle reference is now the
+ last reference to the object. %FALSE if the toggle
+ reference was the last reference and there are now other
+ references.
+
+
+<!-- ##### FUNCTION g_object_add_toggle_ref ##### -->
+<para>
+Increases the reference count of the object by one and sets a
+callback to be called when all other references to the object are
+dropped, or when this is already the last reference to the object
+and another reference is established.
+</para>
+<para>
+This functionality is intended for binding @object to a proxy
+object managed by another memory manager. This is done with two
+paired references: the strong reference added by
+g_object_add_toggle_ref() and a reverse reference to the proxy
+object which is either a strong reference or weak reference.
+</para>
+<para>
+The setup is that when there are no other references to @object,
+only a weak reference is held in the reverse direction from @object
+to the proxy object, but when there are other references held to
+@object, a strong reference is held. The @notify callback is called
+when the reference from @object to the proxy object should be
+<firstterm>toggled</firstterm> from strong to weak (@is_last_ref
+true) or weak to strong (@is_last_ref false).
+</para>
+<para>
+Since a (normal) reference must be held to the object before
+calling g_object_toggle_ref(), the initial state of the reverse
+link is always strong.
+</para>
+<para>
+Multiple toggle references may be added to the same gobject,
+however if there are multiple toggle references to an object, none
+of them will ever be notified until all but one are removed. For
+this reason, you should only ever use a toggle reference if there
+is important state in the proxy object.
+</para>
+
+@object: a #GObject
+@notify: a function to call when this reference is the
+ last reference to the object, or is no longer
+ the last reference.
+@data: data to pass to @notify
+@Since: 2.8
+
+
+<!-- ##### FUNCTION g_object_remove_toggle_ref ##### -->
+<para>
+Removes a reference added with g_object_add_toggle_ref(). The
+reference count of the object is decreased by one.
+</para>
+
+@object: a #GObject
+@notify: a function to call when this reference is the
+ last reference to the object, or is no longer
+ the last reference.
+@data: data to pass to @notify
+@Since: 2.8
+
+
+<!-- ##### FUNCTION g_object_connect ##### -->
+<para>
+A convenience function to connect multiple signals at once.
+</para>
+<para>
+The signal specs expected by this function have the form
+"modifier::signal_name", where modifier can be one of the following:
+<variablelist>
+<varlistentry>
+<term>signal</term>
+<listitem><para>
+equivalent to <literal>g_signal_connect_data (...)</literal>
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>object_signal</term>
+<term>object-signal</term>
+<listitem><para>
+equivalent to <literal>g_signal_connect_object (...)</literal>
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>swapped_signal</term>
+<term>swapped-signal</term>
+<listitem><para>
+equivalent to <literal>g_signal_connect_data (..., G_CONNECT_SWAPPED)</literal>
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>swapped_object_signal</term>
+<term>swapped-object-signal</term>
+<listitem><para>
+equivalent to <literal>g_signal_connect_object (..., G_CONNECT_SWAPPED)</literal>
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>signal_after</term>
+<term>signal-after</term>
+<listitem><para>
+equivalent to <literal>g_signal_connect_data (..., G_CONNECT_AFTER)</literal>
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>object_signal_after</term>
+<term>object-signal-after</term>
+<listitem><para>
+equivalent to <literal>g_signal_connect_object (..., G_CONNECT_AFTER)</literal>
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>swapped_signal_after</term>
+<term>swapped-signal-after</term>
+<listitem><para>
+equivalent to <literal>g_signal_connect_data (..., G_CONNECT_SWAPPED | G_CONNECT_AFTER)</literal>
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>swapped_object_signal_after</term>
+<term>swapped-object-signal-after</term>
+<listitem><para>
+equivalent to <literal>g_signal_connect_object (..., G_CONNECT_SWAPPED | G_CONNECT_AFTER)</literal>
+</para></listitem>
+</varlistentry>
+</variablelist>
+</para>
+<informalexample>
+<programlisting>
+ menu->toplevel = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
+ "type", GTK_WINDOW_POPUP,
+ "child", menu,
+ NULL),
+ "signal::event", gtk_menu_window_event, menu,
+ "signal::size_request", gtk_menu_window_size_request, menu,
+ "signal::destroy", gtk_widget_destroyed, &amp;menu-&gt;toplevel,
+ NULL);
+</programlisting>
+</informalexample>
+
+@object: a #GObject
+@signal_spec: the spec for the first signal
+@Varargs: #GCallback for the first signal, followed by data for the first signal,
+ followed optionally by more signal spec/callback/data triples,
+ followed by %NULL
+@Returns: @object
+
+
+<!-- ##### FUNCTION g_object_disconnect ##### -->
+<para>
+A convenience function to disconnect multiple signals at once.
+</para>
+<para>
+The signal specs expected by this function have the form "any_signal", which
+means to disconnect any signal with matching callback and data, or
+"any_signal::signal_name", which only disconnects the signal named "signal_name".
+</para>
+
+@object: a #GObject
+@signal_spec: the spec for the first signal
+@Varargs: #GCallback for the first signal, followed by data for the first signal,
+ followed optionally by more signal spec/callback/data triples,
+ followed by %NULL
+
+
+<!-- ##### FUNCTION g_object_set ##### -->
+<para>
+Sets properties on an object.
+</para>
+
+@object: a #GObject
+@first_property_name: name of the first property to set
+@Varargs: value for the first property, followed optionally by more
+ name/value pairs, followed by %NULL
+
+
+<!-- ##### FUNCTION g_object_get ##### -->
+<para>
+Gets properties of an object.
+</para>
+<para>
+In general, a copy is made of the property contents and the caller is
+responsible for freeing the memory in the appropriate manner for the type,
+for instance by calling g_free() or g_object_unref().
+</para>
+<example>
+<title>Using g_object_get(<!-- -->)</title>
+<para>
+An example of using g_object_get() to get the contents
+of three properties - one of type #G_TYPE_INT,
+one of type #G_TYPE_STRING, and one of type #G_TYPE_OBJECT:
+</para>
+<programlisting>
+ gint intval;
+ gchar *strval;
+ GObject *objval;
+
+ g_object_get (my_object,
+ "intproperty", &amp;intval,
+ "strproperty", &amp;strval,
+ "objproperty", &amp;objval,
+ NULL);
+
+ /* Do something with intval, strval, objval */
+
+ g_free (strval);
+ g_object_unref (objval);
+</programlisting>
+</example>
+
+@object: a #GObject
+@first_property_name: name of the first property to get
+@Varargs: return location for the first property, followed optionally by more
+ name/return location pairs, followed by %NULL
+
+
+<!-- ##### FUNCTION g_object_notify ##### -->
+<para>
+Emits a "notify" signal for the property @property_name on @object.
+</para>
+
+@object: a #GObject
+@property_name: the name of a property installed on the class of @object.
+
+
+<!-- ##### FUNCTION g_object_freeze_notify ##### -->
+<para>
+Stops emission of "notify" signals on @object. The signals are
+queued until g_object_thaw_notify() is called on @object.
+</para>
+<para>
+This is necessary for accessors that modify multiple properties to prevent
+premature notification while the object is still being modified.
+</para>
+
+@object: a #GObject
+
+
+<!-- ##### FUNCTION g_object_thaw_notify ##### -->
+<para>
+Reverts the effect of a previous call to g_object_freeze_notify().
+This causes all queued "notify" signals on @object to be emitted.
+</para>
+
+@object: a #GObject
+
+
+<!-- ##### FUNCTION g_object_get_data ##### -->
+<para>
+Gets a named field from the objects table of associations (see g_object_set_data()).
+</para>
+
+@object: #GObject containing the associations
+@key: name of the key for that association
+@Returns: the data if found, or %NULL if no such data exists.
+
+
+<!-- ##### FUNCTION g_object_set_data ##### -->
+<para>
+Each object carries around a table of associations from
+strings to pointers. This function lets you set an association.
+</para>
+<para>
+If the object already had an association with that name,
+the old association will be destroyed.
+</para>
+
+@object: #GObject containing the associations.
+@key: name of the key
+@data: data to associate with that key
+
+
+<!-- ##### FUNCTION g_object_set_data_full ##### -->
+<para>
+Like g_object_set_data() except it adds notification
+for when the association is destroyed, either by setting it
+to a different value or when the object is destroyed.
+</para>
+<para>
+Note that the @destroy callback is not called if @data is %NULL.
+</para>
+
+@object: #GObject containing the associations
+@key: name of the key
+@data: data to associate with that key
+@destroy: function to call when the association is destroyed
+
+
+<!-- ##### FUNCTION g_object_steal_data ##### -->
+<para>
+Remove a specified datum from the object's data associations,
+without invoking the association's destroy handler.
+</para>
+
+@object: #GObject containing the associations
+@key: name of the key
+@Returns: the data if found, or %NULL if no such data exists.
+
+
+<!-- ##### FUNCTION g_object_get_qdata ##### -->
+<para>
+This function gets back user data pointers stored via
+g_object_set_qdata().
+</para>
+
+@object: The GObject to get a stored user data pointer from
+@quark: A #GQuark, naming the user data pointer
+@Returns: The user data pointer set, or %NULL
+
+
+<!-- ##### FUNCTION g_object_set_qdata ##### -->
+<para>
+This sets an opaque, named pointer on an object.
+The name is specified through a #GQuark (retrived e.g. via
+g_quark_from_static_string()), and the pointer
+can be gotten back from the @object with g_object_get_qdata()
+until the @object is finalized.
+Setting a previously set user data pointer, overrides (frees)
+the old pointer set, using #NULL as pointer essentially
+removes the data stored.
+</para>
+
+@object: The GObject to set store a user data pointer
+@quark: A #GQuark, naming the user data pointer
+@data: An opaque user data pointer
+
+
+<!-- ##### FUNCTION g_object_set_qdata_full ##### -->
+<para>
+This function works like g_object_set_qdata(), but in addition,
+a void (*destroy) (gpointer) function may be specified which is
+called with @data as argument when the @object is finalized, or
+the data is being overwritten by a call to g_object_set_qdata()
+with the same @quark.
+</para>
+
+@object: The GObject to set store a user data pointer
+@quark: A #GQuark, naming the user data pointer
+@data: An opaque user data pointer
+@destroy: Function to invoke with @data as argument, when @data needs to be freed
+
+
+<!-- ##### FUNCTION g_object_steal_qdata ##### -->
+<para>
+This function gets back user data pointers stored via
+g_object_set_qdata() and removes the @data from object
+without invoking it's destroy() function (if any was
+set).
+Usually, calling this function is only required to update
+user data pointers with a destroy notifier, for example:
+<programlisting>
+void
+object_add_to_user_list (GObject *object,
+ const gchar *new_string)
+{
+ /* the quark, naming the object data */
+ GQuark quark_string_list = g_quark_from_static_string ("my-string-list");
+ /* retrive the old string list */
+ GList *list = g_object_steal_qdata (object, quark_string_list);
+
+ /* prepend new string */
+ list = g_list_prepend (list, g_strdup (new_string));
+ /* this changed 'list', so we need to set it again */
+ g_object_set_qdata_full (object, quark_string_list, list, free_string_list);
+}
+static void
+free_string_list (gpointer data)
+{
+ GList *node, *list = data;
+
+ for (node = list; node; node = node->next)
+ g_free (node->data);
+ g_list_free (list);
+}
+</programlisting>
+Using g_object_get_qdata() in the above example, instead of g_object_steal_qdata()
+would have left the destroy function set, and thus the partial string list would
+have been freed upon g_object_set_qdata_full().
+</para>
+
+@object: The GObject to get a stored user data pointer from
+@quark: A #GQuark, naming the user data pointer
+@Returns: The user data pointer set, or %NULL
+
+
+<!-- ##### FUNCTION g_object_set_property ##### -->
+<para>
+Sets a property on an object.
+</para>
+
+@object: a #GObject
+@property_name: the name of the property to set
+@value: the value
+
+
+<!-- ##### FUNCTION g_object_get_property ##### -->
+<para>
+Gets a property of an object.
+</para>
+<para>
+In general, a copy is made of the property contents and the caller is
+responsible for freeing the memory by calling g_value_unset().
+</para>
+<para>
+Note that g_object_get_property() is really intended for language
+bindings, g_object_get() is much more convenient for C programming.
+</para>
+
+@object: a #GObject
+@property_name: the name of the property to get
+@value: return location for the property value
+
+
+<!-- ##### FUNCTION g_object_new_valist ##### -->
+<para>
+Creates a new instance of a #GObject subtype and sets its properties.
+</para>
+<para>
+Construction parameters (see #G_PARAM_CONSTRUCT, #G_PARAM_CONSTRUCT_ONLY)
+which are not explicitly specified are set to their default values.
+</para>
+
+@object_type: the type id of the #GObject subtype to instantiate
+@first_property_name: the name of the first property
+@var_args: the value of the first property, followed optionally by more
+ name/value pairs, followed by %NULL
+@Returns: a new instance of @object_type
+
+
+<!-- ##### FUNCTION g_object_set_valist ##### -->
+<para>
+Sets properties on an object.
+</para>
+
+@object: a #GObject
+@first_property_name: name of the first property to set
+@var_args: value for the first property, followed optionally by more
+ name/value pairs, followed by %NULL
+
+
+<!-- ##### FUNCTION g_object_get_valist ##### -->
+<para>
+Gets properties of an object.
+</para>
+<para>
+In general, a copy is made of the property contents and the caller is
+responsible for freeing the memory in the appropriate manner for the type,
+for instance by calling g_free() or g_object_unref().
+</para>
+<para>
+See g_object_get().
+</para>
+
+@object: a #GObject
+@first_property_name: name of the first property to get
+@var_args: return location for the first property, followed optionally by more
+ name/return location pairs, followed by %NULL
+
+
+<!-- ##### FUNCTION g_object_watch_closure ##### -->
+<para>
+This function essentially limits the life time of the @closure
+to the life time of the object. That is, when the object is finalized,
+the @closure is invalidated by calling g_closure_invalidate() on it,
+in order to prevent invocations of the closure with a finalized
+(nonexisting) object. Also, g_object_ref() and g_object_unref() are added
+as marshal guards to the @closure, to ensure that an extra reference
+count is held on @object during invocation of the @closure.
+Usually, this function will be called on closures that use this @object
+as closure data.
+</para>
+
+@object: GObject restricting lifetime of @closure
+@closure: GClosure to watch
+
+
+<!-- ##### FUNCTION g_object_run_dispose ##### -->
+<para>
+Releases all references to other objects. This can be used to break
+reference cycles.
+</para>
+<note><para>
+This functions should only be called from object system implementations.
+</para></note>
+
+@object: a #GObject
+
+
+<!-- ##### MACRO G_OBJECT_WARN_INVALID_PROPERTY_ID ##### -->
+<para>
+This macro should be used to emit a standard warning about unexpected
+properties in set_property() and get_property() implementations.
+</para>
+
+@object: the #GObject on which set_property() or get_property() was called
+@property_id: the numeric id of the property
+@pspec: the #GParamSpec of the property
+
+
diff --git a/trunk/docs/reference/gobject/tmpl/param_value_types.sgml b/trunk/docs/reference/gobject/tmpl/param_value_types.sgml
new file mode 100644
index 000000000..06850aae0
--- /dev/null
+++ b/trunk/docs/reference/gobject/tmpl/param_value_types.sgml
@@ -0,0 +1,1788 @@
+<!-- ##### SECTION Title ##### -->
+Parameters and Values
+
+<!-- ##### SECTION Short_Description ##### -->
+Standard Parameter and Value Types
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+#GValue provides an abstract container structure which can be copied,
+transformed and compared while holding a value of any (derived) type, which
+is registered as a #GType with a #GTypeValueTable in its #GTypeInfo structure.
+Parameter specifications for most value types can be created as
+#GParamSpec derived instances, to implement e.g. #GObject properties which
+operate on #GValue containers.
+</para>
+<para>
+Parameter names need to start with a letter (a-z or A-Z). Subsequent
+characters can be letters, numbers or a '-'.
+All other characters are replaced by a '-' during construction.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+#GParamSpec, #GValue, g_object_class_install_property().
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_BOOLEAN ##### -->
+<para>
+Return whether the given #GParamSpec is of type %G_TYPE_PARAM_BOOLEAN.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_BOOLEAN ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecBoolean.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_BOOLEAN ##### -->
+<para>
+Return whether the given #GValue can hold values of type %G_TYPE_BOOLEAN.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_BOOLEAN ##### -->
+<para>
+The #GType of #GParamSpecBoolean.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecBoolean ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for boolean properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@default_value: default value for the property specified
+
+<!-- ##### FUNCTION g_param_spec_boolean ##### -->
+<para>
+Creates a new #GParamSpecBoolean instance specifying a %G_TYPE_BOOLEAN
+property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@default_value: default value for the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_boolean ##### -->
+<para>
+Set the contents of a %G_TYPE_BOOLEAN #GValue to @v_boolean.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_BOOLEAN
+@v_boolean: boolean value to be set
+
+
+<!-- ##### FUNCTION g_value_get_boolean ##### -->
+<para>
+Get the contents of a %G_TYPE_BOOLEAN #GValue.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_BOOLEAN
+@Returns: boolean contents of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_CHAR ##### -->
+<para>
+Return whether the given #GParamSpec is of type %G_TYPE_PARAM_CHAR.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_CHAR ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecChar.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_CHAR ##### -->
+<para>
+Return whether the given #GValue can hold values of type %G_TYPE_CHAR.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_CHAR ##### -->
+<para>
+The #GType of #GParamSpecChar.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecChar ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for character properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+
+<!-- ##### FUNCTION g_param_spec_char ##### -->
+<para>
+Creates a new #GParamSpecChar instance specifying a %G_TYPE_CHAR property.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_char ##### -->
+<para>
+Set the contents of a %G_TYPE_CHAR #GValue to @v_char.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_CHAR
+@v_char: character value to be set
+
+
+<!-- ##### FUNCTION g_value_get_char ##### -->
+<para>
+Get the contents of a %G_TYPE_CHAR #GValue.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_CHAR
+@Returns: character contents of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_UCHAR ##### -->
+<para>
+Return whether the given #GParamSpec is of type %G_TYPE_PARAM_UCHAR.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_UCHAR ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecUChar.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_UCHAR ##### -->
+<para>
+Return whether the given #GValue can hold values of type %G_TYPE_UCHAR.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_UCHAR ##### -->
+<para>
+The #GType of #GParamSpecUChar.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecUChar ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for unsigned character properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+
+<!-- ##### FUNCTION g_param_spec_uchar ##### -->
+<para>
+Creates a new #GParamSpecUChar instance specifying a %G_TYPE_UCHAR property.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_uchar ##### -->
+<para>
+Set the contents of a %G_TYPE_UCHAR #GValue to @v_uchar.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_UCHAR
+@v_uchar: unsigned character value to be set
+
+
+<!-- ##### FUNCTION g_value_get_uchar ##### -->
+<para>
+Get the contents of a %G_TYPE_UCHAR #GValue.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_UCHAR
+@Returns: unsigned character contents of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_INT ##### -->
+<para>
+Return whether the given #GParamSpec is of type %G_TYPE_PARAM_INT.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_INT ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecInt.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_INT ##### -->
+<para>
+Return whether the given #GValue can hold values of type %G_TYPE_INT.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_INT ##### -->
+<para>
+The #GType of #GParamSpecInt.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecInt ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for integer properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+
+<!-- ##### FUNCTION g_param_spec_int ##### -->
+<para>
+Creates a new #GParamSpecInt instance specifying a %G_TYPE_INT property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_int ##### -->
+<para>
+Set the contents of a %G_TYPE_INT #GValue to @v_int.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_INT
+@v_int: integer value to be set
+
+
+<!-- ##### FUNCTION g_value_get_int ##### -->
+<para>
+Get the contents of a %G_TYPE_INT #GValue.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_INT
+@Returns: integer contents of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_UINT ##### -->
+<para>
+Return whether the given #GParamSpec is of type %G_TYPE_PARAM_UINT.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_UINT ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecUInt.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_UINT ##### -->
+<para>
+Return whether the given #GValue can hold values of type %G_TYPE_UINT.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_UINT ##### -->
+<para>
+The #GType of #GParamSpecUInt.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecUInt ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for unsigned integer properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+
+<!-- ##### FUNCTION g_param_spec_uint ##### -->
+<para>
+Creates a new #GParamSpecUInt instance specifying a %G_TYPE_UINT property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_uint ##### -->
+<para>
+Set the contents of a %G_TYPE_UINT #GValue to @v_uint.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_UINT
+@v_uint: unsigned integer value to be set
+
+
+<!-- ##### FUNCTION g_value_get_uint ##### -->
+<para>
+Get the contents of a %G_TYPE_UINT #GValue.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_UINT
+@Returns: unsigned integer contents of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_LONG ##### -->
+<para>
+Return whether the given #GParamSpec is of type %G_TYPE_PARAM_LONG.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_LONG ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecLong.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_LONG ##### -->
+<para>
+Return whether the given #GValue can hold values of type %G_TYPE_LONG.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_LONG ##### -->
+<para>
+The #GType of #GParamSpecLong.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecLong ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for long integer properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+
+<!-- ##### FUNCTION g_param_spec_long ##### -->
+<para>
+Creates a new #GParamSpecLong instance specifying a %G_TYPE_LONG property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_long ##### -->
+<para>
+Set the contents of a %G_TYPE_LONG #GValue to @v_long.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_LONG
+@v_long: long integer value to be set
+
+
+<!-- ##### FUNCTION g_value_get_long ##### -->
+<para>
+Get the contents of a %G_TYPE_LONG #GValue.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_LONG
+@Returns: long integer contents of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_ULONG ##### -->
+<para>
+Return whether the given #GParamSpec is of type %G_TYPE_PARAM_ULONG.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_ULONG ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecULong.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_ULONG ##### -->
+<para>
+Return whether the given #GValue can hold values of type %G_TYPE_ULONG.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_ULONG ##### -->
+<para>
+The #GType of #GParamSpecULong.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecULong ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for unsigned long integer properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+
+<!-- ##### FUNCTION g_param_spec_ulong ##### -->
+<para>
+Creates a new #GParamSpecULong instance specifying a %G_TYPE_ULONG property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_ulong ##### -->
+<para>
+Set the contents of a %G_TYPE_ULONG #GValue to @v_ulong.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_ULONG
+@v_ulong: unsigned long integer value to be set
+
+
+<!-- ##### FUNCTION g_value_get_ulong ##### -->
+<para>
+Get the contents of a %G_TYPE_ULONG #GValue.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_ULONG
+@Returns: unsigned long integer contents of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_INT64 ##### -->
+<para>
+Return whether the given #GParamSpec is of type %G_TYPE_PARAM_INT64.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_INT64 ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecInt64.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_INT64 ##### -->
+<para>
+Return whether the given #GValue can hold values of type %G_TYPE_INT64.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_INT64 ##### -->
+<para>
+The #GType of #GParamSpecInt64.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecInt64 ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for 64bit integer properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+
+<!-- ##### FUNCTION g_param_spec_int64 ##### -->
+<para>
+Creates a new #GParamSpecInt64 instance specifying a %G_TYPE_INT64 property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_int64 ##### -->
+<para>
+Set the contents of a %G_TYPE_INT64 #GValue to @v_int64.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_INT64
+@v_int64: 64bit integer value to be set
+
+
+<!-- ##### FUNCTION g_value_get_int64 ##### -->
+<para>
+Get the contents of a %G_TYPE_INT64 #GValue.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_INT64
+@Returns: 64bit integer contents of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_UINT64 ##### -->
+<para>
+Return whether the given #GParamSpec is of type %G_TYPE_PARAM_UINT64.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_UINT64 ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecUInt64.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_UINT64 ##### -->
+<para>
+Return whether the given #GValue can hold values of type %G_TYPE_UINT64.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_UINT64 ##### -->
+<para>
+The #GType of #GParamSpecUInt64.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecUInt64 ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for unsigned 64bit integer properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+
+<!-- ##### FUNCTION g_param_spec_uint64 ##### -->
+<para>
+Creates a new #GParamSpecUInt64 instance specifying a %G_TYPE_UINT64
+property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_uint64 ##### -->
+<para>
+Set the contents of a %G_TYPE_UINT64 #GValue to @v_uint64.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_UINT64
+@v_uint64: unsigned 64bit integer value to be set
+
+
+<!-- ##### FUNCTION g_value_get_uint64 ##### -->
+<para>
+Get the contents of a %G_TYPE_UINT64 #GValue.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_UINT64
+@Returns: unsigned 64bit integer contents of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_FLOAT ##### -->
+<para>
+Return whether the given #GParamSpec is of type %G_TYPE_PARAM_FLOAT.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_FLOAT ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecFloat.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_FLOAT ##### -->
+<para>
+Return whether the given #GValue can hold values of type %G_TYPE_FLOAT.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_FLOAT ##### -->
+<para>
+The #GType of #GParamSpecFloat.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecFloat ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for float properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+@epsilon: values closer than @epsilon will be considered identical
+ by g_param_values_cmp(); the default value is 1e-30.
+
+<!-- ##### FUNCTION g_param_spec_float ##### -->
+<para>
+Creates a new #GParamSpecFloat instance specifying a %G_TYPE_FLOAT property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_float ##### -->
+<para>
+Set the contents of a %G_TYPE_FLOAT #GValue to @v_float.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_FLOAT
+@v_float: float value to be set
+
+
+<!-- ##### FUNCTION g_value_get_float ##### -->
+<para>
+Get the contents of a %G_TYPE_FLOAT #GValue.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_FLOAT
+@Returns: float contents of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_DOUBLE ##### -->
+<para>
+Return whether the given #GParamSpec is of type %G_TYPE_PARAM_DOUBLE.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_DOUBLE ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecDouble.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_DOUBLE ##### -->
+<para>
+Return whether the given #GValue can hold values of type %G_TYPE_DOUBLE.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_DOUBLE ##### -->
+<para>
+The #GType of #GParamSpecDouble.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecDouble ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for double properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+@epsilon: values closer than @epsilon will be considered identical
+ by g_param_values_cmp(); the default value is 1e-90.
+
+<!-- ##### FUNCTION g_param_spec_double ##### -->
+<para>
+Creates a new #GParamSpecDouble instance specifying a %G_TYPE_DOUBLE
+property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@minimum: minimum value for the property specified
+@maximum: maximum value for the property specified
+@default_value: default value for the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_double ##### -->
+<para>
+Set the contents of a %G_TYPE_DOUBLE #GValue to @v_double.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_DOUBLE
+@v_double: double value to be set
+
+
+<!-- ##### FUNCTION g_value_get_double ##### -->
+<para>
+Get the contents of a %G_TYPE_DOUBLE #GValue.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_DOUBLE
+@Returns: double contents of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_ENUM ##### -->
+<para>
+Returns whether the given #GParamSpec is of type %G_TYPE_PARAM_ENUM.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_ENUM ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecEnum.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_ENUM ##### -->
+<para>
+Return whether the given #GValue can hold values derived from type %G_TYPE_ENUM.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_ENUM ##### -->
+<para>
+The #GType of #GParamSpecEnum.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecEnum ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for enum
+properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@enum_class: the #GEnumClass for the enum
+@default_value: default value for the property specified
+
+<!-- ##### FUNCTION g_param_spec_enum ##### -->
+<para>
+Creates a new #GParamSpecEnum instance specifying a %G_TYPE_ENUM
+property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@enum_type: a #GType derived from %G_TYPE_ENUM
+@default_value: default value for the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_enum ##### -->
+<para>
+Set the contents of a %G_TYPE_ENUM #GValue to @v_enum.
+</para>
+
+@value: a valid #GValue whose type is derived from %G_TYPE_ENUM
+@v_enum: enum value to be set
+
+
+<!-- ##### FUNCTION g_value_get_enum ##### -->
+<para>
+Get the contents of a %G_TYPE_ENUM #GValue.
+</para>
+
+@value: a valid #GValue whose type is derived from %G_TYPE_ENUM
+@Returns: enum contents of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_FLAGS ##### -->
+<para>
+Returns whether the given #GParamSpec is of type %G_TYPE_PARAM_FLAGS.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_FLAGS ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecFlags.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_FLAGS ##### -->
+<para>
+Returns whether the given #GValue can hold values derived from type %G_TYPE_FLAGS.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_FLAGS ##### -->
+<para>
+The #GType of #GParamSpecFlags.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecFlags ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for flags
+properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@flags_class: the #GFlagsClass for the flags
+@default_value: default value for the property specified
+
+<!-- ##### FUNCTION g_param_spec_flags ##### -->
+<para>
+Creates a new #GParamSpecEnum instance specifying a %G_TYPE_FLAGS
+property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@flags_type: a #GType derived from %G_TYPE_FLAGS
+@default_value: default value for the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_flags ##### -->
+<para>
+Set the contents of a %G_TYPE_FLAGS #GValue to @v_flags.
+</para>
+
+@value: a valid #GValue whose type is derived from %G_TYPE_FLAGS
+@v_flags: flags value to be set
+
+
+<!-- ##### FUNCTION g_value_get_flags ##### -->
+<para>
+Get the contents of a %G_TYPE_FLAGS #GValue.
+</para>
+
+@value: a valid #GValue whose type is derived from %G_TYPE_FLAGS
+@Returns: flags contents of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_STRING ##### -->
+<para>
+Returns whether the given #GParamSpec is of type %G_TYPE_PARAM_STRING.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_STRING ##### -->
+<para>
+Casts a #GParamSpec instance into a #GParamSpecString.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_STRING ##### -->
+<para>
+Return whether the given #GValue can hold values of type %G_TYPE_STRING.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_STRING ##### -->
+<para>
+The #GType of #GParamSpecString.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecString ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for string
+properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@default_value: default value for the property specified
+@cset_first: a string containing the allowed values for the first byte
+@cset_nth: a string containing the allowed values for the subsequent bytes
+@substitutor: the replacement byte for bytes which don't match @cset_first or @cset_nth.
+@null_fold_if_empty: replace empty string by %NULL
+@ensure_non_null: replace %NULL strings by an empty string
+
+<!-- ##### TYPEDEF gchararray ##### -->
+<para>
+A C representable type name for #G_TYPE_STRING.
+</para>
+
+
+<!-- ##### FUNCTION g_param_spec_string ##### -->
+<para>
+Creates a new #GParamSpecString instance.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@default_value: default value for the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_string ##### -->
+<para>
+Set the contents of a %G_TYPE_STRING #GValue to @v_string.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_STRING
+@v_string: string to be set
+
+
+<!-- ##### FUNCTION g_value_set_static_string ##### -->
+<para>
+Set the contents of a %G_TYPE_STRING #GValue to @v_string.
+The string is assumed to be static, and is thus not duplicated
+when setting the #GValue.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_STRING
+@v_string: static string to be set
+
+
+<!-- ##### FUNCTION g_value_take_string ##### -->
+<para>
+Sets the contents of a %G_TYPE_STRING #GValue to @v_string.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_STRING
+@v_string: duplicated unowned string to be set
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_value_set_string_take_ownership ##### -->
+<para>
+This is an internal function introduced mainly for C marshallers.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_STRING
+@v_string: duplicated unowned string to be set
+@Deprecated: 2.4: Use g_value_take_string() instead.
+
+
+<!-- ##### FUNCTION g_value_get_string ##### -->
+<para>
+Get the contents of a %G_TYPE_STRING #GValue.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_STRING
+@Returns: string content of @value
+
+
+<!-- ##### FUNCTION g_value_dup_string ##### -->
+<para>
+Get a copy the contents of a %G_TYPE_STRING #GValue.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_STRING
+@Returns: a newly allocated copy of the string content of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_PARAM ##### -->
+<para>
+Returns whether the given #GParamSpec is of type %G_TYPE_PARAM_PARAM.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_PARAM ##### -->
+<para>
+Casts a #GParamSpec instance into a #GParamSpecParam.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_PARAM ##### -->
+<para>
+Return whether the given #GValue can hold values derived from type %G_TYPE_PARAM.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_PARAM ##### -->
+<para>
+The #GType of #GParamSpecParam.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecParam ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for %G_TYPE_PARAM
+properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+
+<!-- ##### FUNCTION g_param_spec_param ##### -->
+<para>
+Creates a new #GParamSpecParam instance specifying a %G_TYPE_PARAM
+property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@param_type: a #GType derived from %G_TYPE_PARAM
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+<!-- # Unused Parameters # -->
+@default_value: default value for the property specified
+
+
+<!-- ##### FUNCTION g_value_set_param ##### -->
+<para>
+Set the contents of a %G_TYPE_PARAM #GValue to @param.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_PARAM
+@param: the #GParamSpec to be set
+
+
+<!-- ##### FUNCTION g_value_take_param ##### -->
+<para>
+Sets the contents of a %G_TYPE_PARAM #GValue to @param and
+takes over the ownership of the callers reference to @param;
+the caller doesn't have to unref it any more.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_PARAM
+@param: the #GParamSpec to be set
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_value_set_param_take_ownership ##### -->
+<para>
+This is an internal function introduced mainly for C marshallers.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_PARAM
+@param: the #GParamSpec to be set
+@Deprecated: 2.4: Use g_value_take_param() instead.
+
+
+<!-- ##### FUNCTION g_value_get_param ##### -->
+<para>
+Get the contents of a %G_TYPE_PARAM #GValue.
+</para>
+
+@value: a valid #GValue whose type is derived from %G_TYPE_PARAM
+@Returns: #GParamSpec content of @value
+
+
+<!-- ##### FUNCTION g_value_dup_param ##### -->
+<para>
+Get the contents of a %G_TYPE_PARAM #GValue, increasing its reference count.
+</para>
+
+@value: a valid #GValue whose type is derived from %G_TYPE_PARAM
+@Returns: #GParamSpec content of @value, should be unreferenced when no longer needed.
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_BOXED ##### -->
+<para>
+Return whether the given #GParamSpec is of type %G_TYPE_PARAM_BOXED.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_BOXED ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecBoxed.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_BOXED ##### -->
+<para>
+Return whether the given #GValue can hold values derived from type %G_TYPE_BOXED.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_BOXED ##### -->
+<para>
+The #GType of #GParamSpecBoxed.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecBoxed ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for boxed properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+
+<!-- ##### FUNCTION g_param_spec_boxed ##### -->
+<para>
+Creates a new #GParamSpecBoxed instance specifying a %G_TYPE_BOXED
+derived property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@boxed_type: %G_TYPE_BOXED derived type of this property
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_boxed ##### -->
+<para>
+Set the contents of a %G_TYPE_BOXED derived #GValue to @v_boxed.
+</para>
+
+@value: a valid #GValue of %G_TYPE_BOXED derived type
+@v_boxed: boxed value to be set
+
+
+<!-- ##### FUNCTION g_value_set_static_boxed ##### -->
+<para>
+Set the contents of a %G_TYPE_BOXED derived #GValue to @v_boxed.
+The boxed value is assumed to be static, and is thus not duplicated
+when setting the #GValue.
+</para>
+
+@value: a valid #GValue of %G_TYPE_BOXED derived type
+@v_boxed: static boxed value to be set
+
+
+<!-- ##### FUNCTION g_value_take_boxed ##### -->
+<para>
+Sets the contents of a %G_TYPE_BOXED derived #GValue to @v_boxed and
+takes over the ownership of the callers reference to @v_boxed;
+the caller doesn't have to unref it any more.
+</para>
+
+@value: a valid #GValue of %G_TYPE_BOXED derived type
+@v_boxed: duplicated unowned boxed value to be set
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_value_set_boxed_take_ownership ##### -->
+<para>
+This is an internal function introduced mainly for C marshallers.
+</para>
+
+@value: a valid #GValue of %G_TYPE_BOXED derived type
+@v_boxed: duplicated unowned boxed value to be set
+@Deprecated: 2.4: Use g_value_take_boxed() instead.
+
+
+<!-- ##### FUNCTION g_value_get_boxed ##### -->
+<para>
+Get the contents of a %G_TYPE_BOXED derived #GValue.
+</para>
+
+@value: a valid #GValue of %G_TYPE_BOXED derived type
+@Returns: boxed contents of @value
+
+
+<!-- ##### FUNCTION g_value_dup_boxed ##### -->
+<para>
+Get the contents of a %G_TYPE_BOXED derived #GValue.
+Upon getting, the boxed value is duplicated and needs to be
+later freed with g_boxed_free(), e.g. like: g_boxed_free (G_VALUE_TYPE (@value), return_value);
+</para>
+
+@value: a valid #GValue of %G_TYPE_BOXED derived type
+@Returns: boxed contents of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_POINTER ##### -->
+<para>
+Returns whether the given #GParamSpec is of type %G_TYPE_PARAM_POINTER.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_POINTER ##### -->
+<para>
+Casts a #GParamSpec instance into a #GParamSpecPointer.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_POINTER ##### -->
+<para>
+Return whether the given #GValue can hold values of type %G_TYPE_POINTER.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_POINTER ##### -->
+<para>
+The #GType of #GParamSpecPointer.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecPointer ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for pointer properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+
+<!-- ##### FUNCTION g_param_spec_pointer ##### -->
+<para>
+Creates a new #GParamSpecPoiner instance specifying a pointer property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_pointer ##### -->
+<para>
+Set the contents of a pointer #GValue to @v_pointer.
+</para>
+
+@value: a valid #GValue of %G_TYPE_POINTER
+@v_pointer: pointer value to be set
+
+
+<!-- ##### FUNCTION g_value_get_pointer ##### -->
+<para>
+Get the contents of a pointer #GValue.
+</para>
+
+@value: a valid #GValue of %G_TYPE_POINTER
+@Returns: pointer contents of @value
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_OBJECT ##### -->
+<para>
+Returns whether the given #GParamSpec is of type %G_TYPE_PARAM_OBJECT.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_OBJECT ##### -->
+<para>
+Casts a #GParamSpec instance into a #GParamSpecObject.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_OBJECT ##### -->
+<para>
+Return whether the given #GValue can hold values derived from type %G_TYPE_OBJECT.
+</para>
+
+@value: a valid #GValue structure
+
+
+<!-- ##### MACRO G_TYPE_PARAM_OBJECT ##### -->
+<para>
+The #GType of #GParamSpecObject.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecObject ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for object properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+
+<!-- ##### FUNCTION g_param_spec_object ##### -->
+<para>
+Creates a new #GParamSpecBoxed instance specifying a %G_TYPE_OBJECT
+derived property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@object_type: %G_TYPE_OBJECT derived type of this property
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### FUNCTION g_value_set_object ##### -->
+<para>
+Set the contents of a %G_TYPE_OBJECT derived #GValue to @v_object.
+</para>
+
+@value: a valid #GValue of %G_TYPE_OBJECT derived type
+@v_object: object value to be set
+
+
+<!-- ##### FUNCTION g_value_take_object ##### -->
+<para>
+Sets the contents of a %G_TYPE_OBJECT derived #GValue to @v_object
+and takes over the ownership of the callers reference to @v_object;
+the caller doesn't have to unref it any more.
+</para>
+
+@value: a valid #GValue of %G_TYPE_OBJECT derived type
+@v_object: object value to be set
+@Since: 2.4
+
+
+<!-- ##### FUNCTION g_value_set_object_take_ownership ##### -->
+<para>
+This is an internal function introduced mainly for C marshallers.
+</para>
+
+@value: a valid #GValue of %G_TYPE_OBJECT derived type
+@v_object: object value to be set
+@Deprecated: 2.4: Use g_value_take_object() instead.
+
+
+<!-- ##### FUNCTION g_value_get_object ##### -->
+<para>
+Get the contents of a %G_TYPE_OBJECT derived #GValue.
+</para>
+
+@value: a valid #GValue of %G_TYPE_OBJECT derived type
+@Returns: object contents of @value
+
+
+<!-- ##### FUNCTION g_value_dup_object ##### -->
+<para>
+Get the contents of a %G_TYPE_OBJECT derived #GValue, increasing its reference count.
+</para>
+
+@value: a valid #GValue whose type is derived from %G_TYPE_OBJECT
+@Returns: object content of @value, should be unreferenced when no longer needed.
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_UNICHAR ##### -->
+<para>
+Return whether the given #GParamSpec is of type %G_TYPE_PARAM_UNICHAR.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_UNICHAR ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecUnichar.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_TYPE_PARAM_UNICHAR ##### -->
+<para>
+The #GType of #GParamSpecUnichar.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecUnichar ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for unichar (unsigned integer) properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@default_value: default value for the property specified
+
+<!-- ##### FUNCTION g_param_spec_unichar ##### -->
+<para>
+Creates a new #GParamSpecUnichar instance specifying a %G_TYPE_UINT
+property. #GValue structures for this property can be accessed with
+g_value_set_uint() and g_value_get_uint().
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@default_value: default value for the property specified
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_VALUE_ARRAY ##### -->
+<para>
+Return whether the given #GParamSpec is of type %G_TYPE_PARAM_VALUE_ARRAY.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_PARAM_SPEC_VALUE_ARRAY ##### -->
+<para>
+Cast a #GParamSpec instance into a #GParamSpecValueArray.
+</para>
+
+@pspec: a valid #GParamSpec instance
+
+
+<!-- ##### MACRO G_TYPE_PARAM_VALUE_ARRAY ##### -->
+<para>
+The #GType of #GParamSpecValueArray.
+</para>
+
+
+
+<!-- ##### STRUCT GParamSpecValueArray ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for #GValueArray properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@element_spec: a #GParamSpec describing the elements contained in arrays of this property, may be %NULL
+@fixed_n_elements: if greater than 0, arrays of this property will always have this many elements
+
+<!-- ##### FUNCTION g_param_spec_value_array ##### -->
+<para>
+Creates a new #GParamSpecValueArray instance specifying a
+%G_TYPE_VALUE_ARRAY property. %G_TYPE_VALUE_ARRAY is a %G_TYPE_BOXED
+type, as such, #GValue structures for this property can be accessed
+with g_value_set_boxed() and g_value_get_boxed().
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@element_spec: a #GParamSpec describing the elements contained in
+ arrays of this property, may be %NULL
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_OVERRIDE ##### -->
+<para>
+Returns whether the given #GParamSpec is of type %G_TYPE_PARAM_OVERRIDE.
+</para>
+
+@pspec: a #GParamSpec
+@Since: 2.4
+
+
+<!-- ##### MACRO G_PARAM_SPEC_OVERRIDE ##### -->
+<para>
+Casts a #GParamSpec into a #GParamSpecOverride.
+</para>
+
+@pspec: a #GParamSpec
+@Since: 2.4
+
+
+<!-- ##### MACRO G_TYPE_PARAM_OVERRIDE ##### -->
+<para>
+The #GType of #GParamSpecOverride.
+</para>
+
+@Since: 2.4
+
+
+<!-- ##### STRUCT GParamSpecOverride ##### -->
+<para>
+This is a type of #GParamSpec type that simply redirects operations to
+another paramspec. All operations other than getting or
+setting the value are redirected, including accessing the nick and
+blurb, validating a value, and so forth. See
+g_param_spec_get_redirect_target() for retrieving the overidden
+property. #GParamSpecOverride is used in implementing
+g_object_class_override_property(), and will not be directly useful
+unless you are implementing a new base type similar to GObject.
+</para>
+
+@Since: 2.4
+
+<!-- ##### FUNCTION g_param_spec_override ##### -->
+<para>
+Creates a new property of type #GParamSpecOverride. This is used
+to direct operations to another paramspec, and will not be directly
+useful unless you are implementing a new base type similar to GObject.
+</para>
+
+@name: the name of the property.
+@overridden: The property that is being overridden
+@Returns: the newly created #GParamSpec
+@Since: 2.4
+
+
+<!-- ##### MACRO G_IS_PARAM_SPEC_GTYPE ##### -->
+<para>
+Returns whether the given #GParamSpec is of type %G_TYPE_PARAM_GTYPE.
+</para>
+
+@pspec: a #GParamSpec
+@Since: 2.10
+
+
+<!-- ##### MACRO G_PARAM_SPEC_GTYPE ##### -->
+<para>
+Casts a #GParamSpec into a #GParamSpecGType.
+</para>
+
+@pspec: a #GParamSpec
+@Since: 2.10
+
+
+<!-- ##### MACRO G_VALUE_HOLDS_GTYPE ##### -->
+<para>
+Returns whether the given #GValue can hold values of type %G_TYPE_GTYPE.
+</para>
+
+@value: a valid #GValue structure
+@Since: 2.12
+
+
+<!-- ##### MACRO G_TYPE_PARAM_GTYPE ##### -->
+<para>
+The #GType of #GParamSpecGType.
+</para>
+
+@Since: 2.10
+
+
+<!-- ##### STRUCT GParamSpecGType ##### -->
+<para>
+A #GParamSpec derived structure that contains the meta data for #GType properties.
+</para>
+
+@parent_instance: private #GParamSpec portion
+@is_a_type: a #GType whose subtypes can occur as values
+@Since: 2.10
+
+<!-- ##### FUNCTION g_param_spec_gtype ##### -->
+<para>
+Creates a new #GParamSpecGType instance specifying a
+%G_TYPE_GTYPE property.
+</para>
+<para>
+See g_param_spec_internal() for details on property names.
+</para>
+
+@name: canonical name of the property specified
+@nick: nick name for the property specified
+@blurb: description of the property specified
+@is_a_type: a #GType whose subtypes are allowed as values
+ of the property (use %G_TYPE_NONE for any type)
+@flags: flags for the property specified
+@Returns: a newly created parameter specification
+@Since: 2.10
+
+
+<!-- ##### FUNCTION g_value_get_gtype ##### -->
+<para>
+Get the contents of a %G_TYPE_GTYPE #GValue.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_GTYPE
+@Returns: the #GType stored in @value
+@Since: 2.12
+
+
+<!-- ##### FUNCTION g_value_set_gtype ##### -->
+<para>
+Set the contents of a %G_TYPE_GTYPE #GValue to @v_gtype.
+</para>
+
+@value: a valid #GValue of type %G_TYPE_GTYPE
+@v_gtype: #GType to be set
+@Since: 2.12
+
+
diff --git a/trunk/docs/reference/gobject/tmpl/signals.sgml b/trunk/docs/reference/gobject/tmpl/signals.sgml
new file mode 100644
index 000000000..76f36d82b
--- /dev/null
+++ b/trunk/docs/reference/gobject/tmpl/signals.sgml
@@ -0,0 +1,926 @@
+<!-- ##### SECTION Title ##### -->
+Signals
+
+<!-- ##### SECTION Short_Description ##### -->
+A means for customization of object behaviour and a general purpose notification mechanism
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The basic concept of the signal system is that of the <emphasis>emission</emphasis>
+of a signal.
+Signals are introduced per-type and are identified through strings.
+Signals introduced for a parent type are available in derived types as well,
+so basically they are a per-type facility that is inherited.
+A signal emission mainly involves invocation of a certain set of callbacks in
+precisely defined manner. There are two main categories of such callbacks,
+per-object
+ <footnote><para>Although signals can deal with any kind of instantiatable type,
+ i'm referring to those types as "object types" in the following, simply
+ because that is the context most users will encounter signals in.
+ </para></footnote>
+ones and user provided ones.
+The per-object callbacks are most often referred to as "object method
+handler" or "default (signal) handler", while user provided callbacks are
+usually just called "signal handler".
+The object method handler is provided at signal creation time (this most
+frequently happens at the end of an object class' creation), while user
+provided handlers are frequently connected and disconnected to/from a certain
+signal on certain object instances.
+</para>
+<para>
+A signal emission consists of five stages, unless prematurely stopped:
+<variablelist>
+ <varlistentry><term></term><listitem><para>
+ 1 - Invocation of the object method handler for %G_SIGNAL_RUN_FIRST signals
+ </para></listitem></varlistentry>
+ <varlistentry><term></term><listitem><para>
+ 2 - Invocation of normal user-provided signal handlers (<emphasis>after</emphasis> flag %FALSE)
+ </para></listitem></varlistentry>
+ <varlistentry><term></term><listitem><para>
+ 3 - Invocation of the object method handler for %G_SIGNAL_RUN_LAST signals
+ </para></listitem></varlistentry>
+ <varlistentry><term></term><listitem><para>
+ 4 - Invocation of user provided signal handlers, connected with an <emphasis>after</emphasis> flag of %TRUE
+ </para></listitem></varlistentry>
+ <varlistentry><term></term><listitem><para>
+ 5 - Invocation of the object method handler for %G_SIGNAL_RUN_CLEANUP signals
+ </para></listitem></varlistentry>
+</variablelist>
+The user-provided signal handlers are called in the order they were
+connected in.
+All handlers may prematurely stop a signal emission, and any number of
+handlers may be connected, disconnected, blocked or unblocked during
+a signal emission.
+There are certain criteria for skipping user handlers in stages 2 and 4
+of a signal emission.
+First, user handlers may be <emphasis>blocked</emphasis>, blocked handlers are omitted
+during callback invocation, to return from the "blocked" state, a
+handler has to get unblocked exactly the same amount of times
+it has been blocked before.
+Second, upon emission of a %G_SIGNAL_DETAILED signal, an additional
+"detail" argument passed in to g_signal_emit() has to match the detail
+argument of the signal handler currently subject to invocation.
+Specification of no detail argument for signal handlers (omission of the
+detail part of the signal specification upon connection) serves as a
+wildcard and matches any detail argument passed in to emission.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GSignalInvocationHint ##### -->
+<para>
+The #GSignalInvocationHint structure is used to pass on additional information
+to callbacks during a signal emission.
+</para>
+
+@signal_id: The signal id of the signal invoking the callback
+@detail: The detail passed on for this emission
+@run_type: The stage the signal emission is currently in, this
+ field will contain one of %G_SIGNAL_RUN_FIRST,
+ %G_SIGNAL_RUN_LAST or %G_SIGNAL_RUN_CLEANUP.
+
+<!-- ##### USER_FUNCTION GSignalAccumulator ##### -->
+<para>
+The signal accumulator is a special callback function that can be used
+to collect return values of the various callbacks that are called
+during a signal emission. The signal accumulator is specified at signal
+creation time, if it is left %NULL, no accumulation of callback return
+values is performed. The return value of signal emissions is then the
+value returned by the last callback.
+</para>
+
+@ihint: Signal invocation hint, see #GSignalInvocationHint.
+@return_accu: Accumulator to collect callback return values in, this
+ is the return value of the current signal emission.
+@handler_return: A #GValue holding the return value of the signal handler.
+@data: Callback data that was specified when creating the signal.
+@Returns: The accumulator function returns whether the signal emission
+ should be aborted. Returning %FALSE means to abort the
+ current emission and %TRUE is returned for continuation.
+
+
+<!-- ##### TYPEDEF GSignalCMarshaller ##### -->
+<para>
+This is the signature of marshaller functions, required to marshall
+arrays of parameter values to signal emissions into C language callback
+invocations. It is merely an alias to #GClosureMarshal since the #GClosure
+mechanism takes over responsibility of actual function invocation for the
+signal system.
+</para>
+
+
+<!-- ##### USER_FUNCTION GSignalEmissionHook ##### -->
+<para>
+A simple function pointer to get invoked when the signal is emitted. This
+allows you to tie a hook to the signal type, so that it will trap all
+emissions of that signal, from any object.
+</para>
+<para>
+You may not attach these to signals created with the #G_SIGNAL_NO_HOOKS flag.
+</para>
+
+@ihint: Signal invocation hint, see #GSignalInvocationHint.
+@n_param_values: the number of parameters to the function, including
+ the instance on which the signal was emitted.
+@param_values: the instance on which the signal was emitted, followed by the
+ parameters of the emission.
+@data: user data associated with the hook.
+@Returns: whether it wants to stay connected. If it returns %FALSE, the signal
+ hook is disconnected (and destroyed).
+
+
+<!-- ##### ENUM GSignalFlags ##### -->
+<para>
+The signal flags are used to specify a signal's behaviour, the overall
+signal description outlines how especially the RUN flags control the
+stages of a signal emission.
+</para>
+
+@G_SIGNAL_RUN_FIRST: Invoke the object method handler in the first emission stage.
+@G_SIGNAL_RUN_LAST: Invoke the object method handler in the third emission stage.
+@G_SIGNAL_RUN_CLEANUP: Invoke the object method handler in the last emission stage.
+@G_SIGNAL_NO_RECURSE: Signals being emitted for an object while currently being in
+ emission for this very object will not be emitted recursively,
+ but instead cause the first emission to be restarted.
+@G_SIGNAL_DETAILED: This signal supports "::detail" appendices to the signal name
+ upon handler connections and emissions.
+@G_SIGNAL_ACTION: Action signals are signals that may freely be emitted on alive
+ objects from user code via g_signal_emit() and friends, without
+ the need of being embedded into extra code that performs pre or
+ post emission adjustments on the object. They can also be thought
+ of as object methods which can be called generically by
+ third-party code.
+@G_SIGNAL_NO_HOOKS: No emissions hooks are supported for this signal.
+
+<!-- ##### ENUM GSignalMatchType ##### -->
+<para>
+The match types specify what g_signal_handlers_block_matched(),
+g_signal_handlers_unblock_matched() and g_signal_handlers_disconnect_matched()
+match signals by.
+</para>
+
+@G_SIGNAL_MATCH_ID: The signal id must be equal.
+@G_SIGNAL_MATCH_DETAIL: The signal detail be equal.
+@G_SIGNAL_MATCH_CLOSURE: The closure must be the same.
+@G_SIGNAL_MATCH_FUNC: The C closure callback must be the same.
+@G_SIGNAL_MATCH_DATA: The closure data must be the same.
+@G_SIGNAL_MATCH_UNBLOCKED: Only unblocked signals may matched.
+
+<!-- ##### STRUCT GSignalQuery ##### -->
+<para>
+A structure holding in-depth information for a specific signal. It is
+filled in by the g_signal_query() function.
+</para>
+
+@signal_id: The signal id of the signal being queried, or 0 if the
+ signal to be queried was unknown.
+@signal_name: The signal name.
+@itype: The interface/instance type that this signal can be emitted for.
+@signal_flags: The signal flags as passed in to g_signal_new().
+@return_type: The return type for user callbacks.
+@n_params: The number of parameters that user callbacks take.
+@param_types: The individual parameter types for user callbacks, note that the
+ effective callback signature is:
+<programlisting>
+@return_type callback (#gpointer data1,
+ [#param_types param_names,]
+ #gpointer data2);
+</programlisting>
+
+<!-- ##### MACRO G_SIGNAL_TYPE_STATIC_SCOPE ##### -->
+<para>
+This macro flags signal argument types for which the signal system may
+assume that instances thereof remain persistent across all signal emissions
+they are used in. This is only useful for non ref-counted, value-copy types.
+</para>
+<para>
+To flag a signal argument in this way, add
+<literal>| G_SIGNAL_TYPE_STATIC_SCOPE</literal> to the corresponding argument
+of g_signal_new().
+</para>
+<informalexample>
+<programlisting>
+ g_signal_new ("size_request",
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GtkWidgetClass, size_request),
+ NULL, NULL,
+ _gtk_marshal_VOID__BOXED,
+ G_TYPE_NONE, 1,
+ GTK_TYPE_REQUISITION | G_SIGNAL_TYPE_STATIC_SCOPE);
+</programlisting>
+</informalexample>
+
+
+
+<!-- ##### MACRO G_SIGNAL_MATCH_MASK ##### -->
+<para>
+A mask for all #GSignalMatchType bits.
+</para>
+
+
+
+<!-- ##### MACRO G_SIGNAL_FLAGS_MASK ##### -->
+<para>
+A mask for all #GSignalFlags bits.
+</para>
+
+
+
+<!-- ##### FUNCTION g_signal_new ##### -->
+<para>
+Creates a new signal. (This is usually done in the class initializer.)
+</para>
+<para>
+A signal name consists of segments consisting of ASCII letters and
+digits, separated by either the '-' or '_' character. The first
+character of a signal name must be a letter. Names which violate these
+rules lead to undefined behaviour of the GSignal system.
+</para>
+<para>
+When registering a signal and looking up a signal, either separator can
+be used, but they cannot be mixed.
+</para>
+
+@signal_name: the name for the signal
+@itype: the type this signal pertains to. It will also pertain to
+ types which are derived from this type.
+@signal_flags: a combination of #GSignalFlags specifying detail of when
+ the default handler is to be invoked. You should at least specify
+ %G_SIGNAL_RUN_FIRST or %G_SIGNAL_RUN_LAST.
+@class_offset: The offset of the function pointer in the class structure
+ for this type. Used to invoke a class method generically. Pass 0 to
+ not associate a class method with this signal.
+@accumulator: the accumulator for this signal; may be %NULL.
+@accu_data: user data for the @accumulator.
+@c_marshaller: the function to translate arrays of parameter values to
+ signal emissions into C language callback invocations.
+@return_type: the type of return value, or #G_TYPE_NONE for a signal
+ without a return value.
+@n_params: the number of parameter types to follow.
+@Varargs: a list of types, one for each parameter.
+@Returns: the signal id
+
+
+<!-- ##### FUNCTION g_signal_newv ##### -->
+<para>
+Creates a new signal. (This is usually done in the class initializer.)
+</para>
+<para>
+See g_signal_new() for details on allowed signal names.
+</para>
+
+@signal_name: the name for the signal
+@itype: the type this signal pertains to. It will also pertain to
+ types which are derived from this type.
+@signal_flags: a combination of #GSignalFlags specifying detail of when
+ the default handler is to be invoked. You should at least specify
+ %G_SIGNAL_RUN_FIRST or %G_SIGNAL_RUN_LAST.
+@class_closure: The closure to invoke on signal emission; may be %NULL.
+@accumulator: the accumulator for this signal; may be %NULL.
+@accu_data: user data for the @accumulator.
+@c_marshaller: the function to translate arrays of parameter values to
+ signal emissions into C language callback invocations.
+@return_type: the type of return value, or #G_TYPE_NONE for a signal
+ without a return value.
+@n_params: the length of @param_types.
+@param_types: an array types, one for each parameter.
+@Returns: the signal id
+
+
+<!-- ##### FUNCTION g_signal_new_valist ##### -->
+<para>
+Creates a new signal. (This is usually done in the class initializer.)
+</para>
+<para>
+See g_signal_new() for details on allowed signal names.
+</para>
+
+@signal_name: the name for the signal
+@itype: the type this signal pertains to. It will also pertain to
+ types which are derived from this type.
+@signal_flags: a combination of #GSignalFlags specifying detail of when
+ the default handler is to be invoked. You should at least specify
+ %G_SIGNAL_RUN_FIRST or %G_SIGNAL_RUN_LAST.
+@class_closure: The closure to invoke on signal emission; may be %NULL.
+@accumulator: the accumulator for this signal; may be %NULL.
+@accu_data: user data for the @accumulator.
+@c_marshaller: the function to translate arrays of parameter values to
+ signal emissions into C language callback invocations.
+@return_type: the type of return value, or #G_TYPE_NONE for a signal
+ without a return value.
+@n_params: the number of parameter types in @args.
+@args: va_list of #GType, one for each parameter.
+@Returns: the signal id
+
+
+<!-- ##### FUNCTION g_signal_query ##### -->
+<para>
+Queries the signal system for in-depth information about a
+specific signal. This function will fill in a user-provided
+structure to hold signal-specific information. If an invalid
+signal id is passed in, the @signal_id member of the #GSignalQuery
+is 0. All members filled into the #GSignalQuery structure should
+be considered constant and have to be left untouched.
+</para>
+
+@signal_id: The signal id of the signal to query information for.
+@query: A user provided structure that is filled in with constant
+ values upon success.
+
+
+<!-- ##### FUNCTION g_signal_lookup ##### -->
+<para>
+Given the name of the signal and the type of object it connects to, gets
+the signal's identifying integer. Emitting the signal by number is
+somewhat faster than using the name each time.
+</para>
+<para>
+Also tries the ancestors of the given type.
+</para>
+<para>
+See g_signal_new() for details on allowed signal names.
+</para>
+
+@name: the signal's name.
+@itype: the type that the signal operates on.
+@Returns: the signal's identifying number, or 0 if no signal was found.
+
+
+<!-- ##### FUNCTION g_signal_name ##### -->
+<para>
+Given the signal's identifier, finds its name.
+</para>
+<para>
+Two different signals may have the same name, if they have differing types.
+</para>
+
+@signal_id: the signal's identifying number.
+@Returns: the signal name, or %NULL if the signal number was invalid.
+
+
+<!-- ##### FUNCTION g_signal_list_ids ##### -->
+<para>
+Lists the signals by id that a certain instance or interface type
+created. Further information about the signals can be acquired through
+g_signal_query().
+</para>
+
+@itype: Instance or interface type.
+@n_ids: Location to store the number of signal ids for @itype.
+@Returns: Newly allocated array of signal IDs.
+
+
+<!-- ##### FUNCTION g_signal_emit ##### -->
+<para>
+Emits a signal.
+</para>
+<para>
+Note that g_signal_emit() resets the return value to the default
+if no handlers are connected, in contrast to g_signal_emitv().
+</para>
+
+@instance: the instance the signal is being emitted on.
+@signal_id: the signal id
+@detail: the detail
+@Varargs: parameters to be passed to the signal, followed by a
+ location for the return value. If the return type of the signal
+ is #G_TYPE_NONE, the return value location can be omitted.
+
+
+<!-- ##### FUNCTION g_signal_emit_by_name ##### -->
+<para>
+Emits a signal.
+</para>
+<para>
+Note that g_signal_emit_by_name() resets the return value to the default
+if no handlers are connected, in contrast to g_signal_emitv().
+</para>
+
+@instance: the instance the signal is being emitted on.
+@detailed_signal: a string of the form "signal-name::detail".
+@Varargs: parameters to be passed to the signal, followed by a
+ location for the return value. If the return type of the signal
+ is #G_TYPE_NONE, the return value location can be omitted.
+
+
+<!-- ##### FUNCTION g_signal_emitv ##### -->
+<para>
+Emits a signal.
+</para>
+<para>
+Note that g_signal_emitv() doesn't change @return_value if no handlers are
+connected, in contrast to g_signal_emit() and g_signal_emit_valist().
+</para>
+
+@instance_and_params: argument list for the signal emission. The first
+ element in the array is a #GValue for the instance the signal is
+ being emitted on. The rest are any arguments to be passed to the
+ signal.
+@signal_id: the signal id
+@detail: the detail
+@return_value: Location to store the return value of the signal emission.
+
+
+<!-- ##### FUNCTION g_signal_emit_valist ##### -->
+<para>
+Emits a signal.
+</para>
+<para>
+Note that g_signal_emit_valist() resets the return value to the default
+if no handlers are connected, in contrast to g_signal_emitv().
+</para>
+
+@instance: the instance the signal is being emitted on.
+@signal_id: the signal id
+@detail: the detail
+@var_args: a list of parameters to be passed to the signal, followed by a
+ location for the return value. If the return type of the signal
+ is #G_TYPE_NONE, the return value location can be omitted.
+
+
+<!-- ##### MACRO g_signal_connect ##### -->
+<para>
+Connects a #GCallback function to a signal for a particular object.
+</para>
+<para>
+The handler will be called before the default handler of the signal.
+</para>
+
+@instance: the instance to connect to.
+@detailed_signal: a string of the form "signal-name::detail".
+@c_handler: the #GCallback to connect.
+@data: data to pass to @c_handler calls.
+@Returns: the handler id
+
+
+<!-- ##### MACRO g_signal_connect_after ##### -->
+<para>
+Connects a #GCallback function to a signal for a particular object.
+</para>
+<para>
+The handler will be called after the default handler of the signal.
+</para>
+
+@instance: the instance to connect to.
+@detailed_signal: a string of the form "signal-name::detail".
+@c_handler: the #GCallback to connect.
+@data: data to pass to @c_handler calls.
+@Returns: the handler id
+
+
+<!-- ##### MACRO g_signal_connect_swapped ##### -->
+<para>
+Connects a #GCallback function to a signal for a particular object.
+</para>
+<para>
+The instance on which the signal is emitted and @data will be swapped when
+calling the handler.
+</para>
+
+@instance: the instance to connect to.
+@detailed_signal: a string of the form "signal-name::detail".
+@c_handler: the #GCallback to connect.
+@data: data to pass to @c_handler calls.
+@Returns: the handler id
+
+
+<!-- ##### FUNCTION g_signal_connect_object ##### -->
+<para>
+ This is similar to g_signal_connect_data(), but uses a closure which
+ ensures that the @gobject stays alive during the call to @c_handler
+ by temporarily adding a reference count to @gobject.
+</para>
+<para>
+ Note that there is a bug in GObject that makes this function
+ much less useful than it might seem otherwise. Once @gobject is
+ disposed, the callback will no longer be called, but, the signal
+ handler is <emphasis>not</emphasis> currently disconnected. If the
+ @instance is itself being freed at the same time than this doesn't
+ matter, since the signal will automatically be removed, but
+ if @instance persists, then the signal handler will leak. You
+ should not remove the signal yourself because in a future versions of
+ GObject, the handler <emphasis>will</emphasis> automatically
+ be disconnected.
+</para>
+<para>
+ It's possible to work around this problem in a way that will
+ continue to work with future versions of GObject by checking
+ that the signal handler is still connected before disconnected it:
+<informalexample><programlisting>
+ if (g_signal_handler_is_connected (instance, id))
+ g_signal_handler_disconnect (instance, id);
+</programlisting></informalexample>
+</para>
+
+@instance: the instance to connect to.
+@detailed_signal: a string of the form "signal-name::detail".
+@c_handler: the #GCallback to connect.
+@gobject: the object to pass as data to @c_handler.
+@connect_flags: a combination of #GConnnectFlags.
+@Returns: the handler id.
+
+
+<!-- ##### ENUM GConnectFlags ##### -->
+<para>
+The connection flags are used to specify the behaviour of a signal's
+connection.
+</para>
+
+@G_CONNECT_AFTER: whether the handler should be called before or after the
+ default handler of the signal.
+@G_CONNECT_SWAPPED: whether the instance and data should be swapped when
+ calling the handler.
+
+<!-- ##### FUNCTION g_signal_connect_data ##### -->
+<para>
+Connects a #GCallback function to a signal for a particular object. Similar
+to g_signal_connect(), but allows to provide a #GClosureNotify for the data
+which will be called when the signal handler is disconnected and no longer
+used. Specify @connect_flags if you need <literal>..._after()</literal> pr
+<literal>..._swapped()</literal> variants of this function.
+</para>
+
+@instance: the instance to connect to.
+@detailed_signal: a string of the form "signal-name::detail".
+@c_handler: the #GCallback to connect.
+@data: data to pass to @c_handler calls.
+@destroy_data: a #GClosureNotify for @data.
+@connect_flags: a combination of #GConnectFlags.
+@Returns: the handler id
+
+
+<!-- ##### FUNCTION g_signal_connect_closure ##### -->
+<para>
+Connects a closure to a signal for a particular object.
+</para>
+
+@instance: the instance to connect to.
+@detailed_signal: a string of the form "signal-name::detail".
+@closure: the closure to connect.
+@after: whether the handler should be called before or after the
+ default handler of the signal.
+@Returns: the handler id
+
+
+<!-- ##### FUNCTION g_signal_connect_closure_by_id ##### -->
+<para>
+Connects a closure to a signal for a particular object.
+</para>
+
+@instance: the instance to connect to.
+@signal_id: the id of the signal.
+@detail: the detail.
+@closure: the closure to connect.
+@after: whether the handler should be called before or after the
+ default handler of the signal.
+@Returns: the handler id
+
+
+<!-- ##### FUNCTION g_signal_handler_block ##### -->
+<para>
+Blocks a handler of an instance so it will not be called during
+any signal emissions unless it is unblocked again. Thus "blocking"
+a signal handler means to temporarily deactive it, a signal handler
+has to be unblocked exactly the same amount of times it has been
+blocked before to become active again.
+</para>
+<para>
+The @handler_id has to be a valid signal handler id, connected to a
+signal of @instance.
+</para>
+
+@instance: The instance to block the signal handler of.
+@handler_id: Handler id of the handler to be blocked.
+
+
+<!-- ##### FUNCTION g_signal_handler_unblock ##### -->
+<para>
+Undoes the effect of a previous g_signal_handler_block() call.
+A blocked handler is skipped during signal emissions and will not be
+invoked, unblocking it (for exactly the amount of times it has been
+blocked before) reverts its "blocked" state, so the handler will be
+recognized by the signal system and is called upon future or currently
+ongoing signal emissions (since the order in which handlers are
+called during signal emissions is deterministic, whether the
+unblocked handler in question is called as part of a currently
+ongoing emission depends on how far that emission has proceeded
+yet).
+</para>
+<para>
+The @handler_id has to be a valid id of a signal handler that is
+connected to a signal of @instance and is currently blocked.
+</para>
+
+@instance: The instance to unblock the signal handler of.
+@handler_id: Handler id of the handler to be unblocked.
+
+
+<!-- ##### FUNCTION g_signal_handler_disconnect ##### -->
+<para>
+Disconnects a handler from an instance so it will not be called during
+any future or currently ongoing emissions of the signal it has been
+connected to. The @handler_id becomes invalid and may be reused.
+</para>
+<para>
+The @handler_id has to be a valid signal handler id, connected to a
+signal of @instance.
+</para>
+
+@instance: The instance to remove the signal handler from.
+@handler_id: Handler id of the handler to be disconnected.
+
+
+<!-- ##### FUNCTION g_signal_handler_find ##### -->
+<para>
+Finds the first signal handler that matches certain selection criteria.
+The criteria mask is passed as an OR-ed combination of #GSignalMatchType
+flags, and the criteria values are passed as arguments.
+The match @mask has to be non-0 for successful matches.
+If no handler was found, 0 is returned.
+</para>
+
+@instance: The instance owning the signal handler to be found.
+@mask: Mask indicating which of @signal_id, @detail, @closure, @func
+ and/or @data the handler has to match.
+@signal_id: Signal the handler has to be connected to.
+@detail: Signal detail the handler has to be connected to.
+@closure: The closure the handler will invoke.
+@func: The C closure callback of the handler (useless for non-C closures).
+@data: The closure data of the handler's closure.
+@Returns: A valid non-0 signal handler id for a successful match.
+
+
+<!-- ##### FUNCTION g_signal_handlers_block_matched ##### -->
+<para>
+Blocks all handlers on an instance that match a certain selection criteria.
+The criteria mask is passed as an OR-ed combination of #GSignalMatchType
+flags, and the criteria values are passed as arguments.
+Passing at least one of the %G_SIGNAL_MATCH_CLOSURE, %G_SIGNAL_MATCH_FUNC
+or %G_SIGNAL_MATCH_DATA match flags is required for successful matches.
+If no handlers were found, 0 is returned, the number of blocked handlers
+otherwise.
+</para>
+
+@instance: The instance to block handlers from.
+@mask: Mask indicating which of @signal_id, @detail, @closure, @func
+ and/or @data the handlers have to match.
+@signal_id: Signal the handlers have to be connected to.
+@detail: Signal detail the handlers have to be connected to.
+@closure: The closure the handlers will invoke.
+@func: The C closure callback of the handlers (useless for non-C closures).
+@data: The closure data of the handlers' closures.
+@Returns: The amount of handlers that got blocked.
+
+
+<!-- ##### FUNCTION g_signal_handlers_unblock_matched ##### -->
+<para>
+Unblocks all handlers on an instance that match a certain selection
+criteria. The criteria mask is passed as an OR-ed combination of
+#GSignalMatchType flags, and the criteria values are passed as arguments.
+Passing at least one of the %G_SIGNAL_MATCH_CLOSURE, %G_SIGNAL_MATCH_FUNC
+or %G_SIGNAL_MATCH_DATA match flags is required for successful matches.
+If no handlers were found, 0 is returned, the number of unblocked handlers
+otherwise. The match criteria should not apply to any handlers that are
+not currently blocked.
+</para>
+
+@instance: The instance to unblock handlers from.
+@mask: Mask indicating which of @signal_id, @detail, @closure, @func
+ and/or @data the handlers have to match.
+@signal_id: Signal the handlers have to be connected to.
+@detail: Signal detail the handlers have to be connected to.
+@closure: The closure the handlers will invoke.
+@func: The C closure callback of the handlers (useless for non-C closures).
+@data: The closure data of the handlers' closures.
+@Returns: The amount of handlers that got unblocked.
+
+
+<!-- ##### FUNCTION g_signal_handlers_disconnect_matched ##### -->
+<para>
+Disconnects all handlers on an instance that match a certain selection
+criteria. The criteria mask is passed as an OR-ed combination of
+#GSignalMatchType flags, and the criteria values are passed as arguments.
+Passing at least one of the %G_SIGNAL_MATCH_CLOSURE, %G_SIGNAL_MATCH_FUNC
+or %G_SIGNAL_MATCH_DATA match flags is required for successful matches.
+If no handlers were found, 0 is returned, the number of disconnected
+handlers otherwise.
+</para>
+
+@instance: The instance to remove handlers from.
+@mask: Mask indicating which of @signal_id, @detail, @closure, @func
+ and/or @data the handlers have to match.
+@signal_id: Signal the handlers have to be connected to.
+@detail: Signal detail the handlers have to be connected to.
+@closure: The closure the handlers will invoke.
+@func: The C closure callback of the handlers (useless for non-C closures).
+@data: The closure data of the handlers' closures.
+@Returns: The amount of handlers that got disconnected.
+
+
+<!-- ##### FUNCTION g_signal_handler_is_connected ##### -->
+<para>
+Returns whether @handler_id is the id of a handler connected to @instance.
+</para>
+
+@instance: The instance where a signal handler is sought.
+@handler_id: the handler id.
+@Returns: whether @handler_id identifies a handler connected to @instance.
+
+
+<!-- ##### MACRO g_signal_handlers_block_by_func ##### -->
+<para>
+Blocks all handlers on an instance that match @func and @data.
+</para>
+
+@instance: The instance to block handlers from.
+@func: The C closure callback of the handlers (useless for non-C closures).
+@data: The closure data of the handlers' closures.
+@Returns: The number of handlers that got blocked.
+
+
+<!-- ##### MACRO g_signal_handlers_unblock_by_func ##### -->
+<para>
+Unblocks all handlers on an instance that match @func and @data.
+</para>
+
+@instance: The instance to unblock handlers from.
+@func: The C closure callback of the handlers (useless for non-C closures).
+@data: The closure data of the handlers' closures.
+@Returns: The number of handlers that got unblocked.
+
+
+<!-- ##### MACRO g_signal_handlers_disconnect_by_func ##### -->
+<para>
+Disconnects all handlers on an instance that match @func and @data.
+</para>
+
+@instance: The instance to remove handlers from.
+@func: The C closure callback of the handlers (useless for non-C closures).
+@data: The closure data of the handlers' closures.
+@Returns: The number of handlers that got disconnected.
+
+
+<!-- ##### FUNCTION g_signal_has_handler_pending ##### -->
+<para>
+Returns whether there are any handlers connected to @instance for the
+given signal id and detail.
+</para>
+<para>
+One example of when you might use this is when the arguments to the
+signal are difficult to compute. A class implementor may opt to not emit
+the signal if no one is attached anyway, thus saving the cost of building
+the arguments.
+</para>
+
+@instance: the object whose signal handlers are sought.
+@signal_id: the signal id.
+@detail: the detail.
+@may_be_blocked: whether blocked handlers should count as match.
+@Returns: %TRUE if a handler is connected to the signal,
+ %FALSE otherwise.
+
+
+<!-- ##### FUNCTION g_signal_stop_emission ##### -->
+<para>
+Stops a signal's current emission.
+</para>
+<para>
+This will prevent the default method from running, if the signal was
+%G_SIGNAL_RUN_LAST and you connected normally (i.e. without the "after"
+flag).
+</para>
+<para>
+Prints a warning if used on a signal which isn't being emitted.
+</para>
+
+@instance: the object whose signal handlers you wish to stop.
+@signal_id: the signal identifier, as returned by g_signal_lookup().
+@detail: the detail which the signal was emitted with.
+
+
+<!-- ##### FUNCTION g_signal_stop_emission_by_name ##### -->
+<para>
+Stops a signal's current emission.
+</para>
+<para>
+This is just like g_signal_stop_emission() except it will look up the
+signal id for you.
+</para>
+
+@instance: the object whose signal handlers you wish to stop.
+@detailed_signal: a string of the form "signal-name::detail".
+
+
+<!-- ##### FUNCTION g_signal_override_class_closure ##### -->
+<para>
+Overrides the class closure (i.e. the default handler) for the given signal
+for emissions on instances of @instance_type. @instance_type must be derived
+from the type to which the signal belongs.
+</para>
+
+@signal_id: the signal id
+@instance_type: the instance type on which to override the class closure
+ for the signal.
+@class_closure: the closure.
+
+
+<!-- ##### FUNCTION g_signal_chain_from_overridden ##### -->
+<para>
+Calls the original class closure of a signal. This function should only
+be called from an overridden class closure; see
+g_signal_override_class_closure().
+</para>
+
+@instance_and_params: the argument list of the signal emission. The first
+ element in the array is a #GValue for the instance the signal is being
+ emitted on. The rest are any arguments to be passed to the signal.
+@return_value: Location for the return value.
+
+
+<!-- ##### FUNCTION g_signal_add_emission_hook ##### -->
+<para>
+Adds an emission hook for a signal, which will get called for any emission
+of that signal, independent of the instance. This is possible only
+for signals which don't have #G_SIGNAL_NO_HOOKS flag set.
+</para>
+
+@signal_id: the signal identifier, as returned by g_signal_lookup().
+@detail: the detail on which to call the hook.
+@hook_func: a #GSignalEmissionHook function.
+@hook_data: user data for @hook_func.
+@data_destroy: a #GDestroyNotify for @hook_data.
+@Returns: the hook id, for later use with g_signal_remove_emission_hook().
+
+
+<!-- ##### FUNCTION g_signal_remove_emission_hook ##### -->
+<para>
+Deletes an emission hook.
+</para>
+
+@signal_id: the id of the signal
+@hook_id: the id of the emission hook, as returned by
+g_signal_add_emission_hook()
+
+
+<!-- ##### FUNCTION g_signal_parse_name ##### -->
+<para>
+Internal function to parse a signal name into its @signal_id
+and @detail quark.
+</para>
+
+@detailed_signal: a string of the form "signal-name::detail".
+@itype: The interface/instance type that introduced "signal-name".
+@signal_id_p: Location to store the signal id.
+@detail_p: Location to store the detail quark.
+@force_detail_quark: %TRUE forces creation of a #GQuark for the detail.
+@Returns: Whether the signal name could successfully be parsed and @signal_id_p and @detail_p contain valid return values.
+
+
+<!-- ##### FUNCTION g_signal_get_invocation_hint ##### -->
+<para>
+Returns the invocation hint of the innermost signal emission of instance.
+</para>
+
+@instance: the instance to query
+@Returns: the invocation hint of the innermost signal emission.
+
+
+<!-- ##### FUNCTION g_signal_type_cclosure_new ##### -->
+<para>
+Creates a new closure which invokes the function found at the offset
+@struct_offset in the class structure of the interface or classed type
+identified by @itype.
+</para>
+
+@itype: the #GType identifier of an interface or classed type
+@struct_offset: the offset of the member function of @itype's class
+ structure which is to be invoked by the new closure
+@Returns: a new #GCClosure
+
+
+<!-- ##### FUNCTION g_signal_accumulator_true_handled ##### -->
+<para>
+A predefined #GSignalAccumulator for signals that return a
+boolean values. The behavior that this accumulator gives is
+that a return of %TRUE stops the signal emission: no further
+callbacks will be invoked, while a return of %FALSE allows
+the emission to coninue. The idea here is that a %TRUE return
+indicates that the callback <emphasis>handled</emphasis> the signal,
+and no further handling is needed.
+</para>
+
+@ihint: standard #GSignalAccumulator parameter
+@return_accu: standard #GSignalAccumulator parameter
+@handler_return: standard #GSignalAccumulator parameter
+@dummy: standard #GSignalAccumulator parameter
+@Returns: standard #GSignalAccumulator result
+@Since: 2.4
+
+
diff --git a/trunk/docs/reference/gobject/tmpl/value_arrays.sgml b/trunk/docs/reference/gobject/tmpl/value_arrays.sgml
new file mode 100644
index 000000000..36a560cce
--- /dev/null
+++ b/trunk/docs/reference/gobject/tmpl/value_arrays.sgml
@@ -0,0 +1,140 @@
+<!-- ##### SECTION Title ##### -->
+Value arrays
+
+<!-- ##### SECTION Short_Description ##### -->
+A container structure to maintain an array of generic values
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The prime purpose of a #GValueArray is for it to be used as an object property
+that holds an array of values. A #GValueArray wraps an array of #GValue elements
+in order for it to be used as a boxed type through %G_TYPE_VALUE_ARRAY.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+#GValue, #GParamSpecValueArray, g_param_spec_value_array()
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### STRUCT GValueArray ##### -->
+<para>
+A #GValueArray contains an array of #GValue elements.
+</para>
+
+@n_values: number of values contained in the array
+@values: array of values
+
+<!-- ##### FUNCTION g_value_array_get_nth ##### -->
+<para>
+Return a pointer to the value at @index_ containd in @value_array.
+</para>
+
+@value_array: #GValueArray to get a value from
+@index_: index of the value of interest
+@Returns: pointer to a value at @index_ in @value_array
+
+
+<!-- ##### FUNCTION g_value_array_new ##### -->
+<para>
+Allocate and initialize a new #GValueArray, optionally preserve space
+for @n_prealloced elements. New arrays always contain 0 elements,
+regardless of the value of @n_prealloced.
+</para>
+
+@n_prealloced: number of values to preallocate space for
+@Returns: a newly allocated #GValueArray with 0 values
+
+
+<!-- ##### FUNCTION g_value_array_copy ##### -->
+<para>
+Construct an exact copy of a #GValueArray by duplicating all its
+contents.
+</para>
+
+@value_array: #GValueArray to copy
+@Returns: Newly allocated copy of #GValueArray
+
+
+<!-- ##### FUNCTION g_value_array_free ##### -->
+<para>
+Free a #GValueArray including its contents.
+</para>
+
+@value_array: #GValueArray to free
+
+
+<!-- ##### FUNCTION g_value_array_append ##### -->
+<para>
+Insert a copy of @value as last element of @value_array.
+</para>
+
+@value_array: #GValueArray to add an element to
+@value: #GValue to copy into #GValueArray
+@Returns: the #GValueArray passed in as @value_array
+
+
+<!-- ##### FUNCTION g_value_array_prepend ##### -->
+<para>
+Insert a copy of @value as first element of @value_array.
+</para>
+
+@value_array: #GValueArray to add an element to
+@value: #GValue to copy into #GValueArray
+@Returns: the #GValueArray passed in as @value_array
+
+
+<!-- ##### FUNCTION g_value_array_insert ##### -->
+<para>
+Insert a copy of @value at specified position into @value_array.
+</para>
+
+@value_array: #GValueArray to add an element to
+@index_: insertion position, must be &lt;= value_array-&gt;n_values
+@value: #GValue to copy into #GValueArray
+@Returns: the #GValueArray passed in as @value_array
+
+
+<!-- ##### FUNCTION g_value_array_remove ##### -->
+<para>
+Remove the value at position @index_ from @value_array.
+</para>
+
+@value_array: #GValueArray to remove an element from
+@index_: position of value to remove, must be &lt; value_array->n_values
+@Returns: the #GValueArray passed in as @value_array
+
+
+<!-- ##### FUNCTION g_value_array_sort ##### -->
+<para>
+Sort @value_array using @compare_func to compare the elements accoring to
+the semantics of #GCompareFunc.
+</para>
+
+<para>
+The current implementation uses Quick-Sort as sorting algorithm.
+</para>
+
+@value_array: #GValueArray to sort
+@compare_func: function to compare elements
+@Returns: the #GValueArray passed in as @value_array
+
+
+<!-- ##### FUNCTION g_value_array_sort_with_data ##### -->
+<para>
+Sort @value_array using @compare_func to compare the elements accoring
+to the semantics of #GCompareDataFunc.
+</para>
+
+<para>
+The current implementation uses Quick-Sort as sorting algorithm.
+</para>
+
+@value_array: #GValueArray to sort
+@compare_func: function to compare elements
+@user_data: extra data argument provided for @compare_func
+@Returns: the #GValueArray passed in as @value_array
+
+
diff --git a/trunk/docs/reference/gobject/tmpl/value_collection.sgml b/trunk/docs/reference/gobject/tmpl/value_collection.sgml
new file mode 100644
index 000000000..18cbf503f
--- /dev/null
+++ b/trunk/docs/reference/gobject/tmpl/value_collection.sgml
@@ -0,0 +1,66 @@
+<!-- ##### SECTION Title ##### -->
+Varargs Value Collection
+
+<!-- ##### SECTION Short_Description ##### -->
+Converting varargs to generic values
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+The macros in this section provide the varargs parsing support needed
+in variadic GObject functions such as g_object_new() or g_object_set().
+They currently support the collection of integral types, floating point
+types and pointers.
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+#GValueTable
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### UNION GTypeCValue ##### -->
+<para>
+A union holding one collected value.
+</para>
+
+
+<!-- ##### MACRO G_VALUE_COLLECT ##### -->
+<para>
+Collects a variable argument value from a va_list. We have to
+implement the varargs collection as a macro, because on some systems
+va_list variables cannot be passed by reference.
+</para>
+
+@value: a #GValue return location. @value is supposed to be initialized
+ according to the value type to be collected
+@var_args: the va_list variable; it may be evaluated multiple times
+@flags: flags which are passed on to the collect_value() function of
+ the #GTypeValueTable of @value.
+@__error: a #gchar** variable that will be modified to hold a g_new()
+ allocated error messages if something fails
+
+
+<!-- ##### MACRO G_VALUE_LCOPY ##### -->
+<para>
+Collects a value's variable argument locations from a va_list.
+</para>
+
+@value: a #GValue return location. @value is supposed to be initialized
+ according to the value type to be collected
+@var_args: the va_list variable; it may be evaluated multiple times
+@flags: flags which are passed on to the lcopy_value() function of
+ the #GTypeValueTable of @value.
+@__error: a #gchar** variable that will be modified to hold a g_new()
+ allocated error messages if something fails
+
+
+<!-- ##### MACRO G_VALUE_COLLECT_FORMAT_MAX_LENGTH ##### -->
+<para>
+The maximal number of #GTypeCValue<!-- -->s which can be collected for a
+single #GValue.
+</para>
+
+
+
diff --git a/trunk/docs/reference/gobject/tut_gobject.xml b/trunk/docs/reference/gobject/tut_gobject.xml
new file mode 100644
index 000000000..e7a6f51e7
--- /dev/null
+++ b/trunk/docs/reference/gobject/tut_gobject.xml
@@ -0,0 +1,771 @@
+<?xml version='1.0' encoding="ISO-8859-1"?>
+<chapter id="chapter-gobject">
+ <title>The GObject base class</title>
+
+ <para>
+ The two previous chapters discussed the details of Glib's Dynamic Type System
+ and its signal control system. The GObject library also contains an implementation
+ for a base fundamental type named <type><link linkend="GObject">GObject</link></type>.
+ </para>
+
+ <para>
+ <type><link linkend="GObject">GObject</link></type> is a fundamental classed instantiable type. It implements:
+ <itemizedlist>
+ <listitem><para>Memory management with reference counting</para></listitem>
+ <listitem><para>Construction/Destruction of instances</para></listitem>
+ <listitem><para>Generic per-object properties with set/get function pairs</para></listitem>
+ <listitem><para>Easy use of signals</para></listitem>
+ </itemizedlist>
+ All the GNOME libraries which use the GLib type system (like Gtk+ and GStreamer)
+ inherit from <type><link linkend="GObject">GObject</link></type> which is why it is important to understand
+ the details of how it works.
+ </para>
+
+ <sect1 id="gobject-instanciation">
+ <title>Object instanciation</title>
+
+ <para>
+ The <function><link linkend="g-object-new">g_object_new</link></function> family of functions can be used to instantiate any
+ GType which inherits from the GObject base type. All these functions make sure the class
+ and instance structures have been correctly initialized by glib's type system and
+ then invoke at one point or another the constructor class method which is used to:
+ <itemizedlist>
+ <listitem><para>
+ Allocate and clear memory through <function><link linkend="g-type-create-instance">g_type_create_instance</link></function>,
+ </para></listitem>
+ <listitem><para>
+ Initialize the object' instance with the construction properties.
+ </para></listitem>
+ </itemizedlist>
+ Although one can expect all class and instance members (except the fields
+ pointing to the parents) to be set to zero, some consider it good practice to explicitly set them.
+ </para>
+
+ <para>
+ Objects which inherit from GObject are allowed to override this constructor class method:
+ they should however chain to their parent constructor method before doing so:
+<programlisting>
+ GObject* (*constructor) (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties);
+</programlisting>
+ </para>
+
+ <para>
+ The example below shows how <type>MamanBar</type> overrides the parent's constructor:
+<programlisting>
+#define MAMAN_TYPE_BAR (maman_bar_get_type ())
+#define MAMAN_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_BAR, MamanBar))
+#define MAMAN_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_TYPE_BAR, MamanBarClass))
+#define MAMAN_IS_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_BAR))
+#define MAMAN_IS_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_TYPE_BAR))
+#define MAMAN_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_TYPE_BAR, MamanBarClass))
+
+typedef struct _MamanBar MamanBar;
+typedef struct _MamanBarClass MamanBarClass;
+
+struct _MamanBar {
+ GObject parent;
+ /* instance members */
+};
+
+struct _MamanBarClass {
+ GObjectClass parent;
+
+ /* class members */
+};
+
+/* used by MAMAN_TYPE_BAR */
+GType maman_bar_get_type (void);
+
+static GObject *
+maman_bar_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties)
+{
+ GObject *obj;
+
+ {
+ /* Invoke parent constructor. */
+ MamanBarClass *klass;
+ GObjectClass *parent_class;
+ klass = MAMAN_BAR_CLASS (g_type_class_peek (MAMAN_TYPE_BAR));
+ parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
+ obj = parent_class->constructor (type,
+ n_construct_properties,
+ construct_properties);
+ }
+
+ /* do stuff. */
+
+ return obj;
+}
+
+static void
+maman_bar_instance_init (GTypeInstance *instance,
+ gpointer g_class)
+{
+ MamanBar *self = (MamanBar *)instance;
+ /* do stuff */
+}
+
+static void
+maman_bar_class_init (gpointer g_class,
+ gpointer g_class_data)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
+ MamanBarClass *klass = MAMAN_BAR_CLASS (g_class);
+
+ gobject_class->constructor = maman_bar_constructor;
+}
+
+GType maman_bar_get_type (void)
+{
+ static GType type = 0;
+ if (type == 0) {
+ static const GTypeInfo info = {
+ sizeof (MamanBarClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ maman_bar_class_init, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (MamanBar),
+ 0, /* n_preallocs */
+ maman_bar_instance_init /* instance_init */
+ };
+ type = g_type_register_static (G_TYPE_OBJECT,
+ "MamanBarType",
+ &amp;info, 0);
+ }
+ return type;
+}
+</programlisting>
+ If the user instantiates an object <type>MamanBar</type> with:
+<programlisting>
+MamanBar *bar = g_object_new (MAMAN_TYPE_BAR, NULL);
+</programlisting>
+ If this is the first instantiation of such an object, the <function>maman_b_class_init</function>
+ function will be invoked after any <function>maman_b_base_class_init</function> function.
+ This will make sure the class structure of this new object is correctly initialized. Here,
+ <function>maman_bar_class_init</function> is expected to override the object's class methods
+ and setup the class' own methods. In the example above, the constructor method is the only
+ overridden method: it is set to <function>maman_bar_constructor</function>.
+ </para>
+
+ <para>
+ Once <function><link linkend="g-object-new">g_object_new</link></function> has obtained a reference to an initialized
+ class structure, it invokes its constructor method to create an instance of the new
+ object. Since it has just been overridden by <function>maman_bar_class_init</function>
+ to <function>maman_bar_constructor</function>, the latter is called and, because it
+ was implemented correctly, it chains up to its parent's constructor. The problem here
+ is how we can find the parent constructor. An approach (used in GTK+ source code) would be
+ to save the original constructor in a static variable from <function>maman_bar_class_init</function>
+ and then to re-use it from <function>maman_bar_constructor</function>. This is clearly possible
+ and very simple but I was told it was not nice and the prefered way is to use the
+ <function><link linkend="g-type-class-peek">g_type_class_peek</link></function> and <function><link linkend="g-type-class-peek-parent">g_type_class_peek_parent</link></function> functions.
+ </para>
+
+ <para>
+ Finally, at one point or another, <function>g_object_constructor</function> is invoked
+ by the last constructor in the chain. This function allocates the object's instance' buffer
+ through <function><link linkend="g-type-create-instance">g_type_create_instance</link></function>
+ which means that the instance_init function is invoked at this point if one
+ was registered. After instance_init returns, the object is fully initialized and should be
+ ready to answer any user-request. When <function><link linkend="g-type-create-instance">g_type_create_instance</link></function>
+ returns, <function>g_object_constructor</function> sets the construction properties
+ (ie: the properties which were given to <function><link linkend="g-object-new">g_object_new</link></function>) and returns
+ to the user's constructor which is then allowed to do useful instance initialization...
+ </para>
+
+ <para>
+ The process described above might seem a bit complicated (it <emphasis>is</emphasis> actually
+ overly complicated in my opinion..) but it can be summarized easily by the table below which
+ lists the functions invoked by <function><link linkend="g-object-new">g_object_new</link></function> and their order of
+ invocation.
+ </para>
+
+ <para>
+ The array below lists the functions invoked by <function><link linkend="g-object-new">g_object_new</link></function> and
+ their order of invocation:
+
+ <table id="gobject-construction-table">
+ <title><function><link linkend="g-object-new">g_object_new</link></function></title>
+ <tgroup cols="3">
+ <colspec colwidth="*" colnum="1" align="left"/>
+ <colspec colwidth="*" colnum="2" align="left"/>
+ <colspec colwidth="8*" colnum="3" align="left"/>
+
+ <thead>
+ <row>
+ <entry>Invocation time</entry>
+ <entry>Function Invoked</entry>
+ <entry>Function's parameters</entry>
+ <entry>Remark</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry morerows="3">First call to <function><link linkend="g-object-new">g_object_new</link></function> for target type</entry>
+ <entry>target type's base_init function</entry>
+ <entry>On the inheritance tree of classes from fundamental type to target type.
+ base_init is invoked once for each class structure.</entry>
+ <entry>
+ I have no real idea on how this can be used. If you have a good real-life
+ example of how a class' base_init can be used, please, let me know.
+ </entry>
+ </row>
+ <row>
+ <!--entry>First call to <function><link linkend="g-object-new">g_object_new</link></function> for target type</entry-->
+ <entry>target type's class_init function</entry>
+ <entry>On target type's class structure</entry>
+ <entry>
+ Here, you should make sure to initialize or override class methods (that is,
+ assign to each class' method its function pointer) and create the signals and
+ the properties associated to your object.
+ </entry>
+ </row>
+ <row>
+ <!--entry>First call to <function><link linkend="g-object-new">g_object_new</link></function> for target type</entry-->
+ <entry>interface' base_init function</entry>
+ <entry>On interface' vtable</entry>
+ <entry></entry>
+ </row>
+ <row>
+ <!--entry>First call to <function><link linkend="g-object-new">g_object_new</link></function> for target type</entry-->
+ <entry>interface' interface_init function</entry>
+ <entry>On interface' vtable</entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry morerows="1">Each call to <function><link linkend="g-object-new">g_object_new</link></function> for target type</entry>
+ <entry>target type's class constructor method: GObjectClass->constructor</entry>
+ <entry>On object's instance</entry>
+ <entry>
+ If you need to complete the object initialization after all the construction properties
+ are set, override the constructor method and make sure to chain up to the object's
+ parent class before doing your own initialization.
+ In doubt, do not override the constructor method.
+ </entry>
+ </row>
+ <row>
+ <!--entry>Each call to <function><link linkend="g-object-new">g_object_new</link></function> for target type</entry-->
+ <entry>type's instance_init function</entry>
+ <entry>On the inheritance tree of classes from fundamental type to target type.
+ the instance_init provided for each type is invoked once for each instance
+ structure.</entry>
+ <entry>
+ Provide an instance_init function to initialize your object before its construction
+ properties are set. This is the preferred way to initialize a GObject instance.
+ This function is equivalent to C++ constructors.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </para>
+
+ <para>
+ Readers should feel concerned about one little twist in the order in which functions
+ are invoked: while, technically, the class' constructor method is called
+ <emphasis>before</emphasis> the GType's instance_init function (since
+ <function><link linkend="g-type-create-instance">g_type_create_instance</link></function> which calls instance_init is called by
+ <function>g_object_constructor</function> which is the top-level class
+ constructor method and to which users are expected to chain to), the user's code
+ which runs in a user-provided constructor will always run <emphasis>after</emphasis>
+ GType's instance_init function since the user-provided constructor
+ <emphasis>must</emphasis> (you've been warned) chain up <emphasis>before</emphasis>
+ doing anything useful.
+ </para>
+ </sect1>
+
+ <sect1 id="gobject-memory">
+ <title>Object memory management</title>
+
+ <para>
+ The memory-management API for GObjects is a bit complicated but the idea behind it
+ is pretty simple: the goal is to provide a flexible model based on reference counting
+ which can be integrated in applications which use or require different memory management
+ models (such as garbage collection, aso...). The methods which are used to
+ manipulate this reference count are described below.
+<programlisting>
+/*
+ Refcounting
+*/
+gpointer g_object_ref (gpointer object);
+void g_object_unref (gpointer object);
+
+/*
+ Weak References
+*/
+typedef void (*GWeakNotify) (gpointer data,
+ GObject *where_the_object_was);
+void g_object_weak_ref (GObject *object,
+ GWeakNotify notify,
+ gpointer data);
+void g_object_weak_unref (GObject *object,
+ GWeakNotify notify,
+ gpointer data);
+void g_object_add_weak_pointer (GObject *object,
+ gpointer *weak_pointer_location);
+void g_object_remove_weak_pointer (GObject *object,
+ gpointer *weak_pointer_location);
+/*
+ Cycle handling
+*/
+void g_object_run_dispose (GObject *object);
+</programlisting>
+ </para>
+
+ <sect2 id="gobject-memory-refcount">
+ <title>Reference count</title>
+
+ <para>
+ The functions <function><link linkend="g-object-ref">g_object_ref</link></function>/<function><link linkend="g-object-unref">g_object_unref</link></function> respectively
+ increase and decrease the reference count.These functions are thread-safe as of GLib 2.8.
+ The reference count is, unsurprisingly, initialized to one by
+ <function><link linkend="g-object-new">g_object_new</link></function> which means that the caller
+ is currenly the sole owner of the newly-created reference.
+ When the reference count reaches zero, that is,
+ when <function><link linkend="g-object-unref">g_object_unref</link></function> is called by the last client holding
+ a reference to the object, the <emphasis>dispose</emphasis> and the
+ <emphasis>finalize</emphasis> class methods are invoked.
+ </para>
+ <para>
+ Finally, after <emphasis>finalize</emphasis> is invoked,
+ <function><link linkend="g-type-free-instance">g_type_free_instance</link></function> is called to free the object instance.
+ Depending on the memory allocation policy decided when the type was registered (through
+ one of the <function>g_type_register_*</function> functions), the object's instance
+ memory will be freed or returned to the object pool for this type.
+ Once the object has been freed, if it was the last instance of the type, the type's class
+ will be destroyed as described in <xref linkend="gtype-instantiable-classed"/> and
+ <xref linkend="gtype-non-instantiable-classed"/>.
+ </para>
+
+ <para>
+ The table below summarizes the destruction process of a GObject:
+ <table id="gobject-destruction-table">
+ <title><function><link linkend="g-object-unref">g_object_unref</link></function></title>
+ <tgroup cols="3">
+ <colspec colwidth="*" colnum="1" align="left"/>
+ <colspec colwidth="*" colnum="2" align="left"/>
+ <colspec colwidth="8*" colnum="3" align="left"/>
+
+ <thead>
+ <row>
+ <entry>Invocation time</entry>
+ <entry>Function Invoked</entry>
+ <entry>Function's parameters</entry>
+ <entry>Remark</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry morerows="1">Last call to <function><link linkend="g-object-unref">g_object_unref</link></function> for an instance
+ of target type
+ </entry>
+ <entry>target type's dispose class function</entry>
+ <entry>GObject instance</entry>
+ <entry>
+ When dispose ends, the object should not hold any reference to any other
+ member object. The object is also expected to be able to answer client
+ method invocations (with possibly an error code but no memory violation)
+ until finalize is executed. dispose can be executed more than once.
+ dispose should chain up to its parent implementation just before returning
+ to the caller.
+ </entry>
+ </row>
+ <row>
+ <!--entry>Last call to <function><link linkend="g-object-unref">g_object_unref</link></function> for an instance
+ of target type
+ </entry-->
+ <entry>target type's finalize class function</entry>
+ <entry>GObject instance</entry>
+ <entry>
+ Finalize is expected to complete the destruction process initiated by
+ dispose. It should complete the object's destruction. finalize will be
+ executed only once.
+ finalize should chain up to its parent implementation just before returning
+ to the caller.
+ The reason why the destruction process is split is two different phases is
+ explained in <xref linkend="gobject-memory-cycles"/>.
+ </entry>
+ </row>
+ <row>
+ <entry morerows="3">Last call to <function><link linkend="g-object-unref">g_object_unref</link></function> for the last
+ instance of target type
+ </entry>
+ <entry>interface' interface_finalize function</entry>
+ <entry>On interface' vtable</entry>
+ <entry>Never used in practice. Unlikely you will need it.</entry>
+ </row>
+ <row>
+ <!--entry>Last call to <function><link linkend="g-object-unref">g_object_unref</link></function>for the last
+ instance of target type
+ </entry-->
+ <entry>interface' base_finalize function</entry>
+ <entry>On interface' vtable</entry>
+ <entry>Never used in practice. Unlikely you will need it.</entry>
+ </row>
+ <row>
+ <!--entry>Last call to <function><link linkend="g-object-unref">g_object_unref</link></function> for the last
+ instance of target type
+ </entry-->
+ <entry>target type's class_finalize function</entry>
+ <entry>On target type's class structure</entry>
+ <entry>Never used in practice. Unlikely you will need it.</entry>
+ </row>
+ <row>
+ <!--entry>Last call to <function><link linkend="g-object-unref">g_object_unref</link></function> for the last
+ instance of target type
+ </entry-->
+ <entry>type's base_finalize function</entry>
+ <entry>On the inheritance tree of classes from fundamental type to target type.
+ base_init is invoked once for each class structure.</entry>
+ <entry>Never used in practice. Unlikely you will need it.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </para>
+
+ </sect2>
+
+ <sect2 id="gobject-memory-weakref">
+ <title>Weak References</title>
+
+ <para>
+ Weak References are used to monitor object finalization:
+ <function><link linkend="g-object-weak-ref">g_object_weak_ref</link></function> adds a monitoring callback which does
+ not hold a reference to the object but which is invoked when the object runs
+ its dispose method. As such, each weak ref can be invoked more than once upon
+ object finalization (since dispose can run more than once during object
+ finalization).
+ </para>
+
+ <para>
+ <function><link linkend="g-object-weak-unref">g_object_weak_unref</link></function> can be used to remove a monitoring
+ callback from the object.
+ </para>
+
+ <para>
+ Weak References are also used to implement <function><link linkend="g-object-add-weak-pointer">g_object_add_weak_pointer</link></function>
+ and <function><link linkend="g-object-remove-weak-pointer">g_object_remove_weak_pointer</link></function>. These functions add a weak reference
+ to the object they are applied to which makes sure to nullify the pointer given by the user
+ when object is finalized.
+ </para>
+
+ </sect2>
+
+ <sect2 id="gobject-memory-cycles">
+ <title>Reference counts and cycles</title>
+
+ <para>
+ Note: the following section was inspired by James Henstridge. I guess this means that
+ all praise and all curses will be directly forwarded to him.
+ </para>
+
+ <para>
+ GObject's memory management model was designed to be easily integrated in existing code
+ using garbage collection. This is why the destruction process is split in two phases:
+ the first phase, executed in the dispose handler is supposed to release all references
+ to other member objects. The second phase, executed by the finalize handler is supposed
+ to complete the object's destruction process. Object methods should be able to run
+ without program error (that is, without segfault :) in-between the two phases.
+ </para>
+
+ <para>
+ This two-step destruction process is very useful to break reference counting cycles.
+ While the detection of the cycles is up to the external code, once the cycles have been
+ detected, the external code can invoke <function><link linkend="g-object-dispose">g_object_dispose</link></function> which
+ will indeed break any existing cycles since it will run the dispose handler associated
+ to the object and thus release all references to other objects.
+ </para>
+
+ <para>
+ Attentive readers might now have understood one of the rules about the dispose handler
+ we stated a bit sooner: the dispose handler can be invoked multiple times. Let's say we
+ have a reference count cycle: object A references B which itself references object A.
+ Let's say we have detected the cycle and we want to destroy the two objects. One way to
+ do this would be to invoke <function><link linkend="g-object-dispose">g_object_dispose</link></function> on one of the
+ objects.
+ </para>
+
+ <para>
+ If object A releases all its references to all objects, this means it releases its
+ reference to object B. If object B was not owned by anyone else, this is its last
+ reference count which means this last unref runs B's dispose handler which, in turn,
+ releases B's reference on object A. If this is A's last reference count, this last
+ unref runs A's dispose handler which is running for the second time before
+ A's finalize handler is invoked !
+ </para>
+
+ <para>
+ The above example, which might seem a bit contrived can really happen if your
+ GObject's are being handled by language bindings. I would thus suggest the rules stated above
+ for object destruction are closely followed. Otherwise, <emphasis>Bad Bad Things</emphasis>
+ will happen.
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="gobject-properties">
+ <title>Object properties</title>
+
+ <para>
+ One of GObject's nice features is its generic get/set mechanism for object
+ properties. When an object
+ is instanciated, the object's class_init handler should be used to register
+ the object's properties with <function><link linkend="g-object-class-install-property">g_object_class_install_property</link></function>
+ (implemented in <filename>gobject.c</filename>).
+ </para>
+
+ <para>
+ The best way to understand how object properties work is by looking at a real example
+ on how it is used:
+<programlisting>
+/************************************************/
+/* Implementation */
+/************************************************/
+
+enum {
+ MAMAN_BAR_CONSTRUCT_NAME = 1,
+ MAMAN_BAR_PAPA_NUMBER,
+};
+
+static void
+maman_bar_instance_init (GTypeInstance *instance,
+ gpointer g_class)
+{
+ MamanBar *self = (MamanBar *)instance;
+}
+
+static void
+maman_bar_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ MamanBar *self = (MamanBar *) object;
+
+ switch (property_id) {
+ case MAMAN_BAR_CONSTRUCT_NAME: {
+ g_free (self->priv->name);
+ self->priv->name = g_value_dup_string (value);
+ g_print ("maman: %s\n",self->priv->name);
+ }
+ break;
+ case MAMAN_BAR_PAPA_NUMBER: {
+ self->priv->papa_number = g_value_get_uchar (value);
+ g_print ("papa: %u\n",self->priv->papa_number);
+ }
+ break;
+ default:
+ /* We don't have any other property... */
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec);
+ break;
+ }
+}
+
+static void
+maman_bar_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ MamanBar *self = (MamanBar *) object;
+
+ switch (property_id) {
+ case MAMAN_BAR_CONSTRUCT_NAME: {
+ g_value_set_string (value, self->priv->name);
+ }
+ break;
+ case MAMAN_BAR_PAPA_NUMBER: {
+ g_value_set_uchar (value, self->priv->papa_number);
+ }
+ break;
+ default:
+ /* We don't have any other property... */
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec);
+ break;
+ }
+}
+
+static void
+maman_bar_class_init (gpointer g_class,
+ gpointer g_class_data)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
+ MamanBarClass *klass = MAMAN_BAR_CLASS (g_class);
+ GParamSpec *pspec;
+
+ gobject_class->set_property = maman_bar_set_property;
+ gobject_class->get_property = maman_bar_get_property;
+
+ pspec = g_param_spec_string ("maman-name",
+ "Maman construct prop",
+ "Set maman's name",
+ "no-name-set" /* default value */,
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
+ g_object_class_install_property (gobject_class,
+ MAMAN_BAR_CONSTRUCT_NAME,
+ pspec);
+
+ pspec = g_param_spec_uchar ("papa-number",
+ "Number of current Papa",
+ "Set/Get papa's number",
+ 0 /* minimum value */,
+ 10 /* maximum value */,
+ 2 /* default value */,
+ G_PARAM_READWRITE);
+ g_object_class_install_property (gobject_class,
+ MAMAN_BAR_PAPA_NUMBER,
+ pspec);
+}
+
+/************************************************/
+/* Use */
+/************************************************/
+
+GObject *bar;
+GValue val = {0,};
+bar = g_object_new (MAMAN_TYPE_SUBBAR, NULL);
+g_value_init (&amp;val, G_TYPE_CHAR);
+g_value_set_char (&amp;val, 11);
+g_object_set_property (G_OBJECT (bar), "papa-number", &amp;val);
+</programlisting>
+ The client code just above looks simple but a lot of things happen under the hood:
+ </para>
+
+ <para>
+ <function><link linkend="g-object-set-property">g_object_set_property</link></function> first ensures a property
+ with this name was registered in bar's class_init handler. If so, it calls
+ <function><link linkend="object-set-property">object_set_property</link></function> which first walks the class hierarchy,
+ from bottom, most derived type, to top, fundamental type to find the class
+ which registered that property. It then tries to convert the user-provided GValue
+ into a GValue whose type if that of the associated property.
+ </para>
+
+ <para>
+ If the user provides a signed char GValue, as is shown
+ here, and if the object's property was registered as an unsigned int,
+ <function><link linkend="g-value-transform">g_value_transform</link></function> will try to transform the input signed char into
+ an unsigned int. Of course, the success of the transformation depends on the availability
+ of the required transform function. In practice, there will almost always be a transformation
+ <footnote>
+ <para>Its behaviour might not be what you expect but it is up to you to actually avoid
+ relying on these transformations.
+ </para>
+ </footnote>
+ which matches and conversion will be caried out if needed.
+ </para>
+
+ <para>
+ After transformation, the <type><link linkend="GValue">GValue</link></type> is validated by
+ <function><link linkend="g-param-value-validate">g_param_value_validate</link></function> which makes sure the user's
+ data stored in the <type><link linkend="GValue">GValue</link></type> matches the characteristics specified by
+ the property's <type><link linkend="GParamSpec">GParamSpec</link></type>. Here, the <type><link linkend="GParamSpec">GParamSpec</link></type> we
+ provided in class_init has a validation function which makes sure that the GValue
+ contains a value which respects the minimum and maximum bounds of the
+ <type><link linkend="GParamSpec">GParamSpec</link></type>. In the example above, the client's GValue does not
+ respect these constraints (it is set to 11, while the maximum is 10). As such, the
+ <function><link linkend="g-object-set-property">g_object_set_property</link></function> function will return with an error.
+ </para>
+
+ <para>
+ If the user's GValue had been set to a valid value, <function><link linkend="g-object-set-property">g_object_set_property</link></function>
+ would have proceeded with calling the object's set_property class method. Here, since our
+ implementation of Foo did override this method, the code path would jump to
+ <function>foo_set_property</function> after having retrieved from the
+ <type><link linkend="GParamSpec">GParamSpec</link></type> the <emphasis>param_id</emphasis>
+ <footnote>
+ <para>
+ It should be noted that the param_id used here need only to uniquely identify each
+ <type><link linkend="GParamSpec">GParamSpec</link></type> within the <type><link linkend="FooClass">FooClass</link></type> such that the switch
+ used in the set and get methods actually works. Of course, this locally-unique
+ integer is purely an optimization: it would have been possible to use a set of
+ <emphasis>if (strcmp (a, b) == 0) {} else if (strcmp (a, b) == 0) {}</emphasis> statements.
+ </para>
+ </footnote>
+ which had been stored by
+ <function><link linkend="g-object-class-install-property">g_object_class_install_property</link></function>.
+ </para>
+
+ <para>
+ Once the property has been set by the object's set_property class method, the code path
+ returns to <function><link linkend="g-object-set-property">g_object_set_property</link></function> which calls
+ <function><link linkend="g-object-notify-queue-thaw">g_object_notify_queue_thaw</link></function>. This function makes sure that
+ the "notify" signal is emitted on the object's instance with the changed property as
+ parameter unless notifications were frozen by <function><link linkend="g-object-freeze-notify">g_object_freeze_notify</link></function>.
+ </para>
+
+ <para>
+ <function><link linkend="g-object-thaw-notify">g_object_thaw_notify</link></function> can be used to re-enable notification of
+ property modifications through the "notify" signal. It is important to remember that
+ even if properties are changed while property change notification is frozen, the "notify"
+ signal will be emitted once for each of these changed properties as soon as the property
+ change notification is thawn: no property change is lost for the "notify" signal. Signal
+ can only be delayed by the notification freezing mechanism.
+ </para>
+
+ <para>
+ It sounds like a tedious task to set up GValues everytime when one wants to modify a property.
+ In practice one will rarely do this. The functions <function><link linkend="g-object-set-property">g_object_set_property</link></function>
+ and <function><link linkend="g-object-get-property">g_object_get_property</link></function>
+ are meant to be used by language bindings. For application there is an easier way and
+ that is described next.
+ </para>
+
+ <sect2 id="gobject-multi-properties">
+ <title>Accessing multiple properties at once</title>
+
+ <para>
+ It is interesting to note that the <function><link linkend="g-object-set">g_object_set</link></function> and
+ <function><link linkend="g-object-set-valist">g_object_set_valist</link></function> (vararg version) functions can be used to set
+ multiple properties at once. The client code shown above can then be re-written as:
+<programlisting>
+MamanBar *foo;
+foo = /* */;
+g_object_set (G_OBJECT (foo),
+ "papa-number", 2,
+ "maman-name", "test",
+ NULL);
+</programlisting>
+ This saves us from managing the GValues that we were needing to handle when using
+ <function><link linkend="g-object-set-property">g_object_set_property</link></function>.
+ The code above will trigger one notify signal emission for each property modified.
+ </para>
+
+ <para>
+ Of course, the _get versions are also available: <function><link linkend="g-object-get">g_object_get</link></function>
+ and <function><link linkend="g-object-get-valist">g_object_get_valist</link></function> (vararg version) can be used to get numerous
+ properties at once.
+ </para>
+
+ <para>
+ These high level functions have one drawback - they don't provide a return result.
+ One should pay attention to the argument types and ranges when using them.
+ A know source of errors is to e.g. pass a gfloat instead of a gdouble and thus
+ shifting all subsequent parameters by four bytes. Also forgetting the terminating
+ NULL will lead to unexpected behaviour.
+ </para>
+
+ <para>
+ Really attentive readers now understand how <function><link linkend="g-object-new">g_object_new</link></function>,
+ <function><link linkend="g-object-newv">g_object_newv</link></function> and <function><link linkend="g-object-new-valist">g_object_new_valist</link></function>
+ work: they parse the user-provided variable number of parameters and invoke
+ <function><link linkend="g-object-set">g_object_set</link></function> on the parameters only after the object has been successfully constructed.
+ Of course, the "notify" signal will be emitted for each property set.
+ </para>
+
+ </sect2>
+
+<!-- @todo tell here about how to pass use handle properties in derived classe -->
+
+ </sect1>
+
+</chapter>
+
+
+
+
diff --git a/trunk/docs/reference/gobject/tut_gsignal.xml b/trunk/docs/reference/gobject/tut_gsignal.xml
new file mode 100644
index 000000000..048232cb1
--- /dev/null
+++ b/trunk/docs/reference/gobject/tut_gsignal.xml
@@ -0,0 +1,520 @@
+<?xml version='1.0' encoding="ISO-8859-1"?>
+<chapter id="chapter-signal">
+ <title>The GObject messaging system</title>
+
+ <sect1 id="closure">
+ <title>Closures</title>
+
+ <para>
+ Closures are central to the concept of asynchronous signal delivery
+ which is widely used throughout GTK+ and GNOME applications. A Closure is an
+ abstraction, a generic representation of a callback. It is a small structure
+ which contains three objects:
+ <itemizedlist>
+ <listitem><para>a function pointer (the callback itself) whose prototype looks like:
+<programlisting>
+return_type function_callback (... , gpointer user_data);
+</programlisting>
+ </para></listitem>
+ <listitem><para>
+ the user_data pointer which is passed to the callback upon invocation of the closure
+ </para></listitem>
+ <listitem><para>
+ a function pointer which represents the destructor of the closure: whenever the
+ closure's refcount reaches zero, this function will be called before the closure
+ structure is freed.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ The <type><link linkend="GClosure">GClosure</link></type> structure represents the common functionality of all
+ closure implementations: there exists a different Closure implementation for
+ each separate runtime which wants to use the GObject type system.
+ <footnote><para>
+ In Practice, Closures sit at the boundary of language runtimes: if you are
+ writing python code and one of your Python callback receives a signal from
+ one of GTK+ widgets, the C code in GTK+ needs to execute your Python
+ code. The Closure invoked by the GTK+ object invokes the Python callback:
+ it behaves as a normal C object for GTK+ and as a normal Python object for
+ python code.
+ </para></footnote>
+ The GObject library provides a simple <type><link linkend="GCClosure">GCClosure</link></type> type which
+ is a specific implementation of closures to be used with C/C++ callbacks.
+ </para>
+ <para>
+ A <type><link linkend="GClosure">GClosure</link></type> provides simple services:
+ <itemizedlist>
+ <listitem><para>
+ Invocation (<function><link linkend="g-closure-invoke">g_closure_invoke</link></function>): this is what closures
+ were created for: they hide the details of callback invocation from the
+ callback invocator.</para>
+ </listitem>
+ <listitem><para>
+ Notification: the closure notifies listeners of certain events such as
+ closure invocation, closure invalidation and closure finalization. Listeners
+ can be registered with <function><link linkend="g-closure-add-finalize-notifier">g_closure_add_finalize_notifier</link></function>
+ (finalization notification), <function><link linkend="g-closure-add-invalidate-notifier">g_closure_add_invalidate_notifier</link></function>
+ (invalidation notification) and
+ <function><link linkend="g-closure-add-marshal-guards">g_closure_add_marshal_guards</link></function> (invocation notification).
+ There exist symmetric de-registration functions for finalization and invalidation
+ events (<function><link linkend="g-closure-remove-finalize-notifier">g_closure_remove_finalize_notifier</link></function> and
+ <function><link linkend="g-closure-remove-invalidate-notifier">g_closure_remove_invalidate_notifier</link></function>) but not for the invocation
+ process.
+ <footnote><para>
+ Closures are refcounted and notify listeners of their destruction in a two-stage
+ process: the invalidation notifiers are invoked before the finalization notifiers.
+ </para></footnote></para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+ <sect2>
+ <title>C Closures</title>
+
+ <para>
+ If you are using C or C++
+ to connect a callback to a given event, you will either use the simple <type><link linkend="GCClosure">GCClosure</link></type>s
+ which have a pretty minimal API or the even simpler <function><link linkend="g-signal-connect">g_signal_connect</link></function>
+ functions (which will be presented a bit later :).
+<programlisting>
+GClosure* g_cclosure_new (GCallback callback_func,
+ gpointer user_data,
+ GClosureNotify destroy_data);
+GClosure* g_cclosure_new_swap (GCallback callback_func,
+ gpointer user_data,
+ GClosureNotify destroy_data);
+GClosure* g_signal_type_cclosure_new (GType itype,
+ guint struct_offset);
+</programlisting>
+ </para>
+
+ <para>
+ <function><link linkend="g-cclosure-new">g_cclosure_new</link></function> will create a new closure which can invoke the
+ user-provided callback_func with the user-provided user_data as last parameter. When the closure
+ is finalized (second stage of the destruction process), it will invoke the destroy_data function
+ if the user has supplied one.
+ </para>
+
+ <para>
+ <function><link linkend="g-cclosure-new-swap">g_cclosure_new_swap</link></function> will create a new closure which can invoke the
+ user-provided callback_func with the user-provided user_data as first parameter (instead of being the
+ last parameter as with <function><link linkend="g-cclosure-new">g_cclosure_new</link></function>). When the closure
+ is finalized (second stage of the destruction process), it will invoke the destroy_data
+ function if the user has supplied one.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>non-C closures (for the fearless).</title>
+
+ <para>
+ As was explained above, Closures hide the details of callback invocation. In C,
+ callback invocation is just like function invocation: it is a matter of creating
+ the correct stack frame for the called function and executing a <emphasis>call</emphasis>
+ assembly instruction.
+ </para>
+
+ <para>
+ C closure marshallers transform the array of GValues which represent
+ the parameters to the target function into a C-style function parameter list, invoke
+ the user-supplied C function with this new parameter list, get the return value of the
+ function, transform it into a GValue and return this GValue to the marshaller caller.
+ </para>
+
+ <para>
+ The following code implements a simple marshaller in C for a C function which takes an
+ integer as first parameter and returns void.
+<programlisting>
+g_cclosure_marshal_VOID__INT (GClosure *closure,
+ GValue *return_value,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer invocation_hint,
+ gpointer marshal_data)
+{
+ typedef void (*GMarshalFunc_VOID__INT) (gpointer data1,
+ gint arg_1,
+ gpointer data2);
+ register GMarshalFunc_VOID__INT callback;
+ register GCClosure *cc = (GCClosure*) closure;
+ register gpointer data1, data2;
+
+ g_return_if_fail (n_param_values == 2);
+
+ data1 = g_value_peek_pointer (param_values + 0);
+ data2 = closure->data;
+
+ callback = (GMarshalFunc_VOID__INT) (marshal_data ? marshal_data : cc->callback);
+
+ callback (data1,
+ g_marshal_value_peek_int (param_values + 1),
+ data2);
+}
+</programlisting>
+ </para>
+
+ <para>
+ Of course, there exist other kinds of marshallers. For example, James Henstridge
+ wrote a generic Python marshaller which is used by all python Closures (a python closure
+ is used to have python-based callback be invoked by the closure invocation process).
+ This python marshaller transforms the input GValue list representing the function
+ parameters into a Python tuple which is the equivalent structure in python (you can
+ look in <function>pyg_closure_marshal</function> in <filename>pygtype.c</filename>
+ in the <emphasis>pygobject</emphasis> module in GNOME cvs server).
+ </para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="signal">
+ <title>Signals</title>
+
+ <para>
+ GObject's signals have nothing to do with standard UNIX signals: they connect
+ arbitrary application-specific events with any number of listeners.
+ For example, in GTK+, every user event (keystroke or mouse move) is received
+ from the X server and generates a GTK+ event under the form of a signal emission
+ on a given object instance.
+ </para>
+
+ <para>
+ Each signal is registered in the type system together with the type on which
+ it can be emitted: users of the type are said to <emphasis>connect</emphasis>
+ to the signal on a given type instance when they register a closure to be
+ invoked upon the signal emission. Users can also emit the signal by themselves
+ or stop the emission of the signal from within one of the closures connected
+ to the signal.
+ </para>
+
+ <para>
+ When a signal is emitted on a given type instance, all the closures
+ connected to this signal on this type instance will be invoked. All the closures
+ connected to such a signal represent callbacks whose signature looks like:
+<programlisting>
+return_type function_callback (gpointer instance, ... , gpointer user_data);
+</programlisting>
+ </para>
+
+ <sect2 id="signal-registration">
+ <title>Signal registration</title>
+
+ <para>
+ To register a new signal on an existing type, we can use any of <function><link linkend="g-signal-newv">g_signal_newv</link></function>,
+ <function><link linkend="g-signal-new-valist">g_signal_new_valist</link></function> or <function><link linkend="g-signal-new">g_signal_new</link></function> functions:
+<programlisting>
+guint g_signal_newv (const gchar *signal_name,
+ GType itype,
+ GSignalFlags signal_flags,
+ GClosure *class_closure,
+ GSignalAccumulator accumulator,
+ gpointer accu_data,
+ GSignalCMarshaller c_marshaller,
+ GType return_type,
+ guint n_params,
+ GType *param_types);
+</programlisting>
+ The number of parameters to these functions is a bit intimidating but they are relatively
+ simple:
+ <itemizedlist>
+ <listitem><para>
+ signal_name: is a string which can be used to uniquely identify a given signal.
+ </para></listitem>
+ <listitem><para>
+ itype: is the instance type on which this signal can be emitted.
+ </para></listitem>
+ <listitem><para>
+ signal_flags: partly defines the order in which closures which were connected to the
+ signal are invoked.
+ </para></listitem>
+ <listitem><para>
+ class_closure: this is the default closure for the signal: if it is not NULL upon
+ the signal emission, it will be invoked upon this emission of the signal. The
+ moment where this closure is invoked compared to other closures connected to that
+ signal depends partly on the signal_flags.
+ </para></listitem>
+ <listitem><para>
+ accumulator: this is a function pointer which is invoked after each closure
+ has been invoked. If it returns FALSE, signal emission is stopped. If it returns
+ TRUE, signal emission proceeds normally. It is also used to compute the return
+ value of the signal based on the return value of all the invoked closures.
+ </para></listitem>
+ <listitem><para>
+ accumulator_data: this pointer will be passed down to each invocation of the
+ accumulator during emission.
+ </para></listitem>
+ <listitem><para>
+ c_marshaller: this is the default C marshaller for any closure which is connected to
+ this signal.
+ </para></listitem>
+ <listitem><para>
+ return_type: this is the type of the return value of the signal.
+ </para></listitem>
+ <listitem><para>
+ n_params: this is the number of parameters this signal takes.
+ </para></listitem>
+ <listitem><para>
+ param_types: this is an array of GTypes which indicate the type of each parameter
+ of the signal. The length of this array is indicated by n_params.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ As you can see from the above definition, a signal is basically a description
+ of the closures which can be connected to this signal and a description of the
+ order in which the closures connected to this signal will be invoked.
+ </para>
+
+ </sect2>
+
+ <sect2 id="signal-connection">
+ <title>Signal connection</title>
+
+ <para>
+ If you want to connect to a signal with a closure, you have three possibilities:
+ <itemizedlist>
+ <listitem><para>
+ You can register a class closure at signal registration: this is a
+ system-wide operation. i.e.: the class_closure will be invoked during each emission
+ of a given signal on all the instances of the type which supports that signal.
+ </para></listitem>
+ <listitem><para>
+ You can use <function><link linkend="g-signal-override-class-closure">g_signal_override_class_closure</link></function> which
+ overrides the class_closure of a given type. It is possible to call this function
+ only on a derived type of the type on which the signal was registered.
+ This function is of use only to language bindings.
+ </para></listitem>
+ <listitem><para>
+ You can register a closure with the <function><link linkend="g-signal-connect">g_signal_connect</link></function>
+ family of functions. This is an instance-specific operation: the closure
+ will be invoked only during emission of a given signal on a given instance.
+ </para></listitem>
+ </itemizedlist>
+ It is also possible to connect a different kind of callback on a given signal:
+ emission hooks are invoked whenever a given signal is emitted whatever the instance on
+ which it is emitted. Emission hooks are used for example to get all mouse_clicked
+ emissions in an application to be able to emit the small mouse click sound.
+ Emission hooks are connected with <function><link linkend="g-signal-add-emission-hook">g_signal_add_emission_hook</link></function>
+ and removed with <function><link linkend="g-signal-remove-emission-hook">g_signal_remove_emission_hook</link></function>.
+ </para>
+
+ </sect2>
+
+ <sect2 id="signal-emission">
+ <title>Signal emission</title>
+
+ <para>
+ Signal emission is done through the use of the <function><link linkend="g-signal-emit">g_signal_emit</link></function> family
+ of functions.
+<programlisting>
+void g_signal_emitv (const GValue *instance_and_params,
+ guint signal_id,
+ GQuark detail,
+ GValue *return_value);
+</programlisting>
+ <itemizedlist>
+ <listitem><para>
+ The instance_and_params array of GValues contains the list of input
+ parameters to the signal. The first element of the array is the
+ instance pointer on which to invoke the signal. The following elements of
+ the array contain the list of parameters to the signal.
+ </para></listitem>
+ <listitem><para>
+ signal_id identifies the signal to invoke.
+ </para></listitem>
+ <listitem><para>
+ detail identifies the specific detail of the signal to invoke. A detail is a kind of
+ magic token/argument which is passed around during signal emission and which is used
+ by closures connected to the signal to filter out unwanted signal emissions. In most
+ cases, you can safely set this value to zero. See <xref linkend="signal-detail"/> for
+ more details about this parameter.
+ </para></listitem>
+ <listitem><para>
+ return_value holds the return value of the last closure invoked during emission if
+ no accumulator was specified. If an accumulator was specified during signal creation,
+ this accumulator is used to calculate the return_value as a function of the return
+ values of all the closures invoked during emission.
+ <footnote><para>
+ James (again!!) gives a few non-trivial examples of accumulators:
+ <quote>
+ For instance, you may have an accumulator that ignores NULL returns from
+ closures, and only accumulates the non-NULL ones. Another accumulator may try
+ to return the list of values returned by the closures.
+ </quote>
+ </para></footnote>
+ If no closure is invoked during
+ emission, the return_value is nonetheless initialized to zero/null.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ Internally, the GValue array is passed to the emission function proper,
+ <function>signal_emit_unlocked_R</function> (implemented in <filename>gsignal.c</filename>).
+ Signal emission can be decomposed in 5 steps:
+ <itemizedlist>
+ <listitem><para>
+ <emphasis>RUN_FIRST</emphasis>: if the G_SIGNAL_RUN_FIRST flag was used
+ during signal registration and if there exist a class_closure for this signal,
+ the class_closure is invoked. Jump to <emphasis>EMISSION_HOOK</emphasis> state.
+ </para></listitem>
+ <listitem><para>
+ <emphasis>EMISSION_HOOK</emphasis>: if any emission hook was added to
+ the signal, they are invoked from first to last added. Accumulate return values
+ and jump to <emphasis>HANDLER_RUN_FIRST</emphasis> state.
+ </para></listitem>
+ <listitem><para>
+ <emphasis>HANDLER_RUN_FIRST</emphasis>: if any closure were connected
+ with the <function><link linkend="g-signal-connect">g_signal_connect</link></function> family of
+ functions, and if they are not blocked (with the <function><link linkend="g-signal-handler-block">g_signal_handler_block</link></function>
+ family of functions) they are run here, from first to last connected.
+ Jump to <emphasis>RUN_LAST</emphasis> state.
+ </para></listitem>
+ <listitem><para>
+ <emphasis>RUN_LAST</emphasis>: if the G_SIGNAL_RUN_LAST
+ flag was set during registration and if a class_closure
+ was set, it is invoked here. Jump to
+ <emphasis>HANDLER_RUN_LAST</emphasis> state.
+ </para></listitem>
+ <listitem><para>
+ <emphasis>HANDLER_RUN_LAST</emphasis>: if any closure were connected
+ with the <function>g_signal_connect_after</function> family of
+ functions, if they were not invoked during HANDLER_RUN_FIRST and if they
+ are not blocked, they are run here, from first to last connected.
+ Jump to <emphasis>RUN_CLEANUP</emphasis> state.
+ </para></listitem>
+ <listitem><para>
+ <emphasis>RUN_CLEANUP</emphasis>: if the G_SIGNAL_RUN_CLEANUP flag
+ was set during registration and if a class_closure was set,
+ it is invoked here. Signal emission is completed here.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ If, at any point during emission (except in RUN_CLEANUP state), one of the
+ closures or emission hook stops the signal emission with
+ <function><link linkend="g-signal-stop">g_signal_stop</link></function>, emission jumps to CLEANUP state.
+ </para>
+
+ <para>
+ If, at any point during emission, one of the closures or emission hook
+ emits the same signal on the same instance, emission is restarted from
+ the RUN_FIRST state.
+ </para>
+
+ <para>
+ The accumulator function is invoked in all states, after invocation
+ of each closure (except in EMISSION_HOOK and CLEANUP). It accumulates
+ the closure return value into the signal return value and returns TRUE or
+ FALSE. If, at any point, it does not return TRUE, emission jumps to CLEANUP state.
+ </para>
+
+ <para>
+ If no accumulator function was provided, the value returned by the last handler
+ run will be returned by <function><link linkend="g-signal-emit">g_signal_emit</link></function>.
+ </para>
+
+ </sect2>
+
+
+ <sect2 id="signal-detail">
+ <title>The <emphasis>detail</emphasis> argument</title>
+
+ <para>All the functions related to signal emission or signal connection have a parameter
+ named the <emphasis>detail</emphasis>. Sometimes, this parameter is hidden by the API
+ but it is always there, under one form or another.
+ </para>
+
+ <para>
+ Of the three main connection functions,
+ only one has an explicit detail parameter as a <type><link linkend="GQuark">GQuark</link></type>
+ <footnote>
+ <para>A GQuark is an integer which uniquely represents a string. It is possible to transform
+ back and forth between the integer and string representations with the functions
+ <function><link linkend="g-quark-from-string">g_quark_from_string</link></function> and <function><link linkend="g-quark-to-string">g_quark_to_string</link></function>.
+ </para>
+ </footnote>:
+<programlisting>
+gulong g_signal_connect_closure_by_id (gpointer instance,
+ guint signal_id,
+ GQuark detail,
+ GClosure *closure,
+ gboolean after);
+</programlisting>
+ The two other functions hide the detail parameter in the signal name identification:
+<programlisting>
+gulong g_signal_connect_closure (gpointer instance,
+ const gchar *detailed_signal,
+ GClosure *closure,
+ gboolean after);
+gulong g_signal_connect_data (gpointer instance,
+ const gchar *detailed_signal,
+ GCallback c_handler,
+ gpointer data,
+ GClosureNotify destroy_data,
+ GConnectFlags connect_flags);
+</programlisting>
+ Their detailed_signal parameter is a string which identifies the name of the signal
+ to connect to. However, the format of this string is structured to look like
+ <emphasis>signal_name::detail_name</emphasis>. Connecting to the signal
+ named <emphasis>notify::cursor_position</emphasis> will actually connect to the signal
+ named <emphasis>notify</emphasis> with the <emphasis>cursor_position</emphasis> name.
+ Internally, the detail string is transformed to a GQuark if it is present.
+ </para>
+
+ <para>
+ Of the four main signal emission functions, three have an explicit detail parameter as a
+ <type><link linkend="GQuark">GQuark</link></type> again:
+<programlisting>
+void g_signal_emitv (const GValue *instance_and_params,
+ guint signal_id,
+ GQuark detail,
+ GValue *return_value);
+void g_signal_emit_valist (gpointer instance,
+ guint signal_id,
+ GQuark detail,
+ va_list var_args);
+void g_signal_emit (gpointer instance,
+ guint signal_id,
+ GQuark detail,
+ ...);
+</programlisting>
+ The fourth function hides it in its signal name parameter:
+<programlisting>
+void g_signal_emit_by_name (gpointer instance,
+ const gchar *detailed_signal,
+ ...);
+</programlisting>
+ The format of the detailed_signal parameter is exactly the same as the format used by
+ the <function><link linkend="g-signal-connect">g_signal_connect</link></function> functions: <emphasis>signal_name::detail_name</emphasis>.
+ </para>
+
+ <para>
+ If a detail is provided by the user to the emission function, it is used during emission to match
+ against the closures which also provide a detail.
+ If the closures' detail does not match the detail provided by the user, they will not be invoked
+ (even though they are connected to a signal which is being emitted).
+ </para>
+
+ <para>
+ This completely optional filtering mechanism is mainly used as an optimization for signals
+ which are often emitted for many different reasons: the clients can filter out which events they are
+ interested into before the closure's marshalling code runs. For example, this is used extensively
+ by the <emphasis>notify</emphasis> signal of GObject: whenever a property is modified on a GObject,
+ instead of just emitting the <emphasis>notify</emphasis> signal, GObject associates as a detail to this
+ signal emission the name of the property modified. This allows clients who wish to be notified of changes
+ to only one property to filter most events before receiving them.
+ </para>
+
+ <para>
+ As a simple rule, users can and should set the detail parameter to zero: this will disable completely
+ this optional filtering.
+ </para>
+
+ </sect2>
+
+ </sect1>
+</chapter>
+
diff --git a/trunk/docs/reference/gobject/tut_gtype.xml b/trunk/docs/reference/gobject/tut_gtype.xml
new file mode 100644
index 000000000..d660881f2
--- /dev/null
+++ b/trunk/docs/reference/gobject/tut_gtype.xml
@@ -0,0 +1,958 @@
+<?xml version='1.0' encoding="ISO-8859-1"?>
+ <chapter id="chapter-gtype">
+ <title>The Glib Dynamic Type System</title>
+
+ <para>
+ A type, as manipulated by the Glib type system, is much more generic than what
+ is usually understood as an Object type. It is best explained by looking at the
+ structure and the functions used to register new types in the type system.
+ <programlisting>
+typedef struct _GTypeInfo GTypeInfo;
+struct _GTypeInfo
+{
+ /* interface types, classed types, instantiated types */
+ guint16 class_size;
+
+ GBaseInitFunc base_init;
+ GBaseFinalizeFunc base_finalize;
+
+ /* classed types, instantiated types */
+ GClassInitFunc class_init;
+ GClassFinalizeFunc class_finalize;
+ gconstpointer class_data;
+
+ /* instantiated types */
+ guint16 instance_size;
+ guint16 n_preallocs;
+ GInstanceInitFunc instance_init;
+
+ /* value handling */
+ const GTypeValueTable *value_table;
+};
+GType g_type_register_static (GType parent_type,
+ const gchar *type_name,
+ const GTypeInfo *info,
+ GTypeFlags flags);
+GType g_type_register_fundamental (GType type_id,
+ const gchar *type_name,
+ const GTypeInfo *info,
+ const GTypeFundamentalInfo *finfo,
+ GTypeFlags flags);
+ </programlisting>
+ </para>
+
+ <para>
+ <function><link linkend="g-type-register-static">g_type_register_static</link></function> and
+ <function><link linkend="g-type-register-fundamental">g_type_register_fundamental</link></function>
+ are the C functions, defined in
+ <filename>gtype.h</filename> and implemented in <filename>gtype.c</filename>
+ which you should use to register a new <type><link linkend="GType">GType</link></type> in the program's type system.
+ It is not likely you will ever need to use
+ <function><link linkend="g-type-register-fundamental">g_type_register_fundamental</link></function> (you have to be Tim Janik
+ to do that) but in case you want to, the last chapter explains how to create
+ new fundamental types.
+ <footnote>
+ <para>
+ Please, note that there exist another registration function: the
+ <function><link linkend="g-type-register-dynamic">g_type_register_dynamic</link></function>. We will not discuss this
+ function here since its use is very similar to the <function>_static</function>
+ version.
+ </para>
+ </footnote>
+ </para>
+
+ <para>
+ Fundamental types are top-level types which do not derive from any other type
+ while other non-fundamental types derive from other types.
+ Upon initialization by <function><link linkend="g-type-init">g_type_init</link></function>, the type system not
+ only initializes its internal data structures but it also registers a number of core
+ types: some of these are fundamental types. Others are types derived from these
+ fundamental types.
+ </para>
+
+ <para>
+ Fundamental and non-Fundamental types are defined by:
+ <itemizedlist>
+ <listitem><para>
+ class size: the class_size field in <type><link linkend="GTypeInfo">GTypeInfo</link></type>.
+ </para></listitem>
+ <listitem><para>
+ class initialization functions (C++ constructor): the base_init and
+ class_init fields in <type><link linkend="GTypeInfo">GTypeInfo</link></type>.
+ </para></listitem>
+ <listitem><para>
+ class destruction functions (C++ destructor): the base_finalize and
+ class_finalize fields in <type><link linkend="GTypeInfo">GTypeInfo</link></type>.
+ </para></listitem>
+ <listitem><para>
+ instance size (C++ parameter to new): the instance_size field in
+ <type><link linkend="GTypeInfo">GTypeInfo</link></type>.
+ </para></listitem>
+ <listitem><para>
+ instanciation policy (C++ type of new operator): the n_preallocs
+ field in <type><link linkend="GTypeInfo">GTypeInfo</link></type>.
+ </para></listitem>
+ <listitem><para>
+ copy functions (C++ copy operators): the value_table field in
+ <type><link linkend="GTypeInfo">GTypeInfo</link></type>.
+ </para></listitem>
+ <listitem><para>
+ type characteristic flags: <type><link linkend="GTypeFlags">GTypeFlags</link></type>.
+ </para></listitem>
+ </itemizedlist>
+ Fundamental types are also defined by a set of <type><link linkend="GTypeFundamentalFlags">GTypeFundamentalFlags</link></type>
+ which are stored in a <type><link linkend="GTypeFundamentalInfo">GTypeFundamentalInfo</link></type>.
+ Non-Fundamental types are furthermore defined by the type of their parent which is
+ passed as the parent_type parameter to <function><link linkend="g-type-register-static">g_type_register_static</link></function>
+ and <function><link linkend="g-type-register-dynamic">g_type_register_dynamic</link></function>.
+ </para>
+
+ <sect1 id="gtype-copy">
+ <title>Copy functions</title>
+
+ <para>
+ The major common point between <emphasis>all</emphasis> glib types (fundamental and
+ non-fundamental, classed and non-classed, instantiable and non-instantiable) is that
+ they can all be manipulated through a single API to copy/assign them.
+ </para>
+
+ <para>
+ The <type><link linkend="GValue">GValue</link></type> structure is used as an abstract container for all of these
+ types. Its simplistic API (defined in <filename>gobject/gvalue.h</filename>) can be
+ used to invoke the value_table functions registered
+ during type registration: for example <function><link linkend="g-value-copy">g_value_copy</link></function> copies the
+ content of a <type><link linkend="GValue">GValue</link></type> to another <type><link linkend="GValue">GValue</link></type>. This is similar
+ to a C++ assignment which invokes the C++ copy operator to modify the default
+ bit-by-bit copy semantics of C++/C structures/classes.
+ </para>
+
+ <para>
+ The following code shows how you can copy around a 64 bit integer, as well as a <type><link linkend="GObject">GObject</link></type>
+ instance pointer (sample code for this is located in the source tarball for this document in
+ <filename>sample/gtype/test.c</filename>):
+<programlisting>
+static void test_int (void)
+{
+ GValue a_value = {0, };
+ GValue b_value = {0, };
+ guint64 a, b;
+
+ a = 0xdeadbeaf;
+
+ g_value_init (&amp;a_value, G_TYPE_UINT64);
+ g_value_set_uint64 (&amp;a_value, a);
+
+ g_value_init (&amp;b_value, G_TYPE_UINT64);
+ g_value_copy (&amp;a_value, &amp;b_value);
+
+ b = g_value_get_uint64 (&amp;b_value);
+
+ if (a == b) {
+ g_print ("Yay !! 10 lines of code to copy around a uint64.\n");
+ } else {
+ g_print ("Are you sure this is not a Z80 ?\n");
+ }
+}
+
+static void test_object (void)
+{
+ GObject *obj;
+ GValue obj_vala = {0, };
+ GValue obj_valb = {0, };
+ obj = g_object_new (MAMAN_BAR_TYPE, NULL);
+
+ g_value_init (&amp;obj_vala, MAMAN_BAR_TYPE);
+ g_value_set_object (&amp;obj_vala, obj);
+
+ g_value_init (&amp;obj_valb, G_TYPE_OBJECT);
+
+ /* g_value_copy's semantics for G_TYPE_OBJECT types is to copy the reference.
+ This function thus calls g_object_ref.
+ It is interesting to note that the assignment works here because
+ MAMAN_BAR_TYPE is a G_TYPE_OBJECT.
+ */
+ g_value_copy (&amp;obj_vala, &amp;obj_valb);
+
+ g_object_unref (G_OBJECT (obj));
+ g_object_unref (G_OBJECT (obj));
+}
+</programlisting>
+ The important point about the above code is that the exact semantic of the copy calls
+ is undefined since they depend on the implementation of the copy function. Certain
+ copy functions might decide to allocate a new chunk of memory and then to copy the
+ data from the source to the destination. Others might want to simply increment
+ the reference count of the instance and copy the reference to the new GValue.
+ </para>
+
+ <para>
+ The value_table used to specify these assignment functions is defined in
+ <filename>gtype.h</filename> and is thoroughly described in the
+ API documentation provided with GObject (for once ;-) which is why we will
+ not detail its exact semantics.
+ <programlisting>
+typedef struct _GTypeValueTable GTypeValueTable;
+struct _GTypeValueTable
+{
+ void (*value_init) (GValue *value);
+ void (*value_free) (GValue *value);
+ void (*value_copy) (const GValue *src_value,
+ GValue *dest_value);
+ /* varargs functionality (optional) */
+ gpointer (*value_peek_pointer) (const GValue *value);
+ gchar *collect_format;
+ gchar* (*collect_value) (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags);
+ gchar *lcopy_format;
+ gchar* (*lcopy_value) (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags);
+};
+ </programlisting>
+ Interestingly, it is also very unlikely
+ you will ever need to specify a value_table during type registration
+ because these value_tables are inherited from the parent types for
+ non-fundamental types which means that unless you want to write a
+ fundamental type (not a great idea !), you will not need to provide
+ a new value_table since you will inherit the value_table structure
+ from your parent type.
+ </para>
+ </sect1>
+
+ <sect1 id="gtype-conventions">
+ <title>Conventions</title>
+
+
+ <para>
+ There are a number of conventions users are expected to follow when creating new types
+ which are to be exported in a header file:
+ <itemizedlist>
+ <listitem><para>
+ Use the <function>object_method</function> pattern for function names: to invoke
+ the method named foo on an instance of object type bar, call
+ <function>bar_foo</function>.
+ </para></listitem>
+ <listitem><para>Use prefixing to avoid namespace conflicts with other projects.
+ If your library (or application) is named <emphasis>Maman</emphasis>,
+ <footnote>
+ <para>
+ <emphasis>Maman</emphasis> is the french word for <emphasis>mum</emphasis>
+ or <emphasis>mother</emphasis> - nothing more and nothing less.
+ </para>
+ </footnote>
+
+ prefix all your function names with <emphasis>maman_</emphasis>.
+ For example: <function>maman_object_method</function>.
+ </para></listitem>
+ <listitem><para>Create a macro named <function>PREFIX_OBJECT_TYPE</function> which always
+ returns the GType for the associated object type. For an object of type
+ <emphasis>Bar</emphasis> in a libray prefixed by <emphasis>maman</emphasis>,
+ use: <function>MAMAN_BAR_TYPE</function>.
+ It is common although not a convention to implement this macro using either a global
+ static variable or a function named <function>prefix_object_get_type</function>.
+ We will follow the function pattern wherever possible in this document.
+ </para></listitem>
+ <listitem><para>Create a macro named <function>PREFIX_OBJECT (obj)</function> which
+ returns a pointer of type <type>PrefixObject</type>. This macro is used to enforce
+ static type safety by doing explicit casts wherever needed. It also enforces
+ dynamic type safety by doing runtime checks. It is possible to disable the dynamic
+ type checks in production builds (see <link linkend="glib-building">building glib</link>).
+ For example, we would create
+ <function>MAMAN_BAR (obj)</function> to keep the previous example.
+ </para></listitem>
+ <listitem><para>If the type is classed, create a macro named
+ <function>PREFIX_OBJECT_CLASS (klass)</function>. This macro
+ is strictly equivalent to the previous casting macro: it does static casting with
+ dynamic type checking of class structures. It is expected to return a pointer
+ to a class structure of type <type>PrefixObjectClass</type>. Again, an example is:
+ <function>MAMAN_BAR_CLASS</function>.
+ </para></listitem>
+ <listitem><para>Create a macro named <function>PREFIX_IS_BAR (obj)</function>: this macro is expected
+ to return a <type>gboolean</type> which indicates whether or not the input
+ object instance pointer of type BAR.
+ </para></listitem>
+ <listitem><para>If the type is classed, create a macro named
+ <function>PREFIX_IS_OBJECT_CLASS (klass)</function> which, as above, returns a boolean
+ if the input class pointer is a pointer to a class of type OBJECT.
+ </para></listitem>
+ <listitem><para>If the type is classed, create a macro named
+ <function>PREFIX_OBJECT_GET_CLASS (obj)</function>
+ which returns the class pointer associated to an instance of a given type. This macro
+ is used for static and dynamic type safety purposes (just like the previous casting
+ macros).
+ </para></listitem>
+ </itemizedlist>
+ The implementation of these macros is pretty straightforward: a number of simple-to-use
+ macros are provided in <filename>gtype.h</filename>. For the example we used above, we would
+ write the following trivial code to declare the macros:
+<programlisting>
+#define MAMAN_BAR_TYPE (maman_bar_get_type ())
+#define MAMAN_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_BAR_TYPE, MamanBar))
+#define MAMAN_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_BAR_TYPE, MamanBarClass))
+#define MAMAN_IS_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_BAR_TYPE))
+#define MAMAN_IS_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_BAR_TYPE))
+#define MAMAN_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_BAR_TYPE, MamanBarClass))
+</programlisting>
+ <note><simpara>Stick to the naming <varname>klass</varname> as <varname>class</varname> is a registered c++ keyword.</simpara></note>
+ </para>
+
+ <para>
+ The following code shows how to implement the <function>maman_bar_get_type</function>
+ function:
+<programlisting>
+GType maman_bar_get_type (void)
+{
+ static GType type = 0;
+ if (type == 0) {
+ static const GTypeInfo info = {
+ /* You fill this structure. */
+ };
+ type = g_type_register_static (G_TYPE_OBJECT,
+ "MamanBarType",
+ &amp;info, 0);
+ }
+ return type;
+}
+</programlisting>
+ </para>
+
+ </sect1>
+
+ <sect1 id="gtype-non-instantiable">
+ <title>Non-Instantiable non-classed fundamental types</title>
+
+ <para>
+ A lot of types are not instantiable by the type system and do not have
+ a class. Most of these types are fundamental trivial types such as <emphasis>gchar</emphasis>,
+ registered in <function>g_value_types_init</function> (in <filename>gvaluetypes.c</filename>).
+ </para>
+
+ <para>
+ To register such a type in the type system, you just need to fill the
+ <type><link linkend="GTypeInfo">GTypeInfo</link></type> structure with zeros since these types are also most of the time
+ fundamental:
+ <programlisting>
+ GTypeInfo info = {
+ 0, /* class_size */
+ NULL, /* base_init */
+ NULL, /* base_destroy */
+ NULL, /* class_init */
+ NULL, /* class_destroy */
+ NULL, /* class_data */
+ 0, /* instance_size */
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ NULL, /* value_table */
+ };
+ static const GTypeValueTable value_table = {
+ value_init_long0, /* value_init */
+ NULL, /* value_free */
+ value_copy_long0, /* value_copy */
+ NULL, /* value_peek_pointer */
+ "i", /* collect_format */
+ value_collect_int, /* collect_value */
+ "p", /* lcopy_format */
+ value_lcopy_char, /* lcopy_value */
+ };
+ info.value_table = &amp;value_table;
+ type = g_type_register_fundamental (G_TYPE_CHAR, "gchar", &amp;info, &amp;finfo, 0);
+ </programlisting>
+ </para>
+
+
+ <para>
+ Having non-instantiable types might seem a bit useless: what good is a type
+ if you cannot instanciate an instance of that type ? Most of these types
+ are used in conjunction with <type><link linkend="GValue">GValue</link></type>s: a GValue is initialized
+ with an integer or a string and it is passed around by using the registered
+ type's value_table. <type><link linkend="GValue">GValue</link></type>s (and by extension these trivial fundamental
+ types) are most useful when used in conjunction with object properties and signals.
+ </para>
+
+ </sect1>
+
+ <sect1 id="gtype-instantiable-classed">
+ <title>Instantiable classed types: objects</title>
+
+ <para>
+ Types which are registered with a class and are declared instantiable are
+ what most closely resembles an <emphasis>object</emphasis>.
+ Although <type><link linkend="GObject">GObject</link></type>s (detailed in <xref linkend="chapter-gobject"/>)
+ are the most well known type of instantiable
+ classed types, other kinds of similar objects used as the base of an inheritance
+ hierarchy have been externally developped and they are all built on the fundamental
+ features described below.
+ </para>
+
+ <para>
+ For example, the code below shows how you could register
+ such a fundamental object type in the type system:
+<programlisting>
+typedef struct {
+ GObject parent;
+ /* instance members */
+ int field_a;
+} MamanBar;
+
+typedef struct {
+ GObjectClass parent;
+ /* class members */
+ void (*do_action_public_virtual) (MamanBar *self, guint8 i);
+
+ void (*do_action_public_pure_virtual) (MamanBar *self, guint8 i);
+} MamanBarClass;
+
+#define MAMAN_BAR_TYPE (maman_bar_get_type ())
+
+GType
+maman_bar_get_type (void)
+{
+ static GType type = 0;
+ if (type == 0) {
+ static const GTypeInfo info = {
+ sizeof (MamanBarClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) foo_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (MamanBar),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) NULL /* instance_init */
+ };
+ type = g_type_register_static (G_TYPE_OBJECT,
+ "BarType",
+ &amp;info, 0);
+ }
+ return type;
+}
+</programlisting>
+ Upon the first call to <function>maman_bar_get_type</function>, the type named
+ <emphasis>BarType</emphasis> will be registered in the type system as inheriting
+ from the type <emphasis>G_TYPE_OBJECT</emphasis>.
+ </para>
+
+ <para>
+ Every object must define two structures: its class structure and its
+ instance structure. All class structures must contain as first member
+ a <type><link linkend="GTypeClass">GTypeClass</link></type> structure. All instance structures must contain as first
+ member a <type><link linkend="GTypeInstance">GTypeInstance</link></type> structure. The declaration of these C types,
+ coming from <filename>gtype.h</filename> is shown below:
+<programlisting>
+struct _GTypeClass
+{
+ GType g_type;
+};
+struct _GTypeInstance
+{
+ GTypeClass *g_class;
+};
+</programlisting>
+ These constraints allow the type system to make sure that every object instance
+ (identified by a pointer to the object's instance structure) contains in its
+ first bytes a pointer to the object's class structure.
+ </para>
+ <para>
+ This relationship is best explained by an example: let's take object B which
+ inherits from object A:
+<programlisting>
+/* A definitions */
+typedef struct {
+ GTypeInstance parent;
+ int field_a;
+ int field_b;
+} A;
+typedef struct {
+ GTypeClass parent_class;
+ void (*method_a) (void);
+ void (*method_b) (void);
+} AClass;
+
+/* B definitions. */
+typedef struct {
+ A parent;
+ int field_c;
+ int field_d;
+} B;
+typedef struct {
+ AClass parent_class;
+ void (*method_c) (void);
+ void (*method_d) (void);
+} BClass;
+</programlisting>
+ The C standard mandates that the first field of a C structure is stored starting
+ in the first byte of the buffer used to hold the structure's fields in memory.
+ This means that the first field of an instance of an object B is A's first field
+ which in turn is GTypeInstance's first field which in turn is g_class, a pointer
+ to B's class structure.
+ </para>
+
+ <para>
+ Thanks to these simple conditions, it is possible to detect the type of every
+ object instance by doing:
+<programlisting>
+B *b;
+b->parent.parent.g_class->g_type
+</programlisting>
+ or, more quickly:
+<programlisting>
+B *b;
+((GTypeInstance*)b)->g_class->g_type
+</programlisting>
+ </para>
+
+ <sect2 id="gtype-instantiable-classed-init-done">
+ <title>Initialization and Destruction</title>
+
+ <para>
+ Instanciation of these types can be done with
+ <function><link linkend="g-type-create-instance">g_type_create_instance</link></function>:
+<programlisting>
+GTypeInstance* g_type_create_instance (GType type);
+void g_type_free_instance (GTypeInstance *instance);
+</programlisting>
+ <function><link linkend="g-type-create-instance">g_type_create_instance</link></function> will lookup the type information
+ structure associated to the type requested. Then, the instance size and instanciation
+ policy (if the n_preallocs field is set to a non-zero value, the type system allocates
+ the object's instance structures in chunks rather than mallocing for every instance)
+ declared by the user are used to get a buffer to hold the object's instance
+ structure.
+ </para>
+
+ <para>
+ If this is the first instance of the object ever created, the type system must create
+ a class structure: it allocates a buffer to hold the object's class structure and
+ initializes it. It first copies the parent's class structure over this structure
+ (if there is no parent, it initializes it to zero). It then invokes the
+ base_class_initialization functions (<type><link linkend="GBaseInitFunc">GBaseInitFunc</link></type>) from topmost
+ fundamental object to bottom-most most derived object. The object's class_init
+ (<type><link linkend="GClassInitFunc">GClassInitFunc</link></type>) function is invoked afterwards to complete
+ initialization of the class structure.
+ Finally, the object's interfaces are initialized (we will discuss interface initialization
+ in more detail later).
+ <footnote id="class-init">
+ <para>
+ The class initialization process is entirely implemented in
+ <function>type_class_init_Wm</function> in <filename>gtype.c</filename>.
+ </para>
+ </footnote>
+ </para>
+
+ <para>
+ Once the type system has a pointer to an initialized class structure, it sets the object's
+ instance class pointer to the object's class structure and invokes the object's
+ instance_init (<type><link linkend="GInstanceInitFunc">GInstanceInitFunc</link></type>)functions, from top-most fundamental
+ type to bottom-most most derived type.
+ </para>
+
+ <para>
+ Object instance destruction through <function><link linkend="g-type-free-instance">g_type_free_instance</link></function> is very simple:
+ the instance structure is returned to the instance pool if there is one and if this was the
+ last living instance of the object, the class is destroyed.
+ </para>
+
+
+ <para>
+ Class destruction
+ <footnote>
+ <para>It is implemented in <function>type_data_finalize_class_U</function>
+ (in <filename>gtype.c</filename>.
+ </para>
+ </footnote>
+ (the concept of destruction is sometimes partly refered to as finalization
+ in GType) is the symmetric process of the initialization: interfaces are
+ destroyed first.
+ Then, the most derived
+ class_finalize (<type><link linkend="ClassFinalizeFunc">ClassFinalizeFunc</link></type>) function is invoked. The
+ base_class_finalize (<type><link linkend="GBaseFinalizeFunc">GBaseFinalizeFunc</link></type>) functions are
+ Finally invoked from bottom-most most-derived type to top-most fundamental type and
+ the class structure is freed.
+ </para>
+
+ <para>
+ As many readers have now understood it, the base initialization/finalization process is
+ very similar to the C++ Constructor/Destructor paradigm. The practical details are quite different
+ though and it is important not to get confused by the superficial similarities. Typically, what
+ most users have grown to know as a C++ constructor (that is, a list of
+ object methods invoked on the object instance once for each type of the inheritance hierachy) does
+ not exist in GType and must be built on top of the facilities offered by GType. Similarly,
+ GTypes have no instance destruction mechanism. It is
+ the user's responsibility to implement correct destruction semantics on top
+ of the existing GType code. (this is what GObject does. See
+ <xref linkend="chapter-gobject"/>)
+ </para>
+
+ <para>
+ For example, if the object B which derives from A is instantiated, GType will only invoke the
+ instance_init callback of object B while a C++ runtime will invoke the constructor of the object
+ type A first and then of the object type B. Furthermore, the C++ code equivalent to the base_init
+ and class_init callbacks of GType is usually not needed because C++ cannot really create object
+ types at runtime.
+ </para>
+
+ <para>
+ The instanciation/finalization process can be summarized as follows:
+ <table id="gtype-init-fini-table">
+ <title>GType Instantiation/Finalization</title>
+ <tgroup cols="3">
+ <colspec colwidth="*" colnum="1" align="left"/>
+ <colspec colwidth="*" colnum="2" align="left"/>
+ <colspec colwidth="8*" colnum="3" align="left"/>
+
+ <thead>
+ <row>
+ <entry>Invocation time</entry>
+ <entry>Function Invoked</entry>
+ <entry>Function's parameters</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry morerows="2">First call to <function><link linkend="g-type-create-instance">g_type_create_instance</link></function> for target type</entry>
+ <entry>type's base_init function</entry>
+ <entry>On the inheritance tree of classes from fundamental type to target type.
+ base_init is invoked once for each class structure.</entry>
+ </row>
+ <row>
+ <!--entry>First call to <function><link linkend="g-type-create-instance">g_type_create_instance</link></function> for target type</entry-->
+ <entry>target type's class_init function</entry>
+ <entry>On target type's class structure</entry>
+ </row>
+ <row>
+ <!--entry>First call to <function><link linkend="g-type-create-instance">g_type_create_instance</link></function> for target type</entry-->
+ <entry>interface initialization, see
+ <xref linkend="gtype-non-instantiable-classed-init"/></entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry>Each call to <function><link linkend="g-type-create-instance">g_type_create_instance</link></function> for target type</entry>
+ <entry>target type's instance_init function</entry>
+ <entry>On object's instance</entry>
+ </row>
+ <row>
+ <entry morerows="2">Last call to <function><link linkend="g-type-free-instance">g_type_free_instance</link></function> for target type</entry>
+ <entry>interface destruction, see
+ <xref linkend="gtype-non-instantiable-classed-dest"/></entry>
+ <entry></entry>
+ </row>
+ <row>
+ <!--entry>Last call to <function><link linkend="g-type-free-instance">g_type_free_instance</link></function> for target type</entry-->
+ <entry>target type's class_finalize function</entry>
+ <entry>On target type's class structure</entry>
+ </row>
+ <row>
+ <!--entry>Last call to <function><link linkend="g-type-free-instance">g_type_free_instance</link></function> for target type</entry-->
+ <entry>type's base_finalize function</entry>
+ <entry>On the inheritance tree of classes from fundamental type to target type.
+ base_finalize is invoked once for each class structure.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </para>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="gtype-non-instantiable-classed">
+ <title>Non-instantiable classed types: Interfaces.</title>
+
+ <para>
+ GType's Interfaces are very similar to Java's interfaces. They allow
+ to describe a common API that several classes will adhere to.
+ Imagine the play, pause and stop buttons on hifi equipment - those can
+ be seen as a playback interface. Once you know what the do, you can
+ control your cd-player, mp3-player or anything that uses these symbols.
+ To declare an interfacce you have to register a non-instantiable
+ classed type which derives from
+ <type><link linkend="GTypeInterface">GTypeInterface</link></type>. The following piece of code declares such an interface.
+<programlisting>
+#define MAMAN_IBAZ_TYPE (maman_ibaz_get_type ())
+#define MAMAN_IBAZ(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_IBAZ_TYPE, MamanIbaz))
+#define MAMAN_IS_IBAZ(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_IBAZ_TYPE))
+#define MAMAN_IBAZ_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), MAMAN_IBAZ_TYPE, MamanIbazInterface))
+
+typedef struct _MamanIbaz MamanIbaz; /* dummy object */
+typedef struct _MamanIbazInterface MamanIbazInterface;
+
+struct _MamanIbazInterface {
+ GTypeInterface parent;
+
+ void (*do_action) (MamanIbaz *self);
+};
+
+GType maman_ibaz_get_type (void);
+
+void maman_ibaz_do_action (MamanIbaz *self);
+</programlisting>
+ The interface function, <function>maman_ibaz_do_action</function> is implemented
+ in a pretty simple way:
+<programlisting>
+void maman_ibaz_do_action (MamanIbaz *self)
+{
+ MAMAN_IBAZ_GET_INTERFACE (self)->do_action (self);
+}
+</programlisting>
+ <function>maman_ibaz_get_type</function> registers a type named <emphasis>MamanIBaz</emphasis>
+ which inherits from G_TYPE_INTERFACE. All interfaces must be children of G_TYPE_INTERFACE in the
+ inheritance tree.
+ </para>
+
+ <para>
+ An interface is defined by only one structure which must contain as first member
+ a <type><link linkend="GTypeInterface">GTypeInterface</link></type> structure. The interface structure is expected to
+ contain the function pointers of the interface methods. It is good style to
+ define helper functions for each of the interface methods which simply call
+ the interface' method directly: <function>maman_ibaz_do_action</function>
+ is one of these.
+ </para>
+
+ <para>
+ Once an interface type is registered, you must register implementations for these
+ interfaces. The function named <function>maman_baz_get_type</function> registers
+ a new GType named MamanBaz which inherits from <type><link linkend="GObject">GObject</link></type> and which
+ implements the interface <type>MamanIBaz</type>.
+<programlisting>
+static void maman_baz_do_action (MamanIbaz *self)
+{
+ g_print ("Baz implementation of IBaz interface Action.\n");
+}
+
+
+static void
+baz_interface_init (gpointer g_iface,
+ gpointer iface_data)
+{
+ MamanIbazInterface *iface = (MamanIbazInterface *)g_iface;
+ iface->do_action = maman_baz_do_action;
+}
+
+GType
+maman_baz_get_type (void)
+{
+ static GType type = 0;
+ if (type == 0) {
+ static const GTypeInfo info = {
+ sizeof (MamanBazInterface),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ NULL, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (MamanBaz),
+ 0, /* n_preallocs */
+ NULL /* instance_init */
+ };
+ static const GInterfaceInfo ibaz_info = {
+ (GInterfaceInitFunc) baz_interface_init, /* interface_init */
+ NULL, /* interface_finalize */
+ NULL /* interface_data */
+ };
+ type = g_type_register_static (G_TYPE_OBJECT,
+ "MamanBazType",
+ &amp;info, 0);
+ g_type_add_interface_static (type,
+ MAMAN_IBAZ_TYPE,
+ &amp;ibaz_info);
+ }
+ return type;
+}
+</programlisting>
+ </para>
+
+ <para>
+ <function><link linkend="g-type-add-interface-static">g_type_add_interface_static</link></function> records in the type system that
+ a given type implements also <type>FooInterface</type>
+ (<function>foo_interface_get_type</function> returns the type of
+ <type>FooInterface</type>).
+ The <type><link linkend="GInterfaceInfo">GInterfaceInfo</link></type> structure holds
+ information about the implementation of the interface:
+<programlisting>
+struct _GInterfaceInfo
+{
+ GInterfaceInitFunc interface_init;
+ GInterfaceFinalizeFunc interface_finalize;
+ gpointer interface_data;
+};
+</programlisting>
+ </para>
+
+ <sect2 id="gtype-non-instantiable-classed-init">
+ <title>Interface Initialization</title>
+
+ <para>
+ When an instantiable classed type which registered an interface implementation
+ is created for the first time, its class structure is initialized following the process
+ described in <xref linkend="gtype-instantiable-classed"/>. Once the class structure is
+ initialized,the function <function>type_class_init_Wm</function> (implemented in <filename>
+ gtype.c</filename>) initializes the interface implementations associated with
+ that type by calling <function>type_iface_vtable_init_Wm</function> for each
+ interface.
+ </para>
+
+ <para>
+ First a memory buffer is allocated to hold the interface structure. The parent's
+ interface structure is then copied over to the new interface structure (the parent
+ interface is already initialized at that point). If there is no parent interface,
+ the interface structure is initialized with zeros. The g_type and the g_instance_type
+ fields are then initialized: g_type is set to the type of the most-derived interface
+ and g_instance_type is set to the type of the most derived type which implements
+ this interface.
+ </para>
+
+ <para>
+ Finally, the interface' most-derived <function>base_init</function> function and then
+ the implementation's <function>interface_init</function>
+ function are invoked. It is important to understand that if there are multiple
+ implementations of an interface the <function>base_init</function> and
+ <function>interface_init</function> functions will be
+ invoked once for each implementation initialized.
+ </para>
+
+ <para>
+ It is thus common for base_init functions to hold a local static boolean variable
+ which makes sure that the interface type is initialized only once even if there are
+ multiple implementations of the interface:
+<programlisting>
+static void
+maman_ibaz_base_init (gpointer g_iface)
+{
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+ /* create interface signals here. */
+ initialized = TRUE;
+ }
+}
+</programlisting>
+ </para>
+
+ <para>
+ If you have found the stuff about interface hairy, you are right: it is hairy but
+ there is not much I can do about it. What I can do is summarize what you need to know
+ about interfaces:
+ </para>
+
+ <para>
+ The above process can be summarized as follows:
+ <table id="ginterface-init-table">
+ <title>Interface Initialization</title>
+ <tgroup cols="3">
+ <colspec colwidth="*" colnum="1" align="left"/>
+ <colspec colwidth="*" colnum="2" align="left"/>
+ <colspec colwidth="8*" colnum="3" align="left"/>
+
+ <thead>
+ <row>
+ <entry>Invocation time</entry>
+ <entry>Function Invoked</entry>
+ <entry>Function's parameters</entry>
+ <entry>Remark</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry morerows="1">First call to <function><link linkend="g-type-create-instance">g_type_create_instance</link></function> for type
+ implementing interface
+ </entry>
+ <entry>interface' base_init function</entry>
+ <entry>On interface' vtable</entry>
+ <entry>Register interface' signals here (use a local static
+ boolean variable as described above to make sure not to register them
+ twice.).</entry>
+ </row>
+ <row>
+ <!--entry>First call to <function><link linkend="g-type-create-instance">g_type_create_instance</link></function> for type
+ implementing interface
+ </entry-->
+ <entry>interface' interface_init function</entry>
+ <entry>On interface' vtable</entry>
+ <entry>
+ Initialize interface' implementation. That is, initialize the interface
+ method pointers in the interface structure to the function's implementation.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ It is highly unlikely (ie: I do not know of <emphasis>anyone</emphasis> who actually
+ used it) you will ever need other more fancy things such as the ones described in the
+ following section (<xref linkend="gtype-non-instantiable-classed-dest"/>).
+ </para>
+
+ </sect2>
+
+ <sect2 id="gtype-non-instantiable-classed-dest">
+ <title>Interface Destruction</title>
+
+ <para>
+ When the last instance of an instantiable type which registered an interface implementation
+ is destroyed, the interface's implementations associated to the type are destroyed by
+ <function>type_iface_vtable_finalize_Wm</function> (in <filename>gtype.c</filename>).
+ </para>
+
+ <para>
+ <function>type_iface_vtable_finalize_Wm</function> invokes first the implementation's
+ <function>interface_finalize</function> function and then the interface's most-derived
+ <function>base_finalize</function> function.
+ </para>
+
+ <para>
+ Again, it is important to understand, as in
+ <xref linkend="gtype-non-instantiable-classed-init"/>,
+ that both <function>interface_finalize</function> and <function>base_finalize</function>
+ are invoked exactly once for the destruction of each implementation of an interface. Thus,
+ if you were to use one of these functions, you would need to use a static integer variable
+ which would hold the number of instances of implementations of an interface such that
+ the interface's class is destroyed only once (when the integer variable reaches zero).
+ </para>
+
+ <para>
+ The above process can be summarized as follows:
+ <table id="ginterface-init-table">
+ <title>Interface Finalization</title>
+ <tgroup cols="3">
+ <colspec colwidth="*" colnum="1" align="left"/>
+ <colspec colwidth="*" colnum="2" align="left"/>
+ <colspec colwidth="8*" colnum="3" align="left"/>
+
+ <thead>
+ <row>
+ <entry>Invocation time</entry>
+ <entry>Function Invoked</entry>
+ <entry>Function's parameters</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry morerows="1">Last call to <function><link linkend="g-type-free-instance">g_type_free_instance</link></function> for type
+ implementing interface
+ </entry>
+ <entry>interface' interface_finalize function</entry>
+ <entry>On interface' vtable</entry>
+ </row>
+ <row>
+ <!--entry>Last call to <function><link linkend="g-type-free-instance">g_type_free_instance</link></function>for type
+ implementing interface
+ </entry-->
+ <entry>interface' base_finalize function</entry>
+ <entry>On interface' vtable</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </para>
+
+ <para>
+ Now that you have read this section, you can forget about it. Please, forget it
+ <emphasis>as soon as possible</emphasis>.
+ </para>
+
+ </sect2>
+
+ </sect1>
+
+ </chapter>
diff --git a/trunk/docs/reference/gobject/tut_howto.xml b/trunk/docs/reference/gobject/tut_howto.xml
new file mode 100644
index 000000000..f0a618c14
--- /dev/null
+++ b/trunk/docs/reference/gobject/tut_howto.xml
@@ -0,0 +1,1718 @@
+<?xml version='1.0' encoding="ISO-8859-1"?>
+<partintro>
+ <para>
+ This chapter tries to answer the real-life questions of users and presents
+ the most common scenario use-cases I could come up with.
+ The use-cases are presented from most likely to less likely.
+ </para>
+</partintro>
+
+<chapter id="howto-gobject">
+ <title>How To define and implement a new GObject?</title>
+
+ <para>
+ Clearly, this is one of the most common question people ask: they just want to crank code and
+ implement a subclass of a GObject. Sometimes because they want to create their own class hierarchy,
+ sometimes because they want to subclass one of GTK+'s widget. This chapter will focus on the
+ implementation of a subtype of GObject. The sample source code
+ associated to this section can be found in the documentation's source tarball, in the
+ <filename>sample/gobject</filename> directory:
+ <itemizedlist>
+ <listitem><para><filename>maman-bar.{h|c}</filename>: this is the source for a object which derives from
+ <type><link linkend="GObject">GObject</link></type> and which shows how to declare different types of methods on the object.
+ </para></listitem>
+ <listitem><para><filename>maman-subbar.{h|c}</filename>: this is the source for a object which derives from
+ <type>MamanBar</type> and which shows how to override some of its parent's methods.
+ </para></listitem>
+ <listitem><para><filename>maman-foo.{h|c}</filename>: this is the source for an object which derives from
+ <type><link linkend="GObject">GObject</link></type> and which declares a signal.
+ </para></listitem>
+ <listitem><para><filename>test.c</filename>: this is the main source which instantiates an instance of
+ type and exercises their API.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+
+ <sect1 id="howto-gobject-header">
+ <title>Boilerplate header code</title>
+
+ <para>
+ The first step before writing the code for your GObject is to write the type's header which contains
+ the needed type, function and macro definitions. Each of these elements is nothing but a convention
+ which is followed not only by GTK+'s code but also by most users of GObject. If you feel the need
+ not to obey the rules stated below, think about it twice:
+ <itemizedlist>
+ <listitem><para>If your users are a bit accustomed to GTK+ code or any Glib code, they will
+ be a bit surprised and getting used to the conventions you decided upon will take time (money) and
+ will make them grumpy (not a good thing)
+ </para></listitem>
+ <listitem><para>
+ You must assess the fact that these conventions might have been designed by both smart
+ and experienced people: maybe they were at least partly right. Try to put your ego aside.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ Pick a name convention for your headers and source code and stick to it:
+ <itemizedlist>
+ <listitem><para>
+ use a dash to separate the prefix from the typename: <filename>maman-bar.h</filename> and
+ <filename>maman-bar.c</filename> (this is the convention used by Nautilus and most GNOME libraries).
+ </para></listitem>
+ <listitem><para>
+ use an underscore to separate the prefix from the typename: <filename>maman_bar.h</filename> and
+ <filename>maman_bar.c</filename>.
+ </para></listitem>
+ <listitem><para>
+ Do not separate the prefix from the typename: <filename>mamanbar.h</filename> and
+ <filename>mamanbar.c</filename>. (this is the convention used by GTK+)
+ </para></listitem>
+ </itemizedlist>
+ I personally like the first solution better: it makes reading file names easier for those with poor
+ eyesight like me.
+ </para>
+
+ <para>
+ When you need some private (internal) declarations in several (sub)classes,
+ you can define them in a private header file which is often named by
+ appending the <emphasis>private</emphasis> keyword to the public header name.
+ For example, one could use <filename>maman-bar-private.h</filename>,
+ <filename>maman_bar_private.h</filename> or <filename>mamanbarprivate.h</filename>.
+ Typically, such private header files are not installed.
+ </para>
+
+ <para>
+ The basic conventions for any header which exposes a GType are described in
+ <xref linkend="gtype-conventions"/>. Most GObject-based code also obeys onf of the following
+ conventions: pick one and stick to it.
+ <itemizedlist>
+ <listitem><para>
+ If you want to declare a type named bar with prefix maman, name the type instance
+ <function>MamanBar</function> and its class <function>MamanBarClass</function>
+ (name is case-sensitive). It is customary to declare them with code similar to the
+ following:
+<programlisting>
+/*
+ * Copyright/Licensing information.
+ */
+
+#ifndef MAMAN_BAR_H
+#define MAMAN_BAR_H
+
+/*
+ * Potentially, include other headers on which this header depends.
+ */
+
+/*
+ * Type macros.
+ */
+
+typedef struct _MamanBar MamanBar;
+typedef struct _MamanBarClass MamanBarClass;
+
+struct _MamanBar {
+ GObject parent;
+ /* instance members */
+};
+
+struct _MamanBarClass {
+ GObjectClass parent;
+ /* class members */
+};
+
+/* used by MAMAN_BAR_TYPE */
+GType maman_bar_get_type (void);
+
+/*
+ * Method definitions.
+ */
+
+#endif
+</programlisting>
+ </para></listitem>
+ <listitem><para>
+ Most GTK+ types declare their private fields in the public header with a /* private */ comment,
+ relying on their user's intelligence not to try to play with these fields. Fields not marked private
+ are considered public by default. The /* protected */ comment (same semantics as those of C++)
+ is also used, mainly in the GType library, in code written by Tim Janik.
+<programlisting>
+struct _MamanBar {
+ GObject parent;
+
+ /*&lt; private &gt;*/
+ int hsize;
+};
+</programlisting>
+ </para></listitem>
+ <listitem><para>
+ All of Nautilus code and a lot of GNOME libraries use private indirection members, as described
+ by Herb Sutter in his Pimpl articles
+ (see <ulink url="http://www.gotw.ca/gotw/024.htm">Compilation Firewalls</ulink>
+ and <ulink url="http://www.gotw.ca/gotw/028.htm">The Fast Pimpl Idiom</ulink>
+ : he summarizes the different issues better than I will).
+<programlisting>
+typedef struct _MamanBarPrivate MamanBarPrivate;
+struct _MamanBar {
+ GObject parent;
+
+ /*&lt; private &gt;*/
+ MamanBarPrivate *priv;
+};
+</programlisting>
+ <note><simpara>Do not call this <varname>private</varname>, as that is a registered c++ keyword.</simpara></note>
+ The private structure is then defined in the .c file, instantiated in the object's
+ <function>init</function> function and destroyed in the object's <function>finalize</function> function.
+<programlisting>
+static void
+maman_bar_finalize (GObject *object) {
+ MamanBar *self = MAMAN_BAR (object);
+ /* do stuff */
+ g_free (self->priv);
+}
+
+static void
+maman_bar_init (GTypeInstance *instance, gpointer g_class) {
+ MamanBar *self = MAMAN_BAR (instance);
+ self->priv = g_new0 (MamanBarPrivate,1);
+ /* do stuff */
+}
+</programlisting>
+ </para></listitem>
+
+ <listitem><para>
+ A similar alternative, available since Glib version 2.4, is to define a private structure in the .c file,
+ declare it as a private structure in <function>maman_bar_class_init</function> using
+ <function><link linkend="g-type-class-add-private">g_type_class_add_private</link></function>.
+ Instead of allocating memory in <function>maman_bar_init</function> a pointer to the private memory area is
+ stored in the instance to allow convenient access to this structure.
+ A private structure will then be attached to each newly created object by the GObject system.
+ You dont need to free or allocate the private structure, only the objects or pointers that it may contain.
+ Another advantage of this to the previous version is that is lessens memory fragmentation,
+ as the public and private parts of the instance memory are allocated at once.
+<programlisting>
+typedef struct _MamanBarPrivate MamanBarPrivate;
+
+struct _MamanBarPrivate {
+ int private_field;
+};
+
+static void
+maman_bar_class_init (MamanBarClass *klass)
+{
+ ...
+ g_type_class_add_private (klass, sizeof (MamanBarPrivate));
+ ...
+}
+
+static void
+maman_bar_init (GTypeInstance *instance, gpointer g_class) {
+ MamanBar *self = MAMAN_BAR (instance);
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, MAMAN_BAR_TYPE, MamanBarPrivate);
+ /* do stuff */
+}
+</programlisting>
+ </para></listitem>
+
+ </itemizedlist>
+ </para>
+
+ <para>
+ Finally, there are different header include conventions. Again, pick one and stick to it. I personally
+ use indifferently any of the two, depending on the codebase I work on: the rule is consistency.
+ <itemizedlist>
+ <listitem><para>
+ Some people add at the top of their headers a number of #include directives to pull in
+ all the headers needed to compile client code. This allows client code to simply
+ #include "maman-bar.h".
+ </para></listitem>
+ <listitem><para>
+ Other do not #include anything and expect the client to #include themselves the headers
+ they need before including your header. This speeds up compilation because it minimizes the
+ amount of pre-processor work. This can be used in conjunction with the re-declaration of certain
+ unused types in the client code to minimize compile-time dependencies and thus speed up
+ compilation.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+
+ </sect1>
+
+ <sect1 id="howto-gobject-code">
+ <title>Boilerplate code</title>
+
+ <para>
+ In your code, the first step is to #include the needed headers: depending on your header include strategy, this
+ can be as simple as #include "maman-bar.h" or as complicated as tens of #include lines ending with
+ #include "maman-bar.h":
+<programlisting>
+/*
+ * Copyright information
+ */
+
+#include "maman-bar.h"
+
+/* If you use Pimpls, include the private structure
+ * definition here. Some people create a maman-bar-private.h header
+ * which is included by the maman-bar.c file and which contains the
+ * definition for this private structure.
+ */
+struct _MamanBarPrivate {
+ int member_1;
+ /* stuff */
+};
+
+/*
+ * forward definitions
+ */
+</programlisting>
+ </para>
+
+ <para>
+ Implement <function>maman_bar_get_type</function> and make sure the code compiles:
+<programlisting>
+GType
+maman_bar_get_type (void)
+{
+ static GType type = 0;
+ if (type == 0) {
+ static const GTypeInfo info = {
+ sizeof (MamanBarClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ NULL, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (MamanBar),
+ 0, /* n_preallocs */
+ NULL /* instance_init */
+ };
+ type = g_type_register_static (G_TYPE_OBJECT,
+ "MamanBarType",
+ &amp;info, 0);
+ }
+ return type;
+}
+</programlisting>
+ </para>
+ </sect1>
+
+ <sect1 id="howto-gobject-construction">
+ <title>Object Construction</title>
+
+ <para>
+ People often get confused when trying to construct their GObjects because of the
+ sheer number of different ways to hook into the objects's construction process: it is
+ difficult to figure which is the <emphasis>correct</emphasis>, recommended way.
+ </para>
+
+ <para>
+ <xref linkend="gobject-construction-table"/> shows what user-provided functions
+ are invoked during object instanciation and in which order they are invoked.
+ A user looking for the equivalent of the simple C++ constructor function should use
+ the instance_init method. It will be invoked after all the parent's instance_init
+ functions have been invoked. It cannot take arbitrary construction parameters
+ (as in C++) but if your object needs arbitrary parameters to complete initialization,
+ you can use construction properties.
+ </para>
+
+ <para>
+ Construction properties will be set only after all instance_init functions have run.
+ No object reference will be returned to the client of <function><link linkend="g-object-new>">g_object_new></link></function>
+ until all the construction properties have been set.
+ </para>
+
+ <para>
+ As such, I would recommend writing the following code first:
+<programlisting>
+static void
+maman_bar_init (GTypeInstance *instance,
+ gpointer g_class)
+{
+ MamanBar *self = (MamanBar *)instance;
+ self->private = g_new0 (MamanBarPrivate, 1);
+
+ /* initialize all public and private members to reasonable default values. */
+ /* If you need specific consruction properties to complete initialization,
+ * delay initialization completion until the property is set.
+ */
+}
+</programlisting>
+ And make sure that you set <function>maman_bar_init</function> as the type's instance_init function
+ in <function>maman_bar_get_type</function>. Make sure the code builds and runs: create an instance
+ of the object and make sure <function>maman_bar_init</function> is called (add a
+ <function><link linkend="g-print">g_print</link></function> call in it).
+ </para>
+
+ <para>
+ Now, if you need special construction properties, install the properties in the class_init function,
+ override the set and get methods and implement the get and set methods as described in
+ <xref linkend="gobject-properties"/>. Make sure that these properties use a construct only
+ <type><link linkend="GParamSpec">GParamSpec</link></type> by setting the param spec's flag field to G_PARAM_CONSTRUCT_ONLY: this helps
+ GType ensure that these properties are not set again later by malicious user code.
+<programlisting>
+static void
+bar_class_init (MamanBarClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GParamSpec *maman_param_spec;
+
+ gobject_class->set_property = bar_set_property;
+ gobject_class->get_property = bar_get_property;
+
+ maman_param_spec = g_param_spec_string ("maman",
+ "Maman construct prop",
+ "Set maman's name",
+ "no-name-set" /* default value */,
+ G_PARAM_CONSTRUCT_ONLY |G_PARAM_READWRITE);
+
+ g_object_class_install_property (gobject_class,
+ PROP_MAMAN,
+ maman_param_spec);
+}
+</programlisting>
+ If you need this, make sure you can build and run code similar to the code shown above. Make sure
+ your construct properties can set correctly during construction, make sure you cannot set them
+ afterwards and make sure that if your users do not call <function><link linkend="g-object-new">g_object_new</link></function>
+ with the required construction properties, these will be initialized with the default values.
+ </para>
+
+ <para>
+ I consider good taste to halt program execution if a construction property is set its
+ default value. This allows you to catch client code which does not give a reasonable
+ value to the construction properties. Of course, you are free to disagree but you
+ should have a good reason to do so.
+ </para>
+
+ <para>Some people sometimes need to construct their object but only after the construction properties
+ have been set. This is possible through the use of the constructor class method as described in
+ <xref linkend="gobject-instanciation"/>. However, I have yet to see <emphasis>any</emphasis> reasonable
+ use of this feature. As such, to initialize your object instances, use by default the base_init function
+ and construction properties.
+ </para>
+ </sect1>
+
+ <sect1 id="howto-gobject-destruction">
+ <title>Object Destruction</title>
+
+ <para>
+ Again, it is often difficult to figure out which mechanism to use to hook into the object's
+ destruction process: when the last <function><link linkend="g-object-unref">g_object_unref</link></function> function call is made,
+ a lot of things happen as described in <xref linkend="gobject-destruction-table"/>.
+ </para>
+
+ <para>
+ The destruction process of your object must be split is two different phases: you must override
+ both the dispose and the finalize class methods.
+<programlisting>
+struct _MamanBarPrivate {
+ gboolean dispose_has_run;
+};
+
+static GObjectClass parent_class = NULL;
+
+static void
+bar_dispose (GObject *obj)
+{
+ MamanBar *self = (MamanBar *)obj;
+
+ if (self->priv->dispose_has_run) {
+ /* If dispose did already run, return. */
+ return;
+ }
+ /* Make sure dispose does not run twice. */
+ object->priv->dispose_has_run = TRUE;
+
+ /*
+ * In dispose, you are supposed to free all types referenced from this
+ * object which might themselves hold a reference to self. Generally,
+ * the most simple solution is to unref all members on which you own a
+ * reference.
+ */
+
+ /* Chain up to the parent class */
+ G_OBJECT_CLASS (parent_class)->dispose (obj);
+}
+
+static void
+bar_finalize (GObject *obj)
+{
+ MamanBar *self = (MamanBar *)obj;
+
+ /* Chain up to the parent class */
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+bar_class_init (BarClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gobject_class->dispose = bar_dispose;
+ gobject_class->finalize = bar_finalize;
+
+ parent_class = g_type_class_peek_parent (klass);
+ g_type_class_add_private(klass,sizeof(MamanBarPrivate));
+}
+
+static void
+maman_bar_init (GTypeInstance *instance,
+ gpointer g_class)
+{
+ MamanBar *self = (MamanBar *)instance;
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_PATTERN, BtPatternPrivate);
+ self->priv->dispose_has_run = FALSE;
+
+}
+</programlisting>
+ </para>
+
+ <para>
+ Add similar code to your GObject, make sure the code still builds and runs: dispose and finalize must be called
+ during the last unref.
+ It is possible that object methods might be invoked after dispose is run and before finalize runs. GObject
+ does not consider this to be a program error: you must gracefully detect this and neither crash nor warn
+ the user. To do this, you need something like the following code at the start of each object method, to make
+ sure the object's data is still valid before manipulating it:
+<programlisting>
+if (self->private->dispose_has_run) {
+ /* Dispose has run. Data is not valid anymore. */
+ return;
+}
+</programlisting>
+ </para>
+ </sect1>
+
+ <sect1 id="howto-gobject-methods">
+ <title>Object methods</title>
+
+ <para>
+ Just as with C++, there are many different ways to define object
+ methods and extend them: the following list and sections draw on C++ vocabulary.
+ (Readers are expected to know basic C++ buzzwords. Those who have not had to
+ write C++ code recently can refer to e.g. <ulink url="http://www.cplusplus.com/doc/tutorial/"/> to refresh their
+ memories.)
+ <itemizedlist>
+ <listitem><para>
+ non-virtual public methods,
+ </para></listitem>
+ <listitem><para>
+ virtual public methods and
+ </para></listitem>
+ <listitem><para>
+ virtual private methods
+ </para></listitem>
+ </itemizedlist>
+ </para>
+
+ <sect2>
+ <title>Non-virtual public methods</title>
+
+ <para>
+ These are the simplest: you want to provide a simple method which can act on your object. All you need
+ to do is to provide a function prototype in the header and an implementation of that prototype
+ in the source file.
+<programlisting>
+/* declaration in the header. */
+void maman_bar_do_action (MamanBar *self, /* parameters */);
+/* implementation in the source file */
+void maman_bar_do_action (MamanBar *self, /* parameters */)
+{
+ /* do stuff here. */
+}
+</programlisting>
+ </para>
+
+ <para>There is really nothing scary about this.</para>
+ </sect2>
+
+ <sect2>
+ <title>Virtual public methods</title>
+
+ <para>
+ This is the preferred way to create polymorphic GObjects. All you need to do is to
+ define the common method and its class function in the public header, implement the
+ common method in the source file and re-implement the class function in each object
+ which inherits from you.
+<programlisting>
+/* declaration in maman-bar.h. */
+struct _MamanBarClass {
+ GObjectClass parent;
+
+ /* stuff */
+ void (*do_action) (MamanBar *self, /* parameters */);
+};
+void maman_bar_do_action (MamanBar *self, /* parameters */);
+/* implementation in maman-bar.c */
+void maman_bar_do_action (MamanBar *self, /* parameters */)
+{
+ MAMAN_BAR_GET_CLASS (self)->do_action (self, /* parameters */);
+}
+</programlisting>
+ The code above simply redirects the do_action call to the relevant class function. Some users,
+ concerned about performance, do not provide the <function>maman_bar_do_action</function>
+ wrapper function and require users to dereference the class pointer themselves. This is not such
+ a great idea in terms of encapsulation and makes it difficult to change the object's implementation
+ afterwards, should this be needed.
+ </para>
+
+ <para>
+ Other users, also concerned by performance issues, declare the <function>maman_bar_do_action</function>
+ function inline in the header file. This, however, makes it difficult to change the
+ object's implementation later (although easier than requiring users to directly dereference the class
+ function) and is often difficult to write in a portable way (the <emphasis>inline</emphasis> keyword
+ is not part of the C standard).
+ </para>
+
+ <para>
+ In doubt, unless a user shows you hard numbers about the performance cost of the function call,
+ just <function>maman_bar_do_action</function> in the source file.
+ </para>
+
+ <para>
+ Please, note that it is possible for you to provide a default implementation for this class method in
+ the object's class_init function: initialize the klass->do_action field to a pointer to the actual
+ implementation. You can also make this class method pure virtual by initializing the klass->do_action
+ field to NULL:
+<programlisting>
+static void
+maman_bar_real_do_action_two (MamanBar *self, /* parameters */)
+{
+ /* Default implementation for the virtual method. */
+}
+
+static void
+maman_bar_class_init (BarClass *klass)
+{
+ /* pure virtual method: mandates implementation in children. */
+ klass->do_action_one = NULL;
+ /* merely virtual method. */
+ klass->do_action_two = maman_bar_real_do_action_two;
+}
+
+void maman_bar_do_action_one (MamanBar *self, /* parameters */)
+{
+ MAMAN_BAR_GET_CLASS (self)->do_action_one (self, /* parameters */);
+}
+void maman_bar_do_action_two (MamanBar *self, /* parameters */)
+{
+ MAMAN_BAR_GET_CLASS (self)->do_action_two (self, /* parameters */);
+}
+</programlisting>
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Virtual private Methods</title>
+
+ <para>
+ These are very similar to Virtual Public methods. They just don't have a public function to call the
+ function directly. The header file contains only a declaration of the class function:
+<programlisting>
+/* declaration in maman-bar.h. */
+struct _MamanBarClass {
+ GObjectClass parent;
+
+ /* stuff */
+ void (*helper_do_specific_action) (MamanBar *self, /* parameters */);
+};
+void maman_bar_do_any_action (MamanBar *self, /* parameters */);
+</programlisting>
+ These class functions are often used to delegate part of the job to child classes:
+<programlisting>
+/* this accessor function is static: it is not exported outside of this file. */
+static void
+maman_bar_do_specific_action (MamanBar *self, /* parameters */)
+{
+ MAMAN_BAR_GET_CLASS (self)->do_specific_action (self, /* parameters */);
+}
+
+void maman_bar_do_any_action (MamanBar *self, /* parameters */)
+{
+ /* random code here */
+
+ /*
+ * Try to execute the requested action. Maybe the requested action cannot be implemented
+ * here. So, we delegate its implementation to the child class:
+ */
+ maman_bar_do_specific_action (self, /* parameters */);
+
+ /* other random code here */
+}
+</programlisting>
+ </para>
+
+ <para>
+ Again, it is possible to provide a default implementation for this private virtual class function:
+<programlisting>
+static void
+maman_bar_class_init (MamanBarClass *klass)
+{
+ /* pure virtual method: mandates implementation in children. */
+ klass->do_specific_action_one = NULL;
+ /* merely virtual method. */
+ klass->do_specific_action_two = maman_bar_real_do_specific_action_two;
+}
+</programlisting>
+ </para>
+
+ <para>
+ Children can then implement the subclass with code such as:
+<programlisting>
+static void
+maman_bar_subtype_class_init (MamanBarSubTypeClass *klass)
+{
+ MamanBarClass *bar_class = MAMAN_BAR_CLASS (klass);
+ /* implement pure virtual class function. */
+ bar_class->do_specific_action_one = maman_bar_subtype_do_specific_action_one;
+}
+</programlisting>
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="howto-gobject-chainup">
+ <title>Chaining up</title>
+
+ <para>Chaining up is often loosely defined by the following set of conditions:
+ <itemizedlist>
+ <listitem><para>Parent class A defines a public virtual method named <function>foo</function> and
+ provides a default implementation.</para></listitem>
+ <listitem><para>Child class B re-implements method <function>foo</function>.</para></listitem>
+ <listitem><para>In the method B::foo, the child class B calls its parent class method A::foo.</para></listitem>
+ </itemizedlist>
+ There are many uses to this idiom:
+ <itemizedlist>
+ <listitem><para>You need to change the behaviour of a class without modifying its code. You create
+ a subclass to inherit its implementation, re-implement a public virtual method to modify the behaviour
+ slightly and chain up to ensure that the previous behaviour is not really modifed, just extended.
+ </para></listitem>
+ <listitem><para>You are lazy, you have access to the source code of the parent class but you don't want
+ to modify it to add method calls to new specialized method calls: it is faster to hack the child class
+ to chain up than to modify the parent to call down.</para></listitem>
+ <listitem><para>You need to implement the Chain Of Responsability pattern: each object of the inheritance
+ tree chains up to its parent (typically, at the begining or the end of the method) to ensure that
+ they each handler is run in turn.</para></listitem>
+ </itemizedlist>
+ I am personally not really convinced any of the last two uses are really a good idea but since this
+ programming idiom is often used, this section attemps to explain how to implement it.
+ </para>
+
+ <para>
+ To explicitely chain up to the implementation of the virtual method in the parent class,
+ you first need a handle to the original parent class structure. This pointer can then be used to
+ access the original class function pointer and invoke it directly.
+ <footnote>
+ <para>
+ The <emphasis>original</emphasis> adjective used in this sentence is not innocuous. To fully
+ understand its meaning, you need to recall how class structures are initialized: for each object type,
+ the class structure associated to this object is created by first copying the class structure of its
+ parent type (a simple <function>memcpy</function>) and then by invoking the class_init callback on
+ the resulting class structure. Since the class_init callback is responsible for overwriting the class structure
+ with the user re-implementations of the class methods, we cannot merely use the modified copy of the parent class
+ structure stored in our derived instance. We want to get a copy of the class structure of an instance of the parent
+ class.
+ </para>
+ </footnote>
+ </para>
+
+ <para>The function <function><link linkend="g-type-class-peek-parent">g_type_class_peek_parent</link></function> is used to access the original parent
+ class structure. Its input is a pointer to the class of the derived object and it returns a pointer
+ to the original parent class structure. The code below shows how you could use it:
+<programlisting>
+static void
+b_method_to_call (B *obj, int a)
+{
+ BClass *klass;
+ AClass *parent_class;
+ klass = B_GET_CLASS (obj);
+ parent_class = g_type_class_peek_parent (klass);
+
+ /* do stuff before chain up */
+ parent_class->method_to_call (obj, a);
+ /* do stuff after chain up */
+}
+</programlisting>
+ A lot of people who use this idiom in GTK+ store the parent class structure pointer in a global static
+ variable to avoid the costly call to <function><link linkend="g-type-class-peek-parent">g_type_class_peek_parent</link></function> for each function call.
+ Typically, the class_init callback initializes the global static variable. <filename>gtk/gtkhscale.c</filename>
+ does this.
+ </para>
+
+ </sect1>
+
+</chapter>
+<!-- End Howto GObject -->
+
+
+<chapter id="howto-interface">
+ <title>How To define and implement Interfaces?</title>
+
+ <sect1 id="howto-interface-define">
+ <title>How To define Interfaces?</title>
+
+ <para>
+ The bulk of interface definition has already been shown in <xref linkend="gtype-non-instantiable-classed"/>
+ but I feel it is needed to show exactly how to create an interface. The sample source code
+ associated to this section can be found in the documentation's source tarball, in the
+ <filename>sample/interface/maman-ibaz.{h|c}</filename> file.
+ </para>
+
+ <para>
+ As above, the first step is to get the header right:
+<programlisting>
+#ifndef MAMAN_IBAZ_H
+#define MAMAN_IBAZ_H
+
+#include &lt;glib-object.h&gt;
+
+#define MAMAN_TYPE_IBAZ (maman_ibaz_get_type ())
+#define MAMAN_IBAZ(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_IBAZ, MamanIbaz))
+#define MAMAN_IS_IBAZ(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_IBAZ))
+#define MAMAN_IBAZ_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), MAMAN_TYPE_IBAZ, MamanIbazInterface))
+
+
+typedef struct _MamanIbaz MamanIbaz; /* dummy object */
+typedef struct _MamanIbazInterface MamanIbazInterface;
+
+struct _MamanIbazInterface {
+ GTypeInterface parent;
+
+ void (*do_action) (MamanIbaz *self);
+};
+
+GType maman_ibaz_get_type (void);
+
+void maman_ibaz_do_action (MamanIbaz *self);
+
+#endif /*MAMAN_IBAZ_H*/
+</programlisting>
+ This code is the same as the code for a normal <type><link linkend="GType">GType</link></type>
+ which derives from a <type><link linkend="GObject">GObject</link></type> except for a few details:
+ <itemizedlist>
+ <listitem><para>
+ The <function>_GET_CLASS</function> macro is called <function>_GET_INTERFACE</function>
+ and not implemented with <function><link linkend="G_TYPE_INSTANCE_GET_CLASS">G_TYPE_INSTANCE_GET_CLASS</link></function>
+ but with <function><link linkend="G_TYPE_INSTANCE_GET_INTERFACE">G_TYPE_INSTANCE_GET_INTERFACE</link></function>.
+ </para></listitem>
+ <listitem><para>
+ The instance type, <type>MamanIbaz</type> is not fully defined: it is used merely as an abstract
+ type which represents an instance of whatever object which implements the interface.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ The implementation of the <type>MamanIbaz</type> type itself is trivial:
+ <itemizedlist>
+ <listitem><para><function>maman_ibaz_get_type</function> registers the
+ type in the type system.
+ </para></listitem>
+ <listitem><para><function>maman_ibaz_base_init</function> is expected
+ to register the interface's signals if there are any (we will see a bit
+ (later how to use them). Make sure to use a static local boolean variable
+ to make sure not to run the initialization code twice (as described in
+ <xref linkend="gtype-non-instantiable-classed-init"/>,
+ <function>base_init</function> is run once for each interface implementation
+ instanciation)</para></listitem>
+ <listitem><para><function>maman_ibaz_do_action</function> dereferences the class
+ structure to access its associated class function and calls it.
+ </para></listitem>
+ </itemizedlist>
+<programlisting>
+static void
+maman_ibaz_base_init (gpointer g_class)
+{
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+ /* create interface signals here. */
+ initialized = TRUE;
+ }
+}
+
+GType
+maman_ibaz_get_type (void)
+{
+ static GType type = 0;
+ if (type == 0) {
+ static const GTypeInfo info = {
+ sizeof (MamanIbazInterface),
+ maman_ibaz_base_init, /* base_init */
+ NULL, /* base_finalize */
+ NULL, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ 0,
+ 0, /* n_preallocs */
+ NULL /* instance_init */
+ };
+ type = g_type_register_static (G_TYPE_INTERFACE, "MamanIbaz", &amp;info, 0);
+ }
+ return type;
+}
+
+void maman_ibaz_do_action (MamanIbaz *self)
+{
+ MAMAN_IBAZ_GET_INTERFACE (self)->do_action (self);
+}
+</programlisting>
+ </para>
+ </sect1>
+
+ <sect1 id="howto-interface-implement">
+ <title>How To define implement an Interface?</title>
+
+ <para>
+ Once the interface is defined, implementing it is rather trivial. Source code showing how to do this
+ for the <type>IBaz</type> interface defined in the previous section is located in
+ <filename>sample/interface/maman-baz.{h|c}</filename>.
+ </para>
+
+ <para>
+ The first step is to define a normal GType. Here, we have decided to use a GType which derives from
+ GObject. Its name is <type>MamanBaz</type>:
+<programlisting>
+#ifndef MAMAN_BAZ_H
+#define MAMAN_BAZ_H
+
+#include &lt;glib-object.h>
+
+#define MAMAN_TYPE_BAZ (maman_baz_get_type ())
+#define MAMAN_BAZ(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_BAZ, Mamanbaz))
+#define MAMAN_BAZ_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MAMAN_TYPE_BAZ, MamanbazClass))
+#define MAMAN_IS_BAZ(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_BAZ))
+#define MAMAN_IS_BAZ_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MAMAN_TYPE_BAZ))
+#define MAMAN_BAZ_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MAMAN_TYPE_BAZ, MamanbazClass))
+
+
+typedef struct _MamanBaz MamanBaz;
+typedef struct _MamanBazClass MamanBazClass;
+
+struct _MamanBaz {
+ GObject parent;
+ int instance_member;
+};
+
+struct _MamanBazClass {
+ GObjectClass parent;
+};
+
+GType maman_baz_get_type (void);
+
+
+#endif //MAMAN_BAZ_H
+</programlisting>
+ There is clearly nothing specifically weird or scary about this header: it does not define any weird API
+ or derives from a weird type.
+ </para>
+
+ <para>
+ The second step is to implement <function>maman_baz_get_type</function>:
+<programlisting>
+GType
+maman_baz_get_type (void)
+{
+ static GType type = 0;
+ if (type == 0) {
+ static const GTypeInfo info = {
+ sizeof (MamanBazClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ NULL, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (MamanBaz),
+ 0, /* n_preallocs */
+ baz_instance_init /* instance_init */
+ };
+ static const GInterfaceInfo ibaz_info = {
+ (GInterfaceInitFunc) baz_interface_init, /* interface_init */
+ NULL, /* interface_finalize */
+ NULL /* interface_data */
+ };
+ type = g_type_register_static (G_TYPE_OBJECT,
+ "MamanBazType",
+ &amp;info, 0);
+ g_type_add_interface_static (type,
+ MAMAN_TYPE_IBAZ,
+ &amp;ibaz_info);
+ }
+ return type;
+}
+</programlisting>
+ This function is very much like all the similar functions we looked at previously. The only interface-specific
+ code present here is the call to <function><link linkend="g-type-add-interface-static">g_type_add_interface_static</link></function> which is used to inform
+ the type system that this just-registered <type><link linkend="GType">GType</link></type> also implements the interface
+ <function>MAMAN_TYPE_IBAZ</function>.
+ </para>
+
+ <para>
+ <function>baz_interface_init</function>, the interface initialization function, is also pretty simple:
+<programlisting>
+static void baz_do_action (MamanBaz *self)
+{
+ g_print ("Baz implementation of IBaz interface Action: 0x%x.\n", self->instance_member);
+}
+static void
+baz_interface_init (gpointer g_iface,
+ gpointer iface_data)
+{
+ MamanIbazInteface *iface = (MamanIbazInteface *)g_iface;
+ iface->do_action = (void (*) (MamanIbaz *self))baz_do_action;
+}
+static void
+baz_instance_init (GTypeInstance *instance,
+ gpointer g_class)
+{
+ MamanBaz *self = MAMAN_BAZ(instance);
+ self->instance_member = 0xdeadbeaf;
+}
+</programlisting>
+ <function>baz_interface_init</function> merely initializes the interface methods to the implementations
+ defined by <type>MamanBaz</type>: <function>maman_baz_do_action</function> does nothing very useful
+ but it could :)
+ </para>
+
+ </sect1>
+
+ <sect1>
+ <title>Interface definition prerequisites</title>
+
+ <para>
+ To specify that an interface requires the presence of other interfaces when implemented,
+ GObject introduces the concept of <emphasis>prerequisites</emphasis>: it is possible to associate
+ a list of prerequisite interfaces to an interface. For example, if object A wishes to implement interface
+ I1, and if interface I1 has a prerequisite on interface I2, A has to implement both I1 and I2.
+ </para>
+
+ <para>
+ The mechanism described above is, in practice, very similar to Java's interface I1 extends
+ interface I2. The example below shows the GObject equivalent:
+
+<programlisting>
+ type = g_type_register_static (G_TYPE_INTERFACE, "MamanIbar", &amp;info, 0);
+ /* Make the MamanIbar interface require MamanIbaz interface. */
+ g_type_interface_add_prerequisite (type, MAMAN_TYPE_IBAZ);
+</programlisting>
+ The code shown above adds the MamanIbaz interface to the list of prerequisites of MamanIbar while the
+ code below shows how an implementation can implement both interfaces and register their implementations:
+<programlisting>
+static void ibar_do_another_action (MamanBar *self)
+{
+ g_print ("Bar implementation of IBar interface Another Action: 0x%x.\n", self->instance_member);
+}
+
+static void
+ibar_interface_init (gpointer g_iface,
+ gpointer iface_data)
+{
+ MamanIbarInterface *iface = (MamanIbarInterface *)g_iface;
+ iface->do_another_action = (void (*) (MamanIbar *self))ibar_do_another_action;
+}
+
+
+static void ibaz_do_action (MamanBar *self)
+{
+ g_print ("Bar implementation of IBaz interface Action: 0x%x.\n", self->instance_member);
+}
+
+static void
+ibaz_interface_init (gpointer g_iface,
+ gpointer iface_data)
+{
+ MamanIbazInterface *iface = (MamanIbazInterface *)g_iface;
+ iface->do_action = (void (*) (MamanIbaz *self))ibaz_do_action;
+}
+
+static void
+bar_instance_init (GTypeInstance *instance,
+ gpointer g_class)
+{
+ MamanBar *self = (MamanBar *)instance;
+ self->instance_member = 0x666;
+}
+
+GType
+maman_bar_get_type (void)
+{
+ static GType type = 0;
+ if (type == 0) {
+ static const GTypeInfo info = {
+ sizeof (MamanBarClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ NULL, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (MamanBar),
+ 0, /* n_preallocs */
+ bar_instance_init /* instance_init */
+ };
+ static const GInterfaceInfo ibar_info = {
+ (GInterfaceInitFunc) ibar_interface_init, /* interface_init */
+ NULL, /* interface_finalize */
+ NULL /* interface_data */
+ };
+ static const GInterfaceInfo ibaz_info = {
+ (GInterfaceInitFunc) ibaz_interface_init, /* interface_init */
+ NULL, /* interface_finalize */
+ NULL /* interface_data */
+ };
+ type = g_type_register_static (G_TYPE_OBJECT,
+ "MamanBarType",
+ &amp;info, 0);
+ g_type_add_interface_static (type,
+ MAMAN_TYPE_IBAZ,
+ &amp;ibaz_info);
+ g_type_add_interface_static (type,
+ MAMAN_TYPE_IBAR,
+ &amp;ibar_info);
+ }
+ return type;
+}
+</programlisting>
+ It is very important to notice that the order in which interface implementations are added to the main object
+ is not random: <function><link linkend="g-type-add-interface-static">g_type_add_interface_static</link></function> must be invoked first on the interfaces which have
+ no prerequisites and then on the others.
+ </para>
+
+ <para>
+ Complete source code showing how to define the MamanIbar interface which requires MamanIbaz and how to
+ implement the MamanIbar interface is located in <filename>sample/interface/maman-ibar.{h|c}</filename>
+ and <filename>sample/interface/maman-bar.{h|c}</filename>.
+ </para>
+
+ </sect1>
+
+ <sect1 id="howto-interface-properties">
+ <title>Interface Properties</title>
+
+ <para>
+ Starting from version 2.4 of glib, GObject interfaces can also have properties.
+ Declaration of the interface properties is similar to declaring the properties of
+ ordinary GObject types as explained in <xref linkend="gobject-properties"/>,
+ except that <function><link linkend="g-object-interface-install-property">g_object_interface_install_property</link></function> is used to
+ declare the properties instead of <function><link linkend="g-object-class-install-property">g_object_class_install_property</link></function>.
+ </para>
+
+ <para>
+ To include a property named 'name' of type <type>string</type> in the
+ <type>maman_ibaz</type> interface example code above, we only need to add one
+ <footnote>
+ <para>
+ That really is one line extended to six for the sake of clarity
+ </para>
+ </footnote>
+ line in the <function>maman_ibaz_base_init</function>
+ <footnote>
+ <para>
+ The <function><link linkend="g-object-interface-install-property">g_object_interface_install_property</link></function> can also be called from
+ <function>class_init</function> but it must not be called after that point.
+ </para>
+ </footnote>
+ as shown below:
+<programlisting>
+static void
+maman_ibaz_base_init (gpointer g_iface)
+{
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+ /* create interface signals here. */
+
+ g_object_interface_install_property (g_iface,
+ g_param_spec_string ("name",
+ "maman_ibaz_name",
+ "Name of the MamanIbaz",
+ "maman",
+ G_PARAM_READWRITE));
+ initialized = TRUE;
+ }
+}
+</programlisting>
+ </para>
+
+ <para>
+ One point worth noting is that the declared property wasn't assigned an
+ integer ID. The reason being that integer IDs of properities are utilized only
+ inside the get and set methods and since interfaces do not implement properties,
+ there is no need to assign integer IDs to interface properties.
+ </para>
+
+ <para>
+ The story for the implementers of the interface is also quite trivial.
+ An implementer shall declare and define it's properties in the usual way as
+ explained in <xref linkend="gobject-properties"/>, except for one small
+ change: it shall declare the properties of the interface it implements using
+ <function><link linkend="g-object-class-override-property">g_object_class_override_property</link></function> instead of
+ <function><link linkend="g-object-class-install-property">g_object_class_install_property</link></function>. The following code snipet
+ shows the modifications needed in the <type>MamanBaz</type> declaration and
+ implementation above:
+<programlisting>
+
+struct _MamanBaz {
+ GObject parent;
+ gint instance_member;
+ gchar *name; /* placeholder for property */
+};
+
+enum
+{
+ ARG_0,
+ ARG_NAME
+};
+
+GType
+maman_baz_get_type (void)
+{
+ static GType type = 0;
+ if (type == 0) {
+ static const GTypeInfo info = {
+ sizeof (MamanBazClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ baz_class_init, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (MamanBaz),
+ 0, /* n_preallocs */
+ baz_instance_init /* instance_init */
+ };
+ static const GInterfaceInfo ibaz_info = {
+ (GInterfaceInitFunc) baz_interface_init, /* interface_init */
+ NULL, /* interface_finalize */
+ NULL /* interface_data */
+ };
+ type = g_type_register_static (G_TYPE_OBJECT,
+ "MamanBazType",
+ &amp;info, 0);
+ g_type_add_interface_static (type,
+ MAMAN_TYPE_IBAZ,
+ &amp;ibaz_info);
+ }
+ return type;
+}
+
+static void
+maman_baz_class_init (MamanBazClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+
+ parent_class = g_type_class_ref (G_TYPE_OBJECT);
+
+ gobject_class->set_property = maman_baz_set_property;
+ gobject_class->get_property = maman_baz_get_property;
+
+ g_object_class_override_property (gobject_class, ARG_NAME, "name");
+}
+
+static void
+maman_baz_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ MamanBaz *baz;
+ GObject *obj;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail (G_IS_MAMAN_BAZ (object));
+
+ baz = MAMAN_BAZ (object);
+
+ switch (prop_id) {
+ case ARG_NAME:
+ baz->name = g_value_get_string (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+maman_baz_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ MamanBaz *baz;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail (G_IS_TEXT_PLUGIN (object));
+
+ baz = MAMAN_BAZ (object);
+
+ switch (prop_id) {
+ case ARG_NAME:
+ g_value_set_string (value, baz->name);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+</programlisting>
+ </para>
+
+ </sect1>
+</chapter>
+<!-- End Howto Interfaces -->
+
+<chapter id="howto-signals">
+ <title>Howto create and use signals</title>
+
+
+ <para>
+ The signal system which was built in GType is pretty complex and flexible: it is possible for its users
+ to connect at runtime any number of callbacks (implemented in any language for which a binding exists)
+ <footnote>
+ <para>A python callback can be connected to any signal on any C-based GObject.
+ </para>
+ </footnote>
+
+ to any signal and to stop the emission of any signal at any
+ state of the signal emission process. This flexibility makes it possible to use GSignal for much more than
+ just emit events which can be received by numerous clients.
+ </para>
+
+ <sect1 id="howto-simple-signals">
+ <title>Simple use of signals</title>
+
+ <para>
+ The most basic use of signals is to implement simple event notification: for example, if we have a
+ MamanFile object, and if this object has a write method, we might wish to be notified whenever someone
+ uses this method. The code below shows how the user can connect a callback to the write signal. Full code
+ for this simple example is located in <filename>sample/signal/maman-file.{h|c}</filename> and
+ in <filename>sample/signal/test.c</filename>
+<programlisting>
+file = g_object_new (MAMAN_FILE_TYPE, NULL);
+
+g_signal_connect (G_OBJECT (file), "write",
+ (GCallback)write_event,
+ NULL);
+
+maman_file_write (file, buffer, 50);
+</programlisting>
+ </para>
+
+ <para>
+ The <type>MamanFile</type> signal is registered in the class_init function:
+<programlisting>
+klass->write_signal_id =
+ g_signal_newv ("write",
+ G_TYPE_FROM_CLASS (g_class),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+ NULL /* class closure */,
+ NULL /* accumulator */,
+ NULL /* accu_data */,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE /* return_type */,
+ 0 /* n_params */,
+ NULL /* param_types */);
+</programlisting>
+ and the signal is emited in <function>maman_file_write</function>:
+<programlisting>
+void maman_file_write (MamanFile *self, guint8 *buffer, guint32 size)
+{
+ /* First write data. */
+ /* Then, notify user of data written. */
+ g_signal_emit (self, MAMAN_FILE_GET_CLASS (self)->write_signal_id,
+ 0 /* details */,
+ NULL);
+}
+</programlisting>
+ As shown above, you can safely set the details parameter to zero if you do not know what it can be used for.
+ For a discussion of what you could used it for, see <xref linkend="signal-detail"/>
+ </para>
+
+ <para>
+ The signature of the signal handler in the above example is defined as
+ <function>g_cclosure_marshal_VOID__VOID</function>. Its name follows
+ a simple convention which encodes the function parameter and return value
+ types in the function name. Specifically, the value infront of the double
+ underscore is the type of the return value, while the value(s) after the
+ double underscore denote the parameter types.
+ The header <filename>gobject/gmarshal.h</filename> defines a set of commonly
+ needed closures that one can use.
+ </para>
+ </sect1>
+
+ <sect1>
+ <title>How to provide more flexibility to users?</title>
+
+ <para>
+ The previous implementation does the job but the signal facility of GObject can be used to provide
+ even more flexibility to this file change notification mechanism. One of the key ideas is to make the process
+ of writing data to the file part of the signal emission process to allow users to be notified either
+ before or after the data is written to the file.
+ </para>
+
+ <para>
+ To integrate the process of writing the data to the file into the signal emission mechanism, we can
+ register a default class closure for this signal which will be invoked during the signal emission, just like
+ any other user-connected signal handler.
+ </para>
+
+ <para>
+ The first step to implement this idea is to change the signature of the signal: we need to pass
+ around the buffer to write and its size. To do this, we use our own marshaller which will be generated
+ through glib's genmarshall tool. We thus create a file named <filename>marshall.list</filename> which contains
+ the following single line:
+<programlisting>
+VOID:POINTER,UINT
+</programlisting>
+ and use the Makefile provided in <filename>sample/signal/Makefile</filename> to generate the file named
+ <filename>maman-file-complex-marshall.c</filename>. This C file is finally included in
+ <filename>maman-file-complex.c</filename>.
+ </para>
+
+ <para>
+ Once the marshaller is present, we register the signal and its marshaller in the class_init function
+ of the object <type>MamanFileComplex</type> (full source for this object is included in
+ <filename>sample/signal/maman-file-complex.{h|c}</filename>):
+<programlisting>
+GClosure *default_closure;
+GType param_types[2];
+
+default_closure = g_cclosure_new (G_CALLBACK (default_write_signal_handler),
+ (gpointer)0xdeadbeaf /* user_data */,
+ NULL /* destroy_data */);
+
+param_types[0] = G_TYPE_POINTER;
+param_types[1] = G_TYPE_UINT;
+klass->write_signal_id =
+ g_signal_newv ("write",
+ G_TYPE_FROM_CLASS (g_class),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+ default_closure /* class closure */,
+ NULL /* accumulator */,
+ NULL /* accu_data */,
+ maman_file_complex_VOID__POINTER_UINT,
+ G_TYPE_NONE /* return_type */,
+ 2 /* n_params */,
+ param_types /* param_types */);
+</programlisting>
+ The code shown above first creates the closure which contains the code to complete the file write. This
+ closure is registered as the default class_closure of the newly created signal.
+ </para>
+
+ <para>
+ Of course, you need to implement completely the code for the default closure since I just provided
+ a skeleton:
+<programlisting>
+static void
+default_write_signal_handler (GObject *obj, guint8 *buffer, guint size, gpointer user_data)
+{
+ g_assert (user_data == (gpointer)0xdeadbeaf);
+ /* Here, we trigger the real file write. */
+ g_print ("default signal handler: 0x%x %u\n", buffer, size);
+}
+</programlisting>
+ </para>
+
+ <para>
+ Finally, the client code must invoke the <function>maman_file_complex_write</function> function which
+ triggers the signal emission:
+<programlisting>
+void maman_file_complex_write (MamanFileComplex *self, guint8 *buffer, guint size)
+{
+ /* trigger event */
+ g_signal_emit (self,
+ MAMAN_FILE_COMPLEX_GET_CLASS (self)->write_signal_id,
+ 0, /* details */
+ buffer, size);
+}
+</programlisting>
+ </para>
+
+ <para>
+ The client code (as shown in <filename>sample/signal/test.c</filename> and below) can now connect signal handlers before
+ and after the file write is completed: since the default signal handler which does the write itself runs during the
+ RUN_LAST phase of the signal emission, it will run after all handlers connected with <function><link linkend="g-signal-connect">g_signal_connect</link></function>
+ and before all handlers connected with <function><link linkend="g-signal-connect-after">g_signal_connect_after</link></function>. If you intent to write a GObject
+ which emits signals, I would thus urge you to create all your signals with the G_SIGNAL_RUN_LAST such that your users
+ have a maximum of flexibility as to when to get the event. Here, we combined it with G_SIGNAL_NO_RECURSE and
+ G_SIGNAL_NO_HOOKS to ensure our users will not try to do really weird things with our GObject. I strongly advise you
+ to do the same unless you really know why (in which case you really know the inner workings of GSignal by heart and
+ you are not reading this).
+ </para>
+
+ <para>
+<programlisting>
+static void complex_write_event_before (GObject *file, guint8 *buffer, guint size, gpointer user_data)
+{
+ g_assert (user_data == NULL);
+ g_print ("Complex Write event before: 0x%x, %u\n", buffer, size);
+}
+
+static void complex_write_event_after (GObject *file, guint8 *buffer, guint size, gpointer user_data)
+{
+ g_assert (user_data == NULL);
+ g_print ("Complex Write event after: 0x%x, %u\n", buffer, size);
+}
+
+static void test_file_complex (void)
+{
+ guint8 buffer[100];
+ GObject *file;
+
+ file = g_object_new (MAMAN_FILE_COMPLEX_TYPE, NULL);
+
+ g_signal_connect (G_OBJECT (file), "write",
+ (GCallback)complex_write_event_before,
+ NULL);
+
+ g_signal_connect_after (G_OBJECT (file), "write",
+ (GCallback)complex_write_event_after,
+ NULL);
+
+ maman_file_complex_write (MAMAN_FILE_COMPLEX (file), buffer, 50);
+
+ g_object_unref (G_OBJECT (file));
+}
+</programlisting>
+ The code above generates the following output on my machine:
+<programlisting>
+Complex Write event before: 0xbfffe280, 50
+default signal handler: 0xbfffe280 50
+Complex Write event after: 0xbfffe280, 50
+</programlisting>
+ </para>
+
+
+ <sect2>
+ <title>How most people do the same thing with less code</title>
+
+ <para>For many historic reasons related to how the ancestor of GObject used to work in GTK+ 1.x versions,
+ there is a much <emphasis>simpler</emphasis>
+ <footnote>
+ <para>I personally think that this method is horribly mind-twisting: it adds a new indirection
+ which unecessarily complicates the overall code path. However, because this method is widely used
+ by all of GTK+ and GObject code, readers need to understand it. The reason why this is done that way
+ in most of GTK+ is related to the fact that the ancestor of GObject did not provide any other way to
+ create a signal with a default handler than this one. Some people have tried to justify that it is done
+ that way because it is better, faster (I am extremly doubtfull about the faster bit. As a matter of fact,
+ the better bit also mystifies me ;-). I have the feeling no one really knows and everyone does it
+ because they copy/pasted code from code which did the same. It is probably better to leave this
+ specific trivia to hacker legends domain...
+ </para>
+ </footnote>
+ way to create a signal with a default handler than to create
+ a closure by hand and to use the <function><link linkend="g-signal-newv">g_signal_newv</link></function>.
+ </para>
+
+ <para>For example, <function><link linkend="g-signal-new">g_signal_new</link></function> can be used to create a signal which uses a default
+ handler which is stored in the class structure of the object. More specifically, the class structure
+ contains a function pointer which is accessed during signal emission to invoke the default handler and
+ the user is expected to provide to <function><link linkend="g-signal-new">g_signal_new</link></function> the offset from the start of the
+ class structure to the function pointer.
+ <footnote>
+ <para>I would like to point out here that the reason why the default handler of a signal is named everywhere
+ a class_closure is probably related to the fact that it used to be really a function pointer stored in
+ the class structure.
+ </para>
+ </footnote>
+ </para>
+
+ <para>The following code shows the declaration of the <type>MamanFileSimple</type> class structure which contains
+ the <function>write</function> function pointer.
+<programlisting>
+struct _MamanFileSimpleClass {
+ GObjectClass parent;
+
+ guint write_signal_id;
+
+ /* signal default handlers */
+ void (*write) (MamanFileSimple *self, guint8 *buffer, guint size);
+};
+</programlisting>
+ The <function>write</function> function pointer is initialied in the class_init function of the object
+ to <function>default_write_signal_handler</function>:
+<programlisting>
+static void
+maman_file_simple_class_init (gpointer g_class,
+ gpointer g_class_data)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
+ MamanFileSimpleClass *klass = MAMAN_FILE_SIMPLE_CLASS (g_class);
+
+ klass->write = default_write_signal_handler;
+</programlisting>
+ Finally, the signal is created with <function><link linkend="g-signal-new">g_signal_new</link></function> in the same class_init function:
+<programlisting>
+klass->write_signal_id =
+ g_signal_new ("write",
+ G_TYPE_FROM_CLASS (g_class),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+ G_STRUCT_OFFSET (MamanFileSimpleClass, write),
+ NULL /* accumulator */,
+ NULL /* accu_data */,
+ maman_file_complex_VOID__POINTER_UINT,
+ G_TYPE_NONE /* return_type */,
+ 2 /* n_params */,
+ G_TYPE_POINTER,
+ G_TYPE_UINT);
+</programlisting>
+ Of note, here, is the 4th argument to the function: it is an integer calculated by the <function><link linkend="G-STRUCT-OFFSET">G_STRUCT_OFFSET</link></function>
+ macro which indicates the offset of the member <emphasis>write</emphasis> from the start of the
+ <type>MamanFileSimpleClass</type> class structure.
+ <footnote>
+ <para>GSignal uses this offset to create a special wrapper closure
+ which first retrieves the target function pointer before calling it.
+ </para>
+ </footnote>
+ </para>
+
+ <para>
+ While the complete code for this type of default handler looks less clutered as shown in
+ <filename>sample/signal/maman-file-simple.{h|c}</filename>, it contains numerous subtleties.
+ The main subtle point which everyone must be aware of is that the signature of the default
+ handler created that way does not have a user_data argument:
+ <function>default_write_signal_handler</function> is different in
+ <filename>sample/signal/maman-file-complex.c</filename> and in
+ <filename>sample/signal/maman-file-simple.c</filename>.
+ </para>
+
+ <para>If you have doubts about which method to use, I would advise you to use the second one which
+ involves <function><link linkend="g-signal-new">g_signal_new</link></function> rather than <function><link linkend="g-signal-newv">g_signal_newv</link></function>:
+ it is better to write code which looks like the vast majority of other GTK+/GObject code than to
+ do it your own way. However, now, you know why.
+ </para>
+
+ </sect2>
+
+ </sect1>
+
+
+ <sect1>
+ <title>How users can abuse signals (and why some think it is good)</title>
+
+ <para>Now that you know how to create signals to which the users can connect easily and at any point in
+ the signal emission process thanks to <function><link linkend="g-signal-connect">g_signal_connect</link></function>,
+ <function><link linkend="g-signal-connect-after">g_signal_connect_after</link></function> and G_SIGNAL_RUN_LAST, it is time to look into how your
+ users can and will screw you. This is also interesting to know how you too, can screw other people.
+ This will make you feel good and eleet.
+ </para>
+
+ <para>
+ The users can:
+ <itemizedlist>
+ <listitem><para>stop the emission of the signal at anytime</para></listitem>
+ <listitem><para>override the default handler of the signal if it is stored as a function
+ pointer in the class structure (which is the prefered way to create a default signal handler,
+ as discussed in the previous section).</para></listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ In both cases, the original programmer should be as careful as possible to write code which is
+ resistant to the fact that the default handler of the signal might not able to run. This is obviously
+ not the case in the example used in the previous sections since the write to the file depends on whether
+ or not the default handler runs (however, this might be your goal: to allow the user to prevent the file
+ write if he wishes to).
+ </para>
+
+ <para>
+ If all you want to do is to stop the signal emission from one of the callbacks you connected yourself,
+ you can call <function><link linkend="g-signal-stop-by-name">g_signal_stop_by_name</link></function>. Its use is very simple which is why I won't detail
+ it further.
+ </para>
+
+ <para>
+ If the signal's default handler is just a class function pointer, it is also possible to override
+ it yourself from the class_init function of a type which derives from the parent. That way, when the signal
+ is emitted, the parent class will use the function provided by the child as a signal default handler.
+ Of course, it is also possible (and recommended) to chain up from the child to the parent's default signal
+ handler to ensure the integrity of the parent object.
+ </para>
+
+ <para>
+ Overriding a class method and chaining up was demonstrated in <xref linkend="howto-gobject-methods"/>
+ which is why I won't bother to show exactly how to do it here again.
+ </para>
+
+ </sect1>
+
+</chapter>
+
+<!--
+ <sect2>
+ <title>Warning on signal creation and default closure</title>
+
+ <para>
+ Most of the existing code I have seen up to now (in both GTK+, GNOME libraries and
+ many GTK+ and GNOME applications) using signals uses a small
+ variation of the default handler pattern I have shown in the previous section.
+ </para>
+
+ <para>
+ Usually, the <function><link linkend="g-signal-new">g_signal_new</link></function> function is preferred over
+ <function><link linkend="g-signal-newv">g_signal_newv</link></function>. When <function><link linkend="g-signal-new">g_signal_new</link></function>
+ is used, the default closure is exported as a class function. For example,
+ <filename>gobject.h</filename> contains the declaration of <type><link linkend="GObjectClass">GObjectClass</link></type>
+ whose notify class function is the default handler for the <emphasis>notify</emphasis>
+ signal:
+<programlisting>
+struct _GObjectClass
+{
+ GTypeClass g_type_class;
+
+ /* class methods and other stuff. */
+
+ /* signals */
+ void (*notify) (GObject *object,
+ GParamSpec *pspec);
+};
+</programlisting>
+ </para>
+
+ <para>
+ <filename>gobject.c</filename>'s <function><link linkend="g-object-do-class-init">g_object_do_class_init</link></function> function
+ registers the <emphasis>notify</emphasis> signal and initializes this class function
+ to NULL:
+<programlisting>
+static void
+g_object_do_class_init (GObjectClass *class)
+{
+
+ /* Stuff */
+
+ class->notify = NULL;
+
+ gobject_signals[NOTIFY] =
+ g_signal_new ("notify",
+ G_TYPE_FROM_CLASS (class),
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED | G_SIGNAL_NO_HOOKS,
+ G_STRUCT_OFFSET (GObjectClass, notify),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__PARAM,
+ G_TYPE_NONE,
+ 1, G_TYPE_PARAM);
+}
+</programlisting>
+ <function><link linkend="g-signal-new">g_signal_new</link></function> creates a <type><link linkend="GClosure">GClosure</link></type> which dereferences the
+ type's class structure to access the class function pointer and invoke it if it not NULL. The
+ class function is ignored it is set to NULL.
+ </para>
+
+ <para>
+ To understand the reason for such a complex scheme to access the signal's default handler,
+ you must remember the whole reason for the use of these signals. The goal here is to delegate
+ a part of the process to the user without requiring the user to subclass the object to override
+ one of the class functions. The alternative to subclassing, that is, the use of signals
+ to delegate processing to the user, is, however, a bit less optimal in terms of speed: rather
+ than just dereferencing a function pointer in a class structure, you must start the whole
+ process of signal emission which is a bit heavyweight.
+ </para>
+
+ <para>
+ This is why some people decided to use class functions for some signal's default handlers:
+ rather than having users connect a handler to the signal and stop the signal emission
+ from within that handler, you just need to override the default class function which is
+ supposedly more efficient.
+ </para>
+
+ </sect2>
+-->
+
diff --git a/trunk/docs/reference/gobject/tut_intro.xml b/trunk/docs/reference/gobject/tut_intro.xml
new file mode 100644
index 000000000..74e532322
--- /dev/null
+++ b/trunk/docs/reference/gobject/tut_intro.xml
@@ -0,0 +1,179 @@
+<?xml version='1.0' encoding="ISO-8859-1"?>
+<chapter id="chapter-intro">
+ <title>Background</title>
+
+ <para>
+ GObject, and its lower-level type system, GType, are used by GTK+ and most GNOME libraries to
+ provide:
+ <itemizedlist>
+ <listitem><para>object-oriented C-based APIs and</para></listitem>
+ <listitem><para>automatic transparent API bindings to other compiled
+ or interpreted languages.</para></listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ A lot of programmers are used to work with compiled-only or dynamically interpreted-only
+ languages and do not understand the challenges associated with cross-language interoperability.
+ This introduction tries to provide an insight into these challenges. describes briefly
+ the solution choosen by GLib.
+ </para>
+
+ <para>
+ The following chapters go into greater detail into how GType and GObject work and
+ how you can use them as a C programmer. It is useful to keep in mind that
+ allowing access to C objects from other interpreted languages was one of the major design
+ goals: this can often explain the sometimes rather convoluted APIs and features present
+ in this library.
+ </para>
+
+ <sect1>
+ <title>Data types and programming</title>
+
+ <para>
+ One could say (I have seen such definitions used in some textbooks on programming language theory)
+ that a programming language is merely a way to create data types and manipulate them. Most languages
+ provide a number of language-native types and a few primitives to create more complex types based
+ on these primitive types.
+ </para>
+
+ <para>
+ In C, the language provides types such as <emphasis>char</emphasis>, <emphasis>long</emphasis>,
+ <emphasis>pointer</emphasis>. During compilation of C code, the compiler maps these
+ language types to the compiler's target architecture machine types. If you are using a C interpreter
+ (I have never seen one myself but it is possible :), the interpreter (the program which interprets
+ the source code and executes it) maps the language types to the machine types of the target machine at
+ runtime, during the program execution (or just before execution if it uses a Just In Time compiler engine).
+ </para>
+
+ <para>
+ Perl and Python which are interpreted languages do not really provide type definitions similar
+ to those used by C. Perl and Python programmers manipulate variables and the type of the variables
+ is decided only upon the first assignment or upon the first use which forces a type on the variable.
+ The interpreter also often provides a lot of automatic conversions from one type to the other. For example,
+ in Perl, a variable which holds an integer can be automatically converted to a string given the
+ required context:
+<programlisting>
+my $tmp = 10;
+print "this is an integer converted to a string:" . $tmp . "\n";
+</programlisting>
+ Of course, it is also often possible to explicitely specify conversions when the default conversions provided
+ by the language are not intuitive.
+ </para>
+
+ </sect1>
+
+ <sect1>
+ <title>Exporting a C API</title>
+
+ <para>
+ C APIs are defined by a set of functions and global variables which are usually exported from a
+ binary. C functions have an arbitrary number of arguments and one return value. Each function is thus
+ uniquely identified by the function name and the set of C types which describe the function arguments
+ and return value. The global variables exported by the API are similarly identified by their name and
+ their type.
+ </para>
+
+ <para>
+ A C API is thus merely defined by a set of names to which a set of types are associated. If you know the
+ function calling convention and the mapping of the C types to the machine types used by the platform you
+ are on, you can resolve the name of each function to find where the code associated to this function
+ is located in memory, and then construct a valid argument list for the function. Finally, all you have to
+ do is triger a call to the target C function with the argument list.
+ </para>
+
+ <para>
+ For the sake of discussion, here is a sample C function and the associated 32 bit x86
+ assembly code generated by gcc on my linux box:
+<programlisting>
+static void function_foo (int foo)
+{}
+
+int main (int argc, char *argv[])
+{
+
+ function_foo (10);
+
+ return 0;
+}
+
+push $0xa
+call 0x80482f4 &lt;function_foo>
+</programlisting>
+ The assembly code shown above is pretty straightforward: the first instruction pushes
+ the hexadecimal value 0xa (decimal value 10) as a 32 bit integer on the stack and calls
+ <function>function_foo</function>. As you can see, C function calls are implemented by
+ gcc by native function calls (this is probably the fastest implementation possible).
+ </para>
+
+ <para>
+ Now, let's say we want to call the C function <function>function_foo</function> from
+ a python program. To do this, the python interpreter needs to:
+ <itemizedlist>
+ <listitem><para>Find where the function is located. This means probably find the binary generated by the C compiler
+ which exports this functions.</para></listitem>
+ <listitem><para>Load the code of the function in executable memory.</para></listitem>
+ <listitem><para>Convert the python parameters to C-compatible parameters before calling
+ the function.</para></listitem>
+ <listitem><para>Call the function with the right calling convention</para></listitem>
+ <listitem><para>Convert the return values of the C function to python-compatible
+ variables to return them to the python code.</para></listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ The process described above is pretty complex and there are a lot of ways to make it entirely automatic
+ and transparent to the C and the Python programmers:
+ <itemizedlist>
+ <listitem><para>The first solution is to write by hand a lot of glue code, once for each function exported or imported,
+ which does the python to C parameter conversion and the C to python return value conversion. This glue code is then
+ linked with the interpreter which allows python programs to call a python functions which delegates the work to the
+ C function.</para></listitem>
+ <listitem><para>Another nicer solution is to automatically generate the glue code, once for each function exported or
+ imported, with a special compiler which
+ reads the original function signature.</para></listitem>
+ <listitem><para>The solution used by GLib is to use the GType library which holds at runtime a description of
+ all the objects manipulated by the programmer. This so-called <emphasis>dynamic type</emphasis>
+ <footnote>
+ <para>
+ There are numerous different implementations of dynamic type systems: all C++
+ compilers have one, Java and .NET have one too. A dynamic type system allows you
+ to get information about every instantiated object at runtime. It can be implemented
+ by a process-specific database: every new object created registers the characteristics
+ of its associated type in the type system. It can also be implemented by introspection
+ interfaces. The common point between all these different type systems and implementations
+ is that they all allow you to query for object metadata at runtime.
+ </para>
+ </footnote>
+ library is then used by special generic glue code to automatically convert function parameters and
+ function calling conventions between different runtime domains.</para></listitem>
+ </itemizedlist>
+ The greatest advantage of the solution implemented by GType is that the glue code sitting at the runtime domain
+ boundaries is written once: the figure below states this more clearly.
+ <figure>
+ <mediaobject>
+ <imageobject> <!-- this is for HTML output -->
+ <imagedata fileref="glue.png" format="PNG" align="center"/>
+ </imageobject>
+ <imageobject> <!-- this is for PDF output -->
+ <imagedata fileref="glue.jpg" format="JPG" align="center"/>
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ Currently, there exist at least Python and Perl generic glue code which makes it possible to use
+ C objects written with GType directly in Python or Perl, with a minimum amount of work: there
+ is no need to generate huge amounts of glue code either automatically or by hand.
+ </para>
+
+ <para>
+ Although that goal was arguably laudable, its pursuit has had a major influence on
+ the whole GType/GObject library. C programmers are likely to be puzzled at the complexity
+ of the features exposed in the following chapters if they forget that the GType/GObject library
+ was not only designed to offer OO-like features to C programmers but also transparent
+ cross-language interoperability.
+ </para>
+
+ </sect1>
+
+</chapter>
diff --git a/trunk/docs/reference/gobject/tut_tools.xml b/trunk/docs/reference/gobject/tut_tools.xml
new file mode 100644
index 000000000..17edbfd8d
--- /dev/null
+++ b/trunk/docs/reference/gobject/tut_tools.xml
@@ -0,0 +1,100 @@
+<?xml version='1.0' encoding="ISO-8859-1"?>
+<partintro>
+ <para>
+ Several useful developer tools have been build around GObject technology.
+ The next sections briefly introduce them and link to the respective project pages.
+ </para>
+</partintro>
+
+<chapter id="tools-gob">
+ <title>GObject builder</title>
+
+ <para>
+ Writing GObjects can be a tedious task. It requires a lot of typing and just
+ doing a copy/paste requires a great deal of care.
+ One obvious idea is to use some sort of templates for the class skeletons.
+ and then run them through a special tool to generate the real C files.
+ <ulink url="http://www.5z.com/jirka/gob.html">GOB/</ulink> (or GOB2) is such
+ a tool. It is a preprocessor which can be used to build GObjects
+ with inline C code so that there is no need to edit the generated C code.
+ The syntax is inspired by Java and Yacc or Lex. The implementation is
+ intentionally kept simple: the inline C code provided by the user
+ is not parsed.
+ </para>
+</chapter>
+
+<chapter id="tools-ginspector">
+ <title>Graphical inspection of GObjects</title>
+
+ <para>
+ Yet another tool that you may find helpful when working with
+ GObjects is <ulink
+ url="http://sourceforge.net/projects/g-inspector">G-Inspector</ulink>. It
+ is able to display Glib/Gtk+ objects and their properties.
+ </para>
+</chapter>
+
+
+<chapter id="tools-refdb">
+ <title>Debugging reference count problems</title>
+
+ <para>
+ The reference counting scheme used by GObject does solve quite
+ a few memory management problems but also introduces new sources of bugs.
+ In large applications, finding the exact spot where the reference count
+ of an Object is not properly handled can be very difficult. Hopefully,
+ there exist a tool named <ulink url="http://refdbg.sf.net/">refdbg/</ulink>
+ which can be used to automate the task of tracking down the location
+ of invalid code with regard to reference counting. This application
+ intercepts the reference counting calls and tries to detect invalid behavior.
+ It suports a filter-rule mechanism to let you trace only the objects you are
+ interested in and it can be used together with gdb.
+ </para>
+ <para>
+ <indexterm><primary>g_trap_object_ref</primary></indexterm>
+ Note that if GObject has been compiled with <option>--enable-debug=yes</option>,
+ it exports a trap variable
+ <programlisting>
+static volatile GObject *g_trap_object_ref;
+ </programlisting>
+ If set to a non-NULL value, <link linkend="g-object-ref">g_object_ref</link>()
+ and <link linkend="g-object-unref">g_object_unref</link>() will be intercepted
+ when called with that value.
+ </para>
+</chapter>
+
+<chapter id="tools-gtkdoc">
+ <title>Writing API docs</title>
+
+ <para>The API documentation for most of the Glib, GObject, GTK+ and GNOME
+ libraries is built with a combination of complex tools. Typically, the part of
+ the documentation which describes the behavior of each function is extracted
+ from the specially-formatted source code comments by a tool named gtk-doc which
+ generates docbook xml and merges this docbook xml with a set of master xml
+ docbook files. These xml docbook files are finally processed with xsltproc
+ (a small program part of the libxslt library) to generate the final html
+ output. Other tools can be used to generate pdf output from the source xml.
+ The following code excerpt shows what these comments look like.
+<programlisting>
+/**
+ * gtk_widget_freeze_child_notify:
+ * @widget: a #GtkWidget
+ *
+ * Stops emission of "child-notify" signals on @widget. The signals are
+ * queued until gtk_widget_thaw_child_notify() is called on @widget.
+ *
+ * This is the analogue of g_object_freeze_notify() for child properties.
+ **/
+void
+gtk_widget_freeze_child_notify (GtkWidget *widget)
+{
+...
+</programlisting>
+ </para>
+ <para>
+ The great thoroughful
+ <ulink url="http://developer.gnome.org/arch/doc/authors.html">documentation</ulink>
+ on how to setup and use gtk-doc in your
+ project is provided on the gnome developer website.
+ </para>
+</chapter>
diff --git a/trunk/docs/reference/gobject/version.xml.in b/trunk/docs/reference/gobject/version.xml.in
new file mode 100644
index 000000000..af9b9c467
--- /dev/null
+++ b/trunk/docs/reference/gobject/version.xml.in
@@ -0,0 +1 @@
+@GLIB_VERSION@
diff --git a/trunk/glib-2.0-uninstalled.pc.in b/trunk/glib-2.0-uninstalled.pc.in
new file mode 100644
index 000000000..0290ea78c
--- /dev/null
+++ b/trunk/glib-2.0-uninstalled.pc.in
@@ -0,0 +1,9 @@
+glib_genmarshal=${pc_top_builddir}/${pcfiledir}/gobject/glib-genmarshal
+gobject_query=${pc_top_builddir}/${pcfiledir}/gobject/gobject-query
+glib_mkenums=${pc_top_builddir}/${pcfiledir}/@srcdir@/gobject/glib-mkenums
+
+Name: GLib Uninstalled
+Description: C Utility Library, Not Installed
+Version: @VERSION@
+Libs: ${pc_top_builddir}/${pcfiledir}/glib/libglib-2.0.la @ICONV_LIBS@ @INTLLIBS@
+Cflags: -I${pc_top_builddir}/${pcfiledir} -I${pc_top_builddir}/${pcfiledir}/@srcdir@ -I${pc_top_builddir}/${pcfiledir}/@srcdir@/glib
diff --git a/trunk/glib-2.0.pc.in b/trunk/glib-2.0.pc.in
new file mode 100644
index 000000000..deb1739f9
--- /dev/null
+++ b/trunk/glib-2.0.pc.in
@@ -0,0 +1,15 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+glib_genmarshal=glib-genmarshal
+gobject_query=gobject-query
+glib_mkenums=glib-mkenums
+
+Name: GLib
+Description: C Utility Library
+Version: @VERSION@
+Libs: -L${libdir} -lglib-2.0 @INTLLIBS@ @ICONV_LIBS@
+Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include
+
diff --git a/trunk/glib-gettextize.in b/trunk/glib-gettextize.in
new file mode 100644
index 000000000..35d01c120
--- /dev/null
+++ b/trunk/glib-gettextize.in
@@ -0,0 +1,188 @@
+#! /bin/sh
+#
+# Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc.
+#
+# 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.
+#
+
+# - Modified in October 2001 by jacob berkman <jacob@ximian.com> to
+# work with glib's Makefile.in.in and po2tbl.sed.in, to not copy in
+# intl/, and to not add ChangeLog entries to po/ChangeLog
+
+# This file is meant for authors or maintainers which want to
+# internationalize their package with the help of GNU gettext. For
+# further information how to use it consult the GNU gettext manual.
+
+echo=echo
+progname=$0
+force=0
+configstatus=0
+origdir=`pwd`
+usage="\
+Usage: glib-gettextize [OPTION]... [package-dir]
+ --help print this help and exit
+ --version print version information and exit
+ -c, --copy copy files instead of making symlinks
+ -f, --force force writing of new files even if old exist
+Report bugs to http://bugzilla.gnome.org/."
+package=@PACKAGE@
+version=@VERSION@
+try_ln_s=:
+
+# Directory where the sources are stored.
+prefix=@prefix@
+case `uname` in
+MINGW32*)
+ prefix="`dirname $0`/.."
+ ;;
+esac
+
+datadir=@datadir@
+datarootdir=@datarootdir@
+
+gettext_dir=$prefix/share/glib-2.0/gettext
+
+while test $# -gt 0; do
+ case "$1" in
+ -c | --copy | --c* )
+ shift
+ try_ln_s=false ;;
+ -f | --force | --f* )
+ shift
+ force=1 ;;
+ -r | --run | --r* )
+ shift
+ configstatus=1 ;;
+ --help | --h* )
+ $echo "$usage"; exit 0 ;;
+ --version | --v* )
+ echo "$progname (GNU $package) $version"
+ $echo "Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+ $echo "Written by" "Ulrich Drepper"
+ exit 0 ;;
+ -- ) # Stop option prcessing
+ shift; break ;;
+ -* )
+ $echo "glib-gettextize: unknown option $1"
+ $echo "Try \`glib-gettextize --help' for more information."; exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# -gt 1; then
+ $echo "$usage"
+ exit 1
+fi
+
+# Fill in the command line options value.
+if test $# -eq 1; then
+ srcdir=$1
+ if cd "$srcdir"; then
+ srcdir=`pwd`
+ else
+ $echo "Cannot change directory to \`$srcdir'"
+ exit 1
+ fi
+else
+ srcdir=$origdir
+fi
+
+test -f configure.in || test -f configure.ac || {
+ $echo "Missing configure.in or configure.ac, please cd to your package first."
+ exit 1
+}
+
+configure_in=NONE
+if test -f configure.in; then
+ configure_in=configure.in
+else
+ if test -f configure.ac; then
+ configure_in=configure.ac
+ fi
+fi
+# Check in which directory config.rpath, mkinstalldirs etc. belong.
+auxdir=`cat "$configure_in" | grep '^AC_CONFIG_AUX_DIR' | sed -n -e 's/AC_CONFIG_AUX_DIR(\([^()]*\))/\1/p' | sed -e 's/^\[\(.*\)\]$/\1/' | sed -e 1q`
+if test -n "$auxdir"; then
+ auxdir="$auxdir/"
+fi
+
+if test -f po/Makefile.in.in && test $force -eq 0; then
+ $echo "\
+po/Makefile.in.in exists: use option -f if you really want to delete it."
+ exit 1
+fi
+
+test -d po || {
+ $echo "Creating po/ subdirectory"
+ mkdir po || {
+ $echo "failed to create po/ subdirectory"
+ exit 1
+ }
+}
+
+# For simplicity we changed to the gettext source directory.
+cd $gettext_dir || {
+ $echo "gettext source directory '${gettext_dir}' doesn't exist"
+ exit 1
+}
+
+# Now copy all files. Take care for the destination directories.
+for file in *; do
+ case $file in
+ intl | po)
+ ;;
+ mkinstalldirs)
+ rm -f "$srcdir/$auxdir$file"
+ ($try_ln_s && ln -s $gettext_dir/$file "$srcdir/$auxdir$file" && $echo "Symlinking file $file") 2>/dev/null ||
+ { $echo "Copying file $file"; cp $file "$srcdir/$auxdir$file"; }
+ ;;
+ *)
+ rm -f "$srcdir/$file"
+ ($try_ln_s && ln -s $gettext_dir/$file "$srcdir/$file" && $echo "Symlinking file $file") 2>/dev/null ||
+ { $echo "Copying file $file"; cp $file "$srcdir/$file"; }
+ ;;
+ esac
+done
+
+# Copy files to po/ subdirectory.
+cd po
+for file in *; do
+ rm -f "$srcdir/po/$file"
+ ($try_ln_s && ln -s $gettext_dir/po/$file "$srcdir/po/$file" && $echo "Symlinking file po/$file") 2>/dev/null ||
+ { $echo "Copying file po/$file"; cp $file "$srcdir/po/$file"; }
+done
+if test -f "$srcdir/po/cat-id-tbl.c"; then
+ $echo "Removing po/cat-id-tbl.c"
+ rm -f "$srcdir/po/cat-id-tbl.c"
+fi
+if test -f "$srcdir/po/stamp-cat-id"; then
+ $echo "Removing po/stamp-cat-id"
+ rm -f "$srcdir/po/stamp-cat-id"
+fi
+
+echo
+echo "Please add the files"
+echo " codeset.m4 gettext.m4 glibc21.m4 iconv.m4 isc-posix.m4 lcmessage.m4"
+echo " progtest.m4"
+echo "from the $datadir/aclocal directory to your autoconf macro directory"
+echo "or directly to your aclocal.m4 file."
+echo "You will also need config.guess and config.sub, which you can get from"
+echo "ftp://ftp.gnu.org/pub/gnu/config/."
+echo
+
+exit 0
diff --git a/trunk/glib-zip.in b/trunk/glib-zip.in
new file mode 100755
index 000000000..9ca1e0b5d
--- /dev/null
+++ b/trunk/glib-zip.in
@@ -0,0 +1,66 @@
+#!/bin/sh
+
+# Build zipfiles for GLib on Win32: Separate runtime and developer ones.
+# After running make install, run this.
+
+ZIP=/tmp/glib-@GLIB_VERSION@.zip
+DEVZIP=/tmp/glib-dev-@GLIB_VERSION@.zip
+
+cd @prefix@
+
+mkdir -p share/doc/glib-@GLIB_VERSION@
+cp -p @abs_srcdir@/COPYING share/doc/glib-@GLIB_VERSION@
+
+mkdir -p share/doc/glib-dev-@GLIB_VERSION@
+cp -p @abs_srcdir@/COPYING share/doc/glib-dev-@GLIB_VERSION@
+
+rm $ZIP
+zip $ZIP -@ <<EOF
+COPYING.LIB-2
+bin/gspawn-win32-helper.exe
+bin/gspawn-win32-helper-console.exe
+bin/libglib-2.0-@LT_CURRENT_MINUS_AGE@.dll
+bin/libgmodule-2.0-@LT_CURRENT_MINUS_AGE@.dll
+bin/libgobject-2.0-@LT_CURRENT_MINUS_AGE@.dll
+bin/libgthread-2.0-@LT_CURRENT_MINUS_AGE@.dll
+EOF
+
+zip -r $ZIP lib/locale/*/LC_MESSAGES/glib20.mo
+
+zip -r $ZIP share/doc/glib-@GLIB_VERSION@
+
+rm $DEVZIP
+zip -r $DEVZIP -@ <<EOF
+bin/glib-genmarshal.exe
+bin/glib-gettextize
+bin/glib-mkenums
+bin/gobject-query.exe
+include/glib-2.0
+lib/libglib-2.0.dll.a
+lib/glib-2.0.lib
+lib/glib-2.0.def
+lib/libgmodule-2.0.dll.a
+lib/gmodule-2.0.lib
+lib/gmodule-2.0.def
+lib/libgobject-2.0.dll.a
+lib/gobject-2.0.lib
+lib/gobject-2.0.def
+lib/libgthread-2.0.dll.a
+lib/gthread-2.0.lib
+lib/gthread-2.0.def
+lib/glib-2.0
+lib/pkgconfig/glib-2.0.pc
+lib/pkgconfig/gmodule-2.0.pc
+lib/pkgconfig/gmodule-no-export-2.0.pc
+lib/pkgconfig/gobject-2.0.pc
+lib/pkgconfig/gthread-2.0.pc
+share/aclocal/glib-2.0.m4
+share/aclocal/glib-gettext.m4
+share/glib-2.0
+share/gtk-doc/html/glib
+share/gtk-doc/html/gobject
+man/man1/glib-mkenums.1
+man/man1/glib-genmarshal.1
+EOF
+
+zip -r $DEVZIP share/doc/glib-dev-@GLIB_VERSION@
diff --git a/trunk/glib/Makefile.am b/trunk/glib/Makefile.am
new file mode 100644
index 000000000..b1f8cc6fc
--- /dev/null
+++ b/trunk/glib/Makefile.am
@@ -0,0 +1,298 @@
+## Process this file with automake to produce Makefile.in
+
+if HAVE_GOOD_PRINTF
+else
+PRINTF_SUBDIR = gnulib
+printf_la = gnulib/libgnulib.la
+endif
+
+if ENABLE_REGEX
+if USE_SYSTEM_PCRE
+else
+MAYBE_PCRE = pcre
+endif
+gregex_c = gregex.c
+gregex_h = gregex.h
+else
+gregex_c =
+gregex_h =
+endif
+
+SUBDIRS = libcharset $(PRINTF_SUBDIR) $(MAYBE_PCRE) update-pcre
+
+DIST_SUBDIRS = libcharset gnulib pcre update-pcre
+
+INCLUDES = -I$(top_srcdir) -DG_LOG_DOMAIN=\"GLib\" \
+ $(GLIB_DEBUG_FLAGS) -DG_DISABLE_DEPRECATED -DGLIB_COMPILATION
+
+glib.def: glib.symbols
+ (echo -e EXPORTS; $(CPP) -P -DINCLUDE_VARIABLES -DINCLUDE_INTERNAL_SYMBOLS -DG_OS_WIN32 -DALL_FILES - <$(srcdir)/glib.symbols | sed -e '/^$$/d' -e 's/^/ /' -e 's/G_GNUC_[^ ]*//g') > glib.def
+
+galias.h: glib.symbols
+ $(PERL) $(srcdir)/makegalias.pl < $(srcdir)/glib.symbols > galias.h
+
+galiasdef.c: glib.symbols
+ $(PERL) $(srcdir)/makegalias.pl -def < $(srcdir)/glib.symbols > galiasdef.c
+
+if OS_LINUX
+if HAVE_GNUC_VISIBILITY
+TESTS = abicheck.sh pltcheck.sh
+endif
+endif
+
+BUILT_SOURCES = galias.h galiasdef.c
+
+MIRRORING_TAB_SOURCES = \
+ glib-mirroring-tab/Makefile \
+ glib-mirroring-tab/gen-mirroring-tab.c \
+ glib-mirroring-tab/packtab.h \
+ glib-mirroring-tab/packtab.c
+
+# The compilation of GRegex can be disabled, but the source files must
+# be distributed.
+EXTRA_DIST = \
+ makefile.msc.in \
+ glib.rc.in \
+ gen-unicode-tables.pl \
+ gen-script-table.pl \
+ makegalias.pl \
+ abicheck.sh \
+ pltcheck.sh \
+ glib.symbols \
+ gregex.c \
+ gregex.h \
+ $(MIRRORING_TAB_SOURCES)
+
+# These may be in the builddir too
+BUILT_EXTRA_DIST = \
+ makefile.msc \
+ glib.rc \
+ galias.h \
+ galiasdef.c
+
+lib_LTLIBRARIES = libglib-2.0.la
+
+if MS_LIB_AVAILABLE
+noinst_DATA = glib-2.0.lib
+
+install-ms-lib:
+ $(INSTALL) glib-2.0.lib $(DESTDIR)$(libdir)
+
+uninstall-ms-lib:
+ -rm $(DESTDIR)$(libdir)/glib-2.0.lib
+else
+install-ms-lib:
+uninstall-ms-lib:
+endif
+
+libglib_2_0_la_SOURCES = \
+ garray.c \
+ gasyncqueue.c \
+ gatomic.c \
+ gbacktrace.c \
+ gbase64.c \
+ gbookmarkfile.c \
+ gbsearcharray.h \
+ gcache.c \
+ gcompletion.c \
+ gconvert.c \
+ gdataset.c \
+ gdatasetprivate.h \
+ gdate.c \
+ gdir.c \
+ gerror.c \
+ gfileutils.c \
+ ghash.c \
+ ghook.c \
+ giochannel.c \
+ gkeyfile.c \
+ glibintl.h \
+ glist.c \
+ gmain.c \
+ gmappedfile.c \
+ gmarkup.c \
+ gmem.c \
+ gmessages.c \
+ gmirroringtable.h \
+ gnode.c \
+ goption.c \
+ gpattern.c \
+ gprimes.c \
+ gqsort.c \
+ gqueue.c \
+ grel.c \
+ grand.c \
+ $(gregex_c) \
+ gscanner.c \
+ gscripttable.h \
+ gsequence.c \
+ gshell.c \
+ gslice.c \
+ gslist.c \
+ gstdio.c \
+ gstrfuncs.c \
+ gstring.c \
+ gthread.c \
+ gthreadprivate.h \
+ gthreadpool.c \
+ gtimer.c \
+ gtree.c \
+ guniprop.c \
+ gutf8.c \
+ gunibreak.h \
+ gunibreak.c \
+ gunichartables.h \
+ gunicollate.c \
+ gunicomp.h \
+ gunidecomp.h \
+ gunidecomp.c \
+ gunicodeprivate.h \
+ gutils.c \
+ gdebug.h \
+ gprintf.c \
+ gprintfint.h
+
+EXTRA_libglib_2_0_la_SOURCES = \
+ giounix.c \
+ giowin32.c \
+ gspawn.c \
+ gspawn-win32.c \
+ gwin32.c
+
+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 \
+ gatomic.h \
+ gbacktrace.h \
+ gbase64.h \
+ gbookmarkfile.h \
+ gcache.h \
+ gcompletion.h \
+ gconvert.h \
+ gdataset.h \
+ gdate.h \
+ gdir.h \
+ gerror.h \
+ gfileutils.h \
+ ghash.h \
+ ghook.h \
+ gi18n.h \
+ gi18n-lib.h \
+ giochannel.h \
+ gkeyfile.h \
+ glist.h \
+ gmacros.h \
+ gmain.h \
+ gmappedfile.h \
+ gmarkup.h \
+ gmem.h \
+ gmessages.h \
+ gnode.h \
+ goption.h \
+ gpattern.h \
+ gprimes.h \
+ gqsort.h \
+ gquark.h \
+ gqueue.h \
+ grand.h \
+ $(gregex_h) \
+ grel.h \
+ gscanner.h \
+ gsequence.h \
+ gshell.h \
+ gslice.h \
+ gslist.h \
+ gspawn.h \
+ gstdio.h \
+ gstrfuncs.h \
+ gstring.h \
+ gthread.h \
+ gthreadpool.h \
+ gtimer.h \
+ gtree.h \
+ gtypes.h \
+ gunicode.h \
+ gutils.h \
+ gwin32.h \
+ gprintf.h
+
+install-data-local: install-ms-lib install-def-file
+ @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
+
+uninstall-local: uninstall-ms-lib uninstall-def-file
+
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif
+
+if OS_WIN32
+# This requires a very new libtool
+export_symbols = -export-symbols glib.def
+
+install-def-file:
+ $(INSTALL) glib.def $(DESTDIR)$(libdir)/glib-2.0.def
+
+uninstall-def-file:
+ -rm $(DESTDIR)$(libdir)/glib-2.0.def
+else
+install-def-file:
+uninstall-def-file:
+
+export_symbols = $(LIBTOOL_EXPORT_OPTIONS)
+endif
+
+if OS_WIN32
+glib_win32_res = glib-win32-res.o
+glib_win32_res_ldflag = -Wl,$(glib_win32_res)
+endif
+
+if ENABLE_REGEX
+if USE_SYSTEM_PCRE
+pcre_lib = $(PCRE_LIBS)
+else
+pcre_lib = pcre/libpcre.la
+endif
+else
+pcre_lib =
+endif
+
+libglib_2_0_la_LIBADD = libcharset/libcharset.la $(printf_la) @GIO@ @GSPAWN@ @PLATFORMDEP@ @ICONV_LIBS@ @G_LIBS_EXTRA@ $(pcre_lib)
+libglib_2_0_la_DEPENDENCIES = libcharset/libcharset.la $(printf_la) @GIO@ @GSPAWN@ @PLATFORMDEP@ $(glib_win32_res) @GLIB_DEF@
+
+libglib_2_0_la_LDFLAGS = \
+ $(glib_win32_res_ldflag) \
+ -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-console
+gspawn_win32_helper_LDADD = libglib-2.0.la
+gspawn_win32_helper_LDFLAGS = -mwindows
+gspawn_win32_helper_console_LDADD = libglib-2.0.la
+
+glib-win32-res.o: glib.rc
+ $(WINDRES) glib.rc $@
+endif
+
+gspawn-win32-helper-console.c:
+ echo '#include "gspawn-win32-helper.c"' >$@
+
+glib-2.0.lib: libglib-2.0.la glib.def
+ lib -name:libglib-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:glib.def -out:$@
+
+dist-hook: $(BUILT_EXTRA_DIST)
+ files='$(BUILT_EXTRA_DIST)'; \
+ for f in $$files; do \
+ if test -f $$f; then d=.; else d=$(srcdir); fi; \
+ cp $$d/$$f $(distdir) || exit 1; done
diff --git a/trunk/glib/abicheck.sh b/trunk/glib/abicheck.sh
new file mode 100755
index 000000000..3e6968501
--- /dev/null
+++ b/trunk/glib/abicheck.sh
@@ -0,0 +1,13 @@
+#! /bin/sh
+
+egrep '^#([^i]|if).*[^\]$' "${top_builddir:-..}/glibconfig.h" > glibconfig.cpp
+
+INCLUDES="-include ${top_builddir:-..}/config.h"
+INCLUDES="$INCLUDES -include glibconfig.cpp"
+
+cpp -P -DINCLUDE_INTERNAL_SYMBOLS -DINCLUDE_VARIABLES -DG_STDIO_NO_WRAP_ON_UNIX -DALL_FILES $INCLUDES "${srcdir:-.}/glib.symbols" | sed -e '/^$/d' -e 's/ G_GNUC.*$//' -e 's/ PRIVATE$//' | sort > expected-abi
+rm -f glibconfig.cpp
+
+nm -D -g --defined-only .libs/libglib-2.0.so | cut -d ' ' -f 3 | sort > actual-abi
+
+diff -u expected-abi actual-abi && rm -f expected-abi actual-abi
diff --git a/trunk/glib/galloca.h b/trunk/glib/galloca.h
new file mode 100644
index 000000000..baf80096a
--- /dev/null
+++ b/trunk/glib/galloca.h
@@ -0,0 +1,60 @@
+/* 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 <glib/gtypes.h>
+
+#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 <alloca.h>
+#else /* !__GNUC__ && !GLIB_HAVE_ALLOCA_H */
+# if defined(_MSC_VER) || defined(__DMC__)
+# include <malloc.h>
+# define alloca _alloca
+# else /* !_MSC_VER && !__DMC__ */
+# 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 && !__DMC__ */
+#endif /* !__GNUC__ && !GLIB_HAVE_ALLOCA_H */
+
+#define g_alloca(size) alloca (size)
+#define g_newa(struct_type, n_structs) ((struct_type*) g_alloca (sizeof (struct_type) * (gsize) (n_structs)))
+
+
+#endif /* __G_ALLOCA_H__ */
diff --git a/trunk/glib/garray.c b/trunk/glib/garray.c
new file mode 100644
index 000000000..6aaf0a5c9
--- /dev/null
+++ b/trunk/glib/garray.c
@@ -0,0 +1,719 @@
+/* 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 "config.h"
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "garray.h"
+
+#include "gmem.h"
+#include "gthread.h"
+#include "gmessages.h"
+#include "gqsort.h"
+
+#include "galias.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);
+
+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_slice_new (GRealArray);
+
+ 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_slice_free1 (sizeof (GRealArray), array);
+
+ 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);
+ }
+ else if (G_UNLIKELY (g_mem_gc_friendly) && length < array->len)
+ g_array_elt_zero (array, length, array->len - length);
+
+ 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;
+
+ if (G_UNLIKELY (g_mem_gc_friendly))
+ g_array_elt_zero (array, array->len, 1);
+ else
+ g_array_zero_terminate (array);
+
+ 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;
+
+ if (G_UNLIKELY (g_mem_gc_friendly))
+ g_array_elt_zero (array, array->len, 1);
+ else
+ g_array_zero_terminate (array);
+
+ return farray;
+}
+
+GArray*
+g_array_remove_range (GArray *farray,
+ guint index_,
+ guint length)
+{
+ GRealArray *array = (GRealArray*) farray;
+
+ g_return_val_if_fail (array, NULL);
+ g_return_val_if_fail (index_ < array->len, NULL);
+ g_return_val_if_fail (index_ + length <= array->len, NULL);
+
+ if (index_ + length != array->len)
+ g_memmove (g_array_elt_pos (array, index_),
+ g_array_elt_pos (array, index_ + length),
+ (array->len - (index_ + length)) * array->elt_size);
+
+ array->len -= length;
+ if (G_UNLIKELY (g_mem_gc_friendly))
+ g_array_elt_zero (array, array->len, length);
+ else
+ g_array_zero_terminate (array);
+
+ return farray;
+}
+
+void
+g_array_sort (GArray *farray,
+ GCompareFunc compare_func)
+{
+ GRealArray *array = (GRealArray*) farray;
+
+ g_return_if_fail (array != 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_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);
+
+ if (G_UNLIKELY (g_mem_gc_friendly))
+ memset (array->data + array->alloc, 0, want_alloc - array->alloc);
+
+ 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);
+
+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_slice_new (GRealPtrArray);
+
+ 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_slice_free1 (sizeof (GRealPtrArray), array);
+
+ return segment;
+}
+
+static void
+g_ptr_array_maybe_expand (GRealPtrArray *array,
+ gint len)
+{
+ if ((array->len + len) > array->alloc)
+ {
+ guint old_alloc = array->alloc;
+ 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);
+ if (G_UNLIKELY (g_mem_gc_friendly))
+ for ( ; old_alloc < array->alloc; old_alloc++)
+ array->pdata [old_alloc] = NULL;
+ }
+}
+
+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;
+ }
+ if (G_UNLIKELY (g_mem_gc_friendly) && length < array->len)
+ {
+ int i;
+ for (i = length; i < array->len; i++)
+ array->pdata[i] = NULL;
+ }
+
+ 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;
+
+ if (G_UNLIKELY (g_mem_gc_friendly))
+ array->pdata[array->len] = NULL;
+
+ 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;
+
+ if (G_UNLIKELY (g_mem_gc_friendly))
+ array->pdata[array->len] = NULL;
+
+ return result;
+}
+
+void
+g_ptr_array_remove_range (GPtrArray* farray,
+ guint index_,
+ guint length)
+{
+ GRealPtrArray* array = (GRealPtrArray*) farray;
+
+ g_return_if_fail (array);
+ g_return_if_fail (index_ < array->len);
+ g_return_if_fail (index_ + length <= array->len);
+
+ if (index_ + length != array->len)
+ g_memmove (&array->pdata[index_],
+ &array->pdata[index_ + length],
+ (array->len - (index_ + length)) * sizeof (gpointer));
+
+ array->len -= length;
+ if (G_UNLIKELY (g_mem_gc_friendly))
+ {
+ guint i;
+ for (i = 0; i < length; i++)
+ array->pdata[array->len + i] = NULL;
+ }
+}
+
+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);
+
+ 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_qsort_with_data (array->pdata,
+ array->len,
+ sizeof (gpointer),
+ compare_func,
+ user_data);
+}
+
+/**
+ * g_ptr_array_foreach:
+ * @array: a #GPtrArray
+ * @func: the function to call for each array element
+ * @user_data: user data to pass to the function
+ *
+ * Calls a function for each element of a #GPtrArray.
+ *
+ * Since: 2.4
+ **/
+void
+g_ptr_array_foreach (GPtrArray *array,
+ GFunc func,
+ gpointer user_data)
+{
+ guint i;
+
+ g_return_if_fail (array);
+
+ for (i = 0; i < array->len; i++)
+ (*func) (array->pdata[i], 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;
+}
+
+GByteArray*
+g_byte_array_remove_range (GByteArray *array,
+ guint index_,
+ guint length)
+{
+ g_return_val_if_fail (array, NULL);
+ g_return_val_if_fail (index_ < array->len, NULL);
+ g_return_val_if_fail (index_ + length <= array->len, NULL);
+
+ return (GByteArray *)g_array_remove_range ((GArray*) array, index_, length);
+}
+
+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);
+}
+
+#define __G_ARRAY_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/garray.h b/trunk/glib/garray.h
new file mode 100644
index 000000000..e288a7296
--- /dev/null
+++ b/trunk/glib/garray.h
@@ -0,0 +1,167 @@
+/* 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 <glib/gtypes.h>
+
+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_);
+GArray* g_array_remove_range (GArray *array,
+ guint index_,
+ guint length);
+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 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_remove_range (GPtrArray *array,
+ guint index_,
+ guint length);
+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);
+void g_ptr_array_foreach (GPtrArray *array,
+ GFunc 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_);
+GByteArray* g_byte_array_remove_range (GByteArray *array,
+ guint index_,
+ guint length);
+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/trunk/glib/gasyncqueue.c b/trunk/glib/gasyncqueue.c
new file mode 100644
index 000000000..646efd261
--- /dev/null
+++ b/trunk/glib/gasyncqueue.c
@@ -0,0 +1,642 @@
+/* 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 "config.h"
+
+#include "glib.h"
+#include "galias.h"
+
+
+struct _GAsyncQueue
+{
+ GMutex *mutex;
+ GCond *cond;
+ GQueue *queue;
+ guint waiting_threads;
+ gint32 ref_count;
+};
+
+typedef struct {
+ GCompareDataFunc func;
+ gpointer user_data;
+} SortData;
+
+/**
+ * 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 (void)
+{
+ GAsyncQueue* retval = g_new (GAsyncQueue, 1);
+ retval->mutex = g_mutex_new ();
+ retval->cond = NULL;
+ 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. You
+ * do not need to hold the lock to call this function.
+ *
+ * Returns: the @queue that was passed in (since 2.6)
+ **/
+GAsyncQueue *
+g_async_queue_ref (GAsyncQueue *queue)
+{
+ g_return_val_if_fail (queue, NULL);
+ g_return_val_if_fail (g_atomic_int_get (&queue->ref_count) > 0, NULL);
+
+ g_atomic_int_inc (&queue->ref_count);
+
+ return queue;
+}
+
+/**
+ * g_async_queue_ref_unlocked:
+ * @queue: a #GAsyncQueue.
+ *
+ * Increases the reference count of the asynchronous @queue by 1.
+ *
+ * @Deprecated: Since 2.8, reference counting is done atomically
+ * so g_async_queue_ref() can be used regardless of the @queue's
+ * lock.
+ **/
+void
+g_async_queue_ref_unlocked (GAsyncQueue *queue)
+{
+ g_return_if_fail (queue);
+ g_return_if_fail (g_atomic_int_get (&queue->ref_count) > 0);
+
+ g_atomic_int_inc (&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.
+ *
+ * @Deprecated: Since 2.8, reference counting is done atomically
+ * so g_async_queue_unref() can be used regardless of the @queue's
+ * lock.
+ **/
+void
+g_async_queue_unref_and_unlock (GAsyncQueue *queue)
+{
+ g_return_if_fail (queue);
+ g_return_if_fail (g_atomic_int_get (&queue->ref_count) > 0);
+
+ g_mutex_unlock (queue->mutex);
+ g_async_queue_unref (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. You do not need to
+ * hold the lock to call this function.
+ **/
+void
+g_async_queue_unref (GAsyncQueue *queue)
+{
+ g_return_if_fail (queue);
+ g_return_if_fail (g_atomic_int_get (&queue->ref_count) > 0);
+
+ if (g_atomic_int_dec_and_test (&queue->ref_count))
+ {
+ g_return_if_fail (queue->waiting_threads == 0);
+ g_mutex_free (queue->mutex);
+ if (queue->cond)
+ g_cond_free (queue->cond);
+ g_queue_free (queue->queue);
+ g_free (queue);
+ }
+}
+
+/**
+ * g_async_queue_lock:
+ * @queue: a #GAsyncQueue.
+ *
+ * Acquires the @queue's lock. After that you can only call the
+ * <function>g_async_queue_*_unlocked()</function> 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 (g_atomic_int_get (&queue->ref_count) > 0);
+
+ g_mutex_lock (queue->mutex);
+}
+
+/**
+ * g_async_queue_unlock:
+ * @queue: a #GAsyncQueue.
+ *
+ * Releases the queue's lock.
+ **/
+void
+g_async_queue_unlock (GAsyncQueue *queue)
+{
+ g_return_if_fail (queue);
+ g_return_if_fail (g_atomic_int_get (&queue->ref_count) > 0);
+
+ g_mutex_unlock (queue->mutex);
+}
+
+/**
+ * g_async_queue_push:
+ * @queue: a #GAsyncQueue.
+ * @data: @data to push into the @queue.
+ *
+ * Pushes 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 (g_atomic_int_get (&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.
+ *
+ * Pushes 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 (g_atomic_int_get (&queue->ref_count) > 0);
+ g_return_if_fail (data);
+
+ g_queue_push_head (queue->queue, data);
+ if (queue->waiting_threads > 0)
+ g_cond_signal (queue->cond);
+}
+
+/**
+ * g_async_queue_push_sorted:
+ * @queue: a #GAsyncQueue
+ * @data: the @data to push into the @queue
+ * @func: the #GCompareDataFunc is used to sort @queue. This function
+ * is passed two elements of the @queue. The function should return
+ * 0 if they are equal, a negative value if the first element
+ * should be higher in the @queue or a positive value if the first
+ * element should be lower in the @queue than the second element.
+ * @user_data: user data passed to @func.
+ *
+ * Inserts @data into @queue using @func to determine the new
+ * position.
+ *
+ * This function requires that the @queue is sorted before pushing on
+ * new elements.
+ *
+ * This function will lock @queue before it sorts the queue and unlock
+ * it when it is finished.
+ *
+ * For an example of @func see g_async_queue_sort().
+ *
+ * Since: 2.10
+ **/
+void
+g_async_queue_push_sorted (GAsyncQueue *queue,
+ gpointer data,
+ GCompareDataFunc func,
+ gpointer user_data)
+{
+ g_return_if_fail (queue != NULL);
+
+ g_mutex_lock (queue->mutex);
+ g_async_queue_push_sorted_unlocked (queue, data, func, user_data);
+ g_mutex_unlock (queue->mutex);
+}
+
+static gint
+g_async_queue_invert_compare (gpointer v1,
+ gpointer v2,
+ SortData *sd)
+{
+ return -sd->func (v1, v2, sd->user_data);
+}
+
+/**
+ * g_async_queue_push_sorted_unlocked:
+ * @queue: a #GAsyncQueue
+ * @data: the @data to push into the @queue
+ * @func: the #GCompareDataFunc is used to sort @queue. This function
+ * is passed two elements of the @queue. The function should return
+ * 0 if they are equal, a negative value if the first element
+ * should be higher in the @queue or a positive value if the first
+ * element should be lower in the @queue than the second element.
+ * @user_data: user data passed to @func.
+ *
+ * Inserts @data into @queue using @func to determine the new
+ * position.
+ *
+ * This function requires that the @queue is sorted before pushing on
+ * new elements.
+ *
+ * This function is called while holding the @queue's lock.
+ *
+ * For an example of @func see g_async_queue_sort().
+ *
+ * Since: 2.10
+ **/
+void
+g_async_queue_push_sorted_unlocked (GAsyncQueue *queue,
+ gpointer data,
+ GCompareDataFunc func,
+ gpointer user_data)
+{
+ SortData sd;
+
+ g_return_if_fail (queue != NULL);
+
+ sd.func = func;
+ sd.user_data = user_data;
+
+ g_queue_insert_sorted (queue->queue,
+ data,
+ (GCompareDataFunc)g_async_queue_invert_compare,
+ &sd);
+ if (queue->waiting_threads > 0)
+ 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_link (queue->queue))
+ {
+ if (try)
+ return NULL;
+
+ if (!queue->cond)
+ queue->cond = g_cond_new ();
+
+ if (!end_time)
+ {
+ queue->waiting_threads++;
+ while (!g_queue_peek_tail_link (queue->queue))
+ g_cond_wait (queue->cond, queue->mutex);
+ queue->waiting_threads--;
+ }
+ else
+ {
+ queue->waiting_threads++;
+ while (!g_queue_peek_tail_link (queue->queue))
+ if (!g_cond_timed_wait (queue->cond, queue->mutex, end_time))
+ break;
+ queue->waiting_threads--;
+ if (!g_queue_peek_tail_link (queue->queue))
+ return NULL;
+ }
+ }
+
+ retval = g_queue_pop_tail (queue->queue);
+
+ g_assert (retval);
+
+ return retval;
+}
+
+/**
+ * g_async_queue_pop:
+ * @queue: a #GAsyncQueue.
+ *
+ * Pops 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 (g_atomic_int_get (&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.
+ *
+ * Pops 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 (g_atomic_int_get (&queue->ref_count) > 0, NULL);
+
+ return g_async_queue_pop_intern_unlocked (queue, FALSE, NULL);
+}
+
+/**
+ * g_async_queue_try_pop:
+ * @queue: a #GAsyncQueue.
+ *
+ * Tries 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 (g_atomic_int_get (&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.
+ *
+ * Tries 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 (g_atomic_int_get (&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.
+ *
+ * Pops 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 (g_atomic_int_get (&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.
+ *
+ * Pops 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 (g_atomic_int_get (&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 (g_atomic_int_get (&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 (g_atomic_int_get (&queue->ref_count) > 0, 0);
+
+ return queue->queue->length - queue->waiting_threads;
+}
+
+/**
+ * g_async_queue_sort:
+ * @queue: a #GAsyncQueue
+ * @func: the #GCompareDataFunc is used to sort @queue. This
+ * function is passed two elements of the @queue. The function
+ * should return 0 if they are equal, a negative value if the
+ * first element should be higher in the @queue or a positive
+ * value if the first element should be lower in the @queue than
+ * the second element.
+ * @user_data: user data passed to @func
+ *
+ * Sorts @queue using @func.
+ *
+ * This function will lock @queue before it sorts the queue and unlock
+ * it when it is finished.
+ *
+ * If you were sorting a list of priority numbers to make sure the
+ * lowest priority would be at the top of the queue, you could use:
+ * <informalexample><programlisting>
+ * gint32 id1;
+ * gint32 id2;
+ *
+ * id1 = GPOINTER_TO_INT (element1);
+ * id2 = GPOINTER_TO_INT (element2);
+ *
+ * return (id1 > id2 ? +1 : id1 == id2 ? 0 : -1);
+ * </programlisting></informalexample>
+ *
+ * Since: 2.10
+ **/
+void
+g_async_queue_sort (GAsyncQueue *queue,
+ GCompareDataFunc func,
+ gpointer user_data)
+{
+ g_return_if_fail (queue != NULL);
+ g_return_if_fail (func != NULL);
+
+ g_mutex_lock (queue->mutex);
+ g_async_queue_sort_unlocked (queue, func, user_data);
+ g_mutex_unlock (queue->mutex);
+}
+
+/**
+ * g_async_queue_sort_unlocked:
+ * @queue: a #GAsyncQueue
+ * @func: the #GCompareDataFunc is used to sort @queue. This
+ * function is passed two elements of the @queue. The function
+ * should return 0 if they are equal, a negative value if the
+ * first element should be higher in the @queue or a positive
+ * value if the first element should be lower in the @queue than
+ * the second element.
+ * @user_data: user data passed to @func
+ *
+ * Sorts @queue using @func.
+ *
+ * This function is called while holding the @queue's lock.
+ *
+ * Since: 2.10
+ **/
+void
+g_async_queue_sort_unlocked (GAsyncQueue *queue,
+ GCompareDataFunc func,
+ gpointer user_data)
+{
+ SortData sd;
+
+ g_return_if_fail (queue != NULL);
+ g_return_if_fail (func != NULL);
+
+ sd.func = func;
+ sd.user_data = user_data;
+
+ g_queue_sort (queue->queue,
+ (GCompareDataFunc)g_async_queue_invert_compare,
+ &sd);
+}
+
+/*
+ * Private API
+ */
+
+GMutex*
+_g_async_queue_get_mutex (GAsyncQueue* queue)
+{
+ g_return_val_if_fail (queue, NULL);
+ g_return_val_if_fail (g_atomic_int_get (&queue->ref_count) > 0, NULL);
+
+ return queue->mutex;
+}
+
+#define __G_ASYNCQUEUE_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gasyncqueue.h b/trunk/glib/gasyncqueue.h
new file mode 100644
index 000000000..413093f3c
--- /dev/null
+++ b/trunk/glib/gasyncqueue.h
@@ -0,0 +1,115 @@
+/* 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 <glib/gthread.h>
+
+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 a 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. */
+GAsyncQueue* g_async_queue_ref (GAsyncQueue *queue);
+void g_async_queue_unref (GAsyncQueue *queue);
+
+#ifndef G_DISABLE_DEPRECATED
+/* You don't have to hold the lock for calling *_ref and *_unref anymore. */
+void g_async_queue_ref_unlocked (GAsyncQueue *queue);
+void g_async_queue_unref_and_unlock (GAsyncQueue *queue);
+#endif /* !G_DISABLE_DEPRECATED */
+
+/* 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);
+
+void g_async_queue_push_sorted (GAsyncQueue *queue,
+ gpointer data,
+ GCompareDataFunc func,
+ gpointer user_data);
+void g_async_queue_push_sorted_unlocked (GAsyncQueue *queue,
+ gpointer data,
+ GCompareDataFunc func,
+ gpointer user_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);
+void g_async_queue_sort (GAsyncQueue *queue,
+ GCompareDataFunc func,
+ gpointer user_data);
+void g_async_queue_sort_unlocked (GAsyncQueue *queue,
+ GCompareDataFunc func,
+ gpointer user_data);
+
+/* Private API */
+GMutex* _g_async_queue_get_mutex (GAsyncQueue *queue);
+
+G_END_DECLS
+
+#endif /* __G_ASYNCQUEUE_H__ */
+
diff --git a/trunk/glib/gatomic.c b/trunk/glib/gatomic.c
new file mode 100644
index 000000000..dec4138ae
--- /dev/null
+++ b/trunk/glib/gatomic.c
@@ -0,0 +1,767 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * g_atomic_*: atomic operations.
+ * Copyright (C) 2003 Sebastian Wilhelmi
+ *
+ * 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 "config.h"
+
+#include "glib.h"
+#include "gthreadprivate.h"
+#include "galias.h"
+
+#if defined (__GNUC__)
+# if defined (G_ATOMIC_I486)
+/* Adapted from CVS version 1.10 of glibc's sysdeps/i386/i486/bits/atomic.h
+ */
+gint
+g_atomic_int_exchange_and_add (volatile gint *atomic,
+ gint val)
+{
+ gint result;
+
+ __asm__ __volatile__ ("lock; xaddl %0,%1"
+ : "=r" (result), "=m" (*atomic)
+ : "0" (val), "m" (*atomic));
+ return result;
+}
+
+void
+g_atomic_int_add (volatile gint *atomic,
+ gint val)
+{
+ __asm__ __volatile__ ("lock; addl %1,%0"
+ : "=m" (*atomic)
+ : "ir" (val), "m" (*atomic));
+}
+
+gboolean
+g_atomic_int_compare_and_exchange (volatile gint *atomic,
+ gint oldval,
+ gint newval)
+{
+ gint result;
+
+ __asm__ __volatile__ ("lock; cmpxchgl %2, %1"
+ : "=a" (result), "=m" (*atomic)
+ : "r" (newval), "m" (*atomic), "0" (oldval));
+
+ return result == oldval;
+}
+
+/* The same code as above, as on i386 gpointer is 32 bit as well.
+ * Duplicating the code here seems more natural than casting the
+ * arguments and calling the former function */
+
+gboolean
+g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
+ gpointer oldval,
+ gpointer newval)
+{
+ gpointer result;
+
+ __asm__ __volatile__ ("lock; cmpxchgl %2, %1"
+ : "=a" (result), "=m" (*atomic)
+ : "r" (newval), "m" (*atomic), "0" (oldval));
+
+ return result == oldval;
+}
+
+# elif defined (G_ATOMIC_SPARCV9)
+/* Adapted from CVS version 1.3 of glibc's sysdeps/sparc/sparc64/bits/atomic.h
+ */
+# define ATOMIC_INT_CMP_XCHG(atomic, oldval, newval) \
+ ({ \
+ gint __result; \
+ __asm__ __volatile__ ("cas [%4], %2, %0" \
+ : "=r" (__result), "=m" (*(atomic)) \
+ : "r" (oldval), "m" (*(atomic)), "r" (atomic),\
+ "0" (newval)); \
+ __result == oldval; \
+ })
+
+# if GLIB_SIZEOF_VOID_P == 4 /* 32-bit system */
+gboolean
+g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
+ gpointer oldval,
+ gpointer newval)
+{
+ gpointer result;
+ __asm__ __volatile__ ("cas [%4], %2, %0"
+ : "=r" (result), "=m" (*atomic)
+ : "r" (oldval), "m" (*atomic), "r" (atomic),
+ "0" (newval));
+ return result == oldval;
+}
+# elif GLIB_SIZEOF_VOID_P == 8 /* 64-bit system */
+gboolean
+g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
+ gpointer oldval,
+ gpointer newval)
+{
+ gpointer result;
+ gpointer *a = atomic;
+ __asm__ __volatile__ ("casx [%4], %2, %0"
+ : "=r" (result), "=m" (*a)
+ : "r" (oldval), "m" (*a), "r" (a),
+ "0" (newval));
+ return result == oldval;
+}
+# else /* What's that */
+# error "Your system has an unsupported pointer size"
+# endif /* GLIB_SIZEOF_VOID_P */
+# define G_ATOMIC_MEMORY_BARRIER \
+ __asm__ __volatile__ ("membar #LoadLoad | #LoadStore" \
+ " | #StoreLoad | #StoreStore" : : : "memory")
+
+# elif defined (G_ATOMIC_ALPHA)
+/* Adapted from CVS version 1.3 of glibc's sysdeps/alpha/bits/atomic.h
+ */
+# define ATOMIC_INT_CMP_XCHG(atomic, oldval, newval) \
+ ({ \
+ gint __result; \
+ gint __prev; \
+ __asm__ __volatile__ ( \
+ " mb\n" \
+ "1: ldl_l %0,%2\n" \
+ " cmpeq %0,%3,%1\n" \
+ " beq %1,2f\n" \
+ " mov %4,%1\n" \
+ " stl_c %1,%2\n" \
+ " beq %1,1b\n" \
+ " mb\n" \
+ "2:" \
+ : "=&r" (__prev), \
+ "=&r" (__result) \
+ : "m" (*(atomic)), \
+ "Ir" (oldval), \
+ "Ir" (newval) \
+ : "memory"); \
+ __result != 0; \
+ })
+# if GLIB_SIZEOF_VOID_P == 4 /* 32-bit system */
+gboolean
+g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
+ gpointer oldval,
+ gpointer newval)
+{
+ gint result;
+ gpointer prev;
+ __asm__ __volatile__ (
+ " mb\n"
+ "1: ldl_l %0,%2\n"
+ " cmpeq %0,%3,%1\n"
+ " beq %1,2f\n"
+ " mov %4,%1\n"
+ " stl_c %1,%2\n"
+ " beq %1,1b\n"
+ " mb\n"
+ "2:"
+ : "=&r" (prev),
+ "=&r" (result)
+ : "m" (*atomic),
+ "Ir" (oldval),
+ "Ir" (newval)
+ : "memory");
+ return result != 0;
+}
+# elif GLIB_SIZEOF_VOID_P == 8 /* 64-bit system */
+gboolean
+g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
+ gpointer oldval,
+ gpointer newval)
+{
+ gint result;
+ gpointer prev;
+ __asm__ __volatile__ (
+ " mb\n"
+ "1: ldq_l %0,%2\n"
+ " cmpeq %0,%3,%1\n"
+ " beq %1,2f\n"
+ " mov %4,%1\n"
+ " stq_c %1,%2\n"
+ " beq %1,1b\n"
+ " mb\n"
+ "2:"
+ : "=&r" (prev),
+ "=&r" (result)
+ : "m" (*atomic),
+ "Ir" (oldval),
+ "Ir" (newval)
+ : "memory");
+ return result != 0;
+}
+# else /* What's that */
+# error "Your system has an unsupported pointer size"
+# endif /* GLIB_SIZEOF_VOID_P */
+# define G_ATOMIC_MEMORY_BARRIER __asm__ ("mb" : : : "memory")
+# elif defined (G_ATOMIC_X86_64)
+/* Adapted from CVS version 1.9 of glibc's sysdeps/x86_64/bits/atomic.h
+ */
+gint
+g_atomic_int_exchange_and_add (volatile gint *atomic,
+ gint val)
+{
+ gint result;
+
+ __asm__ __volatile__ ("lock; xaddl %0,%1"
+ : "=r" (result), "=m" (*atomic)
+ : "0" (val), "m" (*atomic));
+ return result;
+}
+
+void
+g_atomic_int_add (volatile gint *atomic,
+ gint val)
+{
+ __asm__ __volatile__ ("lock; addl %1,%0"
+ : "=m" (*atomic)
+ : "ir" (val), "m" (*atomic));
+}
+
+gboolean
+g_atomic_int_compare_and_exchange (volatile gint *atomic,
+ gint oldval,
+ gint newval)
+{
+ gint result;
+
+ __asm__ __volatile__ ("lock; cmpxchgl %2, %1"
+ : "=a" (result), "=m" (*atomic)
+ : "r" (newval), "m" (*atomic), "0" (oldval));
+
+ return result == oldval;
+}
+
+gboolean
+g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
+ gpointer oldval,
+ gpointer newval)
+{
+ gpointer result;
+
+ __asm__ __volatile__ ("lock; cmpxchgq %q2, %1"
+ : "=a" (result), "=m" (*atomic)
+ : "r" (newval), "m" (*atomic), "0" (oldval));
+
+ return result == oldval;
+}
+
+# elif defined (G_ATOMIC_POWERPC)
+/* Adapted from CVS version 1.16 of glibc's sysdeps/powerpc/bits/atomic.h
+ * and CVS version 1.4 of glibc's sysdeps/powerpc/powerpc32/bits/atomic.h
+ * and CVS version 1.7 of glibc's sysdeps/powerpc/powerpc64/bits/atomic.h
+ */
+# ifdef __OPTIMIZE__
+/* Non-optimizing compile bails on the following two asm statements
+ * for reasons unknown to the author */
+gint
+g_atomic_int_exchange_and_add (volatile gint *atomic,
+ gint val)
+{
+ gint result, temp;
+ __asm__ __volatile__ (".Lieaa%=: lwarx %0,0,%3\n"
+ " add %1,%0,%4\n"
+ " stwcx. %1,0,%3\n"
+ " bne- .Lieaa%="
+ : "=&b" (result), "=&r" (temp), "=m" (*atomic)
+ : "b" (atomic), "r" (val), "m" (*atomic)
+ : "cr0", "memory");
+ return result;
+}
+
+/* The same as above, to save a function call repeated here */
+void
+g_atomic_int_add (volatile gint *atomic,
+ gint val)
+{
+ gint result, temp;
+ __asm__ __volatile__ (".Lia%=: lwarx %0,0,%3\n"
+ " add %1,%0,%4\n"
+ " stwcx. %1,0,%3\n"
+ " bne- .Lia%="
+ : "=&b" (result), "=&r" (temp), "=m" (*atomic)
+ : "b" (atomic), "r" (val), "m" (*atomic)
+ : "cr0", "memory");
+}
+# else /* !__OPTIMIZE__ */
+gint
+g_atomic_int_exchange_and_add (volatile gint *atomic,
+ gint val)
+{
+ gint result;
+ do
+ result = *atomic;
+ while (!g_atomic_int_compare_and_exchange (atomic, result, result + val));
+
+ return result;
+}
+
+void
+g_atomic_int_add (volatile gint *atomic,
+ gint val)
+{
+ gint result;
+ do
+ result = *atomic;
+ while (!g_atomic_int_compare_and_exchange (atomic, result, result + val));
+}
+# endif /* !__OPTIMIZE__ */
+
+# if GLIB_SIZEOF_VOID_P == 4 /* 32-bit system */
+gboolean
+g_atomic_int_compare_and_exchange (volatile gint *atomic,
+ gint oldval,
+ gint newval)
+{
+ gint result;
+ __asm__ __volatile__ ("sync\n"
+ ".L1icae%=: lwarx %0,0,%1\n"
+ " subf. %0,%2,%0\n"
+ " bne .L2icae%=\n"
+ " stwcx. %3,0,%1\n"
+ " bne- .L1icae%=\n"
+ ".L2icae%=: isync"
+ : "=&r" (result)
+ : "b" (atomic), "r" (oldval), "r" (newval)
+ : "cr0", "memory");
+ return result == 0;
+}
+
+gboolean
+g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
+ gpointer oldval,
+ gpointer newval)
+{
+ gpointer result;
+ __asm__ __volatile__ ("sync\n"
+ ".L1pcae%=: lwarx %0,0,%1\n"
+ " subf. %0,%2,%0\n"
+ " bne .L2pcae%=\n"
+ " stwcx. %3,0,%1\n"
+ " bne- .L1pcae%=\n"
+ ".L2pcae%=: isync"
+ : "=&r" (result)
+ : "b" (atomic), "r" (oldval), "r" (newval)
+ : "cr0", "memory");
+ return result == 0;
+}
+# elif GLIB_SIZEOF_VOID_P == 8 /* 64-bit system */
+gboolean
+g_atomic_int_compare_and_exchange (volatile gint *atomic,
+ gint oldval,
+ gint newval)
+{
+ gpointer result;
+ __asm__ __volatile__ ("sync\n"
+ ".L1icae%=: lwarx %0,0,%1\n"
+ " extsw %0,%0\n"
+ " subf. %0,%2,%0\n"
+ " bne .L2icae%=\n"
+ " stwcx. %3,0,%1\n"
+ " bne- .L1icae%=\n"
+ ".L2icae%=: isync"
+ : "=&r" (result)
+ : "b" (atomic), "r" (oldval), "r" (newval)
+ : "cr0", "memory");
+ return result == 0;
+}
+
+gboolean
+g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
+ gpointer oldval,
+ gpointer newval)
+{
+ gpointer result;
+ __asm__ __volatile__ ("sync\n"
+ ".L1pcae%=: ldarx %0,0,%1\n"
+ " subf. %0,%2,%0\n"
+ " bne .L2pcae%=\n"
+ " stdcx. %3,0,%1\n"
+ " bne- .L1pcae%=\n"
+ ".L2pcae%=: isync"
+ : "=&r" (result)
+ : "b" (atomic), "r" (oldval), "r" (newval)
+ : "cr0", "memory");
+ return result == 0;
+}
+# else /* What's that */
+# error "Your system has an unsupported pointer size"
+# endif /* GLIB_SIZEOF_VOID_P */
+
+# define G_ATOMIC_MEMORY_BARRIER __asm__ ("sync" : : : "memory")
+
+# elif defined (G_ATOMIC_IA64)
+/* Adapted from CVS version 1.8 of glibc's sysdeps/ia64/bits/atomic.h
+ */
+gint
+g_atomic_int_exchange_and_add (volatile gint *atomic,
+ gint val)
+{
+ return __sync_fetch_and_add (atomic, val);
+}
+
+void
+g_atomic_int_add (volatile gint *atomic,
+ gint val)
+{
+ __sync_fetch_and_add (atomic, val);
+}
+
+gboolean
+g_atomic_int_compare_and_exchange (volatile gint *atomic,
+ gint oldval,
+ gint newval)
+{
+ return __sync_bool_compare_and_swap (atomic, oldval, newval);
+}
+
+gboolean
+g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
+ gpointer oldval,
+ gpointer newval)
+{
+ return __sync_bool_compare_and_swap ((long *)atomic,
+ (long)oldval, (long)newval);
+}
+
+# define G_ATOMIC_MEMORY_BARRIER __sync_synchronize ()
+# elif defined (G_ATOMIC_S390)
+/* Adapted from glibc's sysdeps/s390/bits/atomic.h
+ */
+# define ATOMIC_INT_CMP_XCHG(atomic, oldval, newval) \
+ ({ \
+ gint __result = oldval; \
+ __asm__ __volatile__ ("cs %0, %2, %1" \
+ : "+d" (__result), "=Q" (*(atomic)) \
+ : "d" (newval), "m" (*(atomic)) : "cc" ); \
+ __result == oldval; \
+ })
+
+# if GLIB_SIZEOF_VOID_P == 4 /* 32-bit system */
+gboolean
+g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
+ gpointer oldval,
+ gpointer newval)
+{
+ gpointer result = oldval;
+ __asm__ __volatile__ ("cs %0, %2, %1"
+ : "+d" (result), "=Q" (*(atomic))
+ : "d" (newval), "m" (*(atomic)) : "cc" );
+ return result == oldval;
+}
+# elif GLIB_SIZEOF_VOID_P == 8 /* 64-bit system */
+gboolean
+g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
+ gpointer oldval,
+ gpointer newval)
+{
+ gpointer result = oldval;
+ gpointer *a = atomic;
+ __asm__ __volatile__ ("csg %0, %2, %1"
+ : "+d" (result), "=Q" (*a)
+ : "d" ((long)(newval)), "m" (*a) : "cc" );
+ return result == oldval;
+}
+# else /* What's that */
+# error "Your system has an unsupported pointer size"
+# endif /* GLIB_SIZEOF_VOID_P */
+# else /* !G_ATOMIC_IA64 */
+# define DEFINE_WITH_MUTEXES
+# endif /* G_ATOMIC_IA64 */
+#else /* !__GNUC__ */
+# ifdef G_PLATFORM_WIN32
+# define DEFINE_WITH_WIN32_INTERLOCKED
+# else
+# define DEFINE_WITH_MUTEXES
+# endif
+#endif /* __GNUC__ */
+
+#ifdef DEFINE_WITH_WIN32_INTERLOCKED
+# include <windows.h>
+/* Following indicates that InterlockedCompareExchangePointer is
+ * declared in winbase.h (included by windows.h) and needs to be
+ * commented out if not true. It is defined iff WINVER > 0x0400,
+ * which is usually correct but can be wrong if WINVER is set before
+ * windows.h is included.
+ */
+# if WINVER > 0x0400
+# define HAVE_INTERLOCKED_COMPARE_EXCHANGE_POINTER
+# endif
+
+gint32
+g_atomic_int_exchange_and_add (volatile gint32 *atomic,
+ gint32 val)
+{
+ return InterlockedExchangeAdd (atomic, val);
+}
+
+void
+g_atomic_int_add (volatile gint32 *atomic,
+ gint32 val)
+{
+ InterlockedExchangeAdd (atomic, val);
+}
+
+gboolean
+g_atomic_int_compare_and_exchange (volatile gint32 *atomic,
+ gint32 oldval,
+ gint32 newval)
+{
+#ifndef HAVE_INTERLOCKED_COMPARE_EXCHANGE_POINTER
+ return (guint32) InterlockedCompareExchange ((PVOID*)atomic,
+ (PVOID)newval,
+ (PVOID)oldval) == oldval;
+#else
+ return InterlockedCompareExchange (atomic,
+ newval,
+ oldval) == oldval;
+#endif
+}
+
+gboolean
+g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
+ gpointer oldval,
+ gpointer newval)
+{
+# ifdef HAVE_INTERLOCKED_COMPARE_EXCHANGE_POINTER
+ return InterlockedCompareExchangePointer (atomic, newval, oldval) == oldval;
+# else
+# if GLIB_SIZEOF_VOID_P != 4 /* no 32-bit system */
+# error "InterlockedCompareExchangePointer needed"
+# else
+ return InterlockedCompareExchange (atomic, newval, oldval) == oldval;
+# endif
+# endif
+}
+#endif /* DEFINE_WITH_WIN32_INTERLOCKED */
+
+#ifdef DEFINE_WITH_MUTEXES
+/* We have to use the slow, but safe locking method */
+static GMutex *g_atomic_mutex;
+
+gint
+g_atomic_int_exchange_and_add (volatile gint *atomic,
+ gint val)
+{
+ gint result;
+
+ g_mutex_lock (g_atomic_mutex);
+ result = *atomic;
+ *atomic += val;
+ g_mutex_unlock (g_atomic_mutex);
+
+ return result;
+}
+
+
+void
+g_atomic_int_add (volatile gint *atomic,
+ gint val)
+{
+ g_mutex_lock (g_atomic_mutex);
+ *atomic += val;
+ g_mutex_unlock (g_atomic_mutex);
+}
+
+gboolean
+g_atomic_int_compare_and_exchange (volatile gint *atomic,
+ gint oldval,
+ gint newval)
+{
+ gboolean result;
+
+ g_mutex_lock (g_atomic_mutex);
+ if (*atomic == oldval)
+ {
+ result = TRUE;
+ *atomic = newval;
+ }
+ else
+ result = FALSE;
+ g_mutex_unlock (g_atomic_mutex);
+
+ return result;
+}
+
+gboolean
+g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
+ gpointer oldval,
+ gpointer newval)
+{
+ gboolean result;
+
+ g_mutex_lock (g_atomic_mutex);
+ if (*atomic == oldval)
+ {
+ result = TRUE;
+ *atomic = newval;
+ }
+ else
+ result = FALSE;
+ g_mutex_unlock (g_atomic_mutex);
+
+ return result;
+}
+
+#ifdef G_ATOMIC_OP_MEMORY_BARRIER_NEEDED
+gint
+g_atomic_int_get (volatile gint *atomic)
+{
+ gint result;
+
+ g_mutex_lock (g_atomic_mutex);
+ result = *atomic;
+ g_mutex_unlock (g_atomic_mutex);
+
+ return result;
+}
+
+void
+g_atomic_int_set (volatile gint *atomic,
+ gint newval)
+{
+ g_mutex_lock (g_atomic_mutex);
+ *atomic = newval;
+ g_mutex_unlock (g_atomic_mutex);
+}
+
+gpointer
+g_atomic_pointer_get (volatile gpointer *atomic)
+{
+ gpointer result;
+
+ g_mutex_lock (g_atomic_mutex);
+ result = *atomic;
+ g_mutex_unlock (g_atomic_mutex);
+
+ return result;
+}
+
+void
+g_atomic_pointer_set (volatile gpointer *atomic,
+ gpointer newval)
+{
+ g_mutex_lock (g_atomic_mutex);
+ *atomic = newval;
+ g_mutex_unlock (g_atomic_mutex);
+}
+#endif /* G_ATOMIC_OP_MEMORY_BARRIER_NEEDED */
+#elif defined (G_ATOMIC_OP_MEMORY_BARRIER_NEEDED)
+gint
+g_atomic_int_get (volatile gint *atomic)
+{
+ G_ATOMIC_MEMORY_BARRIER;
+ return *atomic;
+}
+
+void
+g_atomic_int_set (volatile gint *atomic,
+ gint newval)
+{
+ *atomic = newval;
+ G_ATOMIC_MEMORY_BARRIER;
+}
+
+gpointer
+g_atomic_pointer_get (volatile gpointer *atomic)
+{
+ G_ATOMIC_MEMORY_BARRIER;
+ return *atomic;
+}
+
+void
+g_atomic_pointer_set (volatile gpointer *atomic,
+ gpointer newval)
+{
+ *atomic = newval;
+ G_ATOMIC_MEMORY_BARRIER;
+}
+#endif /* DEFINE_WITH_MUTEXES || G_ATOMIC_OP_MEMORY_BARRIER_NEEDED */
+
+#ifdef ATOMIC_INT_CMP_XCHG
+gboolean
+g_atomic_int_compare_and_exchange (volatile gint *atomic,
+ gint oldval,
+ gint newval)
+{
+ return ATOMIC_INT_CMP_XCHG (atomic, oldval, newval);
+}
+
+gint
+g_atomic_int_exchange_and_add (volatile gint *atomic,
+ gint val)
+{
+ gint result;
+ do
+ result = *atomic;
+ while (!ATOMIC_INT_CMP_XCHG (atomic, result, result + val));
+
+ return result;
+}
+
+void
+g_atomic_int_add (volatile gint *atomic,
+ gint val)
+{
+ gint result;
+ do
+ result = *atomic;
+ while (!ATOMIC_INT_CMP_XCHG (atomic, result, result + val));
+}
+#endif /* ATOMIC_INT_CMP_XCHG */
+
+void
+_g_atomic_thread_init (void)
+{
+#ifdef DEFINE_WITH_MUTEXES
+ g_atomic_mutex = g_mutex_new ();
+#endif /* DEFINE_WITH_MUTEXES */
+}
+
+#ifndef G_ATOMIC_OP_MEMORY_BARRIER_NEEDED
+gint
+(g_atomic_int_get) (volatile gint *atomic)
+{
+ return g_atomic_int_get (atomic);
+}
+
+void
+(g_atomic_int_set) (volatile gint *atomic,
+ gint newval)
+{
+ g_atomic_int_set (atomic, newval);
+}
+
+gpointer
+(g_atomic_pointer_get) (volatile gpointer *atomic)
+{
+ return g_atomic_pointer_get (atomic);
+}
+
+void
+(g_atomic_pointer_set) (volatile gpointer *atomic,
+ gpointer newval)
+{
+ g_atomic_pointer_set (atomic, newval);
+}
+#endif /* G_ATOMIC_OP_MEMORY_BARRIER_NEEDED */
+
+#define __G_ATOMIC_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gatomic.h b/trunk/glib/gatomic.h
new file mode 100644
index 000000000..fefe2affc
--- /dev/null
+++ b/trunk/glib/gatomic.h
@@ -0,0 +1,68 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * g_atomic_*: atomic operations.
+ * Copyright (C) 2003 Sebastian Wilhelmi
+ *
+ * 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_ATOMIC_H__
+#define __G_ATOMIC_H__
+
+#include <glib/gtypes.h>
+
+G_BEGIN_DECLS
+
+gint g_atomic_int_exchange_and_add (volatile gint *atomic,
+ gint val);
+void g_atomic_int_add (volatile gint *atomic,
+ gint val);
+gboolean g_atomic_int_compare_and_exchange (volatile gint *atomic,
+ gint oldval,
+ gint newval);
+gboolean g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
+ gpointer oldval,
+ gpointer newval);
+
+gint g_atomic_int_get (volatile gint *atomic);
+void g_atomic_int_set (volatile gint *atomic,
+ gint newval);
+gpointer g_atomic_pointer_get (volatile gpointer *atomic);
+void g_atomic_pointer_set (volatile gpointer *atomic,
+ gpointer newval);
+
+#ifndef G_ATOMIC_OP_MEMORY_BARRIER_NEEDED
+# define g_atomic_int_get(atomic) (*(atomic))
+# define g_atomic_int_set(atomic, newval) ((void) (*(atomic) = (newval)))
+# define g_atomic_pointer_get(atomic) (*(atomic))
+# define g_atomic_pointer_set(atomic, newval) ((void) (*(atomic) = (newval)))
+#endif /* G_ATOMIC_OP_MEMORY_BARRIER_NEEDED */
+
+#define g_atomic_int_inc(atomic) (g_atomic_int_add ((atomic), 1))
+#define g_atomic_int_dec_and_test(atomic) \
+ (g_atomic_int_exchange_and_add ((atomic), -1) == 1)
+
+G_END_DECLS
+
+#endif /* __G_ATOMIC_H__ */
diff --git a/trunk/glib/gbacktrace.c b/trunk/glib/gbacktrace.c
new file mode 100644
index 000000000..9ff26eea0
--- /dev/null
+++ b/trunk/glib/gbacktrace.c
@@ -0,0 +1,308 @@
+/* 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
+ */
+
+#include "config.h"
+
+#include <signal.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "glib.h"
+#include "gprintfint.h"
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TIMES_H
+#include <sys/times.h>
+#endif
+#include <sys/types.h>
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+
+#include <time.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif /* HAVE_SYS_SELECT_H */
+
+#include <string.h> /* for bzero on BSD systems */
+
+#ifdef G_OS_WIN32
+# define STRICT /* Strict typing, please */
+# define _WIN32_WINDOWS 0x0401 /* to get IsDebuggerPresent */
+# include <windows.h>
+# 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
+
+#include "galias.h"
+
+#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 * const query1 = "[E]xit, [H]alt";
+ static const gchar * const query2 = ", show [S]tack trace";
+ static const gchar * const query3 = " or [P]roceed";
+ gchar buf[16];
+
+ if (!prg_name)
+ prg_name = g_get_prgname ();
+
+ retry:
+
+ if (prg_name)
+ _g_fprintf (stdout,
+ "%s (pid:%u): %s%s%s: ",
+ prg_name,
+ (guint) getpid (),
+ query1,
+ query2,
+ query3);
+ else
+ _g_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)
+{
+#if defined(G_OS_UNIX) || defined(G_OS_BEOS)
+ pid_t pid;
+ gchar buf[16];
+ gchar *args[4] = { "gdb", NULL, NULL, NULL };
+ int status;
+
+ if (!prg_name)
+ return;
+
+ _g_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;
+ }
+
+ waitpid (pid, &status, 0);
+#else
+ if (IsDebuggerPresent ())
+ G_BREAKPOINT ();
+ 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;
+ _g_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 */
+
+#define __G_BACKTRACE_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gbacktrace.h b/trunk/glib/gbacktrace.h
new file mode 100644
index 000000000..836264ea5
--- /dev/null
+++ b/trunk/glib/gbacktrace.h
@@ -0,0 +1,61 @@
+/* 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 <glib/gtypes.h>
+
+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 selected machines.
+ * Actual use is strongly discouraged of course ;)
+ */
+#if (defined (__i386__) || defined (__x86_64__)) && defined (__GNUC__) && __GNUC__ >= 2
+# define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("int $03"); }G_STMT_END
+#elif (defined (_MSC_VER) || defined (__DMC__)) && defined (_M_IX86)
+# define G_BREAKPOINT() G_STMT_START{ __asm int 3h }G_STMT_END
+#elif defined (__alpha__) && !defined(__osf__) && 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 (SIGTRAP); }G_STMT_END
+#endif /* __i386__ */
+
+G_END_DECLS
+
+#endif /* __G_BACKTRACE_H__ */
diff --git a/trunk/glib/gbase64.c b/trunk/glib/gbase64.c
new file mode 100644
index 000000000..f45df1e6c
--- /dev/null
+++ b/trunk/glib/gbase64.c
@@ -0,0 +1,379 @@
+/* gbase64.c - Base64 encoding/decoding
+ *
+ * Copyright (C) 2006 Alexander Larsson <alexl@redhat.com>
+ * Copyright (C) 2000-2003 Ximian 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.
+ *
+ * This is based on code in camel, written by:
+ * Michael Zucchi <notzed@ximian.com>
+ * Jeffrey Stedfast <fejj@ximian.com>
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include "gbase64.h"
+#include "glib.h"
+#include "glibintl.h"
+
+#include "galias.h"
+
+static const char base64_alphabet[] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+/**
+ * g_base64_encode_step:
+ * @in: the binary data to encode
+ * @len: the length of @in
+ * @break_lines: whether to break long lines
+ * @out: pointer to destination buffer
+ * @state: Saved state between steps, initialize to 0
+ * @save: Saved state between steps, initialize to 0
+ *
+ * Incrementally encode a sequence of binary data into it's Base-64 stringified
+ * representation. By calling this function multiple times you can convert
+ * data in chunks to avoid having to have the full encoded data in memory.
+ *
+ * When all of the data has been converted you must call
+ * g_base64_encode_close() to flush the saved state.
+ *
+ * The output buffer must be large enough to fit all the data that will
+ * be written to it. Due to the way base64 encodes you will need
+ * at least: @len * 4 / 3 + 6 bytes. If you enable line-breaking you will
+ * need at least: @len * 4 / 3 + @len * 4 / (3 * 72) + 7 bytes.
+ *
+ * @break_lines is typically used when putting base64-encoded data in emails.
+ * It breaks the lines at 72 columns instead of putting all of the text on
+ * the same line. This avoids problems with long lines in the email system.
+ *
+ * Return value: The number of bytes of output that was written
+ *
+ * Since: 2.12
+ */
+gsize
+g_base64_encode_step (const guchar *in,
+ gsize len,
+ gboolean break_lines,
+ gchar *out,
+ gint *state,
+ gint *save)
+{
+ char *outptr;
+ const guchar *inptr;
+
+ g_return_val_if_fail (in != NULL, 0);
+ g_return_val_if_fail (out != NULL, 0);
+ g_return_val_if_fail (state != NULL, 0);
+ g_return_val_if_fail (save != NULL, 0);
+
+ if (len <= 0)
+ return 0;
+
+ inptr = in;
+ outptr = out;
+
+ if (len + ((char *) save) [0] > 2)
+ {
+ const guchar *inend = in+len-2;
+ int c1, c2, c3;
+ int already;
+
+ already = *state;
+
+ switch (((char *) save) [0])
+ {
+ case 1:
+ c1 = ((unsigned char *) save) [1];
+ goto skip1;
+ case 2:
+ c1 = ((unsigned char *) save) [1];
+ c2 = ((unsigned char *) save) [2];
+ goto skip2;
+ }
+
+ /*
+ * yes, we jump into the loop, no i'm not going to change it,
+ * it's beautiful!
+ */
+ while (inptr < inend)
+ {
+ c1 = *inptr++;
+ skip1:
+ c2 = *inptr++;
+ skip2:
+ c3 = *inptr++;
+ *outptr++ = base64_alphabet [ c1 >> 2 ];
+ *outptr++ = base64_alphabet [ c2 >> 4 |
+ ((c1&0x3) << 4) ];
+ *outptr++ = base64_alphabet [ ((c2 &0x0f) << 2) |
+ (c3 >> 6) ];
+ *outptr++ = base64_alphabet [ c3 & 0x3f ];
+ /* this is a bit ugly ... */
+ if (break_lines && (++already) >= 19)
+ {
+ *outptr++ = '\n';
+ already = 0;
+ }
+ }
+
+ ((char *)save)[0] = 0;
+ len = 2 - (inptr - inend);
+ *state = already;
+ }
+
+ if (len>0)
+ {
+ char *saveout;
+
+ /* points to the slot for the next char to save */
+ saveout = & (((char *)save)[1]) + ((char *)save)[0];
+
+ /* len can only be 0 1 or 2 */
+ switch(len)
+ {
+ case 2: *saveout++ = *inptr++;
+ case 1: *saveout++ = *inptr++;
+ }
+ ((char *)save)[0] += len;
+ }
+
+ return outptr - out;
+}
+
+/**
+ * g_base64_encode_close:
+ * @break_lines: whether to break long lines
+ * @out: pointer to destination buffer
+ * @state: Saved state from g_base64_encode_step()
+ * @save: Saved state from g_base64_encode_step()
+ *
+ * Flush the status from a sequence of calls to g_base64_encode_step().
+ *
+ * Return value: The number of bytes of output that was written
+ *
+ * Since: 2.12
+ */
+gsize
+g_base64_encode_close (gboolean break_lines,
+ gchar *out,
+ gint *state,
+ gint *save)
+{
+ int c1, c2;
+ char *outptr = out;
+
+ g_return_val_if_fail (out != NULL, 0);
+ g_return_val_if_fail (state != NULL, 0);
+ g_return_val_if_fail (save != NULL, 0);
+
+ c1 = ((unsigned char *) save) [1];
+ c2 = ((unsigned char *) save) [2];
+
+ switch (((char *) save) [0])
+ {
+ case 2:
+ outptr [2] = base64_alphabet[ ( (c2 &0x0f) << 2 ) ];
+ g_assert (outptr [2] != 0);
+ goto skip;
+ case 1:
+ outptr[2] = '=';
+ skip:
+ outptr [0] = base64_alphabet [ c1 >> 2 ];
+ outptr [1] = base64_alphabet [ c2 >> 4 | ( (c1&0x3) << 4 )];
+ outptr [3] = '=';
+ outptr += 4;
+ break;
+ }
+ if (break_lines)
+ *outptr++ = '\n';
+
+ *save = 0;
+ *state = 0;
+
+ return outptr - out;
+}
+
+/**
+ * g_base64_encode:
+ * @data: the binary data to encode
+ * @len: the length of @data
+ *
+ * Encode a sequence of binary data into its Base-64 stringified
+ * representation.
+ *
+ * Return value: a newly allocated, zero-terminated Base-64 encoded
+ * string representing @data.
+ *
+ * Since: 2.12
+ */
+gchar *
+g_base64_encode (const guchar *data,
+ gsize len)
+{
+ gchar *out;
+ gint state = 0, outlen;
+ gint save = 0;
+
+ g_return_val_if_fail (data != NULL, NULL);
+ g_return_val_if_fail (len > 1, NULL);
+
+ /* We can use a smaller limit here, since we know the saved state is 0 */
+ out = g_malloc (len * 4 / 3 + 4);
+ outlen = g_base64_encode_step (data, len, FALSE, out, &state, &save);
+ outlen += g_base64_encode_close (FALSE,
+ out + outlen,
+ &state,
+ &save);
+ out[outlen] = '\0';
+ return (gchar *) out;
+}
+
+static const unsigned char mime_base64_rank[256] = {
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255, 62,255,255,255, 63,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255, 0,255,255,
+ 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255,
+ 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+};
+
+/**
+ * g_base64_decode_step:
+ * @in: binary input data
+ * @len: max length of @in data to decode
+ * @out: output buffer
+ * @state: Saved state between steps, initialize to 0
+ * @save: Saved state between steps, initialize to 0
+ *
+ * Incrementally decode a sequence of binary data from its Base-64 stringified
+ * representation. By calling this function multiple times you can convert
+ * data in chunks to avoid having to have the full encoded data in memory.
+ *
+ * The output buffer must be large enough to fit all the data that will
+ * be written to it. Since base64 encodes 3 bytes in 4 chars you need
+ * at least: @len * 3 / 4 bytes.
+ *
+ * Return value: The number of bytes of output that was written
+ *
+ * Since: 2.12
+ **/
+gsize
+g_base64_decode_step (const gchar *in,
+ gsize len,
+ guchar *out,
+ gint *state,
+ guint *save)
+{
+ const guchar *inptr;
+ guchar *outptr;
+ const guchar *inend;
+ guchar c, rank;
+ guchar last[2];
+ unsigned int v;
+ int i;
+
+ g_return_val_if_fail (in != NULL, 0);
+ g_return_val_if_fail (out != NULL, 0);
+ g_return_val_if_fail (state != NULL, 0);
+ g_return_val_if_fail (save != NULL, 0);
+
+ if (len <= 0)
+ return 0;
+
+ inend = (const guchar *)in+len;
+ outptr = out;
+
+ /* convert 4 base64 bytes to 3 normal bytes */
+ v=*save;
+ i=*state;
+ inptr = (const guchar *)in;
+ last[0] = last[1] = 0;
+ while (inptr < inend)
+ {
+ c = *inptr++;
+ rank = mime_base64_rank [c];
+ if (rank != 0xff)
+ {
+ last[1] = last[0];
+ last[0] = c;
+ v = (v<<6) | rank;
+ i++;
+ if (i==4)
+ {
+ *outptr++ = v>>16;
+ if (last[1] != '=')
+ *outptr++ = v>>8;
+ if (last[0] != '=')
+ *outptr++ = v;
+ i=0;
+ }
+ }
+ }
+
+ *save = v;
+ *state = i;
+
+ return outptr - out;
+}
+
+/**
+ * g_base64_decode:
+ * @text: zero-terminated string with base64 text to decode
+ * @out_len: The length of the decoded data is written here
+ *
+ * Decode a sequence of Base-64 encoded text into binary data
+ *
+ * Return value: a newly allocated buffer containing the binary data
+ * that @text represents
+ *
+ * Since: 2.12
+ */
+guchar *
+g_base64_decode (const gchar *text,
+ gsize *out_len)
+{
+ guchar *ret;
+ gint input_length, state = 0;
+ guint save = 0;
+
+ g_return_val_if_fail (text != NULL, NULL);
+ g_return_val_if_fail (out_len != NULL, NULL);
+
+ input_length = strlen (text);
+
+ g_return_val_if_fail (input_length > 1, NULL);
+
+ ret = g_malloc0 (input_length * 3 / 4);
+
+ *out_len = g_base64_decode_step (text, input_length, ret, &state, &save);
+
+ return ret;
+}
+
+#define __G_BASE64_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gbase64.h b/trunk/glib/gbase64.h
new file mode 100644
index 000000000..6637984ec
--- /dev/null
+++ b/trunk/glib/gbase64.h
@@ -0,0 +1,50 @@
+/* gbase64.h - Base64 coding functions
+ *
+ * Copyright (C) 2005 Alexander Larsson <alexl@redhat.com>
+ *
+ * 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_BASE64_H__
+#define __G_BASE64_H__
+
+#include <glib/gtypes.h>
+
+G_BEGIN_DECLS
+
+gsize g_base64_encode_step (const guchar *in,
+ gsize len,
+ gboolean break_lines,
+ gchar *out,
+ gint *state,
+ gint *save);
+gsize g_base64_encode_close (gboolean break_lines,
+ gchar *out,
+ gint *state,
+ gint *save);
+gchar* g_base64_encode (const guchar *data,
+ gsize len) G_GNUC_MALLOC;
+gsize g_base64_decode_step (const gchar *in,
+ gsize len,
+ guchar *out,
+ gint *state,
+ guint *save);
+guchar *g_base64_decode (const gchar *text,
+ gsize *out_len) G_GNUC_MALLOC;
+
+G_END_DECLS
+
+#endif /* __G_BASE64_H__ */
diff --git a/trunk/glib/gbookmarkfile.c b/trunk/glib/gbookmarkfile.c
new file mode 100644
index 000000000..de4a5e053
--- /dev/null
+++ b/trunk/glib/gbookmarkfile.c
@@ -0,0 +1,3695 @@
+/* gbookmarkfile.c: parsing and building desktop bookmarks
+ *
+ * Copyright (C) 2005-2006 Emmanuele Bassi
+ *
+ * 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,
+ */
+
+#include "config.h"
+
+#include "gbookmarkfile.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <locale.h>
+#include <time.h>
+#include <stdarg.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "gconvert.h"
+#include "gdataset.h"
+#include "gerror.h"
+#include "gfileutils.h"
+#include "ghash.h"
+#include "glibintl.h"
+#include "glist.h"
+#include "gslist.h"
+#include "gmain.h"
+#include "gmarkup.h"
+#include "gmem.h"
+#include "gmessages.h"
+#include "gshell.h"
+#include "gslice.h"
+#include "gstdio.h"
+#include "gstring.h"
+#include "gstrfuncs.h"
+#include "gtimer.h"
+#include "gutils.h"
+
+#include "galias.h"
+
+/* XBEL 1.0 standard entities */
+#define XBEL_VERSION "1.0"
+#define XBEL_DTD_NICK "xbel"
+#define XBEL_DTD_SYSTEM "+//IDN python.org//DTD XML Bookmark " \
+ "Exchange Language 1.0//EN//XML"
+
+#define XBEL_DTD_URI "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd"
+
+#define XBEL_ROOT_ELEMENT "xbel"
+#define XBEL_FOLDER_ELEMENT "folder" /* unused */
+#define XBEL_BOOKMARK_ELEMENT "bookmark"
+#define XBEL_ALIAS_ELEMENT "alias" /* unused */
+#define XBEL_SEPARATOR_ELEMENT "separator" /* unused */
+#define XBEL_TITLE_ELEMENT "title"
+#define XBEL_DESC_ELEMENT "desc"
+#define XBEL_INFO_ELEMENT "info"
+#define XBEL_METADATA_ELEMENT "metadata"
+
+#define XBEL_VERSION_ATTRIBUTE "version"
+#define XBEL_FOLDED_ATTRIBUTE "folded" /* unused */
+#define XBEL_OWNER_ATTRIBUTE "owner"
+#define XBEL_ADDED_ATTRIBUTE "added"
+#define XBEL_VISITED_ATTRIBUTE "visited"
+#define XBEL_MODIFIED_ATTRIBUTE "modified"
+#define XBEL_ID_ATTRIBUTE "id"
+#define XBEL_HREF_ATTRIBUTE "href"
+#define XBEL_REF_ATTRIBUTE "ref" /* unused */
+
+#define XBEL_YES_VALUE "yes"
+#define XBEL_NO_VALUE "no"
+
+/* Desktop bookmark spec entities */
+#define BOOKMARK_METADATA_OWNER "http://freedesktop.org"
+
+#define BOOKMARK_NAMESPACE_NAME "bookmark"
+#define BOOKMARK_NAMESPACE_URI "http://www.freedesktop.org/standards/desktop-bookmarks"
+
+#define BOOKMARK_GROUPS_ELEMENT "groups"
+#define BOOKMARK_GROUP_ELEMENT "group"
+#define BOOKMARK_APPLICATIONS_ELEMENT "applications"
+#define BOOKMARK_APPLICATION_ELEMENT "application"
+#define BOOKMARK_ICON_ELEMENT "icon"
+#define BOOKMARK_PRIVATE_ELEMENT "private"
+
+#define BOOKMARK_NAME_ATTRIBUTE "name"
+#define BOOKMARK_EXEC_ATTRIBUTE "exec"
+#define BOOKMARK_COUNT_ATTRIBUTE "count"
+#define BOOKMARK_TIMESTAMP_ATTRIBUTE "timestamp"
+#define BOOKMARK_HREF_ATTRIBUTE "href"
+#define BOOKMARK_TYPE_ATTRIBUTE "type"
+
+/* Shared MIME Info entities */
+#define MIME_NAMESPACE_NAME "mime"
+#define MIME_NAMESPACE_URI "http://www.freedesktop.org/standards/shared-mime-info"
+#define MIME_TYPE_ELEMENT "mime-type"
+#define MIME_TYPE_ATTRIBUTE "type"
+
+
+typedef struct _BookmarkAppInfo BookmarkAppInfo;
+typedef struct _BookmarkMetadata BookmarkMetadata;
+typedef struct _BookmarkItem BookmarkItem;
+typedef struct _ParseData ParseData;
+
+struct _BookmarkAppInfo
+{
+ gchar *name;
+ gchar *exec;
+
+ guint count;
+
+ time_t stamp;
+};
+
+struct _BookmarkMetadata
+{
+ gchar *mime_type;
+
+ GList *groups;
+
+ GList *applications;
+ GHashTable *apps_by_name;
+
+ gchar *icon_href;
+ gchar *icon_mime;
+
+ guint is_private : 1;
+};
+
+struct _BookmarkItem
+{
+ gchar *uri;
+
+ gchar *title;
+ gchar *description;
+
+ time_t added;
+ time_t modified;
+ time_t visited;
+
+ BookmarkMetadata *metadata;
+};
+
+struct _GBookmarkFile
+{
+ gchar *title;
+ gchar *description;
+
+ /* we store our items in a list and keep a copy inside
+ * an hash table for faster lookup performances
+ */
+ GList *items;
+ GHashTable *items_by_uri;
+};
+
+/* parser state machine */
+enum
+{
+ STATE_STARTED = 0,
+
+ STATE_ROOT,
+ STATE_BOOKMARK,
+ STATE_TITLE,
+ STATE_DESC,
+ STATE_INFO,
+ STATE_METADATA,
+ STATE_APPLICATIONS,
+ STATE_APPLICATION,
+ STATE_GROUPS,
+ STATE_GROUP,
+ STATE_MIME,
+ STATE_ICON,
+
+ STATE_FINISHED
+};
+
+static void g_bookmark_file_init (GBookmarkFile *bookmark);
+static void g_bookmark_file_clear (GBookmarkFile *bookmark);
+static gboolean g_bookmark_file_parse (GBookmarkFile *bookmark,
+ const gchar *buffer,
+ gsize length,
+ GError **error);
+static gchar * g_bookmark_file_dump (GBookmarkFile *bookmark,
+ gsize *length,
+ GError **error);
+static BookmarkItem *g_bookmark_file_lookup_item (GBookmarkFile *bookmark,
+ const gchar *uri);
+static void g_bookmark_file_add_item (GBookmarkFile *bookmark,
+ BookmarkItem *item,
+ GError **error);
+
+static time_t timestamp_from_iso8601 (const gchar *iso_date);
+static gchar * timestamp_to_iso8601 (time_t timestamp);
+
+/********************************
+ * BookmarkAppInfo *
+ * *
+ * Application metadata storage *
+ ********************************/
+static BookmarkAppInfo *
+bookmark_app_info_new (const gchar *name)
+{
+ BookmarkAppInfo *retval;
+
+ g_assert (name != NULL);
+
+ retval = g_slice_new (BookmarkAppInfo);
+
+ retval->name = g_strdup (name);
+ retval->exec = NULL;
+ retval->count = 0;
+ retval->stamp = time (NULL);
+
+ return retval;
+}
+
+static void
+bookmark_app_info_free (BookmarkAppInfo *app_info)
+{
+ if (!app_info)
+ return;
+
+ g_free (app_info->name);
+ g_free (app_info->exec);
+
+ g_slice_free (BookmarkAppInfo, app_info);
+}
+
+static gchar *
+bookmark_app_info_dump (BookmarkAppInfo *app_info)
+{
+ gchar *retval;
+ gchar *name, *exec;
+
+ g_assert (app_info != NULL);
+
+ if (app_info->count == 0)
+ return NULL;
+
+ name = g_markup_escape_text (app_info->name, -1);
+ exec = g_markup_escape_text (app_info->exec, -1);
+
+ retval = g_strdup_printf (" <%s:%s %s=\"%s\" %s=\"%s\" %s=\"%ld\" %s=\"%u\"/>\n",
+ BOOKMARK_NAMESPACE_NAME,
+ BOOKMARK_APPLICATION_ELEMENT,
+ BOOKMARK_NAME_ATTRIBUTE, name,
+ BOOKMARK_EXEC_ATTRIBUTE, exec,
+ BOOKMARK_TIMESTAMP_ATTRIBUTE, (time_t) app_info->stamp,
+ BOOKMARK_COUNT_ATTRIBUTE, app_info->count);
+
+ g_free (name);
+ g_free (exec);
+
+ return retval;
+}
+
+
+/***********************
+ * BookmarkMetadata *
+ * *
+ * Metadata storage *
+ ***********************/
+static BookmarkMetadata *
+bookmark_metadata_new (void)
+{
+ BookmarkMetadata *retval;
+
+ retval = g_slice_new (BookmarkMetadata);
+
+ retval->mime_type = NULL;
+
+ retval->groups = NULL;
+
+ retval->applications = NULL;
+ retval->apps_by_name = g_hash_table_new_full (g_str_hash,
+ g_str_equal,
+ NULL,
+ NULL);
+
+ retval->is_private = FALSE;
+
+ retval->icon_href = NULL;
+ retval->icon_mime = NULL;
+
+ return retval;
+}
+
+static void
+bookmark_metadata_free (BookmarkMetadata *metadata)
+{
+ if (!metadata)
+ return;
+
+ g_free (metadata->mime_type);
+
+ if (metadata->groups)
+ {
+ g_list_foreach (metadata->groups,
+ (GFunc) g_free,
+ NULL);
+ g_list_free (metadata->groups);
+ }
+
+ if (metadata->applications)
+ {
+ g_list_foreach (metadata->applications,
+ (GFunc) bookmark_app_info_free,
+ NULL);
+ g_list_free (metadata->applications);
+
+ g_hash_table_destroy (metadata->apps_by_name);
+ }
+
+ g_free (metadata->icon_href);
+ g_free (metadata->icon_mime);
+
+ g_slice_free (BookmarkMetadata, metadata);
+}
+
+static gchar *
+bookmark_metadata_dump (BookmarkMetadata *metadata)
+{
+ GString *retval;
+
+ if (!metadata->applications)
+ return NULL;
+
+ retval = g_string_new (NULL);
+
+ /* metadata container */
+ g_string_append_printf (retval,
+ " <%s %s=\"%s\">\n",
+ XBEL_METADATA_ELEMENT,
+ XBEL_OWNER_ATTRIBUTE, BOOKMARK_METADATA_OWNER);
+
+ /* mime type */
+ if (metadata->mime_type)
+ g_string_append_printf (retval,
+ " <%s:%s %s=\"%s\"/>\n",
+ MIME_NAMESPACE_NAME,
+ MIME_TYPE_ELEMENT,
+ MIME_TYPE_ATTRIBUTE, metadata->mime_type);
+
+ if (metadata->groups)
+ {
+ GList *l;
+
+ /* open groups container */
+ g_string_append_printf (retval,
+ " <%s:%s>\n",
+ BOOKMARK_NAMESPACE_NAME,
+ BOOKMARK_GROUPS_ELEMENT);
+
+ for (l = g_list_last (metadata->groups); l != NULL; l = l->prev)
+ {
+ gchar *group_name;
+
+ group_name = g_markup_escape_text ((gchar *) l->data, -1);
+ g_string_append_printf (retval,
+ " <%s:%s>%s</%s:%s>\n",
+ BOOKMARK_NAMESPACE_NAME,
+ BOOKMARK_GROUP_ELEMENT,
+ group_name,
+ BOOKMARK_NAMESPACE_NAME,
+ BOOKMARK_GROUP_ELEMENT);
+ g_free (group_name);
+ }
+
+ /* close groups container */
+ g_string_append_printf (retval,
+ " </%s:%s>\n",
+ BOOKMARK_NAMESPACE_NAME,
+ BOOKMARK_GROUPS_ELEMENT);
+ }
+
+ if (metadata->applications)
+ {
+ GList *l;
+
+ /* open applications container */
+ g_string_append_printf (retval,
+ " <%s:%s>\n",
+ BOOKMARK_NAMESPACE_NAME,
+ BOOKMARK_APPLICATIONS_ELEMENT);
+
+ for (l = g_list_last (metadata->applications); l != NULL; l = l->prev)
+ {
+ BookmarkAppInfo *app_info = (BookmarkAppInfo *) l->data;
+ gchar *app_data;
+
+ g_assert (app_info != NULL);
+
+ app_data = bookmark_app_info_dump (app_info);
+
+ if (app_data)
+ {
+ retval = g_string_append (retval, app_data);
+
+ g_free (app_data);
+ }
+ }
+
+ /* close applications container */
+ g_string_append_printf (retval,
+ " </%s:%s>\n",
+ BOOKMARK_NAMESPACE_NAME,
+ BOOKMARK_APPLICATIONS_ELEMENT);
+ }
+
+ /* icon */
+ if (metadata->icon_href)
+ {
+ if (!metadata->icon_mime)
+ metadata->icon_mime = g_strdup ("application/octet-stream");
+
+ g_string_append_printf (retval,
+ " <%s:%s %s=\"%s\" %s=\"%s\"/>\n",
+ BOOKMARK_NAMESPACE_NAME,
+ BOOKMARK_ICON_ELEMENT,
+ BOOKMARK_HREF_ATTRIBUTE, metadata->icon_href,
+ BOOKMARK_TYPE_ATTRIBUTE, metadata->icon_mime);
+ }
+
+ /* private hint */
+ if (metadata->is_private)
+ g_string_append_printf (retval,
+ " <%s:%s/>\n",
+ BOOKMARK_NAMESPACE_NAME,
+ BOOKMARK_PRIVATE_ELEMENT);
+
+ /* close metadata container */
+ g_string_append_printf (retval, " </%s>\n", XBEL_METADATA_ELEMENT);
+
+ return g_string_free (retval, FALSE);
+}
+
+/******************************************************
+ * BookmarkItem *
+ * *
+ * Storage for a single bookmark item inside the list *
+ ******************************************************/
+static BookmarkItem *
+bookmark_item_new (const gchar *uri)
+{
+ BookmarkItem *item;
+
+ g_assert (uri != NULL);
+
+ item = g_slice_new (BookmarkItem);
+ item->uri = g_strdup (uri);
+
+ item->title = NULL;
+ item->description = NULL;
+
+ item->added = (time_t) -1;
+ item->modified = (time_t) -1;
+ item->visited = (time_t) -1;
+
+ item->metadata = NULL;
+
+ return item;
+}
+
+static void
+bookmark_item_free (BookmarkItem *item)
+{
+ if (!item)
+ return;
+
+ g_free (item->uri);
+ g_free (item->title);
+ g_free (item->description);
+
+ if (item->metadata)
+ bookmark_metadata_free (item->metadata);
+
+ g_slice_free (BookmarkItem, item);
+}
+
+static gchar *
+bookmark_item_dump (BookmarkItem *item)
+{
+ GString *retval;
+ gchar *added, *visited, *modified;
+ gchar *escaped_uri;
+
+ /* at this point, we must have at least a registered application; if we don't
+ * we don't screw up the bookmark file, and just skip this item
+ */
+ if (!item->metadata || !item->metadata->applications)
+ {
+ g_warning ("Item for URI '%s' has no registered applications: skipping.\n", item->uri);
+ return NULL;
+ }
+
+ retval = g_string_new (NULL);
+
+ added = timestamp_to_iso8601 (item->added);
+ modified = timestamp_to_iso8601 (item->modified);
+ visited = timestamp_to_iso8601 (item->visited);
+
+ escaped_uri = g_markup_escape_text (item->uri, -1);
+
+ g_string_append_printf (retval,
+ " <%s %s=\"%s\" %s=\"%s\" %s=\"%s\" %s=\"%s\">\n",
+ XBEL_BOOKMARK_ELEMENT,
+ XBEL_HREF_ATTRIBUTE, escaped_uri,
+ XBEL_ADDED_ATTRIBUTE, added,
+ XBEL_MODIFIED_ATTRIBUTE, modified,
+ XBEL_VISITED_ATTRIBUTE, visited);
+ g_free (escaped_uri);
+ g_free (visited);
+ g_free (modified);
+ g_free (added);
+
+ if (item->title)
+ {
+ gchar *escaped_title;
+
+ escaped_title = g_markup_escape_text (item->title, -1);
+ g_string_append_printf (retval,
+ " <%s>%s</%s>\n",
+ XBEL_TITLE_ELEMENT,
+ escaped_title,
+ XBEL_TITLE_ELEMENT);
+ g_free (escaped_title);
+ }
+
+ if (item->description)
+ {
+ gchar *escaped_desc;
+
+ escaped_desc = g_markup_escape_text (item->description, -1);
+ g_string_append_printf (retval,
+ " <%s>%s</%s>\n",
+ XBEL_DESC_ELEMENT,
+ escaped_desc,
+ XBEL_DESC_ELEMENT);
+ g_free (escaped_desc);
+ }
+
+ if (item->metadata)
+ {
+ gchar *metadata;
+
+ /* open info container */
+ g_string_append_printf (retval, " <%s>\n", XBEL_INFO_ELEMENT);
+
+ metadata = bookmark_metadata_dump (item->metadata);
+ if (metadata)
+ {
+ retval = g_string_append (retval, metadata);
+
+ g_free (metadata);
+ }
+
+ /* close info container */
+ g_string_append_printf (retval, " </%s>\n", XBEL_INFO_ELEMENT);
+ }
+
+ g_string_append_printf (retval, " </%s>\n", XBEL_BOOKMARK_ELEMENT);
+
+ return g_string_free (retval, FALSE);
+}
+
+static BookmarkAppInfo *
+bookmark_item_lookup_app_info (BookmarkItem *item,
+ const gchar *app_name)
+{
+ g_assert (item != NULL && app_name != NULL);
+
+ if (!item->metadata)
+ return NULL;
+
+ return g_hash_table_lookup (item->metadata->apps_by_name, app_name);
+}
+
+/*************************
+ * GBookmarkFile *
+ *************************/
+
+static void
+g_bookmark_file_init (GBookmarkFile *bookmark)
+{
+ bookmark->title = NULL;
+ bookmark->description = NULL;
+
+ bookmark->items = NULL;
+ bookmark->items_by_uri = g_hash_table_new_full (g_str_hash,
+ g_str_equal,
+ NULL,
+ NULL);
+}
+
+static void
+g_bookmark_file_clear (GBookmarkFile *bookmark)
+{
+ g_free (bookmark->title);
+ g_free (bookmark->description);
+
+ if (bookmark->items)
+ {
+ g_list_foreach (bookmark->items,
+ (GFunc) bookmark_item_free,
+ NULL);
+ g_list_free (bookmark->items);
+
+ bookmark->items = NULL;
+ }
+
+ if (bookmark->items_by_uri)
+ {
+ g_hash_table_destroy (bookmark->items_by_uri);
+
+ bookmark->items_by_uri = NULL;
+ }
+}
+
+struct _ParseData
+{
+ gint state;
+
+ GHashTable *namespaces;
+
+ GBookmarkFile *bookmark_file;
+ BookmarkItem *current_item;
+};
+
+static ParseData *
+parse_data_new (void)
+{
+ ParseData *retval;
+
+ retval = g_new (ParseData, 1);
+
+ retval->state = STATE_STARTED;
+ retval->namespaces = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) g_free);
+ retval->bookmark_file = NULL;
+ retval->current_item = NULL;
+
+ return retval;
+}
+
+static void
+parse_data_free (ParseData *parse_data)
+{
+ g_hash_table_destroy (parse_data->namespaces);
+
+ g_free (parse_data);
+}
+
+#define IS_ATTRIBUTE(s,a) ((0 == strcmp ((s), (a))))
+
+static void
+parse_bookmark_element (GMarkupParseContext *context,
+ ParseData *parse_data,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ GError **error)
+{
+ const gchar *uri, *added, *modified, *visited;
+ const gchar *attr;
+ gint i;
+ BookmarkItem *item;
+ GError *add_error;
+
+ g_assert ((parse_data != NULL) && (parse_data->state == STATE_BOOKMARK));
+
+ i = 0;
+ uri = added = modified = visited = NULL;
+ for (attr = attribute_names[i]; attr != NULL; attr = attribute_names[++i])
+ {
+ if (IS_ATTRIBUTE (attr, XBEL_HREF_ATTRIBUTE))
+ uri = attribute_values[i];
+ else if (IS_ATTRIBUTE (attr, XBEL_ADDED_ATTRIBUTE))
+ added = attribute_values[i];
+ else if (IS_ATTRIBUTE (attr, XBEL_MODIFIED_ATTRIBUTE))
+ modified = attribute_values[i];
+ else if (IS_ATTRIBUTE (attr, XBEL_VISITED_ATTRIBUTE))
+ visited = attribute_values[i];
+ else
+ {
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE,
+ _("Unexpected attribute '%s' for element '%s'"),
+ attr,
+ XBEL_BOOKMARK_ELEMENT);
+ return;
+ }
+ }
+
+ if (!uri)
+ {
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_INVALID_CONTENT,
+ _("Attribute '%s' of element '%s' not found"),
+ XBEL_HREF_ATTRIBUTE,
+ XBEL_BOOKMARK_ELEMENT);
+ return;
+ }
+
+ g_assert (parse_data->current_item == NULL);
+
+ item = bookmark_item_new (uri);
+
+ if (added)
+ item->added = timestamp_from_iso8601 (added);
+
+ if (modified)
+ item->modified = timestamp_from_iso8601 (modified);
+
+ if (visited)
+ item->visited = timestamp_from_iso8601 (visited);
+
+ add_error = NULL;
+ g_bookmark_file_add_item (parse_data->bookmark_file,
+ item,
+ &add_error);
+ if (add_error)
+ {
+ bookmark_item_free (item);
+
+ g_propagate_error (error, add_error);
+
+ return;
+ }
+
+ parse_data->current_item = item;
+}
+
+static void
+parse_application_element (GMarkupParseContext *context,
+ ParseData *parse_data,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ GError **error)
+{
+ const gchar *name, *exec, *count, *stamp;
+ const gchar *attr;
+ gint i;
+ BookmarkItem *item;
+ BookmarkAppInfo *ai;
+
+ g_assert ((parse_data != NULL) && (parse_data->state == STATE_APPLICATION));
+
+ i = 0;
+ name = exec = count = stamp = NULL;
+ for (attr = attribute_names[i]; attr != NULL; attr = attribute_names[++i])
+ {
+ if (IS_ATTRIBUTE (attr, BOOKMARK_NAME_ATTRIBUTE))
+ name = attribute_values[i];
+ else if (IS_ATTRIBUTE (attr, BOOKMARK_EXEC_ATTRIBUTE))
+ exec = attribute_values[i];
+ else if (IS_ATTRIBUTE (attr, BOOKMARK_COUNT_ATTRIBUTE))
+ count = attribute_values[i];
+ else if (IS_ATTRIBUTE (attr, BOOKMARK_TIMESTAMP_ATTRIBUTE))
+ stamp = attribute_values[i];
+ else
+ {
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE,
+ _("Unexpected attribute '%s' for element '%s'"),
+ attr,
+ BOOKMARK_APPLICATION_ELEMENT);
+ return;
+ }
+ }
+
+ if (!name)
+ {
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_INVALID_CONTENT,
+ _("Attribute '%s' of element '%s' not found"),
+ BOOKMARK_NAME_ATTRIBUTE,
+ BOOKMARK_APPLICATION_ELEMENT);
+ return;
+ }
+
+ if (!exec)
+ {
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_INVALID_CONTENT,
+ _("Attribute '%s' of element '%s' not found"),
+ BOOKMARK_EXEC_ATTRIBUTE,
+ BOOKMARK_APPLICATION_ELEMENT);
+ return;
+ }
+
+ g_assert (parse_data->current_item != NULL);
+ item = parse_data->current_item;
+
+ ai = bookmark_item_lookup_app_info (item, name);
+ if (!ai)
+ {
+ ai = bookmark_app_info_new (name);
+
+ if (!item->metadata)
+ item->metadata = bookmark_metadata_new ();
+
+ item->metadata->applications = g_list_prepend (item->metadata->applications, ai);
+ g_hash_table_replace (item->metadata->apps_by_name, ai->name, ai);
+ }
+
+ ai->exec = g_strdup (exec);
+
+ if (count)
+ ai->count = atoi (count);
+ else
+ ai->count = 1;
+
+ if (stamp)
+ ai->stamp = (time_t) atol (stamp);
+ else
+ ai->stamp = time (NULL);
+}
+
+static void
+parse_mime_type_element (GMarkupParseContext *context,
+ ParseData *parse_data,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ GError **error)
+{
+ const gchar *type;
+ const gchar *attr;
+ gint i;
+ BookmarkItem *item;
+
+ g_assert ((parse_data != NULL) && (parse_data->state == STATE_MIME));
+
+ i = 0;
+ type = NULL;
+ for (attr = attribute_names[i]; attr != NULL; attr = attribute_names[++i])
+ {
+ if (IS_ATTRIBUTE (attr, MIME_TYPE_ATTRIBUTE))
+ type = attribute_values[i];
+ else
+ {
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE,
+ _("Unexpected attribute '%s' for element '%s'"),
+ attr,
+ MIME_TYPE_ELEMENT);
+ return;
+ }
+ }
+
+ if (!type)
+ type = "application/octet-stream";
+
+ g_assert (parse_data->current_item != NULL);
+ item = parse_data->current_item;
+
+ if (!item->metadata)
+ item->metadata = bookmark_metadata_new ();
+
+ item->metadata->mime_type = g_strdup (type);
+}
+
+static void
+parse_icon_element (GMarkupParseContext *context,
+ ParseData *parse_data,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ GError **error)
+{
+ const gchar *href;
+ const gchar *type;
+ const gchar *attr;
+ gint i;
+ BookmarkItem *item;
+
+ g_assert ((parse_data != NULL) && (parse_data->state == STATE_ICON));
+
+ i = 0;
+ href = NULL;
+ type = NULL;
+ for (attr = attribute_names[i]; attr != NULL; attr = attribute_names[++i])
+ {
+ if (IS_ATTRIBUTE (attr, BOOKMARK_HREF_ATTRIBUTE))
+ href = attribute_values[i];
+ else if (IS_ATTRIBUTE (attr, BOOKMARK_TYPE_ATTRIBUTE))
+ type = attribute_values[i];
+ else
+ {
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE,
+ _("Unexpected attribute '%s' for element '%s'"),
+ attr,
+ BOOKMARK_ICON_ELEMENT);
+ return;
+ }
+ }
+
+ if (!href)
+ {
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_INVALID_CONTENT,
+ _("Attribute '%s' of element '%s' not found"),
+ BOOKMARK_HREF_ATTRIBUTE,
+ BOOKMARK_ICON_ELEMENT);
+ return;
+ }
+
+ if (!type)
+ type = "application/octet-stream";
+
+ g_assert (parse_data->current_item != NULL);
+ item = parse_data->current_item;
+
+ if (!item->metadata)
+ item->metadata = bookmark_metadata_new ();
+
+ item->metadata->icon_href = g_strdup (href);
+ item->metadata->icon_mime = g_strdup (type);
+}
+
+/* scans through the attributes of an element for the "xmlns" pragma, and
+ * adds any resulting namespace declaration to a per-parser hashtable, using
+ * the namespace name as a key for the namespace URI; if no key was found,
+ * the namespace is considered as default, and stored under the "default" key.
+ *
+ * FIXME: this works on the assumption that the generator of the XBEL file
+ * is either this code or is smart enough to place the namespace declarations
+ * inside the main root node or inside the metadata node and does not redefine
+ * a namespace inside an inner node; this does *not* conform to the
+ * XML-NS standard, although is a close approximation. In order to make this
+ * conformant to the XML-NS specification we should use a per-element
+ * namespace table inside GMarkup and ask it to resolve the namespaces for us.
+ */
+static void
+map_namespace_to_name (ParseData *parse_data,
+ const gchar **attribute_names,
+ const gchar **attribute_values)
+{
+ const gchar *attr;
+ gint i;
+
+ g_assert (parse_data != NULL);
+
+ if (!attribute_names || !attribute_names[0])
+ return;
+
+ i = 0;
+ for (attr = attribute_names[i]; attr; attr = attribute_names[++i])
+ {
+ if (g_str_has_prefix (attr, "xmlns"))
+ {
+ gchar *namespace_name, *namespace_uri;
+ gchar *p;
+
+ p = g_utf8_strchr (attr, -1, ':');
+ if (p)
+ p = g_utf8_next_char (p);
+ else
+ p = "default";
+
+ namespace_name = g_strdup (p);
+ namespace_uri = g_strdup (attribute_values[i]);
+
+ g_hash_table_replace (parse_data->namespaces,
+ namespace_name,
+ namespace_uri);
+ }
+ }
+}
+
+/* checks whether @element_full is equal to @element.
+ *
+ * if @namespace is set, it tries to resolve the namespace to a known URI,
+ * and if found is prepended to the element name, from which is separated
+ * using the character specified in the @sep parameter.
+ */
+static gboolean
+is_element_full (ParseData *parse_data,
+ const gchar *element_full,
+ const gchar *namespace,
+ const gchar *element,
+ const gchar sep)
+{
+ gchar *ns_uri, *ns_name, *s, *resolved;
+ const gchar *p, *element_name;
+ gboolean retval;
+
+ g_assert (parse_data != NULL);
+ g_assert (element_full != NULL);
+
+ if (!element)
+ return FALSE;
+
+ /* no namespace requested: dumb element compare */
+ if (!namespace)
+ return (0 == strcmp (element_full, element));
+
+ /* search for namespace separator; if none found, assume we are under the
+ * default namespace, and set ns_name to our "default" marker; if no default
+ * namespace has been set, just do a plain comparison between @full_element
+ * and @element.
+ */
+ p = strchr (element_full, ':');
+ if (p)
+ {
+ ns_name = g_strndup (element_full, p - element_full);
+ element_name = g_utf8_next_char (p);
+ }
+ else
+ {
+ ns_name = g_strdup ("default");
+ element_name = element_full;
+ }
+
+ ns_uri = g_hash_table_lookup (parse_data->namespaces, ns_name);
+ if (!ns_uri)
+ {
+ /* no default namespace found */
+ g_free (ns_name);
+
+ return (0 == strcmp (element_full, element));
+ }
+
+ resolved = g_strdup_printf ("%s%c%s", ns_uri, sep, element_name);
+ s = g_strdup_printf ("%s%c%s", namespace, sep, element);
+ retval = (0 == strcmp (resolved, s));
+
+ g_free (ns_name);
+ g_free (resolved);
+ g_free (s);
+
+ return retval;
+}
+
+#define IS_ELEMENT(p,s,e) (is_element_full ((p), (s), NULL, (e), '\0'))
+#define IS_ELEMENT_NS(p,s,n,e) (is_element_full ((p), (s), (n), (e), '|'))
+
+static void
+start_element_raw_cb (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ gpointer user_data,
+ GError **error)
+{
+ ParseData *parse_data = (ParseData *) user_data;
+
+ /* we must check for namespace declarations first
+ *
+ * XXX - we could speed up things by checking for namespace declarations
+ * only on the root node, where they usually are; this would probably break
+ * on streams not produced by us or by "smart" generators
+ */
+ map_namespace_to_name (parse_data, attribute_names, attribute_values);
+
+ switch (parse_data->state)
+ {
+ case STATE_STARTED:
+ if (IS_ELEMENT (parse_data, element_name, XBEL_ROOT_ELEMENT))
+ {
+ const gchar *attr;
+ gint i;
+
+ i = 0;
+ for (attr = attribute_names[i]; attr; attr = attribute_names[++i])
+ {
+ if ((IS_ATTRIBUTE (attr, XBEL_VERSION_ATTRIBUTE)) &&
+ (0 == strcmp (attribute_values[i], XBEL_VERSION)))
+ parse_data->state = STATE_ROOT;
+ }
+ }
+ else
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_INVALID_CONTENT,
+ _("Unexpected tag '%s', tag '%s' expected"),
+ element_name, XBEL_ROOT_ELEMENT);
+ break;
+ case STATE_ROOT:
+ if (IS_ELEMENT (parse_data, element_name, XBEL_TITLE_ELEMENT))
+ parse_data->state = STATE_TITLE;
+ else if (IS_ELEMENT (parse_data, element_name, XBEL_DESC_ELEMENT))
+ parse_data->state = STATE_DESC;
+ else if (IS_ELEMENT (parse_data, element_name, XBEL_BOOKMARK_ELEMENT))
+ {
+ GError *inner_error = NULL;
+
+ parse_data->state = STATE_BOOKMARK;
+
+ parse_bookmark_element (context,
+ parse_data,
+ attribute_names,
+ attribute_values,
+ &inner_error);
+ if (inner_error)
+ g_propagate_error (error, inner_error);
+ }
+ else
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_INVALID_CONTENT,
+ _("Unexpected tag '%s' inside '%s'"),
+ element_name,
+ XBEL_ROOT_ELEMENT);
+ break;
+ case STATE_BOOKMARK:
+ if (IS_ELEMENT (parse_data, element_name, XBEL_TITLE_ELEMENT))
+ parse_data->state = STATE_TITLE;
+ else if (IS_ELEMENT (parse_data, element_name, XBEL_DESC_ELEMENT))
+ parse_data->state = STATE_DESC;
+ else if (IS_ELEMENT (parse_data, element_name, XBEL_INFO_ELEMENT))
+ parse_data->state = STATE_INFO;
+ else
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_INVALID_CONTENT,
+ _("Unexpected tag '%s' inside '%s'"),
+ element_name,
+ XBEL_BOOKMARK_ELEMENT);
+ break;
+ case STATE_INFO:
+ if (IS_ELEMENT (parse_data, element_name, XBEL_METADATA_ELEMENT))
+ {
+ const gchar *attr;
+ gint i;
+
+ i = 0;
+ for (attr = attribute_names[i]; attr; attr = attribute_names[++i])
+ {
+ if ((IS_ATTRIBUTE (attr, XBEL_OWNER_ATTRIBUTE)) &&
+ (0 == strcmp (attribute_values[i], BOOKMARK_METADATA_OWNER)))
+ {
+ parse_data->state = STATE_METADATA;
+
+ if (!parse_data->current_item->metadata)
+ parse_data->current_item->metadata = bookmark_metadata_new ();
+ }
+ }
+ }
+ else
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_INVALID_CONTENT,
+ _("Unexpected tag '%s', tag '%s' expected"),
+ element_name,
+ XBEL_METADATA_ELEMENT);
+ break;
+ case STATE_METADATA:
+ if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_APPLICATIONS_ELEMENT))
+ parse_data->state = STATE_APPLICATIONS;
+ else if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_GROUPS_ELEMENT))
+ parse_data->state = STATE_GROUPS;
+ else if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_PRIVATE_ELEMENT))
+ parse_data->current_item->metadata->is_private = TRUE;
+ else if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_ICON_ELEMENT))
+ {
+ GError *inner_error = NULL;
+
+ parse_data->state = STATE_ICON;
+
+ parse_icon_element (context,
+ parse_data,
+ attribute_names,
+ attribute_values,
+ &inner_error);
+ if (inner_error)
+ g_propagate_error (error, inner_error);
+ }
+ else if (IS_ELEMENT_NS (parse_data, element_name, MIME_NAMESPACE_URI, MIME_TYPE_ELEMENT))
+ {
+ GError *inner_error = NULL;
+
+ parse_data->state = STATE_MIME;
+
+ parse_mime_type_element (context,
+ parse_data,
+ attribute_names,
+ attribute_values,
+ &inner_error);
+ if (inner_error)
+ g_propagate_error (error, inner_error);
+ }
+ else
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+ _("Unexpected tag '%s' inside '%s'"),
+ element_name,
+ XBEL_METADATA_ELEMENT);
+ break;
+ case STATE_APPLICATIONS:
+ if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_APPLICATION_ELEMENT))
+ {
+ GError *inner_error = NULL;
+
+ parse_data->state = STATE_APPLICATION;
+
+ parse_application_element (context,
+ parse_data,
+ attribute_names,
+ attribute_values,
+ &inner_error);
+ if (inner_error)
+ g_propagate_error (error, inner_error);
+ }
+ else
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_INVALID_CONTENT,
+ _("Unexpected tag '%s', tag '%s' expected"),
+ element_name,
+ BOOKMARK_APPLICATION_ELEMENT);
+ break;
+ case STATE_GROUPS:
+ if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_GROUP_ELEMENT))
+ parse_data->state = STATE_GROUP;
+ else
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_INVALID_CONTENT,
+ _("Unexpected tag '%s', tag '%s' expected"),
+ element_name,
+ BOOKMARK_GROUP_ELEMENT);
+ break;
+ case STATE_ICON:
+ if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_ICON_ELEMENT))
+ {
+ GError *inner_error = NULL;
+
+ parse_icon_element (context,
+ parse_data,
+ attribute_names,
+ attribute_values,
+ &inner_error);
+ if (inner_error)
+ g_propagate_error (error, inner_error);
+ }
+ else
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+ _("Unexpected tag '%s' inside '%s'"),
+ element_name,
+ XBEL_METADATA_ELEMENT);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
+
+static void
+end_element_raw_cb (GMarkupParseContext *context,
+ const gchar *element_name,
+ gpointer user_data,
+ GError **error)
+{
+ ParseData *parse_data = (ParseData *) user_data;
+
+ if (IS_ELEMENT (parse_data, element_name, XBEL_ROOT_ELEMENT))
+ parse_data->state = STATE_FINISHED;
+ else if (IS_ELEMENT (parse_data, element_name, XBEL_BOOKMARK_ELEMENT))
+ {
+ parse_data->current_item = NULL;
+
+ parse_data->state = STATE_ROOT;
+ }
+ else if ((IS_ELEMENT (parse_data, element_name, XBEL_INFO_ELEMENT)) ||
+ (IS_ELEMENT (parse_data, element_name, XBEL_TITLE_ELEMENT)) ||
+ (IS_ELEMENT (parse_data, element_name, XBEL_DESC_ELEMENT)))
+ {
+ if (parse_data->current_item)
+ parse_data->state = STATE_BOOKMARK;
+ else
+ parse_data->state = STATE_ROOT;
+ }
+ else if (IS_ELEMENT (parse_data, element_name, XBEL_METADATA_ELEMENT))
+ parse_data->state = STATE_INFO;
+ else if (IS_ELEMENT_NS (parse_data, element_name,
+ BOOKMARK_NAMESPACE_URI,
+ BOOKMARK_APPLICATION_ELEMENT))
+ parse_data->state = STATE_APPLICATIONS;
+ else if (IS_ELEMENT_NS (parse_data, element_name,
+ BOOKMARK_NAMESPACE_URI,
+ BOOKMARK_GROUP_ELEMENT))
+ parse_data->state = STATE_GROUPS;
+ else if ((IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_APPLICATIONS_ELEMENT)) ||
+ (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_GROUPS_ELEMENT)) ||
+ (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_PRIVATE_ELEMENT)) ||
+ (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_ICON_ELEMENT)) ||
+ (IS_ELEMENT_NS (parse_data, element_name, MIME_NAMESPACE_URI, MIME_TYPE_ELEMENT)))
+ parse_data->state = STATE_METADATA;
+}
+
+static void
+text_raw_cb (GMarkupParseContext *context,
+ const gchar *text,
+ gsize length,
+ gpointer user_data,
+ GError **error)
+{
+ ParseData *parse_data = (ParseData *) user_data;
+ gchar *payload;
+
+ payload = g_strndup (text, length);
+
+ switch (parse_data->state)
+ {
+ case STATE_TITLE:
+ if (parse_data->current_item)
+ {
+ g_free (parse_data->current_item->title);
+ parse_data->current_item->title = g_strdup (payload);
+ }
+ else
+ {
+ g_free (parse_data->bookmark_file->title);
+ parse_data->bookmark_file->title = g_strdup (payload);
+ }
+ break;
+ case STATE_DESC:
+ if (parse_data->current_item)
+ {
+ g_free (parse_data->current_item->description);
+ parse_data->current_item->description = g_strdup (payload);
+ }
+ else
+ {
+ g_free (parse_data->bookmark_file->description);
+ parse_data->bookmark_file->description = g_strdup (payload);
+ }
+ break;
+ case STATE_GROUP:
+ {
+ GList *groups;
+
+ g_assert (parse_data->current_item != NULL);
+
+ if (!parse_data->current_item->metadata)
+ parse_data->current_item->metadata = bookmark_metadata_new ();
+
+ groups = parse_data->current_item->metadata->groups;
+ parse_data->current_item->metadata->groups = g_list_prepend (groups, g_strdup (payload));
+ }
+ break;
+ case STATE_ROOT:
+ case STATE_BOOKMARK:
+ case STATE_INFO:
+ case STATE_METADATA:
+ case STATE_APPLICATIONS:
+ case STATE_APPLICATION:
+ case STATE_GROUPS:
+ case STATE_MIME:
+ case STATE_ICON:
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ g_free (payload);
+}
+
+static const GMarkupParser markup_parser =
+{
+ start_element_raw_cb, /* start_element */
+ end_element_raw_cb, /* end_element */
+ text_raw_cb, /* text */
+ NULL, /* passthrough */
+ NULL
+};
+
+static gboolean
+g_bookmark_file_parse (GBookmarkFile *bookmark,
+ const gchar *buffer,
+ gsize length,
+ GError **error)
+{
+ GMarkupParseContext *context;
+ ParseData *parse_data;
+ GError *parse_error, *end_error;
+ gboolean retval;
+
+ g_assert (bookmark != NULL);
+
+ if (!buffer)
+ return FALSE;
+
+ if (length == -1)
+ length = strlen (buffer);
+
+ parse_data = parse_data_new ();
+ parse_data->bookmark_file = bookmark;
+
+ context = g_markup_parse_context_new (&markup_parser,
+ 0,
+ parse_data,
+ (GDestroyNotify) parse_data_free);
+
+ parse_error = NULL;
+ retval = g_markup_parse_context_parse (context,
+ buffer,
+ length,
+ &parse_error);
+ if (!retval)
+ {
+ g_propagate_error (error, parse_error);
+
+ return FALSE;
+ }
+
+ end_error = NULL;
+ retval = g_markup_parse_context_end_parse (context, &end_error);
+ if (!retval)
+ {
+ g_propagate_error (error, end_error);
+
+ return FALSE;
+ }
+
+ g_markup_parse_context_free (context);
+
+ return TRUE;
+}
+
+static gchar *
+g_bookmark_file_dump (GBookmarkFile *bookmark,
+ gsize *length,
+ GError **error)
+{
+ GString *retval;
+ GList *l;
+
+ retval = g_string_new (NULL);
+
+ g_string_append_printf (retval,
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+#if 0
+ /* XXX - do we really need the doctype? */
+ "<!DOCTYPE %s\n"
+ " PUBLIC \"%s\"\n"
+ " \"%s\">\n"
+#endif
+ "<%s %s=\"%s\"\n"
+ " xmlns:%s=\"%s\"\n"
+ " xmlns:%s=\"%s\"\n>",
+#if 0
+ /* XXX - do we really need the doctype? */
+ XBEL_DTD_NICK,
+ XBEL_DTD_SYSTEM, XBEL_DTD_URI,
+#endif
+ XBEL_ROOT_ELEMENT,
+ XBEL_VERSION_ATTRIBUTE, XBEL_VERSION,
+ BOOKMARK_NAMESPACE_NAME, BOOKMARK_NAMESPACE_URI,
+ MIME_NAMESPACE_NAME, MIME_NAMESPACE_URI);
+
+ if (bookmark->title)
+ {
+ gchar *escaped_title;
+
+ escaped_title = g_markup_escape_text (bookmark->title, -1);
+
+ g_string_append_printf (retval, " <%s>%s</%s>\n",
+ XBEL_TITLE_ELEMENT,
+ escaped_title,
+ XBEL_TITLE_ELEMENT);
+
+ g_free (escaped_title);
+ }
+
+ if (bookmark->description)
+ {
+ gchar *escaped_desc;
+
+ escaped_desc = g_markup_escape_text (bookmark->description, -1);
+
+ g_string_append_printf (retval, " <%s>%s</%s>\n",
+ XBEL_DESC_ELEMENT,
+ escaped_desc,
+ XBEL_DESC_ELEMENT);
+
+ g_free (escaped_desc);
+ }
+
+ if (!bookmark->items)
+ goto out;
+ else
+ retval = g_string_append (retval, "\n");
+
+ for (l = g_list_last (bookmark->items);
+ l != NULL;
+ l = l->prev)
+ {
+ BookmarkItem *item = (BookmarkItem *) l->data;
+ gchar *item_dump;
+
+ item_dump = bookmark_item_dump (item);
+ if (!item_dump)
+ continue;
+
+ retval = g_string_append (retval, item_dump);
+
+ g_free (item_dump);
+ }
+
+out:
+ g_string_append_printf (retval, "</%s>", XBEL_ROOT_ELEMENT);
+
+ if (length)
+ *length = retval->len;
+
+ return g_string_free (retval, FALSE);
+}
+
+/**************
+ * Misc *
+ **************/
+
+/* converts a Unix timestamp in a ISO 8601 compliant string; you
+ * should free the returned string.
+ */
+static gchar *
+timestamp_to_iso8601 (time_t timestamp)
+{
+ GTimeVal stamp;
+
+ if (timestamp == (time_t) -1)
+ g_get_current_time (&stamp);
+ else
+ {
+ stamp.tv_sec = timestamp;
+ stamp.tv_usec = 0;
+ }
+
+ return g_time_val_to_iso8601 (&stamp);
+}
+
+static time_t
+timestamp_from_iso8601 (const gchar *iso_date)
+{
+ GTimeVal stamp;
+
+ if (!g_time_val_from_iso8601 (iso_date, &stamp))
+ return (time_t) -1;
+
+ return (time_t) stamp.tv_sec;
+}
+
+
+
+GQuark
+g_bookmark_file_error_quark (void)
+{
+ return g_quark_from_static_string ("egg-bookmark-file-error-quark");
+}
+
+
+
+/********************
+ * Public API *
+ ********************/
+
+/**
+ * g_bookmark_file_new:
+ *
+ * Creates a new empty #GBookmarkFile object.
+ *
+ * Use g_bookmark_file_load_from_file(), g_bookmark_file_load_from_data()
+ * or g_bookmark_file_load_from_data_dirs() to read an existing bookmark
+ * file.
+ *
+ * Return value: an empty #GBookmarkFile
+ *
+ * Since: 2.12
+ */
+GBookmarkFile *
+g_bookmark_file_new (void)
+{
+ GBookmarkFile *bookmark;
+
+ bookmark = g_new (GBookmarkFile, 1);
+
+ g_bookmark_file_init (bookmark);
+
+ return bookmark;
+}
+
+/**
+ * g_bookmark_file_free:
+ * @bookmark: a #GBookmarkFile
+ *
+ * Frees a #GBookmarkFile.
+ *
+ * Since: 2.12
+ */
+void
+g_bookmark_file_free (GBookmarkFile *bookmark)
+{
+ if (!bookmark)
+ return;
+
+ g_bookmark_file_clear (bookmark);
+
+ g_free (bookmark);
+}
+
+/**
+ * g_bookmark_file_load_from_data:
+ * @bookmark: an empty #GBookmarkFile struct
+ * @data: desktop bookmarks loaded in memory
+ * @length: the length of @data in bytes
+ * @error: return location for a #GError, or %NULL
+ *
+ * Loads a bookmark file from memory into an empty #GBookmarkFile
+ * structure. If the object cannot be created then @error is set to a
+ * #GBookmarkFileError.
+ *
+ * Return value: %TRUE if a desktop bookmark could be loaded.
+ *
+ * Since: 2.12
+ */
+gboolean
+g_bookmark_file_load_from_data (GBookmarkFile *bookmark,
+ const gchar *data,
+ gsize length,
+ GError **error)
+{
+ GError *parse_error;
+ gboolean retval;
+
+ g_return_val_if_fail (bookmark != NULL, FALSE);
+ g_return_val_if_fail (data != NULL, FALSE);
+ g_return_val_if_fail (length != 0, FALSE);
+
+ if (length == (gsize) -1)
+ length = strlen (data);
+
+ if (bookmark->items)
+ {
+ g_bookmark_file_clear (bookmark);
+ g_bookmark_file_init (bookmark);
+ }
+
+ parse_error = NULL;
+ retval = g_bookmark_file_parse (bookmark, data, length, &parse_error);
+ if (!retval)
+ {
+ g_propagate_error (error, parse_error);
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * g_bookmark_file_load_from_file:
+ * @bookmark: an empty #GBookmarkFile struct
+ * @filename: the path of a filename to load, in the GLib file name encoding
+ * @error: return location for a #GError, or %NULL
+ *
+ * Loads a desktop bookmark file into an empty #GBookmarkFile structure.
+ * If the file could not be loaded then @error is set to either a #GFileError
+ * or #GBookmarkFileError.
+ *
+ * Return value: %TRUE if a desktop bookmark file could be loaded
+ *
+ * Since: 2.12
+ */
+gboolean
+g_bookmark_file_load_from_file (GBookmarkFile *bookmark,
+ const gchar *filename,
+ GError **error)
+{
+ gchar *buffer;
+ gsize len;
+ GError *read_error;
+ gboolean retval;
+
+ g_return_val_if_fail (bookmark != NULL, FALSE);
+ g_return_val_if_fail (filename != NULL, FALSE);
+
+ read_error = NULL;
+ g_file_get_contents (filename, &buffer, &len, &read_error);
+ if (read_error)
+ {
+ g_propagate_error (error, read_error);
+
+ return FALSE;
+ }
+
+ read_error = NULL;
+ retval = g_bookmark_file_load_from_data (bookmark,
+ buffer,
+ len,
+ &read_error);
+ if (read_error)
+ {
+ g_propagate_error (error, read_error);
+
+ g_free (buffer);
+
+ return FALSE;
+ }
+
+ g_free (buffer);
+
+ return retval;
+}
+
+
+/* Iterates through all the directories in *dirs trying to
+ * find file. When it successfully locates file, returns a
+ * string its absolute path. It also leaves the unchecked
+ * directories in *dirs. You should free the returned string
+ *
+ * Adapted from gkeyfile.c
+ */
+static gchar *
+find_file_in_data_dirs (const gchar *file,
+ gchar ***dirs,
+ GError **error)
+{
+ gchar **data_dirs, *data_dir, *path;
+
+ path = NULL;
+
+ if (dirs == NULL)
+ return NULL;
+
+ data_dirs = *dirs;
+ path = NULL;
+ while (data_dirs && (data_dir = *data_dirs) && !path)
+ {
+ gchar *candidate_file, *sub_dir;
+
+ candidate_file = (gchar *) file;
+ sub_dir = g_strdup ("");
+ while (candidate_file != NULL && !path)
+ {
+ gchar *p;
+
+ path = g_build_filename (data_dir, sub_dir,
+ candidate_file, NULL);
+
+ candidate_file = strchr (candidate_file, '-');
+
+ if (candidate_file == NULL)
+ break;
+
+ candidate_file++;
+
+ g_free (sub_dir);
+ sub_dir = g_strndup (file, candidate_file - file - 1);
+
+ for (p = sub_dir; *p != '\0'; p++)
+ {
+ if (*p == '-')
+ *p = G_DIR_SEPARATOR;
+ }
+ }
+ g_free (sub_dir);
+ data_dirs++;
+ }
+
+ *dirs = data_dirs;
+
+ if (!path)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND,
+ _("No valid bookmark file found in data dirs"));
+
+ return NULL;
+ }
+
+ return path;
+}
+
+
+/**
+ * g_bookmark_file_load_from_data_dirs:
+ * @bookmark: a #GBookmarkFile
+ * @file: a relative path to a filename to open and parse
+ * @full_path: return location for a string containing the full path
+ * of the file, or %NULL
+ * @error: return location for a #GError, or %NULL
+ *
+ * This function looks for a desktop bookmark file named @file in the
+ * paths returned from g_get_user_data_dir() and g_get_system_data_dirs(),
+ * loads the file into @bookmark and returns the file's full path in
+ * @full_path. If the file could not be loaded then an %error is
+ * set to either a #GFileError or #GBookmarkFileError.
+ *
+ * Return value: %TRUE if a key file could be loaded, %FALSE othewise
+ *
+ * Since: 2.12
+ */
+gboolean
+g_bookmark_file_load_from_data_dirs (GBookmarkFile *bookmark,
+ const gchar *file,
+ gchar **full_path,
+ GError **error)
+{
+ GError *file_error = NULL;
+ gchar **all_data_dirs, **data_dirs;
+ const gchar *user_data_dir;
+ const gchar * const * system_data_dirs;
+ gsize i, j;
+ gchar *output_path;
+ gboolean found_file;
+
+ g_return_val_if_fail (bookmark != NULL, FALSE);
+ g_return_val_if_fail (!g_path_is_absolute (file), FALSE);
+
+ user_data_dir = g_get_user_data_dir ();
+ system_data_dirs = g_get_system_data_dirs ();
+ all_data_dirs = g_new0 (gchar *, g_strv_length ((gchar **)system_data_dirs) + 2);
+
+ i = 0;
+ all_data_dirs[i++] = g_strdup (user_data_dir);
+
+ j = 0;
+ while (system_data_dirs[j] != NULL)
+ all_data_dirs[i++] = g_strdup (system_data_dirs[j++]);
+
+ found_file = FALSE;
+ data_dirs = all_data_dirs;
+ output_path = NULL;
+ while (*data_dirs != NULL && !found_file)
+ {
+ g_free (output_path);
+
+ output_path = find_file_in_data_dirs (file, &data_dirs, &file_error);
+
+ if (file_error)
+ {
+ g_propagate_error (error, file_error);
+ break;
+ }
+
+ found_file = g_bookmark_file_load_from_file (bookmark,
+ output_path,
+ &file_error);
+ if (file_error)
+ {
+ g_propagate_error (error, file_error);
+ break;
+ }
+ }
+
+ if (found_file && full_path)
+ *full_path = output_path;
+ else
+ g_free (output_path);
+
+ g_strfreev (all_data_dirs);
+
+ return found_file;
+}
+
+
+/**
+ * g_bookmark_file_to_data:
+ * @bookmark: a #GBookmarkFile
+ * @length: return location for the length of the returned string, or %NULL
+ * @error: return location for a #GError, or %NULL
+ *
+ * This function outputs @bookmark as a string.
+ *
+ * Return value: a newly allocated string holding
+ * the contents of the #GBookmarkFile
+ *
+ * Since: 2.12
+ */
+gchar *
+g_bookmark_file_to_data (GBookmarkFile *bookmark,
+ gsize *length,
+ GError **error)
+{
+ GError *write_error = NULL;
+ gchar *retval;
+
+ g_return_val_if_fail (bookmark != NULL, NULL);
+
+ retval = g_bookmark_file_dump (bookmark, length, &write_error);
+ if (write_error)
+ {
+ g_propagate_error (error, write_error);
+
+ return NULL;
+ }
+
+ return retval;
+}
+
+/**
+ * g_bookmark_file_to_file:
+ * @bookmark: a #GBookmarkFile
+ * @filename: path of the output file
+ * @error: return location for a #GError, or %NULL
+ *
+ * This function outputs @bookmark into a file. The write process is
+ * guaranteed to be atomic by using g_file_set_contents() internally.
+ *
+ * Return value: %TRUE if the file was successfully written.
+ *
+ * Since: 2.12
+ */
+gboolean
+g_bookmark_file_to_file (GBookmarkFile *bookmark,
+ const gchar *filename,
+ GError **error)
+{
+ gchar *data;
+ GError *data_error, *write_error;
+ gsize len;
+ gboolean retval;
+
+ g_return_val_if_fail (bookmark != NULL, FALSE);
+ g_return_val_if_fail (filename != NULL, FALSE);
+
+ data_error = NULL;
+ data = g_bookmark_file_to_data (bookmark, &len, &data_error);
+ if (data_error)
+ {
+ g_propagate_error (error, data_error);
+
+ return FALSE;
+ }
+
+ write_error = NULL;
+ g_file_set_contents (filename, data, len, &write_error);
+ if (write_error)
+ {
+ g_propagate_error (error, write_error);
+
+ retval = FALSE;
+ }
+ else
+ retval = TRUE;
+
+ g_free (data);
+
+ return retval;
+}
+
+static BookmarkItem *
+g_bookmark_file_lookup_item (GBookmarkFile *bookmark,
+ const gchar *uri)
+{
+ g_assert (bookmark != NULL && uri != NULL);
+
+ return g_hash_table_lookup (bookmark->items_by_uri, uri);
+}
+
+/* this function adds a new item to the list */
+static void
+g_bookmark_file_add_item (GBookmarkFile *bookmark,
+ BookmarkItem *item,
+ GError **error)
+{
+ g_assert (bookmark != NULL);
+ g_assert (item != NULL);
+
+ /* this should never happen; and if it does, then we are
+ * screwing up something big time.
+ */
+ if (G_UNLIKELY (g_bookmark_file_has_item (bookmark, item->uri)))
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_INVALID_URI,
+ _("A bookmark for URI '%s' already exists"),
+ item->uri);
+ return;
+ }
+
+ bookmark->items = g_list_prepend (bookmark->items, item);
+
+ g_hash_table_replace (bookmark->items_by_uri,
+ item->uri,
+ item);
+
+ if (item->added == (time_t) -1)
+ item->added = time (NULL);
+
+ if (item->modified == (time_t) -1)
+ item->modified = time (NULL);
+}
+
+/**
+ * g_bookmark_file_remove_item:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @error: return location for a #GError, or %NULL
+ *
+ * Removes the bookmark for @uri from the bookmark file @bookmark.
+ *
+ * Return value: %TRUE if the bookmark was removed successfully.
+ *
+ * Since: 2.12
+ */
+gboolean
+g_bookmark_file_remove_item (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error)
+{
+ BookmarkItem *item;
+
+ g_return_val_if_fail (bookmark != NULL, FALSE);
+ g_return_val_if_fail (uri != NULL, FALSE);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return FALSE;
+ }
+
+ bookmark->items = g_list_remove (bookmark->items, item);
+ g_hash_table_remove (bookmark->items_by_uri, item->uri);
+
+ bookmark_item_free (item);
+
+ return TRUE;
+}
+
+/**
+ * g_bookmark_file_has_item:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ *
+ * Looks whether the desktop bookmark has an item with its URI set to @uri.
+ *
+ * Return value: %TRUE if @uri is inside @bookmark, %FALSE otherwise
+ *
+ * Since: 2.12
+ */
+gboolean
+g_bookmark_file_has_item (GBookmarkFile *bookmark,
+ const gchar *uri)
+{
+ g_return_val_if_fail (bookmark != NULL, FALSE);
+ g_return_val_if_fail (uri != NULL, FALSE);
+
+ return (NULL != g_hash_table_lookup (bookmark->items_by_uri, uri));
+}
+
+/**
+ * g_bookmark_file_get_uris:
+ * @bookmark: a #GBookmarkFile
+ * @length: return location for the number of returned URIs, or %NULL
+ *
+ * Returns all URIs of the bookmarks in the bookmark file @bookmark.
+ * The array of returned URIs will be %NULL-terminated, so @length may
+ * optionally be %NULL.
+ *
+ * Return value: a newly allocated %NULL-terminated array of strings.
+ * Use g_strfreev() to free it.
+ *
+ * Since: 2.12
+ */
+gchar **
+g_bookmark_file_get_uris (GBookmarkFile *bookmark,
+ gsize *length)
+{
+ GList *l;
+ gchar **uris;
+ gsize i, n_items;
+
+ g_return_val_if_fail (bookmark != NULL, NULL);
+
+ n_items = g_list_length (bookmark->items);
+ uris = g_new0 (gchar *, n_items + 1);
+
+ for (l = g_list_last (bookmark->items), i = 0; l != NULL; l = l->prev)
+ {
+ BookmarkItem *item = (BookmarkItem *) l->data;
+
+ g_assert (item != NULL);
+
+ uris[i++] = g_strdup (item->uri);
+ }
+ uris[i] = NULL;
+
+ if (length)
+ *length = i;
+
+ return uris;
+}
+
+/**
+ * g_bookmark_file_set_title:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI or %NULL
+ * @title: a UTF-8 encoded string
+ *
+ * Sets @title as the title of the bookmark for @uri inside the
+ * bookmark file @bookmark.
+ *
+ * If @uri is %NULL, the title of @bookmark is set.
+ *
+ * If a bookmark for @uri cannot be found then it is created.
+ *
+ * Since: 2.12
+ */
+void
+g_bookmark_file_set_title (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *title)
+{
+ g_return_if_fail (bookmark != NULL);
+
+ if (!uri)
+ {
+ g_free (bookmark->title);
+ bookmark->title = g_strdup (title);
+ }
+ else
+ {
+ BookmarkItem *item;
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ item = bookmark_item_new (uri);
+ g_bookmark_file_add_item (bookmark, item, NULL);
+ }
+
+ g_free (item->title);
+ item->title = g_strdup (title);
+
+ item->modified = time (NULL);
+ }
+}
+
+/**
+ * g_bookmark_file_get_title:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI or %NULL
+ * @error: return location for a #GError, or %NULL
+ *
+ * Returns the title of the bookmark for @uri.
+ *
+ * If @uri is %NULL, the title of @bookmark is returned.
+ *
+ * In the event the URI cannot be found, %NULL is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.
+ *
+ * Return value: a newly allocated string or %NULL if the specified
+ * URI cannot be found.
+ *
+ * Since: 2.12
+ */
+gchar *
+g_bookmark_file_get_title (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error)
+{
+ BookmarkItem *item;
+
+ g_return_val_if_fail (bookmark != NULL, NULL);
+
+ if (!uri)
+ return g_strdup (bookmark->title);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return NULL;
+ }
+
+ return g_strdup (item->title);
+}
+
+/**
+ * g_bookmark_file_set_description:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI or %NULL
+ * @description: a string
+ *
+ * Sets @description as the description of the bookmark for @uri.
+ *
+ * If @uri is %NULL, the description of @bookmark is set.
+ *
+ * If a bookmark for @uri cannot be found then it is created.
+ *
+ * Since: 2.12
+ */
+void
+g_bookmark_file_set_description (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *description)
+{
+ g_return_if_fail (bookmark != NULL);
+
+ if (!uri)
+ {
+ g_free (bookmark->description);
+ bookmark->description = g_strdup (description);
+ }
+ else
+ {
+ BookmarkItem *item;
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ item = bookmark_item_new (uri);
+ g_bookmark_file_add_item (bookmark, item, NULL);
+ }
+
+ g_free (item->description);
+ item->description = g_strdup (description);
+
+ item->modified = time (NULL);
+ }
+}
+
+/**
+ * g_bookmark_file_get_description:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @error: return location for a #GError, or %NULL
+ *
+ * Retrieves the description of the bookmark for @uri.
+ *
+ * In the event the URI cannot be found, %NULL is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.
+ *
+ * Return value: a newly allocated string or %NULL if the specified
+ * URI cannot be found.
+ *
+ * Since: 2.12
+ */
+gchar *
+g_bookmark_file_get_description (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error)
+{
+ BookmarkItem *item;
+
+ g_return_val_if_fail (bookmark != NULL, NULL);
+
+ if (!uri)
+ return g_strdup (bookmark->description);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return NULL;
+ }
+
+ return g_strdup (item->description);
+}
+
+/**
+ * g_bookmark_file_set_mime_type:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @mime_type: a MIME type
+ *
+ * Sets @mime_type as the MIME type of the bookmark for @uri.
+ *
+ * If a bookmark for @uri cannot be found then it is created.
+ *
+ * Since: 2.12
+ */
+void
+g_bookmark_file_set_mime_type (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *mime_type)
+{
+ BookmarkItem *item;
+
+ g_return_if_fail (bookmark != NULL);
+ g_return_if_fail (uri != NULL);
+ g_return_if_fail (mime_type != NULL);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ item = bookmark_item_new (uri);
+ g_bookmark_file_add_item (bookmark, item, NULL);
+ }
+
+ if (!item->metadata)
+ item->metadata = bookmark_metadata_new ();
+
+ g_free (item->metadata->mime_type);
+
+ item->metadata->mime_type = g_strdup (mime_type);
+ item->modified = time (NULL);
+}
+
+/**
+ * g_bookmark_file_get_mime_type:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @error: return location for a #GError, or %NULL
+ *
+ * Retrieves the MIME type of the resource pointed by @uri.
+ *
+ * In the event the URI cannot be found, %NULL is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. In the
+ * event that the MIME type cannot be found, %NULL is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_INVALID_VALUE.
+ *
+ * Return value: a newly allocated string or %NULL if the specified
+ * URI cannot be found.
+ *
+ * Since: 2.12
+ */
+gchar *
+g_bookmark_file_get_mime_type (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error)
+{
+ BookmarkItem *item;
+
+ g_return_val_if_fail (bookmark != NULL, NULL);
+ g_return_val_if_fail (uri != NULL, NULL);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return NULL;
+ }
+
+ if (!item->metadata)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_INVALID_VALUE,
+ _("No MIME type defined in the bookmark for URI '%s'"),
+ uri);
+ return NULL;
+ }
+
+ return g_strdup (item->metadata->mime_type);
+}
+
+/**
+ * g_bookmark_file_set_is_private:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @is_private: %TRUE if the bookmark should be marked as private
+ *
+ * Sets the private flag of the bookmark for @uri.
+ *
+ * If a bookmark for @uri cannot be found then it is created.
+ *
+ * Since: 2.12
+ */
+void
+g_bookmark_file_set_is_private (GBookmarkFile *bookmark,
+ const gchar *uri,
+ gboolean is_private)
+{
+ BookmarkItem *item;
+
+ g_return_if_fail (bookmark != NULL);
+ g_return_if_fail (uri != NULL);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ item = bookmark_item_new (uri);
+ g_bookmark_file_add_item (bookmark, item, NULL);
+ }
+
+ if (!item->metadata)
+ item->metadata = bookmark_metadata_new ();
+
+ item->metadata->is_private = (is_private == TRUE);
+ item->modified = time (NULL);
+}
+
+/**
+ * g_bookmark_file_get_is_private:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @error: return location for a #GError, or %NULL
+ *
+ * Gets whether the private flag of the bookmark for @uri is set.
+ *
+ * In the event the URI cannot be found, %FALSE is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. In the
+ * event that the private flag cannot be found, %FALSE is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_INVALID_VALUE.
+ *
+ * Return value: %TRUE if the private flag is set, %FALSE otherwise.
+ *
+ * Since: 2.12
+ */
+gboolean
+g_bookmark_file_get_is_private (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error)
+{
+ BookmarkItem *item;
+
+ g_return_val_if_fail (bookmark != NULL, FALSE);
+ g_return_val_if_fail (uri != NULL, FALSE);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return FALSE;
+ }
+
+ if (!item->metadata)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_INVALID_VALUE,
+ _("No private flag has been defined in bookmark for URI '%s'"),
+ uri);
+ return FALSE;
+ }
+
+ return item->metadata->is_private;
+}
+
+/**
+ * g_bookmark_file_set_added:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @added: a timestamp or -1 to use the current time
+ *
+ * Sets the time the bookmark for @uri was added into @bookmark.
+ *
+ * If no bookmark for @uri is found then it is created.
+ *
+ * Since: 2.12
+ */
+void
+g_bookmark_file_set_added (GBookmarkFile *bookmark,
+ const gchar *uri,
+ time_t added)
+{
+ BookmarkItem *item;
+
+ g_return_if_fail (bookmark != NULL);
+ g_return_if_fail (uri != NULL);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ item = bookmark_item_new (uri);
+ g_bookmark_file_add_item (bookmark, item, NULL);
+ }
+
+ if (added == (time_t) -1)
+ time (&added);
+
+ item->added = added;
+ item->modified = added;
+}
+
+/**
+ * g_bookmark_file_get_added:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @error: return location for a #GError, or %NULL
+ *
+ * Gets the time the bookmark for @uri was added to @bookmark
+ *
+ * In the event the URI cannot be found, -1 is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.
+ *
+ * Return value: a timestamp
+ *
+ * Since: 2.12
+ */
+time_t
+g_bookmark_file_get_added (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error)
+{
+ BookmarkItem *item;
+
+ g_return_val_if_fail (bookmark != NULL, (time_t) -1);
+ g_return_val_if_fail (uri != NULL, (time_t) -1);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return (time_t) -1;
+ }
+
+ return item->added;
+}
+
+/**
+ * g_bookmark_file_set_modified:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @modified: a timestamp or -1 to use the current time
+ *
+ * Sets the last time the bookmark for @uri was last modified.
+ *
+ * If no bookmark for @uri is found then it is created.
+ *
+ * The "modified" time should only be set when the bookmark's meta-data
+ * was actually changed. Every function of #GBookmarkFile that
+ * modifies a bookmark also changes the modification time, except for
+ * g_bookmark_file_set_visited().
+ *
+ * Since: 2.12
+ */
+void
+g_bookmark_file_set_modified (GBookmarkFile *bookmark,
+ const gchar *uri,
+ time_t modified)
+{
+ BookmarkItem *item;
+
+ g_return_if_fail (bookmark != NULL);
+ g_return_if_fail (uri != NULL);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ item = bookmark_item_new (uri);
+ g_bookmark_file_add_item (bookmark, item, NULL);
+ }
+
+ if (modified == (time_t) -1)
+ time (&modified);
+
+ item->modified = modified;
+}
+
+/**
+ * g_bookmark_file_get_modified:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @error: return location for a #GError, or %NULL
+ *
+ * Gets the time when the bookmark for @uri was last modified.
+ *
+ * In the event the URI cannot be found, -1 is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.
+ *
+ * Return value: a timestamp
+ *
+ * Since: 2.12
+ */
+time_t
+g_bookmark_file_get_modified (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error)
+{
+ BookmarkItem *item;
+
+ g_return_val_if_fail (bookmark != NULL, (time_t) -1);
+ g_return_val_if_fail (uri != NULL, (time_t) -1);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return (time_t) -1;
+ }
+
+ return item->modified;
+}
+
+/**
+ * g_bookmark_file_set_visited:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @visited: a timestamp or -1 to use the current time
+ *
+ * Sets the time the bookmark for @uri was last visited.
+ *
+ * If no bookmark for @uri is found then it is created.
+ *
+ * The "visited" time should only be set if the bookmark was launched,
+ * either using the command line retrieved by g_bookmark_file_get_app_info()
+ * or by the default application for the bookmark's MIME type, retrieved
+ * using g_bookmark_file_get_mime_type(). Changing the "visited" time
+ * does not affect the "modified" time.
+ *
+ * Since: 2.12
+ */
+void
+g_bookmark_file_set_visited (GBookmarkFile *bookmark,
+ const gchar *uri,
+ time_t visited)
+{
+ BookmarkItem *item;
+
+ g_return_if_fail (bookmark != NULL);
+ g_return_if_fail (uri != NULL);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ item = bookmark_item_new (uri);
+ g_bookmark_file_add_item (bookmark, item, NULL);
+ }
+
+ if (visited == (time_t) -1)
+ time (&visited);
+
+ item->visited = visited;
+}
+
+/**
+ * g_bookmark_file_get_visited:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @error: return location for a #GError, or %NULL
+ *
+ * Gets the time the bookmark for @uri was last visited.
+ *
+ * In the event the URI cannot be found, -1 is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.
+ *
+ * Return value: a timestamp.
+ *
+ * Since: 2.12
+ */
+time_t
+g_bookmark_file_get_visited (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error)
+{
+ BookmarkItem *item;
+
+ g_return_val_if_fail (bookmark != NULL, (time_t) -1);
+ g_return_val_if_fail (uri != NULL, (time_t) -1);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return (time_t) -1;
+ }
+
+ return item->visited;
+}
+
+/**
+ * g_bookmark_file_has_group:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @group: the group name to be searched
+ * @error: return location for a #GError, or %NULL
+ *
+ * Checks whether @group appears in the list of groups to which
+ * the bookmark for @uri belongs to.
+ *
+ * In the event the URI cannot be found, %FALSE is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.
+ *
+ * Return value: %TRUE if @group was found.
+ *
+ * Since: 2.12
+ */
+gboolean
+g_bookmark_file_has_group (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *group,
+ GError **error)
+{
+ BookmarkItem *item;
+ GList *l;
+
+ g_return_val_if_fail (bookmark != NULL, FALSE);
+ g_return_val_if_fail (uri != NULL, FALSE);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return FALSE;
+ }
+
+ if (!item->metadata)
+ return FALSE;
+
+ for (l = item->metadata->groups; l != NULL; l = l->next)
+ {
+ if (strcmp (l->data, group) == 0)
+ return TRUE;
+ }
+
+ return FALSE;
+
+}
+
+/**
+ * g_bookmark_file_add_group:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @group: the group name to be added
+ *
+ * Adds @group to the list of groups to which the bookmark for @uri
+ * belongs to.
+ *
+ * If no bookmark for @uri is found then it is created.
+ *
+ * Since: 2.12
+ */
+void
+g_bookmark_file_add_group (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *group)
+{
+ BookmarkItem *item;
+
+ g_return_if_fail (bookmark != NULL);
+ g_return_if_fail (uri != NULL);
+ g_return_if_fail (group != NULL && group[0] != '\0');
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ item = bookmark_item_new (uri);
+ g_bookmark_file_add_item (bookmark, item, NULL);
+ }
+
+ if (!item->metadata)
+ item->metadata = bookmark_metadata_new ();
+
+ if (!g_bookmark_file_has_group (bookmark, uri, group, NULL))
+ {
+ item->metadata->groups = g_list_prepend (item->metadata->groups,
+ g_strdup (group));
+
+ item->modified = time (NULL);
+ }
+}
+
+/**
+ * g_bookmark_file_remove_group:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @group: the group name to be removed
+ * @error: return location for a #GError, or %NULL
+ *
+ * Removes @group from the list of groups to which the bookmark
+ * for @uri belongs to.
+ *
+ * In the event the URI cannot be found, %FALSE is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.
+ * In the event no group was defined, %FALSE is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_INVALID_VALUE.
+ *
+ * Return value: %TRUE if @group was successfully removed.
+ *
+ * Since: 2.12
+ */
+gboolean
+g_bookmark_file_remove_group (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *group,
+ GError **error)
+{
+ BookmarkItem *item;
+ GList *l;
+
+ g_return_val_if_fail (bookmark != NULL, FALSE);
+ g_return_val_if_fail (uri != NULL, FALSE);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return FALSE;
+ }
+
+ if (!item->metadata)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_INVALID_VALUE,
+ _("No groups set in bookmark for URI '%s'"),
+ uri);
+ return FALSE;
+ }
+
+ for (l = item->metadata->groups; l != NULL; l = l->next)
+ {
+ if (strcmp (l->data, group) == 0)
+ {
+ item->metadata->groups = g_list_remove_link (item->metadata->groups, l);
+ g_free (l->data);
+ g_list_free_1 (l);
+
+ item->modified = time (NULL);
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+/**
+ * g_bookmark_file_set_groups:
+ * @bookmark: a #GBookmarkFile
+ * @uri: an item's URI
+ * @groups: an array of group names, or %NULL to remove all groups
+ * @length: number of group name values in @groups
+ *
+ * Sets a list of group names for the item with URI @uri. Each previously
+ * set group name list is removed.
+ *
+ * If @uri cannot be found then an item for it is created.
+ *
+ * Since: 2.12
+ */
+void
+g_bookmark_file_set_groups (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar **groups,
+ gsize length)
+{
+ BookmarkItem *item;
+ gsize i;
+
+ g_return_if_fail (bookmark != NULL);
+ g_return_if_fail (uri != NULL);
+ g_return_if_fail (groups != NULL);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ item = bookmark_item_new (uri);
+ g_bookmark_file_add_item (bookmark, item, NULL);
+ }
+
+ if (!item->metadata)
+ item->metadata = bookmark_metadata_new ();
+
+ if (item->metadata->groups != NULL)
+ {
+ g_list_foreach (item->metadata->groups,
+ (GFunc) g_free,
+ NULL);
+ g_list_free (item->metadata->groups);
+ item->metadata->groups = NULL;
+ }
+
+ if (groups)
+ {
+ for (i = 0; groups[i] != NULL && i < length; i++)
+ item->metadata->groups = g_list_append (item->metadata->groups,
+ g_strdup (groups[i]));
+ }
+
+ item->modified = time (NULL);
+}
+
+/**
+ * g_bookmark_file_get_groups:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @length: return location for the length of the returned string, or %NULL
+ * @error: return location for a #GError, or %NULL
+ *
+ * Retrieves the list of group names of the bookmark for @uri.
+ *
+ * In the event the URI cannot be found, %NULL is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.
+ *
+ * The returned array is %NULL terminated, so @length may optionally
+ * be %NULL.
+ *
+ * Return value: a newly allocated %NULL-terminated array of group names.
+ * Use g_strfreev() to free it.
+ *
+ * Since: 2.12
+ */
+gchar **
+g_bookmark_file_get_groups (GBookmarkFile *bookmark,
+ const gchar *uri,
+ gsize *length,
+ GError **error)
+{
+ BookmarkItem *item;
+ GList *l;
+ gsize len, i;
+ gchar **retval;
+
+ g_return_val_if_fail (bookmark != NULL, NULL);
+ g_return_val_if_fail (uri != NULL, NULL);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return NULL;
+ }
+
+ if (!item->metadata)
+ {
+ if (length)
+ *length = 0;
+
+ return NULL;
+ }
+
+ len = g_list_length (item->metadata->groups);
+ retval = g_new0 (gchar *, len + 1);
+ for (l = g_list_last (item->metadata->groups), i = 0;
+ l != NULL;
+ l = l->prev)
+ {
+ gchar *group_name = (gchar *) l->data;
+
+ g_assert (group_name != NULL);
+
+ retval[i++] = g_strdup (group_name);
+ }
+ retval[i] = NULL;
+
+ if (length)
+ *length = len;
+
+ return retval;
+}
+
+/**
+ * g_bookmark_file_add_application:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @name: the name of the application registering the bookmark
+ * or %NULL
+ * @exec: command line to be used to launch the bookmark or %NULL
+ *
+ * Adds the application with @name and @exec to the list of
+ * applications that have registered a bookmark for @uri into
+ * @bookmark.
+ *
+ * Every bookmark inside a #GBookmarkFile must have at least an
+ * application registered. Each application must provide a name, a
+ * command line useful for launching the bookmark, the number of times
+ * the bookmark has been registered by the application and the last
+ * time the application registered this bookmark.
+ *
+ * If @name is %NULL, the name of the application will be the
+ * same returned by g_get_application(); if @exec is %NULL, the
+ * command line will be a composition of the program name as
+ * returned by g_get_prgname() and the "%u" modifier, which will be
+ * expanded to the bookmark's URI.
+ *
+ * This function will automatically take care of updating the
+ * registrations count and timestamping in case an application
+ * with the same @name had already registered a bookmark for
+ * @uri inside @bookmark.
+ *
+ * If no bookmark for @uri is found, one is created.
+ *
+ * Since: 2.12
+ */
+void
+g_bookmark_file_add_application (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *name,
+ const gchar *exec)
+{
+ BookmarkItem *item;
+ gchar *app_name, *app_exec;
+
+ g_return_if_fail (bookmark != NULL);
+ g_return_if_fail (uri != NULL);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ item = bookmark_item_new (uri);
+ g_bookmark_file_add_item (bookmark, item, NULL);
+ }
+
+ if (name && name[0] != '\0')
+ app_name = g_strdup (name);
+ else
+ app_name = g_strdup (g_get_application_name ());
+
+ if (exec && exec[0] != '\0')
+ app_exec = g_strdup (exec);
+ else
+ app_exec = g_strjoin (" ", g_get_prgname(), "%u", NULL);
+
+ g_bookmark_file_set_app_info (bookmark, uri,
+ app_name,
+ app_exec,
+ -1,
+ (time_t) -1,
+ NULL);
+
+ g_free (app_exec);
+ g_free (app_name);
+}
+
+/**
+ * g_bookmark_file_remove_application:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @name: the name of the application
+ * @error: return location for a #GError or %NULL
+ *
+ * Removes application registered with @name from the list of applications
+ * that have registered a bookmark for @uri inside @bookmark.
+ *
+ * In the event the URI cannot be found, %FALSE is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.
+ * In the event that no application with name @app_name has registered
+ * a bookmark for @uri, %FALSE is returned and error is set to
+ * #G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED.
+ *
+ * Return value: %TRUE if the application was successfully removed.
+ *
+ * Since: 2.12
+ */
+gboolean
+g_bookmark_file_remove_application (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *name,
+ GError **error)
+{
+ GError *set_error;
+ gboolean retval;
+
+ g_return_val_if_fail (bookmark != NULL, FALSE);
+ g_return_val_if_fail (uri != NULL, FALSE);
+ g_return_val_if_fail (name != NULL, FALSE);
+
+ set_error = NULL;
+ retval = g_bookmark_file_set_app_info (bookmark, uri,
+ name,
+ "",
+ 0,
+ (time_t) -1,
+ &set_error);
+ if (set_error)
+ {
+ g_propagate_error (error, set_error);
+
+ return FALSE;
+ }
+
+ return retval;
+}
+
+/**
+ * g_bookmark_file_has_application:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @name: the name of the application
+ * @error: return location for a #GError or %NULL
+ *
+ * Checks whether the bookmark for @uri inside @bookmark has been
+ * registered by application @name.
+ *
+ * In the event the URI cannot be found, %FALSE is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.
+ *
+ * Return value: %TRUE if the application @name was found
+ *
+ * Since: 2.12
+ */
+gboolean
+g_bookmark_file_has_application (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *name,
+ GError **error)
+{
+ BookmarkItem *item;
+
+ g_return_val_if_fail (bookmark != NULL, FALSE);
+ g_return_val_if_fail (uri != NULL, FALSE);
+ g_return_val_if_fail (name != NULL, FALSE);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return FALSE;
+ }
+
+ return (NULL != bookmark_item_lookup_app_info (item, name));
+}
+
+/**
+ * g_bookmark_file_set_app_info:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @name: an application's name
+ * @exec: an application's command line
+ * @count: the number of registrations done for this application
+ * @stamp: the time of the last registration for this application
+ * @error: return location for a #GError or %NULL
+ *
+ * Sets the meta-data of application @name inside the list of
+ * applications that have registered a bookmark for @uri inside
+ * @bookmark.
+ *
+ * You should rarely use this function; use g_bookmark_file_add_application()
+ * and g_bookmark_file_remove_application() instead.
+ *
+ * @name can be any UTF-8 encoded string used to identify an
+ * application.
+ * @exec can have one of these two modifiers: "%f", which will
+ * be expanded as the local file name retrieved from the bookmark's
+ * URI; "%u", which will be expanded as the bookmark's URI.
+ * The expansion is done automatically when retrieving the stored
+ * command line using the g_bookmark_file_get_app_info() function.
+ * @count is the number of times the application has registered the
+ * bookmark; if is < 0, the current registration count will be increased
+ * by one, if is 0, the application with @name will be removed from
+ * the list of registered applications.
+ * @stamp is the Unix time of the last registration; if it is -1, the
+ * current time will be used.
+ *
+ * If you try to remove an application by setting its registration count to
+ * zero, and no bookmark for @uri is found, %FALSE is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND; similarly,
+ * in the event that no application @name has registered a bookmark
+ * for @uri, %FALSE is returned and error is set to
+ * #G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED. Otherwise, if no bookmark
+ * for @uri is found, one is created.
+ *
+ * Return value: %TRUE if the application's meta-data was successfully
+ * changed.
+ *
+ * Since: 2.12
+ */
+gboolean
+g_bookmark_file_set_app_info (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *name,
+ const gchar *exec,
+ gint count,
+ time_t stamp,
+ GError **error)
+{
+ BookmarkItem *item;
+ BookmarkAppInfo *ai;
+
+ g_return_val_if_fail (bookmark != NULL, FALSE);
+ g_return_val_if_fail (uri != NULL, FALSE);
+ g_return_val_if_fail (name != NULL, FALSE);
+ g_return_val_if_fail (exec != NULL, FALSE);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ if (count == 0)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return FALSE;
+ }
+ else
+ {
+ item = bookmark_item_new (uri);
+ g_bookmark_file_add_item (bookmark, item, NULL);
+ }
+ }
+
+ ai = bookmark_item_lookup_app_info (item, name);
+ if (!ai)
+ {
+ if (count == 0)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED,
+ _("No application with name '%s' registered a bookmark for '%s'"),
+ name,
+ uri);
+ return FALSE;
+ }
+ else
+ {
+ ai = bookmark_app_info_new (name);
+
+ item->metadata->applications = g_list_prepend (item->metadata->applications, ai);
+ g_hash_table_replace (item->metadata->apps_by_name, ai->name, ai);
+ }
+ }
+
+ if (count == 0)
+ {
+ item->metadata->applications = g_list_remove (item->metadata->applications, ai);
+ g_hash_table_remove (item->metadata->apps_by_name, ai->name);
+ bookmark_app_info_free (ai);
+
+ item->modified = time (NULL);
+
+ return TRUE;
+ }
+ else if (count > 0)
+ ai->count = count;
+ else
+ ai->count += 1;
+
+ if (stamp != (time_t) -1)
+ ai->stamp = stamp;
+ else
+ ai->stamp = time (NULL);
+
+ if (exec && exec[0] != '\0')
+ {
+ g_free (ai->exec);
+ ai->exec = g_shell_quote (exec);
+ }
+
+ item->modified = time (NULL);
+
+ return TRUE;
+}
+
+/* expands the application's command line */
+static gchar *
+expand_exec_line (const gchar *exec_fmt,
+ const gchar *uri)
+{
+ GString *exec;
+ gchar ch;
+
+ exec = g_string_new (NULL);
+ while ((ch = *exec_fmt++) != '\0')
+ {
+ if (ch != '%')
+ {
+ exec = g_string_append_c (exec, ch);
+ continue;
+ }
+
+ ch = *exec_fmt++;
+ switch (ch)
+ {
+ case '\0':
+ goto out;
+ case 'U':
+ case 'u':
+ g_string_append (exec, uri);
+ break;
+ case 'F':
+ case 'f':
+ {
+ gchar *file = g_filename_from_uri (uri, NULL, NULL);
+ if (file)
+ {
+ g_string_append (exec, file);
+ g_free (file);
+ }
+ else
+ {
+ g_string_free (exec, TRUE);
+ return NULL;
+ }
+ }
+ break;
+ case '%':
+ default:
+ exec = g_string_append_c (exec, ch);
+ break;
+ }
+ }
+
+ out:
+ return g_string_free (exec, FALSE);
+}
+
+/**
+ * g_bookmark_file_get_app_info:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @name: an application's name
+ * @exec: location for the command line of the application, or %NULL
+ * @count: return location for the registration count, or %NULL
+ * @stamp: return location for the last registration time, or %NULL
+ * @error: return location for a #GError, or %NULL
+ *
+ * Gets the registration informations of @app_name for the bookmark for
+ * @uri. See g_bookmark_file_set_app_info() for more informations about
+ * the returned data.
+ *
+ * The string returned in @app_exec must be freed.
+ *
+ * In the event the URI cannot be found, %FALSE is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. In the
+ * event that no application with name @app_name has registered a bookmark
+ * for @uri, %FALSE is returned and error is set to
+ * #G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED. In the event that unquoting
+ * the command line fails, an error of the #G_SHELL_ERROR domain is
+ * set and %FALSE is returned.
+ *
+ * Return value: %TRUE on success.
+ *
+ * Since: 2.12
+ */
+gboolean
+g_bookmark_file_get_app_info (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *name,
+ gchar **exec,
+ guint *count,
+ time_t *stamp,
+ GError **error)
+{
+ BookmarkItem *item;
+ BookmarkAppInfo *ai;
+
+ g_return_val_if_fail (bookmark != NULL, FALSE);
+ g_return_val_if_fail (uri != NULL, FALSE);
+ g_return_val_if_fail (name != NULL, FALSE);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return FALSE;
+ }
+
+ ai = bookmark_item_lookup_app_info (item, name);
+ if (!ai)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED,
+ _("No application with name '%s' registered a bookmark for '%s'"),
+ name,
+ uri);
+ return FALSE;
+ }
+
+ if (exec)
+ {
+ GError *unquote_error = NULL;
+ gchar *command_line;
+
+ command_line = g_shell_unquote (ai->exec, &unquote_error);
+ if (unquote_error)
+ {
+ g_propagate_error (error, unquote_error);
+ return FALSE;
+ }
+
+ *exec = expand_exec_line (command_line, uri);
+ if (!*exec)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_INVALID_URI,
+ _("Failed to expand exec line '%s' with URI '%s'"),
+ ai->exec, uri);
+ g_free (command_line);
+
+ return FALSE;
+ }
+ else
+ g_free (command_line);
+ }
+
+ if (count)
+ *count = ai->count;
+
+ if (stamp)
+ *stamp = ai->stamp;
+
+ return TRUE;
+}
+
+/**
+ * g_bookmark_file_get_applications:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @length: return location of the length of the returned list, or %NULL
+ * @error: return location for a #GError, or %NULL
+ *
+ * Retrieves the names of the applications that have registered the
+ * bookmark for @uri.
+ *
+ * In the event the URI cannot be found, %NULL is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.
+ *
+ * Return value: a newly allocated %NULL-terminated array of strings.
+ * Use g_strfreev() to free it.
+ *
+ * Since: 2.12
+ */
+gchar **
+g_bookmark_file_get_applications (GBookmarkFile *bookmark,
+ const gchar *uri,
+ gsize *length,
+ GError **error)
+{
+ BookmarkItem *item;
+ GList *l;
+ gchar **apps;
+ gsize i, n_apps;
+
+ g_return_val_if_fail (bookmark != NULL, NULL);
+ g_return_val_if_fail (uri != NULL, NULL);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return NULL;
+ }
+
+ if (!item->metadata)
+ {
+ if (length)
+ *length = 0;
+
+ return NULL;
+ }
+
+ n_apps = g_list_length (item->metadata->applications);
+ apps = g_new0 (gchar *, n_apps + 1);
+
+ for (l = g_list_last (item->metadata->applications), i = 0;
+ l != NULL;
+ l = l->prev)
+ {
+ BookmarkAppInfo *ai;
+
+ ai = (BookmarkAppInfo *) l->data;
+
+ g_assert (ai != NULL);
+ g_assert (ai->name != NULL);
+
+ apps[i++] = g_strdup (ai->name);
+ }
+ apps[i] = NULL;
+
+ if (length)
+ *length = i;
+
+ return apps;
+}
+
+/**
+ * g_bookmark_file_get_size:
+ * @bookmark: a #GBookmarkFile
+ *
+ * Gets the number of bookmarks inside @bookmark.
+ *
+ * Return value: the number of bookmarks
+ *
+ * Since: 2.12
+ */
+gint
+g_bookmark_file_get_size (GBookmarkFile *bookmark)
+{
+ g_return_val_if_fail (bookmark != NULL, 0);
+
+ return g_list_length (bookmark->items);
+}
+
+/**
+ * g_bookmark_file_move_item:
+ * @bookmark: a #GBookmarkFile
+ * @old_uri: a valid URI
+ * @new_uri: a valid URI, or %NULL
+ * @error: return location for a #GError or %NULL
+ *
+ * Changes the URI of a bookmark item from @old_uri to @new_uri. Any
+ * existing bookmark for @new_uri will be overwritten. If @new_uri is
+ * %NULL, then the bookmark is removed.
+ *
+ * In the event the URI cannot be found, %FALSE is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.
+ *
+ * Return value: %TRUE if the URI was successfully changed
+ *
+ * Since: 2.12
+ */
+gboolean
+g_bookmark_file_move_item (GBookmarkFile *bookmark,
+ const gchar *old_uri,
+ const gchar *new_uri,
+ GError **error)
+{
+ BookmarkItem *item;
+ GError *remove_error;
+
+ g_return_val_if_fail (bookmark != NULL, FALSE);
+ g_return_val_if_fail (old_uri != NULL, FALSE);
+
+ item = g_bookmark_file_lookup_item (bookmark, old_uri);
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ old_uri);
+ return FALSE;
+ }
+
+ if (new_uri && new_uri[0] != '\0')
+ {
+ if (g_bookmark_file_has_item (bookmark, new_uri))
+ {
+ remove_error = NULL;
+ g_bookmark_file_remove_item (bookmark, new_uri, &remove_error);
+ if (remove_error)
+ {
+ g_propagate_error (error, remove_error);
+
+ return FALSE;
+ }
+ }
+
+ g_hash_table_steal (bookmark->items_by_uri, item->uri);
+
+ g_free (item->uri);
+ item->uri = g_strdup (new_uri);
+ item->modified = time (NULL);
+
+ g_hash_table_replace (bookmark->items_by_uri, item->uri, item);
+
+ return TRUE;
+ }
+ else
+ {
+ remove_error = NULL;
+ g_bookmark_file_remove_item (bookmark, old_uri, &remove_error);
+ if (remove_error)
+ {
+ g_propagate_error (error, remove_error);
+
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+}
+
+/**
+ * g_bookmark_file_set_icon:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @href: the URI of the icon for the bookmark, or %NULL
+ * @mime_type: the MIME type of the icon for the bookmark
+ *
+ * Sets the icon for the bookmark for @uri. If @href is %NULL, unsets
+ * the currently set icon.
+ *
+ * If no bookmark for @uri is found it is created.
+ *
+ * Since: 2.12
+ */
+void
+g_bookmark_file_set_icon (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *href,
+ const gchar *mime_type)
+{
+ BookmarkItem *item;
+
+ g_return_if_fail (bookmark != NULL);
+ g_return_if_fail (uri != NULL);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ item = bookmark_item_new (uri);
+ g_bookmark_file_add_item (bookmark, item, NULL);
+ }
+
+ if (!item->metadata)
+ item->metadata = bookmark_metadata_new ();
+
+ g_free (item->metadata->icon_href);
+ g_free (item->metadata->icon_mime);
+
+ item->metadata->icon_href = g_strdup (href);
+
+ if (mime_type && mime_type[0] != '\0')
+ item->metadata->icon_mime = g_strdup (mime_type);
+ else
+ item->metadata->icon_mime = g_strdup ("application/octet-stream");
+
+ item->modified = time (NULL);
+}
+
+/**
+ * g_bookmark_file_get_icon:
+ * @bookmark: a #GBookmarkFile
+ * @uri: a valid URI
+ * @href: return location for the icon's location or %NULL
+ * @mime_type: return location for the icon's MIME type or %NULL
+ * @error: return location for a #GError or %NULL
+ *
+ * Gets the icon of the bookmark for @uri.
+ *
+ * In the event the URI cannot be found, %FALSE is returned and
+ * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.
+ *
+ * Return value: %TRUE if the icon for the bookmark for the URI was found.
+ * You should free the returned strings.
+ *
+ * Since: 2.12
+ */
+gboolean
+g_bookmark_file_get_icon (GBookmarkFile *bookmark,
+ const gchar *uri,
+ gchar **href,
+ gchar **mime_type,
+ GError **error)
+{
+ BookmarkItem *item;
+
+ g_return_val_if_fail (bookmark != NULL, FALSE);
+ g_return_val_if_fail (uri != NULL, FALSE);
+
+ item = g_bookmark_file_lookup_item (bookmark, uri);
+ if (!item)
+ {
+ g_set_error (error, G_BOOKMARK_FILE_ERROR,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ _("No bookmark found for URI '%s'"),
+ uri);
+ return FALSE;
+ }
+
+ if ((!item->metadata) || (!item->metadata->icon_href))
+ return FALSE;
+
+ if (href)
+ *href = g_strdup (item->metadata->icon_href);
+
+ if (mime_type)
+ *mime_type = g_strdup (item->metadata->icon_mime);
+
+ return TRUE;
+}
+
+#define __G_BOOKMARK_FILE_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gbookmarkfile.h b/trunk/glib/gbookmarkfile.h
new file mode 100644
index 000000000..2448e4a36
--- /dev/null
+++ b/trunk/glib/gbookmarkfile.h
@@ -0,0 +1,187 @@
+/* gbookmarkfile.h: parsing and building desktop bookmarks
+ *
+ * Copyright (C) 2005-2006 Emmanuele Bassi
+ *
+ * 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,
+ */
+
+#ifndef __G_BOOKMARK_FILE_H__
+#define __G_BOOKMARK_FILE_H__
+
+#include <glib/gerror.h>
+#include <time.h>
+
+G_BEGIN_DECLS
+
+/* GError enumeration
+ */
+#define G_BOOKMARK_FILE_ERROR (g_bookmark_file_error_quark ())
+
+typedef enum
+{
+ G_BOOKMARK_FILE_ERROR_INVALID_URI,
+ G_BOOKMARK_FILE_ERROR_INVALID_VALUE,
+ G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED,
+ G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+ G_BOOKMARK_FILE_ERROR_READ,
+ G_BOOKMARK_FILE_ERROR_UNKNOWN_ENCODING,
+ G_BOOKMARK_FILE_ERROR_WRITE,
+ G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND
+} GBookmarkFileError;
+
+GQuark g_bookmark_file_error_quark (void);
+
+/*
+ * GBookmarkFile
+ */
+typedef struct _GBookmarkFile GBookmarkFile;
+
+GBookmarkFile *g_bookmark_file_new (void);
+void g_bookmark_file_free (GBookmarkFile *bookmark);
+
+gboolean g_bookmark_file_load_from_file (GBookmarkFile *bookmark,
+ const gchar *filename,
+ GError **error);
+gboolean g_bookmark_file_load_from_data (GBookmarkFile *bookmark,
+ const gchar *data,
+ gsize length,
+ GError **error);
+gboolean g_bookmark_file_load_from_data_dirs (GBookmarkFile *bookmark,
+ const gchar *file,
+ gchar **full_path,
+ GError **error);
+gchar * g_bookmark_file_to_data (GBookmarkFile *bookmark,
+ gsize *length,
+ GError **error) G_GNUC_MALLOC;
+gboolean g_bookmark_file_to_file (GBookmarkFile *bookmark,
+ const gchar *filename,
+ GError **error);
+
+void g_bookmark_file_set_title (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *title);
+gchar * g_bookmark_file_get_title (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error) G_GNUC_MALLOC;
+void g_bookmark_file_set_description (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *description);
+gchar * g_bookmark_file_get_description (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error) G_GNUC_MALLOC;
+void g_bookmark_file_set_mime_type (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *mime_type);
+gchar * g_bookmark_file_get_mime_type (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error) G_GNUC_MALLOC;
+void g_bookmark_file_set_groups (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar **groups,
+ gsize length);
+void g_bookmark_file_add_group (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *group);
+gboolean g_bookmark_file_has_group (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *group,
+ GError **error);
+gchar ** g_bookmark_file_get_groups (GBookmarkFile *bookmark,
+ const gchar *uri,
+ gsize *length,
+ GError **error) G_GNUC_MALLOC;
+void g_bookmark_file_add_application (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *name,
+ const gchar *exec);
+gboolean g_bookmark_file_has_application (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *name,
+ GError **error);
+gchar ** g_bookmark_file_get_applications (GBookmarkFile *bookmark,
+ const gchar *uri,
+ gsize *length,
+ GError **error) G_GNUC_MALLOC;
+gboolean g_bookmark_file_set_app_info (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *name,
+ const gchar *exec,
+ gint count,
+ time_t stamp,
+ GError **error);
+gboolean g_bookmark_file_get_app_info (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *name,
+ gchar **exec,
+ guint *count,
+ time_t *stamp,
+ GError **error);
+void g_bookmark_file_set_is_private (GBookmarkFile *bookmark,
+ const gchar *uri,
+ gboolean is_private);
+gboolean g_bookmark_file_get_is_private (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error);
+void g_bookmark_file_set_icon (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *href,
+ const gchar *mime_type);
+gboolean g_bookmark_file_get_icon (GBookmarkFile *bookmark,
+ const gchar *uri,
+ gchar **href,
+ gchar **mime_type,
+ GError **error);
+void g_bookmark_file_set_added (GBookmarkFile *bookmark,
+ const gchar *uri,
+ time_t added);
+time_t g_bookmark_file_get_added (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error);
+void g_bookmark_file_set_modified (GBookmarkFile *bookmark,
+ const gchar *uri,
+ time_t modified);
+time_t g_bookmark_file_get_modified (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error);
+void g_bookmark_file_set_visited (GBookmarkFile *bookmark,
+ const gchar *uri,
+ time_t visited);
+time_t g_bookmark_file_get_visited (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error);
+gboolean g_bookmark_file_has_item (GBookmarkFile *bookmark,
+ const gchar *uri);
+gint g_bookmark_file_get_size (GBookmarkFile *bookmark);
+gchar ** g_bookmark_file_get_uris (GBookmarkFile *bookmark,
+ gsize *length) G_GNUC_MALLOC;
+gboolean g_bookmark_file_remove_group (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *group,
+ GError **error);
+gboolean g_bookmark_file_remove_application (GBookmarkFile *bookmark,
+ const gchar *uri,
+ const gchar *name,
+ GError **error);
+gboolean g_bookmark_file_remove_item (GBookmarkFile *bookmark,
+ const gchar *uri,
+ GError **error);
+gboolean g_bookmark_file_move_item (GBookmarkFile *bookmark,
+ const gchar *old_uri,
+ const gchar *new_uri,
+ GError **error);
+
+G_END_DECLS
+
+#endif /* __G_BOOKMARK_FILE_H__ */
diff --git a/trunk/glib/gbsearcharray.h b/trunk/glib/gbsearcharray.h
new file mode 100644
index 000000000..4fb1b1574
--- /dev/null
+++ b/trunk/glib/gbsearcharray.h
@@ -0,0 +1,303 @@
+/* GBSearchArray - Binary Searchable Array implementation
+ * Copyright (C) 2000-2003 Tim Janik
+ *
+ * This software is provided "as is"; redistribution and modification
+ * is permitted, provided that the following disclaimer is retained.
+ *
+ * This software 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.
+ * In no event shall the authors or contributors be liable for any
+ * direct, indirect, incidental, special, exemplary, or consequential
+ * damages (including, but not limited to, procurement of substitute
+ * goods or services; loss of use, data, or profits; or business
+ * interruption) however caused and on any theory of liability, whether
+ * in contract, strict liability, or tort (including negligence or
+ * otherwise) arising in any way out of the use of this software, even
+ * if advised of the possibility of such damage.
+ */
+#ifndef __G_BSEARCH_ARRAY_H__
+#define __G_BSEARCH_ARRAY_H__
+
+#include <glib.h>
+#include <string.h>
+
+
+G_BEGIN_DECLS /* c++ guards */
+
+/* this implementation is intended to be usable in third-party code
+ * simply by pasting the contents of this file. as such, the
+ * implementation needs to be self-contained within this file.
+ */
+
+/* convenience macro to avoid signed overflow for value comparisions */
+#define G_BSEARCH_ARRAY_CMP(v1,v2) ((v1) > (v2) ? +1 : (v1) == (v2) ? 0 : -1)
+
+
+/* --- typedefs --- */
+typedef gint (*GBSearchCompareFunc) (gconstpointer bsearch_node1, /* key */
+ gconstpointer bsearch_node2);
+typedef enum
+{
+ G_BSEARCH_ARRAY_ALIGN_POWER2 = 1 << 0, /* align memory to power2 sizes */
+ G_BSEARCH_ARRAY_AUTO_SHRINK = 1 << 1 /* shrink array upon removal */
+} GBSearchArrayFlags;
+
+
+/* --- structures --- */
+typedef struct
+{
+ guint sizeof_node;
+ GBSearchCompareFunc cmp_nodes;
+ guint flags;
+} GBSearchConfig;
+typedef union
+{
+ guint n_nodes;
+ /*< private >*/
+ gpointer alignment_dummy1;
+ glong alignment_dummy2;
+ gdouble alignment_dummy3;
+} GBSearchArray;
+
+
+/* --- public API --- */
+static inline GBSearchArray* g_bsearch_array_create (const GBSearchConfig *bconfig);
+static inline gpointer g_bsearch_array_get_nth (GBSearchArray *barray,
+ const GBSearchConfig *bconfig,
+ guint nth);
+static inline guint g_bsearch_array_get_index (GBSearchArray *barray,
+ const GBSearchConfig *bconfig,
+ gconstpointer node_in_array);
+static inline GBSearchArray* g_bsearch_array_remove (GBSearchArray *barray,
+ const GBSearchConfig *bconfig,
+ guint index);
+/* provide uninitialized space at index for node insertion */
+static inline GBSearchArray* g_bsearch_array_grow (GBSearchArray *barray,
+ const GBSearchConfig *bconfig,
+ guint index);
+/* insert key_node into array if it does not exist, otherwise do nothing */
+static inline GBSearchArray* g_bsearch_array_insert (GBSearchArray *barray,
+ const GBSearchConfig *bconfig,
+ gconstpointer key_node);
+/* insert key_node into array if it does not exist,
+ * otherwise replace the existing node's contents with key_node
+ */
+static inline GBSearchArray* g_bsearch_array_replace (GBSearchArray *barray,
+ const GBSearchConfig *bconfig,
+ gconstpointer key_node);
+static inline void g_bsearch_array_free (GBSearchArray *barray,
+ const GBSearchConfig *bconfig);
+#define g_bsearch_array_get_n_nodes(barray) (((GBSearchArray*) (barray))->n_nodes)
+
+/* g_bsearch_array_lookup():
+ * return NULL or exact match node
+ */
+#define g_bsearch_array_lookup(barray, bconfig, key_node) \
+ g_bsearch_array_lookup_fuzzy ((barray), (bconfig), (key_node), 0)
+
+/* g_bsearch_array_lookup_sibling():
+ * return NULL for barray->n_nodes==0, otherwise return the
+ * exact match node, or, if there's no such node, return the
+ * node last visited, which is pretty close to an exact match
+ * (will be one off into either direction).
+ */
+#define g_bsearch_array_lookup_sibling(barray, bconfig, key_node) \
+ g_bsearch_array_lookup_fuzzy ((barray), (bconfig), (key_node), 1)
+
+/* g_bsearch_array_lookup_insertion():
+ * return NULL for barray->n_nodes==0 or exact match, otherwise
+ * return the node where key_node should be inserted (may be one
+ * after end, i.e. g_bsearch_array_get_index(result) <= barray->n_nodes).
+ */
+#define g_bsearch_array_lookup_insertion(barray, bconfig, key_node) \
+ g_bsearch_array_lookup_fuzzy ((barray), (bconfig), (key_node), 2)
+
+
+/* --- implementation --- */
+/* helper macro to cut down realloc()s */
+#ifdef DISABLE_MEM_POOLS
+#define G_BSEARCH_UPPER_POWER2(n) (n)
+#else /* !DISABLE_MEM_POOLS */
+#define G_BSEARCH_UPPER_POWER2(n) ((n) ? 1 << g_bit_storage ((n) - 1) : 0)
+#endif /* !DISABLE_MEM_POOLS */
+#define G_BSEARCH_ARRAY_NODES(barray) (((guint8*) (barray)) + sizeof (GBSearchArray))
+static inline GBSearchArray*
+g_bsearch_array_create (const GBSearchConfig *bconfig)
+{
+ GBSearchArray *barray;
+ guint size;
+
+ g_return_val_if_fail (bconfig != NULL, NULL);
+
+ size = sizeof (GBSearchArray) + bconfig->sizeof_node;
+ if (bconfig->flags & G_BSEARCH_ARRAY_ALIGN_POWER2)
+ size = G_BSEARCH_UPPER_POWER2 (size);
+ barray = (GBSearchArray *) g_realloc (NULL, size);
+ memset (barray, 0, sizeof (GBSearchArray));
+
+ return barray;
+}
+static inline gpointer
+g_bsearch_array_lookup_fuzzy (GBSearchArray *barray,
+ const GBSearchConfig *bconfig,
+ gconstpointer key_node,
+ const guint sibling_or_after);
+static inline gpointer
+g_bsearch_array_lookup_fuzzy (GBSearchArray *barray,
+ const GBSearchConfig *bconfig,
+ gconstpointer key_node,
+ const guint sibling_or_after)
+{
+ GBSearchCompareFunc cmp_nodes = bconfig->cmp_nodes;
+ guint8 *check = NULL, *nodes = G_BSEARCH_ARRAY_NODES (barray);
+ guint n_nodes = barray->n_nodes, offs = 0;
+ guint sizeof_node = bconfig->sizeof_node;
+ gint cmp = 0;
+
+ while (offs < n_nodes)
+ {
+ guint i = (offs + n_nodes) >> 1;
+
+ check = nodes + i * sizeof_node;
+ cmp = cmp_nodes (key_node, check);
+ if (cmp == 0)
+ return sibling_or_after > 1 ? NULL : check;
+ else if (cmp < 0)
+ n_nodes = i;
+ else /* (cmp > 0) */
+ offs = i + 1;
+ }
+
+ /* check is last mismatch, cmp > 0 indicates greater key */
+ return G_LIKELY (!sibling_or_after) ? NULL : (sibling_or_after > 1 && cmp > 0) ? check + sizeof_node : check;
+}
+static inline gpointer
+g_bsearch_array_get_nth (GBSearchArray *barray,
+ const GBSearchConfig *bconfig,
+ guint nth)
+{
+ return (G_LIKELY (nth < barray->n_nodes) ?
+ G_BSEARCH_ARRAY_NODES (barray) + nth * bconfig->sizeof_node :
+ NULL);
+}
+static inline guint
+g_bsearch_array_get_index (GBSearchArray *barray,
+ const GBSearchConfig *bconfig,
+ gconstpointer node_in_array)
+{
+ guint distance = ((guint8*) node_in_array) - G_BSEARCH_ARRAY_NODES (barray);
+
+ g_return_val_if_fail (node_in_array != NULL, barray->n_nodes);
+
+ distance /= bconfig->sizeof_node;
+
+ return MIN (distance, barray->n_nodes + 1); /* may return one after end */
+}
+static inline GBSearchArray*
+g_bsearch_array_grow (GBSearchArray *barray,
+ const GBSearchConfig *bconfig,
+ guint index)
+{
+ guint old_size = barray->n_nodes * bconfig->sizeof_node;
+ guint new_size = old_size + bconfig->sizeof_node;
+ guint8 *node;
+
+ g_return_val_if_fail (index <= barray->n_nodes, NULL);
+
+ if (G_UNLIKELY (bconfig->flags & G_BSEARCH_ARRAY_ALIGN_POWER2))
+ {
+ new_size = G_BSEARCH_UPPER_POWER2 (sizeof (GBSearchArray) + new_size);
+ old_size = G_BSEARCH_UPPER_POWER2 (sizeof (GBSearchArray) + old_size);
+ if (old_size != new_size)
+ barray = (GBSearchArray *) g_realloc (barray, new_size);
+ }
+ else
+ barray = (GBSearchArray *) g_realloc (barray, sizeof (GBSearchArray) + new_size);
+ node = G_BSEARCH_ARRAY_NODES (barray) + index * bconfig->sizeof_node;
+ g_memmove (node + bconfig->sizeof_node, node, (barray->n_nodes - index) * bconfig->sizeof_node);
+ barray->n_nodes += 1;
+ return barray;
+}
+static inline GBSearchArray*
+g_bsearch_array_insert (GBSearchArray *barray,
+ const GBSearchConfig *bconfig,
+ gconstpointer key_node)
+{
+ guint8 *node;
+
+ if (G_UNLIKELY (!barray->n_nodes))
+ {
+ barray = g_bsearch_array_grow (barray, bconfig, 0);
+ node = G_BSEARCH_ARRAY_NODES (barray);
+ }
+ else
+ {
+ node = (guint8 *) g_bsearch_array_lookup_insertion (barray, bconfig, key_node);
+ if (G_LIKELY (node))
+ {
+ guint index = g_bsearch_array_get_index (barray, bconfig, node);
+
+ /* grow and insert */
+ barray = g_bsearch_array_grow (barray, bconfig, index);
+ node = G_BSEARCH_ARRAY_NODES (barray) + index * bconfig->sizeof_node;
+ }
+ else /* no insertion needed, node already there */
+ return barray;
+ }
+ memcpy (node, key_node, bconfig->sizeof_node);
+ return barray;
+}
+static inline GBSearchArray*
+g_bsearch_array_replace (GBSearchArray *barray,
+ const GBSearchConfig *bconfig,
+ gconstpointer key_node)
+{
+ guint8 *node = (guint8 *) g_bsearch_array_lookup (barray, bconfig, key_node);
+ if (G_LIKELY (node)) /* expected path */
+ memcpy (node, key_node, bconfig->sizeof_node);
+ else /* revert to insertion */
+ barray = g_bsearch_array_insert (barray, bconfig, key_node);
+ return barray;
+}
+static inline GBSearchArray*
+g_bsearch_array_remove (GBSearchArray *barray,
+ const GBSearchConfig *bconfig,
+ guint index)
+{
+ guint8 *node;
+
+ g_return_val_if_fail (index < barray->n_nodes, NULL);
+
+ barray->n_nodes -= 1;
+ node = G_BSEARCH_ARRAY_NODES (barray) + index * bconfig->sizeof_node;
+ g_memmove (node, node + bconfig->sizeof_node, (barray->n_nodes - index) * bconfig->sizeof_node);
+ if (G_UNLIKELY (bconfig->flags & G_BSEARCH_ARRAY_AUTO_SHRINK))
+ {
+ guint new_size = barray->n_nodes * bconfig->sizeof_node;
+ guint old_size = new_size + bconfig->sizeof_node;
+
+ if (G_UNLIKELY (bconfig->flags & G_BSEARCH_ARRAY_ALIGN_POWER2))
+ {
+ new_size = G_BSEARCH_UPPER_POWER2 (sizeof (GBSearchArray) + new_size);
+ old_size = G_BSEARCH_UPPER_POWER2 (sizeof (GBSearchArray) + old_size);
+ if (old_size != new_size)
+ barray = (GBSearchArray *) g_realloc (barray, new_size);
+ }
+ else
+ barray = (GBSearchArray *) g_realloc (barray, sizeof (GBSearchArray) + new_size);
+ }
+ return barray;
+}
+static inline void
+g_bsearch_array_free (GBSearchArray *barray,
+ const GBSearchConfig *bconfig)
+{
+ g_return_if_fail (barray != NULL);
+
+ g_free (barray);
+}
+
+G_END_DECLS /* c++ guards */
+
+#endif /* !__G_BSEARCH_ARRAY_H__ */
diff --git a/trunk/glib/gcache.c b/trunk/glib/gcache.c
new file mode 100644
index 000000000..a5b02974c
--- /dev/null
+++ b/trunk/glib/gcache.c
@@ -0,0 +1,197 @@
+/* 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 "config.h"
+
+#include "glib.h"
+#include "galias.h"
+
+
+typedef struct _GCacheNode GCacheNode;
+
+struct _GCacheNode
+{
+ /* A reference counted node */
+ gpointer value;
+ gint ref_count;
+};
+
+struct _GCache
+{
+ /* 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 inline GCacheNode*
+g_cache_node_new (gpointer value)
+{
+ GCacheNode *node = g_slice_new (GCacheNode);
+ node->value = value;
+ node->ref_count = 1;
+ return node;
+}
+
+static inline void
+g_cache_node_destroy (GCacheNode *node)
+{
+ g_slice_free (GCacheNode, node);
+}
+
+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)
+{
+ GCache *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_slice_new (GCache);
+ 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 cache;
+}
+
+void
+g_cache_destroy (GCache *cache)
+{
+ g_return_if_fail (cache != NULL);
+
+ g_hash_table_destroy (cache->key_table);
+ g_hash_table_destroy (cache->value_table);
+ g_slice_free (GCache, cache);
+}
+
+gpointer
+g_cache_insert (GCache *cache,
+ gpointer key)
+{
+ GCacheNode *node;
+ gpointer value;
+
+ g_return_val_if_fail (cache != NULL, NULL);
+
+ node = g_hash_table_lookup (cache->key_table, key);
+ if (node)
+ {
+ node->ref_count += 1;
+ return node->value;
+ }
+
+ key = (* cache->key_dup_func) (key);
+ value = (* cache->value_new_func) (key);
+ node = g_cache_node_new (value);
+
+ g_hash_table_insert (cache->key_table, key, node);
+ g_hash_table_insert (cache->value_table, value, key);
+
+ return node->value;
+}
+
+void
+g_cache_remove (GCache *cache,
+ gconstpointer value)
+{
+ GCacheNode *node;
+ gpointer key;
+
+ g_return_if_fail (cache != NULL);
+
+ key = g_hash_table_lookup (cache->value_table, value);
+ node = g_hash_table_lookup (cache->key_table, key);
+
+ g_return_if_fail (node != NULL);
+
+ node->ref_count -= 1;
+ if (node->ref_count == 0)
+ {
+ g_hash_table_remove (cache->value_table, value);
+ g_hash_table_remove (cache->key_table, key);
+
+ (* cache->key_destroy_func) (key);
+ (* cache->value_destroy_func) (node->value);
+ g_cache_node_destroy (node);
+ }
+}
+
+void
+g_cache_key_foreach (GCache *cache,
+ GHFunc func,
+ gpointer user_data)
+{
+ g_return_if_fail (cache != NULL);
+ g_return_if_fail (func != NULL);
+
+ g_hash_table_foreach (cache->value_table, func, user_data);
+}
+
+void
+g_cache_value_foreach (GCache *cache,
+ GHFunc func,
+ gpointer user_data)
+{
+ g_return_if_fail (cache != NULL);
+ g_return_if_fail (func != NULL);
+
+ g_hash_table_foreach (cache->key_table, func, user_data);
+}
+
+#define __G_CACHE_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gcache.h b/trunk/glib/gcache.h
new file mode 100644
index 000000000..93341b87f
--- /dev/null
+++ b/trunk/glib/gcache.h
@@ -0,0 +1,68 @@
+/* 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 <glib/glist.h>
+
+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);
+#ifndef G_DISABLE_DEPRECATED
+void g_cache_value_foreach (GCache *cache,
+ GHFunc func,
+ gpointer user_data);
+#endif
+
+G_END_DECLS
+
+#endif /* __G_CACHE_H__ */
+
+
+
diff --git a/trunk/glib/gcompletion.c b/trunk/glib/gcompletion.c
new file mode 100644
index 000000000..5d2607846
--- /dev/null
+++ b/trunk/glib/gcompletion.c
@@ -0,0 +1,350 @@
+/* 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 "config.h"
+
+#include <string.h>
+
+#include "glib.h"
+#include "galias.h"
+
+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);
+
+ /* 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);
+
+ 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);
+}
+
+/**
+ * g_completion_complete_utf8:
+ * @cmp: the #GCompletion
+ * @prefix: the prefix string, typically used by the user, which is compared
+ * with each of the items
+ * @new_prefix: if non-%NULL, returns the longest prefix which is common to all
+ * items that matched @prefix, or %NULL if no items matched @prefix.
+ * This string should be freed when no longer needed.
+ *
+ * Attempts to complete the string @prefix using the #GCompletion target items.
+ * In contrast to g_completion_complete(), this function returns the largest common
+ * prefix that is a valid UTF-8 string, omitting a possible common partial
+ * character.
+ *
+ * You should use this function instead of g_completion_complete() if your
+ * items are UTF-8 strings.
+ *
+ * Return value: the list of items whose strings begin with @prefix. This should
+ * not be changed.
+ *
+ * Since: 2.4
+ **/
+GList*
+g_completion_complete_utf8 (GCompletion *cmp,
+ const gchar *prefix,
+ gchar **new_prefix)
+{
+ GList *list;
+ gchar *p, *q;
+
+ list = g_completion_complete (cmp, prefix, new_prefix);
+
+ if (new_prefix && *new_prefix)
+ {
+ p = *new_prefix + strlen (*new_prefix);
+ q = g_utf8_find_prev_char (*new_prefix, p);
+
+ switch (g_utf8_get_char_validated (q, p - q))
+ {
+ case (gunichar)-2:
+ case (gunichar)-1:
+ *q = 0;
+ break;
+ default: ;
+ }
+
+ }
+
+ return list;
+}
+
+GList*
+g_completion_complete (GCompletion* cmp,
+ const 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)
+ {
+ GList *next = list->next;
+
+ if (cmp->strncmp_func (prefix,
+ cmp->func ? cmp->func (list->data) : (gchar*) list->data,
+ len))
+ cmp->cache = g_list_delete_link (cmp->cache, 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 <stdio.h>
+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
+
+#define __G_COMPLETION_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gcompletion.h b/trunk/glib/gcompletion.h
new file mode 100644
index 000000000..8adb23137
--- /dev/null
+++ b/trunk/glib/gcompletion.h
@@ -0,0 +1,74 @@
+/* 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 <glib/glist.h>
+
+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,
+ const gchar* prefix,
+ gchar** new_prefix);
+GList* g_completion_complete_utf8 (GCompletion *cmp,
+ const 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/trunk/glib/gconvert.c b/trunk/glib/gconvert.c
new file mode 100644
index 000000000..ab0b18ebd
--- /dev/null
+++ b/trunk/glib/gconvert.c
@@ -0,0 +1,2106 @@
+/* GLIB - Library of useful routines for C programming
+ *
+ * gconvert.c: Convert between character sets using iconv
+ * Copyright Red Hat Inc., 2000
+ * Authors: Havoc Pennington <hp@redhat.com>, Owen Taylor <otaylor@redhat.com>
+ *
+ * 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 "config.h"
+
+#include <iconv.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "glib.h"
+#include "gprintfint.h"
+#include "gthreadprivate.h"
+#include "gunicode.h"
+
+#ifdef G_PLATFORM_WIN32
+#define STRICT
+#include <windows.h>
+#undef STRICT
+#endif
+
+#include "glibintl.h"
+
+#if defined(USE_LIBICONV_GNU) && !defined (_LIBICONV_H)
+#error GNU libiconv in use but included iconv.h not from libiconv
+#endif
+#if !defined(USE_LIBICONV_GNU) && defined (_LIBICONV_H)
+#error GNU libiconv not in use but included iconv.h is from libiconv
+#endif
+
+#include "galias.h"
+
+GQuark
+g_convert_error_quark (void)
+{
+ return g_quark_from_static_string ("g_convert_error");
+}
+
+static gboolean
+try_conversion (const char *to_codeset,
+ const char *from_codeset,
+ iconv_t *cd)
+{
+ *cd = iconv_open (to_codeset, from_codeset);
+
+ if (*cd == (iconv_t)-1 && errno == EINVAL)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static gboolean
+try_to_aliases (const char **to_aliases,
+ const char *from_codeset,
+ iconv_t *cd)
+{
+ if (to_aliases)
+ {
+ const char **p = to_aliases;
+ while (*p)
+ {
+ if (try_conversion (*p, from_codeset, cd))
+ return TRUE;
+
+ p++;
+ }
+ }
+
+ return FALSE;
+}
+
+G_GNUC_INTERNAL extern const char **
+_g_charset_get_aliases (const char *canonical_name);
+
+/**
+ * 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", or (GIConv)-1 if
+ * opening the converter failed.
+ **/
+GIConv
+g_iconv_open (const gchar *to_codeset,
+ const gchar *from_codeset)
+{
+ iconv_t cd;
+
+ if (!try_conversion (to_codeset, from_codeset, &cd))
+ {
+ const char **to_aliases = _g_charset_get_aliases (to_codeset);
+ const char **from_aliases = _g_charset_get_aliases (from_codeset);
+
+ if (from_aliases)
+ {
+ const char **p = from_aliases;
+ while (*p)
+ {
+ if (try_conversion (to_codeset, *p, &cd))
+ goto out;
+
+ if (try_to_aliases (to_aliases, *p, &cd))
+ goto out;
+
+ p++;
+ }
+ }
+
+ if (try_to_aliases (to_aliases, from_codeset, &cd))
+ goto out;
+ }
+
+ out:
+ return (cd == (iconv_t)-1) ? (GIConv)-1 : (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
+ **/
+gsize
+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 g_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);
+}
+
+
+#ifdef NEED_ICONV_CACHE
+
+#define ICONV_CACHE_SIZE (16)
+
+struct _iconv_cache_bucket {
+ gchar *key;
+ guint32 refcount;
+ gboolean used;
+ GIConv cd;
+};
+
+static GList *iconv_cache_list;
+static GHashTable *iconv_cache;
+static GHashTable *iconv_open_hash;
+static guint iconv_cache_size = 0;
+G_LOCK_DEFINE_STATIC (iconv_cache_lock);
+
+/* caller *must* hold the iconv_cache_lock */
+static void
+iconv_cache_init (void)
+{
+ static gboolean initialized = FALSE;
+
+ if (initialized)
+ return;
+
+ iconv_cache_list = NULL;
+ iconv_cache = g_hash_table_new (g_str_hash, g_str_equal);
+ iconv_open_hash = g_hash_table_new (g_direct_hash, g_direct_equal);
+
+ initialized = TRUE;
+}
+
+
+/**
+ * iconv_cache_bucket_new:
+ * @key: cache key
+ * @cd: iconv descriptor
+ *
+ * Creates a new cache bucket, inserts it into the cache and
+ * increments the cache size.
+ *
+ * This assumes ownership of @key.
+ *
+ * Returns a pointer to the newly allocated cache bucket.
+ **/
+static struct _iconv_cache_bucket *
+iconv_cache_bucket_new (gchar *key, GIConv cd)
+{
+ struct _iconv_cache_bucket *bucket;
+
+ bucket = g_new (struct _iconv_cache_bucket, 1);
+ bucket->key = key;
+ bucket->refcount = 1;
+ bucket->used = TRUE;
+ bucket->cd = cd;
+
+ g_hash_table_insert (iconv_cache, bucket->key, bucket);
+
+ /* FIXME: if we sorted the list so items with few refcounts were
+ first, then we could expire them faster in iconv_cache_expire_unused () */
+ iconv_cache_list = g_list_prepend (iconv_cache_list, bucket);
+
+ iconv_cache_size++;
+
+ return bucket;
+}
+
+
+/**
+ * iconv_cache_bucket_expire:
+ * @node: cache bucket's node
+ * @bucket: cache bucket
+ *
+ * Expires a single cache bucket @bucket. This should only ever be
+ * called on a bucket that currently has no used iconv descriptors
+ * open.
+ *
+ * @node is not a required argument. If @node is not supplied, we
+ * search for it ourselves.
+ **/
+static void
+iconv_cache_bucket_expire (GList *node, struct _iconv_cache_bucket *bucket)
+{
+ g_hash_table_remove (iconv_cache, bucket->key);
+
+ if (node == NULL)
+ node = g_list_find (iconv_cache_list, bucket);
+
+ g_assert (node != NULL);
+
+ if (node->prev)
+ {
+ node->prev->next = node->next;
+ if (node->next)
+ node->next->prev = node->prev;
+ }
+ else
+ {
+ iconv_cache_list = node->next;
+ if (node->next)
+ node->next->prev = NULL;
+ }
+
+ g_list_free_1 (node);
+
+ g_free (bucket->key);
+ g_iconv_close (bucket->cd);
+ g_free (bucket);
+
+ iconv_cache_size--;
+}
+
+
+/**
+ * iconv_cache_expire_unused:
+ *
+ * Expires as many unused cache buckets as it needs to in order to get
+ * the total number of buckets < ICONV_CACHE_SIZE.
+ **/
+static void
+iconv_cache_expire_unused (void)
+{
+ struct _iconv_cache_bucket *bucket;
+ GList *node, *next;
+
+ node = iconv_cache_list;
+ while (node && iconv_cache_size >= ICONV_CACHE_SIZE)
+ {
+ next = node->next;
+
+ bucket = node->data;
+ if (bucket->refcount == 0)
+ iconv_cache_bucket_expire (node, bucket);
+
+ node = next;
+ }
+}
+
+static GIConv
+open_converter (const gchar *to_codeset,
+ const gchar *from_codeset,
+ GError **error)
+{
+ struct _iconv_cache_bucket *bucket;
+ gchar *key, *dyn_key, auto_key[80];
+ GIConv cd;
+ gsize len_from_codeset, len_to_codeset;
+
+ /* create our key */
+ len_from_codeset = strlen (from_codeset);
+ len_to_codeset = strlen (to_codeset);
+ if (len_from_codeset + len_to_codeset + 2 < sizeof (auto_key))
+ {
+ key = auto_key;
+ dyn_key = NULL;
+ }
+ else
+ key = dyn_key = g_malloc (len_from_codeset + len_to_codeset + 2);
+ memcpy (key, from_codeset, len_from_codeset);
+ key[len_from_codeset] = ':';
+ strcpy (key + len_from_codeset + 1, to_codeset);
+
+ G_LOCK (iconv_cache_lock);
+
+ /* make sure the cache has been initialized */
+ iconv_cache_init ();
+
+ bucket = g_hash_table_lookup (iconv_cache, key);
+ if (bucket)
+ {
+ g_free (dyn_key);
+
+ if (bucket->used)
+ {
+ cd = g_iconv_open (to_codeset, from_codeset);
+ if (cd == (GIConv) -1)
+ goto error;
+ }
+ else
+ {
+ /* Apparently iconv on Solaris <= 7 segfaults if you pass in
+ * NULL for anything but inbuf; work around that. (NULL outbuf
+ * or NULL *outbuf is allowed by Unix98.)
+ */
+ gsize inbytes_left = 0;
+ gchar *outbuf = NULL;
+ gsize outbytes_left = 0;
+
+ cd = bucket->cd;
+ bucket->used = TRUE;
+
+ /* reset the descriptor */
+ g_iconv (cd, NULL, &inbytes_left, &outbuf, &outbytes_left);
+ }
+
+ bucket->refcount++;
+ }
+ else
+ {
+ cd = g_iconv_open (to_codeset, from_codeset);
+ if (cd == (GIConv) -1)
+ {
+ g_free (dyn_key);
+ goto error;
+ }
+
+ iconv_cache_expire_unused ();
+
+ bucket = iconv_cache_bucket_new (dyn_key ? dyn_key : g_strdup (key), cd);
+ }
+
+ g_hash_table_insert (iconv_open_hash, cd, bucket->key);
+
+ G_UNLOCK (iconv_cache_lock);
+
+ return cd;
+
+ error:
+
+ G_UNLOCK (iconv_cache_lock);
+
+ /* Something went wrong. */
+ if (error)
+ {
+ 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'"),
+ from_codeset, to_codeset);
+ }
+
+ return cd;
+}
+
+static int
+close_converter (GIConv converter)
+{
+ struct _iconv_cache_bucket *bucket;
+ const gchar *key;
+ GIConv cd;
+
+ cd = converter;
+
+ if (cd == (GIConv) -1)
+ return 0;
+
+ G_LOCK (iconv_cache_lock);
+
+ key = g_hash_table_lookup (iconv_open_hash, cd);
+ if (key)
+ {
+ g_hash_table_remove (iconv_open_hash, cd);
+
+ bucket = g_hash_table_lookup (iconv_cache, key);
+ g_assert (bucket);
+
+ bucket->refcount--;
+
+ if (cd == bucket->cd)
+ bucket->used = FALSE;
+ else
+ g_iconv_close (cd);
+
+ if (!bucket->refcount && iconv_cache_size > ICONV_CACHE_SIZE)
+ {
+ /* expire this cache bucket */
+ iconv_cache_bucket_expire (NULL, bucket);
+ }
+ }
+ else
+ {
+ G_UNLOCK (iconv_cache_lock);
+
+ g_warning ("This iconv context wasn't opened using open_converter");
+
+ return g_iconv_close (converter);
+ }
+
+ G_UNLOCK (iconv_cache_lock);
+
+ return 0;
+}
+
+#else /* !NEED_ICONV_CACHE */
+
+static GIConv
+open_converter (const gchar *to_codeset,
+ const gchar *from_codeset,
+ GError **error)
+{
+ GIConv cd;
+
+ cd = g_iconv_open (to_codeset, from_codeset);
+
+ if (cd == (GIConv) -1)
+ {
+ /* Something went wrong. */
+ if (error)
+ {
+ 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'"),
+ from_codeset, to_codeset);
+ }
+ }
+
+ return cd;
+}
+
+static int
+close_converter (GIConv cd)
+{
+ if (cd == (GIConv) -1)
+ return 0;
+
+ return g_iconv_close (cd);
+}
+
+#endif /* NEED_ICONV_CACHE */
+
+/**
+ * g_convert_with_iconv:
+ * @str: the string to convert
+ * @len: the length of the string, or -1 if the string is
+ * nul-terminated<footnoteref linkend="nul-unsafe"/>.
+ * @converter: conversion descriptor from g_iconv_open()
+ * @bytes_read: location to store the number of bytes in the
+ * input string that were successfully converted, or %NULL.
+ * Even if the conversion was successful, 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 offset after the last valid
+ * input sequence.
+ * @bytes_written: the number of bytes 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 one character set to another.
+ *
+ * Note that you should use g_iconv() for streaming
+ * conversions<footnote id="streaming-state">
+ * <para>
+ * Despite the fact that @byes_read can return information about partial
+ * characters, the <literal>g_convert_...</literal> functions
+ * are not generally suitable for streaming. If the underlying converter
+ * being used maintains internal state, then this won't be preserved
+ * across successive calls to g_convert(), g_convert_with_iconv() or
+ * g_convert_with_fallback(). (An example of this is the GNU C converter
+ * for CP1255 which does not emit a base character until it knows that
+ * the next character is not a mark that could combine with the base
+ * character.)
+ * </para>
+ * </footnote>.
+ *
+ * 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_iconv (const gchar *str,
+ gssize len,
+ GIConv converter,
+ gsize *bytes_read,
+ gsize *bytes_written,
+ GError **error)
+{
+ gchar *dest;
+ gchar *outp;
+ const gchar *p;
+ const gchar *shift_p = NULL;
+ gsize inbytes_remaining;
+ gsize outbytes_remaining;
+ gsize err;
+ gsize outbuf_size;
+ gboolean have_error = FALSE;
+ gboolean done = FALSE;
+
+ g_return_val_if_fail (converter != (GIConv) -1, 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);
+
+ while (!done && !have_error)
+ {
+ err = g_iconv (converter, (char **)&p, &inbytes_remaining, &outp, &outbytes_remaining);
+
+ if (err == (gsize) -1)
+ {
+ switch (errno)
+ {
+ case EINVAL:
+ /* Incomplete text, do not report an error */
+ done = TRUE;
+ break;
+ case E2BIG:
+ {
+ gsize 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 (error)
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
+ _("Invalid byte sequence in conversion input"));
+ have_error = TRUE;
+ break;
+ default:
+ if (error)
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
+ _("Error during conversion: %s"),
+ g_strerror (errno));
+ have_error = TRUE;
+ break;
+ }
+ }
+ else
+ {
+ if (!shift_p)
+ {
+ /* call g_iconv with NULL inbuf to cleanup shift state */
+ shift_p = p;
+ p = NULL;
+ inbytes_remaining = 0;
+ }
+ else
+ done = TRUE;
+ }
+ }
+
+ if (shift_p)
+ p = shift_p;
+
+ *outp = '\0';
+
+ if (bytes_read)
+ *bytes_read = p - str;
+ else
+ {
+ if ((p - str) != len)
+ {
+ if (!have_error)
+ {
+ if (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:
+ * @str: the string to convert
+ * @len: the length of the string, or -1 if the string is
+ * nul-terminated<footnote id="nul-unsafe">
+ <para>
+ Note that some encodings may allow nul bytes to
+ occur inside strings. In that case, using -1 for
+ the @len parameter is unsafe.
+ </para>
+ </footnote>.
+ * @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 successful, 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 offset after the last valid
+ * input sequence.
+ * @bytes_written: the number of bytes 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 one character set to another.
+ *
+ * Note that you should use g_iconv() for streaming
+ * conversions<footnoteref linkend="streaming-state"/>.
+ *
+ * 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 *res;
+ GIConv cd;
+
+ 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;
+ }
+
+ res = g_convert_with_iconv (str, len, cd,
+ bytes_read, bytes_written,
+ error);
+
+ close_converter (cd);
+
+ return res;
+}
+
+/**
+ * g_convert_with_fallback:
+ * @str: the string to convert
+ * @len: the length of the string, or -1 if the string is
+ * nul-terminated<footnoteref linkend="nul-unsafe"/>.
+ * @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. (The string must be
+ * representable in the target encoding).
+ If %NULL, characters not in the target encoding will
+ be represented as Unicode escapes \uxxxx or \Uxxxxyyyy.
+ * @bytes_read: location to store the number of bytes in the
+ * input string that were successfully converted, or %NULL.
+ * Even if the conversion was successful, this may be
+ * less than @len if there were partial characters
+ * at the end of the input.
+ * @bytes_written: the number of bytes 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 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.
+ *
+ * Note that you should use g_iconv() for streaming
+ * conversions<footnoteref linkend="streaming-state"/>.
+ *
+ * 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)
+ {
+ close_converter (cd);
+ if (bytes_written)
+ *bytes_written = 0;
+ 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)
+ {
+ gsize inbytes_tmp = inbytes_remaining;
+ err = g_iconv (cd, (char **)&p, &inbytes_tmp, &outp, &outbytes_remaining);
+ inbytes_remaining = inbytes_tmp;
+
+ if (err == (gsize) -1)
+ {
+ switch (errno)
+ {
+ case EINVAL:
+ g_assert_not_reached();
+ break;
+ case E2BIG:
+ {
+ gsize 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 (p)
+ {
+ if (!fallback)
+ {
+ gunichar ch = g_utf8_get_char (p);
+ insert_str = g_strdup_printf (ch < 0x10000 ? "\\u%04x" : "\\U%08x",
+ 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;
+ }
+ /* fall thru if p is NULL */
+ default:
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
+ _("Error during conversion: %s"),
+ g_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 if (p)
+ {
+ /* call g_iconv with NULL inbuf to cleanup shift state */
+ p = NULL;
+ inbytes_remaining = 0;
+ }
+ else
+ done = TRUE;
+ }
+ }
+
+ /* Cleanup
+ */
+ *outp = '\0';
+
+ close_converter (cd);
+
+ if (bytes_written)
+ *bytes_written = outp - dest; /* 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,
+ GError **error)
+
+{
+ gsize real_len;
+
+ if (!g_utf8_validate (string, len, NULL))
+ {
+ if (bytes_read)
+ *bytes_read = 0;
+ if (bytes_written)
+ *bytes_written = 0;
+
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
+ _("Invalid byte sequence in conversion input"));
+ return NULL;
+ }
+
+ 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. On Windows
+ * this means the system codepage.
+ * @len: the length of the string, or -1 if the string is
+ * nul-terminated<footnoteref linkend="nul-unsafe"/>.
+ * @bytes_read: location to store the number of bytes in the
+ * input string that were successfully converted, or %NULL.
+ * Even if the conversion was successful, 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 offset after the last valid
+ * input sequence.
+ * @bytes_written: the number of bytes 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 <link linkend="setlocale">current locale</link> 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)
+{
+ const char *charset;
+
+ if (g_get_charset (&charset))
+ return strdup_len (opsysstring, len, bytes_read, bytes_written, error);
+ else
+ return g_convert (opsysstring, len,
+ "UTF-8", charset, bytes_read, bytes_written, error);
+}
+
+/**
+ * g_locale_from_utf8:
+ * @utf8string: a UTF-8 encoded string
+ * @len: the length of the string, or -1 if the string is
+ * nul-terminated<footnoteref linkend="nul-unsafe"/>.
+ * @bytes_read: location to store the number of bytes in the
+ * input string that were successfully converted, or %NULL.
+ * Even if the conversion was successful, 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 offset after the last valid
+ * input sequence.
+ * @bytes_written: the number of bytes 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 <link linkend="setlocale">current locale</link>.
+ *
+ * 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)
+{
+ const gchar *charset;
+
+ if (g_get_charset (&charset))
+ return strdup_len (utf8string, len, bytes_read, bytes_written, error);
+ else
+ return g_convert (utf8string, len,
+ charset, "UTF-8", bytes_read, bytes_written, error);
+}
+
+#ifndef G_PLATFORM_WIN32
+
+typedef struct _GFilenameCharsetCache GFilenameCharsetCache;
+
+struct _GFilenameCharsetCache {
+ gboolean is_utf8;
+ gchar *charset;
+ gchar **filename_charsets;
+};
+
+static void
+filename_charset_cache_free (gpointer data)
+{
+ GFilenameCharsetCache *cache = data;
+ g_free (cache->charset);
+ g_strfreev (cache->filename_charsets);
+ g_free (cache);
+}
+
+/**
+ * g_get_filename_charsets:
+ * @charsets: return location for the %NULL-terminated list of encoding names
+ *
+ * Determines the preferred character sets used for filenames.
+ * The first character set from the @charsets is the filename encoding, the
+ * subsequent character sets are used when trying to generate a displayable
+ * representation of a filename, see g_filename_display_name().
+ *
+ * On Unix, the character sets are determined by consulting the
+ * environment variables <envar>G_FILENAME_ENCODING</envar> and
+ * <envar>G_BROKEN_FILENAMES</envar>. On Windows, the character set
+ * used in the GLib API is always UTF-8 and said environment variables
+ * have no effect.
+ *
+ * <envar>G_FILENAME_ENCODING</envar> may be set to a comma-separated list
+ * of character set names. The special token "&commat;locale" is taken to
+ * mean the character set for the <link linkend="setlocale">current
+ * locale</link>. If <envar>G_FILENAME_ENCODING</envar> is not set, but
+ * <envar>G_BROKEN_FILENAMES</envar> is, the character set of the current
+ * locale is taken as the filename encoding. If neither environment variable
+ * is set, UTF-8 is taken as the filename encoding, but the character
+ * set of the current locale is also put in the list of encodings.
+ *
+ * The returned @charsets belong to GLib and must not be freed.
+ *
+ * Note that on Unix, regardless of the locale character set or
+ * <envar>G_FILENAME_ENCODING</envar> value, the actual file names present
+ * on a system might be in any random encoding or just gibberish.
+ *
+ * Return value: %TRUE if the filename encoding is UTF-8.
+ *
+ * Since: 2.6
+ */
+gboolean
+g_get_filename_charsets (G_CONST_RETURN gchar ***filename_charsets)
+{
+ static GStaticPrivate cache_private = G_STATIC_PRIVATE_INIT;
+ GFilenameCharsetCache *cache = g_static_private_get (&cache_private);
+ const gchar *charset;
+
+ if (!cache)
+ {
+ cache = g_new0 (GFilenameCharsetCache, 1);
+ g_static_private_set (&cache_private, cache, filename_charset_cache_free);
+ }
+
+ g_get_charset (&charset);
+
+ if (!(cache->charset && strcmp (cache->charset, charset) == 0))
+ {
+ const gchar *new_charset;
+ gchar *p;
+ gint i;
+
+ g_free (cache->charset);
+ g_strfreev (cache->filename_charsets);
+ cache->charset = g_strdup (charset);
+
+ p = getenv ("G_FILENAME_ENCODING");
+ if (p != NULL && p[0] != '\0')
+ {
+ cache->filename_charsets = g_strsplit (p, ",", 0);
+ cache->is_utf8 = (strcmp (cache->filename_charsets[0], "UTF-8") == 0);
+
+ for (i = 0; cache->filename_charsets[i]; i++)
+ {
+ if (strcmp ("@locale", cache->filename_charsets[i]) == 0)
+ {
+ g_get_charset (&new_charset);
+ g_free (cache->filename_charsets[i]);
+ cache->filename_charsets[i] = g_strdup (new_charset);
+ }
+ }
+ }
+ else if (getenv ("G_BROKEN_FILENAMES") != NULL)
+ {
+ cache->filename_charsets = g_new0 (gchar *, 2);
+ cache->is_utf8 = g_get_charset (&new_charset);
+ cache->filename_charsets[0] = g_strdup (new_charset);
+ }
+ else
+ {
+ cache->filename_charsets = g_new0 (gchar *, 3);
+ cache->is_utf8 = TRUE;
+ cache->filename_charsets[0] = g_strdup ("UTF-8");
+ if (!g_get_charset (&new_charset))
+ cache->filename_charsets[1] = g_strdup (new_charset);
+ }
+ }
+
+ if (filename_charsets)
+ *filename_charsets = (const gchar **)cache->filename_charsets;
+
+ return cache->is_utf8;
+}
+
+#else /* G_PLATFORM_WIN32 */
+
+gboolean
+g_get_filename_charsets (G_CONST_RETURN gchar ***filename_charsets)
+{
+ static const gchar *charsets[] = {
+ "UTF-8",
+ NULL
+ };
+
+#ifdef G_OS_WIN32
+ /* On Windows GLib pretends that the filename charset is UTF-8 */
+ if (filename_charsets)
+ *filename_charsets = charsets;
+
+ return TRUE;
+#else
+ gboolean result;
+
+ /* Cygwin works like before */
+ result = g_get_charset (&(charsets[0]));
+
+ if (filename_charsets)
+ *filename_charsets = charsets;
+
+ return result;
+#endif
+}
+
+#endif /* G_PLATFORM_WIN32 */
+
+static gboolean
+get_filename_charset (const gchar **filename_charset)
+{
+ const gchar **charsets;
+ gboolean is_utf8;
+
+ is_utf8 = g_get_filename_charsets (&charsets);
+
+ if (filename_charset)
+ *filename_charset = charsets[0];
+
+ return is_utf8;
+}
+
+/* This is called from g_thread_init(). It's used to
+ * initialize some static data in a threadsafe way.
+ */
+void
+_g_convert_thread_init (void)
+{
+ const gchar **dummy;
+ (void) g_get_filename_charsets (&dummy);
+}
+
+/**
+ * g_filename_to_utf8:
+ * @opsysstring: a string in the encoding for filenames
+ * @len: the length of the string, or -1 if the string is
+ * nul-terminated<footnoteref linkend="nul-unsafe"/>.
+ * @bytes_read: location to store the number of bytes in the
+ * input string that were successfully converted, or %NULL.
+ * Even if the conversion was successful, 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 offset after the last valid
+ * input sequence.
+ * @bytes_written: the number of bytes 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 by GLib for
+ * filenames into a UTF-8 string. Note that on Windows GLib uses UTF-8
+ * for filenames; on other platforms, this function indirectly depends on
+ * the <link linkend="setlocale">current locale</link>.
+ *
+ * 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)
+{
+ const gchar *charset;
+
+ if (get_filename_charset (&charset))
+ return strdup_len (opsysstring, len, bytes_read, bytes_written, error);
+ else
+ return g_convert (opsysstring, len,
+ "UTF-8", charset, bytes_read, bytes_written, error);
+}
+
+#ifdef G_OS_WIN32
+
+#undef g_filename_to_utf8
+
+/* Binary compatibility version. Not for newly compiled code. */
+
+gchar*
+g_filename_to_utf8 (const gchar *opsysstring,
+ gssize len,
+ gsize *bytes_read,
+ gsize *bytes_written,
+ GError **error)
+{
+ const gchar *charset;
+
+ if (g_get_charset (&charset))
+ return strdup_len (opsysstring, len, bytes_read, bytes_written, error);
+ else
+ return g_convert (opsysstring, len,
+ "UTF-8", charset, bytes_read, bytes_written, error);
+}
+
+#endif
+
+/**
+ * g_filename_from_utf8:
+ * @utf8string: a UTF-8 encoded string.
+ * @len: the length of the string, or -1 if the string is
+ * nul-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 successful, 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 offset after the last valid
+ * input sequence.
+ * @bytes_written: the number of bytes 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 GLib uses for
+ * filenames. Note that on Windows GLib uses UTF-8 for filenames;
+ * on other platforms, this function indirectly depends on the
+ * <link linkend="setlocale">current locale</link>.
+ *
+ * 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)
+{
+ const gchar *charset;
+
+ if (get_filename_charset (&charset))
+ return strdup_len (utf8string, len, bytes_read, bytes_written, error);
+ else
+ return g_convert (utf8string, len,
+ charset, "UTF-8", bytes_read, bytes_written, error);
+}
+
+#ifdef G_OS_WIN32
+
+#undef g_filename_from_utf8
+
+/* Binary compatibility version. Not for newly compiled code. */
+
+gchar*
+g_filename_from_utf8 (const gchar *utf8string,
+ gssize len,
+ gsize *bytes_read,
+ gsize *bytes_written,
+ GError **error)
+{
+ const gchar *charset;
+
+ if (g_get_charset (&charset))
+ return strdup_len (utf8string, len, bytes_read, bytes_written, error);
+ else
+ return g_convert (utf8string, len,
+ charset, "UTF-8", bytes_read, bytes_written, error);
+}
+
+#endif
+
+/* Test of haystack has the needle prefix, comparing case
+ * insensitive. haystack may be UTF-8, but needle must
+ * contain only ascii. */
+static gboolean
+has_case_prefix (const gchar *haystack, const gchar *needle)
+{
+ const gchar *h, *n;
+
+ /* Eat one character at a time. */
+ h = haystack;
+ n = needle;
+
+ while (*n && *h &&
+ g_ascii_tolower (*n) == g_ascii_tolower (*h))
+ {
+ n++;
+ h++;
+ }
+
+ return *n == '\0';
+}
+
+typedef enum {
+ UNSAFE_ALL = 0x1, /* Escape all unsafe characters */
+ UNSAFE_ALLOW_PLUS = 0x2, /* Allows '+' */
+ UNSAFE_PATH = 0x8, /* Allows '/', '&', '=', ':', '@', '+', '$' and ',' */
+ UNSAFE_HOST = 0x10, /* Allows '/' and ':' and '@' */
+ UNSAFE_SLASHES = 0x20 /* Allows all characters except for '/' and '%' */
+} UnsafeCharacterSet;
+
+static const guchar acceptable[96] = {
+ /* A table of the ASCII chars from space (32) to DEL (127) */
+ /* ! " # $ % & ' ( ) * + , - . / */
+ 0x00,0x3F,0x20,0x20,0x28,0x00,0x2C,0x3F,0x3F,0x3F,0x3F,0x2A,0x28,0x3F,0x3F,0x1C,
+ /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */
+ 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x38,0x20,0x20,0x2C,0x20,0x20,
+ /* @ A B C D E F G H I J K L M N O */
+ 0x38,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
+ /* P Q R S T U V W X Y Z [ \ ] ^ _ */
+ 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x20,0x3F,
+ /* ` a b c d e f g h i j k l m n o */
+ 0x20,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
+ /* p q r s t u v w x y z { | } ~ DEL */
+ 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x3F,0x20
+};
+
+static const gchar hex[16] = "0123456789ABCDEF";
+
+/* Note: This escape function works on file: URIs, but if you want to
+ * escape something else, please read RFC-2396 */
+static gchar *
+g_escape_uri_string (const gchar *string,
+ UnsafeCharacterSet mask)
+{
+#define ACCEPTABLE(a) ((a)>=32 && (a)<128 && (acceptable[(a)-32] & use_mask))
+
+ const gchar *p;
+ gchar *q;
+ gchar *result;
+ int c;
+ gint unacceptable;
+ UnsafeCharacterSet use_mask;
+
+ g_return_val_if_fail (mask == UNSAFE_ALL
+ || mask == UNSAFE_ALLOW_PLUS
+ || mask == UNSAFE_PATH
+ || mask == UNSAFE_HOST
+ || mask == UNSAFE_SLASHES, NULL);
+
+ unacceptable = 0;
+ use_mask = mask;
+ for (p = string; *p != '\0'; p++)
+ {
+ c = (guchar) *p;
+ if (!ACCEPTABLE (c))
+ unacceptable++;
+ }
+
+ result = g_malloc (p - string + unacceptable * 2 + 1);
+
+ use_mask = mask;
+ for (q = result, p = string; *p != '\0'; p++)
+ {
+ c = (guchar) *p;
+
+ if (!ACCEPTABLE (c))
+ {
+ *q++ = '%'; /* means hex coming */
+ *q++ = hex[c >> 4];
+ *q++ = hex[c & 15];
+ }
+ else
+ *q++ = *p;
+ }
+
+ *q = '\0';
+
+ return result;
+}
+
+
+static gchar *
+g_escape_file_uri (const gchar *hostname,
+ const gchar *pathname)
+{
+ char *escaped_hostname = NULL;
+ char *escaped_path;
+ char *res;
+
+#ifdef G_OS_WIN32
+ char *p, *backslash;
+
+ /* Turn backslashes into forward slashes. That's what Netscape
+ * does, and they are actually more or less equivalent in Windows.
+ */
+
+ pathname = g_strdup (pathname);
+ p = (char *) pathname;
+
+ while ((backslash = strchr (p, '\\')) != NULL)
+ {
+ *backslash = '/';
+ p = backslash + 1;
+ }
+#endif
+
+ if (hostname && *hostname != '\0')
+ {
+ escaped_hostname = g_escape_uri_string (hostname, UNSAFE_HOST);
+ }
+
+ escaped_path = g_escape_uri_string (pathname, UNSAFE_PATH);
+
+ res = g_strconcat ("file://",
+ (escaped_hostname) ? escaped_hostname : "",
+ (*escaped_path != '/') ? "/" : "",
+ escaped_path,
+ NULL);
+
+#ifdef G_OS_WIN32
+ g_free ((char *) pathname);
+#endif
+
+ g_free (escaped_hostname);
+ g_free (escaped_path);
+
+ return res;
+}
+
+static int
+unescape_character (const char *scanner)
+{
+ int first_digit;
+ int second_digit;
+
+ first_digit = g_ascii_xdigit_value (scanner[0]);
+ if (first_digit < 0)
+ return -1;
+
+ second_digit = g_ascii_xdigit_value (scanner[1]);
+ if (second_digit < 0)
+ return -1;
+
+ return (first_digit << 4) | second_digit;
+}
+
+static gchar *
+g_unescape_uri_string (const char *escaped,
+ int len,
+ const char *illegal_escaped_characters,
+ gboolean ascii_must_not_be_escaped)
+{
+ const gchar *in, *in_end;
+ gchar *out, *result;
+ int c;
+
+ if (escaped == NULL)
+ return NULL;
+
+ if (len < 0)
+ len = strlen (escaped);
+
+ result = g_malloc (len + 1);
+
+ out = result;
+ for (in = escaped, in_end = escaped + len; in < in_end; in++)
+ {
+ c = *in;
+
+ if (c == '%')
+ {
+ /* catch partial escape sequences past the end of the substring */
+ if (in + 3 > in_end)
+ break;
+
+ c = unescape_character (in + 1);
+
+ /* catch bad escape sequences and NUL characters */
+ if (c <= 0)
+ break;
+
+ /* catch escaped ASCII */
+ if (ascii_must_not_be_escaped && c <= 0x7F)
+ break;
+
+ /* catch other illegal escaped characters */
+ if (strchr (illegal_escaped_characters, c) != NULL)
+ break;
+
+ in += 2;
+ }
+
+ *out++ = c;
+ }
+
+ g_assert (out - result <= len);
+ *out = '\0';
+
+ if (in != in_end)
+ {
+ g_free (result);
+ return NULL;
+ }
+
+ return result;
+}
+
+static gboolean
+is_asciialphanum (gunichar c)
+{
+ return c <= 0x7F && g_ascii_isalnum (c);
+}
+
+static gboolean
+is_asciialpha (gunichar c)
+{
+ return c <= 0x7F && g_ascii_isalpha (c);
+}
+
+/* allows an empty string */
+static gboolean
+hostname_validate (const char *hostname)
+{
+ const char *p;
+ gunichar c, first_char, last_char;
+
+ p = hostname;
+ if (*p == '\0')
+ return TRUE;
+ do
+ {
+ /* read in a label */
+ c = g_utf8_get_char (p);
+ p = g_utf8_next_char (p);
+ if (!is_asciialphanum (c))
+ return FALSE;
+ first_char = c;
+ do
+ {
+ last_char = c;
+ c = g_utf8_get_char (p);
+ p = g_utf8_next_char (p);
+ }
+ while (is_asciialphanum (c) || c == '-');
+ if (last_char == '-')
+ return FALSE;
+
+ /* if that was the last label, check that it was a toplabel */
+ if (c == '\0' || (c == '.' && *p == '\0'))
+ return is_asciialpha (first_char);
+ }
+ while (c == '.');
+ return FALSE;
+}
+
+/**
+ * g_filename_from_uri:
+ * @uri: a uri describing a filename (escaped, encoded in ASCII).
+ * @hostname: Location to store hostname for the URI, or %NULL.
+ * If there is no hostname in the URI, %NULL will be
+ * stored in this location.
+ * @error: location to store the error occuring, or %NULL to ignore
+ * errors. Any of the errors in #GConvertError may occur.
+ *
+ * Converts an escaped ASCII-encoded URI to a local filename in the
+ * encoding used for filenames.
+ *
+ * Return value: a newly-allocated string holding the resulting
+ * filename, or %NULL on an error.
+ **/
+gchar *
+g_filename_from_uri (const gchar *uri,
+ gchar **hostname,
+ GError **error)
+{
+ const char *path_part;
+ const char *host_part;
+ char *unescaped_hostname;
+ char *result;
+ char *filename;
+ int offs;
+#ifdef G_OS_WIN32
+ char *p, *slash;
+#endif
+
+ if (hostname)
+ *hostname = NULL;
+
+ if (!has_case_prefix (uri, "file:/"))
+ {
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI,
+ _("The URI '%s' is not an absolute URI using the \"file\" scheme"),
+ uri);
+ return NULL;
+ }
+
+ path_part = uri + strlen ("file:");
+
+ if (strchr (path_part, '#') != NULL)
+ {
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI,
+ _("The local file URI '%s' may not include a '#'"),
+ uri);
+ return NULL;
+ }
+
+ if (has_case_prefix (path_part, "///"))
+ path_part += 2;
+ else if (has_case_prefix (path_part, "//"))
+ {
+ path_part += 2;
+ host_part = path_part;
+
+ path_part = strchr (path_part, '/');
+
+ if (path_part == NULL)
+ {
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI,
+ _("The URI '%s' is invalid"),
+ uri);
+ return NULL;
+ }
+
+ unescaped_hostname = g_unescape_uri_string (host_part, path_part - host_part, "", TRUE);
+
+ if (unescaped_hostname == NULL ||
+ !hostname_validate (unescaped_hostname))
+ {
+ g_free (unescaped_hostname);
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI,
+ _("The hostname of the URI '%s' is invalid"),
+ uri);
+ return NULL;
+ }
+
+ if (hostname)
+ *hostname = unescaped_hostname;
+ else
+ g_free (unescaped_hostname);
+ }
+
+ filename = g_unescape_uri_string (path_part, -1, "/", FALSE);
+
+ if (filename == NULL)
+ {
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI,
+ _("The URI '%s' contains invalidly escaped characters"),
+ uri);
+ return NULL;
+ }
+
+ offs = 0;
+#ifdef G_OS_WIN32
+ /* Drop localhost */
+ if (hostname && *hostname != NULL &&
+ g_ascii_strcasecmp (*hostname, "localhost") == 0)
+ {
+ g_free (*hostname);
+ *hostname = NULL;
+ }
+
+ /* Turn slashes into backslashes, because that's the canonical spelling */
+ p = filename;
+ while ((slash = strchr (p, '/')) != NULL)
+ {
+ *slash = '\\';
+ p = slash + 1;
+ }
+
+ /* Windows URIs with a drive letter can be like "file://host/c:/foo"
+ * or "file://host/c|/foo" (some Netscape versions). In those cases, start
+ * the filename from the drive letter.
+ */
+ if (g_ascii_isalpha (filename[1]))
+ {
+ if (filename[2] == ':')
+ offs = 1;
+ else if (filename[2] == '|')
+ {
+ filename[2] = ':';
+ offs = 1;
+ }
+ }
+#endif
+
+ result = g_strdup (filename + offs);
+ g_free (filename);
+
+ return result;
+}
+
+#ifdef G_OS_WIN32
+
+#undef g_filename_from_uri
+
+gchar *
+g_filename_from_uri (const gchar *uri,
+ gchar **hostname,
+ GError **error)
+{
+ gchar *utf8_filename;
+ gchar *retval = NULL;
+
+ utf8_filename = g_filename_from_uri_utf8 (uri, hostname, error);
+ if (utf8_filename)
+ {
+ retval = g_locale_from_utf8 (utf8_filename, -1, NULL, NULL, error);
+ g_free (utf8_filename);
+ }
+ return retval;
+}
+
+#endif
+
+/**
+ * g_filename_to_uri:
+ * @filename: an absolute filename specified in the GLib file name encoding,
+ * which is the on-disk file name bytes on Unix, and UTF-8 on
+ * Windows
+ * @hostname: A UTF-8 encoded hostname, or %NULL for none.
+ * @error: location to store the error occuring, or %NULL to ignore
+ * errors. Any of the errors in #GConvertError may occur.
+ *
+ * Converts an absolute filename to an escaped ASCII-encoded URI, with the path
+ * component following Section 3.3. of RFC 2396.
+ *
+ * Return value: a newly-allocated string holding the resulting
+ * URI, or %NULL on an error.
+ **/
+gchar *
+g_filename_to_uri (const gchar *filename,
+ const gchar *hostname,
+ GError **error)
+{
+ char *escaped_uri;
+
+ g_return_val_if_fail (filename != NULL, NULL);
+
+ if (!g_path_is_absolute (filename))
+ {
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH,
+ _("The pathname '%s' is not an absolute path"),
+ filename);
+ return NULL;
+ }
+
+ if (hostname &&
+ !(g_utf8_validate (hostname, -1, NULL)
+ && hostname_validate (hostname)))
+ {
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
+ _("Invalid hostname"));
+ return NULL;
+ }
+
+#ifdef G_OS_WIN32
+ /* Don't use localhost unnecessarily */
+ if (hostname && g_ascii_strcasecmp (hostname, "localhost") == 0)
+ hostname = NULL;
+#endif
+
+ escaped_uri = g_escape_file_uri (hostname, filename);
+
+ return escaped_uri;
+}
+
+#ifdef G_OS_WIN32
+
+#undef g_filename_to_uri
+
+gchar *
+g_filename_to_uri (const gchar *filename,
+ const gchar *hostname,
+ GError **error)
+{
+ gchar *utf8_filename;
+ gchar *retval = NULL;
+
+ utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, error);
+
+ if (utf8_filename)
+ {
+ retval = g_filename_to_uri_utf8 (utf8_filename, hostname, error);
+ g_free (utf8_filename);
+ }
+
+ return retval;
+}
+
+#endif
+
+/**
+ * g_uri_list_extract_uris:
+ * @uri_list: an URI list
+ *
+ * Splits an URI list conforming to the text/uri-list
+ * mime type defined in RFC 2483 into individual URIs,
+ * discarding any comments. The URIs are not validated.
+ *
+ * Returns: a newly allocated %NULL-terminated list of
+ * strings holding the individual URIs. The array should
+ * be freed with g_strfreev().
+ *
+ * Since: 2.6
+ */
+gchar **
+g_uri_list_extract_uris (const gchar *uri_list)
+{
+ GSList *uris, *u;
+ const gchar *p, *q;
+ gchar **result;
+ gint n_uris = 0;
+
+ uris = NULL;
+
+ p = uri_list;
+
+ /* We don't actually try to validate the URI according to RFC
+ * 2396, or even check for allowed characters - we just ignore
+ * comments and trim whitespace off the ends. We also
+ * allow LF delimination as well as the specified CRLF.
+ *
+ * We do allow comments like specified in RFC 2483.
+ */
+ while (p)
+ {
+ if (*p != '#')
+ {
+ while (g_ascii_isspace (*p))
+ p++;
+
+ q = p;
+ while (*q && (*q != '\n') && (*q != '\r'))
+ q++;
+
+ if (q > p)
+ {
+ q--;
+ while (q > p && g_ascii_isspace (*q))
+ q--;
+
+ if (q > p)
+ {
+ uris = g_slist_prepend (uris, g_strndup (p, q - p + 1));
+ n_uris++;
+ }
+ }
+ }
+ p = strchr (p, '\n');
+ if (p)
+ p++;
+ }
+
+ result = g_new (gchar *, n_uris + 1);
+
+ result[n_uris--] = NULL;
+ for (u = uris; u; u = u->next)
+ result[n_uris--] = u->data;
+
+ g_slist_free (uris);
+
+ return result;
+}
+
+/**
+ * g_filename_display_basename:
+ * @filename: an absolute pathname in the GLib file name encoding
+ *
+ * Returns the display basename for the particular filename, guaranteed
+ * to be valid UTF-8. The display name might not be identical to the filename,
+ * for instance there might be problems converting it to UTF-8, and some files
+ * can be translated in the display.
+ *
+ * If GLib can not make sense of the encoding of @filename, as a last resort it
+ * replaces unknown characters with U+FFFD, the Unicode replacement character.
+ * You can search the result for the UTF-8 encoding of this character (which is
+ * "\357\277\275" in octal notation) to find out if @filename was in an invalid
+ * encoding.
+ *
+ * You must pass the whole absolute pathname to this functions so that
+ * translation of well known locations can be done.
+ *
+ * This function is preferred over g_filename_display_name() if you know the
+ * whole path, as it allows translation.
+ *
+ * Return value: a newly allocated string containing
+ * a rendition of the basename of the filename in valid UTF-8
+ *
+ * Since: 2.6
+ **/
+gchar *
+g_filename_display_basename (const gchar *filename)
+{
+ char *basename;
+ char *display_name;
+
+ g_return_val_if_fail (filename != NULL, NULL);
+
+ basename = g_path_get_basename (filename);
+ display_name = g_filename_display_name (basename);
+ g_free (basename);
+ return display_name;
+}
+
+/**
+ * g_filename_display_name:
+ * @filename: a pathname hopefully in the GLib file name encoding
+ *
+ * Converts a filename into a valid UTF-8 string. The conversion is
+ * not necessarily reversible, so you should keep the original around
+ * and use the return value of this function only for display purposes.
+ * Unlike g_filename_to_utf8(), the result is guaranteed to be non-%NULL
+ * even if the filename actually isn't in the GLib file name encoding.
+ *
+ * If GLib can not make sense of the encoding of @filename, as a last resort it
+ * replaces unknown characters with U+FFFD, the Unicode replacement character.
+ * You can search the result for the UTF-8 encoding of this character (which is
+ * "\357\277\275" in octal notation) to find out if @filename was in an invalid
+ * encoding.
+ *
+ * If you know the whole pathname of the file you should use
+ * g_filename_display_basename(), since that allows location-based
+ * translation of filenames.
+ *
+ * Return value: a newly allocated string containing
+ * a rendition of the filename in valid UTF-8
+ *
+ * Since: 2.6
+ **/
+gchar *
+g_filename_display_name (const gchar *filename)
+{
+ gint i;
+ const gchar **charsets;
+ gchar *display_name = NULL;
+ gboolean is_utf8;
+
+ is_utf8 = g_get_filename_charsets (&charsets);
+
+ if (is_utf8)
+ {
+ if (g_utf8_validate (filename, -1, NULL))
+ display_name = g_strdup (filename);
+ }
+
+ if (!display_name)
+ {
+ /* Try to convert from the filename charsets to UTF-8.
+ * Skip the first charset if it is UTF-8.
+ */
+ for (i = is_utf8 ? 1 : 0; charsets[i]; i++)
+ {
+ display_name = g_convert (filename, -1, "UTF-8", charsets[i],
+ NULL, NULL, NULL);
+
+ if (display_name)
+ break;
+ }
+ }
+
+ /* if all conversions failed, we replace invalid UTF-8
+ * by a question mark
+ */
+ if (!display_name)
+ display_name = _g_utf8_make_valid (filename);
+
+ return display_name;
+}
+
+#define __G_CONVERT_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gconvert.h b/trunk/glib/gconvert.h
new file mode 100644
index 000000000..9e6ca6501
--- /dev/null
+++ b/trunk/glib/gconvert.h
@@ -0,0 +1,134 @@
+/* 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 <glib/gerror.h>
+
+G_BEGIN_DECLS
+
+typedef enum
+{
+ G_CONVERT_ERROR_NO_CONVERSION,
+ G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
+ G_CONVERT_ERROR_FAILED,
+ G_CONVERT_ERROR_PARTIAL_INPUT,
+ G_CONVERT_ERROR_BAD_URI,
+ G_CONVERT_ERROR_NOT_ABSOLUTE_PATH
+} 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);
+gsize 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) G_GNUC_MALLOC;
+gchar* g_convert_with_iconv (const gchar *str,
+ gssize len,
+ GIConv converter,
+ gsize *bytes_read,
+ gsize *bytes_written,
+ GError **error) G_GNUC_MALLOC;
+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) G_GNUC_MALLOC;
+
+
+/* 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) G_GNUC_MALLOC;
+gchar* g_locale_from_utf8 (const gchar *utf8string,
+ gssize len,
+ gsize *bytes_read,
+ gsize *bytes_written,
+ GError **error) G_GNUC_MALLOC;
+
+/* Convert between the operating system (or C runtime)
+ * representation of file names and UTF-8.
+ */
+#ifdef G_OS_WIN32
+#define g_filename_to_utf8 g_filename_to_utf8_utf8
+#define g_filename_from_utf8 g_filename_from_utf8_utf8
+#define g_filename_from_uri g_filename_from_uri_utf8
+#define g_filename_to_uri g_filename_to_uri_utf8
+#endif
+
+gchar* g_filename_to_utf8 (const gchar *opsysstring,
+ gssize len,
+ gsize *bytes_read,
+ gsize *bytes_written,
+ GError **error) G_GNUC_MALLOC;
+gchar* g_filename_from_utf8 (const gchar *utf8string,
+ gssize len,
+ gsize *bytes_read,
+ gsize *bytes_written,
+ GError **error) G_GNUC_MALLOC;
+
+gchar *g_filename_from_uri (const gchar *uri,
+ gchar **hostname,
+ GError **error) G_GNUC_MALLOC;
+
+gchar *g_filename_to_uri (const gchar *filename,
+ const gchar *hostname,
+ GError **error) G_GNUC_MALLOC;
+gchar *g_filename_display_name (const gchar *filename) G_GNUC_MALLOC;
+gboolean g_get_filename_charsets (G_CONST_RETURN gchar ***charsets);
+
+gchar *g_filename_display_basename (const gchar *filename) G_GNUC_MALLOC;
+
+gchar **g_uri_list_extract_uris (const gchar *uri_list) G_GNUC_MALLOC;
+
+G_END_DECLS
+
+#endif /* __G_CONVERT_H__ */
diff --git a/trunk/glib/gdataset.c b/trunk/glib/gdataset.c
new file mode 100644
index 000000000..cc2a5c7ce
--- /dev/null
+++ b/trunk/glib/gdataset.c
@@ -0,0 +1,757 @@
+/* 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 ; except for g_data*_foreach()
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include "glib.h"
+#include "gdatasetprivate.h"
+#include "galias.h"
+
+
+/* --- defines --- */
+#define G_QUARK_BLOCK_SIZE (512)
+
+/* datalist pointer accesses have to be carried out atomically */
+#define G_DATALIST_GET_POINTER(datalist) \
+ ((GData*) ((gsize) g_atomic_pointer_get ((gpointer*) datalist) & ~(gsize) G_DATALIST_FLAGS_MASK))
+
+#define G_DATALIST_SET_POINTER(datalist, pointer) G_STMT_START { \
+ gpointer _oldv, _newv; \
+ do { \
+ _oldv = g_atomic_pointer_get (datalist); \
+ _newv = (gpointer) (((gsize) _oldv & G_DATALIST_FLAGS_MASK) | (gsize) pointer); \
+ } while (!g_atomic_pointer_compare_and_exchange ((void**) datalist, _oldv, _newv)); \
+} G_STMT_END
+
+/* --- 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? */
+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 = G_DATALIST_GET_POINTER (datalist);
+ G_DATALIST_SET_POINTER (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);
+ }
+
+ g_slice_free (GData, 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 (G_DATALIST_GET_POINTER (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_slice_free (GDataset, 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 = G_DATALIST_GET_POINTER (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
+ {
+ G_DATALIST_SET_POINTER (datalist, list->next);
+
+ /* the dataset destruction *must* be done
+ * prior to invocation of the data destroy function
+ */
+ if (!list->next && 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;
+
+ g_slice_free (GData, 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
+ * invocation of the destroy function
+ */
+ G_UNLOCK (g_dataset_global);
+ dfunc (ddata);
+ G_LOCK (g_dataset_global);
+ }
+
+ return NULL;
+ }
+
+ list = list->next;
+ }
+
+ list = g_slice_new (GData);
+ list->next = G_DATALIST_GET_POINTER (datalist);
+ list->id = key_id;
+ list->data = data;
+ list->destroy_func = destroy_func;
+ G_DATALIST_SET_POINTER (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_slice_new (GDataset);
+ 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)
+{
+ gpointer data = NULL;
+ g_return_val_if_fail (datalist != NULL, NULL);
+ if (key_id)
+ {
+ register GData *list;
+ G_LOCK (g_dataset_global);
+ for (list = G_DATALIST_GET_POINTER (datalist); list; list = list->next)
+ if (list->id == key_id)
+ {
+ data = list->data;
+ break;
+ }
+ G_UNLOCK (g_dataset_global);
+ }
+ return data;
+}
+
+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 = G_DATALIST_GET_POINTER (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);
+
+ g_atomic_pointer_set ((gpointer*) datalist, NULL);
+}
+
+/**
+ * g_datalist_set_flags:
+ * @datalist: pointer to the location that holds a list
+ * @flags: the flags to turn on. The values of the flags are
+ * restricted by %G_DATALIST_FLAGS_MASK (currently
+ * 3; giving two possible boolean flags).
+ * A value for @flags that doesn't fit within the mask is
+ * an error.
+ *
+ * Turns on flag values for a data list. This function is used
+ * to keep a small number of boolean flags in an object with
+ * a data list without using any additional space. It is
+ * not generally useful except in circumstances where space
+ * is very tight. (It is used in the base #GObject type, for
+ * example.)
+ *
+ * Since: 2.8
+ **/
+void
+g_datalist_set_flags (GData **datalist,
+ guint flags)
+{
+ gpointer oldvalue;
+ g_return_if_fail (datalist != NULL);
+ g_return_if_fail ((flags & ~G_DATALIST_FLAGS_MASK) == 0);
+
+ do
+ {
+ oldvalue = g_atomic_pointer_get (datalist);
+ }
+ while (!g_atomic_pointer_compare_and_exchange ((void**) datalist, oldvalue,
+ (gpointer) ((gsize) oldvalue | flags)));
+}
+
+/**
+ * g_datalist_unset_flags:
+ * @datalist: pointer to the location that holds a list
+ * @flags: the flags to turn off. The values of the flags are
+ * restricted by %G_DATALIST_FLAGS_MASK (currently
+ * 3: giving two possible boolean flags).
+ * A value for @flags that doesn't fit within the mask is
+ * an error.
+ *
+ * Turns off flag values for a data list. See g_datalist_unset_flags()
+ *
+ * Since: 2.8
+ **/
+void
+g_datalist_unset_flags (GData **datalist,
+ guint flags)
+{
+ gpointer oldvalue;
+ g_return_if_fail (datalist != NULL);
+ g_return_if_fail ((flags & ~G_DATALIST_FLAGS_MASK) == 0);
+
+ do
+ {
+ oldvalue = g_atomic_pointer_get (datalist);
+ }
+ while (!g_atomic_pointer_compare_and_exchange ((void**) datalist, oldvalue,
+ (gpointer) ((gsize) oldvalue & ~(gsize) flags)));
+}
+
+/**
+ * g_datalist_get_flags:
+ * @datalist: pointer to the location that holds a list
+ *
+ * Gets flags values packed in together with the datalist.
+ * See g_datalist_set_flags().
+ *
+ * Return value: the flags of the datalist
+ *
+ * Since: 2.8
+ **/
+guint
+g_datalist_get_flags (GData **datalist)
+{
+ g_return_val_if_fail (datalist != NULL, 0);
+
+ return G_DATALIST_GET_FLAGS (datalist); /* atomic macro */
+}
+
+/* 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;
+}
+
+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;
+}
+
+/* HOLDS: g_quark_global_lock */
+static inline GQuark
+g_quark_from_string_internal (const gchar *string,
+ gboolean duplicate)
+{
+ GQuark quark = 0;
+
+ if (g_quark_ht)
+ quark = GPOINTER_TO_UINT (g_hash_table_lookup (g_quark_ht, string));
+
+ if (!quark)
+ quark = g_quark_new (duplicate ? g_strdup (string) : (gchar *)string);
+
+ 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);
+ quark = g_quark_from_string_internal (string, TRUE);
+ 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);
+ quark = g_quark_from_string_internal (string, FALSE);
+ 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 < g_quark_seq_id)
+ result = g_quarks[quark];
+ 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);
+ if (!g_quark_ht)
+ {
+ g_assert (g_quark_seq_id == 0);
+ g_quark_ht = g_hash_table_new (g_str_hash, g_str_equal);
+ g_quarks[g_quark_seq_id++] = NULL;
+ }
+
+ quark = g_quark_seq_id++;
+ g_quarks[quark] = string;
+ g_hash_table_insert (g_quark_ht, string, GUINT_TO_POINTER (quark));
+
+ return quark;
+}
+
+/**
+ * g_intern_string:
+ * @string: a string
+ *
+ * Returns a canonical representation for @string. Interned strings can
+ * be compared for equality by comparing the pointers, instead of using strcmp().
+ *
+ * Returns: a canonical representation for the string
+ *
+ * Since: 2.10
+ */
+G_CONST_RETURN gchar*
+g_intern_string (const gchar *string)
+{
+ const gchar *result;
+ GQuark quark;
+
+ if (!string)
+ return NULL;
+
+ G_LOCK (g_quark_global);
+ quark = g_quark_from_string_internal (string, TRUE);
+ result = g_quarks[quark];
+ G_UNLOCK (g_quark_global);
+
+ return result;
+}
+
+/**
+ * g_intern_static_string:
+ * @string: a static string
+ *
+ * Returns a canonical representation for @string. Interned strings can
+ * be compared for equality by comparing the pointers, instead of using strcmp().
+ * g_intern_static_string() does not copy the string, therefore @string must
+ * not be freed or modified.
+ *
+ * Returns: a canonical representation for the string
+ *
+ * Since: 2.10
+ */
+G_CONST_RETURN gchar*
+g_intern_static_string (const gchar *string)
+{
+ GQuark quark;
+ const gchar *result;
+
+ if (!string)
+ return NULL;
+
+ G_LOCK (g_quark_global);
+ quark = g_quark_from_string_internal (string, FALSE);
+ result = g_quarks[quark];
+ G_UNLOCK (g_quark_global);
+
+ return result;
+}
+
+
+
+#define __G_DATASET_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gdataset.h b/trunk/glib/gdataset.h
new file mode 100644
index 000000000..0376cac97
--- /dev/null
+++ b/trunk/glib/gdataset.h
@@ -0,0 +1,122 @@
+/* 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 <glib/gquark.h>
+
+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);
+
+/**
+ * G_DATALIST_FLAGS_MASK:
+ *
+ * A bitmask that restricts the possible flags passed to
+ * g_datalist_set_flags(). Passing a flags value where
+ * flags & ~G_DATALIST_FLAGS_MASK != 0 is an error.
+ */
+#define G_DATALIST_FLAGS_MASK 0x3
+
+void g_datalist_set_flags (GData **datalist,
+ guint flags);
+void g_datalist_unset_flags (GData **datalist,
+ guint flags);
+guint g_datalist_get_flags (GData **datalist);
+
+#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/trunk/glib/gdatasetprivate.h b/trunk/glib/gdatasetprivate.h
new file mode 100644
index 000000000..9397c60aa
--- /dev/null
+++ b/trunk/glib/gdatasetprivate.h
@@ -0,0 +1,44 @@
+/* GLIB - Library of useful routines for C programming
+ * gdataset-private.h: Internal macros for accessing dataset values
+ * Copyright (C) 2005 Red Hat
+ *
+ * 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_DATASETPRIVATE_H__
+#define __G_DATASETPRIVATE_H__
+
+#include <glib/gdataset.h>
+
+G_BEGIN_DECLS
+
+/* GET_FLAGS is implemented via atomic pointer access, to allow memory
+ * barriers to take effect without acquiring the global dataset mutex.
+ */
+#define G_DATALIST_GET_FLAGS(datalist) \
+ ((gsize) g_atomic_pointer_get ((gpointer*) datalist) & G_DATALIST_FLAGS_MASK)
+
+
+G_END_DECLS
+
+#endif /* __G_DATASETPRIVATE_H__ */
diff --git a/trunk/glib/gdate.c b/trunk/glib/gdate.c
new file mode 100644
index 000000000..f7ccc1f00
--- /dev/null
+++ b/trunk/glib/gdate.c
@@ -0,0 +1,1918 @@
+/* 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 "config.h"
+
+#define DEBUG_MSG(x) /* */
+#ifdef G_ENABLE_DEBUG
+/* #define DEBUG_MSG(args) g_message args ; */
+#endif
+
+#include "glib.h"
+
+#include <time.h>
+#include <string.h>
+#include <stdlib.h>
+#include <locale.h>
+
+#ifdef G_OS_WIN32
+#include <windows.h>
+#endif
+
+#include "galias.h"
+
+GDate*
+g_date_new (void)
+{
+ 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 (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 (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 (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 (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 (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 (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 (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 (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));
+}
+
+/**
+ * g_date_get_iso8601_week_of_year:
+ * @date: a valid #GDate
+ *
+ * Returns the week of the year, where weeks are interpreted according
+ * to ISO 8601.
+ *
+ * Returns: ISO 8601 week number of the year.
+ *
+ * Since: 2.6
+ **/
+guint
+g_date_get_iso8601_week_of_year (const GDate *d)
+{
+ guint j, d4, L, d1, w;
+
+ g_return_val_if_fail (g_date_valid (d), 0);
+
+ if (!d->julian)
+ g_date_update_julian (d);
+ g_return_val_if_fail (d->julian, 0);
+
+ /* 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.
+ */
+ j = d->julian_days + 1721425;
+ d4 = (j + 31741 - (j % 7)) % 146097 % 36524 % 1461;
+ L = d4 / 1460;
+ d1 = ((d4 - L) % 365) + L;
+ w = d1 / 7 + 1;
+
+ return w;
+}
+
+gint
+g_date_days_between (const GDate *d1,
+ const GDate *d2)
+{
+ 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] =
+{
+ NULL,
+};
+
+static gchar *short_month_names[13] =
+{
+ 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 const 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;
+
+/* Adjustment of locale era to AD, non-zero means using locale era
+ */
+static gint locale_era_adjust = 0;
+
+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 && g_ascii_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 *casefold;
+ gchar *normalized;
+
+ casefold = g_utf8_casefold (str, -1);
+ normalized = g_utf8_normalize (casefold, -1, G_NORMALIZE_ALL);
+ g_free (casefold);
+
+ i = 1;
+ while (i < 13)
+ {
+ if (long_month_names[i] != NULL)
+ {
+ const gchar *found = strstr (normalized, long_month_names[i]);
+
+ if (found != NULL)
+ {
+ pt->month = i;
+ break;
+ }
+ }
+
+ if (short_month_names[i] != NULL)
+ {
+ const gchar *found = strstr (normalized, short_month_names[i]);
+
+ if (found != NULL)
+ {
+ pt->month = i;
+ break;
+ }
+ }
+
+ ++i;
+ }
+
+ g_free (normalized);
+ }
+}
+
+/* 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);
+
+ short_month_names[0] = "Error";
+ long_month_names[0] = "Error";
+
+ while (i < 13)
+ {
+ gchar *casefold;
+
+ g_date_set_dmy (&d, 1, i, 1);
+
+ g_return_if_fail (g_date_valid (&d));
+
+ g_date_strftime (buf, 127, "%b", &d);
+
+ casefold = g_utf8_casefold (buf, -1);
+ g_free (short_month_names[i]);
+ short_month_names[i] = g_utf8_normalize (casefold, -1, G_NORMALIZE_ALL);
+ g_free (casefold);
+
+ g_date_strftime (buf, 127, "%B", &d);
+ casefold = g_utf8_casefold (buf, -1);
+ g_free (long_month_names[i]);
+ long_month_names[i] = g_utf8_normalize (casefold, -1, G_NORMALIZE_ALL);
+ g_free (casefold);
+
+ ++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:
+ /* assume locale era */
+ locale_era_adjust = 1976 - testpt.n[i];
+ dmy_order[i] = G_DATE_YEAR;
+ 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 (locale_era_adjust != 0)
+ {
+ y += locale_era_adjust;
+ }
+ else 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);
+}
+
+/**
+ * g_date_set_time_t:
+ * @date: a #GDate
+ * @timet: <type>time_t</type> value to set
+ *
+ * Sets the value of a date from a <type>time_t</type> value.
+ *
+ * To set the value of a date to the current day, you could write:
+ * <informalexample><programlisting>
+ * g_date_set_time_t (date, time (NULL));
+ * </programlisting></informalexample>
+ *
+ * Since: 2.10
+ */
+void
+g_date_set_time_t (GDate *date,
+ time_t timet)
+{
+ struct tm tm;
+
+ g_return_if_fail (date != NULL);
+
+#ifdef HAVE_LOCALTIME_R
+ localtime_r (&timet, &tm);
+#else
+ {
+ struct tm *ptm = localtime (&timet);
+
+ if (ptm == NULL)
+ {
+ /* Happens at least in Microsoft's C library if you pass a
+ * negative time_t. Use 2000-01-01 as default date.
+ */
+#ifndef G_DISABLE_CHECKS
+ g_return_if_fail_warning (G_LOG_DOMAIN, "g_date_set_time", "ptm != NULL");
+#endif
+
+ tm.tm_mon = 0;
+ tm.tm_mday = 1;
+ tm.tm_year = 100;
+ }
+ else
+ memcpy ((void *) &tm, (void *) ptm, sizeof(struct tm));
+ }
+#endif
+
+ date->julian = FALSE;
+
+ date->month = tm.tm_mon + 1;
+ date->day = tm.tm_mday;
+ date->year = tm.tm_year + 1900;
+
+ g_return_if_fail (g_date_valid_dmy (date->day, date->month, date->year));
+
+ date->dmy = TRUE;
+}
+
+
+/**
+ * g_date_set_time:
+ * @date: a #GDate.
+ * @time_: #GTime value to set.
+ *
+ * Sets the value of a date from a #GTime value.
+ *
+ * @Deprecated:2.10: Use g_date_set_time_t() instead.
+ */
+void
+g_date_set_time (GDate *date,
+ GTime time_)
+{
+ g_date_set_time_t (date, (time_t) time_);
+}
+
+/**
+ * g_date_set_time_val:
+ * @date: a #GDate
+ * @timeval: #GTimeVal value to set
+ *
+ * Sets the value of a date from a #GTimeVal value. Note that the
+ * @tv_usec member is ignored, because #GDate can't make use of the
+ * additional precision.
+ *
+ * Since: 2.10
+ */
+void
+g_date_set_time_val (GDate *date,
+ GTimeVal *timeval)
+{
+ g_date_set_time_t (date, (time_t) timeval->tv_sec);
+}
+
+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 (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 (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 (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 (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 (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 (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 (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 (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 (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 (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 (g_date_valid (date1));
+ g_return_if_fail (g_date_valid (date2));
+
+ if (g_date_compare (date1, date2) > 0)
+ {
+ GDate tmp = *date1;
+ *date1 = *date2;
+ *date2 = tmp;
+ }
+}
+
+#ifdef G_OS_WIN32
+static gsize
+win32_strftime_helper (const GDate *d,
+ const gchar *format,
+ const struct tm *tm,
+ gchar *s,
+ gsize slen)
+{
+ SYSTEMTIME systemtime;
+ TIME_ZONE_INFORMATION tzinfo;
+ LCID lcid;
+ int n, k;
+ GArray *result;
+ const gchar *p;
+ gunichar c;
+ const wchar_t digits[] = L"0123456789";
+ gchar *convbuf;
+ glong convlen = 0;
+ gsize retval;
+
+ systemtime.wYear = tm->tm_year + 1900;
+ systemtime.wMonth = tm->tm_mon + 1;
+ systemtime.wDayOfWeek = tm->tm_wday;
+ systemtime.wDay = tm->tm_mday;
+ systemtime.wHour = tm->tm_hour;
+ systemtime.wMinute = tm->tm_min;
+ systemtime.wSecond = tm->tm_sec;
+ systemtime.wMilliseconds = 0;
+
+ lcid = GetThreadLocale ();
+ result = g_array_sized_new (FALSE, FALSE, sizeof (wchar_t), MAX (128, strlen (format) * 2));
+
+ p = format;
+ while (*p)
+ {
+ c = g_utf8_get_char (p);
+ if (c == '%')
+ {
+ p = g_utf8_next_char (p);
+ if (!*p)
+ {
+ s[0] = '\0';
+ g_array_free (result, TRUE);
+
+ return 0;
+ }
+
+ c = g_utf8_get_char (p);
+ if (c == 'E' || c == 'O')
+ {
+ /* Ignore modified conversion specifiers for now. */
+ p = g_utf8_next_char (p);
+ if (!*p)
+ {
+ s[0] = '\0';
+ g_array_free (result, TRUE);
+
+ return 0;
+ }
+
+ c = g_utf8_get_char (p);
+ }
+
+ switch (c)
+ {
+ case 'a':
+ if (systemtime.wDayOfWeek == 0)
+ k = 6;
+ else
+ k = systemtime.wDayOfWeek - 1;
+ n = GetLocaleInfoW (lcid, LOCALE_SABBREVDAYNAME1+k, NULL, 0);
+ g_array_set_size (result, result->len + n);
+ GetLocaleInfoW (lcid, LOCALE_SABBREVDAYNAME1+k, ((wchar_t *) result->data) + result->len - n, n);
+ g_array_set_size (result, result->len - 1);
+ break;
+ case 'A':
+ if (systemtime.wDayOfWeek == 0)
+ k = 6;
+ else
+ k = systemtime.wDayOfWeek - 1;
+ n = GetLocaleInfoW (lcid, LOCALE_SDAYNAME1+k, NULL, 0);
+ g_array_set_size (result, result->len + n);
+ GetLocaleInfoW (lcid, LOCALE_SDAYNAME1+k, ((wchar_t *) result->data) + result->len - n, n);
+ g_array_set_size (result, result->len - 1);
+ break;
+ case 'b':
+ case 'h':
+ n = GetLocaleInfoW (lcid, LOCALE_SABBREVMONTHNAME1+systemtime.wMonth-1, NULL, 0);
+ g_array_set_size (result, result->len + n);
+ GetLocaleInfoW (lcid, LOCALE_SABBREVMONTHNAME1+systemtime.wMonth-1, ((wchar_t *) result->data) + result->len - n, n);
+ g_array_set_size (result, result->len - 1);
+ break;
+ case 'B':
+ n = GetLocaleInfoW (lcid, LOCALE_SMONTHNAME1+systemtime.wMonth-1, NULL, 0);
+ g_array_set_size (result, result->len + n);
+ GetLocaleInfoW (lcid, LOCALE_SMONTHNAME1+systemtime.wMonth-1, ((wchar_t *) result->data) + result->len - n, n);
+ g_array_set_size (result, result->len - 1);
+ break;
+ case 'c':
+ n = GetDateFormatW (lcid, 0, &systemtime, NULL, NULL, 0);
+ if (n > 0)
+ {
+ g_array_set_size (result, result->len + n);
+ GetDateFormatW (lcid, 0, &systemtime, NULL, ((wchar_t *) result->data) + result->len - n, n);
+ g_array_set_size (result, result->len - 1);
+ }
+ g_array_append_vals (result, L" ", 1);
+ n = GetTimeFormatW (lcid, 0, &systemtime, NULL, NULL, 0);
+ if (n > 0)
+ {
+ g_array_set_size (result, result->len + n);
+ GetTimeFormatW (lcid, 0, &systemtime, NULL, ((wchar_t *) result->data) + result->len - n, n);
+ g_array_set_size (result, result->len - 1);
+ }
+ break;
+ case 'C':
+ g_array_append_vals (result, digits + systemtime.wYear/1000, 1);
+ g_array_append_vals (result, digits + (systemtime.wYear/1000)%10, 1);
+ break;
+ case 'd':
+ g_array_append_vals (result, digits + systemtime.wDay/10, 1);
+ g_array_append_vals (result, digits + systemtime.wDay%10, 1);
+ break;
+ case 'D':
+ g_array_append_vals (result, digits + systemtime.wMonth/10, 1);
+ g_array_append_vals (result, digits + systemtime.wMonth%10, 1);
+ g_array_append_vals (result, L"/", 1);
+ g_array_append_vals (result, digits + systemtime.wDay/10, 1);
+ g_array_append_vals (result, digits + systemtime.wDay%10, 1);
+ g_array_append_vals (result, L"/", 1);
+ g_array_append_vals (result, digits + (systemtime.wYear/10)%10, 1);
+ g_array_append_vals (result, digits + systemtime.wYear%10, 1);
+ break;
+ case 'e':
+ if (systemtime.wDay >= 10)
+ g_array_append_vals (result, digits + systemtime.wDay/10, 1);
+ else
+ g_array_append_vals (result, L" ", 1);
+ g_array_append_vals (result, digits + systemtime.wDay%10, 1);
+ break;
+
+ /* A GDate has no time fields, so for now we can
+ * hardcode all time conversions into zeros (or 12 for
+ * %I). The alternative code snippets in the #else
+ * branches are here ready to be taken into use when
+ * needed by a g_strftime() or g_date_and_time_format()
+ * or whatever.
+ */
+ case 'H':
+#if 1
+ g_array_append_vals (result, L"00", 2);
+#else
+ g_array_append_vals (result, digits + systemtime.wHour/10, 1);
+ g_array_append_vals (result, digits + systemtime.wHour%10, 1);
+#endif
+ break;
+ case 'I':
+#if 1
+ g_array_append_vals (result, L"12", 2);
+#else
+ if (systemtime.wHour == 0)
+ g_array_append_vals (result, L"12", 2);
+ else
+ {
+ g_array_append_vals (result, digits + (systemtime.wHour%12)/10, 1);
+ g_array_append_vals (result, digits + (systemtime.wHour%12)%10, 1);
+ }
+#endif
+ break;
+ case 'j':
+ g_array_append_vals (result, digits + (tm->tm_yday+1)/100, 1);
+ g_array_append_vals (result, digits + ((tm->tm_yday+1)/10)%10, 1);
+ g_array_append_vals (result, digits + (tm->tm_yday+1)%10, 1);
+ break;
+ case 'm':
+ g_array_append_vals (result, digits + systemtime.wMonth/10, 1);
+ g_array_append_vals (result, digits + systemtime.wMonth%10, 1);
+ break;
+ case 'M':
+#if 1
+ g_array_append_vals (result, L"00", 2);
+#else
+ g_array_append_vals (result, digits + systemtime.wMinute/10, 1);
+ g_array_append_vals (result, digits + systemtime.wMinute%10, 1);
+#endif
+ break;
+ case 'n':
+ g_array_append_vals (result, L"\n", 1);
+ break;
+ case 'p':
+ n = GetTimeFormatW (lcid, 0, &systemtime, L"tt", NULL, 0);
+ if (n > 0)
+ {
+ g_array_set_size (result, result->len + n);
+ GetTimeFormatW (lcid, 0, &systemtime, L"tt", ((wchar_t *) result->data) + result->len - n, n);
+ g_array_set_size (result, result->len - 1);
+ }
+ break;
+ case 'r':
+ /* This is a rather odd format. Hard to say what to do.
+ * Let's always use the POSIX %I:%M:%S %p
+ */
+#if 1
+ g_array_append_vals (result, L"12:00:00", 8);
+#else
+ if (systemtime.wHour == 0)
+ g_array_append_vals (result, L"12", 2);
+ else
+ {
+ g_array_append_vals (result, digits + (systemtime.wHour%12)/10, 1);
+ g_array_append_vals (result, digits + (systemtime.wHour%12)%10, 1);
+ }
+ g_array_append_vals (result, L":", 1);
+ g_array_append_vals (result, digits + systemtime.wMinute/10, 1);
+ g_array_append_vals (result, digits + systemtime.wMinute%10, 1);
+ g_array_append_vals (result, L":", 1);
+ g_array_append_vals (result, digits + systemtime.wSecond/10, 1);
+ g_array_append_vals (result, digits + systemtime.wSecond%10, 1);
+ g_array_append_vals (result, L" ", 1);
+#endif
+ n = GetTimeFormatW (lcid, 0, &systemtime, L"tt", NULL, 0);
+ if (n > 0)
+ {
+ g_array_set_size (result, result->len + n);
+ GetTimeFormatW (lcid, 0, &systemtime, L"tt", ((wchar_t *) result->data) + result->len - n, n);
+ g_array_set_size (result, result->len - 1);
+ }
+ break;
+ case 'R':
+#if 1
+ g_array_append_vals (result, L"00:00", 5);
+#else
+ g_array_append_vals (result, digits + systemtime.wHour/10, 1);
+ g_array_append_vals (result, digits + systemtime.wHour%10, 1);
+ g_array_append_vals (result, L":", 1);
+ g_array_append_vals (result, digits + systemtime.wMinute/10, 1);
+ g_array_append_vals (result, digits + systemtime.wMinute%10, 1);
+#endif
+ break;
+ case 'S':
+#if 1
+ g_array_append_vals (result, L"00", 2);
+#else
+ g_array_append_vals (result, digits + systemtime.wSecond/10, 1);
+ g_array_append_vals (result, digits + systemtime.wSecond%10, 1);
+#endif
+ break;
+ case 't':
+ g_array_append_vals (result, L"\t", 1);
+ break;
+ case 'T':
+#if 1
+ g_array_append_vals (result, L"00:00:00", 8);
+#else
+ g_array_append_vals (result, digits + systemtime.wHour/10, 1);
+ g_array_append_vals (result, digits + systemtime.wHour%10, 1);
+ g_array_append_vals (result, L":", 1);
+ g_array_append_vals (result, digits + systemtime.wMinute/10, 1);
+ g_array_append_vals (result, digits + systemtime.wMinute%10, 1);
+ g_array_append_vals (result, L":", 1);
+ g_array_append_vals (result, digits + systemtime.wSecond/10, 1);
+ g_array_append_vals (result, digits + systemtime.wSecond%10, 1);
+#endif
+ break;
+ case 'u':
+ if (systemtime.wDayOfWeek == 0)
+ g_array_append_vals (result, L"7", 1);
+ else
+ g_array_append_vals (result, digits + systemtime.wDayOfWeek, 1);
+ break;
+ case 'U':
+ n = g_date_get_sunday_week_of_year (d);
+ g_array_append_vals (result, digits + n/10, 1);
+ g_array_append_vals (result, digits + n%10, 1);
+ break;
+ case 'V':
+ n = g_date_get_iso8601_week_of_year (d);
+ g_array_append_vals (result, digits + n/10, 1);
+ g_array_append_vals (result, digits + n%10, 1);
+ break;
+ case 'w':
+ g_array_append_vals (result, digits + systemtime.wDayOfWeek, 1);
+ break;
+ case 'W':
+ n = g_date_get_monday_week_of_year (d);
+ g_array_append_vals (result, digits + n/10, 1);
+ g_array_append_vals (result, digits + n%10, 1);
+ break;
+ case 'x':
+ n = GetDateFormatW (lcid, 0, &systemtime, NULL, NULL, 0);
+ if (n > 0)
+ {
+ g_array_set_size (result, result->len + n);
+ GetDateFormatW (lcid, 0, &systemtime, NULL, ((wchar_t *) result->data) + result->len - n, n);
+ g_array_set_size (result, result->len - 1);
+ }
+ break;
+ case 'X':
+ n = GetTimeFormatW (lcid, 0, &systemtime, NULL, NULL, 0);
+ if (n > 0)
+ {
+ g_array_set_size (result, result->len + n);
+ GetTimeFormatW (lcid, 0, &systemtime, NULL, ((wchar_t *) result->data) + result->len - n, n);
+ g_array_set_size (result, result->len - 1);
+ }
+ break;
+ case 'y':
+ g_array_append_vals (result, digits + (systemtime.wYear/10)%10, 1);
+ g_array_append_vals (result, digits + systemtime.wYear%10, 1);
+ break;
+ case 'Y':
+ g_array_append_vals (result, digits + systemtime.wYear/1000, 1);
+ g_array_append_vals (result, digits + (systemtime.wYear/100)%10, 1);
+ g_array_append_vals (result, digits + (systemtime.wYear/10)%10, 1);
+ g_array_append_vals (result, digits + systemtime.wYear%10, 1);
+ break;
+ case 'Z':
+ n = GetTimeZoneInformation (&tzinfo);
+ if (n == TIME_ZONE_ID_UNKNOWN)
+ ;
+ else if (n == TIME_ZONE_ID_STANDARD)
+ g_array_append_vals (result, tzinfo.StandardName, wcslen (tzinfo.StandardName));
+ else if (n == TIME_ZONE_ID_DAYLIGHT)
+ g_array_append_vals (result, tzinfo.DaylightName, wcslen (tzinfo.DaylightName));
+ break;
+ case '%':
+ g_array_append_vals (result, L"%", 1);
+ break;
+ }
+ }
+ else if (c <= 0xFFFF)
+ {
+ wchar_t wc = c;
+ g_array_append_vals (result, &wc, 1);
+ }
+ else
+ {
+ glong nwc;
+ wchar_t *ws;
+
+ ws = g_ucs4_to_utf16 (&c, 1, NULL, &nwc, NULL);
+ g_array_append_vals (result, ws, nwc);
+ g_free (ws);
+ }
+ p = g_utf8_next_char (p);
+ }
+
+ convbuf = g_utf16_to_utf8 ((wchar_t *) result->data, result->len, NULL, &convlen, NULL);
+ g_array_free (result, TRUE);
+
+ if (!convbuf)
+ {
+ s[0] = '\0';
+ return 0;
+ }
+
+ if (slen <= convlen)
+ {
+ /* Ensure only whole characters are copied into the buffer. */
+ gchar *end = g_utf8_find_prev_char (convbuf, convbuf + slen);
+ g_assert (end != NULL);
+ convlen = end - convbuf;
+
+ /* Return 0 because the buffer isn't large enough. */
+ retval = 0;
+ }
+ else
+ retval = convlen;
+
+ memcpy (s, convbuf, convlen);
+ s[convlen] = '\0';
+ g_free (convbuf);
+
+ return retval;
+}
+
+#endif
+
+gsize
+g_date_strftime (gchar *s,
+ gsize slen,
+ const gchar *format,
+ const GDate *d)
+{
+ struct tm tm;
+#ifndef G_OS_WIN32
+ gsize locale_format_len = 0;
+ gchar *locale_format;
+ gsize tmplen;
+ gchar *tmpbuf;
+ gsize tmpbufsize;
+ gsize convlen = 0;
+ gchar *convbuf;
+ GError *error = NULL;
+ gsize retval;
+#endif
+
+ 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);
+
+#ifdef G_OS_WIN32
+ if (!g_utf8_validate (format, -1, NULL))
+ {
+ s[0] = '\0';
+ return 0;
+ }
+ return win32_strftime_helper (d, format, &tm, s, slen);
+#else
+
+ locale_format = g_locale_from_utf8 (format, -1, NULL, &locale_format_len, &error);
+
+ if (error)
+ {
+ g_warning (G_STRLOC "Error converting format to locale encoding: %s\n", error->message);
+ g_error_free (error);
+
+ s[0] = '\0';
+ return 0;
+ }
+
+ tmpbufsize = MAX (128, locale_format_len * 2);
+ while (TRUE)
+ {
+ tmpbuf = g_malloc (tmpbufsize);
+
+ /* Set the first byte to something other than '\0', to be able to
+ * recognize whether strftime actually failed or just returned "".
+ */
+ tmpbuf[0] = '\1';
+ tmplen = strftime (tmpbuf, tmpbufsize, locale_format, &tm);
+
+ if (tmplen == 0 && tmpbuf[0] != '\0')
+ {
+ g_free (tmpbuf);
+ tmpbufsize *= 2;
+
+ if (tmpbufsize > 65536)
+ {
+ g_warning (G_STRLOC "Maximum buffer size for g_date_strftime exceeded: giving up\n");
+ g_free (locale_format);
+
+ s[0] = '\0';
+ return 0;
+ }
+ }
+ else
+ break;
+ }
+ g_free (locale_format);
+
+ convbuf = g_locale_to_utf8 (tmpbuf, tmplen, NULL, &convlen, &error);
+ g_free (tmpbuf);
+
+ if (error)
+ {
+ g_warning (G_STRLOC "Error converting results of strftime to UTF-8: %s\n", error->message);
+ g_error_free (error);
+
+ s[0] = '\0';
+ return 0;
+ }
+
+ if (slen <= convlen)
+ {
+ /* Ensure only whole characters are copied into the buffer.
+ */
+ gchar *end = g_utf8_find_prev_char (convbuf, convbuf + slen);
+ g_assert (end != NULL);
+ convlen = end - convbuf;
+
+ /* Return 0 because the buffer isn't large enough.
+ */
+ retval = 0;
+ }
+ else
+ retval = convlen;
+
+ memcpy (s, convbuf, convlen);
+ s[convlen] = '\0';
+ g_free (convbuf);
+
+ return retval;
+#endif
+}
+
+#define __G_DATE_C__
+#include "galiasdef.c"
+
diff --git a/trunk/glib/gdate.h b/trunk/glib/gdate.h
new file mode 100644
index 000000000..8ec02afc6
--- /dev/null
+++ b/trunk/glib/gdate.h
@@ -0,0 +1,260 @@
+/* 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 <time.h>
+
+#include <glib/gtypes.h>
+#include <glib/gquark.h>
+
+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 <hp@pobox.com>
+ */
+
+typedef gint32 GTime;
+typedef guint16 GDateYear;
+typedef guint8 GDateDay; /* day of the month */
+typedef struct _GDate GDate;
+
+/* 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);
+guint g_date_get_iso8601_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_t (GDate *date,
+ time_t timet);
+void g_date_set_time_val (GDate *date,
+ GTimeVal *timeval);
+#ifndef G_DISABLE_DEPRECATED
+void g_date_set_time (GDate *date,
+ GTime time_);
+#endif
+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/trunk/glib/gdebug.h b/trunk/glib/gdebug.h
new file mode 100644
index 000000000..dea3dde7d
--- /dev/null
+++ b/trunk/glib/gdebug.h
@@ -0,0 +1,59 @@
+/* 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
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+#ifndef __G_DEBUG_H__
+#define __G_DEBUG_H__
+
+G_BEGIN_DECLS
+
+typedef enum {
+ G_DEBUG_FATAL_WARNINGS = 1 << 0,
+ G_DEBUG_FATAL_CRITICALS = 1 << 1
+} GDebugFlag;
+
+
+#ifdef G_ENABLE_DEBUG
+
+#define G_NOTE(type, action) G_STMT_START { \
+ if (!_g_debug_initialized) \
+ { _g_debug_init (); } \
+ if (_g_debug_flags & G_DEBUG_##type) \
+ { action; }; } G_STMT_END
+
+#else /* !G_ENABLE_DEBUG */
+
+#define G_NOTE(type, action)
+
+#endif /* G_ENABLE_DEBUG */
+
+GLIB_VAR gboolean _g_debug_initialized;
+GLIB_VAR guint _g_debug_flags;
+
+G_GNUC_INTERNAL void _g_debug_init (void);
+
+G_END_DECLS
+
+#endif /* __G_DEBUG_H__ */
diff --git a/trunk/glib/gdir.c b/trunk/glib/gdir.c
new file mode 100644
index 000000000..f9b1457c4
--- /dev/null
+++ b/trunk/glib/gdir.c
@@ -0,0 +1,296 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * gdir.c: Simplified wrapper around the DIRENT functions.
+ *
+ * Copyright 2001 Hans Breuer
+ * Copyright 2004 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.
+ */
+
+#include "config.h"
+
+#include <errno.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#ifdef HAVE_DIRENT_H
+#include <sys/types.h>
+#include <dirent.h>
+#endif
+
+#include "glib.h"
+#include "gdir.h"
+
+#include "glibintl.h"
+
+#include "galias.h"
+
+struct _GDir
+{
+#ifdef G_OS_WIN32
+ _WDIR *wdirp;
+#else
+ DIR *dirp;
+#endif
+#ifdef G_OS_WIN32
+ gchar utf8_buf[FILENAME_MAX*4];
+#endif
+};
+
+/**
+ * g_dir_open:
+ * @path: the path to the directory you are interested in. On Unix
+ * in the on-disk encoding. On Windows in UTF-8
+ * @flags: Currently must be set to 0. Reserved for future use.
+ * @error: return location for a #GError, or %NULL.
+ * If non-%NULL, an error will be set if and only if
+ * g_dir_open() fails.
+ *
+ * Opens a directory for reading. The names of the files in the
+ * directory can then be retrieved using g_dir_read_name().
+ *
+ * Return value: a newly allocated #GDir on success, %NULL on failure.
+ * If non-%NULL, you must free the result with g_dir_close()
+ * when you are finished with it.
+ **/
+GDir *
+g_dir_open (const gchar *path,
+ guint flags,
+ GError **error)
+{
+ GDir *dir;
+#ifdef G_OS_WIN32
+ wchar_t *wpath;
+#else
+ gchar *utf8_path;
+#endif
+
+ g_return_val_if_fail (path != NULL, NULL);
+
+#ifdef G_OS_WIN32
+ wpath = g_utf8_to_utf16 (path, -1, NULL, NULL, error);
+
+ if (wpath == NULL)
+ return NULL;
+
+ dir = g_new (GDir, 1);
+
+ dir->wdirp = _wopendir (wpath);
+ g_free (wpath);
+
+ if (dir->wdirp)
+ return dir;
+
+ /* error case */
+
+ g_set_error (error,
+ G_FILE_ERROR,
+ g_file_error_from_errno (errno),
+ _("Error opening directory '%s': %s"),
+ path, g_strerror (errno));
+
+ g_free (dir);
+
+ return NULL;
+#else
+ dir = g_new (GDir, 1);
+
+ dir->dirp = opendir (path);
+
+ if (dir->dirp)
+ return dir;
+
+ /* error case */
+ utf8_path = g_filename_to_utf8 (path, -1,
+ NULL, NULL, NULL);
+ g_set_error (error,
+ G_FILE_ERROR,
+ g_file_error_from_errno (errno),
+ _("Error opening directory '%s': %s"),
+ utf8_path, g_strerror (errno));
+
+ g_free (utf8_path);
+ g_free (dir);
+
+ return NULL;
+#endif
+}
+
+#ifdef G_OS_WIN32
+
+/* The above function actually is called g_dir_open_utf8, and it's
+ * that what applications compiled with this GLib version will
+ * use.
+ */
+
+#undef g_dir_open
+
+/* Binary compatibility version. Not for newly compiled code. */
+
+GDir *
+g_dir_open (const gchar *path,
+ guint flags,
+ GError **error)
+{
+ gchar *utf8_path = g_locale_to_utf8 (path, -1, NULL, NULL, error);
+ GDir *retval;
+
+ if (utf8_path == NULL)
+ return NULL;
+
+ retval = g_dir_open_utf8 (utf8_path, flags, error);
+
+ g_free (utf8_path);
+
+ return retval;
+}
+#endif
+
+/**
+ * g_dir_read_name:
+ * @dir: a #GDir* created by g_dir_open()
+ *
+ * Retrieves the name of the next entry in the directory. The '.' and
+ * '..' entries are omitted. On Windows, the returned name is in
+ * UTF-8. On Unix, it is in the on-disk encoding.
+ *
+ * Return value: The entry's name or %NULL if there are no
+ * more entries. The return value is owned by GLib and
+ * must not be modified or freed.
+ **/
+G_CONST_RETURN gchar*
+g_dir_read_name (GDir *dir)
+{
+#ifdef G_OS_WIN32
+ gchar *utf8_name;
+ struct _wdirent *wentry;
+#else
+ struct dirent *entry;
+#endif
+
+ g_return_val_if_fail (dir != NULL, NULL);
+
+#ifdef G_OS_WIN32
+ while (1)
+ {
+ wentry = _wreaddir (dir->wdirp);
+ while (wentry
+ && (0 == wcscmp (wentry->d_name, L".") ||
+ 0 == wcscmp (wentry->d_name, L"..")))
+ wentry = _wreaddir (dir->wdirp);
+
+ if (wentry == NULL)
+ return NULL;
+
+ utf8_name = g_utf16_to_utf8 (wentry->d_name, -1, NULL, NULL, NULL);
+
+ if (utf8_name == NULL)
+ continue; /* Huh, impossible? Skip it anyway */
+
+ strcpy (dir->utf8_buf, utf8_name);
+ g_free (utf8_name);
+
+ return dir->utf8_buf;
+ }
+#else
+ entry = readdir (dir->dirp);
+ while (entry
+ && (0 == strcmp (entry->d_name, ".") ||
+ 0 == strcmp (entry->d_name, "..")))
+ entry = readdir (dir->dirp);
+
+ if (entry)
+ return entry->d_name;
+ else
+ return NULL;
+#endif
+}
+
+#ifdef G_OS_WIN32
+
+/* Ditto for g_dir_read_name */
+
+#undef g_dir_read_name
+
+/* Binary compatibility version. Not for newly compiled code. */
+
+G_CONST_RETURN gchar*
+g_dir_read_name (GDir *dir)
+{
+ while (1)
+ {
+ const gchar *utf8_name = g_dir_read_name_utf8 (dir);
+ gchar *retval;
+
+ if (utf8_name == NULL)
+ return NULL;
+
+ retval = g_locale_from_utf8 (utf8_name, -1, NULL, NULL, NULL);
+
+ if (retval != NULL)
+ {
+ strcpy (dir->utf8_buf, retval);
+ g_free (retval);
+
+ return dir->utf8_buf;
+ }
+ }
+}
+
+#endif
+
+/**
+ * g_dir_rewind:
+ * @dir: a #GDir* created by g_dir_open()
+ *
+ * Resets the given directory. The next call to g_dir_read_name()
+ * will return the first entry again.
+ **/
+void
+g_dir_rewind (GDir *dir)
+{
+ g_return_if_fail (dir != NULL);
+
+#ifdef G_OS_WIN32
+ _wrewinddir (dir->wdirp);
+#else
+ rewinddir (dir->dirp);
+#endif
+}
+
+/**
+ * g_dir_close:
+ * @dir: a #GDir* created by g_dir_open()
+ *
+ * Closes the directory and deallocates all related resources.
+ **/
+void
+g_dir_close (GDir *dir)
+{
+ g_return_if_fail (dir != NULL);
+
+#ifdef G_OS_WIN32
+ _wclosedir (dir->wdirp);
+#else
+ closedir (dir->dirp);
+#endif
+ g_free (dir);
+}
+
+#define __G_DIR_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gdir.h b/trunk/glib/gdir.h
new file mode 100644
index 000000000..011174ebd
--- /dev/null
+++ b/trunk/glib/gdir.h
@@ -0,0 +1,47 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * gdir.c: Simplified wrapper around the DIRENT functions.
+ *
+ * Copyright 2001 Hans Breuer
+ *
+ * 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_DIR_H__
+#define __G_DIR_H__
+
+#include <glib/gerror.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GDir GDir;
+
+#ifdef G_OS_WIN32
+/* For DLL ABI stability, keep old names for old (non-UTF-8) functionality. */
+#define g_dir_open g_dir_open_utf8
+#define g_dir_read_name g_dir_read_name_utf8
+#endif
+
+GDir * g_dir_open (const gchar *path,
+ guint flags,
+ GError **error);
+G_CONST_RETURN gchar *g_dir_read_name (GDir *dir);
+void g_dir_rewind (GDir *dir);
+void g_dir_close (GDir *dir);
+
+G_END_DECLS
+
+#endif /* __G_DIR_H__ */
diff --git a/trunk/glib/gen-script-table.pl b/trunk/glib/gen-script-table.pl
new file mode 100755
index 000000000..12e0aa9af
--- /dev/null
+++ b/trunk/glib/gen-script-table.pl
@@ -0,0 +1,119 @@
+#!/usr/bin/perl -w
+#
+# Script to convert http://www.unicode.org/Public/UNIDATA/Scripts.txt
+# into a machine-readable table.
+#
+######################################################################
+
+if (@ARGV != 1) {
+ die "Usage: gen-script-table.pl Scripts.txt > gscripttable.h\n";
+}
+
+open IN, $ARGV[0] || die "Cannot open $ARGV[0]: $!\n";
+
+my @ranges;
+my $file;
+my $easy_range;
+my $i;
+my $start;
+my $end;
+my $script;
+
+
+while (<IN>) {
+ if (/^\#\s+(Scripts-.*.txt)/) {
+ $file = $1;
+ }
+
+ s/#.*//;
+ next if /^\s*$/;
+ if (!/^([0-9A-F]+)(?:\.\.([0-9A-F]+))?\s*;\s*([A-Za-z_]+)\s*$/) {
+ die "Cannot parse line: '$_'\n";
+ }
+
+ if (defined $2) {
+ push @ranges, [ hex $1, hex $2, uc $3 ];
+ } else {
+ push @ranges, [ hex $1, hex $1, uc $3 ];
+ }
+}
+
+@ranges = sort { $a->[0] <=> $b->[0] } @ranges;
+$date = gmtime;
+
+print <<"EOT";
+/* gscripttable.h: Generated by gen-script-table.pl
+ *
+ * Date: $date
+ * Source: $file
+ *
+ * Do not edit.
+ */
+
+EOT
+
+$easy_range = 0x2000;
+
+print <<"EOT";
+#define G_EASY_SCRIPTS_RANGE $easy_range
+
+static const guchar g_script_easy_table[$easy_range] = {
+EOT
+
+$i = 0;
+$end = -1;
+
+for (my $c = 0; $c < $easy_range; $c++) {
+
+ if ($c % 3 == 0) {
+ printf "\n ";
+ }
+
+ if ($c > $end) {
+ $start = $ranges[$i]->[0];
+ $end = $ranges[$i]->[1];
+ $script = $ranges[$i]->[2];
+ $i++;
+ }
+
+ if ($c < $start) {
+ printf " G_SCRIPT_UNKNOWN,";
+ } else {
+ printf " G_SCRIPT_%s,", $script;
+ }
+}
+
+if ($end >= $easy_range) {
+ $i--;
+ $ranges[$i]->[0] = $easy_range;
+}
+
+
+print <<"EOT";
+
+};
+
+static const struct {
+ gunichar start;
+ guint16 chars;
+ guint16 script;
+} g_script_table[] = {
+EOT
+
+for (; $i <= $#ranges; $i++) {
+ $start = $ranges[$i]->[0];
+ $end = $ranges[$i]->[1];
+ $script = $ranges[$i]->[2];
+
+ while ($i <= $#ranges - 1 &&
+ $ranges[$i + 1]->[0] == $end + 1 &&
+ $ranges[$i + 1]->[2] eq $script) {
+ $i++;
+ $end = $ranges[$i]->[1];
+ }
+
+ printf " { %#06x, %5d, G_SCRIPT_%s },\n", $start, $end - $start + 1, $script;
+}
+
+printf "};\n";
+
diff --git a/trunk/glib/gen-unicode-tables.pl b/trunk/glib/gen-unicode-tables.pl
new file mode 100755
index 000000000..5368adfc6
--- /dev/null
+++ b/trunk/glib/gen-unicode-tables.pl
@@ -0,0 +1,1303 @@
+#! /usr/bin/perl -w
+
+# Copyright (C) 1998, 1999 Tom Tromey
+# Copyright (C) 2001 Red Hat Software
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# Contributer(s):
+# Andrew Taylor <andrew.taylor@montage.ca>
+
+# gen-unicode-tables.pl - Generate tables for libunicode from Unicode data.
+# See http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html
+# I consider the output of this program to be unrestricted. Use it as
+# you will.
+
+# FIXME:
+# * For decomp table it might make sense to use a shift count other
+# than 8. We could easily compute the perfect shift count.
+
+# we use some perl unicode features
+require 5.006;
+
+use vars qw($CODE $NAME $CATEGORY $COMBINING_CLASSES $BIDI_CATEGORY $DECOMPOSITION $DECIMAL_VALUE $DIGIT_VALUE $NUMERIC_VALUE $MIRRORED $OLD_NAME $COMMENT $UPPER $LOWER $TITLE $BREAK_CODE $BREAK_CATEGORY $BREAK_NAME $CASE_CODE $CASE_LOWER $CASE_TITLE $CASE_UPPER $CASE_CONDITION);
+
+
+# Names of fields in Unicode data table.
+$CODE = 0;
+$NAME = 1;
+$CATEGORY = 2;
+$COMBINING_CLASSES = 3;
+$BIDI_CATEGORY = 4;
+$DECOMPOSITION = 5;
+$DECIMAL_VALUE = 6;
+$DIGIT_VALUE = 7;
+$NUMERIC_VALUE = 8;
+$MIRRORED = 9;
+$OLD_NAME = 10;
+$COMMENT = 11;
+$UPPER = 12;
+$LOWER = 13;
+$TITLE = 14;
+
+# Names of fields in the line break table
+$BREAK_CODE = 0;
+$BREAK_PROPERTY = 1;
+
+# Names of fields in the SpecialCasing table
+$CASE_CODE = 0;
+$CASE_LOWER = 1;
+$CASE_TITLE = 2;
+$CASE_UPPER = 3;
+$CASE_CONDITION = 4;
+
+# Names of fields in the CaseFolding table
+$FOLDING_CODE = 0;
+$FOLDING_STATUS = 1;
+$FOLDING_MAPPING = 2;
+
+# Map general category code onto symbolic name.
+%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",
+ 'NL' => "G_UNICODE_BREAK_NEXT_LINE",
+ 'WJ' => "G_UNICODE_BREAK_WORD_JOINER",
+ 'XX' => "G_UNICODE_BREAK_UNKNOWN",
+ 'JL' => "G_UNICODE_BREAK_HANGUL_L_JAMO",
+ 'JV' => "G_UNICODE_BREAK_HANGUL_V_JAMO",
+ 'JT' => "G_UNICODE_BREAK_HANGUL_T_JAMO",
+ 'H2' => "G_UNICODE_BREAK_HANGUL_LV_SYLLABLE",
+ 'H3' => "G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE"
+ );
+
+# Title case mappings.
+%title_to_lower = ();
+%title_to_upper = ();
+
+# Maximum length of special-case strings
+
+my @special_cases;
+my @special_case_offsets;
+my $special_case_offset = 0;
+
+$do_decomp = 0;
+$do_props = 1;
+if (@ARGV && $ARGV[0] eq '-decomp')
+{
+ $do_decomp = 1;
+ $do_props = 0;
+ shift @ARGV;
+}
+elsif (@ARGV && $ARGV[0] eq '-both')
+{
+ $do_decomp = 1;
+ shift @ARGV;
+}
+
+if (@ARGV != 2) {
+ $0 =~ s@.*/@@;
+ die "\nUsage: $0 [-decomp | -both] UNICODE-VERSION DIRECTORY\n\n DIRECTORY should contain the following Unicode data files:\n UnicodeData.txt, LineBreak.txt, SpecialCasing.txt, CaseFolding.txt,\n CompositionExclusions.txt, BidiMirroring.txt\n\n";
+}
+
+my ($unicodedatatxt, $linebreaktxt, $specialcasingtxt, $casefoldingtxt, $compositionexclusionstxt);
+
+my $d = $ARGV[1];
+opendir (my $dir, $d) or die "Cannot open Unicode data dir $d: $!\n";
+for my $f (readdir ($dir))
+{
+ $unicodedatatxt = "$d/$f" if ($f =~ /UnicodeData.*\.txt/);
+ $linebreaktxt = "$d/$f" if ($f =~ /LineBreak.*\.txt/);
+ $specialcasingtxt = "$d/$f" if ($f =~ /SpecialCasing.*\.txt/);
+ $casefoldingtxt = "$d/$f" if ($f =~ /CaseFolding.*\.txt/);
+ $compositionexclusionstxt = "$d/$f" if ($f =~ /CompositionExclusions.*\.txt/);
+}
+
+defined $unicodedatatxt or die "Did not find UnicodeData file";
+defined $linebreaktxt or die "Did not find LineBreak file";
+defined $specialcasingtxt or die "Did not find SpecialCasing file";
+defined $casefoldingtxt or die "Did not find CaseFolding file";
+defined $compositionexclusionstxt or die "Did not find CompositionExclusions file";
+
+print "Creating decomp table\n" if ($do_decomp);
+print "Creating property table\n" if ($do_props);
+
+print "Composition exlusions from $compositionexclusionstxt\n";
+
+open (INPUT, "< $compositionexclusionstxt") || exit 1;
+
+while (<INPUT>) {
+
+ chop;
+
+ next if /^#/;
+ next if /^\s*$/;
+
+ s/\s*#.*//;
+
+ s/^\s*//;
+ s/\s*$//;
+
+ $composition_exclusions{hex($_)} = 1;
+}
+
+close INPUT;
+
+print "Unicode data from $unicodedatatxt\n";
+
+open (INPUT, "< $unicodedatatxt") || exit 1;
+
+# we save memory by skipping the huge empty area before U+E0000
+my $pages_before_e0000;
+
+$last_code = -1;
+while (<INPUT>)
+{
+ chop;
+ @fields = split (';', $_, 30);
+ if ($#fields != 14)
+ {
+ printf STDERR ("Entry for $fields[$CODE] has wrong number of fields (%d)\n", $#fields);
+ }
+
+ $code = hex ($fields[$CODE]);
+
+ if ($code >= 0xE0000 and $last_code < 0xE0000)
+ {
+ $pages_before_e0000 = ($last_code >> 8) + 1;
+ }
+
+ if ($code > $last_code + 1)
+ {
+ # Found a gap.
+ if ($fields[$NAME] =~ /Last>/)
+ {
+ # Fill the gap with the last character read,
+ # since this was a range specified in the char database
+ @gfields = @fields;
+ }
+ else
+ {
+ # The gap represents undefined characters. Only the type
+ # matters.
+ @gfields = ('', '', 'Cn', '0', '', '', '', '', '', '', '',
+ '', '', '', '');
+ }
+ for (++$last_code; $last_code < $code; ++$last_code)
+ {
+ $gfields{$CODE} = sprintf ("%04x", $last_code);
+ &process_one ($last_code, @gfields);
+ }
+ }
+ &process_one ($code, @fields);
+ $last_code = $code;
+}
+
+close INPUT;
+
+@gfields = ('', '', 'Cn', '0', '', '', '', '', '', '', '',
+ '', '', '', '');
+for (++$last_code; $last_code <= 0x10FFFF; ++$last_code)
+{
+ $gfields{$CODE} = sprintf ("%04x", $last_code);
+ &process_one ($last_code, @gfields);
+}
+--$last_code; # Want last to be 0x10FFFF.
+
+print "Creating line break table\n";
+
+print "Line break data from $linebreaktxt\n";
+
+open (INPUT, "< $linebreaktxt") || exit 1;
+
+$last_code = -1;
+while (<INPUT>)
+{
+ my ($start_code, $end_code);
+
+ chop;
+
+ next if /^#/;
+
+ s/\s*#.*//;
+
+ @fields = split (';', $_, 30);
+ if ($#fields != 1)
+ {
+ printf STDERR ("Entry for $fields[$CODE] has wrong number of fields (%d)\n", $#fields);
+ next;
+ }
+
+ if ($fields[$CODE] =~ /([A-F0-9]{4,6})\.\.([A-F0-9]{4,6})/)
+ {
+ $start_code = hex ($1);
+ $end_code = hex ($2);
+ } else {
+ $start_code = $end_code = hex ($fields[$CODE]);
+
+ }
+
+ if ($start_code > $last_code + 1)
+ {
+ # The gap represents undefined characters. If assigned,
+ # they are AL, if not assigned, XX
+ for (++$last_code; $last_code < $start_code; ++$last_code)
+ {
+ if ($type[$last_code] eq 'Cn')
+ {
+ $break_props[$last_code] = 'XX';
+ }
+ else
+ {
+ $break_props[$last_code] = 'AL';
+ }
+ }
+ }
+
+ for ($last_code = $start_code; $last_code <= $end_code; $last_code++)
+ {
+ $break_props[$last_code] = $fields[$BREAK_PROPERTY];
+ }
+
+ $last_code = $end_code;
+}
+
+close INPUT;
+
+for (++$last_code; $last_code <= 0x10FFFF; ++$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 0x10FFFF.
+
+print STDERR "Last code is not 0x10FFFF" if ($last_code != 0x10FFFF);
+
+print "Reading special-casing table for case conversion\n";
+
+open (INPUT, "< $specialcasingtxt") || exit 1;
+
+while (<INPUT>)
+{
+ my $code;
+
+ chop;
+
+ next if /^#/;
+ next if /^\s*$/;
+
+ s/\s*#.*//;
+
+ @fields = split ('\s*;\s*', $_, 30);
+
+ $raw_code = $fields[$CASE_CODE];
+ $code = hex ($raw_code);
+
+ if ($#fields != 4 && $#fields != 5)
+ {
+ printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields);
+ next;
+ }
+
+ if (!defined $type[$code])
+ {
+ printf STDERR "Special case for code point: $code, which has no defined type\n";
+ next;
+ }
+
+ if (defined $fields[5]) {
+ # Ignore conditional special cases - we'll handle them in code
+ next;
+ }
+
+ if ($type[$code] eq 'Lu')
+ {
+ (hex $fields[$CASE_UPPER] == $code) || die "$raw_code is Lu and UCD_Upper($raw_code) != $raw_code";
+
+ &add_special_case ($code, $value[$code], $fields[$CASE_LOWER], $fields[$CASE_TITLE]);
+
+ } elsif ($type[$code] eq 'Lt')
+ {
+ (hex $fields[$CASE_TITLE] == $code) || die "$raw_code is Lt and UCD_Title($raw_code) != $raw_code";
+
+ &add_special_case ($code, undef, $fields[$CASE_LOWER], $fields[$CASE_UPPER]);
+ } elsif ($type[$code] eq 'Ll')
+ {
+ (hex $fields[$CASE_LOWER] == $code) || die "$raw_code is Ll and UCD_Lower($raw_code) != $raw_code";
+
+ &add_special_case ($code, $value[$code], $fields[$CASE_UPPER], $fields[$CASE_TITLE]);
+ } else {
+ printf STDERR "Special case for non-alphabetic code point: $raw_code\n";
+ next;
+ }
+}
+
+close INPUT;
+
+open (INPUT, "< $casefoldingtxt") || exit 1;
+
+my $casefoldlen = 0;
+my @casefold;
+
+while (<INPUT>)
+{
+ my $code;
+
+ chop;
+
+ next if /^#/;
+ next if /^\s*$/;
+
+ s/\s*#.*//;
+
+ @fields = split ('\s*;\s*', $_, 30);
+
+ $raw_code = $fields[$FOLDING_CODE];
+ $code = hex ($raw_code);
+
+ if ($#fields != 3)
+ {
+ printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields);
+ next;
+ }
+
+ # we don't use Simple or Turkic rules here
+ next if ($fields[$FOLDING_STATUS] =~ /^[ST]$/);
+
+ @values = map { hex ($_) } split /\s+/, $fields[$FOLDING_MAPPING];
+
+ # Check simple case
+
+ if (@values == 1 &&
+ !(defined $value[$code] && $value[$code] >= 0x1000000) &&
+ defined $type[$code]) {
+
+ my $lower;
+ if ($type[$code] eq 'Ll')
+ {
+ $lower = $code;
+ } elsif ($type[$code] eq 'Lt')
+ {
+ $lower = $title_to_lower{$code};
+ } elsif ($type[$code] eq 'Lu')
+ {
+ $lower = $value[$code];
+ } else {
+ $lower = $code;
+ }
+
+ if ($lower == $values[0]) {
+ next;
+ }
+ }
+
+ my $string = pack ("U*", @values);
+
+ if (1 + &length_in_bytes ($string) > $casefoldlen) {
+ $casefoldlen = 1 + &length_in_bytes ($string);
+ }
+
+ push @casefold, [ $code, &escape ($string) ];
+}
+
+close INPUT;
+
+if ($do_props) {
+ &print_tables ($last_code)
+}
+if ($do_decomp) {
+ &print_decomp ($last_code);
+ &output_composition_table;
+}
+
+&print_line_break ($last_code);
+
+exit 0;
+
+
+# perl "length" returns the length in characters
+sub length_in_bytes
+{
+ my ($string) = @_;
+
+ use bytes;
+ return length $string;
+}
+
+# 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 '')
+ {
+ if ($fields[$DECOMPOSITION] =~ s/\<.*\>\s*//) {
+ $decompose_compat[$code] = 1;
+ } else {
+ $decompose_compat[$code] = 0;
+
+ if (!exists $composition_exclusions{$code}) {
+ $compositions{$code} = $fields[$DECOMPOSITION];
+ }
+ }
+ $decompositions[$code] = $fields[$DECOMPOSITION];
+ }
+}
+
+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;
+
+ printf OUT "#define G_UNICODE_MAX_TABLE_INDEX 10000\n\n";
+
+ my $last_part1 = ($pages_before_e0000 * 256) - 1;
+ printf OUT "#define G_UNICODE_LAST_CHAR_PART1 0x%04X\n\n", $last_part1;
+ printf OUT "#define G_UNICODE_LAST_PAGE_PART1 %d\n\n", $pages_before_e0000 - 1;
+
+ $table_index = 0;
+ printf OUT "static const char type_data[][256] = {\n";
+ for ($count = 0; $count <= $last; $count += 256)
+ {
+ $row[$count / 256] = &print_row ($count, 1, \&fetch_type);
+ }
+ printf OUT "\n};\n\n";
+
+ printf OUT "/* U+0000 through U+%04X */\n", $last_part1;
+ print OUT "static const gint16 type_table_part1[$pages_before_e0000] = {\n";
+ for ($count = 0; $count <= $last_part1; $count += 256)
+ {
+ print OUT ",\n" if $count > 0;
+ print OUT " ", $row[$count / 256];
+ $bytes_out += 2;
+ }
+ print OUT "\n};\n\n";
+
+ printf OUT "/* U+E0000 through U+%04X */\n", $last;
+ print OUT "static const gint16 type_table_part2[768] = {\n";
+ for ($count = 0xE0000; $count <= $last; $count += 256)
+ {
+ print OUT ",\n" if $count > 0xE0000;
+ print OUT " ", $row[$count / 256];
+ $bytes_out += 2;
+ }
+ print OUT "\n};\n\n";
+
+
+ #
+ # Now print attribute table.
+ #
+
+ $table_index = 0;
+ printf OUT "static const gunichar attr_data[][256] = {\n";
+ for ($count = 0; $count <= $last; $count += 256)
+ {
+ $row[$count / 256] = &print_row ($count, 4, \&fetch_attr);
+ }
+ printf OUT "\n};\n\n";
+
+ printf OUT "/* U+0000 through U+%04X */\n", $last_part1;
+ print OUT "static const gint16 attr_table_part1[$pages_before_e0000] = {\n";
+ for ($count = 0; $count <= $last_part1; $count += 256)
+ {
+ print OUT ",\n" if $count > 0;
+ print OUT " ", $row[$count / 256];
+ $bytes_out += 2;
+ }
+ print OUT "\n};\n\n";
+
+ printf OUT "/* U+E0000 through U+%04X */\n", $last;
+ print OUT "static const gint16 attr_table_part2[768] = {\n";
+ for ($count = 0xE0000; $count <= $last; $count += 256)
+ {
+ print OUT ",\n" if $count > 0xE0000;
+ print OUT " ", $row[$count / 256];
+ $bytes_out += 2;
+ }
+ print OUT "\n};\n\n";
+
+ #
+ # print title case table
+ #
+
+ print OUT "static const gunichar 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 += 12;
+ }
+ print OUT "\n};\n\n";
+
+ #
+ # And special case conversion table -- conversions that change length
+ #
+ &output_special_case_table (\*OUT);
+ &output_casefold_table (\*OUT);
+
+ print OUT "#endif /* CHARTABLES_H */\n";
+
+ 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";
+ }
+}
+
+sub print_row
+{
+ my ($start, $typsize, $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 $values[0] . " + G_UNICODE_MAX_TABLE_INDEX";
+ }
+
+ printf OUT ",\n" if ($table_index != 0);
+ printf OUT " { /* page %d, index %d */\n ", $start / 256, $table_index;
+ my ($column) = 4;
+ 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 = 4;
+ }
+ print OUT $text;
+ $column += length ($text) + 2;
+ }
+ print OUT "\n }";
+
+ $bytes_out += 256 * $typsize;
+
+ return sprintf "%d /* page %d */", $table_index++, $start / 256;
+}
+
+sub escape
+{
+ my ($string) = @_;
+
+ my $escaped = unpack("H*", $string);
+ $escaped =~ s/(.{2})/\\x$1/g;
+
+ return $escaped;
+}
+
+# Returns the offset of $decomp in the offset string. Updates the
+# referenced variables as appropriate.
+sub handle_decomp ($$$$)
+{
+ my ($decomp, $decomp_offsets_ref, $decomp_string_ref, $decomp_string_offset_ref) = @_;
+ my $offset = "G_UNICODE_NOT_PRESENT_OFFSET";
+
+ if (defined $decomp)
+ {
+ if (defined $decomp_offsets_ref->{$decomp})
+ {
+ $offset = $decomp_offsets_ref->{$decomp};
+ }
+ else
+ {
+ $offset = ${$decomp_string_offset_ref};
+ $decomp_offsets_ref->{$decomp} = $offset;
+ ${$decomp_string_ref} .= "\n \"" . &escape ($decomp) . "\\0\" /* offset ${$decomp_string_offset_ref} */";
+ ${$decomp_string_offset_ref} += &length_in_bytes ($decomp) + 1;
+ }
+ }
+
+ return $offset;
+}
+
+# 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;
+
+ printf OUT "#define G_UNICODE_MAX_TABLE_INDEX (0x110000 / 256)\n\n";
+
+ my $last_part1 = ($pages_before_e0000 * 256) - 1;
+ printf OUT "#define G_UNICODE_LAST_CHAR_PART1 0x%04X\n\n", $last_part1;
+ printf OUT "#define G_UNICODE_LAST_PAGE_PART1 %d\n\n", $pages_before_e0000 - 1;
+
+ $NOT_PRESENT_OFFSET = 65535;
+ print OUT "#define G_UNICODE_NOT_PRESENT_OFFSET $NOT_PRESENT_OFFSET\n\n";
+
+ my ($count, @row);
+ $table_index = 0;
+ printf OUT "static const guchar cclass_data[][256] = {\n";
+ for ($count = 0; $count <= $last; $count += 256)
+ {
+ $row[$count / 256] = &print_row ($count, 1, \&fetch_cclass);
+ }
+ printf OUT "\n};\n\n";
+
+ print OUT "static const gint16 combining_class_table_part1[$pages_before_e0000] = {\n";
+ for ($count = 0; $count <= $last_part1; $count += 256)
+ {
+ print OUT ",\n" if $count > 0;
+ print OUT " ", $row[$count / 256];
+ $bytes_out += 2;
+ }
+ print OUT "\n};\n\n";
+
+ print OUT "static const gint16 combining_class_table_part2[768] = {\n";
+ for ($count = 0xE0000; $count <= $last; $count += 256)
+ {
+ print OUT ",\n" if $count > 0xE0000;
+ print OUT " ", $row[$count / 256];
+ $bytes_out += 2;
+ }
+ print OUT "\n};\n\n";
+
+ print OUT "typedef struct\n{\n";
+ print OUT " gunichar ch;\n";
+ print OUT " guint16 canon_offset;\n";
+ print OUT " guint16 compat_offset;\n";
+ print OUT "} decomposition;\n\n";
+
+ print OUT "static const decomposition decomp_table[] =\n{\n";
+ my ($iter);
+ my ($first) = 1;
+ my ($decomp_string) = "";
+ my ($decomp_string_offset) = 0;
+ for ($count = 0; $count <= $last; ++$count)
+ {
+ if (defined $decompositions[$count])
+ {
+ print OUT ",\n"
+ if ! $first;
+ $first = 0;
+
+ my $canon_decomp;
+ my $compat_decomp;
+
+ if (!$decompose_compat[$count]) {
+ $canon_decomp = make_decomp ($count, 0);
+ }
+ $compat_decomp = make_decomp ($count, 1);
+
+ if (defined $canon_decomp && $compat_decomp eq $canon_decomp) {
+ undef $compat_decomp;
+ }
+
+ my $canon_offset = handle_decomp ($canon_decomp, \%decomp_offsets, \$decomp_string, \$decomp_string_offset);
+ my $compat_offset = handle_decomp ($compat_decomp, \%decomp_offsets, \$decomp_string, \$decomp_string_offset);
+
+ die if $decomp_string_offset > $NOT_PRESENT_OFFSET;
+
+ printf OUT qq( { 0x%04x, $canon_offset, $compat_offset }), $count;
+ $bytes_out += 8;
+ }
+ }
+ print OUT "\n};\n\n";
+ $bytes_out += $decomp_string_offset + 1;
+
+ printf OUT "static const gchar decomp_expansion_string[] = %s;\n\n", $decomp_string;
+
+ 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;
+
+ printf OUT "#define G_UNICODE_MAX_TABLE_INDEX 10000\n\n";
+
+ my $last_part1 = ($pages_before_e0000 * 256) - 1;
+ printf OUT "/* the last code point that should be looked up in break_property_table_part1 */\n";
+ printf OUT "#define G_UNICODE_LAST_CHAR_PART1 0x%04X\n\n", $last_part1;
+
+ $table_index = 0;
+ printf OUT "static const gint8 break_property_data[][256] = {\n";
+ for ($count = 0; $count <= $last; $count += 256)
+ {
+ $row[$count / 256] = &print_row ($count, 1, \&fetch_break_type);
+ }
+ printf OUT "\n};\n\n";
+
+ printf OUT "/* U+0000 through U+%04X */\n", $last_part1;
+ print OUT "static const gint16 break_property_table_part1[$pages_before_e0000] = {\n";
+ for ($count = 0; $count <= $last_part1; $count += 256)
+ {
+ print OUT ",\n" if $count > 0;
+ print OUT " ", $row[$count / 256];
+ $bytes_out += 2;
+ }
+ print OUT "\n};\n\n";
+
+ printf OUT "/* U+E0000 through U+%04X */\n", $last;
+ print OUT "static const gint16 break_property_table_part2[768] = {\n";
+ for ($count = 0xE0000; $count <= $last; $count += 256)
+ {
+ print OUT ",\n" if $count > 0xE0000;
+ print OUT " ", $row[$count / 256];
+ $bytes_out += 2;
+ }
+ 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, $compat) = @_;
+
+ my ($iter, $val);
+ my (@result) = ();
+ foreach $iter (split (' ', $decompositions[$code]))
+ {
+ $val = hex ($iter);
+ if (defined $decompositions[$val] &&
+ ($compat || !$decompose_compat[$val]))
+ {
+ push (@result, &expand_decomp ($val, $compat));
+ }
+ else
+ {
+ push (@result, $val);
+ }
+ }
+
+ return @result;
+}
+
+sub make_decomp
+{
+ my ($code, $compat) = @_;
+
+ my $result = "";
+ foreach $iter (&expand_decomp ($code, $compat))
+ {
+ $result .= pack ("U", $iter); # to utf-8
+ }
+
+ $result;
+}
+# Generate special case data string from two fields
+sub add_special_case
+{
+ my ($code, $single, $field1, $field2) = @_;
+
+ @values = (defined $single ? $single : (),
+ (map { hex ($_) } split /\s+/, $field1),
+ 0,
+ (map { hex ($_) } split /\s+/, $field2));
+ $result = "";
+
+
+ for $value (@values) {
+ $result .= pack ("U", $value); # to utf-8
+ }
+
+ push @special_case_offsets, $special_case_offset;
+
+ # We encode special cases up in the 0x1000000 space
+ $value[$code] = 0x1000000 + $special_case_offset;
+
+ $special_case_offset += 1 + &length_in_bytes ($result);
+
+ push @special_cases, &escape ($result);
+}
+
+sub output_special_case_table
+{
+ my $out = shift;
+
+ print $out <<EOT;
+
+/* Table of special cases for case conversion; each record contains
+ * First, the best single character mapping to lowercase if Lu,
+ * and to uppercase if Ll, followed by the output mapping for the two cases
+ * other than the case of the codepoint, in the order [Ll],[Lu],[Lt],
+ * encoded in UTF-8, separated and terminated by a null character.
+ */
+static const gchar special_case_table[] = {
+EOT
+
+ my $i = 0;
+ for $case (@special_cases) {
+ print $out qq( "$case\\0" /* offset ${special_case_offsets[$i]} */\n);
+ $i++;
+ }
+
+ print $out <<EOT;
+};
+
+EOT
+
+ print STDERR "Generated " . ($special_case_offset + 1) . " bytes in special case table\n";
+}
+
+sub enumerate_ordered
+{
+ my ($array) = @_;
+
+ my $n = 0;
+ for my $code (sort { $a <=> $b } keys %$array) {
+ if ($array->{$code} == 1) {
+ delete $array->{$code};
+ next;
+ }
+ $array->{$code} = $n++;
+ }
+
+ return $n;
+}
+
+sub output_composition_table
+{
+ print STDERR "Generating composition table\n";
+
+ local ($bytes_out) = 0;
+
+ my %first;
+ my %second;
+
+ # First we need to go through and remove decompositions
+ # starting with a non-starter, and single-character
+ # decompositions. At the same time, record
+ # the first and second character of each decomposition
+
+ for $code (keys %compositions)
+ {
+ @values = map { hex ($_) } split /\s+/, $compositions{$code};
+
+ # non-starters
+ if ($cclass[$values[0]]) {
+ delete $compositions{$code};
+ next;
+ }
+
+ # single-character decompositions
+ if (@values == 1) {
+ delete $compositions{$code};
+ next;
+ }
+
+ if (@values != 2) {
+ die "$code has more than two elements in its decomposition!\n";
+ }
+
+ if (exists $first{$values[0]}) {
+ $first{$values[0]}++;
+ } else {
+ $first{$values[0]} = 1;
+ }
+ }
+
+ # Assign integer indices, removing singletons
+ my $n_first = enumerate_ordered (\%first);
+
+ # Now record the second character of each (non-singleton) decomposition
+ for $code (keys %compositions) {
+ @values = map { hex ($_) } split /\s+/, $compositions{$code};
+
+ if (exists $first{$values[0]}) {
+ if (exists $second{$values[1]}) {
+ $second{$values[1]}++;
+ } else {
+ $second{$values[1]} = 1;
+ }
+ }
+ }
+
+ # Assign integer indices, removing duplicate
+ my $n_second = enumerate_ordered (\%second);
+
+ # Build reverse table
+
+ my @first_singletons;
+ my @second_singletons;
+ my %reverse;
+ for $code (keys %compositions) {
+ @values = map { hex ($_) } split /\s+/, $compositions{$code};
+
+ my $first = $first{$values[0]};
+ my $second = $second{$values[1]};
+
+ if (defined $first && defined $second) {
+ $reverse{"$first|$second"} = $code;
+ } elsif (!defined $first) {
+ push @first_singletons, [ $values[0], $values[1], $code ];
+ } else {
+ push @second_singletons, [ $values[1], $values[0], $code ];
+ }
+ }
+
+ @first_singletons = sort { $a->[0] <=> $b->[0] } @first_singletons;
+ @second_singletons = sort { $a->[0] <=> $b->[0] } @second_singletons;
+
+ my %vals;
+
+ open OUT, ">gunicomp.h" or die "Cannot open gunicomp.h: $!\n";
+
+ # Assign values in lookup table for all code points involved
+
+ my $total = 1;
+ my $last = 0;
+ printf OUT "#define COMPOSE_FIRST_START %d\n", $total;
+ for $code (keys %first) {
+ $vals{$code} = $first{$code} + $total;
+ $last = $code if $code > $last;
+ }
+ $total += $n_first;
+ $i = 0;
+ printf OUT "#define COMPOSE_FIRST_SINGLE_START %d\n", $total;
+ for $record (@first_singletons) {
+ my $code = $record->[0];
+ $vals{$code} = $i++ + $total;
+ $last = $code if $code > $last;
+ }
+ $total += @first_singletons;
+ printf OUT "#define COMPOSE_SECOND_START %d\n", $total;
+ for $code (keys %second) {
+ $vals{$code} = $second{$code} + $total;
+ $last = $code if $code > $last;
+ }
+ $total += $n_second;
+ $i = 0;
+ printf OUT "#define COMPOSE_SECOND_SINGLE_START %d\n\n", $total;
+ for $record (@second_singletons) {
+ my $code = $record->[0];
+ $vals{$code} = $i++ + $total;
+ $last = $code if $code > $last;
+ }
+
+ printf OUT "#define COMPOSE_TABLE_LAST %d\n\n", $last / 256;
+
+ # Output lookup table
+
+ my @row;
+ $table_index = 0;
+ printf OUT "static const guint16 compose_data[][256] = {\n";
+ for (my $count = 0; $count <= $last; $count += 256)
+ {
+ $row[$count / 256] = &print_row ($count, 2, sub { exists $vals{$_[0]} ? $vals{$_[0]} : 0; });
+ }
+ printf OUT "\n};\n\n";
+
+ print OUT "static const gint16 compose_table[COMPOSE_TABLE_LAST + 1] = {\n";
+ for (my $count = 0; $count <= $last; $count += 256)
+ {
+ print OUT ",\n" if $count > 0;
+ print OUT " ", $row[$count / 256];
+ $bytes_out += 2;
+ }
+ print OUT "\n};\n\n";
+
+ # Output first singletons
+
+ print OUT "static const guint16 compose_first_single[][2] = {\n";
+ $i = 0;
+ for $record (@first_singletons) {
+ if ($record->[1] > 0xFFFF or $record->[2] > 0xFFFF) {
+ die "time to switch compose_first_single to gunichar" ;
+ }
+ print OUT ",\n" if $i++ > 0;
+ printf OUT " { %#06x, %#06x }", $record->[1], $record->[2];
+ }
+ print OUT "\n};\n";
+
+ $bytes_out += @first_singletons * 4;
+
+ # Output second singletons
+
+ print OUT "static const guint16 compose_second_single[][2] = {\n";
+ $i = 0;
+ for $record (@second_singletons) {
+ if ($record->[1] > 0xFFFF or $record->[2] > 0xFFFF) {
+ die "time to switch compose_second_single to gunichar";
+ }
+ print OUT ",\n" if $i++ > 0;
+ printf OUT " { %#06x, %#06x }", $record->[1], $record->[2];
+ }
+ print OUT "\n};\n";
+
+ $bytes_out += @second_singletons * 4;
+
+ # Output array of composition pairs
+
+ print OUT <<EOT;
+static const guint16 compose_array[$n_first][$n_second] = {
+EOT
+
+ for (my $i = 0; $i < $n_first; $i++) {
+ print OUT ",\n" if $i;
+ print OUT " { ";
+ for (my $j = 0; $j < $n_second; $j++) {
+ print OUT ", " if $j;
+ if (exists $reverse{"$i|$j"}) {
+ if ($reverse{"$i|$j"} > 0xFFFF) {
+ die "time to switch compose_array to gunichar" ;
+ }
+ printf OUT "0x%04x", $reverse{"$i|$j"};
+ } else {
+ print OUT " 0";
+ }
+ }
+ print OUT " }";
+ }
+ print OUT "\n";
+
+ print OUT <<EOT;
+};
+EOT
+
+ $bytes_out += $n_first * $n_second * 2;
+
+ printf STDERR "Generated %d bytes in compose tables\n", $bytes_out;
+}
+
+sub output_casefold_table
+{
+ my $out = shift;
+
+ print $out <<EOT;
+
+/* Table of casefolding cases that can't be derived by lowercasing
+ */
+static const struct {
+ guint16 ch;
+ gchar data[$casefoldlen];
+} casefold_table[] = {
+EOT
+
+ @casefold = sort { $a->[0] <=> $b->[0] } @casefold;
+
+ for $case (@casefold)
+ {
+ $code = $case->[0];
+ $string = $case->[1];
+
+ if ($code > 0xFFFF) {
+ die "time to switch casefold_table to gunichar" ;
+ }
+
+ print $out sprintf(qq( { 0x%04x, "$string" },\n), $code);
+
+ }
+
+ print $out <<EOT;
+};
+
+EOT
+
+ my $recordlen = (2+$casefoldlen+1) & ~1;
+ printf "Generated %d bytes for casefold table\n", $recordlen * @casefold;
+}
+
+
+
diff --git a/trunk/glib/gerror.c b/trunk/glib/gerror.c
new file mode 100644
index 000000000..0b0f98200
--- /dev/null
+++ b/trunk/glib/gerror.c
@@ -0,0 +1,261 @@
+/* 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"
+
+#include "glib.h"
+#include "galias.h"
+
+
+static GError*
+g_error_new_valist (GQuark domain,
+ gint code,
+ const gchar *format,
+ va_list args)
+{
+ GError *error;
+
+ error = g_slice_new (GError);
+
+ 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_slice_new (GError);
+
+ 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_slice_free (GError, 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_slice_new (GError);
+
+ *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;
+ }
+}
+
+#define __G_ERROR_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gerror.h b/trunk/glib/gerror.h
new file mode 100644
index 000000000..ea0d25aaf
--- /dev/null
+++ b/trunk/glib/gerror.h
@@ -0,0 +1,74 @@
+/* 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 <glib/gquark.h>
+
+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/trunk/glib/gfileutils.c b/trunk/glib/gfileutils.c
new file mode 100644
index 000000000..7c271bb99
--- /dev/null
+++ b/trunk/glib/gfileutils.c
@@ -0,0 +1,1867 @@
+/* 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 <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdlib.h>
+
+#ifdef G_OS_WIN32
+#include <windows.h>
+#include <io.h>
+#endif /* G_OS_WIN32 */
+
+#ifndef S_ISLNK
+#define S_ISLNK(x) 0
+#endif
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+#include "gstdio.h"
+#include "glibintl.h"
+
+#include "galias.h"
+
+static gint create_temp_file (gchar *tmpl,
+ int permissions);
+
+/**
+ * g_mkdir_with_parents:
+ * @pathname: a pathname in the GLib file name encoding
+ * @mode: permissions to use for newly created directories
+ *
+ * Create a directory if it doesn't already exist. Create intermediate
+ * parent directories as needed, too.
+ *
+ * Returns: 0 if the directory already exists, or was successfully
+ * created. Returns -1 if an error occurred, with errno set.
+ *
+ * Since: 2.8
+ */
+int
+g_mkdir_with_parents (const gchar *pathname,
+ int mode)
+{
+ gchar *fn, *p;
+
+ if (pathname == NULL || *pathname == '\0')
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ fn = g_strdup (pathname);
+
+ if (g_path_is_absolute (fn))
+ p = (gchar *) g_path_skip_root (fn);
+ else
+ p = fn;
+
+ do
+ {
+ while (*p && !G_IS_DIR_SEPARATOR (*p))
+ p++;
+
+ if (!*p)
+ p = NULL;
+ else
+ *p = '\0';
+
+ if (!g_file_test (fn, G_FILE_TEST_EXISTS))
+ {
+ if (g_mkdir (fn, mode) == -1)
+ {
+ int errno_save = errno;
+ g_free (fn);
+ errno = errno_save;
+ return -1;
+ }
+ }
+ else if (!g_file_test (fn, G_FILE_TEST_IS_DIR))
+ {
+ g_free (fn);
+ errno = ENOTDIR;
+ return -1;
+ }
+ if (p)
+ {
+ *p++ = G_DIR_SEPARATOR;
+ while (*p && G_IS_DIR_SEPARATOR (*p))
+ p++;
+ }
+ }
+ while (p);
+
+ g_free (fn);
+
+ return 0;
+}
+
+/**
+ * g_file_test:
+ * @filename: a filename to test in the GLib file name encoding
+ * @test: bitfield of #GFileTest flags
+ *
+ * Returns %TRUE if any of the tests in the bitfield @test are
+ * %TRUE. For example, <literal>(G_FILE_TEST_EXISTS |
+ * G_FILE_TEST_IS_DIR)</literal> 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.
+ *
+ * Apart from %G_FILE_TEST_IS_SYMLINK all tests follow symbolic links,
+ * so for a symbolic link to a regular file g_file_test() will return
+ * %TRUE for both %G_FILE_TEST_IS_SYMLINK and %G_FILE_TEST_IS_REGULAR.
+ *
+ * Note, that for a dangling symbolic link g_file_test() will return
+ * %TRUE for %G_FILE_TEST_IS_SYMLINK and %FALSE for all other flags.
+ *
+ * You should never use g_file_test() to test whether it is safe
+ * to perform an operation, because there is always the possibility
+ * of the condition changing before you actually perform the operation.
+ * For example, you might think you could use %G_FILE_TEST_IS_SYMLINK
+ * to know whether it is is safe to write to a file without being
+ * tricked into writing into a different location. It doesn't work!
+ *
+ * <informalexample><programlisting>
+ * /&ast; DON'T DO THIS &ast;/
+ * if (!g_file_test (filename, G_FILE_TEST_IS_SYMLINK)) {
+ * fd = g_open (filename, O_WRONLY);
+ * /&ast; write to fd &ast;/
+ * }
+ * </programlisting></informalexample>
+ *
+ * Another thing to note is that %G_FILE_TEST_EXISTS and
+ * %G_FILE_TEST_IS_EXECUTABLE are implemented using the access()
+ * system call. This usually doesn't matter, but if your program
+ * is setuid or setgid it means that these tests will give you
+ * the answer for the real user ID and group ID, rather than the
+ * effective user ID and group ID.
+ *
+ * On Windows, there are no symlinks, so testing for
+ * %G_FILE_TEST_IS_SYMLINK will always return %FALSE. Testing for
+ * %G_FILE_TEST_IS_EXECUTABLE will just check that the file exists and
+ * its name indicates that it is executable, checking for well-known
+ * extensions and those listed in the %PATHEXT environment variable.
+ *
+ * Return value: whether a test was %TRUE
+ **/
+gboolean
+g_file_test (const gchar *filename,
+ GFileTest test)
+{
+#ifdef G_OS_WIN32
+/* stuff missing in std vc6 api */
+# ifndef INVALID_FILE_ATTRIBUTES
+# define INVALID_FILE_ATTRIBUTES -1
+# endif
+# ifndef FILE_ATTRIBUTE_DEVICE
+# define FILE_ATTRIBUTE_DEVICE 64
+# endif
+ int attributes;
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+
+ if (wfilename == NULL)
+ return FALSE;
+
+ attributes = GetFileAttributesW (wfilename);
+
+ g_free (wfilename);
+
+ if (attributes == INVALID_FILE_ATTRIBUTES)
+ return FALSE;
+
+ if (test & G_FILE_TEST_EXISTS)
+ return TRUE;
+
+ if (test & G_FILE_TEST_IS_REGULAR)
+ return (attributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_DEVICE)) == 0;
+
+ if (test & G_FILE_TEST_IS_DIR)
+ return (attributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
+
+ if (test & G_FILE_TEST_IS_EXECUTABLE)
+ {
+ const gchar *lastdot = strrchr (filename, '.');
+ const gchar *pathext = NULL, *p;
+ int extlen;
+
+ if (lastdot == NULL)
+ return FALSE;
+
+ if (stricmp (lastdot, ".exe") == 0 ||
+ stricmp (lastdot, ".cmd") == 0 ||
+ stricmp (lastdot, ".bat") == 0 ||
+ stricmp (lastdot, ".com") == 0)
+ return TRUE;
+
+ /* Check if it is one of the types listed in %PATHEXT% */
+
+ pathext = g_getenv ("PATHEXT");
+ if (pathext == NULL)
+ return FALSE;
+
+ pathext = g_utf8_casefold (pathext, -1);
+
+ lastdot = g_utf8_casefold (lastdot, -1);
+ extlen = strlen (lastdot);
+
+ p = pathext;
+ while (TRUE)
+ {
+ const gchar *q = strchr (p, ';');
+ if (q == NULL)
+ q = p + strlen (p);
+ if (extlen == q - p &&
+ memcmp (lastdot, p, extlen) == 0)
+ {
+ g_free ((gchar *) pathext);
+ g_free ((gchar *) lastdot);
+ return TRUE;
+ }
+ if (*q)
+ p = q + 1;
+ else
+ break;
+ }
+
+ g_free ((gchar *) pathext);
+ g_free ((gchar *) lastdot);
+ return FALSE;
+ }
+
+ return FALSE;
+#else
+ if ((test & G_FILE_TEST_EXISTS) && (access (filename, F_OK) == 0))
+ return TRUE;
+
+ if ((test & G_FILE_TEST_IS_EXECUTABLE) && (access (filename, X_OK) == 0))
+ {
+ if (getuid () != 0)
+ return TRUE;
+
+ /* For root, on some POSIX systems, access (filename, X_OK)
+ * will succeed even if no executable bits are set on the
+ * file. We fall through to a stat test to avoid that.
+ */
+ }
+ else
+ test &= ~G_FILE_TEST_IS_EXECUTABLE;
+
+ if (test & G_FILE_TEST_IS_SYMLINK)
+ {
+ struct stat s;
+
+ if ((lstat (filename, &s) == 0) && S_ISLNK (s.st_mode))
+ return TRUE;
+ }
+
+ if (test & (G_FILE_TEST_IS_REGULAR |
+ G_FILE_TEST_IS_DIR |
+ G_FILE_TEST_IS_EXECUTABLE))
+ {
+ struct stat s;
+
+ if (stat (filename, &s) == 0)
+ {
+ if ((test & G_FILE_TEST_IS_REGULAR) && S_ISREG (s.st_mode))
+ return TRUE;
+
+ if ((test & G_FILE_TEST_IS_DIR) && S_ISDIR (s.st_mode))
+ return TRUE;
+
+ /* The extra test for root when access (file, X_OK) succeeds.
+ */
+ if ((test & G_FILE_TEST_IS_EXECUTABLE) &&
+ ((s.st_mode & S_IXOTH) ||
+ (s.st_mode & S_IXUSR) ||
+ (s.st_mode & S_IXGRP)))
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+#endif
+}
+
+#ifdef G_OS_WIN32
+
+#undef g_file_test
+
+/* Binary compatibility version. Not for newly compiled code. */
+
+gboolean
+g_file_test (const gchar *filename,
+ GFileTest test)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL);
+ gboolean retval;
+
+ if (utf8_filename == NULL)
+ return FALSE;
+
+ retval = g_file_test_utf8 (utf8_filename, test);
+
+ g_free (utf8_filename);
+
+ return retval;
+}
+
+#endif
+
+GQuark
+g_file_error_quark (void)
+{
+ return g_quark_from_static_string ("g-file-error-quark");
+}
+
+/**
+ * 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
+
+#ifdef ENOSYS
+ case ENOSYS:
+ return G_FILE_ERROR_NOSYS;
+ break;
+#endif
+
+ default:
+ return G_FILE_ERROR_FAILED;
+ break;
+ }
+}
+
+static gboolean
+get_contents_stdio (const gchar *display_filename,
+ FILE *f,
+ gchar **contents,
+ gsize *length,
+ GError **error)
+{
+ gchar buf[4096];
+ gsize bytes;
+ gchar *str = NULL;
+ gsize total_bytes = 0;
+ gsize total_allocated = 0;
+ gchar *tmp;
+
+ g_assert (f != NULL);
+
+ while (!feof (f))
+ {
+ gint save_errno;
+
+ bytes = fread (buf, 1, sizeof (buf), f);
+ save_errno = errno;
+
+ while ((total_bytes + bytes + 1) > total_allocated)
+ {
+ if (str)
+ total_allocated *= 2;
+ else
+ total_allocated = MIN (bytes + 1, sizeof (buf));
+
+ tmp = g_try_realloc (str, total_allocated);
+
+ if (tmp == NULL)
+ {
+ g_set_error (error,
+ G_FILE_ERROR,
+ G_FILE_ERROR_NOMEM,
+ _("Could not allocate %lu bytes to read file \"%s\""),
+ (gulong) total_allocated,
+ display_filename);
+
+ goto error;
+ }
+
+ str = tmp;
+ }
+
+ if (ferror (f))
+ {
+ g_set_error (error,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Error reading file '%s': %s"),
+ display_filename,
+ g_strerror (save_errno));
+
+ goto error;
+ }
+
+ memcpy (str + total_bytes, buf, bytes);
+ total_bytes += bytes;
+ }
+
+ fclose (f);
+
+ if (total_allocated == 0)
+ str = g_new (gchar, 1);
+
+ str[total_bytes] = '\0';
+
+ if (length)
+ *length = total_bytes;
+
+ *contents = str;
+
+ return TRUE;
+
+ error:
+
+ g_free (str);
+ fclose (f);
+
+ return FALSE;
+}
+
+#ifndef G_OS_WIN32
+
+static gboolean
+get_contents_regfile (const gchar *display_filename,
+ struct stat *stat_buf,
+ gint fd,
+ gchar **contents,
+ gsize *length,
+ GError **error)
+{
+ gchar *buf;
+ gsize bytes_read;
+ gsize size;
+ gsize alloc_size;
+
+ size = stat_buf->st_size;
+
+ alloc_size = size + 1;
+ buf = g_try_malloc (alloc_size);
+
+ if (buf == NULL)
+ {
+ g_set_error (error,
+ G_FILE_ERROR,
+ G_FILE_ERROR_NOMEM,
+ _("Could not allocate %lu bytes to read file \"%s\""),
+ (gulong) alloc_size,
+ display_filename);
+
+ goto error;
+ }
+
+ bytes_read = 0;
+ while (bytes_read < size)
+ {
+ gssize rc;
+
+ rc = read (fd, buf + bytes_read, size - bytes_read);
+
+ if (rc < 0)
+ {
+ if (errno != EINTR)
+ {
+ int save_errno = errno;
+
+ g_free (buf);
+ g_set_error (error,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to read from file '%s': %s"),
+ display_filename,
+ g_strerror (save_errno));
+
+ goto error;
+ }
+ }
+ else if (rc == 0)
+ break;
+ else
+ bytes_read += rc;
+ }
+
+ buf[bytes_read] = '\0';
+
+ if (length)
+ *length = bytes_read;
+
+ *contents = buf;
+
+ close (fd);
+
+ return TRUE;
+
+ error:
+
+ close (fd);
+
+ return FALSE;
+}
+
+static gboolean
+get_contents_posix (const gchar *filename,
+ gchar **contents,
+ gsize *length,
+ GError **error)
+{
+ struct stat stat_buf;
+ gint fd;
+ gchar *display_filename = g_filename_display_name (filename);
+
+ /* O_BINARY useful on Cygwin */
+ fd = open (filename, O_RDONLY|O_BINARY);
+
+ if (fd < 0)
+ {
+ int save_errno = errno;
+
+ g_set_error (error,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to open file '%s': %s"),
+ display_filename,
+ g_strerror (save_errno));
+ g_free (display_filename);
+
+ return FALSE;
+ }
+
+ /* I don't think this will ever fail, aside from ENOMEM, but. */
+ if (fstat (fd, &stat_buf) < 0)
+ {
+ int save_errno = errno;
+
+ close (fd);
+ g_set_error (error,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to get attributes of file '%s': fstat() failed: %s"),
+ display_filename,
+ g_strerror (save_errno));
+ g_free (display_filename);
+
+ return FALSE;
+ }
+
+ if (stat_buf.st_size > 0 && S_ISREG (stat_buf.st_mode))
+ {
+ gboolean retval = get_contents_regfile (display_filename,
+ &stat_buf,
+ fd,
+ contents,
+ length,
+ error);
+ g_free (display_filename);
+
+ return retval;
+ }
+ else
+ {
+ FILE *f;
+ gboolean retval;
+
+ f = fdopen (fd, "r");
+
+ if (f == NULL)
+ {
+ int save_errno = errno;
+
+ g_set_error (error,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to open file '%s': fdopen() failed: %s"),
+ display_filename,
+ g_strerror (save_errno));
+ g_free (display_filename);
+
+ return FALSE;
+ }
+
+ retval = get_contents_stdio (display_filename, f, contents, length, error);
+ g_free (display_filename);
+
+ return retval;
+ }
+}
+
+#else /* G_OS_WIN32 */
+
+static gboolean
+get_contents_win32 (const gchar *filename,
+ gchar **contents,
+ gsize *length,
+ GError **error)
+{
+ FILE *f;
+ gboolean retval;
+ gchar *display_filename = g_filename_display_name (filename);
+ int save_errno;
+
+ f = g_fopen (filename, "rb");
+ save_errno = errno;
+
+ if (f == NULL)
+ {
+ g_set_error (error,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to open file '%s': %s"),
+ display_filename,
+ g_strerror (save_errno));
+ g_free (display_filename);
+
+ return FALSE;
+ }
+
+ retval = get_contents_stdio (display_filename, f, contents, length, error);
+ g_free (display_filename);
+
+ return retval;
+}
+
+#endif
+
+/**
+ * g_file_get_contents:
+ * @filename: name of a file to read contents from, in the GLib file name encoding
+ * @contents: location to store an allocated string
+ * @length: location to store length in bytes of the contents, or %NULL
+ * @error: return location for a #GError, or %NULL
+ *
+ * Reads an entire file into allocated memory, with good error
+ * checking.
+ *
+ * If the call was successful, it returns %TRUE and sets @contents to the file
+ * contents and @length to the length of the file contents in bytes. The string
+ * stored in @contents will be nul-terminated, so for text files you can pass
+ * %NULL for the @length argument. If the call was not successful, it returns
+ * %FALSE and sets @error. The error domain is #G_FILE_ERROR. Possible error
+ * codes are those in the #GFileError enumeration. In the error case,
+ * @contents is set to %NULL and @length is set to zero.
+ *
+ * Return value: %TRUE on success, %FALSE if an error occurred
+ **/
+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
+}
+
+#ifdef G_OS_WIN32
+
+#undef g_file_get_contents
+
+/* Binary compatibility version. Not for newly compiled code. */
+
+gboolean
+g_file_get_contents (const gchar *filename,
+ gchar **contents,
+ gsize *length,
+ GError **error)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, error);
+ gboolean retval;
+
+ if (utf8_filename == NULL)
+ return FALSE;
+
+ retval = g_file_get_contents_utf8 (utf8_filename, contents, length, error);
+
+ g_free (utf8_filename);
+
+ return retval;
+}
+
+#endif
+
+static gboolean
+rename_file (const char *old_name,
+ const char *new_name,
+ GError **err)
+{
+ errno = 0;
+ if (g_rename (old_name, new_name) == -1)
+ {
+ int save_errno = errno;
+ gchar *display_old_name = g_filename_display_name (old_name);
+ gchar *display_new_name = g_filename_display_name (new_name);
+
+ g_set_error (err,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to rename file '%s' to '%s': g_rename() failed: %s"),
+ display_old_name,
+ display_new_name,
+ g_strerror (save_errno));
+
+ g_free (display_old_name);
+ g_free (display_new_name);
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static gchar *
+write_to_temp_file (const gchar *contents,
+ gssize length,
+ const gchar *template,
+ GError **err)
+{
+ gchar *tmp_name;
+ gchar *display_name;
+ gchar *retval;
+ FILE *file;
+ gint fd;
+ int save_errno;
+
+ retval = NULL;
+
+ tmp_name = g_strdup_printf ("%s.XXXXXX", template);
+
+ errno = 0;
+ fd = create_temp_file (tmp_name, 0666);
+ display_name = g_filename_display_name (tmp_name);
+
+ if (fd == -1)
+ {
+ save_errno = errno;
+ g_set_error (err,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to create file '%s': %s"),
+ display_name, g_strerror (save_errno));
+
+ goto out;
+ }
+
+ errno = 0;
+ file = fdopen (fd, "wb");
+ if (!file)
+ {
+ save_errno = errno;
+ g_set_error (err,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to open file '%s' for writing: fdopen() failed: %s"),
+ display_name,
+ g_strerror (save_errno));
+
+ close (fd);
+ g_unlink (tmp_name);
+
+ goto out;
+ }
+
+ if (length > 0)
+ {
+ gsize n_written;
+
+ errno = 0;
+
+ n_written = fwrite (contents, 1, length, file);
+
+ if (n_written < length)
+ {
+ save_errno = errno;
+
+ g_set_error (err,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to write file '%s': fwrite() failed: %s"),
+ display_name,
+ g_strerror (save_errno));
+
+ fclose (file);
+ g_unlink (tmp_name);
+
+ goto out;
+ }
+ }
+
+ errno = 0;
+ if (fclose (file) == EOF)
+ {
+ save_errno = 0;
+
+ g_set_error (err,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to close file '%s': fclose() failed: %s"),
+ display_name,
+ g_strerror (save_errno));
+
+ g_unlink (tmp_name);
+
+ goto out;
+ }
+
+ retval = g_strdup (tmp_name);
+
+ out:
+ g_free (tmp_name);
+ g_free (display_name);
+
+ return retval;
+}
+
+/**
+ * g_file_set_contents:
+ * @filename: name of a file to write @contents to, in the GLib file name
+ * encoding
+ * @contents: string to write to the file
+ * @length: length of @contents, or -1 if @contents is a nul-terminated string
+ * @error: return location for a #GError, or %NULL
+ *
+ * Writes all of @contents to a file named @filename, with good error checking.
+ * If a file called @filename already exists it will be overwritten.
+ *
+ * This write is atomic in the sense that it is first written to a temporary
+ * file which is then renamed to the final name. Notes:
+ * <itemizedlist>
+ * <listitem>
+ * On Unix, if @filename already exists hard links to @filename will break.
+ * Also since the file is recreated, existing permissions, access control
+ * lists, metadata etc. may be lost. If @filename is a symbolic link,
+ * the link itself will be replaced, not the linked file.
+ * </listitem>
+ * <listitem>
+ * On Windows renaming a file will not remove an existing file with the
+ * new name, so on Windows there is a race condition between the existing
+ * file being removed and the temporary file being renamed.
+ * </listitem>
+ * <listitem>
+ * On Windows there is no way to remove a file that is open to some
+ * process, or mapped into memory. Thus, this function will fail if
+ * @filename already exists and is open.
+ * </listitem>
+ * </itemizedlist>
+ *
+ * If the call was sucessful, it returns %TRUE. If the call was not successful,
+ * it returns %FALSE and sets @error. The error domain is #G_FILE_ERROR.
+ * Possible error codes are those in the #GFileError enumeration.
+ *
+ * Return value: %TRUE on success, %FALSE if an error occurred
+ *
+ * Since: 2.8
+ **/
+gboolean
+g_file_set_contents (const gchar *filename,
+ const gchar *contents,
+ gssize length,
+ GError **error)
+{
+ gchar *tmp_filename;
+ gboolean retval;
+ GError *rename_error = NULL;
+
+ g_return_val_if_fail (filename != NULL, FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+ g_return_val_if_fail (contents != NULL || length == 0, FALSE);
+ g_return_val_if_fail (length >= -1, FALSE);
+
+ if (length == -1)
+ length = strlen (contents);
+
+ tmp_filename = write_to_temp_file (contents, length, filename, error);
+
+ if (!tmp_filename)
+ {
+ retval = FALSE;
+ goto out;
+ }
+
+ if (!rename_file (tmp_filename, filename, &rename_error))
+ {
+#ifndef G_OS_WIN32
+
+ g_unlink (tmp_filename);
+ g_propagate_error (error, rename_error);
+ retval = FALSE;
+ goto out;
+
+#else /* G_OS_WIN32 */
+
+ /* Renaming failed, but on Windows this may just mean
+ * the file already exists. So if the target file
+ * exists, try deleting it and do the rename again.
+ */
+ if (!g_file_test (filename, G_FILE_TEST_EXISTS))
+ {
+ g_unlink (tmp_filename);
+ g_propagate_error (error, rename_error);
+ retval = FALSE;
+ goto out;
+ }
+
+ g_error_free (rename_error);
+
+ if (g_unlink (filename) == -1)
+ {
+ gchar *display_filename = g_filename_display_name (filename);
+
+ int save_errno = errno;
+
+ g_set_error (error,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Existing file '%s' could not be removed: g_unlink() failed: %s"),
+ display_filename,
+ g_strerror (save_errno));
+
+ g_free (display_filename);
+ g_unlink (tmp_filename);
+ retval = FALSE;
+ goto out;
+ }
+
+ if (!rename_file (tmp_filename, filename, error))
+ {
+ g_unlink (tmp_filename);
+ retval = FALSE;
+ goto out;
+ }
+
+#endif
+ }
+
+ retval = TRUE;
+
+ out:
+ g_free (tmp_filename);
+ return retval;
+}
+
+/*
+ * create_temp_file based on the mkstemp implementation from the GNU C library.
+ * Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc.
+ */
+static gint
+create_temp_file (gchar *tmpl,
+ int permissions)
+{
+ 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;
+
+ /* find the last occurrence of "XXXXXX" */
+ XXXXXX = g_strrstr (tmpl, "XXXXXX");
+
+ if (!XXXXXX || strncmp (XXXXXX, "XXXXXX", 6))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* 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];
+
+ /* tmpl is in UTF-8 on Windows, thus use g_open() */
+ fd = g_open (tmpl, O_RDWR | O_CREAT | O_EXCL | O_BINARY, permissions);
+
+ 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. */
+ errno = EEXIST;
+ return -1;
+}
+
+/**
+ * g_mkstemp:
+ * @tmpl: template filename
+ *
+ * Opens a temporary file. See the mkstemp() documentation
+ * on most UNIX-like systems.
+ *
+ * The parameter is a string that should follow the rules for
+ * mkstemp() templates, i.e. contain the string "XXXXXX".
+ * g_mkstemp() is slightly more flexible than mkstemp()
+ * in that the sequence does not have to occur at the very end of the
+ * template. The X string will
+ * be modified to form the name of a file that didn't exist.
+ * The string should be in the GLib file name encoding. Most importantly,
+ * on Windows it should be in UTF-8.
+ *
+ * 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.
+ */
+gint
+g_mkstemp (gchar *tmpl)
+{
+ return create_temp_file (tmpl, 0600);
+}
+
+#ifdef G_OS_WIN32
+
+#undef g_mkstemp
+
+/* Binary compatibility version. Not for newly compiled code. */
+
+gint
+g_mkstemp (gchar *tmpl)
+{
+ 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;
+
+ /* find the last occurrence of 'XXXXXX' */
+ XXXXXX = g_strrstr (tmpl, "XXXXXX");
+
+ if (!XXXXXX || strcmp (XXXXXX, "XXXXXX"))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* 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];
+
+ /* This is the backward compatibility system codepage version,
+ * thus use normal open().
+ */
+ 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. */
+ errno = EEXIST;
+ return -1;
+}
+
+#endif
+
+/**
+ * g_file_open_tmp:
+ * @tmpl: Template for file name, as in g_mkstemp(), basename only,
+ * or %NULL, to a default template
+ * @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 in the GLib file name encoding containing
+ * a sequence of six 'X' characters, as the parameter to g_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.
+ * The returned name is in the GLib file name encoding.
+ *
+ * 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.
+ **/
+gint
+g_file_open_tmp (const gchar *tmpl,
+ gchar **name_used,
+ GError **error)
+{
+ int retval;
+ const char *tmpdir;
+ char *sep;
+ char *fulltemplate;
+ const char *slash;
+
+ if (tmpl == NULL)
+ tmpl = ".XXXXXX";
+
+ if ((slash = strchr (tmpl, G_DIR_SEPARATOR)) != NULL
+#ifdef G_OS_WIN32
+ || (strchr (tmpl, '/') != NULL && (slash = "/"))
+#endif
+ )
+ {
+ gchar *display_tmpl = g_filename_display_name (tmpl);
+ char c[2];
+ c[0] = *slash;
+ c[1] = '\0';
+
+ g_set_error (error,
+ G_FILE_ERROR,
+ G_FILE_ERROR_FAILED,
+ _("Template '%s' invalid, should not contain a '%s'"),
+ display_tmpl, c);
+ g_free (display_tmpl);
+
+ return -1;
+ }
+
+ if (strstr (tmpl, "XXXXXX") == NULL)
+ {
+ gchar *display_tmpl = g_filename_display_name (tmpl);
+ g_set_error (error,
+ G_FILE_ERROR,
+ G_FILE_ERROR_FAILED,
+ _("Template '%s' doesn't contain XXXXXX"),
+ display_tmpl);
+ g_free (display_tmpl);
+ return -1;
+ }
+
+ tmpdir = g_get_tmp_dir ();
+
+ if (G_IS_DIR_SEPARATOR (tmpdir [strlen (tmpdir) - 1]))
+ sep = "";
+ else
+ sep = G_DIR_SEPARATOR_S;
+
+ fulltemplate = g_strconcat (tmpdir, sep, tmpl, NULL);
+
+ retval = g_mkstemp (fulltemplate);
+
+ if (retval == -1)
+ {
+ int save_errno = errno;
+ gchar *display_fulltemplate = g_filename_display_name (fulltemplate);
+
+ g_set_error (error,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to create file '%s': %s"),
+ display_fulltemplate, g_strerror (save_errno));
+ g_free (display_fulltemplate);
+ g_free (fulltemplate);
+ return -1;
+ }
+
+ if (name_used)
+ *name_used = fulltemplate;
+ else
+ g_free (fulltemplate);
+
+ return retval;
+}
+
+#ifdef G_OS_WIN32
+
+#undef g_file_open_tmp
+
+/* Binary compatibility version. Not for newly compiled code. */
+
+gint
+g_file_open_tmp (const gchar *tmpl,
+ gchar **name_used,
+ GError **error)
+{
+ gchar *utf8_tmpl = g_locale_to_utf8 (tmpl, -1, NULL, NULL, error);
+ gchar *utf8_name_used;
+ gint retval;
+
+ if (utf8_tmpl == NULL)
+ return -1;
+
+ retval = g_file_open_tmp_utf8 (utf8_tmpl, &utf8_name_used, error);
+
+ if (retval == -1)
+ return -1;
+
+ if (name_used)
+ *name_used = g_locale_from_utf8 (utf8_name_used, -1, NULL, NULL, NULL);
+
+ g_free (utf8_name_used);
+
+ return retval;
+}
+
+#endif
+
+static gchar *
+g_build_path_va (const gchar *separator,
+ const gchar *first_element,
+ va_list *args,
+ gchar **str_array)
+{
+ GString *result;
+ gint separator_len = strlen (separator);
+ gboolean is_first = TRUE;
+ gboolean have_leading = FALSE;
+ const gchar *single_element = NULL;
+ const gchar *next_element;
+ const gchar *last_trailing = NULL;
+ gint i = 0;
+
+ result = g_string_new (NULL);
+
+ if (str_array)
+ next_element = str_array[i++];
+ else
+ next_element = first_element;
+
+ while (TRUE)
+ {
+ const gchar *element;
+ const gchar *start;
+ const gchar *end;
+
+ if (next_element)
+ {
+ element = next_element;
+ if (str_array)
+ next_element = str_array[i++];
+ else
+ next_element = va_arg (*args, gchar *);
+ }
+ else
+ break;
+
+ /* Ignore empty elements */
+ if (!*element)
+ continue;
+
+ start = element;
+
+ if (separator_len)
+ {
+ while (start &&
+ strncmp (start, separator, separator_len) == 0)
+ start += separator_len;
+ }
+
+ end = start + strlen (start);
+
+ if (separator_len)
+ {
+ while (end >= start + separator_len &&
+ strncmp (end - separator_len, separator, separator_len) == 0)
+ end -= separator_len;
+
+ last_trailing = end;
+ while (last_trailing >= element + separator_len &&
+ strncmp (last_trailing - separator_len, separator, separator_len) == 0)
+ last_trailing -= separator_len;
+
+ if (!have_leading)
+ {
+ /* If the leading and trailing separator strings are in the
+ * same element and overlap, the result is exactly that element
+ */
+ if (last_trailing <= start)
+ single_element = element;
+
+ g_string_append_len (result, element, start - element);
+ have_leading = TRUE;
+ }
+ else
+ single_element = NULL;
+ }
+
+ if (end == start)
+ continue;
+
+ if (!is_first)
+ g_string_append (result, separator);
+
+ g_string_append_len (result, start, end - start);
+ is_first = FALSE;
+ }
+
+ if (single_element)
+ {
+ g_string_free (result, TRUE);
+ return g_strdup (single_element);
+ }
+ else
+ {
+ if (last_trailing)
+ g_string_append (result, last_trailing);
+
+ return g_string_free (result, FALSE);
+ }
+}
+
+/**
+ * g_build_pathv:
+ * @separator: a string used to separator the elements of the path.
+ * @args: %NULL-terminated array of strings containing the path elements.
+ *
+ * Behaves exactly like g_build_path(), but takes the path elements
+ * as a string array, instead of varargs. This function is mainly
+ * meant for language bindings.
+ *
+ * Return value: a newly-allocated string that must be freed with g_free().
+ *
+ * Since: 2.8
+ */
+gchar *
+g_build_pathv (const gchar *separator,
+ gchar **args)
+{
+ if (!args)
+ return NULL;
+
+ return g_build_path_va (separator, NULL, NULL, args);
+}
+
+
+/**
+ * g_build_path:
+ * @separator: a string used to separator the elements of the path.
+ * @first_element: the first element in the path
+ * @Varargs: remaining elements in path, terminated by %NULL
+ *
+ * Creates a path from a series of elements using @separator as the
+ * separator between elements. At the boundary between two elements,
+ * any trailing occurrences of separator in the first element, or
+ * leading occurrences of separator in the second element are removed
+ * and exactly one copy of the separator is inserted.
+ *
+ * Empty elements are ignored.
+ *
+ * The number of leading copies of the separator on the result is
+ * the same as the number of leading copies of the separator on
+ * the first non-empty element.
+ *
+ * The number of trailing copies of the separator on the result is
+ * the same as the number of trailing copies of the separator on
+ * the last non-empty element. (Determination of the number of
+ * trailing copies is done without stripping leading copies, so
+ * if the separator is <literal>ABA</literal>, <literal>ABABA</literal>
+ * has 1 trailing copy.)
+ *
+ * However, if there is only a single non-empty element, and there
+ * are no characters in that element not part of the leading or
+ * trailing separators, then the result is exactly the original value
+ * of that element.
+ *
+ * Other than for determination of the number of leading and trailing
+ * copies of the separator, elements consisting only of copies
+ * of the separator are ignored.
+ *
+ * Return value: a newly-allocated string that must be freed with g_free().
+ **/
+gchar *
+g_build_path (const gchar *separator,
+ const gchar *first_element,
+ ...)
+{
+ gchar *str;
+ va_list args;
+
+ g_return_val_if_fail (separator != NULL, NULL);
+
+ va_start (args, first_element);
+ str = g_build_path_va (separator, first_element, &args, NULL);
+ va_end (args);
+
+ return str;
+}
+
+#ifdef G_OS_WIN32
+
+static gchar *
+g_build_pathname_va (const gchar *first_element,
+ va_list *args,
+ gchar **str_array)
+{
+ /* Code copied from g_build_pathv(), and modified to use two
+ * alternative single-character separators.
+ */
+ GString *result;
+ gboolean is_first = TRUE;
+ gboolean have_leading = FALSE;
+ const gchar *single_element = NULL;
+ const gchar *next_element;
+ const gchar *last_trailing = NULL;
+ gchar current_separator = '\\';
+ gint i = 0;
+
+ result = g_string_new (NULL);
+
+ if (str_array)
+ next_element = str_array[i++];
+ else
+ next_element = first_element;
+
+ while (TRUE)
+ {
+ const gchar *element;
+ const gchar *start;
+ const gchar *end;
+
+ if (next_element)
+ {
+ element = next_element;
+ if (str_array)
+ next_element = str_array[i++];
+ else
+ next_element = va_arg (*args, gchar *);
+ }
+ else
+ break;
+
+ /* Ignore empty elements */
+ if (!*element)
+ continue;
+
+ start = element;
+
+ if (TRUE)
+ {
+ while (start &&
+ (*start == '\\' || *start == '/'))
+ {
+ current_separator = *start;
+ start++;
+ }
+ }
+
+ end = start + strlen (start);
+
+ if (TRUE)
+ {
+ while (end >= start + 1 &&
+ (end[-1] == '\\' || end[-1] == '/'))
+ {
+ current_separator = end[-1];
+ end--;
+ }
+
+ last_trailing = end;
+ while (last_trailing >= element + 1 &&
+ (last_trailing[-1] == '\\' || last_trailing[-1] == '/'))
+ last_trailing--;
+
+ if (!have_leading)
+ {
+ /* If the leading and trailing separator strings are in the
+ * same element and overlap, the result is exactly that element
+ */
+ if (last_trailing <= start)
+ single_element = element;
+
+ g_string_append_len (result, element, start - element);
+ have_leading = TRUE;
+ }
+ else
+ single_element = NULL;
+ }
+
+ if (end == start)
+ continue;
+
+ if (!is_first)
+ g_string_append_len (result, &current_separator, 1);
+
+ g_string_append_len (result, start, end - start);
+ is_first = FALSE;
+ }
+
+ if (single_element)
+ {
+ g_string_free (result, TRUE);
+ return g_strdup (single_element);
+ }
+ else
+ {
+ if (last_trailing)
+ g_string_append (result, last_trailing);
+
+ return g_string_free (result, FALSE);
+ }
+}
+
+#endif
+
+/**
+ * g_build_filenamev:
+ * @args: %NULL-terminated array of strings containing the path elements.
+ *
+ * Behaves exactly like g_build_filename(), but takes the path elements
+ * as a string array, instead of varargs. This function is mainly
+ * meant for language bindings.
+ *
+ * Return value: a newly-allocated string that must be freed with g_free().
+ *
+ * Since: 2.8
+ */
+gchar *
+g_build_filenamev (gchar **args)
+{
+ gchar *str;
+
+#ifndef G_OS_WIN32
+ str = g_build_path_va (G_DIR_SEPARATOR_S, NULL, NULL, args);
+#else
+ str = g_build_pathname_va (NULL, NULL, args);
+#endif
+
+ return str;
+}
+
+/**
+ * g_build_filename:
+ * @first_element: the first element in the path
+ * @Varargs: remaining elements in path, terminated by %NULL
+ *
+ * Creates a filename from a series of elements using the correct
+ * separator for filenames.
+ *
+ * On Unix, this function behaves identically to <literal>g_build_path
+ * (G_DIR_SEPARATOR_S, first_element, ....)</literal>.
+ *
+ * On Windows, it takes into account that either the backslash
+ * (<literal>\</literal> or slash (<literal>/</literal>) can be used
+ * as separator in filenames, but otherwise behaves as on Unix. When
+ * file pathname separators need to be inserted, the one that last
+ * previously occurred in the parameters (reading from left to right)
+ * is used.
+ *
+ * No attempt is made to force the resulting filename to be an absolute
+ * path. If the first element is a relative path, the result will
+ * be a relative path.
+ *
+ * Return value: a newly-allocated string that must be freed with g_free().
+ **/
+gchar *
+g_build_filename (const gchar *first_element,
+ ...)
+{
+ gchar *str;
+ va_list args;
+
+ va_start (args, first_element);
+#ifndef G_OS_WIN32
+ str = g_build_path_va (G_DIR_SEPARATOR_S, first_element, &args, NULL);
+#else
+ str = g_build_pathname_va (first_element, &args, NULL);
+#endif
+ va_end (args);
+
+ return str;
+}
+
+/**
+ * g_file_read_link:
+ * @filename: the symbolic link
+ * @error: return location for a #GError
+ *
+ * Reads the contents of the symbolic link @filename like the POSIX
+ * readlink() function. The returned string is in the encoding used
+ * for filenames. Use g_filename_to_utf8() to convert it to UTF-8.
+ *
+ * Returns: A newly allocated string with the contents of the symbolic link,
+ * or %NULL if an error occurred.
+ *
+ * Since: 2.4
+ */
+gchar *
+g_file_read_link (const gchar *filename,
+ GError **error)
+{
+#ifdef HAVE_READLINK
+ gchar *buffer;
+ guint size;
+ gint read_size;
+
+ size = 256;
+ buffer = g_malloc (size);
+
+ while (TRUE)
+ {
+ read_size = readlink (filename, buffer, size);
+ if (read_size < 0) {
+ int save_errno = errno;
+ gchar *display_filename = g_filename_display_name (filename);
+
+ g_free (buffer);
+ g_set_error (error,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to read the symbolic link '%s': %s"),
+ display_filename,
+ g_strerror (save_errno));
+ g_free (display_filename);
+
+ return NULL;
+ }
+
+ if (read_size < size)
+ {
+ buffer[read_size] = 0;
+ return buffer;
+ }
+
+ size *= 2;
+ buffer = g_realloc (buffer, size);
+ }
+#else
+ g_set_error (error,
+ G_FILE_ERROR,
+ G_FILE_ERROR_INVAL,
+ _("Symbolic links not supported"));
+
+ return NULL;
+#endif
+}
+
+#define __G_FILEUTILS_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gfileutils.h b/trunk/glib/gfileutils.h
new file mode 100644
index 000000000..0aa085238
--- /dev/null
+++ b/trunk/glib/gfileutils.h
@@ -0,0 +1,119 @@
+/* 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 <glib/gerror.h>
+
+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_NOSYS,
+ 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);
+
+#ifdef G_OS_WIN32
+#define g_file_test g_file_test_utf8
+#define g_file_get_contents g_file_get_contents_utf8
+#define g_mkstemp g_mkstemp_utf8
+#define g_file_open_tmp g_file_open_tmp_utf8
+#endif
+
+gboolean g_file_test (const gchar *filename,
+ GFileTest test);
+gboolean g_file_get_contents (const gchar *filename,
+ gchar **contents,
+ gsize *length,
+ GError **error);
+gboolean g_file_set_contents (const gchar *filename,
+ const gchar *contents,
+ gssize length,
+ GError **error);
+gchar *g_file_read_link (const gchar *filename,
+ GError **error);
+
+/* Wrapper / workalike for mkstemp() */
+gint g_mkstemp (gchar *tmpl);
+
+/* Wrapper for g_mkstemp */
+gint g_file_open_tmp (const gchar *tmpl,
+ gchar **name_used,
+ GError **error);
+
+gchar *g_build_path (const gchar *separator,
+ const gchar *first_element,
+ ...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED;
+gchar *g_build_pathv (const gchar *separator,
+ gchar **args) G_GNUC_MALLOC;
+
+gchar *g_build_filename (const gchar *first_element,
+ ...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED;
+gchar *g_build_filenamev (gchar **args) G_GNUC_MALLOC;
+
+int g_mkdir_with_parents (const gchar *pathname,
+ int mode);
+
+G_END_DECLS
+
+#endif /* __G_FILEUTILS_H__ */
diff --git a/trunk/glib/ghash.c b/trunk/glib/ghash.c
new file mode 100644
index 000000000..8eea09a26
--- /dev/null
+++ b/trunk/glib/ghash.c
@@ -0,0 +1,870 @@
+/* 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 "config.h"
+
+#include "glib.h"
+#include "galias.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;
+ guint key_hash;
+};
+
+struct _GHashTable
+{
+ gint size;
+ gint nnodes;
+ GHashNode **nodes;
+ GHashFunc hash_func;
+ GEqualFunc key_equal_func;
+ volatile gint ref_count;
+ GDestroyNotify key_destroy_func;
+ GDestroyNotify value_destroy_func;
+};
+
+#define G_HASH_TABLE_RESIZE(hash_table) \
+ G_STMT_START { \
+ if ((hash_table->size >= 3 * hash_table->nnodes && \
+ hash_table->size > HASH_TABLE_MIN_SIZE) || \
+ (3 * hash_table->size <= hash_table->nnodes && \
+ hash_table->size < HASH_TABLE_MAX_SIZE)) \
+ g_hash_table_resize (hash_table); \
+ } G_STMT_END
+
+static void g_hash_table_resize (GHashTable *hash_table);
+static GHashNode** g_hash_table_lookup_node (GHashTable *hash_table,
+ gconstpointer key,
+ guint *hash_return);
+static GHashNode* g_hash_node_new (gpointer key,
+ gpointer value,
+ guint key_hash);
+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_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 with a reference count of 1.
+ *
+ * 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() with a reference count
+ * of 1 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;
+
+ hash_table = g_slice_new (GHashTable);
+ 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->ref_count = 1;
+ hash_table->key_destroy_func = key_destroy_func;
+ hash_table->value_destroy_func = value_destroy_func;
+ hash_table->nodes = g_new0 (GHashNode*, hash_table->size);
+
+ return hash_table;
+}
+
+
+/**
+ * g_hash_table_ref:
+ * @hash_table: a valid #GHashTable.
+ *
+ * Atomically increments the reference count of @hash_table by one.
+ * This function is MT-safe and may be called from any thread.
+ *
+ * Return value: the passed in #GHashTable.
+ *
+ * Since: 2.10
+ **/
+GHashTable*
+g_hash_table_ref (GHashTable *hash_table)
+{
+ g_return_val_if_fail (hash_table != NULL, NULL);
+ g_return_val_if_fail (hash_table->ref_count > 0, hash_table);
+
+ g_atomic_int_add (&hash_table->ref_count, 1);
+ return hash_table;
+}
+
+/**
+ * g_hash_table_unref:
+ * @hash_table: a valid #GHashTable.
+ *
+ * Atomically decrements the reference count of @hash_table by one.
+ * If the reference count drops to 0, all keys and values will be
+ * destroyed, and all memory allocated by the hash table is released.
+ * This function is MT-safe and may be called from any thread.
+ *
+ * Since: 2.10
+ **/
+void
+g_hash_table_unref (GHashTable *hash_table)
+{
+ g_return_if_fail (hash_table != NULL);
+ g_return_if_fail (hash_table->ref_count > 0);
+
+ if (g_atomic_int_exchange_and_add (&hash_table->ref_count, -1) - 1 == 0)
+ {
+ gint i;
+
+ 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_slice_free (GHashTable, hash_table);
+ }
+}
+
+/**
+ * g_hash_table_destroy:
+ * @hash_table: a #GHashTable.
+ *
+ * Destroys all keys and values in the #GHashTable and decrements its
+ * reference count by 1. If keys and/or values are dynamically allocated,
+ * you should either free them first or create the #GHashTable with destroy
+ * notifiers using g_hash_table_new_full(). In the latter case the destroy
+ * functions you supplied will be called on all keys and values during the
+ * destruction phase.
+ **/
+void
+g_hash_table_destroy (GHashTable *hash_table)
+{
+ g_return_if_fail (hash_table != NULL);
+ g_return_if_fail (hash_table->ref_count > 0);
+
+ g_hash_table_remove_all (hash_table);
+ g_hash_table_unref (hash_table);
+}
+
+static inline GHashNode**
+g_hash_table_lookup_node (GHashTable *hash_table,
+ gconstpointer key,
+ guint *hash_return)
+{
+ GHashNode **node;
+ guint hash_value;
+
+ hash_value = (* hash_table->hash_func) (key);
+ node = &hash_table->nodes[hash_value % hash_table->size];
+
+ if (hash_return)
+ *hash_return = hash_value;
+
+ /* 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.
+ *
+ * Additional optimisation: first check if our full hash
+ * values are equal so we can avoid calling the full-blown
+ * key equality function in most cases.
+ */
+ if (hash_table->key_equal_func)
+ while (*node && (((*node)->key_hash != hash_value) ||
+ !(*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. Note that this function cannot
+ * distinguish between a key that is not present and one which is present
+ * and has the value %NULL. If you need this distinction, use
+ * g_hash_table_lookup_extended().
+ *
+ * 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, NULL);
+
+ 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, NULL);
+
+ 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;
+ guint key_hash;
+
+ g_return_if_fail (hash_table != NULL);
+ g_return_if_fail (hash_table->ref_count > 0);
+
+ node = g_hash_table_lookup_node (hash_table, key, &key_hash);
+
+ 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, key_hash);
+ 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;
+ guint key_hash;
+
+ g_return_if_fail (hash_table != NULL);
+ g_return_if_fail (hash_table->ref_count > 0);
+
+ node = g_hash_table_lookup_node (hash_table, key, &key_hash);
+
+ 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, key_hash);
+ 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, NULL);
+ 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_remove_all:
+ * @hash_table: a #GHashTable
+ *
+ * Removes all keys and their associated values from a #GHashTable.
+ *
+ * If the #GHashTable was created using g_hash_table_new_full(), the keys
+ * and values are freed using the supplied destroy functions, otherwise you
+ * have to make sure that any dynamically allocated values are freed
+ * yourself.
+ *
+ * Since: 2.12
+ **/
+void
+g_hash_table_remove_all (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);
+ hash_table->nodes[i] = NULL;
+ }
+ hash_table->nnodes = 0;
+
+ G_HASH_TABLE_RESIZE (hash_table);
+}
+
+/**
+ * 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, NULL);
+ 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_steal_all:
+ * @hash_table: a #GHashTable.
+ *
+ * Removes all keys and their associated values from a #GHashTable
+ * without calling the key and value destroy functions.
+ *
+ * Since: 2.12
+ **/
+void
+g_hash_table_steal_all (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], NULL, NULL);
+ hash_table->nodes[i] = NULL;
+ }
+
+ hash_table->nnodes = 0;
+
+ G_HASH_TABLE_RESIZE (hash_table);
+}
+
+/**
+ * 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;
+ gint 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->key_destroy_func : NULL,
+ notify ? hash_table->value_destroy_func : NULL);
+ node = prev;
+ }
+ else
+ {
+ hash_table->nodes[i] = node->next;
+ g_hash_node_destroy (node,
+ notify ? hash_table->key_destroy_func : NULL,
+ notify ? hash_table->value_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. The hash table may not
+ * be modified while iterating over it (you can't add/remove
+ * items). To remove all items matching a predicate, use
+ * g_hash_table_foreach_remove().
+ **/
+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_find:
+ * @hash_table: a #GHashTable.
+ * @predicate: function to test the key/value pairs for a certain property.
+ * @user_data: user data to pass to the function.
+ *
+ * Calls the given function for key/value pairs in the #GHashTable until
+ * @predicate returns %TRUE. The function is passed the key and value of
+ * each pair, and the given @user_data parameter. The hash table may not
+ * be modified while iterating over it (you can't add/remove items).
+ *
+ * Return value: The value of the first key/value pair is returned, for which
+ * func evaluates to %TRUE. If no pair with the requested property is found,
+ * %NULL is returned.
+ *
+ * Since: 2.4
+ **/
+gpointer
+g_hash_table_find (GHashTable *hash_table,
+ GHRFunc predicate,
+ gpointer user_data)
+{
+ GHashNode *node;
+ gint i;
+
+ g_return_val_if_fail (hash_table != NULL, NULL);
+ g_return_val_if_fail (predicate != NULL, NULL);
+
+ for (i = 0; i < hash_table->size; i++)
+ for (node = hash_table->nodes[i]; node; node = node->next)
+ if (predicate (node->key, node->value, user_data))
+ return node->value;
+ return NULL;
+}
+
+/**
+ * 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;
+}
+
+/**
+ * g_hash_table_get_keys:
+ * @hash_table: a #GHashTable
+ *
+ * Retrieves every key inside @hash_table. The returned data is valid
+ * until @hash_table is modified.
+ *
+ * Return value: a #GList containing all the keys inside the hash
+ * table. The content of the list is owned by the hash table and
+ * should not be modified or freed. Use g_list_free() when done
+ * using the list.
+ *
+ * Since: 2.14
+ */
+GList *
+g_hash_table_get_keys (GHashTable *hash_table)
+{
+ GHashNode *node;
+ gint i;
+ GList *retval;
+
+ g_return_val_if_fail (hash_table != NULL, NULL);
+
+ retval = NULL;
+ for (i = 0; i < hash_table->size; i++)
+ for (node = hash_table->nodes[i]; node; node = node->next)
+ retval = g_list_prepend (retval, node->key);
+
+ return retval;
+}
+
+/**
+ * g_hash_table_get_values:
+ * @hash_table: a #GHashTable
+ *
+ * Retrieves every value inside @hash_table. The returned data is
+ * valid until @hash_table is modified.
+ *
+ * Return value: a #GList containing all the values inside the hash
+ * table. The content of the list is owned by the hash table and
+ * should not be modified or freed. Use g_list_free() when done
+ * using the list.
+ *
+ * Since: 2.14
+ */
+GList *
+g_hash_table_get_values (GHashTable *hash_table)
+{
+ GHashNode *node;
+ gint i;
+ GList *retval;
+
+ g_return_val_if_fail (hash_table != NULL, NULL);
+
+ retval = NULL;
+ for (i = 0; i < hash_table->size; i++)
+ for (node = hash_table->nodes[i]; node; node = node->next)
+ retval = g_list_prepend (retval, node->value);
+
+ return retval;
+}
+
+static void
+g_hash_table_resize (GHashTable *hash_table)
+{
+ GHashNode **new_nodes;
+ GHashNode *node;
+ GHashNode *next;
+ guint hash_val;
+ gint new_size;
+ gint i;
+
+ new_size = g_spaced_primes_closest (hash_table->nnodes);
+ new_size = CLAMP (new_size, 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 = node->key_hash % 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,
+ guint key_hash)
+{
+ GHashNode *hash_node = g_slice_new (GHashNode);
+
+ hash_node->key = key;
+ hash_node->value = value;
+ hash_node->key_hash = key_hash;
+ 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);
+ g_slice_free (GHashNode, hash_node);
+}
+
+static void
+g_hash_nodes_destroy (GHashNode *hash_node,
+ GFreeFunc key_destroy_func,
+ GFreeFunc value_destroy_func)
+{
+ while (hash_node)
+ {
+ GHashNode *next = hash_node->next;
+ if (key_destroy_func)
+ key_destroy_func (hash_node->key);
+ if (value_destroy_func)
+ value_destroy_func (hash_node->value);
+ g_slice_free (GHashNode, hash_node);
+ hash_node = next;
+ }
+}
+
+
+#define __G_HASH_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/ghash.h b/trunk/glib/ghash.h
new file mode 100644
index 000000000..854266506
--- /dev/null
+++ b/trunk/glib/ghash.h
@@ -0,0 +1,120 @@
+/* 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 <glib/gtypes.h>
+#include <glib/glist.h>
+
+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);
+void g_hash_table_remove_all (GHashTable *hash_table);
+gboolean g_hash_table_steal (GHashTable *hash_table,
+ gconstpointer key);
+void g_hash_table_steal_all (GHashTable *hash_table);
+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);
+gpointer g_hash_table_find (GHashTable *hash_table,
+ GHRFunc predicate,
+ 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);
+GList * g_hash_table_get_keys (GHashTable *hash_table);
+GList * g_hash_table_get_values (GHashTable *hash_table);
+
+/* keeping hash tables alive */
+GHashTable* g_hash_table_ref (GHashTable *hash_table);
+void g_hash_table_unref (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 v1,
+ gconstpointer v2);
+guint g_str_hash (gconstpointer v);
+
+gboolean g_int_equal (gconstpointer v1,
+ gconstpointer v2);
+guint g_int_hash (gconstpointer v);
+
+/* This "hash" function will just return the key's address as an
+ * unsigned integer. Useful for hashing on plain addresses 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 v1,
+ gconstpointer v2) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* __G_HASH_H__ */
+
diff --git a/trunk/glib/ghook.c b/trunk/glib/ghook.c
new file mode 100644
index 000000000..01ab78d91
--- /dev/null
+++ b/trunk/glib/ghook.c
@@ -0,0 +1,637 @@
+/* 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 "config.h"
+
+#include "glib.h"
+#include "galias.h"
+
+
+/* --- 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));
+
+ hook_list->seq_id = 1;
+ hook_list->hook_size = hook_size;
+ hook_list->is_setup = TRUE;
+ hook_list->hooks = NULL;
+ hook_list->dummy3 = NULL;
+ hook_list->finalize_hook = default_finalize_hook;
+ hook_list->dummy[0] = NULL;
+ hook_list->dummy[1] = NULL;
+}
+
+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)
+ {
+ /* destroy hook_list->hook_memchunk */
+ }
+ 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);
+ }
+}
+
+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_slice_alloc0 (hook_list->hook_size);
+ 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_slice_free1 (hook_list->hook_size, hook);
+}
+
+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 != 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)
+ {
+ /* destroy hook_list->hook_memchunk */
+ }
+ }
+ else
+ g_hook_free (hook_list, hook);
+ }
+}
+
+GHook *
+g_hook_ref (GHookList *hook_list,
+ GHook *hook)
+{
+ g_return_val_if_fail (hook_list != NULL, NULL);
+ g_return_val_if_fail (hook != NULL, NULL);
+ g_return_val_if_fail (hook->ref_count > 0, NULL);
+
+ hook->ref_count++;
+
+ return hook;
+}
+
+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;
+}
+
+#define __G_HOOK_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/ghook.h b/trunk/glib/ghook.h
new file mode 100644
index 000000000..cb4f8e1c2
--- /dev/null
+++ b/trunk/glib/ghook.h
@@ -0,0 +1,178 @@
+/* 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 <glib/gmem.h>
+
+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;
+ gpointer dummy3;
+ GHookFinalizeFunc finalize_hook;
+ gpointer dummy[2];
+};
+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 maintenance 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);
+GHook * 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/trunk/glib/gi18n-lib.h b/trunk/glib/gi18n-lib.h
new file mode 100644
index 000000000..48e9fa256
--- /dev/null
+++ b/trunk/glib/gi18n-lib.h
@@ -0,0 +1,40 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997, 2002 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_I18N_LIB_H__
+#define __G_I18N_LIB_H__
+
+#include <glib/gstrfuncs.h>
+
+#include <libintl.h>
+
+#ifndef GETTEXT_PACKAGE
+#error You must define GETTEXT_PACKAGE before including gi18n-lib.h.
+#endif
+
+#define _(String) dgettext (GETTEXT_PACKAGE, String)
+#define Q_(String) g_strip_context ((String), dgettext (GETTEXT_PACKAGE, String))
+#ifdef gettext_noop
+#define N_(String) gettext_noop (String)
+#else
+#define N_(String) (String)
+#endif
+
+#endif /* __G_I18N_LIB_H__ */
+
+
diff --git a/trunk/glib/gi18n.h b/trunk/glib/gi18n.h
new file mode 100644
index 000000000..730fbb203
--- /dev/null
+++ b/trunk/glib/gi18n.h
@@ -0,0 +1,35 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997, 2002 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_I18N_H__
+#define __G_I18N_H__
+
+#include <glib/gstrfuncs.h>
+#include <libintl.h>
+
+#define _(String) gettext (String)
+#define Q_(String) g_strip_context ((String), gettext (String))
+#ifdef gettext_noop
+#define N_(String) gettext_noop (String)
+#else
+#define N_(String) (String)
+#endif
+
+#endif /* __G_I18N_H__ */
+
+
diff --git a/trunk/glib/giochannel.c b/trunk/glib/giochannel.c
new file mode 100644
index 000000000..2f36b5e09
--- /dev/null
+++ b/trunk/glib/giochannel.c
@@ -0,0 +1,2304 @@
+/* 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 <string.h>
+#include <errno.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#undef G_DISABLE_DEPRECATED
+
+#include "glib.h"
+
+#include "giochannel.h"
+
+#include "glibintl.h"
+
+#include "galias.h"
+
+#define G_IO_NICE_BUF_SIZE 1024
+
+/* This needs to be as wide as the largest character in any possible encoding */
+#define MAX_CHAR_SIZE 10
+
+/* Some simplifying macros, which reduce the need to worry whether the
+ * buffers have been allocated. These also make USE_BUF () an lvalue,
+ * which is used in g_io_channel_read_to_end ().
+ */
+#define USE_BUF(channel) ((channel)->encoding ? (channel)->encoded_read_buf \
+ : (channel)->read_buf)
+#define BUF_LEN(string) ((string) ? (string)->len : 0)
+
+static GIOError g_io_error_get_from_g_error (GIOStatus status,
+ GError *err);
+static void g_io_channel_purge (GIOChannel *channel);
+static GIOStatus g_io_channel_fill_buffer (GIOChannel *channel,
+ GError **err);
+static GIOStatus g_io_channel_read_line_backend (GIOChannel *channel,
+ gsize *length,
+ gsize *terminator_pos,
+ GError **error);
+
+void
+g_io_channel_init (GIOChannel *channel)
+{
+ channel->ref_count = 1;
+ channel->encoding = g_strdup ("UTF-8");
+ channel->line_term = NULL;
+ channel->line_term_len = 0;
+ channel->buf_size = G_IO_NICE_BUF_SIZE;
+ channel->read_cd = (GIConv) -1;
+ channel->write_cd = (GIConv) -1;
+ channel->read_buf = NULL; /* Lazy allocate buffers */
+ channel->encoded_read_buf = NULL;
+ channel->write_buf = NULL;
+ channel->partial_write_buf[0] = '\0';
+ channel->use_buffer = TRUE;
+ channel->do_encode = FALSE;
+ channel->close_on_unref = FALSE;
+}
+
+GIOChannel *
+g_io_channel_ref (GIOChannel *channel)
+{
+ g_return_val_if_fail (channel != NULL, NULL);
+
+ g_atomic_int_inc (&channel->ref_count);
+
+ return channel;
+}
+
+void
+g_io_channel_unref (GIOChannel *channel)
+{
+ gboolean is_zero;
+
+ g_return_if_fail (channel != NULL);
+
+ is_zero = g_atomic_int_dec_and_test (&channel->ref_count);
+
+ if (G_UNLIKELY (is_zero))
+ {
+ if (channel->close_on_unref)
+ g_io_channel_shutdown (channel, TRUE, NULL);
+ else
+ g_io_channel_purge (channel);
+ g_free (channel->encoding);
+ if (channel->read_cd != (GIConv) -1)
+ g_iconv_close (channel->read_cd);
+ if (channel->write_cd != (GIConv) -1)
+ g_iconv_close (channel->write_cd);
+ g_free (channel->line_term);
+ if (channel->read_buf)
+ g_string_free (channel->read_buf, TRUE);
+ if (channel->write_buf)
+ g_string_free (channel->write_buf, TRUE);
+ if (channel->encoded_read_buf)
+ g_string_free (channel->encoded_read_buf, TRUE);
+ channel->funcs->io_free (channel);
+ }
+}
+
+static GIOError
+g_io_error_get_from_g_error (GIOStatus status,
+ GError *err)
+{
+ switch (status)
+ {
+ case G_IO_STATUS_NORMAL:
+ case G_IO_STATUS_EOF:
+ return G_IO_ERROR_NONE;
+ case G_IO_STATUS_AGAIN:
+ return G_IO_ERROR_AGAIN;
+ case G_IO_STATUS_ERROR:
+ g_return_val_if_fail (err != NULL, G_IO_ERROR_UNKNOWN);
+
+ if (err->domain != G_IO_CHANNEL_ERROR)
+ return G_IO_ERROR_UNKNOWN;
+ switch (err->code)
+ {
+ case G_IO_CHANNEL_ERROR_INVAL:
+ return G_IO_ERROR_INVAL;
+ default:
+ return G_IO_ERROR_UNKNOWN;
+ }
+ default:
+ g_assert_not_reached ();
+ return G_IO_ERROR_UNKNOWN; /* Keep the compiler happy */
+ }
+}
+
+/**
+ * g_io_channel_read:
+ * @channel: a #GIOChannel.
+ * @buf: a buffer to read the data into (which should be at least count bytes long).
+ * @count: the number of bytes to read from the #GIOChannel.
+ * @bytes_read: returns the number of bytes actually read.
+ *
+ * Reads data from a #GIOChannel.
+ *
+ * Return value: %G_IO_ERROR_NONE if the operation was successful.
+ *
+ * Deprecated:2.2: Use g_io_channel_read_chars() instead.
+ **/
+GIOError
+g_io_channel_read (GIOChannel *channel,
+ gchar *buf,
+ gsize count,
+ gsize *bytes_read)
+{
+ GError *err = NULL;
+ GIOError error;
+ GIOStatus status;
+
+ g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN);
+ g_return_val_if_fail (bytes_read != NULL, G_IO_ERROR_UNKNOWN);
+
+ if (count == 0)
+ {
+ if (bytes_read)
+ *bytes_read = 0;
+ return G_IO_ERROR_NONE;
+ }
+
+ g_return_val_if_fail (buf != NULL, G_IO_ERROR_UNKNOWN);
+
+ status = channel->funcs->io_read (channel, buf, count, bytes_read, &err);
+
+ error = g_io_error_get_from_g_error (status, err);
+
+ if (err)
+ g_error_free (err);
+
+ return error;
+}
+
+/**
+ * g_io_channel_write:
+ * @channel: a #GIOChannel.
+ * @buf: the buffer containing the data to write.
+ * @count: the number of bytes to write.
+ * @bytes_written: the number of bytes actually written.
+ *
+ * Writes data to a #GIOChannel.
+ *
+ * Return value: %G_IO_ERROR_NONE if the operation was successful.
+ *
+ * Deprecated:2.2: Use g_io_channel_write_chars() instead.
+ **/
+GIOError
+g_io_channel_write (GIOChannel *channel,
+ const gchar *buf,
+ gsize count,
+ gsize *bytes_written)
+{
+ GError *err = NULL;
+ GIOError error;
+ GIOStatus status;
+
+ g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN);
+ g_return_val_if_fail (bytes_written != NULL, G_IO_ERROR_UNKNOWN);
+
+ status = channel->funcs->io_write (channel, buf, count, bytes_written, &err);
+
+ error = g_io_error_get_from_g_error (status, err);
+
+ if (err)
+ g_error_free (err);
+
+ return error;
+}
+
+/**
+ * g_io_channel_seek:
+ * @channel: a #GIOChannel.
+ * @offset: an offset, in bytes, which is added to the position specified by @type
+ * @type: the position in the file, which can be %G_SEEK_CUR (the current
+ * position), %G_SEEK_SET (the start of the file), or %G_SEEK_END (the end of the
+ * file).
+ *
+ * Sets the current position in the #GIOChannel, similar to the standard library
+ * function fseek().
+ *
+ * Return value: %G_IO_ERROR_NONE if the operation was successful.
+ *
+ * Deprecated:2.2: Use g_io_channel_seek_position() instead.
+ **/
+GIOError
+g_io_channel_seek (GIOChannel *channel,
+ gint64 offset,
+ GSeekType type)
+{
+ GError *err = NULL;
+ GIOError error;
+ GIOStatus status;
+
+ g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN);
+ g_return_val_if_fail (channel->is_seekable, G_IO_ERROR_UNKNOWN);
+
+ switch (type)
+ {
+ case G_SEEK_CUR:
+ case G_SEEK_SET:
+ case G_SEEK_END:
+ break;
+ default:
+ g_warning ("g_io_channel_seek: unknown seek type");
+ return G_IO_ERROR_UNKNOWN;
+ }
+
+ status = channel->funcs->io_seek (channel, offset, type, &err);
+
+ error = g_io_error_get_from_g_error (status, err);
+
+ if (err)
+ g_error_free (err);
+
+ return error;
+}
+
+/* The function g_io_channel_new_file() is prototyped in both
+ * giounix.c and giowin32.c, so we stick its documentation here.
+ */
+
+/**
+ * g_io_channel_new_file:
+ * @filename: A string containing the name of a file.
+ * @mode: One of "r", "w", "a", "r+", "w+", "a+". These have
+ * the same meaning as in fopen().
+ * @error: A location to return an error of type %G_FILE_ERROR.
+ *
+ * Open a file @filename as a #GIOChannel using mode @mode. This
+ * channel will be closed when the last reference to it is dropped,
+ * so there is no need to call g_io_channel_close() (though doing
+ * so will not cause problems, as long as no attempt is made to
+ * access the channel after it is closed).
+ *
+ * Return value: A #GIOChannel on success, %NULL on failure.
+ **/
+
+/**
+ * g_io_channel_close:
+ * @channel: A #GIOChannel
+ *
+ * Close an IO channel. Any pending data to be written will be
+ * flushed, ignoring errors. The channel will not be freed until the
+ * last reference is dropped using g_io_channel_unref().
+ *
+ * Deprecated:2.2: Use g_io_channel_shutdown() instead.
+ **/
+void
+g_io_channel_close (GIOChannel *channel)
+{
+ GError *err = NULL;
+
+ g_return_if_fail (channel != NULL);
+
+ g_io_channel_purge (channel);
+
+ channel->funcs->io_close (channel, &err);
+
+ if (err)
+ { /* No way to return the error */
+ g_warning ("Error closing channel: %s", err->message);
+ g_error_free (err);
+ }
+
+ channel->close_on_unref = FALSE; /* Because we already did */
+ channel->is_readable = FALSE;
+ channel->is_writeable = FALSE;
+ channel->is_seekable = FALSE;
+}
+
+/**
+ * g_io_channel_shutdown:
+ * @channel: a #GIOChannel
+ * @flush: if %TRUE, flush pending
+ * @err: location to store a #GIOChannelError
+ *
+ * Close an IO channel. Any pending data to be written will be
+ * flushed if @flush is %TRUE. The channel will not be freed until the
+ * last reference is dropped using g_io_channel_unref().
+ *
+ * Return value: the status of the operation.
+ **/
+GIOStatus
+g_io_channel_shutdown (GIOChannel *channel,
+ gboolean flush,
+ GError **err)
+{
+ GIOStatus status, result;
+ GError *tmperr = NULL;
+
+ g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail (err == NULL || *err == NULL, G_IO_STATUS_ERROR);
+
+ if (channel->write_buf && channel->write_buf->len > 0)
+ {
+ if (flush)
+ {
+ GIOFlags flags;
+
+ /* Set the channel to blocking, to avoid a busy loop
+ */
+ flags = g_io_channel_get_flags (channel);
+ /* Ignore any errors here, they're irrelevant */
+ g_io_channel_set_flags (channel, flags & ~G_IO_FLAG_NONBLOCK, NULL);
+
+ result = g_io_channel_flush (channel, &tmperr);
+ }
+ else
+ result = G_IO_STATUS_NORMAL;
+
+ g_string_truncate(channel->write_buf, 0);
+ }
+ else
+ result = G_IO_STATUS_NORMAL;
+
+ if (channel->partial_write_buf[0] != '\0')
+ {
+ if (flush)
+ g_warning ("Partial character at end of write buffer not flushed.\n");
+ channel->partial_write_buf[0] = '\0';
+ }
+
+ status = channel->funcs->io_close (channel, err);
+
+ channel->close_on_unref = FALSE; /* Because we already did */
+ channel->is_readable = FALSE;
+ channel->is_writeable = FALSE;
+ channel->is_seekable = FALSE;
+
+ if (status != G_IO_STATUS_NORMAL)
+ {
+ g_clear_error (&tmperr);
+ return status;
+ }
+ else if (result != G_IO_STATUS_NORMAL)
+ {
+ g_propagate_error (err, tmperr);
+ return result;
+ }
+ else
+ return G_IO_STATUS_NORMAL;
+}
+
+/* This function is used for the final flush on close or unref */
+static void
+g_io_channel_purge (GIOChannel *channel)
+{
+ GError *err = NULL;
+ GIOStatus status;
+
+ g_return_if_fail (channel != NULL);
+
+ if (channel->write_buf && channel->write_buf->len > 0)
+ {
+ GIOFlags flags;
+
+ /* Set the channel to blocking, to avoid a busy loop
+ */
+ flags = g_io_channel_get_flags (channel);
+ g_io_channel_set_flags (channel, flags & ~G_IO_FLAG_NONBLOCK, NULL);
+
+ status = g_io_channel_flush (channel, &err);
+
+ if (err)
+ { /* No way to return the error */
+ g_warning ("Error flushing string: %s", err->message);
+ g_error_free (err);
+ }
+ }
+
+ /* Flush these in case anyone tries to close without unrefing */
+
+ if (channel->read_buf)
+ g_string_truncate (channel->read_buf, 0);
+ if (channel->write_buf)
+ g_string_truncate (channel->write_buf, 0);
+ if (channel->encoding)
+ {
+ if (channel->encoded_read_buf)
+ g_string_truncate (channel->encoded_read_buf, 0);
+
+ if (channel->partial_write_buf[0] != '\0')
+ {
+ g_warning ("Partial character at end of write buffer not flushed.\n");
+ channel->partial_write_buf[0] = '\0';
+ }
+ }
+}
+
+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);
+}
+
+/**
+ * g_io_channel_get_buffer_condition:
+ * @channel: A #GIOChannel
+ *
+ * This function returns a #GIOCondition depending on whether there
+ * is data to be read/space to write data in the
+ * internal buffers in the #GIOChannel. Only the flags %G_IO_IN and
+ * %G_IO_OUT may be set.
+ *
+ * Return value: A #GIOCondition
+ **/
+GIOCondition
+g_io_channel_get_buffer_condition (GIOChannel *channel)
+{
+ GIOCondition condition = 0;
+
+ if (channel->encoding)
+ {
+ if (channel->encoded_read_buf && (channel->encoded_read_buf->len > 0))
+ condition |= G_IO_IN; /* Only return if we have full characters */
+ }
+ else
+ {
+ if (channel->read_buf && (channel->read_buf->len > 0))
+ condition |= G_IO_IN;
+ }
+
+ if (channel->write_buf && (channel->write_buf->len < channel->buf_size))
+ condition |= G_IO_OUT;
+
+ return condition;
+}
+
+/**
+ * g_io_channel_error_from_errno:
+ * @en: an <literal>errno</literal> error number, e.g. %EINVAL.
+ *
+ * Converts an <literal>errno</literal> error number to a #GIOChannelError.
+ *
+ * Return value: a #GIOChannelError error number, e.g. %G_IO_CHANNEL_ERROR_INVAL.
+ **/
+GIOChannelError
+g_io_channel_error_from_errno (gint en)
+{
+#ifdef EAGAIN
+ g_return_val_if_fail (en != EAGAIN, G_IO_CHANNEL_ERROR_FAILED);
+#endif
+
+ switch (en)
+ {
+#ifdef EBADF
+ case EBADF:
+ g_warning("Invalid file descriptor.\n");
+ return G_IO_CHANNEL_ERROR_FAILED;
+#endif
+
+#ifdef EFAULT
+ case EFAULT:
+ g_warning("Buffer outside valid address space.\n");
+ return G_IO_CHANNEL_ERROR_FAILED;
+#endif
+
+#ifdef EFBIG
+ case EFBIG:
+ return G_IO_CHANNEL_ERROR_FBIG;
+#endif
+
+#ifdef EINTR
+ /* In general, we should catch EINTR before we get here,
+ * but close() is allowed to return EINTR by POSIX, so
+ * we need to catch it here; EINTR from close() is
+ * unrecoverable, because it's undefined whether
+ * the fd was actually closed or not, so we just return
+ * a generic error code.
+ */
+ case EINTR:
+ return G_IO_CHANNEL_ERROR_FAILED;
+#endif
+
+#ifdef EINVAL
+ case EINVAL:
+ return G_IO_CHANNEL_ERROR_INVAL;
+#endif
+
+#ifdef EIO
+ case EIO:
+ return G_IO_CHANNEL_ERROR_IO;
+#endif
+
+#ifdef EISDIR
+ case EISDIR:
+ return G_IO_CHANNEL_ERROR_ISDIR;
+#endif
+
+#ifdef ENOSPC
+ case ENOSPC:
+ return G_IO_CHANNEL_ERROR_NOSPC;
+#endif
+
+#ifdef ENXIO
+ case ENXIO:
+ return G_IO_CHANNEL_ERROR_NXIO;
+#endif
+
+#ifdef EOVERFLOW
+ case EOVERFLOW:
+ return G_IO_CHANNEL_ERROR_OVERFLOW;
+#endif
+
+#ifdef EPIPE
+ case EPIPE:
+ return G_IO_CHANNEL_ERROR_PIPE;
+#endif
+
+ default:
+ return G_IO_CHANNEL_ERROR_FAILED;
+ }
+}
+
+/**
+ * g_io_channel_set_buffer_size:
+ * @channel: a #GIOChannel
+ * @size: the size of the buffer. 0 == pick a good size
+ *
+ * Sets the buffer size.
+ **/
+void
+g_io_channel_set_buffer_size (GIOChannel *channel,
+ gsize size)
+{
+ g_return_if_fail (channel != NULL);
+
+ if (size == 0)
+ size = G_IO_NICE_BUF_SIZE;
+
+ if (size < MAX_CHAR_SIZE)
+ size = MAX_CHAR_SIZE;
+
+ channel->buf_size = size;
+}
+
+/**
+ * g_io_channel_get_buffer_size:
+ * @channel: a #GIOChannel
+ *
+ * Gets the buffer size.
+ *
+ * Return value: the size of the buffer.
+ **/
+gsize
+g_io_channel_get_buffer_size (GIOChannel *channel)
+{
+ g_return_val_if_fail (channel != NULL, 0);
+
+ return channel->buf_size;
+}
+
+/**
+ * g_io_channel_set_line_term:
+ * @channel: a #GIOChannel
+ * @line_term: The line termination string. Use %NULL for auto detect.
+ * Auto detection breaks on "\n", "\r\n", "\r", "\0", and
+ * the Unicode paragraph separator. Auto detection should
+ * not be used for anything other than file-based channels.
+ * @length: The length of the termination string. If -1 is passed, the
+ * string is assumed to be nul-terminated. This option allows
+ * termination strings with embeded nuls.
+ *
+ * This sets the string that #GIOChannel uses to determine
+ * where in the file a line break occurs.
+ **/
+void
+g_io_channel_set_line_term (GIOChannel *channel,
+ const gchar *line_term,
+ gint length)
+{
+ g_return_if_fail (channel != NULL);
+ g_return_if_fail (line_term == NULL || length != 0); /* Disallow "" */
+
+ if (line_term == NULL)
+ length = 0;
+ else if (length < 0)
+ length = strlen (line_term);
+
+ g_free (channel->line_term);
+ channel->line_term = line_term ? g_memdup (line_term, length) : NULL;
+ channel->line_term_len = length;
+}
+
+/**
+ * g_io_channel_get_line_term:
+ * @channel: a #GIOChannel
+ * @length: a location to return the length of the line terminator
+ *
+ * This returns the string that #GIOChannel uses to determine
+ * where in the file a line break occurs. A value of %NULL
+ * indicates auto detection.
+ *
+ * Return value: The line termination string. This value
+ * is owned by GLib and must not be freed.
+ **/
+G_CONST_RETURN gchar*
+g_io_channel_get_line_term (GIOChannel *channel,
+ gint *length)
+{
+ g_return_val_if_fail (channel != NULL, NULL);
+
+ if (length)
+ *length = channel->line_term_len;
+
+ return channel->line_term;
+}
+
+/**
+ * g_io_channel_set_flags:
+ * @channel: a #GIOChannel.
+ * @flags: the flags to set on the IO channel.
+ * @error: A location to return an error of type #GIOChannelError.
+ *
+ * Sets the (writeable) flags in @channel to (@flags & %G_IO_CHANNEL_SET_MASK).
+ *
+ * Return value: the status of the operation.
+ **/
+GIOStatus
+g_io_channel_set_flags (GIOChannel *channel,
+ GIOFlags flags,
+ GError **error)
+{
+ g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail ((error == NULL) || (*error == NULL),
+ G_IO_STATUS_ERROR);
+
+ return (* channel->funcs->io_set_flags)(channel,
+ flags & G_IO_FLAG_SET_MASK,
+ error);
+}
+
+/**
+ * g_io_channel_get_flags:
+ * @channel: a #GIOChannel
+ *
+ * Gets the current flags for a #GIOChannel, including read-only
+ * flags such as %G_IO_FLAG_IS_READABLE.
+ *
+ * The values of the flags %G_IO_FLAG_IS_READABLE and %G_IO_FLAG_IS_WRITEABLE
+ * are cached for internal use by the channel when it is created.
+ * If they should change at some later point (e.g. partial shutdown
+ * of a socket with the UNIX shutdown() function), the user
+ * should immediately call g_io_channel_get_flags () to update
+ * the internal values of these flags.
+ *
+ * Return value: the flags which are set on the channel
+ **/
+GIOFlags
+g_io_channel_get_flags (GIOChannel *channel)
+{
+ GIOFlags flags;
+
+ g_return_val_if_fail (channel != NULL, 0);
+
+ flags = (* channel->funcs->io_get_flags) (channel);
+
+ /* Cross implementation code */
+
+ if (channel->is_seekable)
+ flags |= G_IO_FLAG_IS_SEEKABLE;
+ if (channel->is_readable)
+ flags |= G_IO_FLAG_IS_READABLE;
+ if (channel->is_writeable)
+ flags |= G_IO_FLAG_IS_WRITEABLE;
+
+ return flags;
+}
+
+/**
+ * g_io_channel_set_close_on_unref:
+ * @channel: a #GIOChannel
+ * @do_close: Whether to close the channel on the final unref of
+ * the GIOChannel data structure. The default value of
+ * this is %TRUE for channels created by g_io_channel_new_file (),
+ * and %FALSE for all other channels.
+ *
+ * Setting this flag to %TRUE for a channel you have already closed
+ * can cause problems.
+ **/
+void
+g_io_channel_set_close_on_unref (GIOChannel *channel,
+ gboolean do_close)
+{
+ g_return_if_fail (channel != NULL);
+
+ channel->close_on_unref = do_close;
+}
+
+/**
+ * g_io_channel_get_close_on_unref:
+ * @channel: a #GIOChannel.
+ *
+ * Returns whether the file/socket/whatever associated with @channel
+ * will be closed when @channel receives its final unref and is
+ * destroyed. The default value of this is %TRUE for channels created
+ * by g_io_channel_new_file (), and %FALSE for all other channels.
+ *
+ * Return value: Whether the channel will be closed on the final unref of
+ * the GIOChannel data structure.
+ **/
+gboolean
+g_io_channel_get_close_on_unref (GIOChannel *channel)
+{
+ g_return_val_if_fail (channel != NULL, FALSE);
+
+ return channel->close_on_unref;
+}
+
+/**
+ * g_io_channel_seek_position:
+ * @channel: a #GIOChannel
+ * @offset: The offset in bytes from the position specified by @type
+ * @type: a #GSeekType. The type %G_SEEK_CUR is only allowed in those
+ * cases where a call to g_io_channel_set_encoding ()
+ * is allowed. See the documentation for
+ * g_io_channel_set_encoding () for details.
+ * @error: A location to return an error of type #GIOChannelError
+ *
+ * Replacement for g_io_channel_seek() with the new API.
+ *
+ * Return value: the status of the operation.
+ **/
+GIOStatus
+g_io_channel_seek_position (GIOChannel* channel,
+ gint64 offset,
+ GSeekType type,
+ GError **error)
+{
+ GIOStatus status;
+
+ /* For files, only one of the read and write buffers can contain data.
+ * For sockets, both can contain data.
+ */
+
+ g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail ((error == NULL) || (*error == NULL),
+ G_IO_STATUS_ERROR);
+ g_return_val_if_fail (channel->is_seekable, G_IO_STATUS_ERROR);
+
+ switch (type)
+ {
+ case G_SEEK_CUR: /* The user is seeking relative to the head of the buffer */
+ if (channel->use_buffer)
+ {
+ if (channel->do_encode && channel->encoded_read_buf
+ && channel->encoded_read_buf->len > 0)
+ {
+ g_warning ("Seek type G_SEEK_CUR not allowed for this"
+ " channel's encoding.\n");
+ return G_IO_STATUS_ERROR;
+ }
+ if (channel->read_buf)
+ offset -= channel->read_buf->len;
+ if (channel->encoded_read_buf)
+ {
+ g_assert (channel->encoded_read_buf->len == 0 || !channel->do_encode);
+
+ /* If there's anything here, it's because the encoding is UTF-8,
+ * so we can just subtract the buffer length, the same as for
+ * the unencoded data.
+ */
+
+ offset -= channel->encoded_read_buf->len;
+ }
+ }
+ break;
+ case G_SEEK_SET:
+ case G_SEEK_END:
+ break;
+ default:
+ g_warning ("g_io_channel_seek_position: unknown seek type");
+ return G_IO_STATUS_ERROR;
+ }
+
+ if (channel->use_buffer)
+ {
+ status = g_io_channel_flush (channel, error);
+ if (status != G_IO_STATUS_NORMAL)
+ return status;
+ }
+
+ status = channel->funcs->io_seek (channel, offset, type, error);
+
+ if ((status == G_IO_STATUS_NORMAL) && (channel->use_buffer))
+ {
+ if (channel->read_buf)
+ g_string_truncate (channel->read_buf, 0);
+
+ /* Conversion state no longer matches position in file */
+ if (channel->read_cd != (GIConv) -1)
+ g_iconv (channel->read_cd, NULL, NULL, NULL, NULL);
+ if (channel->write_cd != (GIConv) -1)
+ g_iconv (channel->write_cd, NULL, NULL, NULL, NULL);
+
+ if (channel->encoded_read_buf)
+ {
+ g_assert (channel->encoded_read_buf->len == 0 || !channel->do_encode);
+ g_string_truncate (channel->encoded_read_buf, 0);
+ }
+
+ if (channel->partial_write_buf[0] != '\0')
+ {
+ g_warning ("Partial character at end of write buffer not flushed.\n");
+ channel->partial_write_buf[0] = '\0';
+ }
+ }
+
+ return status;
+}
+
+/**
+ * g_io_channel_flush:
+ * @channel: a #GIOChannel
+ * @error: location to store an error of type #GIOChannelError
+ *
+ * Flushes the write buffer for the GIOChannel.
+ *
+ * Return value: the status of the operation: One of
+ * #G_IO_CHANNEL_NORMAL, #G_IO_CHANNEL_AGAIN, or
+ * #G_IO_CHANNEL_ERROR.
+ **/
+GIOStatus
+g_io_channel_flush (GIOChannel *channel,
+ GError **error)
+{
+ GIOStatus status;
+ gsize this_time = 1, bytes_written = 0;
+
+ g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR);
+
+ if (channel->write_buf == NULL || channel->write_buf->len == 0)
+ return G_IO_STATUS_NORMAL;
+
+ do
+ {
+ g_assert (this_time > 0);
+
+ status = channel->funcs->io_write (channel,
+ channel->write_buf->str + bytes_written,
+ channel->write_buf->len - bytes_written,
+ &this_time, error);
+ bytes_written += this_time;
+ }
+ while ((bytes_written < channel->write_buf->len)
+ && (status == G_IO_STATUS_NORMAL));
+
+ g_string_erase (channel->write_buf, 0, bytes_written);
+
+ return status;
+}
+
+/**
+ * g_io_channel_set_buffered:
+ * @channel: a #GIOChannel
+ * @buffered: whether to set the channel buffered or unbuffered
+ *
+ * The buffering state can only be set if the channel's encoding
+ * is %NULL. For any other encoding, the channel must be buffered.
+ *
+ * A buffered channel can only be set unbuffered if the channel's
+ * internal buffers have been flushed. Newly created channels or
+ * channels which have returned %G_IO_STATUS_EOF
+ * not require such a flush. For write-only channels, a call to
+ * g_io_channel_flush () is sufficient. For all other channels,
+ * the buffers may be flushed by a call to g_io_channel_seek_position ().
+ * This includes the possibility of seeking with seek type %G_SEEK_CUR
+ * and an offset of zero. Note that this means that socket-based
+ * channels cannot be set unbuffered once they have had data
+ * read from them.
+ *
+ * On unbuffered channels, it is safe to mix read and write
+ * calls from the new and old APIs, if this is necessary for
+ * maintaining old code.
+ *
+ * The default state of the channel is buffered.
+ **/
+void
+g_io_channel_set_buffered (GIOChannel *channel,
+ gboolean buffered)
+{
+ g_return_if_fail (channel != NULL);
+
+ if (channel->encoding != NULL)
+ {
+ g_warning ("Need to have NULL encoding to set the buffering state of the "
+ "channel.\n");
+ return;
+ }
+
+ g_return_if_fail (!channel->read_buf || channel->read_buf->len == 0);
+ g_return_if_fail (!channel->write_buf || channel->write_buf->len == 0);
+
+ channel->use_buffer = buffered;
+}
+
+/**
+ * g_io_channel_get_buffered:
+ * @channel: a #GIOChannel.
+ *
+ * Returns whether @channel is buffered.
+ *
+ * Return Value: %TRUE if the @channel is buffered.
+ **/
+gboolean
+g_io_channel_get_buffered (GIOChannel *channel)
+{
+ g_return_val_if_fail (channel != NULL, FALSE);
+
+ return channel->use_buffer;
+}
+
+/**
+ * g_io_channel_set_encoding:
+ * @channel: a #GIOChannel
+ * @encoding: the encoding type
+ * @error: location to store an error of type #GConvertError.
+ *
+ * Sets the encoding for the input/output of the channel. The internal
+ * encoding is always UTF-8. The default encoding for the
+ * external file is UTF-8.
+ *
+ * The encoding %NULL is safe to use with binary data.
+ *
+ * The encoding can only be set if one of the following conditions
+ * is true:
+ *
+ * 1. The channel was just created, and has not been written to
+ * or read from yet.
+ *
+ * 2. The channel is write-only.
+ *
+ * 3. The channel is a file, and the file pointer was just
+ * repositioned by a call to g_io_channel_seek_position().
+ * (This flushes all the internal buffers.)
+ *
+ * 4. The current encoding is %NULL or UTF-8.
+ *
+ * 5. One of the (new API) read functions has just returned %G_IO_STATUS_EOF
+ * (or, in the case of g_io_channel_read_to_end (), %G_IO_STATUS_NORMAL).
+ *
+ * 6. One of the functions g_io_channel_read_chars () or g_io_channel_read_unichar ()
+ * has returned %G_IO_STATUS_AGAIN or %G_IO_STATUS_ERROR. This may be
+ * useful in the case of %G_CONVERT_ERROR_ILLEGAL_SEQUENCE.
+ * Returning one of these statuses from g_io_channel_read_line (),
+ * g_io_channel_read_line_string (), or g_io_channel_read_to_end ()
+ * does <emphasis>not</emphasis> guarantee that the encoding can be changed.
+ *
+ * Channels which do not meet one of the above conditions cannot call
+ * g_io_channel_seek_position () with an offset of %G_SEEK_CUR,
+ * and, if they are "seekable", cannot
+ * call g_io_channel_write_chars () after calling one
+ * of the API "read" functions.
+ *
+ * Return Value: %G_IO_STATUS_NORMAL if the encoding was successfully set.
+ **/
+GIOStatus
+g_io_channel_set_encoding (GIOChannel *channel,
+ const gchar *encoding,
+ GError **error)
+{
+ GIConv read_cd, write_cd;
+ gboolean did_encode;
+
+ g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR);
+
+ /* Make sure the encoded buffers are empty */
+
+ g_return_val_if_fail (!channel->do_encode || !channel->encoded_read_buf ||
+ channel->encoded_read_buf->len == 0, G_IO_STATUS_ERROR);
+
+ if (!channel->use_buffer)
+ {
+ g_warning ("Need to set the channel buffered before setting the encoding.\n");
+ g_warning ("Assuming this is what you meant and acting accordingly.\n");
+
+ channel->use_buffer = TRUE;
+ }
+
+ if (channel->partial_write_buf[0] != '\0')
+ {
+ g_warning ("Partial character at end of write buffer not flushed.\n");
+ channel->partial_write_buf[0] = '\0';
+ }
+
+ did_encode = channel->do_encode;
+
+ if (!encoding || strcmp (encoding, "UTF8") == 0 || strcmp (encoding, "UTF-8") == 0)
+ {
+ channel->do_encode = FALSE;
+ read_cd = write_cd = (GIConv) -1;
+ }
+ else
+ {
+ gint err = 0;
+ const gchar *from_enc = NULL, *to_enc = NULL;
+
+ if (channel->is_readable)
+ {
+ read_cd = g_iconv_open ("UTF-8", encoding);
+
+ if (read_cd == (GIConv) -1)
+ {
+ err = errno;
+ from_enc = "UTF-8";
+ to_enc = encoding;
+ }
+ }
+ else
+ read_cd = (GIConv) -1;
+
+ if (channel->is_writeable && err == 0)
+ {
+ write_cd = g_iconv_open (encoding, "UTF-8");
+
+ if (write_cd == (GIConv) -1)
+ {
+ err = errno;
+ from_enc = encoding;
+ to_enc = "UTF-8";
+ }
+ }
+ else
+ write_cd = (GIConv) -1;
+
+ if (err != 0)
+ {
+ g_assert (from_enc);
+ g_assert (to_enc);
+
+ if (err == EINVAL)
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NO_CONVERSION,
+ _("Conversion from character set '%s' to '%s' is not supported"),
+ from_enc, to_enc);
+ else
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
+ _("Could not open converter from '%s' to '%s': %s"),
+ from_enc, to_enc, g_strerror (err));
+
+ if (read_cd != (GIConv) -1)
+ g_iconv_close (read_cd);
+ if (write_cd != (GIConv) -1)
+ g_iconv_close (write_cd);
+
+ return G_IO_STATUS_ERROR;
+ }
+
+ channel->do_encode = TRUE;
+ }
+
+ /* The encoding is ok, so set the fields in channel */
+
+ if (channel->read_cd != (GIConv) -1)
+ g_iconv_close (channel->read_cd);
+ if (channel->write_cd != (GIConv) -1)
+ g_iconv_close (channel->write_cd);
+
+ if (channel->encoded_read_buf && channel->encoded_read_buf->len > 0)
+ {
+ g_assert (!did_encode); /* Encoding UTF-8, NULL doesn't use encoded_read_buf */
+
+ /* This is just validated UTF-8, so we can copy it back into read_buf
+ * so it can be encoded in whatever the new encoding is.
+ */
+
+ g_string_prepend_len (channel->read_buf, channel->encoded_read_buf->str,
+ channel->encoded_read_buf->len);
+ g_string_truncate (channel->encoded_read_buf, 0);
+ }
+
+ channel->read_cd = read_cd;
+ channel->write_cd = write_cd;
+
+ g_free (channel->encoding);
+ channel->encoding = g_strdup (encoding);
+
+ return G_IO_STATUS_NORMAL;
+}
+
+/**
+ * g_io_channel_get_encoding:
+ * @channel: a #GIOChannel
+ *
+ * Gets the encoding for the input/output of the channel. The internal
+ * encoding is always UTF-8. The encoding %NULL makes the
+ * channel safe for binary data.
+ *
+ * Return value: A string containing the encoding, this string is
+ * owned by GLib and must not be freed.
+ **/
+G_CONST_RETURN gchar*
+g_io_channel_get_encoding (GIOChannel *channel)
+{
+ g_return_val_if_fail (channel != NULL, NULL);
+
+ return channel->encoding;
+}
+
+static GIOStatus
+g_io_channel_fill_buffer (GIOChannel *channel,
+ GError **err)
+{
+ gsize read_size, cur_len, oldlen;
+ GIOStatus status;
+
+ if (channel->is_seekable && channel->write_buf && channel->write_buf->len > 0)
+ {
+ status = g_io_channel_flush (channel, err);
+ if (status != G_IO_STATUS_NORMAL)
+ return status;
+ }
+ if (channel->is_seekable && channel->partial_write_buf[0] != '\0')
+ {
+ g_warning ("Partial character at end of write buffer not flushed.\n");
+ channel->partial_write_buf[0] = '\0';
+ }
+
+ if (!channel->read_buf)
+ channel->read_buf = g_string_sized_new (channel->buf_size);
+
+ cur_len = channel->read_buf->len;
+
+ g_string_set_size (channel->read_buf, channel->read_buf->len + channel->buf_size);
+
+ status = channel->funcs->io_read (channel, channel->read_buf->str + cur_len,
+ channel->buf_size, &read_size, err);
+
+ g_assert ((status == G_IO_STATUS_NORMAL) || (read_size == 0));
+
+ g_string_truncate (channel->read_buf, read_size + cur_len);
+
+ if ((status != G_IO_STATUS_NORMAL)
+ && ((status != G_IO_STATUS_EOF) || (channel->read_buf->len == 0)))
+ return status;
+
+ g_assert (channel->read_buf->len > 0);
+
+ if (channel->encoded_read_buf)
+ oldlen = channel->encoded_read_buf->len;
+ else
+ {
+ oldlen = 0;
+ if (channel->encoding)
+ channel->encoded_read_buf = g_string_sized_new (channel->buf_size);
+ }
+
+ if (channel->do_encode)
+ {
+ gsize errnum, inbytes_left, outbytes_left;
+ gchar *inbuf, *outbuf;
+ int errval;
+
+ g_assert (channel->encoded_read_buf);
+
+reencode:
+
+ inbytes_left = channel->read_buf->len;
+ outbytes_left = MAX (channel->read_buf->len,
+ channel->encoded_read_buf->allocated_len
+ - channel->encoded_read_buf->len - 1); /* 1 for NULL */
+ outbytes_left = MAX (outbytes_left, 6);
+
+ inbuf = channel->read_buf->str;
+ g_string_set_size (channel->encoded_read_buf,
+ channel->encoded_read_buf->len + outbytes_left);
+ outbuf = channel->encoded_read_buf->str + channel->encoded_read_buf->len
+ - outbytes_left;
+
+ errnum = g_iconv (channel->read_cd, &inbuf, &inbytes_left,
+ &outbuf, &outbytes_left);
+ errval = errno;
+
+ g_assert (inbuf + inbytes_left == channel->read_buf->str
+ + channel->read_buf->len);
+ g_assert (outbuf + outbytes_left == channel->encoded_read_buf->str
+ + channel->encoded_read_buf->len);
+
+ g_string_erase (channel->read_buf, 0,
+ channel->read_buf->len - inbytes_left);
+ g_string_truncate (channel->encoded_read_buf,
+ channel->encoded_read_buf->len - outbytes_left);
+
+ if (errnum == (gsize) -1)
+ {
+ switch (errval)
+ {
+ case EINVAL:
+ if ((oldlen == channel->encoded_read_buf->len)
+ && (status == G_IO_STATUS_EOF))
+ status = G_IO_STATUS_EOF;
+ else
+ status = G_IO_STATUS_NORMAL;
+ break;
+ case E2BIG:
+ /* Buffer size at least 6, wrote at least on character */
+ g_assert (inbuf != channel->read_buf->str);
+ goto reencode;
+ case EILSEQ:
+ if (oldlen < channel->encoded_read_buf->len)
+ status = G_IO_STATUS_NORMAL;
+ else
+ {
+ g_set_error (err, G_CONVERT_ERROR,
+ G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
+ _("Invalid byte sequence in conversion input"));
+ return G_IO_STATUS_ERROR;
+ }
+ break;
+ default:
+ g_assert (errval != EBADF); /* The converter should be open */
+ g_set_error (err, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
+ _("Error during conversion: %s"), g_strerror (errval));
+ return G_IO_STATUS_ERROR;
+ }
+ }
+ g_assert ((status != G_IO_STATUS_NORMAL)
+ || (channel->encoded_read_buf->len > 0));
+ }
+ else if (channel->encoding) /* UTF-8 */
+ {
+ gchar *nextchar, *lastchar;
+
+ g_assert (channel->encoded_read_buf);
+
+ nextchar = channel->read_buf->str;
+ lastchar = channel->read_buf->str + channel->read_buf->len;
+
+ while (nextchar < lastchar)
+ {
+ gunichar val_char;
+
+ val_char = g_utf8_get_char_validated (nextchar, lastchar - nextchar);
+
+ switch (val_char)
+ {
+ case -2:
+ /* stop, leave partial character in buffer */
+ lastchar = nextchar;
+ break;
+ case -1:
+ if (oldlen < channel->encoded_read_buf->len)
+ status = G_IO_STATUS_NORMAL;
+ else
+ {
+ g_set_error (err, G_CONVERT_ERROR,
+ G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
+ _("Invalid byte sequence in conversion input"));
+ status = G_IO_STATUS_ERROR;
+ }
+ lastchar = nextchar;
+ break;
+ default:
+ nextchar = g_utf8_next_char (nextchar);
+ break;
+ }
+ }
+
+ if (lastchar > channel->read_buf->str)
+ {
+ gint copy_len = lastchar - channel->read_buf->str;
+
+ g_string_append_len (channel->encoded_read_buf, channel->read_buf->str,
+ copy_len);
+ g_string_erase (channel->read_buf, 0, copy_len);
+ }
+ }
+
+ return status;
+}
+
+/**
+ * g_io_channel_read_line:
+ * @channel: a #GIOChannel
+ * @str_return: The line read from the #GIOChannel, including the
+ * line terminator. This data should be freed with g_free()
+ * when no longer needed. This is a nul-terminated string.
+ * If a @length of zero is returned, this will be %NULL instead.
+ * @length: location to store length of the read data, or %NULL
+ * @terminator_pos: location to store position of line terminator, or %NULL
+ * @error: A location to return an error of type #GConvertError
+ * or #GIOChannelError
+ *
+ * Reads a line, including the terminating character(s),
+ * from a #GIOChannel into a newly-allocated string.
+ * @str_return will contain allocated memory if the return
+ * is %G_IO_STATUS_NORMAL.
+ *
+ * Return value: the status of the operation.
+ **/
+GIOStatus
+g_io_channel_read_line (GIOChannel *channel,
+ gchar **str_return,
+ gsize *length,
+ gsize *terminator_pos,
+ GError **error)
+{
+ GIOStatus status;
+ gsize got_length;
+
+ g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail (str_return != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail ((error == NULL) || (*error == NULL),
+ G_IO_STATUS_ERROR);
+ g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR);
+
+ status = g_io_channel_read_line_backend (channel, &got_length, terminator_pos, error);
+
+ if (length)
+ *length = got_length;
+
+ if (status == G_IO_STATUS_NORMAL)
+ {
+ g_assert (USE_BUF (channel));
+ *str_return = g_strndup (USE_BUF (channel)->str, got_length);
+ g_string_erase (USE_BUF (channel), 0, got_length);
+ }
+ else
+ *str_return = NULL;
+
+ return status;
+}
+
+/**
+ * g_io_channel_read_line_string:
+ * @channel: a #GIOChannel
+ * @buffer: a #GString into which the line will be written.
+ * If @buffer already contains data, the old data will
+ * be overwritten.
+ * @terminator_pos: location to store position of line terminator, or %NULL
+ * @error: a location to store an error of type #GConvertError
+ * or #GIOChannelError
+ *
+ * Reads a line from a #GIOChannel, using a #GString as a buffer.
+ *
+ * Return value: the status of the operation.
+ **/
+GIOStatus
+g_io_channel_read_line_string (GIOChannel *channel,
+ GString *buffer,
+ gsize *terminator_pos,
+ GError **error)
+{
+ gsize length;
+ GIOStatus status;
+
+ g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail (buffer != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail ((error == NULL) || (*error == NULL),
+ G_IO_STATUS_ERROR);
+ g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR);
+
+ if (buffer->len > 0)
+ g_string_truncate (buffer, 0); /* clear out the buffer */
+
+ status = g_io_channel_read_line_backend (channel, &length, terminator_pos, error);
+
+ if (status == G_IO_STATUS_NORMAL)
+ {
+ g_assert (USE_BUF (channel));
+ g_string_append_len (buffer, USE_BUF (channel)->str, length);
+ g_string_erase (USE_BUF (channel), 0, length);
+ }
+
+ return status;
+}
+
+
+static GIOStatus
+g_io_channel_read_line_backend (GIOChannel *channel,
+ gsize *length,
+ gsize *terminator_pos,
+ GError **error)
+{
+ GIOStatus status;
+ gsize checked_to, line_term_len, line_length, got_term_len;
+ gboolean first_time = TRUE;
+
+ if (!channel->use_buffer)
+ {
+ /* Can't do a raw read in read_line */
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
+ _("Can't do a raw read in g_io_channel_read_line_string"));
+ return G_IO_STATUS_ERROR;
+ }
+
+ status = G_IO_STATUS_NORMAL;
+
+ if (channel->line_term)
+ line_term_len = channel->line_term_len;
+ else
+ line_term_len = 3;
+ /* This value used for setting checked_to, it's the longest of the four
+ * we autodetect for.
+ */
+
+ checked_to = 0;
+
+ while (TRUE)
+ {
+ gchar *nextchar, *lastchar;
+ GString *use_buf;
+
+ if (!first_time || (BUF_LEN (USE_BUF (channel)) == 0))
+ {
+read_again:
+ status = g_io_channel_fill_buffer (channel, error);
+ switch (status)
+ {
+ case G_IO_STATUS_NORMAL:
+ if (BUF_LEN (USE_BUF (channel)) == 0)
+ /* Can happen when using conversion and only read
+ * part of a character
+ */
+ {
+ first_time = FALSE;
+ continue;
+ }
+ break;
+ case G_IO_STATUS_EOF:
+ if (BUF_LEN (USE_BUF (channel)) == 0)
+ {
+ if (length)
+ *length = 0;
+
+ if (channel->encoding && channel->read_buf->len != 0)
+ {
+ g_set_error (error, G_CONVERT_ERROR,
+ G_CONVERT_ERROR_PARTIAL_INPUT,
+ _("Leftover unconverted data in read buffer"));
+ return G_IO_STATUS_ERROR;
+ }
+ else
+ return G_IO_STATUS_EOF;
+ }
+ break;
+ default:
+ if (length)
+ *length = 0;
+ return status;
+ }
+ }
+
+ g_assert (BUF_LEN (USE_BUF (channel)) != 0);
+
+ use_buf = USE_BUF (channel); /* The buffer has been created by this point */
+
+ first_time = FALSE;
+
+ lastchar = use_buf->str + use_buf->len;
+
+ for (nextchar = use_buf->str + checked_to; nextchar < lastchar;
+ channel->encoding ? nextchar = g_utf8_next_char (nextchar) : nextchar++)
+ {
+ if (channel->line_term)
+ {
+ if (memcmp (channel->line_term, nextchar, line_term_len) == 0)
+ {
+ line_length = nextchar - use_buf->str;
+ got_term_len = line_term_len;
+ goto done;
+ }
+ }
+ else /* auto detect */
+ {
+ switch (*nextchar)
+ {
+ case '\n': /* unix */
+ line_length = nextchar - use_buf->str;
+ got_term_len = 1;
+ goto done;
+ case '\r': /* Warning: do not use with sockets */
+ line_length = nextchar - use_buf->str;
+ if ((nextchar == lastchar - 1) && (status != G_IO_STATUS_EOF)
+ && (lastchar == use_buf->str + use_buf->len))
+ goto read_again; /* Try to read more data */
+ if ((nextchar < lastchar - 1) && (*(nextchar + 1) == '\n')) /* dos */
+ got_term_len = 2;
+ else /* mac */
+ got_term_len = 1;
+ goto done;
+ case '\xe2': /* Unicode paragraph separator */
+ if (strncmp ("\xe2\x80\xa9", nextchar, 3) == 0)
+ {
+ line_length = nextchar - use_buf->str;
+ got_term_len = 3;
+ goto done;
+ }
+ break;
+ case '\0': /* Embeded null in input */
+ line_length = nextchar - use_buf->str;
+ got_term_len = 1;
+ goto done;
+ default: /* no match */
+ break;
+ }
+ }
+ }
+
+ /* If encoding != NULL, valid UTF-8, didn't overshoot */
+ g_assert (nextchar == lastchar);
+
+ /* Check for EOF */
+
+ if (status == G_IO_STATUS_EOF)
+ {
+ if (channel->encoding && channel->read_buf->len > 0)
+ {
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT,
+ _("Channel terminates in a partial character"));
+ return G_IO_STATUS_ERROR;
+ }
+ line_length = use_buf->len;
+ got_term_len = 0;
+ break;
+ }
+
+ if (use_buf->len > line_term_len - 1)
+ checked_to = use_buf->len - (line_term_len - 1);
+ else
+ checked_to = 0;
+ }
+
+done:
+
+ if (terminator_pos)
+ *terminator_pos = line_length;
+
+ if (length)
+ *length = line_length + got_term_len;
+
+ return G_IO_STATUS_NORMAL;
+}
+
+/**
+ * g_io_channel_read_to_end:
+ * @channel: a #GIOChannel
+ * @str_return: Location to store a pointer to a string holding
+ * the remaining data in the #GIOChannel. This data should
+ * be freed with g_free() when no longer needed. This
+ * data is terminated by an extra nul character, but there
+ * may be other nuls in the intervening data.
+ * @length: Location to store length of the data
+ * @error: A location to return an error of type #GConvertError
+ * or #GIOChannelError
+ *
+ * Reads all the remaining data from the file.
+ *
+ * Return value: %G_IO_STATUS_NORMAL on success.
+ * This function never returns %G_IO_STATUS_EOF.
+ **/
+GIOStatus
+g_io_channel_read_to_end (GIOChannel *channel,
+ gchar **str_return,
+ gsize *length,
+ GError **error)
+{
+ GIOStatus status;
+
+ g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail ((error == NULL) || (*error == NULL),
+ G_IO_STATUS_ERROR);
+ g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR);
+
+ if (str_return)
+ *str_return = NULL;
+ if (length)
+ *length = 0;
+
+ if (!channel->use_buffer)
+ {
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
+ _("Can't do a raw read in g_io_channel_read_to_end"));
+ return G_IO_STATUS_ERROR;
+ }
+
+ do
+ status = g_io_channel_fill_buffer (channel, error);
+ while (status == G_IO_STATUS_NORMAL);
+
+ if (status != G_IO_STATUS_EOF)
+ return status;
+
+ if (channel->encoding && channel->read_buf->len > 0)
+ {
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT,
+ _("Channel terminates in a partial character"));
+ return G_IO_STATUS_ERROR;
+ }
+
+ if (USE_BUF (channel) == NULL)
+ {
+ /* length is already set to zero */
+ if (str_return)
+ *str_return = g_strdup ("");
+ }
+ else
+ {
+ if (length)
+ *length = USE_BUF (channel)->len;
+
+ if (str_return)
+ *str_return = g_string_free (USE_BUF (channel), FALSE);
+ else
+ g_string_free (USE_BUF (channel), TRUE);
+
+ if (channel->encoding)
+ channel->encoded_read_buf = NULL;
+ else
+ channel->read_buf = NULL;
+ }
+
+ return G_IO_STATUS_NORMAL;
+}
+
+/**
+ * g_io_channel_read_chars:
+ * @channel: a #GIOChannel
+ * @buf: a buffer to read data into
+ * @count: the size of the buffer. Note that the buffer may
+ * not be complelely filled even if there is data
+ * in the buffer if the remaining data is not a
+ * complete character.
+ * @bytes_read: The number of bytes read. This may be zero even on
+ * success if count < 6 and the channel's encoding is non-%NULL.
+ * This indicates that the next UTF-8 character is too wide for
+ * the buffer.
+ * @error: A location to return an error of type #GConvertError
+ * or #GIOChannelError.
+ *
+ * Replacement for g_io_channel_read() with the new API.
+ *
+ * Return value: the status of the operation.
+ **/
+GIOStatus
+g_io_channel_read_chars (GIOChannel *channel,
+ gchar *buf,
+ gsize count,
+ gsize *bytes_read,
+ GError **error)
+{
+ GIOStatus status;
+ gsize got_bytes;
+
+ g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail ((error == NULL) || (*error == NULL),
+ G_IO_STATUS_ERROR);
+ g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR);
+
+ if (count == 0)
+ {
+ *bytes_read = 0;
+ return G_IO_STATUS_NORMAL;
+ }
+ g_return_val_if_fail (buf != NULL, G_IO_STATUS_ERROR);
+
+ if (!channel->use_buffer)
+ {
+ gsize tmp_bytes;
+
+ g_assert (!channel->read_buf || channel->read_buf->len == 0);
+
+ status = channel->funcs->io_read (channel, buf, count, &tmp_bytes, error);
+
+ if (bytes_read)
+ *bytes_read = tmp_bytes;
+
+ return status;
+ }
+
+ status = G_IO_STATUS_NORMAL;
+
+ while (BUF_LEN (USE_BUF (channel)) < count && status == G_IO_STATUS_NORMAL)
+ status = g_io_channel_fill_buffer (channel, error);
+
+ /* Only return an error if we have no data */
+
+ if (BUF_LEN (USE_BUF (channel)) == 0)
+ {
+ g_assert (status != G_IO_STATUS_NORMAL);
+
+ if (status == G_IO_STATUS_EOF && channel->encoding
+ && BUF_LEN (channel->read_buf) > 0)
+ {
+ g_set_error (error, G_CONVERT_ERROR,
+ G_CONVERT_ERROR_PARTIAL_INPUT,
+ _("Leftover unconverted data in read buffer"));
+ status = G_IO_STATUS_ERROR;
+ }
+
+ if (bytes_read)
+ *bytes_read = 0;
+
+ return status;
+ }
+
+ if (status == G_IO_STATUS_ERROR)
+ g_clear_error (error);
+
+ got_bytes = MIN (count, BUF_LEN (USE_BUF (channel)));
+
+ g_assert (got_bytes > 0);
+
+ if (channel->encoding)
+ /* Don't validate for NULL encoding, binary safe */
+ {
+ gchar *nextchar, *prevchar;
+
+ g_assert (USE_BUF (channel) == channel->encoded_read_buf);
+
+ nextchar = channel->encoded_read_buf->str;
+
+ do
+ {
+ prevchar = nextchar;
+ nextchar = g_utf8_next_char (nextchar);
+ g_assert (nextchar != prevchar); /* Possible for *prevchar of -1 or -2 */
+ }
+ while (nextchar < channel->encoded_read_buf->str + got_bytes);
+
+ if (nextchar > channel->encoded_read_buf->str + got_bytes)
+ got_bytes = prevchar - channel->encoded_read_buf->str;
+
+ g_assert (got_bytes > 0 || count < 6);
+ }
+
+ memcpy (buf, USE_BUF (channel)->str, got_bytes);
+ g_string_erase (USE_BUF (channel), 0, got_bytes);
+
+ if (bytes_read)
+ *bytes_read = got_bytes;
+
+ return G_IO_STATUS_NORMAL;
+}
+
+/**
+ * g_io_channel_read_unichar:
+ * @channel: a #GIOChannel
+ * @thechar: a location to return a character
+ * @error: A location to return an error of type #GConvertError
+ * or #GIOChannelError
+ *
+ * This function cannot be called on a channel with %NULL encoding.
+ *
+ * Return value: a #GIOStatus
+ **/
+GIOStatus
+g_io_channel_read_unichar (GIOChannel *channel,
+ gunichar *thechar,
+ GError **error)
+{
+ GIOStatus status = G_IO_STATUS_NORMAL;
+
+ g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail (channel->encoding != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail ((error == NULL) || (*error == NULL),
+ G_IO_STATUS_ERROR);
+ g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR);
+
+ while (BUF_LEN (channel->encoded_read_buf) == 0 && status == G_IO_STATUS_NORMAL)
+ status = g_io_channel_fill_buffer (channel, error);
+
+ /* Only return an error if we have no data */
+
+ if (BUF_LEN (USE_BUF (channel)) == 0)
+ {
+ g_assert (status != G_IO_STATUS_NORMAL);
+
+ if (status == G_IO_STATUS_EOF && BUF_LEN (channel->read_buf) > 0)
+ {
+ g_set_error (error, G_CONVERT_ERROR,
+ G_CONVERT_ERROR_PARTIAL_INPUT,
+ _("Leftover unconverted data in read buffer"));
+ status = G_IO_STATUS_ERROR;
+ }
+
+ if (thechar)
+ *thechar = (gunichar) -1;
+
+ return status;
+ }
+
+ if (status == G_IO_STATUS_ERROR)
+ g_clear_error (error);
+
+ if (thechar)
+ *thechar = g_utf8_get_char (channel->encoded_read_buf->str);
+
+ g_string_erase (channel->encoded_read_buf, 0,
+ g_utf8_next_char (channel->encoded_read_buf->str)
+ - channel->encoded_read_buf->str);
+
+ return G_IO_STATUS_NORMAL;
+}
+
+/**
+ * g_io_channel_write_chars:
+ * @channel: a #GIOChannel
+ * @buf: a buffer to write data from
+ * @count: the size of the buffer. If -1, the buffer
+ * is taken to be a nul-terminated string.
+ * @bytes_written: The number of bytes written. This can be nonzero
+ * even if the return value is not %G_IO_STATUS_NORMAL.
+ * If the return value is %G_IO_STATUS_NORMAL and the
+ * channel is blocking, this will always be equal
+ * to @count if @count >= 0.
+ * @error: A location to return an error of type #GConvertError
+ * or #GIOChannelError
+ *
+ * Replacement for g_io_channel_write() with the new API.
+ *
+ * On seekable channels with encodings other than %NULL or UTF-8, generic
+ * mixing of reading and writing is not allowed. A call to g_io_channel_write_chars ()
+ * may only be made on a channel from which data has been read in the
+ * cases described in the documentation for g_io_channel_set_encoding ().
+ *
+ * Return value: the status of the operation.
+ **/
+GIOStatus
+g_io_channel_write_chars (GIOChannel *channel,
+ const gchar *buf,
+ gssize count,
+ gsize *bytes_written,
+ GError **error)
+{
+ GIOStatus status;
+ gssize wrote_bytes = 0;
+
+ g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail ((error == NULL) || (*error == NULL),
+ G_IO_STATUS_ERROR);
+ g_return_val_if_fail (channel->is_writeable, G_IO_STATUS_ERROR);
+
+ if ((count < 0) && buf)
+ count = strlen (buf);
+
+ if (count == 0)
+ {
+ if (bytes_written)
+ *bytes_written = 0;
+ return G_IO_STATUS_NORMAL;
+ }
+
+ g_return_val_if_fail (buf != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail (count > 0, G_IO_STATUS_ERROR);
+
+ /* Raw write case */
+
+ if (!channel->use_buffer)
+ {
+ gsize tmp_bytes;
+
+ g_assert (!channel->write_buf || channel->write_buf->len == 0);
+ g_assert (channel->partial_write_buf[0] == '\0');
+
+ status = channel->funcs->io_write (channel, buf, count, &tmp_bytes, error);
+
+ if (bytes_written)
+ *bytes_written = tmp_bytes;
+
+ return status;
+ }
+
+ /* General case */
+
+ if (channel->is_seekable && (( BUF_LEN (channel->read_buf) > 0)
+ || (BUF_LEN (channel->encoded_read_buf) > 0)))
+ {
+ if (channel->do_encode && BUF_LEN (channel->encoded_read_buf) > 0)
+ {
+ g_warning("Mixed reading and writing not allowed on encoded files");
+ return G_IO_STATUS_ERROR;
+ }
+ status = g_io_channel_seek_position (channel, 0, G_SEEK_CUR, error);
+ if (status != G_IO_STATUS_NORMAL)
+ {
+ if (bytes_written)
+ *bytes_written = 0;
+ return status;
+ }
+ }
+
+ if (!channel->write_buf)
+ channel->write_buf = g_string_sized_new (channel->buf_size);
+
+ while (wrote_bytes < count)
+ {
+ gsize space_in_buf;
+
+ /* If the buffer is full, try a write immediately. In
+ * the nonblocking case, this prevents the user from
+ * writing just a little bit to the buffer every time
+ * and never receiving an EAGAIN.
+ */
+
+ if (channel->write_buf->len >= channel->buf_size - MAX_CHAR_SIZE)
+ {
+ gsize did_write = 0, this_time;
+
+ do
+ {
+ status = channel->funcs->io_write (channel, channel->write_buf->str
+ + did_write, channel->write_buf->len
+ - did_write, &this_time, error);
+ did_write += this_time;
+ }
+ while (status == G_IO_STATUS_NORMAL &&
+ did_write < MIN (channel->write_buf->len, MAX_CHAR_SIZE));
+
+ g_string_erase (channel->write_buf, 0, did_write);
+
+ if (status != G_IO_STATUS_NORMAL)
+ {
+ if (status == G_IO_STATUS_AGAIN && wrote_bytes > 0)
+ status = G_IO_STATUS_NORMAL;
+ if (bytes_written)
+ *bytes_written = wrote_bytes;
+ return status;
+ }
+ }
+
+ space_in_buf = MAX (channel->buf_size, channel->write_buf->allocated_len - 1)
+ - channel->write_buf->len; /* 1 for NULL */
+
+ /* This is only true because g_io_channel_set_buffer_size ()
+ * ensures that channel->buf_size >= MAX_CHAR_SIZE.
+ */
+ g_assert (space_in_buf >= MAX_CHAR_SIZE);
+
+ if (!channel->encoding)
+ {
+ gssize write_this = MIN (space_in_buf, count - wrote_bytes);
+
+ g_string_append_len (channel->write_buf, buf, write_this);
+ buf += write_this;
+ wrote_bytes += write_this;
+ }
+ else
+ {
+ const gchar *from_buf;
+ gsize from_buf_len, from_buf_old_len, left_len;
+ gsize err;
+ gint errnum;
+
+ if (channel->partial_write_buf[0] != '\0')
+ {
+ g_assert (wrote_bytes == 0);
+
+ from_buf = channel->partial_write_buf;
+ from_buf_old_len = strlen (channel->partial_write_buf);
+ g_assert (from_buf_old_len > 0);
+ from_buf_len = MIN (6, from_buf_old_len + count);
+
+ memcpy (channel->partial_write_buf + from_buf_old_len, buf,
+ from_buf_len - from_buf_old_len);
+ }
+ else
+ {
+ from_buf = buf;
+ from_buf_len = count - wrote_bytes;
+ from_buf_old_len = 0;
+ }
+
+reconvert:
+
+ if (!channel->do_encode) /* UTF-8 encoding */
+ {
+ const gchar *badchar;
+ gsize try_len = MIN (from_buf_len, space_in_buf);
+
+ /* UTF-8, just validate, emulate g_iconv */
+
+ if (!g_utf8_validate (from_buf, try_len, &badchar))
+ {
+ gunichar try_char;
+ gsize incomplete_len = from_buf + try_len - badchar;
+
+ left_len = from_buf + from_buf_len - badchar;
+
+ try_char = g_utf8_get_char_validated (badchar, incomplete_len);
+
+ switch (try_char)
+ {
+ case -2:
+ g_assert (incomplete_len < 6);
+ if (try_len == from_buf_len)
+ {
+ errnum = EINVAL;
+ err = (gsize) -1;
+ }
+ else
+ {
+ errnum = 0;
+ err = (gsize) 0;
+ }
+ break;
+ case -1:
+ g_warning ("Invalid UTF-8 passed to g_io_channel_write_chars().");
+ /* FIXME bail here? */
+ errnum = EILSEQ;
+ err = (gsize) -1;
+ break;
+ default:
+ g_assert_not_reached ();
+ err = (gsize) -1;
+ errnum = 0; /* Don't confunse the compiler */
+ }
+ }
+ else
+ {
+ err = (gsize) 0;
+ errnum = 0;
+ left_len = from_buf_len - try_len;
+ }
+
+ g_string_append_len (channel->write_buf, from_buf,
+ from_buf_len - left_len);
+ from_buf += from_buf_len - left_len;
+ }
+ else
+ {
+ gchar *outbuf;
+
+ left_len = from_buf_len;
+ g_string_set_size (channel->write_buf, channel->write_buf->len
+ + space_in_buf);
+ outbuf = channel->write_buf->str + channel->write_buf->len
+ - space_in_buf;
+ err = g_iconv (channel->write_cd, (gchar **) &from_buf, &left_len,
+ &outbuf, &space_in_buf);
+ errnum = errno;
+ g_string_truncate (channel->write_buf, channel->write_buf->len
+ - space_in_buf);
+ }
+
+ if (err == (gsize) -1)
+ {
+ switch (errnum)
+ {
+ case EINVAL:
+ g_assert (left_len < 6);
+
+ if (from_buf_old_len == 0)
+ {
+ /* Not from partial_write_buf */
+
+ memcpy (channel->partial_write_buf, from_buf, left_len);
+ channel->partial_write_buf[left_len] = '\0';
+ if (bytes_written)
+ *bytes_written = count;
+ return G_IO_STATUS_NORMAL;
+ }
+
+ /* Working in partial_write_buf */
+
+ if (left_len == from_buf_len)
+ {
+ /* Didn't convert anything, must still have
+ * less than a full character
+ */
+
+ g_assert (count == from_buf_len - from_buf_old_len);
+
+ channel->partial_write_buf[from_buf_len] = '\0';
+
+ if (bytes_written)
+ *bytes_written = count;
+
+ return G_IO_STATUS_NORMAL;
+ }
+
+ g_assert (from_buf_len - left_len >= from_buf_old_len);
+
+ /* We converted all the old data. This is fine */
+
+ break;
+ case E2BIG:
+ if (from_buf_len == left_len)
+ {
+ /* Nothing was written, add enough space for
+ * at least one character.
+ */
+ space_in_buf += MAX_CHAR_SIZE;
+ goto reconvert;
+ }
+ break;
+ case EILSEQ:
+ g_set_error (error, G_CONVERT_ERROR,
+ G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
+ _("Invalid byte sequence in conversion input"));
+ if (from_buf_old_len > 0 && from_buf_len == left_len)
+ g_warning ("Illegal sequence due to partial character "
+ "at the end of a previous write.\n");
+ else
+ wrote_bytes += from_buf_len - left_len - from_buf_old_len;
+ if (bytes_written)
+ *bytes_written = wrote_bytes;
+ channel->partial_write_buf[0] = '\0';
+ return G_IO_STATUS_ERROR;
+ default:
+ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
+ _("Error during conversion: %s"), g_strerror (errnum));
+ if (from_buf_len >= left_len + from_buf_old_len)
+ wrote_bytes += from_buf_len - left_len - from_buf_old_len;
+ if (bytes_written)
+ *bytes_written = wrote_bytes;
+ channel->partial_write_buf[0] = '\0';
+ return G_IO_STATUS_ERROR;
+ }
+ }
+
+ g_assert (from_buf_len - left_len >= from_buf_old_len);
+
+ wrote_bytes += from_buf_len - left_len - from_buf_old_len;
+
+ if (from_buf_old_len > 0)
+ {
+ /* We were working in partial_write_buf */
+
+ buf += from_buf_len - left_len - from_buf_old_len;
+ channel->partial_write_buf[0] = '\0';
+ }
+ else
+ buf = from_buf;
+ }
+ }
+
+ if (bytes_written)
+ *bytes_written = count;
+
+ return G_IO_STATUS_NORMAL;
+}
+
+/**
+ * g_io_channel_write_unichar:
+ * @channel: a #GIOChannel
+ * @thechar: a character
+ * @error: A location to return an error of type #GConvertError
+ * or #GIOChannelError
+ *
+ * This function cannot be called on a channel with %NULL encoding.
+ *
+ * Return value: a #GIOStatus
+ **/
+GIOStatus
+g_io_channel_write_unichar (GIOChannel *channel,
+ gunichar thechar,
+ GError **error)
+{
+ GIOStatus status;
+ gchar static_buf[6];
+ gsize char_len, wrote_len;
+
+ g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail (channel->encoding != NULL, G_IO_STATUS_ERROR);
+ g_return_val_if_fail ((error == NULL) || (*error == NULL),
+ G_IO_STATUS_ERROR);
+ g_return_val_if_fail (channel->is_writeable, G_IO_STATUS_ERROR);
+
+ char_len = g_unichar_to_utf8 (thechar, static_buf);
+
+ if (channel->partial_write_buf[0] != '\0')
+ {
+ g_warning ("Partial charater written before writing unichar.\n");
+ channel->partial_write_buf[0] = '\0';
+ }
+
+ status = g_io_channel_write_chars (channel, static_buf,
+ char_len, &wrote_len, error);
+
+ /* We validate UTF-8, so we can't get a partial write */
+
+ g_assert (wrote_len == char_len || status != G_IO_STATUS_NORMAL);
+
+ return status;
+}
+
+/**
+ * g_io_channel_error_quark:
+ *
+ * Return value: The quark used as %G_IO_CHANNEL_ERROR
+ **/
+GQuark
+g_io_channel_error_quark (void)
+{
+ return g_quark_from_static_string ("g-io-channel-error-quark");
+}
+
+#define __G_IOCHANNEL_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/giochannel.h b/trunk/glib/giochannel.h
new file mode 100644
index 000000000..846c9ba4a
--- /dev/null
+++ b/trunk/glib/giochannel.h
@@ -0,0 +1,354 @@
+/* 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 <glib/gconvert.h>
+#include <glib/gmain.h>
+#include <glib/gstring.h>
+
+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;
+
+#define G_IO_CHANNEL_ERROR g_io_channel_error_quark()
+
+typedef enum
+{
+ /* Derived from errno */
+ G_IO_CHANNEL_ERROR_FBIG,
+ G_IO_CHANNEL_ERROR_INVAL,
+ G_IO_CHANNEL_ERROR_IO,
+ G_IO_CHANNEL_ERROR_ISDIR,
+ G_IO_CHANNEL_ERROR_NOSPC,
+ G_IO_CHANNEL_ERROR_NXIO,
+ G_IO_CHANNEL_ERROR_OVERFLOW,
+ G_IO_CHANNEL_ERROR_PIPE,
+ /* Other */
+ G_IO_CHANNEL_ERROR_FAILED
+} GIOChannelError;
+
+typedef enum
+{
+ G_IO_STATUS_ERROR,
+ G_IO_STATUS_NORMAL,
+ G_IO_STATUS_EOF,
+ G_IO_STATUS_AGAIN
+} GIOStatus;
+
+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;
+
+typedef enum
+{
+ G_IO_FLAG_APPEND = 1 << 0,
+ G_IO_FLAG_NONBLOCK = 1 << 1,
+ G_IO_FLAG_IS_READABLE = 1 << 2, /* Read only flag */
+ G_IO_FLAG_IS_WRITEABLE = 1 << 3, /* Read only flag */
+ G_IO_FLAG_IS_SEEKABLE = 1 << 4, /* Read only flag */
+ G_IO_FLAG_MASK = (1 << 5) - 1,
+ G_IO_FLAG_GET_MASK = G_IO_FLAG_MASK,
+ G_IO_FLAG_SET_MASK = G_IO_FLAG_APPEND | G_IO_FLAG_NONBLOCK
+} GIOFlags;
+
+struct _GIOChannel
+{
+ /*< private >*/
+ gint ref_count;
+ GIOFuncs *funcs;
+
+ gchar *encoding;
+ GIConv read_cd;
+ GIConv write_cd;
+ gchar *line_term; /* String which indicates the end of a line of text */
+ guint line_term_len; /* So we can have null in the line term */
+
+ gsize buf_size;
+ GString *read_buf; /* Raw data from the channel */
+ GString *encoded_read_buf; /* Channel data converted to UTF-8 */
+ GString *write_buf; /* Data ready to be written to the file */
+ gchar partial_write_buf[6]; /* UTF-8 partial characters, null terminated */
+
+ /* Group the flags together, immediately after partial_write_buf, to save memory */
+
+ guint use_buffer : 1; /* The encoding uses the buffers */
+ guint do_encode : 1; /* The encoding uses the GIConv coverters */
+ guint close_on_unref : 1; /* Close the channel on final unref */
+ guint is_readable : 1; /* Cached GIOFlag */
+ guint is_writeable : 1; /* ditto */
+ guint is_seekable : 1; /* ditto */
+
+ gpointer reserved1;
+ gpointer reserved2;
+};
+
+typedef gboolean (*GIOFunc) (GIOChannel *source,
+ GIOCondition condition,
+ gpointer data);
+struct _GIOFuncs
+{
+ GIOStatus (*io_read) (GIOChannel *channel,
+ gchar *buf,
+ gsize count,
+ gsize *bytes_read,
+ GError **err);
+ GIOStatus (*io_write) (GIOChannel *channel,
+ const gchar *buf,
+ gsize count,
+ gsize *bytes_written,
+ GError **err);
+ GIOStatus (*io_seek) (GIOChannel *channel,
+ gint64 offset,
+ GSeekType type,
+ GError **err);
+ GIOStatus (*io_close) (GIOChannel *channel,
+ GError **err);
+ GSource* (*io_create_watch) (GIOChannel *channel,
+ GIOCondition condition);
+ void (*io_free) (GIOChannel *channel);
+ GIOStatus (*io_set_flags) (GIOChannel *channel,
+ GIOFlags flags,
+ GError **err);
+ GIOFlags (*io_get_flags) (GIOChannel *channel);
+};
+
+void g_io_channel_init (GIOChannel *channel);
+GIOChannel *g_io_channel_ref (GIOChannel *channel);
+void g_io_channel_unref (GIOChannel *channel);
+
+#ifndef G_DISABLE_DEPRECATED
+GIOError g_io_channel_read (GIOChannel *channel,
+ gchar *buf,
+ gsize count,
+ gsize *bytes_read);
+GIOError g_io_channel_write (GIOChannel *channel,
+ const gchar *buf,
+ gsize count,
+ gsize *bytes_written);
+GIOError g_io_channel_seek (GIOChannel *channel,
+ gint64 offset,
+ GSeekType type);
+void g_io_channel_close (GIOChannel *channel);
+#endif /* G_DISABLE_DEPRECATED */
+
+GIOStatus g_io_channel_shutdown (GIOChannel *channel,
+ gboolean flush,
+ GError **err);
+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);
+
+/* character encoding conversion involved functions.
+ */
+
+void g_io_channel_set_buffer_size (GIOChannel *channel,
+ gsize size);
+gsize g_io_channel_get_buffer_size (GIOChannel *channel);
+GIOCondition g_io_channel_get_buffer_condition (GIOChannel *channel);
+GIOStatus g_io_channel_set_flags (GIOChannel *channel,
+ GIOFlags flags,
+ GError **error);
+GIOFlags g_io_channel_get_flags (GIOChannel *channel);
+void g_io_channel_set_line_term (GIOChannel *channel,
+ const gchar *line_term,
+ gint length);
+G_CONST_RETURN gchar* g_io_channel_get_line_term (GIOChannel *channel,
+ gint *length);
+void g_io_channel_set_buffered (GIOChannel *channel,
+ gboolean buffered);
+gboolean g_io_channel_get_buffered (GIOChannel *channel);
+GIOStatus g_io_channel_set_encoding (GIOChannel *channel,
+ const gchar *encoding,
+ GError **error);
+G_CONST_RETURN gchar* g_io_channel_get_encoding (GIOChannel *channel);
+void g_io_channel_set_close_on_unref (GIOChannel *channel,
+ gboolean do_close);
+gboolean g_io_channel_get_close_on_unref (GIOChannel *channel);
+
+
+GIOStatus g_io_channel_flush (GIOChannel *channel,
+ GError **error);
+GIOStatus g_io_channel_read_line (GIOChannel *channel,
+ gchar **str_return,
+ gsize *length,
+ gsize *terminator_pos,
+ GError **error);
+GIOStatus g_io_channel_read_line_string (GIOChannel *channel,
+ GString *buffer,
+ gsize *terminator_pos,
+ GError **error);
+GIOStatus g_io_channel_read_to_end (GIOChannel *channel,
+ gchar **str_return,
+ gsize *length,
+ GError **error);
+GIOStatus g_io_channel_read_chars (GIOChannel *channel,
+ gchar *buf,
+ gsize count,
+ gsize *bytes_read,
+ GError **error);
+GIOStatus g_io_channel_read_unichar (GIOChannel *channel,
+ gunichar *thechar,
+ GError **error);
+GIOStatus g_io_channel_write_chars (GIOChannel *channel,
+ const gchar *buf,
+ gssize count,
+ gsize *bytes_written,
+ GError **error);
+GIOStatus g_io_channel_write_unichar (GIOChannel *channel,
+ gunichar thechar,
+ GError **error);
+GIOStatus g_io_channel_seek_position (GIOChannel *channel,
+ gint64 offset,
+ GSeekType type,
+ GError **error);
+#ifdef G_OS_WIN32
+#define g_io_channel_new_file g_io_channel_new_file_utf8
+#endif
+
+GIOChannel* g_io_channel_new_file (const gchar *filename,
+ const gchar *mode,
+ GError **error);
+
+/* Error handling */
+
+GQuark g_io_channel_error_quark (void);
+GIOChannelError g_io_channel_error_from_errno (gint en);
+
+/* 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);
+
+
+/* Hook for GClosure / GSource integration. Don't touch */
+GLIB_VAR GSourceFuncs g_io_watch_funcs;
+
+#ifdef G_OS_WIN32
+
+/* You can use this "pseudo file descriptor" in a GPollFD to add
+ * polling for Windows messages. GTK applications should not do that.
+ */
+
+#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_);
+
+/* 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 (gint 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/trunk/glib/giounix.c b/trunk/glib/giounix.c
new file mode 100644
index 000000000..d2a7b34d6
--- /dev/null
+++ b/trunk/glib/giounix.c
@@ -0,0 +1,601 @@
+/* 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 "config.h"
+
+#define _POSIX_SOURCE /* for SSIZE_MAX */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <fcntl.h>
+
+#include "glib.h"
+#include "galias.h"
+
+/*
+ * 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;
+};
+
+
+static GIOStatus g_io_unix_read (GIOChannel *channel,
+ gchar *buf,
+ gsize count,
+ gsize *bytes_read,
+ GError **err);
+static GIOStatus g_io_unix_write (GIOChannel *channel,
+ const gchar *buf,
+ gsize count,
+ gsize *bytes_written,
+ GError **err);
+static GIOStatus g_io_unix_seek (GIOChannel *channel,
+ gint64 offset,
+ GSeekType type,
+ GError **err);
+static GIOStatus g_io_unix_close (GIOChannel *channel,
+ GError **err);
+static void g_io_unix_free (GIOChannel *channel);
+static GSource* g_io_unix_create_watch (GIOChannel *channel,
+ GIOCondition condition);
+static GIOStatus g_io_unix_set_flags (GIOChannel *channel,
+ GIOFlags flags,
+ GError **err);
+static GIOFlags g_io_unix_get_flags (GIOChannel *channel);
+
+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_finalize (GSource *source);
+
+GSourceFuncs g_io_watch_funcs = {
+ g_io_unix_prepare,
+ g_io_unix_check,
+ g_io_unix_dispatch,
+ g_io_unix_finalize
+};
+
+static 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,
+ g_io_unix_set_flags,
+ g_io_unix_get_flags,
+};
+
+static gboolean
+g_io_unix_prepare (GSource *source,
+ gint *timeout)
+{
+ GIOUnixWatch *watch = (GIOUnixWatch *)source;
+ GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel);
+
+ *timeout = -1;
+
+ /* Only return TRUE here if _all_ bits in watch->condition will be set
+ */
+ return ((watch->condition & buffer_condition) == watch->condition);
+}
+
+static gboolean
+g_io_unix_check (GSource *source)
+{
+ GIOUnixWatch *watch = (GIOUnixWatch *)source;
+ GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel);
+ GIOCondition poll_condition = watch->pollfd.revents;
+
+ return ((poll_condition | buffer_condition) & watch->condition);
+}
+
+static gboolean
+g_io_unix_dispatch (GSource *source,
+ GSourceFunc callback,
+ gpointer user_data)
+
+{
+ GIOFunc func = (GIOFunc)callback;
+ GIOUnixWatch *watch = (GIOUnixWatch *)source;
+ GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel);
+
+ 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 | buffer_condition) & watch->condition,
+ user_data);
+}
+
+static void
+g_io_unix_finalize (GSource *source)
+{
+ GIOUnixWatch *watch = (GIOUnixWatch *)source;
+
+ g_io_channel_unref (watch->channel);
+}
+
+static GIOStatus
+g_io_unix_read (GIOChannel *channel,
+ gchar *buf,
+ gsize count,
+ gsize *bytes_read,
+ GError **err)
+{
+ GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
+ gssize result;
+
+ if (count > SSIZE_MAX) /* At least according to the Debian manpage for read */
+ count = SSIZE_MAX;
+
+ retry:
+ result = read (unix_channel->fd, buf, count);
+
+ if (result < 0)
+ {
+ *bytes_read = 0;
+
+ switch (errno)
+ {
+#ifdef EINTR
+ case EINTR:
+ goto retry;
+#endif
+#ifdef EAGAIN
+ case EAGAIN:
+ return G_IO_STATUS_AGAIN;
+#endif
+ default:
+ g_set_error (err, G_IO_CHANNEL_ERROR,
+ g_io_channel_error_from_errno (errno),
+ g_strerror (errno));
+ return G_IO_STATUS_ERROR;
+ }
+ }
+
+ *bytes_read = result;
+
+ return (result > 0) ? G_IO_STATUS_NORMAL : G_IO_STATUS_EOF;
+}
+
+static GIOStatus
+g_io_unix_write (GIOChannel *channel,
+ const gchar *buf,
+ gsize count,
+ gsize *bytes_written,
+ GError **err)
+{
+ GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
+ gssize result;
+
+ retry:
+ result = write (unix_channel->fd, buf, count);
+
+ if (result < 0)
+ {
+ *bytes_written = 0;
+
+ switch (errno)
+ {
+#ifdef EINTR
+ case EINTR:
+ goto retry;
+#endif
+#ifdef EAGAIN
+ case EAGAIN:
+ return G_IO_STATUS_AGAIN;
+#endif
+ default:
+ g_set_error (err, G_IO_CHANNEL_ERROR,
+ g_io_channel_error_from_errno (errno),
+ g_strerror (errno));
+ return G_IO_STATUS_ERROR;
+ }
+ }
+
+ *bytes_written = result;
+
+ return G_IO_STATUS_NORMAL;
+}
+
+static GIOStatus
+g_io_unix_seek (GIOChannel *channel,
+ gint64 offset,
+ GSeekType type,
+ GError **err)
+{
+ GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
+ int whence;
+ off_t tmp_offset;
+ 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:
+ whence = -1; /* Shut the compiler up */
+ g_assert_not_reached ();
+ }
+
+ tmp_offset = offset;
+ if (tmp_offset != offset)
+ {
+ g_set_error (err, G_IO_CHANNEL_ERROR,
+ g_io_channel_error_from_errno (EINVAL),
+ g_strerror (EINVAL));
+ return G_IO_STATUS_ERROR;
+ }
+
+ result = lseek (unix_channel->fd, tmp_offset, whence);
+
+ if (result < 0)
+ {
+ g_set_error (err, G_IO_CHANNEL_ERROR,
+ g_io_channel_error_from_errno (errno),
+ g_strerror (errno));
+ return G_IO_STATUS_ERROR;
+ }
+
+ return G_IO_STATUS_NORMAL;
+}
+
+
+static GIOStatus
+g_io_unix_close (GIOChannel *channel,
+ GError **err)
+{
+ GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
+
+ if (close (unix_channel->fd) < 0)
+ {
+ g_set_error (err, G_IO_CHANNEL_ERROR,
+ g_io_channel_error_from_errno (errno),
+ g_strerror (errno));
+ return G_IO_STATUS_ERROR;
+ }
+
+ return G_IO_STATUS_NORMAL;
+}
+
+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 (&g_io_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;
+}
+
+static GIOStatus
+g_io_unix_set_flags (GIOChannel *channel,
+ GIOFlags flags,
+ GError **err)
+{
+ glong fcntl_flags;
+ GIOUnixChannel *unix_channel = (GIOUnixChannel *) channel;
+
+ fcntl_flags = 0;
+
+ if (flags & G_IO_FLAG_APPEND)
+ fcntl_flags |= O_APPEND;
+ if (flags & G_IO_FLAG_NONBLOCK)
+#ifdef O_NONBLOCK
+ fcntl_flags |= O_NONBLOCK;
+#else
+ fcntl_flags |= O_NDELAY;
+#endif
+
+ if (fcntl (unix_channel->fd, F_SETFL, fcntl_flags) == -1)
+ {
+ g_set_error (err, G_IO_CHANNEL_ERROR,
+ g_io_channel_error_from_errno (errno),
+ g_strerror (errno));
+ return G_IO_STATUS_ERROR;
+ }
+
+ return G_IO_STATUS_NORMAL;
+}
+
+static GIOFlags
+g_io_unix_get_flags (GIOChannel *channel)
+{
+ GIOFlags flags = 0;
+ glong fcntl_flags;
+ GIOUnixChannel *unix_channel = (GIOUnixChannel *) channel;
+
+ fcntl_flags = fcntl (unix_channel->fd, F_GETFL);
+
+ if (fcntl_flags == -1)
+ {
+ g_warning (G_STRLOC "Error while getting flags for FD: %s (%d)\n",
+ g_strerror (errno), errno);
+ return 0;
+ }
+
+ if (fcntl_flags & O_APPEND)
+ flags |= G_IO_FLAG_APPEND;
+#ifdef O_NONBLOCK
+ if (fcntl_flags & O_NONBLOCK)
+#else
+ if (fcntl_flags & O_NDELAY)
+#endif
+ flags |= G_IO_FLAG_NONBLOCK;
+
+ switch (fcntl_flags & (O_RDONLY | O_WRONLY | O_RDWR))
+ {
+ case O_RDONLY:
+ channel->is_readable = TRUE;
+ channel->is_writeable = FALSE;
+ break;
+ case O_WRONLY:
+ channel->is_readable = FALSE;
+ channel->is_writeable = TRUE;
+ break;
+ case O_RDWR:
+ channel->is_readable = TRUE;
+ channel->is_writeable = TRUE;
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ return flags;
+}
+
+GIOChannel *
+g_io_channel_new_file (const gchar *filename,
+ const gchar *mode,
+ GError **error)
+{
+ int fid, flags;
+ mode_t create_mode;
+ GIOChannel *channel;
+ enum { /* Cheesy hack */
+ MODE_R = 1 << 0,
+ MODE_W = 1 << 1,
+ MODE_A = 1 << 2,
+ MODE_PLUS = 1 << 3
+ } mode_num;
+ struct stat buffer;
+
+ g_return_val_if_fail (filename != NULL, NULL);
+ g_return_val_if_fail (mode != NULL, NULL);
+ g_return_val_if_fail ((error == NULL) || (*error == NULL), NULL);
+
+ switch (mode[0])
+ {
+ case 'r':
+ mode_num = MODE_R;
+ break;
+ case 'w':
+ mode_num = MODE_W;
+ break;
+ case 'a':
+ mode_num = MODE_A;
+ break;
+ default:
+ g_warning ("Invalid GIOFileMode %s.\n", mode);
+ return NULL;
+ }
+
+ switch (mode[1])
+ {
+ case '\0':
+ break;
+ case '+':
+ if (mode[2] == '\0')
+ {
+ mode_num |= MODE_PLUS;
+ break;
+ }
+ /* Fall through */
+ default:
+ g_warning ("Invalid GIOFileMode %s.\n", mode);
+ return NULL;
+ }
+
+ switch (mode_num)
+ {
+ case MODE_R:
+ flags = O_RDONLY;
+ break;
+ case MODE_W:
+ flags = O_WRONLY | O_TRUNC | O_CREAT;
+ break;
+ case MODE_A:
+ flags = O_WRONLY | O_APPEND | O_CREAT;
+ break;
+ case MODE_R | MODE_PLUS:
+ flags = O_RDWR;
+ break;
+ case MODE_W | MODE_PLUS:
+ flags = O_RDWR | O_TRUNC | O_CREAT;
+ break;
+ case MODE_A | MODE_PLUS:
+ flags = O_RDWR | O_APPEND | O_CREAT;
+ break;
+ default:
+ g_assert_not_reached ();
+ flags = 0;
+ }
+
+ create_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
+ fid = open (filename, flags, create_mode);
+ if (fid == -1)
+ {
+ g_set_error (error, G_FILE_ERROR,
+ g_file_error_from_errno (errno),
+ g_strerror (errno));
+ return (GIOChannel *)NULL;
+ }
+
+ if (fstat (fid, &buffer) == -1) /* In case someone opens a FIFO */
+ {
+ close (fid);
+ g_set_error (error, G_FILE_ERROR,
+ g_file_error_from_errno (errno),
+ g_strerror (errno));
+ return (GIOChannel *)NULL;
+ }
+
+ channel = (GIOChannel *) g_new (GIOUnixChannel, 1);
+
+ channel->is_seekable = S_ISREG (buffer.st_mode) || S_ISCHR (buffer.st_mode)
+ || S_ISBLK (buffer.st_mode);
+
+ switch (mode_num)
+ {
+ case MODE_R:
+ channel->is_readable = TRUE;
+ channel->is_writeable = FALSE;
+ break;
+ case MODE_W:
+ case MODE_A:
+ channel->is_readable = FALSE;
+ channel->is_writeable = TRUE;
+ break;
+ case MODE_R | MODE_PLUS:
+ case MODE_W | MODE_PLUS:
+ case MODE_A | MODE_PLUS:
+ channel->is_readable = TRUE;
+ channel->is_writeable = TRUE;
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ g_io_channel_init (channel);
+ channel->close_on_unref = TRUE; /* must be after g_io_channel_init () */
+ channel->funcs = &unix_channel_funcs;
+
+ ((GIOUnixChannel *) channel)->fd = fid;
+ return channel;
+}
+
+GIOChannel *
+g_io_channel_unix_new (gint fd)
+{
+ struct stat buffer;
+ 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;
+
+ /* I'm not sure if fstat on a non-file (e.g., socket) works
+ * it should be safe to say if it fails, the fd isn't seekable.
+ */
+ /* Newer UNIX versions support S_ISSOCK(), fstat() will probably
+ * succeed in most cases.
+ */
+ if (fstat (unix_channel->fd, &buffer) == 0)
+ channel->is_seekable = S_ISREG (buffer.st_mode) || S_ISCHR (buffer.st_mode)
+ || S_ISBLK (buffer.st_mode);
+ else /* Assume not seekable */
+ channel->is_seekable = FALSE;
+
+ g_io_unix_get_flags (channel); /* Sets is_readable, is_writeable */
+
+ return channel;
+}
+
+gint
+g_io_channel_unix_get_fd (GIOChannel *channel)
+{
+ GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
+ return unix_channel->fd;
+}
+
+#define __G_IO_UNIX_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/giowin32.c b/trunk/glib/giowin32.c
new file mode 100644
index 000000000..8632209dc
--- /dev/null
+++ b/trunk/glib/giowin32.c
@@ -0,0 +1,2111 @@
+/* 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-2003 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/.
+ */
+
+#include "config.h"
+
+#include "glib.h"
+
+#include <stdlib.h>
+#include <winsock2.h>
+#include <windows.h>
+#include <conio.h>
+#include <fcntl.h>
+#include <io.h>
+#include <process.h>
+#include <errno.h>
+#include <sys/stat.h>
+
+#include "gstdio.h"
+#include "glibintl.h"
+
+#include "galias.h"
+
+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(), except for console IO.
+ * Have to create separate thread to read.
+ */
+ G_IO_WIN32_CONSOLE, /* Console IO (usually stdin, stdout, stderr) */
+ G_IO_WIN32_SOCKET /* Sockets. No separate thread */
+} 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;
+
+ /* This is used by G_IO_WIN32_WINDOWS_MESSAGES channels */
+ HWND hwnd; /* handle of window, or NULL */
+
+ /* Following fields are used by fd channels. */
+ CRITICAL_SECTION mutex;
+
+ int direction; /* 0 means we read from it,
+ * 1 means we write to it.
+ */
+
+ 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 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 */
+ int event_mask;
+ int last_events;
+ int event;
+ gboolean write_would_have_blocked;
+};
+
+#define LOCK(mutex) EnterCriticalSection (&mutex)
+#define UNLOCK(mutex) LeaveCriticalSection (&mutex)
+
+struct _GIOWin32Watch {
+ GSource source;
+ GPollFD pollfd;
+ GIOChannel *channel;
+ GIOCondition condition;
+};
+
+static void
+g_win32_print_access_mode (int flags)
+{
+ g_print ("%s%s%s%s%s%s%s%s%s%s",
+ ((flags & 0x3) == _O_RDWR ? "O_RDWR" :
+ ((flags & 0x3) == _O_RDONLY ? "O_RDONLY" :
+ ((flags & 0x3) == _O_WRONLY ? "O_WRONLY" : "0"))),
+ (flags & _O_APPEND ? "|O_APPEND" : ""),
+ (flags & _O_RANDOM ? "|O_RANDOM" : ""),
+ (flags & _O_SEQUENTIAL ? "|O_SEQUENTIAL" : ""),
+ (flags & _O_TEMPORARY ? "|O_TEMPORARY" : ""),
+ (flags & _O_CREAT ? "|O_CREAT" : ""),
+ (flags & _O_TRUNC ? "|O_TRUNC" : ""),
+ (flags & _O_EXCL ? "|O_EXCL" : ""),
+ (flags & _O_TEXT ? "|O_TEXT" : ""),
+ (flags & _O_BINARY ? "|O_BINARY" : ""));
+}
+
+static void
+g_win32_print_gioflags (GIOFlags flags)
+{
+ char *bar = "";
+
+ if (flags & G_IO_FLAG_APPEND)
+ bar = "|", g_print ("APPEND");
+ if (flags & G_IO_FLAG_NONBLOCK)
+ g_print ("%sNONBLOCK", bar), bar = "|";
+ if (flags & G_IO_FLAG_IS_READABLE)
+ g_print ("%sREADABLE", bar), bar = "|";
+ if (flags & G_IO_FLAG_IS_WRITEABLE)
+ g_print ("%sWRITEABLE", bar), bar = "|";
+ if (flags & G_IO_FLAG_IS_SEEKABLE)
+ g_print ("%sSEEKABLE", bar), bar = "|";
+}
+
+static const char *
+event_mask_to_string (int mask)
+{
+ char buf[100];
+ int checked_bits = 0;
+ char *bufp = buf;
+
+ if (mask == 0)
+ return "";
+
+#define BIT(n) checked_bits |= FD_##n; if (mask & FD_##n) bufp += sprintf (bufp, "%s" #n, (bufp>buf ? "|" : ""))
+
+ BIT (READ);
+ BIT (WRITE);
+ BIT (OOB);
+ BIT (ACCEPT);
+ BIT (CONNECT);
+ BIT (CLOSE);
+ BIT (QOS);
+ BIT (GROUP_QOS);
+ BIT (ROUTING_INTERFACE_CHANGE);
+ BIT (ADDRESS_LIST_CHANGE);
+
+#undef BIT
+
+ if ((mask & ~checked_bits) != 0)
+ bufp += sprintf (bufp, "|%#x", mask & ~checked_bits);
+
+ return g_quark_to_string (g_quark_from_string (buf));
+}
+
+static const char *
+condition_to_string (GIOCondition condition)
+{
+ char buf[100];
+ int checked_bits = 0;
+ char *bufp = buf;
+
+ if (condition == 0)
+ return "";
+
+#define BIT(n) checked_bits |= G_IO_##n; if (condition & G_IO_##n) bufp += sprintf (bufp, "%s" #n, (bufp>buf ? "|" : ""))
+
+ BIT (IN);
+ BIT (OUT);
+ BIT (PRI);
+ BIT (ERR);
+ BIT (HUP);
+ BIT (NVAL);
+
+#undef BIT
+
+ if ((condition & ~checked_bits) != 0)
+ bufp += sprintf (bufp, "|%#x", condition & ~checked_bits);
+
+ return g_quark_to_string (g_quark_from_string (buf));
+}
+
+static gboolean
+g_io_win32_get_debug_flag (void)
+{
+ return (getenv ("G_IO_WIN32_DEBUG") != NULL);
+}
+
+static char *
+winsock_error_message (int number)
+{
+ static char unk[100];
+
+ switch (number) {
+ case WSAEINTR:
+ return "Interrupted function call";
+ case WSAEACCES:
+ return "Permission denied";
+ case WSAEFAULT:
+ return "Bad address";
+ case WSAEINVAL:
+ return "Invalid argument";
+ case WSAEMFILE:
+ return "Too many open sockets";
+ case WSAEWOULDBLOCK:
+ return "Resource temporarily unavailable";
+ case WSAEINPROGRESS:
+ return "Operation now in progress";
+ case WSAEALREADY:
+ return "Operation already in progress";
+ case WSAENOTSOCK:
+ return "Socket operation on nonsocket";
+ case WSAEDESTADDRREQ:
+ return "Destination address required";
+ case WSAEMSGSIZE:
+ return "Message too long";
+ case WSAEPROTOTYPE:
+ return "Protocol wrong type for socket";
+ case WSAENOPROTOOPT:
+ return "Bad protocol option";
+ case WSAEPROTONOSUPPORT:
+ return "Protocol not supported";
+ case WSAESOCKTNOSUPPORT:
+ return "Socket type not supported";
+ case WSAEOPNOTSUPP:
+ return "Operation not supported on transport endpoint";
+ case WSAEPFNOSUPPORT:
+ return "Protocol family not supported";
+ case WSAEAFNOSUPPORT:
+ return "Address family not supported by protocol family";
+ case WSAEADDRINUSE:
+ return "Address already in use";
+ case WSAEADDRNOTAVAIL:
+ return "Address not available";
+ case WSAENETDOWN:
+ return "Network interface is not configured";
+ case WSAENETUNREACH:
+ return "Network is unreachable";
+ case WSAENETRESET:
+ return "Network dropped connection on reset";
+ case WSAECONNABORTED:
+ return "Software caused connection abort";
+ case WSAECONNRESET:
+ return "Connection reset by peer";
+ case WSAENOBUFS:
+ return "No buffer space available";
+ case WSAEISCONN:
+ return "Socket is already connected";
+ case WSAENOTCONN:
+ return "Socket is not connected";
+ case WSAESHUTDOWN:
+ return "Can't send after socket shutdown";
+ case WSAETIMEDOUT:
+ return "Connection timed out";
+ case WSAECONNREFUSED:
+ return "Connection refused";
+ case WSAEHOSTDOWN:
+ return "Host is down";
+ case WSAEHOSTUNREACH:
+ return "Host is unreachable";
+ case WSAEPROCLIM:
+ return "Too many processes";
+ case WSASYSNOTREADY:
+ return "Network subsystem is unavailable";
+ case WSAVERNOTSUPPORTED:
+ return "Winsock.dll version out of range";
+ case WSANOTINITIALISED:
+ return "Successful WSAStartup not yet performed";
+ case WSAEDISCON:
+ return "Graceful shutdown in progress";
+ case WSATYPE_NOT_FOUND:
+ return "Class type not found";
+ case WSAHOST_NOT_FOUND:
+ return "Host not found";
+ case WSATRY_AGAIN:
+ return "Nonauthoritative host not found";
+ case WSANO_RECOVERY:
+ return "This is a nonrecoverable error";
+ case WSANO_DATA:
+ return "Valid name, no data record of requested type";
+ case WSA_INVALID_HANDLE:
+ return "Specified event object handle is invalid";
+ case WSA_INVALID_PARAMETER:
+ return "One or more parameters are invalid";
+ case WSA_IO_INCOMPLETE:
+ return "Overlapped I/O event object not in signaled state";
+ case WSA_NOT_ENOUGH_MEMORY:
+ return "Insufficient memory available";
+ case WSA_OPERATION_ABORTED:
+ return "Overlapped operation aborted";
+ case WSAEINVALIDPROCTABLE:
+ return "Invalid procedure table from service provider";
+ case WSAEINVALIDPROVIDER:
+ return "Invalid service provider version number";
+ case WSAEPROVIDERFAILEDINIT:
+ return "Unable to initialize a service provider";
+ case WSASYSCALLFAILURE:
+ return "System call failure";
+ default:
+ sprintf (unk, "Unknown WinSock error %d", number);
+ return unk;
+ }
+}
+
+static void
+g_io_channel_win32_init (GIOWin32Channel *channel)
+{
+ channel->debug = g_io_win32_get_debug_flag ();
+ 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->event_mask = 0;
+ channel->last_events = 0;
+ channel->event = 0;
+ channel->write_would_have_blocked = FALSE;
+ 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)))
+ {
+ gchar *emsg = g_win32_error_message (GetLastError ());
+ g_error ("Error creating event: %s", emsg);
+ g_free (emsg);
+ }
+}
+
+static unsigned __stdcall
+read_thread (void *parameter)
+{
+ GIOWin32Channel *channel = parameter;
+ 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->direction = 0;
+ channel->buffer = g_malloc (BUFFER_SIZE);
+ channel->rdp = channel->wrp = 0;
+ channel->running = TRUE;
+
+ SetEvent (channel->space_avail_event);
+
+ LOCK (channel->mutex);
+ while (channel->running)
+ {
+ 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);
+ }
+
+ 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.
+ */
+
+ return 0;
+}
+
+static unsigned __stdcall
+write_thread (void *parameter)
+{
+ GIOWin32Channel *channel = parameter;
+ guchar *buffer;
+ guint nbytes;
+
+ g_io_channel_ref ((GIOChannel *)channel);
+
+ if (channel->debug)
+ g_print ("write_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->direction = 1;
+ channel->buffer = g_malloc (BUFFER_SIZE);
+ channel->rdp = channel->wrp = 0;
+ channel->running = TRUE;
+
+ SetEvent (channel->space_avail_event);
+
+ /* We use the same event objects as for a reader thread, but with
+ * reversed meaning. So, space_avail is used if data is available
+ * for writing, and data_avail is used if space is available in the
+ * write buffer.
+ */
+
+ LOCK (channel->mutex);
+ while (channel->running || channel->rdp != channel->wrp)
+ {
+ if (channel->debug)
+ g_print ("write_thread %#x: rdp=%d, wrp=%d\n",
+ channel->thread_id, channel->rdp, channel->wrp);
+ if (channel->wrp == channel->rdp)
+ {
+ /* Buffer is empty. */
+ if (channel->debug)
+ g_print ("write_thread %#x: resetting space_avail\n",
+ channel->thread_id);
+ ResetEvent (channel->space_avail_event);
+ if (channel->debug)
+ g_print ("write_thread %#x: waiting for data\n",
+ channel->thread_id);
+ channel->revents = G_IO_OUT;
+ SetEvent (channel->data_avail_event);
+ UNLOCK (channel->mutex);
+ WaitForSingleObject (channel->space_avail_event, INFINITE);
+
+ LOCK (channel->mutex);
+ if (channel->rdp == channel->wrp)
+ break;
+
+ if (channel->debug)
+ g_print ("write_thread %#x: rdp=%d, wrp=%d\n",
+ channel->thread_id, channel->rdp, channel->wrp);
+ }
+
+ buffer = channel->buffer + channel->rdp;
+ if (channel->rdp < channel->wrp)
+ nbytes = channel->wrp - channel->rdp;
+ else
+ nbytes = BUFFER_SIZE - channel->rdp;
+
+ if (channel->debug)
+ g_print ("write_thread %#x: calling write() for %d bytes\n",
+ channel->thread_id, nbytes);
+
+ UNLOCK (channel->mutex);
+ nbytes = write (channel->fd, buffer, nbytes);
+ LOCK (channel->mutex);
+
+ if (channel->debug)
+ g_print ("write_thread %#x: write(%i) returned %d, rdp=%d, wrp=%d\n",
+ channel->thread_id, channel->fd, nbytes, channel->rdp, channel->wrp);
+
+ channel->revents = 0;
+ if (nbytes > 0)
+ channel->revents |= G_IO_OUT;
+ else if (nbytes <= 0)
+ channel->revents |= G_IO_ERR;
+
+ channel->rdp = (channel->rdp + nbytes) % BUFFER_SIZE;
+
+ if (nbytes <= 0)
+ break;
+
+ if (channel->debug)
+ g_print ("write_thread: setting data_avail for thread %#x\n",
+ channel->thread_id);
+ SetEvent (channel->data_avail_event);
+ }
+
+ channel->running = FALSE;
+ if (channel->needs_close)
+ {
+ if (channel->debug)
+ g_print ("write_thread %#x: channel fd %d needs closing\n",
+ channel->thread_id, channel->fd);
+ close (channel->fd);
+ channel->fd = -1;
+ }
+
+ UNLOCK (channel->mutex);
+
+ g_io_channel_unref ((GIOChannel *)channel);
+
+ return 0;
+}
+
+static void
+create_thread (GIOWin32Channel *channel,
+ GIOCondition condition,
+ unsigned (__stdcall *thread) (void *parameter))
+{
+ HANDLE thread_handle;
+
+ thread_handle = (HANDLE) _beginthreadex (NULL, 0, thread, channel, 0,
+ &channel->thread_id);
+ if (thread_handle == 0)
+ g_warning (G_STRLOC ": Error creating reader thread: %s",
+ g_strerror (errno));
+ else if (!CloseHandle (thread_handle))
+ g_warning (G_STRLOC ": Error closing thread handle: %s\n",
+ g_win32_error_message (GetLastError ()));
+
+ WaitForSingleObject (channel->space_avail_event, INFINITE);
+}
+
+static GIOStatus
+buffer_read (GIOWin32Channel *channel,
+ guchar *dest,
+ gsize count,
+ gsize *bytes_read,
+ GError **err)
+{
+ 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)
+ {
+ if (channel->debug)
+ g_print ("wrp==rdp, !running\n");
+ UNLOCK (channel->mutex);
+ *bytes_read = 0;
+ return G_IO_STATUS_EOF;
+ }
+ }
+
+ 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?
+ */
+ *bytes_read = count - left;
+ return (*bytes_read > 0) ? G_IO_STATUS_NORMAL : G_IO_STATUS_EOF;
+}
+
+
+static GIOStatus
+buffer_write (GIOWin32Channel *channel,
+ const guchar *dest,
+ gsize count,
+ gsize *bytes_written,
+ GError **err)
+{
+ guint nbytes;
+ guint left = count;
+
+ LOCK (channel->mutex);
+ if (channel->debug)
+ g_print ("buffer_write: writing to thread %#x %d bytes, rdp=%d, wrp=%d\n",
+ channel->thread_id, count, channel->rdp, channel->wrp);
+
+ if ((channel->wrp + 1) % BUFFER_SIZE == channel->rdp)
+ {
+ /* Buffer is full */
+ if (channel->debug)
+ g_print ("buffer_write: tid %#x: resetting data_avail\n",
+ channel->thread_id);
+ ResetEvent (channel->data_avail_event);
+ if (channel->debug)
+ g_print ("buffer_write: tid %#x: waiting for space\n",
+ channel->thread_id);
+ UNLOCK (channel->mutex);
+ WaitForSingleObject (channel->data_avail_event, INFINITE);
+ LOCK (channel->mutex);
+ if (channel->debug)
+ g_print ("buffer_write: tid %#x: rdp=%d, wrp=%d\n",
+ channel->thread_id, channel->rdp, channel->wrp);
+ }
+
+ nbytes = MIN ((channel->rdp + BUFFER_SIZE - channel->wrp - 1) % BUFFER_SIZE,
+ BUFFER_SIZE - channel->wrp);
+
+ UNLOCK (channel->mutex);
+ nbytes = MIN (left, nbytes);
+ if (channel->debug)
+ g_print ("buffer_write: tid %#x: writing %d bytes\n",
+ channel->thread_id, nbytes);
+ memcpy (channel->buffer + channel->wrp, dest, nbytes);
+ dest += nbytes;
+ left -= nbytes;
+ LOCK (channel->mutex);
+
+ channel->wrp = (channel->wrp + nbytes) % BUFFER_SIZE;
+ if (channel->debug)
+ g_print ("buffer_write: tid %#x: rdp=%d, wrp=%d, setting space_avail\n",
+ channel->thread_id, channel->rdp, channel->wrp);
+ SetEvent (channel->space_avail_event);
+
+ if ((channel->wrp + 1) % BUFFER_SIZE == channel->rdp)
+ {
+ /* Buffer is full */
+ if (channel->debug)
+ g_print ("buffer_write: tid %#x: resetting data_avail\n",
+ channel->thread_id);
+ ResetEvent (channel->data_avail_event);
+ }
+
+ UNLOCK (channel->mutex);
+
+ /* We have no way to indicate any errors form the actual
+ * write() call in the writer thread. Should we have?
+ */
+ *bytes_written = count - left;
+ return (*bytes_written > 0) ? G_IO_STATUS_NORMAL : G_IO_STATUS_EOF;
+}
+
+
+static gboolean
+g_io_win32_prepare (GSource *source,
+ gint *timeout)
+{
+ GIOWin32Watch *watch = (GIOWin32Watch *)source;
+ GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel);
+ GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel;
+ int event_mask;
+
+ *timeout = -1;
+
+ switch (channel->type)
+ {
+ case G_IO_WIN32_WINDOWS_MESSAGES:
+ case G_IO_WIN32_CONSOLE:
+ break;
+
+ case G_IO_WIN32_FILE_DESC:
+ if (channel->debug)
+ g_print ("g_io_win32_prepare: for thread %#x buffer_condition:{%s}\n"
+ " watch->pollfd.events:{%s} watch->pollfd.revents:{%s} channel->revents:{%s}\n",
+ channel->thread_id, condition_to_string (buffer_condition),
+ condition_to_string (watch->pollfd.events),
+ condition_to_string (watch->pollfd.revents),
+ condition_to_string (channel->revents));
+
+ LOCK (channel->mutex);
+ if (channel->running)
+ {
+ if (channel->direction == 0 && channel->wrp == channel->rdp)
+ {
+ if (channel->debug)
+ g_print ("g_io_win32_prepare: for thread %#x, setting channel->revents = 0\n",
+ channel->thread_id);
+ channel->revents = 0;
+ }
+ }
+ else
+ {
+ if (channel->direction == 1
+ && (channel->wrp + 1) % BUFFER_SIZE == channel->rdp)
+ {
+ if (channel->debug)
+ g_print ("g_io_win32_prepare: for thread %#x, setting channel->revents = %i\n",
+ channel->thread_id, 0);
+ channel->revents = 0;
+ }
+ }
+ UNLOCK (channel->mutex);
+ break;
+
+ case G_IO_WIN32_SOCKET:
+ event_mask = 0;
+ if (watch->condition & G_IO_IN)
+ event_mask |= (FD_READ | FD_ACCEPT);
+ if (watch->condition & G_IO_OUT)
+ event_mask |= (FD_WRITE | FD_CONNECT);
+ if (watch->condition & G_IO_HUP)
+ event_mask |= FD_CLOSE;
+
+ if (channel->event_mask != event_mask /* || channel->event != watch->pollfd.fd*/)
+ {
+ if (channel->debug)
+ g_print ("g_io_win32_prepare: WSAEventSelect(%d, %#x, {%s}\n",
+ channel->fd, watch->pollfd.fd,
+ event_mask_to_string (event_mask));
+ if (WSAEventSelect (channel->fd, (HANDLE) watch->pollfd.fd,
+ event_mask) == SOCKET_ERROR)
+ ; /* What? */
+ channel->event_mask = event_mask;
+#if 0
+ channel->event = watch->pollfd.fd;
+#endif
+ channel->last_events = 0;
+ }
+ break;
+
+ default:
+ g_assert_not_reached ();
+ abort ();
+ }
+ return ((watch->condition & buffer_condition) == watch->condition);
+}
+
+static gboolean
+g_io_win32_check (GSource *source)
+{
+ MSG msg;
+ GIOWin32Watch *watch = (GIOWin32Watch *)source;
+ GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel;
+ GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel);
+ WSANETWORKEVENTS events;
+
+ switch (channel->type)
+ {
+ case G_IO_WIN32_WINDOWS_MESSAGES:
+ return (PeekMessage (&msg, channel->hwnd, 0, 0, PM_NOREMOVE));
+
+ case G_IO_WIN32_FILE_DESC:
+ if (channel->debug)
+ g_print ("g_io_win32_check: for thread %#x buffer_condition=%s\n"
+ " watch->pollfd.events={%s} watch->pollfd.revents={%s} channel->revents={%s}\n",
+ channel->thread_id, condition_to_string (buffer_condition),
+ condition_to_string (watch->pollfd.events),
+ condition_to_string (watch->pollfd.revents),
+ condition_to_string (channel->revents));
+
+ watch->pollfd.revents = (watch->pollfd.events & channel->revents);
+
+ return ((watch->pollfd.revents | buffer_condition) & watch->condition);
+
+ case G_IO_WIN32_CONSOLE:
+ if (watch->channel->is_writeable)
+ return TRUE;
+ else if (watch->channel->is_readable)
+ {
+ INPUT_RECORD buffer;
+ DWORD n;
+ if (PeekConsoleInput ((HANDLE) watch->pollfd.fd, &buffer, 1, &n) &&
+ n == 1)
+ {
+ /* _kbhit() does quite complex processing to find out
+ * whether at least one of the key events pending corresponds
+ * to a "real" character that can be read.
+ */
+ if (_kbhit ())
+ return TRUE;
+
+ /* Discard all other kinds of events */
+ ReadConsoleInput ((HANDLE) watch->pollfd.fd, &buffer, 1, &n);
+ }
+ }
+ return FALSE;
+
+ case G_IO_WIN32_SOCKET:
+ if (channel->last_events & FD_WRITE)
+ {
+ if (channel->debug)
+ g_print ("g_io_win32_check: sock=%d event=%#x last_events has FD_WRITE\n",
+ channel->fd, watch->pollfd.fd);
+ }
+ else
+ {
+ WSAEnumNetworkEvents (channel->fd, 0, &events);
+
+ if (channel->debug)
+ g_print ("g_io_win32_check: WSAEnumNetworkEvents (%d, %#x) revents={%s} condition={%s} events={%s}\n",
+ channel->fd, watch->pollfd.fd,
+ condition_to_string (watch->pollfd.revents),
+ condition_to_string (watch->condition),
+ event_mask_to_string (events.lNetworkEvents));
+
+ if (watch->pollfd.revents != 0 &&
+ events.lNetworkEvents == 0 &&
+ !(channel->event_mask & FD_WRITE))
+ {
+ channel->event_mask = 0;
+ if (channel->debug)
+ g_print ("g_io_win32_check: WSAEventSelect(%d, %#x, {})\n",
+ channel->fd, watch->pollfd.fd);
+ WSAEventSelect (channel->fd, (HANDLE) watch->pollfd.fd, 0);
+ if (channel->debug)
+ g_print ("g_io_win32_check: ResetEvent(%#x)\n",
+ watch->pollfd.fd);
+ ResetEvent ((HANDLE) watch->pollfd.fd);
+ }
+ channel->last_events = events.lNetworkEvents;
+ }
+ watch->pollfd.revents = 0;
+ if (channel->last_events & (FD_READ | FD_ACCEPT))
+ watch->pollfd.revents |= G_IO_IN;
+ if (channel->last_events & (FD_WRITE | FD_CONNECT))
+ watch->pollfd.revents |= G_IO_OUT;
+ if (watch->pollfd.revents == 0 && (channel->last_events & (FD_CLOSE)))
+ watch->pollfd.revents |= G_IO_HUP;
+
+ if (!channel->write_would_have_blocked && (channel->event_mask & FD_WRITE))
+ watch->pollfd.revents |= G_IO_OUT; /* This sucks but... */
+
+ return ((watch->pollfd.revents | buffer_condition) & watch->condition);
+
+ default:
+ g_assert_not_reached ();
+ abort ();
+ }
+}
+
+static gboolean
+g_io_win32_dispatch (GSource *source,
+ GSourceFunc callback,
+ gpointer user_data)
+{
+ GIOFunc func = (GIOFunc)callback;
+ GIOWin32Watch *watch = (GIOWin32Watch *)source;
+ GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel;
+ GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel);
+
+ if (!func)
+ {
+ g_warning (G_STRLOC ": GIOWin32Watch dispatched without callback\n"
+ "You must call g_source_connect().");
+ return FALSE;
+ }
+
+ if (channel->debug)
+ g_print ("g_io_win32_dispatch: pollfd.revents=%s condition=%s result=%s\n",
+ condition_to_string (watch->pollfd.revents),
+ condition_to_string (watch->condition),
+ condition_to_string ((watch->pollfd.revents | buffer_condition) & watch->condition));
+
+ return (*func) (watch->channel,
+ (watch->pollfd.revents | buffer_condition) & watch->condition,
+ user_data);
+}
+
+static void
+g_io_win32_finalize (GSource *source)
+{
+ GIOWin32Watch *watch = (GIOWin32Watch *)source;
+ GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel;
+
+ switch (channel->type)
+ {
+ case G_IO_WIN32_WINDOWS_MESSAGES:
+ case G_IO_WIN32_CONSOLE:
+ break;
+
+ case G_IO_WIN32_FILE_DESC:
+ LOCK (channel->mutex);
+ if (channel->debug)
+ g_print ("g_io_win32_finalize: channel with thread %#x\n",
+ channel->thread_id);
+ UNLOCK (channel->mutex);
+ break;
+
+ case G_IO_WIN32_SOCKET:
+ if (channel->debug)
+ g_print ("g_io_win32_finalize: channel is for sock=%d\n", channel->fd);
+#if 0
+ CloseHandle ((HANDLE) watch->pollfd.fd);
+ channel->event = 0;
+ channel->event_mask = 0;
+#endif
+ break;
+
+ default:
+ g_assert_not_reached ();
+ abort ();
+ }
+ g_io_channel_unref (watch->channel);
+}
+
+GSourceFuncs g_io_watch_funcs = {
+ g_io_win32_prepare,
+ g_io_win32_check,
+ g_io_win32_dispatch,
+ g_io_win32_finalize
+};
+
+static GIOStatus
+g_io_win32_msg_read (GIOChannel *channel,
+ gchar *buf,
+ gsize count,
+ gsize *bytes_read,
+ GError **err)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+ MSG msg; /* In case of alignment problems */
+
+ if (count < sizeof (MSG))
+ {
+ g_set_error (err, G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_INVAL,
+ "Incorrect message size"); /* Informative enough error message? */
+ return G_IO_STATUS_ERROR;
+ }
+
+ if (win32_channel->debug)
+ g_print ("g_io_win32_msg_read: for %#x\n",
+ (guint) win32_channel->hwnd);
+ if (!PeekMessage (&msg, win32_channel->hwnd, 0, 0, PM_REMOVE))
+ return G_IO_STATUS_AGAIN;
+
+ memmove (buf, &msg, sizeof (MSG));
+ *bytes_read = sizeof (MSG);
+
+ return G_IO_STATUS_NORMAL;
+}
+
+static GIOStatus
+g_io_win32_msg_write (GIOChannel *channel,
+ const gchar *buf,
+ gsize count,
+ gsize *bytes_written,
+ GError **err)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+ MSG msg;
+
+ if (count != sizeof (MSG))
+ {
+ g_set_error (err, G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_INVAL,
+ "Incorrect message size"); /* Informative enough error message? */
+ return G_IO_STATUS_ERROR;
+ }
+
+ /* In case of alignment problems */
+ memmove (&msg, buf, sizeof (MSG));
+ if (!PostMessage (win32_channel->hwnd, msg.message, msg.wParam, msg.lParam))
+ {
+ gchar *emsg = g_win32_error_message (GetLastError ());
+ g_set_error (err, G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_FAILED, emsg);
+ g_free (emsg);
+ return G_IO_STATUS_ERROR;
+ }
+
+ *bytes_written = sizeof (MSG);
+
+ return G_IO_STATUS_NORMAL;
+}
+
+static GIOStatus
+g_io_win32_msg_close (GIOChannel *channel,
+ GError **err)
+{
+ /* Nothing to be done. Or should we set hwnd to some invalid value? */
+
+ return G_IO_STATUS_NORMAL;
+}
+
+static void
+g_io_win32_free (GIOChannel *channel)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+
+ if (win32_channel->debug)
+ g_print ("g_io_win32_free channel fd=%d\n", 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->type == G_IO_WIN32_SOCKET)
+ WSAEventSelect (win32_channel->fd, NULL, 0);
+ DeleteCriticalSection (&win32_channel->mutex);
+
+ g_free (win32_channel->buffer);
+ g_free (win32_channel);
+}
+
+static GSource *
+g_io_win32_msg_create_watch (GIOChannel *channel,
+ GIOCondition condition)
+{
+ GIOWin32Watch *watch;
+ GSource *source;
+
+ source = g_source_new (&g_io_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 GIOStatus
+g_io_win32_fd_and_console_read (GIOChannel *channel,
+ gchar *buf,
+ gsize count,
+ gsize *bytes_read,
+ GError **err)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+ gint result;
+
+ 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)
+ {
+ return buffer_read (win32_channel, buf, count, bytes_read, err);
+ }
+
+ result = read (win32_channel->fd, buf, count);
+
+ if (win32_channel->debug)
+ g_print ("g_io_win32_fd_read: read() => %d\n", result);
+
+ if (result < 0)
+ {
+ *bytes_read = 0;
+
+ switch (errno)
+ {
+#ifdef EAGAIN
+ case EAGAIN:
+ return G_IO_STATUS_AGAIN;
+#endif
+ default:
+ g_set_error (err, G_IO_CHANNEL_ERROR,
+ g_io_channel_error_from_errno (errno),
+ g_strerror (errno));
+ return G_IO_STATUS_ERROR;
+ }
+ }
+
+ *bytes_read = result;
+
+ return (result > 0) ? G_IO_STATUS_NORMAL : G_IO_STATUS_EOF;
+}
+
+static GIOStatus
+g_io_win32_fd_and_console_write (GIOChannel *channel,
+ const gchar *buf,
+ gsize count,
+ gsize *bytes_written,
+ GError **err)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+ gint result;
+
+ if (win32_channel->thread_id)
+ {
+ return buffer_write (win32_channel, buf, count, bytes_written, err);
+ }
+
+ 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)
+ {
+#ifdef EAGAIN
+ case EAGAIN:
+ return G_IO_STATUS_AGAIN;
+#endif
+ default:
+ g_set_error (err, G_IO_CHANNEL_ERROR,
+ g_io_channel_error_from_errno (errno),
+ g_strerror (errno));
+ return G_IO_STATUS_ERROR;
+ }
+ }
+
+ *bytes_written = result;
+
+ return G_IO_STATUS_NORMAL;
+}
+
+static GIOStatus
+g_io_win32_fd_seek (GIOChannel *channel,
+ gint64 offset,
+ GSeekType type,
+ GError **err)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+ int whence;
+ off_t tmp_offset;
+ 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:
+ whence = -1; /* Keep the compiler quiet */
+ g_assert_not_reached ();
+ abort ();
+ }
+
+ tmp_offset = offset;
+ if (tmp_offset != offset)
+ {
+ g_set_error (err, G_IO_CHANNEL_ERROR,
+ g_io_channel_error_from_errno (EINVAL),
+ g_strerror (EINVAL));
+ return G_IO_STATUS_ERROR;
+ }
+
+ result = lseek (win32_channel->fd, tmp_offset, whence);
+
+ if (result < 0)
+ {
+ g_set_error (err, G_IO_CHANNEL_ERROR,
+ g_io_channel_error_from_errno (errno),
+ g_strerror (errno));
+ return G_IO_STATUS_ERROR;
+ }
+
+ return G_IO_STATUS_NORMAL;
+}
+
+static GIOStatus
+g_io_win32_fd_close (GIOChannel *channel,
+ GError **err)
+{
+ 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;
+ if (win32_channel->direction == 0)
+ SetEvent (win32_channel->data_avail_event);
+ else
+ SetEvent (win32_channel->space_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);
+
+ /* FIXME error detection? */
+
+ return G_IO_STATUS_NORMAL;
+}
+
+static GSource *
+g_io_win32_fd_create_watch (GIOChannel *channel,
+ GIOCondition condition)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+ GSource *source = g_source_new (&g_io_watch_funcs, sizeof (GIOWin32Watch));
+ 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_fd_create_watch: fd=%d condition={%s} handle=%#x\n",
+ win32_channel->fd, condition_to_string (condition), watch->pollfd.fd);
+
+ LOCK (win32_channel->mutex);
+ if (win32_channel->thread_id == 0)
+ {
+ if (condition & G_IO_IN)
+ create_thread (win32_channel, condition, read_thread);
+ else if (condition & G_IO_OUT)
+ create_thread (win32_channel, condition, write_thread);
+ }
+
+ g_source_add_poll (source, &watch->pollfd);
+ UNLOCK (win32_channel->mutex);
+
+ return source;
+}
+
+static GIOStatus
+g_io_win32_console_close (GIOChannel *channel,
+ GError **err)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+
+ if (close (win32_channel->fd) < 0)
+ {
+ g_set_error (err, G_IO_CHANNEL_ERROR,
+ g_io_channel_error_from_errno (errno),
+ g_strerror (errno));
+ return G_IO_STATUS_ERROR;
+ }
+
+ return G_IO_STATUS_NORMAL;
+}
+
+static GSource *
+g_io_win32_console_create_watch (GIOChannel *channel,
+ GIOCondition condition)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+ GSource *source = g_source_new (&g_io_watch_funcs, sizeof (GIOWin32Watch));
+ GIOWin32Watch *watch = (GIOWin32Watch *)source;
+
+ watch->channel = channel;
+ g_io_channel_ref (channel);
+
+ watch->condition = condition;
+
+ watch->pollfd.fd = (gint) _get_osfhandle (win32_channel->fd);
+ watch->pollfd.events = condition;
+
+ g_source_add_poll (source, &watch->pollfd);
+
+ return source;
+}
+
+static GIOStatus
+g_io_win32_sock_read (GIOChannel *channel,
+ gchar *buf,
+ gsize count,
+ gsize *bytes_read,
+ GError **err)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+ gint result;
+ GIOChannelError error;
+ int winsock_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 (result == SOCKET_ERROR)
+ winsock_error = WSAGetLastError ();
+
+ if (win32_channel->debug)
+ g_print ("g_io_win32_sock_read: recv=%d %s\n",
+ result,
+ (result == SOCKET_ERROR ? winsock_error_message (winsock_error) : ""));
+
+ if (result == SOCKET_ERROR)
+ {
+ *bytes_read = 0;
+
+ switch (winsock_error)
+ {
+ case WSAEINVAL:
+ error = G_IO_CHANNEL_ERROR_INVAL;
+ break;
+ case WSAEWOULDBLOCK:
+ return G_IO_STATUS_AGAIN;
+ default:
+ error = G_IO_CHANNEL_ERROR_FAILED;
+ break;
+ }
+ g_set_error (err, G_IO_CHANNEL_ERROR, error,
+ winsock_error_message (winsock_error));
+ return G_IO_STATUS_ERROR;
+ }
+ else
+ {
+ *bytes_read = result;
+ if (result == 0)
+ return G_IO_STATUS_EOF;
+ else
+ return G_IO_STATUS_NORMAL;
+ }
+}
+
+static GIOStatus
+g_io_win32_sock_write (GIOChannel *channel,
+ const gchar *buf,
+ gsize count,
+ gsize *bytes_written,
+ GError **err)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+ gint result;
+ GIOChannelError error;
+ int winsock_error;
+
+ 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 (result == SOCKET_ERROR)
+ winsock_error = WSAGetLastError ();
+
+ if (win32_channel->debug)
+ g_print ("g_io_win32_sock_write: send=%d %s\n",
+ result,
+ (result == SOCKET_ERROR ? winsock_error_message (winsock_error) : ""));
+
+ if (result == SOCKET_ERROR)
+ {
+ *bytes_written = 0;
+
+ switch (winsock_error)
+ {
+ case WSAEINVAL:
+ error = G_IO_CHANNEL_ERROR_INVAL;
+ break;
+ case WSAEWOULDBLOCK:
+ win32_channel->write_would_have_blocked = TRUE;
+ win32_channel->last_events = 0;
+ return G_IO_STATUS_AGAIN;
+ default:
+ error = G_IO_CHANNEL_ERROR_FAILED;
+ break;
+ }
+ g_set_error (err, G_IO_CHANNEL_ERROR, error,
+ winsock_error_message (winsock_error));
+
+ return G_IO_STATUS_ERROR;
+ }
+ else
+ {
+ *bytes_written = result;
+ win32_channel->write_would_have_blocked = FALSE;
+
+ return G_IO_STATUS_NORMAL;
+ }
+}
+
+static GIOStatus
+g_io_win32_sock_close (GIOChannel *channel,
+ GError **err)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+
+ if (win32_channel->fd != -1)
+ {
+ if (win32_channel->debug)
+ g_print ("g_io_win32_sock_close: closing socket %d\n",
+ win32_channel->fd);
+
+ closesocket (win32_channel->fd);
+ win32_channel->fd = -1;
+ }
+
+ /* FIXME error detection? */
+
+ return G_IO_STATUS_NORMAL;
+}
+
+static GSource *
+g_io_win32_sock_create_watch (GIOChannel *channel,
+ GIOCondition condition)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+ GSource *source = g_source_new (&g_io_watch_funcs, sizeof (GIOWin32Watch));
+ GIOWin32Watch *watch = (GIOWin32Watch *)source;
+
+ watch->channel = channel;
+ g_io_channel_ref (channel);
+
+ watch->condition = condition;
+
+ if (win32_channel->event == 0)
+ win32_channel->event = (int) WSACreateEvent ();
+
+ watch->pollfd.fd = win32_channel->event;
+ watch->pollfd.events = condition;
+
+ if (win32_channel->debug)
+ g_print ("g_io_win32_sock_create_watch: sock=%d handle=%#x condition={%s}\n",
+ win32_channel->fd, watch->pollfd.fd,
+ condition_to_string (watch->condition));
+
+ g_source_add_poll (source, &watch->pollfd);
+
+ return source;
+}
+
+GIOChannel *
+g_io_channel_new_file (const gchar *filename,
+ const gchar *mode,
+ GError **error)
+{
+ int fid, flags, pmode;
+ GIOChannel *channel;
+
+ enum { /* Cheesy hack */
+ MODE_R = 1 << 0,
+ MODE_W = 1 << 1,
+ MODE_A = 1 << 2,
+ MODE_PLUS = 1 << 3,
+ } mode_num;
+
+ g_return_val_if_fail (filename != NULL, NULL);
+ g_return_val_if_fail (mode != NULL, NULL);
+ g_return_val_if_fail ((error == NULL) || (*error == NULL), NULL);
+
+ switch (mode[0])
+ {
+ case 'r':
+ mode_num = MODE_R;
+ break;
+ case 'w':
+ mode_num = MODE_W;
+ break;
+ case 'a':
+ mode_num = MODE_A;
+ break;
+ default:
+ g_warning ("Invalid GIOFileMode %s.\n", mode);
+ return NULL;
+ }
+
+ switch (mode[1])
+ {
+ case '\0':
+ break;
+ case '+':
+ if (mode[2] == '\0')
+ {
+ mode_num |= MODE_PLUS;
+ break;
+ }
+ /* Fall through */
+ default:
+ g_warning ("Invalid GIOFileMode %s.\n", mode);
+ return NULL;
+ }
+
+ switch (mode_num)
+ {
+ case MODE_R:
+ flags = O_RDONLY;
+ pmode = _S_IREAD;
+ break;
+ case MODE_W:
+ flags = O_WRONLY | O_TRUNC | O_CREAT;
+ pmode = _S_IWRITE;
+ break;
+ case MODE_A:
+ flags = O_WRONLY | O_APPEND | O_CREAT;
+ pmode = _S_IWRITE;
+ break;
+ case MODE_R | MODE_PLUS:
+ flags = O_RDWR;
+ pmode = _S_IREAD | _S_IWRITE;
+ break;
+ case MODE_W | MODE_PLUS:
+ flags = O_RDWR | O_TRUNC | O_CREAT;
+ pmode = _S_IREAD | _S_IWRITE;
+ break;
+ case MODE_A | MODE_PLUS:
+ flags = O_RDWR | O_APPEND | O_CREAT;
+ pmode = _S_IREAD | _S_IWRITE;
+ break;
+ default:
+ g_assert_not_reached ();
+ abort ();
+ }
+
+ /* always open 'untranslated' */
+ fid = g_open (filename, flags | _O_BINARY, pmode);
+
+ if (g_io_win32_get_debug_flag ())
+ {
+ g_print ("g_io_channel_win32_new_file: open(\"%s\", ", filename);
+ g_win32_print_access_mode (flags|_O_BINARY);
+ g_print (",%#o)=%d\n", pmode, fid);
+ }
+
+ if (fid < 0)
+ {
+ g_set_error (error, G_FILE_ERROR,
+ g_file_error_from_errno (errno),
+ g_strerror (errno));
+ return (GIOChannel *)NULL;
+ }
+
+ channel = g_io_channel_win32_new_fd (fid);
+
+ /* XXX: move this to g_io_channel_win32_new_fd () */
+ channel->close_on_unref = TRUE;
+ channel->is_seekable = TRUE;
+
+ /* g_io_channel_win32_new_fd sets is_readable and is_writeable to
+ * correspond to actual readability/writeability. Set to FALSE those
+ * that mode doesn't allow
+ */
+ switch (mode_num)
+ {
+ case MODE_R:
+ channel->is_writeable = FALSE;
+ break;
+ case MODE_W:
+ case MODE_A:
+ channel->is_readable = FALSE;
+ break;
+ case MODE_R | MODE_PLUS:
+ case MODE_W | MODE_PLUS:
+ case MODE_A | MODE_PLUS:
+ break;
+ default:
+ g_assert_not_reached ();
+ abort ();
+ }
+
+ return channel;
+}
+
+#ifdef G_OS_WIN32
+
+#undef g_io_channel_new_file
+
+/* Binary compatibility version. Not for newly compiled code. */
+
+GIOChannel *
+g_io_channel_new_file (const gchar *filename,
+ const gchar *mode,
+ GError **error)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, error);
+ GIOChannel *retval;
+
+ if (utf8_filename == NULL)
+ return NULL;
+
+ retval = g_io_channel_new_file_utf8 (utf8_filename, mode, error);
+
+ g_free (utf8_filename);
+
+ return retval;
+}
+
+#endif
+
+static GIOStatus
+g_io_win32_unimpl_set_flags (GIOChannel *channel,
+ GIOFlags flags,
+ GError **err)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+
+ if (win32_channel->debug)
+ {
+ g_print ("g_io_win32_unimpl_set_flags: ");
+ g_win32_print_gioflags (flags);
+ g_print ("\n");
+ }
+
+ g_set_error (err, G_IO_CHANNEL_ERROR,
+ G_IO_CHANNEL_ERROR_FAILED,
+ "Not implemented on Win32");
+
+ return G_IO_STATUS_ERROR;
+}
+
+static GIOFlags
+g_io_win32_fd_get_flags_internal (GIOChannel *channel,
+ struct stat *st)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
+ gchar c;
+ DWORD count;
+
+ if (st->st_mode & _S_IFIFO)
+ {
+ channel->is_readable =
+ (PeekNamedPipe ((HANDLE) _get_osfhandle (win32_channel->fd), &c, 0, &count, NULL, NULL) != 0) || GetLastError () == ERROR_BROKEN_PIPE;
+ channel->is_writeable =
+ (WriteFile ((HANDLE) _get_osfhandle (win32_channel->fd), &c, 0, &count, NULL) != 0);
+ channel->is_seekable = FALSE;
+ }
+ else
+ {
+ channel->is_readable =
+ (ReadFile ((HANDLE) _get_osfhandle (win32_channel->fd), &c, 0, &count, NULL) != 0);
+ channel->is_writeable =
+ (WriteFile ((HANDLE) _get_osfhandle (win32_channel->fd), &c, 0, &count, NULL) != 0);
+ channel->is_seekable = TRUE;
+ }
+
+ /* XXX: G_IO_FLAG_APPEND */
+ /* XXX: G_IO_FLAG_NONBLOCK */
+
+ return 0;
+}
+
+static GIOFlags
+g_io_win32_fd_get_flags (GIOChannel *channel)
+{
+ struct stat st;
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+
+ g_return_val_if_fail (win32_channel != NULL, 0);
+ g_return_val_if_fail (win32_channel->type == G_IO_WIN32_FILE_DESC, 0);
+
+ if (0 == fstat (win32_channel->fd, &st))
+ return g_io_win32_fd_get_flags_internal (channel, &st);
+ else
+ return 0;
+}
+
+static GIOFlags
+g_io_win32_console_get_flags_internal (GIOChannel *channel)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
+ HANDLE handle = (HANDLE) _get_osfhandle (win32_channel->fd);
+ gchar c;
+ DWORD count;
+ INPUT_RECORD record;
+
+ channel->is_readable = PeekConsoleInput (handle, &record, 1, &count);
+ channel->is_writeable = WriteFile (handle, &c, 0, &count, NULL);
+ channel->is_seekable = FALSE;
+
+ return 0;
+}
+
+static GIOFlags
+g_io_win32_console_get_flags (GIOChannel *channel)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+
+ g_return_val_if_fail (win32_channel != NULL, 0);
+ g_return_val_if_fail (win32_channel->type == G_IO_WIN32_CONSOLE, 0);
+
+ return g_io_win32_console_get_flags_internal (channel);
+}
+
+static GIOFlags
+g_io_win32_msg_get_flags (GIOChannel *channel)
+{
+ return 0;
+}
+
+static GIOStatus
+g_io_win32_sock_set_flags (GIOChannel *channel,
+ GIOFlags flags,
+ GError **err)
+{
+ GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
+ u_long arg;
+
+ if (win32_channel->debug)
+ {
+ g_print ("g_io_win32_sock_set_flags: ");
+ g_win32_print_gioflags (flags);
+ g_print ("\n");
+ }
+
+ if (flags & G_IO_FLAG_NONBLOCK)
+ {
+ arg = 1;
+ if (ioctlsocket (win32_channel->fd, FIONBIO, &arg) == SOCKET_ERROR)
+ {
+ g_set_error (err, G_IO_CHANNEL_ERROR,
+ G_IO_CHANNEL_ERROR_FAILED,
+ winsock_error_message (WSAGetLastError ()));
+ return G_IO_STATUS_ERROR;
+ }
+ }
+ else
+ {
+ arg = 0;
+ if (ioctlsocket (win32_channel->fd, FIONBIO, &arg) == SOCKET_ERROR)
+ {
+ g_set_error (err, G_IO_CHANNEL_ERROR,
+ G_IO_CHANNEL_ERROR_FAILED,
+ winsock_error_message (WSAGetLastError ()));
+ return G_IO_STATUS_ERROR;
+ }
+ }
+
+ return G_IO_STATUS_NORMAL;
+}
+
+static GIOFlags
+g_io_win32_sock_get_flags (GIOChannel *channel)
+{
+ /* Could we do something here? */
+ return 0;
+}
+
+static GIOFuncs win32_channel_msg_funcs = {
+ g_io_win32_msg_read,
+ g_io_win32_msg_write,
+ NULL,
+ g_io_win32_msg_close,
+ g_io_win32_msg_create_watch,
+ g_io_win32_free,
+ g_io_win32_unimpl_set_flags,
+ g_io_win32_msg_get_flags,
+};
+
+static GIOFuncs win32_channel_fd_funcs = {
+ g_io_win32_fd_and_console_read,
+ g_io_win32_fd_and_console_write,
+ g_io_win32_fd_seek,
+ g_io_win32_fd_close,
+ g_io_win32_fd_create_watch,
+ g_io_win32_free,
+ g_io_win32_unimpl_set_flags,
+ g_io_win32_fd_get_flags,
+};
+
+static GIOFuncs win32_channel_console_funcs = {
+ g_io_win32_fd_and_console_read,
+ g_io_win32_fd_and_console_write,
+ NULL,
+ g_io_win32_console_close,
+ g_io_win32_console_create_watch,
+ g_io_win32_free,
+ g_io_win32_unimpl_set_flags,
+ g_io_win32_console_get_flags,
+};
+
+static GIOFuncs win32_channel_sock_funcs = {
+ g_io_win32_sock_read,
+ g_io_win32_sock_write,
+ NULL,
+ g_io_win32_sock_close,
+ g_io_win32_sock_create_watch,
+ g_io_win32_free,
+ g_io_win32_sock_set_flags,
+ g_io_win32_sock_get_flags,
+};
+
+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=%#x\n", hwnd);
+ channel->funcs = &win32_channel_msg_funcs;
+ win32_channel->type = G_IO_WIN32_WINDOWS_MESSAGES;
+ win32_channel->hwnd = (HWND) hwnd;
+
+ /* XXX: check this. */
+ channel->is_readable = IsWindow (win32_channel->hwnd);
+ channel->is_writeable = IsWindow (win32_channel->hwnd);
+
+ channel->is_seekable = FALSE;
+
+ return channel;
+}
+
+static GIOChannel *
+g_io_channel_win32_new_fd_internal (gint fd,
+ struct stat *st)
+{
+ GIOWin32Channel *win32_channel;
+ GIOChannel *channel;
+
+ win32_channel = g_new (GIOWin32Channel, 1);
+ channel = (GIOChannel *)win32_channel;
+
+ g_io_channel_init (channel);
+ g_io_channel_win32_init (win32_channel);
+
+ win32_channel->fd = fd;
+
+ if (win32_channel->debug)
+ g_print ("g_io_channel_win32_new_fd: %u\n", fd);
+ if (st->st_mode & _S_IFCHR) /* console */
+ {
+ channel->funcs = &win32_channel_console_funcs;
+ win32_channel->type = G_IO_WIN32_CONSOLE;
+ g_io_win32_console_get_flags_internal (channel);
+ }
+ else
+ {
+ channel->funcs = &win32_channel_fd_funcs;
+ win32_channel->type = G_IO_WIN32_FILE_DESC;
+ g_io_win32_fd_get_flags_internal (channel, st);
+ }
+
+ return channel;
+}
+
+GIOChannel *
+g_io_channel_win32_new_fd (gint fd)
+{
+ struct stat st;
+
+ if (fstat (fd, &st) == -1)
+ {
+ g_warning (G_STRLOC ": %d isn't a C library file descriptor", fd);
+ return NULL;
+ }
+
+ return g_io_channel_win32_new_fd_internal (fd, &st);
+}
+
+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;
+
+ channel->is_readable = TRUE;
+ channel->is_writeable = TRUE;
+ channel->is_seekable = FALSE;
+
+ return channel;
+}
+
+GIOChannel *
+g_io_channel_unix_new (gint fd)
+{
+ gboolean is_fd, is_socket;
+ struct stat st;
+ int optval, optlen;
+
+ is_fd = (fstat (fd, &st) == 0);
+
+ optlen = sizeof (optval);
+ is_socket = (getsockopt (fd, SOL_SOCKET, SO_TYPE, (char *) &optval, &optlen) != SOCKET_ERROR);
+
+ if (is_fd && is_socket)
+ g_warning (G_STRLOC ": %d is both a file descriptor and a socket, file descriptor interpretation assumed.", fd);
+
+ if (is_fd)
+ return g_io_channel_win32_new_fd_internal (fd, &st);
+
+ if (is_socket)
+ 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;
+
+ switch (win32_channel->type)
+ {
+ case G_IO_WIN32_FILE_DESC:
+ if (win32_channel->data_avail_event == NULL)
+ create_events (win32_channel);
+
+ fd->fd = (gint) win32_channel->data_avail_event;
+
+ if (win32_channel->thread_id == 0 && (condition & G_IO_IN))
+ {
+ if (condition & G_IO_IN)
+ create_thread (win32_channel, condition, read_thread);
+ else if (condition & G_IO_OUT)
+ create_thread (win32_channel, condition, write_thread);
+ }
+ break;
+
+ case G_IO_WIN32_CONSOLE:
+ fd->fd = (gint) _get_osfhandle (win32_channel->fd);
+ break;
+
+ case G_IO_WIN32_SOCKET:
+ fd->fd = (int) WSACreateEvent ();
+ break;
+
+ case G_IO_WIN32_WINDOWS_MESSAGES:
+ fd->fd = G_WIN32_MSG_HANDLE;
+ break;
+
+ default:
+ g_assert_not_reached ();
+ abort ();
+ }
+
+ fd->events = condition;
+}
+
+/* Binary compatibility */
+GIOChannel *
+g_io_channel_win32_new_stream_socket (int socket)
+{
+ return g_io_channel_win32_new_socket (socket);
+}
+
+#define __G_IO_WIN32_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gkeyfile.c b/trunk/glib/gkeyfile.c
new file mode 100644
index 000000000..0e144c0db
--- /dev/null
+++ b/trunk/glib/gkeyfile.c
@@ -0,0 +1,3712 @@
+/* gkeyfile.c - key file parser
+ *
+ * Copyright 2004 Red Hat, Inc.
+ *
+ * Written by Ray Strode <rstrode@redhat.com>
+ * Matthias Clasen <mclasen@redhat.com>
+ *
+ * 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 "gkeyfile.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <locale.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef G_OS_WIN32
+#include <io.h>
+
+#ifndef S_ISREG
+#define S_ISREG(mode) ((mode)&_S_IFREG)
+#endif
+
+#endif /* G_OS_WIN23 */
+
+#include "gconvert.h"
+#include "gdataset.h"
+#include "gerror.h"
+#include "gfileutils.h"
+#include "ghash.h"
+#include "glibintl.h"
+#include "glist.h"
+#include "gslist.h"
+#include "gmem.h"
+#include "gmessages.h"
+#include "gstdio.h"
+#include "gstring.h"
+#include "gstrfuncs.h"
+#include "gutils.h"
+
+#include "galias.h"
+
+typedef struct _GKeyFileGroup GKeyFileGroup;
+
+struct _GKeyFile
+{
+ GList *groups;
+
+ GKeyFileGroup *start_group;
+ GKeyFileGroup *current_group;
+
+ GString *parse_buffer; /* Holds up to one line of not-yet-parsed data */
+
+ /* Used for sizing the output buffer during serialization
+ */
+ gsize approximate_size;
+
+ gchar list_separator;
+
+ GKeyFileFlags flags;
+};
+
+typedef struct _GKeyFileKeyValuePair GKeyFileKeyValuePair;
+
+struct _GKeyFileGroup
+{
+ const gchar *name; /* NULL for above first group (which will be comments) */
+
+ GKeyFileKeyValuePair *comment; /* Special comment that is stuck to the top of a group */
+ gboolean has_trailing_blank_line;
+
+ GList *key_value_pairs;
+
+ /* Used in parallel with key_value_pairs for
+ * increased lookup performance
+ */
+ GHashTable *lookup_map;
+};
+
+struct _GKeyFileKeyValuePair
+{
+ gchar *key; /* NULL for comments */
+ gchar *value;
+};
+
+static gint find_file_in_data_dirs (const gchar *file,
+ const gchar **data_dirs,
+ gchar **output_file,
+ GError **error);
+static gboolean g_key_file_load_from_fd (GKeyFile *key_file,
+ gint fd,
+ GKeyFileFlags flags,
+ GError **error);
+static GList *g_key_file_lookup_group_node (GKeyFile *key_file,
+ const gchar *group_name);
+static GKeyFileGroup *g_key_file_lookup_group (GKeyFile *key_file,
+ const gchar *group_name);
+
+static GList *g_key_file_lookup_key_value_pair_node (GKeyFile *key_file,
+ GKeyFileGroup *group,
+ const gchar *key);
+static GKeyFileKeyValuePair *g_key_file_lookup_key_value_pair (GKeyFile *key_file,
+ GKeyFileGroup *group,
+ const gchar *key);
+
+static void g_key_file_remove_group_node (GKeyFile *key_file,
+ GList *group_node);
+static void g_key_file_remove_key_value_pair_node (GKeyFile *key_file,
+ GKeyFileGroup *group,
+ GList *pair_node);
+
+static void g_key_file_add_key (GKeyFile *key_file,
+ GKeyFileGroup *group,
+ const gchar *key,
+ const gchar *value);
+static void g_key_file_add_group (GKeyFile *key_file,
+ const gchar *group_name);
+static gboolean g_key_file_is_group_name (const gchar *name);
+static gboolean g_key_file_is_key_name (const gchar *name);
+static void g_key_file_key_value_pair_free (GKeyFileKeyValuePair *pair);
+static gboolean g_key_file_line_is_comment (const gchar *line);
+static gboolean g_key_file_line_is_group (const gchar *line);
+static gboolean g_key_file_line_is_key_value_pair (const gchar *line);
+static gchar *g_key_file_parse_value_as_string (GKeyFile *key_file,
+ const gchar *value,
+ GSList **separators,
+ GError **error);
+static gchar *g_key_file_parse_string_as_value (GKeyFile *key_file,
+ const gchar *string,
+ gboolean escape_separator);
+static gint g_key_file_parse_value_as_integer (GKeyFile *key_file,
+ const gchar *value,
+ GError **error);
+static gchar *g_key_file_parse_integer_as_value (GKeyFile *key_file,
+ gint value);
+static gdouble g_key_file_parse_value_as_double (GKeyFile *key_file,
+ const gchar *value,
+ GError **error);
+static gboolean g_key_file_parse_value_as_boolean (GKeyFile *key_file,
+ const gchar *value,
+ GError **error);
+static gchar *g_key_file_parse_boolean_as_value (GKeyFile *key_file,
+ gboolean value);
+static gchar *g_key_file_parse_value_as_comment (GKeyFile *key_file,
+ const gchar *value);
+static gchar *g_key_file_parse_comment_as_value (GKeyFile *key_file,
+ const gchar *comment);
+static void g_key_file_parse_key_value_pair (GKeyFile *key_file,
+ const gchar *line,
+ gsize length,
+ GError **error);
+static void g_key_file_parse_comment (GKeyFile *key_file,
+ const gchar *line,
+ gsize length,
+ GError **error);
+static void g_key_file_parse_group (GKeyFile *key_file,
+ const gchar *line,
+ gsize length,
+ GError **error);
+static gchar *key_get_locale (const gchar *key);
+static void g_key_file_parse_data (GKeyFile *key_file,
+ const gchar *data,
+ gsize length,
+ GError **error);
+static void g_key_file_flush_parse_buffer (GKeyFile *key_file,
+ GError **error);
+
+
+GQuark
+g_key_file_error_quark (void)
+{
+ return g_quark_from_static_string ("g-key-file-error-quark");
+}
+
+static void
+g_key_file_init (GKeyFile *key_file)
+{
+ key_file->current_group = g_slice_new0 (GKeyFileGroup);
+ key_file->groups = g_list_prepend (NULL, key_file->current_group);
+ key_file->start_group = NULL;
+ key_file->parse_buffer = g_string_sized_new (128);
+ key_file->approximate_size = 0;
+ key_file->list_separator = ';';
+ key_file->flags = 0;
+}
+
+static void
+g_key_file_clear (GKeyFile *key_file)
+{
+ GList *tmp, *group_node;
+
+ if (key_file->parse_buffer)
+ g_string_free (key_file->parse_buffer, TRUE);
+
+ tmp = key_file->groups;
+ while (tmp != NULL)
+ {
+ group_node = tmp;
+ tmp = tmp->next;
+ g_key_file_remove_group_node (key_file, group_node);
+ }
+
+ g_assert (key_file->groups == NULL);
+}
+
+
+/**
+ * g_key_file_new:
+ *
+ * Creates a new empty #GKeyFile object. Use
+ * g_key_file_load_from_file(), g_key_file_load_from_data(),
+ * g_key_file_load_from_dirs() or g_key_file_load_from_data_dirs() to
+ * read an existing key file.
+ *
+ * Return value: an empty #GKeyFile.
+ *
+ * Since: 2.6
+ **/
+GKeyFile *
+g_key_file_new (void)
+{
+ GKeyFile *key_file;
+
+ key_file = g_slice_new0 (GKeyFile);
+ g_key_file_init (key_file);
+
+ return key_file;
+}
+
+/**
+ * g_key_file_set_list_separator:
+ * @key_file: a #GKeyFile
+ * @separator: the separator
+ *
+ * Sets the character which is used to separate
+ * values in lists. Typically ';' or ',' are used
+ * as separators. The default list separator is ';'.
+ *
+ * Since: 2.6
+ */
+void
+g_key_file_set_list_separator (GKeyFile *key_file,
+ gchar separator)
+{
+ g_return_if_fail (key_file != NULL);
+
+ key_file->list_separator = separator;
+}
+
+
+/* Iterates through all the directories in *dirs trying to
+ * open file. When it successfully locates and opens a file it
+ * returns the file descriptor to the open file. It also
+ * outputs the absolute path of the file in output_file.
+ */
+static gint
+find_file_in_data_dirs (const gchar *file,
+ const gchar **dirs,
+ gchar **output_file,
+ GError **error)
+{
+ const gchar **data_dirs, *data_dir;
+ gchar *path;
+ gint fd;
+
+ path = NULL;
+ fd = -1;
+
+ if (dirs == NULL)
+ return fd;
+
+ data_dirs = dirs;
+
+ while (data_dirs && (data_dir = *data_dirs) && fd < 0)
+ {
+ gchar *candidate_file, *sub_dir;
+
+ candidate_file = (gchar *) file;
+ sub_dir = g_strdup ("");
+ while (candidate_file != NULL && fd < 0)
+ {
+ gchar *p;
+
+ path = g_build_filename (data_dir, sub_dir,
+ candidate_file, NULL);
+
+ fd = g_open (path, O_RDONLY, 0);
+
+ if (fd < 0)
+ {
+ g_free (path);
+ path = NULL;
+ }
+
+ candidate_file = strchr (candidate_file, '-');
+
+ if (candidate_file == NULL)
+ break;
+
+ candidate_file++;
+
+ g_free (sub_dir);
+ sub_dir = g_strndup (file, candidate_file - file - 1);
+
+ for (p = sub_dir; *p != '\0'; p++)
+ {
+ if (*p == '-')
+ *p = G_DIR_SEPARATOR;
+ }
+ }
+ g_free (sub_dir);
+ data_dirs++;
+ }
+
+ if (fd < 0)
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_NOT_FOUND,
+ _("Valid key file could not be "
+ "found in search dirs"));
+ }
+
+ if (output_file != NULL && fd > 0)
+ *output_file = g_strdup (path);
+
+ g_free (path);
+
+ return fd;
+}
+
+static gboolean
+g_key_file_load_from_fd (GKeyFile *key_file,
+ gint fd,
+ GKeyFileFlags flags,
+ GError **error)
+{
+ GError *key_file_error = NULL;
+ gssize bytes_read;
+ struct stat stat_buf;
+ gchar read_buf[4096];
+
+ if (fstat (fd, &stat_buf) < 0)
+ {
+ g_set_error (error, G_FILE_ERROR,
+ g_file_error_from_errno (errno),
+ "%s", g_strerror (errno));
+ return FALSE;
+ }
+
+ if (!S_ISREG (stat_buf.st_mode))
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE,
+ _("Not a regular file"));
+ return FALSE;
+ }
+
+ if (stat_buf.st_size == 0)
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE,
+ _("File is empty"));
+ return FALSE;
+ }
+
+ if (key_file->approximate_size > 0)
+ {
+ g_key_file_clear (key_file);
+ g_key_file_init (key_file);
+ }
+ key_file->flags = flags;
+
+ bytes_read = 0;
+ do
+ {
+ bytes_read = read (fd, read_buf, 4096);
+
+ if (bytes_read == 0) /* End of File */
+ break;
+
+ if (bytes_read < 0)
+ {
+ if (errno == EINTR || errno == EAGAIN)
+ continue;
+
+ g_set_error (error, G_FILE_ERROR,
+ g_file_error_from_errno (errno),
+ "%s", g_strerror (errno));
+ return FALSE;
+ }
+
+ g_key_file_parse_data (key_file,
+ read_buf, bytes_read,
+ &key_file_error);
+ }
+ while (!key_file_error);
+
+ if (key_file_error)
+ {
+ g_propagate_error (error, key_file_error);
+ return FALSE;
+ }
+
+ g_key_file_flush_parse_buffer (key_file, &key_file_error);
+
+ if (key_file_error)
+ {
+ g_propagate_error (error, key_file_error);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * g_key_file_load_from_file:
+ * @key_file: an empty #GKeyFile struct
+ * @file: the path of a filename to load, in the GLib file name encoding
+ * @flags: flags from #GKeyFileFlags
+ * @error: return location for a #GError, or %NULL
+ *
+ * Loads a key file into an empty #GKeyFile structure.
+ * If the file could not be loaded then %error is set to
+ * either a #GFileError or #GKeyFileError.
+ *
+ * Return value: %TRUE if a key file could be loaded, %FALSE othewise
+ * Since: 2.6
+ **/
+gboolean
+g_key_file_load_from_file (GKeyFile *key_file,
+ const gchar *file,
+ GKeyFileFlags flags,
+ GError **error)
+{
+ GError *key_file_error = NULL;
+ gint fd;
+
+ g_return_val_if_fail (key_file != NULL, FALSE);
+ g_return_val_if_fail (file != NULL, FALSE);
+
+ fd = g_open (file, O_RDONLY, 0);
+
+ if (fd < 0)
+ {
+ g_set_error (error, G_FILE_ERROR,
+ g_file_error_from_errno (errno),
+ "%s", g_strerror (errno));
+ return FALSE;
+ }
+
+ g_key_file_load_from_fd (key_file, fd, flags, &key_file_error);
+ close (fd);
+
+ if (key_file_error)
+ {
+ g_propagate_error (error, key_file_error);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * g_key_file_load_from_data:
+ * @key_file: an empty #GKeyFile struct
+ * @data: key file loaded in memory.
+ * @length: the length of @data in bytes
+ * @flags: flags from #GKeyFileFlags
+ * @error: return location for a #GError, or %NULL
+ *
+ * Loads a key file from memory into an empty #GKeyFile structure. If
+ * the object cannot be created then %error is set to a
+ * #GKeyFileError.
+ *
+ * Return value: %TRUE if a key file could be loaded, %FALSE othewise
+ * Since: 2.6
+ **/
+gboolean
+g_key_file_load_from_data (GKeyFile *key_file,
+ const gchar *data,
+ gsize length,
+ GKeyFileFlags flags,
+ GError **error)
+{
+ GError *key_file_error = NULL;
+
+ g_return_val_if_fail (key_file != NULL, FALSE);
+ g_return_val_if_fail (data != NULL, FALSE);
+ g_return_val_if_fail (length != 0, FALSE);
+
+ if (length == (gsize)-1)
+ length = strlen (data);
+
+ if (key_file->approximate_size > 0)
+ {
+ g_key_file_clear (key_file);
+ g_key_file_init (key_file);
+ }
+ key_file->flags = flags;
+
+ g_key_file_parse_data (key_file, data, length, &key_file_error);
+
+ if (key_file_error)
+ {
+ g_propagate_error (error, key_file_error);
+ return FALSE;
+ }
+
+ g_key_file_flush_parse_buffer (key_file, &key_file_error);
+
+ if (key_file_error)
+ {
+ g_propagate_error (error, key_file_error);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * g_key_file_load_from_dirs:
+ * @key_file: an empty #GKeyFile struct
+ * @file: a relative path to a filename to open and parse
+ * @search_dirs: %NULL-terminated array of directories to search
+ * @full_path: return location for a string containing the full path
+ * of the file, or %NULL
+ * @flags: flags from #GKeyFileFlags
+ * @error: return location for a #GError, or %NULL
+ *
+ * This function looks for a key file named @file in the paths
+ * specified in @search_dirs, loads the file into @key_file and
+ * returns the file's full path in @full_path. If the file could not
+ * be loaded then an %error is set to either a #GFileError or
+ * #GKeyFileError.
+ *
+ * Return value: %TRUE if a key file could be loaded, %FALSE othewise
+ *
+ * Since: 2.14
+ **/
+gboolean
+g_key_file_load_from_dirs (GKeyFile *key_file,
+ const gchar *file,
+ const gchar **search_dirs,
+ gchar **full_path,
+ GKeyFileFlags flags,
+ GError **error)
+{
+ GError *key_file_error = NULL;
+ const gchar **data_dirs;
+ gchar *output_path;
+ gint fd;
+ gboolean found_file;
+
+ g_return_val_if_fail (key_file != NULL, FALSE);
+ g_return_val_if_fail (!g_path_is_absolute (file), FALSE);
+ g_return_val_if_fail (search_dirs != NULL, FALSE);
+
+ found_file = FALSE;
+ data_dirs = search_dirs;
+ output_path = NULL;
+ while (*data_dirs != NULL && !found_file)
+ {
+ g_free (output_path);
+
+ fd = find_file_in_data_dirs (file, data_dirs, &output_path,
+ &key_file_error);
+
+ if (fd < 0)
+ {
+ if (key_file_error)
+ g_propagate_error (error, key_file_error);
+ break;
+ }
+
+ found_file = g_key_file_load_from_fd (key_file, fd, flags,
+ &key_file_error);
+ close (fd);
+
+ if (key_file_error)
+ {
+ g_propagate_error (error, key_file_error);
+ break;
+ }
+ }
+
+ if (found_file && full_path)
+ *full_path = output_path;
+ else
+ g_free (output_path);
+
+ return found_file;
+}
+
+/**
+ * g_key_file_load_from_data_dirs:
+ * @key_file: an empty #GKeyFile struct
+ * @file: a relative path to a filename to open and parse
+ * @full_path: return location for a string containing the full path
+ * of the file, or %NULL
+ * @flags: flags from #GKeyFileFlags
+ * @error: return location for a #GError, or %NULL
+ *
+ * This function looks for a key file named @file in the paths
+ * returned from g_get_user_data_dir() and g_get_system_data_dirs(),
+ * loads the file into @key_file and returns the file's full path in
+ * @full_path. If the file could not be loaded then an %error is
+ * set to either a #GFileError or #GKeyFileError.
+ *
+ * Return value: %TRUE if a key file could be loaded, %FALSE othewise
+ * Since: 2.6
+ **/
+gboolean
+g_key_file_load_from_data_dirs (GKeyFile *key_file,
+ const gchar *file,
+ gchar **full_path,
+ GKeyFileFlags flags,
+ GError **error)
+{
+ gchar **all_data_dirs;
+ const gchar * user_data_dir;
+ const gchar * const * system_data_dirs;
+ gsize i, j;
+ gboolean found_file;
+
+ g_return_val_if_fail (key_file != NULL, FALSE);
+ g_return_val_if_fail (!g_path_is_absolute (file), FALSE);
+
+ user_data_dir = g_get_user_data_dir ();
+ system_data_dirs = g_get_system_data_dirs ();
+ all_data_dirs = g_new (gchar *, g_strv_length ((gchar **)system_data_dirs) + 2);
+
+ i = 0;
+ all_data_dirs[i++] = g_strdup (user_data_dir);
+
+ j = 0;
+ while (system_data_dirs[j] != NULL)
+ all_data_dirs[i++] = g_strdup (system_data_dirs[j++]);
+ all_data_dirs[i] = NULL;
+
+ found_file = g_key_file_load_from_dirs (key_file,
+ file,
+ (const gchar **)all_data_dirs,
+ full_path,
+ flags,
+ error);
+
+ g_strfreev (all_data_dirs);
+
+ return found_file;
+}
+
+/**
+ * g_key_file_free:
+ * @key_file: a #GKeyFile
+ *
+ * Frees a #GKeyFile.
+ *
+ * Since: 2.6
+ **/
+void
+g_key_file_free (GKeyFile *key_file)
+{
+ g_return_if_fail (key_file != NULL);
+
+ g_key_file_clear (key_file);
+ g_slice_free (GKeyFile, key_file);
+}
+
+/* If G_KEY_FILE_KEEP_TRANSLATIONS is not set, only returns
+ * true for locales that match those in g_get_language_names().
+ */
+static gboolean
+g_key_file_locale_is_interesting (GKeyFile *key_file,
+ const gchar *locale)
+{
+ const gchar * const * current_locales;
+ gsize i;
+
+ if (key_file->flags & G_KEY_FILE_KEEP_TRANSLATIONS)
+ return TRUE;
+
+ current_locales = g_get_language_names ();
+
+ for (i = 0; current_locales[i] != NULL; i++)
+ {
+ if (g_ascii_strcasecmp (current_locales[i], locale) == 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+g_key_file_parse_line (GKeyFile *key_file,
+ const gchar *line,
+ gsize length,
+ GError **error)
+{
+ GError *parse_error = NULL;
+ gchar *line_start;
+
+ g_return_if_fail (key_file != NULL);
+ g_return_if_fail (line != NULL);
+
+ line_start = (gchar *) line;
+ while (g_ascii_isspace (*line_start))
+ line_start++;
+
+ if (g_key_file_line_is_comment (line_start))
+ g_key_file_parse_comment (key_file, line, length, &parse_error);
+ else if (g_key_file_line_is_group (line_start))
+ g_key_file_parse_group (key_file, line_start,
+ length - (line_start - line),
+ &parse_error);
+ else if (g_key_file_line_is_key_value_pair (line_start))
+ g_key_file_parse_key_value_pair (key_file, line_start,
+ length - (line_start - line),
+ &parse_error);
+ else
+ {
+ gchar *line_utf8 = _g_utf8_make_valid (line);
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE,
+ _("Key file contains line '%s' which is not "
+ "a key-value pair, group, or comment"),
+ line_utf8);
+ g_free (line_utf8);
+
+ return;
+ }
+
+ if (parse_error)
+ g_propagate_error (error, parse_error);
+}
+
+static void
+g_key_file_parse_comment (GKeyFile *key_file,
+ const gchar *line,
+ gsize length,
+ GError **error)
+{
+ GKeyFileKeyValuePair *pair;
+
+ if (!(key_file->flags & G_KEY_FILE_KEEP_COMMENTS))
+ return;
+
+ g_assert (key_file->current_group != NULL);
+
+ pair = g_slice_new (GKeyFileKeyValuePair);
+ pair->key = NULL;
+ pair->value = g_strndup (line, length);
+
+ key_file->current_group->key_value_pairs =
+ g_list_prepend (key_file->current_group->key_value_pairs, pair);
+
+ if (length == 0 || line[0] != '#')
+ key_file->current_group->has_trailing_blank_line = TRUE;
+}
+
+static void
+g_key_file_parse_group (GKeyFile *key_file,
+ const gchar *line,
+ gsize length,
+ GError **error)
+{
+ gchar *group_name;
+ const gchar *group_name_start, *group_name_end;
+
+ /* advance past opening '['
+ */
+ group_name_start = line + 1;
+ group_name_end = line + length - 1;
+
+ while (*group_name_end != ']')
+ group_name_end--;
+
+ group_name = g_strndup (group_name_start,
+ group_name_end - group_name_start);
+
+ if (!g_key_file_is_group_name (group_name))
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE,
+ _("Invalid group name: %s"), group_name);
+ g_free (group_name);
+ return;
+ }
+
+ g_key_file_add_group (key_file, group_name);
+ g_free (group_name);
+}
+
+static void
+g_key_file_parse_key_value_pair (GKeyFile *key_file,
+ const gchar *line,
+ gsize length,
+ GError **error)
+{
+ gchar *key, *value, *key_end, *value_start, *locale;
+ gsize key_len, value_len;
+
+ if (key_file->current_group == NULL || key_file->current_group->name == NULL)
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
+ _("Key file does not start with a group"));
+ return;
+ }
+
+ key_end = value_start = strchr (line, '=');
+
+ g_assert (key_end != NULL);
+
+ key_end--;
+ value_start++;
+
+ /* Pull the key name from the line (chomping trailing whitespace)
+ */
+ while (g_ascii_isspace (*key_end))
+ key_end--;
+
+ key_len = key_end - line + 2;
+
+ g_assert (key_len <= length);
+
+ key = g_strndup (line, key_len - 1);
+
+ if (!g_key_file_is_key_name (key))
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE,
+ _("Invalid key name: %s"), key);
+ g_free (key);
+ return;
+ }
+
+ /* Pull the value from the line (chugging leading whitespace)
+ */
+ while (g_ascii_isspace (*value_start))
+ value_start++;
+
+ value_len = line + length - value_start + 1;
+
+ value = g_strndup (value_start, value_len);
+
+ g_assert (key_file->start_group != NULL);
+
+ if (key_file->current_group
+ && key_file->current_group->name
+ && strcmp (key_file->start_group->name,
+ key_file->current_group->name) == 0
+ && strcmp (key, "Encoding") == 0)
+ {
+ if (g_ascii_strcasecmp (value, "UTF-8") != 0)
+ {
+ gchar *value_utf8 = _g_utf8_make_valid (value);
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_UNKNOWN_ENCODING,
+ _("Key file contains unsupported "
+ "encoding '%s'"), value_utf8);
+ g_free (value_utf8);
+
+ g_free (key);
+ g_free (value);
+ return;
+ }
+ }
+
+ /* Is this key a translation? If so, is it one that we care about?
+ */
+ locale = key_get_locale (key);
+
+ if (locale == NULL || g_key_file_locale_is_interesting (key_file, locale))
+ g_key_file_add_key (key_file, key_file->current_group, key, value);
+
+ g_free (locale);
+ g_free (key);
+ g_free (value);
+}
+
+static gchar *
+key_get_locale (const gchar *key)
+{
+ gchar *locale;
+
+ locale = g_strrstr (key, "[");
+
+ if (locale && strlen (locale) <= 2)
+ locale = NULL;
+
+ if (locale)
+ locale = g_strndup (locale + 1, strlen (locale) - 2);
+
+ return locale;
+}
+
+static void
+g_key_file_parse_data (GKeyFile *key_file,
+ const gchar *data,
+ gsize length,
+ GError **error)
+{
+ GError *parse_error;
+ gsize i;
+
+ g_return_if_fail (key_file != NULL);
+ g_return_if_fail (data != NULL);
+
+ parse_error = NULL;
+
+ for (i = 0; i < length; i++)
+ {
+ if (data[i] == '\n')
+ {
+ if (i > 0 && data[i - 1] == '\r')
+ g_string_erase (key_file->parse_buffer,
+ key_file->parse_buffer->len - 1,
+ 1);
+
+ /* When a newline is encountered flush the parse buffer so that the
+ * line can be parsed. Note that completely blank lines won't show
+ * up in the parse buffer, so they get parsed directly.
+ */
+ if (key_file->parse_buffer->len > 0)
+ g_key_file_flush_parse_buffer (key_file, &parse_error);
+ else
+ g_key_file_parse_comment (key_file, "", 1, &parse_error);
+
+ if (parse_error)
+ {
+ g_propagate_error (error, parse_error);
+ return;
+ }
+ }
+ else
+ g_string_append_c (key_file->parse_buffer, data[i]);
+ }
+
+ key_file->approximate_size += length;
+}
+
+static void
+g_key_file_flush_parse_buffer (GKeyFile *key_file,
+ GError **error)
+{
+ GError *file_error = NULL;
+
+ g_return_if_fail (key_file != NULL);
+
+ file_error = NULL;
+
+ if (key_file->parse_buffer->len > 0)
+ {
+ g_key_file_parse_line (key_file, key_file->parse_buffer->str,
+ key_file->parse_buffer->len,
+ &file_error);
+ g_string_erase (key_file->parse_buffer, 0, -1);
+
+ if (file_error)
+ {
+ g_propagate_error (error, file_error);
+ return;
+ }
+ }
+}
+
+/**
+ * g_key_file_to_data:
+ * @key_file: a #GKeyFile
+ * @length: return location for the length of the
+ * returned string, or %NULL
+ * @error: return location for a #GError, or %NULL
+ *
+ * This function outputs @key_file as a string.
+ *
+ * Return value: a newly allocated string holding
+ * the contents of the #GKeyFile
+ *
+ * Since: 2.6
+ **/
+gchar *
+g_key_file_to_data (GKeyFile *key_file,
+ gsize *length,
+ GError **error)
+{
+ GString *data_string;
+ GList *group_node, *key_file_node;
+ gboolean has_blank_line = TRUE;
+
+ g_return_val_if_fail (key_file != NULL, NULL);
+
+ data_string = g_string_sized_new (2 * key_file->approximate_size);
+
+ for (group_node = g_list_last (key_file->groups);
+ group_node != NULL;
+ group_node = group_node->prev)
+ {
+ GKeyFileGroup *group;
+
+ group = (GKeyFileGroup *) group_node->data;
+
+ /* separate groups by at least an empty line */
+ if (!has_blank_line)
+ g_string_append_c (data_string, '\n');
+ has_blank_line = group->has_trailing_blank_line;
+
+ if (group->comment != NULL)
+ g_string_append_printf (data_string, "%s\n", group->comment->value);
+
+ if (group->name != NULL)
+ g_string_append_printf (data_string, "[%s]\n", group->name);
+
+ for (key_file_node = g_list_last (group->key_value_pairs);
+ key_file_node != NULL;
+ key_file_node = key_file_node->prev)
+ {
+ GKeyFileKeyValuePair *pair;
+
+ pair = (GKeyFileKeyValuePair *) key_file_node->data;
+
+ if (pair->key != NULL)
+ g_string_append_printf (data_string, "%s=%s\n", pair->key, pair->value);
+ else
+ g_string_append_printf (data_string, "%s\n", pair->value);
+ }
+ }
+
+ if (length)
+ *length = data_string->len;
+
+ return g_string_free (data_string, FALSE);
+}
+
+/**
+ * g_key_file_get_keys:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @length: return location for the number of keys returned, or %NULL
+ * @error: return location for a #GError, or %NULL
+ *
+ * Returns all keys for the group name @group_name. The array of
+ * returned keys will be %NULL-terminated, so @length may
+ * optionally be %NULL. In the event that the @group_name cannot
+ * be found, %NULL is returned and @error is set to
+ * #G_KEY_FILE_ERROR_GROUP_NOT_FOUND.
+ *
+ * Return value: a newly-allocated %NULL-terminated array of
+ * strings. Use g_strfreev() to free it.
+ *
+ * Since: 2.6
+ **/
+gchar **
+g_key_file_get_keys (GKeyFile *key_file,
+ const gchar *group_name,
+ gsize *length,
+ GError **error)
+{
+ GKeyFileGroup *group;
+ GList *tmp;
+ gchar **keys;
+ gsize i, num_keys;
+
+ g_return_val_if_fail (key_file != NULL, NULL);
+ g_return_val_if_fail (group_name != NULL, NULL);
+
+ group = g_key_file_lookup_group (key_file, group_name);
+
+ if (!group)
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
+ _("Key file does not have group '%s'"),
+ group_name ? group_name : "(null)");
+ return NULL;
+ }
+
+ num_keys = 0;
+ for (tmp = group->key_value_pairs; tmp; tmp = tmp->next)
+ {
+ GKeyFileKeyValuePair *pair;
+
+ pair = (GKeyFileKeyValuePair *) tmp->data;
+
+ if (pair->key)
+ num_keys++;
+ }
+
+ keys = g_new (gchar *, num_keys + 1);
+
+ i = num_keys - 1;
+ for (tmp = group->key_value_pairs; tmp; tmp = tmp->next)
+ {
+ GKeyFileKeyValuePair *pair;
+
+ pair = (GKeyFileKeyValuePair *) tmp->data;
+
+ if (pair->key)
+ {
+ keys[i] = g_strdup (pair->key);
+ i--;
+ }
+ }
+
+ keys[num_keys] = NULL;
+
+ if (length)
+ *length = num_keys;
+
+ return keys;
+}
+
+/**
+ * g_key_file_get_start_group:
+ * @key_file: a #GKeyFile
+ *
+ * Returns the name of the start group of the file.
+ *
+ * Return value: The start group of the key file.
+ *
+ * Since: 2.6
+ **/
+gchar *
+g_key_file_get_start_group (GKeyFile *key_file)
+{
+ g_return_val_if_fail (key_file != NULL, NULL);
+
+ if (key_file->start_group)
+ return g_strdup (key_file->start_group->name);
+
+ return NULL;
+}
+
+/**
+ * g_key_file_get_groups:
+ * @key_file: a #GKeyFile
+ * @length: return location for the number of returned groups, or %NULL
+ *
+ * Returns all groups in the key file loaded with @key_file. The
+ * array of returned groups will be %NULL-terminated, so @length may
+ * optionally be %NULL.
+ *
+ * Return value: a newly-allocated %NULL-terminated array of strings.
+ * Use g_strfreev() to free it.
+ * Since: 2.6
+ **/
+gchar **
+g_key_file_get_groups (GKeyFile *key_file,
+ gsize *length)
+{
+ GList *group_node;
+ gchar **groups;
+ gsize i, num_groups;
+
+ g_return_val_if_fail (key_file != NULL, NULL);
+
+ num_groups = g_list_length (key_file->groups);
+
+ g_assert (num_groups > 0);
+
+ /* Only need num_groups instead of num_groups + 1
+ * because the first group of the file (last in the
+ * list) is always the comment group at the top,
+ * which we skip
+ */
+ groups = g_new (gchar *, num_groups);
+
+ group_node = g_list_last (key_file->groups);
+
+ g_assert (((GKeyFileGroup *) group_node->data)->name == NULL);
+
+ i = 0;
+ for (group_node = group_node->prev;
+ group_node != NULL;
+ group_node = group_node->prev)
+ {
+ GKeyFileGroup *group;
+
+ group = (GKeyFileGroup *) group_node->data;
+
+ g_assert (group->name != NULL);
+
+ groups[i++] = g_strdup (group->name);
+ }
+ groups[i] = NULL;
+
+ if (length)
+ *length = i;
+
+ return groups;
+}
+
+/**
+ * g_key_file_get_value:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @error: return location for a #GError, or %NULL
+ *
+ * Returns the value associated with @key under @group_name.
+ *
+ * In the event the key cannot be found, %NULL is returned and
+ * @error is set to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. In the
+ * event that the @group_name cannot be found, %NULL is returned
+ * and @error is set to #G_KEY_FILE_ERROR_GROUP_NOT_FOUND.
+ *
+ * Return value: a newly allocated string or %NULL if the specified
+ * key cannot be found.
+ *
+ * Since: 2.6
+ **/
+gchar *
+g_key_file_get_value (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error)
+{
+ GKeyFileGroup *group;
+ GKeyFileKeyValuePair *pair;
+ gchar *value = NULL;
+
+ g_return_val_if_fail (key_file != NULL, NULL);
+ g_return_val_if_fail (group_name != NULL, NULL);
+ g_return_val_if_fail (key != NULL, NULL);
+
+ group = g_key_file_lookup_group (key_file, group_name);
+
+ if (!group)
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
+ _("Key file does not have group '%s'"),
+ group_name ? group_name : "(null)");
+ return NULL;
+ }
+
+ pair = g_key_file_lookup_key_value_pair (key_file, group, key);
+
+ if (pair)
+ value = g_strdup (pair->value);
+ else
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_KEY_NOT_FOUND,
+ _("Key file does not have key '%s'"), key);
+
+ return value;
+}
+
+/**
+ * g_key_file_set_value:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @value: a string
+ *
+ * Associates a new value with @key under @group_name. If @key
+ * cannot be found then it is created. If @group_name cannot be
+ * found then it is created.
+ *
+ * Since: 2.6
+ **/
+void
+g_key_file_set_value (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar *value)
+{
+ GKeyFileGroup *group;
+ GKeyFileKeyValuePair *pair;
+
+ g_return_if_fail (key_file != NULL);
+ g_return_if_fail (g_key_file_is_group_name (group_name));
+ g_return_if_fail (g_key_file_is_key_name (key));
+ g_return_if_fail (value != NULL);
+
+ group = g_key_file_lookup_group (key_file, group_name);
+
+ if (!group)
+ {
+ g_key_file_add_group (key_file, group_name);
+ group = (GKeyFileGroup *) key_file->groups->data;
+
+ g_key_file_add_key (key_file, group, key, value);
+ }
+ else
+ {
+ pair = g_key_file_lookup_key_value_pair (key_file, group, key);
+
+ if (!pair)
+ g_key_file_add_key (key_file, group, key, value);
+ else
+ {
+ g_free (pair->value);
+ pair->value = g_strdup (value);
+ }
+ }
+}
+
+/**
+ * g_key_file_get_string:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @error: return location for a #GError, or %NULL
+ *
+ * Returns the value associated with @key under @group_name.
+ *
+ * In the event the key cannot be found, %NULL is returned and
+ * @error is set to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. In the
+ * event that the @group_name cannot be found, %NULL is returned
+ * and @error is set to #G_KEY_FILE_ERROR_GROUP_NOT_FOUND.
+ *
+ * Return value: a newly allocated string or %NULL if the specified
+ * key cannot be found.
+ *
+ * Since: 2.6
+ **/
+gchar *
+g_key_file_get_string (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error)
+{
+ gchar *value, *string_value;
+ GError *key_file_error;
+
+ g_return_val_if_fail (key_file != NULL, NULL);
+ g_return_val_if_fail (group_name != NULL, NULL);
+ g_return_val_if_fail (key != NULL, NULL);
+
+ key_file_error = NULL;
+
+ value = g_key_file_get_value (key_file, group_name, key, &key_file_error);
+
+ if (key_file_error)
+ {
+ g_propagate_error (error, key_file_error);
+ return NULL;
+ }
+
+ if (!g_utf8_validate (value, -1, NULL))
+ {
+ gchar *value_utf8 = _g_utf8_make_valid (value);
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_UNKNOWN_ENCODING,
+ _("Key file contains key '%s' with value '%s' "
+ "which is not UTF-8"), key, value_utf8);
+ g_free (value_utf8);
+ g_free (value);
+
+ return NULL;
+ }
+
+ string_value = g_key_file_parse_value_as_string (key_file, value, NULL,
+ &key_file_error);
+ g_free (value);
+
+ if (key_file_error)
+ {
+ if (g_error_matches (key_file_error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE))
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE,
+ _("Key file contains key '%s' "
+ "which has value that cannot be interpreted."),
+ key);
+ g_error_free (key_file_error);
+ }
+ else
+ g_propagate_error (error, key_file_error);
+ }
+
+ return string_value;
+}
+
+/**
+ * g_key_file_set_string:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @string: a string
+ *
+ * Associates a new string value with @key under @group_name. If
+ * @key cannot be found then it is created. If @group_name
+ * cannot be found then it is created.
+ *
+ * Since: 2.6
+ **/
+void
+g_key_file_set_string (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar *string)
+{
+ gchar *value;
+
+ g_return_if_fail (key_file != NULL);
+ g_return_if_fail (string != NULL);
+
+ value = g_key_file_parse_string_as_value (key_file, string, FALSE);
+ g_key_file_set_value (key_file, group_name, key, value);
+ g_free (value);
+}
+
+/**
+ * g_key_file_get_string_list:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @length: return location for the number of returned strings, or %NULL
+ * @error: return location for a #GError, or %NULL
+ *
+ * Returns the values associated with @key under @group_name.
+ *
+ * In the event the key cannot be found, %NULL is returned and
+ * @error is set to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. In the
+ * event that the @group_name cannot be found, %NULL is returned
+ * and @error is set to #G_KEY_FILE_ERROR_GROUP_NOT_FOUND.
+ *
+ * Return value: a %NULL-terminated string array or %NULL if the specified
+ * key cannot be found. The array should be freed with g_strfreev().
+ *
+ * Since: 2.6
+ **/
+gchar **
+g_key_file_get_string_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gsize *length,
+ GError **error)
+{
+ GError *key_file_error = NULL;
+ gchar *value, *string_value, **values;
+ gint i, len;
+ GSList *p, *pieces = NULL;
+
+ g_return_val_if_fail (key_file != NULL, NULL);
+ g_return_val_if_fail (group_name != NULL, NULL);
+ g_return_val_if_fail (key != NULL, NULL);
+
+ value = g_key_file_get_value (key_file, group_name, key, &key_file_error);
+
+ if (key_file_error)
+ {
+ g_propagate_error (error, key_file_error);
+ return NULL;
+ }
+
+ if (!g_utf8_validate (value, -1, NULL))
+ {
+ gchar *value_utf8 = _g_utf8_make_valid (value);
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_UNKNOWN_ENCODING,
+ _("Key file contains key '%s' with value '%s' "
+ "which is not UTF-8"), key, value_utf8);
+ g_free (value_utf8);
+ g_free (value);
+
+ return NULL;
+ }
+
+ string_value = g_key_file_parse_value_as_string (key_file, value, &pieces, &key_file_error);
+ g_free (value);
+ g_free (string_value);
+
+ if (key_file_error)
+ {
+ if (g_error_matches (key_file_error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE))
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE,
+ _("Key file contains key '%s' "
+ "which has value that cannot be interpreted."),
+ key);
+ g_error_free (key_file_error);
+ }
+ else
+ g_propagate_error (error, key_file_error);
+ }
+
+ len = g_slist_length (pieces);
+ values = g_new (gchar *, len + 1);
+ for (p = pieces, i = 0; p; p = p->next)
+ values[i++] = p->data;
+ values[len] = NULL;
+
+ g_slist_free (pieces);
+
+ if (length)
+ *length = len;
+
+ return values;
+}
+
+/**
+ * g_key_file_set_string_list:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @list: an array of locale string values
+ * @length: number of locale string values in @list
+ *
+ * Associates a list of string values for @key under @group_name.
+ * If @key cannot be found then it is created. If @group_name
+ * cannot be found then it is created.
+ *
+ * Since: 2.6
+ **/
+void
+g_key_file_set_string_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar * const list[],
+ gsize length)
+{
+ GString *value_list;
+ gsize i;
+
+ g_return_if_fail (key_file != NULL);
+ g_return_if_fail (list != NULL);
+
+ value_list = g_string_sized_new (length * 128);
+ for (i = 0; i < length && list[i] != NULL; i++)
+ {
+ gchar *value;
+
+ value = g_key_file_parse_string_as_value (key_file, list[i], TRUE);
+ g_string_append (value_list, value);
+ g_string_append_c (value_list, key_file->list_separator);
+
+ g_free (value);
+ }
+
+ g_key_file_set_value (key_file, group_name, key, value_list->str);
+ g_string_free (value_list, TRUE);
+}
+
+/**
+ * g_key_file_set_locale_string:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @locale: a locale
+ * @string: a string
+ *
+ * Associates a string value for @key and @locale under
+ * @group_name. If the translation for @key cannot be found
+ * then it is created.
+ *
+ * Since: 2.6
+ **/
+void
+g_key_file_set_locale_string (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar *locale,
+ const gchar *string)
+{
+ gchar *full_key, *value;
+
+ g_return_if_fail (key_file != NULL);
+ g_return_if_fail (key != NULL);
+ g_return_if_fail (locale != NULL);
+ g_return_if_fail (string != NULL);
+
+ value = g_key_file_parse_string_as_value (key_file, string, FALSE);
+ full_key = g_strdup_printf ("%s[%s]", key, locale);
+ g_key_file_set_value (key_file, group_name, full_key, value);
+ g_free (full_key);
+ g_free (value);
+}
+
+extern GSList *_g_compute_locale_variants (const gchar *locale);
+
+/**
+ * g_key_file_get_locale_string:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @locale: a locale or %NULL
+ * @error: return location for a #GError, or %NULL
+ *
+ * Returns the value associated with @key under @group_name
+ * translated in the given @locale if available. If @locale is
+ * %NULL then the current locale is assumed.
+ *
+ * If @key cannot be found then %NULL is returned and @error is set to
+ * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. If the value associated
+ * with @key cannot be interpreted or no suitable translation can
+ * be found then the untranslated value is returned.
+ *
+ * Return value: a newly allocated string or %NULL if the specified
+ * key cannot be found.
+ *
+ * Since: 2.6
+ **/
+gchar *
+g_key_file_get_locale_string (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar *locale,
+ GError **error)
+{
+ gchar *candidate_key, *translated_value;
+ GError *key_file_error;
+ gchar **languages;
+ gboolean free_languages = FALSE;
+ gint i;
+
+ g_return_val_if_fail (key_file != NULL, NULL);
+ g_return_val_if_fail (group_name != NULL, NULL);
+ g_return_val_if_fail (key != NULL, NULL);
+
+ candidate_key = NULL;
+ translated_value = NULL;
+ key_file_error = NULL;
+
+ if (locale)
+ {
+ GSList *l, *list;
+
+ list = _g_compute_locale_variants (locale);
+
+ languages = g_new (gchar *, g_slist_length (list) + 1);
+ for (l = list, i = 0; l; l = l->next, i++)
+ languages[i] = l->data;
+ languages[i] = NULL;
+
+ g_slist_free (list);
+ free_languages = TRUE;
+ }
+ else
+ {
+ languages = (gchar **) g_get_language_names ();
+ free_languages = FALSE;
+ }
+
+ for (i = 0; languages[i]; i++)
+ {
+ candidate_key = g_strdup_printf ("%s[%s]", key, languages[i]);
+
+ translated_value = g_key_file_get_string (key_file,
+ group_name,
+ candidate_key, NULL);
+ g_free (candidate_key);
+
+ if (translated_value)
+ break;
+
+ g_free (translated_value);
+ translated_value = NULL;
+ }
+
+ /* Fallback to untranslated key
+ */
+ if (!translated_value)
+ {
+ translated_value = g_key_file_get_string (key_file, group_name, key,
+ &key_file_error);
+
+ if (!translated_value)
+ g_propagate_error (error, key_file_error);
+ }
+
+ if (free_languages)
+ g_strfreev (languages);
+
+ return translated_value;
+}
+
+/**
+ * g_key_file_get_locale_string_list:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @locale: a locale
+ * @length: return location for the number of returned strings or %NULL
+ * @error: return location for a #GError or %NULL
+ *
+ * Returns the values associated with @key under @group_name
+ * translated in the given @locale if available. If @locale is
+ * %NULL then the current locale is assumed.
+
+ * If @key cannot be found then %NULL is returned and @error is set to
+ * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. If the values associated
+ * with @key cannot be interpreted or no suitable translations
+ * can be found then the untranslated values are returned.
+ * The returned array is %NULL-terminated, so @length may optionally be %NULL.
+ *
+ * Return value: a newly allocated %NULL-terminated string array
+ * or %NULL if the key isn't found. The string array should be freed
+ * with g_strfreev().
+ *
+ * Since: 2.6
+ **/
+gchar **
+g_key_file_get_locale_string_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar *locale,
+ gsize *length,
+ GError **error)
+{
+ GError *key_file_error;
+ gchar **values, *value;
+
+ g_return_val_if_fail (key_file != NULL, NULL);
+ g_return_val_if_fail (group_name != NULL, NULL);
+ g_return_val_if_fail (key != NULL, NULL);
+
+ key_file_error = NULL;
+
+ value = g_key_file_get_locale_string (key_file, group_name,
+ key, locale,
+ &key_file_error);
+
+ if (key_file_error)
+ g_propagate_error (error, key_file_error);
+
+ if (!value)
+ return NULL;
+
+ if (value[strlen (value) - 1] == ';')
+ value[strlen (value) - 1] = '\0';
+
+ values = g_strsplit (value, ";", 0);
+
+ g_free (value);
+
+ if (length)
+ *length = g_strv_length (values);
+
+ return values;
+}
+
+/**
+ * g_key_file_set_locale_string_list:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @locale: a locale
+ * @list: a %NULL-terminated array of locale string values
+ * @length: the length of @list
+ *
+ * Associates a list of string values for @key and @locale under
+ * @group_name. If the translation for @key cannot be found then
+ * it is created.
+ *
+ * Since: 2.6
+ **/
+void
+g_key_file_set_locale_string_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar *locale,
+ const gchar * const list[],
+ gsize length)
+{
+ GString *value_list;
+ gchar *full_key;
+ gsize i;
+
+ g_return_if_fail (key_file != NULL);
+ g_return_if_fail (key != NULL);
+ g_return_if_fail (locale != NULL);
+ g_return_if_fail (length != 0);
+
+ value_list = g_string_sized_new (length * 128);
+ for (i = 0; i < length && list[i] != NULL; i++)
+ {
+ gchar *value;
+
+ value = g_key_file_parse_string_as_value (key_file, list[i], TRUE);
+
+ g_string_append (value_list, value);
+ g_string_append_c (value_list, ';');
+
+ g_free (value);
+ }
+
+ full_key = g_strdup_printf ("%s[%s]", key, locale);
+ g_key_file_set_value (key_file, group_name, full_key, value_list->str);
+ g_free (full_key);
+ g_string_free (value_list, TRUE);
+}
+
+/**
+ * g_key_file_get_boolean:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @error: return location for a #GError
+ *
+ * Returns the value associated with @key under @group_name as a
+ * boolean.
+ *
+ * If @key cannot be found then %FALSE is returned and @error is set
+ * to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the value
+ * associated with @key cannot be interpreted as a boolean then %FALSE
+ * is returned and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE.
+ *
+ * Return value: the value associated with the key as a boolean, or
+ * %FALSE if the key was not found or could not be parsed.
+ *
+ * Since: 2.6
+ **/
+gboolean
+g_key_file_get_boolean (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error)
+{
+ GError *key_file_error = NULL;
+ gchar *value;
+ gboolean bool_value;
+
+ g_return_val_if_fail (key_file != NULL, FALSE);
+ g_return_val_if_fail (group_name != NULL, FALSE);
+ g_return_val_if_fail (key != NULL, FALSE);
+
+ value = g_key_file_get_value (key_file, group_name, key, &key_file_error);
+
+ if (!value)
+ {
+ g_propagate_error (error, key_file_error);
+ return FALSE;
+ }
+
+ bool_value = g_key_file_parse_value_as_boolean (key_file, value,
+ &key_file_error);
+ g_free (value);
+
+ if (key_file_error)
+ {
+ if (g_error_matches (key_file_error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE))
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE,
+ _("Key file contains key '%s' "
+ "which has value that cannot be interpreted."),
+ key);
+ g_error_free (key_file_error);
+ }
+ else
+ g_propagate_error (error, key_file_error);
+ }
+
+ return bool_value;
+}
+
+/**
+ * g_key_file_set_boolean:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @value: %TRUE or %FALSE
+ *
+ * Associates a new boolean value with @key under @group_name.
+ * If @key cannot be found then it is created.
+ *
+ * Since: 2.6
+ **/
+void
+g_key_file_set_boolean (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gboolean value)
+{
+ gchar *result;
+
+ g_return_if_fail (key_file != NULL);
+
+ result = g_key_file_parse_boolean_as_value (key_file, value);
+ g_key_file_set_value (key_file, group_name, key, result);
+ g_free (result);
+}
+
+/**
+ * g_key_file_get_boolean_list:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @length: the number of booleans returned
+ * @error: return location for a #GError
+ *
+ * Returns the values associated with @key under @group_name as
+ * booleans. If @group_name is %NULL, the start_group is used.
+ *
+ * If @key cannot be found then %NULL is returned and @error is set to
+ * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the values associated
+ * with @key cannot be interpreted as booleans then %NULL is returned
+ * and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE.
+ *
+ * Return value: the values associated with the key as a list of
+ * booleans, or %NULL if the key was not found or could not be parsed.
+ *
+ * Since: 2.6
+ **/
+gboolean *
+g_key_file_get_boolean_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gsize *length,
+ GError **error)
+{
+ GError *key_file_error;
+ gchar **values;
+ gboolean *bool_values;
+ gsize i, num_bools;
+
+ g_return_val_if_fail (key_file != NULL, NULL);
+ g_return_val_if_fail (group_name != NULL, NULL);
+ g_return_val_if_fail (key != NULL, NULL);
+
+ key_file_error = NULL;
+
+ values = g_key_file_get_string_list (key_file, group_name, key,
+ &num_bools, &key_file_error);
+
+ if (key_file_error)
+ g_propagate_error (error, key_file_error);
+
+ if (!values)
+ return NULL;
+
+ bool_values = g_new (gboolean, num_bools);
+
+ for (i = 0; i < num_bools; i++)
+ {
+ bool_values[i] = g_key_file_parse_value_as_boolean (key_file,
+ values[i],
+ &key_file_error);
+
+ if (key_file_error)
+ {
+ g_propagate_error (error, key_file_error);
+ g_strfreev (values);
+ g_free (bool_values);
+
+ return NULL;
+ }
+ }
+ g_strfreev (values);
+
+ if (length)
+ *length = num_bools;
+
+ return bool_values;
+}
+
+/**
+ * g_key_file_set_boolean_list:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @list: an array of boolean values
+ * @length: length of @list
+ *
+ * Associates a list of boolean values with @key under
+ * @group_name. If @key cannot be found then it is created.
+ * If @group_name is %NULL, the start_group is used.
+ *
+ * Since: 2.6
+ **/
+void
+g_key_file_set_boolean_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gboolean list[],
+ gsize length)
+{
+ GString *value_list;
+ gsize i;
+
+ g_return_if_fail (key_file != NULL);
+ g_return_if_fail (list != NULL);
+
+ value_list = g_string_sized_new (length * 8);
+ for (i = 0; i < length; i++)
+ {
+ gchar *value;
+
+ value = g_key_file_parse_boolean_as_value (key_file, list[i]);
+
+ g_string_append (value_list, value);
+ g_string_append_c (value_list, key_file->list_separator);
+
+ g_free (value);
+ }
+
+ g_key_file_set_value (key_file, group_name, key, value_list->str);
+ g_string_free (value_list, TRUE);
+}
+
+/**
+ * g_key_file_get_integer:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @error: return location for a #GError
+ *
+ * Returns the value associated with @key under @group_name as an
+ * integer. If @group_name is %NULL, the start_group is used.
+ *
+ * If @key cannot be found then 0 is returned and @error is set to
+ * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the value associated
+ * with @key cannot be interpreted as an integer then 0 is returned
+ * and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE.
+ *
+ * Return value: the value associated with the key as an integer, or
+ * 0 if the key was not found or could not be parsed.
+ *
+ * Since: 2.6
+ **/
+gint
+g_key_file_get_integer (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error)
+{
+ GError *key_file_error;
+ gchar *value;
+ gint int_value;
+
+ g_return_val_if_fail (key_file != NULL, -1);
+ g_return_val_if_fail (group_name != NULL, -1);
+ g_return_val_if_fail (key != NULL, -1);
+
+ key_file_error = NULL;
+
+ value = g_key_file_get_value (key_file, group_name, key, &key_file_error);
+
+ if (key_file_error)
+ {
+ g_propagate_error (error, key_file_error);
+ return 0;
+ }
+
+ int_value = g_key_file_parse_value_as_integer (key_file, value,
+ &key_file_error);
+ g_free (value);
+
+ if (key_file_error)
+ {
+ if (g_error_matches (key_file_error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE))
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE,
+ _("Key file contains key '%s' in group '%s' "
+ "which has value that cannot be interpreted."), key,
+ group_name);
+ g_error_free (key_file_error);
+ }
+ else
+ g_propagate_error (error, key_file_error);
+ }
+
+ return int_value;
+}
+
+/**
+ * g_key_file_set_integer:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @value: an integer value
+ *
+ * Associates a new integer value with @key under @group_name.
+ * If @key cannot be found then it is created.
+ *
+ * Since: 2.6
+ **/
+void
+g_key_file_set_integer (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gint value)
+{
+ gchar *result;
+
+ g_return_if_fail (key_file != NULL);
+
+ result = g_key_file_parse_integer_as_value (key_file, value);
+ g_key_file_set_value (key_file, group_name, key, result);
+ g_free (result);
+}
+
+/**
+ * g_key_file_get_integer_list:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @length: the number of integers returned
+ * @error: return location for a #GError
+ *
+ * Returns the values associated with @key under @group_name as
+ * integers.
+ *
+ * If @key cannot be found then %NULL is returned and @error is set to
+ * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the values associated
+ * with @key cannot be interpreted as integers then %NULL is returned
+ * and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE.
+ *
+ * Return value: the values associated with the key as a list of
+ * integers, or %NULL if the key was not found or could not be parsed.
+ *
+ * Since: 2.6
+ **/
+gint *
+g_key_file_get_integer_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gsize *length,
+ GError **error)
+{
+ GError *key_file_error = NULL;
+ gchar **values;
+ gint *int_values;
+ gsize i, num_ints;
+
+ g_return_val_if_fail (key_file != NULL, NULL);
+ g_return_val_if_fail (group_name != NULL, NULL);
+ g_return_val_if_fail (key != NULL, NULL);
+
+ values = g_key_file_get_string_list (key_file, group_name, key,
+ &num_ints, &key_file_error);
+
+ if (key_file_error)
+ g_propagate_error (error, key_file_error);
+
+ if (!values)
+ return NULL;
+
+ int_values = g_new (gint, num_ints);
+
+ for (i = 0; i < num_ints; i++)
+ {
+ int_values[i] = g_key_file_parse_value_as_integer (key_file,
+ values[i],
+ &key_file_error);
+
+ if (key_file_error)
+ {
+ g_propagate_error (error, key_file_error);
+ g_strfreev (values);
+ g_free (int_values);
+
+ return NULL;
+ }
+ }
+ g_strfreev (values);
+
+ if (length)
+ *length = num_ints;
+
+ return int_values;
+}
+
+/**
+ * g_key_file_set_integer_list:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @list: an array of integer values
+ * @length: number of integer values in @list
+ *
+ * Associates a list of integer values with @key under
+ * @group_name. If @key cannot be found then it is created.
+ *
+ * Since: 2.6
+ **/
+void
+g_key_file_set_integer_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gint list[],
+ gsize length)
+{
+ GString *values;
+ gsize i;
+
+ g_return_if_fail (key_file != NULL);
+ g_return_if_fail (list != NULL);
+
+ values = g_string_sized_new (length * 16);
+ for (i = 0; i < length; i++)
+ {
+ gchar *value;
+
+ value = g_key_file_parse_integer_as_value (key_file, list[i]);
+
+ g_string_append (values, value);
+ g_string_append_c (values, ';');
+
+ g_free (value);
+ }
+
+ g_key_file_set_value (key_file, group_name, key, values->str);
+ g_string_free (values, TRUE);
+}
+
+/**
+ * g_key_file_get_double:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @error: return location for a #GError
+ *
+ * Returns the value associated with @key under @group_name as a
+ * double. If @group_name is %NULL, the start_group is used.
+ *
+ * If @key cannot be found then 0.0 is returned and @error is set to
+ * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the value associated
+ * with @key cannot be interpreted as a double then 0.0 is returned
+ * and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE.
+ *
+ * Return value: the value associated with the key as a double, or
+ * 0.0 if the key was not found or could not be parsed.
+ *
+ * Since: 2.12
+ **/
+gdouble
+g_key_file_get_double (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error)
+{
+ GError *key_file_error;
+ gchar *value;
+ gdouble double_value;
+
+ g_return_val_if_fail (key_file != NULL, -1);
+ g_return_val_if_fail (group_name != NULL, -1);
+ g_return_val_if_fail (key != NULL, -1);
+
+ key_file_error = NULL;
+
+ value = g_key_file_get_value (key_file, group_name, key, &key_file_error);
+
+ if (key_file_error)
+ {
+ g_propagate_error (error, key_file_error);
+ return 0;
+ }
+
+ double_value = g_key_file_parse_value_as_double (key_file, value,
+ &key_file_error);
+ g_free (value);
+
+ if (key_file_error)
+ {
+ if (g_error_matches (key_file_error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE))
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE,
+ _("Key file contains key '%s' in group '%s' "
+ "which has value that cannot be interpreted."), key,
+ group_name);
+ g_error_free (key_file_error);
+ }
+ else
+ g_propagate_error (error, key_file_error);
+ }
+
+ return double_value;
+}
+
+/**
+ * g_key_file_set_double:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @value: an double value
+ *
+ * Associates a new double value with @key under @group_name.
+ * If @key cannot be found then it is created. If @group_name
+ * is %NULL, the start group is used.
+ *
+ * Since: 2.12
+ **/
+void
+g_key_file_set_double (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gdouble value)
+{
+ gchar result[G_ASCII_DTOSTR_BUF_SIZE];
+
+ g_return_if_fail (key_file != NULL);
+
+ g_ascii_dtostr (result, sizeof (result), value);
+ g_key_file_set_value (key_file, group_name, key, result);
+}
+
+/**
+ * g_key_file_get_double_list:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @length: the number of doubles returned
+ * @error: return location for a #GError
+ *
+ * Returns the values associated with @key under @group_name as
+ * doubles. If @group_name is %NULL, the start group is used.
+ *
+ * If @key cannot be found then %NULL is returned and @error is set to
+ * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the values associated
+ * with @key cannot be interpreted as doubles then %NULL is returned
+ * and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE.
+ *
+ * Return value: the values associated with the key as a list of
+ * doubles, or %NULL if the key was not found or could not be parsed.
+ *
+ * Since: 2.12
+ **/
+gdouble *
+g_key_file_get_double_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gsize *length,
+ GError **error)
+{
+ GError *key_file_error = NULL;
+ gchar **values;
+ gdouble *double_values;
+ gsize i, num_doubles;
+
+ g_return_val_if_fail (key_file != NULL, NULL);
+ g_return_val_if_fail (group_name != NULL, NULL);
+ g_return_val_if_fail (key != NULL, NULL);
+
+ values = g_key_file_get_string_list (key_file, group_name, key,
+ &num_doubles, &key_file_error);
+
+ if (key_file_error)
+ g_propagate_error (error, key_file_error);
+
+ if (!values)
+ return NULL;
+
+ double_values = g_new (gdouble, num_doubles);
+
+ for (i = 0; i < num_doubles; i++)
+ {
+ double_values[i] = g_key_file_parse_value_as_double (key_file,
+ values[i],
+ &key_file_error);
+
+ if (key_file_error)
+ {
+ g_propagate_error (error, key_file_error);
+ g_strfreev (values);
+ g_free (double_values);
+
+ return NULL;
+ }
+ }
+ g_strfreev (values);
+
+ if (length)
+ *length = num_doubles;
+
+ return double_values;
+}
+
+/**
+ * g_key_file_set_double_list:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key
+ * @list: an array of double values
+ * @length: number of double values in @list
+ *
+ * Associates a list of double values with @key under
+ * @group_name. If @key cannot be found then it is created.
+ * If @group_name is %NULL the start group is used.
+ *
+ * Since: 2.12
+ **/
+void
+g_key_file_set_double_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gdouble list[],
+ gsize length)
+{
+ GString *values;
+ gsize i;
+
+ g_return_if_fail (key_file != NULL);
+ g_return_if_fail (list != NULL);
+
+ values = g_string_sized_new (length * 16);
+ for (i = 0; i < length; i++)
+ {
+ gchar result[G_ASCII_DTOSTR_BUF_SIZE];
+
+ g_ascii_dtostr( result, sizeof (result), list[i] );
+
+ g_string_append (values, result);
+ g_string_append_c (values, ';');
+ }
+
+ g_key_file_set_value (key_file, group_name, key, values->str);
+ g_string_free (values, TRUE);
+}
+
+static void
+g_key_file_set_key_comment (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar *comment,
+ GError **error)
+{
+ GKeyFileGroup *group;
+ GKeyFileKeyValuePair *pair;
+ GList *key_node, *comment_node, *tmp;
+
+ group = g_key_file_lookup_group (key_file, group_name);
+ if (!group)
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
+ _("Key file does not have group '%s'"),
+ group_name ? group_name : "(null)");
+
+ return;
+ }
+
+ /* First find the key the comments are supposed to be
+ * associated with
+ */
+ key_node = g_key_file_lookup_key_value_pair_node (key_file, group, key);
+
+ if (key_node == NULL)
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_KEY_NOT_FOUND,
+ _("Key file does not have key '%s' in group '%s'"),
+ key, group->name);
+ return;
+ }
+
+ /* Then find all the comments already associated with the
+ * key and free them
+ */
+ tmp = key_node->next;
+ while (tmp != NULL)
+ {
+ GKeyFileKeyValuePair *pair;
+
+ pair = (GKeyFileKeyValuePair *) tmp->data;
+
+ if (pair->key != NULL)
+ break;
+
+ comment_node = tmp;
+ tmp = tmp->next;
+ g_key_file_remove_key_value_pair_node (key_file, group,
+ comment_node);
+ }
+
+ if (comment == NULL)
+ return;
+
+ /* Now we can add our new comment
+ */
+ pair = g_slice_new (GKeyFileKeyValuePair);
+ pair->key = NULL;
+ pair->value = g_key_file_parse_comment_as_value (key_file, comment);
+
+ key_node = g_list_insert (key_node, pair, 1);
+}
+
+static void
+g_key_file_set_group_comment (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *comment,
+ GError **error)
+{
+ GKeyFileGroup *group;
+
+ g_return_if_fail (g_key_file_is_group_name (group_name));
+
+ group = g_key_file_lookup_group (key_file, group_name);
+ if (!group)
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
+ _("Key file does not have group '%s'"),
+ group_name ? group_name : "(null)");
+
+ return;
+ }
+
+ /* First remove any existing comment
+ */
+ if (group->comment)
+ {
+ g_key_file_key_value_pair_free (group->comment);
+ group->comment = NULL;
+ }
+
+ if (comment == NULL)
+ return;
+
+ /* Now we can add our new comment
+ */
+ group->comment = g_slice_new (GKeyFileKeyValuePair);
+ group->comment->key = NULL;
+ group->comment->value = g_key_file_parse_comment_as_value (key_file, comment);
+}
+
+static void
+g_key_file_set_top_comment (GKeyFile *key_file,
+ const gchar *comment,
+ GError **error)
+{
+ GList *group_node;
+ GKeyFileGroup *group;
+ GKeyFileKeyValuePair *pair;
+
+ /* The last group in the list should be the top (comments only)
+ * group in the file
+ */
+ g_assert (key_file->groups != NULL);
+ group_node = g_list_last (key_file->groups);
+ group = (GKeyFileGroup *) group_node->data;
+ g_assert (group->name == NULL);
+
+ /* Note all keys must be comments at the top of
+ * the file, so we can just free it all.
+ */
+ if (group->key_value_pairs != NULL)
+ {
+ g_list_foreach (group->key_value_pairs,
+ (GFunc) g_key_file_key_value_pair_free,
+ NULL);
+ g_list_free (group->key_value_pairs);
+ group->key_value_pairs = NULL;
+ }
+
+ if (comment == NULL)
+ return;
+
+ pair = g_slice_new (GKeyFileKeyValuePair);
+ pair->key = NULL;
+ pair->value = g_key_file_parse_comment_as_value (key_file, comment);
+
+ group->key_value_pairs =
+ g_list_prepend (group->key_value_pairs, pair);
+}
+
+/**
+ * g_key_file_set_comment:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name, or %NULL
+ * @key: a key
+ * @comment: a comment
+ * @error: return location for a #GError
+ *
+ * Places a comment above @key from @group_name.
+ * @group_name. If @key is %NULL then @comment will
+ * be written above @group_name. If both @key
+ * and @group_name are NULL, then @comment will
+ * be written above the first group in the file.
+ *
+ * Since: 2.6
+ **/
+void
+g_key_file_set_comment (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar *comment,
+ GError **error)
+{
+ g_return_if_fail (key_file != NULL);
+
+ if (group_name != NULL && key != NULL)
+ g_key_file_set_key_comment (key_file, group_name, key, comment, error);
+ else if (group_name != NULL)
+ g_key_file_set_group_comment (key_file, group_name, comment, error);
+ else
+ g_key_file_set_top_comment (key_file, comment, error);
+
+ if (comment != NULL)
+ key_file->approximate_size += strlen (comment);
+}
+
+static gchar *
+g_key_file_get_key_comment (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error)
+{
+ GKeyFileGroup *group;
+ GKeyFileKeyValuePair *pair;
+ GList *key_node, *tmp;
+ GString *string;
+ gchar *comment;
+
+ g_return_val_if_fail (g_key_file_is_group_name (group_name), NULL);
+
+ group = g_key_file_lookup_group (key_file, group_name);
+ if (!group)
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
+ _("Key file does not have group '%s'"),
+ group_name ? group_name : "(null)");
+
+ return NULL;
+ }
+
+ /* First find the key the comments are supposed to be
+ * associated with
+ */
+ key_node = g_key_file_lookup_key_value_pair_node (key_file, group, key);
+
+ if (key_node == NULL)
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_KEY_NOT_FOUND,
+ _("Key file does not have key '%s' in group '%s'"),
+ key, group->name);
+ return NULL;
+ }
+
+ string = NULL;
+
+ /* Then find all the comments already associated with the
+ * key and concatentate them.
+ */
+ tmp = key_node->next;
+ if (!key_node->next)
+ return NULL;
+
+ pair = (GKeyFileKeyValuePair *) tmp->data;
+ if (pair->key != NULL)
+ return NULL;
+
+ while (tmp->next)
+ {
+ pair = (GKeyFileKeyValuePair *) tmp->next->data;
+
+ if (pair->key != NULL)
+ break;
+
+ tmp = tmp->next;
+ }
+
+ while (tmp != key_node)
+ {
+ GKeyFileKeyValuePair *pair;
+
+ pair = (GKeyFileKeyValuePair *) tmp->data;
+
+ if (string == NULL)
+ string = g_string_sized_new (512);
+
+ comment = g_key_file_parse_value_as_comment (key_file, pair->value);
+ g_string_append (string, comment);
+ g_free (comment);
+
+ tmp = tmp->prev;
+ }
+
+ if (string != NULL)
+ {
+ comment = string->str;
+ g_string_free (string, FALSE);
+ }
+ else
+ comment = NULL;
+
+ return comment;
+}
+
+static gchar *
+get_group_comment (GKeyFile *key_file,
+ GKeyFileGroup *group,
+ GError **error)
+{
+ GString *string;
+ GList *tmp;
+ gchar *comment;
+
+ string = NULL;
+
+ tmp = group->key_value_pairs;
+ while (tmp)
+ {
+ GKeyFileKeyValuePair *pair;
+
+ pair = (GKeyFileKeyValuePair *) tmp->data;
+
+ if (pair->key != NULL)
+ {
+ tmp = tmp->prev;
+ break;
+ }
+
+ if (tmp->next == NULL)
+ break;
+
+ tmp = tmp->next;
+ }
+
+ while (tmp != NULL)
+ {
+ GKeyFileKeyValuePair *pair;
+
+ pair = (GKeyFileKeyValuePair *) tmp->data;
+
+ if (string == NULL)
+ string = g_string_sized_new (512);
+
+ comment = g_key_file_parse_value_as_comment (key_file, pair->value);
+ g_string_append (string, comment);
+ g_free (comment);
+
+ tmp = tmp->prev;
+ }
+
+ if (string != NULL)
+ return g_string_free (string, FALSE);
+
+ return NULL;
+}
+
+static gchar *
+g_key_file_get_group_comment (GKeyFile *key_file,
+ const gchar *group_name,
+ GError **error)
+{
+ GList *group_node;
+ GKeyFileGroup *group;
+
+ group_node = g_key_file_lookup_group_node (key_file, group_name);
+ if (!group_node)
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
+ _("Key file does not have group '%s'"),
+ group_name ? group_name : "(null)");
+
+ return NULL;
+ }
+
+ group = (GKeyFileGroup *)group_node->data;
+ if (group->comment)
+ return g_strdup (group->comment->value);
+
+ group_node = group_node->next;
+ group = (GKeyFileGroup *)group_node->data;
+ return get_group_comment (key_file, group, error);
+}
+
+static gchar *
+g_key_file_get_top_comment (GKeyFile *key_file,
+ GError **error)
+{
+ GList *group_node;
+ GKeyFileGroup *group;
+
+ /* The last group in the list should be the top (comments only)
+ * group in the file
+ */
+ g_assert (key_file->groups != NULL);
+ group_node = g_list_last (key_file->groups);
+ group = (GKeyFileGroup *) group_node->data;
+ g_assert (group->name == NULL);
+
+ return get_group_comment (key_file, group, error);
+}
+
+/**
+ * g_key_file_get_comment:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name, or %NULL
+ * @key: a key
+ * @error: return location for a #GError
+ *
+ * Retrieves a comment above @key from @group_name.
+ * @group_name. If @key is %NULL then @comment will
+ * be read from above @group_name. If both @key
+ * and @group_name are NULL, then @comment will
+ * be read from above the first group in the file.
+ *
+ * Returns: a comment that should be freed with g_free()
+ *
+ * Since: 2.6
+ **/
+gchar *
+g_key_file_get_comment (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error)
+{
+ g_return_val_if_fail (key_file != NULL, NULL);
+
+ if (group_name != NULL && key != NULL)
+ return g_key_file_get_key_comment (key_file, group_name, key, error);
+ else if (group_name != NULL)
+ return g_key_file_get_group_comment (key_file, group_name, error);
+ else
+ return g_key_file_get_top_comment (key_file, error);
+}
+
+/**
+ * g_key_file_remove_comment:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name, or %NULL
+ * @key: a key
+ * @error: return location for a #GError
+ *
+ * Removes a comment above @key from @group_name.
+ * @group_name. If @key is %NULL then @comment will
+ * be written above @group_name. If both @key
+ * and @group_name are NULL, then @comment will
+ * be written above the first group in the file.
+ *
+ * Since: 2.6
+ **/
+
+void
+g_key_file_remove_comment (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error)
+{
+ g_return_if_fail (key_file != NULL);
+
+ if (group_name != NULL && key != NULL)
+ g_key_file_set_key_comment (key_file, group_name, key, NULL, error);
+ else if (group_name != NULL)
+ g_key_file_set_group_comment (key_file, group_name, NULL, error);
+ else
+ g_key_file_set_top_comment (key_file, NULL, error);
+}
+
+/**
+ * g_key_file_has_group:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ *
+ * Looks whether the key file has the group @group_name.
+ *
+ * Return value: %TRUE if @group_name is a part of @key_file, %FALSE
+ * otherwise.
+ * Since: 2.6
+ **/
+gboolean
+g_key_file_has_group (GKeyFile *key_file,
+ const gchar *group_name)
+{
+ g_return_val_if_fail (key_file != NULL, FALSE);
+ g_return_val_if_fail (group_name != NULL, FALSE);
+
+ return g_key_file_lookup_group_node (key_file, group_name) != NULL;
+}
+
+/**
+ * g_key_file_has_key:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key name
+ * @error: return location for a #GError
+ *
+ * Looks whether the key file has the key @key in the group
+ * @group_name.
+ *
+ * Return value: %TRUE if @key is a part of @group_name, %FALSE
+ * otherwise.
+ *
+ * Since: 2.6
+ **/
+gboolean
+g_key_file_has_key (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error)
+{
+ GKeyFileKeyValuePair *pair;
+ GKeyFileGroup *group;
+
+ g_return_val_if_fail (key_file != NULL, FALSE);
+ g_return_val_if_fail (group_name != NULL, FALSE);
+ g_return_val_if_fail (key != NULL, FALSE);
+
+ group = g_key_file_lookup_group (key_file, group_name);
+
+ if (!group)
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
+ _("Key file does not have group '%s'"),
+ group_name ? group_name : "(null)");
+
+ return FALSE;
+ }
+
+ pair = g_key_file_lookup_key_value_pair (key_file, group, key);
+
+ return pair != NULL;
+}
+
+static void
+g_key_file_add_group (GKeyFile *key_file,
+ const gchar *group_name)
+{
+ GKeyFileGroup *group;
+
+ g_return_if_fail (key_file != NULL);
+ g_return_if_fail (g_key_file_is_group_name (group_name));
+
+ group = g_key_file_lookup_group (key_file, group_name);
+ if (group != NULL)
+ {
+ key_file->current_group = group;
+ return;
+ }
+
+ group = g_slice_new0 (GKeyFileGroup);
+ group->name = g_strdup (group_name);
+ group->lookup_map = g_hash_table_new (g_str_hash, g_str_equal);
+ key_file->groups = g_list_prepend (key_file->groups, group);
+ key_file->approximate_size += strlen (group_name) + 3;
+ key_file->current_group = group;
+
+ if (key_file->start_group == NULL)
+ key_file->start_group = group;
+}
+
+static void
+g_key_file_key_value_pair_free (GKeyFileKeyValuePair *pair)
+{
+ if (pair != NULL)
+ {
+ g_free (pair->key);
+ g_free (pair->value);
+ g_slice_free (GKeyFileKeyValuePair, pair);
+ }
+}
+
+/* Be careful not to call this function on a node with data in the
+ * lookup map without removing it from the lookup map, first.
+ *
+ * Some current cases where this warning is not a concern are
+ * when:
+ * - the node being removed is a comment node
+ * - the entire lookup map is getting destroyed soon after
+ * anyway.
+ */
+static void
+g_key_file_remove_key_value_pair_node (GKeyFile *key_file,
+ GKeyFileGroup *group,
+ GList *pair_node)
+{
+
+ GKeyFileKeyValuePair *pair;
+
+ pair = (GKeyFileKeyValuePair *) pair_node->data;
+
+ group->key_value_pairs = g_list_remove_link (group->key_value_pairs, pair_node);
+
+ if (pair->key != NULL)
+ key_file->approximate_size -= strlen (pair->key) + 1;
+
+ g_assert (pair->value != NULL);
+ key_file->approximate_size -= strlen (pair->value);
+
+ g_key_file_key_value_pair_free (pair);
+
+ g_list_free_1 (pair_node);
+}
+
+static void
+g_key_file_remove_group_node (GKeyFile *key_file,
+ GList *group_node)
+{
+ GKeyFileGroup *group;
+ GList *tmp;
+
+ group = (GKeyFileGroup *) group_node->data;
+
+ /* If the current group gets deleted make the current group the last
+ * added group.
+ */
+ if (key_file->current_group == group)
+ {
+ /* groups should always contain at least the top comment group,
+ * unless g_key_file_clear has been called
+ */
+ if (key_file->groups)
+ key_file->current_group = (GKeyFileGroup *) key_file->groups->data;
+ else
+ key_file->current_group = NULL;
+ }
+
+ /* If the start group gets deleted make the start group the first
+ * added group.
+ */
+ if (key_file->start_group == group)
+ {
+ tmp = g_list_last (key_file->groups);
+ while (tmp != NULL)
+ {
+ if (tmp != group_node &&
+ ((GKeyFileGroup *) tmp->data)->name != NULL)
+ break;
+
+ tmp = tmp->prev;
+ }
+
+ if (tmp)
+ key_file->start_group = (GKeyFileGroup *) tmp->data;
+ else
+ key_file->start_group = NULL;
+ }
+
+ key_file->groups = g_list_remove_link (key_file->groups, group_node);
+
+ if (group->name != NULL)
+ key_file->approximate_size -= strlen (group->name) + 3;
+
+ tmp = group->key_value_pairs;
+ while (tmp != NULL)
+ {
+ GList *pair_node;
+
+ pair_node = tmp;
+ tmp = tmp->next;
+ g_key_file_remove_key_value_pair_node (key_file, group, pair_node);
+ }
+
+ g_assert (group->key_value_pairs == NULL);
+
+ if (group->lookup_map)
+ {
+ g_hash_table_destroy (group->lookup_map);
+ group->lookup_map = NULL;
+ }
+
+ g_free ((gchar *) group->name);
+ g_slice_free (GKeyFileGroup, group);
+ g_list_free_1 (group_node);
+}
+
+/**
+ * g_key_file_remove_group:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @error: return location for a #GError or %NULL
+ *
+ * Removes the specified group, @group_name,
+ * from the key file.
+ *
+ * Since: 2.6
+ **/
+void
+g_key_file_remove_group (GKeyFile *key_file,
+ const gchar *group_name,
+ GError **error)
+{
+ GList *group_node;
+
+ g_return_if_fail (key_file != NULL);
+ g_return_if_fail (group_name != NULL);
+
+ group_node = g_key_file_lookup_group_node (key_file, group_name);
+
+ if (!group_node)
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
+ _("Key file does not have group '%s'"),
+ group_name);
+ return;
+ }
+
+ g_key_file_remove_group_node (key_file, group_node);
+}
+
+static void
+g_key_file_add_key (GKeyFile *key_file,
+ GKeyFileGroup *group,
+ const gchar *key,
+ const gchar *value)
+{
+ GKeyFileKeyValuePair *pair;
+
+ pair = g_slice_new (GKeyFileKeyValuePair);
+ pair->key = g_strdup (key);
+ pair->value = g_strdup (value);
+
+ g_hash_table_replace (group->lookup_map, pair->key, pair);
+ group->key_value_pairs = g_list_prepend (group->key_value_pairs, pair);
+ group->has_trailing_blank_line = FALSE;
+ key_file->approximate_size += strlen (key) + strlen (value) + 2;
+}
+
+/**
+ * g_key_file_remove_key:
+ * @key_file: a #GKeyFile
+ * @group_name: a group name
+ * @key: a key name to remove
+ * @error: return location for a #GError or %NULL
+ *
+ * Removes @key in @group_name from the key file.
+ *
+ * Since: 2.6
+ **/
+void
+g_key_file_remove_key (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error)
+{
+ GKeyFileGroup *group;
+ GKeyFileKeyValuePair *pair;
+
+ g_return_if_fail (key_file != NULL);
+ g_return_if_fail (group_name != NULL);
+ g_return_if_fail (key != NULL);
+
+ pair = NULL;
+
+ group = g_key_file_lookup_group (key_file, group_name);
+ if (!group)
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
+ _("Key file does not have group '%s'"),
+ group_name ? group_name : "(null)");
+ return;
+ }
+
+ pair = g_key_file_lookup_key_value_pair (key_file, group, key);
+
+ if (!pair)
+ {
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_KEY_NOT_FOUND,
+ _("Key file does not have key '%s' in group '%s'"),
+ key, group->name);
+ return;
+ }
+
+ key_file->approximate_size -= strlen (pair->key) + strlen (pair->value) + 2;
+
+ group->key_value_pairs = g_list_remove (group->key_value_pairs, pair);
+ g_hash_table_remove (group->lookup_map, pair->key);
+ g_key_file_key_value_pair_free (pair);
+}
+
+static GList *
+g_key_file_lookup_group_node (GKeyFile *key_file,
+ const gchar *group_name)
+{
+ GKeyFileGroup *group;
+ GList *tmp;
+
+ for (tmp = key_file->groups; tmp != NULL; tmp = tmp->next)
+ {
+ group = (GKeyFileGroup *) tmp->data;
+
+ if (group && group->name && strcmp (group->name, group_name) == 0)
+ break;
+ }
+
+ return tmp;
+}
+
+static GKeyFileGroup *
+g_key_file_lookup_group (GKeyFile *key_file,
+ const gchar *group_name)
+{
+ GList *group_node;
+
+ group_node = g_key_file_lookup_group_node (key_file, group_name);
+
+ if (group_node != NULL)
+ return (GKeyFileGroup *) group_node->data;
+
+ return NULL;
+}
+
+static GList *
+g_key_file_lookup_key_value_pair_node (GKeyFile *key_file,
+ GKeyFileGroup *group,
+ const gchar *key)
+{
+ GList *key_node;
+
+ for (key_node = group->key_value_pairs;
+ key_node != NULL;
+ key_node = key_node->next)
+ {
+ GKeyFileKeyValuePair *pair;
+
+ pair = (GKeyFileKeyValuePair *) key_node->data;
+
+ if (pair->key && strcmp (pair->key, key) == 0)
+ break;
+ }
+
+ return key_node;
+}
+
+static GKeyFileKeyValuePair *
+g_key_file_lookup_key_value_pair (GKeyFile *key_file,
+ GKeyFileGroup *group,
+ const gchar *key)
+{
+ return (GKeyFileKeyValuePair *) g_hash_table_lookup (group->lookup_map, key);
+}
+
+/* Lines starting with # or consisting entirely of whitespace are merely
+ * recorded, not parsed. This function assumes all leading whitespace
+ * has been stripped.
+ */
+static gboolean
+g_key_file_line_is_comment (const gchar *line)
+{
+ return (*line == '#' || *line == '\0' || *line == '\n');
+}
+
+static gboolean
+g_key_file_is_group_name (const gchar *name)
+{
+ gchar *p, *q;
+
+ if (name == NULL)
+ return FALSE;
+
+ p = q = (gchar *) name;
+ while (*q && *q != ']' && *q != '[' && !g_ascii_iscntrl (*q))
+ q = g_utf8_find_next_char (q, NULL);
+
+ if (*q != '\0' || q == p)
+ return FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+g_key_file_is_key_name (const gchar *name)
+{
+ gchar *p, *q;
+
+ if (name == NULL)
+ return FALSE;
+
+ p = q = (gchar *) name;
+ /* We accept a little more than the desktop entry spec says,
+ * since gnome-vfs uses mime-types as keys in its cache.
+ */
+ while (*q && *q != '=' && *q != '[' && *q != ']')
+ q = g_utf8_find_next_char (q, NULL);
+
+ /* No empty keys, please */
+ if (q == p)
+ return FALSE;
+
+ /* We accept spaces in the middle of keys to not break
+ * existing apps, but we don't tolerate initial of final
+ * spaces, which would lead to silent corruption when
+ * rereading the file.
+ */
+ if (*p == ' ' || q[-1] == ' ')
+ return FALSE;
+
+ if (*q == '[')
+ {
+ q++;
+ while (*q && (g_unichar_isalnum (g_utf8_get_char_validated (q, -1)) || *q == '-' || *q == '_' || *q == '.' || *q == '@'))
+ q = g_utf8_find_next_char (q, NULL);
+
+ if (*q != ']')
+ return FALSE;
+
+ q++;
+ }
+
+ if (*q != '\0')
+ return FALSE;
+
+ return TRUE;
+}
+
+/* A group in a key file is made up of a starting '[' followed by one
+ * or more letters making up the group name followed by ']'.
+ */
+static gboolean
+g_key_file_line_is_group (const gchar *line)
+{
+ gchar *p;
+
+ p = (gchar *) line;
+ if (*p != '[')
+ return FALSE;
+
+ p++;
+
+ while (*p && *p != ']')
+ p = g_utf8_find_next_char (p, NULL);
+
+ if (*p != ']')
+ return FALSE;
+
+ /* silently accept whitespace after the ] */
+ p = g_utf8_find_next_char (p, NULL);
+ while (*p == ' ' || *p == '\t')
+ p = g_utf8_find_next_char (p, NULL);
+
+ if (*p)
+ return FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+g_key_file_line_is_key_value_pair (const gchar *line)
+{
+ gchar *p;
+
+ p = (gchar *) g_utf8_strchr (line, -1, '=');
+
+ if (!p)
+ return FALSE;
+
+ /* Key must be non-empty
+ */
+ if (*p == line[0])
+ return FALSE;
+
+ return TRUE;
+}
+
+static gchar *
+g_key_file_parse_value_as_string (GKeyFile *key_file,
+ const gchar *value,
+ GSList **pieces,
+ GError **error)
+{
+ gchar *string_value, *p, *q0, *q;
+
+ string_value = g_new (gchar, strlen (value) + 1);
+
+ p = (gchar *) value;
+ q0 = q = string_value;
+ while (*p)
+ {
+ if (*p == '\\')
+ {
+ p++;
+
+ switch (*p)
+ {
+ case 's':
+ *q = ' ';
+ break;
+
+ case 'n':
+ *q = '\n';
+ break;
+
+ case 't':
+ *q = '\t';
+ break;
+
+ case 'r':
+ *q = '\r';
+ break;
+
+ case '\\':
+ *q = '\\';
+ break;
+
+ case '\0':
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE,
+ _("Key file contains escape character "
+ "at end of line"));
+ break;
+
+ default:
+ if (pieces && *p == key_file->list_separator)
+ *q = key_file->list_separator;
+ else
+ {
+ *q++ = '\\';
+ *q = *p;
+
+ if (*error == NULL)
+ {
+ gchar sequence[3];
+
+ sequence[0] = '\\';
+ sequence[1] = *p;
+ sequence[2] = '\0';
+
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE,
+ _("Key file contains invalid escape "
+ "sequence '%s'"), sequence);
+ }
+ }
+ break;
+ }
+ }
+ else
+ {
+ *q = *p;
+ if (pieces && (*p == key_file->list_separator))
+ {
+ *pieces = g_slist_prepend (*pieces, g_strndup (q0, q - q0));
+ q0 = q + 1;
+ }
+ }
+
+ if (*p == '\0')
+ break;
+
+ q++;
+ p++;
+ }
+
+ *q = '\0';
+ if (pieces)
+ {
+ if (q0 < q)
+ *pieces = g_slist_prepend (*pieces, g_strndup (q0, q - q0));
+ *pieces = g_slist_reverse (*pieces);
+ }
+
+ return string_value;
+}
+
+static gchar *
+g_key_file_parse_string_as_value (GKeyFile *key_file,
+ const gchar *string,
+ gboolean escape_separator)
+{
+ gchar *value, *p, *q;
+ gsize length;
+ gboolean parsing_leading_space;
+
+ length = strlen (string) + 1;
+
+ /* Worst case would be that every character needs to be escaped.
+ * In other words every character turns to two characters
+ */
+ value = g_new (gchar, 2 * length);
+
+ p = (gchar *) string;
+ q = value;
+ parsing_leading_space = TRUE;
+ while (p < (string + length - 1))
+ {
+ gchar escaped_character[3] = { '\\', 0, 0 };
+
+ switch (*p)
+ {
+ case ' ':
+ if (parsing_leading_space)
+ {
+ escaped_character[1] = 's';
+ strcpy (q, escaped_character);
+ q += 2;
+ }
+ else
+ {
+ *q = *p;
+ q++;
+ }
+ break;
+ case '\t':
+ if (parsing_leading_space)
+ {
+ escaped_character[1] = 't';
+ strcpy (q, escaped_character);
+ q += 2;
+ }
+ else
+ {
+ *q = *p;
+ q++;
+ }
+ break;
+ case '\n':
+ escaped_character[1] = 'n';
+ strcpy (q, escaped_character);
+ q += 2;
+ break;
+ case '\r':
+ escaped_character[1] = 'r';
+ strcpy (q, escaped_character);
+ q += 2;
+ break;
+ case '\\':
+ escaped_character[1] = '\\';
+ strcpy (q, escaped_character);
+ q += 2;
+ parsing_leading_space = FALSE;
+ break;
+ default:
+ if (escape_separator && *p == key_file->list_separator)
+ {
+ escaped_character[1] = key_file->list_separator;
+ strcpy (q, escaped_character);
+ q += 2;
+ parsing_leading_space = TRUE;
+ }
+ else
+ {
+ *q = *p;
+ q++;
+ parsing_leading_space = FALSE;
+ }
+ break;
+ }
+ p++;
+ }
+ *q = '\0';
+
+ return value;
+}
+
+static gint
+g_key_file_parse_value_as_integer (GKeyFile *key_file,
+ const gchar *value,
+ GError **error)
+{
+ gchar *end_of_valid_int;
+ glong long_value;
+ gint int_value;
+
+ errno = 0;
+ long_value = strtol (value, &end_of_valid_int, 10);
+
+ if (*value == '\0' || *end_of_valid_int != '\0')
+ {
+ gchar *value_utf8 = _g_utf8_make_valid (value);
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE,
+ _("Value '%s' cannot be interpreted "
+ "as a number."), value_utf8);
+ g_free (value_utf8);
+
+ return 0;
+ }
+
+ int_value = long_value;
+ if (int_value != long_value || errno == ERANGE)
+ {
+ gchar *value_utf8 = _g_utf8_make_valid (value);
+ g_set_error (error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE,
+ _("Integer value '%s' out of range"),
+ value_utf8);
+ g_free (value_utf8);
+
+ return 0;
+ }
+
+ return int_value;
+}
+
+static gchar *
+g_key_file_parse_integer_as_value (GKeyFile *key_file,
+ gint value)
+
+{
+ return g_strdup_printf ("%d", value);
+}
+
+static gdouble
+g_key_file_parse_value_as_double (GKeyFile *key_file,
+ const gchar *value,
+ GError **error)
+{
+ gchar *end_of_valid_d;
+ gdouble double_value = 0;
+
+ double_value = g_ascii_strtod (value, &end_of_valid_d);
+
+ if (*end_of_valid_d != '\0' || end_of_valid_d == value)
+ {
+ gchar *value_utf8 = _g_utf8_make_valid (value);
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE,
+ _("Value '%s' cannot be interpreted "
+ "as a float number."),
+ value_utf8);
+ g_free (value_utf8);
+ }
+
+ return double_value;
+}
+
+static gboolean
+g_key_file_parse_value_as_boolean (GKeyFile *key_file,
+ const gchar *value,
+ GError **error)
+{
+ gchar *value_utf8;
+
+ if (strcmp (value, "true") == 0 || strcmp (value, "1") == 0)
+ return TRUE;
+ else if (strcmp (value, "false") == 0 || strcmp (value, "0") == 0)
+ return FALSE;
+
+ value_utf8 = _g_utf8_make_valid (value);
+ g_set_error (error, G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE,
+ _("Value '%s' cannot be interpreted "
+ "as a boolean."), value_utf8);
+ g_free (value_utf8);
+
+ return FALSE;
+}
+
+static gchar *
+g_key_file_parse_boolean_as_value (GKeyFile *key_file,
+ gboolean value)
+{
+ if (value)
+ return g_strdup ("true");
+ else
+ return g_strdup ("false");
+}
+
+static gchar *
+g_key_file_parse_value_as_comment (GKeyFile *key_file,
+ const gchar *value)
+{
+ GString *string;
+ gchar **lines;
+ gsize i;
+
+ string = g_string_sized_new (512);
+
+ lines = g_strsplit (value, "\n", 0);
+
+ for (i = 0; lines[i] != NULL; i++)
+ {
+ if (lines[i][0] != '#')
+ g_string_append_printf (string, "%s\n", lines[i]);
+ else
+ g_string_append_printf (string, "%s\n", lines[i] + 1);
+ }
+ g_strfreev (lines);
+
+ return g_string_free (string, FALSE);
+}
+
+static gchar *
+g_key_file_parse_comment_as_value (GKeyFile *key_file,
+ const gchar *comment)
+{
+ GString *string;
+ gchar **lines;
+ gsize i;
+
+ string = g_string_sized_new (512);
+
+ lines = g_strsplit (comment, "\n", 0);
+
+ for (i = 0; lines[i] != NULL; i++)
+ g_string_append_printf (string, "#%s%s", lines[i],
+ lines[i + 1] == NULL? "" : "\n");
+ g_strfreev (lines);
+
+ return g_string_free (string, FALSE);
+}
+
+#define __G_KEY_FILE_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gkeyfile.h b/trunk/glib/gkeyfile.h
new file mode 100644
index 000000000..d78dd7ccb
--- /dev/null
+++ b/trunk/glib/gkeyfile.h
@@ -0,0 +1,246 @@
+/* gkeyfile.h - desktop entry file parser
+ *
+ * Copyright 2004 Red Hat, Inc.
+ *
+ * Ray Strode <halfline@hawaii.rr.com>
+ *
+ * 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_KEY_FILE_H__
+#define __G_KEY_FILE_H__
+
+#include <glib/gerror.h>
+
+G_BEGIN_DECLS
+
+typedef enum
+{
+ G_KEY_FILE_ERROR_UNKNOWN_ENCODING,
+ G_KEY_FILE_ERROR_PARSE,
+ G_KEY_FILE_ERROR_NOT_FOUND,
+ G_KEY_FILE_ERROR_KEY_NOT_FOUND,
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
+ G_KEY_FILE_ERROR_INVALID_VALUE
+} GKeyFileError;
+
+#define G_KEY_FILE_ERROR g_key_file_error_quark()
+
+GQuark g_key_file_error_quark (void);
+
+typedef struct _GKeyFile GKeyFile;
+
+typedef enum
+{
+ G_KEY_FILE_NONE = 0,
+ G_KEY_FILE_KEEP_COMMENTS = 1 << 0,
+ G_KEY_FILE_KEEP_TRANSLATIONS = 1 << 1
+} GKeyFileFlags;
+
+GKeyFile *g_key_file_new (void);
+void g_key_file_free (GKeyFile *key_file);
+void g_key_file_set_list_separator (GKeyFile *key_file,
+ gchar separator);
+gboolean g_key_file_load_from_file (GKeyFile *key_file,
+ const gchar *file,
+ GKeyFileFlags flags,
+ GError **error);
+gboolean g_key_file_load_from_data (GKeyFile *key_file,
+ const gchar *data,
+ gsize length,
+ GKeyFileFlags flags,
+ GError **error);
+gboolean g_key_file_load_from_dirs (GKeyFile *key_file,
+ const gchar *file,
+ const gchar **search_dirs,
+ gchar **full_path,
+ GKeyFileFlags flags,
+ GError **error);
+gboolean g_key_file_load_from_data_dirs (GKeyFile *key_file,
+ const gchar *file,
+ gchar **full_path,
+ GKeyFileFlags flags,
+ GError **error);
+gchar *g_key_file_to_data (GKeyFile *key_file,
+ gsize *length,
+ GError **error) G_GNUC_MALLOC;
+gchar *g_key_file_get_start_group (GKeyFile *key_file) G_GNUC_MALLOC;
+gchar **g_key_file_get_groups (GKeyFile *key_file,
+ gsize *length) G_GNUC_MALLOC;
+gchar **g_key_file_get_keys (GKeyFile *key_file,
+ const gchar *group_name,
+ gsize *length,
+ GError **error) G_GNUC_MALLOC;
+gboolean g_key_file_has_group (GKeyFile *key_file,
+ const gchar *group_name);
+gboolean g_key_file_has_key (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error);
+gchar *g_key_file_get_value (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error) G_GNUC_MALLOC;
+void g_key_file_set_value (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar *value);
+gchar *g_key_file_get_string (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error) G_GNUC_MALLOC;
+void g_key_file_set_string (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar *string);
+gchar *g_key_file_get_locale_string (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar *locale,
+ GError **error) G_GNUC_MALLOC;
+void g_key_file_set_locale_string (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar *locale,
+ const gchar *string);
+gboolean g_key_file_get_boolean (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error);
+void g_key_file_set_boolean (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gboolean value);
+gint g_key_file_get_integer (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error);
+void g_key_file_set_integer (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gint value);
+gdouble g_key_file_get_double (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error);
+void g_key_file_set_double (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gdouble value);
+gchar **g_key_file_get_string_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gsize *length,
+ GError **error) G_GNUC_MALLOC;
+void g_key_file_set_string_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar * const list[],
+ gsize length);
+gchar **g_key_file_get_locale_string_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar *locale,
+ gsize *length,
+ GError **error) G_GNUC_MALLOC;
+void g_key_file_set_locale_string_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar *locale,
+ const gchar * const list[],
+ gsize length);
+gboolean *g_key_file_get_boolean_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gsize *length,
+ GError **error) G_GNUC_MALLOC;
+void g_key_file_set_boolean_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gboolean list[],
+ gsize length);
+gint *g_key_file_get_integer_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gsize *length,
+ GError **error) G_GNUC_MALLOC;
+void g_key_file_set_double_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gdouble list[],
+ gsize length);
+gdouble *g_key_file_get_double_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gsize *length,
+ GError **error) G_GNUC_MALLOC;
+void g_key_file_set_integer_list (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ gint list[],
+ gsize length);
+void g_key_file_set_comment (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ const gchar *comment,
+ GError **error);
+gchar *g_key_file_get_comment (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error) G_GNUC_MALLOC;
+
+void g_key_file_remove_comment (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error);
+void g_key_file_remove_key (GKeyFile *key_file,
+ const gchar *group_name,
+ const gchar *key,
+ GError **error);
+void g_key_file_remove_group (GKeyFile *key_file,
+ const gchar *group_name,
+ GError **error);
+
+/* Defines for handling freedesktop.org Desktop files */
+#define G_KEY_FILE_DESKTOP_GROUP "Desktop Entry"
+
+#define G_KEY_FILE_DESKTOP_KEY_TYPE "Type"
+#define G_KEY_FILE_DESKTOP_KEY_VERSION "Version"
+#define G_KEY_FILE_DESKTOP_KEY_NAME "Name"
+#define G_KEY_FILE_DESKTOP_KEY_GENERIC_NAME "GenericName"
+#define G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY "NoDisplay"
+#define G_KEY_FILE_DESKTOP_KEY_COMMENT "Comment"
+#define G_KEY_FILE_DESKTOP_KEY_ICON "Icon"
+#define G_KEY_FILE_DESKTOP_KEY_HIDDEN "Hidden"
+#define G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN "OnlyShowIn"
+#define G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN "NotShowIn"
+#define G_KEY_FILE_DESKTOP_KEY_TRY_EXEC "TryExec"
+#define G_KEY_FILE_DESKTOP_KEY_EXEC "Exec"
+#define G_KEY_FILE_DESKTOP_KEY_PATH "Path"
+#define G_KEY_FILE_DESKTOP_KEY_TERMINAL "Terminal"
+#define G_KEY_FILE_DESKTOP_KEY_MIME_TYPE "MimeType"
+#define G_KEY_FILE_DESKTOP_KEY_CATEGORIES "Categories"
+#define G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY "StartupNotify"
+#define G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS "StartupWMClass"
+#define G_KEY_FILE_DESKTOP_KEY_URL "URL"
+
+#define G_KEY_FILE_DESKTOP_TYPE_APPLICATION "Application"
+#define G_KEY_FILE_DESKTOP_TYPE_LINK "Link"
+#define G_KEY_FILE_DESKTOP_TYPE_DIRECTORY "Directory"
+
+G_END_DECLS
+
+#endif /* __G_KEY_FILE_H__ */
diff --git a/trunk/glib/glib-mirroring-tab/Makefile b/trunk/glib/glib-mirroring-tab/Makefile
new file mode 100644
index 000000000..8ab193c17
--- /dev/null
+++ b/trunk/glib/glib-mirroring-tab/Makefile
@@ -0,0 +1,11 @@
+
+CFLAGS = `pkg-config --cflags glib-2.0`
+LIBS = `pkg-config --libs glib-2.0`
+
+
+all: gen-mirroring-tab
+
+gen-mirroring-tab: gen-mirroring-tab.o packtab.o
+
+clean:
+ $(RM) gen-mirroring-tab *.o
diff --git a/trunk/glib/glib-mirroring-tab/gen-mirroring-tab.c b/trunk/glib/glib-mirroring-tab/gen-mirroring-tab.c
new file mode 100644
index 000000000..6b1637657
--- /dev/null
+++ b/trunk/glib/glib-mirroring-tab/gen-mirroring-tab.c
@@ -0,0 +1,232 @@
+/* gen-mirroring-tab.c - generate gmirroringtable.h for glib
+ * copied from FriBidi.
+ *
+ * $Id$
+ * $Author$
+ * $Date$
+ * $Revision$
+ * $Source$
+ *
+ * Author:
+ * Behdad Esfahbod, 2001, 2002, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002,2004 Behdad Esfahbod
+ *
+ * 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.1 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, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ *
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <glib.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "packtab.h"
+
+#define appname "gen-mirroring-tab"
+#define outputname "gmirroringtable.h"
+
+static void
+die (
+ const char *msg
+)
+{
+ fprintf (stderr, appname ": %s\n", msg);
+ exit (1);
+}
+
+static void
+die2 (
+ const char *fmt,
+ const char *p
+)
+{
+ fprintf (stderr, appname ": ");
+ fprintf (stderr, fmt, p);
+ fprintf (stderr, "\n");
+ exit (1);
+}
+
+static void
+die4 (
+ const char *fmt,
+ unsigned long l,
+ unsigned long p,
+ unsigned long q
+)
+{
+ fprintf (stderr, appname ": ");
+ fprintf (stderr, fmt, l, p, q);
+ fprintf (stderr, "\n");
+ exit (1);
+}
+
+#define table_name "Mir"
+#define macro_name "GLIB_GET_MIRRORING"
+
+#define UNICODE_CHARS 0x110000
+
+static signed int table[UNICODE_CHARS];
+static char buf[4000];
+static signed long max_dist;
+
+static void
+init (
+ void
+)
+{
+ max_dist = 0;
+}
+
+static void
+clear_tab (
+ void
+)
+{
+ register gunichar c;
+
+ for (c = 0; c < UNICODE_CHARS; c++)
+ table[c] = 0;
+}
+
+static void
+init_tab_mirroring_txt (
+ void
+)
+{
+ clear_tab ();
+}
+
+static void
+read_bidi_mirroring_txt (
+ FILE *f
+)
+{
+ unsigned long l;
+
+ init_tab_mirroring_txt ();
+
+ l = 0;
+ while (fgets (buf, sizeof buf, f))
+ {
+ unsigned long i, j;
+ signed long dist;
+ int k;
+ const char *s = buf;
+
+ l++;
+
+ while (*s == ' ')
+ s++;
+
+ if (s[0] == '#' || s[0] == '\0' || s[0] == '\n')
+ continue;
+
+ k = sscanf (s, "%lx; %lx", &i, &j);
+ if (k != 2 || i >= UNICODE_CHARS || j >= UNICODE_CHARS)
+ die4 ("invalid pair in input at line %ld: %04lX, %04lX", l, i, j);
+ dist = ((signed long) j - (signed long) i);
+ table[i] = dist;
+ if (dist > max_dist)
+ max_dist = dist;
+ else if (-dist > max_dist)
+ max_dist = -dist;
+ }
+}
+
+static void
+read_data (
+ const char *data_file_type,
+ const char *data_file_name
+)
+{
+ FILE *f;
+
+ fprintf (stderr, "Reading `%s'\n", data_file_name);
+ if (!(f = fopen (data_file_name, "rt")))
+ die2 ("error: cannot open `%s' for reading", data_file_name);
+
+ if (!strcmp (data_file_type, "BidiMirroring.txt"))
+ read_bidi_mirroring_txt (f);
+ else
+ die2 ("error: unknown data-file-type %s", data_file_type);
+
+ fclose (f);
+}
+
+static void
+gen_mirroring_tab (
+ int max_depth,
+ const char *data_file_type
+)
+{
+ int key_bytes;
+ const char *key_type;
+
+ fprintf (stderr,
+ "Generating `" outputname "', it may take up to a few minutes\n");
+ printf ("/* " outputname "\n * generated by " appname " "
+ "\n" " * from the file %s of */\n\n", data_file_type);
+
+ printf ("#define PACKTAB_UINT8 guint8\n"
+ "#define PACKTAB_UINT16 guint16\n"
+ "#define PACKTAB_UINT32 guint32\n\n");
+
+ key_bytes = max_dist <= 0x7f ? 1 : max_dist < 0x7fff ? 2 : 4;
+ key_type = key_bytes == 1 ? "gint8" : key_bytes == 2 ?
+ "gint16" : "gint32";
+
+ if (!pack_table
+ (table, UNICODE_CHARS, key_bytes, 0, max_depth, 1, NULL,
+ key_type, table_name, macro_name "_DELTA", stdout))
+ die ("error: insufficient memory, decrease max_depth");
+
+ printf ("#undef PACKTAB_UINT8\n"
+ "#undef PACKTAB_UINT16\n" "#undef PACKTAB_UINT32\n\n");
+
+ printf ("#define " macro_name "(x) ((x) + " macro_name "_DELTA(x))\n\n");
+
+ printf ("/* End of generated " outputname " */\n");
+}
+
+int
+main (
+ int argc,
+ const char **argv
+)
+{
+ const char *data_file_type = "BidiMirroring.txt";
+
+ if (argc < 3)
+ die2 ("usage:\n " appname " max-lookups /path/to/%s [junk...]",
+ data_file_type);
+
+ {
+ int max_depth = atoi (argv[1]);
+ const char *data_file_name = argv[2];
+
+ if (max_depth < 2)
+ die ("invalid depth");
+
+ init ();
+ read_data (data_file_type, data_file_name);
+ gen_mirroring_tab (max_depth, data_file_type);
+ }
+
+ return 0;
+}
diff --git a/trunk/glib/glib-mirroring-tab/packtab.c b/trunk/glib/glib-mirroring-tab/packtab.c
new file mode 100644
index 000000000..7c0ff5db4
--- /dev/null
+++ b/trunk/glib/glib-mirroring-tab/packtab.c
@@ -0,0 +1,424 @@
+/* PackTab - Pack a static table
+ * Copyright (C) 2001 Behdad Esfahbod.
+ *
+ * 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.1 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, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ *
+ * For licensing issues, contact <fwpg@sharif.edu>.
+ */
+
+/*
+ 8 <= N <= 2^21
+ int key
+ 1 <= max_depth <= 21
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "packtab.h"
+
+typedef signed int uni_table[1024 * 1024 * 2];
+static int n, a, max_depth, digits, tab_width, per_row;
+static long N;
+signed int def_key;
+static uni_table temp, x, perm, *tab;
+static long pow[22], cluster, cmpcluster;
+static const char *const *name, *key_type_name, *table_name, *macro_name;
+static FILE *f;
+
+static long
+most_binary (
+ long min,
+ long max
+)
+{
+ /* min should be less than max */
+ register int i, ii;
+
+ if (min == max)
+ return max;
+
+ for (i = 21; max < pow[i]; i--)
+ ;
+ ii = i;
+ while (i && !((min ^ max) & pow[i]))
+ i--;
+
+ if (ii == i)
+ {
+ /* min is less than half of max */
+ for (i = 21 - 1; min < pow[i]; i--)
+ ;
+ i++;
+ return pow[i];
+ }
+
+ return max & (pow[i] - 1);
+}
+
+static void
+init (
+ const signed int *table
+)
+{
+ register int i;
+
+ /* initialize powers of two */
+ pow[0] = 1;
+ for (i = 1; i <= 21; i++)
+ pow[i] = pow[i - 1] << 1;
+
+ /* reduce number of elements to get a more binary number */
+ {
+ long essen;
+
+ /* find number of essential items */
+ essen = N - 1;
+ while (essen && table[essen] == def_key)
+ essen--;
+ essen++;
+
+ N = most_binary (essen, N);
+ }
+
+ for (n = 21; N % pow[n]; n--)
+ ;
+ digits = (n + 3) / 4;
+ for (i = 6; i; i--)
+ if (pow[i] * (tab_width + 1) < 80)
+ break;
+ per_row = pow[i];
+}
+
+static int
+compare (
+ const void *r,
+ const void *s
+)
+{
+ int i;
+ for (i = 0; i < cmpcluster; i++)
+ if (((int *) r)[i] != ((int *) s)[i])
+ return ((int *) r)[i] - ((int *) s)[i];
+ return 0;
+}
+
+static int lev, best_lev, p[22], best_p[22], nn;
+static long c[22], best_c[22], s, best_s;
+static long t[22], best_t[22], clusters[22], best_cluster[22];
+
+static void
+found (
+ void
+)
+{
+ int i;
+
+ if (s < best_s)
+ {
+ best_s = s;
+ best_lev = lev;
+ for (i = 0; i <= lev; i++)
+ {
+ best_p[i] = p[i];
+ best_c[i] = c[i];
+ best_t[i] = t[i];
+ best_cluster[i] = clusters[i];
+ }
+ }
+}
+
+static void
+bt (
+ int node_size
+)
+{
+ long i, j, k, y, sbak;
+ long key_bytes;
+
+ if (t[lev] == 1)
+ {
+ found ();
+ return;
+ }
+ if (lev == max_depth)
+ return;
+
+ for (i = 1 - t[lev] % 2; i <= nn + (t[lev] >> nn) % 2; i++)
+ {
+ nn -= (p[lev] = i);
+ clusters[lev] = cluster = (i && nn >= 0) ? pow[i] : t[lev];
+ cmpcluster = cluster + 1;
+
+ t[lev + 1] = (t[lev] - 1) / cluster + 1;
+ for (j = 0; j < t[lev + 1]; j++)
+ {
+ memmove (temp + j * cmpcluster, tab[lev] + j * cluster,
+ cluster * sizeof (tab[lev][0]));
+ temp[j * cmpcluster + cluster] = j;
+ }
+ qsort (temp, t[lev + 1], cmpcluster * sizeof (temp[0]), compare);
+ for (j = 0; j < t[lev + 1]; j++)
+ {
+ perm[j] = temp[j * cmpcluster + cluster];
+ temp[j * cmpcluster + cluster] = 0;
+ }
+ k = 1;
+ y = 0;
+ tab[lev + 1][perm[0]] = perm[0];
+ for (j = 1; j < t[lev + 1]; j++)
+ {
+ if (compare (temp + y, temp + y + cmpcluster))
+ {
+ k++;
+ tab[lev + 1][perm[j]] = perm[j];
+ }
+ else
+ tab[lev + 1][perm[j]] = tab[lev + 1][perm[j - 1]];
+ y += cmpcluster;
+ }
+ sbak = s;
+ s += k * node_size * cluster;
+ c[lev] = k;
+
+ if (s >= best_s)
+ {
+ s = sbak;
+ nn += i;
+ return;
+ }
+
+ key_bytes = k * cluster;
+ key_bytes = key_bytes < 0xff ? 1 : key_bytes < 0xffff ? 2 : 4;
+ lev++;
+ bt (key_bytes);
+ lev--;
+
+ s = sbak;
+ nn += i;
+ }
+}
+
+static void
+solve (
+ void
+)
+{
+ best_lev = max_depth + 2;
+ best_s = N * a * 2;
+ lev = 0;
+ s = 0;
+ nn = n;
+ t[0] = N;
+ bt (a);
+}
+
+static void
+write_array (
+ long max_key
+)
+{
+ int i, j, k, y, ii, ofs;
+ const char *key_type;
+
+ if (best_t[lev] == 1)
+ return;
+
+ nn -= (i = best_p[lev]);
+ cluster = best_cluster[lev];
+ cmpcluster = cluster + 1;
+
+ t[lev + 1] = best_t[lev + 1];
+ for (j = 0; j < t[lev + 1]; j++)
+ {
+ memmove (temp + j * cmpcluster, tab[lev] + j * cluster,
+ cluster * sizeof (tab[lev][0]));
+ temp[j * cmpcluster + cluster] = j;
+ }
+ qsort (temp, t[lev + 1], cmpcluster * sizeof (temp[0]), compare);
+ for (j = 0; j < t[lev + 1]; j++)
+ {
+ perm[j] = temp[j * cmpcluster + cluster];
+ temp[j * cmpcluster + cluster] = 0;
+ }
+ k = 1;
+ y = 0;
+ tab[lev + 1][perm[0]] = x[0] = perm[0];
+ for (j = 1; j < t[lev + 1]; j++)
+ {
+ if (compare (temp + y, temp + y + cmpcluster))
+ {
+ x[k] = perm[j];
+ tab[lev + 1][perm[j]] = x[k];
+ k++;
+ }
+ else
+ tab[lev + 1][perm[j]] = tab[lev + 1][perm[j - 1]];
+ y += cmpcluster;
+ }
+
+ i = 0;
+ for (ii = 1; ii < k; ii++)
+ if (x[ii] < x[i])
+ i = ii;
+
+ key_type = !lev ? key_type_name :
+ max_key <= 0xff ? "PACKTAB_UINT8" :
+ max_key <= 0xffff ? "PACKTAB_UINT16" : "PACKTAB_UINT32";
+ fprintf (f, "static const %s %sLev%d[%ld*%d] = {", key_type, table_name,
+ best_lev - lev - 1, cluster, k);
+ ofs = 0;
+ for (ii = 0; ii < k; ii++)
+ {
+ int kk, jj;
+ fprintf (f, "\n#define %sLev%d_%0*lX 0x%0X", table_name,
+ best_lev - lev - 1, digits, x[i] * pow[n - nn], ofs);
+ kk = x[i] * cluster;
+ if (!lev)
+ if (name)
+ for (j = 0; j < cluster; j++)
+ {
+ if (!(j % per_row) && j != cluster - 1)
+ fprintf (f, "\n ");
+ fprintf (f, "%*s,", tab_width, name[tab[lev][kk++]]);
+ }
+ else
+ for (j = 0; j < cluster; j++)
+ {
+ if (!(j % per_row) && j != cluster - 1)
+ fprintf (f, "\n ");
+ fprintf (f, "%*d,", tab_width, tab[lev][kk++]);
+ }
+ else
+ for (j = 0; j < cluster; j++, kk++)
+ fprintf (f, "\n %sLev%d_%0*lX, /* %0*lX..%0*lX */", table_name,
+ best_lev - lev, digits,
+ tab[lev][kk] * pow[n - nn - best_p[lev]], digits,
+ x[i] * pow[n - nn] + j * pow[n - nn - best_p[lev]], digits,
+ x[i] * pow[n - nn] + (j + 1) * pow[n - nn - best_p[lev]] -
+ 1);
+ ofs += cluster;
+ jj = i;
+ for (j = 0; j < k; j++)
+ if (x[j] > x[i] && (x[j] < x[jj] || jj == i))
+ jj = j;
+ i = jj;
+ }
+ fprintf (f, "\n};\n\n");
+ lev++;
+ write_array (cluster * k);
+ lev--;
+}
+
+static void
+write_source (
+ void
+)
+{
+ int i, j;
+
+ lev = 0;
+ s = 0;
+ nn = n;
+ t[0] = N;
+ fprintf (f, "\n" "/* *IND" "ENT-OFF* */\n\n");
+ write_array (0);
+ fprintf (f, "/* *IND" "ENT-ON* */\n\n");
+
+ fprintf (f, "#define %s(x) \\\n", macro_name);
+ fprintf (f, "\t((x) >= 0x%lx ? ", N);
+ if (name)
+ fprintf (f, "%s", name[def_key]);
+ else
+ fprintf (f, "%d", def_key);
+ fprintf (f, " : ");
+ j = 0;
+ for (i = best_lev - 1; i >= 0; i--)
+ {
+ fprintf (f, " \\\n\t%sLev%d[((x)", table_name, i);
+ if (j != 0)
+ fprintf (f, " >> %d", j);
+ if (i)
+ fprintf (f, " & 0x%02lx) +", pow[best_p[best_lev - 1 - i]] - 1);
+ j += best_p[best_lev - 1 - i];
+ }
+ fprintf (f, ")");
+ for (i = 0; i < best_lev; i++)
+ fprintf (f, "]");
+ fprintf (f, ")\n\n");
+}
+
+static void
+write_out (
+ void
+)
+{
+ int i;
+ fprintf (f, "/*\n"
+ " generated by packtab.c version %d\n\n"
+ " use %s(key) to access your table\n\n"
+ " assumed sizeof(%s): %d\n"
+ " required memory: %ld\n"
+ " lookups: %d\n"
+ " partition shape: %s",
+ packtab_version, macro_name, key_type_name, a, best_s, best_lev,
+ table_name);
+ for (i = best_lev - 1; i >= 0; i--)
+ fprintf (f, "[%ld]", best_cluster[i]);
+ fprintf (f, "\n" " different table entries:");
+ for (i = best_lev - 1; i >= 0; i--)
+ fprintf (f, " %ld", best_c[i]);
+ fprintf (f, "\n*/\n");
+ write_source ();
+}
+
+int
+pack_table (
+ const signed int *base,
+ long key_num,
+ int key_size,
+ signed int default_key,
+ int p_max_depth,
+ int p_tab_width,
+ const char *const *p_name,
+ const char *p_key_type_name,
+ const char *p_table_name,
+ const char *p_macro_name,
+ FILE *out
+)
+{
+ N = key_num;
+ a = key_size;
+ def_key = default_key;
+ max_depth = p_max_depth;
+ tab_width = p_tab_width;
+ name = p_name;
+ key_type_name = p_key_type_name;
+ table_name = p_table_name;
+ macro_name = p_macro_name;
+ f = out;
+ init (base);
+ if (!(tab = malloc ((n + 1) * sizeof (tab[0]))))
+ return 0;
+ memmove (tab[0], base, N * sizeof (base[0]));
+ solve ();
+ write_out ();
+ free (tab);
+ return 1;
+}
+
+/* End of packtab.c */
diff --git a/trunk/glib/glib-mirroring-tab/packtab.h b/trunk/glib/glib-mirroring-tab/packtab.h
new file mode 100644
index 000000000..7cab9be31
--- /dev/null
+++ b/trunk/glib/glib-mirroring-tab/packtab.h
@@ -0,0 +1,50 @@
+/* PackTab - Pack a static table
+ * Copyright (C) 2001 Behdad Esfahbod.
+ *
+ * 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.1 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, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ *
+ * For licensing issues, contact <fwpg@sharif.edu>.
+ */
+
+#ifndef PACKTAB_H
+#define PACKTAB_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define packtab_version 3
+
+ int pack_table (
+ const signed int *base,
+ long key_num,
+ int key_size,
+ signed int default_key,
+ int max_depth,
+ int tab_width,
+ const char *const *name,
+ const char *key_type_name,
+ const char *table_name,
+ const char *macro_name,
+ FILE *out
+ );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PACKTAB_H */
diff --git a/trunk/glib/glib-object.h b/trunk/glib/glib-object.h
new file mode 100644
index 000000000..8687ef1f2
--- /dev/null
+++ b/trunk/glib/glib-object.h
@@ -0,0 +1,41 @@
+/* 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__
+
+#define __GLIB_GOBJECT_H_INSIDE__
+
+/* topmost include file for GObject header files */
+#include <gobject/gboxed.h>
+#include <gobject/genums.h>
+#include <gobject/gobject.h>
+#include <gobject/gparam.h>
+#include <gobject/gparamspecs.h>
+#include <gobject/gsignal.h>
+#include <gobject/gsourceclosure.h>
+#include <gobject/gtype.h>
+#include <gobject/gtypemodule.h>
+#include <gobject/gtypeplugin.h>
+#include <gobject/gvalue.h>
+#include <gobject/gvaluearray.h>
+#include <gobject/gvaluetypes.h>
+
+#undef __GLIB_GOBJECT_H_INSIDE__
+
+#endif /* __GLIB_GOBJECT_H__ */
diff --git a/trunk/glib/glib.h b/trunk/glib/glib.h
new file mode 100644
index 000000000..b45d3b708
--- /dev/null
+++ b/trunk/glib/glib.h
@@ -0,0 +1,84 @@
+/* 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 <glib/galloca.h>
+#include <glib/garray.h>
+#include <glib/gasyncqueue.h>
+#include <glib/gatomic.h>
+#include <glib/gbacktrace.h>
+#include <glib/gbase64.h>
+#include <glib/gbookmarkfile.h>
+#include <glib/gcache.h>
+#include <glib/gcompletion.h>
+#include <glib/gconvert.h>
+#include <glib/gdataset.h>
+#include <glib/gdate.h>
+#include <glib/gdir.h>
+#include <glib/gerror.h>
+#include <glib/gfileutils.h>
+#include <glib/ghash.h>
+#include <glib/ghook.h>
+#include <glib/giochannel.h>
+#include <glib/gkeyfile.h>
+#include <glib/glist.h>
+#include <glib/gmacros.h>
+#include <glib/gmain.h>
+#include <glib/gmappedfile.h>
+#include <glib/gmarkup.h>
+#include <glib/gmem.h>
+#include <glib/gmessages.h>
+#include <glib/gnode.h>
+#include <glib/goption.h>
+#include <glib/gpattern.h>
+#include <glib/gprimes.h>
+#include <glib/gqsort.h>
+#include <glib/gquark.h>
+#include <glib/gqueue.h>
+#include <glib/grand.h>
+#include <glib/grel.h>
+#include <glib/gregex.h>
+#include <glib/gscanner.h>
+#include <glib/gsequence.h>
+#include <glib/gshell.h>
+#include <glib/gslist.h>
+#include <glib/gspawn.h>
+#include <glib/gstrfuncs.h>
+#include <glib/gstring.h>
+#include <glib/gthread.h>
+#include <glib/gthreadpool.h>
+#include <glib/gtimer.h>
+#include <glib/gtree.h>
+#include <glib/gtypes.h>
+#include <glib/gunicode.h>
+#include <glib/gutils.h>
+#ifdef G_PLATFORM_WIN32
+#include <glib/gwin32.h>
+#endif
+
+#endif /* __G_LIB_H__ */
diff --git a/trunk/glib/glib.rc.in b/trunk/glib/glib.rc.in
new file mode 100644
index 000000000..77596cc41
--- /dev/null
+++ b/trunk/glib/glib.rc.in
@@ -0,0 +1,30 @@
+#include <winver.h>
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0
+ PRODUCTVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0
+ FILEFLAGSMASK 0
+ FILEFLAGS 0
+ FILEOS VOS__WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE VFT2_UNKNOWN
+ BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "CompanyName", "The GLib developer community"
+ VALUE "FileDescription", "GLib"
+ VALUE "FileVersion", "@GLIB_VERSION@.0"
+ VALUE "InternalName", "libglib-2.0-@LT_CURRENT_MINUS_AGE@"
+ VALUE "LegalCopyright", "Copyright 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald. Modified by the GLib Team and others 1997-2004."
+ VALUE "OriginalFilename", "libglib-2.0-@LT_CURRENT_MINUS_AGE@.dll"
+ VALUE "ProductName", "GLib"
+ VALUE "ProductVersion", "@GLIB_VERSION@"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+ END
diff --git a/trunk/glib/glib.symbols b/trunk/glib/glib.symbols
new file mode 100644
index 000000000..a924b6ddd
--- /dev/null
+++ b/trunk/glib/glib.symbols
@@ -0,0 +1,1498 @@
+/* This file lists all exported symbols. It is used to generate
+ * the glib.def file used to control exports on Windows and the
+ * galias.h/galiasdef.c files used to avoid PLT entries for
+ * internal uses of exported functions (see makegalias.pl).
+ *
+ * Every symbol must be included in the right
+ * #ifdef IN_HEADER(sym) #endif and
+ * #ifdef IN_FILE(sym) #endif sections.
+ */
+#ifdef ALL_FILES
+#define IN_FILE(x) 1
+#define IN_HEADER(x) 1
+#endif
+#if IN_HEADER(__G_ARRAY_H__)
+#if IN_FILE(__G_ARRAY_C__)
+g_array_append_vals
+g_array_free
+g_array_insert_vals
+g_array_new
+g_array_prepend_vals
+g_array_remove_index
+g_array_remove_index_fast
+g_array_remove_range
+g_array_set_size
+g_array_sized_new
+g_array_sort
+g_array_sort_with_data
+g_byte_array_append
+g_byte_array_free
+g_byte_array_new
+g_byte_array_prepend
+g_byte_array_remove_index
+g_byte_array_remove_index_fast
+g_byte_array_remove_range
+g_byte_array_set_size
+g_byte_array_sized_new
+g_byte_array_sort
+g_byte_array_sort_with_data
+g_ptr_array_add
+g_ptr_array_foreach
+g_ptr_array_free
+g_ptr_array_new
+g_ptr_array_remove
+g_ptr_array_remove_fast
+g_ptr_array_remove_index
+g_ptr_array_remove_index_fast
+g_ptr_array_remove_range
+g_ptr_array_set_size
+g_ptr_array_sized_new
+g_ptr_array_sort
+g_ptr_array_sort_with_data
+#endif
+#endif
+
+#if IN_HEADER(__G_ASYNCQUEUE_H__)
+#if IN_FILE(__G_ASYNCQUEUE_C__)
+g_async_queue_length
+g_async_queue_length_unlocked
+g_async_queue_lock
+g_async_queue_new
+g_async_queue_pop
+g_async_queue_pop_unlocked
+g_async_queue_push
+g_async_queue_push_unlocked
+g_async_queue_push_sorted
+g_async_queue_push_sorted_unlocked
+g_async_queue_ref
+g_async_queue_sort
+g_async_queue_sort_unlocked
+g_async_queue_timed_pop
+g_async_queue_timed_pop_unlocked
+g_async_queue_try_pop
+g_async_queue_try_pop_unlocked
+g_async_queue_unlock
+g_async_queue_unref
+#ifndef G_DISABLE_DEPRECATED
+g_async_queue_ref_unlocked
+g_async_queue_unref_and_unlock
+#endif
+#endif
+#endif
+
+#if IN_HEADER(__G_ATOMIC_H__)
+#if IN_FILE(__G_ATOMIC_C__)
+g_atomic_int_add
+g_atomic_int_compare_and_exchange
+g_atomic_int_exchange_and_add
+g_atomic_pointer_compare_and_exchange
+#ifdef INCLUDE_INTERNAL_SYMBOLS
+ /* these are not internal, but we don't want to alias them */
+g_atomic_int_get
+g_atomic_pointer_get
+g_atomic_int_set
+g_atomic_pointer_set
+#endif
+#endif
+#endif
+
+#if IN_HEADER(__G_BACKTRACE_H__)
+#if IN_FILE(__G_BACKTRACE_C__)
+g_on_error_query
+g_on_error_stack_trace
+#endif
+#endif
+
+#if IN_HEADER(__G_BASE64_H__)
+#if IN_FILE(__G_BASE64_C__)
+g_base64_encode_step
+g_base64_encode_close
+g_base64_encode G_GNUC_MALLOC
+g_base64_decode_step
+g_base64_decode G_GNUC_MALLOC
+#endif
+#endif
+
+#if IN_HEADER(__G_BOOKMARK_FILE_H__)
+#if IN_FILE(__G_BOOKMARK_FILE_C__)
+g_bookmark_file_error_quark
+g_bookmark_file_new
+g_bookmark_file_free
+g_bookmark_file_load_from_file
+g_bookmark_file_load_from_data
+g_bookmark_file_load_from_data_dirs
+g_bookmark_file_to_data
+g_bookmark_file_to_file
+g_bookmark_file_set_title
+g_bookmark_file_get_title G_GNUC_MALLOC
+g_bookmark_file_set_description
+g_bookmark_file_get_description G_GNUC_MALLOC
+g_bookmark_file_set_mime_type
+g_bookmark_file_get_mime_type G_GNUC_MALLOC
+g_bookmark_file_set_groups
+g_bookmark_file_add_group
+g_bookmark_file_has_group
+g_bookmark_file_get_groups G_GNUC_MALLOC
+g_bookmark_file_add_application
+g_bookmark_file_has_application
+g_bookmark_file_get_applications G_GNUC_MALLOC
+g_bookmark_file_set_app_info
+g_bookmark_file_get_app_info
+g_bookmark_file_set_is_private
+g_bookmark_file_get_is_private
+g_bookmark_file_set_icon
+g_bookmark_file_get_icon
+g_bookmark_file_set_added
+g_bookmark_file_get_added
+g_bookmark_file_set_modified
+g_bookmark_file_get_modified
+g_bookmark_file_set_visited
+g_bookmark_file_get_visited
+g_bookmark_file_has_item
+g_bookmark_file_get_size
+g_bookmark_file_get_uris G_GNUC_MALLOC
+g_bookmark_file_remove_group
+g_bookmark_file_remove_application
+g_bookmark_file_remove_item
+g_bookmark_file_move_item
+#endif
+#endif
+
+#if IN_HEADER(__G_CACHE_H__)
+#if IN_FILE(__G_CACHE_C__)
+g_cache_destroy
+g_cache_insert
+g_cache_key_foreach
+g_cache_new
+g_cache_remove
+#ifndef G_DISABLE_DEPRECATED
+g_cache_value_foreach
+#endif
+#endif
+#endif
+
+#if IN_HEADER(__G_COMPLETION_H__)
+#if IN_FILE(__G_COMPLETION_C__)
+g_completion_add_items
+g_completion_clear_items
+g_completion_complete
+g_completion_complete_utf8
+g_completion_free
+g_completion_new
+g_completion_remove_items
+g_completion_set_compare
+#endif
+#endif
+
+#if IN_HEADER(__G_CONVERT_H__)
+#if IN_FILE(__G_CONVERT_C__)
+g_get_filename_charsets
+g_convert G_GNUC_MALLOC
+g_convert_error_quark
+g_convert_with_fallback G_GNUC_MALLOC
+g_convert_with_iconv G_GNUC_MALLOC
+g_iconv
+g_iconv_close
+g_iconv_open
+g_locale_from_utf8 G_GNUC_MALLOC
+g_locale_to_utf8 G_GNUC_MALLOC
+g_filename_display_name G_GNUC_MALLOC
+g_filename_display_basename G_GNUC_MALLOC
+g_filename_from_uri PRIVATE G_GNUC_MALLOC
+g_filename_from_utf8 PRIVATE G_GNUC_MALLOC
+g_filename_to_uri PRIVATE G_GNUC_MALLOC
+g_filename_to_utf8 PRIVATE G_GNUC_MALLOC
+#ifdef G_OS_WIN32
+g_filename_from_uri_utf8 G_GNUC_MALLOC
+g_filename_from_utf8_utf8
+g_filename_to_uri_utf8 G_GNUC_MALLOC
+g_filename_to_utf8_utf8
+#endif
+g_uri_list_extract_uris G_GNUC_MALLOC
+#endif
+#endif
+
+#if IN_HEADER(__G_DATASET_H__)
+#if IN_FILE(__G_DATASET_C__)
+g_datalist_clear
+g_datalist_foreach
+g_datalist_get_flags
+g_datalist_id_get_data
+g_datalist_id_remove_no_notify
+g_datalist_id_set_data_full
+g_datalist_set_flags
+g_datalist_unset_flags
+g_datalist_init
+g_dataset_destroy
+g_dataset_foreach
+g_dataset_id_get_data
+g_dataset_id_remove_no_notify
+g_dataset_id_set_data_full
+#endif
+#endif
+
+#if IN_HEADER(__G_QUARK_H__)
+#if IN_FILE(__G_DATASET_C__)
+g_quark_from_static_string
+g_quark_from_string
+g_quark_to_string G_GNUC_CONST
+g_quark_try_string
+g_intern_string
+g_intern_static_string
+#endif
+#endif
+
+#if IN_HEADER(__G_DATE_H__)
+#if IN_FILE(__G_DATE_C__)
+g_date_add_days
+g_date_add_months
+g_date_add_years
+g_date_clamp
+g_date_clear
+g_date_compare
+g_date_days_between
+g_date_free
+g_date_get_day
+g_date_get_day_of_year
+g_date_get_days_in_month
+g_date_get_iso8601_week_of_year
+g_date_get_julian
+g_date_get_monday_week_of_year
+g_date_get_monday_weeks_in_year G_GNUC_CONST
+g_date_get_month
+g_date_get_sunday_week_of_year
+g_date_get_sunday_weeks_in_year G_GNUC_CONST
+g_date_get_weekday
+g_date_get_year
+g_date_is_first_of_month
+g_date_is_last_of_month
+g_date_is_leap_year G_GNUC_CONST
+g_date_new
+g_date_new_dmy
+g_date_new_julian
+g_date_order
+g_date_set_day
+g_date_set_dmy
+g_date_set_julian
+g_date_set_month
+g_date_set_parse
+#ifndef G_DISABLE_DEPRECATED
+g_date_set_time
+#endif
+g_date_set_time_t
+g_date_set_time_val
+g_date_set_year
+g_date_strftime
+g_date_subtract_days
+g_date_subtract_months
+g_date_subtract_years
+g_date_to_struct_tm
+g_date_valid
+g_date_valid_day G_GNUC_CONST
+g_date_valid_dmy
+g_date_valid_julian G_GNUC_CONST
+g_date_valid_month G_GNUC_CONST
+g_date_valid_weekday G_GNUC_CONST
+g_date_valid_year G_GNUC_CONST
+#endif
+#endif
+
+#if IN_HEADER(__G_DIR_H__)
+#if IN_FILE(__G_DIR_C__)
+g_dir_close
+g_dir_open PRIVATE
+g_dir_read_name PRIVATE
+#ifdef G_OS_WIN32
+g_dir_open_utf8
+g_dir_read_name_utf8
+#endif
+g_dir_rewind
+#endif
+#endif
+
+#if IN_HEADER(__G_ERROR_H__)
+#if IN_FILE(__G_ERROR_C__)
+g_clear_error
+g_error_copy
+g_error_free
+g_error_matches
+g_error_new G_GNUC_PRINTF(3,4)
+g_error_new_literal
+g_propagate_error
+g_set_error G_GNUC_PRINTF(4,5)
+#endif
+#endif
+
+#if IN_HEADER(__G_FILEUTILS_H__)
+#if IN_FILE(__G_FILEUTILS_C__)
+g_build_filename G_GNUC_MALLOC G_GNUC_NULL_TERMINATED
+g_build_filenamev G_GNUC_MALLOC
+g_build_path G_GNUC_MALLOC G_GNUC_NULL_TERMINATED
+g_build_pathv G_GNUC_MALLOC
+g_file_error_from_errno
+g_file_error_quark
+g_file_get_contents PRIVATE
+g_file_set_contents
+g_file_open_tmp PRIVATE
+g_file_test PRIVATE
+g_file_read_link
+g_mkstemp PRIVATE
+g_mkdir_with_parents
+#ifdef G_OS_WIN32
+g_file_get_contents_utf8
+g_file_open_tmp_utf8
+g_file_test_utf8
+g_mkstemp_utf8
+#endif
+#endif
+#endif
+
+#if IN_HEADER(__G_HASH_H__)
+#if IN_FILE(__G_HASH_C__)
+g_hash_table_destroy
+g_hash_table_unref
+g_hash_table_ref
+g_hash_table_find
+g_hash_table_foreach
+g_hash_table_foreach_remove
+g_hash_table_foreach_steal
+g_hash_table_get_keys
+g_hash_table_get_values
+g_hash_table_insert
+g_hash_table_lookup
+g_hash_table_lookup_extended
+g_hash_table_new
+g_hash_table_new_full
+g_hash_table_remove
+g_hash_table_remove_all
+g_hash_table_replace
+g_hash_table_size
+g_hash_table_steal
+g_hash_table_steal_all
+#endif
+#endif
+
+#if IN_HEADER(__G_HOOK_H__)
+#if IN_FILE(__G_HOOK_C__)
+g_hook_alloc
+g_hook_compare_ids
+g_hook_destroy
+g_hook_destroy_link
+g_hook_find
+g_hook_find_data
+g_hook_find_func
+g_hook_find_func_data
+g_hook_first_valid
+g_hook_free
+g_hook_get
+g_hook_insert_before
+g_hook_insert_sorted
+g_hook_list_clear
+g_hook_list_init
+g_hook_list_invoke
+g_hook_list_invoke_check
+g_hook_list_marshal
+g_hook_list_marshal_check
+g_hook_next_valid
+g_hook_prepend
+g_hook_ref
+g_hook_unref
+#endif
+#endif
+
+#if IN_HEADER(__G_IOCHANNEL_H__)
+#if IN_FILE(__G_IOCHANNEL_C__)
+g_io_add_watch
+g_io_add_watch_full
+g_io_create_watch
+g_io_channel_error_from_errno
+g_io_channel_error_quark
+g_io_channel_flush
+g_io_channel_get_buffer_condition
+g_io_channel_get_buffered
+g_io_channel_get_buffer_size
+g_io_channel_get_close_on_unref
+g_io_channel_get_encoding
+g_io_channel_get_flags
+g_io_channel_get_line_term
+g_io_channel_init
+g_io_channel_read_chars
+g_io_channel_read_line
+g_io_channel_read_line_string
+g_io_channel_read_to_end
+g_io_channel_read_unichar
+g_io_channel_ref
+g_io_channel_seek_position
+g_io_channel_set_buffered
+g_io_channel_set_buffer_size
+g_io_channel_set_close_on_unref
+g_io_channel_set_encoding
+g_io_channel_set_flags
+g_io_channel_set_line_term
+g_io_channel_shutdown
+g_io_channel_unref
+#ifndef G_DISABLE_DEPRECATED
+g_io_channel_close
+g_io_channel_read
+g_io_channel_seek
+g_io_channel_write
+#endif
+g_io_channel_write_chars
+g_io_channel_write_unichar
+#endif
+#endif
+
+#if IN_HEADER(__G_IOCHANNEL_H__)
+#if IN_FILE(__G_IO_UNIX_C__)
+#ifdef G_OS_UNIX
+g_io_channel_unix_get_fd
+g_io_channel_unix_new
+g_io_channel_new_file PRIVATE
+#endif
+#endif
+#endif
+
+#if IN_HEADER(__G_IOCHANNEL_H__)
+#if IN_FILE(__G_IO_WIN32_C__)
+#ifdef G_OS_WIN32
+g_io_channel_unix_get_fd
+g_io_channel_unix_new
+g_io_channel_new_file PRIVATE
+g_io_channel_new_file_utf8
+g_io_channel_win32_get_fd
+g_io_channel_win32_make_pollfd
+g_io_channel_win32_new_fd
+g_io_channel_win32_new_messages
+g_io_channel_win32_new_socket
+g_io_channel_win32_new_stream_socket
+g_io_channel_win32_poll
+g_io_channel_win32_set_debug
+#endif
+#endif
+#endif
+
+#if IN_HEADER(__G_KEY_FILE_H__)
+#if IN_FILE(__G_KEY_FILE_C__)
+g_key_file_error_quark
+g_key_file_free
+g_key_file_get_boolean
+g_key_file_get_boolean_list G_GNUC_MALLOC
+g_key_file_get_comment G_GNUC_MALLOC
+g_key_file_get_groups G_GNUC_MALLOC
+g_key_file_get_double
+g_key_file_get_double_list G_GNUC_MALLOC
+g_key_file_get_integer
+g_key_file_get_integer_list G_GNUC_MALLOC
+g_key_file_get_keys G_GNUC_MALLOC
+g_key_file_get_locale_string G_GNUC_MALLOC
+g_key_file_get_locale_string_list G_GNUC_MALLOC
+g_key_file_get_start_group G_GNUC_MALLOC
+g_key_file_get_string G_GNUC_MALLOC
+g_key_file_get_string_list G_GNUC_MALLOC
+g_key_file_get_value G_GNUC_MALLOC
+g_key_file_has_group
+g_key_file_has_key
+g_key_file_load_from_dirs
+g_key_file_load_from_data
+g_key_file_load_from_data_dirs
+g_key_file_load_from_file
+g_key_file_new
+g_key_file_remove_comment
+g_key_file_remove_group
+g_key_file_remove_key
+g_key_file_set_boolean
+g_key_file_set_boolean_list
+g_key_file_set_comment
+g_key_file_set_double
+g_key_file_set_double_list
+g_key_file_set_integer
+g_key_file_set_integer_list
+g_key_file_set_list_separator
+g_key_file_set_locale_string
+g_key_file_set_locale_string_list
+g_key_file_set_string
+g_key_file_set_string_list
+g_key_file_set_value
+g_key_file_to_data G_GNUC_MALLOC
+#endif
+#endif
+
+#if IN_HEADER(__G_LIST_H__)
+#if IN_FILE(__G_LIST_C__)
+g_list_alloc
+g_list_append
+g_list_concat
+g_list_copy
+g_list_delete_link
+g_list_find
+g_list_find_custom
+g_list_first
+g_list_foreach
+g_list_free
+g_list_free_1
+g_list_index
+g_list_insert
+g_list_insert_before
+g_list_insert_sorted
+g_list_insert_sorted_with_data
+g_list_last
+g_list_length
+g_list_nth
+g_list_nth_data
+g_list_nth_prev
+#ifndef G_DISABLE_DEPRECATED
+g_list_pop_allocator
+#endif
+g_list_position
+g_list_prepend
+#ifndef G_DISABLE_DEPRECATED
+g_list_push_allocator
+#endif
+g_list_remove
+g_list_remove_all
+g_list_remove_link
+g_list_reverse
+g_list_sort
+g_list_sort_with_data
+#endif
+#endif
+
+#if IN_HEADER(__G_MAIN_H__)
+#if IN_FILE(__G_MAIN_C__)
+g_child_watch_add
+g_child_watch_add_full
+g_child_watch_source_new
+g_get_current_time
+g_main_context_acquire
+g_main_context_add_poll
+g_main_context_check
+g_main_context_default
+g_main_context_dispatch
+g_main_context_find_source_by_funcs_user_data
+g_main_context_find_source_by_id
+g_main_context_find_source_by_user_data
+g_main_context_get_poll_func
+g_main_context_is_owner
+g_main_context_iteration
+g_main_context_new
+g_main_context_pending
+g_main_context_prepare
+g_main_context_query
+g_main_context_ref
+g_main_context_release
+g_main_context_remove_poll
+g_main_context_set_poll_func
+g_main_context_unref
+g_main_context_wait
+g_main_context_wakeup
+g_main_depth
+g_main_current_source
+g_main_loop_get_context
+g_main_loop_is_running
+g_main_loop_new
+g_main_loop_quit
+g_main_loop_ref
+g_main_loop_run
+g_main_loop_unref
+g_source_add_poll
+g_source_attach
+g_source_destroy
+g_source_get_can_recurse
+g_source_get_context
+g_source_get_current_time
+g_source_get_id
+g_source_get_priority
+g_source_new
+g_source_ref
+g_source_remove
+g_source_remove_by_funcs_user_data
+g_source_remove_by_user_data
+g_source_remove_poll
+g_source_set_callback
+g_source_set_callback_indirect
+g_source_set_can_recurse
+g_source_set_funcs
+g_source_is_destroyed
+g_source_set_priority
+g_source_unref
+g_idle_add
+g_idle_add_full
+g_idle_remove_by_data
+g_idle_source_new
+g_timeout_add
+g_timeout_add_seconds
+g_timeout_add_full
+g_timeout_source_new
+g_timeout_source_new_seconds
+#endif
+#endif
+
+#if IN_HEADER(__G_MAPPED_FILE_H__)
+#if IN_FILE(__G_MAPPED_FILE_C__)
+g_mapped_file_new G_GNUC_MALLOC
+g_mapped_file_get_length
+g_mapped_file_get_contents
+g_mapped_file_free
+#endif
+#endif
+
+#if IN_HEADER(__G_MARKUP_H__)
+#if IN_FILE(__G_MARKUP_C__)
+g_markup_error_quark
+g_markup_escape_text
+g_markup_parse_context_end_parse
+g_markup_parse_context_free
+g_markup_parse_context_get_element
+g_markup_parse_context_get_position
+g_markup_parse_context_new
+g_markup_parse_context_parse
+g_markup_printf_escaped G_GNUC_PRINTF(1,2)
+g_markup_vprintf_escaped
+#endif
+#endif
+
+#if IN_HEADER(__G_MEM_H__)
+#if IN_FILE(__G_MEM_C__)
+g_free
+g_malloc G_GNUC_MALLOC
+g_malloc0 G_GNUC_MALLOC
+g_mem_is_system_malloc
+g_mem_profile
+g_mem_set_vtable
+g_realloc
+g_try_malloc G_GNUC_MALLOC
+g_try_malloc0 G_GNUC_MALLOC
+g_try_realloc
+#ifndef G_DISABLE_DEPRECATED
+g_allocator_free
+g_allocator_new
+g_mem_chunk_alloc
+g_mem_chunk_alloc0
+g_mem_chunk_clean
+g_mem_chunk_destroy
+g_mem_chunk_free
+g_mem_chunk_info
+g_mem_chunk_new
+g_mem_chunk_print
+g_mem_chunk_reset
+g_blow_chunks
+#endif
+#endif
+#endif
+
+#if IN_HEADER(__G_SLICE_H__)
+#if IN_FILE(__G_SLICE_C__)
+g_slice_alloc G_GNUC_MALLOC
+g_slice_alloc0 G_GNUC_MALLOC
+g_slice_free1
+g_slice_free_chain_with_offset
+g_slice_set_config
+g_slice_get_config
+g_slice_get_config_state
+#ifdef INCLUDE_INTERNAL_SYMBOLS
+g_slice_debug_tree_statistics
+#endif
+#endif
+#endif
+
+#if IN_HEADER(__G_MESSAGES_H__)
+#if IN_FILE(__G_MESSAGES_C__)
+g_printf_string_upper_bound
+g_log G_GNUC_PRINTF(3,4)
+g_log_default_handler
+g_log_remove_handler
+g_log_set_always_fatal
+g_log_set_default_handler
+g_log_set_fatal_mask
+g_log_set_handler
+g_logv
+g_return_if_fail_warning
+g_assert_warning G_GNUC_NORETURN
+g_print G_GNUC_PRINTF(1,2)
+g_printerr G_GNUC_PRINTF(1,2)
+g_set_printerr_handler
+g_set_print_handler
+#endif
+#endif
+
+#if IN_HEADER(__G_NODE_H__)
+#if IN_FILE(__G_NODE_C__)
+g_node_child_index
+g_node_child_position
+g_node_children_foreach
+g_node_copy
+g_node_copy_deep
+g_node_depth
+g_node_destroy
+g_node_find
+g_node_find_child
+g_node_first_sibling
+g_node_get_root
+g_node_insert
+g_node_insert_after
+g_node_insert_before
+g_node_is_ancestor
+g_node_last_child
+g_node_last_sibling
+g_node_max_height
+g_node_n_children
+g_node_new
+g_node_n_nodes
+g_node_nth_child
+#ifndef G_DISABLE_DEPRECATED
+g_node_pop_allocator
+#endif
+g_node_prepend
+#ifndef G_DISABLE_DEPRECATED
+g_node_push_allocator
+#endif
+g_node_reverse_children
+g_node_traverse
+g_node_unlink
+#endif
+#endif
+
+#if IN_HEADER(__G_OPTION_H__)
+#if IN_FILE(__G_OPTION_C__)
+g_option_context_add_group
+g_option_context_add_main_entries
+g_option_error_quark
+g_option_context_free
+g_option_context_get_description
+g_option_context_get_help_enabled
+g_option_context_get_ignore_unknown_options
+g_option_context_get_main_group
+g_option_context_get_summary
+g_option_context_new
+g_option_context_parse
+g_option_context_set_description
+g_option_context_set_help_enabled
+g_option_context_set_ignore_unknown_options
+g_option_context_set_main_group
+g_option_context_set_summary
+g_option_context_set_translate_func
+g_option_context_set_translation_domain
+g_option_context_get_help
+g_option_group_add_entries
+g_option_group_free
+g_option_group_new
+g_option_group_set_error_hook
+g_option_group_set_parse_hooks
+g_option_group_set_translate_func
+g_option_group_set_translation_domain
+#endif
+#endif
+
+#if IN_HEADER(__G_PATTERN_H__)
+#if IN_FILE(__G_PATTERN_C__)
+g_pattern_match
+g_pattern_match_simple
+g_pattern_match_string
+g_pattern_spec_equal
+g_pattern_spec_free
+g_pattern_spec_new
+#endif
+#endif
+
+#if IN_HEADER(__G_PRIMES_H__)
+#if IN_FILE(__G_PRIMES_C__)
+g_spaced_primes_closest G_GNUC_CONST
+#endif
+#endif
+
+#if IN_HEADER(__G_PRINTF_H__)
+#if IN_FILE(__G_PRINTF_C__)
+g_fprintf G_GNUC_PRINTF(2,3)
+g_printf G_GNUC_PRINTF(1,2)
+g_sprintf G_GNUC_PRINTF(2,3)
+g_vasprintf
+g_vfprintf
+g_vprintf
+g_vsprintf
+#endif
+#endif
+
+#if IN_HEADER(__G_UTILS_H__)
+#if IN_FILE(__G_PRINTF_C__)
+g_snprintf G_GNUC_PRINTF(3,4)
+g_vsnprintf
+#endif
+#endif
+
+#if IN_HEADER(__G_QSORT_H__)
+#if IN_FILE(__G_QSORT_C__)
+g_qsort_with_data
+#endif
+#endif
+
+#if IN_HEADER(__G_QUEUE_H__)
+#if IN_FILE(__G_QUEUE_C__)
+g_queue_clear
+g_queue_copy
+g_queue_delete_link
+g_queue_find
+g_queue_find_custom
+g_queue_foreach
+g_queue_free
+g_queue_get_length
+g_queue_index
+g_queue_init
+g_queue_insert_after
+g_queue_insert_before
+g_queue_insert_sorted
+g_queue_is_empty
+g_queue_link_index
+g_queue_new
+g_queue_peek_head
+g_queue_peek_head_link
+g_queue_peek_nth
+g_queue_peek_nth_link
+g_queue_peek_tail
+g_queue_peek_tail_link
+g_queue_pop_head
+g_queue_pop_head_link
+g_queue_pop_nth
+g_queue_pop_nth_link
+g_queue_pop_tail
+g_queue_pop_tail_link
+g_queue_push_head
+g_queue_push_head_link
+g_queue_push_nth
+g_queue_push_nth_link
+g_queue_push_tail
+g_queue_push_tail_link
+g_queue_remove
+g_queue_remove_all
+g_queue_reverse
+g_queue_sort
+g_queue_unlink
+#endif
+#endif
+
+#if IN_HEADER(__G_RAND_H__)
+#if IN_FILE(__G_RAND_C__)
+g_rand_copy
+g_rand_double
+g_rand_double_range
+g_rand_free
+g_rand_int
+g_rand_int_range
+g_rand_new
+g_rand_new_with_seed
+g_rand_new_with_seed_array
+g_random_double
+g_random_double_range
+g_random_int
+g_random_int_range
+g_random_set_seed
+g_rand_set_seed
+g_rand_set_seed_array
+#endif
+#endif
+
+#if IN_HEADER(__G_REL_H__)
+#if IN_FILE(__G_REL_C__)
+g_relation_count
+g_relation_delete
+g_relation_destroy
+g_relation_exists
+g_relation_index
+g_relation_insert
+g_relation_new
+g_relation_print
+g_relation_select
+g_tuples_destroy
+g_tuples_index
+#endif
+#endif
+
+#if IN_HEADER(__G_SCANNER_H__)
+#if IN_FILE(__G_SCANNER_C__)
+g_scanner_cur_line
+g_scanner_cur_position
+g_scanner_cur_token
+g_scanner_cur_value
+g_scanner_destroy
+g_scanner_eof
+g_scanner_error G_GNUC_PRINTF(2,3)
+g_scanner_get_next_token
+g_scanner_input_file
+g_scanner_input_text
+g_scanner_lookup_symbol
+g_scanner_new
+g_scanner_peek_next_token
+g_scanner_scope_add_symbol
+g_scanner_scope_foreach_symbol
+g_scanner_scope_lookup_symbol
+g_scanner_scope_remove_symbol
+g_scanner_set_scope
+g_scanner_sync_file_offset
+g_scanner_unexp_token
+g_scanner_warn G_GNUC_PRINTF(2,3)
+#endif
+#endif
+
+#if IN_HEADER(__G_SEQUENCE_H__)
+#if IN_FILE(__G_SEQUENCE_C__)
+g_sequence_new
+g_sequence_free
+g_sequence_get_length
+g_sequence_foreach
+g_sequence_foreach_range
+g_sequence_sort
+g_sequence_sort_iter
+g_sequence_get_begin_iter
+g_sequence_get_end_iter
+g_sequence_get_iter_at_pos
+g_sequence_append
+g_sequence_prepend
+g_sequence_insert_before
+g_sequence_move
+g_sequence_swap
+g_sequence_insert_sorted
+g_sequence_insert_sorted_iter
+g_sequence_sort_changed
+g_sequence_sort_changed_iter
+g_sequence_remove
+g_sequence_remove_range
+g_sequence_move_range
+g_sequence_search
+g_sequence_search_iter
+g_sequence_get
+g_sequence_set
+g_sequence_iter_is_begin
+g_sequence_iter_is_end
+g_sequence_iter_next
+g_sequence_iter_prev
+g_sequence_iter_get_position
+g_sequence_iter_move
+g_sequence_iter_get_sequence
+g_sequence_iter_compare
+g_sequence_range_get_midpoint
+#endif
+#endif
+
+#if IN_HEADER(__G_SHELL_H__)
+#if IN_FILE(__G_SHELL_C__)
+g_shell_error_quark
+g_shell_parse_argv
+g_shell_quote
+g_shell_unquote
+#endif
+#endif
+
+#if IN_HEADER(__G_SLIST_H__)
+#if IN_FILE(__G_SLIST_C__)
+g_slist_alloc
+g_slist_append
+g_slist_concat
+g_slist_copy
+g_slist_delete_link
+g_slist_find
+g_slist_find_custom
+g_slist_foreach
+g_slist_free
+g_slist_free_1
+g_slist_index
+g_slist_insert
+g_slist_insert_before
+g_slist_insert_sorted
+g_slist_insert_sorted_with_data
+g_slist_last
+g_slist_length
+g_slist_nth
+g_slist_nth_data
+#ifndef G_DISABLE_DEPRECATED
+g_slist_pop_allocator
+#endif
+g_slist_position
+g_slist_prepend
+#ifndef G_DISABLE_DEPRECATED
+g_slist_push_allocator
+#endif
+g_slist_remove
+g_slist_remove_all
+g_slist_remove_link
+g_slist_reverse
+g_slist_sort
+g_slist_sort_with_data
+#endif
+#endif
+
+#if IN_HEADER(__G_SPAWN_H__)
+#if IN_FILE(__G_SPAWN_C__)
+g_spawn_async PRIVATE
+g_spawn_async_with_pipes PRIVATE
+g_spawn_close_pid
+g_spawn_command_line_async PRIVATE
+g_spawn_command_line_sync PRIVATE
+g_spawn_error_quark
+g_spawn_sync PRIVATE
+#ifdef G_OS_WIN32
+g_spawn_async_utf8
+g_spawn_async_with_pipes_utf8
+g_spawn_command_line_async_utf8
+g_spawn_command_line_sync_utf8
+g_spawn_sync_utf8
+#endif
+#endif
+#endif
+
+#if IN_HEADER(__G_STDIO_H__)
+#if IN_FILE(__G_STDIO_C__)
+#if !defined(G_OS_UNIX) || defined(G_STDIO_NO_WRAP_ON_UNIX)
+/* gstdio wrappers */
+g_chmod
+g_open
+g_creat
+g_rename
+g_mkdir
+g_stat
+g_lstat
+g_remove
+g_fopen
+g_freopen
+#endif
+g_access
+g_chdir
+g_unlink
+g_rmdir
+#endif
+#endif
+
+#if IN_HEADER(__G_STRFUNCS_H__)
+#if IN_FILE(__G_STRFUNCS_C__)
+g_ascii_digit_value G_GNUC_CONST
+g_ascii_dtostr
+g_ascii_formatd
+g_ascii_strdown G_GNUC_MALLOC
+g_ascii_strtod
+g_ascii_strtoull
+g_ascii_strtoll
+g_ascii_strup G_GNUC_MALLOC
+g_ascii_tolower G_GNUC_CONST
+g_ascii_toupper G_GNUC_CONST
+g_ascii_xdigit_value G_GNUC_CONST
+g_ascii_strcasecmp
+g_ascii_strncasecmp
+g_memdup G_GNUC_MALLOC
+g_stpcpy
+g_strcanon
+g_strchomp
+g_strchug
+g_strcompress G_GNUC_MALLOC
+g_strconcat G_GNUC_MALLOC G_GNUC_NULL_TERMINATED
+g_strdelimit
+g_strdup G_GNUC_MALLOC
+g_strdup_printf G_GNUC_PRINTF(1,2) G_GNUC_MALLOC
+g_strdupv G_GNUC_MALLOC
+g_strdup_vprintf G_GNUC_MALLOC
+g_strerror G_GNUC_CONST
+g_strescape G_GNUC_MALLOC
+g_strfreev
+g_str_has_prefix
+g_str_has_suffix
+g_strjoin G_GNUC_MALLOC G_GNUC_NULL_TERMINATED
+g_strjoinv G_GNUC_MALLOC
+g_strlcat
+g_strlcpy
+g_strndup G_GNUC_MALLOC
+g_strnfill G_GNUC_MALLOC
+g_strreverse
+g_strrstr
+g_strrstr_len
+g_strsignal G_GNUC_CONST
+g_strsplit G_GNUC_MALLOC
+g_strsplit_set G_GNUC_MALLOC
+g_strstr_len
+g_strtod
+#ifndef G_DISABLE_DEPRECATED
+g_strcasecmp
+g_strncasecmp
+g_strup
+g_strdown
+#endif
+g_strv_length
+g_strip_context
+#endif
+#endif
+
+#if IN_HEADER(__G_STRING_H__)
+#if IN_FILE(__G_STRING_C__)
+g_string_append
+g_string_append_len
+g_string_append_printf G_GNUC_PRINTF(2,3)
+g_string_append_unichar
+g_string_ascii_down
+g_string_ascii_up
+g_string_assign
+g_string_chunk_free
+g_string_chunk_clear
+g_string_chunk_insert
+g_string_chunk_insert_const
+g_string_chunk_insert_len
+g_string_chunk_new
+g_string_equal
+g_string_erase
+g_string_free
+g_string_hash
+g_string_insert
+g_string_insert_c
+g_string_insert_len
+g_string_insert_unichar
+g_string_new
+g_string_new_len
+g_string_prepend
+g_string_prepend_c
+g_string_prepend_len
+g_string_prepend_unichar
+g_string_printf G_GNUC_PRINTF(2,3)
+g_string_set_size
+g_string_sized_new
+g_string_truncate
+#ifndef G_DISABLE_DEPRECATED
+g_string_down
+g_string_up
+#endif
+#ifdef INCLUDE_INTERNAL_SYMBOLS
+ /* these are not internal, but we don't want to alias them */
+g_string_append_c
+#endif
+g_str_equal
+g_str_hash
+#endif
+#endif
+
+#if IN_HEADER(__G_THREAD_H__)
+#if IN_FILE(__G_THREAD_C__)
+g_once_impl
+#ifdef INCLUDE_INTERNAL_SYMBOLS
+g_thread_init_glib
+#endif
+#ifdef INCLUDE_VARIABLES
+g_thread_functions_for_glib_use
+g_threads_got_initialized
+g_thread_use_default_impl
+g_thread_gettime
+#endif
+g_thread_create_full
+g_thread_error_quark
+g_thread_exit
+g_thread_join
+g_thread_self
+g_thread_set_priority
+g_static_mutex_free
+g_static_mutex_get_mutex_impl
+g_static_mutex_init
+g_static_private_free
+g_static_private_get
+g_static_private_init
+g_static_private_set
+g_static_rec_mutex_free
+g_static_rec_mutex_init
+g_static_rec_mutex_lock
+g_static_rec_mutex_lock_full
+g_static_rec_mutex_trylock
+g_static_rec_mutex_unlock
+g_static_rec_mutex_unlock_full
+g_static_rw_lock_free
+g_static_rw_lock_init
+g_static_rw_lock_reader_lock
+g_static_rw_lock_reader_trylock
+g_static_rw_lock_reader_unlock
+g_static_rw_lock_writer_lock
+g_static_rw_lock_writer_trylock
+g_static_rw_lock_writer_unlock
+g_thread_foreach
+#endif
+#endif
+
+#if IN_HEADER(__G_THREADPOOL_H__)
+#if IN_FILE(__G_THREADPOOL_C__)
+g_thread_pool_free
+g_thread_pool_get_max_threads
+g_thread_pool_get_max_unused_threads
+g_thread_pool_get_max_idle_time
+g_thread_pool_get_num_threads
+g_thread_pool_get_num_unused_threads
+g_thread_pool_new
+g_thread_pool_push
+g_thread_pool_set_max_threads
+g_thread_pool_set_max_unused_threads
+g_thread_pool_set_max_idle_time
+g_thread_pool_stop_unused_threads
+g_thread_pool_unprocessed
+g_thread_pool_set_sort_function
+#endif
+#endif
+
+#if IN_HEADER(__G_TIMER_H__)
+#if IN_FILE(__G_TIMER_C__)
+g_timer_continue
+g_timer_destroy
+g_timer_elapsed
+g_timer_new
+g_timer_reset
+g_timer_start
+g_timer_stop
+g_time_val_add
+g_time_val_from_iso8601
+g_time_val_to_iso8601 G_GNUC_MALLOC
+g_usleep
+#endif
+#endif
+
+#if IN_HEADER(__G_TREE_H__)
+#if IN_FILE(__G_TREE_C__)
+g_tree_destroy
+g_tree_foreach
+g_tree_height
+g_tree_insert
+g_tree_lookup
+g_tree_lookup_extended
+g_tree_new
+g_tree_new_full
+g_tree_new_with_data
+g_tree_nnodes
+g_tree_remove
+g_tree_replace
+g_tree_search
+g_tree_steal
+#ifndef G_DISABLE_DEPRECATED
+g_tree_traverse
+#endif
+#endif
+#endif
+
+#if IN_HEADER(__G_UNICODE_H__)
+#if IN_FILE(__G_UNIBREAK_C__)
+g_unichar_break_type G_GNUC_CONST
+#endif
+#endif
+
+#if IN_HEADER(__G_UNICODE_H__)
+#if IN_FILE(__G_UNICOLLATE_C__)
+g_utf8_collate
+g_utf8_collate_key G_GNUC_MALLOC
+g_utf8_collate_key_for_filename G_GNUC_MALLOC
+#endif
+#endif
+
+#if IN_HEADER(__G_UNICODE_H__)
+#if IN_FILE(__G_UNIDECOMP_C__)
+g_unicode_canonical_decomposition G_GNUC_MALLOC
+g_unicode_canonical_ordering
+g_utf8_normalize
+#endif
+#endif
+
+#if IN_HEADER(__G_UNICODE_H__)
+#if IN_FILE(__G_UNIPROP_C__)
+g_unichar_isalnum G_GNUC_CONST
+g_unichar_isalpha G_GNUC_CONST
+g_unichar_iscntrl G_GNUC_CONST
+g_unichar_isdefined G_GNUC_CONST
+g_unichar_isdigit G_GNUC_CONST
+g_unichar_isgraph G_GNUC_CONST
+g_unichar_islower G_GNUC_CONST
+g_unichar_isprint G_GNUC_CONST
+g_unichar_ispunct G_GNUC_CONST
+g_unichar_isspace G_GNUC_CONST
+g_unichar_istitle G_GNUC_CONST
+g_unichar_isupper G_GNUC_CONST
+g_unichar_iswide G_GNUC_CONST
+g_unichar_iswide_cjk G_GNUC_CONST
+g_unichar_isxdigit G_GNUC_CONST
+g_unichar_iszerowidth G_GNUC_CONST
+g_unichar_tolower G_GNUC_CONST
+g_unichar_totitle G_GNUC_CONST
+g_unichar_toupper G_GNUC_CONST
+g_unichar_ismark G_GNUC_CONST
+g_unichar_get_mirror_char
+g_unichar_get_script
+g_unichar_digit_value G_GNUC_CONST
+g_unichar_xdigit_value G_GNUC_CONST
+g_unichar_type G_GNUC_CONST
+g_utf8_casefold G_GNUC_MALLOC
+g_utf8_strup G_GNUC_MALLOC
+g_utf8_strdown G_GNUC_MALLOC
+#endif
+#endif
+
+#if IN_HEADER(__G_UNICODE_H__)
+#if IN_FILE(__G_UTF8_C__)
+g_get_charset
+g_ucs4_to_utf16 G_GNUC_MALLOC
+g_ucs4_to_utf8 G_GNUC_MALLOC
+g_utf16_to_ucs4 G_GNUC_MALLOC
+g_utf16_to_utf8 G_GNUC_MALLOC
+g_utf8_find_next_char
+g_utf8_find_prev_char
+g_utf8_get_char
+g_utf8_get_char_validated
+g_utf8_offset_to_pointer
+g_utf8_pointer_to_offset
+g_utf8_prev_char
+g_utf8_strchr
+g_utf8_strlen
+g_utf8_strncpy
+g_utf8_strrchr
+g_utf8_strreverse
+g_utf8_to_ucs4 G_GNUC_MALLOC
+g_utf8_to_ucs4_fast G_GNUC_MALLOC
+g_utf8_to_utf16 G_GNUC_MALLOC
+g_utf8_validate
+g_unichar_to_utf8
+g_unichar_validate
+#endif
+#endif
+
+#if IN_HEADER(__G_HASH_H__)
+#if IN_FILE(__G_UTILS_C__)
+g_int_equal
+g_int_hash
+g_direct_equal G_GNUC_CONST
+g_direct_hash G_GNUC_CONST
+#endif
+#endif
+
+#if IN_HEADER(__G_UTILS_H__)
+#if IN_FILE(__G_UTILS_C__)
+g_atexit
+#ifndef G_DISABLE_DEPRECATED
+g_basename
+#endif
+g_get_application_name
+g_find_program_in_path PRIVATE
+g_get_current_dir PRIVATE
+g_getenv PRIVATE
+g_unsetenv PRIVATE
+g_get_home_dir PRIVATE
+g_get_host_name
+g_setenv PRIVATE
+g_listenv
+#ifdef G_OS_WIN32
+g_find_program_in_path_utf8
+g_get_current_dir_utf8
+g_getenv_utf8
+g_unsetenv_utf8
+g_setenv_utf8
+g_get_home_dir_utf8
+#endif
+g_get_language_names
+g_get_prgname
+g_get_real_name PRIVATE
+#ifdef G_OS_WIN32
+g_get_real_name_utf8
+#endif
+g_get_system_config_dirs
+g_get_system_data_dirs
+#ifdef G_OS_WIN32
+g_win32_get_system_data_dirs_for_module
+#endif
+g_get_tmp_dir PRIVATE
+#ifdef G_OS_WIN32
+g_get_tmp_dir_utf8
+#endif
+g_get_user_cache_dir
+g_get_user_config_dir
+g_get_user_data_dir
+g_get_user_special_dir
+g_get_user_name PRIVATE
+#ifdef G_OS_WIN32
+g_get_user_name_utf8
+#endif
+glib_check_version
+g_nullify_pointer
+g_parse_debug_string
+g_path_get_basename G_GNUC_MALLOC
+g_path_get_dirname G_GNUC_MALLOC
+g_path_is_absolute
+g_path_skip_root
+g_set_application_name
+g_set_prgname
+#ifdef INCLUDE_INTERNAL_SYMBOLS
+g_bit_nth_lsf
+g_bit_nth_msf
+g_bit_storage
+g_trash_stack_height
+g_trash_stack_peek
+g_trash_stack_pop
+g_trash_stack_push
+g_get_codeset
+#endif
+#endif
+#endif
+
+#if IN_HEADER(__G_REGEX_H__)
+#if IN_FILE(__G_REGEX_C__)
+g_regex_error_quark
+g_regex_new
+g_regex_ref
+g_regex_unref
+g_regex_get_pattern
+g_regex_get_max_backref
+g_regex_get_capture_count
+g_regex_get_string_number
+g_regex_escape_string
+g_regex_match_simple
+g_regex_match
+g_regex_match_full
+g_regex_match_all
+g_regex_match_all_full
+g_regex_split_simple
+g_regex_split
+g_regex_split_full
+g_regex_replace
+g_regex_replace_literal
+g_regex_replace_eval
+g_regex_check_replacement
+g_match_info_get_regex
+g_match_info_get_string
+g_match_info_free
+g_match_info_next
+g_match_info_matches
+g_match_info_get_match_count
+g_match_info_is_partial_match
+g_match_info_expand_references
+g_match_info_fetch
+g_match_info_fetch_pos
+g_match_info_fetch_named
+g_match_info_fetch_named_pos
+g_match_info_fetch_all
+#endif
+#endif
+
+#if IN_HEADER(__G_WIN32_H__)
+#if IN_FILE(__G_WIN32_H__)
+#ifdef G_OS_WIN32
+g_win32_error_message
+g_win32_ftruncate
+g_win32_get_package_installation_directory PRIVATE
+g_win32_get_package_installation_directory_utf8
+g_win32_get_package_installation_subdirectory PRIVATE
+g_win32_get_package_installation_subdirectory_utf8
+g_win32_get_windows_version
+g_win32_getlocale
+g_win32_locale_filename_from_utf8
+#endif
+#endif
+#endif
+
+#ifdef INCLUDE_VARIABLES
+g_ascii_table
+g_utf8_skip
+g_idle_funcs
+g_timeout_funcs
+g_io_watch_funcs
+g_child_watch_funcs
+glib_binary_age
+glib_interface_age
+glib_major_version
+glib_mem_profiler_table
+glib_micro_version
+glib_minor_version
+glib_on_error_halt
+g_mem_gc_friendly
+#endif
+
diff --git a/trunk/glib/glibintl.h b/trunk/glib/glibintl.h
new file mode 100644
index 000000000..ee2d0fe42
--- /dev/null
+++ b/trunk/glib/glibintl.h
@@ -0,0 +1,30 @@
+#ifndef __GLIBINTL_H__
+#define __GLIBINTL_H__
+
+#ifndef SIZEOF_CHAR
+#error "config.h must be included prior to glibintl.h"
+#endif
+
+#ifdef ENABLE_NLS
+
+gchar *_glib_gettext (const gchar *str) G_GNUC_FORMAT (1);
+
+#include <libintl.h>
+#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/trunk/glib/glist.c b/trunk/glib/glist.c
new file mode 100644
index 000000000..40f1dd605
--- /dev/null
+++ b/trunk/glib/glist.c
@@ -0,0 +1,652 @@
+/* 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 "config.h"
+
+#include "glib.h"
+#include "galias.h"
+
+
+void g_list_push_allocator (gpointer dummy) { /* present for binary compat only */ }
+void g_list_pop_allocator (void) { /* present for binary compat only */ }
+
+#define _g_list_alloc() g_slice_new (GList)
+#define _g_list_alloc0() g_slice_new0 (GList)
+#define _g_list_free1(list) g_slice_free (GList, list)
+
+GList*
+g_list_alloc (void)
+{
+ return _g_list_alloc0 ();
+}
+
+void
+g_list_free (GList *list)
+{
+ g_slice_free_chain (GList, list, next);
+}
+
+void
+g_list_free_1 (GList *list)
+{
+ _g_list_free1 (list);
+}
+
+GList*
+g_list_append (GList *list,
+ gpointer data)
+{
+ GList *new_list;
+ GList *last;
+
+ new_list = _g_list_alloc ();
+ new_list->data = data;
+ new_list->next = NULL;
+
+ if (list)
+ {
+ last = g_list_last (list);
+ /* g_assert (last != NULL); */
+ last->next = new_list;
+ new_list->prev = last;
+
+ return list;
+ }
+ else
+ {
+ new_list->prev = NULL;
+ return new_list;
+ }
+}
+
+GList*
+g_list_prepend (GList *list,
+ gpointer data)
+{
+ GList *new_list;
+
+ new_list = _g_list_alloc ();
+ new_list->data = data;
+ new_list->next = list;
+
+ if (list)
+ {
+ new_list->prev = list->prev;
+ if (list->prev)
+ list->prev->next = new_list;
+ list->prev = new_list;
+ }
+ else
+ new_list->prev = NULL;
+
+ 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;
+ new_list->prev = tmp_list->prev;
+ if (tmp_list->prev)
+ tmp_list->prev->next = new_list;
+ new_list->next = tmp_list;
+ tmp_list->prev = new_list;
+
+ if (tmp_list == list)
+ return new_list;
+ else
+ return list;
+}
+
+GList*
+g_list_insert_before (GList *list,
+ GList *sibling,
+ gpointer data)
+{
+ if (!list)
+ {
+ list = g_list_alloc ();
+ list->data = data;
+ g_return_val_if_fail (sibling == NULL, list);
+ return list;
+ }
+ else if (sibling)
+ {
+ GList *node;
+
+ node = _g_list_alloc ();
+ node->data = data;
+ node->prev = sibling->prev;
+ node->next = sibling;
+ sibling->prev = node;
+ if (node->prev)
+ {
+ node->prev->next = node;
+ return list;
+ }
+ else
+ {
+ g_return_val_if_fail (sibling == list, node);
+ return node;
+ }
+ }
+ else
+ {
+ GList *last;
+
+ last = list;
+ while (last->next)
+ last = last->next;
+
+ last->next = _g_list_alloc ();
+ last->next->data = data;
+ last->next->prev = last;
+ last->next->next = NULL;
+
+ 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_free1 (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_free1 (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_free1 (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;
+ new_list->prev = NULL;
+ 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;
+ }
+ last->next = NULL;
+ }
+
+ 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;
+ }
+}
+
+static GList*
+g_list_insert_sorted_real (GList *list,
+ gpointer data,
+ GFunc func,
+ gpointer user_data)
+{
+ GList *tmp_list = list;
+ GList *new_list;
+ gint cmp;
+
+ g_return_val_if_fail (func != NULL, list);
+
+ if (!list)
+ {
+ new_list = _g_list_alloc0 ();
+ new_list->data = data;
+ return new_list;
+ }
+
+ cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data);
+
+ while ((tmp_list->next) && (cmp > 0))
+ {
+ tmp_list = tmp_list->next;
+
+ cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data);
+ }
+
+ new_list = _g_list_alloc0 ();
+ 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;
+}
+
+GList*
+g_list_insert_sorted (GList *list,
+ gpointer data,
+ GCompareFunc func)
+{
+ return g_list_insert_sorted_real (list, data, (GFunc) func, NULL);
+}
+
+GList*
+g_list_insert_sorted_with_data (GList *list,
+ gpointer data,
+ GCompareDataFunc func,
+ gpointer user_data)
+{
+ return g_list_insert_sorted_real (list, data, (GFunc) func, user_data);
+}
+
+static GList *
+g_list_sort_merge (GList *l1,
+ GList *l2,
+ GFunc compare_func,
+ gpointer user_data)
+{
+ GList list, *l, *lprev;
+ gint cmp;
+
+ l = &list;
+ lprev = NULL;
+
+ while (l1 && l2)
+ {
+ cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data);
+
+ if (cmp <= 0)
+ {
+ l->next = l1;
+ l1 = l1->next;
+ }
+ else
+ {
+ l->next = l2;
+ l2 = l2->next;
+ }
+ l = l->next;
+ l->prev = lprev;
+ lprev = l;
+ }
+ l->next = l1 ? l1 : l2;
+ l->next->prev = l;
+
+ return list.next;
+}
+
+static GList*
+g_list_sort_real (GList *list,
+ GFunc compare_func,
+ 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, user_data),
+ g_list_sort_real (l2, compare_func, user_data),
+ compare_func,
+ user_data);
+}
+
+GList *
+g_list_sort (GList *list,
+ GCompareFunc compare_func)
+{
+ return g_list_sort_real (list, (GFunc) compare_func, NULL);
+
+}
+
+GList *
+g_list_sort_with_data (GList *list,
+ GCompareDataFunc compare_func,
+ gpointer user_data)
+{
+ return g_list_sort_real (list, (GFunc) compare_func, user_data);
+}
+
+#define __G_LIST_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/glist.h b/trunk/glib/glist.h
new file mode 100644
index 000000000..258dcd1eb
--- /dev/null
+++ b/trunk/glib/glist.h
@@ -0,0 +1,116 @@
+/* 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 <glib/gmem.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GList GList;
+
+struct _GList
+{
+ gpointer data;
+ GList *next;
+ GList *prev;
+};
+
+/* Doubly linked lists
+ */
+GList* g_list_alloc (void) G_GNUC_WARN_UNUSED_RESULT;
+void g_list_free (GList *list);
+void g_list_free_1 (GList *list);
+#define g_list_free1 g_list_free_1
+GList* g_list_append (GList *list,
+ gpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GList* g_list_prepend (GList *list,
+ gpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GList* g_list_insert (GList *list,
+ gpointer data,
+ gint position) G_GNUC_WARN_UNUSED_RESULT;
+GList* g_list_insert_sorted (GList *list,
+ gpointer data,
+ GCompareFunc func) G_GNUC_WARN_UNUSED_RESULT;
+GList* g_list_insert_sorted_with_data (GList *list,
+ gpointer data,
+ GCompareDataFunc func,
+ gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
+GList* g_list_insert_before (GList *list,
+ GList *sibling,
+ gpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GList* g_list_concat (GList *list1,
+ GList *list2) G_GNUC_WARN_UNUSED_RESULT;
+GList* g_list_remove (GList *list,
+ gconstpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GList* g_list_remove_all (GList *list,
+ gconstpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GList* g_list_remove_link (GList *list,
+ GList *llink) G_GNUC_WARN_UNUSED_RESULT;
+GList* g_list_delete_link (GList *list,
+ GList *link_) G_GNUC_WARN_UNUSED_RESULT;
+GList* g_list_reverse (GList *list) G_GNUC_WARN_UNUSED_RESULT;
+GList* g_list_copy (GList *list) G_GNUC_WARN_UNUSED_RESULT;
+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) G_GNUC_WARN_UNUSED_RESULT;
+GList* g_list_sort_with_data (GList *list,
+ GCompareDataFunc compare_func,
+ gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
+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)
+
+#ifndef G_DISABLE_DEPRECATED
+void g_list_push_allocator (gpointer allocator);
+void g_list_pop_allocator (void);
+#endif
+G_END_DECLS
+
+#endif /* __G_LIST_H__ */
+
diff --git a/trunk/glib/gmacros.h b/trunk/glib/gmacros.h
new file mode 100644
index 000000000..7c9c87e89
--- /dev/null
+++ b/trunk/glib/gmacros.h
@@ -0,0 +1,267 @@
+/* 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__
+
+/* We include stddef.h to get the system's definition of NULL
+ */
+#include <stddef.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__))
+#define G_GNUC_MALLOC \
+ __attribute__((__malloc__))
+#else
+#define G_GNUC_PURE
+#define G_GNUC_MALLOC
+#endif
+
+#if __GNUC__ >= 4
+#define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__))
+#else
+#define G_GNUC_NULL_TERMINATED
+#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__))
+#define G_GNUC_NO_INSTRUMENT \
+ __attribute__((__no_instrument_function__))
+#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
+#define G_GNUC_NO_INSTRUMENT
+#endif /* !__GNUC__ */
+
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
+#define G_GNUC_DEPRECATED \
+ __attribute__((__deprecated__))
+#else
+#define G_GNUC_DEPRECATED
+#endif /* __GNUC__ */
+
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)
+# define G_GNUC_MAY_ALIAS __attribute__((may_alias))
+#else
+# define G_GNUC_MAY_ALIAS
+#endif
+
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#define G_GNUC_WARN_UNUSED_RESULT \
+ __attribute__((warn_unused_result))
+#else
+#define G_GNUC_WARN_UNUSED_RESULT
+#endif /* __GNUC__ */
+
+/* Wrap the gcc __PRETTY_FUNCTION__ and __FUNCTION__ variables with
+ * macros, so we can refer to them as strings unconditionally.
+ * usage not-recommended since gcc-3.0
+ */
+#if defined (__GNUC__) && (__GNUC__ < 3)
+#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 */
+#if defined(__GNUC__) && (__GNUC__ < 3) && !defined(__cplusplus)
+# define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) ":" __PRETTY_FUNCTION__ "()"
+#else
+# define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__)
+#endif
+
+/* Provide a string identifying the current function, non-concatenatable */
+#if defined (__GNUC__)
+# define G_STRFUNC ((const char*) (__PRETTY_FUNCTION__))
+#elif defined (G_HAVE_ISO_VARARGS)
+# define G_STRFUNC ((const char*) (__func__))
+#else
+# define G_STRFUNC ((const char*) ("???"))
+#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 ...
+ *
+ * When GCC is compiling C code in non-ANSI mode, it will use the
+ * compiler __extension__ to wrap the statements wihin `({' and '})' braces.
+ * When compiling on platforms where configure has defined
+ * HAVE_DOWHILE_MACROS, statements will be wrapped with `do' and `while (0)'.
+ * For any other platforms (SunOS4 is known to have this issue), wrap the
+ * statements with `if (1)' and `else (void) 0'.
+ */
+#if !(defined (G_STMT_START) && defined (G_STMT_END))
+# if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
+# define G_STMT_START (void) __extension__ (
+# define G_STMT_END )
+# else /* !(__GNUC__ && !__STRICT_ANSI__ && !__cplusplus) */
+# if defined (HAVE_DOWHILE_MACROS)
+# define G_STMT_START do
+# define G_STMT_END while (0)
+# else /* !HAVE_DOWHILE_MACROS */
+# define G_STMT_START if (1)
+# define G_STMT_END else (void) 0
+# endif /* !HAVE_DOWHILE_MACROS */
+# endif /* !(__GNUC__ && !__STRICT_ANSI__ && !__cplusplus) */
+#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
+
+/*
+ * The G_LIKELY and G_UNLIKELY macros let the programmer give hints to
+ * the compiler about the expected result of an expression. Some compilers
+ * can use this information for optimizations.
+ *
+ * The _G_BOOLEAN_EXPR macro is intended to trigger a gcc warning when
+ * putting assignments in g_return_if_fail ().
+ */
+#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
+#define _G_BOOLEAN_EXPR(expr) \
+ __extension__ ({ \
+ int _g_boolean_var_; \
+ if (expr) \
+ _g_boolean_var_ = 1; \
+ else \
+ _g_boolean_var_ = 0; \
+ _g_boolean_var_; \
+})
+#define G_LIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 1))
+#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
+#else
+#define G_LIKELY(expr) (expr)
+#define G_UNLIKELY(expr) (expr)
+#endif
+
+#endif /* __G_MACROS_H__ */
diff --git a/trunk/glib/gmain.c b/trunk/glib/gmain.c
new file mode 100644
index 000000000..a273cd3e3
--- /dev/null
+++ b/trunk/glib/gmain.c
@@ -0,0 +1,4195 @@
+/* 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 "gthreadprivate.h"
+#include <signal.h>
+#include <sys/types.h>
+#include <time.h>
+#include <stdlib.h>
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif /* HAVE_SYS_TIME_H */
+#ifdef GLIB_HAVE_SYS_POLL_H
+# include <sys/poll.h>
+# 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 */
+
+/* The poll() emulation on OS/X doesn't handle fds=NULL, nfds=0,
+ * so we prefer our own poll emulation.
+ */
+#if defined(_POLL_EMUL_H_) || defined(BROKEN_POLL)
+#undef HAVE_POLL
+#endif
+
+#endif /* GLIB_HAVE_SYS_POLL_H */
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#include <errno.h>
+
+#ifdef G_OS_WIN32
+#define STRICT
+#include <windows.h>
+#endif /* G_OS_WIN32 */
+
+#ifdef G_OS_BEOS
+#include <sys/socket.h>
+#include <sys/wait.h>
+#endif /* G_OS_BEOS */
+
+#ifdef G_OS_UNIX
+#include <fcntl.h>
+#include <sys/wait.h>
+#endif
+
+#include "galias.h"
+
+/* Types */
+
+typedef struct _GTimeoutSource GTimeoutSource;
+typedef struct _GChildWatchSource GChildWatchSource;
+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;
+
+#ifdef G_THREADS_ENABLED
+typedef struct _GMainWaiter GMainWaiter;
+
+struct _GMainWaiter
+{
+ GCond *cond;
+ GMutex *mutex;
+};
+#endif
+
+typedef struct _GMainDispatch GMainDispatch;
+
+struct _GMainDispatch
+{
+ gint depth;
+ GSList *source; /* stack of current sources */
+};
+
+struct _GMainContext
+{
+#ifdef G_THREADS_ENABLED
+ /* The following lock is used for both the list of sources
+ * and the list of poll records
+ */
+ GStaticMutex mutex;
+ GCond *cond;
+ GThread *owner;
+ guint owner_count;
+ GSList *waiters;
+#endif
+
+ gint ref_count;
+
+ GPtrArray *pending_dispatches;
+ gint timeout; /* Timeout for current iteration */
+
+ guint next_id;
+ GSource *source_list;
+ gint in_check_or_prepare;
+
+ GPollRec *poll_records;
+ 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;
+ gint ref_count;
+};
+
+struct _GTimeoutSource
+{
+ GSource source;
+ GTimeVal expiration;
+ guint interval;
+ guint granularity;
+};
+
+struct _GChildWatchSource
+{
+ GSource source;
+ GPid pid;
+ gint child_status;
+#ifdef G_OS_WIN32
+ GPollFD poll;
+#else /* G_OS_WIN32 */
+ gint count;
+ gboolean child_exited;
+#endif /* G_OS_WIN32 */
+};
+
+struct _GPollRec
+{
+ GPollFD *fd;
+ GPollRec *next;
+ gint priority;
+};
+
+#ifdef G_THREADS_ENABLED
+#define LOCK_CONTEXT(context) g_static_mutex_lock (&context->mutex)
+#define UNLOCK_CONTEXT(context) g_static_mutex_unlock (&context->mutex)
+#define G_THREAD_SELF g_thread_self ()
+#else
+#define LOCK_CONTEXT(context) (void)0
+#define UNLOCK_CONTEXT(context) (void)0
+#define G_THREAD_SELF NULL
+#endif
+
+#define SOURCE_DESTROYED(source) (((source)->flags & G_HOOK_FLAG_ACTIVE) == 0)
+#define SOURCE_BLOCKED(source) (((source)->flags & G_HOOK_FLAG_IN_CALL) != 0 && \
+ ((source)->flags & G_SOURCE_CAN_RECURSE) == 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_unlocked (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_child_watch_prepare (GSource *source,
+ gint *timeout);
+static gboolean g_child_watch_check (GSource *source);
+static gboolean g_child_watch_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 GSList *main_contexts_without_pipe = NULL;
+
+#ifndef G_OS_WIN32
+/* Child status monitoring code */
+enum {
+ CHILD_WATCH_UNINITIALIZED,
+ CHILD_WATCH_INITIALIZED_SINGLE,
+ CHILD_WATCH_INITIALIZED_THREADED
+};
+static gint child_watch_init_state = CHILD_WATCH_UNINITIALIZED;
+static gint child_watch_count = 1;
+static gint child_watch_wake_up_pipe[2] = {0, 0};
+#endif /* !G_OS_WIN32 */
+G_LOCK_DEFINE_STATIC (main_context_list);
+static GSList *main_context_list = NULL;
+
+static gint timer_perturb = -1;
+
+GSourceFuncs g_timeout_funcs =
+{
+ g_timeout_prepare,
+ g_timeout_check,
+ g_timeout_dispatch,
+ NULL
+};
+
+GSourceFuncs g_child_watch_funcs =
+{
+ g_child_watch_prepare,
+ g_child_watch_check,
+ g_child_watch_dispatch,
+ NULL
+};
+
+GSourceFuncs g_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->fd == G_WIN32_MSG_HANDLE)
+ poll_msgs = TRUE;
+ else if (nhandles == MAXIMUM_WAIT_OBJECTS)
+ {
+ g_warning (G_STRLOC ": Too many handles to wait for!\n");
+ break;
+ }
+ 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 ())
+ {
+ gchar *emsg = g_win32_error_message (GetLastError ());
+ g_warning (G_STRLOC ": WaitMessage() failed: %s", emsg);
+ g_free (emsg);
+ }
+ 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)
+ {
+ gchar *emsg = g_win32_error_message (GetLastError ());
+ g_warning (G_STRLOC ": SetTimer() failed: %s", emsg);
+ g_free (emsg);
+ ready = WAIT_TIMEOUT;
+ }
+ 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)
+ {
+ gchar *emsg = g_win32_error_message (GetLastError ());
+ g_warning (G_STRLOC ": MsgWaitForMultipleObjects() failed: %s", emsg);
+ g_free (emsg);
+ }
+ }
+ }
+ }
+ 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)
+ {
+ gchar *emsg = g_win32_error_message (GetLastError ());
+ g_warning (G_STRLOC ": WaitForMultipleObjects() failed: %s", emsg);
+ g_free (emsg);
+ }
+ }
+
+#ifdef G_MAIN_POLL_DEBUG
+ g_print ("wait returns %ld%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;
+ }
+ }
+ else if (ready >= WAIT_OBJECT_0 && ready < WAIT_OBJECT_0 + nhandles)
+ for (f = fds; f < &fds[nfds]; ++f)
+ {
+ if (f->fd == (gint) handles[ready - WAIT_OBJECT_0])
+ {
+ f->revents = f->events;
+#ifdef G_MAIN_POLL_DEBUG
+ g_print ("g_poll: got event %#x\n", f->fd);
+#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 <string.h> /* for bzero on BSD systems */
+
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#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 */
+
+/**
+ * g_main_context_ref:
+ * @context: a #GMainContext
+ *
+ * Increases the reference count on a #GMainContext object by one.
+ *
+ * Returns: the @context that was passed in (since 2.6)
+ **/
+GMainContext *
+g_main_context_ref (GMainContext *context)
+{
+ g_return_val_if_fail (context != NULL, NULL);
+ g_return_val_if_fail (g_atomic_int_get (&context->ref_count) > 0, NULL);
+
+ g_atomic_int_inc (&context->ref_count);
+
+ return context;
+}
+
+static inline void
+poll_rec_list_free (GMainContext *context,
+ GPollRec *list)
+{
+ g_slice_free_chain (GPollRec, list, next);
+}
+
+/**
+ * g_main_context_unref:
+ * @context: a #GMainContext
+ *
+ * Decreases the reference count on a #GMainContext object by one. If
+ * the result is zero, free the context and free all associated memory.
+ **/
+void
+g_main_context_unref (GMainContext *context)
+{
+ GSource *source;
+ g_return_if_fail (context != NULL);
+ g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0);
+
+ if (!g_atomic_int_dec_and_test (&context->ref_count))
+ return;
+
+ G_LOCK (main_context_list);
+ main_context_list = g_slist_remove (main_context_list, context);
+ G_UNLOCK (main_context_list);
+
+ source = context->source_list;
+ while (source)
+ {
+ GSource *next = source->next;
+ g_source_destroy_internal (source, context, FALSE);
+ source = next;
+ }
+
+#ifdef G_THREADS_ENABLED
+ g_static_mutex_free (&context->mutex);
+#endif
+
+ g_ptr_array_free (context->pending_dispatches, TRUE);
+ g_free (context->cached_poll_array);
+
+ poll_rec_list_free (context, context->poll_records);
+
+#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
+ }
+ else
+ main_contexts_without_pipe = g_slist_remove (main_contexts_without_pipe,
+ context);
+#endif
+
+ g_free (context);
+}
+
+#ifdef G_THREADS_ENABLED
+static void
+g_main_context_init_pipe (GMainContext *context)
+{
+# ifndef G_OS_WIN32
+ if (context->wake_up_pipe[0] != -1)
+ return;
+ 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;
+# else
+ if (context->wake_up_semaphore != NULL)
+ return;
+ 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
+# endif
+ g_main_context_add_poll_unlocked (context, 0, &context->wake_up_rec);
+}
+
+void
+_g_main_thread_init (void)
+{
+ GSList *curr = main_contexts_without_pipe;
+ while (curr)
+ {
+ g_main_context_init_pipe ((GMainContext *)curr->data);
+ curr = curr->next;
+ }
+ g_slist_free (main_contexts_without_pipe);
+ main_contexts_without_pipe = NULL;
+}
+#endif /* G_THREADS_ENABLED */
+
+/**
+ * g_main_context_new:
+ *
+ * Creates a new #GMainContext strcuture
+ *
+ * Return value: the new #GMainContext
+ **/
+GMainContext *
+g_main_context_new (void)
+{
+ GMainContext *context = g_new0 (GMainContext, 1);
+
+#ifdef G_THREADS_ENABLED
+ g_static_mutex_init (&context->mutex);
+
+ context->owner = NULL;
+ context->waiters = NULL;
+
+# ifndef G_OS_WIN32
+ context->wake_up_pipe[0] = -1;
+ context->wake_up_pipe[1] = -1;
+# else
+ context->wake_up_semaphore = NULL;
+# endif
+#endif
+
+ context->ref_count = 1;
+
+ 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 ())
+ g_main_context_init_pipe (context);
+ else
+ main_contexts_without_pipe = g_slist_prepend (main_contexts_without_pipe,
+ context);
+#endif
+
+ G_LOCK (main_context_list);
+ main_context_list = g_slist_append (main_context_list, context);
+ G_UNLOCK (main_context_list);
+
+ return context;
+}
+
+/**
+ * g_main_context_default:
+ *
+ * Returns 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_new ();
+
+ 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.
+ *
+ * Creates 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
+ * <literal>sizeof (GSource)</literal>.
+ *
+ * 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 #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 (greater than 0) 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->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_unlocked (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);
+ }
+
+ if (!SOURCE_BLOCKED (source))
+ {
+ 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
+ *
+ * Removes 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
+ *
+ * Returns the numeric ID for a particular source. The ID of a source
+ * is a positive integer which 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 (greater than 0) 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->source_id;
+ UNLOCK_CONTEXT (source->context);
+
+ return result;
+}
+
+/**
+ * g_source_get_context:
+ * @source: a #GSource
+ *
+ * Gets 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.
+ *
+ * Adds 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)
+ {
+ if (!SOURCE_BLOCKED (source))
+ 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_add_poll().
+ *
+ * Removes 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)
+ {
+ if (!SOURCE_BLOCKED (source))
+ 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
+ *
+ * Sets the callback function storing the data as a refcounted callback
+ * "object". This is used 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,
+ GSource *source,
+ 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.
+ *
+ * Sets the callback function for a source. The callback for a source is
+ * called from the source's dispatch function.
+ *
+ * The exact type of @func depends on the type of source; ie. you
+ * should not count on @func being called with @data as its first
+ * parameter.
+ *
+ * Typically, you won't use this function. Instead use functions specific
+ * to the type of source you are using.
+ **/
+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_funcs:
+ * @source: a #GSource
+ * @funcs: the new #GSourceFuncs
+ *
+ * Sets the source functions (can be used to override
+ * default implementations) of an unattached source.
+ *
+ * Since: 2.12
+ */
+void
+g_source_set_funcs (GSource *source,
+ GSourceFuncs *funcs)
+{
+ g_return_if_fail (source != NULL);
+ g_return_if_fail (source->context == NULL);
+ g_return_if_fail (source->ref_count > 0);
+ g_return_if_fail (funcs != NULL);
+
+ source->source_funcs = funcs;
+}
+
+/**
+ * g_source_set_priority:
+ * @source: a #GSource
+ * @priority: the new priority.
+ *
+ * Sets the priority of a source. While the main loop is being
+ * run, a source will be dispatched if it is ready to be dispatched and no sources
+ * at a higher (numerically smaller) priority are ready to be dispatched.
+ **/
+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)
+ {
+ /* Remove the source from the context's source and then
+ * add it back so it is sorted in the correct plcae
+ */
+ g_source_list_remove (source, source->context);
+ g_source_list_add (source, source->context);
+
+ if (!SOURCE_BLOCKED (source))
+ {
+ 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 source.
+ *
+ * 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->finalize)
+ source->source_funcs->finalize (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)
+ * @source_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 source_id)
+{
+ GSource *source;
+
+ g_return_val_if_fail (source_id > 0, NULL);
+
+ if (context == NULL)
+ context = g_main_context_default ();
+
+ LOCK_CONTEXT (context);
+
+ source = context->source_list;
+ while (source)
+ {
+ if (!SOURCE_DESTROYED (source) &&
+ source->source_id == source_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, NULL);
+
+ 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_funcs)
+ {
+ GSourceFunc callback;
+ gpointer callback_data;
+
+ source->callback_funcs->get (source->callback_data, source, &callback, &callback_data);
+
+ if (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_funcs)
+ {
+ GSourceFunc callback;
+ gpointer callback_data = NULL;
+
+ source->callback_funcs->get (source->callback_data, source, &callback, &callback_data);
+
+ if (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_child_watch_add(),
+ * g_child_watch_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 the UNIX gettimeofday() function, 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
+ FILETIME ft;
+ guint64 *time64 = (guint64 *) &ft;
+
+ GetSystemTimeAsFileTime (&ft);
+
+ /* Convert from 100s of nanoseconds since 1601-01-01
+ * to Unix epoch. Yes, this is Y2038 unsafe.
+ */
+ *time64 -= G_GINT64_CONSTANT (116444736000000000);
+ *time64 /= 10;
+
+ result->tv_sec = *time64 / 1000000;
+ result->tv_usec = *time64 % 1000000;
+#endif
+}
+
+static void
+g_main_dispatch_free (gpointer dispatch)
+{
+ g_slice_free (GMainDispatch, dispatch);
+}
+
+/* Running the main loop */
+
+static GMainDispatch *
+get_dispatch (void)
+{
+ static GStaticPrivate depth_private = G_STATIC_PRIVATE_INIT;
+ GMainDispatch *dispatch = g_static_private_get (&depth_private);
+ if (!dispatch)
+ {
+ dispatch = g_slice_new0 (GMainDispatch);
+ g_static_private_set (&depth_private, dispatch, g_main_dispatch_free);
+ }
+
+ return dispatch;
+}
+
+/**
+ * g_main_depth:
+ *
+ * Return value: The main loop recursion level in the current thread
+ *
+ * Returns the depth of the stack of calls to
+ * g_main_context_dispatch() on any #GMainContext in the current thread.
+ * That is, when called from the toplevel, it gives 0. When
+ * called from within a callback from g_main_context_iteration()
+ * (or g_main_loop_run(), etc.) it returns 1. When called from within
+ * a callback to a recursive call to g_main_context_iterate(),
+ * it returns 2. And so forth.
+ *
+ * This function is useful in a situation like the following:
+ * Imagine an extremely simple "garbage collected" system.
+ *
+ * <example>
+ * static GList *free_list;
+ *
+ * gpointer
+ * allocate_memory (gsize size)
+ * {
+ * gpointer result = g_malloc (size);
+ * free_list = g_list_prepend (free_list, result);
+ * return result;
+ * }
+ *
+ * void
+ * free_allocated_memory (void)
+ * {
+ * GList *l;
+ * for (l = free_list; l; l = l->next);
+ * g_free (l->data);
+ * g_list_free (free_list);
+ * free_list = NULL;
+ * }
+ *
+ * [...]
+ *
+ * while (TRUE);
+ * {
+ * g_main_context_iteration (NULL, TRUE);
+ * free_allocated_memory();
+ * }
+ * </example>
+ *
+ * This works from an application, however, if you want to do the same
+ * thing from a library, it gets more difficult, since you no longer
+ * control the main loop. You might think you can simply use an idle
+ * function to make the call to free_allocated_memory(), but that
+ * doesn't work, since the idle function could be called from a
+ * recursive callback. This can be fixed by using g_main_depth()
+ *
+ * <example>
+ * gpointer
+ * allocate_memory (gsize size)
+ * {
+ * FreeListBlock *block = g_new (FreeListBlock, 1);\
+ * block->mem = g_malloc (size);
+ * block->depth = g_main_depth ();
+ * free_list = g_list_prepend (free_list, block);
+ * return block->mem;
+ * }
+ *
+ * void
+ * free_allocated_memory (void)
+ * {
+ * GList *l;
+ *
+ * int depth = g_main_depth ();
+ * for (l = free_list; l; );
+ * {
+ * GList *next = l->next;
+ * FreeListBlock *block = l->data;
+ * if (block->depth > depth)
+ * {
+ * g_free (block->mem);
+ * g_free (block);
+ * free_list = g_list_delete_link (free_list, l);
+ * }
+ *
+ * l = next;
+ * }
+ * }
+ * </example>
+ *
+ * There is a temptation to use g_main_depth() to solve
+ * problems with reentrancy. For instance, while waiting for data
+ * to be received from the network in response to a menu item,
+ * the menu item might be selected again. It might seem that
+ * one could make the menu item's callback return immediately
+ * and do nothing if g_main_depth() returns a value greater than 1.
+ * However, this should be avoided since the user then sees selecting
+ * the menu item do nothing. Furthermore, you'll find yourself adding
+ * these checks all over your code, since there are doubtless many,
+ * many things that the user could do. Instead, you can use the
+ * following techniques:
+ *
+ * <orderedlist>
+ * <listitem>
+ * <para>
+ * Use gtk_widget_set_sensitive() or modal dialogs to prevent
+ * the user from interacting with elements while the main
+ * loop is recursing.
+ * </para>
+ * </listitem>
+ * <listitem>
+ * <para>
+ * Avoid main loop recursion in situations where you can't handle
+ * arbitrary callbacks. Instead, structure your code so that you
+ * simply return to the main loop and then get called again when
+ * there is more work to do.
+ * </para>
+ * </listitem>
+ * </orderedlist>
+ **/
+int
+g_main_depth (void)
+{
+ GMainDispatch *dispatch = get_dispatch ();
+ return dispatch->depth;
+}
+
+/**
+ * g_main_current_source:
+ *
+ * Returns the currently firing source for this thread.
+ *
+ * Return value: The currently firing source or %NULL.
+ *
+ * Since: 2.12
+ */
+GSource *
+g_main_current_source (void)
+{
+ GMainDispatch *dispatch = get_dispatch ();
+ return dispatch->source ? dispatch->source->data : NULL;
+}
+
+/**
+ * g_source_is_destroyed:
+ * @source: a #GSource
+ *
+ * Returns whether @source has been destroyed.
+ *
+ * This is important when you operate upon your objects
+ * from within idle handlers, but may have freed the object
+ * before the dispatch of your idle handler.
+ *
+ * <informalexample><programlisting>
+ * static gboolean
+ * idle_callback (gpointer data)
+ * {
+ * SomeWidget *self = data;
+ *
+ * GDK_THREADS_ENTER (<!-- -->);
+ * /<!-- -->* do stuff with self *<!-- -->/
+ * self->idle_id = 0;
+ * GDK_THREADS_LEAVE (<!-- -->);
+ *
+ * return FALSE;
+ * }
+ *
+ * static void
+ * some_widget_do_stuff_later (SomeWidget *self)
+ * {
+ * self->idle_id = g_idle_add (idle_callback, self);
+ * }
+ *
+ * static void
+ * some_widget_finalize (GObject *object)
+ * {
+ * SomeWidget *self = SOME_WIDGET (object);
+ *
+ * if (self->idle_id)
+ * g_source_remove (self->idle_id);
+ *
+ * G_OBJECT_CLASS (parent_class)->finalize (object);
+ * }
+ * </programlisting></informalexample>
+ *
+ * This will fail in a multi-threaded application if the
+ * widget is destroyed before the idle handler fires due
+ * to the use after free in the callback. A solution, to
+ * this particular problem, is to check to if the source
+ * has already been destroy within the callback.
+ *
+ * <informalexample><programlisting>
+ * static gboolean
+ * idle_callback (gpointer data)
+ * {
+ * SomeWidget *self = data;
+ *
+ * GDK_THREADS_ENTER ();
+ * if (!g_source_is_destroyed (g_main_current_source ()))
+ * {
+ * /<!-- -->* do stuff with self *<!-- -->/
+ * }
+ * GDK_THREADS_LEAVE ();
+ *
+ * return FALSE;
+ * }
+ * </programlisting></informalexample>
+ *
+ * Return value: %TRUE if the source has been destroyed
+ *
+ * Since: 2.12
+ */
+gboolean
+g_source_is_destroyed (GSource *source)
+{
+ return SOURCE_DESTROYED (source);
+}
+
+
+/* Temporarily remove all this source's file descriptors from the
+ * poll(), so that if data comes available for one of the file descriptors
+ * we don't continually spin in the poll()
+ */
+/* HOLDS: source->context's lock */
+static void
+block_source (GSource *source)
+{
+ GSList *tmp_list;
+
+ g_return_if_fail (!SOURCE_BLOCKED (source));
+
+ tmp_list = source->poll_fds;
+ while (tmp_list)
+ {
+ g_main_context_remove_poll_unlocked (source->context, tmp_list->data);
+ tmp_list = tmp_list->next;
+ }
+}
+
+/* HOLDS: source->context's lock */
+static void
+unblock_source (GSource *source)
+{
+ GSList *tmp_list;
+
+ g_return_if_fail (!SOURCE_BLOCKED (source)); /* Source already unblocked */
+ g_return_if_fail (!SOURCE_DESTROYED (source));
+
+ tmp_list = source->poll_fds;
+ while (tmp_list)
+ {
+ g_main_context_add_poll_unlocked (source->context, source->priority, tmp_list->data);
+ tmp_list = tmp_list->next;
+ }
+}
+
+/* HOLDS: context's lock */
+static void
+g_main_dispatch (GMainContext *context)
+{
+ GMainDispatch *current = get_dispatch ();
+ 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);
+ GSList current_source_link;
+
+ dispatch = source->source_funcs->dispatch;
+ cb_funcs = source->callback_funcs;
+ cb_data = source->callback_data;
+
+ if (cb_funcs)
+ cb_funcs->ref (cb_data);
+
+ if ((source->flags & G_SOURCE_CAN_RECURSE) == 0)
+ block_source (source);
+
+ was_in_call = source->flags & G_HOOK_FLAG_IN_CALL;
+ source->flags |= G_HOOK_FLAG_IN_CALL;
+
+ if (cb_funcs)
+ cb_funcs->get (cb_data, source, &callback, &user_data);
+
+ UNLOCK_CONTEXT (context);
+
+ current->depth++;
+ /* The on-stack allocation of the GSList is unconventional, but
+ * we know that the lifetime of the link is bounded to this
+ * function as the link is kept in a thread specific list and
+ * not manipulated outside of this function and its descendants.
+ * Avoiding the overhead of a g_slist_alloc() is useful as many
+ * applications do little more than dispatch events.
+ *
+ * This is a performance hack - do not revert to g_slist_prepend()!
+ */
+ current_source_link.data = source;
+ current_source_link.next = current->source;
+ current->source = &current_source_link;
+ need_destroy = ! dispatch (source,
+ callback,
+ user_data);
+ g_assert (current->source == &current_source_link);
+ current->source = current_source_link.next;
+ current->depth--;
+
+ if (cb_funcs)
+ cb_funcs->unref (cb_data);
+
+ LOCK_CONTEXT (context);
+
+ if (!was_in_call)
+ source->flags &= ~G_HOOK_FLAG_IN_CALL;
+
+ if ((source->flags & G_SOURCE_CAN_RECURSE) == 0 &&
+ !SOURCE_DESTROYED (source))
+ unblock_source (source);
+
+ /* 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_acquire:
+ * @context: a #GMainContext
+ *
+ * Tries to become the owner of the specified context.
+ * If some other context is the owner of the context,
+ * returns %FALSE immediately. Ownership is properly
+ * recursive: the owner can require ownership again
+ * and will release ownership when g_main_context_release()
+ * is called as many times as g_main_context_acquire().
+ *
+ * You must be the owner of a context before you
+ * can call g_main_context_prepare(), g_main_context_query(),
+ * g_main_context_check(), g_main_context_dispatch().
+ *
+ * Return value: %TRUE if the operation succeeded, and
+ * this thread is now the owner of @context.
+ **/
+gboolean
+g_main_context_acquire (GMainContext *context)
+{
+#ifdef G_THREADS_ENABLED
+ gboolean result = FALSE;
+ GThread *self = G_THREAD_SELF;
+
+ if (context == NULL)
+ context = g_main_context_default ();
+
+ LOCK_CONTEXT (context);
+
+ if (!context->owner)
+ {
+ context->owner = self;
+ g_assert (context->owner_count == 0);
+ }
+
+ if (context->owner == self)
+ {
+ context->owner_count++;
+ result = TRUE;
+ }
+
+ UNLOCK_CONTEXT (context);
+
+ return result;
+#else /* !G_THREADS_ENABLED */
+ return TRUE;
+#endif /* G_THREADS_ENABLED */
+}
+
+/**
+ * g_main_context_release:
+ * @context: a #GMainContext
+ *
+ * Releases ownership of a context previously acquired by this thread
+ * with g_main_context_acquire(). If the context was acquired multiple
+ * times, the only release ownership when g_main_context_release()
+ * is called as many times as it was acquired.
+ **/
+void
+g_main_context_release (GMainContext *context)
+{
+#ifdef G_THREADS_ENABLED
+ if (context == NULL)
+ context = g_main_context_default ();
+
+ LOCK_CONTEXT (context);
+
+ context->owner_count--;
+ if (context->owner_count == 0)
+ {
+ context->owner = NULL;
+
+ if (context->waiters)
+ {
+ GMainWaiter *waiter = context->waiters->data;
+ gboolean loop_internal_waiter =
+ (waiter->mutex == g_static_mutex_get_mutex (&context->mutex));
+ context->waiters = g_slist_delete_link (context->waiters,
+ context->waiters);
+ if (!loop_internal_waiter)
+ g_mutex_lock (waiter->mutex);
+
+ g_cond_signal (waiter->cond);
+
+ if (!loop_internal_waiter)
+ g_mutex_unlock (waiter->mutex);
+ }
+ }
+
+ UNLOCK_CONTEXT (context);
+#endif /* G_THREADS_ENABLED */
+}
+
+/**
+ * g_main_context_wait:
+ * @context: a #GMainContext
+ * @cond: a condition variable
+ * @mutex: a mutex, currently held
+ *
+ * Tries to become the owner of the specified context,
+ * as with g_main_context_acquire(). But if another thread
+ * is the owner, atomically drop @mutex and wait on @cond until
+ * that owner releases ownership or until @cond is signaled, then
+ * try again (once) to become the owner.
+ *
+ * Return value: %TRUE if the operation succeeded, and
+ * this thread is now the owner of @context.
+ **/
+gboolean
+g_main_context_wait (GMainContext *context,
+ GCond *cond,
+ GMutex *mutex)
+{
+#ifdef G_THREADS_ENABLED
+ gboolean result = FALSE;
+ GThread *self = G_THREAD_SELF;
+ gboolean loop_internal_waiter;
+
+ if (context == NULL)
+ context = g_main_context_default ();
+
+ loop_internal_waiter = (mutex == g_static_mutex_get_mutex (&context->mutex));
+
+ if (!loop_internal_waiter)
+ LOCK_CONTEXT (context);
+
+ if (context->owner && context->owner != self)
+ {
+ GMainWaiter waiter;
+
+ waiter.cond = cond;
+ waiter.mutex = mutex;
+
+ context->waiters = g_slist_append (context->waiters, &waiter);
+
+ if (!loop_internal_waiter)
+ UNLOCK_CONTEXT (context);
+ g_cond_wait (cond, mutex);
+ if (!loop_internal_waiter)
+ LOCK_CONTEXT (context);
+
+ context->waiters = g_slist_remove (context->waiters, &waiter);
+ }
+
+ if (!context->owner)
+ {
+ context->owner = self;
+ g_assert (context->owner_count == 0);
+ }
+
+ if (context->owner == self)
+ {
+ context->owner_count++;
+ result = TRUE;
+ }
+
+ if (!loop_internal_waiter)
+ UNLOCK_CONTEXT (context);
+
+ return result;
+#else /* !G_THREADS_ENABLED */
+ return TRUE;
+#endif /* G_THREADS_ENABLED */
+}
+
+/**
+ * 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 i;
+ 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, &current_time);
+
+ UNLOCK_CONTEXT (context);
+ return TRUE;
+ }
+#endif
+
+ /* If recursing, clear list of pending dispatches */
+
+ for (i = 0; i < context->pending_dispatches->len; i++)
+ {
+ if (context->pending_dispatches->pdata[i])
+ SOURCE_UNREF ((GSource *)context->pending_dispatches->pdata[i], context);
+ }
+ 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_BLOCKED (source))
+ 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: the number of records actually stored in @fds,
+ * or, if more than @n_fds records need to be stored, the number
+ * of records that need to be stored.
+ **/
+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()
+ *
+ * Passes 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 a;
+ read (context->wake_up_pipe[0], &a, 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_BLOCKED (source))
+ 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++;
+
+ /* never dispatch sources with less priority than the first
+ * one we choose to dispatch
+ */
+ max_priority = source->priority;
+ }
+
+ next:
+ source = next_valid_source (context, source);
+ }
+
+ UNLOCK_CONTEXT (context);
+
+ return n_ready > 0;
+}
+
+/**
+ * g_main_context_dispatch:
+ * @context: a #GMainContext
+ *
+ * Dispatches 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);
+}
+
+/* HOLDS context lock */
+static gboolean
+g_main_context_iterate (GMainContext *context,
+ gboolean block,
+ gboolean dispatch,
+ GThread *self)
+{
+ gint max_priority;
+ gint timeout;
+ gboolean some_ready;
+ gint nfds, allocated_nfds;
+ GPollFD *fds = NULL;
+
+ UNLOCK_CONTEXT (context);
+
+#ifdef G_THREADS_ENABLED
+ if (!g_main_context_acquire (context))
+ {
+ gboolean got_ownership;
+
+ g_return_val_if_fail (g_thread_supported (), FALSE);
+
+ if (!block)
+ return FALSE;
+
+ LOCK_CONTEXT (context);
+
+ if (!context->cond)
+ context->cond = g_cond_new ();
+
+ got_ownership = g_main_context_wait (context,
+ context->cond,
+ g_static_mutex_get_mutex (&context->mutex));
+
+ if (!got_ownership)
+ {
+ UNLOCK_CONTEXT (context);
+ return FALSE;
+ }
+ }
+ else
+ LOCK_CONTEXT (context);
+#endif /* G_THREADS_ENABLED */
+
+ if (!context->cached_poll_array)
+ {
+ context->cached_poll_array_size = context->n_poll_records;
+ context->cached_poll_array = g_new (GPollFD, context->n_poll_records);
+ }
+
+ allocated_nfds = context->cached_poll_array_size;
+ fds = context->cached_poll_array;
+
+ UNLOCK_CONTEXT (context);
+
+ g_main_context_prepare (context, &max_priority);
+
+ while ((nfds = g_main_context_query (context, max_priority, &timeout, fds,
+ allocated_nfds)) > allocated_nfds)
+ {
+ LOCK_CONTEXT (context);
+ g_free (fds);
+ context->cached_poll_array_size = allocated_nfds = nfds;
+ context->cached_poll_array = fds = g_new (GPollFD, nfds);
+ UNLOCK_CONTEXT (context);
+ }
+
+ if (!block)
+ timeout = 0;
+
+ g_main_context_poll (context, timeout, max_priority, fds, nfds);
+
+ some_ready = g_main_context_check (context, max_priority, fds, nfds);
+
+ if (dispatch)
+ g_main_context_dispatch (context);
+
+#ifdef G_THREADS_ENABLED
+ g_main_context_release (context);
+#endif /* G_THREADS_ENABLED */
+
+ LOCK_CONTEXT (context);
+
+ return some_ready;
+}
+
+/**
+ * g_main_context_pending:
+ * @context: a #GMainContext (if %NULL, the default context will be used)
+ *
+ * Checks if any sources have pending events for the given context.
+ *
+ * Return value: %TRUE if events are pending.
+ **/
+gboolean
+g_main_context_pending (GMainContext *context)
+{
+ gboolean retval;
+
+ if (!context)
+ context = g_main_context_default();
+
+ LOCK_CONTEXT (context);
+ retval = g_main_context_iterate (context, FALSE, FALSE, G_THREAD_SELF);
+ UNLOCK_CONTEXT (context);
+
+ return retval;
+}
+
+/**
+ * g_main_context_iteration:
+ * @context: a #GMainContext (if %NULL, the default context will be used)
+ * @may_block: whether the call may block.
+ *
+ * Runs 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)
+{
+ gboolean retval;
+
+ if (!context)
+ context = g_main_context_default();
+
+ LOCK_CONTEXT (context);
+ retval = g_main_context_iterate (context, may_block, TRUE, G_THREAD_SELF);
+ UNLOCK_CONTEXT (context);
+
+ return retval;
+}
+
+/**
+ * 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_loop_run() will set this to
+ * %TRUE anyway.
+ *
+ * Creates a new #GMainLoop structure.
+ *
+ * Return value: a new #GMainLoop.
+ **/
+GMainLoop *
+g_main_loop_new (GMainContext *context,
+ gboolean is_running)
+{
+ GMainLoop *loop;
+
+ if (!context)
+ context = g_main_context_default();
+
+ g_main_context_ref (context);
+
+ loop = g_new0 (GMainLoop, 1);
+ loop->context = context;
+ loop->is_running = is_running != FALSE;
+ loop->ref_count = 1;
+
+ return loop;
+}
+
+/**
+ * g_main_loop_ref:
+ * @loop: a #GMainLoop
+ *
+ * Increases 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);
+ g_return_val_if_fail (g_atomic_int_get (&loop->ref_count) > 0, NULL);
+
+ g_atomic_int_inc (&loop->ref_count);
+
+ return 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 (g_atomic_int_get (&loop->ref_count) > 0);
+
+ if (!g_atomic_int_dec_and_test (&loop->ref_count))
+ return;
+
+ g_main_context_unref (loop->context);
+ g_free (loop);
+}
+
+/**
+ * g_main_loop_run:
+ * @loop: a #GMainLoop
+ *
+ * Runs a main loop until g_main_loop_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)
+{
+ GThread *self = G_THREAD_SELF;
+
+ g_return_if_fail (loop != NULL);
+ g_return_if_fail (g_atomic_int_get (&loop->ref_count) > 0);
+
+#ifdef G_THREADS_ENABLED
+ if (!g_main_context_acquire (loop->context))
+ {
+ gboolean got_ownership = FALSE;
+
+ /* Another thread owns this context */
+ if (!g_thread_supported ())
+ {
+ g_warning ("g_main_loop_run() was called from second thread but "
+ "g_thread_init() was never called.");
+ return;
+ }
+
+ LOCK_CONTEXT (loop->context);
+
+ g_atomic_int_inc (&loop->ref_count);
+
+ if (!loop->is_running)
+ loop->is_running = TRUE;
+
+ if (!loop->context->cond)
+ loop->context->cond = g_cond_new ();
+
+ while (loop->is_running && !got_ownership)
+ got_ownership = g_main_context_wait (loop->context,
+ loop->context->cond,
+ g_static_mutex_get_mutex (&loop->context->mutex));
+
+ if (!loop->is_running)
+ {
+ UNLOCK_CONTEXT (loop->context);
+ if (got_ownership)
+ g_main_context_release (loop->context);
+ g_main_loop_unref (loop);
+ return;
+ }
+
+ g_assert (got_ownership);
+ }
+ else
+ LOCK_CONTEXT (loop->context);
+#endif /* G_THREADS_ENABLED */
+
+ if (loop->context->in_check_or_prepare)
+ {
+ g_warning ("g_main_loop_run(): called recursively from within a source's "
+ "check() or prepare() member, iteration not possible.");
+ return;
+ }
+
+ g_atomic_int_inc (&loop->ref_count);
+ loop->is_running = TRUE;
+ while (loop->is_running)
+ g_main_context_iterate (loop->context, TRUE, TRUE, self);
+
+ UNLOCK_CONTEXT (loop->context);
+
+#ifdef G_THREADS_ENABLED
+ g_main_context_release (loop->context);
+#endif /* G_THREADS_ENABLED */
+
+ g_main_loop_unref (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);
+ g_return_if_fail (g_atomic_int_get (&loop->ref_count) > 0);
+
+ LOCK_CONTEXT (loop->context);
+ loop->is_running = FALSE;
+ g_main_context_wakeup_unlocked (loop->context);
+
+#ifdef G_THREADS_ENABLED
+ if (loop->context->cond)
+ g_cond_broadcast (loop->context->cond);
+#endif /* G_THREADS_ENABLED */
+
+ UNLOCK_CONTEXT (loop->context);
+}
+
+/**
+ * g_main_loop_is_running:
+ * @loop: a #GMainLoop.
+ *
+ * Checks to see if the main loop is currently being run via g_main_loop_run().
+ *
+ * Return value: %TRUE if the mainloop is currently being run.
+ **/
+gboolean
+g_main_loop_is_running (GMainLoop *loop)
+{
+ g_return_val_if_fail (loop != NULL, FALSE);
+ g_return_val_if_fail (g_atomic_int_get (&loop->ref_count) > 0, FALSE);
+
+ return loop->is_running;
+}
+
+/**
+ * g_main_loop_get_context:
+ * @loop: a #GMainLoop.
+ *
+ * Returns the #GMainContext of @loop.
+ *
+ * Return value: the #GMainContext of @loop
+ **/
+GMainContext *
+g_main_loop_get_context (GMainLoop *loop)
+{
+ g_return_val_if_fail (loop != NULL, NULL);
+ g_return_val_if_fail (g_atomic_int_get (&loop->ref_count) > 0, NULL);
+
+ return loop->context;
+}
+
+/* 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)
+ {
+#ifndef G_OS_WIN32
+ g_warning ("poll(2) failed due to: %s.",
+ g_strerror (errno));
+#else
+ /* If g_poll () returns -1, it has already called g_warning() */
+#endif
+ }
+
+#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.
+ *
+ * Adds a file descriptor to the set of file descriptors polled for
+ * this context. This will very seldomly 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 ();
+
+ g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0);
+ g_return_if_fail (fd);
+
+ 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;
+ GPollRec *newrec = g_slice_new (GPollRec);
+
+ /* 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++;
+
+#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_unlocked (context);
+#endif
+}
+
+/**
+ * g_main_context_remove_poll:
+ * @context:a #GMainContext
+ * @fd: a #GPollFD descriptor previously added with g_main_context_add_poll()
+ *
+ * Removes 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 ();
+
+ g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0);
+ g_return_if_fail (fd);
+
+ 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;
+
+ g_slice_free (GPollRec, 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_unlocked (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 ();
+
+ g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0);
+
+ 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 ();
+
+ g_return_val_if_fail (g_atomic_int_get (&context->ref_count) > 0, NULL);
+
+ 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_unlocked (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
+}
+
+/**
+ * g_main_context_wakeup:
+ * @context: a #GMainContext
+ *
+ * If @context is currently waiting in a poll(), interrupt
+ * the poll(), and continue the iteration process.
+ **/
+void
+g_main_context_wakeup (GMainContext *context)
+{
+ if (!context)
+ context = g_main_context_default ();
+
+ g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0);
+
+ LOCK_CONTEXT (context);
+ g_main_context_wakeup_unlocked (context);
+ UNLOCK_CONTEXT (context);
+}
+
+/**
+ * g_main_context_is_owner:
+ * @context: a #GMainContext
+ *
+ * Determines whether this thread holds the (recursive)
+ * ownership of this #GMaincontext. This is useful to
+ * know before waiting on another thread that may be
+ * blocking to get ownership of @context.
+ *
+ * Returns: %TRUE if current thread is owner of @context.
+ *
+ * Since: 2.10
+ **/
+gboolean
+g_main_context_is_owner (GMainContext *context)
+{
+ gboolean is_owner;
+
+ if (!context)
+ context = g_main_context_default ();
+
+#ifdef G_THREADS_ENABLED
+ LOCK_CONTEXT (context);
+ is_owner = context->owner == G_THREAD_SELF;
+ UNLOCK_CONTEXT (context);
+#else
+ is_owner = TRUE;
+#endif
+
+ return is_owner;
+}
+
+/* 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++;
+ }
+ if (timer_perturb==-1)
+ {
+ /*
+ * we want a per machine/session unique 'random' value; try the dbus
+ * address first, that has a UUID in it. If there is no dbus, use the
+ * hostname for hashing.
+ */
+ const char *session_bus_address = getenv("DBUS_SESSION_BUS_ADDRESS");
+ if (!session_bus_address)
+ session_bus_address = getenv("HOSTNAME");
+ if (session_bus_address)
+ timer_perturb = g_str_hash(session_bus_address);
+ else
+ timer_perturb = 0;
+ }
+ if (timeout_source->granularity)
+ {
+ gint remainder;
+ gint gran; /* in usecs */
+ gint perturb;
+
+ gran = timeout_source->granularity * 1000;
+ perturb = timer_perturb % gran;
+ /*
+ * We want to give each machine a per machine pertubation;
+ * shift time back first, and forward later after the rounding
+ */
+
+ timeout_source->expiration.tv_usec -= perturb;
+ if (timeout_source->expiration.tv_usec < 0)
+ {
+ timeout_source->expiration.tv_usec += 1000000;
+ timeout_source->expiration.tv_sec--;
+ }
+
+ remainder = timeout_source->expiration.tv_usec % gran;
+ if (remainder >= gran/4) /* round up */
+ timeout_source->expiration.tv_usec += gran;
+ timeout_source->expiration.tv_usec -= remainder;
+ /* shift back */
+ timeout_source->expiration.tv_usec += perturb;
+
+ /* the rounding may have overflown tv_usec */
+ while (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, &current_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, &current_time);
+ msec = MIN (G_MAXINT, timeout_source->interval);
+ }
+ else
+ {
+ msec = MIN (G_MAXINT, (guint)msec + 1000 * (guint)sec);
+ }
+ }
+
+ *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, &current_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, &current_time);
+ g_timeout_set_expiration (timeout_source, &current_time);
+
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+/**
+ * g_timeout_source_new:
+ * @interval: the timeout interval in milliseconds.
+ *
+ * Creates 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-created timeout source
+ **/
+GSource *
+g_timeout_source_new (guint interval)
+{
+ GSource *source = g_source_new (&g_timeout_funcs, sizeof (GTimeoutSource));
+ GTimeoutSource *timeout_source = (GTimeoutSource *)source;
+ GTimeVal current_time;
+
+ timeout_source->interval = interval;
+
+ g_get_current_time (&current_time);
+ g_timeout_set_expiration (timeout_source, &current_time);
+
+ return source;
+}
+
+/**
+ * g_timeout_source_new_seconds:
+ * @interval: the timeout interval in seconds
+ *
+ * Creates 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.
+ * The scheduling granularity/accuracy of this timeout source will be
+ * in seconds.
+ *
+ * Return value: the newly-created timeout source
+ *
+ * Since: 2.14
+ **/
+GSource *
+g_timeout_source_new_seconds (guint interval)
+{
+ GSource *source = g_source_new (&g_timeout_funcs, sizeof (GTimeoutSource));
+ GTimeoutSource *timeout_source = (GTimeoutSource *)source;
+ GTimeVal current_time;
+
+ timeout_source->interval = 1000*interval;
+ timeout_source->granularity = 1000;
+
+ g_get_current_time (&current_time);
+ g_timeout_set_expiration (timeout_source, &current_time);
+
+ return source;
+}
+
+
+/**
+ * g_timeout_add_full:
+ * @priority: the priority of the idle source. Typically this will be in the
+ * range between #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 (greater than 0) of the 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 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).
+ *
+ * If you want to have a timer in the "seconds" range and do not care
+ * about the exact time of the first call of the timer, use the
+ * g_timeout_add_seconds() function; this function allows for more
+ * optimizations and more efficient system power usage.
+ *
+ * Return value: the ID (greater than 0) of the event source.
+ **/
+guint
+g_timeout_add (guint32 interval,
+ GSourceFunc function,
+ gpointer data)
+{
+ return g_timeout_add_full (G_PRIORITY_DEFAULT,
+ interval, function, data, NULL);
+}
+
+/**
+ * g_timeout_add_seconds:
+ * @interval: the time between calls to the function, in seconds
+ * @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.
+ *
+ * Unlike g_timeout_add(), this function operates at whole second granularity.
+ * The initial starting point of the timer is determined by the implementation
+ * and the implementation is expected to group multiple timers together so that
+ * they fire all at the same time.
+ * To allow this grouping, the @interval to the first timer is rounded
+ * and can deviate up to one second from the specified interval.
+ * Subsequent timer iterations will generally run at the specified 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
+ *
+ * If you want timing more precise than whole seconds, use g_timeout_add()
+ * instead.
+ *
+ * The grouping of timers to fire at the same time results in a more power
+ * and CPU efficient behavior so if your timer is in multiples of seconds
+ * and you don't require the first timer exactly 1 second from now, the
+ * use of g_timeout_add_second() is prefered over g_timeout_add().
+ *
+ * Return value: the ID (greater than 0) of the event source.
+ *
+ * Since: 2.14
+ **/
+guint
+g_timeout_add_seconds (guint32 interval,
+ GSourceFunc function,
+ gpointer data)
+{
+ GSource *source;
+ guint id;
+
+ g_return_val_if_fail (function != NULL, 0);
+
+ source = g_timeout_source_new_seconds (interval);
+
+ g_source_set_callback (source, function, data, NULL);
+ id = g_source_attach (source, NULL);
+ g_source_unref (source);
+
+ return id;
+}
+
+
+/* Child watch functions */
+
+#ifdef G_OS_WIN32
+
+static gboolean
+g_child_watch_prepare (GSource *source,
+ gint *timeout)
+{
+ *timeout = -1;
+ return FALSE;
+}
+
+
+static gboolean
+g_child_watch_check (GSource *source)
+{
+ GChildWatchSource *child_watch_source;
+ gboolean child_exited;
+
+ child_watch_source = (GChildWatchSource *) source;
+
+ child_exited = child_watch_source->poll.revents & G_IO_IN;
+
+ if (child_exited)
+ {
+ DWORD child_status;
+
+ /*
+ * Note: We do _not_ check for the special value of STILL_ACTIVE
+ * since we know that the process has exited and doing so runs into
+ * problems if the child process "happens to return STILL_ACTIVE(259)"
+ * as Microsoft's Platform SDK puts it.
+ */
+ if (!GetExitCodeProcess (child_watch_source->pid, &child_status))
+ {
+ gchar *emsg = g_win32_error_message (GetLastError ());
+ g_warning (G_STRLOC ": GetExitCodeProcess() failed: %s", emsg);
+ g_free (emsg);
+
+ child_watch_source->child_status = -1;
+ }
+ else
+ child_watch_source->child_status = child_status;
+ }
+
+ return child_exited;
+}
+
+#else /* G_OS_WIN32 */
+
+static gboolean
+check_for_child_exited (GSource *source)
+{
+ GChildWatchSource *child_watch_source;
+ gint count;
+
+ /* protect against another SIGCHLD in the middle of this call */
+ count = child_watch_count;
+
+ child_watch_source = (GChildWatchSource *) source;
+
+ if (child_watch_source->child_exited)
+ return TRUE;
+
+ if (child_watch_source->count < count)
+ {
+ gint child_status;
+
+ if (waitpid (child_watch_source->pid, &child_status, WNOHANG) > 0)
+ {
+ child_watch_source->child_status = child_status;
+ child_watch_source->child_exited = TRUE;
+ }
+ child_watch_source->count = count;
+ }
+
+ return child_watch_source->child_exited;
+}
+
+static gboolean
+g_child_watch_prepare (GSource *source,
+ gint *timeout)
+{
+ *timeout = -1;
+
+ return check_for_child_exited (source);
+}
+
+
+static gboolean
+g_child_watch_check (GSource *source)
+{
+ return check_for_child_exited (source);
+}
+
+#endif /* G_OS_WIN32 */
+
+static gboolean
+g_child_watch_dispatch (GSource *source,
+ GSourceFunc callback,
+ gpointer user_data)
+{
+ GChildWatchSource *child_watch_source;
+ GChildWatchFunc child_watch_callback = (GChildWatchFunc) callback;
+
+ child_watch_source = (GChildWatchSource *) source;
+
+ if (!callback)
+ {
+ g_warning ("Child watch source dispatched without callback\n"
+ "You must call g_source_set_callback().");
+ return FALSE;
+ }
+
+ (child_watch_callback) (child_watch_source->pid, child_watch_source->child_status, user_data);
+
+ /* We never keep a child watch source around as the child is gone */
+ return FALSE;
+}
+
+#ifndef G_OS_WIN32
+
+static void
+g_child_watch_signal_handler (int signum)
+{
+ child_watch_count ++;
+
+ if (child_watch_init_state == CHILD_WATCH_INITIALIZED_THREADED)
+ {
+ write (child_watch_wake_up_pipe[1], "B", 1);
+ }
+ else
+ {
+ /* We count on the signal interrupting the poll in the same thread.
+ */
+ }
+}
+
+static void
+g_child_watch_source_init_single (void)
+{
+ struct sigaction action;
+
+ g_assert (! g_thread_supported());
+ g_assert (child_watch_init_state == CHILD_WATCH_UNINITIALIZED);
+
+ child_watch_init_state = CHILD_WATCH_INITIALIZED_SINGLE;
+
+ action.sa_handler = g_child_watch_signal_handler;
+ sigemptyset (&action.sa_mask);
+ action.sa_flags = SA_NOCLDSTOP;
+ sigaction (SIGCHLD, &action, NULL);
+}
+
+static gpointer
+child_watch_helper_thread (gpointer data)
+{
+ while (1)
+ {
+ gchar b[20];
+ GSList *list;
+
+ read (child_watch_wake_up_pipe[0], b, 20);
+
+ /* We were woken up. Wake up all other contexts in all other threads */
+ G_LOCK (main_context_list);
+ for (list = main_context_list; list; list = list->next)
+ {
+ GMainContext *context;
+
+ context = list->data;
+ if (g_atomic_int_get (&context->ref_count) > 0)
+ /* Due to racing conditions we can find ref_count == 0, in
+ * that case, however, the context is still not destroyed
+ * and no poll can be active, otherwise the ref_count
+ * wouldn't be 0 */
+ g_main_context_wakeup (context);
+ }
+ G_UNLOCK (main_context_list);
+ }
+
+ return NULL;
+}
+
+static void
+g_child_watch_source_init_multi_threaded (void)
+{
+ GError *error = NULL;
+ struct sigaction action;
+
+ g_assert (g_thread_supported());
+
+ if (pipe (child_watch_wake_up_pipe) < 0)
+ g_error ("Cannot create wake up pipe: %s\n", g_strerror (errno));
+ fcntl (child_watch_wake_up_pipe[1], F_SETFL, O_NONBLOCK | fcntl (child_watch_wake_up_pipe[1], F_GETFL));
+
+ /* We create a helper thread that polls on the wakeup pipe indefinitely */
+ /* FIXME: Think this through for races */
+ if (g_thread_create (child_watch_helper_thread, NULL, FALSE, &error) == NULL)
+ g_error ("Cannot create a thread to monitor child exit status: %s\n", error->message);
+ child_watch_init_state = CHILD_WATCH_INITIALIZED_THREADED;
+
+ action.sa_handler = g_child_watch_signal_handler;
+ sigemptyset (&action.sa_mask);
+ action.sa_flags = SA_RESTART | SA_NOCLDSTOP;
+ sigaction (SIGCHLD, &action, NULL);
+}
+
+static void
+g_child_watch_source_init_promote_single_to_threaded (void)
+{
+ g_child_watch_source_init_multi_threaded ();
+}
+
+static void
+g_child_watch_source_init (void)
+{
+ if (g_thread_supported())
+ {
+ if (child_watch_init_state == CHILD_WATCH_UNINITIALIZED)
+ g_child_watch_source_init_multi_threaded ();
+ else if (child_watch_init_state == CHILD_WATCH_INITIALIZED_SINGLE)
+ g_child_watch_source_init_promote_single_to_threaded ();
+ }
+ else
+ {
+ if (child_watch_init_state == CHILD_WATCH_UNINITIALIZED)
+ g_child_watch_source_init_single ();
+ }
+}
+
+#endif /* !G_OS_WIN32 */
+
+/**
+ * g_child_watch_source_new:
+ * @pid: process id of a child process to watch. On Windows, a HANDLE
+ * for the process to watch (which actually doesn't have to be a child).
+ *
+ * Creates a new child_watch 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.
+ *
+ * Note that child watch sources can only be used in conjunction with
+ * <literal>g_spawn...</literal> when the %G_SPAWN_DO_NOT_REAP_CHILD
+ * flag is used.
+ *
+ * Note that on platforms where #GPid must be explicitly closed
+ * (see g_spawn_close_pid()) @pid must not be closed while the
+ * source is still active. Typically, you will want to call
+ * g_spawn_close_pid() in the callback function for the source.
+ *
+ * Note further that using g_child_watch_source_new() is not
+ * compatible with calling <literal>waitpid(-1)</literal> in
+ * the application. Calling waitpid() for individual pids will
+ * still work fine.
+ *
+ * Return value: the newly-created child watch source
+ *
+ * Since: 2.4
+ **/
+GSource *
+g_child_watch_source_new (GPid pid)
+{
+ GSource *source = g_source_new (&g_child_watch_funcs, sizeof (GChildWatchSource));
+ GChildWatchSource *child_watch_source = (GChildWatchSource *)source;
+
+#ifdef G_OS_WIN32
+ child_watch_source->poll.fd = (int)pid;
+ child_watch_source->poll.events = G_IO_IN;
+
+ g_source_add_poll (source, &child_watch_source->poll);
+#else /* G_OS_WIN32 */
+ g_child_watch_source_init ();
+#endif /* G_OS_WIN32 */
+
+ child_watch_source->pid = pid;
+
+ return source;
+}
+
+/**
+ * g_child_watch_add_full:
+ * @priority: the priority of the idle source. Typically this will be in the
+ * range between #G_PRIORITY_DEFAULT_IDLE and #G_PRIORITY_HIGH_IDLE.
+ * @pid: process id of a child process to watch
+ * @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 when the child indicated by @pid
+ * exits, at the priority @priority.
+ *
+ * If you obtain @pid from g_spawn_async() or g_spawn_async_with_pipes()
+ * you will need to pass #G_SPAWN_DO_NOT_REAP_CHILD as flag to
+ * the spawn function for the child watching to work.
+ *
+ * Note that on platforms where #GPid must be explicitly closed
+ * (see g_spawn_close_pid()) @pid must not be closed while the
+ * source is still active. Typically, you will want to call
+ * g_spawn_close_pid() in the callback function for the source.
+ *
+ * GLib supports only a single callback per process id.
+ *
+ * Return value: the ID (greater than 0) of the event source.
+ *
+ * Since: 2.4
+ **/
+guint
+g_child_watch_add_full (gint priority,
+ GPid pid,
+ GChildWatchFunc function,
+ gpointer data,
+ GDestroyNotify notify)
+{
+ GSource *source;
+ guint id;
+
+ g_return_val_if_fail (function != NULL, 0);
+
+ source = g_child_watch_source_new (pid);
+
+ if (priority != G_PRIORITY_DEFAULT)
+ g_source_set_priority (source, priority);
+
+ g_source_set_callback (source, (GSourceFunc) function, data, notify);
+ id = g_source_attach (source, NULL);
+ g_source_unref (source);
+
+ return id;
+}
+
+/**
+ * g_child_watch_add:
+ * @pid: process id of a child process to watch
+ * @function: function to call
+ * @data: data to pass to @function
+ *
+ * Sets a function to be called when the child indicated by @pid
+ * exits, at a default priority, #G_PRIORITY_DEFAULT.
+ *
+ * If you obtain @pid from g_spawn_async() or g_spawn_async_with_pipes()
+ * you will need to pass #G_SPAWN_DO_NOT_REAP_CHILD as flag to
+ * the spawn function for the child watching to work.
+ *
+ * Note that on platforms where #GPid must be explicitly closed
+ * (see g_spawn_close_pid()) @pid must not be closed while the
+ * source is still active. Typically, you will want to call
+ * g_spawn_close_pid() in the callback function for the source.
+ *
+ * GLib supports only a single callback per process id.
+ *
+ * Return value: the ID (greater than 0) of the event source.
+ *
+ * Since: 2.4
+ **/
+guint
+g_child_watch_add (GPid pid,
+ GChildWatchFunc function,
+ gpointer data)
+{
+ return g_child_watch_add_full (G_PRIORITY_DEFAULT, pid, 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:
+ *
+ * Creates 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. Note that the default priority for idle sources is
+ * %G_PRIORITY_DEFAULT_IDLE, as compared to other sources which
+ * have a default priority of %G_PRIORITY_DEFAULT.
+ *
+ * Return value: the newly-created idle source
+ **/
+GSource *
+g_idle_source_new (void)
+{
+ GSource *source;
+
+ source = g_source_new (&g_idle_funcs, sizeof (GSource));
+ g_source_set_priority (source, G_PRIORITY_DEFAULT_IDLE);
+
+ return source;
+}
+
+/**
+ * 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 (greater than 0) 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_IDLE)
+ 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 (greater than 0) 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 (&g_idle_funcs, data);
+}
+
+#define __G_MAIN_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gmain.h b/trunk/glib/gmain.h
new file mode 100644
index 000000000..1d201dd84
--- /dev/null
+++ b/trunk/glib/gmain.h
@@ -0,0 +1,332 @@
+/* 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 <glib/gslist.h>
+#include <glib/gthread.h>
+
+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);
+typedef void (*GChildWatchFunc) (GPid pid,
+ gint status,
+ gpointer data);
+struct _GSource
+{
+ /*< private >*/
+ gpointer callback_data;
+ GSourceCallbackFuncs *callback_funcs;
+
+ GSourceFuncs *source_funcs;
+ guint ref_count;
+
+ GMainContext *context;
+
+ gint priority;
+ guint flags;
+ guint source_id;
+
+ GSList *poll_fds;
+
+ GSource *prev;
+ GSource *next;
+
+ gpointer reserved1;
+ gpointer reserved2;
+};
+
+struct _GSourceCallbackFuncs
+{
+ void (*ref) (gpointer cb_data);
+ void (*unref) (gpointer cb_data);
+ void (*get) (gpointer cb_data,
+ GSource *source,
+ GSourceFunc *func,
+ gpointer *data);
+};
+
+typedef void (*GSourceDummyMarshal) (void);
+
+struct _GSourceFuncs
+{
+ gboolean (*prepare) (GSource *source,
+ gint *timeout_);
+ gboolean (*check) (GSource *source);
+ gboolean (*dispatch) (GSource *source,
+ GSourceFunc callback,
+ gpointer user_data);
+ void (*finalize) (GSource *source); /* Can be NULL */
+
+ /* For use by g_source_set_closure */
+ GSourceFunc closure_callback;
+ GSourceDummyMarshal closure_marshal; /* Really is of type GClosureMarshal */
+};
+
+/* 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.
+ *
+ * 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
+{
+#if defined (G_OS_WIN32) && GLIB_SIZEOF_VOID_P == 8
+ gint64 fd;
+#else
+ gint fd;
+#endif
+ 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_new (void);
+GMainContext *g_main_context_ref (GMainContext *context);
+void g_main_context_unref (GMainContext *context);
+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 source_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.
+ */
+void g_main_context_wakeup (GMainContext *context);
+gboolean g_main_context_acquire (GMainContext *context);
+void g_main_context_release (GMainContext *context);
+gboolean g_main_context_is_owner (GMainContext *context);
+gboolean g_main_context_wait (GMainContext *context,
+ GCond *cond,
+ GMutex *mutex);
+
+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);
+
+gint g_main_depth (void);
+GSource *g_main_current_source (void);
+
+
+/* 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);
+GMainContext *g_main_loop_get_context (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);
+
+void g_source_set_funcs (GSource *source,
+ GSourceFuncs *funcs);
+gboolean g_source_is_destroyed (GSource *source);
+
+/* 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_child_watch_source_new (GPid pid);
+GSource *g_timeout_source_new (guint interval);
+GSource *g_timeout_source_new_seconds (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, child watchers 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_timeout_add_seconds (guint interval,
+ GSourceFunc function,
+ gpointer data);
+guint g_child_watch_add_full (gint priority,
+ GPid pid,
+ GChildWatchFunc function,
+ gpointer data,
+ GDestroyNotify notify);
+guint g_child_watch_add (GPid pid,
+ GChildWatchFunc 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);
+
+/* Hook for GClosure / GSource integration. Don't touch */
+GLIB_VAR GSourceFuncs g_timeout_funcs;
+GLIB_VAR GSourceFuncs g_child_watch_funcs;
+GLIB_VAR GSourceFuncs g_idle_funcs;
+
+G_END_DECLS
+
+#endif /* __G_MAIN_H__ */
diff --git a/trunk/glib/gmappedfile.c b/trunk/glib/gmappedfile.c
new file mode 100644
index 000000000..d3d4de8bc
--- /dev/null
+++ b/trunk/glib/gmappedfile.c
@@ -0,0 +1,278 @@
+/* GLIB - Library of useful routines for C programming
+ * gmappedfile.c: Simplified wrapper around the mmap() function.
+ *
+ * Copyright 2005 Matthias Clasen
+ *
+ * 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 "config.h"
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_MMAP
+#include <sys/mman.h>
+#endif
+
+#include "glibconfig.h"
+
+#ifdef G_OS_WIN32
+#include <windows.h>
+#include <io.h>
+#endif
+
+#include "gconvert.h"
+#include "gerror.h"
+#include "gfileutils.h"
+#include "gmappedfile.h"
+#include "gmem.h"
+#include "gmessages.h"
+#include "gstdio.h"
+#include "gstrfuncs.h"
+
+#include "glibintl.h"
+
+#include "galias.h"
+
+#ifndef _O_BINARY
+#define _O_BINARY 0
+#endif
+
+#ifndef MAP_FAILED
+#define MAP_FAILED ((void *) -1)
+#endif
+
+struct _GMappedFile
+{
+ gsize length;
+ gchar *contents;
+#ifdef G_OS_WIN32
+ HANDLE mapping;
+#endif
+};
+
+/**
+ * g_mapped_file_new:
+ * @filename: The path of the file to load, in the GLib filename encoding
+ * @writable: wether the mapping should be writable
+ * @error: return location for a #GError, or %NULL
+ *
+ * Maps a file into memory. On UNIX, this is using the mmap() function.
+ *
+ * If @writable is %TRUE, the mapped buffer may be modified, otherwise
+ * it is an error to modify the mapped buffer. Modifications to the buffer
+ * are not visible to other processes mapping the same file, and are not
+ * written back to the file.
+ *
+ * Note that modifications of the underlying file might affect the contents
+ * of the #GMappedFile. Therefore, mapping should only be used if the file
+ * will not be modified, or if all modifications of the file are done
+ * atomically (e.g. using g_file_set_contents()).
+ *
+ * Return value: a newly allocated #GMappedFile which must be freed
+ * with g_mapped_file_free(), or %NULL if the mapping failed.
+ *
+ * Since: 2.8
+ */
+GMappedFile *
+g_mapped_file_new (const gchar *filename,
+ gboolean writable,
+ GError **error)
+{
+ GMappedFile *file;
+ int fd;
+ struct stat st;
+
+ g_return_val_if_fail (filename != NULL, NULL);
+ g_return_val_if_fail (!error || *error == NULL, NULL);
+
+ fd = g_open (filename, (writable ? O_RDWR : O_RDONLY) | _O_BINARY, 0);
+ if (fd == -1)
+ {
+ int save_errno = errno;
+ gchar *display_filename = g_filename_display_name (filename);
+
+ g_set_error (error,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to open file '%s': open() failed: %s"),
+ display_filename,
+ g_strerror (save_errno));
+ g_free (display_filename);
+ return NULL;
+ }
+
+ file = g_new0 (GMappedFile, 1);
+
+ if (fstat (fd, &st) == -1)
+ {
+ int save_errno = errno;
+ gchar *display_filename = g_filename_display_name (filename);
+
+ g_set_error (error,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to get attributes of file '%s': fstat() failed: %s"),
+ display_filename,
+ g_strerror (save_errno));
+ g_free (display_filename);
+ goto out;
+ }
+
+ if (st.st_size == 0)
+ {
+ file->length = 0;
+ file->contents = "";
+ close (fd);
+ return file;
+ }
+
+ file->contents = MAP_FAILED;
+
+#ifdef HAVE_MMAP
+ if (st.st_size > G_MAXSIZE)
+ {
+ errno = EINVAL;
+ }
+ else
+ {
+ file->length = (gsize) st.st_size;
+ file->contents = (gchar *) mmap (NULL, file->length,
+ writable ? PROT_READ|PROT_WRITE : PROT_READ,
+ MAP_PRIVATE, fd, 0);
+ }
+#endif
+#ifdef G_OS_WIN32
+ file->length = st.st_size;
+ file->mapping = CreateFileMapping ((HANDLE) _get_osfhandle (fd), NULL,
+ writable ? PAGE_WRITECOPY : PAGE_READONLY,
+ 0, 0,
+ NULL);
+ if (file->mapping != NULL)
+ {
+ file->contents = MapViewOfFile (file->mapping,
+ writable ? FILE_MAP_COPY : FILE_MAP_READ,
+ 0, 0,
+ 0);
+ if (file->contents == NULL)
+ {
+ file->contents = MAP_FAILED;
+ CloseHandle (file->mapping);
+ file->mapping = NULL;
+ }
+ }
+#endif
+
+
+ if (file->contents == MAP_FAILED)
+ {
+ int save_errno = errno;
+ gchar *display_filename = g_filename_display_name (filename);
+
+ g_set_error (error,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to map file '%s': mmap() failed: %s"),
+ display_filename,
+ g_strerror (save_errno));
+ g_free (display_filename);
+ goto out;
+ }
+
+ close (fd);
+ return file;
+
+ out:
+ close (fd);
+ g_free (file);
+
+ return NULL;
+}
+
+/**
+ * g_mapped_file_get_length:
+ * @file: a #GMappedFile
+ *
+ * Returns the length of the contents of a #GMappedFile.
+ *
+ * Returns: the length of the contents of @file.
+ *
+ * Since: 2.8
+ */
+gsize
+g_mapped_file_get_length (GMappedFile *file)
+{
+ g_return_val_if_fail (file != NULL, 0);
+
+ return file->length;
+}
+
+/**
+ * g_mapped_file_get_contents:
+ * @file: a #GMappedFile
+ *
+ * Returns the contents of a #GMappedFile.
+ *
+ * Note that the contents may not be zero-terminated,
+ * even if the #GMappedFile is backed by a text file.
+ *
+ * Returns: the contents of @file.
+ *
+ * Since: 2.8
+ */
+gchar *
+g_mapped_file_get_contents (GMappedFile *file)
+{
+ g_return_val_if_fail (file != NULL, NULL);
+
+ return file->contents;
+}
+
+/**
+ * g_mapped_file_free:
+ * @file: a #GMappedFile
+ *
+ * Unmaps the buffer of @file and frees it.
+ *
+ * Since: 2.8
+ */
+void
+g_mapped_file_free (GMappedFile *file)
+{
+ g_return_if_fail (file != NULL);
+
+ if (file->length)
+ {
+#ifdef HAVE_MMAP
+ munmap (file->contents, file->length);
+#endif
+#ifdef G_OS_WIN32
+ UnmapViewOfFile (file->contents);
+ CloseHandle (file->mapping);
+#endif
+ }
+
+ g_free (file);
+}
+
+
+#define __G_MAPPED_FILE_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gmappedfile.h b/trunk/glib/gmappedfile.h
new file mode 100644
index 000000000..123bc6af2
--- /dev/null
+++ b/trunk/glib/gmappedfile.h
@@ -0,0 +1,39 @@
+/* GLIB - Library of useful routines for C programming
+ * gmappedfile.h: Simplified wrapper around the mmap function
+ *
+ * Copyright 2005 Matthias Clasen
+ *
+ * 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_MAPPED_FILE_H__
+#define __G_MAPPED_FILE_H__
+
+#include <glib/gerror.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GMappedFile GMappedFile;
+
+GMappedFile *g_mapped_file_new (const gchar *filename,
+ gboolean writable,
+ GError **error) G_GNUC_MALLOC;
+gsize g_mapped_file_get_length (GMappedFile *file);
+gchar *g_mapped_file_get_contents (GMappedFile *file);
+void g_mapped_file_free (GMappedFile *file);
+
+G_END_DECLS
+
+#endif /* __G_MAPPED_FILE_H__ */
diff --git a/trunk/glib/gmarkup.c b/trunk/glib/gmarkup.c
new file mode 100644
index 000000000..ee2576aa0
--- /dev/null
+++ b/trunk/glib/gmarkup.c
@@ -0,0 +1,2284 @@
+/* gmarkup.c - Simple XML-like parser
+ *
+ * Copyright 2000, 2003 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 <stdarg.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include "glib.h"
+#include "glibintl.h"
+#include "galias.h"
+
+GQuark
+g_markup_error_quark (void)
+{
+ return g_quark_from_static_string ("g-markup-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_AFTER_ATTRIBUTE_NAME,
+ STATE_BETWEEN_ATTRIBUTES,
+ STATE_AFTER_ATTRIBUTE_EQUALS_SIGN,
+ STATE_INSIDE_ATTRIBUTE_VALUE_SQ,
+ STATE_INSIDE_ATTRIBUTE_VALUE_DQ,
+ STATE_INSIDE_TEXT,
+ STATE_AFTER_CLOSE_TAG_SLASH,
+ STATE_INSIDE_CLOSE_TAG_NAME,
+ STATE_AFTER_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;
+ gint balance;
+};
+
+/**
+ * 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;
+
+ context->balance = 0;
+
+ 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,
+ ...) G_GNUC_PRINTF (4, 5);
+
+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);
+}
+
+
+/* To make these faster, we first use the ascii-only tests, then check
+ * for the usual non-alnum name-end chars, and only then call the
+ * expensive unicode stuff. Nobody uses non-ascii in XML tag/attribute
+ * names, so this is a reasonable hack that virtually always avoids
+ * the guniprop call.
+ */
+#define IS_COMMON_NAME_END_CHAR(c) \
+ ((c) == '=' || (c) == '/' || (c) == '>' || (c) == ' ')
+
+static gboolean
+is_name_start_char (const gchar *p)
+{
+ if (g_ascii_isalpha (*p) ||
+ (!IS_COMMON_NAME_END_CHAR (*p) &&
+ (*p == '_' ||
+ *p == ':' ||
+ g_unichar_isalpha (g_utf8_get_char (p)))))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static gboolean
+is_name_char (const gchar *p)
+{
+ if (g_ascii_isalnum (*p) ||
+ (!IS_COMMON_NAME_END_CHAR (*p) &&
+ (*p == '.' ||
+ *p == '-' ||
+ *p == '_' ||
+ *p == ':' ||
+ g_unichar_isalpha (g_utf8_get_char (p)))))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+
+static gchar*
+char_str (gunichar c,
+ gchar *buf)
+{
+ memset (buf, 0, 8);
+ 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;
+
+typedef struct
+{
+ GMarkupParseContext *context;
+ GString *str;
+ UnescapeState state;
+ const gchar *text;
+ const gchar *text_end;
+ const gchar *entity_start;
+} UnescapeContext;
+
+static const gchar*
+unescape_text_state_inside_text (UnescapeContext *ucontext,
+ const gchar *p,
+ GError **error)
+{
+ const gchar *start;
+ gboolean normalize_attribute;
+
+ if (ucontext->context->state == STATE_INSIDE_ATTRIBUTE_VALUE_SQ ||
+ ucontext->context->state == STATE_INSIDE_ATTRIBUTE_VALUE_DQ)
+ normalize_attribute = TRUE;
+ else
+ normalize_attribute = FALSE;
+
+ start = p;
+
+ while (p != ucontext->text_end)
+ {
+ if (*p == '&')
+ {
+ break;
+ }
+ else if (normalize_attribute && (*p == '\t' || *p == '\n'))
+ {
+ g_string_append_len (ucontext->str, start, p - start);
+ g_string_append_c (ucontext->str, ' ');
+ p = g_utf8_next_char (p);
+ start = p;
+ }
+ else if (*p == '\r')
+ {
+ g_string_append_len (ucontext->str, start, p - start);
+ g_string_append_c (ucontext->str, normalize_attribute ? ' ' : '\n');
+ p = g_utf8_next_char (p);
+ if (p != ucontext->text_end && *p == '\n')
+ p = g_utf8_next_char (p);
+ start = p;
+ }
+ else
+ p = g_utf8_next_char (p);
+ }
+
+ if (p != start)
+ g_string_append_len (ucontext->str, start, p - start);
+
+ if (p != ucontext->text_end && *p == '&')
+ {
+ p = g_utf8_next_char (p);
+ ucontext->state = USTATE_AFTER_AMPERSAND;
+ }
+
+ return p;
+}
+
+static const gchar*
+unescape_text_state_after_ampersand (UnescapeContext *ucontext,
+ const gchar *p,
+ GError **error)
+{
+ ucontext->entity_start = NULL;
+
+ if (*p == '#')
+ {
+ p = g_utf8_next_char (p);
+
+ ucontext->entity_start = p;
+ ucontext->state = USTATE_AFTER_CHARREF_HASH;
+ }
+ else if (!is_name_start_char (p))
+ {
+ if (*p == ';')
+ {
+ set_unescape_error (ucontext->context, error,
+ p, ucontext->text_end,
+ G_MARKUP_ERROR_PARSE,
+ _("Empty entity '&;' seen; valid "
+ "entities are: &amp; &quot; &lt; &gt; &apos;"));
+ }
+ else
+ {
+ gchar buf[8];
+
+ set_unescape_error (ucontext->context, error,
+ p, ucontext->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 "
+ "&amp;"),
+ utf8_str (p, buf));
+ }
+ }
+ else
+ {
+ ucontext->entity_start = p;
+ ucontext->state = USTATE_INSIDE_ENTITY_NAME;
+ }
+
+ return p;
+}
+
+static const gchar*
+unescape_text_state_inside_entity_name (UnescapeContext *ucontext,
+ const gchar *p,
+ GError **error)
+{
+ while (p != ucontext->text_end)
+ {
+ if (*p == ';')
+ break;
+ else if (!is_name_char (p))
+ {
+ gchar ubuf[8];
+
+ set_unescape_error (ucontext->context, error,
+ p, ucontext->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 (ucontext->context->state != STATE_ERROR)
+ {
+ if (p != ucontext->text_end)
+ {
+ gint len = p - ucontext->entity_start;
+
+ /* move to after semicolon */
+ p = g_utf8_next_char (p);
+ ucontext->state = USTATE_INSIDE_TEXT;
+
+ if (strncmp (ucontext->entity_start, "lt", len) == 0)
+ g_string_append_c (ucontext->str, '<');
+ else if (strncmp (ucontext->entity_start, "gt", len) == 0)
+ g_string_append_c (ucontext->str, '>');
+ else if (strncmp (ucontext->entity_start, "amp", len) == 0)
+ g_string_append_c (ucontext->str, '&');
+ else if (strncmp (ucontext->entity_start, "quot", len) == 0)
+ g_string_append_c (ucontext->str, '"');
+ else if (strncmp (ucontext->entity_start, "apos", len) == 0)
+ g_string_append_c (ucontext->str, '\'');
+ else
+ {
+ gchar *name;
+
+ name = g_strndup (ucontext->entity_start, len);
+ set_unescape_error (ucontext->context, error,
+ p, ucontext->text_end,
+ G_MARKUP_ERROR_PARSE,
+ _("Entity name '%s' is not known"),
+ name);
+ g_free (name);
+ }
+ }
+ else
+ {
+ set_unescape_error (ucontext->context, error,
+ /* give line number of the & */
+ ucontext->entity_start, ucontext->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 &amp;"));
+ }
+ }
+#undef MAX_ENT_LEN
+
+ return p;
+}
+
+static const gchar*
+unescape_text_state_after_charref_hash (UnescapeContext *ucontext,
+ const gchar *p,
+ GError **error)
+{
+ gboolean is_hex = FALSE;
+ const char *start;
+
+ start = ucontext->entity_start;
+
+ if (*p == 'x')
+ {
+ is_hex = TRUE;
+ p = g_utf8_next_char (p);
+ start = p;
+ }
+
+ while (p != ucontext->text_end && *p != ';')
+ p = g_utf8_next_char (p);
+
+ if (p != ucontext->text_end)
+ {
+ g_assert (*p == ';');
+
+ /* digit is between start and p */
+
+ if (start != p)
+ {
+ gulong l;
+ gchar *end = NULL;
+
+ errno = 0;
+ if (is_hex)
+ l = strtoul (start, &end, 16);
+ else
+ l = strtoul (start, &end, 10);
+
+ if (end != p || errno != 0)
+ {
+ set_unescape_error (ucontext->context, error,
+ start, ucontext->text_end,
+ G_MARKUP_ERROR_PARSE,
+ _("Failed to parse '%-.*s', which "
+ "should have been a digit "
+ "inside a character reference "
+ "(&#234; for example) - perhaps "
+ "the digit is too large"),
+ p - start, start);
+ }
+ 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[8];
+ g_string_append (ucontext->str, char_str (l, buf));
+ }
+ else
+ {
+ set_unescape_error (ucontext->context, error,
+ start, ucontext->text_end,
+ G_MARKUP_ERROR_PARSE,
+ _("Character reference '%-.*s' does not "
+ "encode a permitted character"),
+ p - start, start);
+ }
+ }
+
+ /* Move to next state */
+ p = g_utf8_next_char (p); /* past semicolon */
+ ucontext->state = USTATE_INSIDE_TEXT;
+ }
+ else
+ {
+ set_unescape_error (ucontext->context, error,
+ start, ucontext->text_end,
+ G_MARKUP_ERROR_PARSE,
+ _("Empty character reference; "
+ "should include a digit such as "
+ "&#454;"));
+ }
+ }
+ else
+ {
+ set_unescape_error (ucontext->context, error,
+ start, ucontext->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 &amp;"));
+ }
+
+ return p;
+}
+
+static gboolean
+unescape_text (GMarkupParseContext *context,
+ const gchar *text,
+ const gchar *text_end,
+ GString **unescaped,
+ GError **error)
+{
+ UnescapeContext ucontext;
+ const gchar *p;
+
+ ucontext.context = context;
+ ucontext.text = text;
+ ucontext.text_end = text_end;
+ ucontext.entity_start = NULL;
+
+ ucontext.str = g_string_sized_new (text_end - text);
+
+ ucontext.state = USTATE_INSIDE_TEXT;
+ p = text;
+
+ while (p != text_end && context->state != STATE_ERROR)
+ {
+ g_assert (p < text_end);
+
+ switch (ucontext.state)
+ {
+ case USTATE_INSIDE_TEXT:
+ {
+ p = unescape_text_state_inside_text (&ucontext,
+ p,
+ error);
+ }
+ break;
+
+ case USTATE_AFTER_AMPERSAND:
+ {
+ p = unescape_text_state_after_ampersand (&ucontext,
+ p,
+ error);
+ }
+ break;
+
+
+ case USTATE_INSIDE_ENTITY_NAME:
+ {
+ p = unescape_text_state_inside_entity_name (&ucontext,
+ p,
+ error);
+ }
+ break;
+
+ case USTATE_AFTER_CHARREF_HASH:
+ {
+ p = unescape_text_state_after_charref_hash (&ucontext,
+ p,
+ error);
+ }
+ break;
+
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ }
+
+ if (context->state != STATE_ERROR)
+ {
+ switch (ucontext.state)
+ {
+ case USTATE_INSIDE_TEXT:
+ break;
+ case USTATE_AFTER_AMPERSAND:
+ case USTATE_INSIDE_ENTITY_NAME:
+ set_unescape_error (context, error,
+ NULL, NULL,
+ G_MARKUP_ERROR_PARSE,
+ _("Unfinished entity reference"));
+ break;
+ case USTATE_AFTER_CHARREF_HASH:
+ set_unescape_error (context, error,
+ NULL, NULL,
+ G_MARKUP_ERROR_PARSE,
+ _("Unfinished character reference"));
+ break;
+ }
+ }
+
+ if (context->state == STATE_ERROR)
+ {
+ g_string_free (ucontext.str, TRUE);
+ *unescaped = NULL;
+ return FALSE;
+ }
+ else
+ {
+ *unescaped = ucontext.str;
+ return TRUE;
+ }
+}
+
+static inline gboolean
+advance_char (GMarkupParseContext *context)
+{
+ context->iter = g_utf8_next_char (context->iter);
+ context->char_number += 1;
+
+ if (context->iter == context->current_text_end)
+ {
+ return FALSE;
+ }
+ else if (*context->iter == '\n')
+ {
+ context->line_number += 1;
+ context->char_number = 1;
+ }
+
+ return TRUE;
+}
+
+static inline gboolean
+xml_isspace (char c)
+{
+ return c == ' ' || c == '\t' || c == '\n' || c == '\r';
+}
+
+static void
+skip_spaces (GMarkupParseContext *context)
+{
+ do
+ {
+ if (!xml_isspace (*context->iter))
+ return;
+ }
+ while (advance_char (context));
+}
+
+static void
+advance_to_name_end (GMarkupParseContext *context)
+{
+ do
+ {
+ if (!is_name_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_sized_new (text_end - text_start);
+
+ 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.
+ * It assumes the string starts with a character start
+ */
+ const gchar *end = context->current_text + context->current_text_len;
+ const gchar *p;
+ const gchar *next;
+
+ g_assert (context->current_text_len > 0);
+
+ p = g_utf8_find_prev_char (context->current_text, end);
+
+ g_assert (p != NULL); /* since current_text was a char start */
+
+ /* 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;
+ context->attr_values[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, *q;
+ q = p = context->current_text;
+ while (p != first_invalid)
+ {
+ if (*p == '\n')
+ {
+ ++newlines;
+ q = p + 1;
+ context->char_number = 1;
+ }
+ ++p;
+ }
+
+ context->line_number += newlines;
+ context->char_number += g_utf8_strlen (q, first_invalid - q);
+
+ 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. <book>)"));
+ }
+ }
+ 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->balance = 1;
+ 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 (context->iter))
+ {
+ context->state = STATE_INSIDE_OPEN_TAG_NAME;
+
+ /* start of tag name */
+ context->start = context->iter;
+ }
+ else
+ {
+ gchar buf[8];
+
+ 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[8];
+
+ 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_NAME */
+
+ advance_to_name_end (context);
+ add_to_partial (context, context->start, context->iter);
+
+ /* 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.
+ */
+ if (context->iter != context->current_text_end)
+ context->state = STATE_AFTER_ATTRIBUTE_NAME;
+ break;
+
+ case STATE_AFTER_ATTRIBUTE_NAME:
+ /* Possible next states: AFTER_ATTRIBUTE_EQUALS_SIGN */
+
+ skip_spaces (context);
+
+ if (context->iter != context->current_text_end)
+ {
+ /* The name has ended. Combine it with the partial chunk
+ * if any; push it on the stack; enter next state.
+ */
+ 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[8];
+
+ 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 (context->iter))
+ {
+ context->state = STATE_INSIDE_ATTRIBUTE_NAME;
+ /* start of attribute name */
+ context->start = context->iter;
+ }
+ else
+ {
+ gchar buf[8];
+
+ 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 = &empty;
+ const gchar **attr_values = &empty;
+ 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;
+ }
+ g_assert (context->cur_attr == -1);
+ g_assert (context->attr_names == NULL ||
+ context->attr_names[0] == NULL);
+ g_assert (context->attr_values == NULL ||
+ context->attr_values[0] == NULL);
+
+ 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_[SQ/DQ] */
+
+ skip_spaces (context);
+
+ if (context->iter != context->current_text_end)
+ {
+ if (*context->iter == '"')
+ {
+ advance_char (context);
+ context->state = STATE_INSIDE_ATTRIBUTE_VALUE_DQ;
+ context->start = context->iter;
+ }
+ else if (*context->iter == '\'')
+ {
+ advance_char (context);
+ context->state = STATE_INSIDE_ATTRIBUTE_VALUE_SQ;
+ context->start = context->iter;
+ }
+ else
+ {
+ gchar buf[8];
+
+ 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_SQ:
+ case STATE_INSIDE_ATTRIBUTE_VALUE_DQ:
+ /* Possible next states: BETWEEN_ATTRIBUTES */
+ {
+ gchar delim;
+
+ if (context->state == STATE_INSIDE_ATTRIBUTE_VALUE_SQ)
+ {
+ delim = '\'';
+ }
+ else
+ {
+ delim = '"';
+ }
+
+ do
+ {
+ if (*context->iter == delim)
+ 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.
+ */
+ GString *unescaped;
+
+ 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,
+ &unescaped,
+ error))
+ {
+ /* success, advance past quote and set state. */
+ context->attr_values[context->cur_attr] = g_string_free (unescaped, FALSE);
+ 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)
+ {
+ GString *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->str,
+ unescaped->len,
+ context->user_data,
+ &tmp_error);
+
+ g_string_free (unescaped, TRUE);
+
+ 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 (context->iter))
+ {
+ context->state = STATE_INSIDE_CLOSE_TAG_NAME;
+
+ /* start of tag name */
+ context->start = context->iter;
+ }
+ else
+ {
+ gchar buf[8];
+
+ set_error (context,
+ error,
+ G_MARKUP_ERROR_PARSE,
+ _("'%s' is not a valid character following "
+ "the characters '</'; '%s' may not begin an "
+ "element name"),
+ utf8_str (context->iter, buf),
+ utf8_str (context->iter, buf));
+ }
+ break;
+
+ case STATE_INSIDE_CLOSE_TAG_NAME:
+ /* Possible next state: AFTER_CLOSE_TAG_NAME */
+ advance_to_name_end (context);
+ add_to_partial (context, context->start, context->iter);
+
+ if (context->iter != context->current_text_end)
+ context->state = STATE_AFTER_CLOSE_TAG_NAME;
+ break;
+
+ case STATE_AFTER_CLOSE_TAG_NAME:
+ /* Possible next state: AFTER_CLOSE_TAG_SLASH */
+
+ skip_spaces (context);
+
+ if (context->iter != context->current_text_end)
+ {
+ gchar *close_name;
+
+ /* 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.
+ */
+ close_name = g_string_free (context->partial_chunk, FALSE);
+ context->partial_chunk = NULL;
+
+ if (*context->iter != '>')
+ {
+ gchar buf[8];
+
+ 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 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
+ {
+ 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 == '<')
+ context->balance++;
+ if (*context->iter == '>')
+ {
+ gchar *str;
+ gsize len;
+
+ context->balance--;
+ add_to_partial (context, context->start, context->iter);
+ context->start = context->iter;
+
+ str = context->partial_chunk->str;
+ len = context->partial_chunk->len;
+
+ if (str[1] == '?' && str[len - 1] == '?')
+ break;
+ if (strncmp (str, "<!--", 4) == 0 &&
+ strcmp (str + len - 2, "--") == 0)
+ break;
+ if (strncmp (str, "<![CDATA[", 9) == 0 &&
+ strcmp (str + len - 2, "]]") == 0)
+ break;
+ if (strncmp (str, "<!DOCTYPE", 9) == 0 &&
+ context->balance == 0)
+ 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->flags & G_MARKUP_TREAT_CDATA_AS_TEXT &&
+ strncmp (context->partial_chunk->str, "<![CDATA[", 9) == 0)
+ {
+ if (context->parser->text)
+ (*context->parser->text) (context,
+ context->partial_chunk->str + 9,
+ context->partial_chunk->len - 12,
+ context->user_data,
+ &tmp_error);
+ }
+ else 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_SQ:
+ case STATE_INSIDE_ATTRIBUTE_VALUE_DQ:
+ 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 (context));
+ 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_element:
+ * @context: a #GMarkupParseContext
+ * @returns: the name of the currently open element, or %NULL
+ *
+ * Retrieves the name of the currently open element.
+ *
+ * Since: 2.2
+ **/
+G_CONST_RETURN gchar *
+g_markup_parse_context_get_element (GMarkupParseContext *context)
+{
+ g_return_val_if_fail (context != NULL, NULL);
+
+ if (context->tag_stack == NULL)
+ return NULL;
+ else
+ return current_element (context);
+}
+
+/**
+ * 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, "&amp;");
+ break;
+
+ case '<':
+ g_string_append (str, "&lt;");
+ break;
+
+ case '>':
+ g_string_append (str, "&gt;");
+ break;
+
+ case '\'':
+ g_string_append (str, "&apos;");
+ break;
+
+ case '"':
+ g_string_append (str, "&quot;");
+ 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, or -1 if the text is nul-terminated
+ *
+ * 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.
+ *
+ * Note that this function doesn't protect whitespace and line endings
+ * from being processed according to the XML rules for normalization
+ * of line endings and attribute values.
+ *
+ * Return value: a newly allocated string with the 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);
+
+ /* prealloc at least as long as original text */
+ str = g_string_sized_new (length);
+ append_escaped_text (str, text, length);
+
+ return g_string_free (str, FALSE);
+}
+
+/**
+ * find_conversion:
+ * @format: a printf-style format string
+ * @after: location to store a pointer to the character after
+ * the returned conversion. On a %NULL return, returns the
+ * pointer to the trailing NUL in the string
+ *
+ * Find the next conversion in a printf-style format string.
+ * Partially based on code from printf-parser.c,
+ * Copyright (C) 1999-2000, 2002-2003 Free Software Foundation, Inc.
+ *
+ * Return value: pointer to the next conversion in @format,
+ * or %NULL, if none.
+ **/
+static const char *
+find_conversion (const char *format,
+ const char **after)
+{
+ const char *start = format;
+ const char *cp;
+
+ while (*start != '\0' && *start != '%')
+ start++;
+
+ if (*start == '\0')
+ {
+ *after = start;
+ return NULL;
+ }
+
+ cp = start + 1;
+
+ if (*cp == '\0')
+ {
+ *after = cp;
+ return NULL;
+ }
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const char *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ cp = np + 1;
+ }
+
+ /* Skip the flags. */
+ for (;;)
+ {
+ if (*cp == '\'' ||
+ *cp == '-' ||
+ *cp == '+' ||
+ *cp == ' ' ||
+ *cp == '#' ||
+ *cp == '0')
+ cp++;
+ else
+ break;
+ }
+
+ /* Skip the field width. */
+ if (*cp == '*')
+ {
+ cp++;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const char *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ cp = np + 1;
+ }
+ }
+ else
+ {
+ for (; *cp >= '0' && *cp <= '9'; cp++)
+ ;
+ }
+
+ /* Skip the precision. */
+ if (*cp == '.')
+ {
+ cp++;
+ if (*cp == '*')
+ {
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const char *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ cp = np + 1;
+ }
+ }
+ else
+ {
+ for (; *cp >= '0' && *cp <= '9'; cp++)
+ ;
+ }
+ }
+
+ /* Skip argument type/size specifiers. */
+ while (*cp == 'h' ||
+ *cp == 'L' ||
+ *cp == 'l' ||
+ *cp == 'j' ||
+ *cp == 'z' ||
+ *cp == 'Z' ||
+ *cp == 't')
+ cp++;
+
+ /* Skip the conversion character. */
+ cp++;
+
+ *after = cp;
+ return start;
+}
+
+/**
+ * g_markup_vprintf_escaped:
+ * @format: printf() style format string
+ * @args: variable argument list, similar to vprintf()
+ *
+ * Formats the data in @args according to @format, escaping
+ * all string and character arguments in the fashion
+ * of g_markup_escape_text(). See g_markup_printf_escaped().
+ *
+ * Return value: newly allocated result from formatting
+ * operation. Free with g_free().
+ *
+ * Since: 2.4
+ **/
+char *
+g_markup_vprintf_escaped (const char *format,
+ va_list args)
+{
+ GString *format1;
+ GString *format2;
+ GString *result = NULL;
+ gchar *output1 = NULL;
+ gchar *output2 = NULL;
+ const char *p, *op1, *op2;
+ va_list args2;
+
+ /* The technique here, is that we make two format strings that
+ * have the identical conversions in the identical order to the
+ * original strings, but differ in the text in-between. We
+ * then use the normal g_strdup_vprintf() to format the arguments
+ * with the two new format strings. By comparing the results,
+ * we can figure out what segments of the output come from
+ * the the original format string, and what from the arguments,
+ * and thus know what portions of the string to escape.
+ *
+ * For instance, for:
+ *
+ * g_markup_printf_escaped ("%s ate %d apples", "Susan & Fred", 5);
+ *
+ * We form the two format strings "%sX%dX" and %sY%sY". The results
+ * of formatting with those two strings are
+ *
+ * "%sX%dX" => "Susan & FredX5X"
+ * "%sY%dY" => "Susan & FredY5Y"
+ *
+ * To find the span of the first argument, we find the first position
+ * where the two arguments differ, which tells us that the first
+ * argument formatted to "Susan & Fred". We then escape that
+ * to "Susan &amp; Fred" and join up with the intermediate portions
+ * of the format string and the second argument to get
+ * "Susan &amp; Fred ate 5 apples".
+ */
+
+ /* Create the two modified format strings
+ */
+ format1 = g_string_new (NULL);
+ format2 = g_string_new (NULL);
+ p = format;
+ while (TRUE)
+ {
+ const char *after;
+ const char *conv = find_conversion (p, &after);
+ if (!conv)
+ break;
+
+ g_string_append_len (format1, conv, after - conv);
+ g_string_append_c (format1, 'X');
+ g_string_append_len (format2, conv, after - conv);
+ g_string_append_c (format2, 'Y');
+
+ p = after;
+ }
+
+ /* Use them to format the arguments
+ */
+ G_VA_COPY (args2, args);
+
+ output1 = g_strdup_vprintf (format1->str, args);
+ if (!output1)
+ {
+ va_end (args2);
+ goto cleanup;
+ }
+
+ output2 = g_strdup_vprintf (format2->str, args2);
+ va_end (args2);
+ if (!output2)
+ goto cleanup;
+
+ result = g_string_new (NULL);
+
+ /* Iterate through the original format string again,
+ * copying the non-conversion portions and the escaped
+ * converted arguments to the output string.
+ */
+ op1 = output1;
+ op2 = output2;
+ p = format;
+ while (TRUE)
+ {
+ const char *after;
+ const char *output_start;
+ const char *conv = find_conversion (p, &after);
+ char *escaped;
+
+ if (!conv) /* The end, after points to the trailing \0 */
+ {
+ g_string_append_len (result, p, after - p);
+ break;
+ }
+
+ g_string_append_len (result, p, conv - p);
+ output_start = op1;
+ while (*op1 == *op2)
+ {
+ op1++;
+ op2++;
+ }
+
+ escaped = g_markup_escape_text (output_start, op1 - output_start);
+ g_string_append (result, escaped);
+ g_free (escaped);
+
+ p = after;
+ op1++;
+ op2++;
+ }
+
+ cleanup:
+ g_string_free (format1, TRUE);
+ g_string_free (format2, TRUE);
+ g_free (output1);
+ g_free (output2);
+
+ if (result)
+ return g_string_free (result, FALSE);
+ else
+ return NULL;
+}
+
+/**
+ * g_markup_printf_escaped:
+ * @format: printf() style format string
+ * @Varargs: the arguments to insert in the format string
+ *
+ * Formats arguments according to @format, escaping
+ * all string and character arguments in the fashion
+ * of g_markup_escape_text(). This is useful when you
+ * want to insert literal strings into XML-style markup
+ * output, without having to worry that the strings
+ * might themselves contain markup.
+ *
+ * <informalexample><programlisting>
+ * const char *store = "Fortnum &amp; Mason";
+ * const char *item = "Tea";
+ * char *output;
+ * &nbsp;
+ * output = g_markup_printf_escaped ("&lt;purchase&gt;"
+ * "&lt;store&gt;&percnt;s&lt;/store&gt;"
+ * "&lt;item&gt;&percnt;s&lt;/item&gt;"
+ * "&lt;/purchase&gt;",
+ * store, item);
+ * </programlisting></informalexample>
+ *
+ * Return value: newly allocated result from formatting
+ * operation. Free with g_free().
+ *
+ * Since: 2.4
+ **/
+char *
+g_markup_printf_escaped (const char *format, ...)
+{
+ char *result;
+ va_list args;
+
+ va_start (args, format);
+ result = g_markup_vprintf_escaped (format, args);
+ va_end (args);
+
+ return result;
+}
+
+#define __G_MARKUP_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gmarkup.h b/trunk/glib/gmarkup.h
new file mode 100644
index 000000000..b272d5ca7
--- /dev/null
+++ b/trunk/glib/gmarkup.h
@@ -0,0 +1,130 @@
+/* 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 <stdarg.h>
+
+#include <glib/gerror.h>
+
+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 (void);
+
+typedef enum
+{
+ G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG = 1 << 0,
+ G_MARKUP_TREAT_CDATA_AS_TEXT = 1 << 1
+} GMarkupParseFlags;
+
+typedef struct _GMarkupParseContext GMarkupParseContext;
+typedef struct _GMarkupParser GMarkupParser;
+
+struct _GMarkupParser
+{
+ /* Called for open tags <foo bar="baz"> */
+ 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 </foo> */
+ 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);
+G_CONST_RETURN gchar *g_markup_parse_context_get_element (GMarkupParseContext *context);
+
+/* 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);
+
+gchar *g_markup_printf_escaped (const char *format,
+ ...) G_GNUC_PRINTF (1, 2);
+gchar *g_markup_vprintf_escaped (const char *format,
+ va_list args);
+
+G_END_DECLS
+
+#endif /* __G_MARKUP_H__ */
+
diff --git a/trunk/glib/gmem.c b/trunk/glib/gmem.c
new file mode 100644
index 000000000..640e3ea2d
--- /dev/null
+++ b/trunk/glib/gmem.c
@@ -0,0 +1,721 @@
+/* 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 "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+
+#include "glib.h"
+#include "gthreadprivate.h"
+#include "galias.h"
+
+#define MEM_PROFILE_TABLE_SIZE 4096
+
+
+/* notes on macros:
+ * 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.
+ * g_mem_gc_friendly is TRUE, freed memory should be 0-wiped.
+ */
+
+/* --- prototypes --- */
+static gboolean g_mem_initialized = FALSE;
+static void g_mem_init_nomessage (void);
+
+
+/* --- malloc wrappers --- */
+#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 (G_UNLIKELY (!g_mem_initialized))
+ g_mem_init_nomessage();
+ if (G_LIKELY (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 (G_UNLIKELY (!g_mem_initialized))
+ g_mem_init_nomessage();
+ if (G_LIKELY (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 (G_UNLIKELY (!g_mem_initialized))
+ g_mem_init_nomessage();
+ if (G_LIKELY (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 (G_UNLIKELY (!g_mem_initialized))
+ g_mem_init_nomessage();
+ if (G_LIKELY (mem))
+ glib_mem_vtable.free (mem);
+}
+
+gpointer
+g_try_malloc (gulong n_bytes)
+{
+ if (G_UNLIKELY (!g_mem_initialized))
+ g_mem_init_nomessage();
+ if (G_LIKELY (n_bytes))
+ return glib_mem_vtable.try_malloc (n_bytes);
+ else
+ return NULL;
+}
+
+gpointer
+g_try_malloc0 (gulong n_bytes)
+{
+ gpointer mem;
+
+ mem = g_try_malloc (n_bytes);
+
+ if (mem)
+ memset (mem, 0, n_bytes);
+
+ return mem;
+}
+
+gpointer
+g_try_realloc (gpointer mem,
+ gulong n_bytes)
+{
+ if (G_UNLIKELY (!g_mem_initialized))
+ g_mem_init_nomessage();
+ if (G_LIKELY (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;
+}
+
+static gboolean vtable_set = FALSE;
+
+/**
+ * g_mem_is_system_malloc
+ *
+ * Checks whether the allocator used by g_malloc() is the system's
+ * malloc implementation. If it returns %TRUE memory allocated with
+ * malloc() can be used interchangeable with memory allocated using g_malloc().
+ * This function is useful for avoiding an extra copy of allocated memory returned
+ * by a non-GLib-based API.
+ *
+ * A different allocator can be set using g_mem_set_vtable().
+ *
+ * Return value: if %TRUE, malloc() and g_malloc() can be mixed.
+ **/
+gboolean
+g_mem_is_system_malloc (void)
+{
+ return !vtable_set;
+}
+
+void
+g_mem_set_vtable (GMemVTable *vtable)
+{
+ if (!vtable_set)
+ {
+ 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;
+ vtable_set = TRUE;
+ }
+ 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_zinit = 0;
+static gulong profile_frees = 0;
+static GMutex *gmem_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 (gmem_profile_mutex);
+ if (!profile_data)
+ {
+ profile_data = standard_calloc ((MEM_PROFILE_TABLE_SIZE + 1) * 8,
+ sizeof (profile_data[0]));
+ if (!profile_data) /* memory system kiddin' me, eh? */
+ {
+ g_mutex_unlock (gmem_profile_mutex);
+ return;
+ }
+ }
+
+ 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;
+ }
+ g_mutex_unlock (gmem_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;
+
+ if (G_UNLIKELY (!g_mem_initialized))
+ g_mem_init_nomessage();
+
+ g_mutex_lock (gmem_profile_mutex);
+
+ local_allocs = profile_allocs;
+ local_zinit = profile_zinit;
+ local_frees = profile_frees;
+
+ if (!profile_data)
+ {
+ g_mutex_unlock (gmem_profile_mutex);
+ return;
+ }
+
+ memcpy (local_data, profile_data,
+ (MEM_PROFILE_TABLE_SIZE + 1) * 8 * sizeof (profile_data[0]));
+
+ g_mutex_unlock (gmem_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);
+}
+
+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, %lu): memory has been freed %lu times already", p + 2, (gulong)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 --- */
+#ifndef G_ALLOC_AND_FREE
+typedef struct _GAllocator GAllocator;
+typedef struct _GMemChunk GMemChunk;
+#define G_ALLOC_ONLY 1
+#define G_ALLOC_AND_FREE 2
+#endif
+
+struct _GMemChunk {
+ guint alloc_size; /* the size of an atom */
+};
+
+GMemChunk*
+g_mem_chunk_new (const gchar *name,
+ gint atom_size,
+ gulong area_size,
+ gint type)
+{
+ GMemChunk *mem_chunk;
+ g_return_val_if_fail (atom_size > 0, NULL);
+
+ mem_chunk = g_slice_new (GMemChunk);
+ mem_chunk->alloc_size = atom_size;
+ return mem_chunk;
+}
+
+void
+g_mem_chunk_destroy (GMemChunk *mem_chunk)
+{
+ g_return_if_fail (mem_chunk != NULL);
+
+ g_slice_free (GMemChunk, mem_chunk);
+}
+
+gpointer
+g_mem_chunk_alloc (GMemChunk *mem_chunk)
+{
+ g_return_val_if_fail (mem_chunk != NULL, NULL);
+
+ return g_slice_alloc (mem_chunk->alloc_size);
+}
+
+gpointer
+g_mem_chunk_alloc0 (GMemChunk *mem_chunk)
+{
+ g_return_val_if_fail (mem_chunk != NULL, NULL);
+
+ return g_slice_alloc0 (mem_chunk->alloc_size);
+}
+
+void
+g_mem_chunk_free (GMemChunk *mem_chunk,
+ gpointer mem)
+{
+ g_return_if_fail (mem_chunk != NULL);
+
+ g_slice_free1 (mem_chunk->alloc_size, 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) {}
+
+GAllocator*
+g_allocator_new (const gchar *name,
+ guint n_preallocs)
+{
+ static struct _GAllocator {
+ gchar *name;
+ guint16 n_preallocs;
+ guint is_unused : 1;
+ guint type : 4;
+ GAllocator *last;
+ GMemChunk *mem_chunk;
+ gpointer free_list;
+ } dummy = {
+ "GAllocator is deprecated", 1, TRUE, 0, NULL, NULL, NULL,
+ };
+ /* some (broken) GAllocator uses depend on non-NULL allocators */
+ return (void*) &dummy;
+}
+
+void
+g_allocator_free (GAllocator *allocator)
+{
+}
+
+#ifdef ENABLE_GC_FRIENDLY_DEFAULT
+gboolean g_mem_gc_friendly = TRUE;
+#else
+gboolean g_mem_gc_friendly = FALSE;
+#endif
+
+static void
+g_mem_init_nomessage (void)
+{
+ gchar buffer[1024];
+ const gchar *val;
+ const GDebugKey keys[] = {
+ { "gc-friendly", 1 },
+ };
+ gint flags;
+ if (g_mem_initialized)
+ return;
+ /* don't use g_malloc/g_message here */
+ val = _g_getenv_nomalloc ("G_DEBUG", buffer);
+ flags = !val ? 0 : g_parse_debug_string (val, keys, G_N_ELEMENTS (keys));
+ if (flags & 1) /* gc-friendly */
+ {
+ g_mem_gc_friendly = TRUE;
+ }
+ g_mem_initialized = TRUE;
+}
+
+void
+_g_mem_thread_init_noprivate_nomessage (void)
+{
+ /* we may only create mutexes here, locking/
+ * unlocking a mutex does not yet work.
+ */
+ g_mem_init_nomessage();
+#ifndef G_DISABLE_CHECKS
+ gmem_profile_mutex = g_mutex_new ();
+#endif
+}
+
+#define __G_MEM_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gmem.h b/trunk/glib/gmem.h
new file mode 100644
index 000000000..ecae68052
--- /dev/null
+++ b/trunk/glib/gmem.h
@@ -0,0 +1,148 @@
+/* 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 <glib/gslice.h>
+#include <glib/gtypes.h>
+
+G_BEGIN_DECLS
+
+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) G_GNUC_MALLOC;
+gpointer g_malloc0 (gulong n_bytes) G_GNUC_MALLOC;
+gpointer g_realloc (gpointer mem,
+ gulong n_bytes) G_GNUC_WARN_UNUSED_RESULT;
+void g_free (gpointer mem);
+gpointer g_try_malloc (gulong n_bytes) G_GNUC_MALLOC;
+gpointer g_try_malloc0 (gulong n_bytes) G_GNUC_MALLOC;
+gpointer g_try_realloc (gpointer mem,
+ gulong n_bytes) G_GNUC_WARN_UNUSED_RESULT;
+
+
+/* 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))))
+
+#define g_try_new(struct_type, n_structs) \
+ ((struct_type *) g_try_malloc (((gsize) sizeof (struct_type)) * ((gsize) (n_structs))))
+#define g_try_new0(struct_type, n_structs) \
+ ((struct_type *) g_try_malloc0 (((gsize) sizeof (struct_type)) * ((gsize) (n_structs))))
+#define g_try_renew(struct_type, mem, n_structs) \
+ ((struct_type *) g_try_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; set to NULL if not used ! */
+ 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);
+gboolean g_mem_is_system_malloc (void);
+
+GLIB_VAR gboolean g_mem_gc_friendly;
+
+/* 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);
+
+
+/* deprecated memchunks and allocators */
+#if !defined (G_DISABLE_DEPRECATED) || defined (GTK_COMPILATION) || defined (GDK_COMPILATION)
+typedef struct _GAllocator GAllocator;
+typedef struct _GMemChunk GMemChunk;
+#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
+#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);
+void g_blow_chunks (void);
+GAllocator*g_allocator_new (const gchar *name,
+ guint n_preallocs);
+void g_allocator_free (GAllocator *allocator);
+#define G_ALLOCATOR_LIST (1)
+#define G_ALLOCATOR_SLIST (2)
+#define G_ALLOCATOR_NODE (3)
+#endif /* G_DISABLE_DEPRECATED */
+
+G_END_DECLS
+
+#endif /* __G_MEM_H__ */
diff --git a/trunk/glib/gmessages.c b/trunk/glib/gmessages.c
new file mode 100644
index 000000000..b0057da07
--- /dev/null
+++ b/trunk/glib/gmessages.c
@@ -0,0 +1,1093 @@
+/* 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 "config.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <signal.h>
+#include <locale.h>
+#include <errno.h>
+
+#include "glib.h"
+#include "gdebug.h"
+#include "gprintfint.h"
+#include "gthreadprivate.h"
+#include "galias.h"
+
+#ifdef G_OS_WIN32
+#include <process.h> /* For getpid() */
+#include <io.h>
+# define STRICT /* Strict typing, please */
+# define _WIN32_WINDOWS 0x0401 /* to get IsDebuggerPresent */
+# include <windows.h>
+# undef STRICT
+#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;
+};
+
+
+/* --- variables --- */
+static GMutex *g_messages_lock = NULL;
+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 GPrivate *g_log_depth = NULL;
+static GLogLevelFlags g_log_msg_prefix = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_DEBUG;
+static GLogFunc default_log_func = g_log_default_handler;
+static gpointer default_log_data = NULL;
+
+/* --- functions --- */
+#ifdef G_OS_WIN32
+# define STRICT
+# include <windows.h>
+# undef STRICT
+static gboolean win32_keep_fatal_message = FALSE;
+
+/* This default message will usually be overwritten. */
+/* Yes, a fixed size buffer is bad. So sue me. But g_error() is never
+ * called with huge strings, is it?
+ */
+static gchar fatal_msg_buf[1000] = "Unspecified fatal error encountered, aborting.";
+static gchar *fatal_msg_ptr = fatal_msg_buf;
+
+#undef write
+static inline int
+dowrite (int fd,
+ const void *buf,
+ unsigned int len)
+{
+ if (win32_keep_fatal_message)
+ {
+ memcpy (fatal_msg_ptr, buf, len);
+ fatal_msg_ptr += len;
+ *fatal_msg_ptr = 0;
+ return len;
+ }
+
+ write (fd, buf, len);
+
+ return len;
+}
+#define write(fd, buf, len) dowrite(fd, buf, len)
+
+#endif
+
+static void
+write_string (int fd,
+ const gchar *string)
+{
+ write (fd, string, strlen (string));
+}
+
+static void
+g_messages_prefixed_init (void)
+{
+ static gboolean initialized = FALSE;
+
+ if (!initialized)
+ {
+ const gchar *val;
+
+ initialized = TRUE;
+ val = g_getenv ("G_MESSAGES_PREFIXED");
+
+ if (val)
+ {
+ 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));
+ }
+ }
+}
+
+static GLogDomain*
+g_log_find_domain_L (const gchar *log_domain)
+{
+ register GLogDomain *domain;
+
+ domain = g_log_domains;
+ while (domain)
+ {
+ if (strcmp (domain->log_domain, log_domain) == 0)
+ return domain;
+ domain = domain->next;
+ }
+ return NULL;
+}
+
+static GLogDomain*
+g_log_domain_new_L (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;
+
+ domain->next = g_log_domains;
+ g_log_domains = domain;
+
+ return domain;
+}
+
+static void
+g_log_domain_check_free_L (GLogDomain *domain)
+{
+ if (domain->fatal_mask == G_LOG_FATAL_MASK &&
+ domain->handlers == NULL)
+ {
+ register GLogDomain *last, *work;
+
+ last = NULL;
+
+ 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;
+ }
+ }
+}
+
+static GLogFunc
+g_log_domain_get_handler_L (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;
+ }
+ }
+
+ *data = default_log_data;
+ return default_log_func;
+}
+
+GLogLevelFlags
+g_log_set_always_fatal (GLogLevelFlags fatal_mask)
+{
+ GLogLevelFlags old_mask;
+
+ /* restrict the global mask to levels that are known to glib
+ * since this setting applies to all domains
+ */
+ 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;
+
+ g_mutex_lock (g_messages_lock);
+
+ domain = g_log_find_domain_L (log_domain);
+ if (!domain)
+ domain = g_log_domain_new_L (log_domain);
+ old_flags = domain->fatal_mask;
+
+ domain->fatal_mask = fatal_mask;
+ g_log_domain_check_free_L (domain);
+
+ g_mutex_unlock (g_messages_lock);
+
+ return old_flags;
+}
+
+guint
+g_log_set_handler (const gchar *log_domain,
+ GLogLevelFlags log_levels,
+ GLogFunc log_func,
+ gpointer user_data)
+{
+ static guint handler_id = 0;
+ GLogDomain *domain;
+ GLogHandler *handler;
+
+ 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 = "";
+
+ handler = g_new (GLogHandler, 1);
+
+ g_mutex_lock (g_messages_lock);
+
+ domain = g_log_find_domain_L (log_domain);
+ if (!domain)
+ domain = g_log_domain_new_L (log_domain);
+
+ handler->id = ++handler_id;
+ handler->log_level = log_levels;
+ handler->log_func = log_func;
+ handler->data = user_data;
+ handler->next = domain->handlers;
+ domain->handlers = handler;
+
+ g_mutex_unlock (g_messages_lock);
+
+ return handler_id;
+}
+
+GLogFunc
+g_log_set_default_handler (GLogFunc log_func,
+ gpointer user_data)
+{
+ GLogFunc old_log_func;
+
+ g_mutex_lock (g_messages_lock);
+ old_log_func = default_log_func;
+ default_log_func = log_func;
+ default_log_data = user_data;
+ g_mutex_unlock (g_messages_lock);
+
+ return old_log_func;
+}
+
+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 = "";
+
+ g_mutex_lock (g_messages_lock);
+ domain = g_log_find_domain_L (log_domain);
+ if (domain)
+ {
+ 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_log_domain_check_free_L (domain);
+ g_mutex_unlock (g_messages_lock);
+ g_free (work);
+ return;
+ }
+ last = work;
+ work = last->next;
+ }
+ }
+ g_mutex_unlock (g_messages_lock);
+ g_warning ("%s: could not find handler with id `%d' for domain \"%s\"",
+ G_STRLOC, handler_id, log_domain);
+}
+
+void
+g_logv (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *format,
+ va_list args1)
+{
+ gboolean was_fatal = (log_level & G_LOG_FLAG_FATAL) != 0;
+ gboolean was_recursion = (log_level & G_LOG_FLAG_RECURSION) != 0;
+ gint i;
+
+ log_level &= G_LOG_LEVEL_MASK;
+ if (!log_level)
+ return;
+
+ 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;
+ GLogLevelFlags domain_fatal_mask;
+ gpointer data = NULL;
+
+ if (was_fatal)
+ test_level |= G_LOG_FLAG_FATAL;
+ if (was_recursion)
+ test_level |= G_LOG_FLAG_RECURSION;
+
+ /* check recursion and lookup handler */
+ g_mutex_lock (g_messages_lock);
+ domain = g_log_find_domain_L (log_domain ? log_domain : "");
+ if (depth)
+ test_level |= G_LOG_FLAG_RECURSION;
+ depth++;
+ domain_fatal_mask = domain ? domain->fatal_mask : G_LOG_FATAL_MASK;
+ if ((domain_fatal_mask | g_log_always_fatal) & test_level)
+ test_level |= G_LOG_FLAG_FATAL;
+ if (test_level & G_LOG_FLAG_RECURSION)
+ log_func = _g_log_fallback_handler;
+ else
+ log_func = g_log_domain_get_handler_L (domain, test_level, &data);
+ domain = NULL;
+ g_mutex_unlock (g_messages_lock);
+
+ g_private_set (g_log_depth, GUINT_TO_POINTER (depth));
+
+ /* had to defer debug initialization until we can keep track of recursion */
+ if (!(test_level & G_LOG_FLAG_RECURSION) && !_g_debug_initialized)
+ {
+ GLogLevelFlags orig_test_level = test_level;
+
+ _g_debug_init ();
+ if ((domain_fatal_mask | g_log_always_fatal) & test_level)
+ test_level |= G_LOG_FLAG_FATAL;
+ if (test_level != orig_test_level)
+ {
+ /* need a relookup, not nice, but not too bad either */
+ g_mutex_lock (g_messages_lock);
+ domain = g_log_find_domain_L (log_domain ? log_domain : "");
+ log_func = g_log_domain_get_handler_L (domain, test_level, &data);
+ domain = NULL;
+ g_mutex_unlock (g_messages_lock);
+ }
+ }
+
+ if (test_level & G_LOG_FLAG_RECURSION)
+ {
+ /* we use a stack buffer of fixed size, since we're likely
+ * in an out-of-memory situation
+ */
+ gchar buffer[1025];
+ gint size;
+ size = _g_vsnprintf (buffer, 1024, format, args1);
+
+ log_func (log_domain, test_level, buffer, data);
+ }
+ else
+ {
+ gchar *msg = g_strdup_vprintf (format, args1);
+
+ log_func (log_domain, test_level, msg, data);
+
+ g_free (msg);
+ }
+
+ if (test_level & G_LOG_FLAG_FATAL)
+ {
+#ifdef G_OS_WIN32
+ gchar *locale_msg = g_locale_from_utf8 (fatal_msg_buf, -1, NULL, NULL, NULL);
+
+ MessageBox (NULL, locale_msg, NULL,
+ MB_ICONERROR|MB_SETFOREGROUND);
+ if (IsDebuggerPresent () && !(test_level & G_LOG_FLAG_RECURSION))
+ G_BREAKPOINT ();
+ else
+ abort ();
+#else
+#if defined (G_ENABLE_DEBUG) && defined (SIGTRAP)
+ if (!(test_level & G_LOG_FLAG_RECURSION))
+ G_BREAKPOINT ();
+ else
+ abort ();
+#else /* !G_ENABLE_DEBUG || !SIGTRAP */
+ abort ();
+#endif /* !G_ENABLE_DEBUG || !SIGTRAP */
+#endif /* !G_OS_WIN32 */
+ }
+
+ 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_return_if_fail_warning (const char *log_domain,
+ const char *pretty_function,
+ const char *expression)
+{
+ /*
+ * Omit the prefix used by the PLT-reduction
+ * technique used in GTK+.
+ */
+ if (g_str_has_prefix (pretty_function, "IA__"))
+ pretty_function += 4;
+ g_log (log_domain,
+ G_LOG_LEVEL_CRITICAL,
+ "%s: assertion `%s' failed",
+ pretty_function,
+ expression);
+}
+
+void
+g_assert_warning (const char *log_domain,
+ const char *file,
+ const int line,
+ const char *pretty_function,
+ const char *expression)
+{
+ /*
+ * Omit the prefix used by the PLT-reduction
+ * technique used in GTK+.
+ */
+ if (g_str_has_prefix (pretty_function, "IA__"))
+ pretty_function += 4;
+ g_log (log_domain,
+ G_LOG_LEVEL_ERROR,
+ expression
+ ? "file %s: line %d (%s): assertion failed: (%s)"
+ : "file %s: line %d (%s): should not be reached",
+ file,
+ line,
+ pretty_function,
+ expression);
+ abort ();
+}
+
+#define CHAR_IS_SAFE(wc) (!((wc < 0x20 && wc != '\t' && wc != '\n' && wc != '\r') || \
+ (wc == 0x7f) || \
+ (wc >= 0x80 && wc < 0xa0)))
+
+static gchar*
+strdup_convert (const gchar *string,
+ const gchar *charset)
+{
+ if (!g_utf8_validate (string, -1, NULL))
+ {
+ GString *gstring = g_string_new ("[Invalid UTF-8] ");
+ guchar *p;
+
+ for (p = (guchar *)string; *p; p++)
+ {
+ if (CHAR_IS_SAFE(*p) &&
+ !(*p == '\r' && *(p + 1) != '\n') &&
+ *p < 0x80)
+ g_string_append_c (gstring, *p);
+ else
+ g_string_append_printf (gstring, "\\x%02x", (guint)(guchar)*p);
+ }
+
+ return g_string_free (gstring, FALSE);
+ }
+ else
+ {
+ GError *err = NULL;
+
+ gchar *result = g_convert_with_fallback (string, -1, charset, "UTF-8", "?", NULL, NULL, &err);
+ if (result)
+ return result;
+ else
+ {
+ /* Not thread-safe, but doesn't matter if we print the warning twice
+ */
+ static gboolean warned = FALSE;
+ if (!warned)
+ {
+ warned = TRUE;
+ _g_fprintf (stderr, "GLib: Cannot convert message: %s\n", err->message);
+ }
+ g_error_free (err);
+
+ return g_strdup (string);
+ }
+ }
+}
+
+/* For a radix of 8 we need at most 3 output bytes for 1 input
+ * byte. Additionally we might need up to 2 output bytes for the
+ * readix prefix and 1 byte for the trailing NULL.
+ */
+#define FORMAT_UNSIGNED_BUFSIZE ((GLIB_SIZEOF_LONG * 3) + 3)
+
+static void
+format_unsigned (gchar *buf,
+ gulong num,
+ guint radix)
+{
+ gulong tmp;
+ gchar c;
+ gint i, n;
+
+ /* we may not call _any_ GLib functions here (or macros like g_return_if_fail()) */
+
+ if (radix != 8 && radix != 10 && radix != 16)
+ {
+ *buf = '\000';
+ return;
+ }
+
+ if (!num)
+ {
+ *buf++ = '0';
+ *buf = '\000';
+ return;
+ }
+
+ if (radix == 16)
+ {
+ *buf++ = '0';
+ *buf++ = 'x';
+ }
+ else if (radix == 8)
+ {
+ *buf++ = '0';
+ }
+
+ n = 0;
+ tmp = num;
+ while (tmp)
+ {
+ tmp /= radix;
+ n++;
+ }
+
+ i = n;
+
+ /* Again we can't use g_assert; actually this check should _never_ fail. */
+ if (n > FORMAT_UNSIGNED_BUFSIZE - 3)
+ {
+ *buf = '\000';
+ return;
+ }
+
+ while (num)
+ {
+ i--;
+ c = (num % radix);
+ if (c < 10)
+ buf[i] = c + '0';
+ else
+ buf[i] = c + 'a' - 10;
+ num /= radix;
+ }
+
+ buf[n] = '\000';
+}
+
+/* string size big enough to hold level prefix */
+#define STRING_BUFFER_SIZE (FORMAT_UNSIGNED_BUFSIZE + 32)
+
+#define ALERT_LEVELS (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING)
+
+static int
+mklevel_prefix (gchar level_prefix[STRING_BUFFER_SIZE],
+ GLogLevelFlags log_level)
+{
+ gboolean to_stdout = TRUE;
+
+ /* we may not call _any_ GLib functions here */
+
+ switch (log_level & G_LOG_LEVEL_MASK)
+ {
+ case G_LOG_LEVEL_ERROR:
+ strcpy (level_prefix, "ERROR");
+ to_stdout = FALSE;
+ break;
+ case G_LOG_LEVEL_CRITICAL:
+ strcpy (level_prefix, "CRITICAL");
+ to_stdout = FALSE;
+ break;
+ case G_LOG_LEVEL_WARNING:
+ strcpy (level_prefix, "WARNING");
+ to_stdout = FALSE;
+ break;
+ case G_LOG_LEVEL_MESSAGE:
+ strcpy (level_prefix, "Message");
+ to_stdout = FALSE;
+ break;
+ case G_LOG_LEVEL_INFO:
+ strcpy (level_prefix, "INFO");
+ break;
+ case G_LOG_LEVEL_DEBUG:
+ strcpy (level_prefix, "DEBUG");
+ break;
+ default:
+ if (log_level)
+ {
+ strcpy (level_prefix, "LOG-");
+ format_unsigned (level_prefix + 4, log_level & G_LOG_LEVEL_MASK, 16);
+ }
+ else
+ strcpy (level_prefix, "LOG");
+ break;
+ }
+ if (log_level & G_LOG_FLAG_RECURSION)
+ strcat (level_prefix, " (recursed)");
+ if (log_level & ALERT_LEVELS)
+ strcat (level_prefix, " **");
+
+#ifdef G_OS_WIN32
+ win32_keep_fatal_message = (log_level & G_LOG_FLAG_FATAL) != 0;
+#endif
+ return to_stdout ? 1 : 2;
+}
+
+void
+_g_log_fallback_handler (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *message,
+ gpointer unused_data)
+{
+ gchar level_prefix[STRING_BUFFER_SIZE];
+#ifndef G_OS_WIN32
+ gchar pid_string[FORMAT_UNSIGNED_BUFSIZE];
+#endif
+ gboolean is_fatal = (log_level & G_LOG_FLAG_FATAL) != 0;
+ int fd;
+
+ /* we can not call _any_ GLib functions in this fallback handler,
+ * which is why we skip UTF-8 conversion, etc.
+ * since we either recursed or ran out of memory, we're in a pretty
+ * pathologic situation anyways, what we can do is giving the
+ * the process ID unconditionally however.
+ */
+
+ fd = mklevel_prefix (level_prefix, log_level);
+ if (!message)
+ message = "(NULL) message";
+
+#ifndef G_OS_WIN32
+ format_unsigned (pid_string, getpid (), 10);
+#endif
+
+ if (log_domain)
+ write_string (fd, "\n");
+ else
+ write_string (fd, "\n** ");
+
+#ifndef G_OS_WIN32
+ write_string (fd, "(process:");
+ write_string (fd, pid_string);
+ write_string (fd, "): ");
+#endif
+
+ if (log_domain)
+ {
+ write_string (fd, log_domain);
+ write_string (fd, "-");
+ }
+ write_string (fd, level_prefix);
+ write_string (fd, ": ");
+ write_string (fd, message);
+ if (is_fatal)
+ write_string (fd, "\naborting...\n");
+ else
+ write_string (fd, "\n");
+}
+
+static void
+escape_string (GString *string)
+{
+ const char *p = string->str;
+ gunichar wc;
+
+ while (p < string->str + string->len)
+ {
+ gboolean safe;
+
+ wc = g_utf8_get_char_validated (p, -1);
+ if (wc == (gunichar)-1 || wc == (gunichar)-2)
+ {
+ gchar *tmp;
+ guint pos;
+
+ pos = p - string->str;
+
+ /* Emit invalid UTF-8 as hex escapes
+ */
+ tmp = g_strdup_printf ("\\x%02x", (guint)(guchar)*p);
+ g_string_erase (string, pos, 1);
+ g_string_insert (string, pos, tmp);
+
+ p = string->str + (pos + 4); /* Skip over escape sequence */
+
+ g_free (tmp);
+ continue;
+ }
+ if (wc == '\r')
+ {
+ safe = *(p + 1) == '\n';
+ }
+ else
+ {
+ safe = CHAR_IS_SAFE (wc);
+ }
+
+ if (!safe)
+ {
+ gchar *tmp;
+ guint pos;
+
+ pos = p - string->str;
+
+ /* Largest char we escape is 0x0a, so we don't have to worry
+ * about 8-digit \Uxxxxyyyy
+ */
+ tmp = g_strdup_printf ("\\u%04x", wc);
+ g_string_erase (string, pos, g_utf8_next_char (p) - p);
+ g_string_insert (string, pos, tmp);
+ g_free (tmp);
+
+ p = string->str + (pos + 6); /* Skip over escape sequence */
+ }
+ else
+ p = g_utf8_next_char (p);
+ }
+}
+
+void
+g_log_default_handler (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *message,
+ gpointer unused_data)
+{
+ gboolean is_fatal = (log_level & G_LOG_FLAG_FATAL) != 0;
+ gchar level_prefix[STRING_BUFFER_SIZE], *string;
+ GString *gstring;
+ int fd;
+
+ /* we can be called externally with recursion for whatever reason */
+ if (log_level & G_LOG_FLAG_RECURSION)
+ {
+ _g_log_fallback_handler (log_domain, log_level, message, unused_data);
+ return;
+ }
+
+ g_messages_prefixed_init ();
+
+ fd = mklevel_prefix (level_prefix, log_level);
+
+ gstring = g_string_new (NULL);
+ if (log_level & ALERT_LEVELS)
+ g_string_append (gstring, "\n");
+ if (!log_domain)
+ g_string_append (gstring, "** ");
+
+ if ((g_log_msg_prefix & log_level) == log_level)
+ {
+ const gchar *prg_name = g_get_prgname ();
+
+ if (!prg_name)
+ g_string_append_printf (gstring, "(process:%lu): ", (gulong)getpid ());
+ else
+ g_string_append_printf (gstring, "(%s:%lu): ", prg_name, (gulong)getpid ());
+ }
+
+ if (log_domain)
+ {
+ g_string_append (gstring, log_domain);
+ g_string_append_c (gstring, '-');
+ }
+ g_string_append (gstring, level_prefix);
+
+ g_string_append (gstring, ": ");
+ if (!message)
+ g_string_append (gstring, "(NULL) message");
+ else
+ {
+ GString *msg;
+ const gchar *charset;
+
+ msg = g_string_new (message);
+ escape_string (msg);
+
+ if (g_get_charset (&charset))
+ g_string_append (gstring, msg->str); /* charset is UTF-8 already */
+ else
+ {
+ string = strdup_convert (msg->str, charset);
+ g_string_append (gstring, string);
+ g_free (string);
+ }
+
+ g_string_free (msg, TRUE);
+ }
+ if (is_fatal)
+ g_string_append (gstring, "\naborting...\n");
+ else
+ g_string_append (gstring, "\n");
+
+ string = g_string_free (gstring, FALSE);
+
+ write_string (fd, string);
+ g_free (string);
+}
+
+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
+ {
+ const gchar *charset;
+
+ if (g_get_charset (&charset))
+ fputs (string, stdout); /* charset is UTF-8 already */
+ else
+ {
+ gchar *lstring = strdup_convert (string, charset);
+
+ fputs (lstring, stdout);
+ g_free (lstring);
+ }
+ 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
+ {
+ const gchar *charset;
+
+ if (g_get_charset (&charset))
+ fputs (string, stderr); /* charset is UTF-8 already */
+ else
+ {
+ gchar *lstring = strdup_convert (string, charset);
+
+ fputs (lstring, stderr);
+ g_free (lstring);
+ }
+ fflush (stderr);
+ }
+ g_free (string);
+}
+
+gsize
+g_printf_string_upper_bound (const gchar *format,
+ va_list args)
+{
+ gchar c;
+ return _g_vsnprintf (&c, 1, format, args) + 1;
+}
+
+void
+_g_messages_thread_init_nomessage (void)
+{
+ g_messages_lock = g_mutex_new ();
+ g_log_depth = g_private_new (NULL);
+ g_messages_prefixed_init ();
+ _g_debug_init ();
+}
+
+gboolean _g_debug_initialized = FALSE;
+guint _g_debug_flags = 0;
+
+void
+_g_debug_init (void)
+{
+ const gchar *val;
+
+ _g_debug_initialized = TRUE;
+
+ val = g_getenv ("G_DEBUG");
+ if (val != NULL)
+ {
+ const GDebugKey keys[] = {
+ {"fatal_warnings", G_DEBUG_FATAL_WARNINGS},
+ {"fatal_criticals", G_DEBUG_FATAL_CRITICALS}
+ };
+
+ _g_debug_flags = g_parse_debug_string (val, keys, G_N_ELEMENTS (keys));
+ }
+
+ if (_g_debug_flags & G_DEBUG_FATAL_WARNINGS)
+ {
+ GLogLevelFlags fatal_mask;
+
+ fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
+ fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
+ g_log_set_always_fatal (fatal_mask);
+ }
+
+ if (_g_debug_flags & G_DEBUG_FATAL_CRITICALS)
+ {
+ GLogLevelFlags fatal_mask;
+
+ fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
+ fatal_mask |= G_LOG_LEVEL_CRITICAL;
+ g_log_set_always_fatal (fatal_mask);
+ }
+}
+
+#define __G_MESSAGES_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gmessages.h b/trunk/glib/gmessages.h
new file mode 100644
index 000000000..f279e873b
--- /dev/null
+++ b/trunk/glib/gmessages.h
@@ -0,0 +1,364 @@
+/* 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 <stdarg.h>
+#include <glib/gtypes.h>
+#include <glib/gmacros.h>
+
+/* Suppress warnings when GCC is in -pedantic mode and not -std=c99
+ */
+#if (__GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96))
+#pragma GCC system_header
+#endif
+
+G_BEGIN_DECLS
+
+/* calculate a string size, guaranteed 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
+ */
+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);
+GLogFunc g_log_set_default_handler (GLogFunc log_func,
+ gpointer user_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);
+
+/* internal */
+G_GNUC_INTERNAL void _g_log_fallback_handler (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *message,
+ gpointer unused_data);
+
+/* Internal functions, used to implement the following macros */
+void g_return_if_fail_warning (const char *log_domain,
+ const char *pretty_function,
+ const char *expression);
+void g_assert_warning (const char *log_domain,
+ const char *file,
+ const int line,
+ const char *pretty_function,
+ const char *expression) G_GNUC_NORETURN;
+
+
+#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__)
+#define g_debug(...) g_log (G_LOG_DOMAIN, \
+ G_LOG_LEVEL_DEBUG, \
+ __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)
+#define g_debug(format...) g_log (G_LOG_DOMAIN, \
+ G_LOG_LEVEL_DEBUG, \
+ 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);
+}
+static void
+g_debug (const gchar *format,
+ ...)
+{
+ va_list args;
+ va_start (args, format);
+ g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, 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);
+
+
+/* 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) G_STMT_START{ (void)0; }G_STMT_END
+#define g_assert_not_reached() G_STMT_START{ (void)0; }G_STMT_END
+
+#else /* !G_DISABLE_ASSERT */
+
+#ifdef __GNUC__
+
+#define g_assert(expr) G_STMT_START{ \
+ if G_LIKELY(expr) { } else \
+ g_assert_warning (G_LOG_DOMAIN, \
+ __FILE__, \
+ __LINE__, \
+ __PRETTY_FUNCTION__, \
+ #expr); }G_STMT_END
+
+#define g_assert_not_reached() G_STMT_START{ \
+ g_assert_warning (G_LOG_DOMAIN, \
+ __FILE__, \
+ __LINE__, \
+ __PRETTY_FUNCTION__, \
+ NULL); }G_STMT_END
+
+#else /* !__GNUC__ */
+
+#define g_assert(expr) G_STMT_START{ \
+ if (expr) { } else \
+ 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) G_STMT_START{ (void)0; }G_STMT_END
+#define g_return_val_if_fail(expr,val) G_STMT_START{ (void)0; }G_STMT_END
+#define g_return_if_reached() G_STMT_START{ return; }G_STMT_END
+#define g_return_val_if_reached(val) G_STMT_START{ return (val); }G_STMT_END
+
+#else /* !G_DISABLE_CHECKS */
+
+#ifdef __GNUC__
+
+#define g_return_if_fail(expr) G_STMT_START{ \
+ if G_LIKELY(expr) { } else \
+ { \
+ g_return_if_fail_warning (G_LOG_DOMAIN, \
+ __PRETTY_FUNCTION__, \
+ #expr); \
+ return; \
+ }; }G_STMT_END
+
+#define g_return_val_if_fail(expr,val) G_STMT_START{ \
+ if G_LIKELY(expr) { } else \
+ { \
+ g_return_if_fail_warning (G_LOG_DOMAIN, \
+ __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) { } else \
+ { \
+ 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) { } else \
+ { \
+ 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/trunk/glib/gmirroringtable.h b/trunk/glib/gmirroringtable.h
new file mode 100644
index 000000000..75842c75a
--- /dev/null
+++ b/trunk/glib/gmirroringtable.h
@@ -0,0 +1,1289 @@
+/* gmirroringtable.h
+ * generated by gen-mirroring-tab
+ * from the file BidiMirroring.txt of */
+
+#define PACKTAB_UINT8 guint8
+#define PACKTAB_UINT16 guint16
+#define PACKTAB_UINT32 guint32
+
+/*
+ generated by packtab.c version 3
+
+ use GLIB_GET_MIRRORING_DELTA(key) to access your table
+
+ assumed sizeof(gint16): 2
+ required memory: 1712
+ lookups: 3
+ partition shape: Mir[256][64][4]
+ different table entries: 1 14 38
+*/
+
+/* *INDENT-OFF* */
+
+static const gint16 MirLev2[4*38] = {
+#define MirLev2_0000 0x0
+ 0,0,0,0,
+#define MirLev2_0028 0x4
+ 1,-1,0,0,
+#define MirLev2_003C 0x8
+ 2,0,-2,0,
+#define MirLev2_0058 0xC
+ 0,0,0,2,
+#define MirLev2_005C 0x10
+ 0,-2,0,0,
+#define MirLev2_00A8 0x14
+ 0,0,0,16,
+#define MirLev2_00B8 0x18
+ 0,0,0,-16,
+#define MirLev2_0F38 0x1C
+ 0,0,1,-1,
+#define MirLev2_1698 0x20
+ 0,0,0,1,
+#define MirLev2_169C 0x24
+ -1,0,0,0,
+#define MirLev2_2038 0x28
+ 0,1,-1,0,
+#define MirLev2_2208 0x2C
+ 3,3,3,-3,
+#define MirLev2_220C 0x30
+ -3,-3,0,0,
+#define MirLev2_2214 0x34
+ 0,2016,0,0,
+#define MirLev2_2240 0x38
+ 0,0,0,138,
+#define MirLev2_2264 0x3C
+ 1,-1,1,-1,
+#define MirLev2_2290 0x40
+ -1,1,-1,0,
+#define MirLev2_2298 0x44
+ 1824,0,0,0,
+#define MirLev2_22A4 0x48
+ 0,0,2104,0,
+#define MirLev2_22A8 0x4C
+ 2108,2106,0,2106,
+#define MirLev2_22C8 0x50
+ 0,1,-1,1,
+#define MirLev2_22CC 0x54
+ -1,-138,0,0,
+#define MirLev2_22F0 0x58
+ 1,-1,8,8,
+#define MirLev2_22F4 0x5C
+ 8,0,7,7,
+#define MirLev2_22F8 0x60
+ 0,0,-8,-8,
+#define MirLev2_22FC 0x64
+ -8,-7,-7,0,
+#define MirLev2_2984 0x68
+ -1,1,-1,1,
+#define MirLev2_298C 0x6C
+ -1,3,1,-1,
+#define MirLev2_2990 0x70
+ -3,1,-1,1,
+#define MirLev2_29B8 0x74
+ -1824,0,0,0,
+#define MirLev2_29F4 0x78
+ 0,-2016,0,0,
+#define MirLev2_2AAC 0x7C
+ 1,-1,0,1,
+#define MirLev2_2AB0 0x80
+ -1,0,0,1,
+#define MirLev2_2ADC 0x84
+ 0,0,-2104,0,
+#define MirLev2_2AE0 0x88
+ 0,0,0,-2106,
+#define MirLev2_2AE4 0x8C
+ -2108,-2106,0,0,
+#define MirLev2_FF5C 0x90
+ 0,-2,0,1,
+#define MirLev2_FF60 0x94
+ -1,0,1,-1,
+};
+
+static const PACKTAB_UINT8 MirLev1[64*14] = {
+#define MirLev1_0000 0x0
+ MirLev2_0000, /* 0000..0003 */
+ MirLev2_0000, /* 0004..0007 */
+ MirLev2_0000, /* 0008..000B */
+ MirLev2_0000, /* 000C..000F */
+ MirLev2_0000, /* 0010..0013 */
+ MirLev2_0000, /* 0014..0017 */
+ MirLev2_0000, /* 0018..001B */
+ MirLev2_0000, /* 001C..001F */
+ MirLev2_0000, /* 0020..0023 */
+ MirLev2_0000, /* 0024..0027 */
+ MirLev2_0028, /* 0028..002B */
+ MirLev2_0000, /* 002C..002F */
+ MirLev2_0000, /* 0030..0033 */
+ MirLev2_0000, /* 0034..0037 */
+ MirLev2_0000, /* 0038..003B */
+ MirLev2_003C, /* 003C..003F */
+ MirLev2_0000, /* 0040..0043 */
+ MirLev2_0000, /* 0044..0047 */
+ MirLev2_0000, /* 0048..004B */
+ MirLev2_0000, /* 004C..004F */
+ MirLev2_0000, /* 0050..0053 */
+ MirLev2_0000, /* 0054..0057 */
+ MirLev2_0058, /* 0058..005B */
+ MirLev2_005C, /* 005C..005F */
+ MirLev2_0000, /* 0060..0063 */
+ MirLev2_0000, /* 0064..0067 */
+ MirLev2_0000, /* 0068..006B */
+ MirLev2_0000, /* 006C..006F */
+ MirLev2_0000, /* 0070..0073 */
+ MirLev2_0000, /* 0074..0077 */
+ MirLev2_0058, /* 0078..007B */
+ MirLev2_005C, /* 007C..007F */
+ MirLev2_0000, /* 0080..0083 */
+ MirLev2_0000, /* 0084..0087 */
+ MirLev2_0000, /* 0088..008B */
+ MirLev2_0000, /* 008C..008F */
+ MirLev2_0000, /* 0090..0093 */
+ MirLev2_0000, /* 0094..0097 */
+ MirLev2_0000, /* 0098..009B */
+ MirLev2_0000, /* 009C..009F */
+ MirLev2_0000, /* 00A0..00A3 */
+ MirLev2_0000, /* 00A4..00A7 */
+ MirLev2_00A8, /* 00A8..00AB */
+ MirLev2_0000, /* 00AC..00AF */
+ MirLev2_0000, /* 00B0..00B3 */
+ MirLev2_0000, /* 00B4..00B7 */
+ MirLev2_00B8, /* 00B8..00BB */
+ MirLev2_0000, /* 00BC..00BF */
+ MirLev2_0000, /* 00C0..00C3 */
+ MirLev2_0000, /* 00C4..00C7 */
+ MirLev2_0000, /* 00C8..00CB */
+ MirLev2_0000, /* 00CC..00CF */
+ MirLev2_0000, /* 00D0..00D3 */
+ MirLev2_0000, /* 00D4..00D7 */
+ MirLev2_0000, /* 00D8..00DB */
+ MirLev2_0000, /* 00DC..00DF */
+ MirLev2_0000, /* 00E0..00E3 */
+ MirLev2_0000, /* 00E4..00E7 */
+ MirLev2_0000, /* 00E8..00EB */
+ MirLev2_0000, /* 00EC..00EF */
+ MirLev2_0000, /* 00F0..00F3 */
+ MirLev2_0000, /* 00F4..00F7 */
+ MirLev2_0000, /* 00F8..00FB */
+ MirLev2_0000, /* 00FC..00FF */
+#define MirLev1_0100 0x40
+ MirLev2_0000, /* 0100..0103 */
+ MirLev2_0000, /* 0104..0107 */
+ MirLev2_0000, /* 0108..010B */
+ MirLev2_0000, /* 010C..010F */
+ MirLev2_0000, /* 0110..0113 */
+ MirLev2_0000, /* 0114..0117 */
+ MirLev2_0000, /* 0118..011B */
+ MirLev2_0000, /* 011C..011F */
+ MirLev2_0000, /* 0120..0123 */
+ MirLev2_0000, /* 0124..0127 */
+ MirLev2_0000, /* 0128..012B */
+ MirLev2_0000, /* 012C..012F */
+ MirLev2_0000, /* 0130..0133 */
+ MirLev2_0000, /* 0134..0137 */
+ MirLev2_0000, /* 0138..013B */
+ MirLev2_0000, /* 013C..013F */
+ MirLev2_0000, /* 0140..0143 */
+ MirLev2_0000, /* 0144..0147 */
+ MirLev2_0000, /* 0148..014B */
+ MirLev2_0000, /* 014C..014F */
+ MirLev2_0000, /* 0150..0153 */
+ MirLev2_0000, /* 0154..0157 */
+ MirLev2_0000, /* 0158..015B */
+ MirLev2_0000, /* 015C..015F */
+ MirLev2_0000, /* 0160..0163 */
+ MirLev2_0000, /* 0164..0167 */
+ MirLev2_0000, /* 0168..016B */
+ MirLev2_0000, /* 016C..016F */
+ MirLev2_0000, /* 0170..0173 */
+ MirLev2_0000, /* 0174..0177 */
+ MirLev2_0000, /* 0178..017B */
+ MirLev2_0000, /* 017C..017F */
+ MirLev2_0000, /* 0180..0183 */
+ MirLev2_0000, /* 0184..0187 */
+ MirLev2_0000, /* 0188..018B */
+ MirLev2_0000, /* 018C..018F */
+ MirLev2_0000, /* 0190..0193 */
+ MirLev2_0000, /* 0194..0197 */
+ MirLev2_0000, /* 0198..019B */
+ MirLev2_0000, /* 019C..019F */
+ MirLev2_0000, /* 01A0..01A3 */
+ MirLev2_0000, /* 01A4..01A7 */
+ MirLev2_0000, /* 01A8..01AB */
+ MirLev2_0000, /* 01AC..01AF */
+ MirLev2_0000, /* 01B0..01B3 */
+ MirLev2_0000, /* 01B4..01B7 */
+ MirLev2_0000, /* 01B8..01BB */
+ MirLev2_0000, /* 01BC..01BF */
+ MirLev2_0000, /* 01C0..01C3 */
+ MirLev2_0000, /* 01C4..01C7 */
+ MirLev2_0000, /* 01C8..01CB */
+ MirLev2_0000, /* 01CC..01CF */
+ MirLev2_0000, /* 01D0..01D3 */
+ MirLev2_0000, /* 01D4..01D7 */
+ MirLev2_0000, /* 01D8..01DB */
+ MirLev2_0000, /* 01DC..01DF */
+ MirLev2_0000, /* 01E0..01E3 */
+ MirLev2_0000, /* 01E4..01E7 */
+ MirLev2_0000, /* 01E8..01EB */
+ MirLev2_0000, /* 01EC..01EF */
+ MirLev2_0000, /* 01F0..01F3 */
+ MirLev2_0000, /* 01F4..01F7 */
+ MirLev2_0000, /* 01F8..01FB */
+ MirLev2_0000, /* 01FC..01FF */
+#define MirLev1_0F00 0x80
+ MirLev2_0000, /* 0F00..0F03 */
+ MirLev2_0000, /* 0F04..0F07 */
+ MirLev2_0000, /* 0F08..0F0B */
+ MirLev2_0000, /* 0F0C..0F0F */
+ MirLev2_0000, /* 0F10..0F13 */
+ MirLev2_0000, /* 0F14..0F17 */
+ MirLev2_0000, /* 0F18..0F1B */
+ MirLev2_0000, /* 0F1C..0F1F */
+ MirLev2_0000, /* 0F20..0F23 */
+ MirLev2_0000, /* 0F24..0F27 */
+ MirLev2_0000, /* 0F28..0F2B */
+ MirLev2_0000, /* 0F2C..0F2F */
+ MirLev2_0000, /* 0F30..0F33 */
+ MirLev2_0000, /* 0F34..0F37 */
+ MirLev2_0F38, /* 0F38..0F3B */
+ MirLev2_0028, /* 0F3C..0F3F */
+ MirLev2_0000, /* 0F40..0F43 */
+ MirLev2_0000, /* 0F44..0F47 */
+ MirLev2_0000, /* 0F48..0F4B */
+ MirLev2_0000, /* 0F4C..0F4F */
+ MirLev2_0000, /* 0F50..0F53 */
+ MirLev2_0000, /* 0F54..0F57 */
+ MirLev2_0000, /* 0F58..0F5B */
+ MirLev2_0000, /* 0F5C..0F5F */
+ MirLev2_0000, /* 0F60..0F63 */
+ MirLev2_0000, /* 0F64..0F67 */
+ MirLev2_0000, /* 0F68..0F6B */
+ MirLev2_0000, /* 0F6C..0F6F */
+ MirLev2_0000, /* 0F70..0F73 */
+ MirLev2_0000, /* 0F74..0F77 */
+ MirLev2_0000, /* 0F78..0F7B */
+ MirLev2_0000, /* 0F7C..0F7F */
+ MirLev2_0000, /* 0F80..0F83 */
+ MirLev2_0000, /* 0F84..0F87 */
+ MirLev2_0000, /* 0F88..0F8B */
+ MirLev2_0000, /* 0F8C..0F8F */
+ MirLev2_0000, /* 0F90..0F93 */
+ MirLev2_0000, /* 0F94..0F97 */
+ MirLev2_0000, /* 0F98..0F9B */
+ MirLev2_0000, /* 0F9C..0F9F */
+ MirLev2_0000, /* 0FA0..0FA3 */
+ MirLev2_0000, /* 0FA4..0FA7 */
+ MirLev2_0000, /* 0FA8..0FAB */
+ MirLev2_0000, /* 0FAC..0FAF */
+ MirLev2_0000, /* 0FB0..0FB3 */
+ MirLev2_0000, /* 0FB4..0FB7 */
+ MirLev2_0000, /* 0FB8..0FBB */
+ MirLev2_0000, /* 0FBC..0FBF */
+ MirLev2_0000, /* 0FC0..0FC3 */
+ MirLev2_0000, /* 0FC4..0FC7 */
+ MirLev2_0000, /* 0FC8..0FCB */
+ MirLev2_0000, /* 0FCC..0FCF */
+ MirLev2_0000, /* 0FD0..0FD3 */
+ MirLev2_0000, /* 0FD4..0FD7 */
+ MirLev2_0000, /* 0FD8..0FDB */
+ MirLev2_0000, /* 0FDC..0FDF */
+ MirLev2_0000, /* 0FE0..0FE3 */
+ MirLev2_0000, /* 0FE4..0FE7 */
+ MirLev2_0000, /* 0FE8..0FEB */
+ MirLev2_0000, /* 0FEC..0FEF */
+ MirLev2_0000, /* 0FF0..0FF3 */
+ MirLev2_0000, /* 0FF4..0FF7 */
+ MirLev2_0000, /* 0FF8..0FFB */
+ MirLev2_0000, /* 0FFC..0FFF */
+#define MirLev1_1600 0xC0
+ MirLev2_0000, /* 1600..1603 */
+ MirLev2_0000, /* 1604..1607 */
+ MirLev2_0000, /* 1608..160B */
+ MirLev2_0000, /* 160C..160F */
+ MirLev2_0000, /* 1610..1613 */
+ MirLev2_0000, /* 1614..1617 */
+ MirLev2_0000, /* 1618..161B */
+ MirLev2_0000, /* 161C..161F */
+ MirLev2_0000, /* 1620..1623 */
+ MirLev2_0000, /* 1624..1627 */
+ MirLev2_0000, /* 1628..162B */
+ MirLev2_0000, /* 162C..162F */
+ MirLev2_0000, /* 1630..1633 */
+ MirLev2_0000, /* 1634..1637 */
+ MirLev2_0000, /* 1638..163B */
+ MirLev2_0000, /* 163C..163F */
+ MirLev2_0000, /* 1640..1643 */
+ MirLev2_0000, /* 1644..1647 */
+ MirLev2_0000, /* 1648..164B */
+ MirLev2_0000, /* 164C..164F */
+ MirLev2_0000, /* 1650..1653 */
+ MirLev2_0000, /* 1654..1657 */
+ MirLev2_0000, /* 1658..165B */
+ MirLev2_0000, /* 165C..165F */
+ MirLev2_0000, /* 1660..1663 */
+ MirLev2_0000, /* 1664..1667 */
+ MirLev2_0000, /* 1668..166B */
+ MirLev2_0000, /* 166C..166F */
+ MirLev2_0000, /* 1670..1673 */
+ MirLev2_0000, /* 1674..1677 */
+ MirLev2_0000, /* 1678..167B */
+ MirLev2_0000, /* 167C..167F */
+ MirLev2_0000, /* 1680..1683 */
+ MirLev2_0000, /* 1684..1687 */
+ MirLev2_0000, /* 1688..168B */
+ MirLev2_0000, /* 168C..168F */
+ MirLev2_0000, /* 1690..1693 */
+ MirLev2_0000, /* 1694..1697 */
+ MirLev2_1698, /* 1698..169B */
+ MirLev2_169C, /* 169C..169F */
+ MirLev2_0000, /* 16A0..16A3 */
+ MirLev2_0000, /* 16A4..16A7 */
+ MirLev2_0000, /* 16A8..16AB */
+ MirLev2_0000, /* 16AC..16AF */
+ MirLev2_0000, /* 16B0..16B3 */
+ MirLev2_0000, /* 16B4..16B7 */
+ MirLev2_0000, /* 16B8..16BB */
+ MirLev2_0000, /* 16BC..16BF */
+ MirLev2_0000, /* 16C0..16C3 */
+ MirLev2_0000, /* 16C4..16C7 */
+ MirLev2_0000, /* 16C8..16CB */
+ MirLev2_0000, /* 16CC..16CF */
+ MirLev2_0000, /* 16D0..16D3 */
+ MirLev2_0000, /* 16D4..16D7 */
+ MirLev2_0000, /* 16D8..16DB */
+ MirLev2_0000, /* 16DC..16DF */
+ MirLev2_0000, /* 16E0..16E3 */
+ MirLev2_0000, /* 16E4..16E7 */
+ MirLev2_0000, /* 16E8..16EB */
+ MirLev2_0000, /* 16EC..16EF */
+ MirLev2_0000, /* 16F0..16F3 */
+ MirLev2_0000, /* 16F4..16F7 */
+ MirLev2_0000, /* 16F8..16FB */
+ MirLev2_0000, /* 16FC..16FF */
+#define MirLev1_2000 0x100
+ MirLev2_0000, /* 2000..2003 */
+ MirLev2_0000, /* 2004..2007 */
+ MirLev2_0000, /* 2008..200B */
+ MirLev2_0000, /* 200C..200F */
+ MirLev2_0000, /* 2010..2013 */
+ MirLev2_0000, /* 2014..2017 */
+ MirLev2_0028, /* 2018..201B */
+ MirLev2_0028, /* 201C..201F */
+ MirLev2_0000, /* 2020..2023 */
+ MirLev2_0000, /* 2024..2027 */
+ MirLev2_0000, /* 2028..202B */
+ MirLev2_0000, /* 202C..202F */
+ MirLev2_0000, /* 2030..2033 */
+ MirLev2_0000, /* 2034..2037 */
+ MirLev2_2038, /* 2038..203B */
+ MirLev2_0000, /* 203C..203F */
+ MirLev2_0000, /* 2040..2043 */
+ MirLev2_2038, /* 2044..2047 */
+ MirLev2_0000, /* 2048..204B */
+ MirLev2_0000, /* 204C..204F */
+ MirLev2_0000, /* 2050..2053 */
+ MirLev2_0000, /* 2054..2057 */
+ MirLev2_0000, /* 2058..205B */
+ MirLev2_0000, /* 205C..205F */
+ MirLev2_0000, /* 2060..2063 */
+ MirLev2_0000, /* 2064..2067 */
+ MirLev2_0000, /* 2068..206B */
+ MirLev2_0000, /* 206C..206F */
+ MirLev2_0000, /* 2070..2073 */
+ MirLev2_0000, /* 2074..2077 */
+ MirLev2_0000, /* 2078..207B */
+ MirLev2_2038, /* 207C..207F */
+ MirLev2_0000, /* 2080..2083 */
+ MirLev2_0000, /* 2084..2087 */
+ MirLev2_0000, /* 2088..208B */
+ MirLev2_2038, /* 208C..208F */
+ MirLev2_0000, /* 2090..2093 */
+ MirLev2_0000, /* 2094..2097 */
+ MirLev2_0000, /* 2098..209B */
+ MirLev2_0000, /* 209C..209F */
+ MirLev2_0000, /* 20A0..20A3 */
+ MirLev2_0000, /* 20A4..20A7 */
+ MirLev2_0000, /* 20A8..20AB */
+ MirLev2_0000, /* 20AC..20AF */
+ MirLev2_0000, /* 20B0..20B3 */
+ MirLev2_0000, /* 20B4..20B7 */
+ MirLev2_0000, /* 20B8..20BB */
+ MirLev2_0000, /* 20BC..20BF */
+ MirLev2_0000, /* 20C0..20C3 */
+ MirLev2_0000, /* 20C4..20C7 */
+ MirLev2_0000, /* 20C8..20CB */
+ MirLev2_0000, /* 20CC..20CF */
+ MirLev2_0000, /* 20D0..20D3 */
+ MirLev2_0000, /* 20D4..20D7 */
+ MirLev2_0000, /* 20D8..20DB */
+ MirLev2_0000, /* 20DC..20DF */
+ MirLev2_0000, /* 20E0..20E3 */
+ MirLev2_0000, /* 20E4..20E7 */
+ MirLev2_0000, /* 20E8..20EB */
+ MirLev2_0000, /* 20EC..20EF */
+ MirLev2_0000, /* 20F0..20F3 */
+ MirLev2_0000, /* 20F4..20F7 */
+ MirLev2_0000, /* 20F8..20FB */
+ MirLev2_0000, /* 20FC..20FF */
+#define MirLev1_2200 0x140
+ MirLev2_0000, /* 2200..2203 */
+ MirLev2_0000, /* 2204..2207 */
+ MirLev2_2208, /* 2208..220B */
+ MirLev2_220C, /* 220C..220F */
+ MirLev2_0000, /* 2210..2213 */
+ MirLev2_2214, /* 2214..2217 */
+ MirLev2_0000, /* 2218..221B */
+ MirLev2_0000, /* 221C..221F */
+ MirLev2_0000, /* 2220..2223 */
+ MirLev2_0000, /* 2224..2227 */
+ MirLev2_0000, /* 2228..222B */
+ MirLev2_0000, /* 222C..222F */
+ MirLev2_0000, /* 2230..2233 */
+ MirLev2_0000, /* 2234..2237 */
+ MirLev2_0000, /* 2238..223B */
+ MirLev2_0028, /* 223C..223F */
+ MirLev2_2240, /* 2240..2243 */
+ MirLev2_0000, /* 2244..2247 */
+ MirLev2_0000, /* 2248..224B */
+ MirLev2_0000, /* 224C..224F */
+ MirLev2_0F38, /* 2250..2253 */
+ MirLev2_0028, /* 2254..2257 */
+ MirLev2_0000, /* 2258..225B */
+ MirLev2_0000, /* 225C..225F */
+ MirLev2_0000, /* 2260..2263 */
+ MirLev2_2264, /* 2264..2267 */
+ MirLev2_2264, /* 2268..226B */
+ MirLev2_0F38, /* 226C..226F */
+ MirLev2_2264, /* 2270..2273 */
+ MirLev2_2264, /* 2274..2277 */
+ MirLev2_2264, /* 2278..227B */
+ MirLev2_2264, /* 227C..227F */
+ MirLev2_2264, /* 2280..2283 */
+ MirLev2_2264, /* 2284..2287 */
+ MirLev2_2264, /* 2288..228B */
+ MirLev2_1698, /* 228C..228F */
+ MirLev2_2290, /* 2290..2293 */
+ MirLev2_0000, /* 2294..2297 */
+ MirLev2_2298, /* 2298..229B */
+ MirLev2_0000, /* 229C..229F */
+ MirLev2_0F38, /* 22A0..22A3 */
+ MirLev2_22A4, /* 22A4..22A7 */
+ MirLev2_22A8, /* 22A8..22AB */
+ MirLev2_0000, /* 22AC..22AF */
+ MirLev2_2264, /* 22B0..22B3 */
+ MirLev2_2264, /* 22B4..22B7 */
+ MirLev2_0000, /* 22B8..22BB */
+ MirLev2_0000, /* 22BC..22BF */
+ MirLev2_0000, /* 22C0..22C3 */
+ MirLev2_0000, /* 22C4..22C7 */
+ MirLev2_22C8, /* 22C8..22CB */
+ MirLev2_22CC, /* 22CC..22CF */
+ MirLev2_0028, /* 22D0..22D3 */
+ MirLev2_0F38, /* 22D4..22D7 */
+ MirLev2_2264, /* 22D8..22DB */
+ MirLev2_2264, /* 22DC..22DF */
+ MirLev2_2264, /* 22E0..22E3 */
+ MirLev2_2264, /* 22E4..22E7 */
+ MirLev2_2264, /* 22E8..22EB */
+ MirLev2_0028, /* 22EC..22EF */
+ MirLev2_22F0, /* 22F0..22F3 */
+ MirLev2_22F4, /* 22F4..22F7 */
+ MirLev2_22F8, /* 22F8..22FB */
+ MirLev2_22FC, /* 22FC..22FF */
+#define MirLev1_2300 0x180
+ MirLev2_0000, /* 2300..2303 */
+ MirLev2_0000, /* 2304..2307 */
+ MirLev2_2264, /* 2308..230B */
+ MirLev2_0000, /* 230C..230F */
+ MirLev2_0000, /* 2310..2313 */
+ MirLev2_0000, /* 2314..2317 */
+ MirLev2_0000, /* 2318..231B */
+ MirLev2_0000, /* 231C..231F */
+ MirLev2_0000, /* 2320..2323 */
+ MirLev2_0000, /* 2324..2327 */
+ MirLev2_2038, /* 2328..232B */
+ MirLev2_0000, /* 232C..232F */
+ MirLev2_0000, /* 2330..2333 */
+ MirLev2_0000, /* 2334..2337 */
+ MirLev2_0000, /* 2338..233B */
+ MirLev2_0000, /* 233C..233F */
+ MirLev2_0000, /* 2340..2343 */
+ MirLev2_0000, /* 2344..2347 */
+ MirLev2_0000, /* 2348..234B */
+ MirLev2_0000, /* 234C..234F */
+ MirLev2_0000, /* 2350..2353 */
+ MirLev2_0000, /* 2354..2357 */
+ MirLev2_0000, /* 2358..235B */
+ MirLev2_0000, /* 235C..235F */
+ MirLev2_0000, /* 2360..2363 */
+ MirLev2_0000, /* 2364..2367 */
+ MirLev2_0000, /* 2368..236B */
+ MirLev2_0000, /* 236C..236F */
+ MirLev2_0000, /* 2370..2373 */
+ MirLev2_0000, /* 2374..2377 */
+ MirLev2_0000, /* 2378..237B */
+ MirLev2_0000, /* 237C..237F */
+ MirLev2_0000, /* 2380..2383 */
+ MirLev2_0000, /* 2384..2387 */
+ MirLev2_0000, /* 2388..238B */
+ MirLev2_0000, /* 238C..238F */
+ MirLev2_0000, /* 2390..2393 */
+ MirLev2_0000, /* 2394..2397 */
+ MirLev2_0000, /* 2398..239B */
+ MirLev2_0000, /* 239C..239F */
+ MirLev2_0000, /* 23A0..23A3 */
+ MirLev2_0000, /* 23A4..23A7 */
+ MirLev2_0000, /* 23A8..23AB */
+ MirLev2_0000, /* 23AC..23AF */
+ MirLev2_0000, /* 23B0..23B3 */
+ MirLev2_0000, /* 23B4..23B7 */
+ MirLev2_0000, /* 23B8..23BB */
+ MirLev2_0000, /* 23BC..23BF */
+ MirLev2_0000, /* 23C0..23C3 */
+ MirLev2_0000, /* 23C4..23C7 */
+ MirLev2_0000, /* 23C8..23CB */
+ MirLev2_0000, /* 23CC..23CF */
+ MirLev2_0000, /* 23D0..23D3 */
+ MirLev2_0000, /* 23D4..23D7 */
+ MirLev2_0000, /* 23D8..23DB */
+ MirLev2_0000, /* 23DC..23DF */
+ MirLev2_0000, /* 23E0..23E3 */
+ MirLev2_0000, /* 23E4..23E7 */
+ MirLev2_0000, /* 23E8..23EB */
+ MirLev2_0000, /* 23EC..23EF */
+ MirLev2_0000, /* 23F0..23F3 */
+ MirLev2_0000, /* 23F4..23F7 */
+ MirLev2_0000, /* 23F8..23FB */
+ MirLev2_0000, /* 23FC..23FF */
+#define MirLev1_2700 0x1C0
+ MirLev2_0000, /* 2700..2703 */
+ MirLev2_0000, /* 2704..2707 */
+ MirLev2_0000, /* 2708..270B */
+ MirLev2_0000, /* 270C..270F */
+ MirLev2_0000, /* 2710..2713 */
+ MirLev2_0000, /* 2714..2717 */
+ MirLev2_0000, /* 2718..271B */
+ MirLev2_0000, /* 271C..271F */
+ MirLev2_0000, /* 2720..2723 */
+ MirLev2_0000, /* 2724..2727 */
+ MirLev2_0000, /* 2728..272B */
+ MirLev2_0000, /* 272C..272F */
+ MirLev2_0000, /* 2730..2733 */
+ MirLev2_0000, /* 2734..2737 */
+ MirLev2_0000, /* 2738..273B */
+ MirLev2_0000, /* 273C..273F */
+ MirLev2_0000, /* 2740..2743 */
+ MirLev2_0000, /* 2744..2747 */
+ MirLev2_0000, /* 2748..274B */
+ MirLev2_0000, /* 274C..274F */
+ MirLev2_0000, /* 2750..2753 */
+ MirLev2_0000, /* 2754..2757 */
+ MirLev2_0000, /* 2758..275B */
+ MirLev2_0000, /* 275C..275F */
+ MirLev2_0000, /* 2760..2763 */
+ MirLev2_0000, /* 2764..2767 */
+ MirLev2_2264, /* 2768..276B */
+ MirLev2_2264, /* 276C..276F */
+ MirLev2_2264, /* 2770..2773 */
+ MirLev2_0028, /* 2774..2777 */
+ MirLev2_0000, /* 2778..277B */
+ MirLev2_0000, /* 277C..277F */
+ MirLev2_0000, /* 2780..2783 */
+ MirLev2_0000, /* 2784..2787 */
+ MirLev2_0000, /* 2788..278B */
+ MirLev2_0000, /* 278C..278F */
+ MirLev2_0000, /* 2790..2793 */
+ MirLev2_0000, /* 2794..2797 */
+ MirLev2_0000, /* 2798..279B */
+ MirLev2_0000, /* 279C..279F */
+ MirLev2_0000, /* 27A0..27A3 */
+ MirLev2_0000, /* 27A4..27A7 */
+ MirLev2_0000, /* 27A8..27AB */
+ MirLev2_0000, /* 27AC..27AF */
+ MirLev2_0000, /* 27B0..27B3 */
+ MirLev2_0000, /* 27B4..27B7 */
+ MirLev2_0000, /* 27B8..27BB */
+ MirLev2_0000, /* 27BC..27BF */
+ MirLev2_1698, /* 27C0..27C3 */
+ MirLev2_2290, /* 27C4..27C7 */
+ MirLev2_0000, /* 27C8..27CB */
+ MirLev2_0000, /* 27CC..27CF */
+ MirLev2_0000, /* 27D0..27D3 */
+ MirLev2_2038, /* 27D4..27D7 */
+ MirLev2_0000, /* 27D8..27DB */
+ MirLev2_2038, /* 27DC..27DF */
+ MirLev2_0F38, /* 27E0..27E3 */
+ MirLev2_2264, /* 27E4..27E7 */
+ MirLev2_2264, /* 27E8..27EB */
+ MirLev2_0000, /* 27EC..27EF */
+ MirLev2_0000, /* 27F0..27F3 */
+ MirLev2_0000, /* 27F4..27F7 */
+ MirLev2_0000, /* 27F8..27FB */
+ MirLev2_0000, /* 27FC..27FF */
+#define MirLev1_2900 0x200
+ MirLev2_0000, /* 2900..2903 */
+ MirLev2_0000, /* 2904..2907 */
+ MirLev2_0000, /* 2908..290B */
+ MirLev2_0000, /* 290C..290F */
+ MirLev2_0000, /* 2910..2913 */
+ MirLev2_0000, /* 2914..2917 */
+ MirLev2_0000, /* 2918..291B */
+ MirLev2_0000, /* 291C..291F */
+ MirLev2_0000, /* 2920..2923 */
+ MirLev2_0000, /* 2924..2927 */
+ MirLev2_0000, /* 2928..292B */
+ MirLev2_0000, /* 292C..292F */
+ MirLev2_0000, /* 2930..2933 */
+ MirLev2_0000, /* 2934..2937 */
+ MirLev2_0000, /* 2938..293B */
+ MirLev2_0000, /* 293C..293F */
+ MirLev2_0000, /* 2940..2943 */
+ MirLev2_0000, /* 2944..2947 */
+ MirLev2_0000, /* 2948..294B */
+ MirLev2_0000, /* 294C..294F */
+ MirLev2_0000, /* 2950..2953 */
+ MirLev2_0000, /* 2954..2957 */
+ MirLev2_0000, /* 2958..295B */
+ MirLev2_0000, /* 295C..295F */
+ MirLev2_0000, /* 2960..2963 */
+ MirLev2_0000, /* 2964..2967 */
+ MirLev2_0000, /* 2968..296B */
+ MirLev2_0000, /* 296C..296F */
+ MirLev2_0000, /* 2970..2973 */
+ MirLev2_0000, /* 2974..2977 */
+ MirLev2_0000, /* 2978..297B */
+ MirLev2_0000, /* 297C..297F */
+ MirLev2_1698, /* 2980..2983 */
+ MirLev2_2984, /* 2984..2987 */
+ MirLev2_2984, /* 2988..298B */
+ MirLev2_298C, /* 298C..298F */
+ MirLev2_2990, /* 2990..2993 */
+ MirLev2_2984, /* 2994..2997 */
+ MirLev2_169C, /* 2998..299B */
+ MirLev2_0000, /* 299C..299F */
+ MirLev2_0000, /* 29A0..29A3 */
+ MirLev2_0000, /* 29A4..29A7 */
+ MirLev2_0000, /* 29A8..29AB */
+ MirLev2_0000, /* 29AC..29AF */
+ MirLev2_0000, /* 29B0..29B3 */
+ MirLev2_0000, /* 29B4..29B7 */
+ MirLev2_29B8, /* 29B8..29BB */
+ MirLev2_0000, /* 29BC..29BF */
+ MirLev2_0028, /* 29C0..29C3 */
+ MirLev2_0028, /* 29C4..29C7 */
+ MirLev2_0000, /* 29C8..29CB */
+ MirLev2_1698, /* 29CC..29CF */
+ MirLev2_2290, /* 29D0..29D3 */
+ MirLev2_0028, /* 29D4..29D7 */
+ MirLev2_2264, /* 29D8..29DB */
+ MirLev2_0000, /* 29DC..29DF */
+ MirLev2_0000, /* 29E0..29E3 */
+ MirLev2_0000, /* 29E4..29E7 */
+ MirLev2_0000, /* 29E8..29EB */
+ MirLev2_0000, /* 29EC..29EF */
+ MirLev2_0000, /* 29F0..29F3 */
+ MirLev2_29F4, /* 29F4..29F7 */
+ MirLev2_0028, /* 29F8..29FB */
+ MirLev2_0028, /* 29FC..29FF */
+#define MirLev1_2A00 0x240
+ MirLev2_0000, /* 2A00..2A03 */
+ MirLev2_0000, /* 2A04..2A07 */
+ MirLev2_0000, /* 2A08..2A0B */
+ MirLev2_0000, /* 2A0C..2A0F */
+ MirLev2_0000, /* 2A10..2A13 */
+ MirLev2_0000, /* 2A14..2A17 */
+ MirLev2_0000, /* 2A18..2A1B */
+ MirLev2_0000, /* 2A1C..2A1F */
+ MirLev2_0000, /* 2A20..2A23 */
+ MirLev2_0000, /* 2A24..2A27 */
+ MirLev2_1698, /* 2A28..2A2B */
+ MirLev2_2290, /* 2A2C..2A2F */
+ MirLev2_0000, /* 2A30..2A33 */
+ MirLev2_0028, /* 2A34..2A37 */
+ MirLev2_0000, /* 2A38..2A3B */
+ MirLev2_0028, /* 2A3C..2A3F */
+ MirLev2_0000, /* 2A40..2A43 */
+ MirLev2_0000, /* 2A44..2A47 */
+ MirLev2_0000, /* 2A48..2A4B */
+ MirLev2_0000, /* 2A4C..2A4F */
+ MirLev2_0000, /* 2A50..2A53 */
+ MirLev2_0000, /* 2A54..2A57 */
+ MirLev2_0000, /* 2A58..2A5B */
+ MirLev2_0000, /* 2A5C..2A5F */
+ MirLev2_0000, /* 2A60..2A63 */
+ MirLev2_0028, /* 2A64..2A67 */
+ MirLev2_0000, /* 2A68..2A6B */
+ MirLev2_0000, /* 2A6C..2A6F */
+ MirLev2_0000, /* 2A70..2A73 */
+ MirLev2_0000, /* 2A74..2A77 */
+ MirLev2_2038, /* 2A78..2A7B */
+ MirLev2_22C8, /* 2A7C..2A7F */
+ MirLev2_2984, /* 2A80..2A83 */
+ MirLev2_169C, /* 2A84..2A87 */
+ MirLev2_1698, /* 2A88..2A8B */
+ MirLev2_169C, /* 2A8C..2A8F */
+ MirLev2_22C8, /* 2A90..2A93 */
+ MirLev2_2984, /* 2A94..2A97 */
+ MirLev2_2984, /* 2A98..2A9B */
+ MirLev2_169C, /* 2A9C..2A9F */
+ MirLev2_2038, /* 2AA0..2AA3 */
+ MirLev2_0F38, /* 2AA4..2AA7 */
+ MirLev2_2264, /* 2AA8..2AAB */
+ MirLev2_2AAC, /* 2AAC..2AAF */
+ MirLev2_2AB0, /* 2AB0..2AB3 */
+ MirLev2_169C, /* 2AB4..2AB7 */
+ MirLev2_1698, /* 2AB8..2ABB */
+ MirLev2_2984, /* 2ABC..2ABF */
+ MirLev2_2984, /* 2AC0..2AC3 */
+ MirLev2_2290, /* 2AC4..2AC7 */
+ MirLev2_0000, /* 2AC8..2ACB */
+ MirLev2_22C8, /* 2ACC..2ACF */
+ MirLev2_2984, /* 2AD0..2AD3 */
+ MirLev2_2290, /* 2AD4..2AD7 */
+ MirLev2_0000, /* 2AD8..2ADB */
+ MirLev2_2ADC, /* 2ADC..2ADF */
+ MirLev2_2AE0, /* 2AE0..2AE3 */
+ MirLev2_2AE4, /* 2AE4..2AE7 */
+ MirLev2_0000, /* 2AE8..2AEB */
+ MirLev2_0028, /* 2AEC..2AEF */
+ MirLev2_0000, /* 2AF0..2AF3 */
+ MirLev2_1698, /* 2AF4..2AF7 */
+ MirLev2_2290, /* 2AF8..2AFB */
+ MirLev2_0000, /* 2AFC..2AFF */
+#define MirLev1_2E00 0x280
+ MirLev2_0F38, /* 2E00..2E03 */
+ MirLev2_0028, /* 2E04..2E07 */
+ MirLev2_2038, /* 2E08..2E0B */
+ MirLev2_0028, /* 2E0C..2E0F */
+ MirLev2_0000, /* 2E10..2E13 */
+ MirLev2_0000, /* 2E14..2E17 */
+ MirLev2_0000, /* 2E18..2E1B */
+ MirLev2_0028, /* 2E1C..2E1F */
+ MirLev2_0000, /* 2E20..2E23 */
+ MirLev2_0000, /* 2E24..2E27 */
+ MirLev2_0000, /* 2E28..2E2B */
+ MirLev2_0000, /* 2E2C..2E2F */
+ MirLev2_0000, /* 2E30..2E33 */
+ MirLev2_0000, /* 2E34..2E37 */
+ MirLev2_0000, /* 2E38..2E3B */
+ MirLev2_0000, /* 2E3C..2E3F */
+ MirLev2_0000, /* 2E40..2E43 */
+ MirLev2_0000, /* 2E44..2E47 */
+ MirLev2_0000, /* 2E48..2E4B */
+ MirLev2_0000, /* 2E4C..2E4F */
+ MirLev2_0000, /* 2E50..2E53 */
+ MirLev2_0000, /* 2E54..2E57 */
+ MirLev2_0000, /* 2E58..2E5B */
+ MirLev2_0000, /* 2E5C..2E5F */
+ MirLev2_0000, /* 2E60..2E63 */
+ MirLev2_0000, /* 2E64..2E67 */
+ MirLev2_0000, /* 2E68..2E6B */
+ MirLev2_0000, /* 2E6C..2E6F */
+ MirLev2_0000, /* 2E70..2E73 */
+ MirLev2_0000, /* 2E74..2E77 */
+ MirLev2_0000, /* 2E78..2E7B */
+ MirLev2_0000, /* 2E7C..2E7F */
+ MirLev2_0000, /* 2E80..2E83 */
+ MirLev2_0000, /* 2E84..2E87 */
+ MirLev2_0000, /* 2E88..2E8B */
+ MirLev2_0000, /* 2E8C..2E8F */
+ MirLev2_0000, /* 2E90..2E93 */
+ MirLev2_0000, /* 2E94..2E97 */
+ MirLev2_0000, /* 2E98..2E9B */
+ MirLev2_0000, /* 2E9C..2E9F */
+ MirLev2_0000, /* 2EA0..2EA3 */
+ MirLev2_0000, /* 2EA4..2EA7 */
+ MirLev2_0000, /* 2EA8..2EAB */
+ MirLev2_0000, /* 2EAC..2EAF */
+ MirLev2_0000, /* 2EB0..2EB3 */
+ MirLev2_0000, /* 2EB4..2EB7 */
+ MirLev2_0000, /* 2EB8..2EBB */
+ MirLev2_0000, /* 2EBC..2EBF */
+ MirLev2_0000, /* 2EC0..2EC3 */
+ MirLev2_0000, /* 2EC4..2EC7 */
+ MirLev2_0000, /* 2EC8..2ECB */
+ MirLev2_0000, /* 2ECC..2ECF */
+ MirLev2_0000, /* 2ED0..2ED3 */
+ MirLev2_0000, /* 2ED4..2ED7 */
+ MirLev2_0000, /* 2ED8..2EDB */
+ MirLev2_0000, /* 2EDC..2EDF */
+ MirLev2_0000, /* 2EE0..2EE3 */
+ MirLev2_0000, /* 2EE4..2EE7 */
+ MirLev2_0000, /* 2EE8..2EEB */
+ MirLev2_0000, /* 2EEC..2EEF */
+ MirLev2_0000, /* 2EF0..2EF3 */
+ MirLev2_0000, /* 2EF4..2EF7 */
+ MirLev2_0000, /* 2EF8..2EFB */
+ MirLev2_0000, /* 2EFC..2EFF */
+#define MirLev1_3000 0x2C0
+ MirLev2_0000, /* 3000..3003 */
+ MirLev2_0000, /* 3004..3007 */
+ MirLev2_2264, /* 3008..300B */
+ MirLev2_2264, /* 300C..300F */
+ MirLev2_0028, /* 3010..3013 */
+ MirLev2_2264, /* 3014..3017 */
+ MirLev2_2264, /* 3018..301B */
+ MirLev2_2038, /* 301C..301F */
+ MirLev2_0000, /* 3020..3023 */
+ MirLev2_0000, /* 3024..3027 */
+ MirLev2_0000, /* 3028..302B */
+ MirLev2_0000, /* 302C..302F */
+ MirLev2_0000, /* 3030..3033 */
+ MirLev2_0000, /* 3034..3037 */
+ MirLev2_0000, /* 3038..303B */
+ MirLev2_0000, /* 303C..303F */
+ MirLev2_0000, /* 3040..3043 */
+ MirLev2_0000, /* 3044..3047 */
+ MirLev2_0000, /* 3048..304B */
+ MirLev2_0000, /* 304C..304F */
+ MirLev2_0000, /* 3050..3053 */
+ MirLev2_0000, /* 3054..3057 */
+ MirLev2_0000, /* 3058..305B */
+ MirLev2_0000, /* 305C..305F */
+ MirLev2_0000, /* 3060..3063 */
+ MirLev2_0000, /* 3064..3067 */
+ MirLev2_0000, /* 3068..306B */
+ MirLev2_0000, /* 306C..306F */
+ MirLev2_0000, /* 3070..3073 */
+ MirLev2_0000, /* 3074..3077 */
+ MirLev2_0000, /* 3078..307B */
+ MirLev2_0000, /* 307C..307F */
+ MirLev2_0000, /* 3080..3083 */
+ MirLev2_0000, /* 3084..3087 */
+ MirLev2_0000, /* 3088..308B */
+ MirLev2_0000, /* 308C..308F */
+ MirLev2_0000, /* 3090..3093 */
+ MirLev2_0000, /* 3094..3097 */
+ MirLev2_0000, /* 3098..309B */
+ MirLev2_0000, /* 309C..309F */
+ MirLev2_0000, /* 30A0..30A3 */
+ MirLev2_0000, /* 30A4..30A7 */
+ MirLev2_0000, /* 30A8..30AB */
+ MirLev2_0000, /* 30AC..30AF */
+ MirLev2_0000, /* 30B0..30B3 */
+ MirLev2_0000, /* 30B4..30B7 */
+ MirLev2_0000, /* 30B8..30BB */
+ MirLev2_0000, /* 30BC..30BF */
+ MirLev2_0000, /* 30C0..30C3 */
+ MirLev2_0000, /* 30C4..30C7 */
+ MirLev2_0000, /* 30C8..30CB */
+ MirLev2_0000, /* 30CC..30CF */
+ MirLev2_0000, /* 30D0..30D3 */
+ MirLev2_0000, /* 30D4..30D7 */
+ MirLev2_0000, /* 30D8..30DB */
+ MirLev2_0000, /* 30DC..30DF */
+ MirLev2_0000, /* 30E0..30E3 */
+ MirLev2_0000, /* 30E4..30E7 */
+ MirLev2_0000, /* 30E8..30EB */
+ MirLev2_0000, /* 30EC..30EF */
+ MirLev2_0000, /* 30F0..30F3 */
+ MirLev2_0000, /* 30F4..30F7 */
+ MirLev2_0000, /* 30F8..30FB */
+ MirLev2_0000, /* 30FC..30FF */
+#define MirLev1_FE00 0x300
+ MirLev2_0000, /* FE00..FE03 */
+ MirLev2_0000, /* FE04..FE07 */
+ MirLev2_0000, /* FE08..FE0B */
+ MirLev2_0000, /* FE0C..FE0F */
+ MirLev2_0000, /* FE10..FE13 */
+ MirLev2_0000, /* FE14..FE17 */
+ MirLev2_0000, /* FE18..FE1B */
+ MirLev2_0000, /* FE1C..FE1F */
+ MirLev2_0000, /* FE20..FE23 */
+ MirLev2_0000, /* FE24..FE27 */
+ MirLev2_0000, /* FE28..FE2B */
+ MirLev2_0000, /* FE2C..FE2F */
+ MirLev2_0000, /* FE30..FE33 */
+ MirLev2_0000, /* FE34..FE37 */
+ MirLev2_0000, /* FE38..FE3B */
+ MirLev2_0000, /* FE3C..FE3F */
+ MirLev2_0000, /* FE40..FE43 */
+ MirLev2_0000, /* FE44..FE47 */
+ MirLev2_0000, /* FE48..FE4B */
+ MirLev2_0000, /* FE4C..FE4F */
+ MirLev2_0000, /* FE50..FE53 */
+ MirLev2_0000, /* FE54..FE57 */
+ MirLev2_22C8, /* FE58..FE5B */
+ MirLev2_2290, /* FE5C..FE5F */
+ MirLev2_0000, /* FE60..FE63 */
+ MirLev2_0028, /* FE64..FE67 */
+ MirLev2_0000, /* FE68..FE6B */
+ MirLev2_0000, /* FE6C..FE6F */
+ MirLev2_0000, /* FE70..FE73 */
+ MirLev2_0000, /* FE74..FE77 */
+ MirLev2_0000, /* FE78..FE7B */
+ MirLev2_0000, /* FE7C..FE7F */
+ MirLev2_0000, /* FE80..FE83 */
+ MirLev2_0000, /* FE84..FE87 */
+ MirLev2_0000, /* FE88..FE8B */
+ MirLev2_0000, /* FE8C..FE8F */
+ MirLev2_0000, /* FE90..FE93 */
+ MirLev2_0000, /* FE94..FE97 */
+ MirLev2_0000, /* FE98..FE9B */
+ MirLev2_0000, /* FE9C..FE9F */
+ MirLev2_0000, /* FEA0..FEA3 */
+ MirLev2_0000, /* FEA4..FEA7 */
+ MirLev2_0000, /* FEA8..FEAB */
+ MirLev2_0000, /* FEAC..FEAF */
+ MirLev2_0000, /* FEB0..FEB3 */
+ MirLev2_0000, /* FEB4..FEB7 */
+ MirLev2_0000, /* FEB8..FEBB */
+ MirLev2_0000, /* FEBC..FEBF */
+ MirLev2_0000, /* FEC0..FEC3 */
+ MirLev2_0000, /* FEC4..FEC7 */
+ MirLev2_0000, /* FEC8..FECB */
+ MirLev2_0000, /* FECC..FECF */
+ MirLev2_0000, /* FED0..FED3 */
+ MirLev2_0000, /* FED4..FED7 */
+ MirLev2_0000, /* FED8..FEDB */
+ MirLev2_0000, /* FEDC..FEDF */
+ MirLev2_0000, /* FEE0..FEE3 */
+ MirLev2_0000, /* FEE4..FEE7 */
+ MirLev2_0000, /* FEE8..FEEB */
+ MirLev2_0000, /* FEEC..FEEF */
+ MirLev2_0000, /* FEF0..FEF3 */
+ MirLev2_0000, /* FEF4..FEF7 */
+ MirLev2_0000, /* FEF8..FEFB */
+ MirLev2_0000, /* FEFC..FEFF */
+#define MirLev1_FF00 0x340
+ MirLev2_0000, /* FF00..FF03 */
+ MirLev2_0000, /* FF04..FF07 */
+ MirLev2_0028, /* FF08..FF0B */
+ MirLev2_0000, /* FF0C..FF0F */
+ MirLev2_0000, /* FF10..FF13 */
+ MirLev2_0000, /* FF14..FF17 */
+ MirLev2_0000, /* FF18..FF1B */
+ MirLev2_003C, /* FF1C..FF1F */
+ MirLev2_0000, /* FF20..FF23 */
+ MirLev2_0000, /* FF24..FF27 */
+ MirLev2_0000, /* FF28..FF2B */
+ MirLev2_0000, /* FF2C..FF2F */
+ MirLev2_0000, /* FF30..FF33 */
+ MirLev2_0000, /* FF34..FF37 */
+ MirLev2_0058, /* FF38..FF3B */
+ MirLev2_005C, /* FF3C..FF3F */
+ MirLev2_0000, /* FF40..FF43 */
+ MirLev2_0000, /* FF44..FF47 */
+ MirLev2_0000, /* FF48..FF4B */
+ MirLev2_0000, /* FF4C..FF4F */
+ MirLev2_0000, /* FF50..FF53 */
+ MirLev2_0000, /* FF54..FF57 */
+ MirLev2_0058, /* FF58..FF5B */
+ MirLev2_FF5C, /* FF5C..FF5F */
+ MirLev2_FF60, /* FF60..FF63 */
+ MirLev2_0000, /* FF64..FF67 */
+ MirLev2_0000, /* FF68..FF6B */
+ MirLev2_0000, /* FF6C..FF6F */
+ MirLev2_0000, /* FF70..FF73 */
+ MirLev2_0000, /* FF74..FF77 */
+ MirLev2_0000, /* FF78..FF7B */
+ MirLev2_0000, /* FF7C..FF7F */
+ MirLev2_0000, /* FF80..FF83 */
+ MirLev2_0000, /* FF84..FF87 */
+ MirLev2_0000, /* FF88..FF8B */
+ MirLev2_0000, /* FF8C..FF8F */
+ MirLev2_0000, /* FF90..FF93 */
+ MirLev2_0000, /* FF94..FF97 */
+ MirLev2_0000, /* FF98..FF9B */
+ MirLev2_0000, /* FF9C..FF9F */
+ MirLev2_0000, /* FFA0..FFA3 */
+ MirLev2_0000, /* FFA4..FFA7 */
+ MirLev2_0000, /* FFA8..FFAB */
+ MirLev2_0000, /* FFAC..FFAF */
+ MirLev2_0000, /* FFB0..FFB3 */
+ MirLev2_0000, /* FFB4..FFB7 */
+ MirLev2_0000, /* FFB8..FFBB */
+ MirLev2_0000, /* FFBC..FFBF */
+ MirLev2_0000, /* FFC0..FFC3 */
+ MirLev2_0000, /* FFC4..FFC7 */
+ MirLev2_0000, /* FFC8..FFCB */
+ MirLev2_0000, /* FFCC..FFCF */
+ MirLev2_0000, /* FFD0..FFD3 */
+ MirLev2_0000, /* FFD4..FFD7 */
+ MirLev2_0000, /* FFD8..FFDB */
+ MirLev2_0000, /* FFDC..FFDF */
+ MirLev2_0000, /* FFE0..FFE3 */
+ MirLev2_0000, /* FFE4..FFE7 */
+ MirLev2_0000, /* FFE8..FFEB */
+ MirLev2_0000, /* FFEC..FFEF */
+ MirLev2_0000, /* FFF0..FFF3 */
+ MirLev2_0000, /* FFF4..FFF7 */
+ MirLev2_0000, /* FFF8..FFFB */
+ MirLev2_0000, /* FFFC..FFFF */
+};
+
+static const PACKTAB_UINT16 MirLev0[256*1] = {
+#define MirLev0_0000 0x0
+ MirLev1_0000, /* 0000..00FF */
+ MirLev1_0100, /* 0100..01FF */
+ MirLev1_0100, /* 0200..02FF */
+ MirLev1_0100, /* 0300..03FF */
+ MirLev1_0100, /* 0400..04FF */
+ MirLev1_0100, /* 0500..05FF */
+ MirLev1_0100, /* 0600..06FF */
+ MirLev1_0100, /* 0700..07FF */
+ MirLev1_0100, /* 0800..08FF */
+ MirLev1_0100, /* 0900..09FF */
+ MirLev1_0100, /* 0A00..0AFF */
+ MirLev1_0100, /* 0B00..0BFF */
+ MirLev1_0100, /* 0C00..0CFF */
+ MirLev1_0100, /* 0D00..0DFF */
+ MirLev1_0100, /* 0E00..0EFF */
+ MirLev1_0F00, /* 0F00..0FFF */
+ MirLev1_0100, /* 1000..10FF */
+ MirLev1_0100, /* 1100..11FF */
+ MirLev1_0100, /* 1200..12FF */
+ MirLev1_0100, /* 1300..13FF */
+ MirLev1_0100, /* 1400..14FF */
+ MirLev1_0100, /* 1500..15FF */
+ MirLev1_1600, /* 1600..16FF */
+ MirLev1_0100, /* 1700..17FF */
+ MirLev1_0100, /* 1800..18FF */
+ MirLev1_0100, /* 1900..19FF */
+ MirLev1_0100, /* 1A00..1AFF */
+ MirLev1_0100, /* 1B00..1BFF */
+ MirLev1_0100, /* 1C00..1CFF */
+ MirLev1_0100, /* 1D00..1DFF */
+ MirLev1_0100, /* 1E00..1EFF */
+ MirLev1_0100, /* 1F00..1FFF */
+ MirLev1_2000, /* 2000..20FF */
+ MirLev1_0100, /* 2100..21FF */
+ MirLev1_2200, /* 2200..22FF */
+ MirLev1_2300, /* 2300..23FF */
+ MirLev1_0100, /* 2400..24FF */
+ MirLev1_0100, /* 2500..25FF */
+ MirLev1_0100, /* 2600..26FF */
+ MirLev1_2700, /* 2700..27FF */
+ MirLev1_0100, /* 2800..28FF */
+ MirLev1_2900, /* 2900..29FF */
+ MirLev1_2A00, /* 2A00..2AFF */
+ MirLev1_0100, /* 2B00..2BFF */
+ MirLev1_0100, /* 2C00..2CFF */
+ MirLev1_0100, /* 2D00..2DFF */
+ MirLev1_2E00, /* 2E00..2EFF */
+ MirLev1_0100, /* 2F00..2FFF */
+ MirLev1_3000, /* 3000..30FF */
+ MirLev1_0100, /* 3100..31FF */
+ MirLev1_0100, /* 3200..32FF */
+ MirLev1_0100, /* 3300..33FF */
+ MirLev1_0100, /* 3400..34FF */
+ MirLev1_0100, /* 3500..35FF */
+ MirLev1_0100, /* 3600..36FF */
+ MirLev1_0100, /* 3700..37FF */
+ MirLev1_0100, /* 3800..38FF */
+ MirLev1_0100, /* 3900..39FF */
+ MirLev1_0100, /* 3A00..3AFF */
+ MirLev1_0100, /* 3B00..3BFF */
+ MirLev1_0100, /* 3C00..3CFF */
+ MirLev1_0100, /* 3D00..3DFF */
+ MirLev1_0100, /* 3E00..3EFF */
+ MirLev1_0100, /* 3F00..3FFF */
+ MirLev1_0100, /* 4000..40FF */
+ MirLev1_0100, /* 4100..41FF */
+ MirLev1_0100, /* 4200..42FF */
+ MirLev1_0100, /* 4300..43FF */
+ MirLev1_0100, /* 4400..44FF */
+ MirLev1_0100, /* 4500..45FF */
+ MirLev1_0100, /* 4600..46FF */
+ MirLev1_0100, /* 4700..47FF */
+ MirLev1_0100, /* 4800..48FF */
+ MirLev1_0100, /* 4900..49FF */
+ MirLev1_0100, /* 4A00..4AFF */
+ MirLev1_0100, /* 4B00..4BFF */
+ MirLev1_0100, /* 4C00..4CFF */
+ MirLev1_0100, /* 4D00..4DFF */
+ MirLev1_0100, /* 4E00..4EFF */
+ MirLev1_0100, /* 4F00..4FFF */
+ MirLev1_0100, /* 5000..50FF */
+ MirLev1_0100, /* 5100..51FF */
+ MirLev1_0100, /* 5200..52FF */
+ MirLev1_0100, /* 5300..53FF */
+ MirLev1_0100, /* 5400..54FF */
+ MirLev1_0100, /* 5500..55FF */
+ MirLev1_0100, /* 5600..56FF */
+ MirLev1_0100, /* 5700..57FF */
+ MirLev1_0100, /* 5800..58FF */
+ MirLev1_0100, /* 5900..59FF */
+ MirLev1_0100, /* 5A00..5AFF */
+ MirLev1_0100, /* 5B00..5BFF */
+ MirLev1_0100, /* 5C00..5CFF */
+ MirLev1_0100, /* 5D00..5DFF */
+ MirLev1_0100, /* 5E00..5EFF */
+ MirLev1_0100, /* 5F00..5FFF */
+ MirLev1_0100, /* 6000..60FF */
+ MirLev1_0100, /* 6100..61FF */
+ MirLev1_0100, /* 6200..62FF */
+ MirLev1_0100, /* 6300..63FF */
+ MirLev1_0100, /* 6400..64FF */
+ MirLev1_0100, /* 6500..65FF */
+ MirLev1_0100, /* 6600..66FF */
+ MirLev1_0100, /* 6700..67FF */
+ MirLev1_0100, /* 6800..68FF */
+ MirLev1_0100, /* 6900..69FF */
+ MirLev1_0100, /* 6A00..6AFF */
+ MirLev1_0100, /* 6B00..6BFF */
+ MirLev1_0100, /* 6C00..6CFF */
+ MirLev1_0100, /* 6D00..6DFF */
+ MirLev1_0100, /* 6E00..6EFF */
+ MirLev1_0100, /* 6F00..6FFF */
+ MirLev1_0100, /* 7000..70FF */
+ MirLev1_0100, /* 7100..71FF */
+ MirLev1_0100, /* 7200..72FF */
+ MirLev1_0100, /* 7300..73FF */
+ MirLev1_0100, /* 7400..74FF */
+ MirLev1_0100, /* 7500..75FF */
+ MirLev1_0100, /* 7600..76FF */
+ MirLev1_0100, /* 7700..77FF */
+ MirLev1_0100, /* 7800..78FF */
+ MirLev1_0100, /* 7900..79FF */
+ MirLev1_0100, /* 7A00..7AFF */
+ MirLev1_0100, /* 7B00..7BFF */
+ MirLev1_0100, /* 7C00..7CFF */
+ MirLev1_0100, /* 7D00..7DFF */
+ MirLev1_0100, /* 7E00..7EFF */
+ MirLev1_0100, /* 7F00..7FFF */
+ MirLev1_0100, /* 8000..80FF */
+ MirLev1_0100, /* 8100..81FF */
+ MirLev1_0100, /* 8200..82FF */
+ MirLev1_0100, /* 8300..83FF */
+ MirLev1_0100, /* 8400..84FF */
+ MirLev1_0100, /* 8500..85FF */
+ MirLev1_0100, /* 8600..86FF */
+ MirLev1_0100, /* 8700..87FF */
+ MirLev1_0100, /* 8800..88FF */
+ MirLev1_0100, /* 8900..89FF */
+ MirLev1_0100, /* 8A00..8AFF */
+ MirLev1_0100, /* 8B00..8BFF */
+ MirLev1_0100, /* 8C00..8CFF */
+ MirLev1_0100, /* 8D00..8DFF */
+ MirLev1_0100, /* 8E00..8EFF */
+ MirLev1_0100, /* 8F00..8FFF */
+ MirLev1_0100, /* 9000..90FF */
+ MirLev1_0100, /* 9100..91FF */
+ MirLev1_0100, /* 9200..92FF */
+ MirLev1_0100, /* 9300..93FF */
+ MirLev1_0100, /* 9400..94FF */
+ MirLev1_0100, /* 9500..95FF */
+ MirLev1_0100, /* 9600..96FF */
+ MirLev1_0100, /* 9700..97FF */
+ MirLev1_0100, /* 9800..98FF */
+ MirLev1_0100, /* 9900..99FF */
+ MirLev1_0100, /* 9A00..9AFF */
+ MirLev1_0100, /* 9B00..9BFF */
+ MirLev1_0100, /* 9C00..9CFF */
+ MirLev1_0100, /* 9D00..9DFF */
+ MirLev1_0100, /* 9E00..9EFF */
+ MirLev1_0100, /* 9F00..9FFF */
+ MirLev1_0100, /* A000..A0FF */
+ MirLev1_0100, /* A100..A1FF */
+ MirLev1_0100, /* A200..A2FF */
+ MirLev1_0100, /* A300..A3FF */
+ MirLev1_0100, /* A400..A4FF */
+ MirLev1_0100, /* A500..A5FF */
+ MirLev1_0100, /* A600..A6FF */
+ MirLev1_0100, /* A700..A7FF */
+ MirLev1_0100, /* A800..A8FF */
+ MirLev1_0100, /* A900..A9FF */
+ MirLev1_0100, /* AA00..AAFF */
+ MirLev1_0100, /* AB00..ABFF */
+ MirLev1_0100, /* AC00..ACFF */
+ MirLev1_0100, /* AD00..ADFF */
+ MirLev1_0100, /* AE00..AEFF */
+ MirLev1_0100, /* AF00..AFFF */
+ MirLev1_0100, /* B000..B0FF */
+ MirLev1_0100, /* B100..B1FF */
+ MirLev1_0100, /* B200..B2FF */
+ MirLev1_0100, /* B300..B3FF */
+ MirLev1_0100, /* B400..B4FF */
+ MirLev1_0100, /* B500..B5FF */
+ MirLev1_0100, /* B600..B6FF */
+ MirLev1_0100, /* B700..B7FF */
+ MirLev1_0100, /* B800..B8FF */
+ MirLev1_0100, /* B900..B9FF */
+ MirLev1_0100, /* BA00..BAFF */
+ MirLev1_0100, /* BB00..BBFF */
+ MirLev1_0100, /* BC00..BCFF */
+ MirLev1_0100, /* BD00..BDFF */
+ MirLev1_0100, /* BE00..BEFF */
+ MirLev1_0100, /* BF00..BFFF */
+ MirLev1_0100, /* C000..C0FF */
+ MirLev1_0100, /* C100..C1FF */
+ MirLev1_0100, /* C200..C2FF */
+ MirLev1_0100, /* C300..C3FF */
+ MirLev1_0100, /* C400..C4FF */
+ MirLev1_0100, /* C500..C5FF */
+ MirLev1_0100, /* C600..C6FF */
+ MirLev1_0100, /* C700..C7FF */
+ MirLev1_0100, /* C800..C8FF */
+ MirLev1_0100, /* C900..C9FF */
+ MirLev1_0100, /* CA00..CAFF */
+ MirLev1_0100, /* CB00..CBFF */
+ MirLev1_0100, /* CC00..CCFF */
+ MirLev1_0100, /* CD00..CDFF */
+ MirLev1_0100, /* CE00..CEFF */
+ MirLev1_0100, /* CF00..CFFF */
+ MirLev1_0100, /* D000..D0FF */
+ MirLev1_0100, /* D100..D1FF */
+ MirLev1_0100, /* D200..D2FF */
+ MirLev1_0100, /* D300..D3FF */
+ MirLev1_0100, /* D400..D4FF */
+ MirLev1_0100, /* D500..D5FF */
+ MirLev1_0100, /* D600..D6FF */
+ MirLev1_0100, /* D700..D7FF */
+ MirLev1_0100, /* D800..D8FF */
+ MirLev1_0100, /* D900..D9FF */
+ MirLev1_0100, /* DA00..DAFF */
+ MirLev1_0100, /* DB00..DBFF */
+ MirLev1_0100, /* DC00..DCFF */
+ MirLev1_0100, /* DD00..DDFF */
+ MirLev1_0100, /* DE00..DEFF */
+ MirLev1_0100, /* DF00..DFFF */
+ MirLev1_0100, /* E000..E0FF */
+ MirLev1_0100, /* E100..E1FF */
+ MirLev1_0100, /* E200..E2FF */
+ MirLev1_0100, /* E300..E3FF */
+ MirLev1_0100, /* E400..E4FF */
+ MirLev1_0100, /* E500..E5FF */
+ MirLev1_0100, /* E600..E6FF */
+ MirLev1_0100, /* E700..E7FF */
+ MirLev1_0100, /* E800..E8FF */
+ MirLev1_0100, /* E900..E9FF */
+ MirLev1_0100, /* EA00..EAFF */
+ MirLev1_0100, /* EB00..EBFF */
+ MirLev1_0100, /* EC00..ECFF */
+ MirLev1_0100, /* ED00..EDFF */
+ MirLev1_0100, /* EE00..EEFF */
+ MirLev1_0100, /* EF00..EFFF */
+ MirLev1_0100, /* F000..F0FF */
+ MirLev1_0100, /* F100..F1FF */
+ MirLev1_0100, /* F200..F2FF */
+ MirLev1_0100, /* F300..F3FF */
+ MirLev1_0100, /* F400..F4FF */
+ MirLev1_0100, /* F500..F5FF */
+ MirLev1_0100, /* F600..F6FF */
+ MirLev1_0100, /* F700..F7FF */
+ MirLev1_0100, /* F800..F8FF */
+ MirLev1_0100, /* F900..F9FF */
+ MirLev1_0100, /* FA00..FAFF */
+ MirLev1_0100, /* FB00..FBFF */
+ MirLev1_0100, /* FC00..FCFF */
+ MirLev1_0100, /* FD00..FDFF */
+ MirLev1_FE00, /* FE00..FEFF */
+ MirLev1_FF00, /* FF00..FFFF */
+};
+
+/* *INDENT-ON* */
+
+#define GLIB_GET_MIRRORING_DELTA(x) \
+ ((x) >= 0x10000 ? 0 : \
+ MirLev2[((x) & 0x03) + \
+ MirLev1[((x) >> 2 & 0x3f) + \
+ MirLev0[((x) >> 8)]]])
+
+#undef PACKTAB_UINT8
+#undef PACKTAB_UINT16
+#undef PACKTAB_UINT32
+
+#define GLIB_GET_MIRRORING(x) ((x) + GLIB_GET_MIRRORING_DELTA(x))
+
+/* End of generated gmirroringtable.h */
diff --git a/trunk/glib/gnode.c b/trunk/glib/gnode.c
new file mode 100644
index 000000000..747545dd0
--- /dev/null
+++ b/trunk/glib/gnode.c
@@ -0,0 +1,916 @@
+/* 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
+ */
+
+#include "config.h"
+
+#include "glib.h"
+#include "galias.h"
+
+void g_node_push_allocator (gpointer dummy) { /* present for binary compat only */ }
+void g_node_pop_allocator (void) { /* present for binary compat only */ }
+
+#define g_node_alloc0() g_slice_new0 (GNode)
+#define g_node_free(node) g_slice_free (GNode, node)
+
+/* --- functions --- */
+GNode*
+g_node_new (gpointer data)
+{
+ GNode *node = g_node_alloc0();
+ node->data = data;
+ return node;
+}
+
+static void
+g_nodes_free (GNode *node)
+{
+ while (node)
+ {
+ GNode *next = node->next;
+ if (node->children)
+ g_nodes_free (node->children);
+ g_node_free (node);
+ node = next;
+ }
+}
+
+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;
+}
+
+/**
+ * g_node_copy_deep:
+ * @node: a #GNode
+ * @copy_func: the function which is called to copy the data inside each node,
+ * or %NULL to use the original data.
+ * @data: data to pass to @copy_func
+ *
+ * Recursively copies a #GNode and its data.
+ *
+ * Return value: a new #GNode containing copies of the data in @node.
+ *
+ * Since: 2.4
+ **/
+GNode*
+g_node_copy_deep (GNode *node,
+ GCopyFunc copy_func,
+ gpointer data)
+{
+ GNode *new_node = NULL;
+
+ if (copy_func == NULL)
+ return g_node_copy (node);
+
+ if (node)
+ {
+ GNode *child, *new_child;
+
+ new_node = g_node_new (copy_func (node->data, data));
+
+ for (child = g_node_last_child (node); child; child = child->prev)
+ {
+ new_child = g_node_copy_deep (child, copy_func, data);
+ g_node_prepend (new_node, new_child);
+ }
+ }
+
+ return new_node;
+}
+
+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_level (GNode *node,
+ GTraverseFlags flags,
+ guint level,
+ GNodeTraverseFunc func,
+ gpointer data,
+ gboolean *more_levels)
+{
+ if (level == 0)
+ {
+ if (node->children)
+ {
+ *more_levels = TRUE;
+ return (flags & G_TRAVERSE_NON_LEAFS) && func (node, data);
+ }
+ else
+ {
+ return (flags & G_TRAVERSE_LEAFS) && func (node, data);
+ }
+ }
+ else
+ {
+ node = node->children;
+
+ while (node)
+ {
+ if (g_node_traverse_level (node, flags, level - 1, func, data, more_levels))
+ return TRUE;
+
+ node = node->next;
+ }
+ }
+
+ return FALSE;
+}
+
+static gboolean
+g_node_depth_traverse_level (GNode *node,
+ GTraverseFlags flags,
+ guint depth,
+ GNodeTraverseFunc func,
+ gpointer data)
+{
+ guint level;
+ gboolean more_levels;
+
+ level = 0;
+ while (level != depth)
+ {
+ more_levels = FALSE;
+ if (g_node_traverse_level (node, flags, level, func, data, &more_levels))
+ return TRUE;
+ if (!more_levels)
+ break;
+ level++;
+ }
+ 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:
+ g_node_depth_traverse_level (root, flags, depth, func, 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);
+ }
+ }
+}
+
+#define __G_NODE_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gnode.h b/trunk/glib/gnode.h
new file mode 100644
index 000000000..a22c8fb7a
--- /dev/null
+++ b/trunk/glib/gnode.h
@@ -0,0 +1,172 @@
+/* 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 <glib/gmem.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GNode GNode;
+
+/* Tree traverse flags */
+typedef enum
+{
+ G_TRAVERSE_LEAVES = 1 << 0,
+ G_TRAVERSE_NON_LEAVES = 1 << 1,
+ G_TRAVERSE_ALL = G_TRAVERSE_LEAVES | G_TRAVERSE_NON_LEAVES,
+ G_TRAVERSE_MASK = 0x03,
+ G_TRAVERSE_LEAFS = G_TRAVERSE_LEAVES,
+ G_TRAVERSE_NON_LEAFS = G_TRAVERSE_NON_LEAVES
+} 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);
+typedef gpointer (*GCopyFunc) (gconstpointer src,
+ 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)
+
+GNode* g_node_new (gpointer data);
+void g_node_destroy (GNode *root);
+void g_node_unlink (GNode *node);
+GNode* g_node_copy_deep (GNode *node,
+ GCopyFunc copy_func,
+ gpointer data);
+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)
+
+#ifndef G_DISABLE_DEPRECATED
+void g_node_push_allocator (gpointer dummy);
+void g_node_pop_allocator (void);
+#endif
+G_END_DECLS
+
+#endif /* __G_NODE_H__ */
diff --git a/trunk/glib/gnulib/Makefile.am b/trunk/glib/gnulib/Makefile.am
new file mode 100644
index 000000000..2387885d8
--- /dev/null
+++ b/trunk/glib/gnulib/Makefile.am
@@ -0,0 +1,28 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/glib -DG_LOG_DOMAIN=\"GLib\" \
+ $(GLIB_DEBUG_FLAGS) -DG_DISABLE_DEPRECATED -DGLIB_COMPILATION
+
+noinst_LTLIBRARIES = libgnulib.la
+
+libgnulib_la_SOURCES = \
+ asnprintf.c \
+ printf-args.c \
+ printf-args.h \
+ printf-parse.c \
+ printf-parse.h \
+ vasnprintf.c \
+ vasnprintf.h \
+ printf.c \
+ printf.h \
+ g-gnulib.h
+
+
+EXTRA_DIST = makefile.msc
+
+
+
+
+
+
+
diff --git a/trunk/glib/gnulib/README b/trunk/glib/gnulib/README
new file mode 100644
index 000000000..78e09b945
--- /dev/null
+++ b/trunk/glib/gnulib/README
@@ -0,0 +1,44 @@
+The files
+
+ asnprintf.c
+ printf-args.c
+ printf-args.h
+ printf-parse.c
+ printf-parse.h
+ vasnprintf.c
+ vasnprintf.h
+
+are taken from the vasnprintf module of the GNUlib package, which can
+be found at:
+
+ http://www.gnu.org/software/gnulib/
+
+All files have been modified to include g-gnulib.h.
+
+vasnprintf.c has also been modified to include support for long long
+printing if the system printf doesn't. This code is protected by
+#ifndef HAVE_LONG_LONG_FORMAT.
+
+Code has been added to printf-args.[ch], printf-parse.c and vasnprintf.c
+to support printing of __int64 values with the I64 format modifier. This
+is protected by #ifdef HAVE_INT64_AND_I64.
+
+The files
+
+ printf.h
+ printf.c
+ g-gnulib.h
+
+have been written by me. printf.[hc] contain implementations of the
+remaining functions in the printf family based on vasnprintf.
+g-gnulib.h is included by all source files in order to move all
+exported functions to the _g_gnulib namespace, replace malloc by
+g_malloc and make sure that snprintf is only used if it implements
+C99 return value semantics.
+
+Matthias Clasen
+November 1, 2003
+
+
+
+
diff --git a/trunk/glib/gnulib/asnprintf.c b/trunk/glib/gnulib/asnprintf.c
new file mode 100644
index 000000000..765d98ce5
--- /dev/null
+++ b/trunk/glib/gnulib/asnprintf.c
@@ -0,0 +1,40 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+
+ This program 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, 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library 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. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "g-gnulib.h"
+
+/* Specification. */
+#include "vasnprintf.h"
+
+#include <stdarg.h>
+
+char *
+asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ char *result;
+
+ va_start (args, format);
+ result = vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/trunk/glib/gnulib/g-gnulib.h b/trunk/glib/gnulib/g-gnulib.h
new file mode 100644
index 000000000..bb3b0c0d6
--- /dev/null
+++ b/trunk/glib/gnulib/g-gnulib.h
@@ -0,0 +1,50 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 2003 Matthias Clasen
+ *
+ * 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_GNULIB_H__
+
+#include <config.h>
+#include <stdlib.h>
+#include "glib/glib.h"
+#include "glib/galias.h"
+
+/* Private namespace for gnulib functions */
+#define asnprintf _g_gnulib_asnprintf
+#define vasnprintf _g_gnulib_vasnprintf
+#define printf_parse _g_gnulib_printf_parse
+#define printf_fetchargs _g_gnulib_printf_fetchargs
+
+/* Use GLib memory allocation */
+#undef malloc
+#undef realloc
+#undef free
+#define malloc g_malloc
+#define realloc g_realloc
+#define free g_free
+
+/* Ensure only C99 snprintf gets used */
+#undef HAVE_SNPRINTF
+#ifdef HAVE_C99_SNPRINTF
+#define HAVE_SNPRINTF 1
+#else
+#define HAVE_SNPRINTF 0
+#endif
+
+
+#endif /* __G_GNULIB_H__ */
+
diff --git a/trunk/glib/gnulib/makefile.msc b/trunk/glib/gnulib/makefile.msc
new file mode 100644
index 000000000..a8fc743c8
--- /dev/null
+++ b/trunk/glib/gnulib/makefile.msc
@@ -0,0 +1,18 @@
+TOP = ..\..\..
+!INCLUDE ..\..\build\win32\make.msc
+
+INCLUDES = -I ..\..
+DEFINES = -DHAVE_CONFIG_H -DHAVE_LONG_LONG_FORMAT
+
+OBJECTS = \
+ asnprintf.obj \
+ printf.obj \
+ printf-args.obj \
+ printf-parse.obj \
+ vasnprintf.obj
+
+all : gnulib.lib
+
+gnulib.lib : $(OBJECTS)
+ lib -out:gnulib.lib $(OBJECTS)
+
diff --git a/trunk/glib/gnulib/printf-args.c b/trunk/glib/gnulib/printf-args.c
new file mode 100644
index 000000000..91ca6d832
--- /dev/null
+++ b/trunk/glib/gnulib/printf-args.c
@@ -0,0 +1,129 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+ This program 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, 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library 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. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "g-gnulib.h"
+
+/* Specification. */
+#include "printf-args.h"
+
+#ifdef STATIC
+STATIC
+#endif
+int
+printf_fetchargs (va_list args, arguments *a)
+{
+ unsigned int i;
+ argument *ap;
+
+ for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
+ switch (ap->type)
+ {
+ case TYPE_SCHAR:
+ ap->a.a_schar = va_arg (args, /*signed char*/ int);
+ break;
+ case TYPE_UCHAR:
+ ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
+ break;
+ case TYPE_SHORT:
+ ap->a.a_short = va_arg (args, /*short*/ int);
+ break;
+ case TYPE_USHORT:
+ ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
+ break;
+ case TYPE_INT:
+ ap->a.a_int = va_arg (args, int);
+ break;
+ case TYPE_UINT:
+ ap->a.a_uint = va_arg (args, unsigned int);
+ break;
+ case TYPE_LONGINT:
+ ap->a.a_longint = va_arg (args, long int);
+ break;
+ case TYPE_ULONGINT:
+ ap->a.a_ulongint = va_arg (args, unsigned long int);
+ break;
+#ifdef HAVE_LONG_LONG
+ case TYPE_LONGLONGINT:
+ ap->a.a_longlongint = va_arg (args, long long int);
+ break;
+ case TYPE_ULONGLONGINT:
+ ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
+ break;
+#endif
+#ifdef HAVE_INT64_AND_I64
+ case TYPE_INT64:
+ ap->a.a_int64 = va_arg (args, __int64);
+ break;
+ case TYPE_UINT64:
+ ap->a.a_uint64 = va_arg (args, unsigned __int64);
+ break;
+#endif
+ case TYPE_DOUBLE:
+ ap->a.a_double = va_arg (args, double);
+ break;
+#ifdef HAVE_LONG_DOUBLE
+ case TYPE_LONGDOUBLE:
+ ap->a.a_longdouble = va_arg (args, long double);
+ break;
+#endif
+ case TYPE_CHAR:
+ ap->a.a_char = va_arg (args, int);
+ break;
+#ifdef HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+ ap->a.a_wide_char = va_arg (args, wint_t);
+ break;
+#endif
+ case TYPE_STRING:
+ ap->a.a_string = va_arg (args, const char *);
+ break;
+#ifdef HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+ ap->a.a_wide_string = va_arg (args, const wchar_t *);
+ break;
+#endif
+ case TYPE_POINTER:
+ ap->a.a_pointer = va_arg (args, void *);
+ break;
+ case TYPE_COUNT_SCHAR_POINTER:
+ ap->a.a_count_schar_pointer = va_arg (args, signed char *);
+ break;
+ case TYPE_COUNT_SHORT_POINTER:
+ ap->a.a_count_short_pointer = va_arg (args, short *);
+ break;
+ case TYPE_COUNT_INT_POINTER:
+ ap->a.a_count_int_pointer = va_arg (args, int *);
+ break;
+ case TYPE_COUNT_LONGINT_POINTER:
+ ap->a.a_count_longint_pointer = va_arg (args, long int *);
+ break;
+#ifdef HAVE_LONG_LONG
+ case TYPE_COUNT_LONGLONGINT_POINTER:
+ ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
+ break;
+#endif
+ default:
+ /* Unknown type. */
+ return -1;
+ }
+ return 0;
+}
diff --git a/trunk/glib/gnulib/printf-args.h b/trunk/glib/gnulib/printf-args.h
new file mode 100644
index 000000000..082567568
--- /dev/null
+++ b/trunk/glib/gnulib/printf-args.h
@@ -0,0 +1,142 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+ This program 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, 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library 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. */
+
+#ifndef _PRINTF_ARGS_H
+#define _PRINTF_ARGS_H
+
+/* Get wchar_t. */
+#ifdef HAVE_WCHAR_T
+# include <stddef.h>
+#endif
+
+/* Get wint_t. */
+#ifdef HAVE_WINT_T
+# include <wchar.h>
+#endif
+
+/* Get va_list. */
+#include <stdarg.h>
+
+
+/* Argument types */
+typedef enum
+{
+ TYPE_NONE,
+ TYPE_SCHAR,
+ TYPE_UCHAR,
+ TYPE_SHORT,
+ TYPE_USHORT,
+ TYPE_INT,
+ TYPE_UINT,
+ TYPE_LONGINT,
+ TYPE_ULONGINT,
+#ifdef HAVE_LONG_LONG
+ TYPE_LONGLONGINT,
+ TYPE_ULONGLONGINT,
+#endif
+#ifdef HAVE_INT64_AND_I64
+ TYPE_INT64,
+ TYPE_UINT64,
+#endif
+ TYPE_DOUBLE,
+#ifdef HAVE_LONG_DOUBLE
+ TYPE_LONGDOUBLE,
+#endif
+ TYPE_CHAR,
+#ifdef HAVE_WINT_T
+ TYPE_WIDE_CHAR,
+#endif
+ TYPE_STRING,
+#ifdef HAVE_WCHAR_T
+ TYPE_WIDE_STRING,
+#endif
+ TYPE_POINTER,
+ TYPE_COUNT_SCHAR_POINTER,
+ TYPE_COUNT_SHORT_POINTER,
+ TYPE_COUNT_INT_POINTER,
+ TYPE_COUNT_LONGINT_POINTER
+#ifdef HAVE_LONG_LONG
+, TYPE_COUNT_LONGLONGINT_POINTER
+#endif
+} arg_type;
+
+/* Polymorphic argument */
+typedef struct
+{
+ arg_type type;
+ union
+ {
+ signed char a_schar;
+ unsigned char a_uchar;
+ short a_short;
+ unsigned short a_ushort;
+ int a_int;
+ unsigned int a_uint;
+ long int a_longint;
+ unsigned long int a_ulongint;
+#ifdef HAVE_LONG_LONG
+ long long int a_longlongint;
+ unsigned long long int a_ulonglongint;
+#endif
+#ifdef HAVE_INT64_AND_I64
+ __int64 a_int64;
+ unsigned __int64 a_uint64;
+#endif
+ float a_float;
+ double a_double;
+#ifdef HAVE_LONG_DOUBLE
+ long double a_longdouble;
+#endif
+ int a_char;
+#ifdef HAVE_WINT_T
+ wint_t a_wide_char;
+#endif
+ const char* a_string;
+#ifdef HAVE_WCHAR_T
+ const wchar_t* a_wide_string;
+#endif
+ void* a_pointer;
+ signed char * a_count_schar_pointer;
+ short * a_count_short_pointer;
+ int * a_count_int_pointer;
+ long int * a_count_longint_pointer;
+#ifdef HAVE_LONG_LONG
+ long long int * a_count_longlongint_pointer;
+#endif
+ }
+ a;
+}
+argument;
+
+typedef struct
+{
+ unsigned int count;
+ argument *arg;
+}
+arguments;
+
+
+/* Fetch the arguments, putting them into a. */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int printf_fetchargs (va_list args, arguments *a);
+
+#endif /* _PRINTF_ARGS_H */
diff --git a/trunk/glib/gnulib/printf-parse.c b/trunk/glib/gnulib/printf-parse.c
new file mode 100644
index 000000000..961b0816d
--- /dev/null
+++ b/trunk/glib/gnulib/printf-parse.c
@@ -0,0 +1,498 @@
+/* Formatted output to strings.
+ Copyright (C) 1999-2000, 2002-2003 Free Software Foundation, Inc.
+
+ This program 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, 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library 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. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "g-gnulib.h"
+
+/* Specification. */
+#include "printf-parse.h"
+
+/* Get size_t, NULL. */
+#include <stddef.h>
+
+/* Get intmax_t. */
+#if HAVE_STDINT_H_WITH_UINTMAX
+# include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+# include <inttypes.h>
+#endif
+
+/* malloc(), realloc(), free(). */
+#include <stdlib.h>
+
+#ifdef STATIC
+STATIC
+#endif
+int
+printf_parse (const char *format, char_directives *d, arguments *a)
+{
+ const char *cp = format; /* pointer into format */
+ int arg_posn = 0; /* number of regular arguments consumed */
+ unsigned int d_allocated; /* allocated elements of d->dir */
+ unsigned int a_allocated; /* allocated elements of a->arg */
+ unsigned int max_width_length = 0;
+ unsigned int max_precision_length = 0;
+
+ d->count = 0;
+ d_allocated = 1;
+ d->dir = malloc (d_allocated * sizeof (char_directive));
+ if (d->dir == NULL)
+ /* Out of memory. */
+ return -1;
+
+ a->count = 0;
+ a_allocated = 0;
+ a->arg = NULL;
+
+#define REGISTER_ARG(_index_,_type_) \
+ { \
+ unsigned int n = (_index_); \
+ if (n >= a_allocated) \
+ { \
+ argument *memory; \
+ a_allocated = 2 * a_allocated; \
+ if (a_allocated <= n) \
+ a_allocated = n + 1; \
+ memory = (a->arg \
+ ? realloc (a->arg, a_allocated * sizeof (argument)) \
+ : malloc (a_allocated * sizeof (argument))); \
+ if (memory == NULL) \
+ /* Out of memory. */ \
+ goto error; \
+ a->arg = memory; \
+ } \
+ while (a->count <= n) \
+ a->arg[a->count++].type = TYPE_NONE; \
+ if (a->arg[n].type == TYPE_NONE) \
+ a->arg[n].type = (_type_); \
+ else if (a->arg[n].type != (_type_)) \
+ /* Ambiguous type for positional argument. */ \
+ goto error; \
+ }
+
+ while (*cp != '\0')
+ {
+ char c = *cp++;
+ if (c == '%')
+ {
+ int arg_index = -1;
+ char_directive *dp = &d->dir[d->count];/* pointer to next directive */
+
+ /* Initialize the next directive. */
+ dp->dir_start = cp - 1;
+ dp->flags = 0;
+ dp->width_start = NULL;
+ dp->width_end = NULL;
+ dp->width_arg_index = -1;
+ dp->precision_start = NULL;
+ dp->precision_end = NULL;
+ dp->precision_arg_index = -1;
+ dp->arg_index = -1;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const char *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ unsigned int n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = 10 * n + (*np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+
+ /* Read the flags. */
+ for (;;)
+ {
+ if (*cp == '\'')
+ {
+ dp->flags |= FLAG_GROUP;
+ cp++;
+ }
+ else if (*cp == '-')
+ {
+ dp->flags |= FLAG_LEFT;
+ cp++;
+ }
+ else if (*cp == '+')
+ {
+ dp->flags |= FLAG_SHOWSIGN;
+ cp++;
+ }
+ else if (*cp == ' ')
+ {
+ dp->flags |= FLAG_SPACE;
+ cp++;
+ }
+ else if (*cp == '#')
+ {
+ dp->flags |= FLAG_ALT;
+ cp++;
+ }
+ else if (*cp == '0')
+ {
+ dp->flags |= FLAG_ZERO;
+ cp++;
+ }
+ else
+ break;
+ }
+
+ /* Parse the field width. */
+ if (*cp == '*')
+ {
+ dp->width_start = cp;
+ cp++;
+ dp->width_end = cp;
+ if (max_width_length < 1)
+ max_width_length = 1;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const char *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ unsigned int n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = 10 * n + (*np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ dp->width_arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+ if (dp->width_arg_index < 0)
+ dp->width_arg_index = arg_posn++;
+ REGISTER_ARG (dp->width_arg_index, TYPE_INT);
+ }
+ else if (*cp >= '0' && *cp <= '9')
+ {
+ unsigned int width_length;
+
+ dp->width_start = cp;
+ for (; *cp >= '0' && *cp <= '9'; cp++)
+ ;
+ dp->width_end = cp;
+ width_length = dp->width_end - dp->width_start;
+ if (max_width_length < width_length)
+ max_width_length = width_length;
+ }
+
+ /* Parse the precision. */
+ if (*cp == '.')
+ {
+ cp++;
+ if (*cp == '*')
+ {
+ dp->precision_start = cp - 1;
+ cp++;
+ dp->precision_end = cp;
+ if (max_precision_length < 2)
+ max_precision_length = 2;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const char *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ unsigned int n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = 10 * n + (*np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ dp->precision_arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+ if (dp->precision_arg_index < 0)
+ dp->precision_arg_index = arg_posn++;
+ REGISTER_ARG (dp->precision_arg_index, TYPE_INT);
+ }
+ else
+ {
+ unsigned int precision_length;
+
+ dp->precision_start = cp - 1;
+ for (; *cp >= '0' && *cp <= '9'; cp++)
+ ;
+ dp->precision_end = cp;
+ precision_length = dp->precision_end - dp->precision_start;
+ if (max_precision_length < precision_length)
+ max_precision_length = precision_length;
+ }
+ }
+
+ {
+ arg_type type;
+
+ /* Parse argument type/size specifiers. */
+ {
+ int flags = 0;
+
+ for (;;)
+ {
+ if (*cp == 'h')
+ {
+ flags |= (1 << (flags & 1));
+ cp++;
+ }
+ else if (*cp == 'L')
+ {
+ flags |= 4;
+ cp++;
+ }
+ else if (*cp == 'l')
+ {
+ flags += 8;
+ cp++;
+ }
+#ifdef HAVE_INT64_AND_I64
+ else if (cp[0] == 'I' &&
+ cp[1] == '6' &&
+ cp[2] == '4')
+ {
+ flags = 64;
+ cp += 3;
+ }
+#endif
+#ifdef HAVE_INTMAX_T
+ else if (*cp == 'j')
+ {
+ if (sizeof (intmax_t) > sizeof (long))
+ {
+ /* intmax_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (intmax_t) > sizeof (int))
+ {
+ /* intmax_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+#endif
+ else if (*cp == 'z' || *cp == 'Z')
+ {
+ /* 'z' is standardized in ISO C 99, but glibc uses 'Z'
+ because the warning facility in gcc-2.95.2 understands
+ only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */
+ if (sizeof (size_t) > sizeof (long))
+ {
+ /* size_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (size_t) > sizeof (int))
+ {
+ /* size_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+ else if (*cp == 't')
+ {
+ if (sizeof (ptrdiff_t) > sizeof (long))
+ {
+ /* ptrdiff_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (ptrdiff_t) > sizeof (int))
+ {
+ /* ptrdiff_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+ else
+ break;
+ }
+
+ /* Read the conversion character. */
+ c = *cp++;
+ switch (c)
+ {
+ case 'd': case 'i':
+#ifdef HAVE_INT64_AND_I64
+ if (flags == 64)
+ type = TYPE_INT64;
+ else
+#endif
+#ifdef HAVE_LONG_LONG
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_LONGLONGINT;
+ else
+#endif
+ if (flags >= 8)
+ type = TYPE_LONGINT;
+ else if (flags & 2)
+ type = TYPE_SCHAR;
+ else if (flags & 1)
+ type = TYPE_SHORT;
+ else
+ type = TYPE_INT;
+ break;
+ case 'o': case 'u': case 'x': case 'X':
+#ifdef HAVE_INT64_AND_I64
+ if (flags == 64)
+ type = TYPE_UINT64;
+ else
+#endif
+#ifdef HAVE_LONG_LONG
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_ULONGLONGINT;
+ else
+#endif
+ if (flags >= 8)
+ type = TYPE_ULONGINT;
+ else if (flags & 2)
+ type = TYPE_UCHAR;
+ else if (flags & 1)
+ type = TYPE_USHORT;
+ else
+ type = TYPE_UINT;
+ break;
+ case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
+ case 'a': case 'A':
+#ifdef HAVE_LONG_DOUBLE
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_LONGDOUBLE;
+ else
+#endif
+ type = TYPE_DOUBLE;
+ break;
+ case 'c':
+ if (flags >= 8)
+#ifdef HAVE_WINT_T
+ type = TYPE_WIDE_CHAR;
+#else
+ goto error;
+#endif
+ else
+ type = TYPE_CHAR;
+ break;
+#ifdef HAVE_WINT_T
+ case 'C':
+ type = TYPE_WIDE_CHAR;
+ c = 'c';
+ break;
+#endif
+ case 's':
+ if (flags >= 8)
+#ifdef HAVE_WCHAR_T
+ type = TYPE_WIDE_STRING;
+#else
+ goto error;
+#endif
+ else
+ type = TYPE_STRING;
+ break;
+#ifdef HAVE_WCHAR_T
+ case 'S':
+ type = TYPE_WIDE_STRING;
+ c = 's';
+ break;
+#endif
+ case 'p':
+ type = TYPE_POINTER;
+ break;
+ case 'n':
+#ifdef HAVE_LONG_LONG
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_COUNT_LONGLONGINT_POINTER;
+ else
+#endif
+ if (flags >= 8)
+ type = TYPE_COUNT_LONGINT_POINTER;
+ else if (flags & 2)
+ type = TYPE_COUNT_SCHAR_POINTER;
+ else if (flags & 1)
+ type = TYPE_COUNT_SHORT_POINTER;
+ else
+ type = TYPE_COUNT_INT_POINTER;
+ break;
+ case '%':
+ type = TYPE_NONE;
+ break;
+ default:
+ /* Unknown conversion character. */
+ goto error;
+ }
+ }
+
+ if (type != TYPE_NONE)
+ {
+ dp->arg_index = arg_index;
+ if (dp->arg_index < 0)
+ dp->arg_index = arg_posn++;
+ REGISTER_ARG (dp->arg_index, type);
+ }
+ dp->conversion = c;
+ dp->dir_end = cp;
+ }
+
+ d->count++;
+ if (d->count >= d_allocated)
+ {
+ char_directive *memory;
+
+ d_allocated = 2 * d_allocated;
+ memory = realloc (d->dir, d_allocated * sizeof (char_directive));
+ if (memory == NULL)
+ /* Out of memory. */
+ goto error;
+ d->dir = memory;
+ }
+ }
+ }
+ d->dir[d->count].dir_start = cp;
+
+ d->max_width_length = max_width_length;
+ d->max_precision_length = max_precision_length;
+ return 0;
+
+error:
+ if (a->arg)
+ free (a->arg);
+ if (d->dir)
+ free (d->dir);
+ return -1;
+}
diff --git a/trunk/glib/gnulib/printf-parse.h b/trunk/glib/gnulib/printf-parse.h
new file mode 100644
index 000000000..ab414782d
--- /dev/null
+++ b/trunk/glib/gnulib/printf-parse.h
@@ -0,0 +1,74 @@
+/* Parse printf format string.
+ Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+
+ This program 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, 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library 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. */
+
+#ifndef _PRINTF_PARSE_H
+#define _PRINTF_PARSE_H
+
+#include "printf-args.h"
+
+/* Private namespace for gnulib functions */
+#define printf_parse _g_gnulib_printf_parse
+
+/* Flags */
+#define FLAG_GROUP 1 /* ' flag */
+#define FLAG_LEFT 2 /* - flag */
+#define FLAG_SHOWSIGN 4 /* + flag */
+#define FLAG_SPACE 8 /* space flag */
+#define FLAG_ALT 16 /* # flag */
+#define FLAG_ZERO 32
+
+/* A parsed directive. */
+typedef struct
+{
+ const char* dir_start;
+ const char* dir_end;
+ int flags;
+ const char* width_start;
+ const char* width_end;
+ int width_arg_index;
+ const char* precision_start;
+ const char* precision_end;
+ int precision_arg_index;
+ char conversion; /* d i o u x X f e E g G c s p n U % but not C S */
+ int arg_index;
+}
+char_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ unsigned int count;
+ char_directive *dir;
+ unsigned int max_width_length;
+ unsigned int max_precision_length;
+}
+char_directives;
+
+
+/* Parses the format string. Fills in the number N of directives, and fills
+ in directives[0], ..., directives[N-1], and sets directives[N].dir_start
+ to the end of the format string. Also fills in the arg_type fields of the
+ arguments and the needed count of arguments. */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int printf_parse (const char *format, char_directives *d, arguments *a);
+
+#endif /* _PRINTF_PARSE_H */
diff --git a/trunk/glib/gnulib/printf.c b/trunk/glib/gnulib/printf.c
new file mode 100644
index 000000000..b3392999f
--- /dev/null
+++ b/trunk/glib/gnulib/printf.c
@@ -0,0 +1,154 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 2003 Matthias Clasen
+ *
+ * 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 2003. 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/.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "g-gnulib.h"
+#include "vasnprintf.h"
+#include "printf.h"
+
+int _g_gnulib_printf (char const *format, ...)
+{
+ va_list args;
+ int retval;
+
+ va_start (args, format);
+ retval = _g_gnulib_vprintf (format, args);
+ va_end (args);
+
+ return retval;
+}
+
+int _g_gnulib_fprintf (FILE *file, char const *format, ...)
+{
+ va_list args;
+ int retval;
+
+ va_start (args, format);
+ retval = _g_gnulib_vfprintf (file, format, args);
+ va_end (args);
+
+ return retval;
+}
+
+int _g_gnulib_sprintf (char *string, char const *format, ...)
+{
+ va_list args;
+ int retval;
+
+ va_start (args, format);
+ retval = _g_gnulib_vsprintf (string, format, args);
+ va_end (args);
+
+ return retval;
+}
+
+int _g_gnulib_snprintf (char *string, size_t n, char const *format, ...)
+{
+ va_list args;
+ int retval;
+
+ va_start (args, format);
+ retval = _g_gnulib_vsnprintf (string, n, format, args);
+ va_end (args);
+
+ return retval;
+}
+
+int _g_gnulib_vprintf (char const *format, va_list args)
+{
+ return _g_gnulib_vfprintf (stdout, format, args);
+}
+
+int _g_gnulib_vfprintf (FILE *file, char const *format, va_list args)
+{
+ char *result;
+ size_t length;
+
+ result = vasnprintf (NULL, &length, format, args);
+ if (result == NULL)
+ return -1;
+
+ fwrite (result, 1, length, file);
+ free (result);
+
+ return length;
+}
+
+int _g_gnulib_vsprintf (char *string, char const *format, va_list args)
+{
+ char *result;
+ size_t length;
+
+ result = vasnprintf (NULL, &length, format, args);
+ if (result == NULL)
+ return -1;
+
+ memcpy (string, result, length + 1);
+ free (result);
+
+ return length;
+}
+
+int _g_gnulib_vsnprintf (char *string, size_t n, char const *format, va_list args)
+{
+ char *result;
+ size_t length;
+
+ result = vasnprintf (NULL, &length, format, args);
+ if (result == NULL)
+ return -1;
+
+ if (n > 0)
+ {
+ memcpy (string, result, MIN(length + 1, n));
+ string[n - 1] = 0;
+ }
+
+ free (result);
+
+ return length;
+}
+
+int _g_gnulib_vasprintf (char **result, char const *format, va_list args)
+{
+ size_t length;
+
+ *result = vasnprintf (NULL, &length, format, args);
+ if (*result == NULL)
+ return -1;
+
+ return length;
+}
+
+
+
+
+
diff --git a/trunk/glib/gnulib/printf.h b/trunk/glib/gnulib/printf.h
new file mode 100644
index 000000000..a7be56f48
--- /dev/null
+++ b/trunk/glib/gnulib/printf.h
@@ -0,0 +1,57 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 2003 Matthias Clasen
+ *
+ * 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 __GNULIB_PRINTF_H__
+#define __GNULIB_PRINTF_H__
+
+#include <stdarg.h>
+#include <stdio.h>
+
+int _g_gnulib_printf (char const *format,
+ ...);
+int _g_gnulib_fprintf (FILE *file,
+ char const *format,
+ ...);
+int _g_gnulib_sprintf (char *string,
+ char const *format,
+ ...);
+int _g_gnulib_snprintf (char *string,
+ size_t n,
+ char const *format,
+ ...);
+int _g_gnulib_vprintf (char const *format,
+ va_list args);
+int _g_gnulib_vfprintf (FILE *file,
+ char const *format,
+ va_list args);
+int _g_gnulib_vsprintf (char *string,
+ char const *format,
+ va_list args);
+int _g_gnulib_vsnprintf (char *string,
+ size_t n,
+ char const *format,
+ va_list args);
+int _g_gnulib_vasprintf (char **result,
+ char const *format,
+ va_list args);
+
+
+#endif /* __GNULIB_PRINTF_H__ */
+
+
+
diff --git a/trunk/glib/gnulib/vasnprintf.c b/trunk/glib/gnulib/vasnprintf.c
new file mode 100644
index 000000000..c31075f68
--- /dev/null
+++ b/trunk/glib/gnulib/vasnprintf.c
@@ -0,0 +1,1071 @@
+/* vsprintf with automatic memory allocation.
+ Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+ This program 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, 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library 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. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "glib/galloca.h"
+
+#include "g-gnulib.h"
+
+/* Specification. */
+#include "vasnprintf.h"
+
+#include <stdio.h> /* snprintf(), sprintf() */
+#include <stdlib.h> /* abort(), malloc(), realloc(), free() */
+#include <string.h> /* memcpy(), strlen() */
+#include <errno.h> /* errno */
+#include <limits.h> /* CHAR_BIT */
+#include <float.h> /* DBL_MAX_EXP, LDBL_MAX_EXP */
+#include "printf-parse.h"
+
+#ifdef HAVE_WCHAR_T
+# ifdef HAVE_WCSLEN
+# define local_wcslen wcslen
+# else
+ /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid
+ a dependency towards this library, here is a local substitute.
+ Define this substitute only once, even if this file is included
+ twice in the same compilation unit. */
+# ifndef local_wcslen_defined
+# define local_wcslen_defined 1
+static size_t
+local_wcslen (const wchar_t *s)
+{
+ const wchar_t *ptr;
+
+ for (ptr = s; *ptr != (wchar_t) 0; ptr++)
+ ;
+ return ptr - s;
+}
+# endif
+# endif
+#endif
+
+/* For those losing systems which don't have 'alloca' we have to add
+ some additional code emulating it. */
+#ifdef HAVE_ALLOCA
+# define freea(p) /* nothing */
+#else
+# define alloca(n) malloc (n)
+# define freea(p) free (p)
+#endif
+
+#ifndef HAVE_LONG_LONG_FORMAT
+static int
+print_long_long (char *buf,
+ int len,
+ int width,
+ int precision,
+ unsigned long flags,
+ char conversion,
+ unsigned long long number)
+{
+ int negative = FALSE;
+ char buffer[128];
+ char *bufferend;
+ char *pointer;
+ int base;
+ static const char *upper = "0123456789ABCDEFX";
+ static const char *lower = "0123456789abcdefx";
+ const char *digits;
+ int i;
+ char *p;
+ int count;
+
+#define EMIT(c) \
+ if (p - buf == len - 1) \
+ { \
+ *p++ = '\0'; \
+ return len; \
+ } \
+ else \
+ *p++ = c;
+
+ p = buf;
+
+ switch (conversion)
+ {
+ case 'o':
+ base = 8;
+ digits = lower;
+ negative = FALSE;
+ break;
+ case 'x':
+ base = 16;
+ digits = lower;
+ negative = FALSE;
+ break;
+ case 'X':
+ base = 16;
+ digits = upper;
+ negative = FALSE;
+ break;
+ default:
+ base = 10;
+ digits = lower;
+ negative = (long long)number < 0;
+ if (negative)
+ number = -((long long)number);
+ break;
+ }
+
+ /* Build number */
+ pointer = bufferend = &buffer[sizeof(buffer) - 1];
+ *pointer-- = '\0';
+ for (i = 1; i < (int)sizeof(buffer); i++)
+ {
+ *pointer-- = digits[number % base];
+ number /= base;
+ if (number == 0)
+ break;
+ }
+
+ /* Adjust width */
+ width -= (bufferend - pointer) - 1;
+
+ /* Adjust precision */
+ if (precision != -1)
+ {
+ precision -= (bufferend - pointer) - 1;
+ if (precision < 0)
+ precision = 0;
+ flags |= FLAG_ZERO;
+ }
+
+ /* Adjust width further */
+ if (negative || (flags & FLAG_SHOWSIGN) || (flags & FLAG_SPACE))
+ width--;
+ if (flags & FLAG_ALT)
+ {
+ switch (base)
+ {
+ case 16:
+ width -= 2;
+ break;
+ case 8:
+ width--;
+ break;
+ default:
+ break;
+ }
+ }
+
+ /* Output prefixes spaces if needed */
+ if (! ((flags & FLAG_LEFT) ||
+ ((flags & FLAG_ZERO) && (precision == -1))))
+ {
+ count = (precision == -1) ? 0 : precision;
+ while (width-- > count)
+ *p++ = ' ';
+ }
+
+ /* width has been adjusted for signs and alternatives */
+ if (negative)
+ {
+ EMIT ('-');
+ }
+ else if (flags & FLAG_SHOWSIGN)
+ {
+ EMIT('+');
+ }
+ else if (flags & FLAG_SPACE)
+ {
+ EMIT(' ');
+ }
+
+ if (flags & FLAG_ALT)
+ {
+ switch (base)
+ {
+ case 8:
+ EMIT('0');
+ break;
+ case 16:
+ EMIT('0');
+ EMIT(digits[16]);
+ break;
+ default:
+ break;
+ } /* switch base */
+ }
+
+ /* Output prefixed zero padding if needed */
+ if (flags & FLAG_ZERO)
+ {
+ if (precision == -1)
+ precision = width;
+ while (precision-- > 0)
+ {
+ EMIT('0');
+ width--;
+ }
+ }
+
+ /* Output the number itself */
+ while (*(++pointer))
+ {
+ EMIT(*pointer);
+ }
+
+ /* Output trailing spaces if needed */
+ if (flags & FLAG_LEFT)
+ {
+ while (width-- > 0)
+ EMIT(' ');
+ }
+
+ EMIT('\0');
+
+ return p - buf - 1;
+}
+#endif
+
+char *
+vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
+{
+ char_directives d;
+ arguments a;
+
+ if (printf_parse (format, &d, &a) < 0)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+#define CLEANUP() \
+ free (d.dir); \
+ if (a.arg) \
+ free (a.arg);
+
+ if (printf_fetchargs (args, &a) < 0)
+ {
+ CLEANUP ();
+ errno = EINVAL;
+ return NULL;
+ }
+
+ {
+ char *buf =
+ (char *) alloca (7 + d.max_width_length + d.max_precision_length + 6);
+ const char *cp;
+ unsigned int i;
+ char_directive *dp;
+ /* Output string accumulator. */
+ char *result;
+ size_t allocated;
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+#define ENSURE_ALLOCATION(needed) \
+ if ((needed) > allocated) \
+ { \
+ char *memory; \
+ \
+ allocated = (allocated > 0 ? 2 * allocated : 12); \
+ if ((needed) > allocated) \
+ allocated = (needed); \
+ if (result == resultbuf || result == NULL) \
+ memory = (char *) malloc (allocated); \
+ else \
+ memory = (char *) realloc (result, allocated); \
+ \
+ if (memory == NULL) \
+ { \
+ if (!(result == resultbuf || result == NULL)) \
+ free (result); \
+ freea (buf); \
+ CLEANUP (); \
+ errno = ENOMEM; \
+ return NULL; \
+ } \
+ if (result == resultbuf && length > 0) \
+ memcpy (memory, result, length); \
+ result = memory; \
+ }
+
+ for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++)
+ {
+ if (cp != dp->dir_start)
+ {
+ size_t n = dp->dir_start - cp;
+
+ ENSURE_ALLOCATION (length + n);
+ memcpy (result + length, cp, n);
+ length += n;
+ }
+ if (i == d.count)
+ break;
+
+ /* Execute a single directive. */
+ if (dp->conversion == '%')
+ {
+ if (!(dp->arg_index < 0))
+ abort ();
+ ENSURE_ALLOCATION (length + 1);
+ result[length] = '%';
+ length += 1;
+ }
+ else
+ {
+ if (!(dp->arg_index >= 0))
+ abort ();
+
+ if (dp->conversion == 'n')
+ {
+ switch (a.arg[dp->arg_index].type)
+ {
+ case TYPE_COUNT_SCHAR_POINTER:
+ *a.arg[dp->arg_index].a.a_count_schar_pointer = length;
+ break;
+ case TYPE_COUNT_SHORT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_short_pointer = length;
+ break;
+ case TYPE_COUNT_INT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_int_pointer = length;
+ break;
+ case TYPE_COUNT_LONGINT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_longint_pointer = length;
+ break;
+#ifdef HAVE_LONG_LONG
+ case TYPE_COUNT_LONGLONGINT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
+ break;
+#endif
+ default:
+ abort ();
+ }
+ }
+ else
+ {
+ arg_type type = a.arg[dp->arg_index].type;
+ char *p;
+ unsigned int prefix_count;
+ int prefixes[2];
+#if !HAVE_SNPRINTF
+ unsigned int tmp_length;
+ char tmpbuf[700];
+ char *tmp;
+
+ /* Allocate a temporary buffer of sufficient size for calling
+ sprintf. */
+ {
+ unsigned int width;
+ unsigned int precision;
+
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index >= 0)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ width = (arg < 0 ? -arg : arg);
+ }
+ else
+ {
+ const char *digitp = dp->width_start;
+
+ do
+ width = width * 10 + (*digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ }
+
+ precision = 6;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index >= 0)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ precision = (arg < 0 ? 0 : arg);
+ }
+ else
+ {
+ const char *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = precision * 10 + (*digitp++ - '0');
+ }
+ }
+
+ switch (dp->conversion)
+ {
+ case 'd': case 'i': case 'u':
+# ifdef HAVE_LONG_LONG
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 1; /* account for leading sign */
+ else
+# endif
+ if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 1; /* account for leading sign */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 1; /* account for leading sign */
+ break;
+
+ case 'o':
+# ifdef HAVE_LONG_LONG
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1 /* turn floor into ceil */
+ + 1; /* account for leading sign */
+ else
+# endif
+ if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1 /* turn floor into ceil */
+ + 1; /* account for leading sign */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1 /* turn floor into ceil */
+ + 1; /* account for leading sign */
+ break;
+
+ case 'x': case 'X':
+# ifdef HAVE_LONG_LONG
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1 /* turn floor into ceil */
+ + 2; /* account for leading sign or alternate form */
+ else
+# endif
+# ifdef HAVE_INT64_AND_I64
+ if (type == TYPE_INT64 || type == TYPE_UINT64)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned __int64) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1 /* turn floor into ceil */
+ + 2; /* account for leading sign or alternate form */
+ else
+# endif
+ if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1 /* turn floor into ceil */
+ + 2; /* account for leading sign or alternate form */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1 /* turn floor into ceil */
+ + 2; /* account for leading sign or alternate form */
+ break;
+
+ case 'f': case 'F':
+# ifdef HAVE_LONG_DOUBLE
+ if (type == TYPE_LONGDOUBLE)
+ tmp_length =
+ (unsigned int) (LDBL_MAX_EXP
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + precision
+ + 10; /* sign, decimal point etc. */
+ else
+# endif
+ tmp_length =
+ (unsigned int) (DBL_MAX_EXP
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + precision
+ + 10; /* sign, decimal point etc. */
+ break;
+
+ case 'e': case 'E': case 'g': case 'G':
+ case 'a': case 'A':
+ tmp_length =
+ precision
+ + 12; /* sign, decimal point, exponent etc. */
+ break;
+
+ case 'c':
+# ifdef HAVE_WINT_T
+ if (type == TYPE_WIDE_CHAR)
+ tmp_length = MB_CUR_MAX;
+ else
+# endif
+ tmp_length = 1;
+ break;
+
+ case 's':
+# ifdef HAVE_WCHAR_T
+ if (type == TYPE_WIDE_STRING)
+ tmp_length =
+ local_wcslen (a.arg[dp->arg_index].a.a_wide_string)
+ * MB_CUR_MAX;
+ else
+# endif
+ tmp_length = strlen (a.arg[dp->arg_index].a.a_string);
+ break;
+
+ case 'p':
+ tmp_length =
+ (unsigned int) (sizeof (void *) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1 /* turn floor into ceil */
+ + 2; /* account for leading 0x */
+ break;
+
+ default:
+ abort ();
+ }
+
+ if (tmp_length < width)
+ tmp_length = width;
+
+ tmp_length++; /* account for trailing NUL */
+ }
+
+ if (tmp_length <= sizeof (tmpbuf))
+ tmp = tmpbuf;
+ else
+ {
+ tmp = (char *) malloc (tmp_length);
+ if (tmp == NULL)
+ {
+ /* Out of memory. */
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ freea (buf);
+ CLEANUP ();
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+#endif
+
+ /* Construct the format string for calling snprintf or
+ sprintf. */
+ p = buf;
+ *p++ = '%';
+ if (dp->flags & FLAG_GROUP)
+ *p++ = '\'';
+ if (dp->flags & FLAG_LEFT)
+ *p++ = '-';
+ if (dp->flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ if (dp->flags & FLAG_SPACE)
+ *p++ = ' ';
+ if (dp->flags & FLAG_ALT)
+ *p++ = '#';
+ if (dp->flags & FLAG_ZERO)
+ *p++ = '0';
+ if (dp->width_start != dp->width_end)
+ {
+ size_t n = dp->width_end - dp->width_start;
+ memcpy (p, dp->width_start, n);
+ p += n;
+ }
+ if (dp->precision_start != dp->precision_end)
+ {
+ size_t n = dp->precision_end - dp->precision_start;
+ memcpy (p, dp->precision_start, n);
+ p += n;
+ }
+
+ switch (type)
+ {
+#ifdef HAVE_INT64_AND_I64
+ case TYPE_INT64:
+ case TYPE_UINT64:
+ *p++ = 'I';
+ *p++ = '6';
+ *p++ = '4';
+ break;
+#endif
+#ifdef HAVE_LONG_LONG
+ case TYPE_LONGLONGINT:
+ case TYPE_ULONGLONGINT:
+#ifdef HAVE_INT64_AND_I64 /* The system (sn)printf uses %I64. Also assume
+ * that long long == __int64.
+ */
+ *p++ = 'I';
+ *p++ = '6';
+ *p++ = '4';
+ break;
+#else
+ *p++ = 'l';
+ /*FALLTHROUGH*/
+#endif
+#endif
+ case TYPE_LONGINT:
+ case TYPE_ULONGINT:
+#ifdef HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+#endif
+#ifdef HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+#endif
+ *p++ = 'l';
+ break;
+#ifdef HAVE_LONG_DOUBLE
+ case TYPE_LONGDOUBLE:
+ *p++ = 'L';
+ break;
+#endif
+ default:
+ break;
+ }
+ *p = dp->conversion;
+#if HAVE_SNPRINTF
+ p[1] = '%';
+ p[2] = 'n';
+ p[3] = '\0';
+#else
+ p[1] = '\0';
+#endif
+
+ /* Construct the arguments for calling snprintf or sprintf. */
+ prefix_count = 0;
+ if (dp->width_arg_index >= 0)
+ {
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int;
+ }
+ if (dp->precision_arg_index >= 0)
+ {
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int;
+ }
+
+#if HAVE_SNPRINTF
+ /* Prepare checking whether snprintf returns the count
+ via %n. */
+ ENSURE_ALLOCATION (length + 1);
+ result[length] = '\0';
+#endif
+
+ for (;;)
+ {
+ size_t maxlen;
+ int count;
+ int retcount;
+
+ maxlen = allocated - length;
+ count = -1;
+ retcount = 0;
+
+#if HAVE_SNPRINTF
+#define SNPRINTF_BUF(arg) \
+ switch (prefix_count) \
+ { \
+ case 0: \
+ retcount = snprintf (result + length, maxlen, buf, \
+ arg, &count); \
+ break; \
+ case 1: \
+ retcount = snprintf (result + length, maxlen, buf, \
+ prefixes[0], arg, &count); \
+ break; \
+ case 2: \
+ retcount = snprintf (result + length, maxlen, buf, \
+ prefixes[0], prefixes[1], arg, \
+ &count); \
+ break; \
+ default: \
+ abort (); \
+ }
+#else
+#define SNPRINTF_BUF(arg) \
+ switch (prefix_count) \
+ { \
+ case 0: \
+ count = sprintf (tmp, buf, arg); \
+ break; \
+ case 1: \
+ count = sprintf (tmp, buf, prefixes[0], arg); \
+ break; \
+ case 2: \
+ count = sprintf (tmp, buf, prefixes[0], prefixes[1],\
+ arg); \
+ break; \
+ default: \
+ abort (); \
+ }
+#endif
+
+ switch (type)
+ {
+ case TYPE_SCHAR:
+ {
+ int arg = a.arg[dp->arg_index].a.a_schar;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_UCHAR:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_uchar;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_SHORT:
+ {
+ int arg = a.arg[dp->arg_index].a.a_short;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_USHORT:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_ushort;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_INT:
+ {
+ int arg = a.arg[dp->arg_index].a.a_int;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_UINT:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_uint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_LONGINT:
+ {
+ long int arg = a.arg[dp->arg_index].a.a_longint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_ULONGINT:
+ {
+ unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#ifdef HAVE_INT64_AND_I64
+ case TYPE_INT64:
+ {
+ __int64 arg = a.arg[dp->arg_index].a.a_int64;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_UINT64:
+ {
+ unsigned __int64 arg = a.arg[dp->arg_index].a.a_uint64;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+#ifdef HAVE_LONG_LONG
+#ifndef HAVE_LONG_LONG_FORMAT
+ case TYPE_LONGLONGINT:
+ case TYPE_ULONGLONGINT:
+ {
+ unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint;
+ int width;
+ int precision;
+
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index >= 0)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ width = (arg < 0 ? -arg : arg);
+ }
+ else
+ {
+ const char *digitp = dp->width_start;
+
+ do
+ width = width * 10 + (*digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ }
+
+ precision = -1;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index >= 0)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ precision = (arg < 0 ? 0 : arg);
+ }
+ else
+ {
+ const char *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ do
+ precision = precision * 10 + (*digitp++ - '0');
+ while (digitp != dp->precision_end);
+ }
+ }
+
+#if HAVE_SNPRINTF
+ count = print_long_long (result + length, maxlen,
+ width, precision,
+ dp->flags,
+ dp->conversion,
+ arg);
+#else
+ count = print_long_long (tmp, tmp_length,
+ width, precision,
+ dp->flags,
+ dp->conversion,
+ arg);
+#endif
+ }
+ break;
+#else
+ case TYPE_LONGLONGINT:
+ {
+ long long int arg = a.arg[dp->arg_index].a.a_longlongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_ULONGLONGINT:
+ {
+ unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+#endif
+ case TYPE_DOUBLE:
+ {
+ double arg = a.arg[dp->arg_index].a.a_double;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#ifdef HAVE_LONG_DOUBLE
+ case TYPE_LONGDOUBLE:
+ {
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_CHAR:
+ {
+ int arg = a.arg[dp->arg_index].a.a_char;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#ifdef HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+ {
+ wint_t arg = a.arg[dp->arg_index].a.a_wide_char;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_STRING:
+ {
+ const char *arg = a.arg[dp->arg_index].a.a_string;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#ifdef HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+ {
+ const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_POINTER:
+ {
+ void *arg = a.arg[dp->arg_index].a.a_pointer;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ default:
+ abort ();
+ }
+
+#if HAVE_SNPRINTF
+ /* Portability: Not all implementations of snprintf()
+ are ISO C 99 compliant. Determine the number of
+ bytes that snprintf() has produced or would have
+ produced. */
+ if (count >= 0)
+ {
+ /* Verify that snprintf() has NUL-terminated its
+ result. */
+ if (count < maxlen && result[length + count] != '\0')
+ abort ();
+ /* Portability hack. */
+ if (retcount > count)
+ count = retcount;
+ }
+ else
+ {
+ /* snprintf() doesn't understand the '%n'
+ directive. */
+ if (p[1] != '\0')
+ {
+ /* Don't use the '%n' directive; instead, look
+ at the snprintf() return value. */
+ p[1] = '\0';
+ continue;
+ }
+ count = retcount;
+ }
+#endif
+
+ /* Attempt to handle failure. */
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ freea (buf);
+ CLEANUP ();
+ errno = EINVAL;
+ return NULL;
+ }
+
+#if !HAVE_SNPRINTF
+ if (count >= tmp_length)
+ /* tmp_length was incorrectly calculated - fix the
+ code above! */
+ abort ();
+#endif
+
+ /* Make room for the result. */
+ if (count >= maxlen)
+ {
+ /* Need at least count bytes. But allocate
+ proportionally, to avoid looping eternally if
+ snprintf() reports a too small count. */
+ size_t n = length + count;
+
+ if (n < 2 * allocated)
+ n = 2 * allocated;
+
+ ENSURE_ALLOCATION (n);
+#if HAVE_SNPRINTF
+ continue;
+#endif
+ }
+
+#if HAVE_SNPRINTF
+ /* The snprintf() result did fit. */
+#else
+ /* Append the sprintf() result. */
+ memcpy (result + length, tmp, count);
+ if (tmp != tmpbuf)
+ free (tmp);
+#endif
+
+ length += count;
+ break;
+ }
+ }
+ }
+ }
+
+ /* Add the final NUL. */
+ ENSURE_ALLOCATION (length + 1);
+ result[length] = '\0';
+
+ if (result != resultbuf && length + 1 < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ char *memory;
+
+ memory = (char *) realloc (result, length + 1);
+ if (memory != NULL)
+ result = memory;
+ }
+
+ freea (buf);
+ CLEANUP ();
+ *lengthp = length;
+ return result;
+ }
+}
diff --git a/trunk/glib/gnulib/vasnprintf.h b/trunk/glib/gnulib/vasnprintf.h
new file mode 100644
index 000000000..65f1bc13d
--- /dev/null
+++ b/trunk/glib/gnulib/vasnprintf.h
@@ -0,0 +1,61 @@
+/* vsprintf with automatic memory allocation.
+ Copyright (C) 2002-2003 Free Software Foundation, Inc.
+
+ This program 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, 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library 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. */
+
+#ifndef _VASNPRINTF_H
+#define _VASNPRINTF_H
+
+/* Get va_list. */
+#include <stdarg.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+#ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
+# define __attribute__(Spec) /* empty */
+# endif
+/* The __-protected variants of `format' and `printf' attributes
+ are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __format__ format
+# define __printf__ printf
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Write formatted output to a string dynamically allocated with malloc().
+ You can pass a preallocated buffer for the result in RESULTBUF and its
+ size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
+ If successful, return the address of the string (this may be = RESULTBUF
+ if no dynamic memory allocation was necessary) and set *LENGTHP to the
+ number of resulting bytes, excluding the trailing NUL. Upon error, set
+ errno and return NULL. */
+extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 3, 4)));
+extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 3, 0)));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _VASNPRINTF_H */
diff --git a/trunk/glib/goption.c b/trunk/glib/goption.c
new file mode 100644
index 000000000..c385140f0
--- /dev/null
+++ b/trunk/glib/goption.c
@@ -0,0 +1,2182 @@
+/* goption.c - Option parser
+ *
+ * Copyright (C) 1999, 2003 Red Hat Software
+ * Copyright (C) 2004 Anders Carlsson <andersca@gnome.org>
+ *
+ * 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.
+ */
+
+#include "config.h"
+
+#include "goption.h"
+#include "glib.h"
+#include "glibintl.h"
+#include "gprintf.h"
+
+#include "galias.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+
+#define TRANSLATE(group, str) (((group)->translate_func ? (* (group)->translate_func) ((str), (group)->translate_data) : (str)))
+
+#define NO_ARG(entry) ((entry)->arg == G_OPTION_ARG_NONE || \
+ ((entry)->arg == G_OPTION_ARG_CALLBACK && \
+ ((entry)->flags & G_OPTION_FLAG_NO_ARG)))
+
+#define OPTIONAL_ARG(entry) ((entry)->arg == G_OPTION_ARG_CALLBACK && \
+ (entry)->flags & G_OPTION_FLAG_OPTIONAL_ARG)
+
+typedef struct
+{
+ GOptionArg arg_type;
+ gpointer arg_data;
+ union
+ {
+ gboolean bool;
+ gint integer;
+ gchar *str;
+ gchar **array;
+ gdouble dbl;
+ gint64 int64;
+ } prev;
+ union
+ {
+ gchar *str;
+ struct
+ {
+ gint len;
+ gchar **data;
+ } array;
+ } allocated;
+} Change;
+
+typedef struct
+{
+ gchar **ptr;
+ gchar *value;
+} PendingNull;
+
+struct _GOptionContext
+{
+ GList *groups;
+
+ gchar *parameter_string;
+ gchar *summary;
+ gchar *description;
+
+ GTranslateFunc translate_func;
+ GDestroyNotify translate_notify;
+ gpointer translate_data;
+
+ guint help_enabled : 1;
+ guint ignore_unknown : 1;
+
+ GOptionGroup *main_group;
+
+ /* We keep a list of change so we can revert them */
+ GList *changes;
+
+ /* We also keep track of all argv elements
+ * that should be NULLed or modified.
+ */
+ GList *pending_nulls;
+};
+
+struct _GOptionGroup
+{
+ gchar *name;
+ gchar *description;
+ gchar *help_description;
+
+ GDestroyNotify destroy_notify;
+ gpointer user_data;
+
+ GTranslateFunc translate_func;
+ GDestroyNotify translate_notify;
+ gpointer translate_data;
+
+ GOptionEntry *entries;
+ gint n_entries;
+
+ GOptionParseFunc pre_parse_func;
+ GOptionParseFunc post_parse_func;
+ GOptionErrorFunc error_func;
+};
+
+static void free_changes_list (GOptionContext *context,
+ gboolean revert);
+static void free_pending_nulls (GOptionContext *context,
+ gboolean perform_nulls);
+
+
+static int
+_g_unichar_get_width (gunichar c)
+{
+ if (G_UNLIKELY (g_unichar_iszerowidth (c)))
+ return 0;
+
+ /* we ignore the fact that we should call g_unichar_iswide_cjk() under
+ * some locales (legacy East Asian ones) */
+ if (g_unichar_iswide (c))
+ return 2;
+
+ return 1;
+}
+
+static glong
+_g_utf8_strwidth (const gchar *p,
+ gssize max)
+{
+ glong len = 0;
+ const gchar *start = p;
+ g_return_val_if_fail (p != NULL || max == 0, 0);
+
+ if (max < 0)
+ {
+ while (*p)
+ {
+ len += _g_unichar_get_width (g_utf8_get_char (p));
+ p = g_utf8_next_char (p);
+ }
+ }
+ else
+ {
+ if (max == 0 || !*p)
+ return 0;
+
+ /* this case may not be quite correct */
+
+ len += _g_unichar_get_width (g_utf8_get_char (p));
+ p = g_utf8_next_char (p);
+
+ while (p - start < max && *p)
+ {
+ len += _g_unichar_get_width (g_utf8_get_char (p));
+ p = g_utf8_next_char (p);
+ }
+ }
+
+ return len;
+}
+
+
+GQuark
+g_option_error_quark (void)
+{
+ return g_quark_from_static_string ("g-option-context-error-quark");
+}
+
+/**
+ * g_option_context_new:
+ * @parameter_string: a string which is displayed in
+ * the first line of <option>--help</option> output, after the
+ * usage summary
+ * <literal><replaceable>programname</replaceable> [OPTION...]</literal>
+ *
+ * Creates a new option context.
+ *
+ * The @parameter_string can serve multiple purposes. It can be used
+ * to add descriptions for "rest" arguments, which are not parsed by
+ * the #GOptionContext, typically something like "FILES" or
+ * "FILE1 FILE2...". If you are using #G_OPTION_REMAINING for
+ * collecting "rest" arguments, GLib handles this automatically by
+ * using the @arg_description of the corresponding #GOptionEntry in
+ * the usage summary.
+ *
+ * Another usage is to give a short summary of the program
+ * functionality, like " - frob the strings", which will be displayed
+ * in the same line as the usage. For a longer description of the
+ * program functionality that should be displayed as a paragraph
+ * below the usage line, use g_option_context_set_summary().
+ *
+ * Note that the @parameter_string is translated (see
+ * g_option_context_set_translate_func()).
+ *
+ * Returns: a newly created #GOptionContext, which must be
+ * freed with g_option_context_free() after use.
+ *
+ * Since: 2.6
+ */
+GOptionContext *
+g_option_context_new (const gchar *parameter_string)
+
+{
+ GOptionContext *context;
+
+ context = g_new0 (GOptionContext, 1);
+
+ context->parameter_string = g_strdup (parameter_string);
+ context->help_enabled = TRUE;
+ context->ignore_unknown = FALSE;
+
+ return context;
+}
+
+/**
+ * g_option_context_free:
+ * @context: a #GOptionContext
+ *
+ * Frees context and all the groups which have been
+ * added to it.
+ *
+ * Since: 2.6
+ */
+void g_option_context_free (GOptionContext *context)
+{
+ g_return_if_fail (context != NULL);
+
+ g_list_foreach (context->groups, (GFunc)g_option_group_free, NULL);
+ g_list_free (context->groups);
+
+ if (context->main_group)
+ g_option_group_free (context->main_group);
+
+ free_changes_list (context, FALSE);
+ free_pending_nulls (context, FALSE);
+
+ g_free (context->parameter_string);
+ g_free (context->summary);
+ g_free (context->description);
+
+ if (context->translate_notify)
+ (* context->translate_notify) (context->translate_data);
+
+ g_free (context);
+}
+
+
+/**
+ * g_option_context_set_help_enabled:
+ * @context: a #GOptionContext
+ * @help_enabled: %TRUE to enable <option>--help</option>, %FALSE to disable it
+ *
+ * Enables or disables automatic generation of <option>--help</option>
+ * output. By default, g_option_context_parse() recognizes
+ * <option>--help</option>, <option>-?</option>, <option>--help-all</option>
+ * and <option>--help-</option><replaceable>groupname</replaceable> and creates
+ * suitable output to stdout.
+ *
+ * Since: 2.6
+ */
+void g_option_context_set_help_enabled (GOptionContext *context,
+ gboolean help_enabled)
+
+{
+ g_return_if_fail (context != NULL);
+
+ context->help_enabled = help_enabled;
+}
+
+/**
+ * g_option_context_get_help_enabled:
+ * @context: a #GOptionContext
+ *
+ * Returns whether automatic <option>--help</option> generation
+ * is turned on for @context. See g_option_context_set_help_enabled().
+ *
+ * Returns: %TRUE if automatic help generation is turned on.
+ *
+ * Since: 2.6
+ */
+gboolean
+g_option_context_get_help_enabled (GOptionContext *context)
+{
+ g_return_val_if_fail (context != NULL, FALSE);
+
+ return context->help_enabled;
+}
+
+/**
+ * g_option_context_set_ignore_unknown_options:
+ * @context: a #GOptionContext
+ * @ignore_unknown: %TRUE to ignore unknown options, %FALSE to produce
+ * an error when unknown options are met
+ *
+ * Sets whether to ignore unknown options or not. If an argument is
+ * ignored, it is left in the @argv array after parsing. By default,
+ * g_option_context_parse() treats unknown options as error.
+ *
+ * This setting does not affect non-option arguments (i.e. arguments
+ * which don't start with a dash). But note that GOption cannot reliably
+ * determine whether a non-option belongs to a preceding unknown option.
+ *
+ * Since: 2.6
+ **/
+void
+g_option_context_set_ignore_unknown_options (GOptionContext *context,
+ gboolean ignore_unknown)
+{
+ g_return_if_fail (context != NULL);
+
+ context->ignore_unknown = ignore_unknown;
+}
+
+/**
+ * g_option_context_get_ignore_unknown_options:
+ * @context: a #GOptionContext
+ *
+ * Returns whether unknown options are ignored or not. See
+ * g_option_context_set_ignore_unknown_options().
+ *
+ * Returns: %TRUE if unknown options are ignored.
+ *
+ * Since: 2.6
+ **/
+gboolean
+g_option_context_get_ignore_unknown_options (GOptionContext *context)
+{
+ g_return_val_if_fail (context != NULL, FALSE);
+
+ return context->ignore_unknown;
+}
+
+/**
+ * g_option_context_add_group:
+ * @context: a #GOptionContext
+ * @group: the group to add
+ *
+ * Adds a #GOptionGroup to the @context, so that parsing with @context
+ * will recognize the options in the group. Note that the group will
+ * be freed together with the context when g_option_context_free() is
+ * called, so you must not free the group yourself after adding it
+ * to a context.
+ *
+ * Since: 2.6
+ **/
+void
+g_option_context_add_group (GOptionContext *context,
+ GOptionGroup *group)
+{
+ GList *list;
+
+ g_return_if_fail (context != NULL);
+ g_return_if_fail (group != NULL);
+ g_return_if_fail (group->name != NULL);
+ g_return_if_fail (group->description != NULL);
+ g_return_if_fail (group->help_description != NULL);
+
+ for (list = context->groups; list; list = list->next)
+ {
+ GOptionGroup *g = (GOptionGroup *)list->data;
+
+ if ((group->name == NULL && g->name == NULL) ||
+ (group->name && g->name && strcmp (group->name, g->name) == 0))
+ g_warning ("A group named \"%s\" is already part of this GOptionContext",
+ group->name);
+ }
+
+ context->groups = g_list_append (context->groups, group);
+}
+
+/**
+ * g_option_context_set_main_group:
+ * @context: a #GOptionContext
+ * @group: the group to set as main group
+ *
+ * Sets a #GOptionGroup as main group of the @context.
+ * This has the same effect as calling g_option_context_add_group(),
+ * the only difference is that the options in the main group are
+ * treated differently when generating <option>--help</option> output.
+ *
+ * Since: 2.6
+ **/
+void
+g_option_context_set_main_group (GOptionContext *context,
+ GOptionGroup *group)
+{
+ g_return_if_fail (context != NULL);
+ g_return_if_fail (group != NULL);
+
+ if (context->main_group)
+ {
+ g_warning ("This GOptionContext already has a main group");
+
+ return;
+ }
+
+ context->main_group = group;
+}
+
+/**
+ * g_option_context_get_main_group:
+ * @context: a #GOptionContext
+ *
+ * Returns a pointer to the main group of @context.
+ *
+ * Return value: the main group of @context, or %NULL if @context doesn't
+ * have a main group. Note that group belongs to @context and should
+ * not be modified or freed.
+ *
+ * Since: 2.6
+ **/
+GOptionGroup *
+g_option_context_get_main_group (GOptionContext *context)
+{
+ g_return_val_if_fail (context != NULL, NULL);
+
+ return context->main_group;
+}
+
+/**
+ * g_option_context_add_main_entries:
+ * @context: a #GOptionContext
+ * @entries: a %NULL-terminated array of #GOptionEntry<!-- -->s
+ * @translation_domain: a translation domain to use for translating
+ * the <option>--help</option> output for the options in @entries
+ * with gettext(), or %NULL
+ *
+ * A convenience function which creates a main group if it doesn't
+ * exist, adds the @entries to it and sets the translation domain.
+ *
+ * Since: 2.6
+ **/
+void
+g_option_context_add_main_entries (GOptionContext *context,
+ const GOptionEntry *entries,
+ const gchar *translation_domain)
+{
+ g_return_if_fail (entries != NULL);
+
+ if (!context->main_group)
+ context->main_group = g_option_group_new (NULL, NULL, NULL, NULL, NULL);
+
+ g_option_group_add_entries (context->main_group, entries);
+ g_option_group_set_translation_domain (context->main_group, translation_domain);
+}
+
+static gint
+calculate_max_length (GOptionGroup *group)
+{
+ GOptionEntry *entry;
+ gint i, len, max_length;
+
+ max_length = 0;
+
+ for (i = 0; i < group->n_entries; i++)
+ {
+ entry = &group->entries[i];
+
+ if (entry->flags & G_OPTION_FLAG_HIDDEN)
+ continue;
+
+ len = _g_utf8_strwidth (entry->long_name, -1);
+
+ if (entry->short_name)
+ len += 4;
+
+ if (!NO_ARG (entry) && entry->arg_description)
+ len += 1 + _g_utf8_strwidth (TRANSLATE (group, entry->arg_description), -1);
+
+ max_length = MAX (max_length, len);
+ }
+
+ return max_length;
+}
+
+static void
+print_entry (GOptionGroup *group,
+ gint max_length,
+ const GOptionEntry *entry,
+ GString *string)
+{
+ GString *str;
+
+ if (entry->flags & G_OPTION_FLAG_HIDDEN)
+ return;
+
+ if (entry->long_name[0] == 0)
+ return;
+
+ str = g_string_new (NULL);
+
+ if (entry->short_name)
+ g_string_append_printf (str, " -%c, --%s", entry->short_name, entry->long_name);
+ else
+ g_string_append_printf (str, " --%s", entry->long_name);
+
+ if (entry->arg_description)
+ g_string_append_printf (str, "=%s", TRANSLATE (group, entry->arg_description));
+
+ g_string_append_printf (string, "%s%*s %s\n", str->str,
+ (int) (max_length + 4 - _g_utf8_strwidth (str->str, -1)), "",
+ entry->description ? TRANSLATE (group, entry->description) : "");
+ g_string_free (str, TRUE);
+}
+
+/**
+ * g_option_context_get_help:
+ * @context: a #GOptionContext
+ * @main_help: if %TRUE, only include the main group
+ * @group: the #GOptionGroup to create help for, or %NULL
+ *
+ * Returns a formatted, translated help text for the given context.
+ * To obtain the text produced by <option>--help</option>, call
+ * <literal>g_option_context_get_help (context, TRUE, NULL)</literal>.
+ * To obtain the text produced by <option>--help-all</option>, call
+ * <literal>g_option_context_get_help (context, FALSE, NULL)</literal>.
+ * To obtain the help text for an option group, call
+ * <literal>g_option_context_get_help (context, FALSE, group)</literal>.
+ *
+ * Returns: A newly allocated string containing the help text
+ *
+ * Since: 2.14
+ */
+gchar *
+g_option_context_get_help (GOptionContext *context,
+ gboolean main_help,
+ GOptionGroup *group)
+{
+ GList *list;
+ gint max_length, len;
+ gint i;
+ GOptionEntry *entry;
+ GHashTable *shadow_map;
+ gboolean seen[256];
+ const gchar *rest_description;
+ GString *string;
+
+ string = g_string_sized_new (1024);
+
+ rest_description = NULL;
+ if (context->main_group)
+ {
+
+ for (i = 0; i < context->main_group->n_entries; i++)
+ {
+ entry = &context->main_group->entries[i];
+ if (entry->long_name[0] == 0)
+ {
+ rest_description = TRANSLATE (context->main_group, entry->arg_description);
+ break;
+ }
+ }
+ }
+
+ g_string_append_printf (string, "%s\n %s %s",
+ _("Usage:"), g_get_prgname(), _("[OPTION...]"));
+
+ if (rest_description)
+ {
+ g_string_append (string, " ");
+ g_string_append (string, rest_description);
+ }
+
+ if (context->parameter_string)
+ {
+ g_string_append (string, " ");
+ g_string_append (string, TRANSLATE (context, context->parameter_string));
+ }
+
+ g_string_append (string, "\n\n");
+
+ if (context->summary)
+ {
+ g_string_append (string, TRANSLATE (context, context->summary));
+ g_string_append (string, "\n\n");
+ }
+
+ memset (seen, 0, sizeof (gboolean) * 256);
+ shadow_map = g_hash_table_new (g_str_hash, g_str_equal);
+
+ if (context->main_group)
+ {
+ for (i = 0; i < context->main_group->n_entries; i++)
+ {
+ entry = &context->main_group->entries[i];
+ g_hash_table_insert (shadow_map,
+ (gpointer)entry->long_name,
+ entry);
+
+ if (seen[(guchar)entry->short_name])
+ entry->short_name = 0;
+ else
+ seen[(guchar)entry->short_name] = TRUE;
+ }
+ }
+
+ list = context->groups;
+ while (list != NULL)
+ {
+ GOptionGroup *group = list->data;
+ for (i = 0; i < group->n_entries; i++)
+ {
+ entry = &group->entries[i];
+ if (g_hash_table_lookup (shadow_map, entry->long_name) &&
+ !(entry->flags & G_OPTION_FLAG_NOALIAS))
+ entry->long_name = g_strdup_printf ("%s-%s", group->name, entry->long_name);
+ else
+ g_hash_table_insert (shadow_map, (gpointer)entry->long_name, entry);
+
+ if (seen[(guchar)entry->short_name] &&
+ !(entry->flags & G_OPTION_FLAG_NOALIAS))
+ entry->short_name = 0;
+ else
+ seen[(guchar)entry->short_name] = TRUE;
+ }
+ list = list->next;
+ }
+
+ g_hash_table_destroy (shadow_map);
+
+ list = context->groups;
+
+ max_length = _g_utf8_strwidth ("-?, --help", -1);
+
+ if (list)
+ {
+ len = _g_utf8_strwidth ("--help-all", -1);
+ max_length = MAX (max_length, len);
+ }
+
+ if (context->main_group)
+ {
+ len = calculate_max_length (context->main_group);
+ max_length = MAX (max_length, len);
+ }
+
+ while (list != NULL)
+ {
+ GOptionGroup *group = list->data;
+
+ /* First, we check the --help-<groupname> options */
+ len = _g_utf8_strwidth ("--help-", -1) + _g_utf8_strwidth (group->name, -1);
+ max_length = MAX (max_length, len);
+
+ /* Then we go through the entries */
+ len = calculate_max_length (group);
+ max_length = MAX (max_length, len);
+
+ list = list->next;
+ }
+
+ /* Add a bit of padding */
+ max_length += 4;
+
+ if (!group)
+ {
+ list = context->groups;
+
+ g_string_append_printf (string, "%s\n -%c, --%-*s %s\n",
+ _("Help Options:"), '?', max_length - 4, "help",
+ _("Show help options"));
+
+ /* We only want --help-all when there are groups */
+ if (list)
+ g_string_append_printf (string, " --%-*s %s\n",
+ max_length, "help-all",
+ _("Show all help options"));
+
+ while (list)
+ {
+ GOptionGroup *group = list->data;
+
+ g_string_append_printf (string, " --help-%-*s %s\n",
+ max_length - 5, group->name,
+ TRANSLATE (group, group->help_description));
+
+ list = list->next;
+ }
+
+ g_string_append (string, "\n");
+ }
+
+ if (group)
+ {
+ /* Print a certain group */
+
+ g_string_append (string, TRANSLATE (group, group->description));
+ g_string_append (string, "\n");
+ for (i = 0; i < group->n_entries; i++)
+ print_entry (group, max_length, &group->entries[i], string);
+ g_string_append (string, "\n");
+ }
+ else if (!main_help)
+ {
+ /* Print all groups */
+
+ list = context->groups;
+
+ while (list)
+ {
+ GOptionGroup *group = list->data;
+
+ g_string_append (string, group->description);
+ g_string_append (string, "\n");
+ for (i = 0; i < group->n_entries; i++)
+ if (!(group->entries[i].flags & G_OPTION_FLAG_IN_MAIN))
+ print_entry (group, max_length, &group->entries[i], string);
+
+ g_string_append (string, "\n");
+ list = list->next;
+ }
+ }
+
+ /* Print application options if --help or --help-all has been specified */
+ if (main_help || !group)
+ {
+ list = context->groups;
+
+ g_string_append (string, _("Application Options:"));
+ g_string_append (string, "\n");
+ if (context->main_group)
+ for (i = 0; i < context->main_group->n_entries; i++)
+ print_entry (context->main_group, max_length,
+ &context->main_group->entries[i], string);
+
+ while (list != NULL)
+ {
+ GOptionGroup *group = list->data;
+
+ /* Print main entries from other groups */
+ for (i = 0; i < group->n_entries; i++)
+ if (group->entries[i].flags & G_OPTION_FLAG_IN_MAIN)
+ print_entry (group, max_length, &group->entries[i], string);
+
+ list = list->next;
+ }
+
+ g_string_append (string, "\n");
+ }
+
+ if (context->description)
+ {
+ g_string_append (string, TRANSLATE (context, context->description));
+ g_string_append (string, "\n");
+ }
+
+ return g_string_free (string, FALSE);
+}
+
+static void
+print_help (GOptionContext *context,
+ gboolean main_help,
+ GOptionGroup *group)
+{
+ gchar *help;
+
+ help = g_option_context_get_help (context, main_help, group);
+ g_printf (help);
+ g_free (help);
+
+ exit (0);
+}
+
+static gboolean
+parse_int (const gchar *arg_name,
+ const gchar *arg,
+ gint *result,
+ GError **error)
+{
+ gchar *end;
+ glong tmp;
+
+ errno = 0;
+ tmp = strtol (arg, &end, 0);
+
+ if (*arg == '\0' || *end != '\0')
+ {
+ g_set_error (error,
+ G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+ _("Cannot parse integer value '%s' for %s"),
+ arg, arg_name);
+ return FALSE;
+ }
+
+ *result = tmp;
+ if (*result != tmp || errno == ERANGE)
+ {
+ g_set_error (error,
+ G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+ _("Integer value '%s' for %s out of range"),
+ arg, arg_name);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+static gboolean
+parse_double (const gchar *arg_name,
+ const gchar *arg,
+ gdouble *result,
+ GError **error)
+{
+ gchar *end;
+ gdouble tmp;
+
+ errno = 0;
+ tmp = g_strtod (arg, &end);
+
+ if (*arg == '\0' || *end != '\0')
+ {
+ g_set_error (error,
+ G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+ _("Cannot parse double value '%s' for %s"),
+ arg, arg_name);
+ return FALSE;
+ }
+ if (errno == ERANGE)
+ {
+ g_set_error (error,
+ G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+ _("Double value '%s' for %s out of range"),
+ arg, arg_name);
+ return FALSE;
+ }
+
+ *result = tmp;
+
+ return TRUE;
+}
+
+
+static gboolean
+parse_int64 (const gchar *arg_name,
+ const gchar *arg,
+ gint64 *result,
+ GError **error)
+{
+ gchar *end;
+ gint64 tmp;
+
+ errno = 0;
+ tmp = g_ascii_strtoll (arg, &end, 0);
+
+ if (*arg == '\0' || *end != '\0')
+ {
+ g_set_error (error,
+ G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+ _("Cannot parse integer value '%s' for %s"),
+ arg, arg_name);
+ return FALSE;
+ }
+ if (errno == ERANGE)
+ {
+ g_set_error (error,
+ G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+ _("Integer value '%s' for %s out of range"),
+ arg, arg_name);
+ return FALSE;
+ }
+
+ *result = tmp;
+
+ return TRUE;
+}
+
+
+static Change *
+get_change (GOptionContext *context,
+ GOptionArg arg_type,
+ gpointer arg_data)
+{
+ GList *list;
+ Change *change = NULL;
+
+ for (list = context->changes; list != NULL; list = list->next)
+ {
+ change = list->data;
+
+ if (change->arg_data == arg_data)
+ goto found;
+ }
+
+ change = g_new0 (Change, 1);
+ change->arg_type = arg_type;
+ change->arg_data = arg_data;
+
+ context->changes = g_list_prepend (context->changes, change);
+
+ found:
+
+ return change;
+}
+
+static void
+add_pending_null (GOptionContext *context,
+ gchar **ptr,
+ gchar *value)
+{
+ PendingNull *n;
+
+ n = g_new0 (PendingNull, 1);
+ n->ptr = ptr;
+ n->value = value;
+
+ context->pending_nulls = g_list_prepend (context->pending_nulls, n);
+}
+
+static gboolean
+parse_arg (GOptionContext *context,
+ GOptionGroup *group,
+ GOptionEntry *entry,
+ const gchar *value,
+ const gchar *option_name,
+ GError **error)
+
+{
+ Change *change;
+
+ g_assert (value || OPTIONAL_ARG (entry) || NO_ARG (entry));
+
+ switch (entry->arg)
+ {
+ case G_OPTION_ARG_NONE:
+ {
+ change = get_change (context, G_OPTION_ARG_NONE,
+ entry->arg_data);
+
+ *(gboolean *)entry->arg_data = !(entry->flags & G_OPTION_FLAG_REVERSE);
+ break;
+ }
+ case G_OPTION_ARG_STRING:
+ {
+ gchar *data;
+
+ data = g_locale_to_utf8 (value, -1, NULL, NULL, error);
+
+ if (!data)
+ return FALSE;
+
+ change = get_change (context, G_OPTION_ARG_STRING,
+ entry->arg_data);
+ g_free (change->allocated.str);
+
+ change->prev.str = *(gchar **)entry->arg_data;
+ change->allocated.str = data;
+
+ *(gchar **)entry->arg_data = data;
+ break;
+ }
+ case G_OPTION_ARG_STRING_ARRAY:
+ {
+ gchar *data;
+
+ data = g_locale_to_utf8 (value, -1, NULL, NULL, error);
+
+ if (!data)
+ return FALSE;
+
+ change = get_change (context, G_OPTION_ARG_STRING_ARRAY,
+ entry->arg_data);
+
+ if (change->allocated.array.len == 0)
+ {
+ change->prev.array = *(gchar ***)entry->arg_data;
+ change->allocated.array.data = g_new (gchar *, 2);
+ }
+ else
+ change->allocated.array.data =
+ g_renew (gchar *, change->allocated.array.data,
+ change->allocated.array.len + 2);
+
+ change->allocated.array.data[change->allocated.array.len] = data;
+ change->allocated.array.data[change->allocated.array.len + 1] = NULL;
+
+ change->allocated.array.len ++;
+
+ *(gchar ***)entry->arg_data = change->allocated.array.data;
+
+ break;
+ }
+
+ case G_OPTION_ARG_FILENAME:
+ {
+ gchar *data;
+
+#ifdef G_OS_WIN32
+ data = g_locale_to_utf8 (value, -1, NULL, NULL, error);
+
+ if (!data)
+ return FALSE;
+#else
+ data = g_strdup (value);
+#endif
+ change = get_change (context, G_OPTION_ARG_FILENAME,
+ entry->arg_data);
+ g_free (change->allocated.str);
+
+ change->prev.str = *(gchar **)entry->arg_data;
+ change->allocated.str = data;
+
+ *(gchar **)entry->arg_data = data;
+ break;
+ }
+
+ case G_OPTION_ARG_FILENAME_ARRAY:
+ {
+ gchar *data;
+
+#ifdef G_OS_WIN32
+ data = g_locale_to_utf8 (value, -1, NULL, NULL, error);
+
+ if (!data)
+ return FALSE;
+#else
+ data = g_strdup (value);
+#endif
+ change = get_change (context, G_OPTION_ARG_STRING_ARRAY,
+ entry->arg_data);
+
+ if (change->allocated.array.len == 0)
+ {
+ change->prev.array = *(gchar ***)entry->arg_data;
+ change->allocated.array.data = g_new (gchar *, 2);
+ }
+ else
+ change->allocated.array.data =
+ g_renew (gchar *, change->allocated.array.data,
+ change->allocated.array.len + 2);
+
+ change->allocated.array.data[change->allocated.array.len] = data;
+ change->allocated.array.data[change->allocated.array.len + 1] = NULL;
+
+ change->allocated.array.len ++;
+
+ *(gchar ***)entry->arg_data = change->allocated.array.data;
+
+ break;
+ }
+
+ case G_OPTION_ARG_INT:
+ {
+ gint data;
+
+ if (!parse_int (option_name, value,
+ &data,
+ error))
+ return FALSE;
+
+ change = get_change (context, G_OPTION_ARG_INT,
+ entry->arg_data);
+ change->prev.integer = *(gint *)entry->arg_data;
+ *(gint *)entry->arg_data = data;
+ break;
+ }
+ case G_OPTION_ARG_CALLBACK:
+ {
+ gchar *data;
+ gboolean retval;
+
+ if (!value && entry->flags & G_OPTION_FLAG_OPTIONAL_ARG)
+ data = NULL;
+ else if (entry->flags & G_OPTION_FLAG_NO_ARG)
+ data = NULL;
+ else if (entry->flags & G_OPTION_FLAG_FILENAME)
+ {
+#ifdef G_OS_WIN32
+ data = g_locale_to_utf8 (value, -1, NULL, NULL, error);
+#else
+ data = g_strdup (value);
+#endif
+ }
+ else
+ data = g_locale_to_utf8 (value, -1, NULL, NULL, error);
+
+ if (!(entry->flags & (G_OPTION_FLAG_NO_ARG|G_OPTION_FLAG_OPTIONAL_ARG)) &&
+ !data)
+ return FALSE;
+
+ retval = (* (GOptionArgFunc) entry->arg_data) (option_name, data, group->user_data, error);
+
+ g_free (data);
+
+ return retval;
+
+ break;
+ }
+ case G_OPTION_ARG_DOUBLE:
+ {
+ gdouble data;
+
+ if (!parse_double (option_name, value,
+ &data,
+ error))
+ {
+ return FALSE;
+ }
+
+ change = get_change (context, G_OPTION_ARG_DOUBLE,
+ entry->arg_data);
+ change->prev.dbl = *(gdouble *)entry->arg_data;
+ *(gdouble *)entry->arg_data = data;
+ break;
+ }
+ case G_OPTION_ARG_INT64:
+ {
+ gint64 data;
+
+ if (!parse_int64 (option_name, value,
+ &data,
+ error))
+ {
+ return FALSE;
+ }
+
+ change = get_change (context, G_OPTION_ARG_INT64,
+ entry->arg_data);
+ change->prev.int64 = *(gint64 *)entry->arg_data;
+ *(gint64 *)entry->arg_data = data;
+ break;
+ }
+ default:
+ g_assert_not_reached ();
+ }
+
+ return TRUE;
+}
+
+static gboolean
+parse_short_option (GOptionContext *context,
+ GOptionGroup *group,
+ gint index,
+ gint *new_index,
+ gchar arg,
+ gint *argc,
+ gchar ***argv,
+ GError **error,
+ gboolean *parsed)
+{
+ gint j;
+
+ for (j = 0; j < group->n_entries; j++)
+ {
+ if (arg == group->entries[j].short_name)
+ {
+ gchar *option_name;
+ gchar *value = NULL;
+
+ option_name = g_strdup_printf ("-%c", group->entries[j].short_name);
+
+ if (NO_ARG (&group->entries[j]))
+ value = NULL;
+ else
+ {
+ if (*new_index > index)
+ {
+ g_set_error (error,
+ G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
+ _("Error parsing option %s"), option_name);
+ g_free (option_name);
+ return FALSE;
+ }
+
+ if (index < *argc - 1)
+ {
+ if (!OPTIONAL_ARG (&group->entries[j]))
+ {
+ value = (*argv)[index + 1];
+ add_pending_null (context, &((*argv)[index + 1]), NULL);
+ *new_index = index+1;
+ }
+ else
+ {
+ if ((*argv)[index + 1][0] == '-')
+ value = NULL;
+ else
+ {
+ value = (*argv)[index + 1];
+ add_pending_null (context, &((*argv)[index + 1]), NULL);
+ *new_index = index + 1;
+ }
+ }
+ }
+ else if (index >= *argc - 1 && OPTIONAL_ARG (&group->entries[j]))
+ value = NULL;
+ else
+ {
+ g_set_error (error,
+ G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+ _("Missing argument for %s"), option_name);
+ g_free (option_name);
+ return FALSE;
+ }
+ }
+
+ if (!parse_arg (context, group, &group->entries[j],
+ value, option_name, error))
+ {
+ g_free (option_name);
+ return FALSE;
+ }
+
+ g_free (option_name);
+ *parsed = TRUE;
+ }
+ }
+
+ return TRUE;
+}
+
+static gboolean
+parse_long_option (GOptionContext *context,
+ GOptionGroup *group,
+ gint *index,
+ gchar *arg,
+ gboolean aliased,
+ gint *argc,
+ gchar ***argv,
+ GError **error,
+ gboolean *parsed)
+{
+ gint j;
+
+ for (j = 0; j < group->n_entries; j++)
+ {
+ if (*index >= *argc)
+ return TRUE;
+
+ if (aliased && (group->entries[j].flags & G_OPTION_FLAG_NOALIAS))
+ continue;
+
+ if (NO_ARG (&group->entries[j]) &&
+ strcmp (arg, group->entries[j].long_name) == 0)
+ {
+ gchar *option_name;
+
+ option_name = g_strconcat ("--", group->entries[j].long_name, NULL);
+ parse_arg (context, group, &group->entries[j],
+ NULL, option_name, error);
+ g_free(option_name);
+
+ add_pending_null (context, &((*argv)[*index]), NULL);
+ *parsed = TRUE;
+ }
+ else
+ {
+ gint len = strlen (group->entries[j].long_name);
+
+ if (strncmp (arg, group->entries[j].long_name, len) == 0 &&
+ (arg[len] == '=' || arg[len] == 0))
+ {
+ gchar *value = NULL;
+ gchar *option_name;
+
+ add_pending_null (context, &((*argv)[*index]), NULL);
+ option_name = g_strconcat ("--", group->entries[j].long_name, NULL);
+
+ if (arg[len] == '=')
+ value = arg + len + 1;
+ else if (*index < *argc - 1)
+ {
+ if (!(group->entries[j].flags & G_OPTION_FLAG_OPTIONAL_ARG))
+ {
+ value = (*argv)[*index + 1];
+ add_pending_null (context, &((*argv)[*index + 1]), NULL);
+ (*index)++;
+ }
+ else
+ {
+ if ((*argv)[*index + 1][0] == '-')
+ {
+ gboolean retval;
+ retval = parse_arg (context, group, &group->entries[j],
+ NULL, option_name, error);
+ *parsed = TRUE;
+ g_free (option_name);
+ return retval;
+ }
+ else
+ {
+ value = (*argv)[*index + 1];
+ add_pending_null (context, &((*argv)[*index + 1]), NULL);
+ (*index)++;
+ }
+ }
+ }
+ else if (*index >= *argc - 1 &&
+ group->entries[j].flags & G_OPTION_FLAG_OPTIONAL_ARG)
+ {
+ gboolean retval;
+ retval = parse_arg (context, group, &group->entries[j],
+ NULL, option_name, error);
+ *parsed = TRUE;
+ g_free (option_name);
+ return retval;
+ }
+ else
+ {
+ g_set_error (error,
+ G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+ _("Missing argument for %s"), option_name);
+ g_free (option_name);
+ return FALSE;
+ }
+
+ if (!parse_arg (context, group, &group->entries[j],
+ value, option_name, error))
+ {
+ g_free (option_name);
+ return FALSE;
+ }
+
+ g_free (option_name);
+ *parsed = TRUE;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+static gboolean
+parse_remaining_arg (GOptionContext *context,
+ GOptionGroup *group,
+ gint *index,
+ gint *argc,
+ gchar ***argv,
+ GError **error,
+ gboolean *parsed)
+{
+ gint j;
+
+ for (j = 0; j < group->n_entries; j++)
+ {
+ if (*index >= *argc)
+ return TRUE;
+
+ if (group->entries[j].long_name[0])
+ continue;
+
+ g_return_val_if_fail (group->entries[j].arg == G_OPTION_ARG_CALLBACK ||
+ group->entries[j].arg == G_OPTION_ARG_STRING_ARRAY ||
+ group->entries[j].arg == G_OPTION_ARG_FILENAME_ARRAY, FALSE);
+
+ add_pending_null (context, &((*argv)[*index]), NULL);
+
+ if (!parse_arg (context, group, &group->entries[j], (*argv)[*index], "", error))
+ return FALSE;
+
+ *parsed = TRUE;
+ return TRUE;
+ }
+
+ return TRUE;
+}
+
+static void
+free_changes_list (GOptionContext *context,
+ gboolean revert)
+{
+ GList *list;
+
+ for (list = context->changes; list != NULL; list = list->next)
+ {
+ Change *change = list->data;
+
+ if (revert)
+ {
+ switch (change->arg_type)
+ {
+ case G_OPTION_ARG_NONE:
+ *(gboolean *)change->arg_data = change->prev.bool;
+ break;
+ case G_OPTION_ARG_INT:
+ *(gint *)change->arg_data = change->prev.integer;
+ break;
+ case G_OPTION_ARG_STRING:
+ case G_OPTION_ARG_FILENAME:
+ g_free (change->allocated.str);
+ *(gchar **)change->arg_data = change->prev.str;
+ break;
+ case G_OPTION_ARG_STRING_ARRAY:
+ case G_OPTION_ARG_FILENAME_ARRAY:
+ g_strfreev (change->allocated.array.data);
+ *(gchar ***)change->arg_data = change->prev.array;
+ break;
+ case G_OPTION_ARG_DOUBLE:
+ *(gdouble *)change->arg_data = change->prev.dbl;
+ break;
+ case G_OPTION_ARG_INT64:
+ *(gint64 *)change->arg_data = change->prev.int64;
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+ }
+
+ g_free (change);
+ }
+
+ g_list_free (context->changes);
+ context->changes = NULL;
+}
+
+static void
+free_pending_nulls (GOptionContext *context,
+ gboolean perform_nulls)
+{
+ GList *list;
+
+ for (list = context->pending_nulls; list != NULL; list = list->next)
+ {
+ PendingNull *n = list->data;
+
+ if (perform_nulls)
+ {
+ if (n->value)
+ {
+ /* Copy back the short options */
+ *(n->ptr)[0] = '-';
+ strcpy (*n->ptr + 1, n->value);
+ }
+ else
+ *n->ptr = NULL;
+ }
+
+ g_free (n->value);
+ g_free (n);
+ }
+
+ g_list_free (context->pending_nulls);
+ context->pending_nulls = NULL;
+}
+
+/**
+ * g_option_context_parse:
+ * @context: a #GOptionContext
+ * @argc: a pointer to the number of command line arguments
+ * @argv: a pointer to the array of command line arguments
+ * @error: a return location for errors
+ *
+ * Parses the command line arguments, recognizing options
+ * which have been added to @context. A side-effect of
+ * calling this function is that g_set_prgname() will be
+ * called.
+ *
+ * If the parsing is successful, any parsed arguments are
+ * removed from the array and @argc and @argv are updated
+ * accordingly. A '--' option is stripped from @argv
+ * unless there are unparsed options before and after it,
+ * or some of the options after it start with '-'. In case
+ * of an error, @argc and @argv are left unmodified.
+ *
+ * If automatic <option>--help</option> support is enabled
+ * (see g_option_context_set_help_enabled()), and the
+ * @argv array contains one of the recognized help options,
+ * this function will produce help output to stdout and
+ * call <literal>exit (0)</literal>.
+ *
+ * Note that function depends on the
+ * <link linkend="setlocale">current locale</link> for
+ * automatic character set conversion of string and filename
+ * arguments.
+ *
+ * Return value: %TRUE if the parsing was successful,
+ * %FALSE if an error occurred
+ *
+ * Since: 2.6
+ **/
+gboolean
+g_option_context_parse (GOptionContext *context,
+ gint *argc,
+ gchar ***argv,
+ GError **error)
+{
+ gint i, j, k;
+ GList *list;
+
+ /* Set program name */
+ if (!g_get_prgname())
+ {
+ if (argc && argv && *argc)
+ {
+ gchar *prgname;
+
+ prgname = g_path_get_basename ((*argv)[0]);
+ g_set_prgname (prgname);
+ g_free (prgname);
+ }
+ else
+ g_set_prgname ("<unknown>");
+ }
+
+ /* Call pre-parse hooks */
+ list = context->groups;
+ while (list)
+ {
+ GOptionGroup *group = list->data;
+
+ if (group->pre_parse_func)
+ {
+ if (!(* group->pre_parse_func) (context, group,
+ group->user_data, error))
+ goto fail;
+ }
+
+ list = list->next;
+ }
+
+ if (context->main_group && context->main_group->pre_parse_func)
+ {
+ if (!(* context->main_group->pre_parse_func) (context, context->main_group,
+ context->main_group->user_data, error))
+ goto fail;
+ }
+
+ if (argc && argv)
+ {
+ gboolean stop_parsing = FALSE;
+ gboolean has_unknown = FALSE;
+ gint separator_pos = 0;
+
+ for (i = 1; i < *argc; i++)
+ {
+ gchar *arg, *dash;
+ gboolean parsed = FALSE;
+
+ if ((*argv)[i][0] == '-' && (*argv)[i][1] != '\0' && !stop_parsing)
+ {
+ if ((*argv)[i][1] == '-')
+ {
+ /* -- option */
+
+ arg = (*argv)[i] + 2;
+
+ /* '--' terminates list of arguments */
+ if (*arg == 0)
+ {
+ separator_pos = i;
+ stop_parsing = TRUE;
+ continue;
+ }
+
+ /* Handle help options */
+ if (context->help_enabled)
+ {
+ if (strcmp (arg, "help") == 0)
+ print_help (context, TRUE, NULL);
+ else if (strcmp (arg, "help-all") == 0)
+ print_help (context, FALSE, NULL);
+ else if (strncmp (arg, "help-", 5) == 0)
+ {
+ GList *list;
+
+ list = context->groups;
+
+ while (list)
+ {
+ GOptionGroup *group = list->data;
+
+ if (strcmp (arg + 5, group->name) == 0)
+ print_help (context, FALSE, group);
+
+ list = list->next;
+ }
+ }
+ }
+
+ if (context->main_group &&
+ !parse_long_option (context, context->main_group, &i, arg,
+ FALSE, argc, argv, error, &parsed))
+ goto fail;
+
+ if (parsed)
+ continue;
+
+ /* Try the groups */
+ list = context->groups;
+ while (list)
+ {
+ GOptionGroup *group = list->data;
+
+ if (!parse_long_option (context, group, &i, arg,
+ FALSE, argc, argv, error, &parsed))
+ goto fail;
+
+ if (parsed)
+ break;
+
+ list = list->next;
+ }
+
+ if (parsed)
+ continue;
+
+ /* Now look for --<group>-<option> */
+ dash = strchr (arg, '-');
+ if (dash)
+ {
+ /* Try the groups */
+ list = context->groups;
+ while (list)
+ {
+ GOptionGroup *group = list->data;
+
+ if (strncmp (group->name, arg, dash - arg) == 0)
+ {
+ if (!parse_long_option (context, group, &i, dash + 1,
+ TRUE, argc, argv, error, &parsed))
+ goto fail;
+
+ if (parsed)
+ break;
+ }
+
+ list = list->next;
+ }
+ }
+
+ if (context->ignore_unknown)
+ continue;
+ }
+ else
+ { /* short option */
+ gint j, new_i = i, arg_length;
+ gboolean *nulled_out = NULL;
+ arg = (*argv)[i] + 1;
+ arg_length = strlen (arg);
+ nulled_out = g_newa (gboolean, arg_length);
+ memset (nulled_out, 0, arg_length * sizeof (gboolean));
+ for (j = 0; j < arg_length; j++)
+ {
+ if (context->help_enabled && arg[j] == '?')
+ print_help (context, TRUE, NULL);
+ parsed = FALSE;
+ if (context->main_group &&
+ !parse_short_option (context, context->main_group,
+ i, &new_i, arg[j],
+ argc, argv, error, &parsed))
+ goto fail;
+ if (!parsed)
+ {
+ /* Try the groups */
+ list = context->groups;
+ while (list)
+ {
+ GOptionGroup *group = list->data;
+ if (!parse_short_option (context, group, i, &new_i, arg[j],
+ argc, argv, error, &parsed))
+ goto fail;
+ if (parsed)
+ break;
+ list = list->next;
+ }
+ }
+
+ if (context->ignore_unknown && parsed)
+ nulled_out[j] = TRUE;
+ else if (context->ignore_unknown)
+ continue;
+ else if (!parsed)
+ break;
+ /* !context->ignore_unknown && parsed */
+ }
+ if (context->ignore_unknown)
+ {
+ gchar *new_arg = NULL;
+ gint arg_index = 0;
+ for (j = 0; j < arg_length; j++)
+ {
+ if (!nulled_out[j])
+ {
+ if (!new_arg)
+ new_arg = g_malloc (arg_length + 1);
+ new_arg[arg_index++] = arg[j];
+ }
+ }
+ if (new_arg)
+ new_arg[arg_index] = '\0';
+ add_pending_null (context, &((*argv)[i]), new_arg);
+ }
+ else if (parsed)
+ {
+ add_pending_null (context, &((*argv)[i]), NULL);
+ i = new_i;
+ }
+ }
+
+ if (!parsed)
+ has_unknown = TRUE;
+
+ if (!parsed && !context->ignore_unknown)
+ {
+ g_set_error (error,
+ G_OPTION_ERROR, G_OPTION_ERROR_UNKNOWN_OPTION,
+ _("Unknown option %s"), (*argv)[i]);
+ goto fail;
+ }
+ }
+ else
+ {
+ /* Collect remaining args */
+ if (context->main_group &&
+ !parse_remaining_arg (context, context->main_group, &i,
+ argc, argv, error, &parsed))
+ goto fail;
+
+ if (!parsed && (has_unknown || (*argv)[i][0] == '-'))
+ separator_pos = 0;
+ }
+ }
+
+ if (separator_pos > 0)
+ add_pending_null (context, &((*argv)[separator_pos]), NULL);
+
+ }
+
+ /* Call post-parse hooks */
+ list = context->groups;
+ while (list)
+ {
+ GOptionGroup *group = list->data;
+
+ if (group->post_parse_func)
+ {
+ if (!(* group->post_parse_func) (context, group,
+ group->user_data, error))
+ goto fail;
+ }
+
+ list = list->next;
+ }
+
+ if (context->main_group && context->main_group->post_parse_func)
+ {
+ if (!(* context->main_group->post_parse_func) (context, context->main_group,
+ context->main_group->user_data, error))
+ goto fail;
+ }
+
+ if (argc && argv)
+ {
+ free_pending_nulls (context, TRUE);
+
+ for (i = 1; i < *argc; i++)
+ {
+ for (k = i; k < *argc; k++)
+ if ((*argv)[k] != NULL)
+ break;
+
+ if (k > i)
+ {
+ k -= i;
+ for (j = i + k; j < *argc; j++)
+ {
+ (*argv)[j-k] = (*argv)[j];
+ (*argv)[j] = NULL;
+ }
+ *argc -= k;
+ }
+ }
+ }
+
+ return TRUE;
+
+ fail:
+
+ /* Call error hooks */
+ list = context->groups;
+ while (list)
+ {
+ GOptionGroup *group = list->data;
+
+ if (group->error_func)
+ (* group->error_func) (context, group,
+ group->user_data, error);
+
+ list = list->next;
+ }
+
+ if (context->main_group && context->main_group->error_func)
+ (* context->main_group->error_func) (context, context->main_group,
+ context->main_group->user_data, error);
+
+ free_changes_list (context, TRUE);
+ free_pending_nulls (context, FALSE);
+
+ return FALSE;
+}
+
+/**
+ * g_option_group_new:
+ * @name: the name for the option group, this is used to provide
+ * help for the options in this group with <option>--help-</option>@name
+ * @description: a description for this group to be shown in
+ * <option>--help</option>. This string is translated using the translation
+ * domain or translation function of the group
+ * @help_description: a description for the <option>--help-</option>@name option.
+ * This string is translated using the translation domain or translation function
+ * of the group
+ * @user_data: user data that will be passed to the pre- and post-parse hooks,
+ * the error hook and to callbacks of %G_OPTION_ARG_CALLBACK options, or %NULL
+ * @destroy: a function that will be called to free @user_data, or %NULL
+ *
+ * Creates a new #GOptionGroup.
+ *
+ * Return value: a newly created option group. It should be added
+ * to a #GOptionContext or freed with g_option_group_free().
+ *
+ * Since: 2.6
+ **/
+GOptionGroup *
+g_option_group_new (const gchar *name,
+ const gchar *description,
+ const gchar *help_description,
+ gpointer user_data,
+ GDestroyNotify destroy)
+
+{
+ GOptionGroup *group;
+
+ group = g_new0 (GOptionGroup, 1);
+ group->name = g_strdup (name);
+ group->description = g_strdup (description);
+ group->help_description = g_strdup (help_description);
+ group->user_data = user_data;
+ group->destroy_notify = destroy;
+
+ return group;
+}
+
+
+/**
+ * g_option_group_free:
+ * @group: a #GOptionGroup
+ *
+ * Frees a #GOptionGroup. Note that you must <emphasis>not</emphasis>
+ * free groups which have been added to a #GOptionContext.
+ *
+ * Since: 2.6
+ **/
+void
+g_option_group_free (GOptionGroup *group)
+{
+ g_return_if_fail (group != NULL);
+
+ g_free (group->name);
+ g_free (group->description);
+ g_free (group->help_description);
+
+ g_free (group->entries);
+
+ if (group->destroy_notify)
+ (* group->destroy_notify) (group->user_data);
+
+ if (group->translate_notify)
+ (* group->translate_notify) (group->translate_data);
+
+ g_free (group);
+}
+
+
+/**
+ * g_option_group_add_entries:
+ * @group: a #GOptionGroup
+ * @entries: a %NULL-terminated array of #GOptionEntry<!-- -->s
+ *
+ * Adds the options specified in @entries to @group.
+ *
+ * Since: 2.6
+ **/
+void
+g_option_group_add_entries (GOptionGroup *group,
+ const GOptionEntry *entries)
+{
+ gint i, n_entries;
+
+ g_return_if_fail (entries != NULL);
+
+ for (n_entries = 0; entries[n_entries].long_name != NULL; n_entries++) ;
+
+ group->entries = g_renew (GOptionEntry, group->entries, group->n_entries + n_entries);
+
+ memcpy (group->entries + group->n_entries, entries, sizeof (GOptionEntry) * n_entries);
+
+ for (i = group->n_entries; i < group->n_entries + n_entries; i++)
+ {
+ gchar c = group->entries[i].short_name;
+
+ if (c)
+ {
+ if (c == '-' || !g_ascii_isprint (c))
+ {
+ g_warning (G_STRLOC": ignoring invalid short option '%c' (%d)", c, c);
+ group->entries[i].short_name = 0;
+ }
+ }
+ }
+
+ group->n_entries += n_entries;
+}
+
+/**
+ * g_option_group_set_parse_hooks:
+ * @group: a #GOptionGroup
+ * @pre_parse_func: a function to call before parsing, or %NULL
+ * @post_parse_func: a function to call after parsing, or %NULL
+ *
+ * Associates two functions with @group which will be called
+ * from g_option_context_parse() before the first option is parsed
+ * and after the last option has been parsed, respectively.
+ *
+ * Note that the user data to be passed to @pre_parse_func and
+ * @post_parse_func can be specified when constructing the group
+ * with g_option_group_new().
+ *
+ * Since: 2.6
+ **/
+void
+g_option_group_set_parse_hooks (GOptionGroup *group,
+ GOptionParseFunc pre_parse_func,
+ GOptionParseFunc post_parse_func)
+{
+ g_return_if_fail (group != NULL);
+
+ group->pre_parse_func = pre_parse_func;
+ group->post_parse_func = post_parse_func;
+}
+
+/**
+ * g_option_group_set_error_hook:
+ * @group: a #GOptionGroup
+ * @error_func: a function to call when an error occurs
+ *
+ * Associates a function with @group which will be called
+ * from g_option_context_parse() when an error occurs.
+ *
+ * Note that the user data to be passed to @pre_parse_func and
+ * @post_parse_func can be specified when constructing the group
+ * with g_option_group_new().
+ *
+ * Since: 2.6
+ **/
+void
+g_option_group_set_error_hook (GOptionGroup *group,
+ GOptionErrorFunc error_func)
+{
+ g_return_if_fail (group != NULL);
+
+ group->error_func = error_func;
+}
+
+
+/**
+ * g_option_group_set_translate_func:
+ * @group: a #GOptionGroup
+ * @func: the #GTranslateFunc, or %NULL
+ * @data: user data to pass to @func, or %NULL
+ * @destroy_notify: a function which gets called to free @data, or %NULL
+ *
+ * Sets the function which is used to translate user-visible
+ * strings, for <option>--help</option> output. Different
+ * groups can use different #GTranslateFunc<!-- -->s. If @func
+ * is %NULL, strings are not translated.
+ *
+ * If you are using gettext(), you only need to set the translation
+ * domain, see g_option_group_set_translation_domain().
+ *
+ * Since: 2.6
+ **/
+void
+g_option_group_set_translate_func (GOptionGroup *group,
+ GTranslateFunc func,
+ gpointer data,
+ GDestroyNotify destroy_notify)
+{
+ g_return_if_fail (group != NULL);
+
+ if (group->translate_notify)
+ group->translate_notify (group->translate_data);
+
+ group->translate_func = func;
+ group->translate_data = data;
+ group->translate_notify = destroy_notify;
+}
+
+static gchar *
+dgettext_swapped (const gchar *msgid,
+ const gchar *domainname)
+{
+ return dgettext (domainname, msgid);
+}
+
+/**
+ * g_option_group_set_translation_domain:
+ * @group: a #GOptionGroup
+ * @domain: the domain to use
+ *
+ * A convenience function to use gettext() for translating
+ * user-visible strings.
+ *
+ * Since: 2.6
+ **/
+void
+g_option_group_set_translation_domain (GOptionGroup *group,
+ const gchar *domain)
+{
+ g_return_if_fail (group != NULL);
+
+ g_option_group_set_translate_func (group,
+ (GTranslateFunc)dgettext_swapped,
+ g_strdup (domain),
+ g_free);
+}
+
+/**
+ * g_option_context_set_translate_func:
+ * @context: a #GOptionContext
+ * @func: the #GTranslateFunc, or %NULL
+ * @data: user data to pass to @func, or %NULL
+ * @destroy_notify: a function which gets called to free @data, or %NULL
+ *
+ * Sets the function which is used to translate the contexts
+ * user-visible strings, for <option>--help</option> output.
+ * If @func is %NULL, strings are not translated.
+ *
+ * Note that option groups have their own translation functions,
+ * this function only affects the @parameter_string (see g_option_context_new()),
+ * the summary (see g_option_context_set_summary()) and the description
+ * (see g_option_context_set_description()).
+ *
+ * If you are using gettext(), you only need to set the translation
+ * domain, see g_context_group_set_translation_domain().
+ *
+ * Since: 2.12
+ **/
+void
+g_option_context_set_translate_func (GOptionContext *context,
+ GTranslateFunc func,
+ gpointer data,
+ GDestroyNotify destroy_notify)
+{
+ g_return_if_fail (context != NULL);
+
+ if (context->translate_notify)
+ context->translate_notify (context->translate_data);
+
+ context->translate_func = func;
+ context->translate_data = data;
+ context->translate_notify = destroy_notify;
+}
+
+/**
+ * g_option_context_set_translation_domain:
+ * @context: a #GOptionContext
+ * @domain: the domain to use
+ *
+ * A convenience function to use gettext() for translating
+ * user-visible strings.
+ *
+ * Since: 2.12
+ **/
+void
+g_option_context_set_translation_domain (GOptionContext *context,
+ const gchar *domain)
+{
+ g_return_if_fail (context != NULL);
+
+ g_option_context_set_translate_func (context,
+ (GTranslateFunc)dgettext_swapped,
+ g_strdup (domain),
+ g_free);
+}
+
+/**
+ * g_option_context_set_summary:
+ * @context: a #GOptionContext
+ * @summary: a string to be shown in <option>--help</option> output
+ * before the list of options, or %NULL
+ *
+ * Adds a string to be displayed in <option>--help</option> output
+ * before the list of options. This is typically a summary of the
+ * program functionality.
+ *
+ * Note that the summary is translated (see
+ * g_option_context_set_translate_func(), g_option_context_set_translation_domain()).
+ *
+ * Since: 2.12
+ */
+void
+g_option_context_set_summary (GOptionContext *context,
+ const gchar *summary)
+{
+ g_return_if_fail (context != NULL);
+
+ g_free (context->summary);
+ context->summary = g_strdup (summary);
+}
+
+
+/**
+ * g_option_context_get_summary:
+ * @context: a #GOptionContext
+ *
+ * Returns the summary. See g_option_context_set_summary().
+ *
+ * Returns: the summary
+ *
+ * Since: 2.12
+ */
+G_CONST_RETURN gchar *
+g_option_context_get_summary (GOptionContext *context)
+{
+ g_return_val_if_fail (context != NULL, NULL);
+
+ return context->summary;
+}
+
+/**
+ * g_option_context_set_description:
+ * @context: a #GOptionContext
+ * @description: a string to be shown in <option>--help</option> output
+ * after the list of options, or %NULL
+ *
+ * Adds a string to be displayed in <option>--help</option> output
+ * after the list of options. This text often includes a bug reporting
+ * address.
+ *
+ * Note that the summary is translated (see
+ * g_option_context_set_translate_func()).
+ *
+ * Since: 2.12
+ */
+void
+g_option_context_set_description (GOptionContext *context,
+ const gchar *description)
+{
+ g_return_if_fail (context != NULL);
+
+ g_free (context->description);
+ context->description = g_strdup (description);
+}
+
+
+/**
+ * g_option_context_get_description:
+ * @context: a #GOptionContext
+ *
+ * Returns the description. See g_option_context_set_description().
+ *
+ * Returns: the description
+ *
+ * Since: 2.12
+ */
+G_CONST_RETURN gchar *
+g_option_context_get_description (GOptionContext *context)
+{
+ g_return_val_if_fail (context != NULL, NULL);
+
+ return context->description;
+}
+
+
+#define __G_OPTION_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/goption.h b/trunk/glib/goption.h
new file mode 100644
index 000000000..908e53191
--- /dev/null
+++ b/trunk/glib/goption.h
@@ -0,0 +1,160 @@
+/* goption.h - Option parser
+ *
+ * Copyright (C) 2004 Anders Carlsson <andersca@gnome.org>
+ *
+ * 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_OPTION_H__
+#define __G_OPTION_H__
+
+#include <glib/gerror.h>
+#include <glib/gquark.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GOptionContext GOptionContext;
+typedef struct _GOptionGroup GOptionGroup;
+typedef struct _GOptionEntry GOptionEntry;
+
+typedef enum
+{
+ G_OPTION_FLAG_HIDDEN = 1 << 0,
+ G_OPTION_FLAG_IN_MAIN = 1 << 1,
+ G_OPTION_FLAG_REVERSE = 1 << 2,
+ G_OPTION_FLAG_NO_ARG = 1 << 3,
+ G_OPTION_FLAG_FILENAME = 1 << 4,
+ G_OPTION_FLAG_OPTIONAL_ARG = 1 << 5,
+ G_OPTION_FLAG_NOALIAS = 1 << 6
+} GOptionFlags;
+
+typedef enum
+{
+ G_OPTION_ARG_NONE,
+ G_OPTION_ARG_STRING,
+ G_OPTION_ARG_INT,
+ G_OPTION_ARG_CALLBACK,
+ G_OPTION_ARG_FILENAME,
+ G_OPTION_ARG_STRING_ARRAY,
+ G_OPTION_ARG_FILENAME_ARRAY,
+ G_OPTION_ARG_DOUBLE,
+ G_OPTION_ARG_INT64
+} GOptionArg;
+
+typedef gboolean (*GOptionArgFunc) (const gchar *option_name,
+ const gchar *value,
+ gpointer data,
+ GError **error);
+
+typedef gboolean (*GOptionParseFunc) (GOptionContext *context,
+ GOptionGroup *group,
+ gpointer data,
+ GError **error);
+
+typedef void (*GOptionErrorFunc) (GOptionContext *context,
+ GOptionGroup *group,
+ gpointer data,
+ GError **error);
+
+#define G_OPTION_ERROR (g_option_error_quark ())
+
+typedef enum
+{
+ G_OPTION_ERROR_UNKNOWN_OPTION,
+ G_OPTION_ERROR_BAD_VALUE,
+ G_OPTION_ERROR_FAILED
+} GOptionError;
+
+GQuark g_option_error_quark (void);
+
+
+struct _GOptionEntry
+{
+ const gchar *long_name;
+ gchar short_name;
+ gint flags;
+
+ GOptionArg arg;
+ gpointer arg_data;
+
+ const gchar *description;
+ const gchar *arg_description;
+};
+
+#define G_OPTION_REMAINING ""
+
+GOptionContext *g_option_context_new (const gchar *parameter_string);
+void g_option_context_set_summary (GOptionContext *context,
+ const gchar *summary);
+G_CONST_RETURN gchar *g_option_context_get_summary (GOptionContext *context);
+void g_option_context_set_description (GOptionContext *context,
+ const gchar *description);
+G_CONST_RETURN gchar *g_option_context_get_description (GOptionContext *context);
+void g_option_context_free (GOptionContext *context);
+void g_option_context_set_help_enabled (GOptionContext *context,
+ gboolean help_enabled);
+gboolean g_option_context_get_help_enabled (GOptionContext *context);
+void g_option_context_set_ignore_unknown_options (GOptionContext *context,
+ gboolean ignore_unknown);
+gboolean g_option_context_get_ignore_unknown_options (GOptionContext *context);
+
+void g_option_context_add_main_entries (GOptionContext *context,
+ const GOptionEntry *entries,
+ const gchar *translation_domain);
+gboolean g_option_context_parse (GOptionContext *context,
+ gint *argc,
+ gchar ***argv,
+ GError **error);
+void g_option_context_set_translate_func (GOptionContext *context,
+ GTranslateFunc func,
+ gpointer data,
+ GDestroyNotify destroy_notify);
+void g_option_context_set_translation_domain (GOptionContext *context,
+ const gchar *domain);
+
+void g_option_context_add_group (GOptionContext *context,
+ GOptionGroup *group);
+void g_option_context_set_main_group (GOptionContext *context,
+ GOptionGroup *group);
+GOptionGroup *g_option_context_get_main_group (GOptionContext *context);
+gchar *g_option_context_get_help (GOptionContext *context,
+ gboolean main_help,
+ GOptionGroup *group);
+
+GOptionGroup *g_option_group_new (const gchar *name,
+ const gchar *description,
+ const gchar *help_description,
+ gpointer user_data,
+ GDestroyNotify destroy);
+void g_option_group_set_parse_hooks (GOptionGroup *group,
+ GOptionParseFunc pre_parse_func,
+ GOptionParseFunc post_parse_func);
+void g_option_group_set_error_hook (GOptionGroup *group,
+ GOptionErrorFunc error_func);
+void g_option_group_free (GOptionGroup *group);
+void g_option_group_add_entries (GOptionGroup *group,
+ const GOptionEntry *entries);
+void g_option_group_set_translate_func (GOptionGroup *group,
+ GTranslateFunc func,
+ gpointer data,
+ GDestroyNotify destroy_notify);
+void g_option_group_set_translation_domain (GOptionGroup *group,
+ const gchar *domain);
+
+
+G_END_DECLS
+
+#endif /* __G_OPTION_H__ */
diff --git a/trunk/glib/gpattern.c b/trunk/glib/gpattern.c
new file mode 100644
index 000000000..938083eac
--- /dev/null
+++ b/trunk/glib/gpattern.c
@@ -0,0 +1,343 @@
+/* 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 "config.h"
+
+#include <string.h>
+
+#include "gpattern.h"
+
+#include "gmacros.h"
+#include "gmessages.h"
+#include "gmem.h"
+#include "gunicode.h"
+#include "gutils.h"
+#include "galias.h"
+
+/* keep enum and structure of gpattern.c and patterntest.c in sync */
+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;
+
+struct _GPatternSpec
+{
+ GMatchType match_type;
+ guint pattern_length;
+ guint min_length;
+ guint max_length;
+ gchar *pattern;
+};
+
+
+/* --- functions --- */
+static inline gboolean
+g_pattern_ph_match (const gchar *match_pattern,
+ const gchar *match_string,
+ gboolean *wildcard_reached_p)
+{
+ 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 = g_utf8_next_char (string);
+ break;
+
+ case '*':
+ *wildcard_reached_p = TRUE;
+ do
+ {
+ ch = *pattern;
+ pattern++;
+ if (ch == '?')
+ {
+ if (!*string)
+ return FALSE;
+ string = g_utf8_next_char (string);
+ }
+ }
+ while (ch == '*' || ch == '?');
+ if (!ch)
+ return TRUE;
+ do
+ {
+ gboolean next_wildcard_reached = FALSE;
+ while (ch != *string)
+ {
+ if (!*string)
+ return FALSE;
+ string = g_utf8_next_char (string);
+ }
+ string++;
+ if (g_pattern_ph_match (pattern, string, &next_wildcard_reached))
+ return TRUE;
+ if (next_wildcard_reached)
+ /* the forthcoming pattern substring up to the next wildcard has
+ * been matched, but a mismatch occoured for the rest of the
+ * pattern, following the next wildcard.
+ * there's no need to advance the current match position any
+ * further if the rest pattern will not match.
+ */
+ return FALSE;
+ }
+ 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);
+
+ if (string_length < pspec->min_length ||
+ string_length > pspec->max_length)
+ return FALSE;
+
+ switch (pspec->match_type)
+ {
+ gboolean dummy;
+ case G_MATCH_ALL:
+ return g_pattern_ph_match (pspec->pattern, string, &dummy);
+ case G_MATCH_ALL_TAIL:
+ if (string_reversed)
+ return g_pattern_ph_match (pspec->pattern, string_reversed, &dummy);
+ else
+ {
+ gboolean result;
+ gchar *tmp;
+ tmp = g_utf8_strreverse (string, string_length);
+ result = g_pattern_ph_match (pspec->pattern, tmp, &dummy);
+ g_free (tmp);
+ return result;
+ }
+ case G_MATCH_HEAD:
+ 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)
+ return strcmp (pspec->pattern, string + (string_length - pspec->pattern_length)) == 0;
+ else
+ return TRUE;
+ case G_MATCH_EXACT:
+ if (pspec->pattern_length != string_length)
+ return FALSE;
+ else
+ return strcmp (pspec->pattern, string) == 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;
+ gboolean seen_joker = FALSE, seen_wildcard = FALSE, more_wildcards = FALSE;
+ gint hw_pos = -1, tw_pos = -1, hj_pos = -1, tj_pos = -1;
+ gboolean follows_wildcard = FALSE;
+ guint pending_jokers = 0;
+ const gchar *s;
+ gchar *d;
+ guint i;
+
+ g_return_val_if_fail (pattern != NULL, NULL);
+
+ /* canonicalize pattern and collect necessary stats */
+ pspec = g_new (GPatternSpec, 1);
+ pspec->pattern_length = strlen (pattern);
+ pspec->min_length = 0;
+ pspec->max_length = 0;
+ pspec->pattern = g_new (gchar, pspec->pattern_length + 1);
+ d = pspec->pattern;
+ for (i = 0, s = pattern; *s != 0; s++)
+ {
+ switch (*s)
+ {
+ case '*':
+ if (follows_wildcard) /* compress multiple wildcards */
+ {
+ pspec->pattern_length--;
+ continue;
+ }
+ follows_wildcard = TRUE;
+ if (hw_pos < 0)
+ hw_pos = i;
+ tw_pos = i;
+ break;
+ case '?':
+ pending_jokers++;
+ pspec->min_length++;
+ pspec->max_length += 4; /* maximum UTF-8 character length */
+ continue;
+ default:
+ for (; pending_jokers; pending_jokers--, i++) {
+ *d++ = '?';
+ if (hj_pos < 0)
+ hj_pos = i;
+ tj_pos = i;
+ }
+ follows_wildcard = FALSE;
+ pspec->min_length++;
+ pspec->max_length++;
+ break;
+ }
+ *d++ = *s;
+ i++;
+ }
+ for (; pending_jokers; pending_jokers--) {
+ *d++ = '?';
+ if (hj_pos < 0)
+ hj_pos = i;
+ tj_pos = i;
+ }
+ *d++ = 0;
+ seen_joker = hj_pos >= 0;
+ seen_wildcard = hw_pos >= 0;
+ more_wildcards = seen_wildcard && hw_pos != tw_pos;
+ if (seen_wildcard)
+ pspec->max_length = G_MAXUINT;
+
+ /* special case sole head/tail wildcard or exact matches */
+ if (!seen_joker && !more_wildcards)
+ {
+ if (pspec->pattern[0] == '*')
+ {
+ pspec->match_type = G_MATCH_TAIL;
+ memmove (pspec->pattern, pspec->pattern + 1, --pspec->pattern_length);
+ pspec->pattern[pspec->pattern_length] = 0;
+ return pspec;
+ }
+ if (pspec->pattern_length > 0 &&
+ pspec->pattern[pspec->pattern_length - 1] == '*')
+ {
+ pspec->match_type = G_MATCH_HEAD;
+ pspec->pattern[--pspec->pattern_length] = 0;
+ return pspec;
+ }
+ if (!seen_wildcard)
+ {
+ pspec->match_type = G_MATCH_EXACT;
+ return pspec;
+ }
+ }
+
+ /* now just need to distinguish between head or tail match start */
+ tw_pos = pspec->pattern_length - 1 - tw_pos; /* last pos to tail distance */
+ tj_pos = pspec->pattern_length - 1 - tj_pos; /* last pos to tail distance */
+ if (seen_wildcard)
+ pspec->match_type = tw_pos > hw_pos ? G_MATCH_ALL_TAIL : G_MATCH_ALL;
+ else /* seen_joker */
+ pspec->match_type = tj_pos > hj_pos ? G_MATCH_ALL_TAIL : G_MATCH_ALL;
+ if (pspec->match_type == G_MATCH_ALL_TAIL) {
+ gchar *tmp = pspec->pattern;
+ pspec->pattern = g_utf8_strreverse (pspec->pattern, pspec->pattern_length);
+ g_free (tmp);
+ }
+ return pspec;
+}
+
+void
+g_pattern_spec_free (GPatternSpec *pspec)
+{
+ g_return_if_fail (pspec != NULL);
+
+ g_free (pspec->pattern);
+ g_free (pspec);
+}
+
+gboolean
+g_pattern_spec_equal (GPatternSpec *pspec1,
+ GPatternSpec *pspec2)
+{
+ g_return_val_if_fail (pspec1 != NULL, FALSE);
+ g_return_val_if_fail (pspec2 != NULL, FALSE);
+
+ return (pspec1->pattern_length == pspec2->pattern_length &&
+ pspec1->match_type == pspec2->match_type &&
+ strcmp (pspec1->pattern, pspec2->pattern) == 0);
+}
+
+gboolean
+g_pattern_match_string (GPatternSpec *pspec,
+ const gchar *string)
+{
+ g_return_val_if_fail (pspec != NULL, FALSE);
+ g_return_val_if_fail (string != NULL, FALSE);
+
+ return g_pattern_match (pspec, strlen (string), string, NULL);
+}
+
+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 (pspec, strlen (string), string, NULL);
+ g_pattern_spec_free (pspec);
+
+ return ergo;
+}
+
+#define __G_PATTERN_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gpattern.h b/trunk/glib/gpattern.h
new file mode 100644
index 000000000..5c8966877
--- /dev/null
+++ b/trunk/glib/gpattern.h
@@ -0,0 +1,44 @@
+/* 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 <glib/gtypes.h>
+
+G_BEGIN_DECLS
+
+
+typedef struct _GPatternSpec GPatternSpec;
+
+GPatternSpec* g_pattern_spec_new (const gchar *pattern);
+void g_pattern_spec_free (GPatternSpec *pspec);
+gboolean g_pattern_spec_equal (GPatternSpec *pspec1,
+ GPatternSpec *pspec2);
+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/trunk/glib/gprimes.c b/trunk/glib/gprimes.c
new file mode 100644
index 000000000..7beca710c
--- /dev/null
+++ b/trunk/glib/gprimes.c
@@ -0,0 +1,90 @@
+/* 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 "config.h"
+
+#include "glib.h"
+#include "galias.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];
+}
+
+#define __G_PRIMES_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gprimes.h b/trunk/glib/gprimes.h
new file mode 100644
index 000000000..0f1740cb1
--- /dev/null
+++ b/trunk/glib/gprimes.h
@@ -0,0 +1,47 @@
+/* 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 <glib/gtypes.h>
+
+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/trunk/glib/gprintf.c b/trunk/glib/gprintf.c
new file mode 100644
index 000000000..7de0953a2
--- /dev/null
+++ b/trunk/glib/gprintf.c
@@ -0,0 +1,342 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997, 2002 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 "config.h"
+
+#define _GNU_SOURCE /* For vasprintf */
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "glib.h"
+#include "gprintf.h"
+#include "gprintfint.h"
+
+#include "galias.h"
+
+/**
+ * g_printf:
+ * @format: a standard printf() format string, but notice
+ * <link linkend="string-precision">string precision pitfalls</link>.
+ * @Varargs: the arguments to insert in the output.
+ *
+ * An implementation of the standard printf() function which supports
+ * positional parameters, as specified in the Single Unix Specification.
+ *
+ * Returns: the number of characters printed.
+ *
+ * Since: 2.2
+ **/
+gint
+g_printf (gchar const *format,
+ ...)
+{
+ va_list args;
+ gint retval;
+
+ va_start (args, format);
+ retval = g_vprintf (format, args);
+ va_end (args);
+
+ return retval;
+}
+
+/**
+ * g_fprintf:
+ * @file: the stream to write to.
+ * @format: a standard printf() format string, but notice
+ * <link linkend="string-precision">string precision pitfalls</link>.
+ * @Varargs: the arguments to insert in the output.
+ *
+ * An implementation of the standard fprintf() function which supports
+ * positional parameters, as specified in the Single Unix Specification.
+ *
+ * Returns: the number of characters printed.
+ *
+ * Since: 2.2
+ **/
+gint
+g_fprintf (FILE *file,
+ gchar const *format,
+ ...)
+{
+ va_list args;
+ gint retval;
+
+ va_start (args, format);
+ retval = g_vfprintf (file, format, args);
+ va_end (args);
+
+ return retval;
+}
+
+/**
+ * g_sprintf:
+ * @string: A pointer to a memory buffer to contain the resulting string. It
+ * is up to the caller to ensure that the allocated buffer is large
+ * enough to hold the formatted result
+ * @format: a standard printf() format string, but notice
+ * <link linkend="string-precision">string precision pitfalls</link>.
+ * @Varargs: the arguments to insert in the output.
+ *
+ * An implementation of the standard sprintf() function which supports
+ * positional parameters, as specified in the Single Unix Specification.
+ *
+ * Returns: the number of characters printed.
+ *
+ * Since: 2.2
+ **/
+gint
+g_sprintf (gchar *string,
+ gchar const *format,
+ ...)
+{
+ va_list args;
+ gint retval;
+
+ va_start (args, format);
+ retval = g_vsprintf (string, format, args);
+ va_end (args);
+
+ return retval;
+}
+
+/**
+ * g_snprintf:
+ * @string: the buffer to hold the output.
+ * @n: the maximum number of characters to produce (including the
+ * terminating nul character).
+ * @format: a standard printf() format string, but notice
+ * <link linkend="string-precision">string precision pitfalls</link>.
+ * @Varargs: the arguments to insert in the output.
+ *
+ * A safer form of the standard sprintf() function. The output is guaranteed
+ * to not exceed @n characters (including the terminating nul character), so
+ * it is easy to ensure that a buffer overflow cannot occur.
+ *
+ * See also g_strdup_printf().
+ *
+ * In versions of GLib prior to 1.2.3, this function may return -1 if the
+ * output was truncated, and the truncated string may not be nul-terminated.
+ * In versions prior to 1.3.12, this function returns the length of the output
+ * string.
+ *
+ * The return value of g_snprintf() conforms to the snprintf()
+ * function as standardized in ISO C99. Note that this is different from
+ * traditional snprintf(), which returns the length of the output string.
+ *
+ * The format string may contain positional parameters, as specified in
+ * the Single Unix Specification.
+ *
+ * Returns: the number of characters which would be produced if the buffer
+ * was large enough.
+ **/
+gint
+g_snprintf (gchar *string,
+ gulong n,
+ gchar const *format,
+ ...)
+{
+ va_list args;
+ gint retval;
+
+ va_start (args, format);
+ retval = g_vsnprintf (string, n, format, args);
+ va_end (args);
+
+ return retval;
+}
+
+/**
+ * g_vprintf:
+ * @format: a standard printf() format string, but notice
+ * <link linkend="string-precision">string precision pitfalls</link>.
+ * @args: the list of arguments to insert in the output.
+ *
+ * An implementation of the standard vprintf() function which supports
+ * positional parameters, as specified in the Single Unix Specification.
+ *
+ * Returns: the number of characters printed.
+ *
+ * Since: 2.2
+ **/
+gint
+g_vprintf (gchar const *format,
+ va_list args)
+{
+ g_return_val_if_fail (format != NULL, -1);
+
+ return _g_vprintf (format, args);
+}
+
+/**
+ * g_vfprintf:
+ * @file: the stream to write to.
+ * @format: a standard printf() format string, but notice
+ * <link linkend="string-precision">string precision pitfalls</link>.
+ * @args: the list of arguments to insert in the output.
+ *
+ * An implementation of the standard fprintf() function which supports
+ * positional parameters, as specified in the Single Unix Specification.
+ *
+ * Returns: the number of characters printed.
+ *
+ * Since: 2.2
+ **/
+gint
+g_vfprintf (FILE *file,
+ gchar const *format,
+ va_list args)
+{
+ g_return_val_if_fail (format != NULL, -1);
+
+ return _g_vfprintf (file, format, args);
+}
+
+/**
+ * g_vsprintf:
+ * @string: the buffer to hold the output.
+ * @format: a standard printf() format string, but notice
+ * <link linkend="string-precision">string precision pitfalls</link>.
+ * @args: the list of arguments to insert in the output.
+ *
+ * An implementation of the standard vsprintf() function which supports
+ * positional parameters, as specified in the Single Unix Specification.
+ *
+ * Returns: the number of characters printed.
+ *
+ * Since: 2.2
+ **/
+gint
+g_vsprintf (gchar *string,
+ gchar const *format,
+ va_list args)
+{
+ g_return_val_if_fail (string != NULL, -1);
+ g_return_val_if_fail (format != NULL, -1);
+
+ return _g_vsprintf (string, format, args);
+}
+
+/**
+ * g_vsnprintf:
+ * @string: the buffer to hold the output.
+ * @n: the maximum number of characters to produce (including the
+ * terminating nul character).
+ * @format: a standard printf() format string, but notice
+ * <link linkend="string-precision">string precision pitfalls</link>.
+ * @args: the list of arguments to insert in the output.
+ *
+ * A safer form of the standard vsprintf() function. The output is guaranteed
+ * to not exceed @n characters (including the terminating nul character), so
+ * it is easy to ensure that a buffer overflow cannot occur.
+ *
+ * See also g_strdup_vprintf().
+ *
+ * In versions of GLib prior to 1.2.3, this function may return -1 if the
+ * output was truncated, and the truncated string may not be nul-terminated.
+ * In versions prior to 1.3.12, this function returns the length of the output
+ * string.
+ *
+ * The return value of g_vsnprintf() conforms to the vsnprintf() function
+ * as standardized in ISO C99. Note that this is different from traditional
+ * vsnprintf(), which returns the length of the output string.
+ *
+ * The format string may contain positional parameters, as specified in
+ * the Single Unix Specification.
+ *
+ * Returns: the number of characters which would be produced if the buffer
+ * was large enough.
+ */
+gint
+g_vsnprintf (gchar *string,
+ gulong n,
+ gchar const *format,
+ va_list args)
+{
+ g_return_val_if_fail (n == 0 || string != NULL, -1);
+ g_return_val_if_fail (format != NULL, -1);
+
+ return _g_vsnprintf (string, n, format, args);
+}
+
+/**
+ * g_vasprintf:
+ * @string: the return location for the newly-allocated string.
+ * @format: a standard printf() format string, but notice
+ * <link linkend="string-precision">string precision pitfalls</link>.
+ * @args: the list of arguments to insert in the output.
+ *
+ * An implementation of the GNU vasprintf() function which supports
+ * positional parameters, as specified in the Single Unix Specification.
+ * This function is similar to g_vsprintf(), except that it allocates a
+ * string to hold the output, instead of putting the output in a buffer
+ * you allocate in advance.
+ *
+ * Returns: the number of characters printed.
+ *
+ * Since: 2.4
+ **/
+gint
+g_vasprintf (gchar **string,
+ gchar const *format,
+ va_list args)
+{
+ gint len;
+ g_return_val_if_fail (string != NULL, -1);
+
+#if !defined(HAVE_GOOD_PRINTF)
+
+ len = _g_gnulib_vasprintf (string, format, args);
+ if (len < 0)
+ *string = NULL;
+
+#elif defined (HAVE_VASPRINTF)
+
+ len = vasprintf (string, format, args);
+ if (len < 0)
+ *string = NULL;
+ else if (!g_mem_is_system_malloc ())
+ {
+ /* vasprintf returns malloc-allocated memory */
+ gchar *string1 = g_strndup (*string, len);
+ free (*string);
+ *string = string1;
+ }
+
+#else
+
+ {
+ va_list args2;
+
+ G_VA_COPY (args2, args);
+
+ *string = g_new (gchar, g_printf_string_upper_bound (format, args));
+
+ len = _g_vsprintf (*string, format, args2);
+ va_end (args2);
+ }
+#endif
+
+ return len;
+}
+
+#define __G_PRINTF_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gprintf.h b/trunk/glib/gprintf.h
new file mode 100644
index 000000000..aa542b3dc
--- /dev/null
+++ b/trunk/glib/gprintf.h
@@ -0,0 +1,54 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997, 2002 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_PRINTF_H__
+#define __G_PRINTF_H__
+
+#include <glib/gtypes.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+G_BEGIN_DECLS
+
+gint g_printf (gchar const *format,
+ ...) G_GNUC_PRINTF (1, 2);
+gint g_fprintf (FILE *file,
+ gchar const *format,
+ ...) G_GNUC_PRINTF (2, 3);
+gint g_sprintf (gchar *string,
+ gchar const *format,
+ ...) G_GNUC_PRINTF (2, 3);
+
+gint g_vprintf (gchar const *format,
+ va_list args);
+gint g_vfprintf (FILE *file,
+ gchar const *format,
+ va_list args);
+gint g_vsprintf (gchar *string,
+ gchar const *format,
+ va_list args);
+gint g_vasprintf (gchar **string,
+ gchar const *format,
+ va_list args);
+
+G_END_DECLS
+
+#endif /* __G_PRINTF_H__ */
+
+
+
diff --git a/trunk/glib/gprintfint.h b/trunk/glib/gprintfint.h
new file mode 100644
index 000000000..0c975a1ee
--- /dev/null
+++ b/trunk/glib/gprintfint.h
@@ -0,0 +1,59 @@
+/* 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 2002. 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_PRINTFINT_H__
+#define __G_PRINTFINT_H__
+
+#ifdef HAVE_GOOD_PRINTF
+
+#define _g_printf printf
+#define _g_fprintf fprintf
+#define _g_sprintf sprintf
+#define _g_snprintf snprintf
+
+#define _g_vprintf vprintf
+#define _g_vfprintf vfprintf
+#define _g_vsprintf vsprintf
+#define _g_vsnprintf vsnprintf
+
+#else
+
+#include "gnulib/printf.h"
+
+#define _g_printf _g_gnulib_printf
+#define _g_fprintf _g_gnulib_fprintf
+#define _g_sprintf _g_gnulib_sprintf
+#define _g_snprintf _g_gnulib_snprintf
+
+#define _g_vprintf _g_gnulib_vprintf
+#define _g_vfprintf _g_gnulib_vfprintf
+#define _g_vsprintf _g_gnulib_vsprintf
+#define _g_vsnprintf _g_gnulib_vsnprintf
+
+#endif
+
+#endif /* __G_PRINTF_H__ */
+
diff --git a/trunk/glib/gqsort.c b/trunk/glib/gqsort.c
new file mode 100644
index 000000000..176d44a93
--- /dev/null
+++ b/trunk/glib/gqsort.c
@@ -0,0 +1,287 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1991, 1992, 1996, 1997,1999,2004 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 "config.h"
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "glib.h"
+#include "galias.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. */
+/* The stack needs log (total_elements) entries (we could even subtract
+ log(MAX_THRESH)). Since total_elements has type size_t, we get as
+ upper bound for log (total_elements):
+ bits per byte (CHAR_BIT) * sizeof(size_t). */
+#define STACK_SIZE (CHAR_BIT * sizeof(size_t))
+#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 SIZE_MAX is allocated on the
+ stack. Assuming a 32-bit (64 bit) integer for size_t, this needs
+ only 32 * sizeof(stack_node) == 256 bytes (for 64 bit: 1024 bytes).
+ 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 (total_elems)
+ 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,
+ gsize size,
+ GCompareDataFunc compare_func,
+ gpointer user_data)
+{
+ register char *base_ptr = (char *) pbase;
+
+ const size_t max_thresh = MAX_THRESH * size;
+
+ g_return_if_fail (total_elems >= 0);
+ g_return_if_fail (pbase != NULL || total_elems == 0);
+ g_return_if_fail (compare_func != NULL);
+
+ if (total_elems == 0)
+ /* Avoid lossage with unsigned arithmetic below. */
+ return;
+
+ if (total_elems > MAX_THRESH)
+ {
+ char *lo = base_ptr;
+ char *hi = &lo[size * (total_elems - 1)];
+ stack_node stack[STACK_SIZE];
+ stack_node *top = stack;
+
+ PUSH (NULL, NULL);
+
+ while (STACK_NOT_EMPTY)
+ {
+ char *left_ptr;
+ char *right_ptr;
+
+ /* 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 in
+ the while loops. */
+
+ 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:;
+
+ 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 *) mid, user_data) < 0)
+ left_ptr += size;
+
+ while ((*compare_func) ((void *) mid, (void *) right_ptr, user_data) < 0)
+ right_ptr -= size;
+
+ if (left_ptr < right_ptr)
+ {
+ SWAP (left_ptr, right_ptr, size);
+ if (mid == left_ptr)
+ mid = right_ptr;
+ else if (mid == right_ptr)
+ mid = left_ptr;
+ 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!). */
+
+#define min(x, y) ((x) < (y) ? (x) : (y))
+
+ {
+ 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;
+ }
+ }
+ }
+ }
+}
+
+#define __G_QSORT_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gqsort.h b/trunk/glib/gqsort.h
new file mode 100644
index 000000000..d0ff46a48
--- /dev/null
+++ b/trunk/glib/gqsort.h
@@ -0,0 +1,44 @@
+ /* 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 <glib/gtypes.h>
+
+G_BEGIN_DECLS
+
+void g_qsort_with_data (gconstpointer pbase,
+ gint total_elems,
+ gsize size,
+ GCompareDataFunc compare_func,
+ gpointer user_data);
+
+G_END_DECLS
+
+#endif /* __G_QSORT_H__ */
+
diff --git a/trunk/glib/gquark.h b/trunk/glib/gquark.h
new file mode 100644
index 000000000..fc3006ff1
--- /dev/null
+++ b/trunk/glib/gquark.h
@@ -0,0 +1,50 @@
+/* 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 <glib/gtypes.h>
+
+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_CONST_RETURN gchar* g_intern_string (const gchar *string);
+G_CONST_RETURN gchar* g_intern_static_string (const gchar *string);
+
+
+G_END_DECLS
+
+#endif /* __G_QUARK_H__ */
+
diff --git a/trunk/glib/gqueue.c b/trunk/glib/gqueue.c
new file mode 100644
index 000000000..1368e2614
--- /dev/null
+++ b/trunk/glib/gqueue.c
@@ -0,0 +1,1013 @@
+/* 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
+ */
+
+#include "config.h"
+
+#include "glib.h"
+#include "galias.h"
+
+/**
+ * g_queue_new:
+ *
+ * Creates a new #GQueue.
+ *
+ * Returns: a new #GQueue.
+ **/
+GQueue*
+g_queue_new (void)
+{
+ return g_slice_new0 (GQueue);
+}
+
+/**
+ * g_queue_free:
+ * @queue: a #GQueue.
+ *
+ * Frees the memory allocated for the #GQueue. Only call this function if
+ * @queue was created with g_queue_new(). If queue elements contain
+ * dynamically-allocated memory, they should be freed first.
+ **/
+void
+g_queue_free (GQueue *queue)
+{
+ g_return_if_fail (queue != NULL);
+
+ g_list_free (queue->head);
+ g_slice_free (GQueue, queue);
+}
+
+/**
+ * g_queue_init:
+ * @queue: an uninitialized #GQueue
+ *
+ * A statically-allocated #GQueue must be initialized with this function
+ * before it can be used. Alternatively you can initialize it with
+ * #G_QUEUE_INIT. It is not necessary to initialize queues created with
+ * g_queue_new().
+ *
+ * Since: 2.14
+ **/
+void
+g_queue_init (GQueue *queue)
+{
+ g_return_if_fail (queue != NULL);
+
+ queue->head = queue->tail = NULL;
+ queue->length = 0;
+}
+
+/**
+ * g_queue_clear:
+ * @queue: a #GQueue
+ *
+ * Removes all the elements in @queue. If queue elements contain
+ * dynamically-allocated memory, they should be freed first.
+ *
+ * Since: 2.14
+ */
+void
+g_queue_clear (GQueue *queue)
+{
+ g_return_if_fail (queue != NULL);
+
+ g_list_free (queue->head);
+ g_queue_init (queue);
+}
+
+/**
+ * g_queue_is_empty:
+ * @queue: a #GQueue.
+ *
+ * Returns %TRUE if the queue is empty.
+ *
+ * Returns: %TRUE if the queue is empty.
+ **/
+gboolean
+g_queue_is_empty (GQueue *queue)
+{
+ g_return_val_if_fail (queue != NULL, TRUE);
+
+ return queue->head == NULL;
+}
+
+/**
+ * g_queue_get_length:
+ * @queue: a #GQueue
+ *
+ * Returns the number of items in @queue.
+ *
+ * Return value: The number of items in @queue.
+ *
+ * Since: 2.4
+ **/
+guint
+g_queue_get_length (GQueue *queue)
+{
+ g_return_val_if_fail (queue != NULL, 0);
+
+ return queue->length;
+}
+
+/**
+ * g_queue_reverse:
+ * @queue: a #GQueue
+ *
+ * Reverses the order of the items in @queue.
+ *
+ * Since: 2.4
+ **/
+void
+g_queue_reverse (GQueue *queue)
+{
+ g_return_if_fail (queue != NULL);
+
+ queue->tail = queue->head;
+ queue->head = g_list_reverse (queue->head);
+}
+
+/**
+ * g_queue_copy:
+ * @queue: a #GQueue
+ *
+ * Copies a @queue. Note that is a shallow copy. If the elements in the
+ * queue consist of pointers to data, the pointers are copied, but the
+ * actual data is not.
+ *
+ * Return value: A copy of @queue
+ *
+ * Since: 2.4
+ **/
+GQueue *
+g_queue_copy (GQueue *queue)
+{
+ GQueue *result;
+ GList *list;
+
+ g_return_val_if_fail (queue != NULL, NULL);
+
+ result = g_queue_new ();
+
+ for (list = queue->head; list != NULL; list = list->next)
+ g_queue_push_tail (result, list->data);
+
+ return result;
+}
+
+/**
+ * g_queue_foreach:
+ * @queue: a #GQueue
+ * @func: the function to call for each element's data
+ * @user_data: user data to pass to @func
+ *
+ * Calls @func for each element in the queue passing @user_data to the
+ * function.
+ *
+ * Since: 2.4
+ **/
+void
+g_queue_foreach (GQueue *queue,
+ GFunc func,
+ gpointer user_data)
+{
+ GList *list;
+
+ g_return_if_fail (queue != NULL);
+ g_return_if_fail (func != NULL);
+
+ list = queue->head;
+ while (list)
+ {
+ GList *next = list->next;
+ func (list->data, user_data);
+ list = next;
+ }
+}
+
+/**
+ * g_queue_find:
+ * @queue: a #GQueue
+ * @data: data to find
+ *
+ * Finds the first link in @queue which contains @data.
+ *
+ * Return value: The first link in @queue which contains @data.
+ *
+ * Since: 2.4
+ **/
+GList *
+g_queue_find (GQueue *queue,
+ gconstpointer data)
+{
+ g_return_val_if_fail (queue != NULL, NULL);
+
+ return g_list_find (queue->head, data);
+}
+
+/**
+ * g_queue_find_custom:
+ * @queue: a #GQueue
+ * @data: user data passed to @func
+ * @func: a #GCompareFunc to call for each element. It should return 0
+ * when the desired element is found
+ *
+ * Finds an element in a #GQueue, using a supplied function to find the
+ * desired element. It iterates over the queue, calling the given function
+ * which should return 0 when the desired element is found. The function
+ * takes two gconstpointer arguments, the #GQueue element's data as the
+ * first argument and the given user data as the second argument.
+ *
+ * Return value: The found link, or %NULL if it wasn't found
+ *
+ * Since: 2.4
+ **/
+GList *
+g_queue_find_custom (GQueue *queue,
+ gconstpointer data,
+ GCompareFunc func)
+{
+ g_return_val_if_fail (queue != NULL, NULL);
+ g_return_val_if_fail (func != NULL, NULL);
+
+ return g_list_find_custom (queue->head, data, func);
+}
+
+/**
+ * g_queue_sort:
+ * @queue: a #GQueue
+ * @compare_func: the #GCompareDataFunc used to sort @queue. This function
+ * is passed two elements of the queue and should return 0 if they are
+ * equal, a negative value if the first comes before the second, and
+ * a positive value if the second comes before the first.
+ * @user_data: user data passed to @compare_func
+ *
+ * Sorts @queue using @compare_func.
+ *
+ * Since: 2.4
+ **/
+void
+g_queue_sort (GQueue *queue,
+ GCompareDataFunc compare_func,
+ gpointer user_data)
+{
+ g_return_if_fail (queue != NULL);
+ g_return_if_fail (compare_func != NULL);
+
+ queue->head = g_list_sort_with_data (queue->head, compare_func, user_data);
+ queue->tail = g_list_last (queue->head);
+}
+
+/**
+ * g_queue_push_head:
+ * @queue: a #GQueue.
+ * @data: the data for the new element.
+ *
+ * Adds a new element at the head of the queue.
+ **/
+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++;
+}
+
+/**
+ * g_queue_push_nth:
+ * @queue: a #GQueue
+ * @data: the data for the new element
+ * @n: the position to insert the new element. If @n is negative or
+ * larger than the number of elements in the @queue, the element is
+ * added to the end of the queue.
+ *
+ * Inserts a new element into @queue at the given position
+ *
+ * Since: 2.4
+ **/
+void
+g_queue_push_nth (GQueue *queue,
+ gpointer data,
+ gint n)
+{
+ g_return_if_fail (queue != NULL);
+
+ if (n < 0 || n >= queue->length)
+ {
+ g_queue_push_tail (queue, data);
+ return;
+ }
+
+ g_queue_insert_before (queue, g_queue_peek_nth_link (queue, n), data);
+}
+
+/**
+ * g_queue_push_head_link:
+ * @queue: a #GQueue.
+ * @link_: a single #GList element, <emphasis>not</emphasis> a list with
+ * more than one element.
+ *
+ * Adds a new element at the head of the queue.
+ **/
+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++;
+}
+
+/**
+ * g_queue_push_tail:
+ * @queue: a #GQueue.
+ * @data: the data for the new element.
+ *
+ * Adds a new element at the tail of the queue.
+ **/
+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++;
+}
+
+/**
+ * g_queue_push_tail_link:
+ * @queue: a #GQueue.
+ * @link_: a single #GList element, <emphasis>not</emphasis> a list with
+ * more than one element.
+ *
+ * Adds a new element at the tail of the queue.
+ **/
+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++;
+}
+
+/**
+ * g_queue_push_nth_link:
+ * @queue: a #GQueue
+ * @n: the position to insert the link. If this is negative or larger than
+ * the number of elements in @queue, the link is added to the end of
+ * @queue.
+ * @link_: the link to add to @queue
+ *
+ * Inserts @link into @queue at the given position.
+ *
+ * Since: 2.4
+ **/
+void
+g_queue_push_nth_link (GQueue *queue,
+ gint n,
+ GList *link_)
+{
+ GList *next;
+ GList *prev;
+
+ g_return_if_fail (queue != NULL);
+ g_return_if_fail (link_ != NULL);
+
+ if (n < 0 || n >= queue->length)
+ {
+ g_queue_push_tail_link (queue, link_);
+ return;
+ }
+
+ g_assert (queue->head);
+ g_assert (queue->tail);
+
+ next = g_queue_peek_nth_link (queue, n);
+ prev = next->prev;
+
+ if (prev)
+ prev->next = link_;
+ next->prev = link_;
+
+ link_->next = next;
+ link_->prev = prev;
+
+ if (queue->head->prev)
+ queue->head = queue->head->prev;
+
+ if (queue->tail->next)
+ queue->tail = queue->tail->next;
+
+ queue->length++;
+}
+
+/**
+ * g_queue_pop_head:
+ * @queue: a #GQueue.
+ *
+ * Removes the first element of the queue.
+ *
+ * Returns: the data of the first element in the queue, or %NULL if the queue
+ * is empty.
+ **/
+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;
+}
+
+/**
+ * g_queue_pop_head_link:
+ * @queue: a #GQueue.
+ *
+ * Removes the first element of the queue.
+ *
+ * Returns: the #GList element at the head of the queue, or %NULL if the queue
+ * is empty.
+ **/
+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;
+}
+
+/**
+ * g_queue_peek_head_link:
+ * @queue: a #GQueue
+ *
+ * Returns the first link in @queue
+ *
+ * Return value: the first link in @queue, or %NULL if @queue is empty
+ *
+ * Since: 2.4
+ **/
+GList*
+g_queue_peek_head_link (GQueue *queue)
+{
+ g_return_val_if_fail (queue != NULL, NULL);
+
+ return queue->head;
+}
+
+/**
+ * g_queue_peek_tail_link:
+ * @queue: a #GQueue
+ *
+ * Returns the last link @queue.
+ *
+ * Return value: the last link in @queue, or %NULL if @queue is empty
+ *
+ * Since: 2.4
+ **/
+GList*
+g_queue_peek_tail_link (GQueue *queue)
+{
+ g_return_val_if_fail (queue != NULL, NULL);
+
+ return queue->tail;
+}
+
+/**
+ * g_queue_pop_tail:
+ * @queue: a #GQueue.
+ *
+ * Removes the last element of the queue.
+ *
+ * Returns: the data of the last element in the queue, or %NULL if the queue
+ * is empty.
+ **/
+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;
+}
+
+/**
+ * g_queue_pop_nth:
+ * @queue: a #GQueue
+ * @n: the position of the element.
+ *
+ * Removes the @n'th element of @queue.
+ *
+ * Return value: the element's data, or %NULL if @n is off the end of @queue.
+ *
+ * Since: 2.4
+ **/
+gpointer
+g_queue_pop_nth (GQueue *queue,
+ guint n)
+{
+ GList *nth_link;
+ gpointer result;
+
+ g_return_val_if_fail (queue != NULL, NULL);
+
+ if (n >= queue->length)
+ return NULL;
+
+ nth_link = g_queue_peek_nth_link (queue, n);
+ result = nth_link->data;
+
+ g_queue_delete_link (queue, nth_link);
+
+ return result;
+}
+
+/**
+ * g_queue_pop_tail_link:
+ * @queue: a #GQueue.
+ *
+ * Removes the last element of the queue.
+ *
+ * Returns: the #GList element at the tail of the queue, or %NULL if the queue
+ * is empty.
+ **/
+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;
+}
+
+/**
+ * g_queue_pop_nth_link:
+ * @queue: a #GQueue
+ * @n: the link's position
+ *
+ * Removes and returns the link at the given position.
+ *
+ * Return value: The @n'th link, or %NULL if @n is off the end of @queue.
+ *
+ * Since: 2.4
+ **/
+GList*
+g_queue_pop_nth_link (GQueue *queue,
+ guint n)
+{
+ GList *link;
+
+ g_return_val_if_fail (queue != NULL, NULL);
+
+ if (n >= queue->length)
+ return NULL;
+
+ link = g_queue_peek_nth_link (queue, n);
+ g_queue_unlink (queue, link);
+
+ return link;
+}
+
+/**
+ * g_queue_peek_nth_link:
+ * @queue: a #GQueue
+ * @n: the position of the link
+ *
+ * Returns the link at the given position
+ *
+ * Return value: The link at the @n'th position, or %NULL if @n is off the
+ * end of the list
+ *
+ * Since: 2.4
+ **/
+GList *
+g_queue_peek_nth_link (GQueue *queue,
+ guint n)
+{
+ GList *link;
+ gint i;
+
+ g_return_val_if_fail (queue != NULL, NULL);
+
+ if (n >= queue->length)
+ return NULL;
+
+ if (n > queue->length / 2)
+ {
+ n = queue->length - n - 1;
+
+ link = queue->tail;
+ for (i = 0; i < n; ++i)
+ link = link->prev;
+ }
+ else
+ {
+ link = queue->head;
+ for (i = 0; i < n; ++i)
+ link = link->next;
+ }
+
+ return link;
+}
+
+/**
+ * g_queue_link_index:
+ * @queue: a #Gqueue
+ * @link_: A #GList link
+ *
+ * Returns the position of @link_ in @queue.
+ *
+ * Return value: The position of @link_, or -1 if the link is
+ * not part of @queue
+ *
+ * Since: 2.4
+ **/
+gint
+g_queue_link_index (GQueue *queue,
+ GList *link_)
+{
+ g_return_val_if_fail (queue != NULL, -1);
+
+ return g_list_position (queue->head, link_);
+}
+
+/**
+ * g_queue_unlink
+ * @queue: a #GQueue
+ * @link_: a #GList link that <emphasis>must</emphasis> be part of @queue
+ *
+ * Unlinks @link_ so that it will no longer be part of @queue. The link is
+ * not freed.
+ *
+ * @link_ must be part of @queue,
+ *
+ * Since: 2.4
+ **/
+void
+g_queue_unlink (GQueue *queue,
+ GList *link_)
+{
+ g_return_if_fail (queue != NULL);
+ g_return_if_fail (link_ != NULL);
+
+ if (link_ == queue->tail)
+ queue->tail = queue->tail->prev;
+
+ queue->head = g_list_remove_link (queue->head, link_);
+ queue->length--;
+}
+
+/**
+ * g_queue_delete_link:
+ * @queue: a #GQueue
+ * @link_: a #GList link that <emphasis>must</emphasis> be part of @queue
+ *
+ * Removes @link_ from @queue and frees it.
+ *
+ * @link_ must be part of @queue.
+ *
+ * Since: 2.4
+ **/
+void
+g_queue_delete_link (GQueue *queue,
+ GList *link_)
+{
+ g_return_if_fail (queue != NULL);
+ g_return_if_fail (link_ != NULL);
+
+ g_queue_unlink (queue, link_);
+ g_list_free (link_);
+}
+
+/**
+ * g_queue_peek_head:
+ * @queue: a #GQueue.
+ *
+ * Returns the first element of the queue.
+ *
+ * Returns: the data of the first element in the queue, or %NULL if the queue
+ * is empty.
+ **/
+gpointer
+g_queue_peek_head (GQueue *queue)
+{
+ g_return_val_if_fail (queue != NULL, NULL);
+
+ return queue->head ? queue->head->data : NULL;
+}
+
+/**
+ * g_queue_peek_tail:
+ * @queue: a #GQueue.
+ *
+ * Returns the last element of the queue.
+ *
+ * Returns: the data of the last element in the queue, or %NULL if the queue
+ * is empty.
+ **/
+gpointer
+g_queue_peek_tail (GQueue *queue)
+{
+ g_return_val_if_fail (queue != NULL, NULL);
+
+ return queue->tail ? queue->tail->data : NULL;
+}
+
+/**
+ * g_queue_peek_nth:
+ * @queue: a #GQueue
+ * @n: the position of the element.
+ *
+ * Returns the @n'th element of @queue.
+ *
+ * Return value: The data for the @n'th element of @queue, or %NULL if @n is
+ * off the end of @queue.
+ *
+ * Since: 2.4
+ **/
+gpointer
+g_queue_peek_nth (GQueue *queue,
+ guint n)
+{
+ GList *link;
+
+ g_return_val_if_fail (queue != NULL, NULL);
+
+ link = g_queue_peek_nth_link (queue, n);
+
+ if (link)
+ return link->data;
+
+ return NULL;
+}
+
+/**
+ * g_queue_index:
+ * @queue: a #GQueue
+ * @data: the data to find.
+ *
+ * Returns the position of the first element in @queue which contains @data.
+ *
+ * Return value: The position of the first element in @queue which contains @data, or -1 if no element in @queue contains @data.
+ *
+ * Since: 2.4
+ **/
+gint
+g_queue_index (GQueue *queue,
+ gconstpointer data)
+{
+ g_return_val_if_fail (queue != NULL, -1);
+
+ return g_list_index (queue->head, data);
+}
+
+/**
+ * g_queue_remove:
+ * @queue: a #GQueue
+ * @data: data to remove.
+ *
+ * Removes the first element in @queue that contains @data.
+ *
+ * Since: 2.4
+ **/
+void
+g_queue_remove (GQueue *queue,
+ gconstpointer data)
+{
+ GList *link;
+
+ g_return_if_fail (queue != NULL);
+
+ link = g_list_find (queue->head, data);
+
+ if (link)
+ g_queue_delete_link (queue, link);
+}
+
+/**
+ * g_queue_remove_all:
+ * @queue: a #GQueue
+ * @data: data to remove
+ *
+ * Remove all elemeents in @queue which contains @data.
+ *
+ * Since: 2.4
+ **/
+void
+g_queue_remove_all (GQueue *queue,
+ gconstpointer data)
+{
+ GList *list;
+
+ g_return_if_fail (queue != NULL);
+
+ list = queue->head;
+ while (list)
+ {
+ GList *next = list->next;
+
+ if (list->data == data)
+ g_queue_delete_link (queue, list);
+
+ list = next;
+ }
+}
+
+/**
+ * g_queue_insert_before:
+ * @queue: a #GQueue
+ * @sibling: a #GList link that <emphasis>must</emphasis> be part of @queue
+ * @data: the data to insert
+ *
+ * Inserts @data into @queue before @sibling.
+ *
+ * @sibling must be part of @queue.
+ *
+ * Since: 2.4
+ **/
+void
+g_queue_insert_before (GQueue *queue,
+ GList *sibling,
+ gpointer data)
+{
+ g_return_if_fail (queue != NULL);
+ g_return_if_fail (sibling != NULL);
+
+ queue->head = g_list_insert_before (queue->head, sibling, data);
+ queue->length++;
+}
+
+/**
+ * g_queue_insert_after:
+ * @queue: a #GQueue
+ * @sibling: a #GList link that <emphasis>must</emphasis> be part of @queue
+ * @data: the data to insert
+ *
+ * Inserts @data into @queue after @sibling
+ *
+ * @sibling must be part of @queue
+ *
+ * Since: 2.4
+ **/
+void
+g_queue_insert_after (GQueue *queue,
+ GList *sibling,
+ gpointer data)
+{
+ g_return_if_fail (queue != NULL);
+ g_return_if_fail (sibling != NULL);
+
+ if (sibling == queue->tail)
+ g_queue_push_tail (queue, data);
+ else
+ g_queue_insert_before (queue, sibling->next, data);
+}
+
+/**
+ * g_queue_insert_sorted:
+ * @queue: a #GQueue
+ * @data: the data to insert
+ * @func: the #GCompareDataFunc used to compare elements in the queue. It is
+ * called with two elements of the @queue and @user_data. It should
+ * return 0 if the elements are equal, a negative value if the first
+ * element comes before the second, and a positive value if the second
+ * element comes before the first.
+ * @user_data: user data passed to @func.
+ *
+ * Inserts @data into @queue using @func to determine the new position.
+ *
+ * Since: 2.4
+ **/
+void
+g_queue_insert_sorted (GQueue *queue,
+ gpointer data,
+ GCompareDataFunc func,
+ gpointer user_data)
+{
+ GList *list;
+
+ g_return_if_fail (queue != NULL);
+
+ list = queue->head;
+ while (list && func (list->data, data, user_data) < 0)
+ list = list->next;
+
+ if (list)
+ g_queue_insert_before (queue, list, data);
+ else
+ g_queue_push_tail (queue, data);
+}
+
+#define __G_QUEUE_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gqueue.h b/trunk/glib/gqueue.h
new file mode 100644
index 000000000..c4004514d
--- /dev/null
+++ b/trunk/glib/gqueue.h
@@ -0,0 +1,123 @@
+/* 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 <glib/glist.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GQueue GQueue;
+
+struct _GQueue
+{
+ GList *head;
+ GList *tail;
+ guint length;
+};
+
+#define G_QUEUE_INIT { NULL, NULL, 0 }
+
+/* Queues
+ */
+GQueue* g_queue_new (void);
+void g_queue_free (GQueue *queue);
+void g_queue_init (GQueue *queue);
+void g_queue_clear (GQueue *queue);
+gboolean g_queue_is_empty (GQueue *queue);
+guint g_queue_get_length (GQueue *queue);
+void g_queue_reverse (GQueue *queue);
+GQueue * g_queue_copy (GQueue *queue);
+void g_queue_foreach (GQueue *queue,
+ GFunc func,
+ gpointer user_data);
+GList * g_queue_find (GQueue *queue,
+ gconstpointer data);
+GList * g_queue_find_custom (GQueue *queue,
+ gconstpointer data,
+ GCompareFunc func);
+void g_queue_sort (GQueue *queue,
+ GCompareDataFunc compare_func,
+ gpointer user_data);
+
+void g_queue_push_head (GQueue *queue,
+ gpointer data);
+void g_queue_push_tail (GQueue *queue,
+ gpointer data);
+void g_queue_push_nth (GQueue *queue,
+ gpointer data,
+ gint n);
+gpointer g_queue_pop_head (GQueue *queue);
+gpointer g_queue_pop_tail (GQueue *queue);
+gpointer g_queue_pop_nth (GQueue *queue,
+ guint n);
+gpointer g_queue_peek_head (GQueue *queue);
+gpointer g_queue_peek_tail (GQueue *queue);
+gpointer g_queue_peek_nth (GQueue *queue,
+ guint n);
+gint g_queue_index (GQueue *queue,
+ gconstpointer data);
+void g_queue_remove (GQueue *queue,
+ gconstpointer data);
+void g_queue_remove_all (GQueue *queue,
+ gconstpointer data);
+void g_queue_insert_before (GQueue *queue,
+ GList *sibling,
+ gpointer data);
+void g_queue_insert_after (GQueue *queue,
+ GList *sibling,
+ gpointer data);
+void g_queue_insert_sorted (GQueue *queue,
+ gpointer data,
+ GCompareDataFunc func,
+ gpointer user_data);
+
+void g_queue_push_head_link (GQueue *queue,
+ GList *link_);
+void g_queue_push_tail_link (GQueue *queue,
+ GList *link_);
+void g_queue_push_nth_link (GQueue *queue,
+ gint n,
+ GList *link_);
+GList* g_queue_pop_head_link (GQueue *queue);
+GList* g_queue_pop_tail_link (GQueue *queue);
+GList* g_queue_pop_nth_link (GQueue *queue,
+ guint n);
+GList* g_queue_peek_head_link (GQueue *queue);
+GList* g_queue_peek_tail_link (GQueue *queue);
+GList* g_queue_peek_nth_link (GQueue *queue,
+ guint n);
+gint g_queue_link_index (GQueue *queue,
+ GList *link_);
+void g_queue_unlink (GQueue *queue,
+ GList *link_);
+void g_queue_delete_link (GQueue *queue,
+ GList *link_);
+
+G_END_DECLS
+
+#endif /* __G_QUEUE_H__ */
diff --git a/trunk/glib/grand.c b/trunk/glib/grand.c
new file mode 100644
index 000000000..55f897002
--- /dev/null
+++ b/trunk/glib/grand.c
@@ -0,0 +1,635 @@
+/* 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 <matumoto@math.keio.ac.jp>, 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.sci.hiroshima-u.ac.jp/~m-mat/MT/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 "config.h"
+
+#include <math.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "glib.h"
+#include "gthreadprivate.h"
+#include "galias.h"
+
+#ifdef G_OS_WIN32
+#include <process.h> /* For getpid() */
+#endif
+
+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)
+
+static guint
+get_random_version (void)
+{
+ static gboolean initialized = FALSE;
+ static guint random_version;
+
+ if (!initialized)
+ {
+ const gchar *version_string = g_getenv ("G_RANDOM_VERSION");
+ if (!version_string || version_string[0] == '\000' ||
+ strcmp (version_string, "2.2") == 0)
+ random_version = 22;
+ else if (strcmp (version_string, "2.0") == 0)
+ random_version = 20;
+ else
+ {
+ g_warning ("Unknown G_RANDOM_VERSION \"%s\". Using version 2.2.",
+ version_string);
+ random_version = 22;
+ }
+ initialized = TRUE;
+ }
+
+ return random_version;
+}
+
+/* This is called from g_thread_init(). It's used to
+ * initialize some static data in a threadsafe way.
+ */
+void
+_g_rand_thread_init (void)
+{
+ (void)get_random_version ();
+}
+
+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_with_seed_array:
+ * @seed: an array of seeds to initialize the random number generator.
+ * @seed_length: an array of seeds to initialize the random number generator.
+ *
+ * Creates a new random number generator initialized with @seed.
+ *
+ * Return value: the new #GRand.
+ *
+ * Since: 2.4
+ **/
+GRand*
+g_rand_new_with_seed_array (const guint32 *seed, guint seed_length)
+{
+ GRand *rand = g_new0 (GRand, 1);
+ g_rand_set_seed_array (rand, seed, seed_length);
+ return rand;
+}
+
+/**
+ * g_rand_new:
+ *
+ * Creates a new random number generator initialized with a seed taken
+ * either from <filename>/dev/urandom</filename> (if existing) or from
+ * the current time (as a fallback).
+ *
+ * Return value: the new #GRand.
+ **/
+GRand*
+g_rand_new (void)
+{
+ guint32 seed[4];
+ GTimeVal now;
+#ifdef G_OS_UNIX
+ static gboolean dev_urandom_exists = TRUE;
+
+ if (dev_urandom_exists)
+ {
+ FILE* dev_urandom;
+
+ do
+ {
+ errno = 0;
+ dev_urandom = fopen("/dev/urandom", "rb");
+ }
+ while G_UNLIKELY (errno == EINTR);
+
+ if (dev_urandom)
+ {
+ int r;
+
+ do
+ {
+ errno = 0;
+ r = fread (seed, sizeof (seed), 1, dev_urandom);
+ }
+ while G_UNLIKELY (errno == EINTR);
+
+ if (r != 1)
+ dev_urandom_exists = FALSE;
+
+ fclose (dev_urandom);
+ }
+ else
+ dev_urandom_exists = FALSE;
+ }
+#else
+ static gboolean dev_urandom_exists = FALSE;
+#endif
+
+ if (!dev_urandom_exists)
+ {
+ g_get_current_time (&now);
+ seed[0] = now.tv_sec;
+ seed[1] = now.tv_usec;
+ seed[2] = getpid ();
+#ifdef G_OS_UNIX
+ seed[3] = getppid ();
+#else
+ seed[3] = 0;
+#endif
+ }
+
+ return g_rand_new_with_seed_array (seed, 4);
+}
+
+/**
+ * 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_copy:
+ * @rand_: a #GRand.
+ *
+ * Copies a #GRand into a new one with the same exact state as before.
+ * This way you can take a snapshot of the random number generator for
+ * replaying later.
+ *
+ * Return value: the new #GRand.
+ *
+ * Since: 2.4
+ **/
+GRand *
+g_rand_copy (GRand* rand)
+{
+ GRand* new_rand;
+
+ g_return_val_if_fail (rand != NULL, NULL);
+
+ new_rand = g_new0 (GRand, 1);
+ memcpy (new_rand, rand, sizeof (GRand));
+
+ return new_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);
+
+ switch (get_random_version ())
+ {
+ case 20:
+ /* 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;
+ for (rand->mti=1; rand->mti<N; rand->mti++)
+ rand->mt[rand->mti] = (69069 * rand->mt[rand->mti-1]);
+
+ break;
+ case 22:
+ /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
+ /* In the previous version (see above), MSBs of the */
+ /* seed affect only MSBs of the array mt[]. */
+
+ rand->mt[0]= seed;
+ for (rand->mti=1; rand->mti<N; rand->mti++)
+ rand->mt[rand->mti] = 1812433253UL *
+ (rand->mt[rand->mti-1] ^ (rand->mt[rand->mti-1] >> 30)) + rand->mti;
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+/**
+ * g_rand_set_seed_array:
+ * @rand_: a #GRand.
+ * @seed: array to initialize with
+ * @seed_length: length of array
+ *
+ * Initializes the random number generator by an array of
+ * longs. Array can be of arbitrary size, though only the
+ * first 624 values are taken. This function is useful
+ * if you have many low entropy seeds, or if you require more then
+ * 32bits of actual entropy for your application.
+ *
+ * Since: 2.4
+ **/
+void
+g_rand_set_seed_array (GRand* rand, const guint32 *seed, guint seed_length)
+{
+ int i, j, k;
+
+ g_return_if_fail (rand != NULL);
+ g_return_if_fail (seed_length >= 1);
+
+ g_rand_set_seed (rand, 19650218UL);
+
+ i=1; j=0;
+ k = (N>seed_length ? N : seed_length);
+ for (; k; k--)
+ {
+ rand->mt[i] = (rand->mt[i] ^
+ ((rand->mt[i-1] ^ (rand->mt[i-1] >> 30)) * 1664525UL))
+ + seed[j] + j; /* non linear */
+ rand->mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */
+ i++; j++;
+ if (i>=N)
+ {
+ rand->mt[0] = rand->mt[N-1];
+ i=1;
+ }
+ if (j>=seed_length)
+ j=0;
+ }
+ for (k=N-1; k; k--)
+ {
+ rand->mt[i] = (rand->mt[i] ^
+ ((rand->mt[i-1] ^ (rand->mt[i-1] >> 30)) * 1566083941UL))
+ - i; /* non linear */
+ rand->mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */
+ i++;
+ if (i>=N)
+ {
+ rand->mt[0] = rand->mt[N-1];
+ i=1;
+ }
+ }
+
+ rand->mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */
+}
+
+/**
+ * g_rand_int:
+ * @rand_: a #GRand.
+ *
+ * Returns the next random #guint32 from @rand_ equally 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;kk<N-M;kk++) {
+ y = (rand->mt[kk]&UPPER_MASK)|(rand->mt[kk+1]&LOWER_MASK);
+ rand->mt[kk] = rand->mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1];
+ }
+ for (;kk<N-1;kk++) {
+ y = (rand->mt[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.
+ *
+ * Returns the next random #gint32 from @rand_ equally 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);
+
+ switch (get_random_version ())
+ {
+ case 20:
+ 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);
+ }
+ break;
+ case 22:
+ if (dist == 0)
+ random = 0;
+ else
+ {
+ /* maxvalue is set to the predecessor of the greatest
+ * multiple of dist less or equal 2^32. */
+ guint32 maxvalue;
+ if (dist <= 0x80000000u) /* 2^31 */
+ {
+ /* maxvalue = 2^32 - 1 - (2^32 % dist) */
+ guint32 leftover = (0x80000000u % dist) * 2;
+ if (leftover >= dist) leftover -= dist;
+ maxvalue = 0xffffffffu - leftover;
+ }
+ else
+ maxvalue = dist - 1;
+
+ do
+ random = g_rand_int (rand);
+ while (random > maxvalue);
+
+ random %= dist;
+ }
+ break;
+ default:
+ random = 0; /* Quiet GCC */
+ g_assert_not_reached ();
+ }
+
+ return begin + random;
+}
+
+/**
+ * g_rand_double:
+ * @rand_: a #GRand.
+ *
+ * Returns the next random #gdouble from @rand_ equally 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.
+ *
+ * Returns the next random #gdouble from @rand_ equally 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 equally 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.
+ *
+ * Returns a random #gint32 equally 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:
+ *
+ * Returns a random #gdouble equally 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.
+ *
+ * Returns a random #gdouble equally 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 the <function>g_random_*</function> 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);
+}
+
+
+#define __G_RAND_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/grand.h b/trunk/glib/grand.h
new file mode 100644
index 000000000..cb6887bcf
--- /dev/null
+++ b/trunk/glib/grand.h
@@ -0,0 +1,87 @@
+/* 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 <glib/gtypes.h>
+
+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_with_seed_array (const guint32 *seed,
+ guint seed_length);
+GRand* g_rand_new (void);
+void g_rand_free (GRand *rand_);
+GRand* g_rand_copy (GRand *rand_);
+void g_rand_set_seed (GRand *rand_,
+ guint32 seed);
+void g_rand_set_seed_array (GRand *rand_,
+ const guint32 *seed,
+ guint seed_length);
+
+#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/trunk/glib/gregex.c b/trunk/glib/gregex.c
new file mode 100644
index 000000000..52ea980c7
--- /dev/null
+++ b/trunk/glib/gregex.c
@@ -0,0 +1,2454 @@
+/* GRegex -- regular expression API wrapper around PCRE.
+ *
+ * Copyright (C) 1999, 2000 Scott Wimer
+ * Copyright (C) 2004, Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2005 - 2007, Marco Barisione <marco@barisione.org>
+ *
+ * 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.1 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <config.h>
+
+#include "gregex.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <string.h>
+
+#ifdef USE_SYSTEM_PCRE
+#include <pcre.h>
+#else
+#include "pcre/pcre.h"
+#endif
+
+#include "galias.h"
+
+/* Mask of all the possible values for GRegexCompileFlags. */
+#define G_REGEX_COMPILE_MASK (G_REGEX_CASELESS | \
+ G_REGEX_MULTILINE | \
+ G_REGEX_DOTALL | \
+ G_REGEX_EXTENDED | \
+ G_REGEX_ANCHORED | \
+ G_REGEX_DOLLAR_ENDONLY | \
+ G_REGEX_UNGREEDY | \
+ G_REGEX_RAW | \
+ G_REGEX_NO_AUTO_CAPTURE | \
+ G_REGEX_OPTIMIZE | \
+ G_REGEX_DUPNAMES | \
+ G_REGEX_NEWLINE_CR | \
+ G_REGEX_NEWLINE_LF | \
+ G_REGEX_NEWLINE_CRLF)
+
+/* Mask of all the possible values for GRegexMatchFlags. */
+#define G_REGEX_MATCH_MASK (G_REGEX_MATCH_ANCHORED | \
+ G_REGEX_MATCH_NOTBOL | \
+ G_REGEX_MATCH_NOTEOL | \
+ G_REGEX_MATCH_NOTEMPTY | \
+ G_REGEX_MATCH_PARTIAL | \
+ G_REGEX_MATCH_NEWLINE_CR | \
+ G_REGEX_MATCH_NEWLINE_LF | \
+ G_REGEX_MATCH_NEWLINE_CRLF | \
+ G_REGEX_MATCH_NEWLINE_ANY)
+
+/* if the string is in UTF-8 use g_utf8_ functions, else use
+ * use just +/- 1. */
+#define NEXT_CHAR(re, s) (((re)->compile_opts & PCRE_UTF8) ? \
+ g_utf8_next_char (s) : \
+ ((s) + 1))
+#define PREV_CHAR(re, s) (((re)->compile_opts & PCRE_UTF8) ? \
+ g_utf8_prev_char (s) : \
+ ((s) - 1))
+
+struct _GMatchInfo
+{
+ GRegex *regex; /* the regex */
+ GRegexMatchFlags match_opts; /* options used at match time on the regex */
+ gint matches; /* number of matching sub patterns */
+ gint pos; /* position in the string where last match left off */
+ gint *offsets; /* array of offsets paired 0,1 ; 2,3 ; 3,4 etc */
+ gint n_offsets; /* number of offsets */
+ gint *workspace; /* workspace for pcre_dfa_exec() */
+ gint n_workspace; /* number of workspace elements */
+ const gchar *string; /* string passed to the match function */
+ gssize string_len; /* length of string */
+};
+
+struct _GRegex
+{
+ volatile guint ref_count; /* the ref count for the immutable part */
+ gchar *pattern; /* the pattern */
+ pcre *pcre_re; /* compiled form of the pattern */
+ GRegexCompileFlags compile_opts; /* options used at compile time on the pattern */
+ GRegexMatchFlags match_opts; /* options used at match time on the regex */
+ pcre_extra *extra; /* data stored when G_REGEX_OPTIMIZE is used */
+};
+
+/* TRUE if ret is an error code, FALSE otherwise. */
+#define IS_PCRE_ERROR(ret) ((ret) < PCRE_ERROR_NOMATCH && (ret) != PCRE_ERROR_PARTIAL)
+
+typedef struct _InterpolationData InterpolationData;
+static gboolean interpolation_list_needs_match (GList *list);
+static gboolean interpolate_replacement (const GMatchInfo *match_info,
+ GString *result,
+ gpointer data);
+static GList *split_replacement (const gchar *replacement,
+ GError **error);
+static void free_interpolation_data (InterpolationData *data);
+
+
+static const gchar *
+match_error (gint errcode)
+{
+ switch (errcode)
+ {
+ case PCRE_ERROR_NOMATCH:
+ /* not an error */
+ break;
+ case PCRE_ERROR_NULL:
+ /* NULL argument, this should not happen in GRegex */
+ g_warning ("A NULL argument was passed to PCRE");
+ break;
+ case PCRE_ERROR_BADOPTION:
+ return "bad options";
+ case PCRE_ERROR_BADMAGIC:
+ return _("corrupted object");
+ case PCRE_ERROR_UNKNOWN_OPCODE:
+ return N_("internal error or corrupted object");
+ case PCRE_ERROR_NOMEMORY:
+ return _("out of memory");
+ case PCRE_ERROR_NOSUBSTRING:
+ /* not used by pcre_exec() */
+ break;
+ case PCRE_ERROR_MATCHLIMIT:
+ return _("backtracking limit reached");
+ case PCRE_ERROR_CALLOUT:
+ /* callouts are not implemented */
+ break;
+ case PCRE_ERROR_BADUTF8:
+ case PCRE_ERROR_BADUTF8_OFFSET:
+ /* we do not check if strings are valid */
+ break;
+ case PCRE_ERROR_PARTIAL:
+ /* not an error */
+ break;
+ case PCRE_ERROR_BADPARTIAL:
+ return _("the pattern contains items not supported for partial matching");
+ case PCRE_ERROR_INTERNAL:
+ return _("internal error");
+ case PCRE_ERROR_BADCOUNT:
+ /* negative ovecsize, this should not happen in GRegex */
+ g_warning ("A negative ovecsize was passed to PCRE");
+ break;
+ case PCRE_ERROR_DFA_UITEM:
+ return _("the pattern contains items not supported for partial matching");
+ case PCRE_ERROR_DFA_UCOND:
+ return _("back references as conditions are not supported for partial matching");
+ case PCRE_ERROR_DFA_UMLIMIT:
+ /* the match_field field is not used in GRegex */
+ break;
+ case PCRE_ERROR_DFA_WSSIZE:
+ /* handled expanding the workspace */
+ break;
+ case PCRE_ERROR_DFA_RECURSE:
+ case PCRE_ERROR_RECURSIONLIMIT:
+ return _("recursion limit reached");
+ case PCRE_ERROR_NULLWSLIMIT:
+ return _("workspace limit for empty substrings reached");
+ case PCRE_ERROR_BADNEWLINE:
+ return _("invalid combination of newline flags");
+ default:
+ break;
+ }
+ return _("unknown error");
+}
+
+
+/* GMatchInfo */
+
+static GMatchInfo *
+match_info_new (const GRegex *regex,
+ const gchar *string,
+ gint string_len,
+ gint start_position,
+ gint match_options,
+ gboolean is_dfa)
+{
+ GMatchInfo *match_info;
+
+ if (string_len < 0)
+ string_len = strlen (string);
+
+ match_info = g_new0 (GMatchInfo, 1);
+ match_info->regex = g_regex_ref ((GRegex *)regex);
+ match_info->string = string;
+ match_info->string_len = string_len;
+ match_info->matches = PCRE_ERROR_NOMATCH;
+ match_info->pos = start_position;
+ match_info->match_opts = match_options;
+
+ if (is_dfa)
+ {
+ /* These values should be enough for most cases, if they are not
+ * enough g_regex_match_all_full() will expand them. */
+ match_info->n_offsets = 24;
+ match_info->n_workspace = 100;
+ match_info->workspace = g_new (gint, match_info->n_workspace);
+ }
+ else
+ {
+ gint capture_count;
+ pcre_fullinfo (regex->pcre_re, regex->extra,
+ PCRE_INFO_CAPTURECOUNT, &capture_count);
+ match_info->n_offsets = (capture_count + 1) * 3;
+ }
+ match_info->offsets = g_new0 (gint, match_info->n_offsets);
+
+ return match_info;
+}
+
+/**
+ * g_match_info_get_regex:
+ * @match_info: a #GMatchInfo
+ *
+ * Returns #GRegex object used in @match_info. It belongs to Glib
+ * and must not be freed. Use g_regex_ref() if you need to keep it
+ * after you free @match_info object.
+ *
+ * Returns: #GRegex object used in @match_info
+ *
+ * Since: 2.14
+ */
+GRegex *
+g_match_info_get_regex (const GMatchInfo *match_info)
+{
+ g_return_val_if_fail (match_info != NULL, NULL);
+ return match_info->regex;
+}
+
+/**
+ * g_match_info_get_string:
+ * @match_info: a #GMatchInfo
+ *
+ * Returns the string searched with @match_info. This is the
+ * string passed to g_regex_match() or g_regex_replace() so
+ * you may not free it before calling this function.
+ *
+ * Returns: the string searched with @match_info
+ *
+ * Since: 2.14
+ */
+const gchar *
+g_match_info_get_string (const GMatchInfo *match_info)
+{
+ g_return_val_if_fail (match_info != NULL, NULL);
+ return match_info->string;
+}
+
+/**
+ * g_match_info_free:
+ * @match_info: a #GMatchInfo
+ *
+ * Frees all the memory associated with the #GMatchInfo structure.
+ *
+ * Since: 2.14
+ */
+void
+g_match_info_free (GMatchInfo *match_info)
+{
+ if (match_info)
+ {
+ g_regex_unref (match_info->regex);
+ g_free (match_info->offsets);
+ g_free (match_info->workspace);
+ g_free (match_info);
+ }
+}
+
+/**
+ * g_match_info_next:
+ * @match_info: a #GMatchInfo structure
+ * @error: location to store the error occuring, or NULL to ignore errors
+ *
+ * Scans for the next match using the same parameters of the previous
+ * call to g_regex_match_full() or g_regex_match() that returned
+ * @match_info.
+ *
+ * The match is done on the string passed to the match function, so you
+ * cannot free it before calling this function.
+ *
+ * Returns: %TRUE is the string matched, %FALSE otherwise
+ *
+ * Since: 2.14
+ */
+gboolean
+g_match_info_next (GMatchInfo *match_info,
+ GError **error)
+{
+ g_return_val_if_fail (match_info != NULL, FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+ g_return_val_if_fail (match_info->pos >= 0, FALSE);
+
+ match_info->matches = pcre_exec (match_info->regex->pcre_re,
+ match_info->regex->extra,
+ match_info->string,
+ match_info->string_len,
+ match_info->pos,
+ match_info->regex->match_opts |
+ match_info->match_opts,
+ match_info->offsets,
+ match_info->n_offsets);
+ if (IS_PCRE_ERROR (match_info->matches))
+ {
+ g_set_error (error, G_REGEX_ERROR, G_REGEX_ERROR_MATCH,
+ _("Error while matching regular expression %s: %s"),
+ match_info->regex->pattern, match_error (match_info->matches));
+ return FALSE;
+ }
+
+ /* avoid infinite loops if the pattern is an empty string or something
+ * equivalent */
+ if (match_info->pos == match_info->offsets[1])
+ {
+ if (match_info->pos > match_info->string_len)
+ {
+ /* we have reached the end of the string */
+ match_info->pos = -1;
+ match_info->matches = PCRE_ERROR_NOMATCH;
+ return FALSE;
+ }
+ match_info->pos = NEXT_CHAR (match_info->regex,
+ &match_info->string[match_info->pos]) -
+ match_info->string;
+ }
+ else
+ {
+ match_info->pos = match_info->offsets[1];
+ }
+
+ return match_info->matches >= 0;
+}
+
+/**
+ * g_match_info_matches:
+ * @match_info: a #GMatchInfo structure
+ *
+ * Returns: %TRUE if the previous match operation succeeded, %FALSE
+ * otherwise
+ *
+ * Since: 2.14
+ */
+gboolean
+g_match_info_matches (const GMatchInfo *match_info)
+{
+ g_return_val_if_fail (match_info != NULL, FALSE);
+
+ return match_info->matches >= 0;
+}
+
+/**
+ * g_match_info_get_match_count:
+ * @match_info: a #GMatchInfo structure
+ *
+ * Retrieves the number of matched substrings (including substring 0, that
+ * is the whole matched text), so 1 is returned if the pattern has no
+ * substrings in it and 0 is returned if the match failed.
+ *
+ * If the last match was obtained using the DFA algorithm, that is using
+ * g_regex_match_all() or g_regex_match_all_full(), the retrieved
+ * count is not that of the number of capturing parentheses but that of
+ * the number of matched substrings.
+ *
+ * Returns: Number of matched substrings, or -1 if an error occurred
+ *
+ * Since: 2.14
+ */
+gint
+g_match_info_get_match_count (const GMatchInfo *match_info)
+{
+ g_return_val_if_fail (match_info, -1);
+
+ if (match_info->matches == PCRE_ERROR_NOMATCH)
+ /* no match */
+ return 0;
+ else if (match_info->matches < PCRE_ERROR_NOMATCH)
+ /* error */
+ return -1;
+ else
+ /* match */
+ return match_info->matches;
+}
+
+/**
+ * g_match_info_is_partial_match:
+ * @match_info: a #GMatchInfo structure
+ *
+ * Usually if the string passed to g_regex_match*() matches as far as
+ * it goes, but is too short to match the entire pattern, %FALSE is
+ * returned. There are circumstances where it might be helpful to
+ * distinguish this case from other cases in which there is no match.
+ *
+ * Consider, for example, an application where a human is required to
+ * type in data for a field with specific formatting requirements. An
+ * example might be a date in the form ddmmmyy, defined by the pattern
+ * "^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$".
+ * If the application sees the user’s keystrokes one by one, and can
+ * check that what has been typed so far is potentially valid, it is
+ * able to raise an error as soon as a mistake is made.
+ *
+ * GRegex supports the concept of partial matching by means of the
+ * #G_REGEX_MATCH_PARTIAL flag. When this is set the return code for
+ * g_regex_match() or g_regex_match_full() is, as usual, %TRUE
+ * for a complete match, %FALSE otherwise. But, when this functions
+ * returns %FALSE, you can check if the match was partial calling
+ * g_match_info_is_partial_match().
+ *
+ * When using partial matching you cannot use g_match_info_fetch*().
+ *
+ * Because of the way certain internal optimizations are implemented the
+ * partial matching algorithm cannot be used with all patterns. So repeated
+ * single characters such as "a{2,4}" and repeated single metasequences such
+ * as "\d+" are not permitted if the maximum number of occurrences is
+ * greater than one. Optional items such as "\d?" (where the maximum is one)
+ * are permitted. Quantifiers with any values are permitted after
+ * parentheses, so the invalid examples above can be coded thus "(a){2,4}"
+ * and "(\d)+". If #G_REGEX_MATCH_PARTIAL is set for a pattern that does
+ * not conform to the restrictions, matching functions return an error.
+ *
+ * Returns: %TRUE if the match was partial, %FALSE otherwise
+ *
+ * Since: 2.14
+ */
+gboolean
+g_match_info_is_partial_match (const GMatchInfo *match_info)
+{
+ g_return_val_if_fail (match_info != NULL, FALSE);
+
+ return match_info->matches == PCRE_ERROR_PARTIAL;
+}
+
+/**
+ * g_match_info_expand_references:
+ * @match_info: a #GMatchInfo or %NULL
+ * @string_to_expand: the string to expand
+ * @error: location to store the error occuring, or %NULL to ignore errors
+ *
+ * Returns a new string containing the text in @string_to_expand with
+ * references and escape sequences expanded. References refer to the last
+ * match done with @string against @regex and have the same syntax used by
+ * g_regex_replace().
+ *
+ * The @string_to_expand must be UTF-8 encoded even if #G_REGEX_RAW was
+ * passed to g_regex_new().
+ *
+ * The backreferences are extracted from the string passed to the match
+ * function, so you cannot call this function after freeing the string.
+ *
+ * @match_info may be %NULL in which case @string_to_expand must not
+ * contain references. For instance "foo\n" does not refer to an actual
+ * pattern and '\n' merely will be replaced with \n character,
+ * while to expand "\0" (whole match) one needs the result of a match.
+ * Use g_regex_check_replacement() to find out whether @string_to_expand
+ * contains references.
+ *
+ * Returns: the expanded string, or %NULL if an error occurred
+ *
+ * Since: 2.14
+ */
+gchar *
+g_match_info_expand_references (const GMatchInfo *match_info,
+ const gchar *string_to_expand,
+ GError **error)
+{
+ GString *result;
+ GList *list;
+ GError *tmp_error = NULL;
+
+ g_return_val_if_fail (string_to_expand != NULL, NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ list = split_replacement (string_to_expand, &tmp_error);
+ if (tmp_error != NULL)
+ {
+ g_propagate_error (error, tmp_error);
+ return NULL;
+ }
+
+ if (!match_info && interpolation_list_needs_match (list))
+ {
+ g_critical ("String '%s' contains references to the match, can't "
+ "expand references without GMatchInfo object",
+ string_to_expand);
+ return NULL;
+ }
+
+ result = g_string_sized_new (strlen (string_to_expand));
+ interpolate_replacement (match_info, result, list);
+
+ g_list_foreach (list, (GFunc)free_interpolation_data, NULL);
+ g_list_free (list);
+
+ return g_string_free (result, FALSE);
+}
+
+/**
+ * g_match_info_fetch:
+ * @match_info: #GMatchInfo structure
+ * @match_num: number of the sub expression
+ *
+ * Retrieves the text matching the @match_num<!-- -->'th capturing parentheses.
+ * 0 is the full text of the match, 1 is the first paren set, 2 the second,
+ * and so on.
+ *
+ * If @match_num is a valid sub pattern but it didn't match anything (e.g.
+ * sub pattern 1, matching "b" against "(a)?b") then an empty string is
+ * returned.
+ *
+ * If the match was obtained using the DFA algorithm, that is using
+ * g_regex_match_all() or g_regex_match_all_full(), the retrieved
+ * string is not that of a set of parentheses but that of a matched
+ * substring. Substrings are matched in reverse order of length, so 0 is
+ * the longest match.
+ *
+ * The string is fetched from the string passed to the match function,
+ * so you cannot call this function after freeing the string.
+ *
+ * Returns: The matched substring, or %NULL if an error occurred.
+ * You have to free the string yourself
+ *
+ * Since: 2.14
+ */
+gchar *
+g_match_info_fetch (const GMatchInfo *match_info,
+ gint match_num)
+{
+ /* we cannot use pcre_get_substring() because it allocates the
+ * string using pcre_malloc(). */
+ gchar *match = NULL;
+ gint start, end;
+
+ g_return_val_if_fail (match_info != NULL, NULL);
+ g_return_val_if_fail (match_num >= 0, NULL);
+
+ /* match_num does not exist or it didn't matched, i.e. matching "b"
+ * against "(a)?b" then group 0 is empty. */
+ if (!g_match_info_fetch_pos (match_info, match_num, &start, &end))
+ match = NULL;
+ else if (start == -1)
+ match = g_strdup ("");
+ else
+ match = g_strndup (&match_info->string[start], end - start);
+
+ return match;
+}
+
+/**
+ * g_match_info_fetch_pos:
+ * @match_info: #GMatchInfo structure
+ * @match_num: number of the sub expression
+ * @start_pos: pointer to location where to store the start position
+ * @end_pos: pointer to location where to store the end position
+ *
+ * Retrieves the position of the @match_num<!-- -->'th capturing parentheses.
+ * 0 is the full text of the match, 1 is the first paren set, 2 the second,
+ * and so on.
+ *
+ * If @match_num is a valid sub pattern but it didn't match anything (e.g.
+ * sub pattern 1, matching "b" against "(a)?b") then @start_pos and @end_pos
+ * are set to -1 and %TRUE is returned.
+ *
+ * If the match was obtained using the DFA algorithm, that is using
+ * g_regex_match_all() or g_regex_match_all_full(), the retrieved
+ * position is not that of a set of parentheses but that of a matched
+ * substring. Substrings are matched in reverse order of length, so 0 is
+ * the longest match.
+ *
+ * Returns: %TRUE if the position was fetched, %FALSE otherwise. If the
+ * position cannot be fetched, @start_pos and @end_pos are left
+ * unchanged.
+ *
+ * Since: 2.14
+ */
+gboolean
+g_match_info_fetch_pos (const GMatchInfo *match_info,
+ gint match_num,
+ gint *start_pos,
+ gint *end_pos)
+{
+ g_return_val_if_fail (match_info != NULL, FALSE);
+ g_return_val_if_fail (match_num >= 0, FALSE);
+
+ /* make sure the sub expression number they're requesting is less than
+ * the total number of sub expressions that were matched. */
+ if (match_num >= match_info->matches)
+ return FALSE;
+
+ if (start_pos != NULL)
+ *start_pos = match_info->offsets[2 * match_num];
+
+ if (end_pos != NULL)
+ *end_pos = match_info->offsets[2 * match_num + 1];
+
+ return TRUE;
+}
+
+/*
+ * Returns number of first matched subpattern with name @name.
+ * There may be more than one in case when DUPNAMES is used,
+ * and not all subpatterns with that name match;
+ * pcre_get_stringnumber() does not work in that case.
+ */
+static gint
+get_matched_substring_number (const GMatchInfo *match_info,
+ const gchar *name)
+{
+ gint entrysize;
+ gchar *first, *last;
+ guchar *entry;
+
+ /*
+ * FIXME: (?J) may be used inside the pattern as the equivalent of
+ * DUPNAMES compile option. In this case we can't know about it,
+ * and pcre doesn't tell us about it either, it uses private flag
+ * PCRE_JCHANGED for this. So we have to always search string
+ * table, unlike pcre which uses pcre_get_stringnumber() shortcut
+ * when possible. It shouldn't be actually bad since
+ * pcre_get_stringtable_entries() uses binary search; still would
+ * be better to fix it, to be not worse than pcre.
+ */
+#if 0
+ if ((match_info->regex->compile_opts & G_REGEX_DUPNAMES) == 0)
+ return pcre_get_stringnumber (match_info->regex->pcre_re, name);
+#endif
+
+ /* This code is copied from pcre_get.c: get_first_set() */
+ entrysize = pcre_get_stringtable_entries (match_info->regex->pcre_re,
+ name,
+ &first,
+ &last);
+
+ if (entrysize <= 0)
+ return entrysize;
+
+ for (entry = (guchar*) first; entry <= (guchar*) last; entry += entrysize)
+ {
+ gint n = (entry[0] << 8) + entry[1];
+ if (match_info->offsets[n*2] >= 0)
+ return n;
+ }
+
+ return (first[0] << 8) + first[1];
+}
+
+/**
+ * g_match_info_fetch_named:
+ * @match_info: #GMatchInfo structure
+ * @name: name of the subexpression
+ *
+ * Retrieves the text matching the capturing parentheses named @name.
+ *
+ * If @name is a valid sub pattern name but it didn't match anything (e.g.
+ * sub pattern "X", matching "b" against "(?P&lt;X&gt;a)?b") then an empty
+ * string is returned.
+ *
+ * The string is fetched from the string passed to the match function,
+ * so you cannot call this function after freeing the string.
+ *
+ * Returns: The matched substring, or %NULL if an error occurred.
+ * You have to free the string yourself
+ *
+ * Since: 2.14
+ */
+gchar *
+g_match_info_fetch_named (const GMatchInfo *match_info,
+ const gchar *name)
+{
+ /* we cannot use pcre_get_named_substring() because it allocates the
+ * string using pcre_malloc(). */
+ gint num;
+
+ g_return_val_if_fail (match_info != NULL, NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ num = get_matched_substring_number (match_info, name);
+ if (num < 0)
+ return NULL;
+ else
+ return g_match_info_fetch (match_info, num);
+}
+
+/**
+ * g_match_info_fetch_named_pos:
+ * @match_info: #GMatchInfo structure
+ * @name: name of the subexpression
+ * @start_pos: pointer to location where to store the start position
+ * @end_pos: pointer to location where to store the end position
+ *
+ * Retrieves the position of the capturing parentheses named @name.
+ *
+ * If @name is a valid sub pattern name but it didn't match anything (e.g.
+ * sub pattern "X", matching "b" against "(?P&lt;X&gt;a)?b") then @start_pos and
+ * @end_pos are set to -1 and %TRUE is returned.
+ *
+ * Returns: %TRUE if the position was fetched, %FALSE otherwise. If the
+ * position cannot be fetched, @start_pos and @end_pos are left
+ * unchanged.
+ *
+ * Since: 2.14
+ */
+gboolean
+g_match_info_fetch_named_pos (const GMatchInfo *match_info,
+ const gchar *name,
+ gint *start_pos,
+ gint *end_pos)
+{
+ gint num;
+
+ g_return_val_if_fail (match_info != NULL, FALSE);
+ g_return_val_if_fail (name != NULL, FALSE);
+
+ num = get_matched_substring_number (match_info, name);
+ if (num < 0)
+ return FALSE;
+
+ return g_match_info_fetch_pos (match_info, num, start_pos, end_pos);
+}
+
+/**
+ * g_match_info_fetch_all:
+ * @match_info: a #GMatchInfo structure
+ *
+ * Bundles up pointers to each of the matching substrings from a match
+ * and stores them in an array of gchar pointers. The first element in
+ * the returned array is the match number 0, i.e. the entire matched
+ * text.
+ *
+ * If a sub pattern didn't match anything (e.g. sub pattern 1, matching
+ * "b" against "(a)?b") then an empty string is inserted.
+ *
+ * If the last match was obtained using the DFA algorithm, that is using
+ * g_regex_match_all() or g_regex_match_all_full(), the retrieved
+ * strings are not that matched by sets of parentheses but that of the
+ * matched substring. Substrings are matched in reverse order of length,
+ * so the first one is the longest match.
+ *
+ * The strings are fetched from the string passed to the match function,
+ * so you cannot call this function after freeing the string.
+ *
+ * Returns: a %NULL-terminated array of gchar * pointers. It must be freed
+ * using g_strfreev(). If the previous match failed %NULL is
+ * returned.
+ *
+ * Since: 2.14
+ */
+gchar **
+g_match_info_fetch_all (const GMatchInfo *match_info)
+{
+ /* we cannot use pcre_get_substring_list() because the returned value
+ * isn't suitable for g_strfreev(). */
+ gchar **result;
+ gint i;
+
+ g_return_val_if_fail (match_info != NULL, FALSE);
+
+ if (match_info->matches < 0)
+ return NULL;
+
+ result = g_new (gchar *, match_info->matches + 1);
+ for (i = 0; i < match_info->matches; i++)
+ result[i] = g_match_info_fetch (match_info, i);
+ result[i] = NULL;
+
+ return result;
+}
+
+
+/* GRegex */
+
+GQuark
+g_regex_error_quark (void)
+{
+ static GQuark error_quark = 0;
+
+ if (error_quark == 0)
+ error_quark = g_quark_from_static_string ("g-regex-error-quark");
+
+ return error_quark;
+}
+
+/**
+ * g_regex_ref:
+ * @regex: a #GRegex
+ *
+ * Increases reference count of @regex by 1.
+ *
+ * Returns: @regex
+ *
+ * Since: 2.14
+ */
+GRegex *
+g_regex_ref (GRegex *regex)
+{
+ g_return_val_if_fail (regex != NULL, NULL);
+ g_atomic_int_inc ((gint*) &regex->ref_count);
+ return regex;
+}
+
+/**
+ * g_regex_unref:
+ * @regex: a #GRegex
+ *
+ * Decreases reference count of @regex by 1. When reference count drops
+ * to zero, it frees all the memory associated with the regex structure.
+ *
+ * Since: 2.14
+ */
+void
+g_regex_unref (GRegex *regex)
+{
+ g_return_if_fail (regex != NULL);
+
+ if (g_atomic_int_exchange_and_add ((gint *) &regex->ref_count, -1) - 1 == 0)
+ {
+ g_free (regex->pattern);
+ if (regex->pcre_re != NULL)
+ pcre_free (regex->pcre_re);
+ if (regex->extra != NULL)
+ pcre_free (regex->extra);
+ g_free (regex);
+ }
+}
+
+/**
+ * g_regex_new:
+ * @pattern: the regular expression
+ * @compile_options: compile options for the regular expression
+ * @match_options: match options for the regular expression
+ * @error: return location for a #GError
+ *
+ * Compiles the regular expression to an internal form, and does the initial
+ * setup of the #GRegex structure.
+ *
+ * Returns: a #GRegex structure. Call g_regex_unref() when you are done
+ * with it.
+ *
+ * Since: 2.14
+ */
+GRegex *
+g_regex_new (const gchar *pattern,
+ GRegexCompileFlags compile_options,
+ GRegexMatchFlags match_options,
+ GError **error)
+{
+ GRegex *regex;
+ pcre *re;
+ const gchar *errmsg;
+ gint erroffset;
+ gboolean optimize = FALSE;
+ static gboolean initialized = FALSE;
+
+ g_return_val_if_fail (pattern != NULL, NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+ g_return_val_if_fail ((compile_options & ~G_REGEX_COMPILE_MASK) == 0, NULL);
+ g_return_val_if_fail ((match_options & ~G_REGEX_MATCH_MASK) == 0, NULL);
+
+ if (!initialized)
+ {
+ gint support;
+ const gchar *msg;
+
+ pcre_config (PCRE_CONFIG_UTF8, &support);
+ if (!support)
+ {
+ msg = N_("PCRE library is compiled without UTF8 support");
+ g_critical (msg);
+ g_set_error (error, G_REGEX_ERROR, G_REGEX_ERROR_COMPILE, gettext (msg));
+ return NULL;
+ }
+
+ pcre_config (PCRE_CONFIG_UNICODE_PROPERTIES, &support);
+ if (!support)
+ {
+ msg = N_("PCRE library is compiled without UTF8 properties support");
+ g_critical (msg);
+ g_set_error (error, G_REGEX_ERROR, G_REGEX_ERROR_COMPILE, gettext (msg));
+ return NULL;
+ }
+
+ initialized = TRUE;
+ }
+
+ /* G_REGEX_OPTIMIZE has the same numeric value of PCRE_NO_UTF8_CHECK,
+ * as we do not need to wrap PCRE_NO_UTF8_CHECK. */
+ if (compile_options & G_REGEX_OPTIMIZE)
+ optimize = TRUE;
+
+ /* In GRegex the string are, by default, UTF-8 encoded. PCRE
+ * instead uses UTF-8 only if required with PCRE_UTF8. */
+ if (compile_options & G_REGEX_RAW)
+ {
+ /* disable utf-8 */
+ compile_options &= ~G_REGEX_RAW;
+ }
+ else
+ {
+ /* enable utf-8 */
+ compile_options |= PCRE_UTF8 | PCRE_NO_UTF8_CHECK;
+ match_options |= PCRE_NO_UTF8_CHECK;
+ }
+
+ /* PCRE_NEWLINE_ANY is the default for the internal PCRE but
+ * not for the system one. */
+ if (!(compile_options & G_REGEX_NEWLINE_CR) &&
+ !(compile_options & G_REGEX_NEWLINE_LF))
+ {
+ compile_options |= PCRE_NEWLINE_ANY;
+ }
+
+ /* compile the pattern */
+ re = pcre_compile (pattern, compile_options, &errmsg, &erroffset, NULL);
+
+ /* if the compilation failed, set the error member and return
+ * immediately */
+ if (re == NULL)
+ {
+ GError *tmp_error = g_error_new (G_REGEX_ERROR,
+ G_REGEX_ERROR_COMPILE,
+ _("Error while compiling regular "
+ "expression %s at char %d: %s"),
+ pattern, erroffset, errmsg);
+ g_propagate_error (error, tmp_error);
+
+ return NULL;
+ }
+
+ regex = g_new0 (GRegex, 1);
+ regex->ref_count = 1;
+ regex->pattern = g_strdup (pattern);
+ regex->pcre_re = re;
+ regex->compile_opts = compile_options;
+ regex->match_opts = match_options;
+
+ if (optimize)
+ {
+ regex->extra = pcre_study (regex->pcre_re, 0, &errmsg);
+ if (errmsg != NULL)
+ {
+ GError *tmp_error = g_error_new (G_REGEX_ERROR,
+ G_REGEX_ERROR_OPTIMIZE,
+ _("Error while optimizing "
+ "regular expression %s: %s"),
+ regex->pattern,
+ errmsg);
+ g_propagate_error (error, tmp_error);
+ return NULL;
+ }
+ }
+
+ return regex;
+}
+
+/**
+ * g_regex_get_pattern:
+ * @regex: a #GRegex structure
+ *
+ * Gets the pattern string associated with @regex, i.e. a copy of
+ * the string passed to g_regex_new().
+ *
+ * Returns: the pattern of @regex
+ *
+ * Since: 2.14
+ */
+const gchar *
+g_regex_get_pattern (const GRegex *regex)
+{
+ g_return_val_if_fail (regex != NULL, NULL);
+
+ return regex->pattern;
+}
+
+/**
+ * g_regex_get_max_backref:
+ * @regex: a #GRegex
+ *
+ * Returns the number of the highest back reference
+ * in the pattern, or 0 if the pattern does not contain
+ * back references.
+ *
+ * Returns: the number of the highest back reference.
+ *
+ * Since: 2.14
+ */
+gint
+g_regex_get_max_backref (const GRegex *regex)
+{
+ gint value;
+
+ pcre_fullinfo (regex->pcre_re, regex->extra,
+ PCRE_INFO_BACKREFMAX, &value);
+
+ return value;
+}
+
+/**
+ * g_regex_get_capture_count:
+ * @regex: a #GRegex
+ *
+ * Returns the number of capturing subpatterns in the pattern.
+ *
+ * Returns: the number of capturing subpatterns.
+ *
+ * Since: 2.14
+ */
+gint
+g_regex_get_capture_count (const GRegex *regex)
+{
+ gint value;
+
+ pcre_fullinfo (regex->pcre_re, regex->extra,
+ PCRE_INFO_CAPTURECOUNT, &value);
+
+ return value;
+}
+
+/**
+ * g_regex_match_simple:
+ * @pattern: the regular expression
+ * @string: the string to scan for matches
+ * @compile_options: compile options for the regular expression
+ * @match_options: match options
+ *
+ * Scans for a match in @string for @pattern.
+ *
+ * This function is equivalent to g_regex_match() but it does not
+ * require to compile the pattern with g_regex_new(), avoiding some
+ * lines of code when you need just to do a match without extracting
+ * substrings, capture counts, and so on.
+ *
+ * If this function is to be called on the same @pattern more than
+ * once, it's more efficient to compile the pattern once with
+ * g_regex_new() and then use g_regex_match().
+ *
+ * Returns: %TRUE is the string matched, %FALSE otherwise
+ *
+ * Since: 2.14
+ */
+gboolean
+g_regex_match_simple (const gchar *pattern,
+ const gchar *string,
+ GRegexCompileFlags compile_options,
+ GRegexMatchFlags match_options)
+{
+ GRegex *regex;
+ gboolean result;
+
+ regex = g_regex_new (pattern, compile_options, 0, NULL);
+ if (!regex)
+ return FALSE;
+ result = g_regex_match_full (regex, string, -1, 0, match_options, NULL, NULL);
+ g_regex_unref (regex);
+ return result;
+}
+
+/**
+ * g_regex_match:
+ * @regex: a #GRegex structure from g_regex_new()
+ * @string: the string to scan for matches
+ * @match_options: match options
+ * @match_info: pointer to location where to store the #GMatchInfo, or
+ * %NULL if you do not need it
+ *
+ * Scans for a match in string for the pattern in @regex. The @match_options
+ * are combined with the match options specified when the @regex structure
+ * was created, letting you have more flexibility in reusing #GRegex
+ * structures.
+ *
+ * A #GMatchInfo structure, used to get information on the match, is stored
+ * in @match_info if not %NULL. Note that if @match_info is not %NULL then
+ * it is created even if the function returns %FALSE, i.e. you must free it
+ * regardless if regular expression actually matched.
+ *
+ * To retrieve all the non-overlapping matches of the pattern in string you
+ * can use g_match_info_next().
+ *
+ * <informalexample><programlisting>
+ * static void
+ * print_uppercase_words (const gchar *string)
+ * {
+ * /&ast; Print all uppercase-only words. &ast;/
+ * GRegex *regex;
+ * GMatchInfo *match_info;
+ * &nbsp;
+ * regex = g_regex_new ("[A-Z]+", 0, 0, NULL);
+ * g_regex_match (regex, string, 0, &match_info);
+ * while (g_match_info_matches (match_info))
+ * {
+ * gchar *word = g_match_info_fetch (match_info, 0);
+ * g_print ("Found: %s\n", word);
+ * g_free (word);
+ * g_match_info_next (match_info, NULL);
+ * }
+ * g_match_info_free (match_info);
+ * g_regex_unref (regex);
+ * }
+ * </programlisting></informalexample>
+ *
+ * Returns: %TRUE is the string matched, %FALSE otherwise
+ *
+ * Since: 2.14
+ */
+gboolean
+g_regex_match (const GRegex *regex,
+ const gchar *string,
+ GRegexMatchFlags match_options,
+ GMatchInfo **match_info)
+{
+ return g_regex_match_full (regex, string, -1, 0, match_options,
+ match_info, NULL);
+}
+
+/**
+ * g_regex_match_full:
+ * @regex: a #GRegex structure from g_regex_new()
+ * @string: the string to scan for matches
+ * @string_len: the length of @string, or -1 if @string is nul-terminated
+ * @start_position: starting index of the string to match
+ * @match_options: match options
+ * @match_info: pointer to location where to store the #GMatchInfo, or
+ * %NULL if you do not need it
+ * @error: location to store the error occuring, or %NULL to ignore errors
+ *
+ * Scans for a match in string for the pattern in @regex. The @match_options
+ * are combined with the match options specified when the @regex structure
+ * was created, letting you have more flexibility in reusing #GRegex
+ * structures.
+ *
+ * Setting @start_position differs from just passing over a shortened string
+ * and setting #G_REGEX_MATCH_NOTBOL in the case of a pattern that begins
+ * with any kind of lookbehind assertion, such as "\b".
+ *
+ * A #GMatchInfo structure, used to get information on the match, is stored
+ * in @match_info if not %NULL. Note that if @match_info is not %NULL then
+ * it is created even if the function returns %FALSE, i.e. you must free it
+ * regardless if regular expression actually matched.
+ *
+ * @string is not copied and is used in #GMatchInfo internally. If you use
+ * any #GMatchInfo method (except g_match_info_free()) after freeing or
+ * modifying @string then the behaviour is undefined.
+ *
+ * To retrieve all the non-overlapping matches of the pattern in string you
+ * can use g_match_info_next().
+ *
+ * <informalexample><programlisting>
+ * static void
+ * print_uppercase_words (const gchar *string)
+ * {
+ * /&ast; Print all uppercase-only words. &ast;/
+ * GRegex *regex;
+ * GMatchInfo *match_info;
+ * GError *error = NULL;
+ * &nbsp;
+ * regex = g_regex_new ("[A-Z]+", 0, 0, NULL);
+ * g_regex_match_full (regex, string, -1, 0, 0, &match_info, &error);
+ * while (g_match_info_matches (match_info))
+ * {
+ * gchar *word = g_match_info_fetch (match_info, 0);
+ * g_print ("Found: %s\n", word);
+ * g_free (word);
+ * g_match_info_next (match_info, &error);
+ * }
+ * g_match_info_free (match_info);
+ * g_regex_unref (regex);
+ * if (error != NULL)
+ * {
+ * g_printerr ("Error while matching: %s\n", error->message);
+ * g_error_free (error);
+ * }
+ * }
+ * </programlisting></informalexample>
+ *
+ * Returns: %TRUE is the string matched, %FALSE otherwise
+ *
+ * Since: 2.14
+ */
+gboolean
+g_regex_match_full (const GRegex *regex,
+ const gchar *string,
+ gssize string_len,
+ gint start_position,
+ GRegexMatchFlags match_options,
+ GMatchInfo **match_info,
+ GError **error)
+{
+ GMatchInfo *info;
+ gboolean match_ok;
+
+ g_return_val_if_fail (regex != NULL, FALSE);
+ g_return_val_if_fail (string != NULL, FALSE);
+ g_return_val_if_fail (start_position >= 0, FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+ g_return_val_if_fail ((match_options & ~G_REGEX_MATCH_MASK) == 0, FALSE);
+
+ info = match_info_new (regex, string, string_len, start_position,
+ match_options, FALSE);
+ match_ok = g_match_info_next (info, error);
+ if (match_info != NULL)
+ *match_info = info;
+ else
+ g_match_info_free (info);
+
+ return match_ok;
+}
+
+/**
+ * g_regex_match_all:
+ * @regex: a #GRegex structure from g_regex_new()
+ * @string: the string to scan for matches
+ * @match_options: match options
+ * @match_info: pointer to location where to store the #GMatchInfo, or
+ * %NULL if you do not need it
+ *
+ * Using the standard algorithm for regular expression matching only the
+ * longest match in the string is retrieved. This function uses a
+ * different algorithm so it can retrieve all the possible matches.
+ * For more documentation see g_regex_match_all_full().
+ *
+ * A #GMatchInfo structure, used to get information on the match, is stored
+ * in @match_info if not %NULL. Note that if @match_info is not %NULL then
+ * it is created even if the function returns %FALSE, i.e. you must free it
+ * regardless if regular expression actually matched.
+ *
+ * Returns: %TRUE is the string matched, %FALSE otherwise
+ *
+ * Since: 2.14
+ */
+gboolean
+g_regex_match_all (const GRegex *regex,
+ const gchar *string,
+ GRegexMatchFlags match_options,
+ GMatchInfo **match_info)
+{
+ return g_regex_match_all_full (regex, string, -1, 0, match_options,
+ match_info, NULL);
+}
+
+/**
+ * g_regex_match_all_full:
+ * @regex: a #GRegex structure from g_regex_new()
+ * @string: the string to scan for matches
+ * @string_len: the length of @string, or -1 if @string is nul-terminated
+ * @start_position: starting index of the string to match
+ * @match_options: match options
+ * @match_info: pointer to location where to store the #GMatchInfo, or
+ * %NULL if you do not need it
+ * @error: location to store the error occuring, or %NULL to ignore errors
+ *
+ * Using the standard algorithm for regular expression matching only the
+ * longest match in the string is retrieved, it is not possibile to obtain
+ * all the available matches. For instance matching
+ * "&lt;a&gt; &lt;b&gt; &lt;c&gt;" against the pattern "&lt;.*&gt;" you get
+ * "&lt;a&gt; &lt;b&gt; &lt;c&gt;".
+ *
+ * This function uses a different algorithm (called DFA, i.e. deterministic
+ * finite automaton), so it can retrieve all the possible matches, all
+ * starting at the same point in the string. For instance matching
+ * "&lt;a&gt; &lt;b&gt; &lt;c&gt;" against the pattern "&lt;.*&gt;" you
+ * would obtain three matches: "&lt;a&gt; &lt;b&gt; &lt;c&gt;",
+ * "&lt;a&gt; &lt;b&gt;" and "&lt;a&gt;".
+ *
+ * The number of matched strings is retrieved using
+ * g_match_info_get_match_count().
+ * To obtain the matched strings and their position you can use,
+ * respectively, g_match_info_fetch() and g_match_info_fetch_pos(). Note that
+ * the strings are returned in reverse order of length; that is, the longest
+ * matching string is given first.
+ *
+ * Note that the DFA algorithm is slower than the standard one and it is not
+ * able to capture substrings, so backreferences do not work.
+ *
+ * Setting @start_position differs from just passing over a shortened string
+ * and setting #G_REGEX_MATCH_NOTBOL in the case of a pattern that begins
+ * with any kind of lookbehind assertion, such as "\b".
+ *
+ * A #GMatchInfo structure, used to get information on the match, is stored
+ * in @match_info if not %NULL. Note that if @match_info is not %NULL then
+ * it is created even if the function returns %FALSE, i.e. you must free it
+ * regardless if regular expression actually matched.
+ *
+ * Returns: %TRUE is the string matched, %FALSE otherwise
+ *
+ * Since: 2.14
+ */
+gboolean
+g_regex_match_all_full (const GRegex *regex,
+ const gchar *string,
+ gssize string_len,
+ gint start_position,
+ GRegexMatchFlags match_options,
+ GMatchInfo **match_info,
+ GError **error)
+{
+ GMatchInfo *info;
+ gboolean done;
+
+ g_return_val_if_fail (regex != NULL, FALSE);
+ g_return_val_if_fail (string != NULL, FALSE);
+ g_return_val_if_fail (start_position >= 0, FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+ g_return_val_if_fail ((match_options & ~G_REGEX_MATCH_MASK) == 0, FALSE);
+
+ info = match_info_new (regex, string, string_len, start_position,
+ match_options, TRUE);
+
+ done = FALSE;
+ while (!done)
+ {
+ done = TRUE;
+ info->matches = pcre_dfa_exec (regex->pcre_re, regex->extra,
+ info->string, info->string_len,
+ info->pos,
+ regex->match_opts | match_options,
+ info->offsets, info->n_offsets,
+ info->workspace, info->n_workspace);
+ if (info->matches == PCRE_ERROR_DFA_WSSIZE)
+ {
+ /* info->workspace is too small. */
+ info->n_workspace *= 2;
+ info->workspace = g_realloc (info->workspace,
+ info->n_workspace * sizeof (gint));
+ done = FALSE;
+ }
+ else if (info->matches == 0)
+ {
+ /* info->offsets is too small. */
+ info->n_offsets *= 2;
+ info->offsets = g_realloc (info->offsets,
+ info->n_offsets * sizeof (gint));
+ done = FALSE;
+ }
+ else if (IS_PCRE_ERROR (info->matches))
+ {
+ g_set_error (error, G_REGEX_ERROR, G_REGEX_ERROR_MATCH,
+ _("Error while matching regular expression %s: %s"),
+ regex->pattern, match_error (info->matches));
+ }
+ }
+
+ /* set info->pos to -1 so that a call to g_match_info_next() fails. */
+ info->pos = -1;
+
+ if (match_info != NULL)
+ *match_info = info;
+ else
+ g_match_info_free (info);
+
+ return info->matches >= 0;
+}
+
+/**
+ * g_regex_get_string_number:
+ * @regex: #GRegex structure
+ * @name: name of the subexpression
+ *
+ * Retrieves the number of the subexpression named @name.
+ *
+ * Returns: The number of the subexpression or -1 if @name does not exists
+ *
+ * Since: 2.14
+ */
+gint
+g_regex_get_string_number (const GRegex *regex,
+ const gchar *name)
+{
+ gint num;
+
+ g_return_val_if_fail (regex != NULL, -1);
+ g_return_val_if_fail (name != NULL, -1);
+
+ num = pcre_get_stringnumber (regex->pcre_re, name);
+ if (num == PCRE_ERROR_NOSUBSTRING)
+ num = -1;
+
+ return num;
+}
+
+/**
+ * g_regex_split_simple:
+ * @pattern: the regular expression
+ * @string: the string to scan for matches
+ * @compile_options: compile options for the regular expression
+ * @match_options: match options
+ *
+ * Breaks the string on the pattern, and returns an array of the tokens.
+ * If the pattern contains capturing parentheses, then the text for each
+ * of the substrings will also be returned. If the pattern does not match
+ * anywhere in the string, then the whole string is returned as the first
+ * token.
+ *
+ * This function is equivalent to g_regex_split() but it does not
+ * require to compile the pattern with g_regex_new(), avoiding some
+ * lines of code when you need just to do a split without extracting
+ * substrings, capture counts, and so on.
+ *
+ * If this function is to be called on the same @pattern more than
+ * once, it's more efficient to compile the pattern once with
+ * g_regex_new() and then use g_regex_split().
+ *
+ * As a special case, the result of splitting the empty string "" is an
+ * empty vector, not a vector containing a single string. The reason for
+ * this special case is that being able to represent a empty vector is
+ * typically more useful than consistent handling of empty elements. If
+ * you do need to represent empty elements, you'll need to check for the
+ * empty string before calling this function.
+ *
+ * A pattern that can match empty strings splits @string into separate
+ * characters wherever it matches the empty string between characters.
+ * For example splitting "ab c" using as a separator "\s*", you will get
+ * "a", "b" and "c".
+ *
+ * Returns: a %NULL-terminated gchar ** array. Free it using g_strfreev()
+ *
+ * Since: 2.14
+ **/
+gchar **
+g_regex_split_simple (const gchar *pattern,
+ const gchar *string,
+ GRegexCompileFlags compile_options,
+ GRegexMatchFlags match_options)
+{
+ GRegex *regex;
+ gchar **result;
+
+ regex = g_regex_new (pattern, compile_options, 0, NULL);
+ if (!regex)
+ return NULL;
+ result = g_regex_split_full (regex, string, -1, 0, match_options, 0, NULL);
+ g_regex_unref (regex);
+ return result;
+}
+
+/**
+ * g_regex_split:
+ * @regex: a #GRegex structure
+ * @string: the string to split with the pattern
+ * @match_options: match time option flags
+ *
+ * Breaks the string on the pattern, and returns an array of the tokens.
+ * If the pattern contains capturing parentheses, then the text for each
+ * of the substrings will also be returned. If the pattern does not match
+ * anywhere in the string, then the whole string is returned as the first
+ * token.
+ *
+ * As a special case, the result of splitting the empty string "" is an
+ * empty vector, not a vector containing a single string. The reason for
+ * this special case is that being able to represent a empty vector is
+ * typically more useful than consistent handling of empty elements. If
+ * you do need to represent empty elements, you'll need to check for the
+ * empty string before calling this function.
+ *
+ * A pattern that can match empty strings splits @string into separate
+ * characters wherever it matches the empty string between characters.
+ * For example splitting "ab c" using as a separator "\s*", you will get
+ * "a", "b" and "c".
+ *
+ * Returns: a %NULL-terminated gchar ** array. Free it using g_strfreev()
+ *
+ * Since: 2.14
+ **/
+gchar **
+g_regex_split (const GRegex *regex,
+ const gchar *string,
+ GRegexMatchFlags match_options)
+{
+ return g_regex_split_full (regex, string, -1, 0,
+ match_options, 0, NULL);
+}
+
+/**
+ * g_regex_split_full:
+ * @regex: a #GRegex structure
+ * @string: the string to split with the pattern
+ * @string_len: the length of @string, or -1 if @string is nul-terminated
+ * @start_position: starting index of the string to match
+ * @match_options: match time option flags
+ * @max_tokens: the maximum number of tokens to split @string into. If this
+ * is less than 1, the string is split completely
+ * @error: return location for a #GError
+ *
+ * Breaks the string on the pattern, and returns an array of the tokens.
+ * If the pattern contains capturing parentheses, then the text for each
+ * of the substrings will also be returned. If the pattern does not match
+ * anywhere in the string, then the whole string is returned as the first
+ * token.
+ *
+ * As a special case, the result of splitting the empty string "" is an
+ * empty vector, not a vector containing a single string. The reason for
+ * this special case is that being able to represent a empty vector is
+ * typically more useful than consistent handling of empty elements. If
+ * you do need to represent empty elements, you'll need to check for the
+ * empty string before calling this function.
+ *
+ * A pattern that can match empty strings splits @string into separate
+ * characters wherever it matches the empty string between characters.
+ * For example splitting "ab c" using as a separator "\s*", you will get
+ * "a", "b" and "c".
+ *
+ * Setting @start_position differs from just passing over a shortened string
+ * and setting #G_REGEX_MATCH_NOTBOL in the case of a pattern that begins
+ * with any kind of lookbehind assertion, such as "\b".
+ *
+ * Returns: a %NULL-terminated gchar ** array. Free it using g_strfreev()
+ *
+ * Since: 2.14
+ **/
+gchar **
+g_regex_split_full (const GRegex *regex,
+ const gchar *string,
+ gssize string_len,
+ gint start_position,
+ GRegexMatchFlags match_options,
+ gint max_tokens,
+ GError **error)
+{
+ GError *tmp_error = NULL;
+ GMatchInfo *match_info;
+ GList *list, *last;
+ gint i;
+ gint token_count;
+ gboolean match_ok;
+ /* position of the last separator. */
+ gint last_separator_end;
+ /* was the last match 0 bytes long? */
+ gboolean last_match_is_empty;
+ /* the returned array of char **s */
+ gchar **string_list;
+
+ g_return_val_if_fail (regex != NULL, NULL);
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (start_position >= 0, NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+ g_return_val_if_fail ((match_options & ~G_REGEX_MATCH_MASK) == 0, NULL);
+
+ if (max_tokens <= 0)
+ max_tokens = G_MAXINT;
+
+ if (string_len < 0)
+ string_len = strlen (string);
+
+ /* zero-length string */
+ if (string_len - start_position == 0)
+ return g_new0 (gchar *, 1);
+
+ if (max_tokens == 1)
+ {
+ string_list = g_new0 (gchar *, 2);
+ string_list[0] = g_strndup (&string[start_position],
+ string_len - start_position);
+ return string_list;
+ }
+
+ list = NULL;
+ token_count = 0;
+ last_separator_end = start_position;
+ last_match_is_empty = FALSE;
+
+ match_ok = g_regex_match_full (regex, string, string_len, start_position,
+ match_options, &match_info, &tmp_error);
+ while (tmp_error == NULL)
+ {
+ if (match_ok)
+ {
+ last_match_is_empty =
+ (match_info->offsets[0] == match_info->offsets[1]);
+
+ /* we need to skip empty separators at the same position of the end
+ * of another separator. e.g. the string is "a b" and the separator
+ * is " *", so from 1 to 2 we have a match and at position 2 we have
+ * an empty match. */
+ if (last_separator_end != match_info->offsets[1])
+ {
+ gchar *token;
+ gint match_count;
+
+ token = g_strndup (string + last_separator_end,
+ match_info->offsets[0] - last_separator_end);
+ list = g_list_prepend (list, token);
+ token_count++;
+
+ /* if there were substrings, these need to be added to
+ * the list. */
+ match_count = g_match_info_get_match_count (match_info);
+ if (match_count > 1)
+ {
+ for (i = 1; i < match_count; i++)
+ list = g_list_prepend (list, g_match_info_fetch (match_info, i));
+ }
+ }
+ }
+ else
+ {
+ /* if there was no match, copy to end of string. */
+ if (!last_match_is_empty)
+ {
+ gchar *token = g_strndup (string + last_separator_end,
+ match_info->string_len - last_separator_end);
+ list = g_list_prepend (list, token);
+ }
+ /* no more tokens, end the loop. */
+ break;
+ }
+
+ /* -1 to leave room for the last part. */
+ if (token_count >= max_tokens - 1)
+ {
+ /* we have reached the maximum number of tokens, so we copy
+ * the remaining part of the string. */
+ if (last_match_is_empty)
+ {
+ /* the last match was empty, so we have moved one char
+ * after the real position to avoid empty matches at the
+ * same position. */
+ match_info->pos = PREV_CHAR (regex, &string[match_info->pos]) - string;
+ }
+ /* the if is needed in the case we have terminated the available
+ * tokens, but we are at the end of the string, so there are no
+ * characters left to copy. */
+ if (string_len > match_info->pos)
+ {
+ gchar *token = g_strndup (string + match_info->pos,
+ string_len - match_info->pos);
+ list = g_list_prepend (list, token);
+ }
+ /* end the loop. */
+ break;
+ }
+
+ last_separator_end = match_info->pos;
+ if (last_match_is_empty)
+ /* if the last match was empty, g_match_info_next() has moved
+ * forward to avoid infinite loops, but we still need to copy that
+ * character. */
+ last_separator_end = PREV_CHAR (regex, &string[last_separator_end]) - string;
+
+ match_ok = g_match_info_next (match_info, &tmp_error);
+ }
+ g_match_info_free (match_info);
+ if (tmp_error != NULL)
+ {
+ g_propagate_error (error, tmp_error);
+ g_list_foreach (list, (GFunc)g_free, NULL);
+ g_list_free (list);
+ match_info->pos = -1;
+ return NULL;
+ }
+
+ string_list = g_new (gchar *, g_list_length (list) + 1);
+ i = 0;
+ for (last = g_list_last (list); last; last = g_list_previous (last))
+ string_list[i++] = last->data;
+ string_list[i] = 0;
+ g_list_free (list);
+
+ return string_list;
+}
+
+enum
+{
+ REPL_TYPE_STRING,
+ REPL_TYPE_CHARACTER,
+ REPL_TYPE_SYMBOLIC_REFERENCE,
+ REPL_TYPE_NUMERIC_REFERENCE,
+ REPL_TYPE_CHANGE_CASE
+};
+
+typedef enum
+{
+ CHANGE_CASE_NONE = 1 << 0,
+ CHANGE_CASE_UPPER = 1 << 1,
+ CHANGE_CASE_LOWER = 1 << 2,
+ CHANGE_CASE_UPPER_SINGLE = 1 << 3,
+ CHANGE_CASE_LOWER_SINGLE = 1 << 4,
+ CHANGE_CASE_SINGLE_MASK = CHANGE_CASE_UPPER_SINGLE | CHANGE_CASE_LOWER_SINGLE,
+ CHANGE_CASE_LOWER_MASK = CHANGE_CASE_LOWER | CHANGE_CASE_LOWER_SINGLE,
+ CHANGE_CASE_UPPER_MASK = CHANGE_CASE_UPPER | CHANGE_CASE_UPPER_SINGLE
+} ChangeCase;
+
+struct _InterpolationData
+{
+ gchar *text;
+ gint type;
+ gint num;
+ gchar c;
+ ChangeCase change_case;
+};
+
+static void
+free_interpolation_data (InterpolationData *data)
+{
+ g_free (data->text);
+ g_free (data);
+}
+
+static const gchar *
+expand_escape (const gchar *replacement,
+ const gchar *p,
+ InterpolationData *data,
+ GError **error)
+{
+ const gchar *q, *r;
+ gint x, d, h, i;
+ const gchar *error_detail;
+ gint base = 0;
+ GError *tmp_error = NULL;
+
+ p++;
+ switch (*p)
+ {
+ case 't':
+ p++;
+ data->c = '\t';
+ data->type = REPL_TYPE_CHARACTER;
+ break;
+ case 'n':
+ p++;
+ data->c = '\n';
+ data->type = REPL_TYPE_CHARACTER;
+ break;
+ case 'v':
+ p++;
+ data->c = '\v';
+ data->type = REPL_TYPE_CHARACTER;
+ break;
+ case 'r':
+ p++;
+ data->c = '\r';
+ data->type = REPL_TYPE_CHARACTER;
+ break;
+ case 'f':
+ p++;
+ data->c = '\f';
+ data->type = REPL_TYPE_CHARACTER;
+ break;
+ case 'a':
+ p++;
+ data->c = '\a';
+ data->type = REPL_TYPE_CHARACTER;
+ break;
+ case 'b':
+ p++;
+ data->c = '\b';
+ data->type = REPL_TYPE_CHARACTER;
+ break;
+ case '\\':
+ p++;
+ data->c = '\\';
+ data->type = REPL_TYPE_CHARACTER;
+ break;
+ case 'x':
+ p++;
+ x = 0;
+ if (*p == '{')
+ {
+ p++;
+ do
+ {
+ h = g_ascii_xdigit_value (*p);
+ if (h < 0)
+ {
+ error_detail = _("hexadecimal digit or '}' expected");
+ goto error;
+ }
+ x = x * 16 + h;
+ p++;
+ }
+ while (*p != '}');
+ p++;
+ }
+ else
+ {
+ for (i = 0; i < 2; i++)
+ {
+ h = g_ascii_xdigit_value (*p);
+ if (h < 0)
+ {
+ error_detail = _("hexadecimal digit expected");
+ goto error;
+ }
+ x = x * 16 + h;
+ p++;
+ }
+ }
+ data->type = REPL_TYPE_STRING;
+ data->text = g_new0 (gchar, 8);
+ g_unichar_to_utf8 (x, data->text);
+ break;
+ case 'l':
+ p++;
+ data->type = REPL_TYPE_CHANGE_CASE;
+ data->change_case = CHANGE_CASE_LOWER_SINGLE;
+ break;
+ case 'u':
+ p++;
+ data->type = REPL_TYPE_CHANGE_CASE;
+ data->change_case = CHANGE_CASE_UPPER_SINGLE;
+ break;
+ case 'L':
+ p++;
+ data->type = REPL_TYPE_CHANGE_CASE;
+ data->change_case = CHANGE_CASE_LOWER;
+ break;
+ case 'U':
+ p++;
+ data->type = REPL_TYPE_CHANGE_CASE;
+ data->change_case = CHANGE_CASE_UPPER;
+ break;
+ case 'E':
+ p++;
+ data->type = REPL_TYPE_CHANGE_CASE;
+ data->change_case = CHANGE_CASE_NONE;
+ break;
+ case 'g':
+ p++;
+ if (*p != '<')
+ {
+ error_detail = _("missing '<' in symbolic reference");
+ goto error;
+ }
+ q = p + 1;
+ do
+ {
+ p++;
+ if (!*p)
+ {
+ error_detail = _("unfinished symbolic reference");
+ goto error;
+ }
+ }
+ while (*p != '>');
+ if (p - q == 0)
+ {
+ error_detail = _("zero-length symbolic reference");
+ goto error;
+ }
+ if (g_ascii_isdigit (*q))
+ {
+ x = 0;
+ do
+ {
+ h = g_ascii_digit_value (*q);
+ if (h < 0)
+ {
+ error_detail = _("digit expected");
+ p = q;
+ goto error;
+ }
+ x = x * 10 + h;
+ q++;
+ }
+ while (q != p);
+ data->num = x;
+ data->type = REPL_TYPE_NUMERIC_REFERENCE;
+ }
+ else
+ {
+ r = q;
+ do
+ {
+ if (!g_ascii_isalnum (*r))
+ {
+ error_detail = _("illegal symbolic reference");
+ p = r;
+ goto error;
+ }
+ r++;
+ }
+ while (r != p);
+ data->text = g_strndup (q, p - q);
+ data->type = REPL_TYPE_SYMBOLIC_REFERENCE;
+ }
+ p++;
+ break;
+ case '0':
+ /* if \0 is followed by a number is an octal number representing a
+ * character, else it is a numeric reference. */
+ if (g_ascii_digit_value (*g_utf8_next_char (p)) >= 0)
+ {
+ base = 8;
+ p = g_utf8_next_char (p);
+ }
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ x = 0;
+ d = 0;
+ for (i = 0; i < 3; i++)
+ {
+ h = g_ascii_digit_value (*p);
+ if (h < 0)
+ break;
+ if (h > 7)
+ {
+ if (base == 8)
+ break;
+ else
+ base = 10;
+ }
+ if (i == 2 && base == 10)
+ break;
+ x = x * 8 + h;
+ d = d * 10 + h;
+ p++;
+ }
+ if (base == 8 || i == 3)
+ {
+ data->type = REPL_TYPE_STRING;
+ data->text = g_new0 (gchar, 8);
+ g_unichar_to_utf8 (x, data->text);
+ }
+ else
+ {
+ data->type = REPL_TYPE_NUMERIC_REFERENCE;
+ data->num = d;
+ }
+ break;
+ case 0:
+ error_detail = _("stray final '\\'");
+ goto error;
+ break;
+ default:
+ error_detail = _("unknown escape sequence");
+ goto error;
+ }
+
+ return p;
+
+ error:
+ /* G_GSSIZE_FORMAT doesn't work with gettext, so we use %lu */
+ tmp_error = g_error_new (G_REGEX_ERROR,
+ G_REGEX_ERROR_REPLACE,
+ _("Error while parsing replacement "
+ "text \"%s\" at char %lu: %s"),
+ replacement,
+ (gulong)(p - replacement),
+ error_detail);
+ g_propagate_error (error, tmp_error);
+
+ return NULL;
+}
+
+static GList *
+split_replacement (const gchar *replacement,
+ GError **error)
+{
+ GList *list = NULL;
+ InterpolationData *data;
+ const gchar *p, *start;
+
+ start = p = replacement;
+ while (*p)
+ {
+ if (*p == '\\')
+ {
+ data = g_new0 (InterpolationData, 1);
+ start = p = expand_escape (replacement, p, data, error);
+ if (p == NULL)
+ {
+ g_list_foreach (list, (GFunc)free_interpolation_data, NULL);
+ g_list_free (list);
+ free_interpolation_data (data);
+
+ return NULL;
+ }
+ list = g_list_prepend (list, data);
+ }
+ else
+ {
+ p++;
+ if (*p == '\\' || *p == '\0')
+ {
+ if (p - start > 0)
+ {
+ data = g_new0 (InterpolationData, 1);
+ data->text = g_strndup (start, p - start);
+ data->type = REPL_TYPE_STRING;
+ list = g_list_prepend (list, data);
+ }
+ }
+ }
+ }
+
+ return g_list_reverse (list);
+}
+
+/* Change the case of c based on change_case. */
+#define CHANGE_CASE(c, change_case) \
+ (((change_case) & CHANGE_CASE_LOWER_MASK) ? \
+ g_unichar_tolower (c) : \
+ g_unichar_toupper (c))
+
+static void
+string_append (GString *string,
+ const gchar *text,
+ ChangeCase *change_case)
+{
+ gunichar c;
+
+ if (text[0] == '\0')
+ return;
+
+ if (*change_case == CHANGE_CASE_NONE)
+ {
+ g_string_append (string, text);
+ }
+ else if (*change_case & CHANGE_CASE_SINGLE_MASK)
+ {
+ c = g_utf8_get_char (text);
+ g_string_append_unichar (string, CHANGE_CASE (c, *change_case));
+ g_string_append (string, g_utf8_next_char (text));
+ *change_case = CHANGE_CASE_NONE;
+ }
+ else
+ {
+ while (*text != '\0')
+ {
+ c = g_utf8_get_char (text);
+ g_string_append_unichar (string, CHANGE_CASE (c, *change_case));
+ text = g_utf8_next_char (text);
+ }
+ }
+}
+
+static gboolean
+interpolate_replacement (const GMatchInfo *match_info,
+ GString *result,
+ gpointer data)
+{
+ GList *list;
+ InterpolationData *idata;
+ gchar *match;
+ ChangeCase change_case = CHANGE_CASE_NONE;
+
+ for (list = data; list; list = list->next)
+ {
+ idata = list->data;
+ switch (idata->type)
+ {
+ case REPL_TYPE_STRING:
+ string_append (result, idata->text, &change_case);
+ break;
+ case REPL_TYPE_CHARACTER:
+ g_string_append_c (result, CHANGE_CASE (idata->c, change_case));
+ if (change_case & CHANGE_CASE_SINGLE_MASK)
+ change_case = CHANGE_CASE_NONE;
+ break;
+ case REPL_TYPE_NUMERIC_REFERENCE:
+ match = g_match_info_fetch (match_info, idata->num);
+ if (match)
+ {
+ string_append (result, match, &change_case);
+ g_free (match);
+ }
+ break;
+ case REPL_TYPE_SYMBOLIC_REFERENCE:
+ match = g_match_info_fetch_named (match_info, idata->text);
+ if (match)
+ {
+ string_append (result, match, &change_case);
+ g_free (match);
+ }
+ break;
+ case REPL_TYPE_CHANGE_CASE:
+ change_case = idata->change_case;
+ break;
+ }
+ }
+
+ return FALSE;
+}
+
+/* whether actual match_info is needed for replacement, i.e.
+ * whether there are references
+ */
+static gboolean
+interpolation_list_needs_match (GList *list)
+{
+ while (list != NULL)
+ {
+ InterpolationData *data = list->data;
+
+ if (data->type == REPL_TYPE_SYMBOLIC_REFERENCE ||
+ data->type == REPL_TYPE_NUMERIC_REFERENCE)
+ {
+ return TRUE;
+ }
+
+ list = list->next;
+ }
+
+ return FALSE;
+}
+
+/**
+ * g_regex_replace:
+ * @regex: a #GRegex structure
+ * @string: the string to perform matches against
+ * @string_len: the length of @string, or -1 if @string is nul-terminated
+ * @start_position: starting index of the string to match
+ * @replacement: text to replace each match with
+ * @match_options: options for the match
+ * @error: location to store the error occuring, or %NULL to ignore errors
+ *
+ * Replaces all occurances of the pattern in @regex with the
+ * replacement text. Backreferences of the form '\number' or '\g&lt;number&gt;'
+ * in the replacement text are interpolated by the number-th captured
+ * subexpression of the match, '\g&lt;name&gt;' refers to the captured subexpression
+ * with the given name. '\0' refers to the complete match, but '\0' followed
+ * by a number is the octal representation of a character. To include a
+ * literal '\' in the replacement, write '\\'.
+ * There are also escapes that changes the case of the following text:
+ *
+ * <variablelist>
+ * <varlistentry><term>\l</term>
+ * <listitem>
+ * <para>Convert to lower case the next character</para>
+ * </listitem>
+ * </varlistentry>
+ * <varlistentry><term>\u</term>
+ * <listitem>
+ * <para>Convert to upper case the next character</para>
+ * </listitem>
+ * </varlistentry>
+ * <varlistentry><term>\L</term>
+ * <listitem>
+ * <para>Convert to lower case till \E</para>
+ * </listitem>
+ * </varlistentry>
+ * <varlistentry><term>\U</term>
+ * <listitem>
+ * <para>Convert to upper case till \E</para>
+ * </listitem>
+ * </varlistentry>
+ * <varlistentry><term>\E</term>
+ * <listitem>
+ * <para>End case modification</para>
+ * </listitem>
+ * </varlistentry>
+ * </variablelist>
+ *
+ * If you do not need to use backreferences use g_regex_replace_literal().
+ *
+ * The @replacement string must be UTF-8 encoded even if #G_REGEX_RAW was
+ * passed to g_regex_new(). If you want to use not UTF-8 encoded stings
+ * you can use g_regex_replace_literal().
+ *
+ * Setting @start_position differs from just passing over a shortened string
+ * and setting #G_REGEX_MATCH_NOTBOL in the case of a pattern that begins
+ * with any kind of lookbehind assertion, such as "\b".
+ *
+ * Returns: a newly allocated string containing the replacements
+ *
+ * Since: 2.14
+ */
+gchar *
+g_regex_replace (const GRegex *regex,
+ const gchar *string,
+ gssize string_len,
+ gint start_position,
+ const gchar *replacement,
+ GRegexMatchFlags match_options,
+ GError **error)
+{
+ gchar *result;
+ GList *list;
+ GError *tmp_error = NULL;
+
+ g_return_val_if_fail (regex != NULL, NULL);
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (start_position >= 0, NULL);
+ g_return_val_if_fail (replacement != NULL, NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+ g_return_val_if_fail ((match_options & ~G_REGEX_MATCH_MASK) == 0, NULL);
+
+ list = split_replacement (replacement, &tmp_error);
+ if (tmp_error != NULL)
+ {
+ g_propagate_error (error, tmp_error);
+ return NULL;
+ }
+
+ result = g_regex_replace_eval (regex,
+ string, string_len, start_position,
+ match_options,
+ interpolate_replacement,
+ (gpointer)list,
+ &tmp_error);
+ if (tmp_error != NULL)
+ g_propagate_error (error, tmp_error);
+
+ g_list_foreach (list, (GFunc)free_interpolation_data, NULL);
+ g_list_free (list);
+
+ return result;
+}
+
+static gboolean
+literal_replacement (const GMatchInfo *match_info,
+ GString *result,
+ gpointer data)
+{
+ g_string_append (result, data);
+ return FALSE;
+}
+
+/**
+ * g_regex_replace_literal:
+ * @regex: a #GRegex structure
+ * @string: the string to perform matches against
+ * @string_len: the length of @string, or -1 if @string is nul-terminated
+ * @start_position: starting index of the string to match
+ * @replacement: text to replace each match with
+ * @match_options: options for the match
+ * @error: location to store the error occuring, or %NULL to ignore errors
+ *
+ * Replaces all occurances of the pattern in @regex with the
+ * replacement text. @replacement is replaced literally, to
+ * include backreferences use g_regex_replace().
+ *
+ * Setting @start_position differs from just passing over a shortened string
+ * and setting #G_REGEX_MATCH_NOTBOL in the case of a pattern that begins
+ * with any kind of lookbehind assertion, such as "\b".
+ *
+ * Returns: a newly allocated string containing the replacements
+ *
+ * Since: 2.14
+ */
+gchar *
+g_regex_replace_literal (const GRegex *regex,
+ const gchar *string,
+ gssize string_len,
+ gint start_position,
+ const gchar *replacement,
+ GRegexMatchFlags match_options,
+ GError **error)
+{
+ g_return_val_if_fail (replacement != NULL, NULL);
+ g_return_val_if_fail ((match_options & ~G_REGEX_MATCH_MASK) == 0, NULL);
+
+ return g_regex_replace_eval (regex,
+ string, string_len, start_position,
+ match_options,
+ literal_replacement,
+ (gpointer)replacement,
+ error);
+}
+
+/**
+ * g_regex_replace_eval:
+ * @regex: a #GRegex structure from g_regex_new()
+ * @string: string to perform matches against
+ * @string_len: the length of @string, or -1 if @string is nul-terminated
+ * @start_position: starting index of the string to match
+ * @match_options: options for the match
+ * @eval: a function to call for each match
+ * @user_data: user data to pass to the function
+ * @error: location to store the error occuring, or %NULL to ignore errors
+ *
+ * Replaces occurances of the pattern in regex with the output of @eval
+ * for that occurance.
+ *
+ * Setting @start_position differs from just passing over a shortened string
+ * and setting #G_REGEX_MATCH_NOTBOL in the case of a pattern that begins
+ * with any kind of lookbehind assertion, such as "\b".
+ *
+ * Returns: a newly allocated string containing the replacements
+ *
+ * Since: 2.14
+ */
+gchar *
+g_regex_replace_eval (const GRegex *regex,
+ const gchar *string,
+ gssize string_len,
+ gint start_position,
+ GRegexMatchFlags match_options,
+ GRegexEvalCallback eval,
+ gpointer user_data,
+ GError **error)
+{
+ GMatchInfo *match_info;
+ GString *result;
+ gint str_pos = 0;
+ gboolean done = FALSE;
+ GError *tmp_error = NULL;
+
+ g_return_val_if_fail (regex != NULL, NULL);
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (start_position >= 0, NULL);
+ g_return_val_if_fail (eval != NULL, NULL);
+ g_return_val_if_fail ((match_options & ~G_REGEX_MATCH_MASK) == 0, NULL);
+
+ if (string_len < 0)
+ string_len = strlen (string);
+
+ result = g_string_sized_new (string_len);
+
+ /* run down the string making matches. */
+ g_regex_match_full (regex, string, string_len, start_position,
+ match_options, &match_info, &tmp_error);
+ while (!done && g_match_info_matches (match_info))
+ {
+ g_string_append_len (result,
+ string + str_pos,
+ match_info->offsets[0] - str_pos);
+ done = (*eval) (match_info, result, user_data);
+ str_pos = match_info->offsets[1];
+ g_match_info_next (match_info, &tmp_error);
+ }
+ g_match_info_free (match_info);
+ if (tmp_error != NULL)
+ {
+ g_propagate_error (error, tmp_error);
+ g_string_free (result, TRUE);
+ return NULL;
+ }
+
+ g_string_append_len (result, string + str_pos, string_len - str_pos);
+ return g_string_free (result, FALSE);
+}
+
+/**
+ * g_regex_check_replacement:
+ * @replacement: the replacement string
+ * @has_references: location to store information about
+ * references in @replacement or %NULL
+ * @error: location to store error
+ *
+ * Checks whether @replacement is a valid replacement string (see g_regex_replace()),
+ * i.e. that all escape sequences in it are valid.
+ *
+ * If @has_references is not %NULL then @replacement is checked for
+ * pattern references. For instance, replacement text 'foo\n'
+ * does not contain references and may be evaluated without information
+ * about actual match, but '\0\1' (whole match followed by first subpattern)
+ * requires valid #GMatchInfo object.
+ *
+ * Returns: whether @replacement is a valid replacement string
+ *
+ * Since: 2.14
+ */
+gboolean
+g_regex_check_replacement (const gchar *replacement,
+ gboolean *has_references,
+ GError **error)
+{
+ GList *list;
+ GError *tmp = NULL;
+
+ list = split_replacement (replacement, &tmp);
+
+ if (tmp)
+ {
+ g_propagate_error (error, tmp);
+ return FALSE;
+ }
+
+ if (has_references)
+ *has_references = interpolation_list_needs_match (list);
+
+ g_list_foreach (list, (GFunc) free_interpolation_data, NULL);
+ g_list_free (list);
+
+ return TRUE;
+}
+
+/**
+ * g_regex_escape_string:
+ * @string: the string to escape
+ * @length: the length of @string, or -1 if @string is nul-terminated
+ *
+ * Escapes the special characters used for regular expressions in @string,
+ * for instance "a.b*c" becomes "a\.b\*c". This function is useful to
+ * dynamically generate regular expressions.
+ *
+ * @string can contain nul characters that are replaced with "\0", in this
+ * case remember to specify the correct length of @string in @length.
+ *
+ * Returns: a newly-allocated escaped string
+ *
+ * Since: 2.14
+ */
+gchar *
+g_regex_escape_string (const gchar *string,
+ gint length)
+{
+ GString *escaped;
+ const char *p, *piece_start, *end;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ if (length < 0)
+ length = strlen (string);
+
+ end = string + length;
+ p = piece_start = string;
+ escaped = g_string_sized_new (length + 1);
+
+ while (p < end)
+ {
+ switch (*p)
+ {
+ case '\0':
+ case '\\':
+ case '|':
+ case '(':
+ case ')':
+ case '[':
+ case ']':
+ case '{':
+ case '}':
+ case '^':
+ case '$':
+ case '*':
+ case '+':
+ case '?':
+ case '.':
+ if (p != piece_start)
+ /* copy the previous piece. */
+ g_string_append_len (escaped, piece_start, p - piece_start);
+ g_string_append_c (escaped, '\\');
+ if (*p == '\0')
+ g_string_append_c (escaped, '0');
+ else
+ g_string_append_c (escaped, *p);
+ piece_start = ++p;
+ break;
+ default:
+ p = g_utf8_next_char (p);
+ break;
+ }
+ }
+
+ if (piece_start < end)
+ g_string_append_len (escaped, piece_start, end - piece_start);
+
+ return g_string_free (escaped, FALSE);
+}
+
+#define __G_REGEX_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gregex.h b/trunk/glib/gregex.h
new file mode 100644
index 000000000..7e0922413
--- /dev/null
+++ b/trunk/glib/gregex.h
@@ -0,0 +1,200 @@
+/* GRegex -- regular expression API wrapper around PCRE.
+ *
+ * Copyright (C) 1999, 2000 Scott Wimer
+ * Copyright (C) 2004, Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2005 - 2007, Marco Barisione <marco@barisione.org>
+ *
+ * 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.1 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __G_REGEX_H__
+#define __G_REGEX_H__
+
+#include <glib/gerror.h>
+#include <glib/gstring.h>
+
+G_BEGIN_DECLS
+
+typedef enum
+{
+ G_REGEX_ERROR_COMPILE,
+ G_REGEX_ERROR_OPTIMIZE,
+ G_REGEX_ERROR_REPLACE,
+ G_REGEX_ERROR_MATCH
+} GRegexError;
+
+#define G_REGEX_ERROR g_regex_error_quark ()
+
+GQuark g_regex_error_quark (void);
+
+/* Remember to update G_REGEX_COMPILE_MASK in gregex.c after
+ * adding a new flag. */
+typedef enum
+{
+ G_REGEX_CASELESS = 1 << 0,
+ G_REGEX_MULTILINE = 1 << 1,
+ G_REGEX_DOTALL = 1 << 2,
+ G_REGEX_EXTENDED = 1 << 3,
+ G_REGEX_ANCHORED = 1 << 4,
+ G_REGEX_DOLLAR_ENDONLY = 1 << 5,
+ G_REGEX_UNGREEDY = 1 << 9,
+ G_REGEX_RAW = 1 << 11,
+ G_REGEX_NO_AUTO_CAPTURE = 1 << 12,
+ G_REGEX_OPTIMIZE = 1 << 13,
+ G_REGEX_DUPNAMES = 1 << 19,
+ G_REGEX_NEWLINE_CR = 1 << 20,
+ G_REGEX_NEWLINE_LF = 1 << 21,
+ G_REGEX_NEWLINE_CRLF = G_REGEX_NEWLINE_CR | G_REGEX_NEWLINE_LF
+} GRegexCompileFlags;
+
+/* Remember to update G_REGEX_MATCH_MASK in gregex.c after
+ * adding a new flag. */
+typedef enum
+{
+ G_REGEX_MATCH_ANCHORED = 1 << 4,
+ G_REGEX_MATCH_NOTBOL = 1 << 7,
+ G_REGEX_MATCH_NOTEOL = 1 << 8,
+ G_REGEX_MATCH_NOTEMPTY = 1 << 10,
+ G_REGEX_MATCH_PARTIAL = 1 << 15,
+ G_REGEX_MATCH_NEWLINE_CR = 1 << 20,
+ G_REGEX_MATCH_NEWLINE_LF = 1 << 21,
+ G_REGEX_MATCH_NEWLINE_CRLF = G_REGEX_MATCH_NEWLINE_CR | G_REGEX_MATCH_NEWLINE_LF,
+ G_REGEX_MATCH_NEWLINE_ANY = 1 << 22
+} GRegexMatchFlags;
+
+typedef struct _GRegex GRegex;
+typedef struct _GMatchInfo GMatchInfo;
+
+typedef gboolean (*GRegexEvalCallback) (const GMatchInfo *match_info,
+ GString *result,
+ gpointer user_data);
+
+
+GRegex *g_regex_new (const gchar *pattern,
+ GRegexCompileFlags compile_options,
+ GRegexMatchFlags match_options,
+ GError **error);
+GRegex *g_regex_ref (GRegex *regex);
+void g_regex_unref (GRegex *regex);
+const gchar *g_regex_get_pattern (const GRegex *regex);
+gint g_regex_get_max_backref (const GRegex *regex);
+gint g_regex_get_capture_count (const GRegex *regex);
+gint g_regex_get_string_number (const GRegex *regex,
+ const gchar *name);
+gchar *g_regex_escape_string (const gchar *string,
+ gint length);
+
+/* Matching. */
+gboolean g_regex_match_simple (const gchar *pattern,
+ const gchar *string,
+ GRegexCompileFlags compile_options,
+ GRegexMatchFlags match_options);
+gboolean g_regex_match (const GRegex *regex,
+ const gchar *string,
+ GRegexMatchFlags match_options,
+ GMatchInfo **match_info);
+gboolean g_regex_match_full (const GRegex *regex,
+ const gchar *string,
+ gssize string_len,
+ gint start_position,
+ GRegexMatchFlags match_options,
+ GMatchInfo **match_info,
+ GError **error);
+gboolean g_regex_match_all (const GRegex *regex,
+ const gchar *string,
+ GRegexMatchFlags match_options,
+ GMatchInfo **match_info);
+gboolean g_regex_match_all_full (const GRegex *regex,
+ const gchar *string,
+ gssize string_len,
+ gint start_position,
+ GRegexMatchFlags match_options,
+ GMatchInfo **match_info,
+ GError **error);
+
+/* String splitting. */
+gchar **g_regex_split_simple (const gchar *pattern,
+ const gchar *string,
+ GRegexCompileFlags compile_options,
+ GRegexMatchFlags match_options);
+gchar **g_regex_split (const GRegex *regex,
+ const gchar *string,
+ GRegexMatchFlags match_options);
+gchar **g_regex_split_full (const GRegex *regex,
+ const gchar *string,
+ gssize string_len,
+ gint start_position,
+ GRegexMatchFlags match_options,
+ gint max_tokens,
+ GError **error);
+
+/* String replacement. */
+gchar *g_regex_replace (const GRegex *regex,
+ const gchar *string,
+ gssize string_len,
+ gint start_position,
+ const gchar *replacement,
+ GRegexMatchFlags match_options,
+ GError **error);
+gchar *g_regex_replace_literal (const GRegex *regex,
+ const gchar *string,
+ gssize string_len,
+ gint start_position,
+ const gchar *replacement,
+ GRegexMatchFlags match_options,
+ GError **error);
+gchar *g_regex_replace_eval (const GRegex *regex,
+ const gchar *string,
+ gssize string_len,
+ gint start_position,
+ GRegexMatchFlags match_options,
+ GRegexEvalCallback eval,
+ gpointer user_data,
+ GError **error);
+gboolean g_regex_check_replacement (const gchar *replacement,
+ gboolean *has_references,
+ GError **error);
+
+/* Match info */
+GRegex *g_match_info_get_regex (const GMatchInfo *match_info);
+const gchar *g_match_info_get_string (const GMatchInfo *match_info);
+
+void g_match_info_free (GMatchInfo *match_info);
+gboolean g_match_info_next (GMatchInfo *match_info,
+ GError **error);
+gboolean g_match_info_matches (const GMatchInfo *match_info);
+gint g_match_info_get_match_count (const GMatchInfo *match_info);
+gboolean g_match_info_is_partial_match (const GMatchInfo *match_info);
+gchar *g_match_info_expand_references(const GMatchInfo *match_info,
+ const gchar *string_to_expand,
+ GError **error);
+gchar *g_match_info_fetch (const GMatchInfo *match_info,
+ gint match_num);
+gboolean g_match_info_fetch_pos (const GMatchInfo *match_info,
+ gint match_num,
+ gint *start_pos,
+ gint *end_pos);
+gchar *g_match_info_fetch_named (const GMatchInfo *match_info,
+ const gchar *name);
+gboolean g_match_info_fetch_named_pos (const GMatchInfo *match_info,
+ const gchar *name,
+ gint *start_pos,
+ gint *end_pos);
+gchar **g_match_info_fetch_all (const GMatchInfo *match_info);
+
+G_END_DECLS
+
+
+#endif /* __G_REGEX_H__ */
diff --git a/trunk/glib/grel.c b/trunk/glib/grel.c
new file mode 100644
index 000000000..b7793be38
--- /dev/null
+++ b/trunk/glib/grel.c
@@ -0,0 +1,474 @@
+/* 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 "config.h"
+
+#include <stdarg.h>
+#include <string.h>
+
+#include "glib.h"
+#include "galias.h"
+
+
+typedef struct _GRealTuples GRealTuples;
+
+struct _GRelation
+{
+ gint fields;
+ gint current_field;
+
+ GHashTable *all_tuples;
+ GHashTable **hashed_tuple_tables;
+
+ 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)
+{
+ GRelation* rel = g_new0 (GRelation, 1);
+
+ rel->fields = fields;
+ rel->all_tuples = g_hash_table_new (tuple_hash (fields), tuple_equal (fields));
+ rel->hashed_tuple_tables = g_new0 (GHashTable*, fields);
+
+ return rel;
+}
+
+static void
+relation_delete_value_tuple (gpointer tuple_key,
+ gpointer tuple_value,
+ gpointer user_data)
+{
+ GRelation *relation = user_data;
+ gpointer *tuple = tuple_value;
+ g_slice_free1 (relation->fields * sizeof (gpointer), tuple);
+}
+
+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)
+{
+ gint i;
+
+ if (relation)
+ {
+ for (i = 0; i < relation->fields; i += 1)
+ {
+ if (relation->hashed_tuple_tables[i])
+ {
+ g_hash_table_foreach (relation->hashed_tuple_tables[i], g_relation_free_array, NULL);
+ g_hash_table_destroy (relation->hashed_tuple_tables[i]);
+ }
+ }
+
+ g_hash_table_foreach (relation->all_tuples, relation_delete_value_tuple, relation);
+ g_hash_table_destroy (relation->all_tuples);
+
+ g_free (relation->hashed_tuple_tables);
+ g_free (relation);
+ }
+}
+
+void
+g_relation_index (GRelation *relation,
+ gint field,
+ GHashFunc hash_func,
+ GEqualFunc key_equal_func)
+{
+ g_return_if_fail (relation != NULL);
+
+ g_return_if_fail (relation->count == 0 && relation->hashed_tuple_tables[field] == NULL);
+
+ relation->hashed_tuple_tables[field] = g_hash_table_new (hash_func, key_equal_func);
+}
+
+void
+g_relation_insert (GRelation *relation,
+ ...)
+{
+ gpointer* tuple = g_slice_alloc (relation->fields * sizeof (gpointer));
+ va_list args;
+ gint i;
+
+ va_start (args, relation);
+
+ for (i = 0; i < relation->fields; i += 1)
+ tuple[i] = va_arg (args, gpointer);
+
+ va_end (args);
+
+ g_hash_table_insert (relation->all_tuples, tuple, tuple);
+
+ relation->count += 1;
+
+ for (i = 0; i < relation->fields; i += 1)
+ {
+ GHashTable *table;
+ gpointer key;
+ GHashTable *per_key_table;
+
+ table = relation->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 (relation->fields), tuple_equal (relation->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;
+ GRelation *relation = (GRelation *) user_data;
+ gint j;
+
+ g_assert (tuple_key == tuple_value);
+
+ for (j = 0; j < relation->fields; j += 1)
+ {
+ GHashTable *one_table = relation->hashed_tuple_tables[j];
+ gpointer one_key;
+ GHashTable *per_key_table;
+
+ if (one_table == NULL)
+ continue;
+
+ if (j == relation->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);
+ }
+
+ if (g_hash_table_remove (relation->all_tuples, tuple))
+ g_slice_free1 (relation->fields * sizeof (gpointer), tuple);
+
+ relation->count -= 1;
+}
+
+gint
+g_relation_delete (GRelation *relation,
+ gconstpointer key,
+ gint field)
+{
+ GHashTable *table;
+ GHashTable *key_table;
+ gint count;
+
+ g_return_val_if_fail (relation != NULL, 0);
+
+ table = relation->hashed_tuple_tables[field];
+ count = relation->count;
+
+ g_return_val_if_fail (table != NULL, 0);
+
+ key_table = g_hash_table_lookup (table, key);
+
+ if (!key_table)
+ return 0;
+
+ relation->current_field = field;
+
+ g_hash_table_foreach (key_table, g_relation_delete_tuple, relation);
+
+ g_hash_table_remove (table, key);
+
+ g_hash_table_destroy (key_table);
+
+ /* @@@ FIXME: Remove empty hash tables. */
+
+ return count - relation->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)
+{
+ GHashTable *table;
+ GHashTable *key_table;
+ GRealTuples *tuples;
+ gint count;
+
+ g_return_val_if_fail (relation != NULL, NULL);
+
+ table = relation->hashed_tuple_tables[field];
+
+ g_return_val_if_fail (table != NULL, NULL);
+
+ tuples = g_new0 (GRealTuples, 1);
+ 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) * relation->fields * count);
+ tuples->width = relation->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)
+{
+ GHashTable *table;
+ GHashTable *key_table;
+
+ g_return_val_if_fail (relation != NULL, 0);
+
+ table = relation->hashed_tuple_tables[field];
+
+ 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, ...)
+{
+ gpointer *tuple = g_slice_alloc (relation->fields * sizeof (gpointer));
+ va_list args;
+ gint i;
+ gboolean result;
+
+ va_start(args, relation);
+
+ for (i = 0; i < relation->fields; i += 1)
+ tuple[i] = va_arg(args, gpointer);
+
+ va_end(args);
+
+ result = g_hash_table_lookup (relation->all_tuples, tuple) != NULL;
+
+ g_slice_free1 (relation->fields * sizeof (gpointer), 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;
+ GRelation* rel = (GRelation*) user_data;
+ gpointer* tuples = (gpointer*) tuple_value;
+
+ gstring = g_string_new ("[");
+
+ for (i = 0; i < rel->fields; i += 1)
+ {
+ g_string_append_printf (gstring, "%p", tuples[i]);
+
+ if (i < (rel->fields - 1))
+ g_string_append (gstring, ",");
+ }
+
+ g_string_append (gstring, "]");
+ g_log (G_LOG_DOMAIN, 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)
+{
+ GRelation* rel = (GRelation*) user_data;
+ GHashTable* table = (GHashTable*) tuple_value;
+
+ g_log (G_LOG_DOMAIN, 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;
+
+ g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "*** all tuples (%d)", relation->count);
+
+ g_hash_table_foreach (relation->all_tuples,
+ g_relation_print_one,
+ relation);
+
+ for (i = 0; i < relation->fields; i += 1)
+ {
+ if (relation->hashed_tuple_tables[i] == NULL)
+ continue;
+
+ g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "*** index %d", i);
+
+ g_hash_table_foreach (relation->hashed_tuple_tables[i],
+ g_relation_print_index,
+ relation);
+ }
+
+}
+
+#define __G_REL_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/grel.h b/trunk/glib/grel.h
new file mode 100644
index 000000000..275f05496
--- /dev/null
+++ b/trunk/glib/grel.h
@@ -0,0 +1,94 @@
+/* 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 <glib/gtypes.h>
+
+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/trunk/glib/gscanner.c b/trunk/glib/gscanner.c
new file mode 100644
index 000000000..233cc73b9
--- /dev/null
+++ b/trunk/glib/gscanner.c
@@ -0,0 +1,1767 @@
+/* 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
+ */
+
+#include "config.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "glib.h"
+#include "gprintfint.h"
+#include "galias.h"
+
+#ifdef G_OS_WIN32
+#include <io.h> /* 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 const 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 */,
+ FALSE /* store_int64 */,
+};
+
+
+/* --- 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,
+ gboolean 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 = 1;
+ 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->config->store_int64 = config_templ->store_int64;
+
+ scanner->token = G_TOKEN_NONE;
+ scanner->value.v_int64 = 0;
+ scanner->line = 1;
+ scanner->position = 0;
+
+ scanner->next_token = G_TOKEN_NONE;
+ scanner->next_value.v_int64 = 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,
+ gboolean is_error)
+{
+ g_return_if_fail (scanner != NULL);
+
+ _g_fprintf (stderr, "%s:%d: ",
+ scanner->input_name ? scanner->input_name : "<memory>",
+ scanner->line);
+ if (is_error)
+ _g_fprintf (stderr, "error: ");
+ _g_fprintf (stderr, "%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_int64 = 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 || scanner->token == G_TOKEN_ERROR;
+}
+
+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_int64 = 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_int64 = 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. useful
+ * for third party uses of our file descriptor, 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, token_string_len, "character `%c'", scanner->token);
+ else
+ _g_snprintf (token_string, token_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:
+ if (scanner->config->store_int64)
+ _g_snprintf (token_string, token_string_len, "number `%" G_GUINT64_FORMAT "'", scanner->value.v_int64);
+ else
+ _g_snprintf (token_string, token_string_len, "number `%lu'", 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;
+ gchar *tstring;
+ case G_TOKEN_EOF:
+ _g_snprintf (expected_string, expected_string_len, "end of file");
+ break;
+ 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_CHAR:
+ _g_snprintf (expected_string, expected_string_len, "%scharacter",
+ scanner->token == G_TOKEN_CHAR ? "valid " : "");
+ break;
+ case G_TOKEN_BINARY:
+ tstring = "binary";
+ _g_snprintf (expected_string, expected_string_len, "%snumber (%s)",
+ scanner->token == expected_token ? "valid " : "", tstring);
+ break;
+ case G_TOKEN_OCTAL:
+ tstring = "octal";
+ _g_snprintf (expected_string, expected_string_len, "%snumber (%s)",
+ scanner->token == expected_token ? "valid " : "", tstring);
+ break;
+ case G_TOKEN_INT:
+ tstring = "integer";
+ _g_snprintf (expected_string, expected_string_len, "%snumber (%s)",
+ scanner->token == expected_token ? "valid " : "", tstring);
+ break;
+ case G_TOKEN_HEX:
+ tstring = "hexadecimal";
+ _g_snprintf (expected_string, expected_string_len, "%snumber (%s)",
+ scanner->token == expected_token ? "valid " : "", tstring);
+ break;
+ case G_TOKEN_FLOAT:
+ tstring = "float";
+ _g_snprintf (expected_string, expected_string_len, "%snumber (%s)",
+ scanner->token == expected_token ? "valid " : "", tstring);
+ 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:
+ need_valid = (scanner->token == G_TOKEN_IDENTIFIER_NULL ||
+ scanner->token == G_TOKEN_IDENTIFIER);
+ _g_snprintf (expected_string,
+ expected_string_len,
+ "%s%s",
+ need_valid ? "valid " : "",
+ identifier_spec);
+ break;
+ case G_TOKEN_COMMENT_SINGLE:
+ tstring = "single-line";
+ _g_snprintf (expected_string, expected_string_len, "%scomment (%s)",
+ scanner->token == expected_token ? "valid " : "", tstring);
+ break;
+ case G_TOKEN_COMMENT_MULTI:
+ tstring = "multi-line";
+ _g_snprintf (expected_string, expected_string_len, "%scomment (%s)",
+ scanner->token == expected_token ? "valid " : "", tstring);
+ break;
+ case G_TOKEN_NONE:
+ case G_TOKEN_ERROR:
+ /* this is handled upon printout */
+ break;
+ }
+
+ if (message && message[0] != 0)
+ message_prefix = " - ";
+ else
+ {
+ message_prefix = "";
+ message = "";
+ }
+ if (expected_token == G_TOKEN_ERROR)
+ {
+ msg_handler (scanner,
+ "failure around %s%s%s",
+ token_string,
+ message_prefix,
+ message);
+ }
+ else if (expected_token == G_TOKEN_NONE)
+ {
+ 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);
+ }
+ else
+ {
+ 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);
+ }
+
+ g_free (token_string);
+ g_free (expected_string);
+}
+
+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;
+ if (scanner->config->store_int64)
+ {
+#ifdef _MSC_VER
+ /* work around error C2520, see gvaluetransform.c */
+ value_p->v_float = (__int64)value_p->v_int64;
+#else
+ value_p->v_float = value_p->v_int64;
+#endif
+ }
+ else
+ 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_int64 = 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_int64 = 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 (NULL);
+ 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 (NULL);
+ 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 (NULL);
+ 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;
+ if (token == G_TOKEN_FLOAT)
+ value.v_float = g_strtod (gstring->str, &endptr);
+ else
+ {
+ guint64 ui64 = 0;
+ switch (token)
+ {
+ case G_TOKEN_BINARY:
+ ui64 = g_ascii_strtoull (gstring->str, &endptr, 2);
+ break;
+ case G_TOKEN_OCTAL:
+ ui64 = g_ascii_strtoull (gstring->str, &endptr, 8);
+ break;
+ case G_TOKEN_INT:
+ ui64 = g_ascii_strtoull (gstring->str, &endptr, 10);
+ break;
+ case G_TOKEN_HEX:
+ ui64 = g_ascii_strtoull (gstring->str, &endptr, 16);
+ break;
+ default: ;
+ }
+ if (scanner->config->store_int64)
+ value.v_int64 = ui64;
+ else
+ value.v_int = ui64;
+ }
+ 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 (NULL);
+ 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);
+ }
+ /* ignore a missing newline at EOF for single line comments */
+ if (in_comment_single &&
+ config->cpair_comment_single[1] == '\n')
+ in_comment_single = FALSE;
+ }
+ 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 (NULL);
+ 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 = 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;
+}
+
+#define __G_SCANNER_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gscanner.h b/trunk/glib/gscanner.h
new file mode 100644
index 000000000..a61c0a5b6
--- /dev/null
+++ b/trunk/glib/gscanner.h
@@ -0,0 +1,275 @@
+/* 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 <glib/gdataset.h>
+#include <glib/ghash.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GScanner GScanner;
+typedef struct _GScannerConfig GScannerConfig;
+typedef union _GTokenValue GTokenValue;
+
+typedef void (*GScannerMsgFunc) (GScanner *scanner,
+ gchar *message,
+ gboolean 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;
+ guint64 v_int64;
+ 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? */
+ guint store_int64 : 1; /* use value.v_int64 rather than v_int */
+ guint padding_dummy;
+};
+
+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);
+
+#ifndef G_DISABLE_DEPRECATED
+
+/* 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
+
+/* 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/trunk/glib/gscripttable.h b/trunk/glib/gscripttable.h
new file mode 100644
index 000000000..410c12e54
--- /dev/null
+++ b/trunk/glib/gscripttable.h
@@ -0,0 +1,2982 @@
+/* gscripttable.h: Generated by gen-script-table.pl
+ *
+ * Date: Tue Jul 25 01:42:49 2006
+ * Source: Scripts-5.0.0.txt
+ *
+ * Do not edit.
+ */
+
+#define G_EASY_SCRIPTS_RANGE 8192
+
+static const guchar g_script_easy_table[8192] = {
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC,
+ G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC,
+ G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC,
+ G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC,
+ G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_ARMENIAN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW,
+ G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA,
+ G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI,
+ G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI,
+ G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI,
+ G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA,
+ G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL,
+ G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU,
+ G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM,
+ G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI,
+ G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR,
+ G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC,
+ G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM,
+ G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM,
+ G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM,
+ G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM,
+ G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM,
+ G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM,
+ G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM,
+ G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM,
+ G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM,
+ G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_RUNIC,
+ G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAGALOG,
+ G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG,
+ G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG,
+ G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG,
+ G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG,
+ G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG,
+ G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO,
+ G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO,
+ G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO,
+ G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO,
+ G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO,
+ G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO,
+ G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO,
+ G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID,
+ G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID,
+ G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID,
+ G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID,
+ G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID,
+ G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID,
+ G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAGBANWA,
+ G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA,
+ G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA,
+ G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA,
+ G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA,
+ G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAGBANWA,
+ G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_COMMON,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN,
+ G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU,
+ G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE,
+ G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE,
+ G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE,
+ G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE,
+ G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE,
+ G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE,
+ G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE,
+ G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE,
+ G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE,
+ G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAI_LE,
+ G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE,
+ G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER,
+ G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_BUGINESE,
+ G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE,
+ G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE,
+ G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE,
+ G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE,
+ G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE,
+ G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE,
+ G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE,
+ G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE,
+ G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BUGINESE,
+ G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE,
+ G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_CYRILLIC,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN,
+ G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK,
+ G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN,
+};
+
+static const struct {
+ gunichar start;
+ guint16 chars;
+ guint16 script;
+} g_script_table[] = {
+ { 0x2000, 12, G_UNICODE_SCRIPT_COMMON },
+ { 0x200c, 2, G_UNICODE_SCRIPT_INHERITED },
+ { 0x200e, 86, G_UNICODE_SCRIPT_COMMON },
+ { 0x206a, 7, G_UNICODE_SCRIPT_COMMON },
+ { 0x2071, 1, G_UNICODE_SCRIPT_LATIN },
+ { 0x2074, 11, G_UNICODE_SCRIPT_COMMON },
+ { 0x207f, 1, G_UNICODE_SCRIPT_LATIN },
+ { 0x2080, 15, G_UNICODE_SCRIPT_COMMON },
+ { 0x2090, 5, G_UNICODE_SCRIPT_LATIN },
+ { 0x20a0, 22, G_UNICODE_SCRIPT_COMMON },
+ { 0x20d0, 32, G_UNICODE_SCRIPT_INHERITED },
+ { 0x2100, 38, G_UNICODE_SCRIPT_COMMON },
+ { 0x2126, 1, G_UNICODE_SCRIPT_GREEK },
+ { 0x2127, 3, G_UNICODE_SCRIPT_COMMON },
+ { 0x212a, 2, G_UNICODE_SCRIPT_LATIN },
+ { 0x212c, 6, G_UNICODE_SCRIPT_COMMON },
+ { 0x2132, 1, G_UNICODE_SCRIPT_LATIN },
+ { 0x2133, 27, G_UNICODE_SCRIPT_COMMON },
+ { 0x214e, 1, G_UNICODE_SCRIPT_LATIN },
+ { 0x2153, 49, G_UNICODE_SCRIPT_COMMON },
+ { 0x2184, 1, G_UNICODE_SCRIPT_LATIN },
+ { 0x2190, 600, G_UNICODE_SCRIPT_COMMON },
+ { 0x2400, 39, G_UNICODE_SCRIPT_COMMON },
+ { 0x2440, 11, G_UNICODE_SCRIPT_COMMON },
+ { 0x2460, 573, G_UNICODE_SCRIPT_COMMON },
+ { 0x26a0, 19, G_UNICODE_SCRIPT_COMMON },
+ { 0x2701, 4, G_UNICODE_SCRIPT_COMMON },
+ { 0x2706, 4, G_UNICODE_SCRIPT_COMMON },
+ { 0x270c, 28, G_UNICODE_SCRIPT_COMMON },
+ { 0x2729, 35, G_UNICODE_SCRIPT_COMMON },
+ { 0x274d, 1, G_UNICODE_SCRIPT_COMMON },
+ { 0x274f, 4, G_UNICODE_SCRIPT_COMMON },
+ { 0x2756, 1, G_UNICODE_SCRIPT_COMMON },
+ { 0x2758, 7, G_UNICODE_SCRIPT_COMMON },
+ { 0x2761, 52, G_UNICODE_SCRIPT_COMMON },
+ { 0x2798, 24, G_UNICODE_SCRIPT_COMMON },
+ { 0x27b1, 14, G_UNICODE_SCRIPT_COMMON },
+ { 0x27c0, 11, G_UNICODE_SCRIPT_COMMON },
+ { 0x27d0, 28, G_UNICODE_SCRIPT_COMMON },
+ { 0x27f0, 16, G_UNICODE_SCRIPT_COMMON },
+ { 0x2800, 256, G_UNICODE_SCRIPT_BRAILLE },
+ { 0x2900, 539, G_UNICODE_SCRIPT_COMMON },
+ { 0x2b20, 4, G_UNICODE_SCRIPT_COMMON },
+ { 0x2c00, 47, G_UNICODE_SCRIPT_GLAGOLITIC },
+ { 0x2c30, 47, G_UNICODE_SCRIPT_GLAGOLITIC },
+ { 0x2c60, 13, G_UNICODE_SCRIPT_LATIN },
+ { 0x2c74, 4, G_UNICODE_SCRIPT_LATIN },
+ { 0x2c80, 107, G_UNICODE_SCRIPT_COPTIC },
+ { 0x2cf9, 7, G_UNICODE_SCRIPT_COPTIC },
+ { 0x2d00, 38, G_UNICODE_SCRIPT_GEORGIAN },
+ { 0x2d30, 54, G_UNICODE_SCRIPT_TIFINAGH },
+ { 0x2d6f, 1, G_UNICODE_SCRIPT_TIFINAGH },
+ { 0x2d80, 23, G_UNICODE_SCRIPT_ETHIOPIC },
+ { 0x2da0, 7, G_UNICODE_SCRIPT_ETHIOPIC },
+ { 0x2da8, 7, G_UNICODE_SCRIPT_ETHIOPIC },
+ { 0x2db0, 7, G_UNICODE_SCRIPT_ETHIOPIC },
+ { 0x2db8, 7, G_UNICODE_SCRIPT_ETHIOPIC },
+ { 0x2dc0, 7, G_UNICODE_SCRIPT_ETHIOPIC },
+ { 0x2dc8, 7, G_UNICODE_SCRIPT_ETHIOPIC },
+ { 0x2dd0, 7, G_UNICODE_SCRIPT_ETHIOPIC },
+ { 0x2dd8, 7, G_UNICODE_SCRIPT_ETHIOPIC },
+ { 0x2e00, 24, G_UNICODE_SCRIPT_COMMON },
+ { 0x2e1c, 2, G_UNICODE_SCRIPT_COMMON },
+ { 0x2e80, 26, G_UNICODE_SCRIPT_HAN },
+ { 0x2e9b, 89, G_UNICODE_SCRIPT_HAN },
+ { 0x2f00, 214, G_UNICODE_SCRIPT_HAN },
+ { 0x2ff0, 12, G_UNICODE_SCRIPT_COMMON },
+ { 0x3000, 5, G_UNICODE_SCRIPT_COMMON },
+ { 0x3005, 1, G_UNICODE_SCRIPT_HAN },
+ { 0x3006, 1, G_UNICODE_SCRIPT_COMMON },
+ { 0x3007, 1, G_UNICODE_SCRIPT_HAN },
+ { 0x3008, 25, G_UNICODE_SCRIPT_COMMON },
+ { 0x3021, 9, G_UNICODE_SCRIPT_HAN },
+ { 0x302a, 6, G_UNICODE_SCRIPT_INHERITED },
+ { 0x3030, 8, G_UNICODE_SCRIPT_COMMON },
+ { 0x3038, 4, G_UNICODE_SCRIPT_HAN },
+ { 0x303c, 4, G_UNICODE_SCRIPT_COMMON },
+ { 0x3041, 86, G_UNICODE_SCRIPT_HIRAGANA },
+ { 0x3099, 2, G_UNICODE_SCRIPT_INHERITED },
+ { 0x309b, 2, G_UNICODE_SCRIPT_COMMON },
+ { 0x309d, 3, G_UNICODE_SCRIPT_HIRAGANA },
+ { 0x30a0, 1, G_UNICODE_SCRIPT_COMMON },
+ { 0x30a1, 90, G_UNICODE_SCRIPT_KATAKANA },
+ { 0x30fb, 2, G_UNICODE_SCRIPT_COMMON },
+ { 0x30fd, 3, G_UNICODE_SCRIPT_KATAKANA },
+ { 0x3105, 40, G_UNICODE_SCRIPT_BOPOMOFO },
+ { 0x3131, 94, G_UNICODE_SCRIPT_HANGUL },
+ { 0x3190, 16, G_UNICODE_SCRIPT_COMMON },
+ { 0x31a0, 24, G_UNICODE_SCRIPT_BOPOMOFO },
+ { 0x31c0, 16, G_UNICODE_SCRIPT_COMMON },
+ { 0x31f0, 16, G_UNICODE_SCRIPT_KATAKANA },
+ { 0x3200, 31, G_UNICODE_SCRIPT_HANGUL },
+ { 0x3220, 36, G_UNICODE_SCRIPT_COMMON },
+ { 0x3250, 16, G_UNICODE_SCRIPT_COMMON },
+ { 0x3260, 30, G_UNICODE_SCRIPT_HANGUL },
+ { 0x327e, 129, G_UNICODE_SCRIPT_COMMON },
+ { 0x3300, 256, G_UNICODE_SCRIPT_COMMON },
+ { 0x3400, 6582, G_UNICODE_SCRIPT_HAN },
+ { 0x4dc0, 64, G_UNICODE_SCRIPT_COMMON },
+ { 0x4e00, 20924, G_UNICODE_SCRIPT_HAN },
+ { 0xa000, 1165, G_UNICODE_SCRIPT_YI },
+ { 0xa490, 55, G_UNICODE_SCRIPT_YI },
+ { 0xa700, 27, G_UNICODE_SCRIPT_COMMON },
+ { 0xa720, 2, G_UNICODE_SCRIPT_COMMON },
+ { 0xa800, 44, G_UNICODE_SCRIPT_SYLOTI_NAGRI },
+ { 0xa840, 56, G_UNICODE_SCRIPT_PHAGS_PA },
+ { 0xac00, 11172, G_UNICODE_SCRIPT_HANGUL },
+ { 0xf900, 302, G_UNICODE_SCRIPT_HAN },
+ { 0xfa30, 59, G_UNICODE_SCRIPT_HAN },
+ { 0xfa70, 106, G_UNICODE_SCRIPT_HAN },
+ { 0xfb00, 7, G_UNICODE_SCRIPT_LATIN },
+ { 0xfb13, 5, G_UNICODE_SCRIPT_ARMENIAN },
+ { 0xfb1d, 26, G_UNICODE_SCRIPT_HEBREW },
+ { 0xfb38, 5, G_UNICODE_SCRIPT_HEBREW },
+ { 0xfb3e, 1, G_UNICODE_SCRIPT_HEBREW },
+ { 0xfb40, 2, G_UNICODE_SCRIPT_HEBREW },
+ { 0xfb43, 2, G_UNICODE_SCRIPT_HEBREW },
+ { 0xfb46, 10, G_UNICODE_SCRIPT_HEBREW },
+ { 0xfb50, 98, G_UNICODE_SCRIPT_ARABIC },
+ { 0xfbd3, 363, G_UNICODE_SCRIPT_ARABIC },
+ { 0xfd3e, 2, G_UNICODE_SCRIPT_COMMON },
+ { 0xfd50, 64, G_UNICODE_SCRIPT_ARABIC },
+ { 0xfd92, 54, G_UNICODE_SCRIPT_ARABIC },
+ { 0xfdf0, 13, G_UNICODE_SCRIPT_ARABIC },
+ { 0xfdfd, 1, G_UNICODE_SCRIPT_COMMON },
+ { 0xfe00, 16, G_UNICODE_SCRIPT_INHERITED },
+ { 0xfe10, 10, G_UNICODE_SCRIPT_COMMON },
+ { 0xfe20, 4, G_UNICODE_SCRIPT_INHERITED },
+ { 0xfe30, 35, G_UNICODE_SCRIPT_COMMON },
+ { 0xfe54, 19, G_UNICODE_SCRIPT_COMMON },
+ { 0xfe68, 4, G_UNICODE_SCRIPT_COMMON },
+ { 0xfe70, 5, G_UNICODE_SCRIPT_ARABIC },
+ { 0xfe76, 135, G_UNICODE_SCRIPT_ARABIC },
+ { 0xfeff, 1, G_UNICODE_SCRIPT_COMMON },
+ { 0xff01, 32, G_UNICODE_SCRIPT_COMMON },
+ { 0xff21, 26, G_UNICODE_SCRIPT_LATIN },
+ { 0xff3b, 6, G_UNICODE_SCRIPT_COMMON },
+ { 0xff41, 26, G_UNICODE_SCRIPT_LATIN },
+ { 0xff5b, 11, G_UNICODE_SCRIPT_COMMON },
+ { 0xff66, 10, G_UNICODE_SCRIPT_KATAKANA },
+ { 0xff70, 1, G_UNICODE_SCRIPT_COMMON },
+ { 0xff71, 45, G_UNICODE_SCRIPT_KATAKANA },
+ { 0xff9e, 2, G_UNICODE_SCRIPT_COMMON },
+ { 0xffa0, 31, G_UNICODE_SCRIPT_HANGUL },
+ { 0xffc2, 6, G_UNICODE_SCRIPT_HANGUL },
+ { 0xffca, 6, G_UNICODE_SCRIPT_HANGUL },
+ { 0xffd2, 6, G_UNICODE_SCRIPT_HANGUL },
+ { 0xffda, 3, G_UNICODE_SCRIPT_HANGUL },
+ { 0xffe0, 7, G_UNICODE_SCRIPT_COMMON },
+ { 0xffe8, 7, G_UNICODE_SCRIPT_COMMON },
+ { 0xfff9, 5, G_UNICODE_SCRIPT_COMMON },
+ { 0x10000, 12, G_UNICODE_SCRIPT_LINEAR_B },
+ { 0x1000d, 26, G_UNICODE_SCRIPT_LINEAR_B },
+ { 0x10028, 19, G_UNICODE_SCRIPT_LINEAR_B },
+ { 0x1003c, 2, G_UNICODE_SCRIPT_LINEAR_B },
+ { 0x1003f, 15, G_UNICODE_SCRIPT_LINEAR_B },
+ { 0x10050, 14, G_UNICODE_SCRIPT_LINEAR_B },
+ { 0x10080, 123, G_UNICODE_SCRIPT_LINEAR_B },
+ { 0x10100, 3, G_UNICODE_SCRIPT_COMMON },
+ { 0x10107, 45, G_UNICODE_SCRIPT_COMMON },
+ { 0x10137, 9, G_UNICODE_SCRIPT_COMMON },
+ { 0x10140, 75, G_UNICODE_SCRIPT_GREEK },
+ { 0x10300, 31, G_UNICODE_SCRIPT_OLD_ITALIC },
+ { 0x10320, 4, G_UNICODE_SCRIPT_OLD_ITALIC },
+ { 0x10330, 27, G_UNICODE_SCRIPT_GOTHIC },
+ { 0x10380, 30, G_UNICODE_SCRIPT_UGARITIC },
+ { 0x1039f, 1, G_UNICODE_SCRIPT_UGARITIC },
+ { 0x103a0, 36, G_UNICODE_SCRIPT_OLD_PERSIAN },
+ { 0x103c8, 14, G_UNICODE_SCRIPT_OLD_PERSIAN },
+ { 0x10400, 80, G_UNICODE_SCRIPT_DESERET },
+ { 0x10450, 48, G_UNICODE_SCRIPT_SHAVIAN },
+ { 0x10480, 30, G_UNICODE_SCRIPT_OSMANYA },
+ { 0x104a0, 10, G_UNICODE_SCRIPT_OSMANYA },
+ { 0x10800, 6, G_UNICODE_SCRIPT_CYPRIOT },
+ { 0x10808, 1, G_UNICODE_SCRIPT_CYPRIOT },
+ { 0x1080a, 44, G_UNICODE_SCRIPT_CYPRIOT },
+ { 0x10837, 2, G_UNICODE_SCRIPT_CYPRIOT },
+ { 0x1083c, 1, G_UNICODE_SCRIPT_CYPRIOT },
+ { 0x1083f, 1, G_UNICODE_SCRIPT_CYPRIOT },
+ { 0x10900, 26, G_UNICODE_SCRIPT_PHOENICIAN },
+ { 0x1091f, 1, G_UNICODE_SCRIPT_PHOENICIAN },
+ { 0x10a00, 4, G_UNICODE_SCRIPT_KHAROSHTHI },
+ { 0x10a05, 2, G_UNICODE_SCRIPT_KHAROSHTHI },
+ { 0x10a0c, 8, G_UNICODE_SCRIPT_KHAROSHTHI },
+ { 0x10a15, 3, G_UNICODE_SCRIPT_KHAROSHTHI },
+ { 0x10a19, 27, G_UNICODE_SCRIPT_KHAROSHTHI },
+ { 0x10a38, 3, G_UNICODE_SCRIPT_KHAROSHTHI },
+ { 0x10a3f, 9, G_UNICODE_SCRIPT_KHAROSHTHI },
+ { 0x10a50, 9, G_UNICODE_SCRIPT_KHAROSHTHI },
+ { 0x12000, 879, G_UNICODE_SCRIPT_CUNEIFORM },
+ { 0x12400, 99, G_UNICODE_SCRIPT_CUNEIFORM },
+ { 0x12470, 4, G_UNICODE_SCRIPT_CUNEIFORM },
+ { 0x1d000, 246, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d100, 39, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d12a, 61, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d167, 3, G_UNICODE_SCRIPT_INHERITED },
+ { 0x1d16a, 17, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d17b, 8, G_UNICODE_SCRIPT_INHERITED },
+ { 0x1d183, 2, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d185, 7, G_UNICODE_SCRIPT_INHERITED },
+ { 0x1d18c, 30, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d1aa, 4, G_UNICODE_SCRIPT_INHERITED },
+ { 0x1d1ae, 48, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d200, 70, G_UNICODE_SCRIPT_GREEK },
+ { 0x1d300, 87, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d360, 18, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d400, 85, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d456, 71, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d49e, 2, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d4a2, 1, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d4a5, 2, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d4a9, 4, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d4ae, 12, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d4bb, 1, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d4bd, 7, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d4c5, 65, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d507, 4, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d50d, 8, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d516, 7, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d51e, 28, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d53b, 4, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d540, 5, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d546, 1, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d54a, 7, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d552, 340, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d6a8, 292, G_UNICODE_SCRIPT_COMMON },
+ { 0x1d7ce, 50, G_UNICODE_SCRIPT_COMMON },
+ { 0x20000, 42711, G_UNICODE_SCRIPT_HAN },
+ { 0x2f800, 542, G_UNICODE_SCRIPT_HAN },
+ { 0xe0001, 1, G_UNICODE_SCRIPT_COMMON },
+ { 0xe0020, 96, G_UNICODE_SCRIPT_COMMON },
+ { 0xe0100, 240, G_UNICODE_SCRIPT_INHERITED },
+};
diff --git a/trunk/glib/gsequence.c b/trunk/glib/gsequence.c
new file mode 100644
index 000000000..e39078cbc
--- /dev/null
+++ b/trunk/glib/gsequence.c
@@ -0,0 +1,1740 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
+ * Soeren Sandmann (sandmann@daimi.au.dk)
+ *
+ * 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 "config.h"
+
+#include "glib.h"
+#include "galias.h"
+
+typedef struct _GSequenceNode GSequenceNode;
+
+struct _GSequence
+{
+ GSequenceNode * end_node;
+ GDestroyNotify data_destroy_notify;
+ gboolean access_prohibited;
+
+ /* The 'real_sequence' is used when temporary sequences are created
+ * to hold nodes that are being rearranged. The 'real_sequence' of such
+ * a temporary sequence points to the sequence that is actually being
+ * manipulated. The only reason we need this is so that when the
+ * sort/sort_changed/search_iter() functions call out to the application
+ * g_sequence_iter_get_sequence() will return the correct sequence.
+ */
+ GSequence * real_sequence;
+};
+
+struct _GSequenceNode
+{
+ gint n_nodes;
+ GSequenceNode * parent;
+ GSequenceNode * left;
+ GSequenceNode * right;
+ gpointer data; /* For the end node, this field points
+ * to the sequence
+ */
+};
+
+/*
+ * Declaration of GSequenceNode methods
+ */
+static GSequenceNode *node_new (gpointer data);
+static GSequenceNode *node_get_first (GSequenceNode *node);
+static GSequenceNode *node_get_last (GSequenceNode *node);
+static GSequenceNode *node_get_prev (GSequenceNode *node);
+static GSequenceNode *node_get_next (GSequenceNode *node);
+static gint node_get_pos (GSequenceNode *node);
+static GSequenceNode *node_get_by_pos (GSequenceNode *node,
+ gint pos);
+static GSequenceNode *node_find_closest (GSequenceNode *haystack,
+ GSequenceNode *needle,
+ GSequenceNode *end,
+ GSequenceIterCompareFunc cmp,
+ gpointer user_data);
+static gint node_get_length (GSequenceNode *node);
+static void node_free (GSequenceNode *node,
+ GSequence *seq);
+static void node_cut (GSequenceNode *split);
+static void node_insert_before (GSequenceNode *node,
+ GSequenceNode *new);
+static void node_unlink (GSequenceNode *node);
+static void node_join (GSequenceNode *left,
+ GSequenceNode *right);
+static void node_insert_sorted (GSequenceNode *node,
+ GSequenceNode *new,
+ GSequenceNode *end,
+ GSequenceIterCompareFunc cmp_func,
+ gpointer cmp_data);
+
+
+/*
+ * Various helper functions
+ */
+static void
+check_seq_access (GSequence *seq)
+{
+ if (G_UNLIKELY (seq->access_prohibited))
+ {
+ g_warning ("Accessing a sequence while it is "
+ "being sorted or searched is not allowed");
+ }
+}
+
+static GSequence *
+get_sequence (GSequenceNode *node)
+{
+ return (GSequence *)node_get_last (node)->data;
+}
+
+static void
+check_iter_access (GSequenceIter *iter)
+{
+ check_seq_access (get_sequence (iter));
+}
+
+static gboolean
+is_end (GSequenceIter *iter)
+{
+ GSequence *seq;
+
+ if (iter->right)
+ return FALSE;
+
+ if (!iter->parent)
+ return TRUE;
+
+ if (iter->parent->right != iter)
+ return FALSE;
+
+ seq = get_sequence (iter);
+
+ return seq->end_node == iter;
+}
+
+typedef struct
+{
+ GCompareDataFunc cmp_func;
+ gpointer cmp_data;
+ GSequenceNode *end_node;
+} SortInfo;
+
+/* This function compares two iters using a normal compare
+ * function and user_data passed in in a SortInfo struct
+ */
+static gint
+iter_compare (GSequenceIter *node1,
+ GSequenceIter *node2,
+ gpointer data)
+{
+ const SortInfo *info = data;
+ gint retval;
+
+ if (node1 == info->end_node)
+ return 1;
+
+ if (node2 == info->end_node)
+ return -1;
+
+ retval = info->cmp_func (node1->data, node2->data, info->cmp_data);
+
+ return retval;
+}
+
+/*
+ * Public API
+ */
+
+/**
+ * g_sequence_new:
+ * @data_destroy: a #GDestroyNotify function, or %NULL
+ *
+ * Creates a new GSequence. The @data_destroy function, if non-%NULL will
+ * be called on all items when the sequence is destroyed and on items that
+ * are removed from the sequence.
+ *
+ * Return value: a new #GSequence
+ *
+ * Since: 2.14
+ **/
+GSequence *
+g_sequence_new (GDestroyNotify data_destroy)
+{
+ GSequence *seq = g_new (GSequence, 1);
+ seq->data_destroy_notify = data_destroy;
+
+ seq->end_node = node_new (seq);
+
+ seq->access_prohibited = FALSE;
+
+ seq->real_sequence = seq;
+
+ return seq;
+}
+
+/**
+ * g_sequence_free:
+ * @seq: a #GSequence
+ *
+ * Frees the memory allocated for @seq. If @seq has a data destroy
+ * function associated with it, that function is called on all items in
+ * @seq.
+ *
+ * Since: 2.14
+ **/
+void
+g_sequence_free (GSequence *seq)
+{
+ g_return_if_fail (seq != NULL);
+
+ check_seq_access (seq);
+
+ node_free (seq->end_node, seq);
+
+ g_free (seq);
+}
+
+/**
+ * g_sequence_foreach_range:
+ * @begin: a #GSequenceIter
+ * @end: a #GSequenceIter
+ * @func: a #GFunc
+ * @user_data: user data passed to @func
+ *
+ * Calls @func for each item in the range (@begin, @end) passing
+ * @user_data to the function.
+ *
+ * Since: 2.14
+ **/
+void
+g_sequence_foreach_range (GSequenceIter *begin,
+ GSequenceIter *end,
+ GFunc func,
+ gpointer user_data)
+{
+ GSequence *seq;
+ GSequenceIter *iter;
+
+ g_return_if_fail (func != NULL);
+ g_return_if_fail (begin != NULL);
+ g_return_if_fail (end != NULL);
+
+ seq = get_sequence (begin);
+
+ seq->access_prohibited = TRUE;
+
+ iter = begin;
+ while (iter != end)
+ {
+ GSequenceIter *next = node_get_next (iter);
+
+ func (iter->data, user_data);
+
+ iter = next;
+ }
+
+ seq->access_prohibited = FALSE;
+}
+
+/**
+ * g_sequence_foreach:
+ * @seq: a #GSequence
+ * @func: the function to call for each item in @seq
+ * @user_data: user data passed to @func
+ *
+ * Calls @func for each item in the sequence passing @user_data
+ * to the function.
+ *
+ * Since: 2.14
+ **/
+void
+g_sequence_foreach (GSequence *seq,
+ GFunc func,
+ gpointer user_data)
+{
+ GSequenceIter *begin, *end;
+
+ check_seq_access (seq);
+
+ begin = g_sequence_get_begin_iter (seq);
+ end = g_sequence_get_end_iter (seq);
+
+ g_sequence_foreach_range (begin, end, func, user_data);
+}
+
+/**
+ * g_sequence_range_get_midpoint:
+ * @begin: a #GSequenceIter
+ * @end: a #GSequenceIter
+ *
+ * Finds an iterator somewhere in the range (@begin, @end). This
+ * iterator will be close to the middle of the range, but is not
+ * guaranteed to be <emphasis>exactly</emphasis> in the middle.
+ *
+ * The @begin and @end iterators must both point to the same sequence and
+ * @begin must come before or be equal to @end in the sequence.
+ *
+ * Return value: A #GSequenceIter pointing somewhere in the
+ * (@begin, @end) range.
+ *
+ * Since: 2.14
+ **/
+GSequenceIter *
+g_sequence_range_get_midpoint (GSequenceIter *begin,
+ GSequenceIter *end)
+{
+ int begin_pos, end_pos, mid_pos;
+
+ g_return_val_if_fail (begin != NULL, NULL);
+ g_return_val_if_fail (end != NULL, NULL);
+ g_return_val_if_fail (get_sequence (begin) == get_sequence (end), NULL);
+
+ begin_pos = node_get_pos (begin);
+ end_pos = node_get_pos (end);
+
+ g_return_val_if_fail (end_pos >= begin_pos, NULL);
+
+ mid_pos = begin_pos + (end_pos - begin_pos) / 2;
+
+ return node_get_by_pos (begin, mid_pos);
+}
+
+/**
+ * g_sequence_iter_compare:
+ * @a: a #GSequenceIter
+ * @b: a #GSequenceIter
+ *
+ * Returns a negative number if @a comes before @b, 0 if they are equal,
+ * and a positive number if @a comes after @b.
+ *
+ * The @a and @b iterators must point into the same sequence.
+ *
+ * Return value: A negative number if @a comes before @b, 0 if they are
+ * equal, and a positive number if @a comes after @b.
+ *
+ * Since: 2.14
+ **/
+gint
+g_sequence_iter_compare (GSequenceIter *a,
+ GSequenceIter *b)
+{
+ gint a_pos, b_pos;
+
+ g_return_val_if_fail (a != NULL, 0);
+ g_return_val_if_fail (b != NULL, 0);
+ g_return_val_if_fail (get_sequence (a) == get_sequence (b), 0);
+
+ check_iter_access (a);
+ check_iter_access (b);
+
+ a_pos = node_get_pos (a);
+ b_pos = node_get_pos (b);
+
+ if (a_pos == b_pos)
+ return 0;
+ else if (a_pos > b_pos)
+ return 1;
+ else
+ return -1;
+}
+
+/**
+ * g_sequence_append:
+ * @seq: a #GSequencePointer
+ * @data: the data for the new item
+ *
+ * Adds a new item to the end of @seq.
+ *
+ * Return value: an iterator pointing to the new item
+ *
+ * Since: 2.14
+ **/
+GSequenceIter *
+g_sequence_append (GSequence *seq,
+ gpointer data)
+{
+ GSequenceNode *node;
+
+ g_return_val_if_fail (seq != NULL, NULL);
+
+ check_seq_access (seq);
+
+ node = node_new (data);
+ node_insert_before (seq->end_node, node);
+
+ return node;
+}
+
+/**
+ * g_sequence_prepend:
+ * @seq: a #GSequence
+ * @data: the data for the new item
+ *
+ * Adds a new item to the front of @seq
+ *
+ * Return value: an iterator pointing to the new item
+ *
+ * Since: 2.14
+ **/
+GSequenceIter *
+g_sequence_prepend (GSequence *seq,
+ gpointer data)
+{
+ GSequenceNode *node, *first;
+
+ g_return_val_if_fail (seq != NULL, NULL);
+
+ check_seq_access (seq);
+
+ node = node_new (data);
+ first = node_get_first (seq->end_node);
+
+ node_insert_before (first, node);
+
+ return node;
+}
+
+/**
+ * g_sequence_insert_before:
+ * @iter: a #GSequenceIter
+ * @data: the data for the new item
+ *
+ * Inserts a new item just before the item pointed to by @iter.
+ *
+ * Return value: an iterator pointing to the new item
+ *
+ * Since: 2.14
+ **/
+GSequenceIter *
+g_sequence_insert_before (GSequenceIter *iter,
+ gpointer data)
+{
+ GSequenceNode *node;
+
+ g_return_val_if_fail (iter != NULL, NULL);
+
+ check_iter_access (iter);
+
+ node = node_new (data);
+
+ node_insert_before (iter, node);
+
+ return node;
+}
+
+/**
+ * g_sequence_remove:
+ * @iter: a #GSequenceIter
+ *
+ * Removes the item pointed to by @iter. It is an error to pass the
+ * end iterator to this function.
+ *
+ * If the sequnce has a data destroy function associated with it, this
+ * function is called on the data for the removed item.
+ *
+ * Since: 2.14
+ **/
+void
+g_sequence_remove (GSequenceIter *iter)
+{
+ GSequence *seq;
+
+ g_return_if_fail (iter != NULL);
+ g_return_if_fail (!is_end (iter));
+
+ check_iter_access (iter);
+
+ seq = get_sequence (iter);
+
+ node_unlink (iter);
+ node_free (iter, seq);
+}
+
+/**
+ * g_sequence_remove_range:
+ * @begin: a #GSequenceIter
+ * @end: a #GSequenceIter
+ *
+ * Removes all items in the (@begin, @end) range.
+ *
+ * If the sequence has a data destroy function associated with it, this
+ * function is called on the data for the removed items.
+ *
+ * Since: 2.14
+ **/
+void
+g_sequence_remove_range (GSequenceIter *begin,
+ GSequenceIter *end)
+{
+ g_return_if_fail (get_sequence (begin) == get_sequence (end));
+
+ check_iter_access (begin);
+ check_iter_access (end);
+
+ g_sequence_move_range (NULL, begin, end);
+}
+
+/**
+ * g_sequence_move_range:
+ * @dest: a #GSequenceIter
+ * @begin: a #GSequenceIter
+ * @end: a #GSequenceIter
+ *
+ * Inserts the (@begin, @end) range at the destination pointed to by ptr.
+ * The @begin and @end iters must point into the same sequence. It is
+ * allowed for @dest to point to a different sequence than the one pointed
+ * into by @begin and @end.
+ *
+ * If @dest is NULL, the range indicated by @begin and @end is
+ * removed from the sequence. If @dest iter points to a place within
+ * the (@begin, @end) range, the range does not move.
+ *
+ * Since: 2.14
+ **/
+void
+g_sequence_move_range (GSequenceIter *dest,
+ GSequenceIter *begin,
+ GSequenceIter *end)
+{
+ GSequence *src_seq;
+ GSequenceNode *first;
+
+ g_return_if_fail (begin != NULL);
+ g_return_if_fail (end != NULL);
+
+ check_iter_access (begin);
+ check_iter_access (end);
+ if (dest)
+ check_iter_access (dest);
+
+ src_seq = get_sequence (begin);
+
+ g_return_if_fail (src_seq == get_sequence (end));
+
+ /* Dest points to begin or end? */
+ if (dest == begin || dest == end)
+ return;
+
+ /* begin comes after end? */
+ if (g_sequence_iter_compare (begin, end) >= 0)
+ return;
+
+ /* dest points somewhere in the (begin, end) range? */
+ if (dest && get_sequence (dest) == src_seq &&
+ g_sequence_iter_compare (dest, begin) > 0 &&
+ g_sequence_iter_compare (dest, end) < 0)
+ {
+ return;
+ }
+
+ src_seq = get_sequence (begin);
+
+ first = node_get_first (begin);
+
+ node_cut (begin);
+
+ node_cut (end);
+
+ if (first != begin)
+ node_join (first, end);
+
+ if (dest)
+ {
+ first = node_get_first (dest);
+
+ node_cut (dest);
+
+ node_join (begin, dest);
+
+ if (dest != first)
+ node_join (first, begin);
+ }
+ else
+ {
+ node_free (begin, src_seq);
+ }
+}
+
+/**
+ * g_sequence_sort:
+ * @seq: a #GSequence
+ * @cmp_func: the #GCompareDataFunc used to sort @seq. This function is
+ * passed two items of @seq and should return 0 if they are equal,
+ * a negative value fi the first comes before the second, and a
+ * positive value if the second comes before the first.
+ * @cmp_data: user data passed to @cmp_func
+ *
+ * Sorts @seq using @cmp_func.
+ *
+ * Since: 2.14
+ **/
+void
+g_sequence_sort (GSequence *seq,
+ GCompareDataFunc cmp_func,
+ gpointer cmp_data)
+{
+ SortInfo info = { cmp_func, cmp_data, seq->end_node };
+
+ check_seq_access (seq);
+
+ g_sequence_sort_iter (seq, iter_compare, &info);
+}
+
+/**
+ * g_sequence_insert_sorted:
+ * @seq: a #GSequence
+ * @data: the data to insert
+ * @cmp_func: the #GCompareDataFunc used to compare items in the sequence. It
+ * is called with two items of the @seq and @user_data. It should
+ * return 0 if the items are equal, a negative value if the first
+ * item comes before the second, and a positive value if the second
+ * item comes before the first.
+ * @cmp_data: user data passed to @cmp_func.
+ *
+ * Inserts @data into @sequence using @func to determine the new position.
+ * The sequence must already be sorted according to @cmp_func; otherwise the
+ * new position of @data is undefined.
+ *
+ * Return value: a #GSequenceIter pointing to the new item.
+ *
+ * Since: 2.14
+ **/
+GSequenceIter *
+g_sequence_insert_sorted (GSequence *seq,
+ gpointer data,
+ GCompareDataFunc cmp_func,
+ gpointer cmp_data)
+{
+ SortInfo info = { cmp_func, cmp_data, NULL };
+
+ g_return_val_if_fail (seq != NULL, NULL);
+ g_return_val_if_fail (cmp_func != NULL, NULL);
+
+ info.end_node = seq->end_node;
+ check_seq_access (seq);
+
+ return g_sequence_insert_sorted_iter (seq, data, iter_compare, &info);
+}
+
+/**
+ * g_sequence_sort_changed:
+ * @iter: A #GSequenceIter
+ * @cmp_func: the #GCompareDataFunc used to compare items in the sequence. It
+ * is called with two items of the @seq and @user_data. It should
+ * return 0 if the items are equal, a negative value if the first
+ * item comes before the second, and a positive value if the second
+ * item comes before the first.
+ * @cmp_data: user data passed to @cmp_func.
+ *
+ * Moves the data pointed to a new position as indicated by @cmp_func. This
+ * function should be called for items in a sequence already sorted according
+ * to @cmp_func whenever some aspect of an item changes so that @cmp_func
+ * may return different values for that item.
+ *
+ * Since: 2.14
+ **/
+void
+g_sequence_sort_changed (GSequenceIter *iter,
+ GCompareDataFunc cmp_func,
+ gpointer cmp_data)
+{
+ SortInfo info = { cmp_func, cmp_data, NULL };
+
+ g_return_if_fail (!is_end (iter));
+
+ info.end_node = get_sequence (iter)->end_node;
+ check_iter_access (iter);
+
+ g_sequence_sort_changed_iter (iter, iter_compare, &info);
+}
+
+/**
+ * g_sequence_search:
+ * @seq: a #GSequence
+ * @data: data for the new item
+ * @cmp_func: the #GCompareDataFunc used to compare items in the sequence. It
+ * is called with two items of the @seq and @user_data. It should
+ * return 0 if the items are equal, a negative value if the first
+ * item comes before the second, and a positive value if the second
+ * item comes before the first.
+ * @cmp_data: user data passed to @cmp_func.
+ *
+ * Returns an iterator pointing to the position where @data would
+ * be inserted according to @cmp_func and @cmp_data.
+ *
+ * Return value: an #GSequenceIter pointing to the position where @data
+ * would have been inserted according to @cmp_func and @cmp_data.
+ *
+ * Since: 2.14
+ **/
+GSequenceIter *
+g_sequence_search (GSequence *seq,
+ gpointer data,
+ GCompareDataFunc cmp_func,
+ gpointer cmp_data)
+{
+ SortInfo info = { cmp_func, cmp_data, NULL };
+
+ g_return_val_if_fail (seq != NULL, NULL);
+
+ info.end_node = seq->end_node;
+ check_seq_access (seq);
+
+ return g_sequence_search_iter (seq, data, iter_compare, &info);
+}
+
+/**
+ * g_sequence_sort_iter:
+ * @seq: a #GSequence
+ * @cmp_func: the #GSequenceItercompare used to compare iterators in the
+ * sequence. It is called with two iterators pointing into @seq. It should
+ * return 0 if the iterators are equal, a negative value if the first
+ * iterator comes before the second, and a positive value if the second
+ * iterator comes before the first.
+ * @cmp_data: user data passed to @cmp_func
+ *
+ * Like g_sequence_sort(), but uses a #GSequenceIterCompareFunc instead
+ * of a GCompareDataFunc as the compare function
+ *
+ * Since: 2.14
+ **/
+void
+g_sequence_sort_iter (GSequence *seq,
+ GSequenceIterCompareFunc cmp_func,
+ gpointer cmp_data)
+{
+ GSequence *tmp;
+ GSequenceNode *begin, *end;
+
+ g_return_if_fail (seq != NULL);
+ g_return_if_fail (cmp_func != NULL);
+
+ check_seq_access (seq);
+
+ begin = g_sequence_get_begin_iter (seq);
+ end = g_sequence_get_end_iter (seq);
+
+ tmp = g_sequence_new (NULL);
+ tmp->real_sequence = seq;
+
+ g_sequence_move_range (g_sequence_get_begin_iter (tmp), begin, end);
+
+ seq->access_prohibited = TRUE;
+ tmp->access_prohibited = TRUE;
+
+ while (g_sequence_get_length (tmp) > 0)
+ {
+ GSequenceNode *node = g_sequence_get_begin_iter (tmp);
+
+ node_insert_sorted (seq->end_node, node, seq->end_node,
+ cmp_func, cmp_data);
+ }
+
+ tmp->access_prohibited = FALSE;
+ seq->access_prohibited = FALSE;
+
+ g_sequence_free (tmp);
+}
+
+/**
+ * g_sequence_sort_changed_iter:
+ * @iter: a #GSequenceIter
+ * @iter_cmp: the #GSequenceItercompare used to compare iterators in the
+ * sequence. It is called with two iterators pointing into @seq. It should
+ * return 0 if the iterators are equal, a negative value if the first
+ * iterator comes before the second, and a positive value if the second
+ * iterator comes before the first.
+ * @cmp_data: user data passed to @cmp_func
+ *
+ * Like g_sequence_sort_changed(), but uses
+ * a #GSequenceIterCompareFunc instead of a #GCompareDataFunc as
+ * the compare function.
+ *
+ * Since: 2.14
+ **/
+void
+g_sequence_sort_changed_iter (GSequenceIter *iter,
+ GSequenceIterCompareFunc iter_cmp,
+ gpointer cmp_data)
+{
+ GSequence *seq, *tmp_seq;
+ GSequenceIter *next, *prev;
+
+ g_return_if_fail (iter != NULL);
+ g_return_if_fail (!is_end (iter));
+ g_return_if_fail (iter_cmp != NULL);
+ check_iter_access (iter);
+
+ /* If one of the neighbours is equal to iter, then
+ * don't move it. This ensures that sort_changed() is
+ * a stable operation.
+ */
+
+ next = node_get_next (iter);
+ prev = node_get_prev (iter);
+
+ if (prev != iter && iter_cmp (prev, iter, cmp_data) == 0)
+ return;
+
+ if (!is_end (next) && iter_cmp (next, iter, cmp_data) == 0)
+ return;
+
+ seq = get_sequence (iter);
+
+ seq->access_prohibited = TRUE;
+
+ tmp_seq = g_sequence_new (NULL);
+ tmp_seq->real_sequence = seq;
+
+ node_unlink (iter);
+ node_insert_before (tmp_seq->end_node, iter);
+
+ node_insert_sorted (seq->end_node, iter, seq->end_node,
+ iter_cmp, cmp_data);
+
+ g_sequence_free (tmp_seq);
+
+ seq->access_prohibited = FALSE;
+}
+
+/**
+ * g_sequence_insert_sorted_iter:
+ * @seq: a #GSequence
+ * @data: data for the new item
+ * @iter_cmp: the #GSequenceItercompare used to compare iterators in the
+ * sequence. It is called with two iterators pointing into @seq. It should
+ * return 0 if the iterators are equal, a negative value if the first
+ * iterator comes before the second, and a positive value if the second
+ * iterator comes before the first.
+ * @cmp_data: user data passed to @cmp_func
+ *
+ * Like g_sequence_insert_sorted(), but uses
+ * a #GSequenceIterCompareFunc instead of a #GCompareDataFunc as
+ * the compare function.
+ *
+ * Return value: a #GSequenceIter pointing to the new item
+ *
+ * Since: 2.14
+ **/
+GSequenceIter *
+g_sequence_insert_sorted_iter (GSequence *seq,
+ gpointer data,
+ GSequenceIterCompareFunc iter_cmp,
+ gpointer cmp_data)
+{
+ GSequenceNode *new_node;
+ GSequence *tmp_seq;
+
+ g_return_val_if_fail (seq != NULL, NULL);
+ g_return_val_if_fail (iter_cmp != NULL, NULL);
+
+ check_seq_access (seq);
+
+ seq->access_prohibited = TRUE;
+
+ /* Create a new temporary sequence and put the new node into
+ * that. The reason for this is that the user compare function
+ * will be called with the new node, and if it dereferences,
+ * "is_end" will be called on it. But that will crash if the
+ * node is not actually in a sequence.
+ *
+ * node_insert_sorted() makes sure the node is unlinked before
+ * is is inserted.
+ *
+ * The reason we need the "iter" versions at all is that that
+ * is the only kind of compare functions GtkTreeView can use.
+ */
+ tmp_seq = g_sequence_new (NULL);
+ tmp_seq->real_sequence = seq;
+
+ new_node = g_sequence_append (tmp_seq, data);
+
+ node_insert_sorted (seq->end_node, new_node,
+ seq->end_node, iter_cmp, cmp_data);
+
+ g_sequence_free (tmp_seq);
+
+ seq->access_prohibited = FALSE;
+
+ return new_node;
+}
+
+/**
+ * g_sequence_search_iter:
+ * @seq: a #GSequence
+ * @data: data for the new item
+ * @iter_cmp: the #GSequenceIterCompare function used to compare iterators
+ * in the sequence. It is called with two iterators pointing into @seq.
+ * It should return 0 if the iterators are equal, a negative value if the
+ * first iterator comes before the second, and a positive value if the
+ * second iterator comes before the first.
+ * @cmp_data: user data passed to @iter_cmp
+ *
+ * Like g_sequence_search(), but uses
+ * a #GSequenceIterCompareFunc instead of a #GCompareDataFunc as
+ * the compare function.
+ *
+ * Return value: a #GSequenceIter pointing to the position in @seq
+ * where @data would have been inserted according to @iter_cmp and @cmp_data.
+ *
+ * Since: 2.14
+ **/
+GSequenceIter *
+g_sequence_search_iter (GSequence *seq,
+ gpointer data,
+ GSequenceIterCompareFunc iter_cmp,
+ gpointer cmp_data)
+{
+ GSequenceNode *node;
+ GSequenceNode *dummy;
+ GSequence *tmp_seq;
+
+ g_return_val_if_fail (seq != NULL, NULL);
+
+ check_seq_access (seq);
+
+ seq->access_prohibited = TRUE;
+
+ tmp_seq = g_sequence_new (NULL);
+ tmp_seq->real_sequence = seq;
+
+ dummy = g_sequence_append (tmp_seq, data);
+
+ node = node_find_closest (seq->end_node, dummy,
+ seq->end_node, iter_cmp, cmp_data);
+
+ g_sequence_free (tmp_seq);
+
+ seq->access_prohibited = FALSE;
+
+ return node;
+}
+
+/**
+ * g_sequence_iter_get_sequence:
+ * @iter: a #GSequenceIter
+ *
+ * Returns the #GSequence that @iter points into.
+ *
+ * Return value: the #GSequence that @iter points into.
+ *
+ * Since: 2.14
+ **/
+GSequence *
+g_sequence_iter_get_sequence (GSequenceIter *iter)
+{
+ GSequence *seq;
+
+ g_return_val_if_fail (iter != NULL, NULL);
+
+ seq = get_sequence (iter);
+
+ /* For temporary sequences, this points to the sequence that
+ * is actually being manipulated
+ */
+ return seq->real_sequence;
+}
+
+/**
+ * g_sequence_get:
+ * @iter: a #GSequenceIter
+ *
+ * Returns the data that @iter points to.
+ *
+ * Return value: the data that @iter points to
+ *
+ * Since: 2.14
+ **/
+gpointer
+g_sequence_get (GSequenceIter *iter)
+{
+ g_return_val_if_fail (iter != NULL, NULL);
+ g_return_val_if_fail (!is_end (iter), NULL);
+
+ return iter->data;
+}
+
+/**
+ * g_sequence_set:
+ * @iter: a #GSequenceIter
+ * @data: new data for the item
+ *
+ * Changes the data for the item pointed to by @iter to be @data. If
+ * the sequence has a data destroy function associated with it, that
+ * function is called on the existing data that @iter pointed to.
+ *
+ * Since: 2.14
+ **/
+void
+g_sequence_set (GSequenceIter *iter,
+ gpointer data)
+{
+ GSequence *seq;
+
+ g_return_if_fail (iter != NULL);
+ g_return_if_fail (!is_end (iter));
+
+ seq = get_sequence (iter);
+
+ /* If @data is identical to iter->data, it is destroyed
+ * here. This will work right in case of ref-counted objects. Also
+ * it is similar to what ghashtables do.
+ *
+ * For non-refcounted data it's a little less convenient, but
+ * code relying on self-setting not destroying would be
+ * pretty dubious anyway ...
+ */
+
+ if (seq->data_destroy_notify)
+ seq->data_destroy_notify (iter->data);
+
+ iter->data = data;
+}
+
+/**
+ * g_sequence_get_length:
+ * @seq: a #GSequence
+ *
+ * Returns the length of @seq
+ *
+ * Return value: the length of @seq
+ *
+ * Since: 2.14
+ **/
+gint
+g_sequence_get_length (GSequence *seq)
+{
+ return node_get_length (seq->end_node) - 1;
+}
+
+/**
+ * g_sequence_get_end_iter:
+ * @seq: a #GSequence
+ *
+ * Returns the end iterator for @seg
+ *
+ * Return value: the end iterator for @seq
+ *
+ * Since: 2.14
+ **/
+GSequenceIter *
+g_sequence_get_end_iter (GSequence *seq)
+{
+ g_return_val_if_fail (seq != NULL, NULL);
+
+ return seq->end_node;
+}
+
+/**
+ * g_sequence_get_begin_iter:
+ * @seq: a #GSequence
+ *
+ * Returns the begin iterator for @seq.
+ *
+ * Return value: the begin iterator for @seq.
+ *
+ * Since: 2.14
+ **/
+GSequenceIter *
+g_sequence_get_begin_iter (GSequence *seq)
+{
+ g_return_val_if_fail (seq != NULL, NULL);
+
+ return node_get_first (seq->end_node);
+}
+
+static int
+clamp_position (GSequence *seq,
+ int pos)
+{
+ gint len = g_sequence_get_length (seq);
+
+ if (pos > len || pos < 0)
+ pos = len;
+
+ return pos;
+}
+
+/*
+ * if pos > number of items or -1, will return end pointer
+ */
+/**
+ * g_sequence_get_iter_at_pos:
+ * @seq: a #GSequence
+ * @pos: a position in @seq, or -1 for the end.
+ *
+ * Returns the iterator at position @pos. If @pos is negative or larger
+ * than the number of items in @seq, the end iterator is returned.
+ *
+ * Return value: The #GSequenceIter at position @pos
+ *
+ * Since: 2.14
+ **/
+GSequenceIter *
+g_sequence_get_iter_at_pos (GSequence *seq,
+ gint pos)
+{
+ g_return_val_if_fail (seq != NULL, NULL);
+
+ pos = clamp_position (seq, pos);
+
+ return node_get_by_pos (seq->end_node, pos);
+}
+
+/**
+ * g_sequence_move:
+ * @src: a #GSequenceIter pointing to the item to move
+ * @dest: a #GSequenceIter pointing to the position to which
+ * the item is moved.
+ *
+ * Moves the item pointed to by @src to the position indicated by @dest.
+ * After calling this function @dest will point to the position immediately
+ * after @src. It is allowed for @src and @dest to point into different
+ * sequences.
+ *
+ * Since: 2.14
+ **/
+void
+g_sequence_move (GSequenceIter *src,
+ GSequenceIter *dest)
+{
+ g_return_if_fail (src != NULL);
+ g_return_if_fail (dest != NULL);
+ g_return_if_fail (!is_end (src));
+
+ if (src == dest)
+ return;
+
+ node_unlink (src);
+ node_insert_before (dest, src);
+}
+
+/* GSequenceIter */
+
+/**
+ * g_sequence_iter_is_end:
+ * @iter: a #GSequenceIter
+ *
+ * Returns whether @iter is the end iterator
+ *
+ * Return value: Whether @iter is the end iterator.
+ *
+ * Since: 2.14
+ **/
+gboolean
+g_sequence_iter_is_end (GSequenceIter *iter)
+{
+ g_return_val_if_fail (iter != NULL, FALSE);
+
+ return is_end (iter);
+}
+
+/**
+ * g_sequence_iter_is_begin:
+ * @iter: a #GSequenceIter
+ *
+ * Returns whether @iter is the begin iterator
+ *
+ * Return value: whether @iter is the begin iterator
+ *
+ * Since: 2.14
+ **/
+gboolean
+g_sequence_iter_is_begin (GSequenceIter *iter)
+{
+ g_return_val_if_fail (iter != NULL, FALSE);
+
+ return (node_get_prev (iter) == iter);
+}
+
+/**
+ * g_sequence_iter_get_position:
+ * @iter: a #GSequenceIter
+ *
+ * Returns the position of @iter
+ *
+ * Return value: the position of @iter
+ *
+ * Since: 2.14
+ **/
+gint
+g_sequence_iter_get_position (GSequenceIter *iter)
+{
+ g_return_val_if_fail (iter != NULL, -1);
+
+ return node_get_pos (iter);
+}
+
+/**
+ * g_sequence_iter_next:
+ * @iter: a #GSequenceIter
+ *
+ * Returns an iterator pointing to the next position after @iter. If
+ * @iter is the end iterator, the end iterator is returned.
+ *
+ * Return value: a #GSequenceIter pointing to the next position after @iter.
+ *
+ * Since: 2.14
+ **/
+GSequenceIter *
+g_sequence_iter_next (GSequenceIter *iter)
+{
+ g_return_val_if_fail (iter != NULL, NULL);
+
+ return node_get_next (iter);
+}
+
+/**
+ * g_sequence_iter_prev:
+ * @iter: a #GSequenceIter
+ *
+ * Returns an iterator pointing to the previous position before @iter. If
+ * @iter is the begin iterator, the begin iterator is returned.
+ *
+ * Return value: a #GSequenceIter pointing to the previous position before
+ * @iter.
+ *
+ * Since: 2.14
+ **/
+GSequenceIter *
+g_sequence_iter_prev (GSequenceIter *iter)
+{
+ g_return_val_if_fail (iter != NULL, NULL);
+
+ return node_get_prev (iter);
+}
+
+/**
+ * g_sequence_iter_move:
+ * @iter: a #GSequenceIter
+ * @delta: A positive or negative number indicating how many positions away
+ * from @iter the returned #GSequenceIter will be.
+ *
+ * Returns the #GSequenceIter which is @delta positions away from @iter.
+ * If @iter is closer than -@delta positions to the beginning of the sequence,
+ * the begin iterator is returned. If @iter is closer than @delta positions
+ * to the end of the sequence, the end iterator is returned.
+ *
+ * Return value: a #GSequenceIter which is @delta positions away from @iter.
+ *
+ * Since: 2.14
+ **/
+GSequenceIter *
+g_sequence_iter_move (GSequenceIter *iter,
+ gint delta)
+{
+ gint new_pos;
+
+ g_return_val_if_fail (iter != NULL, NULL);
+
+ new_pos = node_get_pos (iter) + delta;
+
+ new_pos = clamp_position (get_sequence (iter), new_pos);
+
+ return node_get_by_pos (iter, new_pos);
+}
+
+/**
+ * g_sequence_swap:
+ * @a: a #GSequenceIter
+ * @b: a #GSequenceIter
+ *
+ * Swaps the items pointed to by @a and @b. It is allowed for @a and @b
+ * to point into difference sequences.
+ *
+ * Since: 2.14
+ **/
+void
+g_sequence_swap (GSequenceIter *a,
+ GSequenceIter *b)
+{
+ GSequenceNode *leftmost, *rightmost, *rightmost_next;
+ int a_pos, b_pos;
+
+ g_return_if_fail (!g_sequence_iter_is_end (a));
+ g_return_if_fail (!g_sequence_iter_is_end (b));
+
+ if (a == b)
+ return;
+
+ a_pos = g_sequence_iter_get_position (a);
+ b_pos = g_sequence_iter_get_position (b);
+
+ if (a_pos > b_pos)
+ {
+ leftmost = b;
+ rightmost = a;
+ }
+ else
+ {
+ leftmost = a;
+ rightmost = b;
+ }
+
+ rightmost_next = node_get_next (rightmost);
+
+ /* The situation is now like this:
+ *
+ * ..., leftmost, ......., rightmost, rightmost_next, ...
+ *
+ */
+ g_sequence_move (rightmost, leftmost);
+ g_sequence_move (leftmost, rightmost_next);
+}
+
+/*
+ * Implementation of a treap
+ *
+ *
+ */
+static guint
+get_priority (GSequenceNode *node)
+{
+ guint key = GPOINTER_TO_UINT (node);
+
+ /* This hash function is based on one found on Thomas Wang's
+ * web page at
+ *
+ * http://www.concentric.net/~Ttwang/tech/inthash.htm
+ *
+ */
+ key = (key << 15) - key - 1;
+ key = key ^ (key >> 12);
+ key = key + (key << 2);
+ key = key ^ (key >> 4);
+ key = key + (key << 3) + (key << 11);
+ key = key ^ (key >> 16);
+
+ /* We rely on 0 being less than all other priorities */
+ return key? key : 1;
+}
+
+static GSequenceNode *
+find_root (GSequenceNode *node)
+{
+ while (node->parent)
+ node = node->parent;
+
+ return node;
+}
+
+static GSequenceNode *
+node_new (gpointer data)
+{
+ GSequenceNode *node = g_slice_new0 (GSequenceNode);
+
+ node->n_nodes = 1;
+ node->data = data;
+ node->left = NULL;
+ node->right = NULL;
+ node->parent = NULL;
+
+ return node;
+}
+
+static GSequenceNode *
+node_get_first (GSequenceNode *node)
+{
+ node = find_root (node);
+
+ while (node->left)
+ node = node->left;
+
+ return node;
+}
+
+static GSequenceNode *
+node_get_last (GSequenceNode *node)
+{
+ node = find_root (node);
+
+ while (node->right)
+ node = node->right;
+
+ return node;
+}
+
+#define NODE_LEFT_CHILD(n) (((n)->parent) && ((n)->parent->left) == (n))
+#define NODE_RIGHT_CHILD(n) (((n)->parent) && ((n)->parent->right) == (n))
+
+static GSequenceNode *
+node_get_next (GSequenceNode *node)
+{
+ GSequenceNode *n = node;
+
+ if (n->right)
+ {
+ n = n->right;
+ while (n->left)
+ n = n->left;
+ }
+ else
+ {
+ while (NODE_RIGHT_CHILD (n))
+ n = n->parent;
+
+ if (n->parent)
+ n = n->parent;
+ else
+ n = node;
+ }
+
+ return n;
+}
+
+static GSequenceNode *
+node_get_prev (GSequenceNode *node)
+{
+ GSequenceNode *n = node;
+
+ if (n->left)
+ {
+ n = n->left;
+ while (n->right)
+ n = n->right;
+ }
+ else
+ {
+ while (NODE_LEFT_CHILD (n))
+ n = n->parent;
+
+ if (n->parent)
+ n = n->parent;
+ else
+ n = node;
+ }
+
+ return n;
+}
+
+#define N_NODES(n) ((n)? (n)->n_nodes : 0)
+
+static gint
+node_get_pos (GSequenceNode *node)
+{
+ int n_smaller = 0;
+
+ if (node->left)
+ n_smaller = node->left->n_nodes;
+
+ while (node)
+ {
+ if (NODE_RIGHT_CHILD (node))
+ n_smaller += N_NODES (node->parent->left) + 1;
+
+ node = node->parent;
+ }
+
+ return n_smaller;
+}
+
+static GSequenceNode *
+node_get_by_pos (GSequenceNode *node,
+ gint pos)
+{
+ int i;
+
+ node = find_root (node);
+
+ while ((i = N_NODES (node->left)) != pos)
+ {
+ if (i < pos)
+ {
+ node = node->right;
+ pos -= (i + 1);
+ }
+ else
+ {
+ node = node->left;
+ }
+ }
+
+ return node;
+}
+
+static GSequenceNode *
+node_find_closest (GSequenceNode *haystack,
+ GSequenceNode *needle,
+ GSequenceNode *end,
+ GSequenceIterCompareFunc iter_cmp,
+ gpointer cmp_data)
+{
+ GSequenceNode *best;
+ gint c;
+
+ haystack = find_root (haystack);
+
+ do
+ {
+ best = haystack;
+
+ /* iter_cmp can't be passed the end node, since the function may
+ * be user-supplied
+ */
+ if (haystack == end)
+ c = 1;
+ else
+ c = iter_cmp (haystack, needle, cmp_data);
+
+ /* In the following we don't break even if c == 0. Instaed we go on
+ * searching along the 'bigger' nodes, so that we find the last one
+ * that is equal to the needle.
+ */
+ if (c > 0)
+ haystack = haystack->left;
+ else
+ haystack = haystack->right;
+ }
+ while (haystack != NULL);
+
+ /* If the best node is smaller or equal to the data, then move one step
+ * to the right to make sure the best one is strictly bigger than the data
+ */
+ if (best != end && c <= 0)
+ best = node_get_next (best);
+
+ return best;
+}
+
+static gint
+node_get_length (GSequenceNode *node)
+{
+ node = find_root (node);
+
+ return node->n_nodes;
+}
+
+static void
+real_node_free (GSequenceNode *node,
+ GSequence *seq)
+{
+ if (node)
+ {
+ real_node_free (node->left, seq);
+ real_node_free (node->right, seq);
+
+ if (seq && seq->data_destroy_notify && node != seq->end_node)
+ seq->data_destroy_notify (node->data);
+
+ g_slice_free (GSequenceNode, node);
+ }
+}
+
+static void
+node_free (GSequenceNode *node,
+ GSequence *seq)
+{
+ node = find_root (node);
+
+ real_node_free (node, seq);
+}
+
+static void
+node_update_fields (GSequenceNode *node)
+{
+ int n_nodes = 1;
+
+ n_nodes += N_NODES (node->left);
+ n_nodes += N_NODES (node->right);
+
+ node->n_nodes = n_nodes;
+}
+
+static void
+node_rotate (GSequenceNode *node)
+{
+ GSequenceNode *tmp, *old;
+
+ g_assert (node->parent);
+ g_assert (node->parent != node);
+
+ if (NODE_LEFT_CHILD (node))
+ {
+ /* rotate right */
+ tmp = node->right;
+
+ node->right = node->parent;
+ node->parent = node->parent->parent;
+ if (node->parent)
+ {
+ if (node->parent->left == node->right)
+ node->parent->left = node;
+ else
+ node->parent->right = node;
+ }
+
+ g_assert (node->right);
+
+ node->right->parent = node;
+ node->right->left = tmp;
+
+ if (node->right->left)
+ node->right->left->parent = node->right;
+
+ old = node->right;
+ }
+ else
+ {
+ /* rotate left */
+ tmp = node->left;
+
+ node->left = node->parent;
+ node->parent = node->parent->parent;
+ if (node->parent)
+ {
+ if (node->parent->right == node->left)
+ node->parent->right = node;
+ else
+ node->parent->left = node;
+ }
+
+ g_assert (node->left);
+
+ node->left->parent = node;
+ node->left->right = tmp;
+
+ if (node->left->right)
+ node->left->right->parent = node->left;
+
+ old = node->left;
+ }
+
+ node_update_fields (old);
+ node_update_fields (node);
+}
+
+static void
+node_update_fields_deep (GSequenceNode *node)
+{
+ if (node)
+ {
+ node_update_fields (node);
+
+ node_update_fields_deep (node->parent);
+ }
+}
+
+static void
+rotate_down (GSequenceNode *node,
+ guint priority)
+{
+ guint left, right;
+
+ left = node->left ? get_priority (node->left) : 0;
+ right = node->right ? get_priority (node->right) : 0;
+
+ while (priority < left || priority < right)
+ {
+ if (left > right)
+ node_rotate (node->left);
+ else
+ node_rotate (node->right);
+
+ left = node->left ? get_priority (node->left) : 0;
+ right = node->right ? get_priority (node->right) : 0;
+ }
+}
+
+static void
+node_cut (GSequenceNode *node)
+{
+ while (node->parent)
+ node_rotate (node);
+
+ if (node->left)
+ node->left->parent = NULL;
+
+ node->left = NULL;
+ node_update_fields (node);
+
+ rotate_down (node, get_priority (node));
+}
+
+static void
+node_join (GSequenceNode *left,
+ GSequenceNode *right)
+{
+ GSequenceNode *fake = node_new (NULL);
+
+ fake->left = find_root (left);
+ fake->right = find_root (right);
+ fake->left->parent = fake;
+ fake->right->parent = fake;
+
+ node_update_fields (fake);
+
+ node_unlink (fake);
+
+ node_free (fake, NULL);
+}
+
+static void
+node_insert_before (GSequenceNode *node,
+ GSequenceNode *new)
+{
+ new->left = node->left;
+ if (new->left)
+ new->left->parent = new;
+
+ new->parent = node;
+ node->left = new;
+
+ node_update_fields_deep (new);
+
+ while (new->parent && get_priority (new) > get_priority (new->parent))
+ node_rotate (new);
+
+ rotate_down (new, get_priority (new));
+}
+
+static void
+node_unlink (GSequenceNode *node)
+{
+ rotate_down (node, 0);
+
+ if (NODE_RIGHT_CHILD (node))
+ node->parent->right = NULL;
+ else if (NODE_LEFT_CHILD (node))
+ node->parent->left = NULL;
+
+ if (node->parent)
+ node_update_fields_deep (node->parent);
+
+ node->parent = NULL;
+}
+
+static void
+node_insert_sorted (GSequenceNode *node,
+ GSequenceNode *new,
+ GSequenceNode *end,
+ GSequenceIterCompareFunc iter_cmp,
+ gpointer cmp_data)
+{
+ GSequenceNode *closest;
+
+ closest = node_find_closest (node, new, end, iter_cmp, cmp_data);
+
+ node_unlink (new);
+
+ node_insert_before (closest, new);
+}
+
+
+#define __G_SEQUENCE_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gsequence.h b/trunk/glib/gsequence.h
new file mode 100644
index 000000000..ffac6c62e
--- /dev/null
+++ b/trunk/glib/gsequence.h
@@ -0,0 +1,121 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
+ * Soeren Sandmann (sandmann@daimi.au.dk)
+ *
+ * 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/gtypes.h>
+
+#ifndef __G_SEQUENCE_H__
+#define __G_SEQUENCE_H__
+
+typedef struct _GSequence GSequence;
+typedef struct _GSequenceNode GSequenceIter;
+
+typedef gint (* GSequenceIterCompareFunc) (GSequenceIter *a,
+ GSequenceIter *b,
+ gpointer data);
+
+
+/* GSequence */
+GSequence * g_sequence_new (GDestroyNotify data_destroy);
+void g_sequence_free (GSequence *seq);
+gint g_sequence_get_length (GSequence *seq);
+void g_sequence_foreach (GSequence *seq,
+ GFunc func,
+ gpointer user_data);
+void g_sequence_foreach_range (GSequenceIter *begin,
+ GSequenceIter *end,
+ GFunc func,
+ gpointer user_data);
+void g_sequence_sort (GSequence *seq,
+ GCompareDataFunc cmp_func,
+ gpointer cmp_data);
+void g_sequence_sort_iter (GSequence *seq,
+ GSequenceIterCompareFunc cmp_func,
+ gpointer cmp_data);
+
+
+/* Getting iters */
+GSequenceIter *g_sequence_get_begin_iter (GSequence *seq);
+GSequenceIter *g_sequence_get_end_iter (GSequence *seq);
+GSequenceIter *g_sequence_get_iter_at_pos (GSequence *seq,
+ gint pos);
+GSequenceIter *g_sequence_append (GSequence *seq,
+ gpointer data);
+GSequenceIter *g_sequence_prepend (GSequence *seq,
+ gpointer data);
+GSequenceIter *g_sequence_insert_before (GSequenceIter *iter,
+ gpointer data);
+void g_sequence_move (GSequenceIter *src,
+ GSequenceIter *dest);
+void g_sequence_swap (GSequenceIter *a,
+ GSequenceIter *b);
+GSequenceIter *g_sequence_insert_sorted (GSequence *seq,
+ gpointer data,
+ GCompareDataFunc cmp_func,
+ gpointer cmp_data);
+GSequenceIter *g_sequence_insert_sorted_iter (GSequence *seq,
+ gpointer data,
+ GSequenceIterCompareFunc iter_cmp,
+ gpointer cmp_data);
+void g_sequence_sort_changed (GSequenceIter *iter,
+ GCompareDataFunc cmp_func,
+ gpointer cmp_data);
+void g_sequence_sort_changed_iter (GSequenceIter *iter,
+ GSequenceIterCompareFunc iter_cmp,
+ gpointer cmp_data);
+void g_sequence_remove (GSequenceIter *iter);
+void g_sequence_remove_range (GSequenceIter *begin,
+ GSequenceIter *end);
+void g_sequence_move_range (GSequenceIter *dest,
+ GSequenceIter *begin,
+ GSequenceIter *end);
+GSequenceIter *g_sequence_search (GSequence *seq,
+ gpointer data,
+ GCompareDataFunc cmp_func,
+ gpointer cmp_data);
+GSequenceIter *g_sequence_search_iter (GSequence *seq,
+ gpointer data,
+ GSequenceIterCompareFunc iter_cmp,
+ gpointer cmp_data);
+
+
+/* Dereferencing */
+gpointer g_sequence_get (GSequenceIter *iter);
+void g_sequence_set (GSequenceIter *iter,
+ gpointer data);
+
+/* Operations on GSequenceIter * */
+gboolean g_sequence_iter_is_begin (GSequenceIter *iter);
+gboolean g_sequence_iter_is_end (GSequenceIter *iter);
+GSequenceIter *g_sequence_iter_next (GSequenceIter *iter);
+GSequenceIter *g_sequence_iter_prev (GSequenceIter *iter);
+gint g_sequence_iter_get_position (GSequenceIter *iter);
+GSequenceIter *g_sequence_iter_move (GSequenceIter *iter,
+ gint delta);
+GSequence * g_sequence_iter_get_sequence (GSequenceIter *iter);
+
+
+/* Search */
+gint g_sequence_iter_compare (GSequenceIter *a,
+ GSequenceIter *b);
+GSequenceIter *g_sequence_range_get_midpoint (GSequenceIter *begin,
+ GSequenceIter *end);
+
+
+#endif /* __G_SEQUENCE_H__ */
diff --git a/trunk/glib/gshell.c b/trunk/glib/gshell.c
new file mode 100644
index 000000000..3bb434e06
--- /dev/null
+++ b/trunk/glib/gshell.c
@@ -0,0 +1,673 @@
+/* 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 "config.h"
+
+#include <string.h>
+
+#include "glib.h"
+
+#ifdef _
+#warning "FIXME remove gettext hack"
+#endif
+
+#include "glibintl.h"
+#include "galias.h"
+
+GQuark
+g_shell_error_quark (void)
+{
+ return g_quark_from_static_string ("g-shell-error-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.
+ *
+ * Shell quoting rules are a bit strange. 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.
+ *
+ * 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 (NULL);
+
+ /* 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;
+ }
+ }
+ }
+
+ g_free (unquoted);
+ 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 (NULL);
+}
+
+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;
+ gboolean quoted;;
+
+ current_quote = '\0';
+ quoted = FALSE;
+ 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 (&current_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 == '"' && quoted))
+ {
+ /* close the quote */
+ current_quote = '\0';
+ }
+
+ /* Everything inside quotes, and the close quote,
+ * gets appended literally.
+ */
+
+ ensure_token (&current_token);
+ g_string_append_c (current_token, *p);
+ }
+ else
+ {
+ switch (*p)
+ {
+ case '\n':
+ delimit_token (&current_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 (&current_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 (&current_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 (&current_token);
+ g_string_append_c (current_token, *p);
+ break;
+ }
+ }
+
+ /* We need to count consecutive backslashes mod 2,
+ * to detect escaped doublequotes.
+ */
+ if (*p != '\\')
+ quoted = FALSE;
+ else
+ quoted = !quoted;
+
+ ++p;
+ }
+
+ delimit_token (&current_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. Free the returned vector with g_strfreev().
+ *
+ * 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;
+}
+
+#define __G_SHELL_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gshell.h b/trunk/glib/gshell.h
new file mode 100644
index 000000000..b3f9d9148
--- /dev/null
+++ b/trunk/glib/gshell.h
@@ -0,0 +1,53 @@
+/* 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 <glib/gerror.h>
+
+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/trunk/glib/gslice.c b/trunk/glib/gslice.c
new file mode 100644
index 000000000..db0807047
--- /dev/null
+++ b/trunk/glib/gslice.c
@@ -0,0 +1,1445 @@
+/* GLIB sliced memory - fast concurrent memory chunk allocator
+ * Copyright (C) 2005 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 */
+
+#include "config.h"
+
+#if defined HAVE_POSIX_MEMALIGN && defined POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS
+# define HAVE_COMPLIANT_POSIX_MEMALIGN 1
+#endif
+
+#ifdef HAVE_COMPLIANT_POSIX_MEMALIGN
+#define _XOPEN_SOURCE 600 /* posix_memalign() */
+#endif
+#include <stdlib.h> /* posix_memalign() */
+#include <string.h>
+#include <errno.h>
+#include "gmem.h" /* gslice.h */
+#include "gthreadprivate.h"
+#include "glib.h"
+#include "galias.h"
+#ifdef HAVE_UNISTD_H
+#include <unistd.h> /* sysconf() */
+#endif
+#ifdef G_OS_WIN32
+#include <windows.h>
+#include <process.h>
+#endif
+
+#include <stdio.h> /* fputs/fprintf */
+
+
+/* the GSlice allocator is split up into 4 layers, roughly modelled after the slab
+ * allocator and magazine extensions as outlined in:
+ * + [Bonwick94] Jeff Bonwick, The slab allocator: An object-caching kernel
+ * memory allocator. USENIX 1994, http://citeseer.ist.psu.edu/bonwick94slab.html
+ * + [Bonwick01] Bonwick and Jonathan Adams, Magazines and vmem: Extending the
+ * slab allocator to many cpu's and arbitrary resources.
+ * USENIX 2001, http://citeseer.ist.psu.edu/bonwick01magazines.html
+ * the layers are:
+ * - the thread magazines. for each (aligned) chunk size, a magazine (a list)
+ * of recently freed and soon to be allocated chunks is maintained per thread.
+ * this way, most alloc/free requests can be quickly satisfied from per-thread
+ * free lists which only require one g_private_get() call to retrive the
+ * thread handle.
+ * - the magazine cache. allocating and freeing chunks to/from threads only
+ * occours at magazine sizes from a global depot of magazines. the depot
+ * maintaines a 15 second working set of allocated magazines, so full
+ * magazines are not allocated and released too often.
+ * the chunk size dependent magazine sizes automatically adapt (within limits,
+ * see [3]) to lock contention to properly scale performance across a variety
+ * of SMP systems.
+ * - the slab allocator. this allocator allocates slabs (blocks of memory) close
+ * to the system page size or multiples thereof which have to be page aligned.
+ * the blocks are divided into smaller chunks which are used to satisfy
+ * allocations from the upper layers. the space provided by the reminder of
+ * the chunk size division is used for cache colorization (random distribution
+ * of chunk addresses) to improve processor cache utilization. multiple slabs
+ * with the same chunk size are kept in a partially sorted ring to allow O(1)
+ * freeing and allocation of chunks (as long as the allocation of an entirely
+ * new slab can be avoided).
+ * - the page allocator. on most modern systems, posix_memalign(3) or
+ * memalign(3) should be available, so this is used to allocate blocks with
+ * system page size based alignments and sizes or multiples thereof.
+ * if no memalign variant is provided, valloc() is used instead and
+ * block sizes are limited to the system page size (no multiples thereof).
+ * as a fallback, on system without even valloc(), a malloc(3)-based page
+ * allocator with alloc-only behaviour is used.
+ *
+ * NOTES:
+ * [1] some systems memalign(3) implementations may rely on boundary tagging for
+ * the handed out memory chunks. to avoid excessive page-wise fragmentation,
+ * we reserve 2 * sizeof (void*) per block size for the systems memalign(3),
+ * specified in NATIVE_MALLOC_PADDING.
+ * [2] using the slab allocator alone already provides for a fast and efficient
+ * allocator, it doesn't properly scale beyond single-threaded uses though.
+ * also, the slab allocator implements eager free(3)-ing, i.e. does not
+ * provide any form of caching or working set maintenance. so if used alone,
+ * it's vulnerable to trashing for sequences of balanced (alloc, free) pairs
+ * at certain thresholds.
+ * [3] magazine sizes are bound by an implementation specific minimum size and
+ * a chunk size specific maximum to limit magazine storage sizes to roughly
+ * 16KB.
+ * [4] allocating ca. 8 chunks per block/page keeps a good balance between
+ * external and internal fragmentation (<= 12.5%). [Bonwick94]
+ */
+
+/* --- macros and constants --- */
+#define LARGEALIGNMENT (256)
+#define P2ALIGNMENT (2 * sizeof (gsize)) /* fits 2 pointers (assumed to be 2 * GLIB_SIZEOF_SIZE_T below) */
+#define ALIGN(size, base) ((base) * (gsize) (((size) + (base) - 1) / (base)))
+#define NATIVE_MALLOC_PADDING P2ALIGNMENT /* per-page padding left for native malloc(3) see [1] */
+#define SLAB_INFO_SIZE P2ALIGN (sizeof (SlabInfo) + NATIVE_MALLOC_PADDING)
+#define MAX_MAGAZINE_SIZE (256) /* see [3] and allocator_get_magazine_threshold() for this */
+#define MIN_MAGAZINE_SIZE (4)
+#define MAX_STAMP_COUNTER (7) /* distributes the load of gettimeofday() */
+#define MAX_SLAB_CHUNK_SIZE(al) (((al)->max_page_size - SLAB_INFO_SIZE) / 8) /* we want at last 8 chunks per page, see [4] */
+#define MAX_SLAB_INDEX(al) (SLAB_INDEX (al, MAX_SLAB_CHUNK_SIZE (al)) + 1)
+#define SLAB_INDEX(al, asize) ((asize) / P2ALIGNMENT - 1) /* asize must be P2ALIGNMENT aligned */
+#define SLAB_CHUNK_SIZE(al, ix) (((ix) + 1) * P2ALIGNMENT)
+#define SLAB_BPAGE_SIZE(al,csz) (8 * (csz) + SLAB_INFO_SIZE)
+
+/* optimized version of ALIGN (size, P2ALIGNMENT) */
+#if GLIB_SIZEOF_SIZE_T * 2 == 8 /* P2ALIGNMENT */
+#define P2ALIGN(size) (((size) + 0x7) & ~(gsize) 0x7)
+#elif GLIB_SIZEOF_SIZE_T * 2 == 16 /* P2ALIGNMENT */
+#define P2ALIGN(size) (((size) + 0xf) & ~(gsize) 0xf)
+#else
+#define P2ALIGN(size) ALIGN (size, P2ALIGNMENT)
+#endif
+
+/* special helpers to avoid gmessage.c dependency */
+static void mem_error (const char *format, ...) G_GNUC_PRINTF (1,2);
+#define mem_assert(cond) do { if (G_LIKELY (cond)) ; else mem_error ("assertion failed: %s", #cond); } while (0)
+
+/* --- structures --- */
+typedef struct _ChunkLink ChunkLink;
+typedef struct _SlabInfo SlabInfo;
+typedef struct _CachedMagazine CachedMagazine;
+struct _ChunkLink {
+ ChunkLink *next;
+ ChunkLink *data;
+};
+struct _SlabInfo {
+ ChunkLink *chunks;
+ guint n_allocated;
+ SlabInfo *next, *prev;
+};
+typedef struct {
+ ChunkLink *chunks;
+ gsize count; /* approximative chunks list length */
+} Magazine;
+typedef struct {
+ Magazine *magazine1; /* array of MAX_SLAB_INDEX (allocator) */
+ Magazine *magazine2; /* array of MAX_SLAB_INDEX (allocator) */
+} ThreadMemory;
+typedef struct {
+ gboolean always_malloc;
+ gboolean bypass_magazines;
+ gboolean debug_blocks;
+ gsize working_set_msecs;
+ guint color_increment;
+} SliceConfig;
+typedef struct {
+ /* const after initialization */
+ gsize min_page_size, max_page_size;
+ SliceConfig config;
+ gsize max_slab_chunk_size_for_magazine_cache;
+ /* magazine cache */
+ GMutex *magazine_mutex;
+ ChunkLink **magazines; /* array of MAX_SLAB_INDEX (allocator) */
+ guint *contention_counters; /* array of MAX_SLAB_INDEX (allocator) */
+ gint mutex_counter;
+ guint stamp_counter;
+ guint last_stamp;
+ /* slab allocator */
+ GMutex *slab_mutex;
+ SlabInfo **slab_stack; /* array of MAX_SLAB_INDEX (allocator) */
+ guint color_accu;
+} Allocator;
+
+/* --- g-slice prototypes --- */
+static gpointer slab_allocator_alloc_chunk (gsize chunk_size);
+static void slab_allocator_free_chunk (gsize chunk_size,
+ gpointer mem);
+static void private_thread_memory_cleanup (gpointer data);
+static gpointer allocator_memalign (gsize alignment,
+ gsize memsize);
+static void allocator_memfree (gsize memsize,
+ gpointer mem);
+static inline void magazine_cache_update_stamp (void);
+static inline gsize allocator_get_magazine_threshold (Allocator *allocator,
+ guint ix);
+
+/* --- g-slice memory checker --- */
+static void smc_notify_alloc (void *pointer,
+ size_t size);
+static int smc_notify_free (void *pointer,
+ size_t size);
+
+/* --- variables --- */
+static GPrivate *private_thread_memory = NULL;
+static gsize sys_page_size = 0;
+static Allocator allocator[1] = { { 0, }, };
+static SliceConfig slice_config = {
+ FALSE, /* always_malloc */
+ FALSE, /* bypass_magazines */
+ FALSE, /* debug_blocks */
+ 15 * 1000, /* working_set_msecs */
+ 1, /* color increment, alt: 0x7fffffff */
+};
+static GMutex *smc_tree_mutex = NULL; /* mutex for G_SLICE=debug-blocks */
+
+/* --- auxillary funcitons --- */
+void
+g_slice_set_config (GSliceConfig ckey,
+ gint64 value)
+{
+ g_return_if_fail (sys_page_size == 0);
+ switch (ckey)
+ {
+ case G_SLICE_CONFIG_ALWAYS_MALLOC:
+ slice_config.always_malloc = value != 0;
+ break;
+ case G_SLICE_CONFIG_BYPASS_MAGAZINES:
+ slice_config.bypass_magazines = value != 0;
+ break;
+ case G_SLICE_CONFIG_WORKING_SET_MSECS:
+ slice_config.working_set_msecs = value;
+ break;
+ case G_SLICE_CONFIG_COLOR_INCREMENT:
+ slice_config.color_increment = value;
+ default: ;
+ }
+}
+
+gint64
+g_slice_get_config (GSliceConfig ckey)
+{
+ switch (ckey)
+ {
+ case G_SLICE_CONFIG_ALWAYS_MALLOC:
+ return slice_config.always_malloc;
+ case G_SLICE_CONFIG_BYPASS_MAGAZINES:
+ return slice_config.bypass_magazines;
+ case G_SLICE_CONFIG_WORKING_SET_MSECS:
+ return slice_config.working_set_msecs;
+ case G_SLICE_CONFIG_CHUNK_SIZES:
+ return MAX_SLAB_INDEX (allocator);
+ case G_SLICE_CONFIG_COLOR_INCREMENT:
+ return slice_config.color_increment;
+ default:
+ return 0;
+ }
+}
+
+gint64*
+g_slice_get_config_state (GSliceConfig ckey,
+ gint64 address,
+ guint *n_values)
+{
+ guint i = 0;
+ g_return_val_if_fail (n_values != NULL, NULL);
+ *n_values = 0;
+ switch (ckey)
+ {
+ gint64 array[64];
+ case G_SLICE_CONFIG_CONTENTION_COUNTER:
+ array[i++] = SLAB_CHUNK_SIZE (allocator, address);
+ array[i++] = allocator->contention_counters[address];
+ array[i++] = allocator_get_magazine_threshold (allocator, address);
+ *n_values = i;
+ return g_memdup (array, sizeof (array[0]) * *n_values);
+ default:
+ return NULL;
+ }
+}
+
+static void
+slice_config_init (SliceConfig *config)
+{
+ /* don't use g_malloc/g_message here */
+ gchar buffer[1024];
+ const gchar *val = _g_getenv_nomalloc ("G_SLICE", buffer);
+ const GDebugKey keys[] = {
+ { "always-malloc", 1 << 0 },
+ { "debug-blocks", 1 << 1 },
+ };
+ gint flags = !val ? 0 : g_parse_debug_string (val, keys, G_N_ELEMENTS (keys));
+ *config = slice_config;
+ if (flags & (1 << 0)) /* always-malloc */
+ config->always_malloc = TRUE;
+ if (flags & (1 << 1)) /* debug-blocks */
+ config->debug_blocks = TRUE;
+}
+
+static void
+g_slice_init_nomessage (void)
+{
+ /* we may not use g_error() or friends here */
+ mem_assert (sys_page_size == 0);
+ mem_assert (MIN_MAGAZINE_SIZE >= 4);
+
+#ifdef G_OS_WIN32
+ {
+ SYSTEM_INFO system_info;
+ GetSystemInfo (&system_info);
+ sys_page_size = system_info.dwPageSize;
+ }
+#else
+ sys_page_size = sysconf (_SC_PAGESIZE); /* = sysconf (_SC_PAGE_SIZE); = getpagesize(); */
+#endif
+ mem_assert (sys_page_size >= 2 * LARGEALIGNMENT);
+ mem_assert ((sys_page_size & (sys_page_size - 1)) == 0);
+ slice_config_init (&allocator->config);
+ allocator->min_page_size = sys_page_size;
+#if HAVE_COMPLIANT_POSIX_MEMALIGN || HAVE_MEMALIGN
+ /* allow allocation of pages up to 8KB (with 8KB alignment).
+ * this is useful because many medium to large sized structures
+ * fit less than 8 times (see [4]) into 4KB pages.
+ * we allow very small page sizes here, to reduce wastage in
+ * threads if only small allocations are required (this does
+ * bear the risk of incresing allocation times and fragmentation
+ * though).
+ */
+ allocator->min_page_size = MAX (allocator->min_page_size, 4096);
+ allocator->max_page_size = MAX (allocator->min_page_size, 8192);
+ allocator->min_page_size = MIN (allocator->min_page_size, 128);
+#else
+ /* we can only align to system page size */
+ allocator->max_page_size = sys_page_size;
+#endif
+ allocator->magazine_mutex = NULL; /* _g_slice_thread_init_nomessage() */
+ allocator->magazines = g_new0 (ChunkLink*, MAX_SLAB_INDEX (allocator));
+ allocator->contention_counters = g_new0 (guint, MAX_SLAB_INDEX (allocator));
+ allocator->mutex_counter = 0;
+ allocator->stamp_counter = MAX_STAMP_COUNTER; /* force initial update */
+ allocator->last_stamp = 0;
+ allocator->slab_mutex = NULL; /* _g_slice_thread_init_nomessage() */
+ allocator->slab_stack = g_new0 (SlabInfo*, MAX_SLAB_INDEX (allocator));
+ allocator->color_accu = 0;
+ magazine_cache_update_stamp();
+ /* values cached for performance reasons */
+ allocator->max_slab_chunk_size_for_magazine_cache = MAX_SLAB_CHUNK_SIZE (allocator);
+ if (allocator->config.always_malloc || allocator->config.bypass_magazines)
+ allocator->max_slab_chunk_size_for_magazine_cache = 0; /* non-optimized cases */
+ /* at this point, g_mem_gc_friendly() should be initialized, this
+ * should have been accomplished by the above g_malloc/g_new calls
+ */
+}
+
+static inline guint
+allocator_categorize (gsize aligned_chunk_size)
+{
+ /* speed up the likely path */
+ if (G_LIKELY (aligned_chunk_size && aligned_chunk_size <= allocator->max_slab_chunk_size_for_magazine_cache))
+ return 1; /* use magazine cache */
+
+ /* the above will fail (max_slab_chunk_size_for_magazine_cache == 0) if the
+ * allocator is still uninitialized, or if we are not configured to use the
+ * magazine cache.
+ */
+ if (!sys_page_size)
+ g_slice_init_nomessage ();
+ if (!allocator->config.always_malloc &&
+ aligned_chunk_size &&
+ aligned_chunk_size <= MAX_SLAB_CHUNK_SIZE (allocator))
+ {
+ if (allocator->config.bypass_magazines)
+ return 2; /* use slab allocator, see [2] */
+ return 1; /* use magazine cache */
+ }
+ return 0; /* use malloc() */
+}
+
+void
+_g_slice_thread_init_nomessage (void)
+{
+ /* we may not use g_error() or friends here */
+ if (sys_page_size)
+ {
+ const char *pname;
+
+ /* mem_error ("g_thread_init() must be called before GSlice is used, memory corrupted..."); */
+ fputs ("\n***MEMORY-WARNING***: ", stderr);
+ pname = g_get_prgname();
+ fprintf (stderr, "%s[%u]: GSlice: ", pname ? pname : "", getpid());
+ fputs ("g_thread_init() must be called before all other GLib functions; "
+ "memory corruption due to late invocation of g_thread_init() has been detected; "
+ "this program is likely to crash, leak or unexpectedly abort soon...\n", stderr);
+ }
+ if (!sys_page_size)
+ g_slice_init_nomessage();
+ private_thread_memory = g_private_new (private_thread_memory_cleanup);
+ allocator->magazine_mutex = g_mutex_new();
+ allocator->slab_mutex = g_mutex_new();
+ if (allocator->config.debug_blocks)
+ smc_tree_mutex = g_mutex_new();
+}
+
+static inline void
+g_mutex_lock_a (GMutex *mutex,
+ guint *contention_counter)
+{
+ gboolean contention = FALSE;
+ if (!g_mutex_trylock (mutex))
+ {
+ g_mutex_lock (mutex);
+ contention = TRUE;
+ }
+ if (contention)
+ {
+ allocator->mutex_counter++;
+ if (allocator->mutex_counter >= 1) /* quickly adapt to contention */
+ {
+ allocator->mutex_counter = 0;
+ *contention_counter = MIN (*contention_counter + 1, MAX_MAGAZINE_SIZE);
+ }
+ }
+ else /* !contention */
+ {
+ allocator->mutex_counter--;
+ if (allocator->mutex_counter < -11) /* moderately recover magazine sizes */
+ {
+ allocator->mutex_counter = 0;
+ *contention_counter = MAX (*contention_counter, 1) - 1;
+ }
+ }
+}
+
+static inline ThreadMemory*
+thread_memory_from_self (void)
+{
+ ThreadMemory *tmem = g_private_get (private_thread_memory);
+ if (G_UNLIKELY (!tmem))
+ {
+ const guint n_magazines = MAX_SLAB_INDEX (allocator);
+ tmem = g_malloc0 (sizeof (ThreadMemory) + sizeof (Magazine) * 2 * n_magazines);
+ tmem->magazine1 = (Magazine*) (tmem + 1);
+ tmem->magazine2 = &tmem->magazine1[n_magazines];
+ g_private_set (private_thread_memory, tmem);
+ }
+ return tmem;
+}
+
+static inline ChunkLink*
+magazine_chain_pop_head (ChunkLink **magazine_chunks)
+{
+ /* magazine chains are linked via ChunkLink->next.
+ * each ChunkLink->data of the toplevel chain may point to a subchain,
+ * linked via ChunkLink->next. ChunkLink->data of the subchains just
+ * contains uninitialized junk.
+ */
+ ChunkLink *chunk = (*magazine_chunks)->data;
+ if (G_UNLIKELY (chunk))
+ {
+ /* allocating from freed list */
+ (*magazine_chunks)->data = chunk->next;
+ }
+ else
+ {
+ chunk = *magazine_chunks;
+ *magazine_chunks = chunk->next;
+ }
+ return chunk;
+}
+
+#if 0 /* useful for debugging */
+static guint
+magazine_count (ChunkLink *head)
+{
+ guint count = 0;
+ if (!head)
+ return 0;
+ while (head)
+ {
+ ChunkLink *child = head->data;
+ count += 1;
+ for (child = head->data; child; child = child->next)
+ count += 1;
+ head = head->next;
+ }
+ return count;
+}
+#endif
+
+static inline gsize
+allocator_get_magazine_threshold (Allocator *allocator,
+ guint ix)
+{
+ /* the magazine size calculated here has a lower bound of MIN_MAGAZINE_SIZE,
+ * which is required by the implementation. also, for moderately sized chunks
+ * (say >= 64 bytes), magazine sizes shouldn't be much smaller then the number
+ * of chunks available per page/2 to avoid excessive traffic in the magazine
+ * cache for small to medium sized structures.
+ * the upper bound of the magazine size is effectively provided by
+ * MAX_MAGAZINE_SIZE. for larger chunks, this number is scaled down so that
+ * the content of a single magazine doesn't exceed ca. 16KB.
+ */
+ gsize chunk_size = SLAB_CHUNK_SIZE (allocator, ix);
+ guint threshold = MAX (MIN_MAGAZINE_SIZE, allocator->max_page_size / MAX (5 * chunk_size, 5 * 32));
+ guint contention_counter = allocator->contention_counters[ix];
+ if (G_UNLIKELY (contention_counter)) /* single CPU bias */
+ {
+ /* adapt contention counter thresholds to chunk sizes */
+ contention_counter = contention_counter * 64 / chunk_size;
+ threshold = MAX (threshold, contention_counter);
+ }
+ return threshold;
+}
+
+/* --- magazine cache --- */
+static inline void
+magazine_cache_update_stamp (void)
+{
+ if (allocator->stamp_counter >= MAX_STAMP_COUNTER)
+ {
+ GTimeVal tv;
+ g_get_current_time (&tv);
+ allocator->last_stamp = tv.tv_sec * 1000 + tv.tv_usec / 1000; /* milli seconds */
+ allocator->stamp_counter = 0;
+ }
+ else
+ allocator->stamp_counter++;
+}
+
+static inline ChunkLink*
+magazine_chain_prepare_fields (ChunkLink *magazine_chunks)
+{
+ ChunkLink *chunk1;
+ ChunkLink *chunk2;
+ ChunkLink *chunk3;
+ ChunkLink *chunk4;
+ /* checked upon initialization: mem_assert (MIN_MAGAZINE_SIZE >= 4); */
+ /* ensure a magazine with at least 4 unused data pointers */
+ chunk1 = magazine_chain_pop_head (&magazine_chunks);
+ chunk2 = magazine_chain_pop_head (&magazine_chunks);
+ chunk3 = magazine_chain_pop_head (&magazine_chunks);
+ chunk4 = magazine_chain_pop_head (&magazine_chunks);
+ chunk4->next = magazine_chunks;
+ chunk3->next = chunk4;
+ chunk2->next = chunk3;
+ chunk1->next = chunk2;
+ return chunk1;
+}
+
+/* access the first 3 fields of a specially prepared magazine chain */
+#define magazine_chain_prev(mc) ((mc)->data)
+#define magazine_chain_stamp(mc) ((mc)->next->data)
+#define magazine_chain_uint_stamp(mc) GPOINTER_TO_UINT ((mc)->next->data)
+#define magazine_chain_next(mc) ((mc)->next->next->data)
+#define magazine_chain_count(mc) ((mc)->next->next->next->data)
+
+static void
+magazine_cache_trim (Allocator *allocator,
+ guint ix,
+ guint stamp)
+{
+ /* g_mutex_lock (allocator->mutex); done by caller */
+ /* trim magazine cache from tail */
+ ChunkLink *current = magazine_chain_prev (allocator->magazines[ix]);
+ ChunkLink *trash = NULL;
+ while (ABS (stamp - magazine_chain_uint_stamp (current)) >= allocator->config.working_set_msecs)
+ {
+ /* unlink */
+ ChunkLink *prev = magazine_chain_prev (current);
+ ChunkLink *next = magazine_chain_next (current);
+ magazine_chain_next (prev) = next;
+ magazine_chain_prev (next) = prev;
+ /* clear special fields, put on trash stack */
+ magazine_chain_next (current) = NULL;
+ magazine_chain_count (current) = NULL;
+ magazine_chain_stamp (current) = NULL;
+ magazine_chain_prev (current) = trash;
+ trash = current;
+ /* fixup list head if required */
+ if (current == allocator->magazines[ix])
+ {
+ allocator->magazines[ix] = NULL;
+ break;
+ }
+ current = prev;
+ }
+ g_mutex_unlock (allocator->magazine_mutex);
+ /* free trash */
+ if (trash)
+ {
+ const gsize chunk_size = SLAB_CHUNK_SIZE (allocator, ix);
+ g_mutex_lock (allocator->slab_mutex);
+ while (trash)
+ {
+ current = trash;
+ trash = magazine_chain_prev (current);
+ magazine_chain_prev (current) = NULL; /* clear special field */
+ while (current)
+ {
+ ChunkLink *chunk = magazine_chain_pop_head (&current);
+ slab_allocator_free_chunk (chunk_size, chunk);
+ }
+ }
+ g_mutex_unlock (allocator->slab_mutex);
+ }
+}
+
+static void
+magazine_cache_push_magazine (guint ix,
+ ChunkLink *magazine_chunks,
+ gsize count) /* must be >= MIN_MAGAZINE_SIZE */
+{
+ ChunkLink *current = magazine_chain_prepare_fields (magazine_chunks);
+ ChunkLink *next, *prev;
+ g_mutex_lock (allocator->magazine_mutex);
+ /* add magazine at head */
+ next = allocator->magazines[ix];
+ if (next)
+ prev = magazine_chain_prev (next);
+ else
+ next = prev = current;
+ magazine_chain_next (prev) = current;
+ magazine_chain_prev (next) = current;
+ magazine_chain_prev (current) = prev;
+ magazine_chain_next (current) = next;
+ magazine_chain_count (current) = (gpointer) count;
+ /* stamp magazine */
+ magazine_cache_update_stamp();
+ magazine_chain_stamp (current) = GUINT_TO_POINTER (allocator->last_stamp);
+ allocator->magazines[ix] = current;
+ /* free old magazines beyond a certain threshold */
+ magazine_cache_trim (allocator, ix, allocator->last_stamp);
+ /* g_mutex_unlock (allocator->mutex); was done by magazine_cache_trim() */
+}
+
+static ChunkLink*
+magazine_cache_pop_magazine (guint ix,
+ gsize *countp)
+{
+ g_mutex_lock_a (allocator->magazine_mutex, &allocator->contention_counters[ix]);
+ if (!allocator->magazines[ix])
+ {
+ guint magazine_threshold = allocator_get_magazine_threshold (allocator, ix);
+ gsize i, chunk_size = SLAB_CHUNK_SIZE (allocator, ix);
+ ChunkLink *chunk, *head;
+ g_mutex_unlock (allocator->magazine_mutex);
+ g_mutex_lock (allocator->slab_mutex);
+ head = slab_allocator_alloc_chunk (chunk_size);
+ head->data = NULL;
+ chunk = head;
+ for (i = 1; i < magazine_threshold; i++)
+ {
+ chunk->next = slab_allocator_alloc_chunk (chunk_size);
+ chunk = chunk->next;
+ chunk->data = NULL;
+ }
+ chunk->next = NULL;
+ g_mutex_unlock (allocator->slab_mutex);
+ *countp = i;
+ return head;
+ }
+ else
+ {
+ ChunkLink *current = allocator->magazines[ix];
+ ChunkLink *prev = magazine_chain_prev (current);
+ ChunkLink *next = magazine_chain_next (current);
+ /* unlink */
+ magazine_chain_next (prev) = next;
+ magazine_chain_prev (next) = prev;
+ allocator->magazines[ix] = next == current ? NULL : next;
+ g_mutex_unlock (allocator->magazine_mutex);
+ /* clear special fields and hand out */
+ *countp = (gsize) magazine_chain_count (current);
+ magazine_chain_prev (current) = NULL;
+ magazine_chain_next (current) = NULL;
+ magazine_chain_count (current) = NULL;
+ magazine_chain_stamp (current) = NULL;
+ return current;
+ }
+}
+
+/* --- thread magazines --- */
+static void
+private_thread_memory_cleanup (gpointer data)
+{
+ ThreadMemory *tmem = data;
+ const guint n_magazines = MAX_SLAB_INDEX (allocator);
+ guint ix;
+ for (ix = 0; ix < n_magazines; ix++)
+ {
+ Magazine *mags[2];
+ guint j;
+ mags[0] = &tmem->magazine1[ix];
+ mags[1] = &tmem->magazine2[ix];
+ for (j = 0; j < 2; j++)
+ {
+ Magazine *mag = mags[j];
+ if (mag->count >= MIN_MAGAZINE_SIZE)
+ magazine_cache_push_magazine (ix, mag->chunks, mag->count);
+ else
+ {
+ const gsize chunk_size = SLAB_CHUNK_SIZE (allocator, ix);
+ g_mutex_lock (allocator->slab_mutex);
+ while (mag->chunks)
+ {
+ ChunkLink *chunk = magazine_chain_pop_head (&mag->chunks);
+ slab_allocator_free_chunk (chunk_size, chunk);
+ }
+ g_mutex_unlock (allocator->slab_mutex);
+ }
+ }
+ }
+ g_free (tmem);
+}
+
+static void
+thread_memory_magazine1_reload (ThreadMemory *tmem,
+ guint ix)
+{
+ Magazine *mag = &tmem->magazine1[ix];
+ mem_assert (mag->chunks == NULL); /* ensure that we may reset mag->count */
+ mag->count = 0;
+ mag->chunks = magazine_cache_pop_magazine (ix, &mag->count);
+}
+
+static void
+thread_memory_magazine2_unload (ThreadMemory *tmem,
+ guint ix)
+{
+ Magazine *mag = &tmem->magazine2[ix];
+ magazine_cache_push_magazine (ix, mag->chunks, mag->count);
+ mag->chunks = NULL;
+ mag->count = 0;
+}
+
+static inline void
+thread_memory_swap_magazines (ThreadMemory *tmem,
+ guint ix)
+{
+ Magazine xmag = tmem->magazine1[ix];
+ tmem->magazine1[ix] = tmem->magazine2[ix];
+ tmem->magazine2[ix] = xmag;
+}
+
+static inline gboolean
+thread_memory_magazine1_is_empty (ThreadMemory *tmem,
+ guint ix)
+{
+ return tmem->magazine1[ix].chunks == NULL;
+}
+
+static inline gboolean
+thread_memory_magazine2_is_full (ThreadMemory *tmem,
+ guint ix)
+{
+ return tmem->magazine2[ix].count >= allocator_get_magazine_threshold (allocator, ix);
+}
+
+static inline gpointer
+thread_memory_magazine1_alloc (ThreadMemory *tmem,
+ guint ix)
+{
+ Magazine *mag = &tmem->magazine1[ix];
+ ChunkLink *chunk = magazine_chain_pop_head (&mag->chunks);
+ if (G_LIKELY (mag->count > 0))
+ mag->count--;
+ return chunk;
+}
+
+static inline void
+thread_memory_magazine2_free (ThreadMemory *tmem,
+ guint ix,
+ gpointer mem)
+{
+ Magazine *mag = &tmem->magazine2[ix];
+ ChunkLink *chunk = mem;
+ chunk->data = NULL;
+ chunk->next = mag->chunks;
+ mag->chunks = chunk;
+ mag->count++;
+}
+
+/* --- API functions --- */
+gpointer
+g_slice_alloc (gsize mem_size)
+{
+ gsize chunk_size;
+ gpointer mem;
+ guint acat;
+ chunk_size = P2ALIGN (mem_size);
+ acat = allocator_categorize (chunk_size);
+ if (G_LIKELY (acat == 1)) /* allocate through magazine layer */
+ {
+ ThreadMemory *tmem = thread_memory_from_self();
+ guint ix = SLAB_INDEX (allocator, chunk_size);
+ if (G_UNLIKELY (thread_memory_magazine1_is_empty (tmem, ix)))
+ {
+ thread_memory_swap_magazines (tmem, ix);
+ if (G_UNLIKELY (thread_memory_magazine1_is_empty (tmem, ix)))
+ thread_memory_magazine1_reload (tmem, ix);
+ }
+ mem = thread_memory_magazine1_alloc (tmem, ix);
+ }
+ else if (acat == 2) /* allocate through slab allocator */
+ {
+ g_mutex_lock (allocator->slab_mutex);
+ mem = slab_allocator_alloc_chunk (chunk_size);
+ g_mutex_unlock (allocator->slab_mutex);
+ }
+ else /* delegate to system malloc */
+ mem = g_malloc (mem_size);
+ if (G_UNLIKELY (allocator->config.debug_blocks))
+ smc_notify_alloc (mem, mem_size);
+ return mem;
+}
+
+gpointer
+g_slice_alloc0 (gsize mem_size)
+{
+ gpointer mem = g_slice_alloc (mem_size);
+ if (mem)
+ memset (mem, 0, mem_size);
+ return mem;
+}
+
+void
+g_slice_free1 (gsize mem_size,
+ gpointer mem_block)
+{
+ gsize chunk_size = P2ALIGN (mem_size);
+ guint acat = allocator_categorize (chunk_size);
+ if (G_UNLIKELY (!mem_block))
+ return;
+ if (G_UNLIKELY (allocator->config.debug_blocks) &&
+ !smc_notify_free (mem_block, mem_size))
+ abort();
+ if (G_LIKELY (acat == 1)) /* allocate through magazine layer */
+ {
+ ThreadMemory *tmem = thread_memory_from_self();
+ guint ix = SLAB_INDEX (allocator, chunk_size);
+ if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix)))
+ {
+ thread_memory_swap_magazines (tmem, ix);
+ if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix)))
+ thread_memory_magazine2_unload (tmem, ix);
+ }
+ if (G_UNLIKELY (g_mem_gc_friendly))
+ memset (mem_block, 0, chunk_size);
+ thread_memory_magazine2_free (tmem, ix, mem_block);
+ }
+ else if (acat == 2) /* allocate through slab allocator */
+ {
+ if (G_UNLIKELY (g_mem_gc_friendly))
+ memset (mem_block, 0, chunk_size);
+ g_mutex_lock (allocator->slab_mutex);
+ slab_allocator_free_chunk (chunk_size, mem_block);
+ g_mutex_unlock (allocator->slab_mutex);
+ }
+ else /* delegate to system malloc */
+ {
+ if (G_UNLIKELY (g_mem_gc_friendly))
+ memset (mem_block, 0, mem_size);
+ g_free (mem_block);
+ }
+}
+
+void
+g_slice_free_chain_with_offset (gsize mem_size,
+ gpointer mem_chain,
+ gsize next_offset)
+{
+ gpointer slice = mem_chain;
+ /* while the thread magazines and the magazine cache are implemented so that
+ * they can easily be extended to allow for free lists containing more free
+ * lists for the first level nodes, which would allow O(1) freeing in this
+ * function, the benefit of such an extension is questionable, because:
+ * - the magazine size counts will become mere lower bounds which confuses
+ * the code adapting to lock contention;
+ * - freeing a single node to the thread magazines is very fast, so this
+ * O(list_length) operation is multiplied by a fairly small factor;
+ * - memory usage histograms on larger applications seem to indicate that
+ * the amount of released multi node lists is negligible in comparison
+ * to single node releases.
+ * - the major performance bottle neck, namely g_private_get() or
+ * g_mutex_lock()/g_mutex_unlock() has already been moved out of the
+ * inner loop for freeing chained slices.
+ */
+ gsize chunk_size = P2ALIGN (mem_size);
+ guint acat = allocator_categorize (chunk_size);
+ if (G_LIKELY (acat == 1)) /* allocate through magazine layer */
+ {
+ ThreadMemory *tmem = thread_memory_from_self();
+ guint ix = SLAB_INDEX (allocator, chunk_size);
+ while (slice)
+ {
+ guint8 *current = slice;
+ slice = *(gpointer*) (current + next_offset);
+ if (G_UNLIKELY (allocator->config.debug_blocks) &&
+ !smc_notify_free (current, mem_size))
+ abort();
+ if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix)))
+ {
+ thread_memory_swap_magazines (tmem, ix);
+ if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix)))
+ thread_memory_magazine2_unload (tmem, ix);
+ }
+ if (G_UNLIKELY (g_mem_gc_friendly))
+ memset (current, 0, chunk_size);
+ thread_memory_magazine2_free (tmem, ix, current);
+ }
+ }
+ else if (acat == 2) /* allocate through slab allocator */
+ {
+ g_mutex_lock (allocator->slab_mutex);
+ while (slice)
+ {
+ guint8 *current = slice;
+ slice = *(gpointer*) (current + next_offset);
+ if (G_UNLIKELY (allocator->config.debug_blocks) &&
+ !smc_notify_free (current, mem_size))
+ abort();
+ if (G_UNLIKELY (g_mem_gc_friendly))
+ memset (current, 0, chunk_size);
+ slab_allocator_free_chunk (chunk_size, current);
+ }
+ g_mutex_unlock (allocator->slab_mutex);
+ }
+ else /* delegate to system malloc */
+ while (slice)
+ {
+ guint8 *current = slice;
+ slice = *(gpointer*) (current + next_offset);
+ if (G_UNLIKELY (allocator->config.debug_blocks) &&
+ !smc_notify_free (current, mem_size))
+ abort();
+ if (G_UNLIKELY (g_mem_gc_friendly))
+ memset (current, 0, mem_size);
+ g_free (current);
+ }
+}
+
+/* --- single page allocator --- */
+static void
+allocator_slab_stack_push (Allocator *allocator,
+ guint ix,
+ SlabInfo *sinfo)
+{
+ /* insert slab at slab ring head */
+ if (!allocator->slab_stack[ix])
+ {
+ sinfo->next = sinfo;
+ sinfo->prev = sinfo;
+ }
+ else
+ {
+ SlabInfo *next = allocator->slab_stack[ix], *prev = next->prev;
+ next->prev = sinfo;
+ prev->next = sinfo;
+ sinfo->next = next;
+ sinfo->prev = prev;
+ }
+ allocator->slab_stack[ix] = sinfo;
+}
+
+static gsize
+allocator_aligned_page_size (Allocator *allocator,
+ gsize n_bytes)
+{
+ gsize val = 1 << g_bit_storage (n_bytes - 1);
+ val = MAX (val, allocator->min_page_size);
+ return val;
+}
+
+static void
+allocator_add_slab (Allocator *allocator,
+ guint ix,
+ gsize chunk_size)
+{
+ ChunkLink *chunk;
+ SlabInfo *sinfo;
+ gsize addr, padding, n_chunks, color = 0;
+ gsize page_size = allocator_aligned_page_size (allocator, SLAB_BPAGE_SIZE (allocator, chunk_size));
+ /* allocate 1 page for the chunks and the slab */
+ gpointer aligned_memory = allocator_memalign (page_size, page_size - NATIVE_MALLOC_PADDING);
+ guint8 *mem = aligned_memory;
+ guint i;
+ if (!mem)
+ {
+ const gchar *syserr = "unknown error";
+#if HAVE_STRERROR
+ syserr = strerror (errno);
+#endif
+ mem_error ("failed to allocate %u bytes (alignment: %u): %s\n",
+ (guint) (page_size - NATIVE_MALLOC_PADDING), (guint) page_size, syserr);
+ }
+ /* mask page adress */
+ addr = ((gsize) mem / page_size) * page_size;
+ /* assert alignment */
+ mem_assert (aligned_memory == (gpointer) addr);
+ /* basic slab info setup */
+ sinfo = (SlabInfo*) (mem + page_size - SLAB_INFO_SIZE);
+ sinfo->n_allocated = 0;
+ sinfo->chunks = NULL;
+ /* figure cache colorization */
+ n_chunks = ((guint8*) sinfo - mem) / chunk_size;
+ padding = ((guint8*) sinfo - mem) - n_chunks * chunk_size;
+ if (padding)
+ {
+ color = (allocator->color_accu * P2ALIGNMENT) % padding;
+ allocator->color_accu += allocator->config.color_increment;
+ }
+ /* add chunks to free list */
+ chunk = (ChunkLink*) (mem + color);
+ sinfo->chunks = chunk;
+ for (i = 0; i < n_chunks - 1; i++)
+ {
+ chunk->next = (ChunkLink*) ((guint8*) chunk + chunk_size);
+ chunk = chunk->next;
+ }
+ chunk->next = NULL; /* last chunk */
+ /* add slab to slab ring */
+ allocator_slab_stack_push (allocator, ix, sinfo);
+}
+
+static gpointer
+slab_allocator_alloc_chunk (gsize chunk_size)
+{
+ ChunkLink *chunk;
+ guint ix = SLAB_INDEX (allocator, chunk_size);
+ /* ensure non-empty slab */
+ if (!allocator->slab_stack[ix] || !allocator->slab_stack[ix]->chunks)
+ allocator_add_slab (allocator, ix, chunk_size);
+ /* allocate chunk */
+ chunk = allocator->slab_stack[ix]->chunks;
+ allocator->slab_stack[ix]->chunks = chunk->next;
+ allocator->slab_stack[ix]->n_allocated++;
+ /* rotate empty slabs */
+ if (!allocator->slab_stack[ix]->chunks)
+ allocator->slab_stack[ix] = allocator->slab_stack[ix]->next;
+ return chunk;
+}
+
+static void
+slab_allocator_free_chunk (gsize chunk_size,
+ gpointer mem)
+{
+ ChunkLink *chunk;
+ gboolean was_empty;
+ guint ix = SLAB_INDEX (allocator, chunk_size);
+ gsize page_size = allocator_aligned_page_size (allocator, SLAB_BPAGE_SIZE (allocator, chunk_size));
+ gsize addr = ((gsize) mem / page_size) * page_size;
+ /* mask page adress */
+ guint8 *page = (guint8*) addr;
+ SlabInfo *sinfo = (SlabInfo*) (page + page_size - SLAB_INFO_SIZE);
+ /* assert valid chunk count */
+ mem_assert (sinfo->n_allocated > 0);
+ /* add chunk to free list */
+ was_empty = sinfo->chunks == NULL;
+ chunk = (ChunkLink*) mem;
+ chunk->next = sinfo->chunks;
+ sinfo->chunks = chunk;
+ sinfo->n_allocated--;
+ /* keep slab ring partially sorted, empty slabs at end */
+ if (was_empty)
+ {
+ /* unlink slab */
+ SlabInfo *next = sinfo->next, *prev = sinfo->prev;
+ next->prev = prev;
+ prev->next = next;
+ if (allocator->slab_stack[ix] == sinfo)
+ allocator->slab_stack[ix] = next == sinfo ? NULL : next;
+ /* insert slab at head */
+ allocator_slab_stack_push (allocator, ix, sinfo);
+ }
+ /* eagerly free complete unused slabs */
+ if (!sinfo->n_allocated)
+ {
+ /* unlink slab */
+ SlabInfo *next = sinfo->next, *prev = sinfo->prev;
+ next->prev = prev;
+ prev->next = next;
+ if (allocator->slab_stack[ix] == sinfo)
+ allocator->slab_stack[ix] = next == sinfo ? NULL : next;
+ /* free slab */
+ allocator_memfree (page_size, page);
+ }
+}
+
+/* --- memalign implementation --- */
+#ifdef HAVE_MALLOC_H
+#include <malloc.h> /* memalign() */
+#endif
+
+/* from config.h:
+ * define HAVE_POSIX_MEMALIGN 1 // if free(posix_memalign(3)) works, <stdlib.h>
+ * define HAVE_COMPLIANT_POSIX_MEMALIGN 1 // if free(posix_memalign(3)) works for sizes != 2^n, <stdlib.h>
+ * define HAVE_MEMALIGN 1 // if free(memalign(3)) works, <malloc.h>
+ * define HAVE_VALLOC 1 // if free(valloc(3)) works, <stdlib.h> or <malloc.h>
+ * if none is provided, we implement malloc(3)-based alloc-only page alignment
+ */
+
+#if !(HAVE_COMPLIANT_POSIX_MEMALIGN || HAVE_MEMALIGN || HAVE_VALLOC)
+static GTrashStack *compat_valloc_trash = NULL;
+#endif
+
+static gpointer
+allocator_memalign (gsize alignment,
+ gsize memsize)
+{
+ gpointer aligned_memory = NULL;
+ gint err = ENOMEM;
+#if HAVE_COMPLIANT_POSIX_MEMALIGN
+ err = posix_memalign (&aligned_memory, alignment, memsize);
+#elif HAVE_MEMALIGN
+ errno = 0;
+ aligned_memory = memalign (alignment, memsize);
+ err = errno;
+#elif HAVE_VALLOC
+ errno = 0;
+ aligned_memory = valloc (memsize);
+ err = errno;
+#else
+ /* simplistic non-freeing page allocator */
+ mem_assert (alignment == sys_page_size);
+ mem_assert (memsize <= sys_page_size);
+ if (!compat_valloc_trash)
+ {
+ const guint n_pages = 16;
+ guint8 *mem = malloc (n_pages * sys_page_size);
+ err = errno;
+ if (mem)
+ {
+ gint i = n_pages;
+ guint8 *amem = (guint8*) ALIGN ((gsize) mem, sys_page_size);
+ if (amem != mem)
+ i--; /* mem wasn't page aligned */
+ while (--i >= 0)
+ g_trash_stack_push (&compat_valloc_trash, amem + i * sys_page_size);
+ }
+ }
+ aligned_memory = g_trash_stack_pop (&compat_valloc_trash);
+#endif
+ if (!aligned_memory)
+ errno = err;
+ return aligned_memory;
+}
+
+static void
+allocator_memfree (gsize memsize,
+ gpointer mem)
+{
+#if HAVE_COMPLIANT_POSIX_MEMALIGN || HAVE_MEMALIGN || HAVE_VALLOC
+ free (mem);
+#else
+ mem_assert (memsize <= sys_page_size);
+ g_trash_stack_push (&compat_valloc_trash, mem);
+#endif
+}
+
+static void
+mem_error (const char *format,
+ ...)
+{
+ const char *pname;
+ va_list args;
+ /* at least, put out "MEMORY-ERROR", in case we segfault during the rest of the function */
+ fputs ("\n***MEMORY-ERROR***: ", stderr);
+ pname = g_get_prgname();
+ fprintf (stderr, "%s[%u]: GSlice: ", pname ? pname : "", getpid());
+ va_start (args, format);
+ vfprintf (stderr, format, args);
+ va_end (args);
+ fputs ("\n", stderr);
+ abort();
+ _exit (1);
+}
+
+/* --- g-slice memory checker tree --- */
+typedef size_t SmcKType; /* key type */
+typedef size_t SmcVType; /* value type */
+typedef struct {
+ SmcKType key;
+ SmcVType value;
+} SmcEntry;
+static void smc_tree_insert (SmcKType key,
+ SmcVType value);
+static gboolean smc_tree_lookup (SmcKType key,
+ SmcVType *value_p);
+static gboolean smc_tree_remove (SmcKType key);
+
+
+/* --- g-slice memory checker implementation --- */
+static void
+smc_notify_alloc (void *pointer,
+ size_t size)
+{
+ size_t adress = (size_t) pointer;
+ if (pointer)
+ smc_tree_insert (adress, size);
+}
+
+#if 0
+static void
+smc_notify_ignore (void *pointer)
+{
+ size_t adress = (size_t) pointer;
+ if (pointer)
+ smc_tree_remove (adress);
+}
+#endif
+
+static int
+smc_notify_free (void *pointer,
+ size_t size)
+{
+ size_t adress = (size_t) pointer;
+ SmcVType real_size;
+ gboolean found_one;
+
+ if (!pointer)
+ return 1; /* ignore */
+ found_one = smc_tree_lookup (adress, &real_size);
+ if (!found_one)
+ {
+ fprintf (stderr, "GSlice: MemChecker: attempt to release non-allocated block: %p size=%zu\n", pointer, size);
+ return 0;
+ }
+ if (real_size != size && (real_size || size))
+ {
+ fprintf (stderr, "GSlice: MemChecker: attempt to release block with invalid size: %p size=%zu invalid-size=%zu\n", pointer, real_size, size);
+ return 0;
+ }
+ if (!smc_tree_remove (adress))
+ {
+ fprintf (stderr, "GSlice: MemChecker: attempt to release non-allocated block: %p size=%zu\n", pointer, size);
+ return 0;
+ }
+ return 1; /* all fine */
+}
+
+/* --- g-slice memory checker tree implementation --- */
+#define SMC_TRUNK_COUNT (4093 /* 16381 */) /* prime, to distribute trunk collisions (big, allocated just once) */
+#define SMC_BRANCH_COUNT (511) /* prime, to distribute branch collisions */
+#define SMC_TRUNK_EXTENT (SMC_BRANCH_COUNT * 2039) /* key adress space per trunk, should distribute uniformly across BRANCH_COUNT */
+#define SMC_TRUNK_HASH(k) ((k / SMC_TRUNK_EXTENT) % SMC_TRUNK_COUNT) /* generate new trunk hash per megabyte (roughly) */
+#define SMC_BRANCH_HASH(k) (k % SMC_BRANCH_COUNT)
+
+typedef struct {
+ SmcEntry *entries;
+ unsigned int n_entries;
+} SmcBranch;
+
+static SmcBranch **smc_tree_root = NULL;
+
+static void
+smc_tree_abort (int errval)
+{
+ const char *syserr = "unknown error";
+#if HAVE_STRERROR
+ syserr = strerror (errval);
+#endif
+ mem_error ("MemChecker: failure in debugging tree: %s", syserr);
+}
+
+static inline SmcEntry*
+smc_tree_branch_grow_L (SmcBranch *branch,
+ unsigned int index)
+{
+ unsigned int old_size = branch->n_entries * sizeof (branch->entries[0]);
+ unsigned int new_size = old_size + sizeof (branch->entries[0]);
+ SmcEntry *entry;
+ mem_assert (index <= branch->n_entries);
+ branch->entries = (SmcEntry*) realloc (branch->entries, new_size);
+ if (!branch->entries)
+ smc_tree_abort (errno);
+ entry = branch->entries + index;
+ g_memmove (entry + 1, entry, (branch->n_entries - index) * sizeof (entry[0]));
+ branch->n_entries += 1;
+ return entry;
+}
+
+static inline SmcEntry*
+smc_tree_branch_lookup_nearest_L (SmcBranch *branch,
+ SmcKType key)
+{
+ unsigned int n_nodes = branch->n_entries, offs = 0;
+ SmcEntry *check = branch->entries;
+ int cmp = 0;
+ while (offs < n_nodes)
+ {
+ unsigned int i = (offs + n_nodes) >> 1;
+ check = branch->entries + i;
+ cmp = key < check->key ? -1 : key != check->key;
+ if (cmp == 0)
+ return check; /* return exact match */
+ else if (cmp < 0)
+ n_nodes = i;
+ else /* (cmp > 0) */
+ offs = i + 1;
+ }
+ /* check points at last mismatch, cmp > 0 indicates greater key */
+ return cmp > 0 ? check + 1 : check; /* return insertion position for inexact match */
+}
+
+static void
+smc_tree_insert (SmcKType key,
+ SmcVType value)
+{
+ unsigned int ix0, ix1;
+ SmcEntry *entry;
+
+ g_mutex_lock (smc_tree_mutex);
+ ix0 = SMC_TRUNK_HASH (key);
+ ix1 = SMC_BRANCH_HASH (key);
+ if (!smc_tree_root)
+ {
+ smc_tree_root = calloc (SMC_TRUNK_COUNT, sizeof (smc_tree_root[0]));
+ if (!smc_tree_root)
+ smc_tree_abort (errno);
+ }
+ if (!smc_tree_root[ix0])
+ {
+ smc_tree_root[ix0] = calloc (SMC_BRANCH_COUNT, sizeof (smc_tree_root[0][0]));
+ if (!smc_tree_root[ix0])
+ smc_tree_abort (errno);
+ }
+ entry = smc_tree_branch_lookup_nearest_L (&smc_tree_root[ix0][ix1], key);
+ if (!entry || /* need create */
+ entry >= smc_tree_root[ix0][ix1].entries + smc_tree_root[ix0][ix1].n_entries || /* need append */
+ entry->key != key) /* need insert */
+ entry = smc_tree_branch_grow_L (&smc_tree_root[ix0][ix1], entry - smc_tree_root[ix0][ix1].entries);
+ entry->key = key;
+ entry->value = value;
+ g_mutex_unlock (smc_tree_mutex);
+}
+
+static gboolean
+smc_tree_lookup (SmcKType key,
+ SmcVType *value_p)
+{
+ SmcEntry *entry = NULL;
+ unsigned int ix0 = SMC_TRUNK_HASH (key), ix1 = SMC_BRANCH_HASH (key);
+ gboolean found_one = FALSE;
+ *value_p = 0;
+ g_mutex_lock (smc_tree_mutex);
+ if (smc_tree_root && smc_tree_root[ix0])
+ {
+ entry = smc_tree_branch_lookup_nearest_L (&smc_tree_root[ix0][ix1], key);
+ if (entry &&
+ entry < smc_tree_root[ix0][ix1].entries + smc_tree_root[ix0][ix1].n_entries &&
+ entry->key == key)
+ {
+ found_one = TRUE;
+ *value_p = entry->value;
+ }
+ }
+ g_mutex_unlock (smc_tree_mutex);
+ return found_one;
+}
+
+static gboolean
+smc_tree_remove (SmcKType key)
+{
+ unsigned int ix0 = SMC_TRUNK_HASH (key), ix1 = SMC_BRANCH_HASH (key);
+ gboolean found_one = FALSE;
+ g_mutex_lock (smc_tree_mutex);
+ if (smc_tree_root && smc_tree_root[ix0])
+ {
+ SmcEntry *entry = smc_tree_branch_lookup_nearest_L (&smc_tree_root[ix0][ix1], key);
+ if (entry &&
+ entry < smc_tree_root[ix0][ix1].entries + smc_tree_root[ix0][ix1].n_entries &&
+ entry->key == key)
+ {
+ unsigned int i = entry - smc_tree_root[ix0][ix1].entries;
+ smc_tree_root[ix0][ix1].n_entries -= 1;
+ g_memmove (entry, entry + 1, (smc_tree_root[ix0][ix1].n_entries - i) * sizeof (entry[0]));
+ if (!smc_tree_root[ix0][ix1].n_entries)
+ {
+ /* avoid useless pressure on the memory system */
+ free (smc_tree_root[ix0][ix1].entries);
+ smc_tree_root[ix0][ix1].entries = NULL;
+ }
+ found_one = TRUE;
+ }
+ }
+ g_mutex_unlock (smc_tree_mutex);
+ return found_one;
+}
+
+#ifdef G_ENABLE_DEBUG
+void
+g_slice_debug_tree_statistics (void)
+{
+ g_mutex_lock (smc_tree_mutex);
+ if (smc_tree_root)
+ {
+ unsigned int i, j, t = 0, o = 0, b = 0, su = 0, ex = 0, en = 4294967295u;
+ double tf, bf;
+ for (i = 0; i < SMC_TRUNK_COUNT; i++)
+ if (smc_tree_root[i])
+ {
+ t++;
+ for (j = 0; j < SMC_BRANCH_COUNT; j++)
+ if (smc_tree_root[i][j].n_entries)
+ {
+ b++;
+ su += smc_tree_root[i][j].n_entries;
+ en = MIN (en, smc_tree_root[i][j].n_entries);
+ ex = MAX (ex, smc_tree_root[i][j].n_entries);
+ }
+ else if (smc_tree_root[i][j].entries)
+ o++; /* formerly used, now empty */
+ }
+ en = b ? en : 0;
+ tf = MAX (t, 1.0); // max(1) to be a valid divisor
+ bf = MAX (b, 1.0); // max(1) to be a valid divisor
+ fprintf (stderr, "GSlice: MemChecker: %u trunks, %u branches, %u old branches\n", t, b, o);
+ fprintf (stderr, "GSlice: MemChecker: %f branches per trunk, %.2f%% utilization\n",
+ b / tf,
+ 100.0 - (SMC_BRANCH_COUNT - b / tf) / (0.01 * SMC_BRANCH_COUNT));
+ fprintf (stderr, "GSlice: MemChecker: %f entries per branch, %u minimum, %u maximum\n",
+ su / bf, en, ex);
+ }
+ else
+ fprintf (stderr, "GSlice: MemChecker: root=NULL\n");
+ g_mutex_unlock (smc_tree_mutex);
+
+ /* sample statistics (beast + GSLice + 24h scripted core & GUI activity):
+ * PID %CPU %MEM VSZ RSS COMMAND
+ * 8887 30.3 45.8 456068 414856 beast-0.7.1 empty.bse
+ * $ cat /proc/8887/statm # total-program-size resident-set-size shared-pages text/code data/stack library dirty-pages
+ * 114017 103714 2354 344 0 108676 0
+ * $ cat /proc/8887/status
+ * Name: beast-0.7.1
+ * VmSize: 456068 kB
+ * VmLck: 0 kB
+ * VmRSS: 414856 kB
+ * VmData: 434620 kB
+ * VmStk: 84 kB
+ * VmExe: 1376 kB
+ * VmLib: 13036 kB
+ * VmPTE: 456 kB
+ * Threads: 3
+ * (gdb) print g_slice_debug_tree_statistics ()
+ * GSlice: MemChecker: 422 trunks, 213068 branches, 0 old branches
+ * GSlice: MemChecker: 504.900474 branches per trunk, 98.81% utilization
+ * GSlice: MemChecker: 4.965039 entries per branch, 1 minimum, 37 maximum
+ */
+}
+#endif /* G_ENABLE_DEBUG */
+
+#define __G_SLICE_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gslice.h b/trunk/glib/gslice.h
new file mode 100644
index 000000000..93b545a7c
--- /dev/null
+++ b/trunk/glib/gslice.h
@@ -0,0 +1,77 @@
+/* GLIB sliced memory - fast threaded memory chunk allocator
+ * Copyright (C) 2005 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.
+ */
+#ifndef __G_SLICE_H__
+#define __G_SLICE_H__
+
+#ifndef __G_MEM_H__
+#error Include <glib.h> instead of <gslice.h>
+#endif
+
+#include <glib/gtypes.h>
+
+G_BEGIN_DECLS
+
+/* slices - fast allocation/release of small memory blocks
+ */
+gpointer g_slice_alloc (gsize block_size) G_GNUC_MALLOC;
+gpointer g_slice_alloc0 (gsize block_size) G_GNUC_MALLOC;
+void g_slice_free1 (gsize block_size,
+ gpointer mem_block);
+void g_slice_free_chain_with_offset (gsize block_size,
+ gpointer mem_chain,
+ gsize next_offset);
+#define g_slice_new(type) ((type*) g_slice_alloc (sizeof (type)))
+#define g_slice_new0(type) ((type*) g_slice_alloc0 (sizeof (type)))
+/* g_slice_free (MemoryBlockType,
+ * MemoryBlockType *mem_block);
+ * g_slice_free_chain (MemoryBlockType,
+ * MemoryBlockType *first_chain_block,
+ * memory_block_next_field);
+ * pseudo prototypes for the macro
+ * definitions following below.
+ */
+
+/* we go through extra hoops to ensure type safety */
+#define g_slice_free(type, mem) do { \
+ if (1) g_slice_free1 (sizeof (type), (mem)); \
+ else (void) ((type*) 0 == (mem)); \
+} while (0)
+#define g_slice_free_chain(type, mem_chain, next) do { \
+ if (1) g_slice_free_chain_with_offset (sizeof (type), \
+ (mem_chain), G_STRUCT_OFFSET (type, next)); \
+ else (void) ((type*) 0 == (mem_chain)); \
+} while (0)
+
+
+/* --- internal debugging API --- */
+typedef enum {
+ G_SLICE_CONFIG_ALWAYS_MALLOC = 1,
+ G_SLICE_CONFIG_BYPASS_MAGAZINES,
+ G_SLICE_CONFIG_WORKING_SET_MSECS,
+ G_SLICE_CONFIG_COLOR_INCREMENT,
+ G_SLICE_CONFIG_CHUNK_SIZES,
+ G_SLICE_CONFIG_CONTENTION_COUNTER
+} GSliceConfig;
+void g_slice_set_config (GSliceConfig ckey, gint64 value);
+gint64 g_slice_get_config (GSliceConfig ckey);
+gint64* g_slice_get_config_state (GSliceConfig ckey, gint64 address, guint *n_values);
+
+G_END_DECLS
+
+#endif /* __G_SLICE_H__ */
diff --git a/trunk/glib/gslist.c b/trunk/glib/gslist.c
new file mode 100644
index 000000000..6fa196bb7
--- /dev/null
+++ b/trunk/glib/gslist.c
@@ -0,0 +1,621 @@
+/* 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 "config.h"
+
+#include "glib.h"
+#include "galias.h"
+
+
+void g_slist_push_allocator (gpointer dummy) { /* present for binary compat only */ }
+void g_slist_pop_allocator (void) { /* present for binary compat only */ }
+
+#define _g_slist_alloc0() g_slice_new0 (GSList)
+#define _g_slist_alloc() g_slice_new (GSList)
+#define _g_slist_free1(slist) g_slice_free (GSList, slist)
+
+GSList*
+g_slist_alloc (void)
+{
+ return _g_slist_alloc0 ();
+}
+
+void
+g_slist_free (GSList *slist)
+{
+ g_slice_free_chain (GSList, slist, next);
+}
+
+void
+g_slist_free_1 (GSList *slist)
+{
+ _g_slist_free1 (slist);
+}
+
+GSList*
+g_slist_append (GSList *list,
+ gpointer data)
+{
+ GSList *new_list;
+ GSList *last;
+
+ new_list = _g_slist_alloc ();
+ new_list->data = data;
+ new_list->next = NULL;
+
+ 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)
+ {
+ new_list->next = NULL;
+ 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_insert_before (GSList *slist,
+ GSList *sibling,
+ gpointer data)
+{
+ if (!slist)
+ {
+ slist = _g_slist_alloc ();
+ slist->data = data;
+ slist->next = NULL;
+ g_return_val_if_fail (sibling == NULL, slist);
+ return slist;
+ }
+ else
+ {
+ GSList *node, *last = NULL;
+
+ for (node = slist; node; last = node, node = last->next)
+ if (node == sibling)
+ break;
+ if (!last)
+ {
+ node = _g_slist_alloc ();
+ node->data = data;
+ node->next = slist;
+
+ return node;
+ }
+ else
+ {
+ node = _g_slist_alloc ();
+ node->data = data;
+ node->next = last->next;
+ last->next = node;
+
+ return slist;
+ }
+ }
+}
+
+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_free1 (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;
+ }
+ last->next = NULL;
+ }
+
+ 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;
+ }
+}
+
+static GSList*
+g_slist_insert_sorted_real (GSList *list,
+ gpointer data,
+ GFunc func,
+ gpointer user_data)
+{
+ 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;
+ new_list->next = NULL;
+ return new_list;
+ }
+
+ cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data);
+
+ while ((tmp_list->next) && (cmp > 0))
+ {
+ prev_list = tmp_list;
+ tmp_list = tmp_list->next;
+
+ cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data);
+ }
+
+ new_list = _g_slist_alloc ();
+ new_list->data = data;
+
+ if ((!tmp_list->next) && (cmp > 0))
+ {
+ tmp_list->next = new_list;
+ new_list->next = NULL;
+ 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;
+ }
+}
+
+GSList*
+g_slist_insert_sorted (GSList *list,
+ gpointer data,
+ GCompareFunc func)
+{
+ return g_slist_insert_sorted_real (list, data, (GFunc) func, NULL);
+}
+
+GSList*
+g_slist_insert_sorted_with_data (GSList *list,
+ gpointer data,
+ GCompareDataFunc func,
+ gpointer user_data)
+{
+ return g_slist_insert_sorted_real (list, data, (GFunc) func, user_data);
+}
+
+static GSList *
+g_slist_sort_merge (GSList *l1,
+ GSList *l2,
+ GFunc compare_func,
+ gpointer user_data)
+{
+ GSList list, *l;
+ gint cmp;
+
+ l=&list;
+
+ while (l1 && l2)
+ {
+ cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_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,
+ 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, user_data),
+ g_slist_sort_real (l2, compare_func, user_data),
+ compare_func,
+ user_data);
+}
+
+GSList *
+g_slist_sort (GSList *list,
+ GCompareFunc compare_func)
+{
+ return g_slist_sort_real (list, (GFunc) compare_func, NULL);
+}
+
+GSList *
+g_slist_sort_with_data (GSList *list,
+ GCompareDataFunc compare_func,
+ gpointer user_data)
+{
+ return g_slist_sort_real (list, (GFunc) compare_func, user_data);
+}
+
+#define __G_SLIST_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gslist.h b/trunk/glib/gslist.h
new file mode 100644
index 000000000..8ef540882
--- /dev/null
+++ b/trunk/glib/gslist.h
@@ -0,0 +1,110 @@
+/* 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 <glib/gmem.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GSList GSList;
+
+struct _GSList
+{
+ gpointer data;
+ GSList *next;
+};
+
+/* Singly linked lists
+ */
+GSList* g_slist_alloc (void) G_GNUC_WARN_UNUSED_RESULT;
+void g_slist_free (GSList *list);
+void g_slist_free_1 (GSList *list);
+#define g_slist_free1 g_slist_free_1
+GSList* g_slist_append (GSList *list,
+ gpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GSList* g_slist_prepend (GSList *list,
+ gpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GSList* g_slist_insert (GSList *list,
+ gpointer data,
+ gint position) G_GNUC_WARN_UNUSED_RESULT;
+GSList* g_slist_insert_sorted (GSList *list,
+ gpointer data,
+ GCompareFunc func) G_GNUC_WARN_UNUSED_RESULT;
+GSList* g_slist_insert_sorted_with_data (GSList *list,
+ gpointer data,
+ GCompareDataFunc func,
+ gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
+GSList* g_slist_insert_before (GSList *slist,
+ GSList *sibling,
+ gpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GSList* g_slist_concat (GSList *list1,
+ GSList *list2) G_GNUC_WARN_UNUSED_RESULT;
+GSList* g_slist_remove (GSList *list,
+ gconstpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GSList* g_slist_remove_all (GSList *list,
+ gconstpointer data) G_GNUC_WARN_UNUSED_RESULT;
+GSList* g_slist_remove_link (GSList *list,
+ GSList *link_) G_GNUC_WARN_UNUSED_RESULT;
+GSList* g_slist_delete_link (GSList *list,
+ GSList *link_) G_GNUC_WARN_UNUSED_RESULT;
+GSList* g_slist_reverse (GSList *list) G_GNUC_WARN_UNUSED_RESULT;
+GSList* g_slist_copy (GSList *list) G_GNUC_WARN_UNUSED_RESULT;
+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) G_GNUC_WARN_UNUSED_RESULT;
+GSList* g_slist_sort_with_data (GSList *list,
+ GCompareDataFunc compare_func,
+ gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;
+gpointer g_slist_nth_data (GSList *list,
+ guint n);
+
+#define g_slist_next(slist) ((slist) ? (((GSList *)(slist))->next) : NULL)
+
+#ifndef G_DISABLE_DEPRECATED
+void g_slist_push_allocator (gpointer dummy);
+void g_slist_pop_allocator (void);
+#endif
+G_END_DECLS
+
+#endif /* __G_SLIST_H__ */
+
diff --git a/trunk/glib/gspawn-win32-helper.c b/trunk/glib/gspawn-win32-helper.c
new file mode 100644
index 000000000..c10a59a56
--- /dev/null
+++ b/trunk/glib/gspawn-win32-helper.c
@@ -0,0 +1,311 @@
+/* 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.
+ */
+
+#include "config.h"
+
+#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.
+ */
+
+/* Info peeked from mingw runtime's source code. __wgetmainargs() is a
+ * function to get the program's argv in wide char format.
+ */
+
+typedef struct {
+ int newmode;
+} _startupinfo;
+
+extern void __wgetmainargs(int *argc,
+ wchar_t ***wargv,
+ wchar_t ***wenviron,
+ int expand_wildcards,
+ _startupinfo *startupinfo);
+
+/* Copy of protect_argv that handles wchar_t strings */
+
+static gint
+protect_wargv (wchar_t **wargv,
+ wchar_t ***new_wargv)
+{
+ gint i;
+ gint argc = 0;
+
+ while (wargv[argc])
+ ++argc;
+ *new_wargv = g_new (wchar_t *, argc+1);
+
+ /* Quote each argv element if necessary, so that it will get
+ * reconstructed correctly in the C runtime startup code. Note that
+ * the unquoting algorithm in the C runtime is really weird, and
+ * rather different than what Unix shells do. See stdargv.c in the C
+ * runtime sources (in the Platform SDK, in src/crt).
+ *
+ * Note that an new_wargv[0] constructed by this function should
+ * *not* be passed as the filename argument to a _wspawn* or _wexec*
+ * family function. That argument should be the real file name
+ * without any quoting.
+ */
+ for (i = 0; i < argc; i++)
+ {
+ wchar_t *p = wargv[i];
+ wchar_t *q;
+ gint len = 0;
+ gboolean need_dblquotes = FALSE;
+ while (*p)
+ {
+ if (*p == ' ' || *p == '\t')
+ need_dblquotes = TRUE;
+ else if (*p == '"')
+ len++;
+ else if (*p == '\\')
+ {
+ wchar_t *pp = p;
+ while (*pp && *pp == '\\')
+ pp++;
+ if (*pp == '"')
+ len++;
+ }
+ len++;
+ p++;
+ }
+
+ q = (*new_wargv)[i] = g_new (wchar_t, len + need_dblquotes*2 + 1);
+ p = wargv[i];
+
+ if (need_dblquotes)
+ *q++ = '"';
+
+ while (*p)
+ {
+ if (*p == '"')
+ *q++ = '\\';
+ else if (*p == '\\')
+ {
+ wchar_t *pp = p;
+ while (*pp && *pp == '\\')
+ pp++;
+ if (*pp == '"')
+ *q++ = '\\';
+ }
+ *q++ = *p;
+ p++;
+ }
+
+ if (need_dblquotes)
+ *q++ = '"';
+ *q++ = '\0';
+ }
+ (*new_wargv)[argc] = NULL;
+
+ return argc;
+}
+
+int _stdcall
+WinMain (struct HINSTANCE__ *hInstance,
+ struct HINSTANCE__ *hPrevInstance,
+ char *lpszCmdLine,
+ int nCmdShow)
+{
+ int child_err_report_fd;
+ int i;
+ int fd;
+ int mode;
+ int handle;
+ int saved_errno;
+ int no_error = CHILD_NO_ERROR;
+ int zero = 0;
+ gint argv_zero_offset = ARG_PROGRAM;
+ wchar_t **new_wargv;
+ int argc;
+ wchar_t **wargv, **wenvp;
+ _startupinfo si = { 0 };
+
+ g_assert (__argc >= ARG_COUNT);
+
+ /* Fetch the wide-char argument vector */
+ __wgetmainargs (&argc, &wargv, &wenvp, 0, &si);
+
+ /* We still have the system codepage args in __argv. We can look
+ * at the first args in which gspawn-win32.c passes us flags and
+ * fd numbers in __argv, as we know those are just ASCII anyway.
+ */
+ g_assert (argc == __argc);
+
+ /* argv[ARG_CHILD_ERR_REPORT] is the file descriptor number onto
+ * which write error messages.
+ */
+ child_err_report_fd = atoi (__argv[ARG_CHILD_ERR_REPORT]);
+
+ /* Hack to implement G_SPAWN_FILE_AND_ARGV_ZERO. If
+ * argv[ARG_CHILD_ERR_REPORT] is suffixed with a '#' it means we get
+ * the program to run and its argv[0] separately.
+ */
+ if (__argv[ARG_CHILD_ERR_REPORT][strlen (__argv[ARG_CHILD_ERR_REPORT]) - 1] == '#')
+ argv_zero_offset++;
+
+ /* argv[ARG_STDIN..ARG_STDERR] are the file descriptor numbers that
+ * should be dup2'd to 0, 1 and 2. '-' if the corresponding fd
+ * should be left 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 (_wchdir (wargv[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 executable file to run,
+ * __argv[argv_zero_offset]... is its argv. argv_zero_offset equals
+ * ARG_PROGRAM unless G_SPAWN_FILE_AND_ARGV_ZERO was used, in which
+ * case we have a separate executable name and argv[0].
+ */
+
+ /* For the program name passed to spawnv(), don't use the quoted
+ * version.
+ */
+ protect_wargv (wargv + argv_zero_offset, &new_wargv);
+
+ if (__argv[ARG_USE_PATH][0] == 'y')
+ handle = _wspawnvp (mode, wargv[ARG_PROGRAM], (const wchar_t **) new_wargv);
+ else
+ handle = _wspawnv (mode, wargv[ARG_PROGRAM], (const wchar_t **) new_wargv);
+
+ saved_errno = errno;
+
+ if (handle == -1 && saved_errno != 0)
+ write_err_and_exit (child_err_report_fd, CHILD_SPAWN_FAILED);
+
+ write (child_err_report_fd, &no_error, sizeof (no_error));
+ if (mode == P_NOWAIT)
+ write (child_err_report_fd, &handle, sizeof (handle));
+ else
+ write (child_err_report_fd, &zero, sizeof (zero));
+ return 0;
+}
diff --git a/trunk/glib/gspawn-win32.c b/trunk/glib/gspawn-win32.c
new file mode 100644
index 000000000..297c9de12
--- /dev/null
+++ b/trunk/glib/gspawn-win32.c
@@ -0,0 +1,1434 @@
+/* gspawn-win32.c - Process launching on Win32
+ *
+ * Copyright 2000 Red Hat, Inc.
+ * Copyright 2003 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.
+ */
+
+/*
+ * 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. The
+ * helper process is also needed if the standard input, standard
+ * output, or standard error of the process to be run are supposed to
+ * be redirected somewhere.
+ *
+ * The structure of the source code in this file is a mess, I know.
+ */
+
+/* Define this to get some logging all the time */
+/* #define G_SPAWN_WIN32_DEBUG */
+
+#include "config.h"
+
+#include "glib.h"
+#include "gprintfint.h"
+#include "glibintl.h"
+#include "galias.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <windows.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <io.h>
+#include <process.h>
+#include <direct.h>
+
+#ifdef __MINGW32__
+/* Mingw doesn't have prototypes for these */
+int _wspawnvpe (int, const wchar_t *, const wchar_t **, const wchar_t **);
+int _wspawnvp (int, const wchar_t *, const wchar_t **);
+int _wspawnve (int, const wchar_t *, const wchar_t **, const wchar_t **);
+int _wspawnv (int, const wchar_t *, const wchar_t **);
+#endif
+
+#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
+
+#define HELPER_PROCESS "gspawn-win32-helper"
+
+static gchar *
+protect_argv_string (const gchar *string)
+{
+ const gchar *p = string;
+ gchar *retval, *q;
+ gint len = 0;
+ gboolean need_dblquotes = FALSE;
+ while (*p)
+ {
+ if (*p == ' ' || *p == '\t')
+ need_dblquotes = TRUE;
+ else if (*p == '"')
+ len++;
+ else if (*p == '\\')
+ {
+ const gchar *pp = p;
+ while (*pp && *pp == '\\')
+ pp++;
+ if (*pp == '"')
+ len++;
+ }
+ len++;
+ p++;
+ }
+
+ q = retval = g_malloc (len + need_dblquotes*2 + 1);
+ p = string;
+
+ if (need_dblquotes)
+ *q++ = '"';
+
+ while (*p)
+ {
+ if (*p == '"')
+ *q++ = '\\';
+ else if (*p == '\\')
+ {
+ const gchar *pp = p;
+ while (*pp && *pp == '\\')
+ pp++;
+ if (*pp == '"')
+ *q++ = '\\';
+ }
+ *q++ = *p;
+ p++;
+ }
+
+ if (need_dblquotes)
+ *q++ = '"';
+ *q++ = '\0';
+
+ return retval;
+}
+
+static gint
+protect_argv (gchar **argv,
+ gchar ***new_argv)
+{
+ gint i;
+ gint argc = 0;
+
+ while (argv[argc])
+ ++argc;
+ *new_argv = g_new (gchar *, argc+1);
+
+ /* Quote each argv element if necessary, so that it will get
+ * reconstructed correctly in the C runtime startup code. Note that
+ * the unquoting algorithm in the C runtime is really weird, and
+ * rather different than what Unix shells do. See stdargv.c in the C
+ * runtime sources (in the Platform SDK, in src/crt).
+ *
+ * Note that an new_argv[0] constructed by this function should
+ * *not* be passed as the filename argument to a spawn* or exec*
+ * family function. That argument should be the real file name
+ * without any quoting.
+ */
+ for (i = 0; i < argc; i++)
+ (*new_argv)[i] = protect_argv_string (argv[i]);
+
+ (*new_argv)[argc] = NULL;
+
+ return argc;
+}
+
+GQuark
+g_spawn_error_quark (void)
+{
+ return g_quark_from_static_string ("g-exec-error-quark");
+}
+
+gboolean
+g_spawn_async_utf8 (const gchar *working_directory,
+ gchar **argv,
+ gchar **envp,
+ GSpawnFlags flags,
+ GSpawnChildSetupFunc child_setup,
+ gpointer user_data,
+ GPid *child_handle,
+ GError **error)
+{
+ g_return_val_if_fail (argv != NULL, FALSE);
+
+ return g_spawn_async_with_pipes_utf8 (working_directory,
+ argv, envp,
+ flags,
+ child_setup,
+ user_data,
+ child_handle,
+ 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 void
+close_and_invalidate (gint *fd)
+{
+ if (*fd < 0)
+ return;
+
+ close (*fd);
+ *fd = -1;
+}
+
+typedef enum
+{
+ READ_FAILED = 0, /* FALSE */
+ READ_OK,
+ READ_EOF
+} ReadResult;
+
+static ReadResult
+read_data (GString *str,
+ GIOChannel *iochannel,
+ GError **error)
+{
+ GIOStatus giostatus;
+ gssize bytes;
+ gchar buf[4096];
+
+ again:
+
+ giostatus = g_io_channel_read_chars (iochannel, buf, sizeof (buf), &bytes, NULL);
+
+ if (bytes == 0)
+ return READ_EOF;
+ else if (bytes > 0)
+ {
+ g_string_append_len (str, buf, bytes);
+ return READ_OK;
+ }
+ else if (giostatus == G_IO_STATUS_AGAIN)
+ goto again;
+ else if (giostatus == G_IO_STATUS_ERROR)
+ {
+ 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;
+}
+
+static gboolean
+make_pipe (gint p[2],
+ GError **error)
+{
+ if (_pipe (p, 4096, _O_BINARY) < 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;
+}
+
+/* The helper process writes a status report back to us, through a
+ * pipe, consisting of two ints.
+ */
+static gboolean
+read_helper_report (int fd,
+ gint report[2],
+ GError **error)
+{
+ gint bytes = 0;
+
+ while (bytes < sizeof(gint)*2)
+ {
+ gint chunk;
+
+ if (debug)
+ g_print ("%s:read_helper_report: read %d...\n",
+ __FILE__,
+ sizeof(gint)*2 - bytes);
+
+ chunk = read (fd, ((gchar*)report) + bytes,
+ sizeof(gint)*2 - 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;
+ }
+
+ if (bytes < sizeof(gint)*2)
+ return FALSE;
+
+ return TRUE;
+}
+
+static void
+set_child_error (gint report[2],
+ const gchar *working_directory,
+ GError **error)
+{
+ switch (report[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 (report[1]));
+ break;
+ case CHILD_SPAWN_FAILED:
+ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
+ _("Failed to execute child process (%s)"),
+ g_strerror (report[1]));
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+static gboolean
+utf8_charv_to_wcharv (char **utf8_charv,
+ wchar_t ***wcharv,
+ int *error_index,
+ GError **error)
+{
+ wchar_t **retval = NULL;
+
+ *wcharv = NULL;
+ if (utf8_charv != NULL)
+ {
+ int n = 0, i;
+
+ while (utf8_charv[n])
+ n++;
+ retval = g_new (wchar_t *, n + 1);
+
+ for (i = 0; i < n; i++)
+ {
+ retval[i] = g_utf8_to_utf16 (utf8_charv[i], -1, NULL, NULL, error);
+ if (retval[i] == NULL)
+ {
+ if (error_index)
+ *error_index = i;
+ while (i)
+ g_free (retval[--i]);
+ g_free (retval);
+ return FALSE;
+ }
+ }
+
+ retval[n] = NULL;
+ }
+ *wcharv = retval;
+ return TRUE;
+}
+
+static gboolean
+do_spawn_directly (gint *exit_status,
+ gboolean do_return_handle,
+ GSpawnFlags flags,
+ gchar **argv,
+ char **envp,
+ char **protected_argv,
+ GSpawnChildSetupFunc child_setup,
+ gpointer user_data,
+ GPid *child_handle,
+ GError **error)
+{
+ const int mode = (exit_status == NULL) ? P_NOWAIT : P_WAIT;
+ char **new_argv;
+ int rc = -1;
+ int saved_errno;
+ GError *conv_error = NULL;
+ gint conv_error_index;
+ wchar_t *wargv0, **wargv, **wenvp;
+
+ new_argv = (flags & G_SPAWN_FILE_AND_ARGV_ZERO) ? protected_argv + 1 : protected_argv;
+
+ wargv0 = g_utf8_to_utf16 (argv[0], -1, NULL, NULL, &conv_error);
+ if (wargv0 == NULL)
+ {
+ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
+ _("Invalid program name: %s"),
+ conv_error->message);
+ g_error_free (conv_error);
+
+ return FALSE;
+ }
+
+ if (!utf8_charv_to_wcharv (new_argv, &wargv, &conv_error_index, &conv_error))
+ {
+ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
+ _("Invalid string in argument vector at %d: %s"),
+ conv_error_index, conv_error->message);
+ g_error_free (conv_error);
+ g_free (wargv0);
+
+ return FALSE;
+ }
+
+ if (!utf8_charv_to_wcharv (envp, &wenvp, NULL, &conv_error))
+ {
+ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
+ _("Invalid string in environment: %s"),
+ conv_error->message);
+ g_error_free (conv_error);
+ g_free (wargv0);
+ g_strfreev ((gchar **) wargv);
+
+ return FALSE;
+ }
+
+ if (child_setup)
+ (* child_setup) (user_data);
+
+ if (flags & G_SPAWN_SEARCH_PATH)
+ if (wenvp != NULL)
+ rc = _wspawnvpe (mode, wargv0, (const wchar_t **) wargv, (const wchar_t **) wenvp);
+ else
+ rc = _wspawnvp (mode, wargv0, (const wchar_t **) wargv);
+ else
+ if (wenvp != NULL)
+ rc = _wspawnve (mode, wargv0, (const wchar_t **) wargv, (const wchar_t **) wenvp);
+ else
+ rc = _wspawnv (mode, wargv0, (const wchar_t **) wargv);
+
+ g_free (wargv0);
+ g_strfreev ((gchar **) wargv);
+ g_strfreev ((gchar **) wenvp);
+
+ saved_errno = errno;
+
+ if (rc == -1 && saved_errno != 0)
+ {
+ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
+ _("Failed to execute child process (%s)"),
+ g_strerror (saved_errno));
+ return FALSE;
+ }
+
+ if (exit_status == NULL)
+ {
+ if (child_handle && do_return_handle)
+ *child_handle = (GPid) rc;
+ else
+ {
+ CloseHandle ((HANDLE) rc);
+ if (child_handle)
+ *child_handle = 0;
+ }
+ }
+ else
+ *exit_status = rc;
+
+ return TRUE;
+}
+
+static gboolean
+do_spawn_with_pipes (gint *exit_status,
+ gboolean do_return_handle,
+ const gchar *working_directory,
+ gchar **argv,
+ char **envp,
+ GSpawnFlags flags,
+ GSpawnChildSetupFunc child_setup,
+ gpointer user_data,
+ GPid *child_handle,
+ gint *standard_input,
+ gint *standard_output,
+ gint *standard_error,
+ gint *err_report,
+ GError **error)
+{
+ char **protected_argv;
+ char args[ARG_COUNT][10];
+ char **new_argv;
+ int i;
+ int rc = -1;
+ int saved_errno;
+ int argc;
+ int stdin_pipe[2] = { -1, -1 };
+ int stdout_pipe[2] = { -1, -1 };
+ int stderr_pipe[2] = { -1, -1 };
+ int child_err_report_pipe[2] = { -1, -1 };
+ int helper_report[2];
+ static gboolean warned_about_child_setup = FALSE;
+ GError *conv_error = NULL;
+ gint conv_error_index;
+ gchar *helper_process;
+ CONSOLE_CURSOR_INFO cursor_info;
+ wchar_t *whelper, **wargv, **wenvp;
+
+ SETUP_DEBUG();
+
+ if (child_setup && !warned_about_child_setup)
+ {
+ warned_about_child_setup = TRUE;
+ g_warning ("passing a child setup function to the g_spawn functions is pointless and dangerous on Win32");
+ }
+
+ argc = protect_argv (argv, &protected_argv);
+
+ if (!standard_input && !standard_output && !standard_error &&
+ (flags & G_SPAWN_CHILD_INHERITS_STDIN) &&
+ !(flags & G_SPAWN_STDOUT_TO_DEV_NULL) &&
+ !(flags & G_SPAWN_STDERR_TO_DEV_NULL) &&
+ (working_directory == NULL || !*working_directory) &&
+ (flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN))
+ {
+ /* We can do without the helper process */
+ gboolean retval =
+ do_spawn_directly (exit_status, do_return_handle, flags,
+ argv, envp, protected_argv,
+ child_setup, user_data, child_handle,
+ error);
+ g_strfreev (protected_argv);
+ return retval;
+ }
+
+ 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;
+
+ if (!make_pipe (child_err_report_pipe, error))
+ goto cleanup_and_fail;
+
+ new_argv = g_new (char *, argc + 1 + ARG_COUNT);
+ if (GetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cursor_info))
+ helper_process = HELPER_PROCESS "-console.exe";
+ else
+ helper_process = HELPER_PROCESS ".exe";
+ new_argv[0] = helper_process;
+ _g_sprintf (args[ARG_CHILD_ERR_REPORT], "%d", child_err_report_pipe[1]);
+ new_argv[ARG_CHILD_ERR_REPORT] = args[ARG_CHILD_ERR_REPORT];
+
+ if (flags & G_SPAWN_FILE_AND_ARGV_ZERO)
+ {
+ /* Overload ARG_CHILD_ERR_REPORT to also encode the
+ * G_SPAWN_FILE_AND_ARGV_ZERO functionality.
+ */
+ strcat (args[ARG_CHILD_ERR_REPORT], "#");
+ }
+
+ if (standard_input)
+ {
+ _g_sprintf (args[ARG_STDIN], "%d", stdin_pipe[0]);
+ new_argv[ARG_STDIN] = args[ARG_STDIN];
+ }
+ else if (flags & G_SPAWN_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 (standard_output)
+ {
+ _g_sprintf (args[ARG_STDOUT], "%d", stdout_pipe[1]);
+ new_argv[ARG_STDOUT] = args[ARG_STDOUT];
+ }
+ else if (flags & G_SPAWN_STDOUT_TO_DEV_NULL)
+ {
+ new_argv[ARG_STDOUT] = "z";
+ }
+ else
+ {
+ new_argv[ARG_STDOUT] = "-";
+ }
+
+ if (standard_error)
+ {
+ _g_sprintf (args[ARG_STDERR], "%d", stderr_pipe[1]);
+ new_argv[ARG_STDERR] = args[ARG_STDERR];
+ }
+ else if (flags & G_SPAWN_STDERR_TO_DEV_NULL)
+ {
+ new_argv[ARG_STDERR] = "z";
+ }
+ else
+ {
+ new_argv[ARG_STDERR] = "-";
+ }
+
+ if (working_directory && *working_directory)
+ new_argv[ARG_WORKING_DIRECTORY] = protect_argv_string (working_directory);
+ else
+ new_argv[ARG_WORKING_DIRECTORY] = g_strdup ("-");
+
+ if (!(flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN))
+ new_argv[ARG_CLOSE_DESCRIPTORS] = "y";
+ else
+ new_argv[ARG_CLOSE_DESCRIPTORS] = "-";
+
+ if (flags & G_SPAWN_SEARCH_PATH)
+ new_argv[ARG_USE_PATH] = "y";
+ else
+ new_argv[ARG_USE_PATH] = "-";
+
+ if (exit_status == NULL)
+ new_argv[ARG_WAIT] = "-";
+ else
+ new_argv[ARG_WAIT] = "w";
+
+ for (i = 0; i <= argc; i++)
+ new_argv[ARG_PROGRAM + i] = protected_argv[i];
+
+ if (debug)
+ {
+ g_print ("calling %s with argv:\n", helper_process);
+ for (i = 0; i < argc + 1 + ARG_COUNT; i++)
+ g_print ("argv[%d]: %s\n", i, (new_argv[i] ? new_argv[i] : "NULL"));
+ }
+
+ whelper = g_utf8_to_utf16 (helper_process, -1, NULL, NULL, NULL);
+
+ if (!utf8_charv_to_wcharv (new_argv, &wargv, &conv_error_index, &conv_error))
+ {
+ if (conv_error_index == ARG_WORKING_DIRECTORY)
+ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_CHDIR,
+ _("Invalid working directory: %s"),
+ conv_error->message);
+ else
+ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
+ _("Invalid string in argument vector at %d: %s"),
+ conv_error_index - ARG_PROGRAM, conv_error->message);
+ g_error_free (conv_error);
+ g_strfreev (protected_argv);
+ g_free (new_argv[ARG_WORKING_DIRECTORY]);
+ g_free (new_argv);
+ g_free (whelper);
+
+ return FALSE;
+ }
+
+ if (!utf8_charv_to_wcharv (envp, &wenvp, NULL, &conv_error))
+ {
+ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
+ _("Invalid string in environment: %s"),
+ conv_error->message);
+ g_error_free (conv_error);
+ g_strfreev (protected_argv);
+ g_free (new_argv[ARG_WORKING_DIRECTORY]);
+ g_free (new_argv);
+ g_free (whelper);
+ g_strfreev ((gchar **) wargv);
+
+ return FALSE;
+ }
+
+ if (child_setup)
+ (* child_setup) (user_data);
+
+ if (wenvp != NULL)
+ /* Let's hope envp hasn't mucked with PATH so that
+ * gspawn-win32-helper.exe isn't found.
+ */
+ rc = _wspawnvpe (P_NOWAIT, whelper, (const wchar_t **) wargv, (const wchar_t **) wenvp);
+ else
+ rc = _wspawnvp (P_NOWAIT, whelper, (const wchar_t **) wargv);
+
+ saved_errno = errno;
+
+ g_free (whelper);
+ g_strfreev ((gchar **) wargv);
+ g_strfreev ((gchar **) wenvp);
+
+ /* Close the other process's ends of the pipes in this process,
+ * otherwise the reader will never get EOF.
+ */
+ close_and_invalidate (&child_err_report_pipe[1]);
+ close_and_invalidate (&stdin_pipe[0]);
+ close_and_invalidate (&stdout_pipe[1]);
+ close_and_invalidate (&stderr_pipe[1]);
+
+ g_strfreev (protected_argv);
+
+ g_free (new_argv[ARG_WORKING_DIRECTORY]);
+ g_free (new_argv);
+
+ /* Check if gspawn-win32-helper couldn't be run */
+ if (rc == -1 && saved_errno != 0)
+ {
+ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
+ _("Failed to execute helper program (%s)"),
+ g_strerror (saved_errno));
+ goto cleanup_and_fail;
+ }
+
+ if (exit_status != NULL)
+ {
+ /* Synchronous case. Pass helper's report pipe back to caller,
+ * which takes care of reading it after the grandchild has
+ * finished.
+ */
+ g_assert (err_report != NULL);
+ *err_report = child_err_report_pipe[0];
+ }
+ else
+ {
+ /* Asynchronous case. We read the helper's report right away. */
+ if (!read_helper_report (child_err_report_pipe[0], helper_report, error))
+ goto cleanup_and_fail;
+
+ close (child_err_report_pipe[0]);
+
+ switch (helper_report[0])
+ {
+ case CHILD_NO_ERROR:
+ if (child_handle && do_return_handle)
+ {
+ /* rc is our HANDLE for gspawn-win32-helper. It has
+ * told us the HANDLE of its child. Duplicate that into
+ * a HANDLE valid in this process.
+ */
+ if (!DuplicateHandle ((HANDLE) rc, (HANDLE) helper_report[1],
+ GetCurrentProcess (), (LPHANDLE) child_handle,
+ 0, TRUE, DUPLICATE_SAME_ACCESS))
+ *child_handle = 0;
+ }
+ else if (child_handle)
+ *child_handle = 0;
+ break;
+
+ default:
+ set_child_error (helper_report, working_directory, error);
+ 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 (rc != -1)
+ CloseHandle ((HANDLE) rc);
+
+ return TRUE;
+
+ cleanup_and_fail:
+ if (rc != -1)
+ CloseHandle ((HANDLE) rc);
+ if (child_err_report_pipe[0] != -1)
+ close (child_err_report_pipe[0]);
+ if (child_err_report_pipe[1] != -1)
+ close (child_err_report_pipe[1]);
+ if (stdin_pipe[0] != -1)
+ close (stdin_pipe[0]);
+ if (stdin_pipe[1] != -1)
+ close (stdin_pipe[1]);
+ if (stdout_pipe[0] != -1)
+ close (stdout_pipe[0]);
+ if (stdout_pipe[1] != -1)
+ close (stdout_pipe[1]);
+ if (stderr_pipe[0] != -1)
+ close (stderr_pipe[0]);
+ if (stderr_pipe[1] != -1)
+ close (stderr_pipe[1]);
+
+ return FALSE;
+}
+
+gboolean
+g_spawn_sync_utf8 (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 reportpipe = -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 (!do_spawn_with_pipes (&status,
+ FALSE,
+ working_directory,
+ argv,
+ envp,
+ flags,
+ child_setup,
+ user_data,
+ NULL,
+ NULL,
+ standard_output ? &outpipe : NULL,
+ standard_error ? &errpipe : NULL,
+ &reportpipe,
+ error))
+ return FALSE;
+
+ /* Read data from child. */
+
+ failed = FALSE;
+
+ if (outpipe >= 0)
+ {
+ outstr = g_string_new (NULL);
+ outchannel = g_io_channel_win32_new_fd (outpipe);
+ g_io_channel_set_encoding (outchannel, NULL, NULL);
+ g_io_channel_set_buffered (outchannel, FALSE);
+ g_io_channel_win32_make_pollfd (outchannel,
+ G_IO_IN | G_IO_ERR | G_IO_HUP,
+ &outfd);
+ if (debug)
+ g_print ("outfd=%x\n", outfd.fd);
+ }
+
+ if (errpipe >= 0)
+ {
+ errstr = g_string_new (NULL);
+ errchannel = g_io_channel_win32_new_fd (errpipe);
+ g_io_channel_set_encoding (errchannel, NULL, NULL);
+ g_io_channel_set_buffered (errchannel, FALSE);
+ g_io_channel_win32_make_pollfd (errchannel,
+ G_IO_IN | G_IO_ERR | G_IO_HUP,
+ &errfd);
+ if (debug)
+ g_print ("errfd=%x\n", errfd.fd);
+ }
+
+ /* Read data until we get EOF on all 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 ("g_spawn_sync: calling g_io_channel_win32_poll, nfds=%d\n",
+ 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;
+ }
+ }
+
+ if (reportpipe == -1)
+ {
+ /* No helper process, exit status of actual spawned process
+ * already available.
+ */
+ if (exit_status)
+ *exit_status = status;
+ }
+ else
+ {
+ /* Helper process was involved. Read its report now after the
+ * grandchild has finished.
+ */
+ gint helper_report[2];
+
+ if (!read_helper_report (reportpipe, helper_report, error))
+ failed = TRUE;
+ else
+ {
+ switch (helper_report[0])
+ {
+ case CHILD_NO_ERROR:
+ if (exit_status)
+ *exit_status = helper_report[1];
+ break;
+ default:
+ set_child_error (helper_report, working_directory, error);
+ failed = TRUE;
+ break;
+ }
+ }
+ close_and_invalidate (&reportpipe);
+ }
+
+
+ /* 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 (standard_output)
+ *standard_output = g_string_free (outstr, FALSE);
+
+ if (standard_error)
+ *standard_error = g_string_free (errstr, FALSE);
+
+ return TRUE;
+ }
+}
+
+gboolean
+g_spawn_async_with_pipes_utf8 (const gchar *working_directory,
+ gchar **argv,
+ gchar **envp,
+ GSpawnFlags flags,
+ GSpawnChildSetupFunc child_setup,
+ gpointer user_data,
+ GPid *child_handle,
+ 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 do_spawn_with_pipes (NULL,
+ (flags & G_SPAWN_DO_NOT_REAP_CHILD),
+ working_directory,
+ argv,
+ envp,
+ flags,
+ child_setup,
+ user_data,
+ child_handle,
+ standard_input,
+ standard_output,
+ standard_error,
+ NULL,
+ error);
+}
+
+gboolean
+g_spawn_command_line_sync_utf8 (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_utf8 (NULL,
+ argv,
+ NULL,
+ G_SPAWN_SEARCH_PATH,
+ NULL,
+ NULL,
+ standard_output,
+ standard_error,
+ exit_status,
+ error);
+ g_strfreev (argv);
+
+ return retval;
+}
+
+gboolean
+g_spawn_command_line_async_utf8 (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_utf8 (NULL,
+ argv,
+ NULL,
+ G_SPAWN_SEARCH_PATH,
+ NULL,
+ NULL,
+ NULL,
+ error);
+ g_strfreev (argv);
+
+ return retval;
+}
+
+void
+g_spawn_close_pid (GPid pid)
+{
+ CloseHandle (pid);
+}
+
+/* Binary compatibility versions that take system codepage pathnames,
+ * argument vectors and environments. These get used only by code
+ * built against 2.8.1 or earlier. Code built against 2.8.2 or later
+ * will use the _utf8 versions above (see the #defines in gspawn.h).
+ */
+
+#undef g_spawn_async
+#undef g_spawn_async_with_pipes
+#undef g_spawn_sync
+#undef g_spawn_command_line_sync
+#undef g_spawn_command_line_async
+
+static gboolean
+setup_utf8_copies (const gchar *working_directory,
+ gchar **utf8_working_directory,
+ gchar **argv,
+ gchar ***utf8_argv,
+ gchar **envp,
+ gchar ***utf8_envp,
+ GError **error)
+{
+ gint i, argc, envc;
+
+ if (working_directory == NULL)
+ *utf8_working_directory = NULL;
+ else
+ {
+ GError *conv_error = NULL;
+
+ *utf8_working_directory = g_locale_to_utf8 (working_directory, -1, NULL, NULL, &conv_error);
+ if (*utf8_working_directory == NULL)
+ {
+ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_CHDIR,
+ _("Invalid working directory: %s"),
+ conv_error->message);
+ g_error_free (conv_error);
+ return FALSE;
+ }
+ }
+
+ argc = 0;
+ while (argv[argc])
+ ++argc;
+ *utf8_argv = g_new (gchar *, argc + 1);
+ for (i = 0; i < argc; i++)
+ {
+ GError *conv_error = NULL;
+
+ (*utf8_argv)[i] = g_locale_to_utf8 (argv[i], -1, NULL, NULL, &conv_error);
+ if ((*utf8_argv)[i] == NULL)
+ {
+ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
+ _("Invalid string in argument vector at %d: %s"),
+ i, conv_error->message);
+ g_error_free (conv_error);
+
+ g_strfreev (*utf8_argv);
+ *utf8_argv = NULL;
+
+ g_free (*utf8_working_directory);
+ *utf8_working_directory = NULL;
+
+ return FALSE;
+ }
+ }
+ (*utf8_argv)[argc] = NULL;
+
+ if (envp == NULL)
+ {
+ *utf8_envp = NULL;
+ }
+ else
+ {
+ envc = 0;
+ while (envp[envc])
+ ++envc;
+ *utf8_envp = g_new (gchar *, envc + 1);
+ for (i = 0; i < envc; i++)
+ {
+ GError *conv_error = NULL;
+
+ (*utf8_envp)[i] = g_locale_to_utf8 (envp[i], -1, NULL, NULL, &conv_error);
+ if ((*utf8_envp)[i] == NULL)
+ {
+ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
+ _("Invalid string in environment: %s"),
+ conv_error->message);
+ g_error_free (conv_error);
+
+ g_strfreev (*utf8_envp);
+ *utf8_envp = NULL;
+
+ g_strfreev (*utf8_argv);
+ *utf8_argv = NULL;
+
+ g_free (*utf8_working_directory);
+ *utf8_working_directory = NULL;
+
+ return FALSE;
+ }
+ }
+ (*utf8_envp)[envc] = NULL;
+ }
+ return TRUE;
+}
+
+static void
+free_utf8_copies (gchar *utf8_working_directory,
+ gchar **utf8_argv,
+ gchar **utf8_envp)
+{
+ g_free (utf8_working_directory);
+ g_strfreev (utf8_argv);
+ g_strfreev (utf8_envp);
+}
+
+gboolean
+g_spawn_async_with_pipes (const gchar *working_directory,
+ gchar **argv,
+ gchar **envp,
+ GSpawnFlags flags,
+ GSpawnChildSetupFunc child_setup,
+ gpointer user_data,
+ GPid *child_handle,
+ gint *standard_input,
+ gint *standard_output,
+ gint *standard_error,
+ GError **error)
+{
+ gchar *utf8_working_directory;
+ gchar **utf8_argv;
+ gchar **utf8_envp;
+ gboolean retval;
+
+ if (!setup_utf8_copies (working_directory, &utf8_working_directory,
+ argv, &utf8_argv,
+ envp, &utf8_envp,
+ error))
+ return FALSE;
+
+ retval = g_spawn_async_with_pipes_utf8 (utf8_working_directory,
+ utf8_argv, utf8_envp,
+ flags, child_setup, user_data,
+ child_handle,
+ standard_input, standard_output, standard_error,
+ error);
+
+ free_utf8_copies (utf8_working_directory, utf8_argv, utf8_envp);
+
+ return retval;
+}
+
+gboolean
+g_spawn_async (const gchar *working_directory,
+ gchar **argv,
+ gchar **envp,
+ GSpawnFlags flags,
+ GSpawnChildSetupFunc child_setup,
+ gpointer user_data,
+ GPid *child_handle,
+ GError **error)
+{
+ return g_spawn_async_with_pipes (working_directory,
+ argv, envp,
+ flags,
+ child_setup,
+ user_data,
+ child_handle,
+ NULL, NULL, NULL,
+ error);
+}
+
+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)
+{
+ gchar *utf8_working_directory;
+ gchar **utf8_argv;
+ gchar **utf8_envp;
+ gboolean retval;
+
+ if (!setup_utf8_copies (working_directory, &utf8_working_directory,
+ argv, &utf8_argv,
+ envp, &utf8_envp,
+ error))
+ return FALSE;
+
+ retval = g_spawn_sync_utf8 (utf8_working_directory,
+ utf8_argv, utf8_envp,
+ flags, child_setup, user_data,
+ standard_output, standard_error, exit_status,
+ error);
+
+ free_utf8_copies (utf8_working_directory, utf8_argv, utf8_envp);
+
+ return retval;
+}
+
+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;
+}
+
+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;
+}
+
+#endif /* !GSPAWN_HELPER */
+
+#define __G_SPAWN_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gspawn.c b/trunk/glib/gspawn.c
new file mode 100644
index 000000000..0420097a2
--- /dev/null
+++ b/trunk/glib/gspawn.c
@@ -0,0 +1,1597 @@
+/* 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 "config.h"
+
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <string.h>
+#include <stdlib.h> /* for fdwalk */
+
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif /* HAVE_SYS_SELECT_H */
+
+#include "glib.h"
+#include "glibintl.h"
+#include "galias.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,
+ GPid *child_pid,
+ gint *standard_input,
+ gint *standard_output,
+ gint *standard_error,
+ GError **error);
+
+GQuark
+g_spawn_error_quark (void)
+{
+ return g_quark_from_static_string ("g-exec-error-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.
+ *
+ * <note><para>
+ * If you are writing a GTK+ application, and the program you
+ * are spawning is a graphical application, too, then you may
+ * want to use gdk_spawn_on_screen() instead to ensure that
+ * the spawned program opens its windows on the right screen.
+ * </para></note>
+ *
+ * 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,
+ GPid *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;
+
+ if (*fd < 0)
+ return -1;
+ else
+ {
+ ret = close (*fd);
+ *fd = -1;
+ }
+
+ return ret;
+}
+
+/* Some versions of OS X define READ_OK in public headers */
+#undef READ_OK
+
+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: return location for 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 returned 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 and details on
+ * how these functions work on Windows.
+ *
+ * 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;
+ GPid 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 (NULL);
+ }
+
+ if (errpipe >= 0)
+ {
+ errstr = g_string_new (NULL);
+ }
+
+ /* 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, in the GLib file name encoding
+ * @argv: child's argument vector, in the GLib file name encoding
+ * @envp: child's environment, or %NULL to inherit parent's, in the GLib file name encoding
+ * @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 <envar>PATH</envar> shell variable
+ * will only be searched if you pass the %G_SPAWN_SEARCH_PATH flag.
+ *
+ * On Windows, note that all the string or string vector arguments to
+ * this function and the other g_spawn*() functions are in UTF-8, the
+ * GLib file name encoding. Unicode characters that are not part of
+ * the system codepage passed in argument vectors will be correctly
+ * available in the spawned program only if it uses wide character API
+ * to retrieve its command line. For C programs built with Microsoft's
+ * tools it is enough to make the program have a wmain() instead of
+ * main(). wmain() has a wide character argument vector as parameter.
+ *
+ * At least currently, mingw doesn't support wmain(), so if you use
+ * mingw to develop the spawned program, it will have to call the
+ * undocumented function __wgetmainargs() to get the wide character
+ * argument vector and environment. See gspawn-win32-helper.c in the
+ * GLib sources or init.c in the mingw runtime sources for a prototype
+ * for that function. Alternatively, you can retrieve the Win32 system
+ * level wide character command line passed to the spawned program
+ * using the GetCommandLineW() function.
+ *
+ * On Windows the low-level child process creation API
+ * <function>CreateProcess()</function> doesn't use argument vectors,
+ * but a command line. The C runtime library's
+ * <function>spawn*()</function> family of functions (which
+ * g_spawn_async_with_pipes() eventually calls) paste the argument
+ * vector elements together into a command line, and the C runtime startup code
+ * does a corresponding reconstruction of an argument vector from the
+ * command line, to be passed to main(). Complications arise when you have
+ * argument vector elements that contain spaces of double quotes. The
+ * <function>spawn*()</function> functions don't do any quoting or
+ * escaping, but on the other hand the startup code does do unquoting
+ * and unescaping in order to enable receiving arguments with embedded
+ * spaces or double quotes. To work around this asymmetry,
+ * g_spawn_async_with_pipes() will do quoting and escaping on argument
+ * vector elements that need it before calling the C runtime
+ * spawn() function.
+ *
+ * @envp is a %NULL-terminated array of strings, where each string
+ * has the form <literal>KEY=VALUE</literal>. 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 behaviour. The %G_SPAWN_DO_NOT_REAP_CHILD means that
+ * the child will not automatically be reaped; you must use a
+ * #GChildWatch source to be notified about the death of the child
+ * process. Eventually you must call g_spawn_close_pid() on the
+ * @child_pid, in order to free resources which may be associated
+ * with the child process. (On Unix, using a #GChildWatch source is
+ * equivalent to calling waitpid() or handling the %SIGCHLD signal
+ * manually. On Windows, calling g_spawn_close_pid() is equivalent
+ * to calling CloseHandle() on the process handle returned in
+ * @child_pid).
+ *
+ * %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 <literal>argv[0]</literal> need not be an absolute path, it
+ * will be looked for in the user's <envar>PATH</envar>.
+ * %G_SPAWN_STDOUT_TO_DEV_NULL means that the child's standard output will
+ * be discarded, instead of going to the same location as the parent's
+ * standard output. If you use this flag, @standard_output must be %NULL.
+ * %G_SPAWN_STDERR_TO_DEV_NULL means that the child's standard error
+ * will be discarded, instead of going to the same location as the parent's
+ * standard error. If you use this flag, @standard_error must be %NULL.
+ * %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). If you use this flag, @standard_input must be %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. On POSIX
+ * platforms, the function is 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. On Windows, there is no separate fork() and exec()
+ * functionality. Child processes are created and run with
+ * a single API call, CreateProcess(). @child_setup is
+ * called in the parent process just before creating the child
+ * process. You should carefully consider what you do in @child_setup
+ * if you intend your software to be portable to Windows.
+ *
+ * If non-%NULL, @child_pid will on Unix be filled with the child's
+ * process ID. You can use the process ID to send signals to the
+ * child, or to use g_child_watch_add() (or waitpid()) if you specified the
+ * %G_SPAWN_DO_NOT_REAP_CHILD flag. On Windows, @child_pid will be
+ * filled with a handle to the child process only if you specified the
+ * %G_SPAWN_DO_NOT_REAP_CHILD flag. You can then access the child
+ * process using the Win32 API, for example wait for its termination
+ * with the <function>WaitFor*()</function> functions, or examine its
+ * exit code with GetExitCodeProcess(). You should close the handle
+ * with CloseHandle() or g_spawn_close_pid() when you no longer need it.
+ *
+ * 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.
+ *
+ * If @standard_input is NULL, the child's standard input is attached to
+ * /dev/null unless %G_SPAWN_CHILD_INHERITS_STDIN is set.
+ *
+ * If @standard_error is NULL, the child's standard error goes to the same
+ * location as the parent's standard error unless %G_SPAWN_STDERR_TO_DEV_NULL
+ * is set.
+ *
+ * If @standard_output is NULL, the child's standard output goes to the same
+ * location as the parent's standard output unless %G_SPAWN_STDOUT_TO_DEV_NULL
+ * is set.
+ *
+ * @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 <literal>argv[0]</literal> is not found). Typically
+ * the <literal>message</literal> 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.
+ *
+ * If @child_pid is not %NULL and an error does not occur then the returned
+ * pid must be closed using g_spawn_close_pid().
+ *
+ * <note><para>
+ * If you are writing a GTK+ application, and the program you
+ * are spawning is a graphical application, too, then you may
+ * want to use gdk_spawn_on_screen_with_pipes() instead to ensure that
+ * the spawned program opens its windows no the right screen.
+ * </para></note>
+ *
+ * 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,
+ GPid *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, as returned by waitpid()
+ * @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().
+ *
+ * If @exit_status is non-%NULL, the exit status of the child is stored there as
+ * it would be returned by waitpid(); standard UNIX macros such as WIFEXITED()
+ * and WEXITSTATUS() must be used to evaluate the exit status.
+ *
+ * On Windows, please note the implications of g_shell_parse_argv()
+ * parsing @command_line. Parsing is done according to Unix shell rules, not
+ * Windows command interpreter rules.
+ * Space is a separator, and backslashes are
+ * special. Thus you cannot simply pass a @command_line containing
+ * canonical Windows paths, like "c:\\program files\\app\\app.exe", as
+ * the backslashes will be eaten, and the space will act as a
+ * separator. You need to enclose such paths with single quotes, like
+ * "'c:\\program files\\app\\app.exe' 'e:\\folder\\argument.txt'".
+ *
+ * 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 = NULL;
+
+ 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().
+ *
+ * The same concerns on Windows apply as for g_spawn_command_line_sync().
+ *
+ * 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 = NULL;
+
+ 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 gssize
+write_all (gint fd, gconstpointer vbuf, gsize to_write)
+{
+ gchar *buf = (gchar *) vbuf;
+
+ while (to_write > 0)
+ {
+ gssize count = write (fd, buf, to_write);
+ if (count < 0)
+ {
+ if (errno != EINTR)
+ return FALSE;
+ }
+ else
+ {
+ to_write -= count;
+ buf += count;
+ }
+ }
+
+ return TRUE;
+}
+
+static void
+write_err_and_exit (gint fd, gint msg)
+{
+ gint en = errno;
+
+ write_all (fd, &msg, sizeof(msg));
+ write_all (fd, &en, sizeof(en));
+
+ _exit (1);
+}
+
+static int
+set_cloexec (void *data, gint fd)
+{
+ if (fd >= GPOINTER_TO_INT (data))
+ fcntl (fd, F_SETFD, FD_CLOEXEC);
+
+ return 0;
+}
+
+#ifndef HAVE_FDWALK
+static int
+fdwalk (int (*cb)(void *data, int fd), void *data)
+{
+ gint open_max;
+ gint fd;
+ gint res;
+
+ res = 0;
+ open_max = sysconf (_SC_OPEN_MAX);
+ for (fd = 0; fd < open_max && res == 0; fd++)
+ res = cb (data, fd);
+
+ return res;
+}
+#endif
+
+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)
+ {
+ fdwalk (set_cloexec, GINT_TO_POINTER(3));
+ }
+ else
+ {
+ /* We need to do child_err_report_fd anyway */
+ set_cloexec (GINT_TO_POINTER(0), 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,
+ GPid *child_pid,
+ gint *standard_input,
+ gint *standard_output,
+ gint *standard_error,
+ GError **error)
+{
+ GPid pid = -1;
+ 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.
+ */
+ GPid grandchild_pid;
+
+ grandchild_pid = fork ();
+
+ if (grandchild_pid < 0)
+ {
+ /* report -1 as child PID */
+ write_all (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_all (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\" (%s)"),
+ argv[0],
+ 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 \"%s\""),
+ argv[0]);
+ 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 */
+ close_and_invalidate (&child_err_report_pipe[0]);
+ close_and_invalidate (&child_pid_report_pipe[0]);
+
+ 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:
+
+ /* There was an error from the Child, reap the child to avoid it being
+ a zombie.
+ */
+
+ if (pid > 0)
+ {
+ wait_failed:
+ if (waitpid (pid, NULL, 0) < 0)
+ {
+ if (errno == EINTR)
+ goto wait_failed;
+ else if (errno == ECHILD)
+ ; /* do nothing, child already reaped */
+ else
+ g_warning ("waitpid() should not fail in "
+ "'fork_exec_with_pipes'");
+ }
+ }
+
+ 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 + 2); /* /bin/sh and NULL */
+
+ new_argv[0] = (char *) "/bin/sh";
+ new_argv[1] = (char *) file;
+ while (argc > 0)
+ {
+ new_argv[argc + 1] = argv[argc];
+ --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;
+ gsize len;
+ gsize 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;
+}
+
+/**
+ * g_spawn_close_pid:
+ * @pid: The process identifier to close
+ *
+ * On some platforms, notably WIN32, the #GPid type represents a resource
+ * which must be closed to prevent resource leaking. g_spawn_close_pid()
+ * is provided for this purpose. It should be used on all platforms, even
+ * though it doesn't do anything under UNIX.
+ **/
+void
+g_spawn_close_pid (GPid pid)
+{
+}
+
+#define __G_SPAWN_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gspawn.h b/trunk/glib/gspawn.h
new file mode 100644
index 000000000..adb674173
--- /dev/null
+++ b/trunk/glib/gspawn.h
@@ -0,0 +1,138 @@
+/* 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 <glib/gerror.h>
+
+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);
+
+#ifdef G_OS_WIN32
+#define g_spawn_async g_spawn_async_utf8
+#define g_spawn_async_with_pipes g_spawn_async_with_pipes_utf8
+#define g_spawn_sync g_spawn_sync_utf8
+#define g_spawn_command_line_sync g_spawn_command_line_sync_utf8
+#define g_spawn_command_line_async g_spawn_command_line_async_utf8
+#endif
+
+gboolean g_spawn_async (const gchar *working_directory,
+ gchar **argv,
+ gchar **envp,
+ GSpawnFlags flags,
+ GSpawnChildSetupFunc child_setup,
+ gpointer user_data,
+ GPid *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,
+ GPid *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);
+
+void g_spawn_close_pid (GPid pid);
+
+
+G_END_DECLS
+
+#endif /* __G_SPAWN_H__ */
+
+
diff --git a/trunk/glib/gstdio.c b/trunk/glib/gstdio.c
new file mode 100644
index 000000000..f76e6aaa0
--- /dev/null
+++ b/trunk/glib/gstdio.c
@@ -0,0 +1,729 @@
+/* gstdio.c - wrappers for C library functions
+ *
+ * Copyright 2004 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.
+ */
+
+#include "config.h"
+
+#define G_STDIO_NO_WRAP_ON_UNIX
+
+#include "glib.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef G_OS_WIN32
+#include <windows.h>
+#include <errno.h>
+#include <wchar.h>
+#include <direct.h>
+#include <io.h>
+#endif
+
+#include "gstdio.h"
+
+#include "galias.h"
+
+#if !defined (G_OS_UNIX) && !defined (G_OS_WIN32) && !defined (G_OS_BEOS)
+#error Please port this to your operating system
+#endif
+
+
+/**
+ * g_access:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @mode: as in access()
+ *
+ * A wrapper for the POSIX access() function. This function is used to
+ * test a pathname for one or several of read, write or execute
+ * permissions, or just existence. On Windows, the underlying access()
+ * function in the C library only checks the READONLY attribute, and
+ * does not look at the ACL at all. Software that needs to handle file
+ * permissions on Windows more exactly should use the Win32 API.
+ *
+ * See the C library manual for more details about access().
+ *
+ * Returns: zero if the pathname refers to an existing file system
+ * object that has all the tested permissions, or -1 otherwise or on
+ * error.
+ *
+ * Since: 2.8
+ */
+int
+g_access (const gchar *filename,
+ int mode)
+{
+#ifdef G_OS_WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ retval = _waccess (wfilename, mode);
+ save_errno = errno;
+
+ g_free (wfilename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return access (filename, mode);
+#endif
+}
+
+/**
+ * g_chmod:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @mode: as in chmod()
+ *
+ * A wrapper for the POSIX chmod() function. The chmod() function is
+ * used to set the permissions of a file system object. Note that on
+ * Windows the file protection mechanism is not at all POSIX-like, and
+ * the underlying chmod() function in the C library just sets or
+ * clears the READONLY attribute. It does not touch any ACL. Software
+ * that needs to manage file permissions on Windows exactly should
+ * use the Win32 API.
+ *
+ * See the C library manual for more details about chmod().
+ *
+ * Returns: zero if the operation succeeded, -1 on error.
+ *
+ * Since: 2.8
+ */
+int
+g_chmod (const gchar *filename,
+ int mode)
+{
+#ifdef G_OS_WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ retval = _wchmod (wfilename, mode);
+ save_errno = errno;
+
+ g_free (wfilename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return chmod (filename, mode);
+#endif
+}
+
+/**
+ * g_open:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @flags: as in open()
+ * @mode: as in open()
+ *
+ * A wrapper for the POSIX open() function. The open() function is
+ * used to convert a pathname into a file descriptor. Note that on
+ * POSIX systems file descriptors are implemented by the operating
+ * system. On Windows, it's the C library that implements open() and
+ * file descriptors. The actual Windows API for opening files is
+ * something different.
+ *
+ * See the C library manual for more details about open().
+ *
+ * Returns: a new file descriptor, or -1 if an error occurred. The
+ * return value can be used exactly like the return value from open().
+ *
+ * Since: 2.6
+ */
+int
+g_open (const gchar *filename,
+ int flags,
+ int mode)
+{
+#ifdef G_OS_WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ retval = _wopen (wfilename, flags, mode);
+ save_errno = errno;
+
+ g_free (wfilename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return open (filename, flags, mode);
+#endif
+}
+
+/**
+ * g_creat:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @mode: as in creat()
+ *
+ * A wrapper for the POSIX creat() function. The creat() function is
+ * used to convert a pathname into a file descriptor, creating a file
+ * if necessar. Note that on POSIX systems file descriptors are
+ * implemented by the operating system. On Windows, it's the C library
+ * that implements creat() and file descriptors. The actual Windows
+ * API for opening files is something different.
+ *
+ * See the C library manual for more details about creat().
+ *
+ * Returns: a new file descriptor, or -1 if an error occurred. The
+ * return value can be used exactly like the return value from creat().
+ *
+ * Since: 2.8
+ */
+int
+g_creat (const gchar *filename,
+ int mode)
+{
+#ifdef G_OS_WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ retval = _wcreat (wfilename, mode);
+ save_errno = errno;
+
+ g_free (wfilename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return creat (filename, mode);
+#endif
+}
+
+/**
+ * g_rename:
+ * @oldfilename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @newfilename: a pathname in the GLib file name encoding
+ *
+ * A wrapper for the POSIX rename() function. The rename() function
+ * renames a file, moving it between directories if required.
+ *
+ * See your C library manual for more details about how rename() works
+ * on your system. Note in particular that on Win9x it is not possible
+ * to rename a file if a file with the new name already exists. Also
+ * it is not possible in general on Windows to rename an open file.
+ *
+ * Returns: 0 if the renaming succeeded, -1 if an error occurred
+ *
+ * Since: 2.6
+ */
+int
+g_rename (const gchar *oldfilename,
+ const gchar *newfilename)
+{
+#ifdef G_OS_WIN32
+ wchar_t *woldfilename = g_utf8_to_utf16 (oldfilename, -1, NULL, NULL, NULL);
+ wchar_t *wnewfilename;
+ int retval;
+ int save_errno = 0;
+
+ if (woldfilename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ wnewfilename = g_utf8_to_utf16 (newfilename, -1, NULL, NULL, NULL);
+
+ if (wnewfilename == NULL)
+ {
+ g_free (woldfilename);
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (MoveFileExW (woldfilename, wnewfilename, MOVEFILE_REPLACE_EXISTING))
+ retval = 0;
+ else
+ {
+ retval = -1;
+ switch (GetLastError ())
+ {
+#define CASE(a,b) case ERROR_##a: save_errno = b; break
+ CASE (FILE_NOT_FOUND, ENOENT);
+ CASE (PATH_NOT_FOUND, ENOENT);
+ CASE (ACCESS_DENIED, EACCES);
+ CASE (NOT_SAME_DEVICE, EXDEV);
+ CASE (LOCK_VIOLATION, EACCES);
+ CASE (SHARING_VIOLATION, EACCES);
+ CASE (FILE_EXISTS, EEXIST);
+ CASE (ALREADY_EXISTS, EEXIST);
+#undef CASE
+ default: save_errno = EIO;
+ }
+ }
+
+ g_free (woldfilename);
+ g_free (wnewfilename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return rename (oldfilename, newfilename);
+#endif
+}
+
+/**
+ * g_mkdir:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @mode: permissions to use for the newly created directory
+ *
+ * A wrapper for the POSIX mkdir() function. The mkdir() function
+ * attempts to create a directory with the given name and permissions.
+ * The mode argument is ignored on Windows.
+ *
+ * See the C library manual for more details about mkdir().
+ *
+ * Returns: 0 if the directory was successfully created, -1 if an error
+ * occurred
+ *
+ * Since: 2.6
+ */
+int
+g_mkdir (const gchar *filename,
+ int mode)
+{
+#ifdef G_OS_WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ retval = _wmkdir (wfilename);
+ save_errno = errno;
+
+ g_free (wfilename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return mkdir (filename, mode);
+#endif
+}
+
+/**
+ * g_chdir:
+ * @path: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ *
+ * A wrapper for the POSIX chdir() function. The function changes the
+ * current directory of the process to @path.
+ *
+ * See your C library manual for more details about chdir().
+ *
+ * Returns: 0 on success, -1 if an error occurred.
+ *
+ * Since: 2.8
+ */
+int
+g_chdir (const gchar *path)
+{
+#ifdef G_OS_WIN32
+ wchar_t *wpath = g_utf8_to_utf16 (path, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+
+ if (wpath == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ retval = _wchdir (wpath);
+ save_errno = errno;
+
+ g_free (wpath);
+
+ errno = save_errno;
+ return retval;
+#else
+ return chdir (path);
+#endif
+}
+
+/**
+ * g_stat:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @buf: a pointer to a <structname>stat</structname> struct, which
+ * will be filled with the file information
+ *
+ * A wrapper for the POSIX stat() function. The stat() function
+ * returns information about a file. On Windows the stat() function in
+ * the C library checks only the READONLY attribute and does not look
+ * at the ACL at all. Thus the protection bits in the st_mode field
+ * are a fabrication of little use.
+ *
+ * See the C library manual for more details about stat().
+ *
+ * Returns: 0 if the information was successfully retrieved, -1 if an error
+ * occurred
+ *
+ * Since: 2.6
+ */
+int
+g_stat (const gchar *filename,
+ struct stat *buf)
+{
+#ifdef G_OS_WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+ int len;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ len = wcslen (wfilename);
+ while (len > 0 && G_IS_DIR_SEPARATOR (wfilename[len-1]))
+ len--;
+ if (len > 0 &&
+ (!g_path_is_absolute (filename) || len > g_path_skip_root (filename) - filename))
+ wfilename[len] = '\0';
+
+ retval = _wstat (wfilename, (struct _stat *) buf);
+ save_errno = errno;
+
+ g_free (wfilename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return stat (filename, buf);
+#endif
+}
+
+/**
+ * g_lstat:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @buf: a pointer to a <structname>stat</structname> struct, which
+ * will be filled with the file information
+ *
+ * A wrapper for the POSIX lstat() function. The lstat() function is
+ * like stat() except that in the case of symbolic links, it returns
+ * information about the symbolic link itself and not the file that it
+ * refers to. If the system does not support symbolic links g_lstat()
+ * is identical to g_stat().
+ *
+ * See the C library manual for more details about lstat().
+ *
+ * Returns: 0 if the information was successfully retrieved, -1 if an error
+ * occurred
+ *
+ * Since: 2.6
+ */
+int
+g_lstat (const gchar *filename,
+ struct stat *buf)
+{
+#ifdef HAVE_LSTAT
+ /* This can't be Win32, so don't do the widechar dance. */
+ return lstat (filename, buf);
+#else
+ return g_stat (filename, buf);
+#endif
+}
+
+/**
+ * g_unlink:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ *
+ * A wrapper for the POSIX unlink() function. The unlink() function
+ * deletes a name from the filesystem. If this was the last link to the
+ * file and no processes have it opened, the diskspace occupied by the
+ * file is freed.
+ *
+ * See your C library manual for more details about unlink(). Note
+ * that on Windows, it is in general not possible to delete files that
+ * are open to some process, or mapped into memory.
+ *
+ * Returns: 0 if the name was successfully deleted, -1 if an error
+ * occurred
+ *
+ * Since: 2.6
+ */
+int
+g_unlink (const gchar *filename)
+{
+#ifdef G_OS_WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ retval = _wunlink (wfilename);
+ save_errno = errno;
+
+ g_free (wfilename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return unlink (filename);
+#endif
+}
+
+/**
+ * g_remove:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ *
+ * A wrapper for the POSIX remove() function. The remove() function
+ * deletes a name from the filesystem.
+ *
+ * See your C library manual for more details about how remove() works
+ * on your system. On Unix, remove() removes also directories, as it
+ * calls unlink() for files and rmdir() for directories. On Windows,
+ * although remove() in the C library only works for files, this
+ * function tries first remove() and then if that fails rmdir(), and
+ * thus works for both files and directories. Note however, that on
+ * Windows, it is in general not possible to remove a file that is
+ * open to some process, or mapped into memory.
+ *
+ * If this function fails on Windows you can't infer too much from the
+ * errno value. rmdir() is tried regardless of what caused remove() to
+ * fail. Any errno value set by remove() will be overwritten by that
+ * set by rmdir().
+ *
+ * Returns: 0 if the file was successfully removed, -1 if an error
+ * occurred
+ *
+ * Since: 2.6
+ */
+int
+g_remove (const gchar *filename)
+{
+#ifdef G_OS_WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ retval = _wremove (wfilename);
+ if (retval == -1)
+ retval = _wrmdir (wfilename);
+ save_errno = errno;
+
+ g_free (wfilename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return remove (filename);
+#endif
+}
+
+/**
+ * g_rmdir:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ *
+ * A wrapper for the POSIX rmdir() function. The rmdir() function
+ * deletes a directory from the filesystem.
+ *
+ * See your C library manual for more details about how rmdir() works
+ * on your system.
+ *
+ * Returns: 0 if the directory was successfully removed, -1 if an error
+ * occurred
+ *
+ * Since: 2.6
+ */
+int
+g_rmdir (const gchar *filename)
+{
+#ifdef G_OS_WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ retval = _wrmdir (wfilename);
+ save_errno = errno;
+
+ g_free (wfilename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return rmdir (filename);
+#endif
+}
+
+/**
+ * g_fopen:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @mode: a string describing the mode in which the file should be
+ * opened
+ *
+ * A wrapper for the POSIX fopen() function. The fopen() function opens
+ * a file and associates a new stream with it.
+ *
+ * See the C library manual for more details about fopen().
+ *
+ * Returns: A <type>FILE</type> pointer if the file was successfully
+ * opened, or %NULL if an error occurred
+ *
+ * Since: 2.6
+ */
+FILE *
+g_fopen (const gchar *filename,
+ const gchar *mode)
+{
+#ifdef G_OS_WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ wchar_t *wmode;
+ FILE *retval;
+ int save_errno;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ wmode = g_utf8_to_utf16 (mode, -1, NULL, NULL, NULL);
+
+ if (wmode == NULL)
+ {
+ g_free (wfilename);
+ errno = EINVAL;
+ return NULL;
+ }
+
+ retval = _wfopen (wfilename, wmode);
+ save_errno = errno;
+
+ g_free (wfilename);
+ g_free (wmode);
+
+ errno = save_errno;
+ return retval;
+#else
+ return fopen (filename, mode);
+#endif
+}
+
+/**
+ * g_freopen:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @mode: a string describing the mode in which the file should be
+ * opened
+ * @stream: an existing stream which will be reused, or %NULL
+ *
+ * A wrapper for the POSIX freopen() function. The freopen() function
+ * opens a file and associates it with an existing stream.
+ *
+ * See the C library manual for more details about freopen().
+ *
+ * Returns: A <type>FILE</type> pointer if the file was successfully
+ * opened, or %NULL if an error occurred.
+ *
+ * Since: 2.6
+ */
+FILE *
+g_freopen (const gchar *filename,
+ const gchar *mode,
+ FILE *stream)
+{
+#ifdef G_OS_WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ wchar_t *wmode;
+ FILE *retval;
+ int save_errno;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ wmode = g_utf8_to_utf16 (mode, -1, NULL, NULL, NULL);
+
+ if (wmode == NULL)
+ {
+ g_free (wfilename);
+ errno = EINVAL;
+ return NULL;
+ }
+
+ retval = _wfreopen (wfilename, wmode, stream);
+ save_errno = errno;
+
+ g_free (wfilename);
+ g_free (wmode);
+
+ errno = save_errno;
+ return retval;
+#else
+ return freopen (filename, mode, stream);
+#endif
+}
+
+#define __G_STDIO_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gstdio.h b/trunk/glib/gstdio.h
new file mode 100644
index 000000000..dd9e82ad1
--- /dev/null
+++ b/trunk/glib/gstdio.h
@@ -0,0 +1,114 @@
+/* gstdio.h - GFilename wrappers for C library functions
+ *
+ * Copyright 2004 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.
+ */
+
+#ifndef __G_STDIO_H__
+#define __G_STDIO_H__
+
+#include <glib/gprintf.h>
+
+#include <sys/stat.h>
+
+G_BEGIN_DECLS
+
+#if defined(G_OS_UNIX) && !defined(G_STDIO_NO_WRAP_ON_UNIX)
+
+/* Just pass on to the system functions, so there's no potential for data
+ * format mismatches, especially with large file interfaces.
+ * A few functions can't be handled in this way, since they are not defined
+ * in a portable system header that we could include here.
+ */
+
+#define g_chmod chmod
+#define g_open open
+#define g_creat creat
+#define g_rename rename
+#define g_mkdir mkdir
+#define g_stat stat
+#define g_lstat lstat
+#define g_remove remove
+#define g_fopen fopen
+#define g_freopen freopen
+
+int g_access (const gchar *filename,
+ int mode);
+
+int g_chdir (const gchar *path);
+
+int g_unlink (const gchar *filename);
+
+int g_rmdir (const gchar *filename);
+
+#else /* ! G_OS_UNIX */
+
+/* Wrappers for C library functions that take pathname arguments. On
+ * Unix, the pathname is a file name as it literally is in the file
+ * system. On well-maintained systems with consistent users who know
+ * what they are doing and no exchange of files with others this would
+ * be a well-defined encoding, preferrably UTF-8. On Windows, the
+ * pathname is always in UTF-8, even if that is not the on-disk
+ * encoding, and not the encoding accepted by the C library or Win32
+ * API.
+ */
+
+int g_access (const gchar *filename,
+ int mode);
+
+int g_chmod (const gchar *filename,
+ int mode);
+
+int g_open (const gchar *filename,
+ int flags,
+ int mode);
+
+int g_creat (const gchar *filename,
+ int mode);
+
+int g_rename (const gchar *oldfilename,
+ const gchar *newfilename);
+
+int g_mkdir (const gchar *filename,
+ int mode);
+
+int g_chdir (const gchar *path);
+
+int g_stat (const gchar *filename,
+ struct stat *buf);
+
+int g_lstat (const gchar *filename,
+ struct stat *buf);
+
+int g_unlink (const gchar *filename);
+
+int g_remove (const gchar *filename);
+
+int g_rmdir (const gchar *filename);
+
+FILE *g_fopen (const gchar *filename,
+ const gchar *mode);
+
+FILE *g_freopen (const gchar *filename,
+ const gchar *mode,
+ FILE *stream);
+
+#endif /* G_OS_UNIX */
+
+G_END_DECLS
+
+#endif /* __G_STDIO_H__ */
diff --git a/trunk/glib/gstrfuncs.c b/trunk/glib/gstrfuncs.c
new file mode 100644
index 000000000..c75daad6d
--- /dev/null
+++ b/trunk/glib/gstrfuncs.c
@@ -0,0 +1,2845 @@
+/* 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 "config.h"
+
+#define _GNU_SOURCE /* For stpcpy */
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include <errno.h>
+#include <ctype.h> /* For tolower() */
+#if !defined (HAVE_STRSIGNAL) || !defined(NO_SYS_SIGLIST_DECL)
+#include <signal.h>
+#endif
+
+#include "glib.h"
+#include "gprintf.h"
+#include "gprintfint.h"
+
+#include "galias.h"
+
+#ifdef G_OS_WIN32
+#include <windows.h>
+#endif
+
+/* do not include <unistd.h> in this place since it
+ * interferes with g_strsignal() on some OSes
+ */
+
+static const guint16 ascii_table_data[256] = {
+ 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004,
+ 0x004, 0x104, 0x104, 0x004, 0x104, 0x104, 0x004, 0x004,
+ 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004,
+ 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004,
+ 0x140, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
+ 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
+ 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459,
+ 0x459, 0x459, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
+ 0x0d0, 0x653, 0x653, 0x653, 0x653, 0x653, 0x653, 0x253,
+ 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253,
+ 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253,
+ 0x253, 0x253, 0x253, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
+ 0x0d0, 0x473, 0x473, 0x473, 0x473, 0x473, 0x473, 0x073,
+ 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073,
+ 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073,
+ 0x073, 0x073, 0x073, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x004
+ /* the upper 128 are all zeroes */
+};
+
+const guint16 * const g_ascii_table = ascii_table_data;
+
+gchar*
+g_strdup (const gchar *str)
+{
+ gchar *new_str;
+ gsize length;
+
+ if (str)
+ {
+ length = strlen (str) + 1;
+ new_str = g_new (char, length);
+ memcpy (new_str, str, length);
+ }
+ 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;
+}
+
+/**
+ * g_strndup:
+ * @str: the string to duplicate
+ * @n: the maximum number of bytes to copy from @str
+ *
+ * Duplicates the first @n bytes of a string, returning a newly-allocated
+ * buffer @n + 1 bytes long which will always be nul-terminated.
+ * If @str is less than @n bytes long the buffer is padded with nuls.
+ * If @str is %NULL it returns %NULL.
+ * The returned value should be freed when no longer needed.
+ *
+ * <note><para>
+ * To copy a number of characters from a UTF-8 encoded string, use
+ * g_utf8_strncpy() instead.
+ * </para></note>
+ *
+ * Returns: a newly-allocated buffer containing the first @n bytes
+ * of @str, nul-terminated
+ */
+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;
+}
+
+/**
+ * g_strnfill:
+ * @length: the length of the new string
+ * @fill_char: the byte to fill the string with
+ *
+ * Creates a new string @length bytes long filled with @fill_char.
+ * The returned string should be freed when no longer needed.
+ *
+ * Returns: a newly-allocated string filled the @fill_char
+ */
+gchar*
+g_strnfill (gsize length,
+ gchar fill_char)
+{
+ gchar *str;
+
+ str = g_new (gchar, length + 1);
+ memset (str, (guchar)fill_char, length);
+ str[length] = '\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 args)
+{
+ gchar *string = NULL;
+
+ g_vasprintf (&string, format, args);
+
+ return string;
+}
+
+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;
+
+ if (!string1)
+ return 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;
+}
+
+/**
+ * g_strtod:
+ * @nptr: the string to convert to a numeric value.
+ * @endptr: if non-%NULL, it returns the character after
+ * the last character used in the conversion.
+ *
+ * Converts a string to a #gdouble value.
+ * It calls the standard strtod() function to handle the conversion, but
+ * if the string is not completely converted it attempts the conversion
+ * again with g_ascii_strtod(), and returns the best match.
+ *
+ * This function should seldomly be used. The normal situation when reading
+ * numbers not for human consumption is to use g_ascii_strtod(). Only when
+ * you know that you must expect both locale formatted and C formatted numbers
+ * should you use this. Make sure that you don't pass strings such as comma
+ * separated lists of values, since the commas may be interpreted as a decimal
+ * point in some locales, causing unexpected results.
+ *
+ * Return value: the #gdouble value.
+ **/
+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)
+ val_2 = g_ascii_strtod (nptr, &fail_pos_2);
+
+ 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_ascii_strtod:
+ * @nptr: the string to convert to a numeric value.
+ * @endptr: if non-%NULL, it returns the character after
+ * the last character used in the conversion.
+ *
+ * Converts a string to a #gdouble value.
+ * This function behaves like the standard strtod() function
+ * does in the C locale. It does this without actually
+ * changing the current locale, since that would not be
+ * thread-safe.
+ *
+ * This function is typically used when reading configuration
+ * files or other non-user input that should be locale independent.
+ * To handle input from the user you should normally use the
+ * locale-sensitive system strtod() function.
+ *
+ * To convert from a #gdouble to a string in a locale-insensitive
+ * way, use g_ascii_dtostr().
+ *
+ * If the correct value would cause overflow, plus or minus %HUGE_VAL
+ * is returned (according to the sign of the value), and %ERANGE is
+ * stored in %errno. If the correct value would cause underflow,
+ * zero is returned and %ERANGE is stored in %errno.
+ *
+ * This function resets %errno before calling strtod() so that
+ * you can reliably detect overflow and underflow.
+ *
+ * Return value: the #gdouble value.
+ **/
+gdouble
+g_ascii_strtod (const gchar *nptr,
+ gchar **endptr)
+{
+ gchar *fail_pos;
+ gdouble val;
+ struct lconv *locale_data;
+ const char *decimal_point;
+ int decimal_point_len;
+ const char *p, *decimal_point_pos;
+ const char *end = NULL; /* Silence gcc */
+ int strtod_errno;
+
+ g_return_val_if_fail (nptr != NULL, 0);
+
+ fail_pos = NULL;
+
+ locale_data = localeconv ();
+ decimal_point = locale_data->decimal_point;
+ decimal_point_len = strlen (decimal_point);
+
+ g_assert (decimal_point_len != 0);
+
+ decimal_point_pos = NULL;
+ end = NULL;
+
+ if (decimal_point[0] != '.' ||
+ decimal_point[1] != 0)
+ {
+ p = nptr;
+ /* Skip leading space */
+ while (g_ascii_isspace (*p))
+ p++;
+
+ /* Skip leading optional sign */
+ if (*p == '+' || *p == '-')
+ p++;
+
+ if (p[0] == '0' &&
+ (p[1] == 'x' || p[1] == 'X'))
+ {
+ p += 2;
+ /* HEX - find the (optional) decimal point */
+
+ while (g_ascii_isxdigit (*p))
+ p++;
+
+ if (*p == '.')
+ decimal_point_pos = p++;
+
+ while (g_ascii_isxdigit (*p))
+ p++;
+
+ if (*p == 'p' || *p == 'P')
+ p++;
+ if (*p == '+' || *p == '-')
+ p++;
+ while (g_ascii_isdigit (*p))
+ p++;
+
+ end = p;
+ }
+ else if (g_ascii_isdigit (*p) || *p == '.')
+ {
+ while (g_ascii_isdigit (*p))
+ p++;
+
+ if (*p == '.')
+ decimal_point_pos = p++;
+
+ while (g_ascii_isdigit (*p))
+ p++;
+
+ if (*p == 'e' || *p == 'E')
+ p++;
+ if (*p == '+' || *p == '-')
+ p++;
+ while (g_ascii_isdigit (*p))
+ p++;
+
+ end = p;
+ }
+ /* For the other cases, we need not convert the decimal point */
+ }
+
+ if (decimal_point_pos)
+ {
+ char *copy, *c;
+
+ /* We need to convert the '.' to the locale specific decimal point */
+ copy = g_malloc (end - nptr + 1 + decimal_point_len);
+
+ c = copy;
+ memcpy (c, nptr, decimal_point_pos - nptr);
+ c += decimal_point_pos - nptr;
+ memcpy (c, decimal_point, decimal_point_len);
+ c += decimal_point_len;
+ memcpy (c, decimal_point_pos + 1, end - (decimal_point_pos + 1));
+ c += end - (decimal_point_pos + 1);
+ *c = 0;
+
+ errno = 0;
+ val = strtod (copy, &fail_pos);
+ strtod_errno = errno;
+
+ if (fail_pos)
+ {
+ if (fail_pos - copy > decimal_point_pos - nptr)
+ fail_pos = (char *)nptr + (fail_pos - copy) - (decimal_point_len - 1);
+ else
+ fail_pos = (char *)nptr + (fail_pos - copy);
+ }
+
+ g_free (copy);
+
+ }
+ else if (end)
+ {
+ char *copy;
+
+ copy = g_malloc (end - (char *)nptr + 1);
+ memcpy (copy, nptr, end - nptr);
+ *(copy + (end - (char *)nptr)) = 0;
+
+ errno = 0;
+ val = strtod (copy, &fail_pos);
+ strtod_errno = errno;
+
+ if (fail_pos)
+ {
+ fail_pos = (char *)nptr + (fail_pos - copy);
+ }
+
+ g_free (copy);
+ }
+ else
+ {
+ errno = 0;
+ val = strtod (nptr, &fail_pos);
+ strtod_errno = errno;
+ }
+
+ if (endptr)
+ *endptr = fail_pos;
+
+ errno = strtod_errno;
+
+ return val;
+}
+
+
+/**
+ * g_ascii_dtostr:
+ * @buffer: A buffer to place the resulting string in
+ * @buf_len: The length of the buffer.
+ * @d: The #gdouble to convert
+ *
+ * Converts a #gdouble to a string, using the '.' as
+ * decimal point.
+ *
+ * This functions generates enough precision that converting
+ * the string back using g_ascii_strtod() gives the same machine-number
+ * (on machines with IEEE compatible 64bit doubles). It is
+ * guaranteed that the size of the resulting string will never
+ * be larger than @G_ASCII_DTOSTR_BUF_SIZE bytes.
+ *
+ * Return value: The pointer to the buffer with the converted string.
+ **/
+gchar *
+g_ascii_dtostr (gchar *buffer,
+ gint buf_len,
+ gdouble d)
+{
+ return g_ascii_formatd (buffer, buf_len, "%.17g", d);
+}
+
+/**
+ * g_ascii_formatd:
+ * @buffer: A buffer to place the resulting string in
+ * @buf_len: The length of the buffer.
+ * @format: The printf()-style format to use for the
+ * code to use for converting.
+ * @d: The #gdouble to convert
+ *
+ * Converts a #gdouble to a string, using the '.' as
+ * decimal point. To format the number you pass in
+ * a printf()-style format string. Allowed conversion
+ * specifiers are 'e', 'E', 'f', 'F', 'g' and 'G'.
+ *
+ * If you just want to want to serialize the value into a
+ * string, use g_ascii_dtostr().
+ *
+ * Return value: The pointer to the buffer with the converted string.
+ **/
+gchar *
+g_ascii_formatd (gchar *buffer,
+ gint buf_len,
+ const gchar *format,
+ gdouble d)
+{
+ struct lconv *locale_data;
+ const char *decimal_point;
+ int decimal_point_len;
+ gchar *p;
+ int rest_len;
+ gchar format_char;
+
+ g_return_val_if_fail (buffer != NULL, NULL);
+ g_return_val_if_fail (format[0] == '%', NULL);
+ g_return_val_if_fail (strpbrk (format + 1, "'l%") == NULL, NULL);
+
+ format_char = format[strlen (format) - 1];
+
+ g_return_val_if_fail (format_char == 'e' || format_char == 'E' ||
+ format_char == 'f' || format_char == 'F' ||
+ format_char == 'g' || format_char == 'G',
+ NULL);
+
+ if (format[0] != '%')
+ return NULL;
+
+ if (strpbrk (format + 1, "'l%"))
+ return NULL;
+
+ if (!(format_char == 'e' || format_char == 'E' ||
+ format_char == 'f' || format_char == 'F' ||
+ format_char == 'g' || format_char == 'G'))
+ return NULL;
+
+
+ _g_snprintf (buffer, buf_len, format, d);
+
+ locale_data = localeconv ();
+ decimal_point = locale_data->decimal_point;
+ decimal_point_len = strlen (decimal_point);
+
+ g_assert (decimal_point_len != 0);
+
+ if (decimal_point[0] != '.' ||
+ decimal_point[1] != 0)
+ {
+ p = buffer;
+
+ while (g_ascii_isspace (*p))
+ p++;
+
+ if (*p == '+' || *p == '-')
+ p++;
+
+ while (isdigit ((guchar)*p))
+ p++;
+
+ if (strncmp (p, decimal_point, decimal_point_len) == 0)
+ {
+ *p = '.';
+ p++;
+ if (decimal_point_len > 1)
+ {
+ rest_len = strlen (p + (decimal_point_len-1));
+ memmove (p, p + (decimal_point_len-1), rest_len);
+ p[rest_len] = 0;
+ }
+ }
+ }
+
+ return buffer;
+}
+
+static guint64
+g_parse_long_long (const gchar *nptr,
+ gchar **endptr,
+ guint base,
+ gboolean *negative)
+{
+ /* this code is based on on the strtol(3) code from GNU libc released under
+ * the GNU Lesser General Public License.
+ *
+ * Copyright (C) 1991,92,94,95,96,97,98,99,2000,01,02
+ * Free Software Foundation, Inc.
+ */
+#define ISSPACE(c) ((c) == ' ' || (c) == '\f' || (c) == '\n' || \
+ (c) == '\r' || (c) == '\t' || (c) == '\v')
+#define ISUPPER(c) ((c) >= 'A' && (c) <= 'Z')
+#define ISLOWER(c) ((c) >= 'a' && (c) <= 'z')
+#define ISALPHA(c) (ISUPPER (c) || ISLOWER (c))
+#define TOUPPER(c) (ISLOWER (c) ? (c) - 'a' + 'A' : (c))
+#define TOLOWER(c) (ISUPPER (c) ? (c) - 'A' + 'a' : (c))
+ gboolean overflow;
+ guint64 cutoff;
+ guint64 cutlim;
+ guint64 ui64;
+ const gchar *s, *save;
+ guchar c;
+
+ g_return_val_if_fail (nptr != NULL, 0);
+
+ if (base == 1 || base > 36)
+ {
+ errno = EINVAL;
+ return 0;
+ }
+
+ save = s = nptr;
+
+ /* Skip white space. */
+ while (ISSPACE (*s))
+ ++s;
+
+ if (G_UNLIKELY (!*s))
+ goto noconv;
+
+ /* Check for a sign. */
+ *negative = FALSE;
+ if (*s == '-')
+ {
+ *negative = TRUE;
+ ++s;
+ }
+ else if (*s == '+')
+ ++s;
+
+ /* Recognize number prefix and if BASE is zero, figure it out ourselves. */
+ if (*s == '0')
+ {
+ if ((base == 0 || base == 16) && TOUPPER (s[1]) == 'X')
+ {
+ s += 2;
+ base = 16;
+ }
+ else if (base == 0)
+ base = 8;
+ }
+ else if (base == 0)
+ base = 10;
+
+ /* Save the pointer so we can check later if anything happened. */
+ save = s;
+ cutoff = G_MAXUINT64 / base;
+ cutlim = G_MAXUINT64 % base;
+
+ overflow = FALSE;
+ ui64 = 0;
+ c = *s;
+ for (; c; c = *++s)
+ {
+ if (c >= '0' && c <= '9')
+ c -= '0';
+ else if (ISALPHA (c))
+ c = TOUPPER (c) - 'A' + 10;
+ else
+ break;
+ if (c >= base)
+ break;
+ /* Check for overflow. */
+ if (ui64 > cutoff || (ui64 == cutoff && c > cutlim))
+ overflow = TRUE;
+ else
+ {
+ ui64 *= base;
+ ui64 += c;
+ }
+ }
+
+ /* Check if anything actually happened. */
+ if (s == save)
+ goto noconv;
+
+ /* Store in ENDPTR the address of one character
+ past the last character we converted. */
+ if (endptr)
+ *endptr = (gchar*) s;
+
+ if (G_UNLIKELY (overflow))
+ {
+ errno = ERANGE;
+ return G_MAXUINT64;
+ }
+
+ return ui64;
+
+ noconv:
+ /* We must handle a special case here: the base is 0 or 16 and the
+ first two characters are '0' and 'x', but the rest are no
+ hexadecimal digits. This is no error case. We return 0 and
+ ENDPTR points to the `x`. */
+ if (endptr)
+ {
+ if (save - nptr >= 2 && TOUPPER (save[-1]) == 'X'
+ && save[-2] == '0')
+ *endptr = (gchar*) &save[-1];
+ else
+ /* There was no number to convert. */
+ *endptr = (gchar*) nptr;
+ }
+ return 0;
+}
+
+/**
+ * g_ascii_strtoull:
+ * @nptr: the string to convert to a numeric value.
+ * @endptr: if non-%NULL, it returns the character after
+ * the last character used in the conversion.
+ * @base: to be used for the conversion, 2..36 or 0
+ *
+ * Converts a string to a #guint64 value.
+ * This function behaves like the standard strtoull() function
+ * does in the C locale. It does this without actually
+ * changing the current locale, since that would not be
+ * thread-safe.
+ *
+ * This function is typically used when reading configuration
+ * files or other non-user input that should be locale independent.
+ * To handle input from the user you should normally use the
+ * locale-sensitive system strtoull() function.
+ *
+ * If the correct value would cause overflow, %G_MAXUINT64
+ * is returned, and %ERANGE is stored in %errno. If the base is
+ * outside the valid range, zero is returned, and %EINVAL is stored
+ * in %errno. If the string conversion fails, zero is returned, and
+ * @endptr returns @nptr (if @endptr is non-%NULL).
+ *
+ * Return value: the #guint64 value or zero on error.
+ *
+ * Since: 2.2
+ **/
+guint64
+g_ascii_strtoull (const gchar *nptr,
+ gchar **endptr,
+ guint base)
+{
+ gboolean negative;
+ guint64 result;
+
+ result = g_parse_long_long (nptr, endptr, base, &negative);
+
+ /* Return the result of the appropriate sign. */
+ return negative ? -result : result;
+}
+
+/**
+ * g_ascii_strtoll:
+ * @nptr: the string to convert to a numeric value.
+ * @endptr: if non-%NULL, it returns the character after
+ * the last character used in the conversion.
+ * @base: to be used for the conversion, 2..36 or 0
+ *
+ * Converts a string to a #gint64 value.
+ * This function behaves like the standard strtoll() function
+ * does in the C locale. It does this without actually
+ * changing the current locale, since that would not be
+ * thread-safe.
+ *
+ * This function is typically used when reading configuration
+ * files or other non-user input that should be locale independent.
+ * To handle input from the user you should normally use the
+ * locale-sensitive system strtoll() function.
+ *
+ * If the correct value would cause overflow, %G_MAXINT64 or %G_MININT64
+ * is returned, and %ERANGE is stored in %errno. If the base is
+ * outside the valid range, zero is returned, and %EINVAL is stored
+ * in %errno. If the string conversion fails, zero is returned, and
+ * @endptr returns @nptr (if @endptr is non-%NULL).
+ *
+ * Return value: the #gint64 value or zero on error.
+ *
+ * Since: 2.12
+ **/
+gint64
+g_ascii_strtoll (const gchar *nptr,
+ gchar **endptr,
+ guint base)
+{
+ gboolean negative;
+ guint64 result;
+
+ result = g_parse_long_long (nptr, endptr, base, &negative);
+
+ if (negative && result > (guint64) G_MININT64)
+ {
+ errno = ERANGE;
+ return G_MININT64;
+ }
+ else if (!negative && result > (guint64) G_MAXINT64)
+ {
+ errno = ERANGE;
+ return G_MAXINT64;
+ }
+ else if (negative)
+ return - (gint64) result;
+ else
+ return (gint64) result;
+}
+
+G_CONST_RETURN gchar*
+g_strerror (gint errnum)
+{
+ static GStaticPrivate msg_private = G_STATIC_PRIVATE_INIT;
+ char *msg;
+ int saved_errno = errno;
+
+#ifdef HAVE_STRERROR
+ const char *msg_locale;
+
+ msg_locale = strerror (errnum);
+ if (g_get_charset (NULL))
+ {
+ errno = saved_errno;
+ return msg_locale;
+ }
+ else
+ {
+ gchar *msg_utf8 = g_locale_to_utf8 (msg_locale, -1, NULL, NULL, NULL);
+ if (msg_utf8)
+ {
+ /* Stick in the quark table so that we can return a static result
+ */
+ GQuark msg_quark = g_quark_from_string (msg_utf8);
+ g_free (msg_utf8);
+
+ msg_utf8 = (gchar *) g_quark_to_string (msg_quark);
+ errno = saved_errno;
+ return msg_utf8;
+ }
+ }
+#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 "is 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);
+ }
+
+ _g_sprintf (msg, "unknown error (%d)", errnum);
+
+ errno = saved_errno;
+ return msg;
+}
+
+G_CONST_RETURN gchar*
+g_strsignal (gint signum)
+{
+ static GStaticPrivate msg_private = G_STATIC_PRIVATE_INIT;
+ char *msg;
+
+#ifdef HAVE_STRSIGNAL
+ const char *msg_locale;
+
+#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 */
+ msg_locale = strsignal (signum);
+ if (g_get_charset (NULL))
+ return msg_locale;
+ else
+ {
+ gchar *msg_utf8 = g_locale_to_utf8 (msg_locale, -1, NULL, NULL, NULL);
+ if (msg_utf8)
+ {
+ /* Stick in the quark table so that we can return a static result
+ */
+ GQuark msg_quark = g_quark_from_string (msg_utf8);
+ g_free (msg_utf8);
+
+ return g_quark_to_string (msg_quark);
+ }
+ }
+#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);
+ }
+
+ _g_sprintf (msg, "unknown signal (%d)", signum);
+
+ return msg;
+}
+
+/* Functions g_strlcpy and g_strlcat were originally developed by
+ * Todd C. Miller <Todd.Miller@courtesan.com> 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 */
+
+/**
+ * g_ascii_strdown:
+ * @str: a string.
+ * @len: length of @str in bytes, or -1 if @str is nul-terminated.
+ *
+ * Converts all upper case ASCII letters to lower case ASCII letters.
+ *
+ * Return value: a newly-allocated string, with all the upper case
+ * characters in @str converted to lower case, with
+ * semantics that exactly match g_ascii_tolower(). (Note
+ * that this is unlike the old g_strdown(), which modified
+ * the string in place.)
+ **/
+gchar*
+g_ascii_strdown (const gchar *str,
+ gssize len)
+{
+ gchar *result, *s;
+
+ g_return_val_if_fail (str != NULL, NULL);
+
+ if (len < 0)
+ len = strlen (str);
+
+ result = g_strndup (str, len);
+ for (s = result; *s; s++)
+ *s = g_ascii_tolower (*s);
+
+ return result;
+}
+
+/**
+ * g_ascii_strup:
+ * @str: a string.
+ * @len: length of @str in bytes, or -1 if @str is nul-terminated.
+ *
+ * Converts all lower case ASCII letters to upper case ASCII letters.
+ *
+ * Return value: a newly allocated string, with all the lower case
+ * characters in @str converted to upper case, with
+ * semantics that exactly match g_ascii_toupper(). (Note
+ * that this is unlike the old g_strup(), which modified
+ * the string in place.)
+ **/
+gchar*
+g_ascii_strup (const gchar *str,
+ gssize len)
+{
+ gchar *result, *s;
+
+ g_return_val_if_fail (str != NULL, NULL);
+
+ if (len < 0)
+ len = strlen (str);
+
+ result = g_strndup (str, len);
+ for (s = result; *s; s++)
+ *s = g_ascii_toupper (*s);
+
+ return result;
+}
+
+/**
+ * g_strdown:
+ * @string: the string to convert.
+ *
+ * Converts a string to lower case.
+ *
+ * Return value: the string
+ *
+ * Deprecated:2.2: This function is totally broken for the reasons discussed
+ * in the g_strncasecmp() docs - use g_ascii_strdown() or g_utf8_strdown()
+ * instead.
+ **/
+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;
+}
+
+/**
+ * g_strup:
+ * @string: the string to convert.
+ *
+ * Converts a string to upper case.
+ *
+ * Return value: the string
+ *
+ * Deprecated:2.2: This function is totally broken for the reasons discussed
+ * in the g_strncasecmp() docs - use g_ascii_strup() or g_utf8_strup() instead.
+ **/
+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;
+}
+
+/**
+ * g_ascii_tolower:
+ * @c: any character.
+ *
+ * Convert a character to ASCII lower case.
+ *
+ * Unlike the standard C library tolower() function, this only
+ * recognizes standard ASCII letters and ignores the locale, returning
+ * all non-ASCII characters unchanged, even if they are lower case
+ * letters in a particular character set. Also unlike the standard
+ * library function, this takes and returns a char, not an int, so
+ * don't call it on %EOF but no need to worry about casting to #guchar
+ * before passing a possibly non-ASCII character in.
+ *
+ * Return value: the result of converting @c to lower case.
+ * If @c is not an ASCII upper case letter,
+ * @c is returned unchanged.
+ **/
+gchar
+g_ascii_tolower (gchar c)
+{
+ return g_ascii_isupper (c) ? c - 'A' + 'a' : c;
+}
+
+/**
+ * g_ascii_toupper:
+ * @c: any character.
+ *
+ * Convert a character to ASCII upper case.
+ *
+ * Unlike the standard C library toupper() function, this only
+ * recognizes standard ASCII letters and ignores the locale, returning
+ * all non-ASCII characters unchanged, even if they are upper case
+ * letters in a particular character set. Also unlike the standard
+ * library function, this takes and returns a char, not an int, so
+ * don't call it on %EOF but no need to worry about casting to #guchar
+ * before passing a possibly non-ASCII character in.
+ *
+ * Return value: the result of converting @c to upper case.
+ * If @c is not an ASCII lower case letter,
+ * @c is returned unchanged.
+ **/
+gchar
+g_ascii_toupper (gchar c)
+{
+ return g_ascii_islower (c) ? c - 'a' + 'A' : c;
+}
+
+/**
+ * g_ascii_digit_value:
+ * @c: an ASCII character.
+ *
+ * Determines the numeric value of a character as a decimal
+ * digit. Differs from g_unichar_digit_value() because it takes
+ * a char, so there's no worry about sign extension if characters
+ * are signed.
+ *
+ * Return value: If @c is a decimal digit (according to
+ * g_ascii_isdigit()), its numeric value. Otherwise, -1.
+ **/
+int
+g_ascii_digit_value (gchar c)
+{
+ if (g_ascii_isdigit (c))
+ return c - '0';
+ return -1;
+}
+
+/**
+ * g_ascii_xdigit_value:
+ * @c: an ASCII character.
+ *
+ * Determines the numeric value of a character as a hexidecimal
+ * digit. Differs from g_unichar_xdigit_value() because it takes
+ * a char, so there's no worry about sign extension if characters
+ * are signed.
+ *
+ * Return value: If @c is a hex digit (according to
+ * g_ascii_isxdigit()), its numeric value. Otherwise, -1.
+ **/
+int
+g_ascii_xdigit_value (gchar c)
+{
+ if (c >= 'A' && c <= 'F')
+ return c - 'A' + 10;
+ if (c >= 'a' && c <= 'f')
+ return c - 'a' + 10;
+ return g_ascii_digit_value (c);
+}
+
+/**
+ * g_ascii_strcasecmp:
+ * @s1: string to compare with @s2.
+ * @s2: string to compare with @s1.
+ *
+ * Compare two strings, ignoring the case of ASCII characters.
+ *
+ * Unlike the BSD strcasecmp() function, this only recognizes standard
+ * ASCII letters and ignores the locale, treating all non-ASCII
+ * bytes as if they are not letters.
+ *
+ * This function should be used only on strings that are known to be
+ * in encodings where the bytes corresponding to ASCII letters always
+ * represent themselves. This includes UTF-8 and the ISO-8859-*
+ * charsets, but not for instance double-byte encodings like the
+ * Windows Codepage 932, where the trailing bytes of double-byte
+ * characters include all ASCII letters. If you compare two CP932
+ * strings using this function, you will get false matches.
+ *
+ * Return value: 0 if the strings match, a negative value if @s1 &lt; @s2,
+ * or a positive value if @s1 &gt; @s2.
+ **/
+gint
+g_ascii_strcasecmp (const gchar *s1,
+ const gchar *s2)
+{
+ gint c1, c2;
+
+ g_return_val_if_fail (s1 != NULL, 0);
+ g_return_val_if_fail (s2 != NULL, 0);
+
+ while (*s1 && *s2)
+ {
+ c1 = (gint)(guchar) TOLOWER (*s1);
+ c2 = (gint)(guchar) TOLOWER (*s2);
+ if (c1 != c2)
+ return (c1 - c2);
+ s1++; s2++;
+ }
+
+ return (((gint)(guchar) *s1) - ((gint)(guchar) *s2));
+}
+
+/**
+ * g_ascii_strncasecmp:
+ * @s1: string to compare with @s2.
+ * @s2: string to compare with @s1.
+ * @n: number of characters to compare.
+ *
+ * Compare @s1 and @s2, ignoring the case of ASCII characters and any
+ * characters after the first @n in each string.
+ *
+ * Unlike the BSD strcasecmp() function, this only recognizes standard
+ * ASCII letters and ignores the locale, treating all non-ASCII
+ * characters as if they are not letters.
+ *
+ * The same warning as in g_ascii_strcasecmp() applies: Use this
+ * function only on strings known to be in encodings where bytes
+ * corresponding to ASCII letters always represent themselves.
+ *
+ * Return value: 0 if the strings match, a negative value if @s1 &lt; @s2,
+ * or a positive value if @s1 &gt; @s2.
+ **/
+gint
+g_ascii_strncasecmp (const gchar *s1,
+ const gchar *s2,
+ gsize n)
+{
+ 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;
+ c1 = (gint)(guchar) TOLOWER (*s1);
+ c2 = (gint)(guchar) TOLOWER (*s2);
+ if (c1 != c2)
+ return (c1 - c2);
+ s1++; s2++;
+ }
+
+ if (n)
+ return (((gint) (guchar) *s1) - ((gint) (guchar) *s2));
+ else
+ return 0;
+}
+
+/**
+ * g_strcasecmp:
+ * @s1: a string.
+ * @s2: a string to compare with @s1.
+ *
+ * A case-insensitive string comparison, corresponding to the standard
+ * strcasecmp() function on platforms which support it.
+ *
+ * Return value: 0 if the strings match, a negative value if @s1 &lt; @s2,
+ * or a positive value if @s1 &gt; @s2.
+ *
+ * Deprecated:2.2: See g_strncasecmp() for a discussion of why this function
+ * is deprecated and how to replace it.
+ **/
+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
+}
+
+/**
+ * g_strncasecmp:
+ * @s1: a string.
+ * @s2: a string to compare with @s1.
+ * @n: the maximum number of characters to compare.
+ *
+ * A case-insensitive string comparison, corresponding to the standard
+ * strncasecmp() function on platforms which support it.
+ * It is similar to g_strcasecmp() except it only compares the first @n
+ * characters of the strings.
+ *
+ * Return value: 0 if the strings match, a negative value if @s1 &lt; @s2,
+ * or a positive value if @s1 &gt; @s2.
+ *
+ * Deprecated:2.2: The problem with g_strncasecmp() is that it does the
+ * comparison by calling toupper()/tolower(). These functions are
+ * locale-specific and operate on single bytes. However, it is impossible
+ * to handle things correctly from an I18N standpoint by operating on
+ * bytes, since characters may be multibyte. Thus g_strncasecmp() is
+ * broken if your string is guaranteed to be ASCII, since it's
+ * locale-sensitive, and it's broken if your string is localized, since
+ * it doesn't work on many encodings at all, including UTF-8, EUC-JP,
+ * etc.
+ *
+ * There are therefore two replacement functions: g_ascii_strncasecmp(),
+ * which only works on ASCII and is not locale-sensitive, and
+ * g_utf8_casefold(), which is good for case-insensitive sorting of UTF-8.
+ **/
+gint
+g_strncasecmp (const gchar *s1,
+ const gchar *s2,
+ guint 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':
+ g_warning ("g_strcompress: trailing \\");
+ goto out;
+ 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++;
+ }
+out:
+ *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 && g_ascii_isspace (*start); start++)
+ ;
+
+ g_memmove (string, start, strlen ((gchar *) start) + 1);
+
+ return string;
+}
+
+gchar*
+g_strchomp (gchar *string)
+{
+ gsize len;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ len = strlen (string);
+ while (len--)
+ {
+ if (g_ascii_isspace ((guchar) string[len]))
+ string[len] = '\0';
+ else
+ break;
+ }
+
+ return string;
+}
+
+/**
+ * g_strsplit:
+ * @string: a string to split.
+ * @delimiter: a string which specifies the places at which to split the string.
+ * The delimiter is not included in any of the resulting strings, unless
+ * @max_tokens is reached.
+ * @max_tokens: the maximum number of pieces to split @string into. If this is
+ * less than 1, the string is split completely.
+ *
+ * Splits a string into a maximum of @max_tokens pieces, using the given
+ * @delimiter. If @max_tokens is reached, the remainder of @string is appended
+ * to the last token.
+ *
+ * As a special case, the result of splitting the empty string "" is an empty
+ * vector, not a vector containing a single string. The reason for this
+ * special case is that being able to represent a empty vector is typically
+ * more useful than consistent handling of empty elements. If you do need
+ * to represent empty elements, you'll need to check for the empty string
+ * before calling g_strsplit().
+ *
+ * Return value: a newly-allocated %NULL-terminated array of strings. Use
+ * g_strfreev() to free it.
+ **/
+gchar**
+g_strsplit (const gchar *string,
+ const gchar *delimiter,
+ gint max_tokens)
+{
+ GSList *string_list = NULL, *slist;
+ gchar **str_array, *s;
+ guint n = 0;
+ const gchar *remainder;
+
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (delimiter != NULL, NULL);
+ g_return_val_if_fail (delimiter[0] != '\0', NULL);
+
+ if (max_tokens < 1)
+ max_tokens = G_MAXINT;
+
+ remainder = string;
+ s = strstr (remainder, delimiter);
+ if (s)
+ {
+ gsize delimiter_len = strlen (delimiter);
+
+ while (--max_tokens && s)
+ {
+ gsize len;
+
+ len = s - remainder;
+ string_list = g_slist_prepend (string_list,
+ g_strndup (remainder, len));
+ n++;
+ remainder = s + delimiter_len;
+ s = strstr (remainder, delimiter);
+ }
+ }
+ if (*string)
+ {
+ n++;
+ string_list = g_slist_prepend (string_list, g_strdup (remainder));
+ }
+
+ 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;
+}
+
+/**
+ * g_strsplit_set:
+ * @string: The string to be tokenized
+ * @delimiters: A nul-terminated string containing bytes that are used
+ * to split the string.
+ * @max_tokens: The maximum number of tokens to split @string into.
+ * If this is less than 1, the string is split completely
+ *
+ * Splits @string into a number of tokens not containing any of the characters
+ * in @delimiter. A token is the (possibly empty) longest string that does not
+ * contain any of the characters in @delimiters. If @max_tokens is reached, the
+ * remainder is appended to the last token.
+ *
+ * For example the result of g_strsplit_set ("abc:def/ghi", ":/", -1) is a
+ * %NULL-terminated vector containing the three strings "abc", "def",
+ * and "ghi".
+ *
+ * The result if g_strsplit_set (":def/ghi:", ":/", -1) is a %NULL-terminated
+ * vector containing the four strings "", "def", "ghi", and "".
+ *
+ * As a special case, the result of splitting the empty string "" is an empty
+ * vector, not a vector containing a single string. The reason for this
+ * special case is that being able to represent a empty vector is typically
+ * more useful than consistent handling of empty elements. If you do need
+ * to represent empty elements, you'll need to check for the empty string
+ * before calling g_strsplit_set().
+ *
+ * Note that this function works on bytes not characters, so it can't be used
+ * to delimit UTF-8 strings for anything but ASCII characters.
+ *
+ * Return value: a newly-allocated %NULL-terminated array of strings. Use
+ * g_strfreev() to free it.
+ *
+ * Since: 2.4
+ **/
+gchar **
+g_strsplit_set (const gchar *string,
+ const gchar *delimiters,
+ gint max_tokens)
+{
+ gboolean delim_table[256];
+ GSList *tokens, *list;
+ gint n_tokens;
+ const gchar *s;
+ const gchar *current;
+ gchar *token;
+ gchar **result;
+
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (delimiters != NULL, NULL);
+
+ if (max_tokens < 1)
+ max_tokens = G_MAXINT;
+
+ if (*string == '\0')
+ {
+ result = g_new (char *, 1);
+ result[0] = NULL;
+ return result;
+ }
+
+ memset (delim_table, FALSE, sizeof (delim_table));
+ for (s = delimiters; *s != '\0'; ++s)
+ delim_table[*(guchar *)s] = TRUE;
+
+ tokens = NULL;
+ n_tokens = 0;
+
+ s = current = string;
+ while (*s != '\0')
+ {
+ if (delim_table[*(guchar *)s] && n_tokens + 1 < max_tokens)
+ {
+ gchar *token;
+
+ token = g_strndup (current, s - current);
+ tokens = g_slist_prepend (tokens, token);
+ ++n_tokens;
+
+ current = s + 1;
+ }
+
+ ++s;
+ }
+
+ token = g_strndup (current, s - current);
+ tokens = g_slist_prepend (tokens, token);
+ ++n_tokens;
+
+ result = g_new (gchar *, n_tokens + 1);
+
+ result[n_tokens] = NULL;
+ for (list = tokens; list != NULL; list = list->next)
+ result[--n_tokens] = list->data;
+
+ g_slist_free (tokens);
+
+ return result;
+}
+
+/**
+ * g_strfreev:
+ * @str_array: a %NULL-terminated array of strings to free.
+
+ * Frees a %NULL-terminated array of strings, and the array itself.
+ * If called on a %NULL value, g_strfreev() simply returns.
+ **/
+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:
+ * @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,
+ 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 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;
+ }
+}
+
+
+/**
+ * g_str_has_suffix:
+ * @str: a nul-terminated string.
+ * @suffix: the nul-terminated suffix to look for.
+ *
+ * Looks whether the string @str ends with @suffix.
+ *
+ * Return value: %TRUE if @str end with @suffix, %FALSE otherwise.
+ *
+ * Since: 2.2
+ **/
+gboolean
+g_str_has_suffix (const gchar *str,
+ const gchar *suffix)
+{
+ int str_len;
+ int suffix_len;
+
+ g_return_val_if_fail (str != NULL, FALSE);
+ g_return_val_if_fail (suffix != NULL, FALSE);
+
+ str_len = strlen (str);
+ suffix_len = strlen (suffix);
+
+ if (str_len < suffix_len)
+ return FALSE;
+
+ return strcmp (str + str_len - suffix_len, suffix) == 0;
+}
+
+/**
+ * g_str_has_prefix:
+ * @str: a nul-terminated string.
+ * @prefix: the nul-terminated prefix to look for.
+ *
+ * Looks whether the string @str begins with @prefix.
+ *
+ * Return value: %TRUE if @str begins with @prefix, %FALSE otherwise.
+ *
+ * Since: 2.2
+ **/
+gboolean
+g_str_has_prefix (const gchar *str,
+ const gchar *prefix)
+{
+ int str_len;
+ int prefix_len;
+
+ g_return_val_if_fail (str != NULL, FALSE);
+ g_return_val_if_fail (prefix != NULL, FALSE);
+
+ str_len = strlen (str);
+ prefix_len = strlen (prefix);
+
+ if (str_len < prefix_len)
+ return FALSE;
+
+ return strncmp (str, prefix, prefix_len) == 0;
+}
+
+
+/**
+ * g_strip_context:
+ * @msgid: a string
+ * @msgval: another string
+ *
+ * An auxiliary function for gettext() support (see Q_()).
+ *
+ * Return value: @msgval, unless @msgval is identical to @msgid and contains
+ * a '|' character, in which case a pointer to the substring of msgid after
+ * the first '|' character is returned.
+ *
+ * Since: 2.4
+ **/
+G_CONST_RETURN gchar *
+g_strip_context (const gchar *msgid,
+ const gchar *msgval)
+{
+ if (msgval == msgid)
+ {
+ const char *c = strchr (msgid, '|');
+ if (c != NULL)
+ return c + 1;
+ }
+
+ return msgval;
+}
+
+
+/**
+ * g_strv_length:
+ * @str_array: a %NULL-terminated array of strings.
+ *
+ * Returns the length of the given %NULL-terminated
+ * string array @str_array.
+ *
+ * Return value: length of @str_array.
+ *
+ * Since: 2.6
+ **/
+guint
+g_strv_length (gchar **str_array)
+{
+ guint i = 0;
+
+ g_return_val_if_fail (str_array != NULL, 0);
+
+ while (str_array[i])
+ ++i;
+
+ return i;
+}
+
+#define __G_STRFUNCS_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gstrfuncs.h b/trunk/glib/gstrfuncs.h
new file mode 100644
index 000000000..15803beda
--- /dev/null
+++ b/trunk/glib/gstrfuncs.h
@@ -0,0 +1,248 @@
+/* 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 <stdarg.h>
+#include <glib/gtypes.h>
+
+G_BEGIN_DECLS
+
+/* Functions like the ones in <ctype.h> that are not affected by locale. */
+typedef enum {
+ G_ASCII_ALNUM = 1 << 0,
+ G_ASCII_ALPHA = 1 << 1,
+ G_ASCII_CNTRL = 1 << 2,
+ G_ASCII_DIGIT = 1 << 3,
+ G_ASCII_GRAPH = 1 << 4,
+ G_ASCII_LOWER = 1 << 5,
+ G_ASCII_PRINT = 1 << 6,
+ G_ASCII_PUNCT = 1 << 7,
+ G_ASCII_SPACE = 1 << 8,
+ G_ASCII_UPPER = 1 << 9,
+ G_ASCII_XDIGIT = 1 << 10
+} GAsciiType;
+
+GLIB_VAR const guint16 * const g_ascii_table;
+
+#define g_ascii_isalnum(c) \
+ ((g_ascii_table[(guchar) (c)] & G_ASCII_ALNUM) != 0)
+
+#define g_ascii_isalpha(c) \
+ ((g_ascii_table[(guchar) (c)] & G_ASCII_ALPHA) != 0)
+
+#define g_ascii_iscntrl(c) \
+ ((g_ascii_table[(guchar) (c)] & G_ASCII_CNTRL) != 0)
+
+#define g_ascii_isdigit(c) \
+ ((g_ascii_table[(guchar) (c)] & G_ASCII_DIGIT) != 0)
+
+#define g_ascii_isgraph(c) \
+ ((g_ascii_table[(guchar) (c)] & G_ASCII_GRAPH) != 0)
+
+#define g_ascii_islower(c) \
+ ((g_ascii_table[(guchar) (c)] & G_ASCII_LOWER) != 0)
+
+#define g_ascii_isprint(c) \
+ ((g_ascii_table[(guchar) (c)] & G_ASCII_PRINT) != 0)
+
+#define g_ascii_ispunct(c) \
+ ((g_ascii_table[(guchar) (c)] & G_ASCII_PUNCT) != 0)
+
+#define g_ascii_isspace(c) \
+ ((g_ascii_table[(guchar) (c)] & G_ASCII_SPACE) != 0)
+
+#define g_ascii_isupper(c) \
+ ((g_ascii_table[(guchar) (c)] & G_ASCII_UPPER) != 0)
+
+#define g_ascii_isxdigit(c) \
+ ((g_ascii_table[(guchar) (c)] & G_ASCII_XDIGIT) != 0)
+
+gchar g_ascii_tolower (gchar c) G_GNUC_CONST;
+gchar g_ascii_toupper (gchar c) G_GNUC_CONST;
+
+gint g_ascii_digit_value (gchar c) G_GNUC_CONST;
+gint g_ascii_xdigit_value (gchar c) G_GNUC_CONST;
+
+/* 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);
+G_CONST_RETURN gchar* g_strerror (gint errnum) G_GNUC_CONST;
+G_CONST_RETURN gchar* g_strsignal (gint signum) G_GNUC_CONST;
+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);
+
+gboolean g_str_has_suffix (const gchar *str,
+ const gchar *suffix);
+gboolean g_str_has_prefix (const gchar *str,
+ const gchar *prefix);
+
+/* String to/from double conversion functions */
+
+gdouble g_strtod (const gchar *nptr,
+ gchar **endptr);
+gdouble g_ascii_strtod (const gchar *nptr,
+ gchar **endptr);
+guint64 g_ascii_strtoull (const gchar *nptr,
+ gchar **endptr,
+ guint base);
+gint64 g_ascii_strtoll (const gchar *nptr,
+ gchar **endptr,
+ guint base);
+/* 29 bytes should enough for all possible values that
+ * g_ascii_dtostr can produce.
+ * Then add 10 for good measure */
+#define G_ASCII_DTOSTR_BUF_SIZE (29 + 10)
+gchar * g_ascii_dtostr (gchar *buffer,
+ gint buf_len,
+ gdouble d);
+gchar * g_ascii_formatd (gchar *buffer,
+ gint buf_len,
+ const gchar *format,
+ gdouble d);
+
+/* 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))
+
+gint g_ascii_strcasecmp (const gchar *s1,
+ const gchar *s2);
+gint g_ascii_strncasecmp (const gchar *s1,
+ const gchar *s2,
+ gsize n);
+gchar* g_ascii_strdown (const gchar *str,
+ gssize len) G_GNUC_MALLOC;
+gchar* g_ascii_strup (const gchar *str,
+ gssize len) G_GNUC_MALLOC;
+
+#ifndef G_DISABLE_DEPRECATED
+
+/* The following four functions are deprecated and will be removed in
+ * the next major release. They use the locale-specific tolower and
+ * toupper, which is almost never the right thing.
+ */
+
+gint g_strcasecmp (const gchar *s1,
+ const gchar *s2);
+gint g_strncasecmp (const gchar *s1,
+ const gchar *s2,
+ guint n);
+gchar* g_strdown (gchar *string);
+gchar* g_strup (gchar *string);
+
+#endif /* G_DISABLE_DEPRECATED */
+
+/* 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) G_GNUC_MALLOC;
+gchar* g_strdup_printf (const gchar *format,
+ ...) G_GNUC_PRINTF (1, 2) G_GNUC_MALLOC;
+gchar* g_strdup_vprintf (const gchar *format,
+ va_list args) G_GNUC_MALLOC;
+gchar* g_strndup (const gchar *str,
+ gsize n) G_GNUC_MALLOC;
+gchar* g_strnfill (gsize length,
+ gchar fill_char) G_GNUC_MALLOC;
+gchar* g_strconcat (const gchar *string1,
+ ...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED;
+gchar* g_strjoin (const gchar *separator,
+ ...) G_GNUC_MALLOC G_GNUC_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) G_GNUC_MALLOC;
+
+/* 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) G_GNUC_MALLOC;
+
+gpointer g_memdup (gconstpointer mem,
+ guint byte_size) G_GNUC_MALLOC;
+
+/* NULL terminated string arrays.
+ * g_strsplit(), g_strsplit_set() split up string into max_tokens tokens
+ * at delim and return 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
+ * g_strv_length() returns the length of a NULL-terminated array of strings
+ */
+gchar** g_strsplit (const gchar *string,
+ const gchar *delimiter,
+ gint max_tokens) G_GNUC_MALLOC;
+gchar ** g_strsplit_set (const gchar *string,
+ const gchar *delimiters,
+ gint max_tokens) G_GNUC_MALLOC;
+gchar* g_strjoinv (const gchar *separator,
+ gchar **str_array) G_GNUC_MALLOC;
+void g_strfreev (gchar **str_array);
+gchar** g_strdupv (gchar **str_array) G_GNUC_MALLOC;
+guint g_strv_length (gchar **str_array);
+
+gchar* g_stpcpy (gchar *dest,
+ const char *src);
+
+G_CONST_RETURN gchar *g_strip_context (const gchar *msgid,
+ const gchar *msgval);
+
+G_END_DECLS
+
+#endif /* __G_STRFUNCS_H__ */
diff --git a/trunk/glib/gstring.c b/trunk/glib/gstring.c
new file mode 100644
index 000000000..b17bb1be5
--- /dev/null
+++ b/trunk/glib/gstring.c
@@ -0,0 +1,1284 @@
+/* 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 "config.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "glib.h"
+#include "gprintf.h"
+
+#include "galias.h"
+
+struct _GStringChunk
+{
+ GHashTable *const_table;
+ GSList *storage_list;
+ gsize storage_next;
+ gsize this_size;
+ gsize default_size;
+};
+
+/* Hash Functions.
+ */
+
+/**
+ * g_str_equal:
+ * @v1: a key.
+ * @v2: a key to compare with @v1.
+ *
+ * Compares two strings for byte-by-byte equality and returns %TRUE
+ * if they are equal. It can be passed to g_hash_table_new() as the
+ * @key_equal_func parameter, when using strings as keys in a #GHashTable.
+ *
+ * Returns: %TRUE if the two keys match.
+ */
+gboolean
+g_str_equal (gconstpointer v1,
+ gconstpointer v2)
+{
+ const gchar *string1 = v1;
+ const gchar *string2 = v2;
+
+ return strcmp (string1, string2) == 0;
+}
+
+/**
+ * g_str_hash:
+ * @v: a string key.
+ *
+ * Converts a string to a hash value.
+ * It can be passed to g_hash_table_new() as the @hash_func parameter,
+ * when using strings as keys in a #GHashTable.
+ *
+ * Returns: a hash value corresponding to the key.
+ */
+guint
+g_str_hash (gconstpointer v)
+{
+ /* 31 bit hash function */
+ const signed char *p = v;
+ guint32 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.
+ */
+
+/**
+ * g_string_chunk_new:
+ * @size: the default size of the blocks of memory which are
+ * allocated to store the strings. If a particular string
+ * is larger than this default size, a larger block of
+ * memory will be allocated for it.
+ *
+ * Creates a new #GStringChunk.
+ *
+ * Returns: a new #GStringChunk
+ */
+GStringChunk*
+g_string_chunk_new (gsize size)
+{
+ GStringChunk *new_chunk = g_new (GStringChunk, 1);
+ gsize actual_size = 1;
+
+ actual_size = nearest_power (1, size);
+
+ new_chunk->const_table = NULL;
+ new_chunk->storage_list = NULL;
+ new_chunk->storage_next = actual_size;
+ new_chunk->default_size = actual_size;
+ new_chunk->this_size = actual_size;
+
+ return new_chunk;
+}
+
+/**
+ * g_string_chunk_free:
+ * @chunk: a #GStringChunk
+ *
+ * Frees all memory allocated by the #GStringChunk.
+ * After calling g_string_chunk_free() it is not safe to
+ * access any of the strings which were contained within it.
+ */
+void
+g_string_chunk_free (GStringChunk *chunk)
+{
+ 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);
+}
+
+/**
+ * g_string_chunk_clear:
+ * @chunk: a #GStringChunk
+ *
+ * Frees all strings contained within the #GStringChunk.
+ * After calling g_string_chunk_clear() it is not safe to
+ * access any of the strings which were contained within it.
+ *
+ * Since: 2.14
+ */
+void
+g_string_chunk_clear (GStringChunk *chunk)
+{
+ 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);
+
+ chunk->storage_list = NULL;
+ chunk->storage_next = chunk->default_size;
+ chunk->this_size = chunk->default_size;
+ }
+
+ if (chunk->const_table)
+ g_hash_table_remove_all (chunk->const_table);
+}
+
+/**
+ * g_string_chunk_insert:
+ * @chunk: a #GStringChunk
+ * @string: the string to add
+ *
+ * Adds a copy of @string to the #GStringChunk.
+ * It returns a pointer to the new copy of the string
+ * in the #GStringChunk. The characters in the string
+ * can be changed, if necessary, though you should not
+ * change anything after the end of the string.
+ *
+ * Unlike g_string_chunk_insert_const(), this function
+ * does not check for duplicates. Also strings added
+ * with g_string_chunk_insert() will not be searched
+ * by g_string_chunk_insert_const() when looking for
+ * duplicates.
+ *
+ * Returns: a pointer to the copy of @string within
+ * the #GStringChunk.
+ */
+gchar*
+g_string_chunk_insert (GStringChunk *chunk,
+ const gchar *string)
+{
+ g_return_val_if_fail (chunk != NULL, NULL);
+
+ return g_string_chunk_insert_len (chunk, string, -1);
+}
+
+/**
+ * g_string_chunk_insert_const:
+ * @chunk: a #GStringChunk
+ * @string: the string to add
+ *
+ * Adds a copy of @string to the #GStringChunk, unless
+ * the same string has already been added to the #GStringChunk
+ * with g_string_chunk_insert_const().
+ *
+ * This function is useful if you need to copy a large number
+ * of strings but do not want to waste space storing duplicates.
+ * But you must remember that there may be several pointers to
+ * the same string, and so any changes made to the strings
+ * should be done very carefully.
+ *
+ * Note that g_string_chunk_insert_const() will not return a
+ * pointer to a string added with g_string_chunk_insert(), even
+ * if they do match.
+ *
+ * Returns: a pointer to the new or existing copy of @string
+ * within the #GStringChunk
+ */
+gchar*
+g_string_chunk_insert_const (GStringChunk *chunk,
+ const gchar *string)
+{
+ 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 (chunk, string);
+ g_hash_table_insert (chunk->const_table, lookup, lookup);
+ }
+
+ return lookup;
+}
+
+/**
+ * g_string_chunk_insert_len:
+ * @chunk: a #GStringChunk
+ * @string: bytes to insert
+ * @len: number of bytes of @string to insert, or -1 to insert a
+ * nul-terminated string.
+ *
+ * Adds a copy of the first @len bytes of @string to the #GStringChunk. The
+ * copy is nul-terminated.
+ *
+ * Since this function does not stop at nul bytes, it is the caller's
+ * responsibility to ensure that @string has at least @len addressable bytes.
+ *
+ * The characters in the returned string can be changed, if necessary, though
+ * you should not change anything after the end of the string.
+ *
+ * Return value: a pointer to the copy of @string within the #GStringChunk
+ *
+ * Since: 2.4
+ **/
+gchar*
+g_string_chunk_insert_len (GStringChunk *chunk,
+ const gchar *string,
+ gssize len)
+{
+ gssize size;
+ gchar* pos;
+
+ g_return_val_if_fail (chunk != NULL, NULL);
+
+ if (len < 0)
+ size = strlen (string);
+ else
+ size = len;
+
+ if ((chunk->storage_next + size + 1) > chunk->this_size)
+ {
+ gsize new_size = nearest_power (chunk->default_size, size + 1);
+
+ chunk->storage_list = g_slist_prepend (chunk->storage_list,
+ g_new (gchar, new_size));
+
+ chunk->this_size = new_size;
+ chunk->storage_next = 0;
+ }
+
+ pos = ((gchar *) chunk->storage_list->data) + chunk->storage_next;
+
+ *(pos + size) = '\0';
+
+ strncpy (pos, string, size);
+ if (len > 0)
+ size = strlen (pos);
+
+ chunk->storage_next += size + 1;
+
+ return pos;
+}
+
+/* Strings.
+ */
+static void
+g_string_maybe_expand (GString* string,
+ gsize len)
+{
+ if (string->len + len >= string->allocated_len)
+ {
+ string->allocated_len = nearest_power (1, string->len + len + 1);
+ string->str = g_realloc (string->str, string->allocated_len);
+ }
+}
+
+/**
+ * g_string_sized_new:
+ * @dfl_size: the default size of the space allocated to
+ * hold the string.
+ *
+ * Creates a new #GString, with enough space for @dfl_size
+ * bytes. This is useful if you are going to add a lot of
+ * text to the string and don't want it to be reallocated
+ * too often.
+ *
+ * Returns: the new #GString.
+ */
+GString*
+g_string_sized_new (gsize dfl_size)
+{
+ GString *string = g_slice_new (GString);
+
+ string->allocated_len = 0;
+ string->len = 0;
+ string->str = NULL;
+
+ g_string_maybe_expand (string, MAX (dfl_size, 2));
+ string->str[0] = 0;
+
+ return string;
+}
+
+/**
+ * g_string_new:
+ * @init: the initial text to copy into the string.
+ *
+ * Creates a new #GString, initialized with the given string.
+ *
+ * Returns: the new #GString.
+ */
+GString*
+g_string_new (const gchar *init)
+{
+ GString *string;
+
+ if (init == NULL || *init == '\0')
+ string = g_string_sized_new (2);
+ else
+ {
+ gint len;
+
+ len = strlen (init);
+ string = g_string_sized_new (len + 2);
+
+ g_string_append_len (string, init, len);
+ }
+
+ return string;
+}
+
+/**
+ * g_string_new_len:
+ * @init: initial contents of string.
+ * @len: length of @init to use.
+ *
+ * Creates a new #GString with @len bytes of the
+ * @init buffer. Because a length is provided, @init
+ * need not be nul-terminated, and can contain embedded
+ * nul bytes.
+ *
+ * Since this function does not stop at nul bytes, it is the caller's
+ * responsibility to ensure that @init has at least @len addressable bytes.
+ *
+ * Returns: a new #GString.
+ */
+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;
+ }
+}
+
+/**
+ * g_string_free:
+ * @string: a #GString
+ * @free_segment: if %TRUE the actual character data is freed as well
+ *
+ * Frees the memory allocated for the #GString.
+ * If @free_segment is %TRUE it also frees the character data.
+ *
+ * Returns: the character data of @string
+ * (i.e. %NULL if @free_segment is %TRUE)
+ */
+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_slice_free (GString, string);
+
+ return segment;
+}
+
+/**
+ * g_string_equal:
+ * @v: a #GString
+ * @v2: another #GString
+ *
+ * Compares two strings for equality, returning %TRUE if they are equal.
+ * For use with #GHashTable.
+ *
+ * Returns: %TRUE if they strings are the same
+ * length and contain the same bytes.
+ */
+gboolean
+g_string_equal (const GString *v,
+ const GString *v2)
+{
+ gchar *p, *q;
+ GString *string1 = (GString *) v;
+ GString *string2 = (GString *) 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;
+}
+
+/**
+ * g_string_hash:
+ * @str: a string to hash
+ *
+ * Creates a hash code for @str; for use with #GHashTable.
+ *
+ * Returns: hash code for @str
+ */
+/* 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;
+}
+
+/**
+ * g_string_assign:
+ * @string: the destination #GString. Its current contents
+ * are destroyed.
+ * @rval: the string to copy into @string
+ *
+ * Copies the bytes from a string into a #GString,
+ * destroying any previous contents. It is rather like
+ * the standard strcpy() function, except that you do not
+ * have to worry about having enough space to copy the string.
+ *
+ * Returns: the destination #GString.
+ */
+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);
+
+ /* Make sure assigning to itself doesn't corrupt the string. */
+ if (string->str != rval)
+ {
+ /* Assigning from substring should be ok since g_string_truncate
+ does not realloc. */
+ g_string_truncate (string, 0);
+ g_string_append (string, rval);
+ }
+
+ return string;
+}
+
+/**
+ * g_string_truncate:
+ * @string: a #GString
+ * @len: the new size of the #GString
+ *
+ * Cuts off the end of the GString, leaving the first @len bytes.
+ *
+ * Returns: the #GString
+ */
+GString*
+g_string_truncate (GString *string,
+ gsize len)
+{
+ g_return_val_if_fail (string != NULL, NULL);
+
+ string->len = MIN (len, string->len);
+ string->str[string->len] = 0;
+
+ return string;
+}
+
+/**
+ * g_string_set_size:
+ * @string: a #GString
+ * @len: the new length
+ *
+ * Sets the length of a #GString. If the length is less than
+ * the current length, the string will be truncated. If the
+ * length is greater than the current length, the contents
+ * of the newly added area are undefined. (However, as
+ * always, string->str[string->len] will be a nul byte.)
+ *
+ * Return value: @string
+ **/
+GString*
+g_string_set_size (GString *string,
+ gsize len)
+{
+ g_return_val_if_fail (string != NULL, NULL);
+
+ if (len >= string->allocated_len)
+ g_string_maybe_expand (string, len - string->len);
+
+ string->len = len;
+ string->str[len] = 0;
+
+ return string;
+}
+
+/**
+ * g_string_insert_len:
+ * @string: a #GString
+ * @pos: position in @string where insertion should
+ * happen, or -1 for at the end
+ * @val: bytes to insert
+ * @len: number of bytes of @val to insert
+ *
+ * Inserts @len bytes of @val into @string at @pos.
+ * Because @len is provided, @val may contain embedded
+ * nuls and need not be nul-terminated. If @pos is -1,
+ * bytes are inserted at the end of the string.
+ *
+ * Since this function does not stop at nul bytes, it is the caller's
+ * responsibility to ensure that @val has at least @len addressable bytes.
+ *
+ * Returns: the #GString
+ */
+GString*
+g_string_insert_len (GString *string,
+ gssize pos,
+ const gchar *val,
+ gssize len)
+{
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (val != NULL, string);
+
+ if (len < 0)
+ len = strlen (val);
+
+ if (pos < 0)
+ pos = string->len;
+ else
+ g_return_val_if_fail (pos <= string->len, string);
+
+ /* Check whether val represents a substring of string. This test
+ probably violates chapter and verse of the C standards, since
+ ">=" and "<=" are only valid when val really is a substring.
+ In practice, it will work on modern archs. */
+ if (val >= string->str && val <= string->str + string->len)
+ {
+ gsize offset = val - string->str;
+ gsize precount = 0;
+
+ g_string_maybe_expand (string, len);
+ val = string->str + offset;
+ /* At this point, val is valid again. */
+
+ /* Open up space where we are going to insert. */
+ if (pos < string->len)
+ g_memmove (string->str + pos + len, string->str + pos, string->len - pos);
+
+ /* Move the source part before the gap, if any. */
+ if (offset < pos)
+ {
+ precount = MIN (len, pos - offset);
+ memcpy (string->str + pos, val, precount);
+ }
+
+ /* Move the source part after the gap, if any. */
+ if (len > precount)
+ memcpy (string->str + pos + precount,
+ val + /* Already moved: */ precount + /* Space opened up: */ len,
+ len - precount);
+ }
+ else
+ {
+ 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 */
+ if (len == 1)
+ string->str[pos] = *val;
+ else
+ memcpy (string->str + pos, val, len);
+ }
+
+ string->len += len;
+
+ string->str[string->len] = 0;
+
+ return string;
+}
+
+/**
+ * g_string_append:
+ * @string: a #GString.
+ * @val: the string to append onto the end of the #GString.
+ *
+ * Adds a string onto the end of a #GString, expanding it if necessary.
+ *
+ * Returns: the #GString.
+ */
+GString*
+g_string_append (GString *string,
+ const gchar *val)
+{
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (val != NULL, string);
+
+ return g_string_insert_len (string, -1, val, -1);
+}
+
+/**
+ * g_string_append_len:
+ * @string: a #GString
+ * @val: bytes to append
+ * @len: number of bytes of @val to use.
+ *
+ * Appends @len bytes of @val to @string.
+ * Because @len is provided, @val may contain
+ * embedded nuls and need not be nul-terminated.
+ *
+ * Since this function does not stop at nul bytes, it is the caller's
+ * responsibility to ensure that @val has at least @len addressable bytes.
+ *
+ * Returns: the #GString
+ */
+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);
+}
+
+/**
+ * g_string_append_c:
+ * @string: a #GString.
+ * @c: the byte to append onto the end of the #GString.
+ *
+ * Adds a byte onto the end of a #GString, expanding it if necessary.
+ *
+ * Returns: the #GString.
+ */
+#undef g_string_append_c
+GString*
+g_string_append_c (GString *string,
+ gchar c)
+{
+ g_return_val_if_fail (string != NULL, NULL);
+
+ return g_string_insert_c (string, -1, c);
+}
+
+/**
+ * g_string_append_unichar:
+ * @string: a #GString
+ * @wc: a Unicode character
+ *
+ * Converts a Unicode character into UTF-8, and appends it
+ * to the string.
+ *
+ * Return value: @string
+ **/
+GString*
+g_string_append_unichar (GString *string,
+ gunichar wc)
+{
+ g_return_val_if_fail (string != NULL, NULL);
+
+ return g_string_insert_unichar (string, -1, wc);
+}
+
+/**
+ * g_string_prepend:
+ * @string: a #GString
+ * @val: the string to prepend on the start of the #GString
+ *
+ * Adds a string on to the start of a #GString,
+ * expanding it if necessary.
+ *
+ * Returns: the #GString
+ */
+GString*
+g_string_prepend (GString *string,
+ const gchar *val)
+{
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (val != NULL, string);
+
+ return g_string_insert_len (string, 0, val, -1);
+}
+
+/**
+ * g_string_prepend_len:
+ * @string: a #GString
+ * @val: bytes to prepend
+ * @len: number of bytes in @val to prepend
+ *
+ * Prepends @len bytes of @val to @string.
+ * Because @len is provided, @val may contain
+ * embedded nuls and need not be nul-terminated.
+ *
+ * Since this function does not stop at nul bytes, it is the caller's
+ * responsibility to ensure that @val has at least @len addressable bytes.
+ *
+ * Returns: the #GString passed in
+ */
+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);
+}
+
+/**
+ * g_string_prepend_c:
+ * @string: a #GString
+ * @c: the byte to prepend on the start of the #GString
+ *
+ * Adds a byte onto the start of a #GString,
+ * expanding it if necessary.
+ *
+ * Returns: the #GString
+ */
+GString*
+g_string_prepend_c (GString *string,
+ gchar c)
+{
+ g_return_val_if_fail (string != NULL, NULL);
+
+ return g_string_insert_c (string, 0, c);
+}
+
+/**
+ * g_string_prepend_unichar:
+ * @string: a #GString.
+ * @wc: a Unicode character.
+ *
+ * Converts a Unicode character into UTF-8, and prepends it
+ * to the string.
+ *
+ * Return value: @string.
+ **/
+GString*
+g_string_prepend_unichar (GString *string,
+ gunichar wc)
+{
+ g_return_val_if_fail (string != NULL, NULL);
+
+ return g_string_insert_unichar (string, 0, wc);
+}
+
+/**
+ * g_string_insert:
+ * @string: a #GString
+ * @pos: the position to insert the copy of the string
+ * @val: the string to insert
+ *
+ * Inserts a copy of a string into a #GString,
+ * expanding it if necessary.
+ *
+ * Returns: the #GString
+ */
+GString*
+g_string_insert (GString *string,
+ gssize pos,
+ const gchar *val)
+{
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (val != NULL, string);
+ if (pos >= 0)
+ g_return_val_if_fail (pos <= string->len, string);
+
+ return g_string_insert_len (string, pos, val, -1);
+}
+
+/**
+ * g_string_insert_c:
+ * @string: a #GString
+ * @pos: the position to insert the byte
+ * @c: the byte to insert
+ *
+ * Inserts a byte into a #GString, expanding it if necessary.
+ *
+ * Returns: the #GString
+ */
+GString*
+g_string_insert_c (GString *string,
+ gssize pos,
+ gchar c)
+{
+ 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, string);
+
+ /* 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 string;
+}
+
+/**
+ * g_string_insert_unichar:
+ * @string: a #GString
+ * @pos: the position at which to insert character, or -1 to
+ * append at the end of the string.
+ * @wc: a Unicode character
+ *
+ * Converts a Unicode character into UTF-8, and insert it
+ * into the string at the given position.
+ *
+ * Return value: @string
+ **/
+GString*
+g_string_insert_unichar (GString *string,
+ gssize pos,
+ gunichar wc)
+{
+ gint charlen, first, i;
+ gchar *dest;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ /* Code copied from g_unichar_to_utf() */
+ if (wc < 0x80)
+ {
+ first = 0;
+ charlen = 1;
+ }
+ else if (wc < 0x800)
+ {
+ first = 0xc0;
+ charlen = 2;
+ }
+ else if (wc < 0x10000)
+ {
+ first = 0xe0;
+ charlen = 3;
+ }
+ else if (wc < 0x200000)
+ {
+ first = 0xf0;
+ charlen = 4;
+ }
+ else if (wc < 0x4000000)
+ {
+ first = 0xf8;
+ charlen = 5;
+ }
+ else
+ {
+ first = 0xfc;
+ charlen = 6;
+ }
+ /* End of copied code */
+
+ g_string_maybe_expand (string, charlen);
+
+ if (pos < 0)
+ pos = string->len;
+ else
+ g_return_val_if_fail (pos <= string->len, string);
+
+ /* If not just an append, move the old stuff */
+ if (pos < string->len)
+ g_memmove (string->str + pos + charlen, string->str + pos, string->len - pos);
+
+ dest = string->str + pos;
+ /* Code copied from g_unichar_to_utf() */
+ for (i = charlen - 1; i > 0; --i)
+ {
+ dest[i] = (wc & 0x3f) | 0x80;
+ wc >>= 6;
+ }
+ dest[0] = wc | first;
+ /* End of copied code */
+
+ string->len += charlen;
+
+ string->str[string->len] = 0;
+
+ return string;
+}
+
+/**
+ * g_string_erase:
+ * @string: a #GString
+ * @pos: the position of the content to remove
+ * @len: the number of bytes to remove, or -1 to remove all
+ * following bytes
+ *
+ * Removes @len bytes from a #GString, starting at position @pos.
+ * The rest of the #GString is shifted down to fill the gap.
+ *
+ * Returns: the #GString
+ */
+GString*
+g_string_erase (GString *string,
+ gssize pos,
+ gssize len)
+{
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (pos >= 0, string);
+ g_return_val_if_fail (pos <= string->len, string);
+
+ if (len < 0)
+ len = string->len - pos;
+ else
+ {
+ g_return_val_if_fail (pos + len <= string->len, string);
+
+ 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 string;
+}
+
+/**
+ * g_string_ascii_down:
+ * @string: a GString
+ *
+ * Converts all upper case ASCII letters to lower case ASCII letters.
+ *
+ * Return value: passed-in @string pointer, with all the upper case
+ * characters converted to lower case in place, with
+ * semantics that exactly match g_ascii_tolower.
+ **/
+GString*
+g_string_ascii_down (GString *string)
+{
+ gchar *s;
+ gint n;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ n = string->len;
+ s = string->str;
+
+ while (n)
+ {
+ *s = g_ascii_tolower (*s);
+ s++;
+ n--;
+ }
+
+ return string;
+}
+
+/**
+ * g_string_ascii_up:
+ * @string: a GString
+ *
+ * Converts all lower case ASCII letters to upper case ASCII letters.
+ *
+ * Return value: passed-in @string pointer, with all the lower case
+ * characters converted to upper case in place, with
+ * semantics that exactly match g_ascii_toupper.
+ **/
+GString*
+g_string_ascii_up (GString *string)
+{
+ gchar *s;
+ gint n;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ n = string->len;
+ s = string->str;
+
+ while (n)
+ {
+ *s = g_ascii_toupper (*s);
+ s++;
+ n--;
+ }
+
+ return string;
+}
+
+/**
+ * g_string_down:
+ * @string: a #GString
+ *
+ * Converts a #GString to lowercase.
+ *
+ * Returns: the #GString.
+ *
+ * Deprecated:2.2: This function uses the locale-specific tolower() function,
+ * which is almost never the right thing. Use g_string_ascii_down() or
+ * g_utf8_strdown() instead.
+ */
+GString*
+g_string_down (GString *string)
+{
+ guchar *s;
+ glong n;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ n = string->len;
+ s = (guchar *) string->str;
+
+ while (n)
+ {
+ if (isupper (*s))
+ *s = tolower (*s);
+ s++;
+ n--;
+ }
+
+ return string;
+}
+
+/**
+ * g_string_up:
+ * @string: a #GString
+ *
+ * Converts a #GString to uppercase.
+ *
+ * Return value: the #GString
+ *
+ * Deprecated:2.2: This function uses the locale-specific toupper() function,
+ * which is almost never the right thing. Use g_string_ascii_up() or
+ * g_utf8_strup() instead.
+ **/
+GString*
+g_string_up (GString *string)
+{
+ guchar *s;
+ glong n;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ n = string->len;
+ s = (guchar *) string->str;
+
+ while (n)
+ {
+ if (islower (*s))
+ *s = toupper (*s);
+ s++;
+ n--;
+ }
+
+ return string;
+}
+
+static void
+g_string_append_printf_internal (GString *string,
+ const gchar *fmt,
+ va_list args)
+{
+ gchar *buffer;
+ gint length;
+
+ length = g_vasprintf (&buffer, fmt, args);
+ g_string_append_len (string, buffer, length);
+ g_free (buffer);
+}
+
+/**
+ * g_string_sprintf:
+ * @string: a #GString.
+ * @format: the string format. See the sprintf() documentation.
+ * @Varargs: the parameters to insert into the format string.
+ *
+ * Writes a formatted string into a #GString.
+ * This is similar to the standard sprintf() function,
+ * except that the #GString buffer automatically expands
+ * to contain the results. The previous contents of the
+ * #GString are destroyed.
+ *
+ * Deprecated: This function has been renamed to g_string_printf().
+ */
+
+/**
+ * g_string_printf:
+ * @string: a #GString.
+ * @format: the string format. See the printf() documentation.
+ * @Varargs: the parameters to insert into the format string.
+ *
+ * Writes a formatted string into a #GString.
+ * This is similar to the standard sprintf() function,
+ * except that the #GString buffer automatically expands
+ * to contain the results. The previous contents of the
+ * #GString are destroyed.
+ */
+void
+g_string_printf (GString *string,
+ const gchar *fmt,
+ ...)
+{
+ va_list args;
+
+ g_string_truncate (string, 0);
+
+ va_start (args, fmt);
+ g_string_append_printf_internal (string, fmt, args);
+ va_end (args);
+}
+
+/**
+ * g_string_sprintfa:
+ * @string: a #GString.
+ * @format: the string format. See the sprintf() documentation.
+ * @Varargs: the parameters to insert into the format string.
+ *
+ * Appends a formatted string onto the end of a #GString.
+ * This function is is similar to g_string_sprintf() except that
+ * the text is appended to the #GString.
+ *
+ * Deprecated: This function has been renamed to
+ * g_string_append_printf().
+ */
+
+/**
+ * g_string_append_printf:
+ * @string: a #GString.
+ * @format: the string format. See the printf() documentation.
+ * @Varargs: the parameters to insert into the format string.
+ *
+ * Appends a formatted string onto the end of a #GString.
+ * This function is is similar to g_string_printf() except
+ * that the text is appended to the #GString.
+ */
+void
+g_string_append_printf (GString *string,
+ const gchar *fmt,
+ ...)
+{
+ va_list args;
+
+ va_start (args, fmt);
+ g_string_append_printf_internal (string, fmt, args);
+ va_end (args);
+}
+
+#define __G_STRING_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gstring.h b/trunk/glib/gstring.h
new file mode 100644
index 000000000..7c6a713b0
--- /dev/null
+++ b/trunk/glib/gstring.h
@@ -0,0 +1,158 @@
+/* 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 <glib/gtypes.h>
+#include <glib/gunicode.h>
+#include <glib/gutils.h> /* for G_CAN_INLINE */
+
+G_BEGIN_DECLS
+
+typedef struct _GString GString;
+typedef struct _GStringChunk GStringChunk;
+
+struct _GString
+{
+ gchar *str;
+ gsize len;
+ gsize allocated_len;
+};
+
+/* String Chunks
+ */
+GStringChunk* g_string_chunk_new (gsize size);
+void g_string_chunk_free (GStringChunk *chunk);
+void g_string_chunk_clear (GStringChunk *chunk);
+gchar* g_string_chunk_insert (GStringChunk *chunk,
+ const gchar *string);
+gchar* g_string_chunk_insert_len (GStringChunk *chunk,
+ const gchar *string,
+ gssize len);
+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_set_size (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_append_unichar (GString *string,
+ gunichar wc);
+GString* g_string_prepend (GString *string,
+ const gchar *val);
+GString* g_string_prepend_c (GString *string,
+ gchar c);
+GString* g_string_prepend_unichar (GString *string,
+ gunichar wc);
+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_insert_unichar (GString *string,
+ gssize pos,
+ gunichar wc);
+GString* g_string_erase (GString *string,
+ gssize pos,
+ gssize len);
+GString* g_string_ascii_down (GString *string);
+GString* g_string_ascii_up (GString *string);
+void g_string_printf (GString *string,
+ const gchar *format,
+ ...) G_GNUC_PRINTF (2, 3);
+void g_string_append_printf (GString *string,
+ const gchar *format,
+ ...) G_GNUC_PRINTF (2, 3);
+
+/* -- optimize g_strig_append_c --- */
+#ifdef G_CAN_INLINE
+static inline GString*
+g_string_append_c_inline (GString *gstring,
+ gchar c)
+{
+ if (gstring->len + 1 < gstring->allocated_len)
+ {
+ gstring->str[gstring->len++] = c;
+ gstring->str[gstring->len] = 0;
+ }
+ else
+ g_string_insert_c (gstring, -1, c);
+ return gstring;
+}
+#define g_string_append_c(gstr,c) g_string_append_c_inline (gstr, c)
+#endif /* G_CAN_INLINE */
+
+
+#ifndef G_DISABLE_DEPRECATED
+
+/* The following two functions are deprecated and will be removed in
+ * the next major release. They use the locale-specific tolower and
+ * toupper, which is almost never the right thing.
+ */
+
+GString* g_string_down (GString *string);
+GString* g_string_up (GString *string);
+
+/* These aliases are included for compatibility. */
+#define g_string_sprintf g_string_printf
+#define g_string_sprintfa g_string_append_printf
+
+#endif /* G_DISABLE_DEPRECATED */
+
+G_END_DECLS
+
+#endif /* __G_STRING_H__ */
+
diff --git a/trunk/glib/gthread.c b/trunk/glib/gthread.c
new file mode 100644
index 000000000..81df421af
--- /dev/null
+++ b/trunk/glib/gthread.c
@@ -0,0 +1,931 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * gthread.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"
+#include "gthreadprivate.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifndef G_OS_WIN32
+#include <sys/time.h>
+#include <time.h>
+#else
+#include <windows.h>
+#endif /* G_OS_WIN32 */
+
+#include <string.h>
+
+#include "galias.h"
+
+GQuark
+g_thread_error_quark (void)
+{
+ return g_quark_from_static_string ("g_thread_error");
+}
+
+/* Keep this in sync with GRealThread in gmain.c! */
+typedef struct _GRealThread GRealThread;
+struct _GRealThread
+{
+ GThread thread;
+ gpointer private_data;
+ GRealThread *next;
+ gpointer retval;
+ GSystemThread system_thread;
+};
+
+typedef struct _GStaticPrivateNode GStaticPrivateNode;
+struct _GStaticPrivateNode
+{
+ gpointer data;
+ GDestroyNotify destroy;
+};
+
+static void g_thread_cleanup (gpointer data);
+static void g_thread_fail (void);
+static guint64 gettime (void);
+
+guint64 (*g_thread_gettime) (void) = gettime;
+
+/* 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;
+
+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 */
+ NULL /* thread_equal */
+};
+
+/* Local data */
+
+static GMutex *g_once_mutex = NULL;
+static GCond *g_once_cond = NULL;
+static GPrivate *g_thread_specific_private = NULL;
+static GRealThread *g_thread_all_threads = NULL;
+static GSList *g_thread_free_indeces = NULL;
+
+G_LOCK_DEFINE_STATIC (g_thread);
+
+#ifdef G_THREADS_ENABLED
+/* This must be called only once, before any threads are created.
+ * It will only be called from g_thread_init() in -lgthread.
+ */
+void
+g_thread_init_glib (void)
+{
+ /* We let the main thread (the one that calls g_thread_init) inherit
+ * the static_private data set before calling g_thread_init
+ */
+ GRealThread* main_thread = (GRealThread*) g_thread_self ();
+
+ /* mutex and cond creation works without g_threads_got_initialized */
+ g_once_mutex = g_mutex_new ();
+ g_once_cond = g_cond_new ();
+
+ /* we may only create mutex and cond in here */
+ _g_mem_thread_init_noprivate_nomessage ();
+
+ /* setup the basic threading system */
+ g_threads_got_initialized = TRUE;
+ g_thread_specific_private = g_private_new (g_thread_cleanup);
+ g_private_set (g_thread_specific_private, main_thread);
+ G_THREAD_UF (thread_self, (&main_thread->system_thread));
+
+ /* complete memory system initialization, g_private_*() works now */
+ _g_slice_thread_init_nomessage ();
+
+ /* accomplish log system initialization to enable messaging */
+ _g_messages_thread_init_nomessage ();
+
+ /* we may run full-fledged initializers from here */
+ _g_atomic_thread_init ();
+ _g_convert_thread_init ();
+ _g_rand_thread_init ();
+ _g_main_thread_init ();
+ _g_utils_thread_init ();
+#ifdef G_OS_WIN32
+ _g_win32_thread_init ();
+#endif
+}
+#endif /* G_THREADS_ENABLED */
+
+gpointer
+g_once_impl (GOnce *once,
+ GThreadFunc func,
+ gpointer arg)
+{
+ g_mutex_lock (g_once_mutex);
+
+ while (once->status == G_ONCE_STATUS_PROGRESS)
+ g_cond_wait (g_once_cond, g_once_mutex);
+
+ if (once->status != G_ONCE_STATUS_READY)
+ {
+ once->status = G_ONCE_STATUS_PROGRESS;
+ g_mutex_unlock (g_once_mutex);
+
+ once->retval = func (arg);
+
+ g_mutex_lock (g_once_mutex);
+ once->status = G_ONCE_STATUS_READY;
+ g_cond_broadcast (g_once_cond);
+ }
+
+ g_mutex_unlock (g_once_mutex);
+
+ return once->retval;
+}
+
+void
+g_static_mutex_init (GStaticMutex *mutex)
+{
+ static const 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_once_mutex);
+
+ g_mutex_lock (g_once_mutex);
+
+ if (!(*mutex))
+ g_atomic_pointer_set (mutex, g_mutex_new());
+
+ g_mutex_unlock (g_once_mutex);
+
+ 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 const 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;
+
+ if (depth == 0)
+ 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)
+{
+ guint 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;
+ GRealThread *thread;
+
+ if (!index)
+ return;
+
+ private_key->index = 0;
+
+ G_LOCK (g_thread);
+
+ thread = g_thread_all_threads;
+ while (thread)
+ {
+ GArray *array = thread->private_data;
+ thread = thread->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);
+}
+
+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);
+ }
+
+ /* 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)
+ {
+ GRealThread *t, *p;
+
+ G_LOCK (g_thread);
+ for (t = g_thread_all_threads, p = NULL; t; p = t, t = t->next)
+ {
+ if (t == thread)
+ {
+ if (p)
+ p->next = t->next;
+ else
+ g_thread_all_threads = t->next;
+ break;
+ }
+ }
+ 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.");
+}
+
+#define G_NSEC_PER_SEC 1000000000
+
+static guint64
+gettime (void)
+{
+#ifdef G_OS_WIN32
+ guint64 v;
+
+ /* Returns 100s of nanoseconds since start of 1601 */
+ GetSystemTimeAsFileTime ((FILETIME *)&v);
+
+ /* Offset to Unix epoch */
+ v -= G_GINT64_CONSTANT (116444736000000000);
+ /* Convert to nanoseconds */
+ v *= 100;
+
+ return v;
+#else
+ struct timeval tv;
+
+ gettimeofday (&tv, NULL);
+
+ return (guint64) tv.tv_sec * G_NSEC_PER_SEC + tv.tv_usec * (G_NSEC_PER_SEC / G_USEC_PER_SEC);
+#endif
+}
+
+static gpointer
+g_thread_create_proxy (gpointer data)
+{
+ GRealThread* thread = data;
+
+ g_assert (data);
+
+ /* 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);
+
+ 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;
+ 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 = g_new0 (GRealThread, 1);
+
+ result->thread.joinable = joinable;
+ result->thread.priority = priority;
+ result->thread.func = func;
+ result->thread.data = data;
+ result->private_data = 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));
+ result->next = g_thread_all_threads;
+ 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;
+ GRealThread *p, *t;
+ 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);
+ for (t = g_thread_all_threads, p = NULL; t; p = t, t = t->next)
+ {
+ if (t == (GRealThread*) thread)
+ {
+ if (p)
+ p->next = t->next;
+ else
+ g_thread_all_threads = t->next;
+ break;
+ }
+ }
+ 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;
+
+ 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_new0 (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;
+
+ if (g_thread_supported ())
+ G_THREAD_UF (thread_self, (&thread->system_thread));
+
+ g_private_set (g_thread_specific_private, thread);
+
+ G_LOCK (g_thread);
+ thread->next = g_thread_all_threads;
+ g_thread_all_threads = thread;
+ G_UNLOCK (g_thread);
+ }
+
+ return (GThread*)thread;
+}
+
+void
+g_static_rw_lock_init (GStaticRWLock* lock)
+{
+ static const GStaticRWLock init_lock = G_STATIC_RW_LOCK_INIT;
+
+ g_return_if_fail (lock);
+
+ *lock = init_lock;
+}
+
+inline static void
+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));
+}
+
+inline static void
+g_static_rw_lock_signal (GStaticRWLock* lock)
+{
+ if (lock->want_to_write && lock->write_cond)
+ g_cond_signal (lock->write_cond);
+ else if (lock->want_to_read && 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);
+ lock->want_to_read++;
+ while (lock->have_writer || lock->want_to_write)
+ g_static_rw_lock_wait (&lock->read_cond, &lock->mutex);
+ lock->want_to_read--;
+ 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->have_writer && !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->have_writer || lock->read_counter)
+ g_static_rw_lock_wait (&lock->write_cond, &lock->mutex);
+ lock->want_to_write--;
+ lock->have_writer = 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->have_writer && !lock->read_counter)
+ {
+ lock->have_writer = 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->have_writer = 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);
+}
+
+/**
+ * g_thread_foreach
+ * @thread_func: function to call for all GThread structures
+ * @user_data: second argument to @thread_func
+ *
+ * Call @thread_func on all existing #GThread structures. Note that
+ * threads may decide to exit while @thread_func is running, so
+ * without intimate knowledge about the lifetime of foreign threads,
+ * @thread_func shouldn't access the GThread* pointer passed in as
+ * first argument. However, @thread_func will not be called for threads
+ * which are known to have exited already.
+ *
+ * Due to thread lifetime checks, this function has an execution complexity
+ * which is quadratic in the number of existing threads.
+ *
+ * Since: 2.10
+ */
+void
+g_thread_foreach (GFunc thread_func,
+ gpointer user_data)
+{
+ GSList *slist = NULL;
+ GRealThread *thread;
+ g_return_if_fail (thread_func != NULL);
+ /* snapshot the list of threads for iteration */
+ G_LOCK (g_thread);
+ for (thread = g_thread_all_threads; thread; thread = thread->next)
+ slist = g_slist_prepend (slist, thread);
+ G_UNLOCK (g_thread);
+ /* walk the list, skipping non-existant threads */
+ while (slist)
+ {
+ GSList *node = slist;
+ slist = node->next;
+ /* check whether the current thread still exists */
+ G_LOCK (g_thread);
+ for (thread = g_thread_all_threads; thread; thread = thread->next)
+ if (thread == node->data)
+ break;
+ G_UNLOCK (g_thread);
+ if (thread)
+ thread_func (thread, user_data);
+ g_slist_free_1 (node);
+ }
+}
+
+#define __G_THREAD_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gthread.h b/trunk/glib/gthread.h
new file mode 100644
index 000000000..79099f173
--- /dev/null
+++ b/trunk/glib/gthread.h
@@ -0,0 +1,379 @@
+/* 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 <glib/gerror.h>
+#include <glib/gtypes.h>
+#include <glib/gatomic.h> /* for g_atomic_pointer_get */
+
+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
+{
+ /*< private >*/
+ 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);
+ gboolean (*thread_equal) (gpointer thread1,
+ gpointer thread2);
+};
+
+GLIB_VAR GThreadFunctions g_thread_functions_for_glib_use;
+GLIB_VAR gboolean g_thread_use_default_impl;
+GLIB_VAR gboolean g_threads_got_initialized;
+
+GLIB_VAR guint64 (*g_thread_gettime) (void);
+
+/* 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);
+
+#define g_static_mutex_get_mutex_impl_shortcut(mutex) \
+ (g_atomic_pointer_get ((gpointer*)(void*)mutex) ? *(mutex) : \
+ g_static_mutex_get_mutex_impl (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*, const gulong, gchar const*)) \
+ (*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
+{
+ /*< private >*/
+ 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
+{
+ /*< private >*/
+ GStaticMutex mutex;
+ guint 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
+{
+ /*< private >*/
+ GStaticMutex mutex;
+ GCond *read_cond;
+ GCond *write_cond;
+ guint read_counter;
+ gboolean have_writer;
+ guint want_to_read;
+ guint want_to_write;
+};
+
+#define G_STATIC_RW_LOCK_INIT { G_STATIC_MUTEX_INIT, NULL, NULL, 0, FALSE, 0, 0 }
+
+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);
+
+void g_thread_foreach (GFunc thread_func,
+ gpointer user_data);
+
+typedef enum
+{
+ G_ONCE_STATUS_NOTCALLED,
+ G_ONCE_STATUS_PROGRESS,
+ G_ONCE_STATUS_READY
+} GOnceStatus;
+
+typedef struct _GOnce GOnce;
+struct _GOnce
+{
+ volatile GOnceStatus status;
+ volatile gpointer retval;
+};
+
+#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
+
+gpointer g_once_impl (GOnce *once, GThreadFunc func, gpointer arg);
+
+#ifdef G_ATOMIC_OP_MEMORY_BARRIER_NEEDED
+# define g_once(once, func, arg) g_once_impl ((once), (func), (arg))
+#else /* !G_ATOMIC_OP_MEMORY_BARRIER_NEEDED*/
+# define g_once(once, func, arg) \
+ (((once)->status == G_ONCE_STATUS_READY) ? \
+ (once)->retval : \
+ g_once_impl ((once), (func), (arg)))
+#endif /* G_ATOMIC_OP_MEMORY_BARRIER_NEEDED */
+
+/* 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/trunk/glib/gthreadpool.c b/trunk/glib/gthreadpool.c
new file mode 100644
index 000000000..ec50609b1
--- /dev/null
+++ b/trunk/glib/gthreadpool.c
@@ -0,0 +1,945 @@
+/* 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 "config.h"
+
+#include "glib.h"
+#include "galias.h"
+
+#define DEBUG_MSG(x)
+/* #define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n"); */
+
+typedef struct _GRealThreadPool GRealThreadPool;
+
+struct _GRealThreadPool
+{
+ GThreadPool pool;
+ GAsyncQueue* queue;
+ GCond* cond;
+ gint max_threads;
+ gint num_threads;
+ gboolean running;
+ gboolean immediate;
+ gboolean waiting;
+ GCompareDataFunc sort_func;
+ gpointer sort_user_data;
+};
+
+/* The following is just an address to mark the wakeup order for a
+ * thread, it could be any address (as long, as it isn't a valid
+ * GThreadPool address) */
+static gconstpointer const wakeup_thread_marker = (gconstpointer) &g_thread_pool_new;
+static gint wakeup_thread_serial = 0;
+
+/* Here all unused threads are waiting */
+static GAsyncQueue *unused_thread_queue = NULL;
+static gint unused_threads = 0;
+static gint max_unused_threads = 0;
+static gint kill_unused_threads = 0;
+static guint max_idle_time = 0;
+
+static void g_thread_pool_queue_push_unlocked (GRealThreadPool *pool,
+ gpointer data);
+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);
+static GRealThreadPool* g_thread_pool_wait_for_new_pool (void);
+static gpointer g_thread_pool_wait_for_new_task (GRealThreadPool *pool);
+
+static void
+g_thread_pool_queue_push_unlocked (GRealThreadPool *pool,
+ gpointer data)
+{
+ if (pool->sort_func)
+ g_async_queue_push_sorted_unlocked (pool->queue,
+ data,
+ pool->sort_func,
+ pool->sort_user_data);
+ else
+ g_async_queue_push_unlocked (pool->queue, data);
+}
+
+static GRealThreadPool*
+g_thread_pool_wait_for_new_pool (void)
+{
+ GRealThreadPool *pool;
+ gint local_wakeup_thread_serial;
+ guint local_max_unused_threads;
+ gint local_max_idle_time;
+ gint last_wakeup_thread_serial;
+ gboolean have_relayed_thread_marker = FALSE;
+
+ local_max_unused_threads = g_atomic_int_get (&max_unused_threads);
+ local_max_idle_time = g_atomic_int_get (&max_idle_time);
+ last_wakeup_thread_serial = g_atomic_int_get (&wakeup_thread_serial);
+
+ g_atomic_int_inc (&unused_threads);
+
+ do
+ {
+ if (g_atomic_int_get (&unused_threads) >= local_max_unused_threads)
+ {
+ /* If this is a superfluous thread, stop it. */
+ pool = NULL;
+ }
+ else if (local_max_idle_time > 0)
+ {
+ /* If a maximal idle time is given, wait for the given time. */
+ GTimeVal end_time;
+
+ g_get_current_time (&end_time);
+ g_time_val_add (&end_time, local_max_idle_time * 1000);
+
+ DEBUG_MSG (("thread %p waiting in global pool for %f seconds.",
+ g_thread_self (), local_max_idle_time / 1000.0));
+
+ pool = g_async_queue_timed_pop (unused_thread_queue, &end_time);
+ }
+ else
+ {
+ /* If no maximal idle time is given, wait indefinitely. */
+ DEBUG_MSG (("thread %p waiting in global pool.",
+ g_thread_self ()));
+ pool = g_async_queue_pop (unused_thread_queue);
+ }
+
+ if (pool == wakeup_thread_marker)
+ {
+ local_wakeup_thread_serial = g_atomic_int_get (&wakeup_thread_serial);
+ if (last_wakeup_thread_serial == local_wakeup_thread_serial)
+ {
+ if (!have_relayed_thread_marker)
+ {
+ /* If this wakeup marker has been received for
+ * the second time, relay it.
+ */
+ DEBUG_MSG (("thread %p relaying wakeup message to "
+ "waiting thread with lower serial.",
+ g_thread_self ()));
+
+ g_async_queue_push (unused_thread_queue, wakeup_thread_marker);
+ have_relayed_thread_marker = TRUE;
+
+ /* If a wakeup marker has been relayed, this thread
+ * will get out of the way for 100 microseconds to
+ * avoid receiving this marker again. */
+ g_usleep (100);
+ }
+ }
+ else
+ {
+ if (g_atomic_int_exchange_and_add (&kill_unused_threads, -1) > 0)
+ {
+ pool = NULL;
+ break;
+ }
+
+ DEBUG_MSG (("thread %p updating to new limits.",
+ g_thread_self ()));
+
+ local_max_unused_threads = g_atomic_int_get (&max_unused_threads);
+ local_max_idle_time = g_atomic_int_get (&max_idle_time);
+ last_wakeup_thread_serial = local_wakeup_thread_serial;
+
+ have_relayed_thread_marker = FALSE;
+ }
+ }
+ }
+ while (pool == wakeup_thread_marker);
+
+ g_atomic_int_add (&unused_threads, -1);
+
+ return pool;
+}
+
+static gpointer
+g_thread_pool_wait_for_new_task (GRealThreadPool *pool)
+{
+ gpointer task = NULL;
+
+ if (pool->running || (!pool->immediate &&
+ g_async_queue_length_unlocked (pool->queue) > 0))
+ {
+ /* This thread pool is still active. */
+ if (pool->num_threads > pool->max_threads && pool->max_threads != -1)
+ {
+ /* This is a superfluous thread, so it goes to the global pool. */
+ DEBUG_MSG (("superfluous thread %p in pool %p.",
+ g_thread_self (), pool));
+ }
+ else if (pool->pool.exclusive)
+ {
+ /* Exclusive threads stay attached to the pool. */
+ task = g_async_queue_pop_unlocked (pool->queue);
+
+ DEBUG_MSG (("thread %p in exclusive pool %p waits for task "
+ "(%d running, %d unprocessed).",
+ g_thread_self (), pool, pool->num_threads,
+ g_async_queue_length_unlocked (pool->queue)));
+ }
+ else
+ {
+ /* A thread will wait for new tasks for at most 1/2
+ * second before going to the global pool.
+ */
+ GTimeVal end_time;
+
+ g_get_current_time (&end_time);
+ g_time_val_add (&end_time, G_USEC_PER_SEC / 2); /* 1/2 second */
+
+ DEBUG_MSG (("thread %p in pool %p waits for up to a 1/2 second for task "
+ "(%d running, %d unprocessed).",
+ g_thread_self (), pool, pool->num_threads,
+ g_async_queue_length_unlocked (pool->queue)));
+
+ task = g_async_queue_timed_pop_unlocked (pool->queue, &end_time);
+ }
+ }
+ else
+ {
+ /* This thread pool is inactive, it will no longer process tasks. */
+ DEBUG_MSG (("pool %p not active, thread %p will go to global pool "
+ "(running: %s, immediate: %s, len: %d).",
+ pool, g_thread_self (),
+ pool->running ? "true" : "false",
+ pool->immediate ? "true" : "false",
+ g_async_queue_length_unlocked (pool->queue)));
+ }
+
+ return task;
+}
+
+
+static gpointer
+g_thread_pool_thread_proxy (gpointer data)
+{
+ GRealThreadPool *pool;
+
+ pool = data;
+
+ DEBUG_MSG (("thread %p started for pool %p.",
+ g_thread_self (), pool));
+
+ g_async_queue_lock (pool->queue);
+
+ while (TRUE)
+ {
+ gpointer task;
+
+ task = g_thread_pool_wait_for_new_task (pool);
+ if (task)
+ {
+ if (pool->running || !pool->immediate)
+ {
+ /* A task was received and the thread pool is active, so
+ * execute the function.
+ */
+ g_async_queue_unlock (pool->queue);
+ DEBUG_MSG (("thread %p in pool %p calling func.",
+ g_thread_self (), pool));
+ pool->pool.func (task, pool->pool.user_data);
+ g_async_queue_lock (pool->queue);
+ }
+ }
+ else
+ {
+ /* No task was received, so this thread goes to the global
+ * pool.
+ */
+ gboolean free_pool = FALSE;
+
+ DEBUG_MSG (("thread %p leaving pool %p for global pool.",
+ g_thread_self (), pool));
+ pool->num_threads--;
+
+ if (!pool->running)
+ {
+ if (!pool->waiting)
+ {
+ if (pool->num_threads == 0)
+ {
+ /* If the pool is not running and no other
+ * thread is waiting for this thread pool to
+ * finish and this is the last thread of this
+ * pool, free the pool.
+ */
+ free_pool = TRUE;
+ }
+ else
+ {
+ /* If the pool is not running and no other
+ * thread is waiting for this thread pool to
+ * finish and this is not the last thread of
+ * this pool and there are no tasks left in the
+ * queue, wakeup the remaining threads.
+ */
+ if (g_async_queue_length_unlocked (pool->queue) ==
+ - pool->num_threads)
+ g_thread_pool_wakeup_and_stop_all (pool);
+ }
+ }
+ else if (pool->immediate ||
+ g_async_queue_length_unlocked (pool->queue) <= 0)
+ {
+ /* If the pool is not running and another thread is
+ * waiting for this thread pool to finish and there
+ * are either no tasks left or the pool shall stop
+ * immediatly, inform the waiting thread of a change
+ * of the thread pool state.
+ */
+ g_cond_broadcast (pool->cond);
+ }
+ }
+
+ g_async_queue_unlock (pool->queue);
+
+ if (free_pool)
+ g_thread_pool_free_internal (pool);
+
+ if ((pool = g_thread_pool_wait_for_new_pool ()) == NULL)
+ break;
+
+ g_async_queue_lock (pool->queue);
+
+ DEBUG_MSG (("thread %p entering pool %p from global pool.",
+ g_thread_self (), pool));
+
+ /* 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->cond = NULL;
+ retval->max_threads = max_threads;
+ retval->num_threads = 0;
+ retval->running = TRUE;
+ retval->sort_func = NULL;
+ retval->sort_user_data = NULL;
+
+ G_LOCK (init);
+ if (!unused_thread_queue)
+ 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;
+
+ real = (GRealThreadPool*) pool;
+
+ g_return_if_fail (real);
+ g_return_if_fail (real->running);
+
+ g_async_queue_lock (real->queue);
+
+ if (g_async_queue_length_unlocked (real->queue) >= 0)
+ /* No thread is waiting in the queue */
+ g_thread_pool_start_thread (real, error);
+
+ g_thread_pool_queue_push_unlocked (real, 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;
+ gint to_start;
+
+ real = (GRealThreadPool*) pool;
+
+ 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;
+ gint retval;
+
+ real = (GRealThreadPool*) pool;
+
+ 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;
+ guint retval;
+
+ real = (GRealThreadPool*) pool;
+
+ 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;
+ gint unprocessed;
+
+ real = (GRealThreadPool*) pool;
+
+ 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;
+
+ real = (GRealThreadPool*) pool;
+
+ g_return_if_fail (real);
+ g_return_if_fail (real->running);
+
+ /* If 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_)
+ {
+ real->cond = g_cond_new ();
+
+ while (g_async_queue_length_unlocked (real->queue) != -real->num_threads &&
+ !(immediate && real->num_threads == 0))
+ g_cond_wait (real->cond, _g_async_queue_get_mutex (real->queue));
+ }
+
+ if (immediate || 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);
+ }
+
+ /* The last thread should cleanup the pool */
+ real->waiting = FALSE;
+ 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 == FALSE);
+ g_return_if_fail (pool->num_threads == 0);
+
+ g_async_queue_unref (pool->queue);
+
+ if (pool->cond)
+ g_cond_free (pool->cond);
+
+ 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 == FALSE);
+ g_return_if_fail (pool->num_threads != 0);
+
+ pool->immediate = TRUE;
+
+ for (i = 0; i < pool->num_threads; i++)
+ g_thread_pool_queue_push_unlocked (pool, 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_atomic_int_set (&max_unused_threads, max_threads);
+
+ if (max_threads != -1)
+ {
+ max_threads -= g_atomic_int_get (&unused_threads);
+ if (max_threads < 0)
+ {
+ g_atomic_int_set (&kill_unused_threads, -max_threads);
+ g_atomic_int_inc (&wakeup_thread_serial);
+
+ g_async_queue_lock (unused_thread_queue);
+
+ do
+ {
+ g_async_queue_push_unlocked (unused_thread_queue,
+ wakeup_thread_marker);
+ }
+ while (++max_threads);
+
+ g_async_queue_unlock (unused_thread_queue);
+ }
+ }
+}
+
+/**
+ * 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)
+{
+ return g_atomic_int_get (&max_unused_threads);
+}
+
+/**
+ * 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)
+{
+ return g_atomic_int_get (&unused_threads);
+}
+
+/**
+ * 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;
+
+ oldval = g_thread_pool_get_max_unused_threads ();
+
+ g_thread_pool_set_max_unused_threads (0);
+ g_thread_pool_set_max_unused_threads (oldval);
+}
+
+/**
+ * g_thread_pool_set_sort_function:
+ * @pool: a #GThreadPool
+ * @func: the #GCompareDataFunc used to sort the list of tasks.
+ * This function is passed two tasks. It should return
+ * 0 if the order in which they are handled does not matter,
+ * a negative value if the first task should be processed before
+ * the second or a positive value if the second task should be
+ * processed first.
+ * @user_data: user data passed to @func.
+ *
+ * Sets the function used to sort the list of tasks. This allows the
+ * tasks to be processed by a priority determined by @func, and not
+ * just in the order in which they were added to the pool.
+ *
+ * Note, if the maximum number of threads is more than 1, the order
+ * that threads are executed can not be guranteed 100%. Threads are
+ * scheduled by the operating system and are executed at random. It
+ * cannot be assumed that threads are executed in the order they are
+ * created.
+ *
+ * Since: 2.10
+ **/
+void
+g_thread_pool_set_sort_function (GThreadPool *pool,
+ GCompareDataFunc func,
+ gpointer user_data)
+{
+ GRealThreadPool *real;
+
+ real = (GRealThreadPool*) pool;
+
+ g_return_if_fail (real);
+ g_return_if_fail (real->running);
+
+ g_async_queue_lock (real->queue);
+
+ real->sort_func = func;
+ real->sort_user_data = user_data;
+
+ if (func)
+ g_async_queue_sort_unlocked (real->queue,
+ real->sort_func,
+ real->sort_user_data);
+
+ g_async_queue_unlock (real->queue);
+}
+
+/**
+ * g_thread_pool_set_max_idle_time:
+ * @interval: the maximum @interval (1/1000ths of a second) a thread
+ * can be idle.
+ *
+ * This function will set the maximum @interval that a thread waiting
+ * in the pool for new tasks can be idle for before being
+ * stopped. This function is similar to calling
+ * g_thread_pool_stop_unused_threads() on a regular timeout, except,
+ * this is done on a per thread basis.
+ *
+ * By setting @interval to 0, idle threads will not be stopped.
+ *
+ * This function makes use of g_async_queue_timed_pop () using
+ * @interval.
+ *
+ * Since: 2.10
+ **/
+void
+g_thread_pool_set_max_idle_time (guint interval)
+{
+ guint i;
+
+ g_atomic_int_set (&max_idle_time, interval);
+
+ i = g_atomic_int_get (&unused_threads);
+ if (i > 0)
+ {
+ g_atomic_int_inc (&wakeup_thread_serial);
+ g_async_queue_lock (unused_thread_queue);
+
+ do
+ {
+ g_async_queue_push_unlocked (unused_thread_queue,
+ wakeup_thread_marker);
+ }
+ while (--i);
+
+ g_async_queue_unlock (unused_thread_queue);
+ }
+}
+
+/**
+ * g_thread_pool_get_max_idle_time:
+ *
+ * This function will return the maximum @interval that a thread will
+ * wait in the thread pool for new tasks before being stopped.
+ *
+ * If this function returns 0, threads waiting in the thread pool for
+ * new work are not stopped.
+ *
+ * Return value: the maximum @interval to wait for new tasks in the
+ * thread pool before stopping the thread (1/1000ths of a second).
+ *
+ * Since: 2.10
+ **/
+guint
+g_thread_pool_get_max_idle_time (void)
+{
+ return g_atomic_int_get (&max_idle_time);
+}
+
+#define __G_THREADPOOL_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gthreadpool.h b/trunk/glib/gthreadpool.h
new file mode 100644
index 000000000..91a02d6ae
--- /dev/null
+++ b/trunk/glib/gthreadpool.h
@@ -0,0 +1,111 @@
+/* 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 <glib/gthread.h>
+
+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);
+
+/* Set sort function for priority threading */
+void g_thread_pool_set_sort_function (GThreadPool *pool,
+ GCompareDataFunc func,
+ gpointer user_data);
+
+/* Set maximum time a thread can be idle in the pool before it is stopped */
+void g_thread_pool_set_max_idle_time (guint interval);
+guint g_thread_pool_get_max_idle_time (void);
+
+G_END_DECLS
+
+#endif /* __G_THREADPOOL_H__ */
+
diff --git a/trunk/glib/gthreadprivate.h b/trunk/glib/gthreadprivate.h
new file mode 100644
index 000000000..c9b5fa50d
--- /dev/null
+++ b/trunk/glib/gthreadprivate.h
@@ -0,0 +1,68 @@
+/* GLIB - Library of useful routines for C programming
+ *
+ * gthreadprivate.h - GLib internal thread system related declarations.
+ *
+ * Copyright (C) 2003 Sebastian Wilhelmi
+ *
+ * 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_THREADPRIVATE_H__
+#define __G_THREADPRIVATE_H__
+
+G_BEGIN_DECLS
+
+/* System thread identifier comparision and assignment */
+#if GLIB_SIZEOF_SYSTEM_THREAD == SIZEOF_VOID_P
+# define g_system_thread_equal_simple(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_simple(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 */
+
+#define g_system_thread_equal(thread1, thread2) \
+ (g_thread_functions_for_glib_use.thread_equal ? \
+ g_thread_functions_for_glib_use.thread_equal (&(thread1), &(thread2)) :\
+ g_system_thread_equal_simple((thread1), (thread2)))
+
+/* Is called from gthread/gthread-impl.c */
+void g_thread_init_glib (void);
+
+/* base initializers, may only use g_mutex_new(), g_cond_new() */
+G_GNUC_INTERNAL void _g_mem_thread_init_noprivate_nomessage (void);
+/* initializers that may also use g_private_new() */
+G_GNUC_INTERNAL void _g_slice_thread_init_nomessage (void);
+G_GNUC_INTERNAL void _g_messages_thread_init_nomessage (void);
+
+/* full fledged initializers */
+G_GNUC_INTERNAL void _g_convert_thread_init (void);
+G_GNUC_INTERNAL void _g_rand_thread_init (void);
+G_GNUC_INTERNAL void _g_main_thread_init (void);
+G_GNUC_INTERNAL void _g_atomic_thread_init (void);
+G_GNUC_INTERNAL void _g_utils_thread_init (void);
+
+#ifdef G_OS_WIN32
+G_GNUC_INTERNAL void _g_win32_thread_init (void);
+#endif /* G_OS_WIN32 */
+
+G_END_DECLS
+
+#endif /* __G_THREADPRIVATE_H__ */
diff --git a/trunk/glib/gtimer.c b/trunk/glib/gtimer.c
new file mode 100644
index 000000000..aa290d05c
--- /dev/null
+++ b/trunk/glib/gtimer.c
@@ -0,0 +1,408 @@
+/* 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 "config.h"
+#include "glibconfig.h"
+
+#include <stdlib.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#ifndef G_OS_WIN32
+#include <sys/time.h>
+#include <time.h>
+#include <errno.h>
+#endif /* G_OS_WIN32 */
+
+#ifdef G_OS_WIN32
+#include <windows.h>
+#endif /* G_OS_WIN32 */
+
+#include "glib.h"
+#include "gthread.h"
+#include "galias.h"
+
+#define G_NSEC_PER_SEC 1000000000
+
+#define GETTIME(v) (v = g_thread_gettime ())
+
+struct _GTimer
+{
+ guint64 start;
+ guint64 end;
+
+ guint active : 1;
+};
+
+
+GTimer*
+g_timer_new (void)
+{
+ GTimer *timer;
+
+ timer = g_new (GTimer, 1);
+ timer->active = TRUE;
+
+ GETTIME (timer->start);
+
+ return timer;
+}
+
+void
+g_timer_destroy (GTimer *timer)
+{
+ g_return_if_fail (timer != NULL);
+
+ g_free (timer);
+}
+
+void
+g_timer_start (GTimer *timer)
+{
+ g_return_if_fail (timer != NULL);
+
+ timer->active = TRUE;
+
+ GETTIME (timer->start);
+}
+
+void
+g_timer_stop (GTimer *timer)
+{
+ g_return_if_fail (timer != NULL);
+
+ timer->active = FALSE;
+
+ GETTIME (timer->end);
+}
+
+void
+g_timer_reset (GTimer *timer)
+{
+ g_return_if_fail (timer != NULL);
+
+ GETTIME (timer->start);
+}
+
+void
+g_timer_continue (GTimer *timer)
+{
+ guint64 elapsed;
+
+ g_return_if_fail (timer != NULL);
+ g_return_if_fail (timer->active == FALSE);
+
+ /* Get elapsed time and reset timer start time
+ * to the current time minus the previously
+ * elapsed interval.
+ */
+
+ elapsed = timer->end - timer->start;
+
+ GETTIME (timer->start);
+
+ timer->start -= elapsed;
+
+ timer->active = TRUE;
+}
+
+gdouble
+g_timer_elapsed (GTimer *timer,
+ gulong *microseconds)
+{
+ gdouble total;
+ gint64 elapsed;
+
+ g_return_val_if_fail (timer != NULL, 0);
+
+ if (timer->active)
+ GETTIME (timer->end);
+
+ elapsed = timer->end - timer->start;
+
+ total = elapsed / 1e9;
+
+ if (microseconds)
+ *microseconds = (elapsed / 1000) % 1000000;
+
+ 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) == -1 && errno == EINTR)
+ request = remaining;
+# else /* !HAVE_NANOSLEEP */
+# ifdef HAVE_NSLEEP
+ /* on AIX, nsleep is analogous to nanosleep */
+ struct timespec request, remaining;
+ request.tv_sec = microseconds / G_USEC_PER_SEC;
+ request.tv_nsec = 1000 * (microseconds % G_USEC_PER_SEC);
+ while (nsleep (&request, &remaining) == -1 && errno == EINTR)
+ request = remaining;
+# else /* !HAVE_NSLEEP */
+ 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_NSLEEP */
+# 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--;
+ }
+ }
+}
+
+/* converts a broken down date representation, relative to UTC, to
+ * a timestamp; it uses timegm() if it's available.
+ */
+static time_t
+mktime_utc (struct tm *tm)
+{
+ time_t retval;
+
+#ifndef HAVE_TIMEGM
+ static const gint days_before[] =
+ {
+ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
+ };
+#endif
+
+#ifndef HAVE_TIMEGM
+ if (tm->tm_mon < 0 || tm->tm_mon > 11)
+ return (time_t) -1;
+
+ retval = (tm->tm_year - 70) * 365;
+ retval += (tm->tm_year - 68) / 4;
+ retval += days_before[tm->tm_mon] + tm->tm_mday - 1;
+
+ if (tm->tm_year % 4 == 0 && tm->tm_mon < 2)
+ retval -= 1;
+
+ retval = ((((retval * 24) + tm->tm_hour) * 60) + tm->tm_min) * 60 + tm->tm_sec;
+#else
+ retval = timegm (tm);
+#endif /* !HAVE_TIMEGM */
+
+ return retval;
+}
+
+/**
+ * g_time_val_from_iso8601:
+ * @iso_date: a ISO 8601 encoded date string
+ * @time_: a #GTimeVal
+ *
+ * Converts a string containing an ISO 8601 encoded date and time
+ * to a #GTimeVal and puts it into @time_.
+ *
+ * Return value: %TRUE if the conversion was successful.
+ *
+ * Since: 2.12
+ */
+gboolean
+g_time_val_from_iso8601 (const gchar *iso_date,
+ GTimeVal *time_)
+{
+ struct tm tm;
+ long val;
+
+ g_return_val_if_fail (iso_date != NULL, FALSE);
+ g_return_val_if_fail (time_ != NULL, FALSE);
+
+ val = strtoul (iso_date, (char **)&iso_date, 10);
+ if (*iso_date == '-')
+ {
+ /* YYYY-MM-DD */
+ tm.tm_year = val - 1900;
+ iso_date++;
+ tm.tm_mon = strtoul (iso_date, (char **)&iso_date, 10) - 1;
+
+ if (*iso_date++ != '-')
+ return FALSE;
+
+ tm.tm_mday = strtoul (iso_date, (char **)&iso_date, 10);
+ }
+ else
+ {
+ /* YYYYMMDD */
+ tm.tm_mday = val % 100;
+ tm.tm_mon = (val % 10000) / 100 - 1;
+ tm.tm_year = val / 10000 - 1900;
+ }
+
+ if (*iso_date++ != 'T')
+ return FALSE;
+
+ val = strtoul (iso_date, (char **)&iso_date, 10);
+ if (*iso_date == ':')
+ {
+ /* hh:mm:ss */
+ tm.tm_hour = val;
+ iso_date++;
+ tm.tm_min = strtoul (iso_date, (char **)&iso_date, 10);
+
+ if (*iso_date++ != ':')
+ return FALSE;
+
+ tm.tm_sec = strtoul (iso_date, (char **)&iso_date, 10);
+ }
+ else
+ {
+ /* hhmmss */
+ tm.tm_sec = val % 100;
+ tm.tm_min = (val % 10000) / 100;
+ tm.tm_hour = val / 10000;
+ }
+
+ time_->tv_sec = mktime_utc (&tm);
+ time_->tv_usec = 1;
+
+ if (*iso_date == '.')
+ time_->tv_usec = strtoul (iso_date + 1, (char **)&iso_date, 10);
+
+ if (*iso_date == '+' || *iso_date == '-')
+ {
+ gint sign = (*iso_date == '+') ? -1 : 1;
+
+ val = 60 * strtoul (iso_date + 1, (char **)&iso_date, 10);
+
+ if (*iso_date == ':')
+ val = 60 * val + strtoul (iso_date + 1, NULL, 10);
+ else
+ val = 60 * (val / 100) + (val % 100);
+
+ time_->tv_sec += (time_t) (val * sign);
+ }
+
+ return TRUE;
+}
+
+/**
+ * g_time_val_to_iso8601:
+ * @time_: a #GTimeVal
+ *
+ * Converts @time_ into a ISO 8601 encoded string, relative to the
+ * Coordinated Universal Time (UTC).
+ *
+ * Return value: a newly allocated string containing a ISO 8601 date
+ *
+ * Since: 2.12
+ */
+gchar *
+g_time_val_to_iso8601 (GTimeVal *time_)
+{
+ gchar *retval;
+
+ g_return_val_if_fail (time_->tv_usec >= 0 && time_->tv_usec < G_USEC_PER_SEC, NULL);
+
+#define ISO_8601_LEN 21
+#define ISO_8601_FORMAT "%Y-%m-%dT%H:%M:%SZ"
+ retval = g_new0 (gchar, ISO_8601_LEN + 1);
+
+ strftime (retval, ISO_8601_LEN,
+ ISO_8601_FORMAT,
+ gmtime (&(time_->tv_sec)));
+
+ return retval;
+}
+
+#define __G_TIMER_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gtimer.h b/trunk/glib/gtimer.h
new file mode 100644
index 000000000..d602ae1b9
--- /dev/null
+++ b/trunk/glib/gtimer.h
@@ -0,0 +1,61 @@
+/* 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 <glib/gtypes.h>
+
+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);
+void g_timer_continue (GTimer *timer);
+gdouble g_timer_elapsed (GTimer *timer,
+ gulong *microseconds);
+
+void g_usleep (gulong microseconds);
+
+void g_time_val_add (GTimeVal *time_,
+ glong microseconds);
+gboolean g_time_val_from_iso8601 (const gchar *iso_date,
+ GTimeVal *time_);
+gchar* g_time_val_to_iso8601 (GTimeVal *time_) G_GNUC_MALLOC;
+
+G_END_DECLS
+
+#endif /* __G_TIMER_H__ */
diff --git a/trunk/glib/gtree.c b/trunk/glib/gtree.c
new file mode 100644
index 000000000..8ae5e9812
--- /dev/null
+++ b/trunk/glib/gtree.c
@@ -0,0 +1,1290 @@
+/* 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 "config.h"
+
+#include "glib.h"
+#include "galias.h"
+
+#undef G_TREE_DEBUG
+
+#define MAX_GTREE_HEIGHT 40
+
+typedef struct _GTreeNode GTreeNode;
+
+struct _GTree
+{
+ GTreeNode *root;
+ GCompareDataFunc key_compare;
+ GDestroyNotify key_destroy_func;
+ GDestroyNotify value_destroy_func;
+ gpointer key_compare_data;
+ guint nnodes;
+};
+
+struct _GTreeNode
+{
+ gpointer key; /* key for this node */
+ gpointer value; /* value stored at this node */
+ GTreeNode *left; /* left subtree */
+ GTreeNode *right; /* right subtree */
+ gint8 balance; /* height (left) - height (right) */
+ guint8 left_child;
+ guint8 right_child;
+};
+
+
+static GTreeNode* g_tree_node_new (gpointer key,
+ gpointer value);
+static void g_tree_insert_internal (GTree *tree,
+ gpointer key,
+ gpointer value,
+ gboolean replace);
+static gboolean g_tree_remove_internal (GTree *tree,
+ gconstpointer key,
+ gboolean steal);
+static GTreeNode* g_tree_node_balance (GTreeNode *node);
+static GTreeNode *g_tree_find_node (GTree *tree,
+ gconstpointer key);
+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 GTreeNode* g_tree_node_rotate_left (GTreeNode *node);
+static GTreeNode* g_tree_node_rotate_right (GTreeNode *node);
+#ifdef G_TREE_DEBUG
+static void g_tree_node_check (GTreeNode *node);
+#endif
+
+
+static GTreeNode*
+g_tree_node_new (gpointer key,
+ gpointer value)
+{
+ GTreeNode *node = g_slice_new (GTreeNode);
+
+ node->balance = 0;
+ node->left = NULL;
+ node->right = NULL;
+ node->left_child = FALSE;
+ node->right_child = FALSE;
+ node->key = key;
+ node->value = value;
+
+ return node;
+}
+
+/**
+ * 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)
+{
+ GTree *tree;
+
+ g_return_val_if_fail (key_compare_func != NULL, NULL);
+
+ tree = g_new (GTree, 1);
+ tree->root = NULL;
+ tree->key_compare = key_compare_func;
+ tree->key_destroy_func = key_destroy_func;
+ tree->value_destroy_func = value_destroy_func;
+ tree->key_compare_data = key_compare_data;
+ tree->nnodes = 0;
+
+ return tree;
+}
+
+static inline GTreeNode *
+g_tree_first_node (GTree *tree)
+{
+ GTreeNode *tmp;
+
+ if (!tree->root)
+ return NULL;
+
+ tmp = tree->root;
+
+ while (tmp->left_child)
+ tmp = tmp->left;
+
+ return tmp;
+}
+
+static inline GTreeNode *
+g_tree_node_previous (GTreeNode *node)
+{
+ GTreeNode *tmp;
+
+ tmp = node->left;
+
+ if (node->left_child)
+ while (tmp->right_child)
+ tmp = tmp->right;
+
+ return tmp;
+}
+
+static inline GTreeNode *
+g_tree_node_next (GTreeNode *node)
+{
+ GTreeNode *tmp;
+
+ tmp = node->right;
+
+ if (node->right_child)
+ while (tmp->left_child)
+ tmp = tmp->left;
+
+ return tmp;
+}
+
+/**
+ * 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)
+{
+ GTreeNode *node;
+ GTreeNode *next;
+
+ g_return_if_fail (tree != NULL);
+
+ node = g_tree_first_node (tree);
+
+ while (node)
+ {
+ next = g_tree_node_next (node);
+
+ if (tree->key_destroy_func)
+ tree->key_destroy_func (node->key);
+ if (tree->value_destroy_func)
+ tree->value_destroy_func (node->value);
+ g_slice_free (GTreeNode, node);
+
+ node = next;
+ }
+
+ g_free (tree);
+}
+
+/**
+ * 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 its corresponding value 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)
+{
+ g_return_if_fail (tree != NULL);
+
+ g_tree_insert_internal (tree, key, value, FALSE);
+
+#ifdef G_TREE_DEBUG
+ g_tree_node_check (tree->root);
+#endif
+}
+
+/**
+ * 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)
+{
+ g_return_if_fail (tree != NULL);
+
+ g_tree_insert_internal (tree, key, value, TRUE);
+
+#ifdef G_TREE_DEBUG
+ g_tree_node_check (tree->root);
+#endif
+}
+
+/* internal insert routine */
+static void
+g_tree_insert_internal (GTree *tree,
+ gpointer key,
+ gpointer value,
+ gboolean replace)
+{
+ GTreeNode *node;
+ GTreeNode *path[MAX_GTREE_HEIGHT];
+ int idx;
+
+ g_return_if_fail (tree != NULL);
+
+ if (!tree->root)
+ {
+ tree->root = g_tree_node_new (key, value);
+ tree->nnodes++;
+ return;
+ }
+
+ idx = 0;
+ path[idx++] = NULL;
+ node = tree->root;
+
+ while (1)
+ {
+ int cmp = tree->key_compare (key, node->key, tree->key_compare_data);
+
+ if (cmp == 0)
+ {
+ if (tree->value_destroy_func)
+ tree->value_destroy_func (node->value);
+
+ node->value = value;
+
+ if (replace)
+ {
+ if (tree->key_destroy_func)
+ tree->key_destroy_func (node->key);
+
+ node->key = key;
+ }
+ else
+ {
+ /* free the passed key */
+ if (tree->key_destroy_func)
+ tree->key_destroy_func (key);
+ }
+
+ return;
+ }
+ else if (cmp < 0)
+ {
+ if (node->left_child)
+ {
+ path[idx++] = node;
+ node = node->left;
+ }
+ else
+ {
+ GTreeNode *child = g_tree_node_new (key, value);
+
+ child->left = node->left;
+ child->right = node;
+ node->left = child;
+ node->left_child = TRUE;
+ node->balance -= 1;
+
+ tree->nnodes++;
+
+ break;
+ }
+ }
+ else
+ {
+ if (node->right_child)
+ {
+ path[idx++] = node;
+ node = node->right;
+ }
+ else
+ {
+ GTreeNode *child = g_tree_node_new (key, value);
+
+ child->right = node->right;
+ child->left = node;
+ node->right = child;
+ node->right_child = TRUE;
+ node->balance += 1;
+
+ tree->nnodes++;
+
+ break;
+ }
+ }
+ }
+
+ /* restore balance. This is the goodness of a non-recursive
+ implementation, when we are done with balancing we 'break'
+ the loop and we are done. */
+ while (1)
+ {
+ GTreeNode *bparent = path[--idx];
+ gboolean left_node = (bparent && node == bparent->left);
+ g_assert (!bparent || bparent->left == node || bparent->right == node);
+
+ if (node->balance < -1 || node->balance > 1)
+ {
+ node = g_tree_node_balance (node);
+ if (bparent == NULL)
+ tree->root = node;
+ else if (left_node)
+ bparent->left = node;
+ else
+ bparent->right = node;
+ }
+
+ if (node->balance == 0 || bparent == NULL)
+ break;
+
+ if (left_node)
+ bparent->balance -= 1;
+ else
+ bparent->balance += 1;
+
+ node = bparent;
+ }
+}
+
+/**
+ * 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.
+ * If the key does not exist in the #GTree, the function does nothing.
+ *
+ * Returns: %TRUE if the key was found (prior to 2.8, this function returned
+ * nothing)
+ **/
+gboolean
+g_tree_remove (GTree *tree,
+ gconstpointer key)
+{
+ gboolean removed;
+
+ g_return_val_if_fail (tree != NULL, FALSE);
+
+ removed = g_tree_remove_internal (tree, key, FALSE);
+
+#ifdef G_TREE_DEBUG
+ g_tree_node_check (tree->root);
+#endif
+
+ return removed;
+}
+
+/**
+ * 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.
+ *
+ * If the key does not exist in the #GTree, the function does nothing.
+ *
+ * Returns: %TRUE if the key was found (prior to 2.8, this function returned
+ * nothing)
+ **/
+gboolean
+g_tree_steal (GTree *tree,
+ gconstpointer key)
+{
+ gboolean removed;
+
+ g_return_val_if_fail (tree != NULL, FALSE);
+
+ removed = g_tree_remove_internal (tree, key, TRUE);
+
+#ifdef G_TREE_DEBUG
+ g_tree_node_check (tree->root);
+#endif
+
+ return removed;
+}
+
+/* internal remove routine */
+static gboolean
+g_tree_remove_internal (GTree *tree,
+ gconstpointer key,
+ gboolean steal)
+{
+ GTreeNode *node, *parent, *balance;
+ GTreeNode *path[MAX_GTREE_HEIGHT];
+ int idx;
+ gboolean left_node;
+
+ g_return_val_if_fail (tree != NULL, FALSE);
+
+ if (!tree->root)
+ return FALSE;
+
+ idx = 0;
+ path[idx++] = NULL;
+ node = tree->root;
+
+ while (1)
+ {
+ int cmp = tree->key_compare (key, node->key, tree->key_compare_data);
+
+ if (cmp == 0)
+ break;
+ else if (cmp < 0)
+ {
+ if (!node->left_child)
+ return FALSE;
+
+ path[idx++] = node;
+ node = node->left;
+ }
+ else
+ {
+ if (!node->right_child)
+ return FALSE;
+
+ path[idx++] = node;
+ node = node->right;
+ }
+ }
+
+ /* the following code is almost equal to g_tree_remove_node,
+ except that we do not have to call g_tree_node_parent. */
+ balance = parent = path[--idx];
+ g_assert (!parent || parent->left == node || parent->right == node);
+ left_node = (parent && node == parent->left);
+
+ if (!node->left_child)
+ {
+ if (!node->right_child)
+ {
+ if (!parent)
+ tree->root = NULL;
+ else if (left_node)
+ {
+ parent->left_child = FALSE;
+ parent->left = node->left;
+ parent->balance += 1;
+ }
+ else
+ {
+ parent->right_child = FALSE;
+ parent->right = node->right;
+ parent->balance -= 1;
+ }
+ }
+ else /* node has a right child */
+ {
+ GTreeNode *tmp = g_tree_node_next (node);
+ tmp->left = node->left;
+
+ if (!parent)
+ tree->root = node->right;
+ else if (left_node)
+ {
+ parent->left = node->right;
+ parent->balance += 1;
+ }
+ else
+ {
+ parent->right = node->right;
+ parent->balance -= 1;
+ }
+ }
+ }
+ else /* node has a left child */
+ {
+ if (!node->right_child)
+ {
+ GTreeNode *tmp = g_tree_node_previous (node);
+ tmp->right = node->right;
+
+ if (parent == NULL)
+ tree->root = node->left;
+ else if (left_node)
+ {
+ parent->left = node->left;
+ parent->balance += 1;
+ }
+ else
+ {
+ parent->right = node->left;
+ parent->balance -= 1;
+ }
+ }
+ else /* node has a both children (pant, pant!) */
+ {
+ GTreeNode *prev = node->left;
+ GTreeNode *next = node->right;
+ GTreeNode *nextp = node;
+ int old_idx = idx + 1;
+ idx++;
+
+ /* path[idx] == parent */
+ /* find the immediately next node (and its parent) */
+ while (next->left_child)
+ {
+ path[++idx] = nextp = next;
+ next = next->left;
+ }
+
+ path[old_idx] = next;
+ balance = path[idx];
+
+ /* remove 'next' from the tree */
+ if (nextp != node)
+ {
+ if (next->right_child)
+ nextp->left = next->right;
+ else
+ nextp->left_child = FALSE;
+ nextp->balance += 1;
+
+ next->right_child = TRUE;
+ next->right = node->right;
+ }
+ else
+ node->balance -= 1;
+
+ /* set the prev to point to the right place */
+ while (prev->right_child)
+ prev = prev->right;
+ prev->right = next;
+
+ /* prepare 'next' to replace 'node' */
+ next->left_child = TRUE;
+ next->left = node->left;
+ next->balance = node->balance;
+
+ if (!parent)
+ tree->root = next;
+ else if (left_node)
+ parent->left = next;
+ else
+ parent->right = next;
+ }
+ }
+
+ /* restore balance */
+ if (balance)
+ while (1)
+ {
+ GTreeNode *bparent = path[--idx];
+ g_assert (!bparent || bparent->left == balance || bparent->right == balance);
+ left_node = (bparent && balance == bparent->left);
+
+ if(balance->balance < -1 || balance->balance > 1)
+ {
+ balance = g_tree_node_balance (balance);
+ if (!bparent)
+ tree->root = balance;
+ else if (left_node)
+ bparent->left = balance;
+ else
+ bparent->right = balance;
+ }
+
+ if (balance->balance != 0 || !bparent)
+ break;
+
+ if (left_node)
+ bparent->balance += 1;
+ else
+ bparent->balance -= 1;
+
+ balance = bparent;
+ }
+
+ if (!steal)
+ {
+ if (tree->key_destroy_func)
+ tree->key_destroy_func (node->key);
+ if (tree->value_destroy_func)
+ tree->value_destroy_func (node->value);
+ }
+
+ g_slice_free (GTreeNode, node);
+
+ tree->nnodes--;
+
+ return TRUE;
+}
+
+/**
+ * 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, or %NULL if the key was
+ * not found.
+ **/
+gpointer
+g_tree_lookup (GTree *tree,
+ gconstpointer key)
+{
+ GTreeNode *node;
+
+ g_return_val_if_fail (tree != NULL, NULL);
+
+ node = g_tree_find_node (tree, 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)
+{
+ GTreeNode *node;
+
+ g_return_val_if_fail (tree != NULL, FALSE);
+
+ node = g_tree_find_node (tree, 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. The tree is traversed in sorted order.
+ *
+ * The tree may not be modified while iterating over it (you can't
+ * add/remove items). To remove all items matching a predicate, you need
+ * to add each item to a list in your #GTraverseFunc as you walk over
+ * the tree, then walk the list and remove each item.
+ **/
+void
+g_tree_foreach (GTree *tree,
+ GTraverseFunc func,
+ gpointer user_data)
+{
+ GTreeNode *node;
+
+ g_return_if_fail (tree != NULL);
+
+ if (!tree->root)
+ return;
+
+ node = g_tree_first_node (tree);
+
+ while (node)
+ {
+ if ((*func) (node->key, node->value, user_data))
+ break;
+
+ node = g_tree_node_next (node);
+ }
+}
+
+/**
+ * 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.
+ *
+ * Deprecated:2.2: The order of a balanced tree is somewhat arbitrary. If you
+ * just want to visit all nodes in sorted order, use g_tree_foreach()
+ * instead. If you really need to visit nodes in a different order, consider
+ * using an <link linkend="glib-N-ary-Trees">N-ary Tree</link>.
+ **/
+void
+g_tree_traverse (GTree *tree,
+ GTraverseFunc traverse_func,
+ GTraverseType traverse_type,
+ gpointer user_data)
+{
+ g_return_if_fail (tree != NULL);
+
+ if (!tree->root)
+ return;
+
+ switch (traverse_type)
+ {
+ case G_PRE_ORDER:
+ g_tree_node_pre_order (tree->root, traverse_func, user_data);
+ break;
+
+ case G_IN_ORDER:
+ g_tree_node_in_order (tree->root, traverse_func, user_data);
+ break;
+
+ case G_POST_ORDER:
+ g_tree_node_post_order (tree->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: a function used to search the #GTree.
+ * @user_data: the data passed as the second argument to the @search_func
+ * function.
+ *
+ * Searches a #GTree using @search_func.
+ *
+ * The @search_func is called with a pointer to the key of a key/value pair in
+ * the tree, and the passed in @user_data. If @search_func returns 0 for a
+ * key/value pair, then g_tree_search_func() will return the value of that
+ * pair. If @search_func returns -1, searching will proceed among the
+ * key/value pairs that have a smaller key; if @search_func returns 1,
+ * searching will proceed among the key/value pairs that have a larger key.
+ *
+ * Return value: the value corresponding to the found key, or %NULL if the key
+ * was not found.
+ **/
+gpointer
+g_tree_search (GTree *tree,
+ GCompareFunc search_func,
+ gconstpointer user_data)
+{
+ g_return_val_if_fail (tree != NULL, NULL);
+
+ if (tree->root)
+ return g_tree_node_search (tree->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)
+{
+ GTreeNode *node;
+ gint height;
+
+ g_return_val_if_fail (tree != NULL, 0);
+
+ if (!tree->root)
+ return 0;
+
+ height = 0;
+ node = tree->root;
+
+ while (1)
+ {
+ height += 1 + MAX(node->balance, 0);
+
+ if (!node->left_child)
+ return height;
+
+ node = node->left;
+ }
+}
+
+/**
+ * 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)
+{
+ g_return_val_if_fail (tree != NULL, 0);
+
+ return tree->nnodes;
+}
+
+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_find_node (GTree *tree,
+ gconstpointer key)
+{
+ GTreeNode *node;
+ gint cmp;
+
+ node = tree->root;
+ if (!node)
+ return NULL;
+
+ while (1)
+ {
+ cmp = tree->key_compare (key, node->key, tree->key_compare_data);
+ if (cmp == 0)
+ return node;
+ else if (cmp < 0)
+ {
+ if (!node->left_child)
+ return NULL;
+
+ node = node->left;
+ }
+ else
+ {
+ if (!node->right_child)
+ return NULL;
+
+ node = node->right;
+ }
+ }
+}
+
+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_child)
+ {
+ if (g_tree_node_pre_order (node->left, traverse_func, data))
+ return TRUE;
+ }
+
+ if (node->right_child)
+ {
+ 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_child)
+ {
+ 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_child)
+ {
+ 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_child)
+ {
+ if (g_tree_node_post_order (node->left, traverse_func, data))
+ return TRUE;
+ }
+
+ if (node->right_child)
+ {
+ 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;
+
+ while (1)
+ {
+ dir = (* search_func) (node->key, data);
+ if (dir == 0)
+ return node->value;
+ else if (dir < 0)
+ {
+ if (!node->left_child)
+ return NULL;
+
+ node = node->left;
+ }
+ else
+ {
+ if (!node->right_child)
+ return NULL;
+
+ node = node->right;
+ }
+ }
+}
+
+static GTreeNode*
+g_tree_node_rotate_left (GTreeNode *node)
+{
+ GTreeNode *right;
+ gint a_bal;
+ gint b_bal;
+
+ right = node->right;
+
+ if (right->left_child)
+ node->right = right->left;
+ else
+ {
+ node->right_child = FALSE;
+ node->right = right;
+ right->left_child = TRUE;
+ }
+ 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;
+
+ if (left->right_child)
+ node->left = left->right;
+ else
+ {
+ node->left_child = FALSE;
+ node->left = left;
+ left->right_child = TRUE;
+ }
+ 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;
+}
+
+#ifdef G_TREE_DEBUG
+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_child)
+ left_height = g_tree_node_height (node->left);
+
+ if (node->right_child)
+ right_height = g_tree_node_height (node->right);
+
+ return MAX (left_height, right_height) + 1;
+ }
+
+ return 0;
+}
+
+static void
+g_tree_node_check (GTreeNode *node)
+{
+ gint left_height;
+ gint right_height;
+ gint balance;
+ GTreeNode *tmp;
+
+ if (node)
+ {
+ if (node->left_child)
+ {
+ tmp = g_tree_node_previous (node);
+ g_assert (tmp->right == node);
+ }
+
+ if (node->right_child)
+ {
+ tmp = g_tree_node_next (node);
+ g_assert (tmp->left == node);
+ }
+
+ left_height = 0;
+ right_height = 0;
+
+ if (node->left_child)
+ left_height = g_tree_node_height (node->left);
+ if (node->right_child)
+ right_height = g_tree_node_height (node->right);
+
+ balance = right_height - left_height;
+ g_assert (balance == node->balance);
+
+ if (node->left_child)
+ g_tree_node_check (node->left);
+ if (node->right_child)
+ g_tree_node_check (node->right);
+ }
+}
+
+static void
+g_tree_node_dump (GTreeNode *node,
+ gint indent)
+{
+ g_print ("%*s%c\n", indent, "", *(char *)node->key);
+
+ if (node->left_child)
+ g_tree_node_dump (node->left, indent + 2);
+ else if (node->left)
+ g_print ("%*s<%c\n", indent + 2, "", *(char *)node->left->key);
+
+ if (node->right_child)
+ g_tree_node_dump (node->right, indent + 2);
+ else if (node->right)
+ g_print ("%*s>%c\n", indent + 2, "", *(char *)node->right->key);
+}
+
+
+void
+g_tree_dump (GTree *tree)
+{
+ if (tree->root)
+ g_tree_node_dump (tree->root, 0);
+}
+#endif
+
+
+#define __G_TREE_C__
+#include "galiasdef.c"
+
diff --git a/trunk/glib/gtree.h b/trunk/glib/gtree.h
new file mode 100644
index 000000000..bab712797
--- /dev/null
+++ b/trunk/glib/gtree.h
@@ -0,0 +1,88 @@
+/* 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 <glib/gnode.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GTree GTree;
+
+typedef gboolean (*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);
+gboolean g_tree_remove (GTree *tree,
+ gconstpointer key);
+gboolean 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);
+
+#ifndef G_DISABLE_DEPRECATED
+void g_tree_traverse (GTree *tree,
+ GTraverseFunc traverse_func,
+ GTraverseType traverse_type,
+ gpointer user_data);
+#endif /* G_DISABLE_DEPRECATED */
+
+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/trunk/glib/gtypes.h b/trunk/glib/gtypes.h
new file mode 100644
index 000000000..eaeabd2a8
--- /dev/null
+++ b/trunk/glib/gtypes.h
@@ -0,0 +1,429 @@
+/* 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 <glibconfig.h>
+
+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;
+
+/* Define min and max constants for the fixed size numerical types */
+#define G_MININT8 ((gint8) 0x80)
+#define G_MAXINT8 ((gint8) 0x7f)
+#define G_MAXUINT8 ((guint8) 0xff)
+
+#define G_MININT16 ((gint16) 0x8000)
+#define G_MAXINT16 ((gint16) 0x7fff)
+#define G_MAXUINT16 ((guint16) 0xffff)
+
+#define G_MININT32 ((gint32) 0x80000000)
+#define G_MAXINT32 ((gint32) 0x7fffffff)
+#define G_MAXUINT32 ((guint32) 0xffffffff)
+
+#define G_MININT64 ((gint64) G_GINT64_CONSTANT(0x8000000000000000))
+#define G_MAXINT64 G_GINT64_CONSTANT(0x7fffffffffffffff)
+#define G_MAXUINT64 G_GINT64_CONSTANT(0xffffffffffffffffU)
+
+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);
+typedef const gchar * (*GTranslateFunc) (const gchar *str,
+ gpointer data);
+
+
+/* Define some mathematical constants that aren't available
+ * symbolically in some strict ISO C implementations.
+ *
+ * Note that the large number of digits used in these definitions
+ * doesn't imply that GLib or current computers in general would be
+ * able to handle floating point numbers with an accuracy like this.
+ * It's mostly an exercise in futility and future proofing. For
+ * extended precision floating point support, look somewhere else
+ * than GLib.
+ */
+#define G_E 2.7182818284590452353602874713526624977572470937000
+#define G_LN2 0.69314718055994530941723212145817656807550013436026
+#define G_LN10 2.3025850929940456840179914546843642076011014886288
+#define G_PI 3.1415926535897932384626433832795028841971693993751
+#define G_PI_2 1.5707963267948966192313216916397514420985846996876
+#define G_PI_4 0.78539816339744830961566084581987572104929234984378
+#define G_SQRT2 1.4142135623730950488016887242096980785696718753769
+
+/* 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) ((guint16) (val) >> 8) | \
+ (guint16) ((guint16) (val) << 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)))
+
+#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)))
+
+/* Arch specific stuff for speed
+ */
+#if defined (__GNUC__) && (__GNUC__ >= 2) && defined (__OPTIMIZE__)
+# if defined (__i386__)
+# define GUINT16_SWAP_LE_BE_IA32(val) \
+ (__extension__ \
+ ({ register guint16 __v, __x = ((guint16) (val)); \
+ if (__builtin_constant_p (__x)) \
+ __v = GUINT16_SWAP_LE_BE_CONSTANT (__x); \
+ else \
+ __asm__ ("rorw $8, %w0" \
+ : "=r" (__v) \
+ : "0" (__x) \
+ : "cc"); \
+ __v; }))
+# if !defined (__i486__) && !defined (__i586__) \
+ && !defined (__pentium__) && !defined (__i686__) \
+ && !defined (__pentiumpro__) && !defined (__pentium4__)
+# define GUINT32_SWAP_LE_BE_IA32(val) \
+ (__extension__ \
+ ({ register guint32 __v, __x = ((guint32) (val)); \
+ if (__builtin_constant_p (__x)) \
+ __v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \
+ else \
+ __asm__ ("rorw $8, %w0\n\t" \
+ "rorl $16, %0\n\t" \
+ "rorw $8, %w0" \
+ : "=r" (__v) \
+ : "0" (__x) \
+ : "cc"); \
+ __v; }))
+# else /* 486 and higher has bswap */
+# define GUINT32_SWAP_LE_BE_IA32(val) \
+ (__extension__ \
+ ({ register guint32 __v, __x = ((guint32) (val)); \
+ if (__builtin_constant_p (__x)) \
+ __v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \
+ else \
+ __asm__ ("bswap %0" \
+ : "=r" (__v) \
+ : "0" (__x)); \
+ __v; }))
+# endif /* processor specific 32-bit stuff */
+# define GUINT64_SWAP_LE_BE_IA32(val) \
+ (__extension__ \
+ ({ union { guint64 __ll; \
+ guint32 __l[2]; } __w, __r; \
+ __w.__ll = ((guint64) (val)); \
+ if (__builtin_constant_p (__w.__ll)) \
+ __r.__ll = GUINT64_SWAP_LE_BE_CONSTANT (__w.__ll); \
+ else \
+ { \
+ __r.__l[0] = GUINT32_SWAP_LE_BE (__w.__l[1]); \
+ __r.__l[1] = GUINT32_SWAP_LE_BE (__w.__l[0]); \
+ } \
+ __r.__ll; }))
+ /* Possibly just use the constant version and let gcc figure it out? */
+# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_IA32 (val))
+# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_IA32 (val))
+# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_IA32 (val))
+# elif defined (__ia64__)
+# define GUINT16_SWAP_LE_BE_IA64(val) \
+ (__extension__ \
+ ({ register guint16 __v, __x = ((guint16) (val)); \
+ if (__builtin_constant_p (__x)) \
+ __v = GUINT16_SWAP_LE_BE_CONSTANT (__x); \
+ else \
+ __asm__ __volatile__ ("shl %0 = %1, 48 ;;" \
+ "mux1 %0 = %0, @rev ;;" \
+ : "=r" (__v) \
+ : "r" (__x)); \
+ __v; }))
+# define GUINT32_SWAP_LE_BE_IA64(val) \
+ (__extension__ \
+ ({ register guint32 __v, __x = ((guint32) (val)); \
+ if (__builtin_constant_p (__x)) \
+ __v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \
+ else \
+ __asm__ __volatile__ ("shl %0 = %1, 32 ;;" \
+ "mux1 %0 = %0, @rev ;;" \
+ : "=r" (__v) \
+ : "r" (__x)); \
+ __v; }))
+# define GUINT64_SWAP_LE_BE_IA64(val) \
+ (__extension__ \
+ ({ register guint64 __v, __x = ((guint64) (val)); \
+ if (__builtin_constant_p (__x)) \
+ __v = GUINT64_SWAP_LE_BE_CONSTANT (__x); \
+ else \
+ __asm__ __volatile__ ("mux1 %0 = %1, @rev ;;" \
+ : "=r" (__v) \
+ : "r" (__x)); \
+ __v; }))
+# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_IA64 (val))
+# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_IA64 (val))
+# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_IA64 (val))
+# elif defined (__x86_64__)
+# define GUINT32_SWAP_LE_BE_X86_64(val) \
+ (__extension__ \
+ ({ register guint32 __v, __x = ((guint32) (val)); \
+ if (__builtin_constant_p (__x)) \
+ __v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \
+ else \
+ __asm__ ("bswapl %0" \
+ : "=r" (__v) \
+ : "0" (__x)); \
+ __v; }))
+# define GUINT64_SWAP_LE_BE_X86_64(val) \
+ (__extension__ \
+ ({ register guint64 __v, __x = ((guint64) (val)); \
+ if (__builtin_constant_p (__x)) \
+ __v = GUINT64_SWAP_LE_BE_CONSTANT (__x); \
+ else \
+ __asm__ ("bswapq %0" \
+ : "=r" (__v) \
+ : "0" (__x)); \
+ __v; }))
+ /* gcc seems to figure out optimal code for this on its own */
+# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val))
+# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_X86_64 (val))
+# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_X86_64 (val))
+# else /* generic gcc */
+# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val))
+# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_CONSTANT (val))
+# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_CONSTANT (val))
+# endif
+#else /* generic */
+# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val))
+# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_CONSTANT (val))
+# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_CONSTANT (val))
+#endif /* generic */
+
+#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))
+
+#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))
+
+#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 (normal 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/trunk/glib/gunibreak.c b/trunk/glib/gunibreak.c
new file mode 100644
index 000000000..9c129218c
--- /dev/null
+++ b/trunk/glib/gunibreak.c
@@ -0,0 +1,66 @@
+/* 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 "config.h"
+
+#include <stdlib.h>
+
+#include "glib.h"
+#include "gunibreak.h"
+#include "galias.h"
+
+#define TPROP_PART1(Page, Char) \
+ ((break_property_table_part1[Page] >= G_UNICODE_MAX_TABLE_INDEX) \
+ ? (break_property_table_part1[Page] - G_UNICODE_MAX_TABLE_INDEX) \
+ : (break_property_data[break_property_table_part1[Page]][Char]))
+
+#define TPROP_PART2(Page, Char) \
+ ((break_property_table_part2[Page] >= G_UNICODE_MAX_TABLE_INDEX) \
+ ? (break_property_table_part2[Page] - G_UNICODE_MAX_TABLE_INDEX) \
+ : (break_property_data[break_property_table_part2[Page]][Char]))
+
+#define PROP(Char) \
+ (((Char) <= G_UNICODE_LAST_CHAR_PART1) \
+ ? TPROP_PART1 ((Char) >> 8, (Char) & 0xff) \
+ : (((Char) >= 0xe0000 && (Char) <= G_UNICODE_LAST_CHAR) \
+ ? TPROP_PART2 (((Char) - 0xe0000) >> 8, (Char) & 0xff) \
+ : G_UNICODE_BREAK_UNKNOWN))
+
+/**
+ * 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 algorithms and normally you would use a function such
+ * as pango_break() instead of caring about break types yourself.
+ *
+ * Return value: the break type of @c
+ **/
+GUnicodeBreakType
+g_unichar_break_type (gunichar c)
+{
+ return PROP (c);
+}
+
+#define __G_UNIBREAK_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gunibreak.h b/trunk/glib/gunibreak.h
new file mode 100644
index 000000000..6be19116c
--- /dev/null
+++ b/trunk/glib/gunibreak.h
@@ -0,0 +1,17270 @@
+/* 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 "5.0.0"
+
+#define G_UNICODE_LAST_CHAR 0x10FFFF
+
+#define G_UNICODE_MAX_TABLE_INDEX 10000
+
+/* the last code point that should be looked up in break_property_table_part1 */
+#define G_UNICODE_LAST_CHAR_PART1 0x2FAFF
+
+static const gint8 break_property_data[][256] = {
+ { /* page 0, index 0 */
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_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_MANDATORY,
+ 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_NEXT_LINE,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_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_BEFORE,
+ 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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_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
+ },
+ { /* page 2, index 1 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC
+ },
+ { /* page 3, index 2 */
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_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_NON_BREAKING_GLUE,
+ G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE,
+ G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE,
+ G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_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_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_INFIX_SEPARATOR, 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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_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
+ },
+ { /* page 4, index 3 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC
+ },
+ { /* page 5, index 4 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_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_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_COMBINING_MARK, G_UNICODE_BREAK_EXCLAMATION,
+ 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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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
+ },
+ { /* page 6, index 5 */
+ 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_POSTFIX,
+ G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_INFIX_SEPARATOR,
+ 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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_EXCLAMATION,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION,
+ 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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_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_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_EXCLAMATION, G_UNICODE_BREAK_NUMERIC,
+ G_UNICODE_BREAK_NUMERIC, 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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_EXCLAMATION, 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_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_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_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
+ },
+ { /* page 7, index 6 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_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_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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_EXCLAMATION,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 9, index 7 */
+ 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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_AFTER, G_UNICODE_BREAK_AFTER, 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_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_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_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_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_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_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
+ },
+ { /* page 10, index 8 */
+ 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_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_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_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_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_UNKNOWN, 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
+ },
+ { /* page 11, index 9 */
+ 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_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_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_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_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_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_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_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_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_PREFIX,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 12, index 10 */
+ 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_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_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_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_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
+ },
+ { /* page 13, index 11 */
+ 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
+ },
+ { /* page 14, index 12 */
+ 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_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_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_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_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_AFTER,
+ 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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_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_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_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_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_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
+ },
+ { /* page 15, index 13 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE,
+ G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE,
+ G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_NON_BREAKING_GLUE,
+ G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_AFTER,
+ G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_EXCLAMATION,
+ G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION,
+ G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION,
+ G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_EXCLAMATION, 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_AFTER, 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_AFTER,
+ G_UNICODE_BREAK_COMBINING_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_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_AFTER, 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_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_BEFORE,
+ G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 16, index 14 */
+ 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_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_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_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_AFTER,
+ G_UNICODE_BREAK_AFTER, 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_COMPLEX_CONTEXT,
+ G_UNICODE_BREAK_COMPLEX_CONTEXT, 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, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_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_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
+ },
+ { /* page 17, index 15 */
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 18, index 16 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_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_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_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_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
+ },
+ { /* page 19, index 17 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_ALPHABETIC, 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_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_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
+ },
+ { /* page 20, index 18 */
+ 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
+ },
+ { /* page 22, index 19 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER,
+ 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
+ },
+ { /* page 23, index 20 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_AFTER,
+ 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_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_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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_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_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_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_AFTER,
+ G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_NON_STARTER,
+ G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_AFTER,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER,
+ G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_COMPLEX_CONTEXT,
+ G_UNICODE_BREAK_COMPLEX_CONTEXT, 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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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
+ },
+ { /* page 24, index 21 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER,
+ G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_BEFORE,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_NON_BREAKING_GLUE, 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
+ },
+ { /* page 25, index 22 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_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_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION,
+ 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_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_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_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_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_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_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC
+ },
+ { /* page 26, index 23 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER,
+ 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, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 27, index 24 */
+ G_UNICODE_BREAK_COMBINING_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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_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_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_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 29, index 25 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK
+ },
+ { /* page 30, index 26 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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
+ },
+ { /* page 31, index 27 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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
+ },
+ { /* page 32, index 28 */
+ 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_AMBIGUOUS, 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_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_INFIX_SEPARATOR,
+ G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION,
+ 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_AFTER,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER,
+ G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER,
+ G_UNICODE_BREAK_WORD_JOINER, 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ 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_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_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_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_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
+ },
+ { /* page 33, index 29 */
+ 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_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_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_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_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC
+ },
+ { /* page 34, index 30 */
+ 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC
+ },
+ { /* page 35, index 31 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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
+ },
+ { /* page 36, index 32 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_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
+ },
+ { /* page 37, index 33 */
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_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_AMBIGUOUS, 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC
+ },
+ { /* page 38, index 34 */
+ 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_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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 39, index 35 */
+ 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_QUOTATION,
+ G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION,
+ G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION,
+ 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_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_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS,
+ G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_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_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_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC
+ },
+ { /* page 41, index 36 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_OPEN_PUNCTUATION,
+ G_UNICODE_BREAK_CLOSE_PUNCTUATION, 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_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION,
+ 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_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC
+ },
+ { /* page 43, index 37 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 44, index 38 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_UNKNOWN,
+ G_UNICODE_BREAK_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_UNKNOWN,
+ G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_AFTER, G_UNICODE_BREAK_AFTER,
+ G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER
+ },
+ { /* page 45, index 39 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_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_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_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 46, index 40 */
+ G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION,
+ G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION,
+ G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION,
+ G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION,
+ G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION,
+ G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION,
+ G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION,
+ 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_AFTER, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_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
+ },
+ { /* page 47, index 41 */
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_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
+ },
+ { /* page 48, index 42 */
+ 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_NON_STARTER,
+ G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC,
+ 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_NON_STARTER,
+ G_UNICODE_BREAK_NON_STARTER, 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_IDEOGRAPHIC,
+ G_UNICODE_BREAK_NON_STARTER, 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_NON_STARTER, G_UNICODE_BREAK_NON_STARTER,
+ G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC
+ },
+ { /* page 49, index 43 */
+ 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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_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_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_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
+ },
+ { /* page 50, index 44 */
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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
+ },
+ { /* page 77, index 45 */
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC
+ },
+ { /* page 159, index 46 */
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_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
+ },
+ { /* page 160, index 47 */
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC
+ },
+ { /* page 164, index 48 */
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_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
+ },
+ { /* page 167, index 49 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 168, index 50 */
+ 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_COMBINING_MARK, 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_BEFORE,
+ G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 172, index 51 */
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 173, index 52 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 174, index 53 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 175, index 54 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 176, index 55 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 177, index 56 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 178, index 57 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 179, index 58 */
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 180, index 59 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 181, index 60 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 182, index 61 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 183, index 62 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 184, index 63 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 185, index 64 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 186, index 65 */
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 187, index 66 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 188, index 67 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 189, index 68 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 190, index 69 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 191, index 70 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 192, index 71 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 193, index 72 */
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 194, index 73 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 195, index 74 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 196, index 75 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 197, index 76 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 198, index 77 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 199, index 78 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 200, index 79 */
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 201, index 80 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 202, index 81 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 203, index 82 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 204, index 83 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 205, index 84 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 206, index 85 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 207, index 86 */
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 208, index 87 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 209, index 88 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 210, index 89 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 211, index 90 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 212, index 91 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 213, index 92 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 214, index 93 */
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+ },
+ { /* page 215, index 94 */
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 250, index 95 */
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_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_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_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
+ },
+ { /* page 251, index 96 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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
+ },
+ { /* page 253, index 97 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_POSTFIX, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 254, index 98 */
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_CLOSE_PUNCTUATION,
+ G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_INFIX_SEPARATOR,
+ G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_EXCLAMATION,
+ G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_OPEN_PUNCTUATION,
+ G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_INSEPARABLE,
+ G_UNICODE_BREAK_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_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_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_IDEOGRAPHIC,
+ 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_WORD_JOINER
+ },
+ { /* page 255, index 99 */
+ 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_OPEN_PUNCTUATION,
+ G_UNICODE_BREAK_CLOSE_PUNCTUATION, 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
+ },
+ { /* page 256, index 100 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_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_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_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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
+ },
+ { /* page 257, index 101 */
+ G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER,
+ 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_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 259, index 102 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_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_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_AFTER, 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
+ },
+ { /* page 260, index 103 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_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,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 264, index 104 */
+ G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_UNKNOWN,
+ 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,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 265, index 105 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_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_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 266, index 106 */
+ G_UNICODE_BREAK_ALPHABETIC, 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_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_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_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_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, 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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_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_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_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,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 291, index 107 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 292, index 108 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_AFTER,
+ G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, 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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 464, index 109 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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
+ },
+ { /* page 465, index 110 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_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_COMBINING_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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
+ },
+ { /* page 466, index 111 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_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,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 467, index 112 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 468, index 113 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_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_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC
+ },
+ { /* page 469, index 114 */
+ G_UNICODE_BREAK_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_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_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_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_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_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_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC
+ },
+ { /* page 470, index 115 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC
+ },
+ { /* page 471, index 116 */
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC,
+ G_UNICODE_BREAK_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_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_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_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_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_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
+ },
+ { /* page 678, index 117 */
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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
+ },
+ { /* page 762, index 118 */
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC,
+ G_UNICODE_BREAK_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,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 3584, index 119 */
+ 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_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_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, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN,
+ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN
+ },
+ { /* page 3585, index 120 */
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK,
+ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_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
+ }
+};
+
+/* U+0000 through U+2FAFF */
+static const gint16 break_property_table_part1[763] = {
+ 0 /* page 0 */,
+ G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX,
+ 1 /* page 2 */,
+ 2 /* page 3 */,
+ 3 /* page 4 */,
+ 4 /* page 5 */,
+ 5 /* page 6 */,
+ 6 /* page 7 */,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ 7 /* page 9 */,
+ 8 /* page 10 */,
+ 9 /* page 11 */,
+ 10 /* page 12 */,
+ 11 /* page 13 */,
+ 12 /* page 14 */,
+ 13 /* page 15 */,
+ 14 /* page 16 */,
+ 15 /* page 17 */,
+ 16 /* page 18 */,
+ 17 /* page 19 */,
+ 18 /* page 20 */,
+ G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX,
+ 19 /* page 22 */,
+ 20 /* page 23 */,
+ 21 /* page 24 */,
+ 22 /* page 25 */,
+ 23 /* page 26 */,
+ 24 /* page 27 */,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ 25 /* page 29 */,
+ 26 /* page 30 */,
+ 27 /* page 31 */,
+ 28 /* page 32 */,
+ 29 /* page 33 */,
+ 30 /* page 34 */,
+ 31 /* page 35 */,
+ 32 /* page 36 */,
+ 33 /* page 37 */,
+ 34 /* page 38 */,
+ 35 /* page 39 */,
+ G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX,
+ 36 /* page 41 */,
+ G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX,
+ 37 /* page 43 */,
+ 38 /* page 44 */,
+ 39 /* page 45 */,
+ 40 /* page 46 */,
+ 41 /* page 47 */,
+ 42 /* page 48 */,
+ 43 /* page 49 */,
+ 44 /* page 50 */,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ 45 /* page 77 */,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ 46 /* page 159 */,
+ 47 /* page 160 */,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ 48 /* page 164 */,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ 49 /* page 167 */,
+ 50 /* page 168 */,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ 51 /* page 172 */,
+ 52 /* page 173 */,
+ 53 /* page 174 */,
+ 54 /* page 175 */,
+ 55 /* page 176 */,
+ 56 /* page 177 */,
+ 57 /* page 178 */,
+ 58 /* page 179 */,
+ 59 /* page 180 */,
+ 60 /* page 181 */,
+ 61 /* page 182 */,
+ 62 /* page 183 */,
+ 63 /* page 184 */,
+ 64 /* page 185 */,
+ 65 /* page 186 */,
+ 66 /* page 187 */,
+ 67 /* page 188 */,
+ 68 /* page 189 */,
+ 69 /* page 190 */,
+ 70 /* page 191 */,
+ 71 /* page 192 */,
+ 72 /* page 193 */,
+ 73 /* page 194 */,
+ 74 /* page 195 */,
+ 75 /* page 196 */,
+ 76 /* page 197 */,
+ 77 /* page 198 */,
+ 78 /* page 199 */,
+ 79 /* page 200 */,
+ 80 /* page 201 */,
+ 81 /* page 202 */,
+ 82 /* page 203 */,
+ 83 /* page 204 */,
+ 84 /* page 205 */,
+ 85 /* page 206 */,
+ 86 /* page 207 */,
+ 87 /* page 208 */,
+ 88 /* page 209 */,
+ 89 /* page 210 */,
+ 90 /* page 211 */,
+ 91 /* page 212 */,
+ 92 /* page 213 */,
+ 93 /* page 214 */,
+ 94 /* page 215 */,
+ G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ 95 /* page 250 */,
+ 96 /* page 251 */,
+ G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX,
+ 97 /* page 253 */,
+ 98 /* page 254 */,
+ 99 /* page 255 */,
+ 100 /* page 256 */,
+ 101 /* page 257 */,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ 102 /* page 259 */,
+ 103 /* page 260 */,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ 104 /* page 264 */,
+ 105 /* page 265 */,
+ 106 /* page 266 */,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX,
+ 107 /* page 291 */,
+ 108 /* page 292 */,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ 109 /* page 464 */,
+ 110 /* page 465 */,
+ 111 /* page 466 */,
+ 112 /* page 467 */,
+ 113 /* page 468 */,
+ 114 /* page 469 */,
+ 115 /* page 470 */,
+ 116 /* page 471 */,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ 117 /* page 678 */,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX,
+ 118 /* page 762 */
+};
+
+/* U+E0000 through U+10FFFF */
+static const gint16 break_property_table_part2[768] = {
+ 119 /* page 3584 */,
+ 120 /* page 3585 */,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX
+};
+
+#endif /* BREAKTABLES_H */
diff --git a/trunk/glib/gunichartables.h b/trunk/glib/gunichartables.h
new file mode 100644
index 000000000..f70545220
--- /dev/null
+++ b/trunk/glib/gunichartables.h
@@ -0,0 +1,12250 @@
+/* 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 "5.0.0"
+
+#define G_UNICODE_LAST_CHAR 0x10ffff
+
+#define G_UNICODE_MAX_TABLE_INDEX 10000
+
+#define G_UNICODE_LAST_CHAR_PART1 0x2FAFF
+
+#define G_UNICODE_LAST_PAGE_PART1 762
+
+static const char type_data[][256] = {
+ { /* page 0, index 0 */
+ 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_FORMAT,
+ 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
+ },
+ { /* page 1, index 1 */
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_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
+ },
+ { /* page 2, index 2 */
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_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_UPPERCASE_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_UPPERCASE_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_LOWERCASE_LETTER,
+ G_UNICODE_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_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_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_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_LETTER,
+ 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_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_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_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_SYMBOL,
+ G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL
+ },
+ { /* page 3, index 3 */
+ 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_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_MODIFIER_SYMBOL,
+ G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_MODIFIER_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, 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_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_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_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_MATH_SYMBOL, 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_UPPERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER
+ },
+ { /* page 4, index 4 */
+ 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_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_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_UPPERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_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_LOWERCASE_LETTER
+ },
+ { /* page 5, index 5 */
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_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_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_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_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_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_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
+ },
+ { /* page 6, index 6 */
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ 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_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION,
+ G_UNICODE_OTHER_SYMBOL, 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_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_OTHER_PUNCTUATION,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION,
+ 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_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_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_LETTER, 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_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_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_FORMAT, 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_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, 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_OTHER_LETTER
+ },
+ { /* page 7, index 7 */
+ 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_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_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_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_MODIFIER_LETTER,
+ G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION,
+ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MODIFIER_LETTER,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
+ },
+ { /* page 9, index 8 */
+ G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK,
+ G_UNICODE_NON_SPACING_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_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_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_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, 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_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_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_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_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
+ },
+ { /* page 10, index 9 */
+ 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_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_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_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_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_UNASSIGNED,
+ 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
+ },
+ { /* page 11, index 10 */
+ 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_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_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_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_NON_SPACING_MARK, 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_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_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_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_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_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED
+ },
+ { /* page 12, index 11 */
+ 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_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER,
+ 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_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_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
+ },
+ { /* page 13, index 12 */
+ 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
+ },
+ { /* page 14, index 13 */
+ 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
+ },
+ { /* page 15, index 14 */
+ 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_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_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED
+ },
+ { /* page 16, index 15 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_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_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MODIFIER_LETTER,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
+ },
+ { /* page 17, index 16 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_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
+ },
+ { /* page 18, index 17 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_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_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_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_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_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_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
+ },
+ { /* page 19, index 18 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_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_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK,
+ 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_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_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_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_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
+ },
+ { /* page 20, index 19 */
+ 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
+ },
+ { /* page 22, index 20 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_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_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER,
+ G_UNICODE_LETTER_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED
+ },
+ { /* page 23, index 21 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_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_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_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_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_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_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_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_UNASSIGNED,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ 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_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_FORMAT,
+ G_UNICODE_FORMAT, 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_MODIFIER_LETTER,
+ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION,
+ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CURRENCY_SYMBOL,
+ G_UNICODE_OTHER_LETTER, 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_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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
+ },
+ { /* page 24, index 22 */
+ 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_NON_SPACING_MARK,
+ G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK,
+ G_UNICODE_SPACE_SEPARATOR, 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
+ },
+ { /* page 25, index 23 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_COMBINING_MARK, G_UNICODE_COMBINING_MARK,
+ G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_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_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_COMBINING_MARK, 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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ 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_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_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_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_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_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_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_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_OTHER_LETTER, G_UNICODE_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_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_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ 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_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL
+ },
+ { /* page 26, index 24 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_COMBINING_MARK, G_UNICODE_COMBINING_MARK,
+ G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ 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_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
+ },
+ { /* page 27, index 25 */
+ 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_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_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_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_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_NON_SPACING_MARK, 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_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_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_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_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_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, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED
+ },
+ { /* page 29, index 26 */
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_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_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_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_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_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_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_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_MODIFIER_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_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_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_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_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_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_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_NON_SPACING_MARK,
+ G_UNICODE_NON_SPACING_MARK
+ },
+ { /* page 30, index 27 */
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_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
+ },
+ { /* page 31, index 28 */
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_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
+ },
+ { /* page 32, index 29 */
+ 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_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_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_MATH_SYMBOL,
+ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CONNECT_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_SPACE_SEPARATOR, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, 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_LOWERCASE_LETTER,
+ 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_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER,
+ G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER,
+ 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_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_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_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_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_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
+ },
+ { /* page 33, index 30 */
+ 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_UPPERCASE_LETTER, 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_OTHER_SYMBOL, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL,
+ G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_LOWERCASE_LETTER, 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_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_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_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
+ },
+ { /* page 35, index 31 */
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_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_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_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_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_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_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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
+ },
+ { /* page 36, index 32 */
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_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_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
+ },
+ { /* page 37, index 33 */
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_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_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
+ },
+ { /* page 38, index 34 */
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_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_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_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED
+ },
+ { /* page 39, index 35 */
+ 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_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_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_MATH_SYMBOL,
+ G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL,
+ G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION,
+ G_UNICODE_CLOSE_PUNCTUATION, 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_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_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_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
+ },
+ { /* page 41, index 36 */
+ 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_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_OPEN_PUNCTUATION,
+ G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION,
+ G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION,
+ G_UNICODE_CLOSE_PUNCTUATION, 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_OPEN_PUNCTUATION,
+ G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION,
+ G_UNICODE_CLOSE_PUNCTUATION, 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_OPEN_PUNCTUATION,
+ G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MATH_SYMBOL,
+ G_UNICODE_MATH_SYMBOL
+ },
+ { /* page 43, index 37 */
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED
+ },
+ { /* page 44, index 38 */
+ 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_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_UNASSIGNED,
+ 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_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_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_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_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_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_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_PUNCTUATION,
+ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION,
+ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_NUMBER,
+ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION
+ },
+ { /* page 45, index 39 */
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_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_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_OTHER_LETTER,
+ G_UNICODE_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_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_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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
+ },
+ { /* page 46, index 40 */
+ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION,
+ G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION,
+ G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_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_INITIAL_PUNCTUATION, G_UNICODE_FINAL_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_DASH_PUNCTUATION,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_INITIAL_PUNCTUATION,
+ G_UNICODE_FINAL_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_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_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
+ },
+ { /* page 47, index 41 */
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_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
+ },
+ { /* page 48, index 42 */
+ 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_MODIFIER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_PUNCTUATION,
+ 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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, 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_OTHER_LETTER,
+ G_UNICODE_DASH_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_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_MODIFIER_LETTER,
+ G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER,
+ G_UNICODE_OTHER_LETTER
+ },
+ { /* page 49, index 43 */
+ 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_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER
+ },
+ { /* page 50, index 44 */
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_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_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_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_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_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_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_UNASSIGNED
+ },
+ { /* page 77, index 45 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL
+ },
+ { /* page 159, index 46 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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
+ },
+ { /* page 160, index 47 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER
+ },
+ { /* page 164, index 48 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_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_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_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
+ },
+ { /* page 167, index 49 */
+ 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_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_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_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
+ },
+ { /* page 168, index 50 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK,
+ 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_OTHER_LETTER, 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_COMBINING_MARK,
+ G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK,
+ G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK,
+ 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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_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_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_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
+ },
+ { /* page 215, index 51 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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
+ },
+ { /* page 250, index 52 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_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_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_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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
+ },
+ { /* page 251, index 53 */
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_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
+ },
+ { /* page 253, index 54 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_CURRENCY_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED
+ },
+ { /* page 254, index 55 */
+ 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_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_OPEN_PUNCTUATION,
+ G_UNICODE_CLOSE_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_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_OTHER_PUNCTUATION,
+ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION,
+ G_UNICODE_CLOSE_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_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_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_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
+ },
+ { /* page 255, index 56 */
+ 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_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION,
+ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION,
+ G_UNICODE_CLOSE_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_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
+ },
+ { /* page 256, index 57 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_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_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_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_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_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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
+ },
+ { /* page 257, index 58 */
+ G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION,
+ G_UNICODE_OTHER_SYMBOL, 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_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_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_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_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_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_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
+ },
+ { /* page 259, index 59 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_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_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_LETTER_NUMBER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_LETTER_NUMBER,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_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_UNASSIGNED,
+ 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_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_PUNCTUATION, 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_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
+ },
+ { /* page 260, index 60 */
+ 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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_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_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, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
+ },
+ { /* page 264, index 61 */
+ G_UNICODE_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_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_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED
+ },
+ { /* page 265, index 62 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, 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_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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED
+ },
+ { /* page 266, index 63 */
+ G_UNICODE_OTHER_LETTER, 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_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_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_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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, 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_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_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
+ },
+ { /* page 291, index 64 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_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
+ },
+ { /* page 292, index 65 */
+ 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_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_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_UNASSIGNED, 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_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
+ },
+ { /* page 464, index 66 */
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_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
+ },
+ { /* page 465, index 67 */
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_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_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, 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_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ 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_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ 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_SYMBOL, 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_NON_SPACING_MARK, 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_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_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_NON_SPACING_MARK,
+ 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_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_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
+ },
+ { /* page 466, index 68 */
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_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_NON_SPACING_MARK,
+ G_UNICODE_NON_SPACING_MARK, 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,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
+ },
+ { /* page 467, index 69 */
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL,
+ G_UNICODE_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_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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED
+ },
+ { /* page 468, index 70 */
+ 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_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_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_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_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER,
+ G_UNICODE_UPPERCASE_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_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_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED,
+ G_UNICODE_LOWERCASE_LETTER, 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_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_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
+ },
+ { /* page 469, index 71 */
+ 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_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER,
+ G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER,
+ G_UNICODE_UPPERCASE_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_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_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_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_UNASSIGNED, 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_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_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_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_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_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
+ },
+ { /* page 470, index 72 */
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_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_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_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_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_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_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, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_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_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_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER
+ },
+ { /* page 471, index 73 */
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_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_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_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,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_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_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_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,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_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_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_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,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ G_UNICODE_LOWERCASE_LETTER, G_UNICODE_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_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
+ 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_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_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_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_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
+ },
+ { /* page 678, index 74 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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
+ },
+ { /* page 762, index 75 */
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
+ G_UNICODE_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,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED
+ },
+ { /* page 3584, index 76 */
+ G_UNICODE_UNASSIGNED, G_UNICODE_FORMAT, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_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_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
+ },
+ { /* page 3585, index 77 */
+ 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_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_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_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
+ },
+ { /* page 4095, index 78 */
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED
+ },
+ { /* page 4351, index 79 */
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE,
+ G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_UNASSIGNED,
+ G_UNICODE_UNASSIGNED
+ }
+};
+
+/* U+0000 through U+2FAFF */
+static const gint16 type_table_part1[763] = {
+ 0 /* page 0 */,
+ 1 /* page 1 */,
+ 2 /* page 2 */,
+ 3 /* page 3 */,
+ 4 /* page 4 */,
+ 5 /* page 5 */,
+ 6 /* page 6 */,
+ 7 /* page 7 */,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ 8 /* page 9 */,
+ 9 /* page 10 */,
+ 10 /* page 11 */,
+ 11 /* page 12 */,
+ 12 /* page 13 */,
+ 13 /* page 14 */,
+ 14 /* page 15 */,
+ 15 /* page 16 */,
+ 16 /* page 17 */,
+ 17 /* page 18 */,
+ 18 /* page 19 */,
+ 19 /* page 20 */,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ 20 /* page 22 */,
+ 21 /* page 23 */,
+ 22 /* page 24 */,
+ 23 /* page 25 */,
+ 24 /* page 26 */,
+ 25 /* page 27 */,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ 26 /* page 29 */,
+ 27 /* page 30 */,
+ 28 /* page 31 */,
+ 29 /* page 32 */,
+ 30 /* page 33 */,
+ G_UNICODE_MATH_SYMBOL + G_UNICODE_MAX_TABLE_INDEX,
+ 31 /* page 35 */,
+ 32 /* page 36 */,
+ 33 /* page 37 */,
+ 34 /* page 38 */,
+ 35 /* page 39 */,
+ G_UNICODE_OTHER_SYMBOL + G_UNICODE_MAX_TABLE_INDEX,
+ 36 /* page 41 */,
+ G_UNICODE_MATH_SYMBOL + G_UNICODE_MAX_TABLE_INDEX,
+ 37 /* page 43 */,
+ 38 /* page 44 */,
+ 39 /* page 45 */,
+ 40 /* page 46 */,
+ 41 /* page 47 */,
+ 42 /* page 48 */,
+ 43 /* page 49 */,
+ 44 /* page 50 */,
+ G_UNICODE_OTHER_SYMBOL + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ 45 /* page 77 */,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ 46 /* page 159 */,
+ 47 /* page 160 */,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ 48 /* page 164 */,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ 49 /* page 167 */,
+ 50 /* page 168 */,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ 51 /* page 215 */,
+ G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ 52 /* page 250 */,
+ 53 /* page 251 */,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ 54 /* page 253 */,
+ 55 /* page 254 */,
+ 56 /* page 255 */,
+ 57 /* page 256 */,
+ 58 /* page 257 */,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ 59 /* page 259 */,
+ 60 /* page 260 */,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ 61 /* page 264 */,
+ 62 /* page 265 */,
+ 63 /* page 266 */,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ 64 /* page 291 */,
+ 65 /* page 292 */,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ 66 /* page 464 */,
+ 67 /* page 465 */,
+ 68 /* page 466 */,
+ 69 /* page 467 */,
+ 70 /* page 468 */,
+ 71 /* page 469 */,
+ 72 /* page 470 */,
+ 73 /* page 471 */,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ 74 /* page 678 */,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX,
+ 75 /* page 762 */
+};
+
+/* U+E0000 through U+10FFFF */
+static const gint16 type_table_part2[768] = {
+ 76 /* page 3584 */,
+ 77 /* page 3585 */,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ 78 /* page 4095 */,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX,
+ 79 /* page 4351 */
+};
+
+static const gunichar attr_data[][256] = {
+ { /* page 0, index 0 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x1000000,
+ 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
+ },
+ { /* page 1, index 1 */
+ 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, 0x1000007, 0x0049, 0x0133, 0x0132, 0x0135,
+ 0x0134, 0x0137, 0x0136, 0x0000, 0x013a, 0x0139, 0x013c, 0x013b, 0x013e,
+ 0x013d, 0x0140, 0x013f, 0x0142, 0x0141, 0x0144, 0x0143, 0x0146, 0x0145,
+ 0x0148, 0x0147, 0x1000086, 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, 0x0243, 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, 0x023d, 0x0000, 0x026f, 0x0272, 0x0220, 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,
+ 0x10000ad, 0x01f3, 0x0000, 0x01f1, 0x01f5, 0x01f4, 0x0195, 0x01bf,
+ 0x01f9, 0x01f8, 0x01fb, 0x01fa, 0x01fd, 0x01fc, 0x01ff, 0x01fe
+ },
+ { /* page 2, index 2 */
+ 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, 0x019e, 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, 0x2c65, 0x023c, 0x023b, 0x019a, 0x2c66,
+ 0x0000, 0x0000, 0x0242, 0x0241, 0x0180, 0x0289, 0x028c, 0x0247, 0x0246,
+ 0x0249, 0x0248, 0x024b, 0x024a, 0x024d, 0x024c, 0x024f, 0x024e, 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, 0x2c62,
+ 0x0000, 0x0000, 0x0000, 0x019c, 0x0000, 0x0000, 0x019d, 0x0000, 0x0000,
+ 0x019f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2c64,
+ 0x0000, 0x0000, 0x01a6, 0x0000, 0x0000, 0x01a9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x01ae, 0x0244, 0x01b1, 0x01b2, 0x0245, 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
+ },
+ { /* page 3, index 3 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03fd, 0x03fe, 0x03ff,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03ac,
+ 0x0000, 0x03ad, 0x03ae, 0x03af, 0x0000, 0x03cc, 0x0000, 0x03cd, 0x03ce,
+ 0x100008f, 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, 0x100009e, 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, 0x03d9, 0x03d8, 0x03db, 0x03da, 0x03dd, 0x03dc, 0x03df,
+ 0x03de, 0x03e1, 0x03e0, 0x03e3, 0x03e2, 0x03e5, 0x03e4, 0x03e7, 0x03e6,
+ 0x03e9, 0x03e8, 0x03eb, 0x03ea, 0x03ed, 0x03ec, 0x03ef, 0x03ee, 0x039a,
+ 0x03a1, 0x03f9, 0x0000, 0x03b8, 0x0395, 0x0000, 0x03f8, 0x03f7, 0x03f2,
+ 0x03fb, 0x03fa, 0x0000, 0x037b, 0x037c, 0x037d
+ },
+ { /* page 4, index 4 */
+ 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, 0x048b, 0x048a, 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, 0x04cf, 0x04c2, 0x04c1, 0x04c4, 0x04c3, 0x04c6,
+ 0x04c5, 0x04c8, 0x04c7, 0x04ca, 0x04c9, 0x04cc, 0x04cb, 0x04ce, 0x04cd,
+ 0x04c0, 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, 0x04f7, 0x04f6, 0x04f9, 0x04f8, 0x04fb, 0x04fa,
+ 0x04fd, 0x04fc, 0x04ff, 0x04fe
+ },
+ { /* page 5, index 5 */
+ 0x0501, 0x0500, 0x0503, 0x0502, 0x0505, 0x0504, 0x0507, 0x0506, 0x0509,
+ 0x0508, 0x050b, 0x050a, 0x050d, 0x050c, 0x050f, 0x050e, 0x0511, 0x0510,
+ 0x0513, 0x0512, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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,
+ 0x1000044, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+ },
+ { /* page 6, index 6 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 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
+ },
+ { /* page 7, index 7 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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
+ },
+ { /* page 9, index 8 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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
+ },
+ { /* page 10, index 9 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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
+ },
+ { /* page 11, index 10 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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
+ },
+ { /* page 12, index 11 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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
+ },
+ { /* page 13, index 12 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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
+ },
+ { /* page 14, index 13 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 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
+ },
+ { /* page 15, index 14 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 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
+ },
+ { /* page 16, index 15 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x2d00, 0x2d01,
+ 0x2d02, 0x2d03, 0x2d04, 0x2d05, 0x2d06, 0x2d07, 0x2d08, 0x2d09, 0x2d0a,
+ 0x2d0b, 0x2d0c, 0x2d0d, 0x2d0e, 0x2d0f, 0x2d10, 0x2d11, 0x2d12, 0x2d13,
+ 0x2d14, 0x2d15, 0x2d16, 0x2d17, 0x2d18, 0x2d19, 0x2d1a, 0x2d1b, 0x2d1c,
+ 0x2d1d, 0x2d1e, 0x2d1f, 0x2d20, 0x2d21, 0x2d22, 0x2d23, 0x2d24, 0x2d25,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000
+ },
+ { /* page 23, index 16 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 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
+ },
+ { /* page 24, index 17 */
+ 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
+ },
+ { /* page 25, index 18 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 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, 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
+ },
+ { /* page 27, index 19 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 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
+ },
+ { /* page 29, index 20 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2c63,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000
+ },
+ { /* page 30, index 21 */
+ 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, 0x10000b6, 0x10000bf,
+ 0x10000c8, 0x10000d1, 0x10000da, 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
+ },
+ { /* page 31, index 22 */
+ 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,
+ 0x10000e3, 0x1f59, 0x10000ee, 0x1f5b, 0x10000fd, 0x1f5d, 0x100010c,
+ 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, 0x10001b7, 0x10001c4, 0x10001d1,
+ 0x10001de, 0x10001eb, 0x10001f8, 0x1000205, 0x1000212, 0x100021f,
+ 0x1000229, 0x1000233, 0x100023d, 0x1000247, 0x1000251, 0x100025b,
+ 0x1000265, 0x100026f, 0x100027c, 0x1000289, 0x1000296, 0x10002a3,
+ 0x10002b0, 0x10002bd, 0x10002ca, 0x10002d7, 0x10002e1, 0x10002eb,
+ 0x10002f5, 0x10002ff, 0x1000309, 0x1000313, 0x100031d, 0x1000327,
+ 0x1000334, 0x1000341, 0x100034e, 0x100035b, 0x1000368, 0x1000375,
+ 0x1000382, 0x100038f, 0x1000399, 0x10003a3, 0x10003ad, 0x10003b7,
+ 0x10003c1, 0x10003cb, 0x10003d5, 0x1fb8, 0x1fb9, 0x100041e, 0x10003df,
+ 0x100042b, 0x0000, 0x100011b, 0x1000466, 0x1fb0, 0x1fb1, 0x1f70, 0x1f71,
+ 0x10003eb, 0x0000, 0x0399, 0x0000, 0x0000, 0x0000, 0x1000436, 0x10003f4,
+ 0x1000443, 0x0000, 0x1000126, 0x1000475, 0x1f72, 0x1f73, 0x1f74, 0x1f75,
+ 0x1000400, 0x0000, 0x0000, 0x0000, 0x1fd8, 0x1fd9, 0x1000131, 0x1000140,
+ 0x0000, 0x0000, 0x100014f, 0x100015a, 0x1fd0, 0x1fd1, 0x1f76, 0x1f77,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x1fe8, 0x1fe9, 0x1000169, 0x1000178,
+ 0x1000187, 0x1fec, 0x1000192, 0x100019d, 0x1fe0, 0x1fe1, 0x1f7a, 0x1f7b,
+ 0x1fe5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x100044e, 0x1000409,
+ 0x100045b, 0x0000, 0x10001ac, 0x1000484, 0x1f78, 0x1f79, 0x1f7c, 0x1f7d,
+ 0x1000415, 0x0000, 0x0000, 0x0000
+ },
+ { /* page 33, index 23 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x214e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2132, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2184, 0x2183, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000
+ },
+ { /* page 44, index 24 */
+ 0x2c30, 0x2c31, 0x2c32, 0x2c33, 0x2c34, 0x2c35, 0x2c36, 0x2c37, 0x2c38,
+ 0x2c39, 0x2c3a, 0x2c3b, 0x2c3c, 0x2c3d, 0x2c3e, 0x2c3f, 0x2c40, 0x2c41,
+ 0x2c42, 0x2c43, 0x2c44, 0x2c45, 0x2c46, 0x2c47, 0x2c48, 0x2c49, 0x2c4a,
+ 0x2c4b, 0x2c4c, 0x2c4d, 0x2c4e, 0x2c4f, 0x2c50, 0x2c51, 0x2c52, 0x2c53,
+ 0x2c54, 0x2c55, 0x2c56, 0x2c57, 0x2c58, 0x2c59, 0x2c5a, 0x2c5b, 0x2c5c,
+ 0x2c5d, 0x2c5e, 0x0000, 0x2c00, 0x2c01, 0x2c02, 0x2c03, 0x2c04, 0x2c05,
+ 0x2c06, 0x2c07, 0x2c08, 0x2c09, 0x2c0a, 0x2c0b, 0x2c0c, 0x2c0d, 0x2c0e,
+ 0x2c0f, 0x2c10, 0x2c11, 0x2c12, 0x2c13, 0x2c14, 0x2c15, 0x2c16, 0x2c17,
+ 0x2c18, 0x2c19, 0x2c1a, 0x2c1b, 0x2c1c, 0x2c1d, 0x2c1e, 0x2c1f, 0x2c20,
+ 0x2c21, 0x2c22, 0x2c23, 0x2c24, 0x2c25, 0x2c26, 0x2c27, 0x2c28, 0x2c29,
+ 0x2c2a, 0x2c2b, 0x2c2c, 0x2c2d, 0x2c2e, 0x0000, 0x2c61, 0x2c60, 0x026b,
+ 0x1d7d, 0x027d, 0x023a, 0x023e, 0x2c68, 0x2c67, 0x2c6a, 0x2c69, 0x2c6c,
+ 0x2c6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2c76, 0x2c75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2c81, 0x2c80, 0x2c83, 0x2c82, 0x2c85, 0x2c84, 0x2c87,
+ 0x2c86, 0x2c89, 0x2c88, 0x2c8b, 0x2c8a, 0x2c8d, 0x2c8c, 0x2c8f, 0x2c8e,
+ 0x2c91, 0x2c90, 0x2c93, 0x2c92, 0x2c95, 0x2c94, 0x2c97, 0x2c96, 0x2c99,
+ 0x2c98, 0x2c9b, 0x2c9a, 0x2c9d, 0x2c9c, 0x2c9f, 0x2c9e, 0x2ca1, 0x2ca0,
+ 0x2ca3, 0x2ca2, 0x2ca5, 0x2ca4, 0x2ca7, 0x2ca6, 0x2ca9, 0x2ca8, 0x2cab,
+ 0x2caa, 0x2cad, 0x2cac, 0x2caf, 0x2cae, 0x2cb1, 0x2cb0, 0x2cb3, 0x2cb2,
+ 0x2cb5, 0x2cb4, 0x2cb7, 0x2cb6, 0x2cb9, 0x2cb8, 0x2cbb, 0x2cba, 0x2cbd,
+ 0x2cbc, 0x2cbf, 0x2cbe, 0x2cc1, 0x2cc0, 0x2cc3, 0x2cc2, 0x2cc5, 0x2cc4,
+ 0x2cc7, 0x2cc6, 0x2cc9, 0x2cc8, 0x2ccb, 0x2cca, 0x2ccd, 0x2ccc, 0x2ccf,
+ 0x2cce, 0x2cd1, 0x2cd0, 0x2cd3, 0x2cd2, 0x2cd5, 0x2cd4, 0x2cd7, 0x2cd6,
+ 0x2cd9, 0x2cd8, 0x2cdb, 0x2cda, 0x2cdd, 0x2cdc, 0x2cdf, 0x2cde, 0x2ce1,
+ 0x2ce0, 0x2ce3, 0x2ce2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000
+ },
+ { /* page 45, index 25 */
+ 0x10a0, 0x10a1, 0x10a2, 0x10a3, 0x10a4, 0x10a5, 0x10a6, 0x10a7, 0x10a8,
+ 0x10a9, 0x10aa, 0x10ab, 0x10ac, 0x10ad, 0x10ae, 0x10af, 0x10b0, 0x10b1,
+ 0x10b2, 0x10b3, 0x10b4, 0x10b5, 0x10b6, 0x10b7, 0x10b8, 0x10b9, 0x10ba,
+ 0x10bb, 0x10bc, 0x10bd, 0x10be, 0x10bf, 0x10c0, 0x10c1, 0x10c2, 0x10c3,
+ 0x10c4, 0x10c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000
+ },
+ { /* page 251, index 26 */
+ 0x100000f, 0x1000016, 0x100001d, 0x1000024, 0x100002d, 0x1000036,
+ 0x100003d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x100004f, 0x100005a, 0x1000065,
+ 0x1000070, 0x100007b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000
+ },
+ { /* page 255, index 27 */
+ 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
+ },
+ { /* page 260, index 28 */
+ 0x10428, 0x10429, 0x1042a, 0x1042b, 0x1042c, 0x1042d, 0x1042e, 0x1042f,
+ 0x10430, 0x10431, 0x10432, 0x10433, 0x10434, 0x10435, 0x10436, 0x10437,
+ 0x10438, 0x10439, 0x1043a, 0x1043b, 0x1043c, 0x1043d, 0x1043e, 0x1043f,
+ 0x10440, 0x10441, 0x10442, 0x10443, 0x10444, 0x10445, 0x10446, 0x10447,
+ 0x10448, 0x10449, 0x1044a, 0x1044b, 0x1044c, 0x1044d, 0x1044e, 0x1044f,
+ 0x10400, 0x10401, 0x10402, 0x10403, 0x10404, 0x10405, 0x10406, 0x10407,
+ 0x10408, 0x10409, 0x1040a, 0x1040b, 0x1040c, 0x1040d, 0x1040e, 0x1040f,
+ 0x10410, 0x10411, 0x10412, 0x10413, 0x10414, 0x10415, 0x10416, 0x10417,
+ 0x10418, 0x10419, 0x1041a, 0x1041b, 0x1041c, 0x1041d, 0x1041e, 0x1041f,
+ 0x10420, 0x10421, 0x10422, 0x10423, 0x10424, 0x10425, 0x10426, 0x10427,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 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
+ },
+ { /* page 471, index 29 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 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, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008,
+ 0x0009, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+ 0x0008, 0x0009, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006,
+ 0x0007, 0x0008, 0x0009, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005,
+ 0x0006, 0x0007, 0x0008, 0x0009
+ }
+};
+
+/* U+0000 through U+2FAFF */
+static const gint16 attr_table_part1[763] = {
+ 0 /* page 0 */,
+ 1 /* page 1 */,
+ 2 /* page 2 */,
+ 3 /* page 3 */,
+ 4 /* page 4 */,
+ 5 /* page 5 */,
+ 6 /* page 6 */,
+ 7 /* page 7 */,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 8 /* page 9 */,
+ 9 /* page 10 */,
+ 10 /* page 11 */,
+ 11 /* page 12 */,
+ 12 /* page 13 */,
+ 13 /* page 14 */,
+ 14 /* page 15 */,
+ 15 /* page 16 */,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 16 /* page 23 */,
+ 17 /* page 24 */,
+ 18 /* page 25 */,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 19 /* page 27 */,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 20 /* page 29 */,
+ 21 /* page 30 */,
+ 22 /* page 31 */,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 23 /* page 33 */,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 24 /* page 44 */,
+ 25 /* page 45 */,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 26 /* page 251 */,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 27 /* page 255 */,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 28 /* page 260 */,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 29 /* page 471 */,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX
+};
+
+/* U+E0000 through U+10FFFF */
+static const gint16 attr_table_part2[768] = {
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX,
+ 0x0000 + G_UNICODE_MAX_TABLE_INDEX
+};
+
+static const gunichar 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 }
+};
+
+
+/* Table of special cases for case conversion; each record contains
+ * First, the best single character mapping to lowercase if Lu,
+ * and to uppercase if Ll, followed by the output mapping for the two cases
+ * other than the case of the codepoint, in the order [Ll],[Lu],[Lt],
+ * encoded in UTF-8, separated and terminated by a null character.
+ */
+static const gchar special_case_table[] = {
+ "\x00\x53\x53\x00\x53\x73\0" /* offset 0 */
+ "\x69\x69\xcc\x87\x00\xc4\xb0\0" /* offset 7 */
+ "\x00\x46\x46\x00\x46\x66\0" /* offset 15 */
+ "\x00\x46\x49\x00\x46\x69\0" /* offset 22 */
+ "\x00\x46\x4c\x00\x46\x6c\0" /* offset 29 */
+ "\x00\x46\x46\x49\x00\x46\x66\x69\0" /* offset 36 */
+ "\x00\x46\x46\x4c\x00\x46\x66\x6c\0" /* offset 45 */
+ "\x00\x53\x54\x00\x53\x74\0" /* offset 54 */
+ "\x00\x53\x54\x00\x53\x74\0" /* offset 61 */
+ "\x00\xd4\xb5\xd5\x92\x00\xd4\xb5\xd6\x82\0" /* offset 68 */
+ "\x00\xd5\x84\xd5\x86\x00\xd5\x84\xd5\xb6\0" /* offset 79 */
+ "\x00\xd5\x84\xd4\xb5\x00\xd5\x84\xd5\xa5\0" /* offset 90 */
+ "\x00\xd5\x84\xd4\xbb\x00\xd5\x84\xd5\xab\0" /* offset 101 */
+ "\x00\xd5\x8e\xd5\x86\x00\xd5\x8e\xd5\xb6\0" /* offset 112 */
+ "\x00\xd5\x84\xd4\xbd\x00\xd5\x84\xd5\xad\0" /* offset 123 */
+ "\x00\xca\xbc\x4e\x00\xca\xbc\x4e\0" /* offset 134 */
+ "\x00\xce\x99\xcc\x88\xcc\x81\x00\xce\x99\xcc\x88\xcc\x81\0" /* offset 143 */
+ "\x00\xce\xa5\xcc\x88\xcc\x81\x00\xce\xa5\xcc\x88\xcc\x81\0" /* offset 158 */
+ "\x00\x4a\xcc\x8c\x00\x4a\xcc\x8c\0" /* offset 173 */
+ "\x00\x48\xcc\xb1\x00\x48\xcc\xb1\0" /* offset 182 */
+ "\x00\x54\xcc\x88\x00\x54\xcc\x88\0" /* offset 191 */
+ "\x00\x57\xcc\x8a\x00\x57\xcc\x8a\0" /* offset 200 */
+ "\x00\x59\xcc\x8a\x00\x59\xcc\x8a\0" /* offset 209 */
+ "\x00\x41\xca\xbe\x00\x41\xca\xbe\0" /* offset 218 */
+ "\x00\xce\xa5\xcc\x93\x00\xce\xa5\xcc\x93\0" /* offset 227 */
+ "\x00\xce\xa5\xcc\x93\xcc\x80\x00\xce\xa5\xcc\x93\xcc\x80\0" /* offset 238 */
+ "\x00\xce\xa5\xcc\x93\xcc\x81\x00\xce\xa5\xcc\x93\xcc\x81\0" /* offset 253 */
+ "\x00\xce\xa5\xcc\x93\xcd\x82\x00\xce\xa5\xcc\x93\xcd\x82\0" /* offset 268 */
+ "\x00\xce\x91\xcd\x82\x00\xce\x91\xcd\x82\0" /* offset 283 */
+ "\x00\xce\x97\xcd\x82\x00\xce\x97\xcd\x82\0" /* offset 294 */
+ "\x00\xce\x99\xcc\x88\xcc\x80\x00\xce\x99\xcc\x88\xcc\x80\0" /* offset 305 */
+ "\x00\xce\x99\xcc\x88\xcc\x81\x00\xce\x99\xcc\x88\xcc\x81\0" /* offset 320 */
+ "\x00\xce\x99\xcd\x82\x00\xce\x99\xcd\x82\0" /* offset 335 */
+ "\x00\xce\x99\xcc\x88\xcd\x82\x00\xce\x99\xcc\x88\xcd\x82\0" /* offset 346 */
+ "\x00\xce\xa5\xcc\x88\xcc\x80\x00\xce\xa5\xcc\x88\xcc\x80\0" /* offset 361 */
+ "\x00\xce\xa5\xcc\x88\xcc\x81\x00\xce\xa5\xcc\x88\xcc\x81\0" /* offset 376 */
+ "\x00\xce\xa1\xcc\x93\x00\xce\xa1\xcc\x93\0" /* offset 391 */
+ "\x00\xce\xa5\xcd\x82\x00\xce\xa5\xcd\x82\0" /* offset 402 */
+ "\x00\xce\xa5\xcc\x88\xcd\x82\x00\xce\xa5\xcc\x88\xcd\x82\0" /* offset 413 */
+ "\x00\xce\xa9\xcd\x82\x00\xce\xa9\xcd\x82\0" /* offset 428 */
+ "\xe1\xbe\x88\xe1\xbc\x88\xce\x99\x00\xe1\xbe\x88\0" /* offset 439 */
+ "\xe1\xbe\x89\xe1\xbc\x89\xce\x99\x00\xe1\xbe\x89\0" /* offset 452 */
+ "\xe1\xbe\x8a\xe1\xbc\x8a\xce\x99\x00\xe1\xbe\x8a\0" /* offset 465 */
+ "\xe1\xbe\x8b\xe1\xbc\x8b\xce\x99\x00\xe1\xbe\x8b\0" /* offset 478 */
+ "\xe1\xbe\x8c\xe1\xbc\x8c\xce\x99\x00\xe1\xbe\x8c\0" /* offset 491 */
+ "\xe1\xbe\x8d\xe1\xbc\x8d\xce\x99\x00\xe1\xbe\x8d\0" /* offset 504 */
+ "\xe1\xbe\x8e\xe1\xbc\x8e\xce\x99\x00\xe1\xbe\x8e\0" /* offset 517 */
+ "\xe1\xbe\x8f\xe1\xbc\x8f\xce\x99\x00\xe1\xbe\x8f\0" /* offset 530 */
+ "\xe1\xbe\x80\x00\xe1\xbc\x88\xce\x99\0" /* offset 543 */
+ "\xe1\xbe\x81\x00\xe1\xbc\x89\xce\x99\0" /* offset 553 */
+ "\xe1\xbe\x82\x00\xe1\xbc\x8a\xce\x99\0" /* offset 563 */
+ "\xe1\xbe\x83\x00\xe1\xbc\x8b\xce\x99\0" /* offset 573 */
+ "\xe1\xbe\x84\x00\xe1\xbc\x8c\xce\x99\0" /* offset 583 */
+ "\xe1\xbe\x85\x00\xe1\xbc\x8d\xce\x99\0" /* offset 593 */
+ "\xe1\xbe\x86\x00\xe1\xbc\x8e\xce\x99\0" /* offset 603 */
+ "\xe1\xbe\x87\x00\xe1\xbc\x8f\xce\x99\0" /* offset 613 */
+ "\xe1\xbe\x98\xe1\xbc\xa8\xce\x99\x00\xe1\xbe\x98\0" /* offset 623 */
+ "\xe1\xbe\x99\xe1\xbc\xa9\xce\x99\x00\xe1\xbe\x99\0" /* offset 636 */
+ "\xe1\xbe\x9a\xe1\xbc\xaa\xce\x99\x00\xe1\xbe\x9a\0" /* offset 649 */
+ "\xe1\xbe\x9b\xe1\xbc\xab\xce\x99\x00\xe1\xbe\x9b\0" /* offset 662 */
+ "\xe1\xbe\x9c\xe1\xbc\xac\xce\x99\x00\xe1\xbe\x9c\0" /* offset 675 */
+ "\xe1\xbe\x9d\xe1\xbc\xad\xce\x99\x00\xe1\xbe\x9d\0" /* offset 688 */
+ "\xe1\xbe\x9e\xe1\xbc\xae\xce\x99\x00\xe1\xbe\x9e\0" /* offset 701 */
+ "\xe1\xbe\x9f\xe1\xbc\xaf\xce\x99\x00\xe1\xbe\x9f\0" /* offset 714 */
+ "\xe1\xbe\x90\x00\xe1\xbc\xa8\xce\x99\0" /* offset 727 */
+ "\xe1\xbe\x91\x00\xe1\xbc\xa9\xce\x99\0" /* offset 737 */
+ "\xe1\xbe\x92\x00\xe1\xbc\xaa\xce\x99\0" /* offset 747 */
+ "\xe1\xbe\x93\x00\xe1\xbc\xab\xce\x99\0" /* offset 757 */
+ "\xe1\xbe\x94\x00\xe1\xbc\xac\xce\x99\0" /* offset 767 */
+ "\xe1\xbe\x95\x00\xe1\xbc\xad\xce\x99\0" /* offset 777 */
+ "\xe1\xbe\x96\x00\xe1\xbc\xae\xce\x99\0" /* offset 787 */
+ "\xe1\xbe\x97\x00\xe1\xbc\xaf\xce\x99\0" /* offset 797 */
+ "\xe1\xbe\xa8\xe1\xbd\xa8\xce\x99\x00\xe1\xbe\xa8\0" /* offset 807 */
+ "\xe1\xbe\xa9\xe1\xbd\xa9\xce\x99\x00\xe1\xbe\xa9\0" /* offset 820 */
+ "\xe1\xbe\xaa\xe1\xbd\xaa\xce\x99\x00\xe1\xbe\xaa\0" /* offset 833 */
+ "\xe1\xbe\xab\xe1\xbd\xab\xce\x99\x00\xe1\xbe\xab\0" /* offset 846 */
+ "\xe1\xbe\xac\xe1\xbd\xac\xce\x99\x00\xe1\xbe\xac\0" /* offset 859 */
+ "\xe1\xbe\xad\xe1\xbd\xad\xce\x99\x00\xe1\xbe\xad\0" /* offset 872 */
+ "\xe1\xbe\xae\xe1\xbd\xae\xce\x99\x00\xe1\xbe\xae\0" /* offset 885 */
+ "\xe1\xbe\xaf\xe1\xbd\xaf\xce\x99\x00\xe1\xbe\xaf\0" /* offset 898 */
+ "\xe1\xbe\xa0\x00\xe1\xbd\xa8\xce\x99\0" /* offset 911 */
+ "\xe1\xbe\xa1\x00\xe1\xbd\xa9\xce\x99\0" /* offset 921 */
+ "\xe1\xbe\xa2\x00\xe1\xbd\xaa\xce\x99\0" /* offset 931 */
+ "\xe1\xbe\xa3\x00\xe1\xbd\xab\xce\x99\0" /* offset 941 */
+ "\xe1\xbe\xa4\x00\xe1\xbd\xac\xce\x99\0" /* offset 951 */
+ "\xe1\xbe\xa5\x00\xe1\xbd\xad\xce\x99\0" /* offset 961 */
+ "\xe1\xbe\xa6\x00\xe1\xbd\xae\xce\x99\0" /* offset 971 */
+ "\xe1\xbe\xa7\x00\xe1\xbd\xaf\xce\x99\0" /* offset 981 */
+ "\xe1\xbe\xbc\xce\x91\xce\x99\x00\xe1\xbe\xbc\0" /* offset 991 */
+ "\xe1\xbe\xb3\x00\xce\x91\xce\x99\0" /* offset 1003 */
+ "\xe1\xbf\x8c\xce\x97\xce\x99\x00\xe1\xbf\x8c\0" /* offset 1012 */
+ "\xe1\xbf\x83\x00\xce\x97\xce\x99\0" /* offset 1024 */
+ "\xe1\xbf\xbc\xce\xa9\xce\x99\x00\xe1\xbf\xbc\0" /* offset 1033 */
+ "\xe1\xbf\xb3\x00\xce\xa9\xce\x99\0" /* offset 1045 */
+ "\x00\xe1\xbe\xba\xce\x99\x00\xe1\xbe\xba\xcd\x85\0" /* offset 1054 */
+ "\x00\xce\x86\xce\x99\x00\xce\x86\xcd\x85\0" /* offset 1067 */
+ "\x00\xe1\xbf\x8a\xce\x99\x00\xe1\xbf\x8a\xcd\x85\0" /* offset 1078 */
+ "\x00\xce\x89\xce\x99\x00\xce\x89\xcd\x85\0" /* offset 1091 */
+ "\x00\xe1\xbf\xba\xce\x99\x00\xe1\xbf\xba\xcd\x85\0" /* offset 1102 */
+ "\x00\xce\x8f\xce\x99\x00\xce\x8f\xcd\x85\0" /* offset 1115 */
+ "\x00\xce\x91\xcd\x82\xce\x99\x00\xce\x91\xcd\x82\xcd\x85\0" /* offset 1126 */
+ "\x00\xce\x97\xcd\x82\xce\x99\x00\xce\x97\xcd\x82\xcd\x85\0" /* offset 1141 */
+ "\x00\xce\xa9\xcd\x82\xce\x99\x00\xce\xa9\xcd\x82\xcd\x85\0" /* offset 1156 */
+};
+
+
+/* Table of casefolding cases that can't be derived by lowercasing
+ */
+static const struct {
+ guint16 ch;
+ gchar data[7];
+} casefold_table[] = {
+ { 0x00b5, "\xce\xbc" },
+ { 0x00df, "\x73\x73" },
+ { 0x0130, "\x69\xcc\x87" },
+ { 0x0149, "\xca\xbc\x6e" },
+ { 0x017f, "\x73" },
+ { 0x01f0, "\x6a\xcc\x8c" },
+ { 0x0345, "\xce\xb9" },
+ { 0x0390, "\xce\xb9\xcc\x88\xcc\x81" },
+ { 0x03b0, "\xcf\x85\xcc\x88\xcc\x81" },
+ { 0x03c2, "\xcf\x83" },
+ { 0x03d0, "\xce\xb2" },
+ { 0x03d1, "\xce\xb8" },
+ { 0x03d5, "\xcf\x86" },
+ { 0x03d6, "\xcf\x80" },
+ { 0x03f0, "\xce\xba" },
+ { 0x03f1, "\xcf\x81" },
+ { 0x03f5, "\xce\xb5" },
+ { 0x0587, "\xd5\xa5\xd6\x82" },
+ { 0x1e96, "\x68\xcc\xb1" },
+ { 0x1e97, "\x74\xcc\x88" },
+ { 0x1e98, "\x77\xcc\x8a" },
+ { 0x1e99, "\x79\xcc\x8a" },
+ { 0x1e9a, "\x61\xca\xbe" },
+ { 0x1e9b, "\xe1\xb9\xa1" },
+ { 0x1f50, "\xcf\x85\xcc\x93" },
+ { 0x1f52, "\xcf\x85\xcc\x93\xcc\x80" },
+ { 0x1f54, "\xcf\x85\xcc\x93\xcc\x81" },
+ { 0x1f56, "\xcf\x85\xcc\x93\xcd\x82" },
+ { 0x1f80, "\xe1\xbc\x80\xce\xb9" },
+ { 0x1f81, "\xe1\xbc\x81\xce\xb9" },
+ { 0x1f82, "\xe1\xbc\x82\xce\xb9" },
+ { 0x1f83, "\xe1\xbc\x83\xce\xb9" },
+ { 0x1f84, "\xe1\xbc\x84\xce\xb9" },
+ { 0x1f85, "\xe1\xbc\x85\xce\xb9" },
+ { 0x1f86, "\xe1\xbc\x86\xce\xb9" },
+ { 0x1f87, "\xe1\xbc\x87\xce\xb9" },
+ { 0x1f88, "\xe1\xbc\x80\xce\xb9" },
+ { 0x1f89, "\xe1\xbc\x81\xce\xb9" },
+ { 0x1f8a, "\xe1\xbc\x82\xce\xb9" },
+ { 0x1f8b, "\xe1\xbc\x83\xce\xb9" },
+ { 0x1f8c, "\xe1\xbc\x84\xce\xb9" },
+ { 0x1f8d, "\xe1\xbc\x85\xce\xb9" },
+ { 0x1f8e, "\xe1\xbc\x86\xce\xb9" },
+ { 0x1f8f, "\xe1\xbc\x87\xce\xb9" },
+ { 0x1f90, "\xe1\xbc\xa0\xce\xb9" },
+ { 0x1f91, "\xe1\xbc\xa1\xce\xb9" },
+ { 0x1f92, "\xe1\xbc\xa2\xce\xb9" },
+ { 0x1f93, "\xe1\xbc\xa3\xce\xb9" },
+ { 0x1f94, "\xe1\xbc\xa4\xce\xb9" },
+ { 0x1f95, "\xe1\xbc\xa5\xce\xb9" },
+ { 0x1f96, "\xe1\xbc\xa6\xce\xb9" },
+ { 0x1f97, "\xe1\xbc\xa7\xce\xb9" },
+ { 0x1f98, "\xe1\xbc\xa0\xce\xb9" },
+ { 0x1f99, "\xe1\xbc\xa1\xce\xb9" },
+ { 0x1f9a, "\xe1\xbc\xa2\xce\xb9" },
+ { 0x1f9b, "\xe1\xbc\xa3\xce\xb9" },
+ { 0x1f9c, "\xe1\xbc\xa4\xce\xb9" },
+ { 0x1f9d, "\xe1\xbc\xa5\xce\xb9" },
+ { 0x1f9e, "\xe1\xbc\xa6\xce\xb9" },
+ { 0x1f9f, "\xe1\xbc\xa7\xce\xb9" },
+ { 0x1fa0, "\xe1\xbd\xa0\xce\xb9" },
+ { 0x1fa1, "\xe1\xbd\xa1\xce\xb9" },
+ { 0x1fa2, "\xe1\xbd\xa2\xce\xb9" },
+ { 0x1fa3, "\xe1\xbd\xa3\xce\xb9" },
+ { 0x1fa4, "\xe1\xbd\xa4\xce\xb9" },
+ { 0x1fa5, "\xe1\xbd\xa5\xce\xb9" },
+ { 0x1fa6, "\xe1\xbd\xa6\xce\xb9" },
+ { 0x1fa7, "\xe1\xbd\xa7\xce\xb9" },
+ { 0x1fa8, "\xe1\xbd\xa0\xce\xb9" },
+ { 0x1fa9, "\xe1\xbd\xa1\xce\xb9" },
+ { 0x1faa, "\xe1\xbd\xa2\xce\xb9" },
+ { 0x1fab, "\xe1\xbd\xa3\xce\xb9" },
+ { 0x1fac, "\xe1\xbd\xa4\xce\xb9" },
+ { 0x1fad, "\xe1\xbd\xa5\xce\xb9" },
+ { 0x1fae, "\xe1\xbd\xa6\xce\xb9" },
+ { 0x1faf, "\xe1\xbd\xa7\xce\xb9" },
+ { 0x1fb2, "\xe1\xbd\xb0\xce\xb9" },
+ { 0x1fb3, "\xce\xb1\xce\xb9" },
+ { 0x1fb4, "\xce\xac\xce\xb9" },
+ { 0x1fb6, "\xce\xb1\xcd\x82" },
+ { 0x1fb7, "\xce\xb1\xcd\x82\xce\xb9" },
+ { 0x1fbc, "\xce\xb1\xce\xb9" },
+ { 0x1fbe, "\xce\xb9" },
+ { 0x1fc2, "\xe1\xbd\xb4\xce\xb9" },
+ { 0x1fc3, "\xce\xb7\xce\xb9" },
+ { 0x1fc4, "\xce\xae\xce\xb9" },
+ { 0x1fc6, "\xce\xb7\xcd\x82" },
+ { 0x1fc7, "\xce\xb7\xcd\x82\xce\xb9" },
+ { 0x1fcc, "\xce\xb7\xce\xb9" },
+ { 0x1fd2, "\xce\xb9\xcc\x88\xcc\x80" },
+ { 0x1fd3, "\xce\xb9\xcc\x88\xcc\x81" },
+ { 0x1fd6, "\xce\xb9\xcd\x82" },
+ { 0x1fd7, "\xce\xb9\xcc\x88\xcd\x82" },
+ { 0x1fe2, "\xcf\x85\xcc\x88\xcc\x80" },
+ { 0x1fe3, "\xcf\x85\xcc\x88\xcc\x81" },
+ { 0x1fe4, "\xcf\x81\xcc\x93" },
+ { 0x1fe6, "\xcf\x85\xcd\x82" },
+ { 0x1fe7, "\xcf\x85\xcc\x88\xcd\x82" },
+ { 0x1ff2, "\xe1\xbd\xbc\xce\xb9" },
+ { 0x1ff3, "\xcf\x89\xce\xb9" },
+ { 0x1ff4, "\xcf\x8e\xce\xb9" },
+ { 0x1ff6, "\xcf\x89\xcd\x82" },
+ { 0x1ff7, "\xcf\x89\xcd\x82\xce\xb9" },
+ { 0x1ffc, "\xcf\x89\xce\xb9" },
+ { 0x2160, "\xe2\x85\xb0" },
+ { 0x2161, "\xe2\x85\xb1" },
+ { 0x2162, "\xe2\x85\xb2" },
+ { 0x2163, "\xe2\x85\xb3" },
+ { 0x2164, "\xe2\x85\xb4" },
+ { 0x2165, "\xe2\x85\xb5" },
+ { 0x2166, "\xe2\x85\xb6" },
+ { 0x2167, "\xe2\x85\xb7" },
+ { 0x2168, "\xe2\x85\xb8" },
+ { 0x2169, "\xe2\x85\xb9" },
+ { 0x216a, "\xe2\x85\xba" },
+ { 0x216b, "\xe2\x85\xbb" },
+ { 0x216c, "\xe2\x85\xbc" },
+ { 0x216d, "\xe2\x85\xbd" },
+ { 0x216e, "\xe2\x85\xbe" },
+ { 0x216f, "\xe2\x85\xbf" },
+ { 0x24b6, "\xe2\x93\x90" },
+ { 0x24b7, "\xe2\x93\x91" },
+ { 0x24b8, "\xe2\x93\x92" },
+ { 0x24b9, "\xe2\x93\x93" },
+ { 0x24ba, "\xe2\x93\x94" },
+ { 0x24bb, "\xe2\x93\x95" },
+ { 0x24bc, "\xe2\x93\x96" },
+ { 0x24bd, "\xe2\x93\x97" },
+ { 0x24be, "\xe2\x93\x98" },
+ { 0x24bf, "\xe2\x93\x99" },
+ { 0x24c0, "\xe2\x93\x9a" },
+ { 0x24c1, "\xe2\x93\x9b" },
+ { 0x24c2, "\xe2\x93\x9c" },
+ { 0x24c3, "\xe2\x93\x9d" },
+ { 0x24c4, "\xe2\x93\x9e" },
+ { 0x24c5, "\xe2\x93\x9f" },
+ { 0x24c6, "\xe2\x93\xa0" },
+ { 0x24c7, "\xe2\x93\xa1" },
+ { 0x24c8, "\xe2\x93\xa2" },
+ { 0x24c9, "\xe2\x93\xa3" },
+ { 0x24ca, "\xe2\x93\xa4" },
+ { 0x24cb, "\xe2\x93\xa5" },
+ { 0x24cc, "\xe2\x93\xa6" },
+ { 0x24cd, "\xe2\x93\xa7" },
+ { 0x24ce, "\xe2\x93\xa8" },
+ { 0x24cf, "\xe2\x93\xa9" },
+ { 0xfb00, "\x66\x66" },
+ { 0xfb01, "\x66\x69" },
+ { 0xfb02, "\x66\x6c" },
+ { 0xfb03, "\x66\x66\x69" },
+ { 0xfb04, "\x66\x66\x6c" },
+ { 0xfb05, "\x73\x74" },
+ { 0xfb06, "\x73\x74" },
+ { 0xfb13, "\xd5\xb4\xd5\xb6" },
+ { 0xfb14, "\xd5\xb4\xd5\xa5" },
+ { 0xfb15, "\xd5\xb4\xd5\xab" },
+ { 0xfb16, "\xd5\xbe\xd5\xb6" },
+ { 0xfb17, "\xd5\xb4\xd5\xad" },
+};
+
+#endif /* CHARTABLES_H */
diff --git a/trunk/glib/gunicode.h b/trunk/glib/gunicode.h
new file mode 100644
index 000000000..f8f6e1aeb
--- /dev/null
+++ b/trunk/glib/gunicode.h
@@ -0,0 +1,385 @@
+/* gunicode.h - Unicode manipulation functions
+ *
+ * Copyright (C) 1999, 2000 Tom Tromey
+ * Copyright 2000, 2005 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 <glib/gerror.h>
+#include <glib/gtypes.h>
+
+G_BEGIN_DECLS
+
+typedef guint32 gunichar;
+typedef guint16 gunichar2;
+
+/* These are the possible character classifications.
+ * See http://www.unicode.org/Public/UNIDATA/UCD.html#General_Category_Values
+ */
+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.
+ * Note that new types may be added in the future.
+ * Implementations may regard unknown values like G_UNICODE_BREAK_UNKNOWN
+ * 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,
+ G_UNICODE_BREAK_NEXT_LINE,
+ G_UNICODE_BREAK_WORD_JOINER,
+ G_UNICODE_BREAK_HANGUL_L_JAMO,
+ G_UNICODE_BREAK_HANGUL_V_JAMO,
+ G_UNICODE_BREAK_HANGUL_T_JAMO,
+ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE,
+ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+} GUnicodeBreakType;
+
+typedef enum
+{ /* ISO 15924 code */
+ G_UNICODE_SCRIPT_INVALID_CODE = -1,
+ G_UNICODE_SCRIPT_COMMON = 0, /* Zyyy */
+ G_UNICODE_SCRIPT_INHERITED, /* Qaai */
+ G_UNICODE_SCRIPT_ARABIC, /* Arab */
+ G_UNICODE_SCRIPT_ARMENIAN, /* Armn */
+ G_UNICODE_SCRIPT_BENGALI, /* Beng */
+ G_UNICODE_SCRIPT_BOPOMOFO, /* Bopo */
+ G_UNICODE_SCRIPT_CHEROKEE, /* Cher */
+ G_UNICODE_SCRIPT_COPTIC, /* Qaac */
+ G_UNICODE_SCRIPT_CYRILLIC, /* Cyrl (Cyrs) */
+ G_UNICODE_SCRIPT_DESERET, /* Dsrt */
+ G_UNICODE_SCRIPT_DEVANAGARI, /* Deva */
+ G_UNICODE_SCRIPT_ETHIOPIC, /* Ethi */
+ G_UNICODE_SCRIPT_GEORGIAN, /* Geor (Geon, Geoa) */
+ G_UNICODE_SCRIPT_GOTHIC, /* Goth */
+ G_UNICODE_SCRIPT_GREEK, /* Grek */
+ G_UNICODE_SCRIPT_GUJARATI, /* Gujr */
+ G_UNICODE_SCRIPT_GURMUKHI, /* Guru */
+ G_UNICODE_SCRIPT_HAN, /* Hani */
+ G_UNICODE_SCRIPT_HANGUL, /* Hang */
+ G_UNICODE_SCRIPT_HEBREW, /* Hebr */
+ G_UNICODE_SCRIPT_HIRAGANA, /* Hira */
+ G_UNICODE_SCRIPT_KANNADA, /* Knda */
+ G_UNICODE_SCRIPT_KATAKANA, /* Kana */
+ G_UNICODE_SCRIPT_KHMER, /* Khmr */
+ G_UNICODE_SCRIPT_LAO, /* Laoo */
+ G_UNICODE_SCRIPT_LATIN, /* Latn (Latf, Latg) */
+ G_UNICODE_SCRIPT_MALAYALAM, /* Mlym */
+ G_UNICODE_SCRIPT_MONGOLIAN, /* Mong */
+ G_UNICODE_SCRIPT_MYANMAR, /* Mymr */
+ G_UNICODE_SCRIPT_OGHAM, /* Ogam */
+ G_UNICODE_SCRIPT_OLD_ITALIC, /* Ital */
+ G_UNICODE_SCRIPT_ORIYA, /* Orya */
+ G_UNICODE_SCRIPT_RUNIC, /* Runr */
+ G_UNICODE_SCRIPT_SINHALA, /* Sinh */
+ G_UNICODE_SCRIPT_SYRIAC, /* Syrc (Syrj, Syrn, Syre) */
+ G_UNICODE_SCRIPT_TAMIL, /* Taml */
+ G_UNICODE_SCRIPT_TELUGU, /* Telu */
+ G_UNICODE_SCRIPT_THAANA, /* Thaa */
+ G_UNICODE_SCRIPT_THAI, /* Thai */
+ G_UNICODE_SCRIPT_TIBETAN, /* Tibt */
+ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, /* Cans */
+ G_UNICODE_SCRIPT_YI, /* Yiii */
+ G_UNICODE_SCRIPT_TAGALOG, /* Tglg */
+ G_UNICODE_SCRIPT_HANUNOO, /* Hano */
+ G_UNICODE_SCRIPT_BUHID, /* Buhd */
+ G_UNICODE_SCRIPT_TAGBANWA, /* Tagb */
+
+ /* Unicode-4.0 additions */
+ G_UNICODE_SCRIPT_BRAILLE, /* Brai */
+ G_UNICODE_SCRIPT_CYPRIOT, /* Cprt */
+ G_UNICODE_SCRIPT_LIMBU, /* Limb */
+ G_UNICODE_SCRIPT_OSMANYA, /* Osma */
+ G_UNICODE_SCRIPT_SHAVIAN, /* Shaw */
+ G_UNICODE_SCRIPT_LINEAR_B, /* Linb */
+ G_UNICODE_SCRIPT_TAI_LE, /* Tale */
+ G_UNICODE_SCRIPT_UGARITIC, /* Ugar */
+
+ /* Unicode-4.1 additions */
+ G_UNICODE_SCRIPT_NEW_TAI_LUE, /* Talu */
+ G_UNICODE_SCRIPT_BUGINESE, /* Bugi */
+ G_UNICODE_SCRIPT_GLAGOLITIC, /* Glag */
+ G_UNICODE_SCRIPT_TIFINAGH, /* Tfng */
+ G_UNICODE_SCRIPT_SYLOTI_NAGRI, /* Sylo */
+ G_UNICODE_SCRIPT_OLD_PERSIAN, /* Xpeo */
+ G_UNICODE_SCRIPT_KHAROSHTHI, /* Khar */
+
+ /* Unicode-5.0 additions */
+ G_UNICODE_SCRIPT_UNKNOWN, /* Zzzz */
+ G_UNICODE_SCRIPT_BALINESE, /* Bali */
+ G_UNICODE_SCRIPT_CUNEIFORM, /* Xsux */
+ G_UNICODE_SCRIPT_PHOENICIAN, /* Phnx */
+ G_UNICODE_SCRIPT_PHAGS_PA, /* Phag */
+ G_UNICODE_SCRIPT_NKO /* Nkoo */
+} GUnicodeScript;
+
+/* 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 <ctype.h> 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;
+gboolean g_unichar_iswide_cjk(gunichar c) G_GNUC_CONST;
+gboolean g_unichar_iszerowidth(gunichar c) G_GNUC_CONST;
+gboolean g_unichar_ismark (gunichar c) G_GNUC_CONST;
+
+/* More <ctype.h> 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) G_GNUC_MALLOC;
+
+/* Array of skip-bytes-per-initial character.
+ */
+GLIB_VAR const gchar * const g_utf8_skip;
+
+#define g_utf8_next_char(p) (char *)((p) + g_utf8_skip[*(const guchar *)(p)])
+
+gunichar g_utf8_get_char (const gchar *p);
+gunichar g_utf8_get_char_validated (const gchar *p,
+ gssize max_len);
+
+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);
+gchar* g_utf8_strreverse (const gchar *str,
+ gssize len);
+
+gunichar2 *g_utf8_to_utf16 (const gchar *str,
+ glong len,
+ glong *items_read,
+ glong *items_written,
+ GError **error) G_GNUC_MALLOC;
+gunichar * g_utf8_to_ucs4 (const gchar *str,
+ glong len,
+ glong *items_read,
+ glong *items_written,
+ GError **error) G_GNUC_MALLOC;
+gunichar * g_utf8_to_ucs4_fast (const gchar *str,
+ glong len,
+ glong *items_written) G_GNUC_MALLOC;
+gunichar * g_utf16_to_ucs4 (const gunichar2 *str,
+ glong len,
+ glong *items_read,
+ glong *items_written,
+ GError **error) G_GNUC_MALLOC;
+gchar* g_utf16_to_utf8 (const gunichar2 *str,
+ glong len,
+ glong *items_read,
+ glong *items_written,
+ GError **error) G_GNUC_MALLOC;
+gunichar2 *g_ucs4_to_utf16 (const gunichar *str,
+ glong len,
+ glong *items_read,
+ glong *items_written,
+ GError **error) G_GNUC_MALLOC;
+gchar* g_ucs4_to_utf8 (const gunichar *str,
+ glong len,
+ glong *items_read,
+ glong *items_written,
+ GError **error) G_GNUC_MALLOC;
+
+/* 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);
+
+gchar *g_utf8_strup (const gchar *str,
+ gssize len) G_GNUC_MALLOC;
+gchar *g_utf8_strdown (const gchar *str,
+ gssize len) G_GNUC_MALLOC;
+gchar *g_utf8_casefold (const gchar *str,
+ gssize len) G_GNUC_MALLOC;
+
+typedef enum {
+ G_NORMALIZE_DEFAULT,
+ G_NORMALIZE_NFD = G_NORMALIZE_DEFAULT,
+ G_NORMALIZE_DEFAULT_COMPOSE,
+ G_NORMALIZE_NFC = G_NORMALIZE_DEFAULT_COMPOSE,
+ G_NORMALIZE_ALL,
+ G_NORMALIZE_NFKD = G_NORMALIZE_ALL,
+ G_NORMALIZE_ALL_COMPOSE,
+ G_NORMALIZE_NFKC = G_NORMALIZE_ALL_COMPOSE
+} GNormalizeMode;
+
+gchar *g_utf8_normalize (const gchar *str,
+ gssize len,
+ GNormalizeMode mode) G_GNUC_MALLOC;
+
+gint g_utf8_collate (const gchar *str1,
+ const gchar *str2);
+gchar *g_utf8_collate_key (const gchar *str,
+ gssize len) G_GNUC_MALLOC;
+gchar *g_utf8_collate_key_for_filename (const gchar *str,
+ gssize len) G_GNUC_MALLOC;
+
+gboolean g_unichar_get_mirror_char (gunichar ch,
+ gunichar *mirrored_ch);
+
+GUnicodeScript g_unichar_get_script (gunichar ch);
+
+
+/* private */
+
+gchar *_g_utf8_make_valid (const gchar *name);
+
+
+G_END_DECLS
+
+#endif /* __G_UNICODE_H__ */
diff --git a/trunk/glib/gunicodeprivate.h b/trunk/glib/gunicodeprivate.h
new file mode 100644
index 000000000..01aa5cba2
--- /dev/null
+++ b/trunk/glib/gunicodeprivate.h
@@ -0,0 +1,36 @@
+/* gunicodeprivate.h
+ *
+ * Copyright (C) 2003 Noah Levitt
+ *
+ * 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_UNICODE_PRIVATE_H__
+#define __G_UNICODE_PRIVATE_H__
+
+#include "glib.h"
+
+G_BEGIN_DECLS
+
+G_GNUC_INTERNAL gunichar *_g_utf8_normalize_wc
+ (const gchar *str,
+ gssize max_len,
+ GNormalizeMode mode);
+G_GNUC_INTERNAL gint _g_unichar_combining_class (gunichar uc);
+
+G_END_DECLS
+
+#endif /* __G_UNICODE_PRIVATE_H__ */
diff --git a/trunk/glib/gunicollate.c b/trunk/glib/gunicollate.c
new file mode 100644
index 000000000..5feec5ab0
--- /dev/null
+++ b/trunk/glib/gunicollate.c
@@ -0,0 +1,495 @@
+/* gunicollate.c - Collation
+ *
+ * Copyright 2001,2005 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 "config.h"
+
+#include <locale.h>
+#include <string.h>
+#ifdef __STDC_ISO_10646__
+#include <wchar.h>
+#endif
+
+#include "glib.h"
+#include "gunicodeprivate.h"
+#include "galias.h"
+
+#ifdef _MSC_VER
+/* Workaround for bug in MSVCR80.DLL */
+static gsize
+msc_strxfrm_wrapper (char *string1,
+ const char *string2,
+ gsize count)
+{
+ if (!string1 || count <= 0)
+ {
+ char tmp;
+
+ return strxfrm (&tmp, string2, 1);
+ }
+ return strxfrm (string1, string2, count);
+}
+#define strxfrm msc_strxfrm_wrapper
+#endif
+
+/**
+ * g_utf8_collate:
+ * @str1: a UTF-8 encoded string
+ * @str2: a UTF-8 encoded string
+ *
+ * Compares two strings for ordering using the linguistically
+ * correct rules for the <link linkend="setlocale">current locale</link>.
+ * When sorting a large number of strings, it will be significantly
+ * faster to obtain collation keys with g_utf8_collate_key() and
+ * compare the keys with strcmp() when sorting instead of sorting
+ * the original strings.
+ *
+ * Return value: &lt; 0 if @str1 compares before @str2,
+ * 0 if they compare equal, &gt; 0 if @str1 compares after @str2.
+ **/
+gint
+g_utf8_collate (const gchar *str1,
+ const gchar *str2)
+{
+ gint result;
+
+#ifdef __STDC_ISO_10646__
+
+ gunichar *str1_norm;
+ gunichar *str2_norm;
+
+ g_return_val_if_fail (str1 != NULL, 0);
+ g_return_val_if_fail (str2 != NULL, 0);
+
+ str1_norm = _g_utf8_normalize_wc (str1, -1, G_NORMALIZE_ALL_COMPOSE);
+ str2_norm = _g_utf8_normalize_wc (str2, -1, G_NORMALIZE_ALL_COMPOSE);
+
+ result = wcscoll ((wchar_t *)str1_norm, (wchar_t *)str2_norm);
+
+ g_free (str1_norm);
+ g_free (str2_norm);
+
+#else /* !__STDC_ISO_10646__ */
+
+ const gchar *charset;
+ gchar *str1_norm;
+ gchar *str2_norm;
+
+ g_return_val_if_fail (str1 != NULL, 0);
+ g_return_val_if_fail (str2 != NULL, 0);
+
+ str1_norm = g_utf8_normalize (str1, -1, G_NORMALIZE_ALL_COMPOSE);
+ str2_norm = g_utf8_normalize (str2, -1, G_NORMALIZE_ALL_COMPOSE);
+
+ if (g_get_charset (&charset))
+ {
+ result = strcoll (str1_norm, str2_norm);
+ }
+ else
+ {
+ gchar *str1_locale = g_convert (str1_norm, -1, charset, "UTF-8", NULL, NULL, NULL);
+ gchar *str2_locale = g_convert (str2_norm, -1, charset, "UTF-8", NULL, NULL, NULL);
+
+ if (str1_locale && str2_locale)
+ result = strcoll (str1_locale, str2_locale);
+ else if (str1_locale)
+ result = -1;
+ else if (str2_locale)
+ result = 1;
+ else
+ result = strcmp (str1_norm, str2_norm);
+
+ g_free (str1_locale);
+ g_free (str2_locale);
+ }
+
+ g_free (str1_norm);
+ g_free (str2_norm);
+
+#endif /* __STDC_ISO_10646__ */
+
+ return result;
+}
+
+#ifdef __STDC_ISO_10646__
+/* We need UTF-8 encoding of numbers to encode the weights if
+ * we are using wcsxfrm. However, we aren't encoding Unicode
+ * characters, so we can't simply use g_unichar_to_utf8.
+ *
+ * The following routine is taken (with modification) from GNU
+ * libc's strxfrm routine:
+ *
+ * Copyright (C) 1995-1999,2000,2001 Free Software Foundation, Inc.
+ * Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
+ */
+static inline int
+utf8_encode (char *buf, wchar_t val)
+{
+ int retval;
+
+ if (val < 0x80)
+ {
+ if (buf)
+ *buf++ = (char) val;
+ retval = 1;
+ }
+ else
+ {
+ int step;
+
+ for (step = 2; step < 6; ++step)
+ if ((val & (~(guint32)0 << (5 * step + 1))) == 0)
+ break;
+ retval = step;
+
+ if (buf)
+ {
+ *buf = (unsigned char) (~0xff >> step);
+ --step;
+ do
+ {
+ buf[step] = 0x80 | (val & 0x3f);
+ val >>= 6;
+ }
+ while (--step > 0);
+ *buf |= val;
+ }
+ }
+
+ return retval;
+}
+#endif /* __STDC_ISO_10646__ */
+
+/**
+ * g_utf8_collate_key:
+ * @str: a UTF-8 encoded string.
+ * @len: length of @str, in bytes, or -1 if @str is nul-terminated.
+ *
+ * Converts a string into a collation key that can be compared
+ * with other collation keys produced by the same function using
+ * strcmp().
+ *
+ * The results of comparing the collation keys of two strings
+ * with strcmp() will always be the same as comparing the two
+ * original keys with g_utf8_collate().
+ *
+ * Note that this function depends on the
+ * <link linkend="setlocale">current locale</link>.
+ *
+ * Return value: a newly allocated string. This string should
+ * be freed with g_free() when you are done with it.
+ **/
+gchar *
+g_utf8_collate_key (const gchar *str,
+ gssize len)
+{
+ gchar *result;
+ gsize xfrm_len;
+
+#ifdef __STDC_ISO_10646__
+
+ gunichar *str_norm;
+ wchar_t *result_wc;
+ gsize i;
+ gsize result_len = 0;
+
+ g_return_val_if_fail (str != NULL, NULL);
+
+ str_norm = _g_utf8_normalize_wc (str, len, G_NORMALIZE_ALL_COMPOSE);
+
+ xfrm_len = wcsxfrm (NULL, (wchar_t *)str_norm, 0);
+ result_wc = g_new (wchar_t, xfrm_len + 1);
+ wcsxfrm (result_wc, (wchar_t *)str_norm, xfrm_len + 1);
+
+ for (i=0; i < xfrm_len; i++)
+ result_len += utf8_encode (NULL, result_wc[i]);
+
+ result = g_malloc (result_len + 1);
+ result_len = 0;
+ for (i=0; i < xfrm_len; i++)
+ result_len += utf8_encode (result + result_len, result_wc[i]);
+
+ result[result_len] = '\0';
+
+ g_free (result_wc);
+ g_free (str_norm);
+
+ return result;
+#else /* !__STDC_ISO_10646__ */
+
+ const gchar *charset;
+ gchar *str_norm;
+
+ g_return_val_if_fail (str != NULL, NULL);
+
+ str_norm = g_utf8_normalize (str, len, G_NORMALIZE_ALL_COMPOSE);
+
+ if (g_get_charset (&charset))
+ {
+ xfrm_len = strxfrm (NULL, str_norm, 0);
+ result = g_malloc (xfrm_len + 1);
+ strxfrm (result, str_norm, xfrm_len + 1);
+ }
+ else
+ {
+ gchar *str_locale = g_convert (str_norm, -1, charset, "UTF-8", NULL, NULL, NULL);
+
+ if (str_locale)
+ {
+ xfrm_len = strxfrm (NULL, str_locale, 0);
+ if (xfrm_len < 0 || xfrm_len >= G_MAXINT - 2)
+ {
+ g_free (str_locale);
+ str_locale = NULL;
+ }
+ }
+ if (str_locale)
+ {
+ result = g_malloc (xfrm_len + 2);
+ result[0] = 'A';
+ strxfrm (result + 1, str_locale, xfrm_len + 1);
+
+ g_free (str_locale);
+ }
+ else
+ {
+ xfrm_len = strlen (str_norm);
+ result = g_malloc (xfrm_len + 2);
+ result[0] = 'B';
+ memcpy (result + 1, str_norm, xfrm_len);
+ result[xfrm_len+1] = '\0';
+ }
+ }
+
+ g_free (str_norm);
+#endif /* __STDC_ISO_10646__ */
+
+ return result;
+}
+
+/* This is a collation key that is very very likely to sort before any
+ collation key that libc strxfrm generates. We use this before any
+ special case (dot or number) to make sure that its sorted before
+ anything else.
+ */
+#define COLLATION_SENTINEL "\1\1\1"
+
+/**
+ * g_utf8_collate_key_for_filename:
+ * @str: a UTF-8 encoded string.
+ * @len: length of @str, in bytes, or -1 if @str is nul-terminated.
+ *
+ * Converts a string into a collation key that can be compared
+ * with other collation keys produced by the same function using strcmp().
+ *
+ * In order to sort filenames correctly, this function treats the dot '.'
+ * as a special case. Most dictionary orderings seem to consider it
+ * insignificant, thus producing the ordering "event.c" "eventgenerator.c"
+ * "event.h" instead of "event.c" "event.h" "eventgenerator.c". Also, we
+ * would like to treat numbers intelligently so that "file1" "file10" "file5"
+ * is sorted as "file1" "file5" "file10".
+ *
+ * Note that this function depends on the
+ * <link linkend="setlocale">current locale</link>.
+ *
+ * Return value: a newly allocated string. This string should
+ * be freed with g_free() when you are done with it.
+ *
+ * Since: 2.8
+ */
+gchar*
+g_utf8_collate_key_for_filename (const gchar *str,
+ gssize len)
+{
+ GString *result;
+ GString *append;
+ const gchar *p;
+ const gchar *prev;
+ const gchar *end;
+ gchar *collate_key;
+ gint digits;
+ gint leading_zeros;
+
+ /*
+ * How it works:
+ *
+ * Split the filename into collatable substrings which do
+ * not contain [.0-9] and special-cased substrings. The collatable
+ * substrings are run through the normal g_utf8_collate_key() and the
+ * resulting keys are concatenated with keys generated from the
+ * special-cased substrings.
+ *
+ * Special cases: Dots are handled by replacing them with '\1' which
+ * implies that short dot-delimited substrings are before long ones,
+ * e.g.
+ *
+ * a\1a (a.a)
+ * a-\1a (a-.a)
+ * aa\1a (aa.a)
+ *
+ * Numbers are handled by prepending to each number d-1 superdigits
+ * where d = number of digits in the number and SUPERDIGIT is a
+ * character with an integer value higher than any digit (for instance
+ * ':'). This ensures that single-digit numbers are sorted before
+ * double-digit numbers which in turn are sorted separately from
+ * triple-digit numbers, etc. To avoid strange side-effects when
+ * sorting strings that already contain SUPERDIGITs, a '\2'
+ * is also prepended, like this
+ *
+ * file\21 (file1)
+ * file\25 (file5)
+ * file\2:10 (file10)
+ * file\2:26 (file26)
+ * file\2::100 (file100)
+ * file:foo (file:foo)
+ *
+ * This has the side-effect of sorting numbers before everything else (except
+ * dots), but this is probably OK.
+ *
+ * Leading digits are ignored when doing the above. To discriminate
+ * numbers which differ only in the number of leading digits, we append
+ * the number of leading digits as a byte at the very end of the collation
+ * key.
+ *
+ * To try avoid conflict with any collation key sequence generated by libc we
+ * start each switch to a special cased part with a sentinel that hopefully
+ * will sort before anything libc will generate.
+ */
+
+ if (len < 0)
+ len = strlen (str);
+
+ result = g_string_sized_new (len * 2);
+ append = g_string_sized_new (0);
+
+ end = str + len;
+
+ /* No need to use utf8 functions, since we're only looking for ascii chars */
+ for (prev = p = str; p < end; p++)
+ {
+ switch (*p)
+ {
+ case '.':
+ if (prev != p)
+ {
+ collate_key = g_utf8_collate_key (prev, p - prev);
+ g_string_append (result, collate_key);
+ g_free (collate_key);
+ }
+
+ g_string_append (result, COLLATION_SENTINEL "\1");
+
+ /* skip the dot */
+ prev = p + 1;
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (prev != p)
+ {
+ collate_key = g_utf8_collate_key (prev, p - prev);
+ g_string_append (result, collate_key);
+ g_free (collate_key);
+ }
+
+ g_string_append (result, COLLATION_SENTINEL "\2");
+
+ prev = p;
+
+ /* write d-1 colons */
+ if (*p == '0')
+ {
+ leading_zeros = 1;
+ digits = 0;
+ }
+ else
+ {
+ leading_zeros = 0;
+ digits = 1;
+ }
+
+ while (++p < end)
+ {
+ if (*p == '0' && !digits)
+ ++leading_zeros;
+ else if (g_ascii_isdigit(*p))
+ ++digits;
+ else
+ {
+ /* count an all-zero sequence as
+ * one digit plus leading zeros
+ */
+ if (!digits)
+ {
+ ++digits;
+ --leading_zeros;
+ }
+ break;
+ }
+ }
+
+ while (digits > 1)
+ {
+ g_string_append_c (result, ':');
+ --digits;
+ }
+
+ if (leading_zeros > 0)
+ {
+ g_string_append_c (append, (char)leading_zeros);
+ prev += leading_zeros;
+ }
+
+ /* write the number itself */
+ g_string_append_len (result, prev, p - prev);
+
+ prev = p;
+ --p; /* go one step back to avoid disturbing outer loop */
+ break;
+
+ default:
+ /* other characters just accumulate */
+ break;
+ }
+ }
+
+ if (prev != p)
+ {
+ collate_key = g_utf8_collate_key (prev, p - prev);
+ g_string_append (result, collate_key);
+ g_free (collate_key);
+ }
+
+ g_string_append (result, append->str);
+ g_string_free (append, TRUE);
+
+ return g_string_free (result, FALSE);
+}
+
+
+#define __G_UNICOLLATE_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gunicomp.h b/trunk/glib/gunicomp.h
new file mode 100644
index 000000000..23a9087b7
--- /dev/null
+++ b/trunk/glib/gunicomp.h
@@ -0,0 +1,682 @@
+#define COMPOSE_FIRST_START 1
+#define COMPOSE_FIRST_SINGLE_START 147
+#define COMPOSE_SECOND_START 368
+#define COMPOSE_SECOND_SINGLE_START 399
+
+#define COMPOSE_TABLE_LAST 48
+
+static const guint16 compose_data[][256] = {
+ { /* page 0, index 0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 148, 149, 0, 0, 1, 2, 3, 4, 5,
+ 150, 6, 7, 8, 151, 9, 10, 11, 12, 13, 14, 0, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 152, 29, 30, 31, 32, 33,
+ 34, 35, 36, 37, 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 153, 154,
+ 50, 155, 0, 0, 51, 0, 0, 0, 0, 156, 0, 0, 0, 0, 52, 53, 157, 0, 158, 0,
+ 0, 0, 54, 0, 0, 0, 0, 0, 55, 0, 159, 160, 56, 161, 0, 0, 57, 0, 0, 0, 0,
+ 162, 0, 0, 0, 0, 58, 59, 163, 0, 164, 0, 0, 0, 60, 0, 0, 0
+ },
+ { /* page 1, index 1 */
+ 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 166, 0,
+ 0, 0, 0, 167, 168, 0, 0, 0, 0, 0, 0, 169, 170, 171, 172, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,
+ 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 0, 0, 174,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 175, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0
+ },
+ { /* page 2, index 2 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 178, 179, 180, 0, 0, 0, 0,
+ 181, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 3, index 3 */
+ 368, 369, 370, 371, 372, 0, 373, 374, 375, 376, 377, 378, 379, 0, 0, 380,
+ 0, 381, 0, 382, 383, 0, 0, 0, 0, 0, 0, 384, 0, 0, 0, 0, 0, 0, 0, 385,
+ 386, 387, 388, 389, 390, 0, 0, 0, 0, 391, 392, 0, 393, 394, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 395, 0, 0, 396, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0,
+ 72, 0, 73, 0, 74, 0, 0, 0, 0, 0, 75, 0, 184, 0, 0, 0, 76, 0, 0, 0, 77, 0,
+ 0, 185, 0, 186, 0, 0, 78, 0, 0, 0, 79, 0, 80, 0, 81, 0, 0, 0, 0, 0, 82,
+ 0, 83, 0, 0, 0, 84, 0, 0, 0, 85, 86, 87, 0, 0, 187, 0, 0, 0, 88, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 4, index 4 */
+ 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 189, 0, 90,
+ 91, 190, 92, 0, 191, 0, 0, 0, 192, 0, 0, 0, 0, 93, 0, 0, 0, 193, 0, 0, 0,
+ 194, 0, 195, 0, 0, 94, 0, 0, 196, 0, 95, 96, 197, 97, 0, 198, 0, 0, 0,
+ 199, 0, 0, 0, 0, 98, 0, 0, 0, 200, 0, 0, 0, 201, 0, 202, 0, 0, 0, 0, 0,
+ 0, 0, 0, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 207, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 208, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 6, index 5 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 210, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, 399, 400, 401, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, 0,
+ 0, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 9, index 6 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0,
+ 216, 0, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402,
+ 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 11, index 7 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 0, 0, 0,
+ 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 405, 406, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 407, 0, 0, 0, 0, 0, 0, 0, 102, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 12, index 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, 220, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221,
+ 0, 0, 409, 0, 0, 0, 103, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 410,
+ 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 13, index 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, 412, 0, 0, 0, 0, 0, 0, 0, 104,
+ 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, 0, 415, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 105, 0, 0, 224, 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 16, index 10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 27, index 11 */
+ 0, 0, 0, 0, 0, 226, 0, 227, 0, 228, 0, 229, 0, 230, 0, 0, 0, 231, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 0, 233, 0, 234, 235, 0, 0,
+ 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 30, index 12 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 237, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 240, 0, 0,
+ 0, 0, 0, 0, 241, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 244, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 246, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 31, index 13 */
+ 108, 109, 247, 248, 249, 250, 251, 252, 110, 111, 253, 254, 255, 256,
+ 257, 258, 112, 113, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 116,
+ 117, 259, 260, 261, 262, 263, 264, 118, 119, 265, 266, 267, 268, 269,
+ 270, 120, 121, 0, 0, 0, 0, 0, 0, 122, 123, 0, 0, 0, 0, 0, 0, 124, 125, 0,
+ 0, 0, 0, 0, 0, 126, 127, 0, 0, 0, 0, 0, 0, 128, 129, 0, 0, 0, 0, 0, 0, 0,
+ 130, 0, 0, 0, 0, 0, 0, 131, 132, 271, 272, 273, 274, 275, 276, 133, 134,
+ 277, 278, 279, 280, 281, 282, 283, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0,
+ 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, 0, 0, 0, 0, 0, 0, 0, 0, 135, 0, 0, 0,
+ 0, 0, 0, 287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 288, 0, 0, 0, 0, 0, 0, 0, 136, 0
+ },
+ { /* page 33, index 14 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 289, 0, 290, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 292, 0, 293, 0,
+ 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 34, index 15 */
+ 0, 0, 0, 295, 0, 0, 0, 0, 296, 0, 0, 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, 299, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, 0, 0, 0, 0, 0, 301,
+ 0, 302, 0, 0, 303, 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 305, 0, 0, 306, 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 308, 309, 0, 0, 310, 311, 0, 0, 312, 313, 314, 315, 0, 0, 0, 0,
+ 316, 317, 0, 0, 318, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320, 321, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 322, 0, 0, 0, 0, 0, 323, 324, 0, 325,
+ 0, 0, 0, 0, 0, 0, 326, 327, 328, 329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 48, index 16 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 0,
+ 0, 0, 0, 331, 0, 332, 0, 333, 0, 334, 0, 335, 0, 336, 0, 337, 0, 338, 0,
+ 339, 0, 340, 0, 341, 0, 342, 0, 0, 343, 0, 344, 0, 345, 0, 0, 0, 0, 0, 0,
+ 137, 0, 0, 138, 0, 0, 139, 0, 0, 140, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 397, 398,
+ 0, 0, 346, 0, 0, 0, 0, 0, 0, 0, 0, 347, 0, 0, 0, 0, 348, 0, 349, 0, 350,
+ 0, 351, 0, 352, 0, 353, 0, 354, 0, 355, 0, 356, 0, 357, 0, 358, 0, 359,
+ 0, 0, 360, 0, 361, 0, 362, 0, 0, 0, 0, 0, 0, 142, 0, 0, 143, 0, 0, 144,
+ 0, 0, 145, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 363, 364, 365, 366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 367, 0, 0
+ }
+};
+
+static const gint16 compose_table[COMPOSE_TABLE_LAST + 1] = {
+ 0 /* page 0 */,
+ 1 /* page 1 */,
+ 2 /* page 2 */,
+ 3 /* page 3 */,
+ 4 /* page 4 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 5 /* page 6 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 6 /* page 9 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 7 /* page 11 */,
+ 8 /* page 12 */,
+ 9 /* page 13 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 10 /* page 16 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 11 /* page 27 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 12 /* page 30 */,
+ 13 /* page 31 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 14 /* page 33 */,
+ 15 /* page 34 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 16 /* page 48 */
+};
+
+static const guint16 compose_first_single[][2] = {
+ { 0x0338, 0x226e },
+ { 0x0338, 0x2260 },
+ { 0x0338, 0x226f },
+ { 0x0307, 0x1e1e },
+ { 0x0302, 0x0134 },
+ { 0x0307, 0x1e1f },
+ { 0x0304, 0x01de },
+ { 0x0301, 0x01fa },
+ { 0x0301, 0x1e08 },
+ { 0x0301, 0x1e2e },
+ { 0x0304, 0x022a },
+ { 0x0301, 0x01fe },
+ { 0x0304, 0x01df },
+ { 0x0301, 0x01fb },
+ { 0x0301, 0x1e09 },
+ { 0x0301, 0x1e2f },
+ { 0x0304, 0x022b },
+ { 0x0301, 0x01ff },
+ { 0x0307, 0x1e64 },
+ { 0x0307, 0x1e65 },
+ { 0x0307, 0x1e66 },
+ { 0x0307, 0x1e67 },
+ { 0x0301, 0x1e78 },
+ { 0x0301, 0x1e79 },
+ { 0x0308, 0x1e7a },
+ { 0x0308, 0x1e7b },
+ { 0x0307, 0x1e9b },
+ { 0x030c, 0x01ee },
+ { 0x0304, 0x01ec },
+ { 0x0304, 0x01ed },
+ { 0x0304, 0x01e0 },
+ { 0x0304, 0x01e1 },
+ { 0x0306, 0x1e1c },
+ { 0x0306, 0x1e1d },
+ { 0x0304, 0x0230 },
+ { 0x0304, 0x0231 },
+ { 0x030c, 0x01ef },
+ { 0x0314, 0x1fec },
+ { 0x0345, 0x1fb4 },
+ { 0x0345, 0x1fc4 },
+ { 0x0345, 0x1ff4 },
+ { 0x0308, 0x0407 },
+ { 0x0301, 0x0403 },
+ { 0x0308, 0x04de },
+ { 0x0301, 0x040c },
+ { 0x0308, 0x04e6 },
+ { 0x0308, 0x04f4 },
+ { 0x0308, 0x04f8 },
+ { 0x0308, 0x04ec },
+ { 0x0301, 0x0453 },
+ { 0x0308, 0x04df },
+ { 0x0301, 0x045c },
+ { 0x0308, 0x04e7 },
+ { 0x0308, 0x04f5 },
+ { 0x0308, 0x04f9 },
+ { 0x0308, 0x04ed },
+ { 0x0308, 0x0457 },
+ { 0x030f, 0x0476 },
+ { 0x030f, 0x0477 },
+ { 0x0308, 0x04da },
+ { 0x0308, 0x04db },
+ { 0x0308, 0x04ea },
+ { 0x0308, 0x04eb },
+ { 0x0654, 0x0624 },
+ { 0x0654, 0x0626 },
+ { 0x0654, 0x06c2 },
+ { 0x0654, 0x06d3 },
+ { 0x0654, 0x06c0 },
+ { 0x093c, 0x0929 },
+ { 0x093c, 0x0931 },
+ { 0x093c, 0x0934 },
+ { 0x0bd7, 0x0b94 },
+ { 0x0bbe, 0x0bcb },
+ { 0x0c56, 0x0c48 },
+ { 0x0cd5, 0x0cc0 },
+ { 0x0cd5, 0x0ccb },
+ { 0x0d3e, 0x0d4b },
+ { 0x0dca, 0x0ddd },
+ { 0x102e, 0x1026 },
+ { 0x1b35, 0x1b06 },
+ { 0x1b35, 0x1b08 },
+ { 0x1b35, 0x1b0a },
+ { 0x1b35, 0x1b0c },
+ { 0x1b35, 0x1b0e },
+ { 0x1b35, 0x1b12 },
+ { 0x1b35, 0x1b3b },
+ { 0x1b35, 0x1b3d },
+ { 0x1b35, 0x1b40 },
+ { 0x1b35, 0x1b41 },
+ { 0x1b35, 0x1b43 },
+ { 0x0304, 0x1e38 },
+ { 0x0304, 0x1e39 },
+ { 0x0304, 0x1e5c },
+ { 0x0304, 0x1e5d },
+ { 0x0307, 0x1e68 },
+ { 0x0307, 0x1e69 },
+ { 0x0302, 0x1ec6 },
+ { 0x0302, 0x1ec7 },
+ { 0x0302, 0x1ed8 },
+ { 0x0302, 0x1ed9 },
+ { 0x0345, 0x1f82 },
+ { 0x0345, 0x1f83 },
+ { 0x0345, 0x1f84 },
+ { 0x0345, 0x1f85 },
+ { 0x0345, 0x1f86 },
+ { 0x0345, 0x1f87 },
+ { 0x0345, 0x1f8a },
+ { 0x0345, 0x1f8b },
+ { 0x0345, 0x1f8c },
+ { 0x0345, 0x1f8d },
+ { 0x0345, 0x1f8e },
+ { 0x0345, 0x1f8f },
+ { 0x0345, 0x1f92 },
+ { 0x0345, 0x1f93 },
+ { 0x0345, 0x1f94 },
+ { 0x0345, 0x1f95 },
+ { 0x0345, 0x1f96 },
+ { 0x0345, 0x1f97 },
+ { 0x0345, 0x1f9a },
+ { 0x0345, 0x1f9b },
+ { 0x0345, 0x1f9c },
+ { 0x0345, 0x1f9d },
+ { 0x0345, 0x1f9e },
+ { 0x0345, 0x1f9f },
+ { 0x0345, 0x1fa2 },
+ { 0x0345, 0x1fa3 },
+ { 0x0345, 0x1fa4 },
+ { 0x0345, 0x1fa5 },
+ { 0x0345, 0x1fa6 },
+ { 0x0345, 0x1fa7 },
+ { 0x0345, 0x1faa },
+ { 0x0345, 0x1fab },
+ { 0x0345, 0x1fac },
+ { 0x0345, 0x1fad },
+ { 0x0345, 0x1fae },
+ { 0x0345, 0x1faf },
+ { 0x0345, 0x1fb2 },
+ { 0x0345, 0x1fc2 },
+ { 0x0345, 0x1ff2 },
+ { 0x0345, 0x1fb7 },
+ { 0x0345, 0x1fc7 },
+ { 0x0345, 0x1ff7 },
+ { 0x0338, 0x219a },
+ { 0x0338, 0x219b },
+ { 0x0338, 0x21ae },
+ { 0x0338, 0x21cd },
+ { 0x0338, 0x21cf },
+ { 0x0338, 0x21ce },
+ { 0x0338, 0x2204 },
+ { 0x0338, 0x2209 },
+ { 0x0338, 0x220c },
+ { 0x0338, 0x2224 },
+ { 0x0338, 0x2226 },
+ { 0x0338, 0x2241 },
+ { 0x0338, 0x2244 },
+ { 0x0338, 0x2247 },
+ { 0x0338, 0x2249 },
+ { 0x0338, 0x226d },
+ { 0x0338, 0x2262 },
+ { 0x0338, 0x2270 },
+ { 0x0338, 0x2271 },
+ { 0x0338, 0x2274 },
+ { 0x0338, 0x2275 },
+ { 0x0338, 0x2278 },
+ { 0x0338, 0x2279 },
+ { 0x0338, 0x2280 },
+ { 0x0338, 0x2281 },
+ { 0x0338, 0x22e0 },
+ { 0x0338, 0x22e1 },
+ { 0x0338, 0x2284 },
+ { 0x0338, 0x2285 },
+ { 0x0338, 0x2288 },
+ { 0x0338, 0x2289 },
+ { 0x0338, 0x22e2 },
+ { 0x0338, 0x22e3 },
+ { 0x0338, 0x22ac },
+ { 0x0338, 0x22ad },
+ { 0x0338, 0x22ae },
+ { 0x0338, 0x22af },
+ { 0x0338, 0x22ea },
+ { 0x0338, 0x22eb },
+ { 0x0338, 0x22ec },
+ { 0x0338, 0x22ed },
+ { 0x3099, 0x3094 },
+ { 0x3099, 0x304c },
+ { 0x3099, 0x304e },
+ { 0x3099, 0x3050 },
+ { 0x3099, 0x3052 },
+ { 0x3099, 0x3054 },
+ { 0x3099, 0x3056 },
+ { 0x3099, 0x3058 },
+ { 0x3099, 0x305a },
+ { 0x3099, 0x305c },
+ { 0x3099, 0x305e },
+ { 0x3099, 0x3060 },
+ { 0x3099, 0x3062 },
+ { 0x3099, 0x3065 },
+ { 0x3099, 0x3067 },
+ { 0x3099, 0x3069 },
+ { 0x3099, 0x309e },
+ { 0x3099, 0x30f4 },
+ { 0x3099, 0x30ac },
+ { 0x3099, 0x30ae },
+ { 0x3099, 0x30b0 },
+ { 0x3099, 0x30b2 },
+ { 0x3099, 0x30b4 },
+ { 0x3099, 0x30b6 },
+ { 0x3099, 0x30b8 },
+ { 0x3099, 0x30ba },
+ { 0x3099, 0x30bc },
+ { 0x3099, 0x30be },
+ { 0x3099, 0x30c0 },
+ { 0x3099, 0x30c2 },
+ { 0x3099, 0x30c5 },
+ { 0x3099, 0x30c7 },
+ { 0x3099, 0x30c9 },
+ { 0x3099, 0x30f7 },
+ { 0x3099, 0x30f8 },
+ { 0x3099, 0x30f9 },
+ { 0x3099, 0x30fa },
+ { 0x3099, 0x30fe }
+};
+static const guint16 compose_second_single[][2] = {
+ { 0x0627, 0x0622 },
+ { 0x0627, 0x0623 },
+ { 0x0627, 0x0625 },
+ { 0x09c7, 0x09cb },
+ { 0x09c7, 0x09cc },
+ { 0x0b47, 0x0b4b },
+ { 0x0b47, 0x0b48 },
+ { 0x0b47, 0x0b4c },
+ { 0x0bc6, 0x0bca },
+ { 0x0bc6, 0x0bcc },
+ { 0x0cc6, 0x0cca },
+ { 0x0cc6, 0x0cc7 },
+ { 0x0cc6, 0x0cc8 },
+ { 0x0d46, 0x0d4a },
+ { 0x0d46, 0x0d4c },
+ { 0x0dd9, 0x0dda },
+ { 0x0dd9, 0x0ddc },
+ { 0x0dd9, 0x0dde }
+};
+static const guint16 compose_array[146][31] = {
+ { 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x0100, 0x0102, 0x0226, 0x00c4, 0x1ea2, 0x00c5, 0, 0x01cd, 0x0200, 0x0202, 0, 0, 0, 0x1ea0, 0, 0x1e00, 0, 0, 0x0104, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0x1e02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e04, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e06, 0, 0, 0, 0 },
+ { 0, 0x0106, 0x0108, 0, 0, 0, 0x010a, 0, 0, 0, 0, 0x010c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00c7, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0x1e0a, 0, 0, 0, 0, 0x010e, 0, 0, 0, 0, 0, 0x1e0c, 0, 0, 0, 0x1e10, 0, 0x1e12, 0, 0, 0x1e0e, 0, 0, 0, 0 },
+ { 0x00c8, 0x00c9, 0x00ca, 0x1ebc, 0x0112, 0x0114, 0x0116, 0x00cb, 0x1eba, 0, 0, 0x011a, 0x0204, 0x0206, 0, 0, 0, 0x1eb8, 0, 0, 0, 0x0228, 0x0118, 0x1e18, 0, 0x1e1a, 0, 0, 0, 0, 0 },
+ { 0, 0x01f4, 0x011c, 0, 0x1e20, 0x011e, 0x0120, 0, 0, 0, 0, 0x01e6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0122, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0x0124, 0, 0, 0, 0x1e22, 0x1e26, 0, 0, 0, 0x021e, 0, 0, 0, 0, 0, 0x1e24, 0, 0, 0, 0x1e28, 0, 0, 0x1e2a, 0, 0, 0, 0, 0, 0 },
+ { 0x00cc, 0x00cd, 0x00ce, 0x0128, 0x012a, 0x012c, 0x0130, 0x00cf, 0x1ec8, 0, 0, 0x01cf, 0x0208, 0x020a, 0, 0, 0, 0x1eca, 0, 0, 0, 0, 0x012e, 0, 0, 0x1e2c, 0, 0, 0, 0, 0 },
+ { 0, 0x1e30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01e8, 0, 0, 0, 0, 0, 0x1e32, 0, 0, 0, 0x0136, 0, 0, 0, 0, 0x1e34, 0, 0, 0, 0 },
+ { 0, 0x0139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x013d, 0, 0, 0, 0, 0, 0x1e36, 0, 0, 0, 0x013b, 0, 0x1e3c, 0, 0, 0x1e3a, 0, 0, 0, 0 },
+ { 0, 0x1e3e, 0, 0, 0, 0, 0x1e40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x01f8, 0x0143, 0, 0x00d1, 0, 0, 0x1e44, 0, 0, 0, 0, 0x0147, 0, 0, 0, 0, 0, 0x1e46, 0, 0, 0, 0x0145, 0, 0x1e4a, 0, 0, 0x1e48, 0, 0, 0, 0 },
+ { 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x014c, 0x014e, 0x022e, 0x00d6, 0x1ece, 0, 0x0150, 0x01d1, 0x020c, 0x020e, 0, 0, 0x01a0, 0x1ecc, 0, 0, 0, 0, 0x01ea, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0x1e54, 0, 0, 0, 0, 0x1e56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0x0154, 0, 0, 0, 0, 0x1e58, 0, 0, 0, 0, 0x0158, 0x0210, 0x0212, 0, 0, 0, 0x1e5a, 0, 0, 0, 0x0156, 0, 0, 0, 0, 0x1e5e, 0, 0, 0, 0 },
+ { 0, 0x015a, 0x015c, 0, 0, 0, 0x1e60, 0, 0, 0, 0, 0x0160, 0, 0, 0, 0, 0, 0x1e62, 0, 0, 0x0218, 0x015e, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0x1e6a, 0, 0, 0, 0, 0x0164, 0, 0, 0, 0, 0, 0x1e6c, 0, 0, 0x021a, 0x0162, 0, 0x1e70, 0, 0, 0x1e6e, 0, 0, 0, 0 },
+ { 0x00d9, 0x00da, 0x00db, 0x0168, 0x016a, 0x016c, 0, 0x00dc, 0x1ee6, 0x016e, 0x0170, 0x01d3, 0x0214, 0x0216, 0, 0, 0x01af, 0x1ee4, 0x1e72, 0, 0, 0, 0x0172, 0x1e76, 0, 0x1e74, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0x1e7c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e7e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1e80, 0x1e82, 0x0174, 0, 0, 0, 0x1e86, 0x1e84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0x1e8a, 0x1e8c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1ef2, 0x00dd, 0x0176, 0x1ef8, 0x0232, 0, 0x1e8e, 0x0178, 0x1ef6, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0x0179, 0x1e90, 0, 0, 0, 0x017b, 0, 0, 0, 0, 0x017d, 0, 0, 0, 0, 0, 0x1e92, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e94, 0, 0, 0, 0 },
+ { 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x0101, 0x0103, 0x0227, 0x00e4, 0x1ea3, 0x00e5, 0, 0x01ce, 0x0201, 0x0203, 0, 0, 0, 0x1ea1, 0, 0x1e01, 0, 0, 0x0105, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0x1e03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e05, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e07, 0, 0, 0, 0 },
+ { 0, 0x0107, 0x0109, 0, 0, 0, 0x010b, 0, 0, 0, 0, 0x010d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00e7, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0x1e0b, 0, 0, 0, 0, 0x010f, 0, 0, 0, 0, 0, 0x1e0d, 0, 0, 0, 0x1e11, 0, 0x1e13, 0, 0, 0x1e0f, 0, 0, 0, 0 },
+ { 0x00e8, 0x00e9, 0x00ea, 0x1ebd, 0x0113, 0x0115, 0x0117, 0x00eb, 0x1ebb, 0, 0, 0x011b, 0x0205, 0x0207, 0, 0, 0, 0x1eb9, 0, 0, 0, 0x0229, 0x0119, 0x1e19, 0, 0x1e1b, 0, 0, 0, 0, 0 },
+ { 0, 0x01f5, 0x011d, 0, 0x1e21, 0x011f, 0x0121, 0, 0, 0, 0, 0x01e7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0123, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0x0125, 0, 0, 0, 0x1e23, 0x1e27, 0, 0, 0, 0x021f, 0, 0, 0, 0, 0, 0x1e25, 0, 0, 0, 0x1e29, 0, 0, 0x1e2b, 0, 0x1e96, 0, 0, 0, 0 },
+ { 0x00ec, 0x00ed, 0x00ee, 0x0129, 0x012b, 0x012d, 0, 0x00ef, 0x1ec9, 0, 0, 0x01d0, 0x0209, 0x020b, 0, 0, 0, 0x1ecb, 0, 0, 0, 0, 0x012f, 0, 0, 0x1e2d, 0, 0, 0, 0, 0 },
+ { 0, 0, 0x0135, 0, 0, 0, 0, 0, 0, 0, 0, 0x01f0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0x1e31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01e9, 0, 0, 0, 0, 0, 0x1e33, 0, 0, 0, 0x0137, 0, 0, 0, 0, 0x1e35, 0, 0, 0, 0 },
+ { 0, 0x013a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x013e, 0, 0, 0, 0, 0, 0x1e37, 0, 0, 0, 0x013c, 0, 0x1e3d, 0, 0, 0x1e3b, 0, 0, 0, 0 },
+ { 0, 0x1e3f, 0, 0, 0, 0, 0x1e41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x01f9, 0x0144, 0, 0x00f1, 0, 0, 0x1e45, 0, 0, 0, 0, 0x0148, 0, 0, 0, 0, 0, 0x1e47, 0, 0, 0, 0x0146, 0, 0x1e4b, 0, 0, 0x1e49, 0, 0, 0, 0 },
+ { 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x014d, 0x014f, 0x022f, 0x00f6, 0x1ecf, 0, 0x0151, 0x01d2, 0x020d, 0x020f, 0, 0, 0x01a1, 0x1ecd, 0, 0, 0, 0, 0x01eb, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0x1e55, 0, 0, 0, 0, 0x1e57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0x0155, 0, 0, 0, 0, 0x1e59, 0, 0, 0, 0, 0x0159, 0x0211, 0x0213, 0, 0, 0, 0x1e5b, 0, 0, 0, 0x0157, 0, 0, 0, 0, 0x1e5f, 0, 0, 0, 0 },
+ { 0, 0x015b, 0x015d, 0, 0, 0, 0x1e61, 0, 0, 0, 0, 0x0161, 0, 0, 0, 0, 0, 0x1e63, 0, 0, 0x0219, 0x015f, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0x1e6b, 0x1e97, 0, 0, 0, 0x0165, 0, 0, 0, 0, 0, 0x1e6d, 0, 0, 0x021b, 0x0163, 0, 0x1e71, 0, 0, 0x1e6f, 0, 0, 0, 0 },
+ { 0x00f9, 0x00fa, 0x00fb, 0x0169, 0x016b, 0x016d, 0, 0x00fc, 0x1ee7, 0x016f, 0x0171, 0x01d4, 0x0215, 0x0217, 0, 0, 0x01b0, 0x1ee5, 0x1e73, 0, 0, 0, 0x0173, 0x1e77, 0, 0x1e75, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0x1e7d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e7f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1e81, 0x1e83, 0x0175, 0, 0, 0, 0x1e87, 0x1e85, 0, 0x1e98, 0, 0, 0, 0, 0, 0, 0, 0x1e89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0x1e8b, 0x1e8d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1ef3, 0x00fd, 0x0177, 0x1ef9, 0x0233, 0, 0x1e8f, 0x00ff, 0x1ef7, 0x1e99, 0, 0, 0, 0, 0, 0, 0, 0x1ef5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0x017a, 0x1e91, 0, 0, 0, 0x017c, 0, 0, 0, 0, 0x017e, 0, 0, 0, 0, 0, 0x1e93, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e95, 0, 0, 0, 0 },
+ { 0x1fed, 0x0385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fc1, 0, 0, 0 },
+ { 0x1ea6, 0x1ea4, 0, 0x1eaa, 0, 0, 0, 0, 0x1ea8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0x01fc, 0, 0, 0x01e2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1ec0, 0x1ebe, 0, 0x1ec4, 0, 0, 0, 0, 0x1ec2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1ed2, 0x1ed0, 0, 0x1ed6, 0, 0, 0, 0, 0x1ed4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0x1e4c, 0, 0, 0x022c, 0, 0, 0x1e4e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x01db, 0x01d7, 0, 0, 0x01d5, 0, 0, 0, 0, 0, 0, 0x01d9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1ea7, 0x1ea5, 0, 0x1eab, 0, 0, 0, 0, 0x1ea9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0x01fd, 0, 0, 0x01e3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1ec1, 0x1ebf, 0, 0x1ec5, 0, 0, 0, 0, 0x1ec3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1ed3, 0x1ed1, 0, 0x1ed7, 0, 0, 0, 0, 0x1ed5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0x1e4d, 0, 0, 0x022d, 0, 0, 0x1e4f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x01dc, 0x01d8, 0, 0, 0x01d6, 0, 0, 0, 0, 0, 0, 0x01da, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1eb0, 0x1eae, 0, 0x1eb4, 0, 0, 0, 0, 0x1eb2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1eb1, 0x1eaf, 0, 0x1eb5, 0, 0, 0, 0, 0x1eb3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1e14, 0x1e16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1e15, 0x1e17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1e50, 0x1e52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1e51, 0x1e53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1edc, 0x1eda, 0, 0x1ee0, 0, 0, 0, 0, 0x1ede, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ee2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1edd, 0x1edb, 0, 0x1ee1, 0, 0, 0, 0, 0x1edf, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ee3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1eea, 0x1ee8, 0, 0x1eee, 0, 0, 0, 0, 0x1eec, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1eeb, 0x1ee9, 0, 0x1eef, 0, 0, 0, 0, 0x1eed, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1fba, 0x0386, 0, 0, 0x1fb9, 0x1fb8, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f08, 0x1f09, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fbc, 0, 0 },
+ { 0x1fc8, 0x0388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f18, 0x1f19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1fca, 0x0389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f28, 0x1f29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fcc, 0, 0 },
+ { 0x1fda, 0x038a, 0, 0, 0x1fd9, 0x1fd8, 0, 0x03aa, 0, 0, 0, 0, 0, 0, 0x1f38, 0x1f39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1ff8, 0x038c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f48, 0x1f49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1fea, 0x038e, 0, 0, 0x1fe9, 0x1fe8, 0, 0x03ab, 0, 0, 0, 0, 0, 0, 0, 0x1f59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1ffa, 0x038f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f68, 0x1f69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ffc, 0, 0 },
+ { 0x1f70, 0x03ac, 0, 0, 0x1fb1, 0x1fb0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f00, 0x1f01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fb6, 0x1fb3, 0, 0 },
+ { 0x1f72, 0x03ad, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f10, 0x1f11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1f74, 0x03ae, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f20, 0x1f21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fc6, 0x1fc3, 0, 0 },
+ { 0x1f76, 0x03af, 0, 0, 0x1fd1, 0x1fd0, 0, 0x03ca, 0, 0, 0, 0, 0, 0, 0x1f30, 0x1f31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fd6, 0, 0, 0 },
+ { 0x1f78, 0x03cc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f40, 0x1f41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe4, 0x1fe5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1f7a, 0x03cd, 0, 0, 0x1fe1, 0x1fe0, 0, 0x03cb, 0, 0, 0, 0, 0, 0, 0x1f50, 0x1f51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe6, 0, 0, 0 },
+ { 0x1f7c, 0x03ce, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f60, 0x1f61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ff6, 0x1ff3, 0, 0 },
+ { 0x1fd2, 0x0390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fd7, 0, 0, 0 },
+ { 0x1fe2, 0x03b0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe7, 0, 0, 0 },
+ { 0, 0x03d3, 0, 0, 0, 0, 0, 0x03d4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0x04d0, 0, 0x04d2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x0400, 0, 0, 0, 0, 0x04d6, 0, 0x0401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0x04c1, 0, 0x04dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x040d, 0, 0, 0, 0x04e2, 0x0419, 0, 0x04e4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0x04ee, 0x040e, 0, 0x04f0, 0, 0, 0x04f2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0x04d1, 0, 0x04d3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x0450, 0, 0, 0, 0, 0x04d7, 0, 0x0451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0x04c2, 0, 0x04dd, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x045d, 0, 0, 0, 0x04e3, 0x0439, 0, 0x04e5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0x04ef, 0x045e, 0, 0x04f1, 0, 0, 0x04f3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0x1eac, 0, 0, 0x1eb6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0x1ead, 0, 0, 0x1eb7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1f02, 0x1f04, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f06, 0x1f80, 0, 0 },
+ { 0x1f03, 0x1f05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f07, 0x1f81, 0, 0 },
+ { 0x1f0a, 0x1f0c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f0e, 0x1f88, 0, 0 },
+ { 0x1f0b, 0x1f0d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f0f, 0x1f89, 0, 0 },
+ { 0x1f12, 0x1f14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1f13, 0x1f15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1f1a, 0x1f1c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1f1b, 0x1f1d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1f22, 0x1f24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f26, 0x1f90, 0, 0 },
+ { 0x1f23, 0x1f25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f27, 0x1f91, 0, 0 },
+ { 0x1f2a, 0x1f2c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f2e, 0x1f98, 0, 0 },
+ { 0x1f2b, 0x1f2d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f2f, 0x1f99, 0, 0 },
+ { 0x1f32, 0x1f34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f36, 0, 0, 0 },
+ { 0x1f33, 0x1f35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f37, 0, 0, 0 },
+ { 0x1f3a, 0x1f3c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f3e, 0, 0, 0 },
+ { 0x1f3b, 0x1f3d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f3f, 0, 0, 0 },
+ { 0x1f42, 0x1f44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1f43, 0x1f45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1f4a, 0x1f4c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1f4b, 0x1f4d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1f52, 0x1f54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f56, 0, 0, 0 },
+ { 0x1f53, 0x1f55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f57, 0, 0, 0 },
+ { 0x1f5b, 0x1f5d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f5f, 0, 0, 0 },
+ { 0x1f62, 0x1f64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f66, 0x1fa0, 0, 0 },
+ { 0x1f63, 0x1f65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f67, 0x1fa1, 0, 0 },
+ { 0x1f6a, 0x1f6c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f6e, 0x1fa8, 0, 0 },
+ { 0x1f6b, 0x1f6d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f6f, 0x1fa9, 0, 0 },
+ { 0x1fcd, 0x1fce, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fcf, 0, 0, 0 },
+ { 0x1fdd, 0x1fde, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fdf, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3070, 0x3071 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3073, 0x3074 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3076, 0x3077 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3079, 0x307a },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x307c, 0x307d },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d0, 0x30d1 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d3, 0x30d4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d6, 0x30d7 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d9, 0x30da },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30dc, 0x30dd }
+};
diff --git a/trunk/glib/gunidecomp.c b/trunk/glib/gunidecomp.c
new file mode 100644
index 000000000..21fd7c649
--- /dev/null
+++ b/trunk/glib/gunidecomp.c
@@ -0,0 +1,525 @@
+/* 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 "config.h"
+
+#include <stdlib.h>
+
+#include "glib.h"
+#include "gunidecomp.h"
+#include "gunicomp.h"
+#include "gunicodeprivate.h"
+#include "galias.h"
+
+
+#define CC_PART1(Page, Char) \
+ ((combining_class_table_part1[Page] >= G_UNICODE_MAX_TABLE_INDEX) \
+ ? (combining_class_table_part1[Page] - G_UNICODE_MAX_TABLE_INDEX) \
+ : (cclass_data[combining_class_table_part1[Page]][Char]))
+
+#define CC_PART2(Page, Char) \
+ ((combining_class_table_part2[Page] >= G_UNICODE_MAX_TABLE_INDEX) \
+ ? (combining_class_table_part2[Page] - G_UNICODE_MAX_TABLE_INDEX) \
+ : (cclass_data[combining_class_table_part2[Page]][Char]))
+
+#define COMBINING_CLASS(Char) \
+ (((Char) <= G_UNICODE_LAST_CHAR_PART1) \
+ ? CC_PART1 ((Char) >> 8, (Char) & 0xff) \
+ : (((Char) >= 0xe0000 && (Char) <= G_UNICODE_LAST_CHAR) \
+ ? CC_PART2 (((Char) - 0xe0000) >> 8, (Char) & 0xff) \
+ : 0))
+
+gint
+_g_unichar_combining_class (gunichar uc)
+{
+ return COMBINING_CLASS (uc);
+}
+
+/* constants for hangul syllable [de]composition */
+#define SBase 0xAC00
+#define LBase 0x1100
+#define VBase 0x1161
+#define TBase 0x11A7
+#define LCount 19
+#define VCount 21
+#define TCount 28
+#define NCount (VCount * TCount)
+#define SCount (LCount * NCount)
+
+/**
+ * g_unicode_canonical_ordering:
+ * @string: a UCS-4 encoded string.
+ * @len: the maximum length of @string to use.
+ *
+ * Computes the 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)
+{
+ gsize 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)
+ {
+ gsize j;
+ /* Percolate item leftward through string. */
+ for (j = i + 1; j > 0; --j)
+ {
+ gunichar t;
+ if (COMBINING_CLASS (string[j - 1]) <= next)
+ break;
+ t = string[j];
+ string[j] = string[j - 1];
+ string[j - 1] = t;
+ swap = 1;
+ }
+ /* We're re-entering the loop looking at the old
+ character again. */
+ next = last;
+ }
+ last = next;
+ }
+ }
+}
+
+/* http://www.unicode.org/unicode/reports/tr15/#Hangul
+ * r should be null or have sufficient space. Calling with r == NULL will
+ * only calculate the result_len; however, a buffer with space for three
+ * characters will always be big enough. */
+static void
+decompose_hangul (gunichar s,
+ gunichar *r,
+ gsize *result_len)
+{
+ gint SIndex = s - SBase;
+
+ /* not a hangul syllable */
+ if (SIndex < 0 || SIndex >= SCount)
+ {
+ if (r)
+ r[0] = s;
+ *result_len = 1;
+ }
+ else
+ {
+ gunichar L = LBase + SIndex / NCount;
+ gunichar V = VBase + (SIndex % NCount) / TCount;
+ gunichar T = TBase + SIndex % TCount;
+
+ if (r)
+ {
+ r[0] = L;
+ r[1] = V;
+ }
+
+ if (T != TBase)
+ {
+ if (r)
+ r[2] = T;
+ *result_len = 3;
+ }
+ else
+ *result_len = 2;
+ }
+}
+
+/* returns a pointer to a null-terminated UTF-8 string */
+static const gchar *
+find_decomposition (gunichar ch,
+ gboolean compat)
+{
+ int start = 0;
+ int end = G_N_ELEMENTS (decomp_table);
+
+ if (ch >= decomp_table[start].ch &&
+ ch <= decomp_table[end - 1].ch)
+ {
+ while (TRUE)
+ {
+ int half = (start + end) / 2;
+ if (ch == decomp_table[half].ch)
+ {
+ int offset;
+
+ if (compat)
+ {
+ offset = decomp_table[half].compat_offset;
+ if (offset == G_UNICODE_NOT_PRESENT_OFFSET)
+ offset = decomp_table[half].canon_offset;
+ }
+ else
+ {
+ offset = decomp_table[half].canon_offset;
+ if (offset == G_UNICODE_NOT_PRESENT_OFFSET)
+ return NULL;
+ }
+
+ return &(decomp_expansion_string[offset]);
+ }
+ else if (half == start)
+ break;
+ else if (ch > decomp_table[half].ch)
+ start = half;
+ else
+ end = half;
+ }
+ }
+
+ return NULL;
+}
+
+/**
+ * g_unicode_canonical_decomposition:
+ * @ch: a Unicode character.
+ * @result_len: location to store the length of the return value.
+ *
+ * Computes the canonical decomposition of a Unicode character.
+ *
+ * Return value: a newly allocated 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)
+{
+ const gchar *decomp;
+ const gchar *p;
+ gunichar *r;
+
+ /* Hangul syllable */
+ if (ch >= 0xac00 && ch <= 0xd7a3)
+ {
+ decompose_hangul (ch, NULL, result_len);
+ r = g_malloc (*result_len * sizeof (gunichar));
+ decompose_hangul (ch, r, result_len);
+ }
+ else if ((decomp = find_decomposition (ch, FALSE)) != NULL)
+ {
+ /* Found it. */
+ int i;
+
+ *result_len = g_utf8_strlen (decomp, -1);
+ r = g_malloc (*result_len * sizeof (gunichar));
+
+ for (p = decomp, i = 0; *p != '\0'; p = g_utf8_next_char (p), i++)
+ r[i] = g_utf8_get_char (p);
+ }
+ else
+ {
+ /* Not in our table. */
+ r = g_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;
+}
+
+/* L,V => LV and LV,T => LVT */
+static gboolean
+combine_hangul (gunichar a,
+ gunichar b,
+ gunichar *result)
+{
+ gint LIndex = a - LBase;
+ gint SIndex = a - SBase;
+
+ gint VIndex = b - VBase;
+ gint TIndex = b - TBase;
+
+ if (0 <= LIndex && LIndex < LCount
+ && 0 <= VIndex && VIndex < VCount)
+ {
+ *result = SBase + (LIndex * VCount + VIndex) * TCount;
+ return TRUE;
+ }
+ else if (0 <= SIndex && SIndex < SCount && (SIndex % TCount) == 0
+ && 0 < TIndex && TIndex < TCount)
+ {
+ *result = a + TIndex;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+#define CI(Page, Char) \
+ ((compose_table[Page] >= G_UNICODE_MAX_TABLE_INDEX) \
+ ? (compose_table[Page] - G_UNICODE_MAX_TABLE_INDEX) \
+ : (compose_data[compose_table[Page]][Char]))
+
+#define COMPOSE_INDEX(Char) \
+ (((Char >> 8) > (COMPOSE_TABLE_LAST)) ? 0 : CI((Char) >> 8, (Char) & 0xff))
+
+static gboolean
+combine (gunichar a,
+ gunichar b,
+ gunichar *result)
+{
+ gushort index_a, index_b;
+
+ if (combine_hangul (a, b, result))
+ return TRUE;
+
+ index_a = COMPOSE_INDEX(a);
+
+ if (index_a >= COMPOSE_FIRST_SINGLE_START && index_a < COMPOSE_SECOND_START)
+ {
+ if (b == compose_first_single[index_a - COMPOSE_FIRST_SINGLE_START][0])
+ {
+ *result = compose_first_single[index_a - COMPOSE_FIRST_SINGLE_START][1];
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+
+ index_b = COMPOSE_INDEX(b);
+
+ if (index_b >= COMPOSE_SECOND_SINGLE_START)
+ {
+ if (a == compose_second_single[index_b - COMPOSE_SECOND_SINGLE_START][0])
+ {
+ *result = compose_second_single[index_b - COMPOSE_SECOND_SINGLE_START][1];
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+
+ if (index_a >= COMPOSE_FIRST_START && index_a < COMPOSE_FIRST_SINGLE_START &&
+ index_b >= COMPOSE_SECOND_START && index_b < COMPOSE_SECOND_SINGLE_START)
+ {
+ gunichar res = compose_array[index_a - COMPOSE_FIRST_START][index_b - COMPOSE_SECOND_START];
+
+ if (res)
+ {
+ *result = res;
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+gunichar *
+_g_utf8_normalize_wc (const gchar *str,
+ gssize max_len,
+ GNormalizeMode mode)
+{
+ gsize n_wc;
+ gunichar *wc_buffer;
+ const char *p;
+ gsize last_start;
+ gboolean do_compat = (mode == G_NORMALIZE_NFKC ||
+ mode == G_NORMALIZE_NFKD);
+ gboolean do_compose = (mode == G_NORMALIZE_NFC ||
+ mode == G_NORMALIZE_NFKC);
+
+ n_wc = 0;
+ p = str;
+ while ((max_len < 0 || p < str + max_len) && *p)
+ {
+ const gchar *decomp;
+ gunichar wc = g_utf8_get_char (p);
+
+ if (wc >= 0xac00 && wc <= 0xd7a3)
+ {
+ gsize result_len;
+ decompose_hangul (wc, NULL, &result_len);
+ n_wc += result_len;
+ }
+ else
+ {
+ decomp = find_decomposition (wc, do_compat);
+
+ if (decomp)
+ n_wc += g_utf8_strlen (decomp, -1);
+ else
+ n_wc++;
+ }
+
+ p = g_utf8_next_char (p);
+ }
+
+ wc_buffer = g_new (gunichar, n_wc + 1);
+
+ last_start = 0;
+ n_wc = 0;
+ p = str;
+ while ((max_len < 0 || p < str + max_len) && *p)
+ {
+ gunichar wc = g_utf8_get_char (p);
+ const gchar *decomp;
+ int cc;
+ gsize old_n_wc = n_wc;
+
+ if (wc >= 0xac00 && wc <= 0xd7a3)
+ {
+ gsize result_len;
+ decompose_hangul (wc, wc_buffer + n_wc, &result_len);
+ n_wc += result_len;
+ }
+ else
+ {
+ decomp = find_decomposition (wc, do_compat);
+
+ if (decomp)
+ {
+ const char *pd;
+ for (pd = decomp; *pd != '\0'; pd = g_utf8_next_char (pd))
+ wc_buffer[n_wc++] = g_utf8_get_char (pd);
+ }
+ else
+ wc_buffer[n_wc++] = wc;
+ }
+
+ if (n_wc > 0)
+ {
+ cc = COMBINING_CLASS (wc_buffer[old_n_wc]);
+
+ if (cc == 0)
+ {
+ g_unicode_canonical_ordering (wc_buffer + last_start, n_wc - last_start);
+ last_start = old_n_wc;
+ }
+ }
+
+ p = g_utf8_next_char (p);
+ }
+
+ if (n_wc > 0)
+ {
+ g_unicode_canonical_ordering (wc_buffer + last_start, n_wc - last_start);
+ last_start = n_wc;
+ }
+
+ wc_buffer[n_wc] = 0;
+
+ /* All decomposed and reordered */
+
+ if (do_compose && n_wc > 0)
+ {
+ gsize i, j;
+ int last_cc = 0;
+ last_start = 0;
+
+ for (i = 0; i < n_wc; i++)
+ {
+ int cc = COMBINING_CLASS (wc_buffer[i]);
+
+ if (i > 0 &&
+ (last_cc == 0 || last_cc < cc) &&
+ combine (wc_buffer[last_start], wc_buffer[i],
+ &wc_buffer[last_start]))
+ {
+ for (j = i + 1; j < n_wc; j++)
+ wc_buffer[j-1] = wc_buffer[j];
+ n_wc--;
+ i--;
+
+ if (i == last_start)
+ last_cc = 0;
+ else
+ last_cc = COMBINING_CLASS (wc_buffer[i-1]);
+
+ continue;
+ }
+
+ if (cc == 0)
+ last_start = i;
+
+ last_cc = cc;
+ }
+ }
+
+ wc_buffer[n_wc] = 0;
+
+ return wc_buffer;
+}
+
+/**
+ * g_utf8_normalize:
+ * @str: a UTF-8 encoded string.
+ * @len: length of @str, in bytes, or -1 if @str is nul-terminated.
+ * @mode: the type of normalization to perform.
+ *
+ * Converts a string into canonical form, standardizing
+ * such issues as whether a character with an accent
+ * is represented as a base character and combining
+ * accent or as a single precomposed character. You
+ * should generally call g_utf8_normalize() before
+ * comparing two Unicode strings.
+ *
+ * The normalization mode %G_NORMALIZE_DEFAULT only
+ * standardizes differences that do not affect the
+ * text content, such as the above-mentioned accent
+ * representation. %G_NORMALIZE_ALL also standardizes
+ * the "compatibility" characters in Unicode, such
+ * as SUPERSCRIPT THREE to the standard forms
+ * (in this case DIGIT THREE). Formatting information
+ * may be lost but for most text operations such
+ * characters should be considered the same.
+ * For example, g_utf8_collate() normalizes
+ * with %G_NORMALIZE_ALL as its first step.
+ *
+ * %G_NORMALIZE_DEFAULT_COMPOSE and %G_NORMALIZE_ALL_COMPOSE
+ * are like %G_NORMALIZE_DEFAULT and %G_NORMALIZE_ALL,
+ * but returned a result with composed forms rather
+ * than a maximally decomposed form. This is often
+ * useful if you intend to convert the string to
+ * a legacy encoding or pass it to a system with
+ * less capable Unicode handling.
+ *
+ * Return value: a newly allocated string, that is the
+ * normalized form of @str.
+ **/
+gchar *
+g_utf8_normalize (const gchar *str,
+ gssize len,
+ GNormalizeMode mode)
+{
+ gunichar *result_wc = _g_utf8_normalize_wc (str, len, mode);
+ gchar *result;
+
+ result = g_ucs4_to_utf8 (result_wc, -1, NULL, NULL, NULL);
+ g_free (result_wc);
+
+ return result;
+}
+
+#define __G_UNIDECOMP_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gunidecomp.h b/trunk/glib/gunidecomp.h
new file mode 100644
index 000000000..135d10742
--- /dev/null
+++ b/trunk/glib/gunidecomp.h
@@ -0,0 +1,10870 @@
+/* This file is automatically generated. DO NOT EDIT! */
+
+#ifndef DECOMP_H
+#define DECOMP_H
+
+#define G_UNICODE_LAST_CHAR 0x10ffff
+
+#define G_UNICODE_MAX_TABLE_INDEX (0x110000 / 256)
+
+#define G_UNICODE_LAST_CHAR_PART1 0x2FAFF
+
+#define G_UNICODE_LAST_PAGE_PART1 762
+
+#define G_UNICODE_NOT_PRESENT_OFFSET 65535
+
+static const guchar cclass_data[][256] = {
+ { /* page 3, index 0 */
+ 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, 230, 230, 230, 220, 220, 220, 220,
+ 230, 232, 220, 220, 230, 233, 234, 234, 233, 234, 234, 233, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 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
+ },
+ { /* page 4, index 1 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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
+ },
+ { /* page 5, index 2 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 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, 220, 220, 220, 220, 220, 220, 230, 230, 220, 230, 230,
+ 222, 228, 230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0,
+ 23, 0, 24, 25, 0, 230, 220, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 6, index 3 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 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, 27, 28, 29, 30, 31, 32, 33, 34, 230, 230, 220, 220,
+ 230, 230, 230, 230, 230, 220, 230, 230, 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
+ },
+ { /* page 7, index 4 */
+ 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, 230, 230, 230, 230, 230, 230, 230,
+ 220, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 9, index 5 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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
+ },
+ { /* page 10, index 6 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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
+ },
+ { /* page 11, index 7 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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
+ },
+ { /* page 12, index 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, 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, 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
+ },
+ { /* page 13, index 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, 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
+ },
+ { /* page 14, index 10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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
+ },
+ { /* page 15, index 11 */
+ 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
+ },
+ { /* page 16, index 12 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 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
+ },
+ { /* page 19, index 13 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 23, index 14 */
+ 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, 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, 9, 0, 0, 0, 0, 0,
+ 0, 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, 0, 0, 0, 0
+ },
+ { /* page 24, index 15 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 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
+ },
+ { /* page 25, index 16 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 26, index 17 */
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 27, index 18 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 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, 230, 220, 230, 230, 230, 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
+ },
+ { /* page 29, index 19 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 220, 230, 230, 230, 230, 230, 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, 0, 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
+ },
+ { /* page 32, index 20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 230, 220,
+ 230, 1, 1, 220, 220, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0
+ },
+ { /* page 48, index 21 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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
+ },
+ { /* page 168, index 22 */
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 251, index 23 */
+ 0, 0, 0, 0, 0, 0, 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
+ },
+ { /* page 254, index 24 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 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
+ },
+ { /* page 266, index 25 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 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, 230, 1, 220, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { /* page 465, index 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, 216, 216, 1, 1, 1, 0, 0, 0, 226, 216, 216, 216, 216, 216,
+ 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 220, 220, 220, 220, 220, 0, 0,
+ 230, 230, 230, 230, 230, 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, 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
+ },
+ { /* page 466, index 27 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 const gint16 combining_class_table_part1[763] = {
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 /* page 3 */,
+ 1 /* page 4 */,
+ 2 /* page 5 */,
+ 3 /* page 6 */,
+ 4 /* page 7 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 5 /* page 9 */,
+ 6 /* page 10 */,
+ 7 /* page 11 */,
+ 8 /* page 12 */,
+ 9 /* page 13 */,
+ 10 /* page 14 */,
+ 11 /* page 15 */,
+ 12 /* page 16 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 13 /* page 19 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 14 /* page 23 */,
+ 15 /* page 24 */,
+ 16 /* page 25 */,
+ 17 /* page 26 */,
+ 18 /* page 27 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 19 /* page 29 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 20 /* page 32 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 21 /* page 48 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 22 /* page 168 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 23 /* page 251 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 24 /* page 254 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 25 /* page 266 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 26 /* page 465 */,
+ 27 /* page 466 */,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX
+};
+
+static const gint16 combining_class_table_part2[768] = {
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX,
+ 0 + G_UNICODE_MAX_TABLE_INDEX
+};
+
+typedef struct
+{
+ gunichar ch;
+ guint16 canon_offset;
+ guint16 compat_offset;
+} decomposition;
+
+static const decomposition decomp_table[] =
+{
+ { 0x00a0, G_UNICODE_NOT_PRESENT_OFFSET, 0 },
+ { 0x00a8, G_UNICODE_NOT_PRESENT_OFFSET, 2 },
+ { 0x00aa, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x00af, G_UNICODE_NOT_PRESENT_OFFSET, 8 },
+ { 0x00b2, G_UNICODE_NOT_PRESENT_OFFSET, 12 },
+ { 0x00b3, G_UNICODE_NOT_PRESENT_OFFSET, 14 },
+ { 0x00b4, G_UNICODE_NOT_PRESENT_OFFSET, 16 },
+ { 0x00b5, G_UNICODE_NOT_PRESENT_OFFSET, 20 },
+ { 0x00b8, G_UNICODE_NOT_PRESENT_OFFSET, 23 },
+ { 0x00b9, G_UNICODE_NOT_PRESENT_OFFSET, 27 },
+ { 0x00ba, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x00bc, G_UNICODE_NOT_PRESENT_OFFSET, 31 },
+ { 0x00bd, G_UNICODE_NOT_PRESENT_OFFSET, 37 },
+ { 0x00be, G_UNICODE_NOT_PRESENT_OFFSET, 43 },
+ { 0x00c0, 49, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00c1, 53, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00c2, 57, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00c3, 61, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00c4, 65, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00c5, 69, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00c7, 73, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00c8, 77, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00c9, 81, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00ca, 85, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00cb, 89, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00cc, 93, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00cd, 97, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00ce, 101, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00cf, 105, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00d1, 109, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00d2, 113, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00d3, 117, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00d4, 121, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00d5, 125, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00d6, 129, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00d9, 133, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00da, 137, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00db, 141, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00dc, 145, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00dd, 149, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00e0, 153, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00e1, 157, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00e2, 161, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00e3, 165, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00e4, 169, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00e5, 173, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00e7, 177, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00e8, 181, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00e9, 185, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00ea, 189, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00eb, 193, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00ec, 197, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00ed, 201, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00ee, 205, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00ef, 209, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00f1, 213, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00f2, 217, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00f3, 221, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00f4, 225, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00f5, 229, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00f6, 233, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00f9, 237, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00fa, 241, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00fb, 245, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00fc, 249, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00fd, 253, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x00ff, 257, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0100, 261, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0101, 265, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0102, 269, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0103, 273, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0104, 277, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0105, 281, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0106, 285, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0107, 289, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0108, 293, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0109, 297, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x010a, 301, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x010b, 305, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x010c, 309, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x010d, 313, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x010e, 317, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x010f, 321, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0112, 325, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0113, 329, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0114, 333, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0115, 337, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0116, 341, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0117, 345, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0118, 349, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0119, 353, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x011a, 357, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x011b, 361, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x011c, 365, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x011d, 369, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x011e, 373, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x011f, 377, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0120, 381, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0121, 385, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0122, 389, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0123, 393, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0124, 397, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0125, 401, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0128, 405, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0129, 409, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x012a, 413, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x012b, 417, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x012c, 421, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x012d, 425, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x012e, 429, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x012f, 433, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0130, 437, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0132, G_UNICODE_NOT_PRESENT_OFFSET, 441 },
+ { 0x0133, G_UNICODE_NOT_PRESENT_OFFSET, 444 },
+ { 0x0134, 447, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0135, 451, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0136, 455, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0137, 459, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0139, 463, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x013a, 467, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x013b, 471, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x013c, 475, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x013d, 479, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x013e, 483, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x013f, G_UNICODE_NOT_PRESENT_OFFSET, 487 },
+ { 0x0140, G_UNICODE_NOT_PRESENT_OFFSET, 491 },
+ { 0x0143, 495, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0144, 499, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0145, 503, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0146, 507, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0147, 511, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0148, 515, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0149, G_UNICODE_NOT_PRESENT_OFFSET, 519 },
+ { 0x014c, 523, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x014d, 527, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x014e, 531, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x014f, 535, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0150, 539, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0151, 543, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0154, 547, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0155, 551, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0156, 555, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0157, 559, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0158, 563, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0159, 567, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x015a, 571, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x015b, 575, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x015c, 579, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x015d, 583, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x015e, 587, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x015f, 591, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0160, 595, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0161, 599, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0162, 603, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0163, 607, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0164, 611, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0165, 615, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0168, 619, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0169, 623, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x016a, 627, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x016b, 631, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x016c, 635, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x016d, 639, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x016e, 643, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x016f, 647, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0170, 651, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0171, 655, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0172, 659, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0173, 663, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0174, 667, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0175, 671, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0176, 675, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0177, 679, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0178, 683, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0179, 687, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x017a, 691, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x017b, 695, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x017c, 699, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x017d, 703, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x017e, 707, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x017f, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x01a0, 713, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01a1, 717, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01af, 721, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01b0, 725, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01c4, G_UNICODE_NOT_PRESENT_OFFSET, 729 },
+ { 0x01c5, G_UNICODE_NOT_PRESENT_OFFSET, 734 },
+ { 0x01c6, G_UNICODE_NOT_PRESENT_OFFSET, 739 },
+ { 0x01c7, G_UNICODE_NOT_PRESENT_OFFSET, 744 },
+ { 0x01c8, G_UNICODE_NOT_PRESENT_OFFSET, 747 },
+ { 0x01c9, G_UNICODE_NOT_PRESENT_OFFSET, 750 },
+ { 0x01ca, G_UNICODE_NOT_PRESENT_OFFSET, 753 },
+ { 0x01cb, G_UNICODE_NOT_PRESENT_OFFSET, 756 },
+ { 0x01cc, G_UNICODE_NOT_PRESENT_OFFSET, 759 },
+ { 0x01cd, 762, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01ce, 766, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01cf, 770, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01d0, 774, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01d1, 778, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01d2, 782, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01d3, 786, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01d4, 790, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01d5, 794, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01d6, 800, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01d7, 806, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01d8, 812, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01d9, 818, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01da, 824, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01db, 830, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01dc, 836, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01de, 842, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01df, 848, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01e0, 854, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01e1, 860, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01e2, 866, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01e3, 871, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01e6, 876, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01e7, 880, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01e8, 884, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01e9, 888, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01ea, 892, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01eb, 896, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01ec, 900, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01ed, 906, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01ee, 912, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01ef, 917, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01f0, 922, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01f1, G_UNICODE_NOT_PRESENT_OFFSET, 926 },
+ { 0x01f2, G_UNICODE_NOT_PRESENT_OFFSET, 929 },
+ { 0x01f3, G_UNICODE_NOT_PRESENT_OFFSET, 932 },
+ { 0x01f4, 935, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01f5, 939, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01f8, 943, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01f9, 947, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01fa, 951, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01fb, 957, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01fc, 963, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01fd, 968, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01fe, 973, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x01ff, 978, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0200, 983, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0201, 987, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0202, 991, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0203, 995, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0204, 999, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0205, 1003, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0206, 1007, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0207, 1011, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0208, 1015, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0209, 1019, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x020a, 1023, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x020b, 1027, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x020c, 1031, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x020d, 1035, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x020e, 1039, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x020f, 1043, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0210, 1047, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0211, 1051, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0212, 1055, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0213, 1059, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0214, 1063, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0215, 1067, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0216, 1071, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0217, 1075, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0218, 1079, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0219, 1083, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x021a, 1087, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x021b, 1091, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x021e, 1095, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x021f, 1099, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0226, 1103, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0227, 1107, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0228, 1111, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0229, 1115, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x022a, 1119, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x022b, 1125, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x022c, 1131, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x022d, 1137, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x022e, 1143, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x022f, 1147, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0230, 1151, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0231, 1157, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0232, 1163, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0233, 1167, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x02b0, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0x02b1, G_UNICODE_NOT_PRESENT_OFFSET, 1173 },
+ { 0x02b2, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x02b3, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x02b4, G_UNICODE_NOT_PRESENT_OFFSET, 1180 },
+ { 0x02b5, G_UNICODE_NOT_PRESENT_OFFSET, 1183 },
+ { 0x02b6, G_UNICODE_NOT_PRESENT_OFFSET, 1186 },
+ { 0x02b7, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0x02b8, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0x02d8, G_UNICODE_NOT_PRESENT_OFFSET, 1193 },
+ { 0x02d9, G_UNICODE_NOT_PRESENT_OFFSET, 1197 },
+ { 0x02da, G_UNICODE_NOT_PRESENT_OFFSET, 1201 },
+ { 0x02db, G_UNICODE_NOT_PRESENT_OFFSET, 1205 },
+ { 0x02dc, G_UNICODE_NOT_PRESENT_OFFSET, 1209 },
+ { 0x02dd, G_UNICODE_NOT_PRESENT_OFFSET, 1213 },
+ { 0x02e0, G_UNICODE_NOT_PRESENT_OFFSET, 1217 },
+ { 0x02e1, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x02e2, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x02e3, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x02e4, G_UNICODE_NOT_PRESENT_OFFSET, 1224 },
+ { 0x0340, 1227, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0341, 1230, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0343, 1233, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0344, 1236, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0374, 1241, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x037a, G_UNICODE_NOT_PRESENT_OFFSET, 1244 },
+ { 0x037e, 1248, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0384, G_UNICODE_NOT_PRESENT_OFFSET, 16 },
+ { 0x0385, 1250, 1255 },
+ { 0x0386, 1261, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0387, 1266, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0388, 1269, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0389, 1274, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x038a, 1279, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x038c, 1284, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x038e, 1289, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x038f, 1294, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0390, 1299, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x03aa, 1306, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x03ab, 1311, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x03ac, 1316, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x03ad, 1321, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x03ae, 1326, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x03af, 1331, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x03b0, 1336, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x03ca, 1343, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x03cb, 1348, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x03cc, 1353, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x03cd, 1358, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x03ce, 1363, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x03d0, G_UNICODE_NOT_PRESENT_OFFSET, 1368 },
+ { 0x03d1, G_UNICODE_NOT_PRESENT_OFFSET, 1371 },
+ { 0x03d2, G_UNICODE_NOT_PRESENT_OFFSET, 1374 },
+ { 0x03d3, 1377, 1289 },
+ { 0x03d4, 1382, 1311 },
+ { 0x03d5, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
+ { 0x03d6, G_UNICODE_NOT_PRESENT_OFFSET, 1390 },
+ { 0x03f0, G_UNICODE_NOT_PRESENT_OFFSET, 1393 },
+ { 0x03f1, G_UNICODE_NOT_PRESENT_OFFSET, 1396 },
+ { 0x03f2, G_UNICODE_NOT_PRESENT_OFFSET, 1399 },
+ { 0x03f4, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
+ { 0x03f5, G_UNICODE_NOT_PRESENT_OFFSET, 1405 },
+ { 0x03f9, G_UNICODE_NOT_PRESENT_OFFSET, 1408 },
+ { 0x0400, 1411, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0401, 1416, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0403, 1421, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0407, 1426, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x040c, 1431, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x040d, 1436, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x040e, 1441, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0419, 1446, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0439, 1451, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0450, 1456, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0451, 1461, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0453, 1466, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0457, 1471, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x045c, 1476, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x045d, 1481, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x045e, 1486, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0476, 1491, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0477, 1496, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04c1, 1501, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04c2, 1506, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04d0, 1511, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04d1, 1516, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04d2, 1521, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04d3, 1526, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04d6, 1531, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04d7, 1536, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04da, 1541, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04db, 1546, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04dc, 1551, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04dd, 1556, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04de, 1561, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04df, 1566, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04e2, 1571, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04e3, 1576, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04e4, 1581, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04e5, 1586, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04e6, 1591, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04e7, 1596, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04ea, 1601, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04eb, 1606, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04ec, 1611, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04ed, 1616, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04ee, 1621, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04ef, 1626, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04f0, 1631, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04f1, 1636, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04f2, 1641, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04f3, 1646, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04f4, 1651, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04f5, 1656, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04f8, 1661, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x04f9, 1666, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0587, G_UNICODE_NOT_PRESENT_OFFSET, 1671 },
+ { 0x0622, 1676, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0623, 1681, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0624, 1686, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0625, 1691, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0626, 1696, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0675, G_UNICODE_NOT_PRESENT_OFFSET, 1701 },
+ { 0x0676, G_UNICODE_NOT_PRESENT_OFFSET, 1706 },
+ { 0x0677, G_UNICODE_NOT_PRESENT_OFFSET, 1711 },
+ { 0x0678, G_UNICODE_NOT_PRESENT_OFFSET, 1716 },
+ { 0x06c0, 1721, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x06c2, 1726, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x06d3, 1731, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0929, 1736, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0931, 1743, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0934, 1750, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0958, 1757, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0959, 1764, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x095a, 1771, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x095b, 1778, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x095c, 1785, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x095d, 1792, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x095e, 1799, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x095f, 1806, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x09cb, 1813, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x09cc, 1820, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x09dc, 1827, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x09dd, 1834, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x09df, 1841, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0a33, 1848, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0a36, 1855, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0a59, 1862, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0a5a, 1869, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0a5b, 1876, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0a5e, 1883, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0b48, 1890, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0b4b, 1897, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0b4c, 1904, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0b5c, 1911, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0b5d, 1918, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0b94, 1925, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0bca, 1932, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0bcb, 1939, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0bcc, 1946, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0c48, 1953, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0cc0, 1960, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0cc7, 1967, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0cc8, 1974, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0cca, 1981, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0ccb, 1988, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0d4a, 1998, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0d4b, 2005, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0d4c, 2012, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0dda, 2019, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0ddc, 2026, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0ddd, 2033, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0dde, 2043, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0e33, G_UNICODE_NOT_PRESENT_OFFSET, 2050 },
+ { 0x0eb3, G_UNICODE_NOT_PRESENT_OFFSET, 2057 },
+ { 0x0edc, G_UNICODE_NOT_PRESENT_OFFSET, 2064 },
+ { 0x0edd, G_UNICODE_NOT_PRESENT_OFFSET, 2071 },
+ { 0x0f0c, G_UNICODE_NOT_PRESENT_OFFSET, 2078 },
+ { 0x0f43, 2082, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0f4d, 2089, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0f52, 2096, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0f57, 2103, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0f5c, 2110, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0f69, 2117, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0f73, 2124, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0f75, 2131, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0f76, 2138, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0f77, G_UNICODE_NOT_PRESENT_OFFSET, 2145 },
+ { 0x0f78, 2155, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0f79, G_UNICODE_NOT_PRESENT_OFFSET, 2162 },
+ { 0x0f81, 2172, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0f93, 2179, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0f9d, 2186, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0fa2, 2193, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0fa7, 2200, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0fac, 2207, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x0fb9, 2214, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1026, 2221, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x10fc, G_UNICODE_NOT_PRESENT_OFFSET, 2228 },
+ { 0x1b06, 2232, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1b08, 2239, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1b0a, 2246, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1b0c, 2253, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1b0e, 2260, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1b12, 2267, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1b3b, 2274, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1b3d, 2281, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1b40, 2288, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1b41, 2295, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1b43, 2302, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d2c, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0x1d2d, G_UNICODE_NOT_PRESENT_OFFSET, 2311 },
+ { 0x1d2e, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0x1d30, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x1d31, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0x1d32, G_UNICODE_NOT_PRESENT_OFFSET, 2320 },
+ { 0x1d33, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0x1d34, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0x1d35, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x1d36, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0x1d37, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0x1d38, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x1d39, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x1d3a, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0x1d3c, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0x1d3d, G_UNICODE_NOT_PRESENT_OFFSET, 2341 },
+ { 0x1d3e, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0x1d3f, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0x1d40, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0x1d41, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0x1d42, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0x1d43, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x1d44, G_UNICODE_NOT_PRESENT_OFFSET, 2354 },
+ { 0x1d45, G_UNICODE_NOT_PRESENT_OFFSET, 2357 },
+ { 0x1d46, G_UNICODE_NOT_PRESENT_OFFSET, 2360 },
+ { 0x1d47, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0x1d48, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x1d49, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x1d4a, G_UNICODE_NOT_PRESENT_OFFSET, 2370 },
+ { 0x1d4b, G_UNICODE_NOT_PRESENT_OFFSET, 2373 },
+ { 0x1d4c, G_UNICODE_NOT_PRESENT_OFFSET, 2376 },
+ { 0x1d4d, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0x1d4f, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0x1d50, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x1d51, G_UNICODE_NOT_PRESENT_OFFSET, 2385 },
+ { 0x1d52, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x1d53, G_UNICODE_NOT_PRESENT_OFFSET, 2388 },
+ { 0x1d54, G_UNICODE_NOT_PRESENT_OFFSET, 2391 },
+ { 0x1d55, G_UNICODE_NOT_PRESENT_OFFSET, 2395 },
+ { 0x1d56, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0x1d57, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0x1d58, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x1d59, G_UNICODE_NOT_PRESENT_OFFSET, 2405 },
+ { 0x1d5a, G_UNICODE_NOT_PRESENT_OFFSET, 2409 },
+ { 0x1d5b, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x1d5c, G_UNICODE_NOT_PRESENT_OFFSET, 2414 },
+ { 0x1d5d, G_UNICODE_NOT_PRESENT_OFFSET, 1368 },
+ { 0x1d5e, G_UNICODE_NOT_PRESENT_OFFSET, 2418 },
+ { 0x1d5f, G_UNICODE_NOT_PRESENT_OFFSET, 2421 },
+ { 0x1d60, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
+ { 0x1d61, G_UNICODE_NOT_PRESENT_OFFSET, 2424 },
+ { 0x1d62, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x1d63, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x1d64, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x1d65, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x1d66, G_UNICODE_NOT_PRESENT_OFFSET, 1368 },
+ { 0x1d67, G_UNICODE_NOT_PRESENT_OFFSET, 2418 },
+ { 0x1d68, G_UNICODE_NOT_PRESENT_OFFSET, 1396 },
+ { 0x1d69, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
+ { 0x1d6a, G_UNICODE_NOT_PRESENT_OFFSET, 2424 },
+ { 0x1d78, G_UNICODE_NOT_PRESENT_OFFSET, 2429 },
+ { 0x1d9b, G_UNICODE_NOT_PRESENT_OFFSET, 2432 },
+ { 0x1d9c, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x1d9d, G_UNICODE_NOT_PRESENT_OFFSET, 2437 },
+ { 0x1d9e, G_UNICODE_NOT_PRESENT_OFFSET, 2440 },
+ { 0x1d9f, G_UNICODE_NOT_PRESENT_OFFSET, 2376 },
+ { 0x1da0, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0x1da1, G_UNICODE_NOT_PRESENT_OFFSET, 2445 },
+ { 0x1da2, G_UNICODE_NOT_PRESENT_OFFSET, 2448 },
+ { 0x1da3, G_UNICODE_NOT_PRESENT_OFFSET, 2451 },
+ { 0x1da4, G_UNICODE_NOT_PRESENT_OFFSET, 2454 },
+ { 0x1da5, G_UNICODE_NOT_PRESENT_OFFSET, 2457 },
+ { 0x1da6, G_UNICODE_NOT_PRESENT_OFFSET, 2460 },
+ { 0x1da7, G_UNICODE_NOT_PRESENT_OFFSET, 2463 },
+ { 0x1da8, G_UNICODE_NOT_PRESENT_OFFSET, 2467 },
+ { 0x1da9, G_UNICODE_NOT_PRESENT_OFFSET, 2470 },
+ { 0x1daa, G_UNICODE_NOT_PRESENT_OFFSET, 2473 },
+ { 0x1dab, G_UNICODE_NOT_PRESENT_OFFSET, 2477 },
+ { 0x1dac, G_UNICODE_NOT_PRESENT_OFFSET, 2480 },
+ { 0x1dad, G_UNICODE_NOT_PRESENT_OFFSET, 2483 },
+ { 0x1dae, G_UNICODE_NOT_PRESENT_OFFSET, 2486 },
+ { 0x1daf, G_UNICODE_NOT_PRESENT_OFFSET, 2489 },
+ { 0x1db0, G_UNICODE_NOT_PRESENT_OFFSET, 2492 },
+ { 0x1db1, G_UNICODE_NOT_PRESENT_OFFSET, 2495 },
+ { 0x1db2, G_UNICODE_NOT_PRESENT_OFFSET, 2498 },
+ { 0x1db3, G_UNICODE_NOT_PRESENT_OFFSET, 2501 },
+ { 0x1db4, G_UNICODE_NOT_PRESENT_OFFSET, 2504 },
+ { 0x1db5, G_UNICODE_NOT_PRESENT_OFFSET, 2507 },
+ { 0x1db6, G_UNICODE_NOT_PRESENT_OFFSET, 2510 },
+ { 0x1db7, G_UNICODE_NOT_PRESENT_OFFSET, 2513 },
+ { 0x1db8, G_UNICODE_NOT_PRESENT_OFFSET, 2516 },
+ { 0x1db9, G_UNICODE_NOT_PRESENT_OFFSET, 2520 },
+ { 0x1dba, G_UNICODE_NOT_PRESENT_OFFSET, 2523 },
+ { 0x1dbb, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0x1dbc, G_UNICODE_NOT_PRESENT_OFFSET, 2528 },
+ { 0x1dbd, G_UNICODE_NOT_PRESENT_OFFSET, 2531 },
+ { 0x1dbe, G_UNICODE_NOT_PRESENT_OFFSET, 2534 },
+ { 0x1dbf, G_UNICODE_NOT_PRESENT_OFFSET, 1371 },
+ { 0x1e00, 2537, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e01, 2541, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e02, 2545, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e03, 2549, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e04, 2553, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e05, 2557, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e06, 2561, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e07, 2565, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e08, 2569, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e09, 2575, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e0a, 2581, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e0b, 2585, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e0c, 2589, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e0d, 2593, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e0e, 2597, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e0f, 2601, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e10, 2605, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e11, 2609, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e12, 2613, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e13, 2617, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e14, 2621, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e15, 2627, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e16, 2633, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e17, 2639, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e18, 2645, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e19, 2649, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e1a, 2653, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e1b, 2657, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e1c, 2661, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e1d, 2667, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e1e, 2673, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e1f, 2677, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e20, 2681, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e21, 2685, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e22, 2689, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e23, 2693, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e24, 2697, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e25, 2701, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e26, 2705, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e27, 2709, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e28, 2713, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e29, 2717, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e2a, 2721, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e2b, 2725, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e2c, 2729, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e2d, 2733, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e2e, 2737, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e2f, 2743, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e30, 2749, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e31, 2753, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e32, 2757, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e33, 2761, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e34, 2765, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e35, 2769, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e36, 2773, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e37, 2777, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e38, 2781, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e39, 2787, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e3a, 2793, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e3b, 2797, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e3c, 2801, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e3d, 2805, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e3e, 2809, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e3f, 2813, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e40, 2817, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e41, 2821, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e42, 2825, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e43, 2829, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e44, 2833, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e45, 2837, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e46, 2841, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e47, 2845, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e48, 2849, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e49, 2853, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e4a, 2857, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e4b, 2861, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e4c, 2865, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e4d, 2871, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e4e, 2877, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e4f, 2883, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e50, 2889, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e51, 2895, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e52, 2901, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e53, 2907, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e54, 2913, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e55, 2917, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e56, 2921, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e57, 2925, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e58, 2929, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e59, 2933, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e5a, 2937, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e5b, 2941, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e5c, 2945, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e5d, 2951, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e5e, 2957, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e5f, 2961, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e60, 2965, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e61, 2969, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e62, 2973, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e63, 2977, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e64, 2981, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e65, 2987, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e66, 2993, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e67, 2999, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e68, 3005, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e69, 3011, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e6a, 3017, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e6b, 3021, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e6c, 3025, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e6d, 3029, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e6e, 3033, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e6f, 3037, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e70, 3041, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e71, 3045, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e72, 3049, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e73, 3053, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e74, 3057, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e75, 3061, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e76, 3065, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e77, 3069, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e78, 3073, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e79, 3079, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e7a, 3085, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e7b, 3091, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e7c, 3097, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e7d, 3101, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e7e, 3105, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e7f, 3109, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e80, 3113, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e81, 3117, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e82, 3121, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e83, 3125, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e84, 3129, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e85, 3133, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e86, 3137, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e87, 3141, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e88, 3145, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e89, 3149, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e8a, 3153, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e8b, 3157, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e8c, 3161, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e8d, 3165, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e8e, 3169, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e8f, 3173, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e90, 3177, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e91, 3181, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e92, 3185, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e93, 3189, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e94, 3193, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e95, 3197, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e96, 3201, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e97, 3205, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e98, 3209, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e99, 3213, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1e9a, G_UNICODE_NOT_PRESENT_OFFSET, 3217 },
+ { 0x1e9b, 3221, 2969 },
+ { 0x1ea0, 3226, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ea1, 3230, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ea2, 3234, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ea3, 3238, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ea4, 3242, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ea5, 3248, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ea6, 3254, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ea7, 3260, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ea8, 3266, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ea9, 3272, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eaa, 3278, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eab, 3284, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eac, 3290, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ead, 3296, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eae, 3302, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eaf, 3308, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eb0, 3314, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eb1, 3320, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eb2, 3326, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eb3, 3332, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eb4, 3338, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eb5, 3344, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eb6, 3350, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eb7, 3356, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eb8, 3362, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eb9, 3366, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eba, 3370, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ebb, 3374, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ebc, 3378, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ebd, 3382, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ebe, 3386, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ebf, 3392, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ec0, 3398, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ec1, 3404, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ec2, 3410, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ec3, 3416, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ec4, 3422, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ec5, 3428, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ec6, 3434, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ec7, 3440, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ec8, 3446, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ec9, 3450, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eca, 3454, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ecb, 3458, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ecc, 3462, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ecd, 3466, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ece, 3470, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ecf, 3474, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ed0, 3478, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ed1, 3484, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ed2, 3490, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ed3, 3496, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ed4, 3502, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ed5, 3508, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ed6, 3514, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ed7, 3520, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ed8, 3526, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ed9, 3532, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eda, 3538, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1edb, 3544, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1edc, 3550, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1edd, 3556, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ede, 3562, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1edf, 3568, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ee0, 3574, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ee1, 3580, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ee2, 3586, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ee3, 3592, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ee4, 3598, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ee5, 3602, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ee6, 3606, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ee7, 3610, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ee8, 3614, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ee9, 3620, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eea, 3626, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eeb, 3632, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eec, 3638, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eed, 3644, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eee, 3650, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1eef, 3656, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ef0, 3662, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ef1, 3668, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ef2, 3674, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ef3, 3678, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ef4, 3682, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ef5, 3686, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ef6, 3690, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ef7, 3694, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ef8, 3698, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ef9, 3702, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f00, 3706, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f01, 3711, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f02, 3716, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f03, 3723, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f04, 3730, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f05, 3737, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f06, 3744, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f07, 3751, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f08, 3758, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f09, 3763, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f0a, 3768, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f0b, 3775, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f0c, 3782, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f0d, 3789, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f0e, 3796, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f0f, 3803, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f10, 3810, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f11, 3815, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f12, 3820, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f13, 3827, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f14, 3834, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f15, 3841, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f18, 3848, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f19, 3853, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f1a, 3858, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f1b, 3865, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f1c, 3872, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f1d, 3879, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f20, 3886, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f21, 3891, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f22, 3896, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f23, 3903, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f24, 3910, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f25, 3917, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f26, 3924, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f27, 3931, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f28, 3938, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f29, 3943, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f2a, 3948, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f2b, 3955, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f2c, 3962, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f2d, 3969, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f2e, 3976, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f2f, 3983, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f30, 3990, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f31, 3995, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f32, 4000, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f33, 4007, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f34, 4014, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f35, 4021, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f36, 4028, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f37, 4035, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f38, 4042, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f39, 4047, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f3a, 4052, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f3b, 4059, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f3c, 4066, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f3d, 4073, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f3e, 4080, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f3f, 4087, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f40, 4094, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f41, 4099, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f42, 4104, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f43, 4111, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f44, 4118, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f45, 4125, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f48, 4132, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f49, 4137, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f4a, 4142, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f4b, 4149, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f4c, 4156, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f4d, 4163, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f50, 4170, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f51, 4175, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f52, 4180, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f53, 4187, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f54, 4194, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f55, 4201, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f56, 4208, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f57, 4215, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f59, 4222, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f5b, 4227, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f5d, 4234, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f5f, 4241, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f60, 4248, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f61, 4253, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f62, 4258, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f63, 4265, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f64, 4272, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f65, 4279, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f66, 4286, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f67, 4293, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f68, 4300, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f69, 4305, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f6a, 4310, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f6b, 4317, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f6c, 4324, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f6d, 4331, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f6e, 4338, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f6f, 4345, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f70, 4352, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f71, 1316, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f72, 4357, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f73, 1321, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f74, 4362, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f75, 1326, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f76, 4367, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f77, 1331, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f78, 4372, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f79, 1353, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f7a, 4377, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f7b, 1358, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f7c, 4382, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f7d, 1363, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f80, 4387, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f81, 4394, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f82, 4401, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f83, 4410, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f84, 4419, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f85, 4428, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f86, 4437, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f87, 4446, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f88, 4455, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f89, 4462, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f8a, 4469, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f8b, 4478, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f8c, 4487, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f8d, 4496, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f8e, 4505, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f8f, 4514, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f90, 4523, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f91, 4530, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f92, 4537, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f93, 4546, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f94, 4555, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f95, 4564, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f96, 4573, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f97, 4582, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f98, 4591, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f99, 4598, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f9a, 4605, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f9b, 4614, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f9c, 4623, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f9d, 4632, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f9e, 4641, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1f9f, 4650, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fa0, 4659, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fa1, 4666, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fa2, 4673, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fa3, 4682, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fa4, 4691, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fa5, 4700, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fa6, 4709, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fa7, 4718, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fa8, 4727, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fa9, 4734, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1faa, 4741, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fab, 4750, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fac, 4759, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fad, 4768, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fae, 4777, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1faf, 4786, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fb0, 4795, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fb1, 4800, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fb2, 4805, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fb3, 4812, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fb4, 4817, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fb6, 4824, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fb7, 4829, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fb8, 4836, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fb9, 4841, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fba, 4846, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fbb, 1261, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fbc, 4851, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fbd, G_UNICODE_NOT_PRESENT_OFFSET, 4856 },
+ { 0x1fbe, 4860, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fbf, G_UNICODE_NOT_PRESENT_OFFSET, 4856 },
+ { 0x1fc0, G_UNICODE_NOT_PRESENT_OFFSET, 4863 },
+ { 0x1fc1, 4867, 4872 },
+ { 0x1fc2, 4878, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fc3, 4885, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fc4, 4890, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fc6, 4897, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fc7, 4902, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fc8, 4909, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fc9, 1269, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fca, 4914, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fcb, 1274, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fcc, 4919, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fcd, 4924, 4930 },
+ { 0x1fce, 4936, 4942 },
+ { 0x1fcf, 4948, 4954 },
+ { 0x1fd0, 4960, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fd1, 4965, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fd2, 4970, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fd3, 1299, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fd6, 4977, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fd7, 4982, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fd8, 4989, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fd9, 4994, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fda, 4999, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fdb, 1279, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fdd, 5004, 5010 },
+ { 0x1fde, 5016, 5022 },
+ { 0x1fdf, 5028, 5034 },
+ { 0x1fe0, 5040, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fe1, 5045, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fe2, 5050, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fe3, 1336, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fe4, 5057, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fe5, 5062, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fe6, 5067, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fe7, 5072, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fe8, 5079, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fe9, 5084, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fea, 5089, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1feb, 1289, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fec, 5094, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1fed, 5099, 5104 },
+ { 0x1fee, 1250, 1255 },
+ { 0x1fef, 5110, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ff2, 5112, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ff3, 5119, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ff4, 5124, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ff6, 5131, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ff7, 5136, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ff8, 5143, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ff9, 1284, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ffa, 5148, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ffb, 1294, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ffc, 5153, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1ffd, 5158, 16 },
+ { 0x1ffe, G_UNICODE_NOT_PRESENT_OFFSET, 5161 },
+ { 0x2000, 5165, 0 },
+ { 0x2001, 5169, 0 },
+ { 0x2002, G_UNICODE_NOT_PRESENT_OFFSET, 0 },
+ { 0x2003, G_UNICODE_NOT_PRESENT_OFFSET, 0 },
+ { 0x2004, G_UNICODE_NOT_PRESENT_OFFSET, 0 },
+ { 0x2005, G_UNICODE_NOT_PRESENT_OFFSET, 0 },
+ { 0x2006, G_UNICODE_NOT_PRESENT_OFFSET, 0 },
+ { 0x2007, G_UNICODE_NOT_PRESENT_OFFSET, 0 },
+ { 0x2008, G_UNICODE_NOT_PRESENT_OFFSET, 0 },
+ { 0x2009, G_UNICODE_NOT_PRESENT_OFFSET, 0 },
+ { 0x200a, G_UNICODE_NOT_PRESENT_OFFSET, 0 },
+ { 0x2011, G_UNICODE_NOT_PRESENT_OFFSET, 5173 },
+ { 0x2017, G_UNICODE_NOT_PRESENT_OFFSET, 5177 },
+ { 0x2024, G_UNICODE_NOT_PRESENT_OFFSET, 5181 },
+ { 0x2025, G_UNICODE_NOT_PRESENT_OFFSET, 5183 },
+ { 0x2026, G_UNICODE_NOT_PRESENT_OFFSET, 5186 },
+ { 0x202f, G_UNICODE_NOT_PRESENT_OFFSET, 0 },
+ { 0x2033, G_UNICODE_NOT_PRESENT_OFFSET, 5190 },
+ { 0x2034, G_UNICODE_NOT_PRESENT_OFFSET, 5197 },
+ { 0x2036, G_UNICODE_NOT_PRESENT_OFFSET, 5207 },
+ { 0x2037, G_UNICODE_NOT_PRESENT_OFFSET, 5214 },
+ { 0x203c, G_UNICODE_NOT_PRESENT_OFFSET, 5224 },
+ { 0x203e, G_UNICODE_NOT_PRESENT_OFFSET, 5227 },
+ { 0x2047, G_UNICODE_NOT_PRESENT_OFFSET, 5231 },
+ { 0x2048, G_UNICODE_NOT_PRESENT_OFFSET, 5234 },
+ { 0x2049, G_UNICODE_NOT_PRESENT_OFFSET, 5237 },
+ { 0x2057, G_UNICODE_NOT_PRESENT_OFFSET, 5240 },
+ { 0x205f, G_UNICODE_NOT_PRESENT_OFFSET, 0 },
+ { 0x2070, G_UNICODE_NOT_PRESENT_OFFSET, 5253 },
+ { 0x2071, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x2074, G_UNICODE_NOT_PRESENT_OFFSET, 5255 },
+ { 0x2075, G_UNICODE_NOT_PRESENT_OFFSET, 5257 },
+ { 0x2076, G_UNICODE_NOT_PRESENT_OFFSET, 5259 },
+ { 0x2077, G_UNICODE_NOT_PRESENT_OFFSET, 5261 },
+ { 0x2078, G_UNICODE_NOT_PRESENT_OFFSET, 5263 },
+ { 0x2079, G_UNICODE_NOT_PRESENT_OFFSET, 5265 },
+ { 0x207a, G_UNICODE_NOT_PRESENT_OFFSET, 5267 },
+ { 0x207b, G_UNICODE_NOT_PRESENT_OFFSET, 5269 },
+ { 0x207c, G_UNICODE_NOT_PRESENT_OFFSET, 5273 },
+ { 0x207d, G_UNICODE_NOT_PRESENT_OFFSET, 5275 },
+ { 0x207e, G_UNICODE_NOT_PRESENT_OFFSET, 5277 },
+ { 0x207f, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0x2080, G_UNICODE_NOT_PRESENT_OFFSET, 5253 },
+ { 0x2081, G_UNICODE_NOT_PRESENT_OFFSET, 27 },
+ { 0x2082, G_UNICODE_NOT_PRESENT_OFFSET, 12 },
+ { 0x2083, G_UNICODE_NOT_PRESENT_OFFSET, 14 },
+ { 0x2084, G_UNICODE_NOT_PRESENT_OFFSET, 5255 },
+ { 0x2085, G_UNICODE_NOT_PRESENT_OFFSET, 5257 },
+ { 0x2086, G_UNICODE_NOT_PRESENT_OFFSET, 5259 },
+ { 0x2087, G_UNICODE_NOT_PRESENT_OFFSET, 5261 },
+ { 0x2088, G_UNICODE_NOT_PRESENT_OFFSET, 5263 },
+ { 0x2089, G_UNICODE_NOT_PRESENT_OFFSET, 5265 },
+ { 0x208a, G_UNICODE_NOT_PRESENT_OFFSET, 5267 },
+ { 0x208b, G_UNICODE_NOT_PRESENT_OFFSET, 5269 },
+ { 0x208c, G_UNICODE_NOT_PRESENT_OFFSET, 5273 },
+ { 0x208d, G_UNICODE_NOT_PRESENT_OFFSET, 5275 },
+ { 0x208e, G_UNICODE_NOT_PRESENT_OFFSET, 5277 },
+ { 0x2090, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x2091, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x2092, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x2093, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x2094, G_UNICODE_NOT_PRESENT_OFFSET, 2370 },
+ { 0x20a8, G_UNICODE_NOT_PRESENT_OFFSET, 5281 },
+ { 0x2100, G_UNICODE_NOT_PRESENT_OFFSET, 5284 },
+ { 0x2101, G_UNICODE_NOT_PRESENT_OFFSET, 5288 },
+ { 0x2102, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0x2103, G_UNICODE_NOT_PRESENT_OFFSET, 5294 },
+ { 0x2105, G_UNICODE_NOT_PRESENT_OFFSET, 5298 },
+ { 0x2106, G_UNICODE_NOT_PRESENT_OFFSET, 5302 },
+ { 0x2107, G_UNICODE_NOT_PRESENT_OFFSET, 5306 },
+ { 0x2109, G_UNICODE_NOT_PRESENT_OFFSET, 5309 },
+ { 0x210a, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0x210b, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0x210c, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0x210d, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0x210e, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0x210f, G_UNICODE_NOT_PRESENT_OFFSET, 5313 },
+ { 0x2110, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x2111, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x2112, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x2113, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x2115, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0x2116, G_UNICODE_NOT_PRESENT_OFFSET, 5316 },
+ { 0x2119, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0x211a, G_UNICODE_NOT_PRESENT_OFFSET, 5319 },
+ { 0x211b, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0x211c, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0x211d, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0x2120, G_UNICODE_NOT_PRESENT_OFFSET, 5321 },
+ { 0x2121, G_UNICODE_NOT_PRESENT_OFFSET, 5324 },
+ { 0x2122, G_UNICODE_NOT_PRESENT_OFFSET, 5328 },
+ { 0x2124, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
+ { 0x2126, 5333, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2128, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
+ { 0x212a, 2331, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x212b, 69, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x212c, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0x212d, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0x212f, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x2130, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0x2131, G_UNICODE_NOT_PRESENT_OFFSET, 5336 },
+ { 0x2133, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x2134, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x2135, G_UNICODE_NOT_PRESENT_OFFSET, 5338 },
+ { 0x2136, G_UNICODE_NOT_PRESENT_OFFSET, 5341 },
+ { 0x2137, G_UNICODE_NOT_PRESENT_OFFSET, 5344 },
+ { 0x2138, G_UNICODE_NOT_PRESENT_OFFSET, 5347 },
+ { 0x2139, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x213b, G_UNICODE_NOT_PRESENT_OFFSET, 5350 },
+ { 0x213c, G_UNICODE_NOT_PRESENT_OFFSET, 1390 },
+ { 0x213d, G_UNICODE_NOT_PRESENT_OFFSET, 2418 },
+ { 0x213e, G_UNICODE_NOT_PRESENT_OFFSET, 5354 },
+ { 0x213f, G_UNICODE_NOT_PRESENT_OFFSET, 5357 },
+ { 0x2140, G_UNICODE_NOT_PRESENT_OFFSET, 5360 },
+ { 0x2145, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x2146, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x2147, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x2148, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x2149, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x2153, G_UNICODE_NOT_PRESENT_OFFSET, 5364 },
+ { 0x2154, G_UNICODE_NOT_PRESENT_OFFSET, 5370 },
+ { 0x2155, G_UNICODE_NOT_PRESENT_OFFSET, 5376 },
+ { 0x2156, G_UNICODE_NOT_PRESENT_OFFSET, 5382 },
+ { 0x2157, G_UNICODE_NOT_PRESENT_OFFSET, 5388 },
+ { 0x2158, G_UNICODE_NOT_PRESENT_OFFSET, 5394 },
+ { 0x2159, G_UNICODE_NOT_PRESENT_OFFSET, 5400 },
+ { 0x215a, G_UNICODE_NOT_PRESENT_OFFSET, 5406 },
+ { 0x215b, G_UNICODE_NOT_PRESENT_OFFSET, 5412 },
+ { 0x215c, G_UNICODE_NOT_PRESENT_OFFSET, 5418 },
+ { 0x215d, G_UNICODE_NOT_PRESENT_OFFSET, 5424 },
+ { 0x215e, G_UNICODE_NOT_PRESENT_OFFSET, 5430 },
+ { 0x215f, G_UNICODE_NOT_PRESENT_OFFSET, 5436 },
+ { 0x2160, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x2161, G_UNICODE_NOT_PRESENT_OFFSET, 5441 },
+ { 0x2162, G_UNICODE_NOT_PRESENT_OFFSET, 5444 },
+ { 0x2163, G_UNICODE_NOT_PRESENT_OFFSET, 5448 },
+ { 0x2164, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0x2165, G_UNICODE_NOT_PRESENT_OFFSET, 5453 },
+ { 0x2166, G_UNICODE_NOT_PRESENT_OFFSET, 5456 },
+ { 0x2167, G_UNICODE_NOT_PRESENT_OFFSET, 5460 },
+ { 0x2168, G_UNICODE_NOT_PRESENT_OFFSET, 5465 },
+ { 0x2169, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0x216a, G_UNICODE_NOT_PRESENT_OFFSET, 5470 },
+ { 0x216b, G_UNICODE_NOT_PRESENT_OFFSET, 5473 },
+ { 0x216c, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x216d, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0x216e, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x216f, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x2170, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x2171, G_UNICODE_NOT_PRESENT_OFFSET, 5477 },
+ { 0x2172, G_UNICODE_NOT_PRESENT_OFFSET, 5480 },
+ { 0x2173, G_UNICODE_NOT_PRESENT_OFFSET, 5484 },
+ { 0x2174, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x2175, G_UNICODE_NOT_PRESENT_OFFSET, 5487 },
+ { 0x2176, G_UNICODE_NOT_PRESENT_OFFSET, 5490 },
+ { 0x2177, G_UNICODE_NOT_PRESENT_OFFSET, 5494 },
+ { 0x2178, G_UNICODE_NOT_PRESENT_OFFSET, 5499 },
+ { 0x2179, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x217a, G_UNICODE_NOT_PRESENT_OFFSET, 5502 },
+ { 0x217b, G_UNICODE_NOT_PRESENT_OFFSET, 5505 },
+ { 0x217c, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x217d, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x217e, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x217f, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x219a, 5509, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x219b, 5515, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x21ae, 5521, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x21cd, 5527, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x21ce, 5533, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x21cf, 5539, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2204, 5545, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2209, 5551, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x220c, 5557, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2224, 5563, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2226, 5569, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x222c, G_UNICODE_NOT_PRESENT_OFFSET, 5575 },
+ { 0x222d, G_UNICODE_NOT_PRESENT_OFFSET, 5582 },
+ { 0x222f, G_UNICODE_NOT_PRESENT_OFFSET, 5592 },
+ { 0x2230, G_UNICODE_NOT_PRESENT_OFFSET, 5599 },
+ { 0x2241, 5609, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2244, 5615, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2247, 5621, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2249, 5627, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2260, 5633, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2262, 5637, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x226d, 5643, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x226e, 5649, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x226f, 5653, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2270, 5657, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2271, 5663, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2274, 5669, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2275, 5675, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2278, 5681, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2279, 5687, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2280, 5693, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2281, 5699, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2284, 5705, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2285, 5711, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2288, 5717, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2289, 5723, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x22ac, 5729, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x22ad, 5735, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x22ae, 5741, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x22af, 5747, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x22e0, 5753, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x22e1, 5759, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x22e2, 5765, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x22e3, 5771, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x22ea, 5777, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x22eb, 5783, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x22ec, 5789, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x22ed, 5795, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2329, 5801, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x232a, 5805, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2460, G_UNICODE_NOT_PRESENT_OFFSET, 27 },
+ { 0x2461, G_UNICODE_NOT_PRESENT_OFFSET, 12 },
+ { 0x2462, G_UNICODE_NOT_PRESENT_OFFSET, 14 },
+ { 0x2463, G_UNICODE_NOT_PRESENT_OFFSET, 5255 },
+ { 0x2464, G_UNICODE_NOT_PRESENT_OFFSET, 5257 },
+ { 0x2465, G_UNICODE_NOT_PRESENT_OFFSET, 5259 },
+ { 0x2466, G_UNICODE_NOT_PRESENT_OFFSET, 5261 },
+ { 0x2467, G_UNICODE_NOT_PRESENT_OFFSET, 5263 },
+ { 0x2468, G_UNICODE_NOT_PRESENT_OFFSET, 5265 },
+ { 0x2469, G_UNICODE_NOT_PRESENT_OFFSET, 5809 },
+ { 0x246a, G_UNICODE_NOT_PRESENT_OFFSET, 5812 },
+ { 0x246b, G_UNICODE_NOT_PRESENT_OFFSET, 5815 },
+ { 0x246c, G_UNICODE_NOT_PRESENT_OFFSET, 5818 },
+ { 0x246d, G_UNICODE_NOT_PRESENT_OFFSET, 5821 },
+ { 0x246e, G_UNICODE_NOT_PRESENT_OFFSET, 5824 },
+ { 0x246f, G_UNICODE_NOT_PRESENT_OFFSET, 5827 },
+ { 0x2470, G_UNICODE_NOT_PRESENT_OFFSET, 5830 },
+ { 0x2471, G_UNICODE_NOT_PRESENT_OFFSET, 5833 },
+ { 0x2472, G_UNICODE_NOT_PRESENT_OFFSET, 5836 },
+ { 0x2473, G_UNICODE_NOT_PRESENT_OFFSET, 5839 },
+ { 0x2474, G_UNICODE_NOT_PRESENT_OFFSET, 5842 },
+ { 0x2475, G_UNICODE_NOT_PRESENT_OFFSET, 5846 },
+ { 0x2476, G_UNICODE_NOT_PRESENT_OFFSET, 5850 },
+ { 0x2477, G_UNICODE_NOT_PRESENT_OFFSET, 5854 },
+ { 0x2478, G_UNICODE_NOT_PRESENT_OFFSET, 5858 },
+ { 0x2479, G_UNICODE_NOT_PRESENT_OFFSET, 5862 },
+ { 0x247a, G_UNICODE_NOT_PRESENT_OFFSET, 5866 },
+ { 0x247b, G_UNICODE_NOT_PRESENT_OFFSET, 5870 },
+ { 0x247c, G_UNICODE_NOT_PRESENT_OFFSET, 5874 },
+ { 0x247d, G_UNICODE_NOT_PRESENT_OFFSET, 5878 },
+ { 0x247e, G_UNICODE_NOT_PRESENT_OFFSET, 5883 },
+ { 0x247f, G_UNICODE_NOT_PRESENT_OFFSET, 5888 },
+ { 0x2480, G_UNICODE_NOT_PRESENT_OFFSET, 5893 },
+ { 0x2481, G_UNICODE_NOT_PRESENT_OFFSET, 5898 },
+ { 0x2482, G_UNICODE_NOT_PRESENT_OFFSET, 5903 },
+ { 0x2483, G_UNICODE_NOT_PRESENT_OFFSET, 5908 },
+ { 0x2484, G_UNICODE_NOT_PRESENT_OFFSET, 5913 },
+ { 0x2485, G_UNICODE_NOT_PRESENT_OFFSET, 5918 },
+ { 0x2486, G_UNICODE_NOT_PRESENT_OFFSET, 5923 },
+ { 0x2487, G_UNICODE_NOT_PRESENT_OFFSET, 5928 },
+ { 0x2488, G_UNICODE_NOT_PRESENT_OFFSET, 5933 },
+ { 0x2489, G_UNICODE_NOT_PRESENT_OFFSET, 5936 },
+ { 0x248a, G_UNICODE_NOT_PRESENT_OFFSET, 5939 },
+ { 0x248b, G_UNICODE_NOT_PRESENT_OFFSET, 5942 },
+ { 0x248c, G_UNICODE_NOT_PRESENT_OFFSET, 5945 },
+ { 0x248d, G_UNICODE_NOT_PRESENT_OFFSET, 5948 },
+ { 0x248e, G_UNICODE_NOT_PRESENT_OFFSET, 5951 },
+ { 0x248f, G_UNICODE_NOT_PRESENT_OFFSET, 5954 },
+ { 0x2490, G_UNICODE_NOT_PRESENT_OFFSET, 5957 },
+ { 0x2491, G_UNICODE_NOT_PRESENT_OFFSET, 5960 },
+ { 0x2492, G_UNICODE_NOT_PRESENT_OFFSET, 5964 },
+ { 0x2493, G_UNICODE_NOT_PRESENT_OFFSET, 5968 },
+ { 0x2494, G_UNICODE_NOT_PRESENT_OFFSET, 5972 },
+ { 0x2495, G_UNICODE_NOT_PRESENT_OFFSET, 5976 },
+ { 0x2496, G_UNICODE_NOT_PRESENT_OFFSET, 5980 },
+ { 0x2497, G_UNICODE_NOT_PRESENT_OFFSET, 5984 },
+ { 0x2498, G_UNICODE_NOT_PRESENT_OFFSET, 5988 },
+ { 0x2499, G_UNICODE_NOT_PRESENT_OFFSET, 5992 },
+ { 0x249a, G_UNICODE_NOT_PRESENT_OFFSET, 5996 },
+ { 0x249b, G_UNICODE_NOT_PRESENT_OFFSET, 6000 },
+ { 0x249c, G_UNICODE_NOT_PRESENT_OFFSET, 6004 },
+ { 0x249d, G_UNICODE_NOT_PRESENT_OFFSET, 6008 },
+ { 0x249e, G_UNICODE_NOT_PRESENT_OFFSET, 6012 },
+ { 0x249f, G_UNICODE_NOT_PRESENT_OFFSET, 6016 },
+ { 0x24a0, G_UNICODE_NOT_PRESENT_OFFSET, 6020 },
+ { 0x24a1, G_UNICODE_NOT_PRESENT_OFFSET, 6024 },
+ { 0x24a2, G_UNICODE_NOT_PRESENT_OFFSET, 6028 },
+ { 0x24a3, G_UNICODE_NOT_PRESENT_OFFSET, 6032 },
+ { 0x24a4, G_UNICODE_NOT_PRESENT_OFFSET, 6036 },
+ { 0x24a5, G_UNICODE_NOT_PRESENT_OFFSET, 6040 },
+ { 0x24a6, G_UNICODE_NOT_PRESENT_OFFSET, 6044 },
+ { 0x24a7, G_UNICODE_NOT_PRESENT_OFFSET, 6048 },
+ { 0x24a8, G_UNICODE_NOT_PRESENT_OFFSET, 6052 },
+ { 0x24a9, G_UNICODE_NOT_PRESENT_OFFSET, 6056 },
+ { 0x24aa, G_UNICODE_NOT_PRESENT_OFFSET, 6060 },
+ { 0x24ab, G_UNICODE_NOT_PRESENT_OFFSET, 6064 },
+ { 0x24ac, G_UNICODE_NOT_PRESENT_OFFSET, 6068 },
+ { 0x24ad, G_UNICODE_NOT_PRESENT_OFFSET, 6072 },
+ { 0x24ae, G_UNICODE_NOT_PRESENT_OFFSET, 6076 },
+ { 0x24af, G_UNICODE_NOT_PRESENT_OFFSET, 6080 },
+ { 0x24b0, G_UNICODE_NOT_PRESENT_OFFSET, 6084 },
+ { 0x24b1, G_UNICODE_NOT_PRESENT_OFFSET, 6088 },
+ { 0x24b2, G_UNICODE_NOT_PRESENT_OFFSET, 6092 },
+ { 0x24b3, G_UNICODE_NOT_PRESENT_OFFSET, 6096 },
+ { 0x24b4, G_UNICODE_NOT_PRESENT_OFFSET, 6100 },
+ { 0x24b5, G_UNICODE_NOT_PRESENT_OFFSET, 6104 },
+ { 0x24b6, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0x24b7, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0x24b8, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0x24b9, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x24ba, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0x24bb, G_UNICODE_NOT_PRESENT_OFFSET, 5336 },
+ { 0x24bc, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0x24bd, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0x24be, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x24bf, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0x24c0, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0x24c1, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x24c2, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x24c3, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0x24c4, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0x24c5, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0x24c6, G_UNICODE_NOT_PRESENT_OFFSET, 5319 },
+ { 0x24c7, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0x24c8, G_UNICODE_NOT_PRESENT_OFFSET, 6108 },
+ { 0x24c9, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0x24ca, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0x24cb, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0x24cc, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0x24cd, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0x24ce, G_UNICODE_NOT_PRESENT_OFFSET, 6110 },
+ { 0x24cf, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
+ { 0x24d0, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x24d1, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0x24d2, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x24d3, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x24d4, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x24d5, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0x24d6, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0x24d7, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0x24d8, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x24d9, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x24da, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0x24db, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x24dc, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x24dd, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0x24de, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x24df, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0x24e0, G_UNICODE_NOT_PRESENT_OFFSET, 6112 },
+ { 0x24e1, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x24e2, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x24e3, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0x24e4, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x24e5, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x24e6, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0x24e7, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x24e8, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0x24e9, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0x24ea, G_UNICODE_NOT_PRESENT_OFFSET, 5253 },
+ { 0x2a0c, G_UNICODE_NOT_PRESENT_OFFSET, 6114 },
+ { 0x2a74, G_UNICODE_NOT_PRESENT_OFFSET, 6127 },
+ { 0x2a75, G_UNICODE_NOT_PRESENT_OFFSET, 6131 },
+ { 0x2a76, G_UNICODE_NOT_PRESENT_OFFSET, 6134 },
+ { 0x2adc, 6138, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2d6f, G_UNICODE_NOT_PRESENT_OFFSET, 6144 },
+ { 0x2e9f, G_UNICODE_NOT_PRESENT_OFFSET, 6148 },
+ { 0x2ef3, G_UNICODE_NOT_PRESENT_OFFSET, 6152 },
+ { 0x2f00, G_UNICODE_NOT_PRESENT_OFFSET, 6156 },
+ { 0x2f01, G_UNICODE_NOT_PRESENT_OFFSET, 6160 },
+ { 0x2f02, G_UNICODE_NOT_PRESENT_OFFSET, 6164 },
+ { 0x2f03, G_UNICODE_NOT_PRESENT_OFFSET, 6168 },
+ { 0x2f04, G_UNICODE_NOT_PRESENT_OFFSET, 6172 },
+ { 0x2f05, G_UNICODE_NOT_PRESENT_OFFSET, 6176 },
+ { 0x2f06, G_UNICODE_NOT_PRESENT_OFFSET, 6180 },
+ { 0x2f07, G_UNICODE_NOT_PRESENT_OFFSET, 6184 },
+ { 0x2f08, G_UNICODE_NOT_PRESENT_OFFSET, 6188 },
+ { 0x2f09, G_UNICODE_NOT_PRESENT_OFFSET, 6192 },
+ { 0x2f0a, G_UNICODE_NOT_PRESENT_OFFSET, 6196 },
+ { 0x2f0b, G_UNICODE_NOT_PRESENT_OFFSET, 6200 },
+ { 0x2f0c, G_UNICODE_NOT_PRESENT_OFFSET, 6204 },
+ { 0x2f0d, G_UNICODE_NOT_PRESENT_OFFSET, 6208 },
+ { 0x2f0e, G_UNICODE_NOT_PRESENT_OFFSET, 6212 },
+ { 0x2f0f, G_UNICODE_NOT_PRESENT_OFFSET, 6216 },
+ { 0x2f10, G_UNICODE_NOT_PRESENT_OFFSET, 6220 },
+ { 0x2f11, G_UNICODE_NOT_PRESENT_OFFSET, 6224 },
+ { 0x2f12, G_UNICODE_NOT_PRESENT_OFFSET, 6228 },
+ { 0x2f13, G_UNICODE_NOT_PRESENT_OFFSET, 6232 },
+ { 0x2f14, G_UNICODE_NOT_PRESENT_OFFSET, 6236 },
+ { 0x2f15, G_UNICODE_NOT_PRESENT_OFFSET, 6240 },
+ { 0x2f16, G_UNICODE_NOT_PRESENT_OFFSET, 6244 },
+ { 0x2f17, G_UNICODE_NOT_PRESENT_OFFSET, 6248 },
+ { 0x2f18, G_UNICODE_NOT_PRESENT_OFFSET, 6252 },
+ { 0x2f19, G_UNICODE_NOT_PRESENT_OFFSET, 6256 },
+ { 0x2f1a, G_UNICODE_NOT_PRESENT_OFFSET, 6260 },
+ { 0x2f1b, G_UNICODE_NOT_PRESENT_OFFSET, 6264 },
+ { 0x2f1c, G_UNICODE_NOT_PRESENT_OFFSET, 6268 },
+ { 0x2f1d, G_UNICODE_NOT_PRESENT_OFFSET, 6272 },
+ { 0x2f1e, G_UNICODE_NOT_PRESENT_OFFSET, 6276 },
+ { 0x2f1f, G_UNICODE_NOT_PRESENT_OFFSET, 6280 },
+ { 0x2f20, G_UNICODE_NOT_PRESENT_OFFSET, 6284 },
+ { 0x2f21, G_UNICODE_NOT_PRESENT_OFFSET, 6288 },
+ { 0x2f22, G_UNICODE_NOT_PRESENT_OFFSET, 6292 },
+ { 0x2f23, G_UNICODE_NOT_PRESENT_OFFSET, 6296 },
+ { 0x2f24, G_UNICODE_NOT_PRESENT_OFFSET, 6300 },
+ { 0x2f25, G_UNICODE_NOT_PRESENT_OFFSET, 6304 },
+ { 0x2f26, G_UNICODE_NOT_PRESENT_OFFSET, 6308 },
+ { 0x2f27, G_UNICODE_NOT_PRESENT_OFFSET, 6312 },
+ { 0x2f28, G_UNICODE_NOT_PRESENT_OFFSET, 6316 },
+ { 0x2f29, G_UNICODE_NOT_PRESENT_OFFSET, 6320 },
+ { 0x2f2a, G_UNICODE_NOT_PRESENT_OFFSET, 6324 },
+ { 0x2f2b, G_UNICODE_NOT_PRESENT_OFFSET, 6328 },
+ { 0x2f2c, G_UNICODE_NOT_PRESENT_OFFSET, 6332 },
+ { 0x2f2d, G_UNICODE_NOT_PRESENT_OFFSET, 6336 },
+ { 0x2f2e, G_UNICODE_NOT_PRESENT_OFFSET, 6340 },
+ { 0x2f2f, G_UNICODE_NOT_PRESENT_OFFSET, 6344 },
+ { 0x2f30, G_UNICODE_NOT_PRESENT_OFFSET, 6348 },
+ { 0x2f31, G_UNICODE_NOT_PRESENT_OFFSET, 6352 },
+ { 0x2f32, G_UNICODE_NOT_PRESENT_OFFSET, 6356 },
+ { 0x2f33, G_UNICODE_NOT_PRESENT_OFFSET, 6360 },
+ { 0x2f34, G_UNICODE_NOT_PRESENT_OFFSET, 6364 },
+ { 0x2f35, G_UNICODE_NOT_PRESENT_OFFSET, 6368 },
+ { 0x2f36, G_UNICODE_NOT_PRESENT_OFFSET, 6372 },
+ { 0x2f37, G_UNICODE_NOT_PRESENT_OFFSET, 6376 },
+ { 0x2f38, G_UNICODE_NOT_PRESENT_OFFSET, 6380 },
+ { 0x2f39, G_UNICODE_NOT_PRESENT_OFFSET, 6384 },
+ { 0x2f3a, G_UNICODE_NOT_PRESENT_OFFSET, 6388 },
+ { 0x2f3b, G_UNICODE_NOT_PRESENT_OFFSET, 6392 },
+ { 0x2f3c, G_UNICODE_NOT_PRESENT_OFFSET, 6396 },
+ { 0x2f3d, G_UNICODE_NOT_PRESENT_OFFSET, 6400 },
+ { 0x2f3e, G_UNICODE_NOT_PRESENT_OFFSET, 6404 },
+ { 0x2f3f, G_UNICODE_NOT_PRESENT_OFFSET, 6408 },
+ { 0x2f40, G_UNICODE_NOT_PRESENT_OFFSET, 6412 },
+ { 0x2f41, G_UNICODE_NOT_PRESENT_OFFSET, 6416 },
+ { 0x2f42, G_UNICODE_NOT_PRESENT_OFFSET, 6420 },
+ { 0x2f43, G_UNICODE_NOT_PRESENT_OFFSET, 6424 },
+ { 0x2f44, G_UNICODE_NOT_PRESENT_OFFSET, 6428 },
+ { 0x2f45, G_UNICODE_NOT_PRESENT_OFFSET, 6432 },
+ { 0x2f46, G_UNICODE_NOT_PRESENT_OFFSET, 6436 },
+ { 0x2f47, G_UNICODE_NOT_PRESENT_OFFSET, 6440 },
+ { 0x2f48, G_UNICODE_NOT_PRESENT_OFFSET, 6444 },
+ { 0x2f49, G_UNICODE_NOT_PRESENT_OFFSET, 6448 },
+ { 0x2f4a, G_UNICODE_NOT_PRESENT_OFFSET, 6452 },
+ { 0x2f4b, G_UNICODE_NOT_PRESENT_OFFSET, 6456 },
+ { 0x2f4c, G_UNICODE_NOT_PRESENT_OFFSET, 6460 },
+ { 0x2f4d, G_UNICODE_NOT_PRESENT_OFFSET, 6464 },
+ { 0x2f4e, G_UNICODE_NOT_PRESENT_OFFSET, 6468 },
+ { 0x2f4f, G_UNICODE_NOT_PRESENT_OFFSET, 6472 },
+ { 0x2f50, G_UNICODE_NOT_PRESENT_OFFSET, 6476 },
+ { 0x2f51, G_UNICODE_NOT_PRESENT_OFFSET, 6480 },
+ { 0x2f52, G_UNICODE_NOT_PRESENT_OFFSET, 6484 },
+ { 0x2f53, G_UNICODE_NOT_PRESENT_OFFSET, 6488 },
+ { 0x2f54, G_UNICODE_NOT_PRESENT_OFFSET, 6492 },
+ { 0x2f55, G_UNICODE_NOT_PRESENT_OFFSET, 6496 },
+ { 0x2f56, G_UNICODE_NOT_PRESENT_OFFSET, 6500 },
+ { 0x2f57, G_UNICODE_NOT_PRESENT_OFFSET, 6504 },
+ { 0x2f58, G_UNICODE_NOT_PRESENT_OFFSET, 6508 },
+ { 0x2f59, G_UNICODE_NOT_PRESENT_OFFSET, 6512 },
+ { 0x2f5a, G_UNICODE_NOT_PRESENT_OFFSET, 6516 },
+ { 0x2f5b, G_UNICODE_NOT_PRESENT_OFFSET, 6520 },
+ { 0x2f5c, G_UNICODE_NOT_PRESENT_OFFSET, 6524 },
+ { 0x2f5d, G_UNICODE_NOT_PRESENT_OFFSET, 6528 },
+ { 0x2f5e, G_UNICODE_NOT_PRESENT_OFFSET, 6532 },
+ { 0x2f5f, G_UNICODE_NOT_PRESENT_OFFSET, 6536 },
+ { 0x2f60, G_UNICODE_NOT_PRESENT_OFFSET, 6540 },
+ { 0x2f61, G_UNICODE_NOT_PRESENT_OFFSET, 6544 },
+ { 0x2f62, G_UNICODE_NOT_PRESENT_OFFSET, 6548 },
+ { 0x2f63, G_UNICODE_NOT_PRESENT_OFFSET, 6552 },
+ { 0x2f64, G_UNICODE_NOT_PRESENT_OFFSET, 6556 },
+ { 0x2f65, G_UNICODE_NOT_PRESENT_OFFSET, 6560 },
+ { 0x2f66, G_UNICODE_NOT_PRESENT_OFFSET, 6564 },
+ { 0x2f67, G_UNICODE_NOT_PRESENT_OFFSET, 6568 },
+ { 0x2f68, G_UNICODE_NOT_PRESENT_OFFSET, 6572 },
+ { 0x2f69, G_UNICODE_NOT_PRESENT_OFFSET, 6576 },
+ { 0x2f6a, G_UNICODE_NOT_PRESENT_OFFSET, 6580 },
+ { 0x2f6b, G_UNICODE_NOT_PRESENT_OFFSET, 6584 },
+ { 0x2f6c, G_UNICODE_NOT_PRESENT_OFFSET, 6588 },
+ { 0x2f6d, G_UNICODE_NOT_PRESENT_OFFSET, 6592 },
+ { 0x2f6e, G_UNICODE_NOT_PRESENT_OFFSET, 6596 },
+ { 0x2f6f, G_UNICODE_NOT_PRESENT_OFFSET, 6600 },
+ { 0x2f70, G_UNICODE_NOT_PRESENT_OFFSET, 6604 },
+ { 0x2f71, G_UNICODE_NOT_PRESENT_OFFSET, 6608 },
+ { 0x2f72, G_UNICODE_NOT_PRESENT_OFFSET, 6612 },
+ { 0x2f73, G_UNICODE_NOT_PRESENT_OFFSET, 6616 },
+ { 0x2f74, G_UNICODE_NOT_PRESENT_OFFSET, 6620 },
+ { 0x2f75, G_UNICODE_NOT_PRESENT_OFFSET, 6624 },
+ { 0x2f76, G_UNICODE_NOT_PRESENT_OFFSET, 6628 },
+ { 0x2f77, G_UNICODE_NOT_PRESENT_OFFSET, 6632 },
+ { 0x2f78, G_UNICODE_NOT_PRESENT_OFFSET, 6636 },
+ { 0x2f79, G_UNICODE_NOT_PRESENT_OFFSET, 6640 },
+ { 0x2f7a, G_UNICODE_NOT_PRESENT_OFFSET, 6644 },
+ { 0x2f7b, G_UNICODE_NOT_PRESENT_OFFSET, 6648 },
+ { 0x2f7c, G_UNICODE_NOT_PRESENT_OFFSET, 6652 },
+ { 0x2f7d, G_UNICODE_NOT_PRESENT_OFFSET, 6656 },
+ { 0x2f7e, G_UNICODE_NOT_PRESENT_OFFSET, 6660 },
+ { 0x2f7f, G_UNICODE_NOT_PRESENT_OFFSET, 6664 },
+ { 0x2f80, G_UNICODE_NOT_PRESENT_OFFSET, 6668 },
+ { 0x2f81, G_UNICODE_NOT_PRESENT_OFFSET, 6672 },
+ { 0x2f82, G_UNICODE_NOT_PRESENT_OFFSET, 6676 },
+ { 0x2f83, G_UNICODE_NOT_PRESENT_OFFSET, 6680 },
+ { 0x2f84, G_UNICODE_NOT_PRESENT_OFFSET, 6684 },
+ { 0x2f85, G_UNICODE_NOT_PRESENT_OFFSET, 6688 },
+ { 0x2f86, G_UNICODE_NOT_PRESENT_OFFSET, 6692 },
+ { 0x2f87, G_UNICODE_NOT_PRESENT_OFFSET, 6696 },
+ { 0x2f88, G_UNICODE_NOT_PRESENT_OFFSET, 6700 },
+ { 0x2f89, G_UNICODE_NOT_PRESENT_OFFSET, 6704 },
+ { 0x2f8a, G_UNICODE_NOT_PRESENT_OFFSET, 6708 },
+ { 0x2f8b, G_UNICODE_NOT_PRESENT_OFFSET, 6712 },
+ { 0x2f8c, G_UNICODE_NOT_PRESENT_OFFSET, 6716 },
+ { 0x2f8d, G_UNICODE_NOT_PRESENT_OFFSET, 6720 },
+ { 0x2f8e, G_UNICODE_NOT_PRESENT_OFFSET, 6724 },
+ { 0x2f8f, G_UNICODE_NOT_PRESENT_OFFSET, 6728 },
+ { 0x2f90, G_UNICODE_NOT_PRESENT_OFFSET, 6732 },
+ { 0x2f91, G_UNICODE_NOT_PRESENT_OFFSET, 6736 },
+ { 0x2f92, G_UNICODE_NOT_PRESENT_OFFSET, 6740 },
+ { 0x2f93, G_UNICODE_NOT_PRESENT_OFFSET, 6744 },
+ { 0x2f94, G_UNICODE_NOT_PRESENT_OFFSET, 6748 },
+ { 0x2f95, G_UNICODE_NOT_PRESENT_OFFSET, 6752 },
+ { 0x2f96, G_UNICODE_NOT_PRESENT_OFFSET, 6756 },
+ { 0x2f97, G_UNICODE_NOT_PRESENT_OFFSET, 6760 },
+ { 0x2f98, G_UNICODE_NOT_PRESENT_OFFSET, 6764 },
+ { 0x2f99, G_UNICODE_NOT_PRESENT_OFFSET, 6768 },
+ { 0x2f9a, G_UNICODE_NOT_PRESENT_OFFSET, 6772 },
+ { 0x2f9b, G_UNICODE_NOT_PRESENT_OFFSET, 6776 },
+ { 0x2f9c, G_UNICODE_NOT_PRESENT_OFFSET, 6780 },
+ { 0x2f9d, G_UNICODE_NOT_PRESENT_OFFSET, 6784 },
+ { 0x2f9e, G_UNICODE_NOT_PRESENT_OFFSET, 6788 },
+ { 0x2f9f, G_UNICODE_NOT_PRESENT_OFFSET, 6792 },
+ { 0x2fa0, G_UNICODE_NOT_PRESENT_OFFSET, 6796 },
+ { 0x2fa1, G_UNICODE_NOT_PRESENT_OFFSET, 6800 },
+ { 0x2fa2, G_UNICODE_NOT_PRESENT_OFFSET, 6804 },
+ { 0x2fa3, G_UNICODE_NOT_PRESENT_OFFSET, 6808 },
+ { 0x2fa4, G_UNICODE_NOT_PRESENT_OFFSET, 6812 },
+ { 0x2fa5, G_UNICODE_NOT_PRESENT_OFFSET, 6816 },
+ { 0x2fa6, G_UNICODE_NOT_PRESENT_OFFSET, 6820 },
+ { 0x2fa7, G_UNICODE_NOT_PRESENT_OFFSET, 6824 },
+ { 0x2fa8, G_UNICODE_NOT_PRESENT_OFFSET, 6828 },
+ { 0x2fa9, G_UNICODE_NOT_PRESENT_OFFSET, 6832 },
+ { 0x2faa, G_UNICODE_NOT_PRESENT_OFFSET, 6836 },
+ { 0x2fab, G_UNICODE_NOT_PRESENT_OFFSET, 6840 },
+ { 0x2fac, G_UNICODE_NOT_PRESENT_OFFSET, 6844 },
+ { 0x2fad, G_UNICODE_NOT_PRESENT_OFFSET, 6848 },
+ { 0x2fae, G_UNICODE_NOT_PRESENT_OFFSET, 6852 },
+ { 0x2faf, G_UNICODE_NOT_PRESENT_OFFSET, 6856 },
+ { 0x2fb0, G_UNICODE_NOT_PRESENT_OFFSET, 6860 },
+ { 0x2fb1, G_UNICODE_NOT_PRESENT_OFFSET, 6864 },
+ { 0x2fb2, G_UNICODE_NOT_PRESENT_OFFSET, 6868 },
+ { 0x2fb3, G_UNICODE_NOT_PRESENT_OFFSET, 6872 },
+ { 0x2fb4, G_UNICODE_NOT_PRESENT_OFFSET, 6876 },
+ { 0x2fb5, G_UNICODE_NOT_PRESENT_OFFSET, 6880 },
+ { 0x2fb6, G_UNICODE_NOT_PRESENT_OFFSET, 6884 },
+ { 0x2fb7, G_UNICODE_NOT_PRESENT_OFFSET, 6888 },
+ { 0x2fb8, G_UNICODE_NOT_PRESENT_OFFSET, 6892 },
+ { 0x2fb9, G_UNICODE_NOT_PRESENT_OFFSET, 6896 },
+ { 0x2fba, G_UNICODE_NOT_PRESENT_OFFSET, 6900 },
+ { 0x2fbb, G_UNICODE_NOT_PRESENT_OFFSET, 6904 },
+ { 0x2fbc, G_UNICODE_NOT_PRESENT_OFFSET, 6908 },
+ { 0x2fbd, G_UNICODE_NOT_PRESENT_OFFSET, 6912 },
+ { 0x2fbe, G_UNICODE_NOT_PRESENT_OFFSET, 6916 },
+ { 0x2fbf, G_UNICODE_NOT_PRESENT_OFFSET, 6920 },
+ { 0x2fc0, G_UNICODE_NOT_PRESENT_OFFSET, 6924 },
+ { 0x2fc1, G_UNICODE_NOT_PRESENT_OFFSET, 6928 },
+ { 0x2fc2, G_UNICODE_NOT_PRESENT_OFFSET, 6932 },
+ { 0x2fc3, G_UNICODE_NOT_PRESENT_OFFSET, 6936 },
+ { 0x2fc4, G_UNICODE_NOT_PRESENT_OFFSET, 6940 },
+ { 0x2fc5, G_UNICODE_NOT_PRESENT_OFFSET, 6944 },
+ { 0x2fc6, G_UNICODE_NOT_PRESENT_OFFSET, 6948 },
+ { 0x2fc7, G_UNICODE_NOT_PRESENT_OFFSET, 6952 },
+ { 0x2fc8, G_UNICODE_NOT_PRESENT_OFFSET, 6956 },
+ { 0x2fc9, G_UNICODE_NOT_PRESENT_OFFSET, 6960 },
+ { 0x2fca, G_UNICODE_NOT_PRESENT_OFFSET, 6964 },
+ { 0x2fcb, G_UNICODE_NOT_PRESENT_OFFSET, 6968 },
+ { 0x2fcc, G_UNICODE_NOT_PRESENT_OFFSET, 6972 },
+ { 0x2fcd, G_UNICODE_NOT_PRESENT_OFFSET, 6976 },
+ { 0x2fce, G_UNICODE_NOT_PRESENT_OFFSET, 6980 },
+ { 0x2fcf, G_UNICODE_NOT_PRESENT_OFFSET, 6984 },
+ { 0x2fd0, G_UNICODE_NOT_PRESENT_OFFSET, 6988 },
+ { 0x2fd1, G_UNICODE_NOT_PRESENT_OFFSET, 6992 },
+ { 0x2fd2, G_UNICODE_NOT_PRESENT_OFFSET, 6996 },
+ { 0x2fd3, G_UNICODE_NOT_PRESENT_OFFSET, 7000 },
+ { 0x2fd4, G_UNICODE_NOT_PRESENT_OFFSET, 7004 },
+ { 0x2fd5, G_UNICODE_NOT_PRESENT_OFFSET, 7008 },
+ { 0x3000, G_UNICODE_NOT_PRESENT_OFFSET, 0 },
+ { 0x3036, G_UNICODE_NOT_PRESENT_OFFSET, 7012 },
+ { 0x3038, G_UNICODE_NOT_PRESENT_OFFSET, 6248 },
+ { 0x3039, G_UNICODE_NOT_PRESENT_OFFSET, 7016 },
+ { 0x303a, G_UNICODE_NOT_PRESENT_OFFSET, 7020 },
+ { 0x304c, 7024, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x304e, 7031, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3050, 7038, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3052, 7045, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3054, 7052, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3056, 7059, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3058, 7066, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x305a, 7073, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x305c, 7080, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x305e, 7087, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3060, 7094, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3062, 7101, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3065, 7108, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3067, 7115, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3069, 7122, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3070, 7129, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3071, 7136, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3073, 7143, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3074, 7150, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3076, 7157, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3077, 7164, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3079, 7171, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x307a, 7178, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x307c, 7185, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x307d, 7192, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x3094, 7199, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x309b, G_UNICODE_NOT_PRESENT_OFFSET, 7206 },
+ { 0x309c, G_UNICODE_NOT_PRESENT_OFFSET, 7211 },
+ { 0x309e, 7216, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x309f, G_UNICODE_NOT_PRESENT_OFFSET, 7223 },
+ { 0x30ac, 7230, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30ae, 7237, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30b0, 7244, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30b2, 7251, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30b4, 7258, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30b6, 7265, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30b8, 7272, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30ba, 7279, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30bc, 7286, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30be, 7293, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30c0, 7300, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30c2, 7307, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30c5, 7314, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30c7, 7321, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30c9, 7328, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30d0, 7335, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30d1, 7342, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30d3, 7349, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30d4, 7356, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30d6, 7363, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30d7, 7370, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30d9, 7377, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30da, 7384, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30dc, 7391, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30dd, 7398, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30f4, 7405, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30f7, 7412, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30f8, 7419, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30f9, 7426, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30fa, 7433, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30fe, 7440, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x30ff, G_UNICODE_NOT_PRESENT_OFFSET, 7447 },
+ { 0x3131, G_UNICODE_NOT_PRESENT_OFFSET, 7454 },
+ { 0x3132, G_UNICODE_NOT_PRESENT_OFFSET, 7458 },
+ { 0x3133, G_UNICODE_NOT_PRESENT_OFFSET, 7462 },
+ { 0x3134, G_UNICODE_NOT_PRESENT_OFFSET, 7466 },
+ { 0x3135, G_UNICODE_NOT_PRESENT_OFFSET, 7470 },
+ { 0x3136, G_UNICODE_NOT_PRESENT_OFFSET, 7474 },
+ { 0x3137, G_UNICODE_NOT_PRESENT_OFFSET, 7478 },
+ { 0x3138, G_UNICODE_NOT_PRESENT_OFFSET, 7482 },
+ { 0x3139, G_UNICODE_NOT_PRESENT_OFFSET, 7486 },
+ { 0x313a, G_UNICODE_NOT_PRESENT_OFFSET, 7490 },
+ { 0x313b, G_UNICODE_NOT_PRESENT_OFFSET, 7494 },
+ { 0x313c, G_UNICODE_NOT_PRESENT_OFFSET, 7498 },
+ { 0x313d, G_UNICODE_NOT_PRESENT_OFFSET, 7502 },
+ { 0x313e, G_UNICODE_NOT_PRESENT_OFFSET, 7506 },
+ { 0x313f, G_UNICODE_NOT_PRESENT_OFFSET, 7510 },
+ { 0x3140, G_UNICODE_NOT_PRESENT_OFFSET, 7514 },
+ { 0x3141, G_UNICODE_NOT_PRESENT_OFFSET, 7518 },
+ { 0x3142, G_UNICODE_NOT_PRESENT_OFFSET, 7522 },
+ { 0x3143, G_UNICODE_NOT_PRESENT_OFFSET, 7526 },
+ { 0x3144, G_UNICODE_NOT_PRESENT_OFFSET, 7530 },
+ { 0x3145, G_UNICODE_NOT_PRESENT_OFFSET, 7534 },
+ { 0x3146, G_UNICODE_NOT_PRESENT_OFFSET, 7538 },
+ { 0x3147, G_UNICODE_NOT_PRESENT_OFFSET, 7542 },
+ { 0x3148, G_UNICODE_NOT_PRESENT_OFFSET, 7546 },
+ { 0x3149, G_UNICODE_NOT_PRESENT_OFFSET, 7550 },
+ { 0x314a, G_UNICODE_NOT_PRESENT_OFFSET, 7554 },
+ { 0x314b, G_UNICODE_NOT_PRESENT_OFFSET, 7558 },
+ { 0x314c, G_UNICODE_NOT_PRESENT_OFFSET, 7562 },
+ { 0x314d, G_UNICODE_NOT_PRESENT_OFFSET, 7566 },
+ { 0x314e, G_UNICODE_NOT_PRESENT_OFFSET, 7570 },
+ { 0x314f, G_UNICODE_NOT_PRESENT_OFFSET, 7574 },
+ { 0x3150, G_UNICODE_NOT_PRESENT_OFFSET, 7578 },
+ { 0x3151, G_UNICODE_NOT_PRESENT_OFFSET, 7582 },
+ { 0x3152, G_UNICODE_NOT_PRESENT_OFFSET, 7586 },
+ { 0x3153, G_UNICODE_NOT_PRESENT_OFFSET, 7590 },
+ { 0x3154, G_UNICODE_NOT_PRESENT_OFFSET, 7594 },
+ { 0x3155, G_UNICODE_NOT_PRESENT_OFFSET, 7598 },
+ { 0x3156, G_UNICODE_NOT_PRESENT_OFFSET, 7602 },
+ { 0x3157, G_UNICODE_NOT_PRESENT_OFFSET, 7606 },
+ { 0x3158, G_UNICODE_NOT_PRESENT_OFFSET, 7610 },
+ { 0x3159, G_UNICODE_NOT_PRESENT_OFFSET, 7614 },
+ { 0x315a, G_UNICODE_NOT_PRESENT_OFFSET, 7618 },
+ { 0x315b, G_UNICODE_NOT_PRESENT_OFFSET, 7622 },
+ { 0x315c, G_UNICODE_NOT_PRESENT_OFFSET, 7626 },
+ { 0x315d, G_UNICODE_NOT_PRESENT_OFFSET, 7630 },
+ { 0x315e, G_UNICODE_NOT_PRESENT_OFFSET, 7634 },
+ { 0x315f, G_UNICODE_NOT_PRESENT_OFFSET, 7638 },
+ { 0x3160, G_UNICODE_NOT_PRESENT_OFFSET, 7642 },
+ { 0x3161, G_UNICODE_NOT_PRESENT_OFFSET, 7646 },
+ { 0x3162, G_UNICODE_NOT_PRESENT_OFFSET, 7650 },
+ { 0x3163, G_UNICODE_NOT_PRESENT_OFFSET, 7654 },
+ { 0x3164, G_UNICODE_NOT_PRESENT_OFFSET, 7658 },
+ { 0x3165, G_UNICODE_NOT_PRESENT_OFFSET, 7662 },
+ { 0x3166, G_UNICODE_NOT_PRESENT_OFFSET, 7666 },
+ { 0x3167, G_UNICODE_NOT_PRESENT_OFFSET, 7670 },
+ { 0x3168, G_UNICODE_NOT_PRESENT_OFFSET, 7674 },
+ { 0x3169, G_UNICODE_NOT_PRESENT_OFFSET, 7678 },
+ { 0x316a, G_UNICODE_NOT_PRESENT_OFFSET, 7682 },
+ { 0x316b, G_UNICODE_NOT_PRESENT_OFFSET, 7686 },
+ { 0x316c, G_UNICODE_NOT_PRESENT_OFFSET, 7690 },
+ { 0x316d, G_UNICODE_NOT_PRESENT_OFFSET, 7694 },
+ { 0x316e, G_UNICODE_NOT_PRESENT_OFFSET, 7698 },
+ { 0x316f, G_UNICODE_NOT_PRESENT_OFFSET, 7702 },
+ { 0x3170, G_UNICODE_NOT_PRESENT_OFFSET, 7706 },
+ { 0x3171, G_UNICODE_NOT_PRESENT_OFFSET, 7710 },
+ { 0x3172, G_UNICODE_NOT_PRESENT_OFFSET, 7714 },
+ { 0x3173, G_UNICODE_NOT_PRESENT_OFFSET, 7718 },
+ { 0x3174, G_UNICODE_NOT_PRESENT_OFFSET, 7722 },
+ { 0x3175, G_UNICODE_NOT_PRESENT_OFFSET, 7726 },
+ { 0x3176, G_UNICODE_NOT_PRESENT_OFFSET, 7730 },
+ { 0x3177, G_UNICODE_NOT_PRESENT_OFFSET, 7734 },
+ { 0x3178, G_UNICODE_NOT_PRESENT_OFFSET, 7738 },
+ { 0x3179, G_UNICODE_NOT_PRESENT_OFFSET, 7742 },
+ { 0x317a, G_UNICODE_NOT_PRESENT_OFFSET, 7746 },
+ { 0x317b, G_UNICODE_NOT_PRESENT_OFFSET, 7750 },
+ { 0x317c, G_UNICODE_NOT_PRESENT_OFFSET, 7754 },
+ { 0x317d, G_UNICODE_NOT_PRESENT_OFFSET, 7758 },
+ { 0x317e, G_UNICODE_NOT_PRESENT_OFFSET, 7762 },
+ { 0x317f, G_UNICODE_NOT_PRESENT_OFFSET, 7766 },
+ { 0x3180, G_UNICODE_NOT_PRESENT_OFFSET, 7770 },
+ { 0x3181, G_UNICODE_NOT_PRESENT_OFFSET, 7774 },
+ { 0x3182, G_UNICODE_NOT_PRESENT_OFFSET, 7778 },
+ { 0x3183, G_UNICODE_NOT_PRESENT_OFFSET, 7782 },
+ { 0x3184, G_UNICODE_NOT_PRESENT_OFFSET, 7786 },
+ { 0x3185, G_UNICODE_NOT_PRESENT_OFFSET, 7790 },
+ { 0x3186, G_UNICODE_NOT_PRESENT_OFFSET, 7794 },
+ { 0x3187, G_UNICODE_NOT_PRESENT_OFFSET, 7798 },
+ { 0x3188, G_UNICODE_NOT_PRESENT_OFFSET, 7802 },
+ { 0x3189, G_UNICODE_NOT_PRESENT_OFFSET, 7806 },
+ { 0x318a, G_UNICODE_NOT_PRESENT_OFFSET, 7810 },
+ { 0x318b, G_UNICODE_NOT_PRESENT_OFFSET, 7814 },
+ { 0x318c, G_UNICODE_NOT_PRESENT_OFFSET, 7818 },
+ { 0x318d, G_UNICODE_NOT_PRESENT_OFFSET, 7822 },
+ { 0x318e, G_UNICODE_NOT_PRESENT_OFFSET, 7826 },
+ { 0x3192, G_UNICODE_NOT_PRESENT_OFFSET, 6156 },
+ { 0x3193, G_UNICODE_NOT_PRESENT_OFFSET, 6180 },
+ { 0x3194, G_UNICODE_NOT_PRESENT_OFFSET, 7830 },
+ { 0x3195, G_UNICODE_NOT_PRESENT_OFFSET, 7834 },
+ { 0x3196, G_UNICODE_NOT_PRESENT_OFFSET, 7838 },
+ { 0x3197, G_UNICODE_NOT_PRESENT_OFFSET, 7842 },
+ { 0x3198, G_UNICODE_NOT_PRESENT_OFFSET, 7846 },
+ { 0x3199, G_UNICODE_NOT_PRESENT_OFFSET, 7850 },
+ { 0x319a, G_UNICODE_NOT_PRESENT_OFFSET, 6172 },
+ { 0x319b, G_UNICODE_NOT_PRESENT_OFFSET, 7854 },
+ { 0x319c, G_UNICODE_NOT_PRESENT_OFFSET, 7858 },
+ { 0x319d, G_UNICODE_NOT_PRESENT_OFFSET, 7862 },
+ { 0x319e, G_UNICODE_NOT_PRESENT_OFFSET, 7866 },
+ { 0x319f, G_UNICODE_NOT_PRESENT_OFFSET, 6188 },
+ { 0x3200, G_UNICODE_NOT_PRESENT_OFFSET, 7870 },
+ { 0x3201, G_UNICODE_NOT_PRESENT_OFFSET, 7876 },
+ { 0x3202, G_UNICODE_NOT_PRESENT_OFFSET, 7882 },
+ { 0x3203, G_UNICODE_NOT_PRESENT_OFFSET, 7888 },
+ { 0x3204, G_UNICODE_NOT_PRESENT_OFFSET, 7894 },
+ { 0x3205, G_UNICODE_NOT_PRESENT_OFFSET, 7900 },
+ { 0x3206, G_UNICODE_NOT_PRESENT_OFFSET, 7906 },
+ { 0x3207, G_UNICODE_NOT_PRESENT_OFFSET, 7912 },
+ { 0x3208, G_UNICODE_NOT_PRESENT_OFFSET, 7918 },
+ { 0x3209, G_UNICODE_NOT_PRESENT_OFFSET, 7924 },
+ { 0x320a, G_UNICODE_NOT_PRESENT_OFFSET, 7930 },
+ { 0x320b, G_UNICODE_NOT_PRESENT_OFFSET, 7936 },
+ { 0x320c, G_UNICODE_NOT_PRESENT_OFFSET, 7942 },
+ { 0x320d, G_UNICODE_NOT_PRESENT_OFFSET, 7948 },
+ { 0x320e, G_UNICODE_NOT_PRESENT_OFFSET, 7954 },
+ { 0x320f, G_UNICODE_NOT_PRESENT_OFFSET, 7963 },
+ { 0x3210, G_UNICODE_NOT_PRESENT_OFFSET, 7972 },
+ { 0x3211, G_UNICODE_NOT_PRESENT_OFFSET, 7981 },
+ { 0x3212, G_UNICODE_NOT_PRESENT_OFFSET, 7990 },
+ { 0x3213, G_UNICODE_NOT_PRESENT_OFFSET, 7999 },
+ { 0x3214, G_UNICODE_NOT_PRESENT_OFFSET, 8008 },
+ { 0x3215, G_UNICODE_NOT_PRESENT_OFFSET, 8017 },
+ { 0x3216, G_UNICODE_NOT_PRESENT_OFFSET, 8026 },
+ { 0x3217, G_UNICODE_NOT_PRESENT_OFFSET, 8035 },
+ { 0x3218, G_UNICODE_NOT_PRESENT_OFFSET, 8044 },
+ { 0x3219, G_UNICODE_NOT_PRESENT_OFFSET, 8053 },
+ { 0x321a, G_UNICODE_NOT_PRESENT_OFFSET, 8062 },
+ { 0x321b, G_UNICODE_NOT_PRESENT_OFFSET, 8071 },
+ { 0x321c, G_UNICODE_NOT_PRESENT_OFFSET, 8080 },
+ { 0x321d, G_UNICODE_NOT_PRESENT_OFFSET, 8089 },
+ { 0x321e, G_UNICODE_NOT_PRESENT_OFFSET, 8107 },
+ { 0x3220, G_UNICODE_NOT_PRESENT_OFFSET, 8122 },
+ { 0x3221, G_UNICODE_NOT_PRESENT_OFFSET, 8128 },
+ { 0x3222, G_UNICODE_NOT_PRESENT_OFFSET, 8134 },
+ { 0x3223, G_UNICODE_NOT_PRESENT_OFFSET, 8140 },
+ { 0x3224, G_UNICODE_NOT_PRESENT_OFFSET, 8146 },
+ { 0x3225, G_UNICODE_NOT_PRESENT_OFFSET, 8152 },
+ { 0x3226, G_UNICODE_NOT_PRESENT_OFFSET, 8158 },
+ { 0x3227, G_UNICODE_NOT_PRESENT_OFFSET, 8164 },
+ { 0x3228, G_UNICODE_NOT_PRESENT_OFFSET, 8170 },
+ { 0x3229, G_UNICODE_NOT_PRESENT_OFFSET, 8176 },
+ { 0x322a, G_UNICODE_NOT_PRESENT_OFFSET, 8182 },
+ { 0x322b, G_UNICODE_NOT_PRESENT_OFFSET, 8188 },
+ { 0x322c, G_UNICODE_NOT_PRESENT_OFFSET, 8194 },
+ { 0x322d, G_UNICODE_NOT_PRESENT_OFFSET, 8200 },
+ { 0x322e, G_UNICODE_NOT_PRESENT_OFFSET, 8206 },
+ { 0x322f, G_UNICODE_NOT_PRESENT_OFFSET, 8212 },
+ { 0x3230, G_UNICODE_NOT_PRESENT_OFFSET, 8218 },
+ { 0x3231, G_UNICODE_NOT_PRESENT_OFFSET, 8224 },
+ { 0x3232, G_UNICODE_NOT_PRESENT_OFFSET, 8230 },
+ { 0x3233, G_UNICODE_NOT_PRESENT_OFFSET, 8236 },
+ { 0x3234, G_UNICODE_NOT_PRESENT_OFFSET, 8242 },
+ { 0x3235, G_UNICODE_NOT_PRESENT_OFFSET, 8248 },
+ { 0x3236, G_UNICODE_NOT_PRESENT_OFFSET, 8254 },
+ { 0x3237, G_UNICODE_NOT_PRESENT_OFFSET, 8260 },
+ { 0x3238, G_UNICODE_NOT_PRESENT_OFFSET, 8266 },
+ { 0x3239, G_UNICODE_NOT_PRESENT_OFFSET, 8272 },
+ { 0x323a, G_UNICODE_NOT_PRESENT_OFFSET, 8278 },
+ { 0x323b, G_UNICODE_NOT_PRESENT_OFFSET, 8284 },
+ { 0x323c, G_UNICODE_NOT_PRESENT_OFFSET, 8290 },
+ { 0x323d, G_UNICODE_NOT_PRESENT_OFFSET, 8296 },
+ { 0x323e, G_UNICODE_NOT_PRESENT_OFFSET, 8302 },
+ { 0x323f, G_UNICODE_NOT_PRESENT_OFFSET, 8308 },
+ { 0x3240, G_UNICODE_NOT_PRESENT_OFFSET, 8314 },
+ { 0x3241, G_UNICODE_NOT_PRESENT_OFFSET, 8320 },
+ { 0x3242, G_UNICODE_NOT_PRESENT_OFFSET, 8326 },
+ { 0x3243, G_UNICODE_NOT_PRESENT_OFFSET, 8332 },
+ { 0x3250, G_UNICODE_NOT_PRESENT_OFFSET, 8338 },
+ { 0x3251, G_UNICODE_NOT_PRESENT_OFFSET, 8342 },
+ { 0x3252, G_UNICODE_NOT_PRESENT_OFFSET, 8345 },
+ { 0x3253, G_UNICODE_NOT_PRESENT_OFFSET, 8348 },
+ { 0x3254, G_UNICODE_NOT_PRESENT_OFFSET, 8351 },
+ { 0x3255, G_UNICODE_NOT_PRESENT_OFFSET, 8354 },
+ { 0x3256, G_UNICODE_NOT_PRESENT_OFFSET, 8357 },
+ { 0x3257, G_UNICODE_NOT_PRESENT_OFFSET, 8360 },
+ { 0x3258, G_UNICODE_NOT_PRESENT_OFFSET, 8363 },
+ { 0x3259, G_UNICODE_NOT_PRESENT_OFFSET, 8366 },
+ { 0x325a, G_UNICODE_NOT_PRESENT_OFFSET, 8369 },
+ { 0x325b, G_UNICODE_NOT_PRESENT_OFFSET, 8372 },
+ { 0x325c, G_UNICODE_NOT_PRESENT_OFFSET, 8375 },
+ { 0x325d, G_UNICODE_NOT_PRESENT_OFFSET, 8378 },
+ { 0x325e, G_UNICODE_NOT_PRESENT_OFFSET, 8381 },
+ { 0x325f, G_UNICODE_NOT_PRESENT_OFFSET, 8384 },
+ { 0x3260, G_UNICODE_NOT_PRESENT_OFFSET, 7454 },
+ { 0x3261, G_UNICODE_NOT_PRESENT_OFFSET, 7466 },
+ { 0x3262, G_UNICODE_NOT_PRESENT_OFFSET, 7478 },
+ { 0x3263, G_UNICODE_NOT_PRESENT_OFFSET, 7486 },
+ { 0x3264, G_UNICODE_NOT_PRESENT_OFFSET, 7518 },
+ { 0x3265, G_UNICODE_NOT_PRESENT_OFFSET, 7522 },
+ { 0x3266, G_UNICODE_NOT_PRESENT_OFFSET, 7534 },
+ { 0x3267, G_UNICODE_NOT_PRESENT_OFFSET, 7542 },
+ { 0x3268, G_UNICODE_NOT_PRESENT_OFFSET, 7546 },
+ { 0x3269, G_UNICODE_NOT_PRESENT_OFFSET, 7554 },
+ { 0x326a, G_UNICODE_NOT_PRESENT_OFFSET, 7558 },
+ { 0x326b, G_UNICODE_NOT_PRESENT_OFFSET, 7562 },
+ { 0x326c, G_UNICODE_NOT_PRESENT_OFFSET, 7566 },
+ { 0x326d, G_UNICODE_NOT_PRESENT_OFFSET, 7570 },
+ { 0x326e, G_UNICODE_NOT_PRESENT_OFFSET, 8387 },
+ { 0x326f, G_UNICODE_NOT_PRESENT_OFFSET, 8394 },
+ { 0x3270, G_UNICODE_NOT_PRESENT_OFFSET, 8401 },
+ { 0x3271, G_UNICODE_NOT_PRESENT_OFFSET, 8408 },
+ { 0x3272, G_UNICODE_NOT_PRESENT_OFFSET, 8415 },
+ { 0x3273, G_UNICODE_NOT_PRESENT_OFFSET, 8422 },
+ { 0x3274, G_UNICODE_NOT_PRESENT_OFFSET, 8429 },
+ { 0x3275, G_UNICODE_NOT_PRESENT_OFFSET, 8436 },
+ { 0x3276, G_UNICODE_NOT_PRESENT_OFFSET, 8443 },
+ { 0x3277, G_UNICODE_NOT_PRESENT_OFFSET, 8450 },
+ { 0x3278, G_UNICODE_NOT_PRESENT_OFFSET, 8457 },
+ { 0x3279, G_UNICODE_NOT_PRESENT_OFFSET, 8464 },
+ { 0x327a, G_UNICODE_NOT_PRESENT_OFFSET, 8471 },
+ { 0x327b, G_UNICODE_NOT_PRESENT_OFFSET, 8478 },
+ { 0x327c, G_UNICODE_NOT_PRESENT_OFFSET, 8485 },
+ { 0x327d, G_UNICODE_NOT_PRESENT_OFFSET, 8501 },
+ { 0x327e, G_UNICODE_NOT_PRESENT_OFFSET, 8514 },
+ { 0x3280, G_UNICODE_NOT_PRESENT_OFFSET, 6156 },
+ { 0x3281, G_UNICODE_NOT_PRESENT_OFFSET, 6180 },
+ { 0x3282, G_UNICODE_NOT_PRESENT_OFFSET, 7830 },
+ { 0x3283, G_UNICODE_NOT_PRESENT_OFFSET, 7834 },
+ { 0x3284, G_UNICODE_NOT_PRESENT_OFFSET, 8521 },
+ { 0x3285, G_UNICODE_NOT_PRESENT_OFFSET, 8525 },
+ { 0x3286, G_UNICODE_NOT_PRESENT_OFFSET, 8529 },
+ { 0x3287, G_UNICODE_NOT_PRESENT_OFFSET, 6200 },
+ { 0x3288, G_UNICODE_NOT_PRESENT_OFFSET, 8533 },
+ { 0x3289, G_UNICODE_NOT_PRESENT_OFFSET, 6248 },
+ { 0x328a, G_UNICODE_NOT_PRESENT_OFFSET, 6448 },
+ { 0x328b, G_UNICODE_NOT_PRESENT_OFFSET, 6496 },
+ { 0x328c, G_UNICODE_NOT_PRESENT_OFFSET, 6492 },
+ { 0x328d, G_UNICODE_NOT_PRESENT_OFFSET, 6452 },
+ { 0x328e, G_UNICODE_NOT_PRESENT_OFFSET, 6820 },
+ { 0x328f, G_UNICODE_NOT_PRESENT_OFFSET, 6280 },
+ { 0x3290, G_UNICODE_NOT_PRESENT_OFFSET, 6440 },
+ { 0x3291, G_UNICODE_NOT_PRESENT_OFFSET, 8537 },
+ { 0x3292, G_UNICODE_NOT_PRESENT_OFFSET, 8541 },
+ { 0x3293, G_UNICODE_NOT_PRESENT_OFFSET, 8545 },
+ { 0x3294, G_UNICODE_NOT_PRESENT_OFFSET, 8549 },
+ { 0x3295, G_UNICODE_NOT_PRESENT_OFFSET, 8553 },
+ { 0x3296, G_UNICODE_NOT_PRESENT_OFFSET, 8557 },
+ { 0x3297, G_UNICODE_NOT_PRESENT_OFFSET, 8561 },
+ { 0x3298, G_UNICODE_NOT_PRESENT_OFFSET, 8565 },
+ { 0x3299, G_UNICODE_NOT_PRESENT_OFFSET, 8569 },
+ { 0x329a, G_UNICODE_NOT_PRESENT_OFFSET, 8573 },
+ { 0x329b, G_UNICODE_NOT_PRESENT_OFFSET, 6304 },
+ { 0x329c, G_UNICODE_NOT_PRESENT_OFFSET, 8577 },
+ { 0x329d, G_UNICODE_NOT_PRESENT_OFFSET, 8581 },
+ { 0x329e, G_UNICODE_NOT_PRESENT_OFFSET, 8585 },
+ { 0x329f, G_UNICODE_NOT_PRESENT_OFFSET, 8589 },
+ { 0x32a0, G_UNICODE_NOT_PRESENT_OFFSET, 8593 },
+ { 0x32a1, G_UNICODE_NOT_PRESENT_OFFSET, 8597 },
+ { 0x32a2, G_UNICODE_NOT_PRESENT_OFFSET, 8601 },
+ { 0x32a3, G_UNICODE_NOT_PRESENT_OFFSET, 8605 },
+ { 0x32a4, G_UNICODE_NOT_PRESENT_OFFSET, 7838 },
+ { 0x32a5, G_UNICODE_NOT_PRESENT_OFFSET, 7842 },
+ { 0x32a6, G_UNICODE_NOT_PRESENT_OFFSET, 7846 },
+ { 0x32a7, G_UNICODE_NOT_PRESENT_OFFSET, 8609 },
+ { 0x32a8, G_UNICODE_NOT_PRESENT_OFFSET, 8613 },
+ { 0x32a9, G_UNICODE_NOT_PRESENT_OFFSET, 8617 },
+ { 0x32aa, G_UNICODE_NOT_PRESENT_OFFSET, 8621 },
+ { 0x32ab, G_UNICODE_NOT_PRESENT_OFFSET, 8625 },
+ { 0x32ac, G_UNICODE_NOT_PRESENT_OFFSET, 8629 },
+ { 0x32ad, G_UNICODE_NOT_PRESENT_OFFSET, 8633 },
+ { 0x32ae, G_UNICODE_NOT_PRESENT_OFFSET, 8637 },
+ { 0x32af, G_UNICODE_NOT_PRESENT_OFFSET, 8641 },
+ { 0x32b0, G_UNICODE_NOT_PRESENT_OFFSET, 8645 },
+ { 0x32b1, G_UNICODE_NOT_PRESENT_OFFSET, 8649 },
+ { 0x32b2, G_UNICODE_NOT_PRESENT_OFFSET, 8652 },
+ { 0x32b3, G_UNICODE_NOT_PRESENT_OFFSET, 8655 },
+ { 0x32b4, G_UNICODE_NOT_PRESENT_OFFSET, 8658 },
+ { 0x32b5, G_UNICODE_NOT_PRESENT_OFFSET, 8661 },
+ { 0x32b6, G_UNICODE_NOT_PRESENT_OFFSET, 8664 },
+ { 0x32b7, G_UNICODE_NOT_PRESENT_OFFSET, 8667 },
+ { 0x32b8, G_UNICODE_NOT_PRESENT_OFFSET, 8670 },
+ { 0x32b9, G_UNICODE_NOT_PRESENT_OFFSET, 8673 },
+ { 0x32ba, G_UNICODE_NOT_PRESENT_OFFSET, 8676 },
+ { 0x32bb, G_UNICODE_NOT_PRESENT_OFFSET, 8679 },
+ { 0x32bc, G_UNICODE_NOT_PRESENT_OFFSET, 8682 },
+ { 0x32bd, G_UNICODE_NOT_PRESENT_OFFSET, 8685 },
+ { 0x32be, G_UNICODE_NOT_PRESENT_OFFSET, 8688 },
+ { 0x32bf, G_UNICODE_NOT_PRESENT_OFFSET, 8691 },
+ { 0x32c0, G_UNICODE_NOT_PRESENT_OFFSET, 8694 },
+ { 0x32c1, G_UNICODE_NOT_PRESENT_OFFSET, 8699 },
+ { 0x32c2, G_UNICODE_NOT_PRESENT_OFFSET, 8704 },
+ { 0x32c3, G_UNICODE_NOT_PRESENT_OFFSET, 8709 },
+ { 0x32c4, G_UNICODE_NOT_PRESENT_OFFSET, 8714 },
+ { 0x32c5, G_UNICODE_NOT_PRESENT_OFFSET, 8719 },
+ { 0x32c6, G_UNICODE_NOT_PRESENT_OFFSET, 8724 },
+ { 0x32c7, G_UNICODE_NOT_PRESENT_OFFSET, 8729 },
+ { 0x32c8, G_UNICODE_NOT_PRESENT_OFFSET, 8734 },
+ { 0x32c9, G_UNICODE_NOT_PRESENT_OFFSET, 8739 },
+ { 0x32ca, G_UNICODE_NOT_PRESENT_OFFSET, 8745 },
+ { 0x32cb, G_UNICODE_NOT_PRESENT_OFFSET, 8751 },
+ { 0x32cc, G_UNICODE_NOT_PRESENT_OFFSET, 8757 },
+ { 0x32cd, G_UNICODE_NOT_PRESENT_OFFSET, 8760 },
+ { 0x32ce, G_UNICODE_NOT_PRESENT_OFFSET, 8764 },
+ { 0x32cf, G_UNICODE_NOT_PRESENT_OFFSET, 8767 },
+ { 0x32d0, G_UNICODE_NOT_PRESENT_OFFSET, 8771 },
+ { 0x32d1, G_UNICODE_NOT_PRESENT_OFFSET, 8775 },
+ { 0x32d2, G_UNICODE_NOT_PRESENT_OFFSET, 8779 },
+ { 0x32d3, G_UNICODE_NOT_PRESENT_OFFSET, 8783 },
+ { 0x32d4, G_UNICODE_NOT_PRESENT_OFFSET, 8787 },
+ { 0x32d5, G_UNICODE_NOT_PRESENT_OFFSET, 8791 },
+ { 0x32d6, G_UNICODE_NOT_PRESENT_OFFSET, 8795 },
+ { 0x32d7, G_UNICODE_NOT_PRESENT_OFFSET, 8799 },
+ { 0x32d8, G_UNICODE_NOT_PRESENT_OFFSET, 8803 },
+ { 0x32d9, G_UNICODE_NOT_PRESENT_OFFSET, 8807 },
+ { 0x32da, G_UNICODE_NOT_PRESENT_OFFSET, 8811 },
+ { 0x32db, G_UNICODE_NOT_PRESENT_OFFSET, 8815 },
+ { 0x32dc, G_UNICODE_NOT_PRESENT_OFFSET, 8819 },
+ { 0x32dd, G_UNICODE_NOT_PRESENT_OFFSET, 8823 },
+ { 0x32de, G_UNICODE_NOT_PRESENT_OFFSET, 8827 },
+ { 0x32df, G_UNICODE_NOT_PRESENT_OFFSET, 8831 },
+ { 0x32e0, G_UNICODE_NOT_PRESENT_OFFSET, 8835 },
+ { 0x32e1, G_UNICODE_NOT_PRESENT_OFFSET, 8839 },
+ { 0x32e2, G_UNICODE_NOT_PRESENT_OFFSET, 8843 },
+ { 0x32e3, G_UNICODE_NOT_PRESENT_OFFSET, 8847 },
+ { 0x32e4, G_UNICODE_NOT_PRESENT_OFFSET, 8851 },
+ { 0x32e5, G_UNICODE_NOT_PRESENT_OFFSET, 8855 },
+ { 0x32e6, G_UNICODE_NOT_PRESENT_OFFSET, 8859 },
+ { 0x32e7, G_UNICODE_NOT_PRESENT_OFFSET, 8863 },
+ { 0x32e8, G_UNICODE_NOT_PRESENT_OFFSET, 8867 },
+ { 0x32e9, G_UNICODE_NOT_PRESENT_OFFSET, 8871 },
+ { 0x32ea, G_UNICODE_NOT_PRESENT_OFFSET, 8875 },
+ { 0x32eb, G_UNICODE_NOT_PRESENT_OFFSET, 8879 },
+ { 0x32ec, G_UNICODE_NOT_PRESENT_OFFSET, 8883 },
+ { 0x32ed, G_UNICODE_NOT_PRESENT_OFFSET, 8887 },
+ { 0x32ee, G_UNICODE_NOT_PRESENT_OFFSET, 8891 },
+ { 0x32ef, G_UNICODE_NOT_PRESENT_OFFSET, 8895 },
+ { 0x32f0, G_UNICODE_NOT_PRESENT_OFFSET, 8899 },
+ { 0x32f1, G_UNICODE_NOT_PRESENT_OFFSET, 8903 },
+ { 0x32f2, G_UNICODE_NOT_PRESENT_OFFSET, 8907 },
+ { 0x32f3, G_UNICODE_NOT_PRESENT_OFFSET, 8911 },
+ { 0x32f4, G_UNICODE_NOT_PRESENT_OFFSET, 8915 },
+ { 0x32f5, G_UNICODE_NOT_PRESENT_OFFSET, 8919 },
+ { 0x32f6, G_UNICODE_NOT_PRESENT_OFFSET, 8923 },
+ { 0x32f7, G_UNICODE_NOT_PRESENT_OFFSET, 8927 },
+ { 0x32f8, G_UNICODE_NOT_PRESENT_OFFSET, 8931 },
+ { 0x32f9, G_UNICODE_NOT_PRESENT_OFFSET, 8935 },
+ { 0x32fa, G_UNICODE_NOT_PRESENT_OFFSET, 8939 },
+ { 0x32fb, G_UNICODE_NOT_PRESENT_OFFSET, 8943 },
+ { 0x32fc, G_UNICODE_NOT_PRESENT_OFFSET, 8947 },
+ { 0x32fd, G_UNICODE_NOT_PRESENT_OFFSET, 8951 },
+ { 0x32fe, G_UNICODE_NOT_PRESENT_OFFSET, 8955 },
+ { 0x3300, G_UNICODE_NOT_PRESENT_OFFSET, 8959 },
+ { 0x3301, G_UNICODE_NOT_PRESENT_OFFSET, 8975 },
+ { 0x3302, G_UNICODE_NOT_PRESENT_OFFSET, 8988 },
+ { 0x3303, G_UNICODE_NOT_PRESENT_OFFSET, 9004 },
+ { 0x3304, G_UNICODE_NOT_PRESENT_OFFSET, 9014 },
+ { 0x3305, G_UNICODE_NOT_PRESENT_OFFSET, 9030 },
+ { 0x3306, G_UNICODE_NOT_PRESENT_OFFSET, 9040 },
+ { 0x3307, G_UNICODE_NOT_PRESENT_OFFSET, 9050 },
+ { 0x3308, G_UNICODE_NOT_PRESENT_OFFSET, 9069 },
+ { 0x3309, G_UNICODE_NOT_PRESENT_OFFSET, 9082 },
+ { 0x330a, G_UNICODE_NOT_PRESENT_OFFSET, 9092 },
+ { 0x330b, G_UNICODE_NOT_PRESENT_OFFSET, 9102 },
+ { 0x330c, G_UNICODE_NOT_PRESENT_OFFSET, 9112 },
+ { 0x330d, G_UNICODE_NOT_PRESENT_OFFSET, 9125 },
+ { 0x330e, G_UNICODE_NOT_PRESENT_OFFSET, 9138 },
+ { 0x330f, G_UNICODE_NOT_PRESENT_OFFSET, 9151 },
+ { 0x3310, G_UNICODE_NOT_PRESENT_OFFSET, 9164 },
+ { 0x3311, G_UNICODE_NOT_PRESENT_OFFSET, 9177 },
+ { 0x3312, G_UNICODE_NOT_PRESENT_OFFSET, 9190 },
+ { 0x3313, G_UNICODE_NOT_PRESENT_OFFSET, 9203 },
+ { 0x3314, G_UNICODE_NOT_PRESENT_OFFSET, 9222 },
+ { 0x3315, G_UNICODE_NOT_PRESENT_OFFSET, 9229 },
+ { 0x3316, G_UNICODE_NOT_PRESENT_OFFSET, 9248 },
+ { 0x3317, G_UNICODE_NOT_PRESENT_OFFSET, 9267 },
+ { 0x3318, G_UNICODE_NOT_PRESENT_OFFSET, 9283 },
+ { 0x3319, G_UNICODE_NOT_PRESENT_OFFSET, 9296 },
+ { 0x331a, G_UNICODE_NOT_PRESENT_OFFSET, 9315 },
+ { 0x331b, G_UNICODE_NOT_PRESENT_OFFSET, 9334 },
+ { 0x331c, G_UNICODE_NOT_PRESENT_OFFSET, 9347 },
+ { 0x331d, G_UNICODE_NOT_PRESENT_OFFSET, 9357 },
+ { 0x331e, G_UNICODE_NOT_PRESENT_OFFSET, 9367 },
+ { 0x331f, G_UNICODE_NOT_PRESENT_OFFSET, 9380 },
+ { 0x3320, G_UNICODE_NOT_PRESENT_OFFSET, 9393 },
+ { 0x3321, G_UNICODE_NOT_PRESENT_OFFSET, 9409 },
+ { 0x3322, G_UNICODE_NOT_PRESENT_OFFSET, 9425 },
+ { 0x3323, G_UNICODE_NOT_PRESENT_OFFSET, 9435 },
+ { 0x3324, G_UNICODE_NOT_PRESENT_OFFSET, 9445 },
+ { 0x3325, G_UNICODE_NOT_PRESENT_OFFSET, 9458 },
+ { 0x3326, G_UNICODE_NOT_PRESENT_OFFSET, 9468 },
+ { 0x3327, G_UNICODE_NOT_PRESENT_OFFSET, 9478 },
+ { 0x3328, G_UNICODE_NOT_PRESENT_OFFSET, 9485 },
+ { 0x3329, G_UNICODE_NOT_PRESENT_OFFSET, 9492 },
+ { 0x332a, G_UNICODE_NOT_PRESENT_OFFSET, 9502 },
+ { 0x332b, G_UNICODE_NOT_PRESENT_OFFSET, 9512 },
+ { 0x332c, G_UNICODE_NOT_PRESENT_OFFSET, 9531 },
+ { 0x332d, G_UNICODE_NOT_PRESENT_OFFSET, 9544 },
+ { 0x332e, G_UNICODE_NOT_PRESENT_OFFSET, 9560 },
+ { 0x332f, G_UNICODE_NOT_PRESENT_OFFSET, 9579 },
+ { 0x3330, G_UNICODE_NOT_PRESENT_OFFSET, 9592 },
+ { 0x3331, G_UNICODE_NOT_PRESENT_OFFSET, 9602 },
+ { 0x3332, G_UNICODE_NOT_PRESENT_OFFSET, 9612 },
+ { 0x3333, G_UNICODE_NOT_PRESENT_OFFSET, 9631 },
+ { 0x3334, G_UNICODE_NOT_PRESENT_OFFSET, 9644 },
+ { 0x3335, G_UNICODE_NOT_PRESENT_OFFSET, 9663 },
+ { 0x3336, G_UNICODE_NOT_PRESENT_OFFSET, 9673 },
+ { 0x3337, G_UNICODE_NOT_PRESENT_OFFSET, 9689 },
+ { 0x3338, G_UNICODE_NOT_PRESENT_OFFSET, 9699 },
+ { 0x3339, G_UNICODE_NOT_PRESENT_OFFSET, 9712 },
+ { 0x333a, G_UNICODE_NOT_PRESENT_OFFSET, 9722 },
+ { 0x333b, G_UNICODE_NOT_PRESENT_OFFSET, 9735 },
+ { 0x333c, G_UNICODE_NOT_PRESENT_OFFSET, 9751 },
+ { 0x333d, G_UNICODE_NOT_PRESENT_OFFSET, 9764 },
+ { 0x333e, G_UNICODE_NOT_PRESENT_OFFSET, 9780 },
+ { 0x333f, G_UNICODE_NOT_PRESENT_OFFSET, 9793 },
+ { 0x3340, G_UNICODE_NOT_PRESENT_OFFSET, 9800 },
+ { 0x3341, G_UNICODE_NOT_PRESENT_OFFSET, 9816 },
+ { 0x3342, G_UNICODE_NOT_PRESENT_OFFSET, 9826 },
+ { 0x3343, G_UNICODE_NOT_PRESENT_OFFSET, 9836 },
+ { 0x3344, G_UNICODE_NOT_PRESENT_OFFSET, 9849 },
+ { 0x3345, G_UNICODE_NOT_PRESENT_OFFSET, 9859 },
+ { 0x3346, G_UNICODE_NOT_PRESENT_OFFSET, 9869 },
+ { 0x3347, G_UNICODE_NOT_PRESENT_OFFSET, 9879 },
+ { 0x3348, G_UNICODE_NOT_PRESENT_OFFSET, 9895 },
+ { 0x3349, G_UNICODE_NOT_PRESENT_OFFSET, 9908 },
+ { 0x334a, G_UNICODE_NOT_PRESENT_OFFSET, 9915 },
+ { 0x334b, G_UNICODE_NOT_PRESENT_OFFSET, 9934 },
+ { 0x334c, G_UNICODE_NOT_PRESENT_OFFSET, 9944 },
+ { 0x334d, G_UNICODE_NOT_PRESENT_OFFSET, 9960 },
+ { 0x334e, G_UNICODE_NOT_PRESENT_OFFSET, 9973 },
+ { 0x334f, G_UNICODE_NOT_PRESENT_OFFSET, 9986 },
+ { 0x3350, G_UNICODE_NOT_PRESENT_OFFSET, 9996 },
+ { 0x3351, G_UNICODE_NOT_PRESENT_OFFSET, 10006 },
+ { 0x3352, G_UNICODE_NOT_PRESENT_OFFSET, 10019 },
+ { 0x3353, G_UNICODE_NOT_PRESENT_OFFSET, 10026 },
+ { 0x3354, G_UNICODE_NOT_PRESENT_OFFSET, 10039 },
+ { 0x3355, G_UNICODE_NOT_PRESENT_OFFSET, 10055 },
+ { 0x3356, G_UNICODE_NOT_PRESENT_OFFSET, 10062 },
+ { 0x3357, G_UNICODE_NOT_PRESENT_OFFSET, 10081 },
+ { 0x3358, G_UNICODE_NOT_PRESENT_OFFSET, 10091 },
+ { 0x3359, G_UNICODE_NOT_PRESENT_OFFSET, 10096 },
+ { 0x335a, G_UNICODE_NOT_PRESENT_OFFSET, 10101 },
+ { 0x335b, G_UNICODE_NOT_PRESENT_OFFSET, 10106 },
+ { 0x335c, G_UNICODE_NOT_PRESENT_OFFSET, 10111 },
+ { 0x335d, G_UNICODE_NOT_PRESENT_OFFSET, 10116 },
+ { 0x335e, G_UNICODE_NOT_PRESENT_OFFSET, 10121 },
+ { 0x335f, G_UNICODE_NOT_PRESENT_OFFSET, 10126 },
+ { 0x3360, G_UNICODE_NOT_PRESENT_OFFSET, 10131 },
+ { 0x3361, G_UNICODE_NOT_PRESENT_OFFSET, 10136 },
+ { 0x3362, G_UNICODE_NOT_PRESENT_OFFSET, 10141 },
+ { 0x3363, G_UNICODE_NOT_PRESENT_OFFSET, 10147 },
+ { 0x3364, G_UNICODE_NOT_PRESENT_OFFSET, 10153 },
+ { 0x3365, G_UNICODE_NOT_PRESENT_OFFSET, 10159 },
+ { 0x3366, G_UNICODE_NOT_PRESENT_OFFSET, 10165 },
+ { 0x3367, G_UNICODE_NOT_PRESENT_OFFSET, 10171 },
+ { 0x3368, G_UNICODE_NOT_PRESENT_OFFSET, 10177 },
+ { 0x3369, G_UNICODE_NOT_PRESENT_OFFSET, 10183 },
+ { 0x336a, G_UNICODE_NOT_PRESENT_OFFSET, 10189 },
+ { 0x336b, G_UNICODE_NOT_PRESENT_OFFSET, 10195 },
+ { 0x336c, G_UNICODE_NOT_PRESENT_OFFSET, 10201 },
+ { 0x336d, G_UNICODE_NOT_PRESENT_OFFSET, 10207 },
+ { 0x336e, G_UNICODE_NOT_PRESENT_OFFSET, 10213 },
+ { 0x336f, G_UNICODE_NOT_PRESENT_OFFSET, 10219 },
+ { 0x3370, G_UNICODE_NOT_PRESENT_OFFSET, 10225 },
+ { 0x3371, G_UNICODE_NOT_PRESENT_OFFSET, 10231 },
+ { 0x3372, G_UNICODE_NOT_PRESENT_OFFSET, 10235 },
+ { 0x3373, G_UNICODE_NOT_PRESENT_OFFSET, 10238 },
+ { 0x3374, G_UNICODE_NOT_PRESENT_OFFSET, 10241 },
+ { 0x3375, G_UNICODE_NOT_PRESENT_OFFSET, 10245 },
+ { 0x3376, G_UNICODE_NOT_PRESENT_OFFSET, 10248 },
+ { 0x3377, G_UNICODE_NOT_PRESENT_OFFSET, 10251 },
+ { 0x3378, G_UNICODE_NOT_PRESENT_OFFSET, 10254 },
+ { 0x3379, G_UNICODE_NOT_PRESENT_OFFSET, 10258 },
+ { 0x337a, G_UNICODE_NOT_PRESENT_OFFSET, 10262 },
+ { 0x337b, G_UNICODE_NOT_PRESENT_OFFSET, 10265 },
+ { 0x337c, G_UNICODE_NOT_PRESENT_OFFSET, 10272 },
+ { 0x337d, G_UNICODE_NOT_PRESENT_OFFSET, 10279 },
+ { 0x337e, G_UNICODE_NOT_PRESENT_OFFSET, 10286 },
+ { 0x337f, G_UNICODE_NOT_PRESENT_OFFSET, 10293 },
+ { 0x3380, G_UNICODE_NOT_PRESENT_OFFSET, 10306 },
+ { 0x3381, G_UNICODE_NOT_PRESENT_OFFSET, 10309 },
+ { 0x3382, G_UNICODE_NOT_PRESENT_OFFSET, 10312 },
+ { 0x3383, G_UNICODE_NOT_PRESENT_OFFSET, 10316 },
+ { 0x3384, G_UNICODE_NOT_PRESENT_OFFSET, 10319 },
+ { 0x3385, G_UNICODE_NOT_PRESENT_OFFSET, 10322 },
+ { 0x3386, G_UNICODE_NOT_PRESENT_OFFSET, 10325 },
+ { 0x3387, G_UNICODE_NOT_PRESENT_OFFSET, 10328 },
+ { 0x3388, G_UNICODE_NOT_PRESENT_OFFSET, 10331 },
+ { 0x3389, G_UNICODE_NOT_PRESENT_OFFSET, 10335 },
+ { 0x338a, G_UNICODE_NOT_PRESENT_OFFSET, 10340 },
+ { 0x338b, G_UNICODE_NOT_PRESENT_OFFSET, 10343 },
+ { 0x338c, G_UNICODE_NOT_PRESENT_OFFSET, 10346 },
+ { 0x338d, G_UNICODE_NOT_PRESENT_OFFSET, 10350 },
+ { 0x338e, G_UNICODE_NOT_PRESENT_OFFSET, 10354 },
+ { 0x338f, G_UNICODE_NOT_PRESENT_OFFSET, 10357 },
+ { 0x3390, G_UNICODE_NOT_PRESENT_OFFSET, 10360 },
+ { 0x3391, G_UNICODE_NOT_PRESENT_OFFSET, 10363 },
+ { 0x3392, G_UNICODE_NOT_PRESENT_OFFSET, 10367 },
+ { 0x3393, G_UNICODE_NOT_PRESENT_OFFSET, 10371 },
+ { 0x3394, G_UNICODE_NOT_PRESENT_OFFSET, 10375 },
+ { 0x3395, G_UNICODE_NOT_PRESENT_OFFSET, 10379 },
+ { 0x3396, G_UNICODE_NOT_PRESENT_OFFSET, 10383 },
+ { 0x3397, G_UNICODE_NOT_PRESENT_OFFSET, 10386 },
+ { 0x3398, G_UNICODE_NOT_PRESENT_OFFSET, 10389 },
+ { 0x3399, G_UNICODE_NOT_PRESENT_OFFSET, 10392 },
+ { 0x339a, G_UNICODE_NOT_PRESENT_OFFSET, 10395 },
+ { 0x339b, G_UNICODE_NOT_PRESENT_OFFSET, 10398 },
+ { 0x339c, G_UNICODE_NOT_PRESENT_OFFSET, 10402 },
+ { 0x339d, G_UNICODE_NOT_PRESENT_OFFSET, 10405 },
+ { 0x339e, G_UNICODE_NOT_PRESENT_OFFSET, 10408 },
+ { 0x339f, G_UNICODE_NOT_PRESENT_OFFSET, 10411 },
+ { 0x33a0, G_UNICODE_NOT_PRESENT_OFFSET, 10415 },
+ { 0x33a1, G_UNICODE_NOT_PRESENT_OFFSET, 10419 },
+ { 0x33a2, G_UNICODE_NOT_PRESENT_OFFSET, 10422 },
+ { 0x33a3, G_UNICODE_NOT_PRESENT_OFFSET, 10426 },
+ { 0x33a4, G_UNICODE_NOT_PRESENT_OFFSET, 10430 },
+ { 0x33a5, G_UNICODE_NOT_PRESENT_OFFSET, 10434 },
+ { 0x33a6, G_UNICODE_NOT_PRESENT_OFFSET, 10437 },
+ { 0x33a7, G_UNICODE_NOT_PRESENT_OFFSET, 10441 },
+ { 0x33a8, G_UNICODE_NOT_PRESENT_OFFSET, 10447 },
+ { 0x33a9, G_UNICODE_NOT_PRESENT_OFFSET, 10454 },
+ { 0x33aa, G_UNICODE_NOT_PRESENT_OFFSET, 10457 },
+ { 0x33ab, G_UNICODE_NOT_PRESENT_OFFSET, 10461 },
+ { 0x33ac, G_UNICODE_NOT_PRESENT_OFFSET, 10465 },
+ { 0x33ad, G_UNICODE_NOT_PRESENT_OFFSET, 10469 },
+ { 0x33ae, G_UNICODE_NOT_PRESENT_OFFSET, 10473 },
+ { 0x33af, G_UNICODE_NOT_PRESENT_OFFSET, 10481 },
+ { 0x33b0, G_UNICODE_NOT_PRESENT_OFFSET, 10490 },
+ { 0x33b1, G_UNICODE_NOT_PRESENT_OFFSET, 10493 },
+ { 0x33b2, G_UNICODE_NOT_PRESENT_OFFSET, 10496 },
+ { 0x33b3, G_UNICODE_NOT_PRESENT_OFFSET, 10500 },
+ { 0x33b4, G_UNICODE_NOT_PRESENT_OFFSET, 10503 },
+ { 0x33b5, G_UNICODE_NOT_PRESENT_OFFSET, 10506 },
+ { 0x33b6, G_UNICODE_NOT_PRESENT_OFFSET, 10509 },
+ { 0x33b7, G_UNICODE_NOT_PRESENT_OFFSET, 10513 },
+ { 0x33b8, G_UNICODE_NOT_PRESENT_OFFSET, 10516 },
+ { 0x33b9, G_UNICODE_NOT_PRESENT_OFFSET, 10519 },
+ { 0x33ba, G_UNICODE_NOT_PRESENT_OFFSET, 10522 },
+ { 0x33bb, G_UNICODE_NOT_PRESENT_OFFSET, 10525 },
+ { 0x33bc, G_UNICODE_NOT_PRESENT_OFFSET, 10528 },
+ { 0x33bd, G_UNICODE_NOT_PRESENT_OFFSET, 10532 },
+ { 0x33be, G_UNICODE_NOT_PRESENT_OFFSET, 10535 },
+ { 0x33bf, G_UNICODE_NOT_PRESENT_OFFSET, 10538 },
+ { 0x33c0, G_UNICODE_NOT_PRESENT_OFFSET, 10541 },
+ { 0x33c1, G_UNICODE_NOT_PRESENT_OFFSET, 10545 },
+ { 0x33c2, G_UNICODE_NOT_PRESENT_OFFSET, 10549 },
+ { 0x33c3, G_UNICODE_NOT_PRESENT_OFFSET, 10554 },
+ { 0x33c4, G_UNICODE_NOT_PRESENT_OFFSET, 10557 },
+ { 0x33c5, G_UNICODE_NOT_PRESENT_OFFSET, 10560 },
+ { 0x33c6, G_UNICODE_NOT_PRESENT_OFFSET, 10563 },
+ { 0x33c7, G_UNICODE_NOT_PRESENT_OFFSET, 10570 },
+ { 0x33c8, G_UNICODE_NOT_PRESENT_OFFSET, 10574 },
+ { 0x33c9, G_UNICODE_NOT_PRESENT_OFFSET, 10577 },
+ { 0x33ca, G_UNICODE_NOT_PRESENT_OFFSET, 10580 },
+ { 0x33cb, G_UNICODE_NOT_PRESENT_OFFSET, 10583 },
+ { 0x33cc, G_UNICODE_NOT_PRESENT_OFFSET, 10586 },
+ { 0x33cd, G_UNICODE_NOT_PRESENT_OFFSET, 10589 },
+ { 0x33ce, G_UNICODE_NOT_PRESENT_OFFSET, 10592 },
+ { 0x33cf, G_UNICODE_NOT_PRESENT_OFFSET, 10595 },
+ { 0x33d0, G_UNICODE_NOT_PRESENT_OFFSET, 10598 },
+ { 0x33d1, G_UNICODE_NOT_PRESENT_OFFSET, 10601 },
+ { 0x33d2, G_UNICODE_NOT_PRESENT_OFFSET, 10604 },
+ { 0x33d3, G_UNICODE_NOT_PRESENT_OFFSET, 10608 },
+ { 0x33d4, G_UNICODE_NOT_PRESENT_OFFSET, 10611 },
+ { 0x33d5, G_UNICODE_NOT_PRESENT_OFFSET, 10614 },
+ { 0x33d6, G_UNICODE_NOT_PRESENT_OFFSET, 10618 },
+ { 0x33d7, G_UNICODE_NOT_PRESENT_OFFSET, 10622 },
+ { 0x33d8, G_UNICODE_NOT_PRESENT_OFFSET, 10625 },
+ { 0x33d9, G_UNICODE_NOT_PRESENT_OFFSET, 10630 },
+ { 0x33da, G_UNICODE_NOT_PRESENT_OFFSET, 10634 },
+ { 0x33db, G_UNICODE_NOT_PRESENT_OFFSET, 10637 },
+ { 0x33dc, G_UNICODE_NOT_PRESENT_OFFSET, 10640 },
+ { 0x33dd, G_UNICODE_NOT_PRESENT_OFFSET, 10643 },
+ { 0x33de, G_UNICODE_NOT_PRESENT_OFFSET, 10646 },
+ { 0x33df, G_UNICODE_NOT_PRESENT_OFFSET, 10652 },
+ { 0x33e0, G_UNICODE_NOT_PRESENT_OFFSET, 10658 },
+ { 0x33e1, G_UNICODE_NOT_PRESENT_OFFSET, 10663 },
+ { 0x33e2, G_UNICODE_NOT_PRESENT_OFFSET, 10668 },
+ { 0x33e3, G_UNICODE_NOT_PRESENT_OFFSET, 10673 },
+ { 0x33e4, G_UNICODE_NOT_PRESENT_OFFSET, 10678 },
+ { 0x33e5, G_UNICODE_NOT_PRESENT_OFFSET, 10683 },
+ { 0x33e6, G_UNICODE_NOT_PRESENT_OFFSET, 10688 },
+ { 0x33e7, G_UNICODE_NOT_PRESENT_OFFSET, 10693 },
+ { 0x33e8, G_UNICODE_NOT_PRESENT_OFFSET, 10698 },
+ { 0x33e9, G_UNICODE_NOT_PRESENT_OFFSET, 10703 },
+ { 0x33ea, G_UNICODE_NOT_PRESENT_OFFSET, 10709 },
+ { 0x33eb, G_UNICODE_NOT_PRESENT_OFFSET, 10715 },
+ { 0x33ec, G_UNICODE_NOT_PRESENT_OFFSET, 10721 },
+ { 0x33ed, G_UNICODE_NOT_PRESENT_OFFSET, 10727 },
+ { 0x33ee, G_UNICODE_NOT_PRESENT_OFFSET, 10733 },
+ { 0x33ef, G_UNICODE_NOT_PRESENT_OFFSET, 10739 },
+ { 0x33f0, G_UNICODE_NOT_PRESENT_OFFSET, 10745 },
+ { 0x33f1, G_UNICODE_NOT_PRESENT_OFFSET, 10751 },
+ { 0x33f2, G_UNICODE_NOT_PRESENT_OFFSET, 10757 },
+ { 0x33f3, G_UNICODE_NOT_PRESENT_OFFSET, 10763 },
+ { 0x33f4, G_UNICODE_NOT_PRESENT_OFFSET, 10769 },
+ { 0x33f5, G_UNICODE_NOT_PRESENT_OFFSET, 10775 },
+ { 0x33f6, G_UNICODE_NOT_PRESENT_OFFSET, 10781 },
+ { 0x33f7, G_UNICODE_NOT_PRESENT_OFFSET, 10787 },
+ { 0x33f8, G_UNICODE_NOT_PRESENT_OFFSET, 10793 },
+ { 0x33f9, G_UNICODE_NOT_PRESENT_OFFSET, 10799 },
+ { 0x33fa, G_UNICODE_NOT_PRESENT_OFFSET, 10805 },
+ { 0x33fb, G_UNICODE_NOT_PRESENT_OFFSET, 10811 },
+ { 0x33fc, G_UNICODE_NOT_PRESENT_OFFSET, 10817 },
+ { 0x33fd, G_UNICODE_NOT_PRESENT_OFFSET, 10823 },
+ { 0x33fe, G_UNICODE_NOT_PRESENT_OFFSET, 10829 },
+ { 0x33ff, G_UNICODE_NOT_PRESENT_OFFSET, 10835 },
+ { 0xf900, 10839, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf901, 10843, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf902, 6788, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf903, 10847, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf904, 10851, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf905, 10855, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf906, 10859, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf907, 7004, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf908, 7004, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf909, 10863, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf90a, 6820, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf90b, 10867, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf90c, 10871, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf90d, 10875, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf90e, 10879, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf90f, 10883, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf910, 10887, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf911, 10891, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf912, 10895, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf913, 10899, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf914, 10903, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf915, 10907, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf916, 10911, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf917, 10915, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf918, 10919, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf919, 10923, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf91a, 10927, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf91b, 10931, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf91c, 10935, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf91d, 10939, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf91e, 10943, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf91f, 10947, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf920, 10951, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf921, 10955, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf922, 10959, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf923, 10963, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf924, 10967, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf925, 10971, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf926, 10975, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf927, 10979, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf928, 10983, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf929, 10987, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf92a, 10991, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf92b, 10995, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf92c, 10999, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf92d, 11003, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf92e, 11007, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf92f, 11011, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf930, 11015, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf931, 11019, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf932, 11023, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf933, 11027, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf934, 6652, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf935, 11031, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf936, 11035, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf937, 11039, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf938, 11043, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf939, 11047, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf93a, 11051, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf93b, 11055, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf93c, 11059, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf93d, 11063, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf93e, 11067, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf93f, 11071, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf940, 6944, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf941, 11075, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf942, 11079, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf943, 11083, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf944, 11087, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf945, 11091, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf946, 11095, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf947, 11099, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf948, 11103, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf949, 11107, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf94a, 11111, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf94b, 11115, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf94c, 11119, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf94d, 11123, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf94e, 11127, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf94f, 11131, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf950, 11135, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf951, 11139, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf952, 11143, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf953, 11147, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf954, 11151, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf955, 11155, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf956, 11159, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf957, 11163, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf958, 11167, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf959, 11171, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf95a, 11175, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf95b, 11179, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf95c, 10903, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf95d, 11183, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf95e, 11187, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf95f, 11191, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf960, 11195, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf961, 11199, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf962, 11203, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf963, 11207, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf964, 11211, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf965, 11215, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf966, 11219, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf967, 11223, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf968, 11227, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf969, 11231, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf96a, 11235, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf96b, 11239, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf96c, 11243, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf96d, 11247, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf96e, 11251, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf96f, 11255, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf970, 11259, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf971, 6796, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf972, 11263, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf973, 11267, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf974, 11271, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf975, 11275, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf976, 11279, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf977, 11283, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf978, 11287, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf979, 11291, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf97a, 11295, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf97b, 11299, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf97c, 11303, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf97d, 11307, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf97e, 11311, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf97f, 11315, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf980, 11319, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf981, 6304, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf982, 11323, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf983, 11327, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf984, 11331, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf985, 11335, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf986, 11339, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf987, 11343, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf988, 11347, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf989, 11351, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf98a, 6228, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf98b, 11355, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf98c, 11359, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf98d, 11363, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf98e, 11367, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf98f, 11371, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf990, 11375, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf991, 11379, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf992, 11383, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf993, 11387, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf994, 11391, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf995, 11395, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf996, 11399, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf997, 11403, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf998, 11407, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf999, 11411, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf99a, 11415, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf99b, 11419, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf99c, 11423, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf99d, 11427, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf99e, 11431, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf99f, 11435, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a0, 11439, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a1, 11255, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a2, 11443, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a3, 11447, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a4, 11451, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a5, 11455, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a6, 11459, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a7, 11463, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a8, 11467, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9a9, 11471, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9aa, 11191, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ab, 11475, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ac, 11479, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ad, 11483, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ae, 11487, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9af, 11491, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b0, 11495, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b1, 11499, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b2, 11503, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b3, 11507, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b4, 11511, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b5, 11515, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b6, 11519, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b7, 11523, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b8, 11527, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9b9, 11531, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ba, 11535, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9bb, 11539, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9bc, 11543, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9bd, 11547, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9be, 11551, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9bf, 10903, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c0, 11555, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c1, 11559, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c2, 11563, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c3, 11567, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c4, 7000, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c5, 11571, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c6, 11575, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c7, 11579, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c8, 11583, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9c9, 11587, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ca, 11591, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9cb, 11595, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9cc, 11599, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9cd, 11603, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ce, 11607, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9cf, 11611, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d0, 11615, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d1, 8525, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d2, 11619, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d3, 11623, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d4, 11627, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d5, 11631, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d6, 11635, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d7, 11639, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d8, 11643, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9d9, 11647, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9da, 11651, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9db, 11199, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9dc, 11655, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9dd, 11659, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9de, 11663, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9df, 11667, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e0, 11671, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e1, 11675, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e2, 11679, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e3, 11683, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e4, 11687, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e5, 11691, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e6, 11695, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e7, 11699, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e8, 11703, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9e9, 6816, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ea, 11707, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9eb, 11711, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ec, 11715, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ed, 11719, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ee, 11723, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ef, 11727, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f0, 11731, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f1, 11735, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f2, 11739, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f3, 11743, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f4, 11747, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f5, 11751, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f6, 11755, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f7, 6620, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f8, 11759, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9f9, 11763, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9fa, 11767, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9fb, 11771, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9fc, 11775, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9fd, 11779, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9fe, 11783, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xf9ff, 11787, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa00, 11791, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa01, 11795, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa02, 11799, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa03, 11803, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa04, 11807, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa05, 11811, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa06, 11815, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa07, 11819, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa08, 6728, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa09, 11823, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa0a, 6740, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa0b, 11827, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa0c, 11831, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa0d, 11835, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa10, 11839, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa12, 11843, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa15, 11847, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa16, 11851, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa17, 11855, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa18, 11859, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa19, 11863, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa1a, 11867, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa1b, 11871, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa1c, 11875, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa1d, 11879, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa1e, 6648, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa20, 11883, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa22, 11887, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa25, 11891, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa26, 11895, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa2a, 11899, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa2b, 11903, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa2c, 11907, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa2d, 11911, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa30, 11915, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa31, 11919, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa32, 11923, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa33, 11927, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa34, 11931, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa35, 11935, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa36, 11939, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa37, 11943, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa38, 11947, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa39, 11951, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa3a, 11955, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa3b, 11959, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa3c, 6332, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa3d, 11963, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa3e, 11967, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa3f, 11971, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa40, 11975, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa41, 11979, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa42, 11983, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa43, 11987, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa44, 11991, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa45, 11995, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa46, 11999, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa47, 12003, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa48, 12007, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa49, 12011, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa4a, 12015, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa4b, 12019, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa4c, 8545, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa4d, 12023, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa4e, 12027, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa4f, 12031, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa50, 12035, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa51, 8561, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa52, 12039, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa53, 12043, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa54, 12047, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa55, 12051, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa56, 12055, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa57, 11399, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa58, 12059, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa59, 12063, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa5a, 12067, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa5b, 12071, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa5c, 12075, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa5d, 12079, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa5e, 12079, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa5f, 12083, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa60, 12087, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa61, 12091, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa62, 12095, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa63, 12099, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa64, 12103, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa65, 12107, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa66, 12111, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa67, 11891, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa68, 12115, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa69, 12119, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa6a, 12123, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa70, 12127, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa71, 12131, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa72, 12135, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa73, 12139, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa74, 12143, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa75, 12147, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa76, 12151, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa77, 12155, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa78, 11939, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa79, 12159, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa7a, 12163, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa7b, 12167, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa7c, 11839, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa7d, 12171, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa7e, 12175, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa7f, 12179, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa80, 12183, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa81, 12187, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa82, 12191, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa83, 12195, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa84, 12199, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa85, 12203, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa86, 12207, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa87, 12211, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa88, 12215, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa89, 11971, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa8a, 12219, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa8b, 11975, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa8c, 12223, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa8d, 12227, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa8e, 12231, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa8f, 12235, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa90, 12239, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa91, 11843, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa92, 10987, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa93, 12243, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa94, 12247, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa95, 6464, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa96, 11259, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa97, 11591, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa98, 12251, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa99, 12255, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa9a, 12003, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa9b, 12259, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa9c, 12007, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa9d, 12263, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa9e, 12267, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfa9f, 12271, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa0, 11851, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa1, 12275, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa2, 12279, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa3, 12283, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa4, 12287, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa5, 12291, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa6, 11855, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa7, 12295, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa8, 12299, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaa9, 12303, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaaa, 12307, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaab, 12311, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaac, 12315, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaad, 12055, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaae, 12319, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaaf, 12323, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab0, 11399, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab1, 12327, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab2, 12071, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab3, 12331, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab4, 12335, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab5, 12339, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab6, 12343, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab7, 12347, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab8, 12091, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfab9, 12351, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaba, 11887, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfabb, 12355, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfabc, 12095, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfabd, 11183, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfabe, 12359, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfabf, 12099, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac0, 12363, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac1, 12107, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac2, 12367, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac3, 12371, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac4, 12375, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac5, 12379, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac6, 12383, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac7, 12115, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac8, 11875, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfac9, 12387, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfaca, 12119, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfacb, 12391, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfacc, 12123, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfacd, 12395, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xface, 7004, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfacf, 12399, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad0, 12404, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad1, 12409, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad2, 12414, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad3, 12418, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad4, 12422, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad5, 12426, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad6, 12431, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad7, 12436, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad8, 12441, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfad9, 12445, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb00, G_UNICODE_NOT_PRESENT_OFFSET, 12449 },
+ { 0xfb01, G_UNICODE_NOT_PRESENT_OFFSET, 12452 },
+ { 0xfb02, G_UNICODE_NOT_PRESENT_OFFSET, 12455 },
+ { 0xfb03, G_UNICODE_NOT_PRESENT_OFFSET, 12458 },
+ { 0xfb04, G_UNICODE_NOT_PRESENT_OFFSET, 12462 },
+ { 0xfb05, G_UNICODE_NOT_PRESENT_OFFSET, 12466 },
+ { 0xfb06, G_UNICODE_NOT_PRESENT_OFFSET, 12466 },
+ { 0xfb13, G_UNICODE_NOT_PRESENT_OFFSET, 12469 },
+ { 0xfb14, G_UNICODE_NOT_PRESENT_OFFSET, 12474 },
+ { 0xfb15, G_UNICODE_NOT_PRESENT_OFFSET, 12479 },
+ { 0xfb16, G_UNICODE_NOT_PRESENT_OFFSET, 12484 },
+ { 0xfb17, G_UNICODE_NOT_PRESENT_OFFSET, 12489 },
+ { 0xfb1d, 12494, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb1f, 12499, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb20, G_UNICODE_NOT_PRESENT_OFFSET, 12504 },
+ { 0xfb21, G_UNICODE_NOT_PRESENT_OFFSET, 5338 },
+ { 0xfb22, G_UNICODE_NOT_PRESENT_OFFSET, 5347 },
+ { 0xfb23, G_UNICODE_NOT_PRESENT_OFFSET, 12507 },
+ { 0xfb24, G_UNICODE_NOT_PRESENT_OFFSET, 12510 },
+ { 0xfb25, G_UNICODE_NOT_PRESENT_OFFSET, 12513 },
+ { 0xfb26, G_UNICODE_NOT_PRESENT_OFFSET, 12516 },
+ { 0xfb27, G_UNICODE_NOT_PRESENT_OFFSET, 12519 },
+ { 0xfb28, G_UNICODE_NOT_PRESENT_OFFSET, 12522 },
+ { 0xfb29, G_UNICODE_NOT_PRESENT_OFFSET, 5267 },
+ { 0xfb2a, 12525, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb2b, 12530, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb2c, 12535, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb2d, 12542, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb2e, 12549, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb2f, 12554, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb30, 12559, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb31, 12564, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb32, 12569, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb33, 12574, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb34, 12579, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb35, 12584, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb36, 12589, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb38, 12594, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb39, 12599, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb3a, 12604, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb3b, 12609, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb3c, 12614, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb3e, 12619, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb40, 12624, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb41, 12629, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb43, 12634, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb44, 12639, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb46, 12644, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb47, 12649, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb48, 12654, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb49, 12659, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb4a, 12664, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb4b, 12669, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb4c, 12674, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb4d, 12679, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb4e, 12684, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0xfb4f, G_UNICODE_NOT_PRESENT_OFFSET, 12689 },
+ { 0xfb50, G_UNICODE_NOT_PRESENT_OFFSET, 12694 },
+ { 0xfb51, G_UNICODE_NOT_PRESENT_OFFSET, 12694 },
+ { 0xfb52, G_UNICODE_NOT_PRESENT_OFFSET, 12697 },
+ { 0xfb53, G_UNICODE_NOT_PRESENT_OFFSET, 12697 },
+ { 0xfb54, G_UNICODE_NOT_PRESENT_OFFSET, 12697 },
+ { 0xfb55, G_UNICODE_NOT_PRESENT_OFFSET, 12697 },
+ { 0xfb56, G_UNICODE_NOT_PRESENT_OFFSET, 12700 },
+ { 0xfb57, G_UNICODE_NOT_PRESENT_OFFSET, 12700 },
+ { 0xfb58, G_UNICODE_NOT_PRESENT_OFFSET, 12700 },
+ { 0xfb59, G_UNICODE_NOT_PRESENT_OFFSET, 12700 },
+ { 0xfb5a, G_UNICODE_NOT_PRESENT_OFFSET, 12703 },
+ { 0xfb5b, G_UNICODE_NOT_PRESENT_OFFSET, 12703 },
+ { 0xfb5c, G_UNICODE_NOT_PRESENT_OFFSET, 12703 },
+ { 0xfb5d, G_UNICODE_NOT_PRESENT_OFFSET, 12703 },
+ { 0xfb5e, G_UNICODE_NOT_PRESENT_OFFSET, 12706 },
+ { 0xfb5f, G_UNICODE_NOT_PRESENT_OFFSET, 12706 },
+ { 0xfb60, G_UNICODE_NOT_PRESENT_OFFSET, 12706 },
+ { 0xfb61, G_UNICODE_NOT_PRESENT_OFFSET, 12706 },
+ { 0xfb62, G_UNICODE_NOT_PRESENT_OFFSET, 12709 },
+ { 0xfb63, G_UNICODE_NOT_PRESENT_OFFSET, 12709 },
+ { 0xfb64, G_UNICODE_NOT_PRESENT_OFFSET, 12709 },
+ { 0xfb65, G_UNICODE_NOT_PRESENT_OFFSET, 12709 },
+ { 0xfb66, G_UNICODE_NOT_PRESENT_OFFSET, 12712 },
+ { 0xfb67, G_UNICODE_NOT_PRESENT_OFFSET, 12712 },
+ { 0xfb68, G_UNICODE_NOT_PRESENT_OFFSET, 12712 },
+ { 0xfb69, G_UNICODE_NOT_PRESENT_OFFSET, 12712 },
+ { 0xfb6a, G_UNICODE_NOT_PRESENT_OFFSET, 12715 },
+ { 0xfb6b, G_UNICODE_NOT_PRESENT_OFFSET, 12715 },
+ { 0xfb6c, G_UNICODE_NOT_PRESENT_OFFSET, 12715 },
+ { 0xfb6d, G_UNICODE_NOT_PRESENT_OFFSET, 12715 },
+ { 0xfb6e, G_UNICODE_NOT_PRESENT_OFFSET, 12718 },
+ { 0xfb6f, G_UNICODE_NOT_PRESENT_OFFSET, 12718 },
+ { 0xfb70, G_UNICODE_NOT_PRESENT_OFFSET, 12718 },
+ { 0xfb71, G_UNICODE_NOT_PRESENT_OFFSET, 12718 },
+ { 0xfb72, G_UNICODE_NOT_PRESENT_OFFSET, 12721 },
+ { 0xfb73, G_UNICODE_NOT_PRESENT_OFFSET, 12721 },
+ { 0xfb74, G_UNICODE_NOT_PRESENT_OFFSET, 12721 },
+ { 0xfb75, G_UNICODE_NOT_PRESENT_OFFSET, 12721 },
+ { 0xfb76, G_UNICODE_NOT_PRESENT_OFFSET, 12724 },
+ { 0xfb77, G_UNICODE_NOT_PRESENT_OFFSET, 12724 },
+ { 0xfb78, G_UNICODE_NOT_PRESENT_OFFSET, 12724 },
+ { 0xfb79, G_UNICODE_NOT_PRESENT_OFFSET, 12724 },
+ { 0xfb7a, G_UNICODE_NOT_PRESENT_OFFSET, 12727 },
+ { 0xfb7b, G_UNICODE_NOT_PRESENT_OFFSET, 12727 },
+ { 0xfb7c, G_UNICODE_NOT_PRESENT_OFFSET, 12727 },
+ { 0xfb7d, G_UNICODE_NOT_PRESENT_OFFSET, 12727 },
+ { 0xfb7e, G_UNICODE_NOT_PRESENT_OFFSET, 12730 },
+ { 0xfb7f, G_UNICODE_NOT_PRESENT_OFFSET, 12730 },
+ { 0xfb80, G_UNICODE_NOT_PRESENT_OFFSET, 12730 },
+ { 0xfb81, G_UNICODE_NOT_PRESENT_OFFSET, 12730 },
+ { 0xfb82, G_UNICODE_NOT_PRESENT_OFFSET, 12733 },
+ { 0xfb83, G_UNICODE_NOT_PRESENT_OFFSET, 12733 },
+ { 0xfb84, G_UNICODE_NOT_PRESENT_OFFSET, 12736 },
+ { 0xfb85, G_UNICODE_NOT_PRESENT_OFFSET, 12736 },
+ { 0xfb86, G_UNICODE_NOT_PRESENT_OFFSET, 12739 },
+ { 0xfb87, G_UNICODE_NOT_PRESENT_OFFSET, 12739 },
+ { 0xfb88, G_UNICODE_NOT_PRESENT_OFFSET, 12742 },
+ { 0xfb89, G_UNICODE_NOT_PRESENT_OFFSET, 12742 },
+ { 0xfb8a, G_UNICODE_NOT_PRESENT_OFFSET, 12745 },
+ { 0xfb8b, G_UNICODE_NOT_PRESENT_OFFSET, 12745 },
+ { 0xfb8c, G_UNICODE_NOT_PRESENT_OFFSET, 12748 },
+ { 0xfb8d, G_UNICODE_NOT_PRESENT_OFFSET, 12748 },
+ { 0xfb8e, G_UNICODE_NOT_PRESENT_OFFSET, 12751 },
+ { 0xfb8f, G_UNICODE_NOT_PRESENT_OFFSET, 12751 },
+ { 0xfb90, G_UNICODE_NOT_PRESENT_OFFSET, 12751 },
+ { 0xfb91, G_UNICODE_NOT_PRESENT_OFFSET, 12751 },
+ { 0xfb92, G_UNICODE_NOT_PRESENT_OFFSET, 12754 },
+ { 0xfb93, G_UNICODE_NOT_PRESENT_OFFSET, 12754 },
+ { 0xfb94, G_UNICODE_NOT_PRESENT_OFFSET, 12754 },
+ { 0xfb95, G_UNICODE_NOT_PRESENT_OFFSET, 12754 },
+ { 0xfb96, G_UNICODE_NOT_PRESENT_OFFSET, 12757 },
+ { 0xfb97, G_UNICODE_NOT_PRESENT_OFFSET, 12757 },
+ { 0xfb98, G_UNICODE_NOT_PRESENT_OFFSET, 12757 },
+ { 0xfb99, G_UNICODE_NOT_PRESENT_OFFSET, 12757 },
+ { 0xfb9a, G_UNICODE_NOT_PRESENT_OFFSET, 12760 },
+ { 0xfb9b, G_UNICODE_NOT_PRESENT_OFFSET, 12760 },
+ { 0xfb9c, G_UNICODE_NOT_PRESENT_OFFSET, 12760 },
+ { 0xfb9d, G_UNICODE_NOT_PRESENT_OFFSET, 12760 },
+ { 0xfb9e, G_UNICODE_NOT_PRESENT_OFFSET, 12763 },
+ { 0xfb9f, G_UNICODE_NOT_PRESENT_OFFSET, 12763 },
+ { 0xfba0, G_UNICODE_NOT_PRESENT_OFFSET, 12766 },
+ { 0xfba1, G_UNICODE_NOT_PRESENT_OFFSET, 12766 },
+ { 0xfba2, G_UNICODE_NOT_PRESENT_OFFSET, 12766 },
+ { 0xfba3, G_UNICODE_NOT_PRESENT_OFFSET, 12766 },
+ { 0xfba4, G_UNICODE_NOT_PRESENT_OFFSET, 1721 },
+ { 0xfba5, G_UNICODE_NOT_PRESENT_OFFSET, 1721 },
+ { 0xfba6, G_UNICODE_NOT_PRESENT_OFFSET, 12769 },
+ { 0xfba7, G_UNICODE_NOT_PRESENT_OFFSET, 12769 },
+ { 0xfba8, G_UNICODE_NOT_PRESENT_OFFSET, 12769 },
+ { 0xfba9, G_UNICODE_NOT_PRESENT_OFFSET, 12769 },
+ { 0xfbaa, G_UNICODE_NOT_PRESENT_OFFSET, 12772 },
+ { 0xfbab, G_UNICODE_NOT_PRESENT_OFFSET, 12772 },
+ { 0xfbac, G_UNICODE_NOT_PRESENT_OFFSET, 12772 },
+ { 0xfbad, G_UNICODE_NOT_PRESENT_OFFSET, 12772 },
+ { 0xfbae, G_UNICODE_NOT_PRESENT_OFFSET, 12775 },
+ { 0xfbaf, G_UNICODE_NOT_PRESENT_OFFSET, 12775 },
+ { 0xfbb0, G_UNICODE_NOT_PRESENT_OFFSET, 1731 },
+ { 0xfbb1, G_UNICODE_NOT_PRESENT_OFFSET, 1731 },
+ { 0xfbd3, G_UNICODE_NOT_PRESENT_OFFSET, 12778 },
+ { 0xfbd4, G_UNICODE_NOT_PRESENT_OFFSET, 12778 },
+ { 0xfbd5, G_UNICODE_NOT_PRESENT_OFFSET, 12778 },
+ { 0xfbd6, G_UNICODE_NOT_PRESENT_OFFSET, 12778 },
+ { 0xfbd7, G_UNICODE_NOT_PRESENT_OFFSET, 12781 },
+ { 0xfbd8, G_UNICODE_NOT_PRESENT_OFFSET, 12781 },
+ { 0xfbd9, G_UNICODE_NOT_PRESENT_OFFSET, 12784 },
+ { 0xfbda, G_UNICODE_NOT_PRESENT_OFFSET, 12784 },
+ { 0xfbdb, G_UNICODE_NOT_PRESENT_OFFSET, 12787 },
+ { 0xfbdc, G_UNICODE_NOT_PRESENT_OFFSET, 12787 },
+ { 0xfbdd, G_UNICODE_NOT_PRESENT_OFFSET, 1711 },
+ { 0xfbde, G_UNICODE_NOT_PRESENT_OFFSET, 12790 },
+ { 0xfbdf, G_UNICODE_NOT_PRESENT_OFFSET, 12790 },
+ { 0xfbe0, G_UNICODE_NOT_PRESENT_OFFSET, 12793 },
+ { 0xfbe1, G_UNICODE_NOT_PRESENT_OFFSET, 12793 },
+ { 0xfbe2, G_UNICODE_NOT_PRESENT_OFFSET, 12796 },
+ { 0xfbe3, G_UNICODE_NOT_PRESENT_OFFSET, 12796 },
+ { 0xfbe4, G_UNICODE_NOT_PRESENT_OFFSET, 12799 },
+ { 0xfbe5, G_UNICODE_NOT_PRESENT_OFFSET, 12799 },
+ { 0xfbe6, G_UNICODE_NOT_PRESENT_OFFSET, 12799 },
+ { 0xfbe7, G_UNICODE_NOT_PRESENT_OFFSET, 12799 },
+ { 0xfbe8, G_UNICODE_NOT_PRESENT_OFFSET, 12802 },
+ { 0xfbe9, G_UNICODE_NOT_PRESENT_OFFSET, 12802 },
+ { 0xfbea, G_UNICODE_NOT_PRESENT_OFFSET, 12805 },
+ { 0xfbeb, G_UNICODE_NOT_PRESENT_OFFSET, 12805 },
+ { 0xfbec, G_UNICODE_NOT_PRESENT_OFFSET, 12812 },
+ { 0xfbed, G_UNICODE_NOT_PRESENT_OFFSET, 12812 },
+ { 0xfbee, G_UNICODE_NOT_PRESENT_OFFSET, 12819 },
+ { 0xfbef, G_UNICODE_NOT_PRESENT_OFFSET, 12819 },
+ { 0xfbf0, G_UNICODE_NOT_PRESENT_OFFSET, 12826 },
+ { 0xfbf1, G_UNICODE_NOT_PRESENT_OFFSET, 12826 },
+ { 0xfbf2, G_UNICODE_NOT_PRESENT_OFFSET, 12833 },
+ { 0xfbf3, G_UNICODE_NOT_PRESENT_OFFSET, 12833 },
+ { 0xfbf4, G_UNICODE_NOT_PRESENT_OFFSET, 12840 },
+ { 0xfbf5, G_UNICODE_NOT_PRESENT_OFFSET, 12840 },
+ { 0xfbf6, G_UNICODE_NOT_PRESENT_OFFSET, 12847 },
+ { 0xfbf7, G_UNICODE_NOT_PRESENT_OFFSET, 12847 },
+ { 0xfbf8, G_UNICODE_NOT_PRESENT_OFFSET, 12847 },
+ { 0xfbf9, G_UNICODE_NOT_PRESENT_OFFSET, 12854 },
+ { 0xfbfa, G_UNICODE_NOT_PRESENT_OFFSET, 12854 },
+ { 0xfbfb, G_UNICODE_NOT_PRESENT_OFFSET, 12854 },
+ { 0xfbfc, G_UNICODE_NOT_PRESENT_OFFSET, 12861 },
+ { 0xfbfd, G_UNICODE_NOT_PRESENT_OFFSET, 12861 },
+ { 0xfbfe, G_UNICODE_NOT_PRESENT_OFFSET, 12861 },
+ { 0xfbff, G_UNICODE_NOT_PRESENT_OFFSET, 12861 },
+ { 0xfc00, G_UNICODE_NOT_PRESENT_OFFSET, 12864 },
+ { 0xfc01, G_UNICODE_NOT_PRESENT_OFFSET, 12871 },
+ { 0xfc02, G_UNICODE_NOT_PRESENT_OFFSET, 12878 },
+ { 0xfc03, G_UNICODE_NOT_PRESENT_OFFSET, 12854 },
+ { 0xfc04, G_UNICODE_NOT_PRESENT_OFFSET, 12885 },
+ { 0xfc05, G_UNICODE_NOT_PRESENT_OFFSET, 12892 },
+ { 0xfc06, G_UNICODE_NOT_PRESENT_OFFSET, 12897 },
+ { 0xfc07, G_UNICODE_NOT_PRESENT_OFFSET, 12902 },
+ { 0xfc08, G_UNICODE_NOT_PRESENT_OFFSET, 12907 },
+ { 0xfc09, G_UNICODE_NOT_PRESENT_OFFSET, 12912 },
+ { 0xfc0a, G_UNICODE_NOT_PRESENT_OFFSET, 12917 },
+ { 0xfc0b, G_UNICODE_NOT_PRESENT_OFFSET, 12922 },
+ { 0xfc0c, G_UNICODE_NOT_PRESENT_OFFSET, 12927 },
+ { 0xfc0d, G_UNICODE_NOT_PRESENT_OFFSET, 12932 },
+ { 0xfc0e, G_UNICODE_NOT_PRESENT_OFFSET, 12937 },
+ { 0xfc0f, G_UNICODE_NOT_PRESENT_OFFSET, 12942 },
+ { 0xfc10, G_UNICODE_NOT_PRESENT_OFFSET, 12947 },
+ { 0xfc11, G_UNICODE_NOT_PRESENT_OFFSET, 12952 },
+ { 0xfc12, G_UNICODE_NOT_PRESENT_OFFSET, 12957 },
+ { 0xfc13, G_UNICODE_NOT_PRESENT_OFFSET, 12962 },
+ { 0xfc14, G_UNICODE_NOT_PRESENT_OFFSET, 12967 },
+ { 0xfc15, G_UNICODE_NOT_PRESENT_OFFSET, 12972 },
+ { 0xfc16, G_UNICODE_NOT_PRESENT_OFFSET, 12977 },
+ { 0xfc17, G_UNICODE_NOT_PRESENT_OFFSET, 12982 },
+ { 0xfc18, G_UNICODE_NOT_PRESENT_OFFSET, 12987 },
+ { 0xfc19, G_UNICODE_NOT_PRESENT_OFFSET, 12992 },
+ { 0xfc1a, G_UNICODE_NOT_PRESENT_OFFSET, 12997 },
+ { 0xfc1b, G_UNICODE_NOT_PRESENT_OFFSET, 13002 },
+ { 0xfc1c, G_UNICODE_NOT_PRESENT_OFFSET, 13007 },
+ { 0xfc1d, G_UNICODE_NOT_PRESENT_OFFSET, 13012 },
+ { 0xfc1e, G_UNICODE_NOT_PRESENT_OFFSET, 13017 },
+ { 0xfc1f, G_UNICODE_NOT_PRESENT_OFFSET, 13022 },
+ { 0xfc20, G_UNICODE_NOT_PRESENT_OFFSET, 13027 },
+ { 0xfc21, G_UNICODE_NOT_PRESENT_OFFSET, 13032 },
+ { 0xfc22, G_UNICODE_NOT_PRESENT_OFFSET, 13037 },
+ { 0xfc23, G_UNICODE_NOT_PRESENT_OFFSET, 13042 },
+ { 0xfc24, G_UNICODE_NOT_PRESENT_OFFSET, 13047 },
+ { 0xfc25, G_UNICODE_NOT_PRESENT_OFFSET, 13052 },
+ { 0xfc26, G_UNICODE_NOT_PRESENT_OFFSET, 13057 },
+ { 0xfc27, G_UNICODE_NOT_PRESENT_OFFSET, 13062 },
+ { 0xfc28, G_UNICODE_NOT_PRESENT_OFFSET, 13067 },
+ { 0xfc29, G_UNICODE_NOT_PRESENT_OFFSET, 13072 },
+ { 0xfc2a, G_UNICODE_NOT_PRESENT_OFFSET, 13077 },
+ { 0xfc2b, G_UNICODE_NOT_PRESENT_OFFSET, 13082 },
+ { 0xfc2c, G_UNICODE_NOT_PRESENT_OFFSET, 13087 },
+ { 0xfc2d, G_UNICODE_NOT_PRESENT_OFFSET, 13092 },
+ { 0xfc2e, G_UNICODE_NOT_PRESENT_OFFSET, 13097 },
+ { 0xfc2f, G_UNICODE_NOT_PRESENT_OFFSET, 13102 },
+ { 0xfc30, G_UNICODE_NOT_PRESENT_OFFSET, 13107 },
+ { 0xfc31, G_UNICODE_NOT_PRESENT_OFFSET, 13112 },
+ { 0xfc32, G_UNICODE_NOT_PRESENT_OFFSET, 13117 },
+ { 0xfc33, G_UNICODE_NOT_PRESENT_OFFSET, 13122 },
+ { 0xfc34, G_UNICODE_NOT_PRESENT_OFFSET, 13127 },
+ { 0xfc35, G_UNICODE_NOT_PRESENT_OFFSET, 13132 },
+ { 0xfc36, G_UNICODE_NOT_PRESENT_OFFSET, 13137 },
+ { 0xfc37, G_UNICODE_NOT_PRESENT_OFFSET, 13142 },
+ { 0xfc38, G_UNICODE_NOT_PRESENT_OFFSET, 13147 },
+ { 0xfc39, G_UNICODE_NOT_PRESENT_OFFSET, 13152 },
+ { 0xfc3a, G_UNICODE_NOT_PRESENT_OFFSET, 13157 },
+ { 0xfc3b, G_UNICODE_NOT_PRESENT_OFFSET, 13162 },
+ { 0xfc3c, G_UNICODE_NOT_PRESENT_OFFSET, 13167 },
+ { 0xfc3d, G_UNICODE_NOT_PRESENT_OFFSET, 13172 },
+ { 0xfc3e, G_UNICODE_NOT_PRESENT_OFFSET, 13177 },
+ { 0xfc3f, G_UNICODE_NOT_PRESENT_OFFSET, 13182 },
+ { 0xfc40, G_UNICODE_NOT_PRESENT_OFFSET, 13187 },
+ { 0xfc41, G_UNICODE_NOT_PRESENT_OFFSET, 13192 },
+ { 0xfc42, G_UNICODE_NOT_PRESENT_OFFSET, 13197 },
+ { 0xfc43, G_UNICODE_NOT_PRESENT_OFFSET, 13202 },
+ { 0xfc44, G_UNICODE_NOT_PRESENT_OFFSET, 13207 },
+ { 0xfc45, G_UNICODE_NOT_PRESENT_OFFSET, 13212 },
+ { 0xfc46, G_UNICODE_NOT_PRESENT_OFFSET, 13217 },
+ { 0xfc47, G_UNICODE_NOT_PRESENT_OFFSET, 13222 },
+ { 0xfc48, G_UNICODE_NOT_PRESENT_OFFSET, 13227 },
+ { 0xfc49, G_UNICODE_NOT_PRESENT_OFFSET, 13232 },
+ { 0xfc4a, G_UNICODE_NOT_PRESENT_OFFSET, 13237 },
+ { 0xfc4b, G_UNICODE_NOT_PRESENT_OFFSET, 13242 },
+ { 0xfc4c, G_UNICODE_NOT_PRESENT_OFFSET, 13247 },
+ { 0xfc4d, G_UNICODE_NOT_PRESENT_OFFSET, 13252 },
+ { 0xfc4e, G_UNICODE_NOT_PRESENT_OFFSET, 13257 },
+ { 0xfc4f, G_UNICODE_NOT_PRESENT_OFFSET, 13262 },
+ { 0xfc50, G_UNICODE_NOT_PRESENT_OFFSET, 13267 },
+ { 0xfc51, G_UNICODE_NOT_PRESENT_OFFSET, 13272 },
+ { 0xfc52, G_UNICODE_NOT_PRESENT_OFFSET, 13277 },
+ { 0xfc53, G_UNICODE_NOT_PRESENT_OFFSET, 13282 },
+ { 0xfc54, G_UNICODE_NOT_PRESENT_OFFSET, 13287 },
+ { 0xfc55, G_UNICODE_NOT_PRESENT_OFFSET, 13292 },
+ { 0xfc56, G_UNICODE_NOT_PRESENT_OFFSET, 13297 },
+ { 0xfc57, G_UNICODE_NOT_PRESENT_OFFSET, 13302 },
+ { 0xfc58, G_UNICODE_NOT_PRESENT_OFFSET, 13307 },
+ { 0xfc59, G_UNICODE_NOT_PRESENT_OFFSET, 13312 },
+ { 0xfc5a, G_UNICODE_NOT_PRESENT_OFFSET, 13317 },
+ { 0xfc5b, G_UNICODE_NOT_PRESENT_OFFSET, 13322 },
+ { 0xfc5c, G_UNICODE_NOT_PRESENT_OFFSET, 13327 },
+ { 0xfc5d, G_UNICODE_NOT_PRESENT_OFFSET, 13332 },
+ { 0xfc5e, G_UNICODE_NOT_PRESENT_OFFSET, 13337 },
+ { 0xfc5f, G_UNICODE_NOT_PRESENT_OFFSET, 13343 },
+ { 0xfc60, G_UNICODE_NOT_PRESENT_OFFSET, 13349 },
+ { 0xfc61, G_UNICODE_NOT_PRESENT_OFFSET, 13355 },
+ { 0xfc62, G_UNICODE_NOT_PRESENT_OFFSET, 13361 },
+ { 0xfc63, G_UNICODE_NOT_PRESENT_OFFSET, 13367 },
+ { 0xfc64, G_UNICODE_NOT_PRESENT_OFFSET, 13373 },
+ { 0xfc65, G_UNICODE_NOT_PRESENT_OFFSET, 13380 },
+ { 0xfc66, G_UNICODE_NOT_PRESENT_OFFSET, 12878 },
+ { 0xfc67, G_UNICODE_NOT_PRESENT_OFFSET, 13387 },
+ { 0xfc68, G_UNICODE_NOT_PRESENT_OFFSET, 12854 },
+ { 0xfc69, G_UNICODE_NOT_PRESENT_OFFSET, 12885 },
+ { 0xfc6a, G_UNICODE_NOT_PRESENT_OFFSET, 13394 },
+ { 0xfc6b, G_UNICODE_NOT_PRESENT_OFFSET, 13399 },
+ { 0xfc6c, G_UNICODE_NOT_PRESENT_OFFSET, 12907 },
+ { 0xfc6d, G_UNICODE_NOT_PRESENT_OFFSET, 13404 },
+ { 0xfc6e, G_UNICODE_NOT_PRESENT_OFFSET, 12912 },
+ { 0xfc6f, G_UNICODE_NOT_PRESENT_OFFSET, 12917 },
+ { 0xfc70, G_UNICODE_NOT_PRESENT_OFFSET, 13409 },
+ { 0xfc71, G_UNICODE_NOT_PRESENT_OFFSET, 13414 },
+ { 0xfc72, G_UNICODE_NOT_PRESENT_OFFSET, 12937 },
+ { 0xfc73, G_UNICODE_NOT_PRESENT_OFFSET, 13419 },
+ { 0xfc74, G_UNICODE_NOT_PRESENT_OFFSET, 12942 },
+ { 0xfc75, G_UNICODE_NOT_PRESENT_OFFSET, 12947 },
+ { 0xfc76, G_UNICODE_NOT_PRESENT_OFFSET, 13424 },
+ { 0xfc77, G_UNICODE_NOT_PRESENT_OFFSET, 13429 },
+ { 0xfc78, G_UNICODE_NOT_PRESENT_OFFSET, 12957 },
+ { 0xfc79, G_UNICODE_NOT_PRESENT_OFFSET, 13434 },
+ { 0xfc7a, G_UNICODE_NOT_PRESENT_OFFSET, 12962 },
+ { 0xfc7b, G_UNICODE_NOT_PRESENT_OFFSET, 12967 },
+ { 0xfc7c, G_UNICODE_NOT_PRESENT_OFFSET, 13112 },
+ { 0xfc7d, G_UNICODE_NOT_PRESENT_OFFSET, 13117 },
+ { 0xfc7e, G_UNICODE_NOT_PRESENT_OFFSET, 13132 },
+ { 0xfc7f, G_UNICODE_NOT_PRESENT_OFFSET, 13137 },
+ { 0xfc80, G_UNICODE_NOT_PRESENT_OFFSET, 13142 },
+ { 0xfc81, G_UNICODE_NOT_PRESENT_OFFSET, 13162 },
+ { 0xfc82, G_UNICODE_NOT_PRESENT_OFFSET, 13167 },
+ { 0xfc83, G_UNICODE_NOT_PRESENT_OFFSET, 13172 },
+ { 0xfc84, G_UNICODE_NOT_PRESENT_OFFSET, 13177 },
+ { 0xfc85, G_UNICODE_NOT_PRESENT_OFFSET, 13197 },
+ { 0xfc86, G_UNICODE_NOT_PRESENT_OFFSET, 13202 },
+ { 0xfc87, G_UNICODE_NOT_PRESENT_OFFSET, 13207 },
+ { 0xfc88, G_UNICODE_NOT_PRESENT_OFFSET, 13439 },
+ { 0xfc89, G_UNICODE_NOT_PRESENT_OFFSET, 13227 },
+ { 0xfc8a, G_UNICODE_NOT_PRESENT_OFFSET, 13444 },
+ { 0xfc8b, G_UNICODE_NOT_PRESENT_OFFSET, 13449 },
+ { 0xfc8c, G_UNICODE_NOT_PRESENT_OFFSET, 13257 },
+ { 0xfc8d, G_UNICODE_NOT_PRESENT_OFFSET, 13454 },
+ { 0xfc8e, G_UNICODE_NOT_PRESENT_OFFSET, 13262 },
+ { 0xfc8f, G_UNICODE_NOT_PRESENT_OFFSET, 13267 },
+ { 0xfc90, G_UNICODE_NOT_PRESENT_OFFSET, 13332 },
+ { 0xfc91, G_UNICODE_NOT_PRESENT_OFFSET, 13459 },
+ { 0xfc92, G_UNICODE_NOT_PRESENT_OFFSET, 13464 },
+ { 0xfc93, G_UNICODE_NOT_PRESENT_OFFSET, 13307 },
+ { 0xfc94, G_UNICODE_NOT_PRESENT_OFFSET, 13469 },
+ { 0xfc95, G_UNICODE_NOT_PRESENT_OFFSET, 13312 },
+ { 0xfc96, G_UNICODE_NOT_PRESENT_OFFSET, 13317 },
+ { 0xfc97, G_UNICODE_NOT_PRESENT_OFFSET, 12864 },
+ { 0xfc98, G_UNICODE_NOT_PRESENT_OFFSET, 12871 },
+ { 0xfc99, G_UNICODE_NOT_PRESENT_OFFSET, 13474 },
+ { 0xfc9a, G_UNICODE_NOT_PRESENT_OFFSET, 12878 },
+ { 0xfc9b, G_UNICODE_NOT_PRESENT_OFFSET, 13481 },
+ { 0xfc9c, G_UNICODE_NOT_PRESENT_OFFSET, 12892 },
+ { 0xfc9d, G_UNICODE_NOT_PRESENT_OFFSET, 12897 },
+ { 0xfc9e, G_UNICODE_NOT_PRESENT_OFFSET, 12902 },
+ { 0xfc9f, G_UNICODE_NOT_PRESENT_OFFSET, 12907 },
+ { 0xfca0, G_UNICODE_NOT_PRESENT_OFFSET, 13488 },
+ { 0xfca1, G_UNICODE_NOT_PRESENT_OFFSET, 12922 },
+ { 0xfca2, G_UNICODE_NOT_PRESENT_OFFSET, 12927 },
+ { 0xfca3, G_UNICODE_NOT_PRESENT_OFFSET, 12932 },
+ { 0xfca4, G_UNICODE_NOT_PRESENT_OFFSET, 12937 },
+ { 0xfca5, G_UNICODE_NOT_PRESENT_OFFSET, 13493 },
+ { 0xfca6, G_UNICODE_NOT_PRESENT_OFFSET, 12957 },
+ { 0xfca7, G_UNICODE_NOT_PRESENT_OFFSET, 12972 },
+ { 0xfca8, G_UNICODE_NOT_PRESENT_OFFSET, 12977 },
+ { 0xfca9, G_UNICODE_NOT_PRESENT_OFFSET, 12982 },
+ { 0xfcaa, G_UNICODE_NOT_PRESENT_OFFSET, 12987 },
+ { 0xfcab, G_UNICODE_NOT_PRESENT_OFFSET, 12992 },
+ { 0xfcac, G_UNICODE_NOT_PRESENT_OFFSET, 13002 },
+ { 0xfcad, G_UNICODE_NOT_PRESENT_OFFSET, 13007 },
+ { 0xfcae, G_UNICODE_NOT_PRESENT_OFFSET, 13012 },
+ { 0xfcaf, G_UNICODE_NOT_PRESENT_OFFSET, 13017 },
+ { 0xfcb0, G_UNICODE_NOT_PRESENT_OFFSET, 13022 },
+ { 0xfcb1, G_UNICODE_NOT_PRESENT_OFFSET, 13027 },
+ { 0xfcb2, G_UNICODE_NOT_PRESENT_OFFSET, 13498 },
+ { 0xfcb3, G_UNICODE_NOT_PRESENT_OFFSET, 13032 },
+ { 0xfcb4, G_UNICODE_NOT_PRESENT_OFFSET, 13037 },
+ { 0xfcb5, G_UNICODE_NOT_PRESENT_OFFSET, 13042 },
+ { 0xfcb6, G_UNICODE_NOT_PRESENT_OFFSET, 13047 },
+ { 0xfcb7, G_UNICODE_NOT_PRESENT_OFFSET, 13052 },
+ { 0xfcb8, G_UNICODE_NOT_PRESENT_OFFSET, 13057 },
+ { 0xfcb9, G_UNICODE_NOT_PRESENT_OFFSET, 13067 },
+ { 0xfcba, G_UNICODE_NOT_PRESENT_OFFSET, 13072 },
+ { 0xfcbb, G_UNICODE_NOT_PRESENT_OFFSET, 13077 },
+ { 0xfcbc, G_UNICODE_NOT_PRESENT_OFFSET, 13082 },
+ { 0xfcbd, G_UNICODE_NOT_PRESENT_OFFSET, 13087 },
+ { 0xfcbe, G_UNICODE_NOT_PRESENT_OFFSET, 13092 },
+ { 0xfcbf, G_UNICODE_NOT_PRESENT_OFFSET, 13097 },
+ { 0xfcc0, G_UNICODE_NOT_PRESENT_OFFSET, 13102 },
+ { 0xfcc1, G_UNICODE_NOT_PRESENT_OFFSET, 13107 },
+ { 0xfcc2, G_UNICODE_NOT_PRESENT_OFFSET, 13122 },
+ { 0xfcc3, G_UNICODE_NOT_PRESENT_OFFSET, 13127 },
+ { 0xfcc4, G_UNICODE_NOT_PRESENT_OFFSET, 13147 },
+ { 0xfcc5, G_UNICODE_NOT_PRESENT_OFFSET, 13152 },
+ { 0xfcc6, G_UNICODE_NOT_PRESENT_OFFSET, 13157 },
+ { 0xfcc7, G_UNICODE_NOT_PRESENT_OFFSET, 13162 },
+ { 0xfcc8, G_UNICODE_NOT_PRESENT_OFFSET, 13167 },
+ { 0xfcc9, G_UNICODE_NOT_PRESENT_OFFSET, 13182 },
+ { 0xfcca, G_UNICODE_NOT_PRESENT_OFFSET, 13187 },
+ { 0xfccb, G_UNICODE_NOT_PRESENT_OFFSET, 13192 },
+ { 0xfccc, G_UNICODE_NOT_PRESENT_OFFSET, 13197 },
+ { 0xfccd, G_UNICODE_NOT_PRESENT_OFFSET, 13503 },
+ { 0xfcce, G_UNICODE_NOT_PRESENT_OFFSET, 13212 },
+ { 0xfccf, G_UNICODE_NOT_PRESENT_OFFSET, 13217 },
+ { 0xfcd0, G_UNICODE_NOT_PRESENT_OFFSET, 13222 },
+ { 0xfcd1, G_UNICODE_NOT_PRESENT_OFFSET, 13227 },
+ { 0xfcd2, G_UNICODE_NOT_PRESENT_OFFSET, 13242 },
+ { 0xfcd3, G_UNICODE_NOT_PRESENT_OFFSET, 13247 },
+ { 0xfcd4, G_UNICODE_NOT_PRESENT_OFFSET, 13252 },
+ { 0xfcd5, G_UNICODE_NOT_PRESENT_OFFSET, 13257 },
+ { 0xfcd6, G_UNICODE_NOT_PRESENT_OFFSET, 13508 },
+ { 0xfcd7, G_UNICODE_NOT_PRESENT_OFFSET, 13272 },
+ { 0xfcd8, G_UNICODE_NOT_PRESENT_OFFSET, 13277 },
+ { 0xfcd9, G_UNICODE_NOT_PRESENT_OFFSET, 13513 },
+ { 0xfcda, G_UNICODE_NOT_PRESENT_OFFSET, 13292 },
+ { 0xfcdb, G_UNICODE_NOT_PRESENT_OFFSET, 13297 },
+ { 0xfcdc, G_UNICODE_NOT_PRESENT_OFFSET, 13302 },
+ { 0xfcdd, G_UNICODE_NOT_PRESENT_OFFSET, 13307 },
+ { 0xfcde, G_UNICODE_NOT_PRESENT_OFFSET, 13518 },
+ { 0xfcdf, G_UNICODE_NOT_PRESENT_OFFSET, 12878 },
+ { 0xfce0, G_UNICODE_NOT_PRESENT_OFFSET, 13481 },
+ { 0xfce1, G_UNICODE_NOT_PRESENT_OFFSET, 12907 },
+ { 0xfce2, G_UNICODE_NOT_PRESENT_OFFSET, 13488 },
+ { 0xfce3, G_UNICODE_NOT_PRESENT_OFFSET, 12937 },
+ { 0xfce4, G_UNICODE_NOT_PRESENT_OFFSET, 13493 },
+ { 0xfce5, G_UNICODE_NOT_PRESENT_OFFSET, 12957 },
+ { 0xfce6, G_UNICODE_NOT_PRESENT_OFFSET, 13523 },
+ { 0xfce7, G_UNICODE_NOT_PRESENT_OFFSET, 13022 },
+ { 0xfce8, G_UNICODE_NOT_PRESENT_OFFSET, 13528 },
+ { 0xfce9, G_UNICODE_NOT_PRESENT_OFFSET, 13533 },
+ { 0xfcea, G_UNICODE_NOT_PRESENT_OFFSET, 13538 },
+ { 0xfceb, G_UNICODE_NOT_PRESENT_OFFSET, 13162 },
+ { 0xfcec, G_UNICODE_NOT_PRESENT_OFFSET, 13167 },
+ { 0xfced, G_UNICODE_NOT_PRESENT_OFFSET, 13197 },
+ { 0xfcee, G_UNICODE_NOT_PRESENT_OFFSET, 13257 },
+ { 0xfcef, G_UNICODE_NOT_PRESENT_OFFSET, 13508 },
+ { 0xfcf0, G_UNICODE_NOT_PRESENT_OFFSET, 13307 },
+ { 0xfcf1, G_UNICODE_NOT_PRESENT_OFFSET, 13518 },
+ { 0xfcf2, G_UNICODE_NOT_PRESENT_OFFSET, 13543 },
+ { 0xfcf3, G_UNICODE_NOT_PRESENT_OFFSET, 13550 },
+ { 0xfcf4, G_UNICODE_NOT_PRESENT_OFFSET, 13557 },
+ { 0xfcf5, G_UNICODE_NOT_PRESENT_OFFSET, 13564 },
+ { 0xfcf6, G_UNICODE_NOT_PRESENT_OFFSET, 13569 },
+ { 0xfcf7, G_UNICODE_NOT_PRESENT_OFFSET, 13574 },
+ { 0xfcf8, G_UNICODE_NOT_PRESENT_OFFSET, 13579 },
+ { 0xfcf9, G_UNICODE_NOT_PRESENT_OFFSET, 13584 },
+ { 0xfcfa, G_UNICODE_NOT_PRESENT_OFFSET, 13589 },
+ { 0xfcfb, G_UNICODE_NOT_PRESENT_OFFSET, 13594 },
+ { 0xfcfc, G_UNICODE_NOT_PRESENT_OFFSET, 13599 },
+ { 0xfcfd, G_UNICODE_NOT_PRESENT_OFFSET, 13604 },
+ { 0xfcfe, G_UNICODE_NOT_PRESENT_OFFSET, 13609 },
+ { 0xfcff, G_UNICODE_NOT_PRESENT_OFFSET, 13614 },
+ { 0xfd00, G_UNICODE_NOT_PRESENT_OFFSET, 13619 },
+ { 0xfd01, G_UNICODE_NOT_PRESENT_OFFSET, 13624 },
+ { 0xfd02, G_UNICODE_NOT_PRESENT_OFFSET, 13629 },
+ { 0xfd03, G_UNICODE_NOT_PRESENT_OFFSET, 13634 },
+ { 0xfd04, G_UNICODE_NOT_PRESENT_OFFSET, 13639 },
+ { 0xfd05, G_UNICODE_NOT_PRESENT_OFFSET, 13644 },
+ { 0xfd06, G_UNICODE_NOT_PRESENT_OFFSET, 13649 },
+ { 0xfd07, G_UNICODE_NOT_PRESENT_OFFSET, 13654 },
+ { 0xfd08, G_UNICODE_NOT_PRESENT_OFFSET, 13659 },
+ { 0xfd09, G_UNICODE_NOT_PRESENT_OFFSET, 13664 },
+ { 0xfd0a, G_UNICODE_NOT_PRESENT_OFFSET, 13669 },
+ { 0xfd0b, G_UNICODE_NOT_PRESENT_OFFSET, 13674 },
+ { 0xfd0c, G_UNICODE_NOT_PRESENT_OFFSET, 13533 },
+ { 0xfd0d, G_UNICODE_NOT_PRESENT_OFFSET, 13679 },
+ { 0xfd0e, G_UNICODE_NOT_PRESENT_OFFSET, 13684 },
+ { 0xfd0f, G_UNICODE_NOT_PRESENT_OFFSET, 13689 },
+ { 0xfd10, G_UNICODE_NOT_PRESENT_OFFSET, 13694 },
+ { 0xfd11, G_UNICODE_NOT_PRESENT_OFFSET, 13564 },
+ { 0xfd12, G_UNICODE_NOT_PRESENT_OFFSET, 13569 },
+ { 0xfd13, G_UNICODE_NOT_PRESENT_OFFSET, 13574 },
+ { 0xfd14, G_UNICODE_NOT_PRESENT_OFFSET, 13579 },
+ { 0xfd15, G_UNICODE_NOT_PRESENT_OFFSET, 13584 },
+ { 0xfd16, G_UNICODE_NOT_PRESENT_OFFSET, 13589 },
+ { 0xfd17, G_UNICODE_NOT_PRESENT_OFFSET, 13594 },
+ { 0xfd18, G_UNICODE_NOT_PRESENT_OFFSET, 13599 },
+ { 0xfd19, G_UNICODE_NOT_PRESENT_OFFSET, 13604 },
+ { 0xfd1a, G_UNICODE_NOT_PRESENT_OFFSET, 13609 },
+ { 0xfd1b, G_UNICODE_NOT_PRESENT_OFFSET, 13614 },
+ { 0xfd1c, G_UNICODE_NOT_PRESENT_OFFSET, 13619 },
+ { 0xfd1d, G_UNICODE_NOT_PRESENT_OFFSET, 13624 },
+ { 0xfd1e, G_UNICODE_NOT_PRESENT_OFFSET, 13629 },
+ { 0xfd1f, G_UNICODE_NOT_PRESENT_OFFSET, 13634 },
+ { 0xfd20, G_UNICODE_NOT_PRESENT_OFFSET, 13639 },
+ { 0xfd21, G_UNICODE_NOT_PRESENT_OFFSET, 13644 },
+ { 0xfd22, G_UNICODE_NOT_PRESENT_OFFSET, 13649 },
+ { 0xfd23, G_UNICODE_NOT_PRESENT_OFFSET, 13654 },
+ { 0xfd24, G_UNICODE_NOT_PRESENT_OFFSET, 13659 },
+ { 0xfd25, G_UNICODE_NOT_PRESENT_OFFSET, 13664 },
+ { 0xfd26, G_UNICODE_NOT_PRESENT_OFFSET, 13669 },
+ { 0xfd27, G_UNICODE_NOT_PRESENT_OFFSET, 13674 },
+ { 0xfd28, G_UNICODE_NOT_PRESENT_OFFSET, 13533 },
+ { 0xfd29, G_UNICODE_NOT_PRESENT_OFFSET, 13679 },
+ { 0xfd2a, G_UNICODE_NOT_PRESENT_OFFSET, 13684 },
+ { 0xfd2b, G_UNICODE_NOT_PRESENT_OFFSET, 13689 },
+ { 0xfd2c, G_UNICODE_NOT_PRESENT_OFFSET, 13694 },
+ { 0xfd2d, G_UNICODE_NOT_PRESENT_OFFSET, 13664 },
+ { 0xfd2e, G_UNICODE_NOT_PRESENT_OFFSET, 13669 },
+ { 0xfd2f, G_UNICODE_NOT_PRESENT_OFFSET, 13674 },
+ { 0xfd30, G_UNICODE_NOT_PRESENT_OFFSET, 13533 },
+ { 0xfd31, G_UNICODE_NOT_PRESENT_OFFSET, 13528 },
+ { 0xfd32, G_UNICODE_NOT_PRESENT_OFFSET, 13538 },
+ { 0xfd33, G_UNICODE_NOT_PRESENT_OFFSET, 13062 },
+ { 0xfd34, G_UNICODE_NOT_PRESENT_OFFSET, 13007 },
+ { 0xfd35, G_UNICODE_NOT_PRESENT_OFFSET, 13012 },
+ { 0xfd36, G_UNICODE_NOT_PRESENT_OFFSET, 13017 },
+ { 0xfd37, G_UNICODE_NOT_PRESENT_OFFSET, 13664 },
+ { 0xfd38, G_UNICODE_NOT_PRESENT_OFFSET, 13669 },
+ { 0xfd39, G_UNICODE_NOT_PRESENT_OFFSET, 13674 },
+ { 0xfd3a, G_UNICODE_NOT_PRESENT_OFFSET, 13062 },
+ { 0xfd3b, G_UNICODE_NOT_PRESENT_OFFSET, 13067 },
+ { 0xfd3c, G_UNICODE_NOT_PRESENT_OFFSET, 13699 },
+ { 0xfd3d, G_UNICODE_NOT_PRESENT_OFFSET, 13699 },
+ { 0xfd50, G_UNICODE_NOT_PRESENT_OFFSET, 13704 },
+ { 0xfd51, G_UNICODE_NOT_PRESENT_OFFSET, 13711 },
+ { 0xfd52, G_UNICODE_NOT_PRESENT_OFFSET, 13711 },
+ { 0xfd53, G_UNICODE_NOT_PRESENT_OFFSET, 13718 },
+ { 0xfd54, G_UNICODE_NOT_PRESENT_OFFSET, 13725 },
+ { 0xfd55, G_UNICODE_NOT_PRESENT_OFFSET, 13732 },
+ { 0xfd56, G_UNICODE_NOT_PRESENT_OFFSET, 13739 },
+ { 0xfd57, G_UNICODE_NOT_PRESENT_OFFSET, 13746 },
+ { 0xfd58, G_UNICODE_NOT_PRESENT_OFFSET, 13753 },
+ { 0xfd59, G_UNICODE_NOT_PRESENT_OFFSET, 13753 },
+ { 0xfd5a, G_UNICODE_NOT_PRESENT_OFFSET, 13760 },
+ { 0xfd5b, G_UNICODE_NOT_PRESENT_OFFSET, 13767 },
+ { 0xfd5c, G_UNICODE_NOT_PRESENT_OFFSET, 13774 },
+ { 0xfd5d, G_UNICODE_NOT_PRESENT_OFFSET, 13781 },
+ { 0xfd5e, G_UNICODE_NOT_PRESENT_OFFSET, 13788 },
+ { 0xfd5f, G_UNICODE_NOT_PRESENT_OFFSET, 13795 },
+ { 0xfd60, G_UNICODE_NOT_PRESENT_OFFSET, 13795 },
+ { 0xfd61, G_UNICODE_NOT_PRESENT_OFFSET, 13802 },
+ { 0xfd62, G_UNICODE_NOT_PRESENT_OFFSET, 13809 },
+ { 0xfd63, G_UNICODE_NOT_PRESENT_OFFSET, 13809 },
+ { 0xfd64, G_UNICODE_NOT_PRESENT_OFFSET, 13816 },
+ { 0xfd65, G_UNICODE_NOT_PRESENT_OFFSET, 13816 },
+ { 0xfd66, G_UNICODE_NOT_PRESENT_OFFSET, 13823 },
+ { 0xfd67, G_UNICODE_NOT_PRESENT_OFFSET, 13830 },
+ { 0xfd68, G_UNICODE_NOT_PRESENT_OFFSET, 13830 },
+ { 0xfd69, G_UNICODE_NOT_PRESENT_OFFSET, 13837 },
+ { 0xfd6a, G_UNICODE_NOT_PRESENT_OFFSET, 13844 },
+ { 0xfd6b, G_UNICODE_NOT_PRESENT_OFFSET, 13844 },
+ { 0xfd6c, G_UNICODE_NOT_PRESENT_OFFSET, 13851 },
+ { 0xfd6d, G_UNICODE_NOT_PRESENT_OFFSET, 13851 },
+ { 0xfd6e, G_UNICODE_NOT_PRESENT_OFFSET, 13858 },
+ { 0xfd6f, G_UNICODE_NOT_PRESENT_OFFSET, 13865 },
+ { 0xfd70, G_UNICODE_NOT_PRESENT_OFFSET, 13865 },
+ { 0xfd71, G_UNICODE_NOT_PRESENT_OFFSET, 13872 },
+ { 0xfd72, G_UNICODE_NOT_PRESENT_OFFSET, 13872 },
+ { 0xfd73, G_UNICODE_NOT_PRESENT_OFFSET, 13879 },
+ { 0xfd74, G_UNICODE_NOT_PRESENT_OFFSET, 13886 },
+ { 0xfd75, G_UNICODE_NOT_PRESENT_OFFSET, 13893 },
+ { 0xfd76, G_UNICODE_NOT_PRESENT_OFFSET, 13900 },
+ { 0xfd77, G_UNICODE_NOT_PRESENT_OFFSET, 13900 },
+ { 0xfd78, G_UNICODE_NOT_PRESENT_OFFSET, 13907 },
+ { 0xfd79, G_UNICODE_NOT_PRESENT_OFFSET, 13914 },
+ { 0xfd7a, G_UNICODE_NOT_PRESENT_OFFSET, 13921 },
+ { 0xfd7b, G_UNICODE_NOT_PRESENT_OFFSET, 13928 },
+ { 0xfd7c, G_UNICODE_NOT_PRESENT_OFFSET, 13935 },
+ { 0xfd7d, G_UNICODE_NOT_PRESENT_OFFSET, 13935 },
+ { 0xfd7e, G_UNICODE_NOT_PRESENT_OFFSET, 13942 },
+ { 0xfd7f, G_UNICODE_NOT_PRESENT_OFFSET, 13949 },
+ { 0xfd80, G_UNICODE_NOT_PRESENT_OFFSET, 13956 },
+ { 0xfd81, G_UNICODE_NOT_PRESENT_OFFSET, 13963 },
+ { 0xfd82, G_UNICODE_NOT_PRESENT_OFFSET, 13970 },
+ { 0xfd83, G_UNICODE_NOT_PRESENT_OFFSET, 13977 },
+ { 0xfd84, G_UNICODE_NOT_PRESENT_OFFSET, 13977 },
+ { 0xfd85, G_UNICODE_NOT_PRESENT_OFFSET, 13984 },
+ { 0xfd86, G_UNICODE_NOT_PRESENT_OFFSET, 13984 },
+ { 0xfd87, G_UNICODE_NOT_PRESENT_OFFSET, 13991 },
+ { 0xfd88, G_UNICODE_NOT_PRESENT_OFFSET, 13991 },
+ { 0xfd89, G_UNICODE_NOT_PRESENT_OFFSET, 13998 },
+ { 0xfd8a, G_UNICODE_NOT_PRESENT_OFFSET, 14005 },
+ { 0xfd8b, G_UNICODE_NOT_PRESENT_OFFSET, 14012 },
+ { 0xfd8c, G_UNICODE_NOT_PRESENT_OFFSET, 14019 },
+ { 0xfd8d, G_UNICODE_NOT_PRESENT_OFFSET, 14026 },
+ { 0xfd8e, G_UNICODE_NOT_PRESENT_OFFSET, 14033 },
+ { 0xfd8f, G_UNICODE_NOT_PRESENT_OFFSET, 14040 },
+ { 0xfd92, G_UNICODE_NOT_PRESENT_OFFSET, 14047 },
+ { 0xfd93, G_UNICODE_NOT_PRESENT_OFFSET, 14054 },
+ { 0xfd94, G_UNICODE_NOT_PRESENT_OFFSET, 14061 },
+ { 0xfd95, G_UNICODE_NOT_PRESENT_OFFSET, 14068 },
+ { 0xfd96, G_UNICODE_NOT_PRESENT_OFFSET, 14075 },
+ { 0xfd97, G_UNICODE_NOT_PRESENT_OFFSET, 14082 },
+ { 0xfd98, G_UNICODE_NOT_PRESENT_OFFSET, 14082 },
+ { 0xfd99, G_UNICODE_NOT_PRESENT_OFFSET, 14089 },
+ { 0xfd9a, G_UNICODE_NOT_PRESENT_OFFSET, 14096 },
+ { 0xfd9b, G_UNICODE_NOT_PRESENT_OFFSET, 14103 },
+ { 0xfd9c, G_UNICODE_NOT_PRESENT_OFFSET, 14110 },
+ { 0xfd9d, G_UNICODE_NOT_PRESENT_OFFSET, 14110 },
+ { 0xfd9e, G_UNICODE_NOT_PRESENT_OFFSET, 14117 },
+ { 0xfd9f, G_UNICODE_NOT_PRESENT_OFFSET, 14124 },
+ { 0xfda0, G_UNICODE_NOT_PRESENT_OFFSET, 14131 },
+ { 0xfda1, G_UNICODE_NOT_PRESENT_OFFSET, 14138 },
+ { 0xfda2, G_UNICODE_NOT_PRESENT_OFFSET, 14145 },
+ { 0xfda3, G_UNICODE_NOT_PRESENT_OFFSET, 14152 },
+ { 0xfda4, G_UNICODE_NOT_PRESENT_OFFSET, 14159 },
+ { 0xfda5, G_UNICODE_NOT_PRESENT_OFFSET, 14166 },
+ { 0xfda6, G_UNICODE_NOT_PRESENT_OFFSET, 14173 },
+ { 0xfda7, G_UNICODE_NOT_PRESENT_OFFSET, 14180 },
+ { 0xfda8, G_UNICODE_NOT_PRESENT_OFFSET, 14187 },
+ { 0xfda9, G_UNICODE_NOT_PRESENT_OFFSET, 14194 },
+ { 0xfdaa, G_UNICODE_NOT_PRESENT_OFFSET, 14201 },
+ { 0xfdab, G_UNICODE_NOT_PRESENT_OFFSET, 14208 },
+ { 0xfdac, G_UNICODE_NOT_PRESENT_OFFSET, 14215 },
+ { 0xfdad, G_UNICODE_NOT_PRESENT_OFFSET, 14222 },
+ { 0xfdae, G_UNICODE_NOT_PRESENT_OFFSET, 14229 },
+ { 0xfdaf, G_UNICODE_NOT_PRESENT_OFFSET, 14236 },
+ { 0xfdb0, G_UNICODE_NOT_PRESENT_OFFSET, 14243 },
+ { 0xfdb1, G_UNICODE_NOT_PRESENT_OFFSET, 14250 },
+ { 0xfdb2, G_UNICODE_NOT_PRESENT_OFFSET, 14257 },
+ { 0xfdb3, G_UNICODE_NOT_PRESENT_OFFSET, 14264 },
+ { 0xfdb4, G_UNICODE_NOT_PRESENT_OFFSET, 13942 },
+ { 0xfdb5, G_UNICODE_NOT_PRESENT_OFFSET, 13956 },
+ { 0xfdb6, G_UNICODE_NOT_PRESENT_OFFSET, 14271 },
+ { 0xfdb7, G_UNICODE_NOT_PRESENT_OFFSET, 14278 },
+ { 0xfdb8, G_UNICODE_NOT_PRESENT_OFFSET, 14285 },
+ { 0xfdb9, G_UNICODE_NOT_PRESENT_OFFSET, 14292 },
+ { 0xfdba, G_UNICODE_NOT_PRESENT_OFFSET, 14299 },
+ { 0xfdbb, G_UNICODE_NOT_PRESENT_OFFSET, 14306 },
+ { 0xfdbc, G_UNICODE_NOT_PRESENT_OFFSET, 14299 },
+ { 0xfdbd, G_UNICODE_NOT_PRESENT_OFFSET, 14285 },
+ { 0xfdbe, G_UNICODE_NOT_PRESENT_OFFSET, 14313 },
+ { 0xfdbf, G_UNICODE_NOT_PRESENT_OFFSET, 14320 },
+ { 0xfdc0, G_UNICODE_NOT_PRESENT_OFFSET, 14327 },
+ { 0xfdc1, G_UNICODE_NOT_PRESENT_OFFSET, 14334 },
+ { 0xfdc2, G_UNICODE_NOT_PRESENT_OFFSET, 14341 },
+ { 0xfdc3, G_UNICODE_NOT_PRESENT_OFFSET, 14306 },
+ { 0xfdc4, G_UNICODE_NOT_PRESENT_OFFSET, 13893 },
+ { 0xfdc5, G_UNICODE_NOT_PRESENT_OFFSET, 13823 },
+ { 0xfdc6, G_UNICODE_NOT_PRESENT_OFFSET, 14348 },
+ { 0xfdc7, G_UNICODE_NOT_PRESENT_OFFSET, 14355 },
+ { 0xfdf0, G_UNICODE_NOT_PRESENT_OFFSET, 14362 },
+ { 0xfdf1, G_UNICODE_NOT_PRESENT_OFFSET, 14369 },
+ { 0xfdf2, G_UNICODE_NOT_PRESENT_OFFSET, 14376 },
+ { 0xfdf3, G_UNICODE_NOT_PRESENT_OFFSET, 14385 },
+ { 0xfdf4, G_UNICODE_NOT_PRESENT_OFFSET, 14394 },
+ { 0xfdf5, G_UNICODE_NOT_PRESENT_OFFSET, 14403 },
+ { 0xfdf6, G_UNICODE_NOT_PRESENT_OFFSET, 14412 },
+ { 0xfdf7, G_UNICODE_NOT_PRESENT_OFFSET, 14421 },
+ { 0xfdf8, G_UNICODE_NOT_PRESENT_OFFSET, 14430 },
+ { 0xfdf9, G_UNICODE_NOT_PRESENT_OFFSET, 14439 },
+ { 0xfdfa, G_UNICODE_NOT_PRESENT_OFFSET, 14446 },
+ { 0xfdfb, G_UNICODE_NOT_PRESENT_OFFSET, 14480 },
+ { 0xfdfc, G_UNICODE_NOT_PRESENT_OFFSET, 14496 },
+ { 0xfe10, G_UNICODE_NOT_PRESENT_OFFSET, 14505 },
+ { 0xfe11, G_UNICODE_NOT_PRESENT_OFFSET, 14507 },
+ { 0xfe12, G_UNICODE_NOT_PRESENT_OFFSET, 14511 },
+ { 0xfe13, G_UNICODE_NOT_PRESENT_OFFSET, 14515 },
+ { 0xfe14, G_UNICODE_NOT_PRESENT_OFFSET, 1248 },
+ { 0xfe15, G_UNICODE_NOT_PRESENT_OFFSET, 14517 },
+ { 0xfe16, G_UNICODE_NOT_PRESENT_OFFSET, 14519 },
+ { 0xfe17, G_UNICODE_NOT_PRESENT_OFFSET, 14521 },
+ { 0xfe18, G_UNICODE_NOT_PRESENT_OFFSET, 14525 },
+ { 0xfe19, G_UNICODE_NOT_PRESENT_OFFSET, 5186 },
+ { 0xfe30, G_UNICODE_NOT_PRESENT_OFFSET, 5183 },
+ { 0xfe31, G_UNICODE_NOT_PRESENT_OFFSET, 14529 },
+ { 0xfe32, G_UNICODE_NOT_PRESENT_OFFSET, 14533 },
+ { 0xfe33, G_UNICODE_NOT_PRESENT_OFFSET, 14537 },
+ { 0xfe34, G_UNICODE_NOT_PRESENT_OFFSET, 14537 },
+ { 0xfe35, G_UNICODE_NOT_PRESENT_OFFSET, 5275 },
+ { 0xfe36, G_UNICODE_NOT_PRESENT_OFFSET, 5277 },
+ { 0xfe37, G_UNICODE_NOT_PRESENT_OFFSET, 14539 },
+ { 0xfe38, G_UNICODE_NOT_PRESENT_OFFSET, 14541 },
+ { 0xfe39, G_UNICODE_NOT_PRESENT_OFFSET, 14543 },
+ { 0xfe3a, G_UNICODE_NOT_PRESENT_OFFSET, 14547 },
+ { 0xfe3b, G_UNICODE_NOT_PRESENT_OFFSET, 14551 },
+ { 0xfe3c, G_UNICODE_NOT_PRESENT_OFFSET, 14555 },
+ { 0xfe3d, G_UNICODE_NOT_PRESENT_OFFSET, 14559 },
+ { 0xfe3e, G_UNICODE_NOT_PRESENT_OFFSET, 14563 },
+ { 0xfe3f, G_UNICODE_NOT_PRESENT_OFFSET, 5801 },
+ { 0xfe40, G_UNICODE_NOT_PRESENT_OFFSET, 5805 },
+ { 0xfe41, G_UNICODE_NOT_PRESENT_OFFSET, 14567 },
+ { 0xfe42, G_UNICODE_NOT_PRESENT_OFFSET, 14571 },
+ { 0xfe43, G_UNICODE_NOT_PRESENT_OFFSET, 14575 },
+ { 0xfe44, G_UNICODE_NOT_PRESENT_OFFSET, 14579 },
+ { 0xfe47, G_UNICODE_NOT_PRESENT_OFFSET, 14583 },
+ { 0xfe48, G_UNICODE_NOT_PRESENT_OFFSET, 14585 },
+ { 0xfe49, G_UNICODE_NOT_PRESENT_OFFSET, 5227 },
+ { 0xfe4a, G_UNICODE_NOT_PRESENT_OFFSET, 5227 },
+ { 0xfe4b, G_UNICODE_NOT_PRESENT_OFFSET, 5227 },
+ { 0xfe4c, G_UNICODE_NOT_PRESENT_OFFSET, 5227 },
+ { 0xfe4d, G_UNICODE_NOT_PRESENT_OFFSET, 14537 },
+ { 0xfe4e, G_UNICODE_NOT_PRESENT_OFFSET, 14537 },
+ { 0xfe4f, G_UNICODE_NOT_PRESENT_OFFSET, 14537 },
+ { 0xfe50, G_UNICODE_NOT_PRESENT_OFFSET, 14505 },
+ { 0xfe51, G_UNICODE_NOT_PRESENT_OFFSET, 14507 },
+ { 0xfe52, G_UNICODE_NOT_PRESENT_OFFSET, 5181 },
+ { 0xfe54, G_UNICODE_NOT_PRESENT_OFFSET, 1248 },
+ { 0xfe55, G_UNICODE_NOT_PRESENT_OFFSET, 14515 },
+ { 0xfe56, G_UNICODE_NOT_PRESENT_OFFSET, 14519 },
+ { 0xfe57, G_UNICODE_NOT_PRESENT_OFFSET, 14517 },
+ { 0xfe58, G_UNICODE_NOT_PRESENT_OFFSET, 14529 },
+ { 0xfe59, G_UNICODE_NOT_PRESENT_OFFSET, 5275 },
+ { 0xfe5a, G_UNICODE_NOT_PRESENT_OFFSET, 5277 },
+ { 0xfe5b, G_UNICODE_NOT_PRESENT_OFFSET, 14539 },
+ { 0xfe5c, G_UNICODE_NOT_PRESENT_OFFSET, 14541 },
+ { 0xfe5d, G_UNICODE_NOT_PRESENT_OFFSET, 14543 },
+ { 0xfe5e, G_UNICODE_NOT_PRESENT_OFFSET, 14547 },
+ { 0xfe5f, G_UNICODE_NOT_PRESENT_OFFSET, 14587 },
+ { 0xfe60, G_UNICODE_NOT_PRESENT_OFFSET, 14589 },
+ { 0xfe61, G_UNICODE_NOT_PRESENT_OFFSET, 14591 },
+ { 0xfe62, G_UNICODE_NOT_PRESENT_OFFSET, 5267 },
+ { 0xfe63, G_UNICODE_NOT_PRESENT_OFFSET, 14593 },
+ { 0xfe64, G_UNICODE_NOT_PRESENT_OFFSET, 14595 },
+ { 0xfe65, G_UNICODE_NOT_PRESENT_OFFSET, 14597 },
+ { 0xfe66, G_UNICODE_NOT_PRESENT_OFFSET, 5273 },
+ { 0xfe68, G_UNICODE_NOT_PRESENT_OFFSET, 14599 },
+ { 0xfe69, G_UNICODE_NOT_PRESENT_OFFSET, 14601 },
+ { 0xfe6a, G_UNICODE_NOT_PRESENT_OFFSET, 14603 },
+ { 0xfe6b, G_UNICODE_NOT_PRESENT_OFFSET, 14605 },
+ { 0xfe70, G_UNICODE_NOT_PRESENT_OFFSET, 14607 },
+ { 0xfe71, G_UNICODE_NOT_PRESENT_OFFSET, 14611 },
+ { 0xfe72, G_UNICODE_NOT_PRESENT_OFFSET, 14616 },
+ { 0xfe74, G_UNICODE_NOT_PRESENT_OFFSET, 14620 },
+ { 0xfe76, G_UNICODE_NOT_PRESENT_OFFSET, 14624 },
+ { 0xfe77, G_UNICODE_NOT_PRESENT_OFFSET, 14628 },
+ { 0xfe78, G_UNICODE_NOT_PRESENT_OFFSET, 14633 },
+ { 0xfe79, G_UNICODE_NOT_PRESENT_OFFSET, 14637 },
+ { 0xfe7a, G_UNICODE_NOT_PRESENT_OFFSET, 14642 },
+ { 0xfe7b, G_UNICODE_NOT_PRESENT_OFFSET, 14646 },
+ { 0xfe7c, G_UNICODE_NOT_PRESENT_OFFSET, 14651 },
+ { 0xfe7d, G_UNICODE_NOT_PRESENT_OFFSET, 14655 },
+ { 0xfe7e, G_UNICODE_NOT_PRESENT_OFFSET, 14660 },
+ { 0xfe7f, G_UNICODE_NOT_PRESENT_OFFSET, 14664 },
+ { 0xfe80, G_UNICODE_NOT_PRESENT_OFFSET, 14669 },
+ { 0xfe81, G_UNICODE_NOT_PRESENT_OFFSET, 1676 },
+ { 0xfe82, G_UNICODE_NOT_PRESENT_OFFSET, 1676 },
+ { 0xfe83, G_UNICODE_NOT_PRESENT_OFFSET, 1681 },
+ { 0xfe84, G_UNICODE_NOT_PRESENT_OFFSET, 1681 },
+ { 0xfe85, G_UNICODE_NOT_PRESENT_OFFSET, 1686 },
+ { 0xfe86, G_UNICODE_NOT_PRESENT_OFFSET, 1686 },
+ { 0xfe87, G_UNICODE_NOT_PRESENT_OFFSET, 1691 },
+ { 0xfe88, G_UNICODE_NOT_PRESENT_OFFSET, 1691 },
+ { 0xfe89, G_UNICODE_NOT_PRESENT_OFFSET, 1696 },
+ { 0xfe8a, G_UNICODE_NOT_PRESENT_OFFSET, 1696 },
+ { 0xfe8b, G_UNICODE_NOT_PRESENT_OFFSET, 1696 },
+ { 0xfe8c, G_UNICODE_NOT_PRESENT_OFFSET, 1696 },
+ { 0xfe8d, G_UNICODE_NOT_PRESENT_OFFSET, 14672 },
+ { 0xfe8e, G_UNICODE_NOT_PRESENT_OFFSET, 14672 },
+ { 0xfe8f, G_UNICODE_NOT_PRESENT_OFFSET, 14675 },
+ { 0xfe90, G_UNICODE_NOT_PRESENT_OFFSET, 14675 },
+ { 0xfe91, G_UNICODE_NOT_PRESENT_OFFSET, 14675 },
+ { 0xfe92, G_UNICODE_NOT_PRESENT_OFFSET, 14675 },
+ { 0xfe93, G_UNICODE_NOT_PRESENT_OFFSET, 14678 },
+ { 0xfe94, G_UNICODE_NOT_PRESENT_OFFSET, 14678 },
+ { 0xfe95, G_UNICODE_NOT_PRESENT_OFFSET, 14681 },
+ { 0xfe96, G_UNICODE_NOT_PRESENT_OFFSET, 14681 },
+ { 0xfe97, G_UNICODE_NOT_PRESENT_OFFSET, 14681 },
+ { 0xfe98, G_UNICODE_NOT_PRESENT_OFFSET, 14681 },
+ { 0xfe99, G_UNICODE_NOT_PRESENT_OFFSET, 14684 },
+ { 0xfe9a, G_UNICODE_NOT_PRESENT_OFFSET, 14684 },
+ { 0xfe9b, G_UNICODE_NOT_PRESENT_OFFSET, 14684 },
+ { 0xfe9c, G_UNICODE_NOT_PRESENT_OFFSET, 14684 },
+ { 0xfe9d, G_UNICODE_NOT_PRESENT_OFFSET, 14687 },
+ { 0xfe9e, G_UNICODE_NOT_PRESENT_OFFSET, 14687 },
+ { 0xfe9f, G_UNICODE_NOT_PRESENT_OFFSET, 14687 },
+ { 0xfea0, G_UNICODE_NOT_PRESENT_OFFSET, 14687 },
+ { 0xfea1, G_UNICODE_NOT_PRESENT_OFFSET, 14690 },
+ { 0xfea2, G_UNICODE_NOT_PRESENT_OFFSET, 14690 },
+ { 0xfea3, G_UNICODE_NOT_PRESENT_OFFSET, 14690 },
+ { 0xfea4, G_UNICODE_NOT_PRESENT_OFFSET, 14690 },
+ { 0xfea5, G_UNICODE_NOT_PRESENT_OFFSET, 14693 },
+ { 0xfea6, G_UNICODE_NOT_PRESENT_OFFSET, 14693 },
+ { 0xfea7, G_UNICODE_NOT_PRESENT_OFFSET, 14693 },
+ { 0xfea8, G_UNICODE_NOT_PRESENT_OFFSET, 14693 },
+ { 0xfea9, G_UNICODE_NOT_PRESENT_OFFSET, 14696 },
+ { 0xfeaa, G_UNICODE_NOT_PRESENT_OFFSET, 14696 },
+ { 0xfeab, G_UNICODE_NOT_PRESENT_OFFSET, 14699 },
+ { 0xfeac, G_UNICODE_NOT_PRESENT_OFFSET, 14699 },
+ { 0xfead, G_UNICODE_NOT_PRESENT_OFFSET, 14702 },
+ { 0xfeae, G_UNICODE_NOT_PRESENT_OFFSET, 14702 },
+ { 0xfeaf, G_UNICODE_NOT_PRESENT_OFFSET, 14705 },
+ { 0xfeb0, G_UNICODE_NOT_PRESENT_OFFSET, 14705 },
+ { 0xfeb1, G_UNICODE_NOT_PRESENT_OFFSET, 14708 },
+ { 0xfeb2, G_UNICODE_NOT_PRESENT_OFFSET, 14708 },
+ { 0xfeb3, G_UNICODE_NOT_PRESENT_OFFSET, 14708 },
+ { 0xfeb4, G_UNICODE_NOT_PRESENT_OFFSET, 14708 },
+ { 0xfeb5, G_UNICODE_NOT_PRESENT_OFFSET, 14711 },
+ { 0xfeb6, G_UNICODE_NOT_PRESENT_OFFSET, 14711 },
+ { 0xfeb7, G_UNICODE_NOT_PRESENT_OFFSET, 14711 },
+ { 0xfeb8, G_UNICODE_NOT_PRESENT_OFFSET, 14711 },
+ { 0xfeb9, G_UNICODE_NOT_PRESENT_OFFSET, 14714 },
+ { 0xfeba, G_UNICODE_NOT_PRESENT_OFFSET, 14714 },
+ { 0xfebb, G_UNICODE_NOT_PRESENT_OFFSET, 14714 },
+ { 0xfebc, G_UNICODE_NOT_PRESENT_OFFSET, 14714 },
+ { 0xfebd, G_UNICODE_NOT_PRESENT_OFFSET, 14717 },
+ { 0xfebe, G_UNICODE_NOT_PRESENT_OFFSET, 14717 },
+ { 0xfebf, G_UNICODE_NOT_PRESENT_OFFSET, 14717 },
+ { 0xfec0, G_UNICODE_NOT_PRESENT_OFFSET, 14717 },
+ { 0xfec1, G_UNICODE_NOT_PRESENT_OFFSET, 14720 },
+ { 0xfec2, G_UNICODE_NOT_PRESENT_OFFSET, 14720 },
+ { 0xfec3, G_UNICODE_NOT_PRESENT_OFFSET, 14720 },
+ { 0xfec4, G_UNICODE_NOT_PRESENT_OFFSET, 14720 },
+ { 0xfec5, G_UNICODE_NOT_PRESENT_OFFSET, 14723 },
+ { 0xfec6, G_UNICODE_NOT_PRESENT_OFFSET, 14723 },
+ { 0xfec7, G_UNICODE_NOT_PRESENT_OFFSET, 14723 },
+ { 0xfec8, G_UNICODE_NOT_PRESENT_OFFSET, 14723 },
+ { 0xfec9, G_UNICODE_NOT_PRESENT_OFFSET, 14726 },
+ { 0xfeca, G_UNICODE_NOT_PRESENT_OFFSET, 14726 },
+ { 0xfecb, G_UNICODE_NOT_PRESENT_OFFSET, 14726 },
+ { 0xfecc, G_UNICODE_NOT_PRESENT_OFFSET, 14726 },
+ { 0xfecd, G_UNICODE_NOT_PRESENT_OFFSET, 14729 },
+ { 0xfece, G_UNICODE_NOT_PRESENT_OFFSET, 14729 },
+ { 0xfecf, G_UNICODE_NOT_PRESENT_OFFSET, 14729 },
+ { 0xfed0, G_UNICODE_NOT_PRESENT_OFFSET, 14729 },
+ { 0xfed1, G_UNICODE_NOT_PRESENT_OFFSET, 14732 },
+ { 0xfed2, G_UNICODE_NOT_PRESENT_OFFSET, 14732 },
+ { 0xfed3, G_UNICODE_NOT_PRESENT_OFFSET, 14732 },
+ { 0xfed4, G_UNICODE_NOT_PRESENT_OFFSET, 14732 },
+ { 0xfed5, G_UNICODE_NOT_PRESENT_OFFSET, 14735 },
+ { 0xfed6, G_UNICODE_NOT_PRESENT_OFFSET, 14735 },
+ { 0xfed7, G_UNICODE_NOT_PRESENT_OFFSET, 14735 },
+ { 0xfed8, G_UNICODE_NOT_PRESENT_OFFSET, 14735 },
+ { 0xfed9, G_UNICODE_NOT_PRESENT_OFFSET, 14738 },
+ { 0xfeda, G_UNICODE_NOT_PRESENT_OFFSET, 14738 },
+ { 0xfedb, G_UNICODE_NOT_PRESENT_OFFSET, 14738 },
+ { 0xfedc, G_UNICODE_NOT_PRESENT_OFFSET, 14738 },
+ { 0xfedd, G_UNICODE_NOT_PRESENT_OFFSET, 14741 },
+ { 0xfede, G_UNICODE_NOT_PRESENT_OFFSET, 14741 },
+ { 0xfedf, G_UNICODE_NOT_PRESENT_OFFSET, 14741 },
+ { 0xfee0, G_UNICODE_NOT_PRESENT_OFFSET, 14741 },
+ { 0xfee1, G_UNICODE_NOT_PRESENT_OFFSET, 14744 },
+ { 0xfee2, G_UNICODE_NOT_PRESENT_OFFSET, 14744 },
+ { 0xfee3, G_UNICODE_NOT_PRESENT_OFFSET, 14744 },
+ { 0xfee4, G_UNICODE_NOT_PRESENT_OFFSET, 14744 },
+ { 0xfee5, G_UNICODE_NOT_PRESENT_OFFSET, 14747 },
+ { 0xfee6, G_UNICODE_NOT_PRESENT_OFFSET, 14747 },
+ { 0xfee7, G_UNICODE_NOT_PRESENT_OFFSET, 14747 },
+ { 0xfee8, G_UNICODE_NOT_PRESENT_OFFSET, 14747 },
+ { 0xfee9, G_UNICODE_NOT_PRESENT_OFFSET, 14750 },
+ { 0xfeea, G_UNICODE_NOT_PRESENT_OFFSET, 14750 },
+ { 0xfeeb, G_UNICODE_NOT_PRESENT_OFFSET, 14750 },
+ { 0xfeec, G_UNICODE_NOT_PRESENT_OFFSET, 14750 },
+ { 0xfeed, G_UNICODE_NOT_PRESENT_OFFSET, 14753 },
+ { 0xfeee, G_UNICODE_NOT_PRESENT_OFFSET, 14753 },
+ { 0xfeef, G_UNICODE_NOT_PRESENT_OFFSET, 12802 },
+ { 0xfef0, G_UNICODE_NOT_PRESENT_OFFSET, 12802 },
+ { 0xfef1, G_UNICODE_NOT_PRESENT_OFFSET, 14756 },
+ { 0xfef2, G_UNICODE_NOT_PRESENT_OFFSET, 14756 },
+ { 0xfef3, G_UNICODE_NOT_PRESENT_OFFSET, 14756 },
+ { 0xfef4, G_UNICODE_NOT_PRESENT_OFFSET, 14756 },
+ { 0xfef5, G_UNICODE_NOT_PRESENT_OFFSET, 14759 },
+ { 0xfef6, G_UNICODE_NOT_PRESENT_OFFSET, 14759 },
+ { 0xfef7, G_UNICODE_NOT_PRESENT_OFFSET, 14766 },
+ { 0xfef8, G_UNICODE_NOT_PRESENT_OFFSET, 14766 },
+ { 0xfef9, G_UNICODE_NOT_PRESENT_OFFSET, 14773 },
+ { 0xfefa, G_UNICODE_NOT_PRESENT_OFFSET, 14773 },
+ { 0xfefb, G_UNICODE_NOT_PRESENT_OFFSET, 14780 },
+ { 0xfefc, G_UNICODE_NOT_PRESENT_OFFSET, 14780 },
+ { 0xff01, G_UNICODE_NOT_PRESENT_OFFSET, 14517 },
+ { 0xff02, G_UNICODE_NOT_PRESENT_OFFSET, 14785 },
+ { 0xff03, G_UNICODE_NOT_PRESENT_OFFSET, 14587 },
+ { 0xff04, G_UNICODE_NOT_PRESENT_OFFSET, 14601 },
+ { 0xff05, G_UNICODE_NOT_PRESENT_OFFSET, 14603 },
+ { 0xff06, G_UNICODE_NOT_PRESENT_OFFSET, 14589 },
+ { 0xff07, G_UNICODE_NOT_PRESENT_OFFSET, 14787 },
+ { 0xff08, G_UNICODE_NOT_PRESENT_OFFSET, 5275 },
+ { 0xff09, G_UNICODE_NOT_PRESENT_OFFSET, 5277 },
+ { 0xff0a, G_UNICODE_NOT_PRESENT_OFFSET, 14591 },
+ { 0xff0b, G_UNICODE_NOT_PRESENT_OFFSET, 5267 },
+ { 0xff0c, G_UNICODE_NOT_PRESENT_OFFSET, 14505 },
+ { 0xff0d, G_UNICODE_NOT_PRESENT_OFFSET, 14593 },
+ { 0xff0e, G_UNICODE_NOT_PRESENT_OFFSET, 5181 },
+ { 0xff0f, G_UNICODE_NOT_PRESENT_OFFSET, 14789 },
+ { 0xff10, G_UNICODE_NOT_PRESENT_OFFSET, 5253 },
+ { 0xff11, G_UNICODE_NOT_PRESENT_OFFSET, 27 },
+ { 0xff12, G_UNICODE_NOT_PRESENT_OFFSET, 12 },
+ { 0xff13, G_UNICODE_NOT_PRESENT_OFFSET, 14 },
+ { 0xff14, G_UNICODE_NOT_PRESENT_OFFSET, 5255 },
+ { 0xff15, G_UNICODE_NOT_PRESENT_OFFSET, 5257 },
+ { 0xff16, G_UNICODE_NOT_PRESENT_OFFSET, 5259 },
+ { 0xff17, G_UNICODE_NOT_PRESENT_OFFSET, 5261 },
+ { 0xff18, G_UNICODE_NOT_PRESENT_OFFSET, 5263 },
+ { 0xff19, G_UNICODE_NOT_PRESENT_OFFSET, 5265 },
+ { 0xff1a, G_UNICODE_NOT_PRESENT_OFFSET, 14515 },
+ { 0xff1b, G_UNICODE_NOT_PRESENT_OFFSET, 1248 },
+ { 0xff1c, G_UNICODE_NOT_PRESENT_OFFSET, 14595 },
+ { 0xff1d, G_UNICODE_NOT_PRESENT_OFFSET, 5273 },
+ { 0xff1e, G_UNICODE_NOT_PRESENT_OFFSET, 14597 },
+ { 0xff1f, G_UNICODE_NOT_PRESENT_OFFSET, 14519 },
+ { 0xff20, G_UNICODE_NOT_PRESENT_OFFSET, 14605 },
+ { 0xff21, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0xff22, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0xff23, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0xff24, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0xff25, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0xff26, G_UNICODE_NOT_PRESENT_OFFSET, 5336 },
+ { 0xff27, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0xff28, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0xff29, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0xff2a, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0xff2b, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0xff2c, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0xff2d, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0xff2e, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0xff2f, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0xff30, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0xff31, G_UNICODE_NOT_PRESENT_OFFSET, 5319 },
+ { 0xff32, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0xff33, G_UNICODE_NOT_PRESENT_OFFSET, 6108 },
+ { 0xff34, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0xff35, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0xff36, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0xff37, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0xff38, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0xff39, G_UNICODE_NOT_PRESENT_OFFSET, 6110 },
+ { 0xff3a, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
+ { 0xff3b, G_UNICODE_NOT_PRESENT_OFFSET, 14583 },
+ { 0xff3c, G_UNICODE_NOT_PRESENT_OFFSET, 14599 },
+ { 0xff3d, G_UNICODE_NOT_PRESENT_OFFSET, 14585 },
+ { 0xff3e, G_UNICODE_NOT_PRESENT_OFFSET, 14791 },
+ { 0xff3f, G_UNICODE_NOT_PRESENT_OFFSET, 14537 },
+ { 0xff40, G_UNICODE_NOT_PRESENT_OFFSET, 5110 },
+ { 0xff41, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0xff42, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0xff43, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0xff44, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0xff45, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0xff46, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0xff47, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0xff48, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0xff49, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0xff4a, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0xff4b, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0xff4c, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0xff4d, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0xff4e, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0xff4f, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0xff50, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0xff51, G_UNICODE_NOT_PRESENT_OFFSET, 6112 },
+ { 0xff52, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0xff53, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0xff54, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0xff55, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0xff56, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0xff57, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0xff58, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0xff59, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0xff5a, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0xff5b, G_UNICODE_NOT_PRESENT_OFFSET, 14539 },
+ { 0xff5c, G_UNICODE_NOT_PRESENT_OFFSET, 14793 },
+ { 0xff5d, G_UNICODE_NOT_PRESENT_OFFSET, 14541 },
+ { 0xff5e, G_UNICODE_NOT_PRESENT_OFFSET, 14795 },
+ { 0xff5f, G_UNICODE_NOT_PRESENT_OFFSET, 14797 },
+ { 0xff60, G_UNICODE_NOT_PRESENT_OFFSET, 14801 },
+ { 0xff61, G_UNICODE_NOT_PRESENT_OFFSET, 14511 },
+ { 0xff62, G_UNICODE_NOT_PRESENT_OFFSET, 14567 },
+ { 0xff63, G_UNICODE_NOT_PRESENT_OFFSET, 14571 },
+ { 0xff64, G_UNICODE_NOT_PRESENT_OFFSET, 14507 },
+ { 0xff65, G_UNICODE_NOT_PRESENT_OFFSET, 14805 },
+ { 0xff66, G_UNICODE_NOT_PRESENT_OFFSET, 8955 },
+ { 0xff67, G_UNICODE_NOT_PRESENT_OFFSET, 14809 },
+ { 0xff68, G_UNICODE_NOT_PRESENT_OFFSET, 14813 },
+ { 0xff69, G_UNICODE_NOT_PRESENT_OFFSET, 14817 },
+ { 0xff6a, G_UNICODE_NOT_PRESENT_OFFSET, 14821 },
+ { 0xff6b, G_UNICODE_NOT_PRESENT_OFFSET, 14825 },
+ { 0xff6c, G_UNICODE_NOT_PRESENT_OFFSET, 14829 },
+ { 0xff6d, G_UNICODE_NOT_PRESENT_OFFSET, 14833 },
+ { 0xff6e, G_UNICODE_NOT_PRESENT_OFFSET, 14837 },
+ { 0xff6f, G_UNICODE_NOT_PRESENT_OFFSET, 14841 },
+ { 0xff70, G_UNICODE_NOT_PRESENT_OFFSET, 14845 },
+ { 0xff71, G_UNICODE_NOT_PRESENT_OFFSET, 8771 },
+ { 0xff72, G_UNICODE_NOT_PRESENT_OFFSET, 8775 },
+ { 0xff73, G_UNICODE_NOT_PRESENT_OFFSET, 8779 },
+ { 0xff74, G_UNICODE_NOT_PRESENT_OFFSET, 8783 },
+ { 0xff75, G_UNICODE_NOT_PRESENT_OFFSET, 8787 },
+ { 0xff76, G_UNICODE_NOT_PRESENT_OFFSET, 8791 },
+ { 0xff77, G_UNICODE_NOT_PRESENT_OFFSET, 8795 },
+ { 0xff78, G_UNICODE_NOT_PRESENT_OFFSET, 8799 },
+ { 0xff79, G_UNICODE_NOT_PRESENT_OFFSET, 8803 },
+ { 0xff7a, G_UNICODE_NOT_PRESENT_OFFSET, 8807 },
+ { 0xff7b, G_UNICODE_NOT_PRESENT_OFFSET, 8811 },
+ { 0xff7c, G_UNICODE_NOT_PRESENT_OFFSET, 8815 },
+ { 0xff7d, G_UNICODE_NOT_PRESENT_OFFSET, 8819 },
+ { 0xff7e, G_UNICODE_NOT_PRESENT_OFFSET, 8823 },
+ { 0xff7f, G_UNICODE_NOT_PRESENT_OFFSET, 8827 },
+ { 0xff80, G_UNICODE_NOT_PRESENT_OFFSET, 8831 },
+ { 0xff81, G_UNICODE_NOT_PRESENT_OFFSET, 8835 },
+ { 0xff82, G_UNICODE_NOT_PRESENT_OFFSET, 8839 },
+ { 0xff83, G_UNICODE_NOT_PRESENT_OFFSET, 8843 },
+ { 0xff84, G_UNICODE_NOT_PRESENT_OFFSET, 8847 },
+ { 0xff85, G_UNICODE_NOT_PRESENT_OFFSET, 8851 },
+ { 0xff86, G_UNICODE_NOT_PRESENT_OFFSET, 8855 },
+ { 0xff87, G_UNICODE_NOT_PRESENT_OFFSET, 8859 },
+ { 0xff88, G_UNICODE_NOT_PRESENT_OFFSET, 8863 },
+ { 0xff89, G_UNICODE_NOT_PRESENT_OFFSET, 8867 },
+ { 0xff8a, G_UNICODE_NOT_PRESENT_OFFSET, 8871 },
+ { 0xff8b, G_UNICODE_NOT_PRESENT_OFFSET, 8875 },
+ { 0xff8c, G_UNICODE_NOT_PRESENT_OFFSET, 8879 },
+ { 0xff8d, G_UNICODE_NOT_PRESENT_OFFSET, 8883 },
+ { 0xff8e, G_UNICODE_NOT_PRESENT_OFFSET, 8887 },
+ { 0xff8f, G_UNICODE_NOT_PRESENT_OFFSET, 8891 },
+ { 0xff90, G_UNICODE_NOT_PRESENT_OFFSET, 8895 },
+ { 0xff91, G_UNICODE_NOT_PRESENT_OFFSET, 8899 },
+ { 0xff92, G_UNICODE_NOT_PRESENT_OFFSET, 8903 },
+ { 0xff93, G_UNICODE_NOT_PRESENT_OFFSET, 8907 },
+ { 0xff94, G_UNICODE_NOT_PRESENT_OFFSET, 8911 },
+ { 0xff95, G_UNICODE_NOT_PRESENT_OFFSET, 8915 },
+ { 0xff96, G_UNICODE_NOT_PRESENT_OFFSET, 8919 },
+ { 0xff97, G_UNICODE_NOT_PRESENT_OFFSET, 8923 },
+ { 0xff98, G_UNICODE_NOT_PRESENT_OFFSET, 8927 },
+ { 0xff99, G_UNICODE_NOT_PRESENT_OFFSET, 8931 },
+ { 0xff9a, G_UNICODE_NOT_PRESENT_OFFSET, 8935 },
+ { 0xff9b, G_UNICODE_NOT_PRESENT_OFFSET, 8939 },
+ { 0xff9c, G_UNICODE_NOT_PRESENT_OFFSET, 8943 },
+ { 0xff9d, G_UNICODE_NOT_PRESENT_OFFSET, 14849 },
+ { 0xff9e, G_UNICODE_NOT_PRESENT_OFFSET, 14853 },
+ { 0xff9f, G_UNICODE_NOT_PRESENT_OFFSET, 14857 },
+ { 0xffa0, G_UNICODE_NOT_PRESENT_OFFSET, 7658 },
+ { 0xffa1, G_UNICODE_NOT_PRESENT_OFFSET, 7454 },
+ { 0xffa2, G_UNICODE_NOT_PRESENT_OFFSET, 7458 },
+ { 0xffa3, G_UNICODE_NOT_PRESENT_OFFSET, 7462 },
+ { 0xffa4, G_UNICODE_NOT_PRESENT_OFFSET, 7466 },
+ { 0xffa5, G_UNICODE_NOT_PRESENT_OFFSET, 7470 },
+ { 0xffa6, G_UNICODE_NOT_PRESENT_OFFSET, 7474 },
+ { 0xffa7, G_UNICODE_NOT_PRESENT_OFFSET, 7478 },
+ { 0xffa8, G_UNICODE_NOT_PRESENT_OFFSET, 7482 },
+ { 0xffa9, G_UNICODE_NOT_PRESENT_OFFSET, 7486 },
+ { 0xffaa, G_UNICODE_NOT_PRESENT_OFFSET, 7490 },
+ { 0xffab, G_UNICODE_NOT_PRESENT_OFFSET, 7494 },
+ { 0xffac, G_UNICODE_NOT_PRESENT_OFFSET, 7498 },
+ { 0xffad, G_UNICODE_NOT_PRESENT_OFFSET, 7502 },
+ { 0xffae, G_UNICODE_NOT_PRESENT_OFFSET, 7506 },
+ { 0xffaf, G_UNICODE_NOT_PRESENT_OFFSET, 7510 },
+ { 0xffb0, G_UNICODE_NOT_PRESENT_OFFSET, 7514 },
+ { 0xffb1, G_UNICODE_NOT_PRESENT_OFFSET, 7518 },
+ { 0xffb2, G_UNICODE_NOT_PRESENT_OFFSET, 7522 },
+ { 0xffb3, G_UNICODE_NOT_PRESENT_OFFSET, 7526 },
+ { 0xffb4, G_UNICODE_NOT_PRESENT_OFFSET, 7530 },
+ { 0xffb5, G_UNICODE_NOT_PRESENT_OFFSET, 7534 },
+ { 0xffb6, G_UNICODE_NOT_PRESENT_OFFSET, 7538 },
+ { 0xffb7, G_UNICODE_NOT_PRESENT_OFFSET, 7542 },
+ { 0xffb8, G_UNICODE_NOT_PRESENT_OFFSET, 7546 },
+ { 0xffb9, G_UNICODE_NOT_PRESENT_OFFSET, 7550 },
+ { 0xffba, G_UNICODE_NOT_PRESENT_OFFSET, 7554 },
+ { 0xffbb, G_UNICODE_NOT_PRESENT_OFFSET, 7558 },
+ { 0xffbc, G_UNICODE_NOT_PRESENT_OFFSET, 7562 },
+ { 0xffbd, G_UNICODE_NOT_PRESENT_OFFSET, 7566 },
+ { 0xffbe, G_UNICODE_NOT_PRESENT_OFFSET, 7570 },
+ { 0xffc2, G_UNICODE_NOT_PRESENT_OFFSET, 7574 },
+ { 0xffc3, G_UNICODE_NOT_PRESENT_OFFSET, 7578 },
+ { 0xffc4, G_UNICODE_NOT_PRESENT_OFFSET, 7582 },
+ { 0xffc5, G_UNICODE_NOT_PRESENT_OFFSET, 7586 },
+ { 0xffc6, G_UNICODE_NOT_PRESENT_OFFSET, 7590 },
+ { 0xffc7, G_UNICODE_NOT_PRESENT_OFFSET, 7594 },
+ { 0xffca, G_UNICODE_NOT_PRESENT_OFFSET, 7598 },
+ { 0xffcb, G_UNICODE_NOT_PRESENT_OFFSET, 7602 },
+ { 0xffcc, G_UNICODE_NOT_PRESENT_OFFSET, 7606 },
+ { 0xffcd, G_UNICODE_NOT_PRESENT_OFFSET, 7610 },
+ { 0xffce, G_UNICODE_NOT_PRESENT_OFFSET, 7614 },
+ { 0xffcf, G_UNICODE_NOT_PRESENT_OFFSET, 7618 },
+ { 0xffd2, G_UNICODE_NOT_PRESENT_OFFSET, 7622 },
+ { 0xffd3, G_UNICODE_NOT_PRESENT_OFFSET, 7626 },
+ { 0xffd4, G_UNICODE_NOT_PRESENT_OFFSET, 7630 },
+ { 0xffd5, G_UNICODE_NOT_PRESENT_OFFSET, 7634 },
+ { 0xffd6, G_UNICODE_NOT_PRESENT_OFFSET, 7638 },
+ { 0xffd7, G_UNICODE_NOT_PRESENT_OFFSET, 7642 },
+ { 0xffda, G_UNICODE_NOT_PRESENT_OFFSET, 7646 },
+ { 0xffdb, G_UNICODE_NOT_PRESENT_OFFSET, 7650 },
+ { 0xffdc, G_UNICODE_NOT_PRESENT_OFFSET, 7654 },
+ { 0xffe0, G_UNICODE_NOT_PRESENT_OFFSET, 14861 },
+ { 0xffe1, G_UNICODE_NOT_PRESENT_OFFSET, 14864 },
+ { 0xffe2, G_UNICODE_NOT_PRESENT_OFFSET, 14867 },
+ { 0xffe3, G_UNICODE_NOT_PRESENT_OFFSET, 8 },
+ { 0xffe4, G_UNICODE_NOT_PRESENT_OFFSET, 14870 },
+ { 0xffe5, G_UNICODE_NOT_PRESENT_OFFSET, 14873 },
+ { 0xffe6, G_UNICODE_NOT_PRESENT_OFFSET, 14876 },
+ { 0xffe8, G_UNICODE_NOT_PRESENT_OFFSET, 14880 },
+ { 0xffe9, G_UNICODE_NOT_PRESENT_OFFSET, 14884 },
+ { 0xffea, G_UNICODE_NOT_PRESENT_OFFSET, 14888 },
+ { 0xffeb, G_UNICODE_NOT_PRESENT_OFFSET, 14892 },
+ { 0xffec, G_UNICODE_NOT_PRESENT_OFFSET, 14896 },
+ { 0xffed, G_UNICODE_NOT_PRESENT_OFFSET, 14900 },
+ { 0xffee, G_UNICODE_NOT_PRESENT_OFFSET, 14904 },
+ { 0x1d15e, 14908, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d15f, 14917, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d160, 14926, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d161, 14939, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d162, 14952, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d163, 14965, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d164, 14978, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d1bb, 14991, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d1bc, 15000, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d1bd, 15009, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d1be, 15022, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d1bf, 15035, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d1c0, 15048, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x1d400, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0x1d401, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0x1d402, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0x1d403, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x1d404, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0x1d405, G_UNICODE_NOT_PRESENT_OFFSET, 5336 },
+ { 0x1d406, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0x1d407, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0x1d408, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x1d409, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0x1d40a, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0x1d40b, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x1d40c, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x1d40d, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0x1d40e, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0x1d40f, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0x1d410, G_UNICODE_NOT_PRESENT_OFFSET, 5319 },
+ { 0x1d411, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0x1d412, G_UNICODE_NOT_PRESENT_OFFSET, 6108 },
+ { 0x1d413, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0x1d414, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0x1d415, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0x1d416, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0x1d417, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0x1d418, G_UNICODE_NOT_PRESENT_OFFSET, 6110 },
+ { 0x1d419, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
+ { 0x1d41a, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x1d41b, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0x1d41c, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x1d41d, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x1d41e, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x1d41f, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0x1d420, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0x1d421, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0x1d422, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x1d423, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x1d424, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0x1d425, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x1d426, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x1d427, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0x1d428, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x1d429, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0x1d42a, G_UNICODE_NOT_PRESENT_OFFSET, 6112 },
+ { 0x1d42b, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x1d42c, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x1d42d, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0x1d42e, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x1d42f, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x1d430, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0x1d431, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x1d432, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0x1d433, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0x1d434, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0x1d435, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0x1d436, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0x1d437, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x1d438, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0x1d439, G_UNICODE_NOT_PRESENT_OFFSET, 5336 },
+ { 0x1d43a, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0x1d43b, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0x1d43c, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x1d43d, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0x1d43e, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0x1d43f, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x1d440, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x1d441, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0x1d442, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0x1d443, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0x1d444, G_UNICODE_NOT_PRESENT_OFFSET, 5319 },
+ { 0x1d445, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0x1d446, G_UNICODE_NOT_PRESENT_OFFSET, 6108 },
+ { 0x1d447, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0x1d448, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0x1d449, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0x1d44a, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0x1d44b, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0x1d44c, G_UNICODE_NOT_PRESENT_OFFSET, 6110 },
+ { 0x1d44d, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
+ { 0x1d44e, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x1d44f, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0x1d450, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x1d451, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x1d452, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x1d453, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0x1d454, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0x1d456, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x1d457, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x1d458, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0x1d459, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x1d45a, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x1d45b, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0x1d45c, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x1d45d, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0x1d45e, G_UNICODE_NOT_PRESENT_OFFSET, 6112 },
+ { 0x1d45f, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x1d460, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x1d461, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0x1d462, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x1d463, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x1d464, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0x1d465, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x1d466, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0x1d467, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0x1d468, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0x1d469, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0x1d46a, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0x1d46b, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x1d46c, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0x1d46d, G_UNICODE_NOT_PRESENT_OFFSET, 5336 },
+ { 0x1d46e, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0x1d46f, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0x1d470, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x1d471, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0x1d472, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0x1d473, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x1d474, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x1d475, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0x1d476, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0x1d477, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0x1d478, G_UNICODE_NOT_PRESENT_OFFSET, 5319 },
+ { 0x1d479, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0x1d47a, G_UNICODE_NOT_PRESENT_OFFSET, 6108 },
+ { 0x1d47b, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0x1d47c, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0x1d47d, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0x1d47e, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0x1d47f, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0x1d480, G_UNICODE_NOT_PRESENT_OFFSET, 6110 },
+ { 0x1d481, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
+ { 0x1d482, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x1d483, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0x1d484, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x1d485, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x1d486, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x1d487, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0x1d488, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0x1d489, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0x1d48a, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x1d48b, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x1d48c, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0x1d48d, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x1d48e, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x1d48f, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0x1d490, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x1d491, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0x1d492, G_UNICODE_NOT_PRESENT_OFFSET, 6112 },
+ { 0x1d493, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x1d494, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x1d495, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0x1d496, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x1d497, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x1d498, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0x1d499, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x1d49a, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0x1d49b, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0x1d49c, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0x1d49e, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0x1d49f, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x1d4a2, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0x1d4a5, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0x1d4a6, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0x1d4a9, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0x1d4aa, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0x1d4ab, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0x1d4ac, G_UNICODE_NOT_PRESENT_OFFSET, 5319 },
+ { 0x1d4ae, G_UNICODE_NOT_PRESENT_OFFSET, 6108 },
+ { 0x1d4af, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0x1d4b0, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0x1d4b1, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0x1d4b2, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0x1d4b3, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0x1d4b4, G_UNICODE_NOT_PRESENT_OFFSET, 6110 },
+ { 0x1d4b5, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
+ { 0x1d4b6, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x1d4b7, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0x1d4b8, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x1d4b9, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x1d4bb, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0x1d4bd, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0x1d4be, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x1d4bf, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x1d4c0, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0x1d4c1, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x1d4c2, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x1d4c3, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0x1d4c5, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0x1d4c6, G_UNICODE_NOT_PRESENT_OFFSET, 6112 },
+ { 0x1d4c7, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x1d4c8, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x1d4c9, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0x1d4ca, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x1d4cb, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x1d4cc, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0x1d4cd, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x1d4ce, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0x1d4cf, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0x1d4d0, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0x1d4d1, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0x1d4d2, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0x1d4d3, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x1d4d4, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0x1d4d5, G_UNICODE_NOT_PRESENT_OFFSET, 5336 },
+ { 0x1d4d6, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0x1d4d7, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0x1d4d8, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x1d4d9, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0x1d4da, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0x1d4db, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x1d4dc, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x1d4dd, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0x1d4de, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0x1d4df, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0x1d4e0, G_UNICODE_NOT_PRESENT_OFFSET, 5319 },
+ { 0x1d4e1, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0x1d4e2, G_UNICODE_NOT_PRESENT_OFFSET, 6108 },
+ { 0x1d4e3, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0x1d4e4, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0x1d4e5, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0x1d4e6, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0x1d4e7, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0x1d4e8, G_UNICODE_NOT_PRESENT_OFFSET, 6110 },
+ { 0x1d4e9, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
+ { 0x1d4ea, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x1d4eb, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0x1d4ec, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x1d4ed, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x1d4ee, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x1d4ef, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0x1d4f0, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0x1d4f1, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0x1d4f2, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x1d4f3, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x1d4f4, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0x1d4f5, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x1d4f6, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x1d4f7, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0x1d4f8, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x1d4f9, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0x1d4fa, G_UNICODE_NOT_PRESENT_OFFSET, 6112 },
+ { 0x1d4fb, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x1d4fc, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x1d4fd, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0x1d4fe, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x1d4ff, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x1d500, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0x1d501, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x1d502, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0x1d503, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0x1d504, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0x1d505, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0x1d507, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x1d508, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0x1d509, G_UNICODE_NOT_PRESENT_OFFSET, 5336 },
+ { 0x1d50a, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0x1d50d, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0x1d50e, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0x1d50f, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x1d510, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x1d511, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0x1d512, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0x1d513, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0x1d514, G_UNICODE_NOT_PRESENT_OFFSET, 5319 },
+ { 0x1d516, G_UNICODE_NOT_PRESENT_OFFSET, 6108 },
+ { 0x1d517, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0x1d518, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0x1d519, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0x1d51a, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0x1d51b, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0x1d51c, G_UNICODE_NOT_PRESENT_OFFSET, 6110 },
+ { 0x1d51e, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x1d51f, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0x1d520, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x1d521, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x1d522, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x1d523, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0x1d524, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0x1d525, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0x1d526, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x1d527, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x1d528, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0x1d529, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x1d52a, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x1d52b, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0x1d52c, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x1d52d, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0x1d52e, G_UNICODE_NOT_PRESENT_OFFSET, 6112 },
+ { 0x1d52f, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x1d530, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x1d531, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0x1d532, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x1d533, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x1d534, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0x1d535, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x1d536, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0x1d537, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0x1d538, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0x1d539, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0x1d53b, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x1d53c, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0x1d53d, G_UNICODE_NOT_PRESENT_OFFSET, 5336 },
+ { 0x1d53e, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0x1d540, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x1d541, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0x1d542, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0x1d543, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x1d544, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x1d546, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0x1d54a, G_UNICODE_NOT_PRESENT_OFFSET, 6108 },
+ { 0x1d54b, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0x1d54c, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0x1d54d, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0x1d54e, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0x1d54f, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0x1d550, G_UNICODE_NOT_PRESENT_OFFSET, 6110 },
+ { 0x1d552, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x1d553, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0x1d554, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x1d555, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x1d556, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x1d557, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0x1d558, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0x1d559, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0x1d55a, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x1d55b, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x1d55c, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0x1d55d, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x1d55e, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x1d55f, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0x1d560, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x1d561, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0x1d562, G_UNICODE_NOT_PRESENT_OFFSET, 6112 },
+ { 0x1d563, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x1d564, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x1d565, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0x1d566, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x1d567, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x1d568, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0x1d569, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x1d56a, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0x1d56b, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0x1d56c, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0x1d56d, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0x1d56e, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0x1d56f, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x1d570, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0x1d571, G_UNICODE_NOT_PRESENT_OFFSET, 5336 },
+ { 0x1d572, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0x1d573, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0x1d574, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x1d575, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0x1d576, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0x1d577, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x1d578, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x1d579, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0x1d57a, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0x1d57b, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0x1d57c, G_UNICODE_NOT_PRESENT_OFFSET, 5319 },
+ { 0x1d57d, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0x1d57e, G_UNICODE_NOT_PRESENT_OFFSET, 6108 },
+ { 0x1d57f, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0x1d580, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0x1d581, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0x1d582, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0x1d583, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0x1d584, G_UNICODE_NOT_PRESENT_OFFSET, 6110 },
+ { 0x1d585, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
+ { 0x1d586, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x1d587, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0x1d588, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x1d589, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x1d58a, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x1d58b, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0x1d58c, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0x1d58d, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0x1d58e, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x1d58f, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x1d590, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0x1d591, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x1d592, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x1d593, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0x1d594, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x1d595, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0x1d596, G_UNICODE_NOT_PRESENT_OFFSET, 6112 },
+ { 0x1d597, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x1d598, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x1d599, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0x1d59a, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x1d59b, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x1d59c, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0x1d59d, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x1d59e, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0x1d59f, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0x1d5a0, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0x1d5a1, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0x1d5a2, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0x1d5a3, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x1d5a4, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0x1d5a5, G_UNICODE_NOT_PRESENT_OFFSET, 5336 },
+ { 0x1d5a6, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0x1d5a7, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0x1d5a8, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x1d5a9, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0x1d5aa, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0x1d5ab, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x1d5ac, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x1d5ad, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0x1d5ae, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0x1d5af, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0x1d5b0, G_UNICODE_NOT_PRESENT_OFFSET, 5319 },
+ { 0x1d5b1, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0x1d5b2, G_UNICODE_NOT_PRESENT_OFFSET, 6108 },
+ { 0x1d5b3, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0x1d5b4, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0x1d5b5, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0x1d5b6, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0x1d5b7, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0x1d5b8, G_UNICODE_NOT_PRESENT_OFFSET, 6110 },
+ { 0x1d5b9, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
+ { 0x1d5ba, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x1d5bb, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0x1d5bc, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x1d5bd, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x1d5be, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x1d5bf, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0x1d5c0, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0x1d5c1, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0x1d5c2, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x1d5c3, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x1d5c4, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0x1d5c5, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x1d5c6, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x1d5c7, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0x1d5c8, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x1d5c9, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0x1d5ca, G_UNICODE_NOT_PRESENT_OFFSET, 6112 },
+ { 0x1d5cb, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x1d5cc, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x1d5cd, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0x1d5ce, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x1d5cf, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x1d5d0, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0x1d5d1, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x1d5d2, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0x1d5d3, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0x1d5d4, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0x1d5d5, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0x1d5d6, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0x1d5d7, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x1d5d8, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0x1d5d9, G_UNICODE_NOT_PRESENT_OFFSET, 5336 },
+ { 0x1d5da, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0x1d5db, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0x1d5dc, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x1d5dd, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0x1d5de, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0x1d5df, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x1d5e0, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x1d5e1, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0x1d5e2, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0x1d5e3, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0x1d5e4, G_UNICODE_NOT_PRESENT_OFFSET, 5319 },
+ { 0x1d5e5, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0x1d5e6, G_UNICODE_NOT_PRESENT_OFFSET, 6108 },
+ { 0x1d5e7, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0x1d5e8, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0x1d5e9, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0x1d5ea, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0x1d5eb, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0x1d5ec, G_UNICODE_NOT_PRESENT_OFFSET, 6110 },
+ { 0x1d5ed, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
+ { 0x1d5ee, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x1d5ef, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0x1d5f0, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x1d5f1, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x1d5f2, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x1d5f3, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0x1d5f4, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0x1d5f5, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0x1d5f6, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x1d5f7, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x1d5f8, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0x1d5f9, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x1d5fa, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x1d5fb, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0x1d5fc, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x1d5fd, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0x1d5fe, G_UNICODE_NOT_PRESENT_OFFSET, 6112 },
+ { 0x1d5ff, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x1d600, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x1d601, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0x1d602, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x1d603, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x1d604, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0x1d605, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x1d606, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0x1d607, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0x1d608, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0x1d609, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0x1d60a, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0x1d60b, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x1d60c, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0x1d60d, G_UNICODE_NOT_PRESENT_OFFSET, 5336 },
+ { 0x1d60e, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0x1d60f, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0x1d610, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x1d611, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0x1d612, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0x1d613, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x1d614, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x1d615, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0x1d616, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0x1d617, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0x1d618, G_UNICODE_NOT_PRESENT_OFFSET, 5319 },
+ { 0x1d619, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0x1d61a, G_UNICODE_NOT_PRESENT_OFFSET, 6108 },
+ { 0x1d61b, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0x1d61c, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0x1d61d, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0x1d61e, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0x1d61f, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0x1d620, G_UNICODE_NOT_PRESENT_OFFSET, 6110 },
+ { 0x1d621, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
+ { 0x1d622, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x1d623, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0x1d624, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x1d625, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x1d626, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x1d627, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0x1d628, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0x1d629, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0x1d62a, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x1d62b, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x1d62c, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0x1d62d, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x1d62e, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x1d62f, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0x1d630, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x1d631, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0x1d632, G_UNICODE_NOT_PRESENT_OFFSET, 6112 },
+ { 0x1d633, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x1d634, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x1d635, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0x1d636, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x1d637, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x1d638, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0x1d639, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x1d63a, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0x1d63b, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0x1d63c, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0x1d63d, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0x1d63e, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0x1d63f, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x1d640, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0x1d641, G_UNICODE_NOT_PRESENT_OFFSET, 5336 },
+ { 0x1d642, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0x1d643, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0x1d644, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x1d645, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0x1d646, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0x1d647, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x1d648, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x1d649, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0x1d64a, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0x1d64b, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0x1d64c, G_UNICODE_NOT_PRESENT_OFFSET, 5319 },
+ { 0x1d64d, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0x1d64e, G_UNICODE_NOT_PRESENT_OFFSET, 6108 },
+ { 0x1d64f, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0x1d650, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0x1d651, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0x1d652, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0x1d653, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0x1d654, G_UNICODE_NOT_PRESENT_OFFSET, 6110 },
+ { 0x1d655, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
+ { 0x1d656, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x1d657, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0x1d658, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x1d659, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x1d65a, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x1d65b, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0x1d65c, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0x1d65d, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0x1d65e, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x1d65f, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x1d660, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0x1d661, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x1d662, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x1d663, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0x1d664, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x1d665, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0x1d666, G_UNICODE_NOT_PRESENT_OFFSET, 6112 },
+ { 0x1d667, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x1d668, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x1d669, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0x1d66a, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x1d66b, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x1d66c, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0x1d66d, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x1d66e, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0x1d66f, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0x1d670, G_UNICODE_NOT_PRESENT_OFFSET, 2309 },
+ { 0x1d671, G_UNICODE_NOT_PRESENT_OFFSET, 2314 },
+ { 0x1d672, G_UNICODE_NOT_PRESENT_OFFSET, 5292 },
+ { 0x1d673, G_UNICODE_NOT_PRESENT_OFFSET, 2316 },
+ { 0x1d674, G_UNICODE_NOT_PRESENT_OFFSET, 2318 },
+ { 0x1d675, G_UNICODE_NOT_PRESENT_OFFSET, 5336 },
+ { 0x1d676, G_UNICODE_NOT_PRESENT_OFFSET, 2323 },
+ { 0x1d677, G_UNICODE_NOT_PRESENT_OFFSET, 2325 },
+ { 0x1d678, G_UNICODE_NOT_PRESENT_OFFSET, 2327 },
+ { 0x1d679, G_UNICODE_NOT_PRESENT_OFFSET, 2329 },
+ { 0x1d67a, G_UNICODE_NOT_PRESENT_OFFSET, 2331 },
+ { 0x1d67b, G_UNICODE_NOT_PRESENT_OFFSET, 2333 },
+ { 0x1d67c, G_UNICODE_NOT_PRESENT_OFFSET, 2335 },
+ { 0x1d67d, G_UNICODE_NOT_PRESENT_OFFSET, 2337 },
+ { 0x1d67e, G_UNICODE_NOT_PRESENT_OFFSET, 2339 },
+ { 0x1d67f, G_UNICODE_NOT_PRESENT_OFFSET, 2344 },
+ { 0x1d680, G_UNICODE_NOT_PRESENT_OFFSET, 5319 },
+ { 0x1d681, G_UNICODE_NOT_PRESENT_OFFSET, 2346 },
+ { 0x1d682, G_UNICODE_NOT_PRESENT_OFFSET, 6108 },
+ { 0x1d683, G_UNICODE_NOT_PRESENT_OFFSET, 2348 },
+ { 0x1d684, G_UNICODE_NOT_PRESENT_OFFSET, 2350 },
+ { 0x1d685, G_UNICODE_NOT_PRESENT_OFFSET, 5451 },
+ { 0x1d686, G_UNICODE_NOT_PRESENT_OFFSET, 2352 },
+ { 0x1d687, G_UNICODE_NOT_PRESENT_OFFSET, 5468 },
+ { 0x1d688, G_UNICODE_NOT_PRESENT_OFFSET, 6110 },
+ { 0x1d689, G_UNICODE_NOT_PRESENT_OFFSET, 5331 },
+ { 0x1d68a, G_UNICODE_NOT_PRESENT_OFFSET, 6 },
+ { 0x1d68b, G_UNICODE_NOT_PRESENT_OFFSET, 2364 },
+ { 0x1d68c, G_UNICODE_NOT_PRESENT_OFFSET, 2435 },
+ { 0x1d68d, G_UNICODE_NOT_PRESENT_OFFSET, 2366 },
+ { 0x1d68e, G_UNICODE_NOT_PRESENT_OFFSET, 2368 },
+ { 0x1d68f, G_UNICODE_NOT_PRESENT_OFFSET, 2443 },
+ { 0x1d690, G_UNICODE_NOT_PRESENT_OFFSET, 2379 },
+ { 0x1d691, G_UNICODE_NOT_PRESENT_OFFSET, 1171 },
+ { 0x1d692, G_UNICODE_NOT_PRESENT_OFFSET, 2427 },
+ { 0x1d693, G_UNICODE_NOT_PRESENT_OFFSET, 1176 },
+ { 0x1d694, G_UNICODE_NOT_PRESENT_OFFSET, 2381 },
+ { 0x1d695, G_UNICODE_NOT_PRESENT_OFFSET, 1220 },
+ { 0x1d696, G_UNICODE_NOT_PRESENT_OFFSET, 2383 },
+ { 0x1d697, G_UNICODE_NOT_PRESENT_OFFSET, 5279 },
+ { 0x1d698, G_UNICODE_NOT_PRESENT_OFFSET, 29 },
+ { 0x1d699, G_UNICODE_NOT_PRESENT_OFFSET, 2399 },
+ { 0x1d69a, G_UNICODE_NOT_PRESENT_OFFSET, 6112 },
+ { 0x1d69b, G_UNICODE_NOT_PRESENT_OFFSET, 1178 },
+ { 0x1d69c, G_UNICODE_NOT_PRESENT_OFFSET, 711 },
+ { 0x1d69d, G_UNICODE_NOT_PRESENT_OFFSET, 2401 },
+ { 0x1d69e, G_UNICODE_NOT_PRESENT_OFFSET, 2403 },
+ { 0x1d69f, G_UNICODE_NOT_PRESENT_OFFSET, 2412 },
+ { 0x1d6a0, G_UNICODE_NOT_PRESENT_OFFSET, 1189 },
+ { 0x1d6a1, G_UNICODE_NOT_PRESENT_OFFSET, 1222 },
+ { 0x1d6a2, G_UNICODE_NOT_PRESENT_OFFSET, 1191 },
+ { 0x1d6a3, G_UNICODE_NOT_PRESENT_OFFSET, 2526 },
+ { 0x1d6a4, G_UNICODE_NOT_PRESENT_OFFSET, 15061 },
+ { 0x1d6a5, G_UNICODE_NOT_PRESENT_OFFSET, 15064 },
+ { 0x1d6a8, G_UNICODE_NOT_PRESENT_OFFSET, 15067 },
+ { 0x1d6a9, G_UNICODE_NOT_PRESENT_OFFSET, 15070 },
+ { 0x1d6aa, G_UNICODE_NOT_PRESENT_OFFSET, 5354 },
+ { 0x1d6ab, G_UNICODE_NOT_PRESENT_OFFSET, 15073 },
+ { 0x1d6ac, G_UNICODE_NOT_PRESENT_OFFSET, 15076 },
+ { 0x1d6ad, G_UNICODE_NOT_PRESENT_OFFSET, 15079 },
+ { 0x1d6ae, G_UNICODE_NOT_PRESENT_OFFSET, 15082 },
+ { 0x1d6af, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
+ { 0x1d6b0, G_UNICODE_NOT_PRESENT_OFFSET, 15085 },
+ { 0x1d6b1, G_UNICODE_NOT_PRESENT_OFFSET, 15088 },
+ { 0x1d6b2, G_UNICODE_NOT_PRESENT_OFFSET, 15091 },
+ { 0x1d6b3, G_UNICODE_NOT_PRESENT_OFFSET, 15094 },
+ { 0x1d6b4, G_UNICODE_NOT_PRESENT_OFFSET, 15097 },
+ { 0x1d6b5, G_UNICODE_NOT_PRESENT_OFFSET, 15100 },
+ { 0x1d6b6, G_UNICODE_NOT_PRESENT_OFFSET, 15103 },
+ { 0x1d6b7, G_UNICODE_NOT_PRESENT_OFFSET, 5357 },
+ { 0x1d6b8, G_UNICODE_NOT_PRESENT_OFFSET, 15106 },
+ { 0x1d6b9, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
+ { 0x1d6ba, G_UNICODE_NOT_PRESENT_OFFSET, 1408 },
+ { 0x1d6bb, G_UNICODE_NOT_PRESENT_OFFSET, 15109 },
+ { 0x1d6bc, G_UNICODE_NOT_PRESENT_OFFSET, 1374 },
+ { 0x1d6bd, G_UNICODE_NOT_PRESENT_OFFSET, 15112 },
+ { 0x1d6be, G_UNICODE_NOT_PRESENT_OFFSET, 15115 },
+ { 0x1d6bf, G_UNICODE_NOT_PRESENT_OFFSET, 15118 },
+ { 0x1d6c0, G_UNICODE_NOT_PRESENT_OFFSET, 5333 },
+ { 0x1d6c1, G_UNICODE_NOT_PRESENT_OFFSET, 15121 },
+ { 0x1d6c2, G_UNICODE_NOT_PRESENT_OFFSET, 15125 },
+ { 0x1d6c3, G_UNICODE_NOT_PRESENT_OFFSET, 1368 },
+ { 0x1d6c4, G_UNICODE_NOT_PRESENT_OFFSET, 2418 },
+ { 0x1d6c5, G_UNICODE_NOT_PRESENT_OFFSET, 2421 },
+ { 0x1d6c6, G_UNICODE_NOT_PRESENT_OFFSET, 1405 },
+ { 0x1d6c7, G_UNICODE_NOT_PRESENT_OFFSET, 15128 },
+ { 0x1d6c8, G_UNICODE_NOT_PRESENT_OFFSET, 15131 },
+ { 0x1d6c9, G_UNICODE_NOT_PRESENT_OFFSET, 1371 },
+ { 0x1d6ca, G_UNICODE_NOT_PRESENT_OFFSET, 4860 },
+ { 0x1d6cb, G_UNICODE_NOT_PRESENT_OFFSET, 1393 },
+ { 0x1d6cc, G_UNICODE_NOT_PRESENT_OFFSET, 15134 },
+ { 0x1d6cd, G_UNICODE_NOT_PRESENT_OFFSET, 20 },
+ { 0x1d6ce, G_UNICODE_NOT_PRESENT_OFFSET, 15137 },
+ { 0x1d6cf, G_UNICODE_NOT_PRESENT_OFFSET, 15140 },
+ { 0x1d6d0, G_UNICODE_NOT_PRESENT_OFFSET, 15143 },
+ { 0x1d6d1, G_UNICODE_NOT_PRESENT_OFFSET, 1390 },
+ { 0x1d6d2, G_UNICODE_NOT_PRESENT_OFFSET, 1396 },
+ { 0x1d6d3, G_UNICODE_NOT_PRESENT_OFFSET, 1399 },
+ { 0x1d6d4, G_UNICODE_NOT_PRESENT_OFFSET, 15146 },
+ { 0x1d6d5, G_UNICODE_NOT_PRESENT_OFFSET, 15149 },
+ { 0x1d6d6, G_UNICODE_NOT_PRESENT_OFFSET, 15152 },
+ { 0x1d6d7, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
+ { 0x1d6d8, G_UNICODE_NOT_PRESENT_OFFSET, 2424 },
+ { 0x1d6d9, G_UNICODE_NOT_PRESENT_OFFSET, 15155 },
+ { 0x1d6da, G_UNICODE_NOT_PRESENT_OFFSET, 15158 },
+ { 0x1d6db, G_UNICODE_NOT_PRESENT_OFFSET, 15161 },
+ { 0x1d6dc, G_UNICODE_NOT_PRESENT_OFFSET, 1405 },
+ { 0x1d6dd, G_UNICODE_NOT_PRESENT_OFFSET, 1371 },
+ { 0x1d6de, G_UNICODE_NOT_PRESENT_OFFSET, 1393 },
+ { 0x1d6df, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
+ { 0x1d6e0, G_UNICODE_NOT_PRESENT_OFFSET, 1396 },
+ { 0x1d6e1, G_UNICODE_NOT_PRESENT_OFFSET, 1390 },
+ { 0x1d6e2, G_UNICODE_NOT_PRESENT_OFFSET, 15067 },
+ { 0x1d6e3, G_UNICODE_NOT_PRESENT_OFFSET, 15070 },
+ { 0x1d6e4, G_UNICODE_NOT_PRESENT_OFFSET, 5354 },
+ { 0x1d6e5, G_UNICODE_NOT_PRESENT_OFFSET, 15073 },
+ { 0x1d6e6, G_UNICODE_NOT_PRESENT_OFFSET, 15076 },
+ { 0x1d6e7, G_UNICODE_NOT_PRESENT_OFFSET, 15079 },
+ { 0x1d6e8, G_UNICODE_NOT_PRESENT_OFFSET, 15082 },
+ { 0x1d6e9, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
+ { 0x1d6ea, G_UNICODE_NOT_PRESENT_OFFSET, 15085 },
+ { 0x1d6eb, G_UNICODE_NOT_PRESENT_OFFSET, 15088 },
+ { 0x1d6ec, G_UNICODE_NOT_PRESENT_OFFSET, 15091 },
+ { 0x1d6ed, G_UNICODE_NOT_PRESENT_OFFSET, 15094 },
+ { 0x1d6ee, G_UNICODE_NOT_PRESENT_OFFSET, 15097 },
+ { 0x1d6ef, G_UNICODE_NOT_PRESENT_OFFSET, 15100 },
+ { 0x1d6f0, G_UNICODE_NOT_PRESENT_OFFSET, 15103 },
+ { 0x1d6f1, G_UNICODE_NOT_PRESENT_OFFSET, 5357 },
+ { 0x1d6f2, G_UNICODE_NOT_PRESENT_OFFSET, 15106 },
+ { 0x1d6f3, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
+ { 0x1d6f4, G_UNICODE_NOT_PRESENT_OFFSET, 1408 },
+ { 0x1d6f5, G_UNICODE_NOT_PRESENT_OFFSET, 15109 },
+ { 0x1d6f6, G_UNICODE_NOT_PRESENT_OFFSET, 1374 },
+ { 0x1d6f7, G_UNICODE_NOT_PRESENT_OFFSET, 15112 },
+ { 0x1d6f8, G_UNICODE_NOT_PRESENT_OFFSET, 15115 },
+ { 0x1d6f9, G_UNICODE_NOT_PRESENT_OFFSET, 15118 },
+ { 0x1d6fa, G_UNICODE_NOT_PRESENT_OFFSET, 5333 },
+ { 0x1d6fb, G_UNICODE_NOT_PRESENT_OFFSET, 15121 },
+ { 0x1d6fc, G_UNICODE_NOT_PRESENT_OFFSET, 15125 },
+ { 0x1d6fd, G_UNICODE_NOT_PRESENT_OFFSET, 1368 },
+ { 0x1d6fe, G_UNICODE_NOT_PRESENT_OFFSET, 2418 },
+ { 0x1d6ff, G_UNICODE_NOT_PRESENT_OFFSET, 2421 },
+ { 0x1d700, G_UNICODE_NOT_PRESENT_OFFSET, 1405 },
+ { 0x1d701, G_UNICODE_NOT_PRESENT_OFFSET, 15128 },
+ { 0x1d702, G_UNICODE_NOT_PRESENT_OFFSET, 15131 },
+ { 0x1d703, G_UNICODE_NOT_PRESENT_OFFSET, 1371 },
+ { 0x1d704, G_UNICODE_NOT_PRESENT_OFFSET, 4860 },
+ { 0x1d705, G_UNICODE_NOT_PRESENT_OFFSET, 1393 },
+ { 0x1d706, G_UNICODE_NOT_PRESENT_OFFSET, 15134 },
+ { 0x1d707, G_UNICODE_NOT_PRESENT_OFFSET, 20 },
+ { 0x1d708, G_UNICODE_NOT_PRESENT_OFFSET, 15137 },
+ { 0x1d709, G_UNICODE_NOT_PRESENT_OFFSET, 15140 },
+ { 0x1d70a, G_UNICODE_NOT_PRESENT_OFFSET, 15143 },
+ { 0x1d70b, G_UNICODE_NOT_PRESENT_OFFSET, 1390 },
+ { 0x1d70c, G_UNICODE_NOT_PRESENT_OFFSET, 1396 },
+ { 0x1d70d, G_UNICODE_NOT_PRESENT_OFFSET, 1399 },
+ { 0x1d70e, G_UNICODE_NOT_PRESENT_OFFSET, 15146 },
+ { 0x1d70f, G_UNICODE_NOT_PRESENT_OFFSET, 15149 },
+ { 0x1d710, G_UNICODE_NOT_PRESENT_OFFSET, 15152 },
+ { 0x1d711, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
+ { 0x1d712, G_UNICODE_NOT_PRESENT_OFFSET, 2424 },
+ { 0x1d713, G_UNICODE_NOT_PRESENT_OFFSET, 15155 },
+ { 0x1d714, G_UNICODE_NOT_PRESENT_OFFSET, 15158 },
+ { 0x1d715, G_UNICODE_NOT_PRESENT_OFFSET, 15161 },
+ { 0x1d716, G_UNICODE_NOT_PRESENT_OFFSET, 1405 },
+ { 0x1d717, G_UNICODE_NOT_PRESENT_OFFSET, 1371 },
+ { 0x1d718, G_UNICODE_NOT_PRESENT_OFFSET, 1393 },
+ { 0x1d719, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
+ { 0x1d71a, G_UNICODE_NOT_PRESENT_OFFSET, 1396 },
+ { 0x1d71b, G_UNICODE_NOT_PRESENT_OFFSET, 1390 },
+ { 0x1d71c, G_UNICODE_NOT_PRESENT_OFFSET, 15067 },
+ { 0x1d71d, G_UNICODE_NOT_PRESENT_OFFSET, 15070 },
+ { 0x1d71e, G_UNICODE_NOT_PRESENT_OFFSET, 5354 },
+ { 0x1d71f, G_UNICODE_NOT_PRESENT_OFFSET, 15073 },
+ { 0x1d720, G_UNICODE_NOT_PRESENT_OFFSET, 15076 },
+ { 0x1d721, G_UNICODE_NOT_PRESENT_OFFSET, 15079 },
+ { 0x1d722, G_UNICODE_NOT_PRESENT_OFFSET, 15082 },
+ { 0x1d723, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
+ { 0x1d724, G_UNICODE_NOT_PRESENT_OFFSET, 15085 },
+ { 0x1d725, G_UNICODE_NOT_PRESENT_OFFSET, 15088 },
+ { 0x1d726, G_UNICODE_NOT_PRESENT_OFFSET, 15091 },
+ { 0x1d727, G_UNICODE_NOT_PRESENT_OFFSET, 15094 },
+ { 0x1d728, G_UNICODE_NOT_PRESENT_OFFSET, 15097 },
+ { 0x1d729, G_UNICODE_NOT_PRESENT_OFFSET, 15100 },
+ { 0x1d72a, G_UNICODE_NOT_PRESENT_OFFSET, 15103 },
+ { 0x1d72b, G_UNICODE_NOT_PRESENT_OFFSET, 5357 },
+ { 0x1d72c, G_UNICODE_NOT_PRESENT_OFFSET, 15106 },
+ { 0x1d72d, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
+ { 0x1d72e, G_UNICODE_NOT_PRESENT_OFFSET, 1408 },
+ { 0x1d72f, G_UNICODE_NOT_PRESENT_OFFSET, 15109 },
+ { 0x1d730, G_UNICODE_NOT_PRESENT_OFFSET, 1374 },
+ { 0x1d731, G_UNICODE_NOT_PRESENT_OFFSET, 15112 },
+ { 0x1d732, G_UNICODE_NOT_PRESENT_OFFSET, 15115 },
+ { 0x1d733, G_UNICODE_NOT_PRESENT_OFFSET, 15118 },
+ { 0x1d734, G_UNICODE_NOT_PRESENT_OFFSET, 5333 },
+ { 0x1d735, G_UNICODE_NOT_PRESENT_OFFSET, 15121 },
+ { 0x1d736, G_UNICODE_NOT_PRESENT_OFFSET, 15125 },
+ { 0x1d737, G_UNICODE_NOT_PRESENT_OFFSET, 1368 },
+ { 0x1d738, G_UNICODE_NOT_PRESENT_OFFSET, 2418 },
+ { 0x1d739, G_UNICODE_NOT_PRESENT_OFFSET, 2421 },
+ { 0x1d73a, G_UNICODE_NOT_PRESENT_OFFSET, 1405 },
+ { 0x1d73b, G_UNICODE_NOT_PRESENT_OFFSET, 15128 },
+ { 0x1d73c, G_UNICODE_NOT_PRESENT_OFFSET, 15131 },
+ { 0x1d73d, G_UNICODE_NOT_PRESENT_OFFSET, 1371 },
+ { 0x1d73e, G_UNICODE_NOT_PRESENT_OFFSET, 4860 },
+ { 0x1d73f, G_UNICODE_NOT_PRESENT_OFFSET, 1393 },
+ { 0x1d740, G_UNICODE_NOT_PRESENT_OFFSET, 15134 },
+ { 0x1d741, G_UNICODE_NOT_PRESENT_OFFSET, 20 },
+ { 0x1d742, G_UNICODE_NOT_PRESENT_OFFSET, 15137 },
+ { 0x1d743, G_UNICODE_NOT_PRESENT_OFFSET, 15140 },
+ { 0x1d744, G_UNICODE_NOT_PRESENT_OFFSET, 15143 },
+ { 0x1d745, G_UNICODE_NOT_PRESENT_OFFSET, 1390 },
+ { 0x1d746, G_UNICODE_NOT_PRESENT_OFFSET, 1396 },
+ { 0x1d747, G_UNICODE_NOT_PRESENT_OFFSET, 1399 },
+ { 0x1d748, G_UNICODE_NOT_PRESENT_OFFSET, 15146 },
+ { 0x1d749, G_UNICODE_NOT_PRESENT_OFFSET, 15149 },
+ { 0x1d74a, G_UNICODE_NOT_PRESENT_OFFSET, 15152 },
+ { 0x1d74b, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
+ { 0x1d74c, G_UNICODE_NOT_PRESENT_OFFSET, 2424 },
+ { 0x1d74d, G_UNICODE_NOT_PRESENT_OFFSET, 15155 },
+ { 0x1d74e, G_UNICODE_NOT_PRESENT_OFFSET, 15158 },
+ { 0x1d74f, G_UNICODE_NOT_PRESENT_OFFSET, 15161 },
+ { 0x1d750, G_UNICODE_NOT_PRESENT_OFFSET, 1405 },
+ { 0x1d751, G_UNICODE_NOT_PRESENT_OFFSET, 1371 },
+ { 0x1d752, G_UNICODE_NOT_PRESENT_OFFSET, 1393 },
+ { 0x1d753, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
+ { 0x1d754, G_UNICODE_NOT_PRESENT_OFFSET, 1396 },
+ { 0x1d755, G_UNICODE_NOT_PRESENT_OFFSET, 1390 },
+ { 0x1d756, G_UNICODE_NOT_PRESENT_OFFSET, 15067 },
+ { 0x1d757, G_UNICODE_NOT_PRESENT_OFFSET, 15070 },
+ { 0x1d758, G_UNICODE_NOT_PRESENT_OFFSET, 5354 },
+ { 0x1d759, G_UNICODE_NOT_PRESENT_OFFSET, 15073 },
+ { 0x1d75a, G_UNICODE_NOT_PRESENT_OFFSET, 15076 },
+ { 0x1d75b, G_UNICODE_NOT_PRESENT_OFFSET, 15079 },
+ { 0x1d75c, G_UNICODE_NOT_PRESENT_OFFSET, 15082 },
+ { 0x1d75d, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
+ { 0x1d75e, G_UNICODE_NOT_PRESENT_OFFSET, 15085 },
+ { 0x1d75f, G_UNICODE_NOT_PRESENT_OFFSET, 15088 },
+ { 0x1d760, G_UNICODE_NOT_PRESENT_OFFSET, 15091 },
+ { 0x1d761, G_UNICODE_NOT_PRESENT_OFFSET, 15094 },
+ { 0x1d762, G_UNICODE_NOT_PRESENT_OFFSET, 15097 },
+ { 0x1d763, G_UNICODE_NOT_PRESENT_OFFSET, 15100 },
+ { 0x1d764, G_UNICODE_NOT_PRESENT_OFFSET, 15103 },
+ { 0x1d765, G_UNICODE_NOT_PRESENT_OFFSET, 5357 },
+ { 0x1d766, G_UNICODE_NOT_PRESENT_OFFSET, 15106 },
+ { 0x1d767, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
+ { 0x1d768, G_UNICODE_NOT_PRESENT_OFFSET, 1408 },
+ { 0x1d769, G_UNICODE_NOT_PRESENT_OFFSET, 15109 },
+ { 0x1d76a, G_UNICODE_NOT_PRESENT_OFFSET, 1374 },
+ { 0x1d76b, G_UNICODE_NOT_PRESENT_OFFSET, 15112 },
+ { 0x1d76c, G_UNICODE_NOT_PRESENT_OFFSET, 15115 },
+ { 0x1d76d, G_UNICODE_NOT_PRESENT_OFFSET, 15118 },
+ { 0x1d76e, G_UNICODE_NOT_PRESENT_OFFSET, 5333 },
+ { 0x1d76f, G_UNICODE_NOT_PRESENT_OFFSET, 15121 },
+ { 0x1d770, G_UNICODE_NOT_PRESENT_OFFSET, 15125 },
+ { 0x1d771, G_UNICODE_NOT_PRESENT_OFFSET, 1368 },
+ { 0x1d772, G_UNICODE_NOT_PRESENT_OFFSET, 2418 },
+ { 0x1d773, G_UNICODE_NOT_PRESENT_OFFSET, 2421 },
+ { 0x1d774, G_UNICODE_NOT_PRESENT_OFFSET, 1405 },
+ { 0x1d775, G_UNICODE_NOT_PRESENT_OFFSET, 15128 },
+ { 0x1d776, G_UNICODE_NOT_PRESENT_OFFSET, 15131 },
+ { 0x1d777, G_UNICODE_NOT_PRESENT_OFFSET, 1371 },
+ { 0x1d778, G_UNICODE_NOT_PRESENT_OFFSET, 4860 },
+ { 0x1d779, G_UNICODE_NOT_PRESENT_OFFSET, 1393 },
+ { 0x1d77a, G_UNICODE_NOT_PRESENT_OFFSET, 15134 },
+ { 0x1d77b, G_UNICODE_NOT_PRESENT_OFFSET, 20 },
+ { 0x1d77c, G_UNICODE_NOT_PRESENT_OFFSET, 15137 },
+ { 0x1d77d, G_UNICODE_NOT_PRESENT_OFFSET, 15140 },
+ { 0x1d77e, G_UNICODE_NOT_PRESENT_OFFSET, 15143 },
+ { 0x1d77f, G_UNICODE_NOT_PRESENT_OFFSET, 1390 },
+ { 0x1d780, G_UNICODE_NOT_PRESENT_OFFSET, 1396 },
+ { 0x1d781, G_UNICODE_NOT_PRESENT_OFFSET, 1399 },
+ { 0x1d782, G_UNICODE_NOT_PRESENT_OFFSET, 15146 },
+ { 0x1d783, G_UNICODE_NOT_PRESENT_OFFSET, 15149 },
+ { 0x1d784, G_UNICODE_NOT_PRESENT_OFFSET, 15152 },
+ { 0x1d785, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
+ { 0x1d786, G_UNICODE_NOT_PRESENT_OFFSET, 2424 },
+ { 0x1d787, G_UNICODE_NOT_PRESENT_OFFSET, 15155 },
+ { 0x1d788, G_UNICODE_NOT_PRESENT_OFFSET, 15158 },
+ { 0x1d789, G_UNICODE_NOT_PRESENT_OFFSET, 15161 },
+ { 0x1d78a, G_UNICODE_NOT_PRESENT_OFFSET, 1405 },
+ { 0x1d78b, G_UNICODE_NOT_PRESENT_OFFSET, 1371 },
+ { 0x1d78c, G_UNICODE_NOT_PRESENT_OFFSET, 1393 },
+ { 0x1d78d, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
+ { 0x1d78e, G_UNICODE_NOT_PRESENT_OFFSET, 1396 },
+ { 0x1d78f, G_UNICODE_NOT_PRESENT_OFFSET, 1390 },
+ { 0x1d790, G_UNICODE_NOT_PRESENT_OFFSET, 15067 },
+ { 0x1d791, G_UNICODE_NOT_PRESENT_OFFSET, 15070 },
+ { 0x1d792, G_UNICODE_NOT_PRESENT_OFFSET, 5354 },
+ { 0x1d793, G_UNICODE_NOT_PRESENT_OFFSET, 15073 },
+ { 0x1d794, G_UNICODE_NOT_PRESENT_OFFSET, 15076 },
+ { 0x1d795, G_UNICODE_NOT_PRESENT_OFFSET, 15079 },
+ { 0x1d796, G_UNICODE_NOT_PRESENT_OFFSET, 15082 },
+ { 0x1d797, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
+ { 0x1d798, G_UNICODE_NOT_PRESENT_OFFSET, 15085 },
+ { 0x1d799, G_UNICODE_NOT_PRESENT_OFFSET, 15088 },
+ { 0x1d79a, G_UNICODE_NOT_PRESENT_OFFSET, 15091 },
+ { 0x1d79b, G_UNICODE_NOT_PRESENT_OFFSET, 15094 },
+ { 0x1d79c, G_UNICODE_NOT_PRESENT_OFFSET, 15097 },
+ { 0x1d79d, G_UNICODE_NOT_PRESENT_OFFSET, 15100 },
+ { 0x1d79e, G_UNICODE_NOT_PRESENT_OFFSET, 15103 },
+ { 0x1d79f, G_UNICODE_NOT_PRESENT_OFFSET, 5357 },
+ { 0x1d7a0, G_UNICODE_NOT_PRESENT_OFFSET, 15106 },
+ { 0x1d7a1, G_UNICODE_NOT_PRESENT_OFFSET, 1402 },
+ { 0x1d7a2, G_UNICODE_NOT_PRESENT_OFFSET, 1408 },
+ { 0x1d7a3, G_UNICODE_NOT_PRESENT_OFFSET, 15109 },
+ { 0x1d7a4, G_UNICODE_NOT_PRESENT_OFFSET, 1374 },
+ { 0x1d7a5, G_UNICODE_NOT_PRESENT_OFFSET, 15112 },
+ { 0x1d7a6, G_UNICODE_NOT_PRESENT_OFFSET, 15115 },
+ { 0x1d7a7, G_UNICODE_NOT_PRESENT_OFFSET, 15118 },
+ { 0x1d7a8, G_UNICODE_NOT_PRESENT_OFFSET, 5333 },
+ { 0x1d7a9, G_UNICODE_NOT_PRESENT_OFFSET, 15121 },
+ { 0x1d7aa, G_UNICODE_NOT_PRESENT_OFFSET, 15125 },
+ { 0x1d7ab, G_UNICODE_NOT_PRESENT_OFFSET, 1368 },
+ { 0x1d7ac, G_UNICODE_NOT_PRESENT_OFFSET, 2418 },
+ { 0x1d7ad, G_UNICODE_NOT_PRESENT_OFFSET, 2421 },
+ { 0x1d7ae, G_UNICODE_NOT_PRESENT_OFFSET, 1405 },
+ { 0x1d7af, G_UNICODE_NOT_PRESENT_OFFSET, 15128 },
+ { 0x1d7b0, G_UNICODE_NOT_PRESENT_OFFSET, 15131 },
+ { 0x1d7b1, G_UNICODE_NOT_PRESENT_OFFSET, 1371 },
+ { 0x1d7b2, G_UNICODE_NOT_PRESENT_OFFSET, 4860 },
+ { 0x1d7b3, G_UNICODE_NOT_PRESENT_OFFSET, 1393 },
+ { 0x1d7b4, G_UNICODE_NOT_PRESENT_OFFSET, 15134 },
+ { 0x1d7b5, G_UNICODE_NOT_PRESENT_OFFSET, 20 },
+ { 0x1d7b6, G_UNICODE_NOT_PRESENT_OFFSET, 15137 },
+ { 0x1d7b7, G_UNICODE_NOT_PRESENT_OFFSET, 15140 },
+ { 0x1d7b8, G_UNICODE_NOT_PRESENT_OFFSET, 15143 },
+ { 0x1d7b9, G_UNICODE_NOT_PRESENT_OFFSET, 1390 },
+ { 0x1d7ba, G_UNICODE_NOT_PRESENT_OFFSET, 1396 },
+ { 0x1d7bb, G_UNICODE_NOT_PRESENT_OFFSET, 1399 },
+ { 0x1d7bc, G_UNICODE_NOT_PRESENT_OFFSET, 15146 },
+ { 0x1d7bd, G_UNICODE_NOT_PRESENT_OFFSET, 15149 },
+ { 0x1d7be, G_UNICODE_NOT_PRESENT_OFFSET, 15152 },
+ { 0x1d7bf, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
+ { 0x1d7c0, G_UNICODE_NOT_PRESENT_OFFSET, 2424 },
+ { 0x1d7c1, G_UNICODE_NOT_PRESENT_OFFSET, 15155 },
+ { 0x1d7c2, G_UNICODE_NOT_PRESENT_OFFSET, 15158 },
+ { 0x1d7c3, G_UNICODE_NOT_PRESENT_OFFSET, 15161 },
+ { 0x1d7c4, G_UNICODE_NOT_PRESENT_OFFSET, 1405 },
+ { 0x1d7c5, G_UNICODE_NOT_PRESENT_OFFSET, 1371 },
+ { 0x1d7c6, G_UNICODE_NOT_PRESENT_OFFSET, 1393 },
+ { 0x1d7c7, G_UNICODE_NOT_PRESENT_OFFSET, 1387 },
+ { 0x1d7c8, G_UNICODE_NOT_PRESENT_OFFSET, 1396 },
+ { 0x1d7c9, G_UNICODE_NOT_PRESENT_OFFSET, 1390 },
+ { 0x1d7ca, G_UNICODE_NOT_PRESENT_OFFSET, 15165 },
+ { 0x1d7cb, G_UNICODE_NOT_PRESENT_OFFSET, 15168 },
+ { 0x1d7ce, G_UNICODE_NOT_PRESENT_OFFSET, 5253 },
+ { 0x1d7cf, G_UNICODE_NOT_PRESENT_OFFSET, 27 },
+ { 0x1d7d0, G_UNICODE_NOT_PRESENT_OFFSET, 12 },
+ { 0x1d7d1, G_UNICODE_NOT_PRESENT_OFFSET, 14 },
+ { 0x1d7d2, G_UNICODE_NOT_PRESENT_OFFSET, 5255 },
+ { 0x1d7d3, G_UNICODE_NOT_PRESENT_OFFSET, 5257 },
+ { 0x1d7d4, G_UNICODE_NOT_PRESENT_OFFSET, 5259 },
+ { 0x1d7d5, G_UNICODE_NOT_PRESENT_OFFSET, 5261 },
+ { 0x1d7d6, G_UNICODE_NOT_PRESENT_OFFSET, 5263 },
+ { 0x1d7d7, G_UNICODE_NOT_PRESENT_OFFSET, 5265 },
+ { 0x1d7d8, G_UNICODE_NOT_PRESENT_OFFSET, 5253 },
+ { 0x1d7d9, G_UNICODE_NOT_PRESENT_OFFSET, 27 },
+ { 0x1d7da, G_UNICODE_NOT_PRESENT_OFFSET, 12 },
+ { 0x1d7db, G_UNICODE_NOT_PRESENT_OFFSET, 14 },
+ { 0x1d7dc, G_UNICODE_NOT_PRESENT_OFFSET, 5255 },
+ { 0x1d7dd, G_UNICODE_NOT_PRESENT_OFFSET, 5257 },
+ { 0x1d7de, G_UNICODE_NOT_PRESENT_OFFSET, 5259 },
+ { 0x1d7df, G_UNICODE_NOT_PRESENT_OFFSET, 5261 },
+ { 0x1d7e0, G_UNICODE_NOT_PRESENT_OFFSET, 5263 },
+ { 0x1d7e1, G_UNICODE_NOT_PRESENT_OFFSET, 5265 },
+ { 0x1d7e2, G_UNICODE_NOT_PRESENT_OFFSET, 5253 },
+ { 0x1d7e3, G_UNICODE_NOT_PRESENT_OFFSET, 27 },
+ { 0x1d7e4, G_UNICODE_NOT_PRESENT_OFFSET, 12 },
+ { 0x1d7e5, G_UNICODE_NOT_PRESENT_OFFSET, 14 },
+ { 0x1d7e6, G_UNICODE_NOT_PRESENT_OFFSET, 5255 },
+ { 0x1d7e7, G_UNICODE_NOT_PRESENT_OFFSET, 5257 },
+ { 0x1d7e8, G_UNICODE_NOT_PRESENT_OFFSET, 5259 },
+ { 0x1d7e9, G_UNICODE_NOT_PRESENT_OFFSET, 5261 },
+ { 0x1d7ea, G_UNICODE_NOT_PRESENT_OFFSET, 5263 },
+ { 0x1d7eb, G_UNICODE_NOT_PRESENT_OFFSET, 5265 },
+ { 0x1d7ec, G_UNICODE_NOT_PRESENT_OFFSET, 5253 },
+ { 0x1d7ed, G_UNICODE_NOT_PRESENT_OFFSET, 27 },
+ { 0x1d7ee, G_UNICODE_NOT_PRESENT_OFFSET, 12 },
+ { 0x1d7ef, G_UNICODE_NOT_PRESENT_OFFSET, 14 },
+ { 0x1d7f0, G_UNICODE_NOT_PRESENT_OFFSET, 5255 },
+ { 0x1d7f1, G_UNICODE_NOT_PRESENT_OFFSET, 5257 },
+ { 0x1d7f2, G_UNICODE_NOT_PRESENT_OFFSET, 5259 },
+ { 0x1d7f3, G_UNICODE_NOT_PRESENT_OFFSET, 5261 },
+ { 0x1d7f4, G_UNICODE_NOT_PRESENT_OFFSET, 5263 },
+ { 0x1d7f5, G_UNICODE_NOT_PRESENT_OFFSET, 5265 },
+ { 0x1d7f6, G_UNICODE_NOT_PRESENT_OFFSET, 5253 },
+ { 0x1d7f7, G_UNICODE_NOT_PRESENT_OFFSET, 27 },
+ { 0x1d7f8, G_UNICODE_NOT_PRESENT_OFFSET, 12 },
+ { 0x1d7f9, G_UNICODE_NOT_PRESENT_OFFSET, 14 },
+ { 0x1d7fa, G_UNICODE_NOT_PRESENT_OFFSET, 5255 },
+ { 0x1d7fb, G_UNICODE_NOT_PRESENT_OFFSET, 5257 },
+ { 0x1d7fc, G_UNICODE_NOT_PRESENT_OFFSET, 5259 },
+ { 0x1d7fd, G_UNICODE_NOT_PRESENT_OFFSET, 5261 },
+ { 0x1d7fe, G_UNICODE_NOT_PRESENT_OFFSET, 5263 },
+ { 0x1d7ff, G_UNICODE_NOT_PRESENT_OFFSET, 5265 },
+ { 0x2f800, 15171, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f801, 15175, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f802, 15179, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f803, 15183, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f804, 15188, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f805, 11915, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f806, 15192, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f807, 15196, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f808, 15200, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f809, 15204, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f80a, 11919, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f80b, 15208, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f80c, 15212, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f80d, 15216, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f80e, 11923, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f80f, 15221, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f810, 15225, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f811, 15229, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f812, 15233, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f813, 15238, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f814, 15242, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f815, 15246, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f816, 15250, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f817, 15255, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f818, 15259, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f819, 15263, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f81a, 15267, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f81b, 12131, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f81c, 15271, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f81d, 6220, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f81e, 15276, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f81f, 15280, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f820, 15284, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f821, 15288, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f822, 15292, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f823, 15296, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f824, 15300, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f825, 12151, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f826, 11927, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f827, 11931, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f828, 12155, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f829, 15304, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f82a, 15308, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f82b, 11207, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f82c, 15312, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f82d, 11935, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f82e, 15316, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f82f, 15320, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f830, 15324, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f831, 15328, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f832, 15328, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f833, 15328, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f834, 15332, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f835, 15337, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f836, 15341, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f837, 15345, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f838, 15349, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f839, 15354, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f83a, 15358, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f83b, 15362, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f83c, 15366, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f83d, 15370, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f83e, 15374, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f83f, 15378, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f840, 15382, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f841, 15386, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f842, 15390, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f843, 15394, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f844, 15398, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f845, 15402, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f846, 15402, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f847, 12163, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f848, 15406, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f849, 15410, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f84a, 15414, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f84b, 15418, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f84c, 11943, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f84d, 15422, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f84e, 15426, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f84f, 15430, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f850, 11791, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f851, 15434, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f852, 15438, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f853, 15442, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f854, 15446, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f855, 15450, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f856, 15454, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f857, 15458, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f858, 15462, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f859, 15466, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f85a, 15471, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f85b, 15475, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f85c, 15479, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f85d, 15483, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f85e, 15487, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f85f, 15491, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f860, 15495, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f861, 15500, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f862, 15505, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f863, 15509, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f864, 15513, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f865, 15517, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f866, 15521, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f867, 15525, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f868, 15529, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f869, 15533, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f86a, 15537, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f86b, 15537, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f86c, 15541, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f86d, 15546, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f86e, 15550, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f86f, 11191, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f870, 15554, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f871, 15558, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f872, 15563, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f873, 15567, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f874, 15571, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f875, 6324, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f876, 15575, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f877, 15579, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f878, 6332, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f879, 15583, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f87a, 15587, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f87b, 15591, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f87c, 15596, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f87d, 15600, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f87e, 15605, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f87f, 15609, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f880, 15613, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f881, 15617, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f882, 15621, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f883, 15625, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f884, 15629, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f885, 15633, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f886, 15637, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f887, 15641, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f888, 15645, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f889, 15649, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f88a, 15654, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f88b, 15658, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f88c, 15662, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f88d, 15666, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f88e, 10983, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f88f, 15670, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f890, 6372, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f891, 15675, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f892, 15675, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f893, 15680, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f894, 15684, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f895, 15684, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f896, 15688, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f897, 15692, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f898, 15697, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f899, 15702, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f89a, 15706, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f89b, 15710, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f89c, 15714, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f89d, 15718, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f89e, 15722, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f89f, 15726, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a0, 15730, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a1, 15734, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a2, 15738, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a3, 11963, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a4, 15742, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a5, 15747, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a6, 15751, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a7, 15755, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a8, 12211, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8a9, 15755, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8aa, 15759, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ab, 11971, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ac, 15763, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ad, 15767, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ae, 15771, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8af, 15775, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b0, 11975, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b1, 10875, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b2, 15779, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b3, 15783, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b4, 15787, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b5, 15791, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b6, 15795, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b7, 15799, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b8, 15803, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8b9, 15808, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ba, 15812, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8bb, 15816, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8bc, 15820, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8bd, 15824, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8be, 15828, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8bf, 15833, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c0, 15837, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c1, 15841, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c2, 15845, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c3, 15849, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c4, 15853, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c5, 15857, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c6, 15861, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c7, 15865, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c8, 11979, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8c9, 15869, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ca, 15873, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8cb, 15878, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8cc, 15882, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8cd, 15886, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ce, 15890, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8cf, 11987, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d0, 15894, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d1, 15898, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d2, 15902, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d3, 15906, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d4, 15910, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d5, 15914, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d6, 15918, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d7, 15922, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d8, 10987, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8d9, 12243, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8da, 15926, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8db, 15930, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8dc, 15934, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8dd, 15938, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8de, 15943, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8df, 15947, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e0, 15951, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e1, 15955, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e2, 11991, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e3, 15959, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e4, 15964, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e5, 15968, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e6, 15972, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e7, 12414, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e8, 15976, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8e9, 15980, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ea, 15984, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8eb, 15988, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ec, 15992, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ed, 15997, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ee, 16001, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ef, 16005, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f0, 16009, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f1, 16014, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f2, 16018, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f3, 16022, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f4, 16026, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f5, 11259, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f6, 16030, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f7, 16034, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f8, 16039, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8f9, 16044, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8fa, 16049, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8fb, 16053, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8fc, 16058, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8fd, 16062, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8fe, 16066, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f8ff, 16070, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f900, 16074, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f901, 11995, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f902, 11591, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f903, 16078, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f904, 16082, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f905, 16086, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f906, 16090, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f907, 16095, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f908, 16099, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f909, 16103, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f90a, 16107, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f90b, 12255, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f90c, 16111, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f90d, 16115, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f90e, 16120, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f90f, 16124, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f910, 16128, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f911, 16133, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f912, 16138, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f913, 16142, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f914, 12259, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f915, 16146, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f916, 16150, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f917, 16154, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f918, 16158, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f919, 16162, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f91a, 16166, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f91b, 16170, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f91c, 16175, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f91d, 16179, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f91e, 16184, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f91f, 16188, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f920, 16193, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f921, 12267, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f922, 16197, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f923, 16201, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f924, 16206, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f925, 16210, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f926, 16214, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f927, 16219, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f928, 16224, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f929, 16228, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f92a, 16232, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f92b, 16236, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f92c, 16240, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f92d, 16240, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f92e, 16244, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f92f, 16248, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f930, 12275, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f931, 16252, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f932, 16256, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f933, 16260, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f934, 16264, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f935, 16268, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f936, 16273, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f937, 16277, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f938, 11203, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f939, 16282, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f93a, 16287, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f93b, 16291, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f93c, 16296, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f93d, 16301, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f93e, 16306, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f93f, 16310, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f940, 12299, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f941, 16314, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f942, 16319, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f943, 16324, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f944, 16329, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f945, 16334, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f946, 16338, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f947, 16338, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f948, 12303, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f949, 12422, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f94a, 16342, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f94b, 16346, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f94c, 16350, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f94d, 16354, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f94e, 16359, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f94f, 11055, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f950, 12311, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f951, 16363, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f952, 16367, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f953, 12035, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f954, 16372, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f955, 16377, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f956, 11871, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f957, 16382, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f958, 16386, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f959, 12047, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f95a, 16390, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f95b, 16394, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f95c, 16398, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f95d, 16403, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f95e, 16403, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f95f, 16408, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f960, 16412, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f961, 16416, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f962, 16421, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f963, 16425, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f964, 16429, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f965, 16433, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f966, 16438, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f967, 16442, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f968, 16446, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f969, 16450, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f96a, 16454, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f96b, 16458, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f96c, 16463, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f96d, 16467, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f96e, 16471, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f96f, 16475, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f970, 16479, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f971, 16483, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f972, 16487, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f973, 16492, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f974, 16497, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f975, 16501, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f976, 16506, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f977, 16510, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f978, 16515, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f979, 16519, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f97a, 12071, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f97b, 16523, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f97c, 16528, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f97d, 16533, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f97e, 16537, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f97f, 16542, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f980, 16546, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f981, 16551, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f982, 16555, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f983, 16559, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f984, 16563, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f985, 16567, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f986, 16571, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f987, 16575, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f988, 16580, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f989, 16585, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f98a, 16590, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f98b, 15680, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f98c, 16595, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f98d, 16599, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f98e, 16603, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f98f, 16607, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f990, 16611, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f991, 16615, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f992, 16619, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f993, 16623, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f994, 16627, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f995, 16631, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f996, 16635, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f997, 16639, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f998, 11271, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f999, 16644, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f99a, 16648, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f99b, 16652, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f99c, 16656, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f99d, 16660, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f99e, 16664, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f99f, 12083, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a0, 16668, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a1, 16672, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a2, 16676, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a3, 16680, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a4, 16684, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a5, 16689, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a6, 16694, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a7, 16699, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a8, 16703, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9a9, 16707, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9aa, 16711, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ab, 16715, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ac, 16720, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ad, 16724, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ae, 16729, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9af, 16733, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b0, 16737, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b1, 16742, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b2, 16747, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b3, 16751, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b4, 11035, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b5, 16755, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b6, 16759, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b7, 16763, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b8, 16767, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9b9, 16771, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ba, 16775, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9bb, 12339, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9bc, 16779, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9bd, 16783, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9be, 16787, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9bf, 16791, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c0, 16795, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c1, 16799, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c2, 16803, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c3, 16807, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c4, 6732, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c5, 16811, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c6, 16816, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c7, 16820, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c8, 16824, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9c9, 16828, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ca, 16832, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9cb, 16836, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9cc, 16841, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9cd, 16846, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ce, 16850, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9cf, 16854, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d0, 12359, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d1, 12363, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d2, 6760, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d3, 16858, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d4, 16863, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d5, 16867, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d6, 16871, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d7, 16875, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d8, 16879, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9d9, 16884, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9da, 16889, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9db, 16893, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9dc, 16897, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9dd, 16901, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9de, 16906, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9df, 12367, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e0, 16910, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e1, 16915, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e2, 16920, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e3, 16924, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e4, 16928, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e5, 16932, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e6, 16937, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e7, 16941, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e8, 16945, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9e9, 16949, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ea, 16953, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9eb, 16957, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ec, 16961, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ed, 16965, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ee, 16970, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ef, 16974, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f0, 16978, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f1, 16982, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f2, 16987, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f3, 16991, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f4, 16995, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f5, 16999, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f6, 17003, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f7, 17008, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f8, 17013, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9f9, 17017, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9fa, 17021, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9fb, 17025, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9fc, 17030, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9fd, 17034, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9fe, 12391, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2f9ff, 12391, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa00, 17039, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa01, 17043, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa02, 17048, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa03, 17052, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa04, 17056, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa05, 17060, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa06, 17064, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa07, 17068, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa08, 17072, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa09, 17076, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa0a, 12395, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa0b, 17081, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa0c, 17085, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa0d, 17089, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa0e, 17093, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa0f, 17097, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa10, 17101, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa11, 17106, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa12, 17110, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa13, 17115, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa14, 17120, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa15, 6952, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa16, 17125, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa17, 6968, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa18, 17129, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa19, 17133, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa1a, 17137, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa1b, 17141, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa1c, 6988, G_UNICODE_NOT_PRESENT_OFFSET },
+ { 0x2fa1d, 17145, G_UNICODE_NOT_PRESENT_OFFSET }
+};
+
+static const gchar decomp_expansion_string[] =
+ "\x20\0" /* offset 0 */
+ "\x20\xcc\x88\0" /* offset 2 */
+ "\x61\0" /* offset 6 */
+ "\x20\xcc\x84\0" /* offset 8 */
+ "\x32\0" /* offset 12 */
+ "\x33\0" /* offset 14 */
+ "\x20\xcc\x81\0" /* offset 16 */
+ "\xce\xbc\0" /* offset 20 */
+ "\x20\xcc\xa7\0" /* offset 23 */
+ "\x31\0" /* offset 27 */
+ "\x6f\0" /* offset 29 */
+ "\x31\xe2\x81\x84\x34\0" /* offset 31 */
+ "\x31\xe2\x81\x84\x32\0" /* offset 37 */
+ "\x33\xe2\x81\x84\x34\0" /* offset 43 */
+ "\x41\xcc\x80\0" /* offset 49 */
+ "\x41\xcc\x81\0" /* offset 53 */
+ "\x41\xcc\x82\0" /* offset 57 */
+ "\x41\xcc\x83\0" /* offset 61 */
+ "\x41\xcc\x88\0" /* offset 65 */
+ "\x41\xcc\x8a\0" /* offset 69 */
+ "\x43\xcc\xa7\0" /* offset 73 */
+ "\x45\xcc\x80\0" /* offset 77 */
+ "\x45\xcc\x81\0" /* offset 81 */
+ "\x45\xcc\x82\0" /* offset 85 */
+ "\x45\xcc\x88\0" /* offset 89 */
+ "\x49\xcc\x80\0" /* offset 93 */
+ "\x49\xcc\x81\0" /* offset 97 */
+ "\x49\xcc\x82\0" /* offset 101 */
+ "\x49\xcc\x88\0" /* offset 105 */
+ "\x4e\xcc\x83\0" /* offset 109 */
+ "\x4f\xcc\x80\0" /* offset 113 */
+ "\x4f\xcc\x81\0" /* offset 117 */
+ "\x4f\xcc\x82\0" /* offset 121 */
+ "\x4f\xcc\x83\0" /* offset 125 */
+ "\x4f\xcc\x88\0" /* offset 129 */
+ "\x55\xcc\x80\0" /* offset 133 */
+ "\x55\xcc\x81\0" /* offset 137 */
+ "\x55\xcc\x82\0" /* offset 141 */
+ "\x55\xcc\x88\0" /* offset 145 */
+ "\x59\xcc\x81\0" /* offset 149 */
+ "\x61\xcc\x80\0" /* offset 153 */
+ "\x61\xcc\x81\0" /* offset 157 */
+ "\x61\xcc\x82\0" /* offset 161 */
+ "\x61\xcc\x83\0" /* offset 165 */
+ "\x61\xcc\x88\0" /* offset 169 */
+ "\x61\xcc\x8a\0" /* offset 173 */
+ "\x63\xcc\xa7\0" /* offset 177 */
+ "\x65\xcc\x80\0" /* offset 181 */
+ "\x65\xcc\x81\0" /* offset 185 */
+ "\x65\xcc\x82\0" /* offset 189 */
+ "\x65\xcc\x88\0" /* offset 193 */
+ "\x69\xcc\x80\0" /* offset 197 */
+ "\x69\xcc\x81\0" /* offset 201 */
+ "\x69\xcc\x82\0" /* offset 205 */
+ "\x69\xcc\x88\0" /* offset 209 */
+ "\x6e\xcc\x83\0" /* offset 213 */
+ "\x6f\xcc\x80\0" /* offset 217 */
+ "\x6f\xcc\x81\0" /* offset 221 */
+ "\x6f\xcc\x82\0" /* offset 225 */
+ "\x6f\xcc\x83\0" /* offset 229 */
+ "\x6f\xcc\x88\0" /* offset 233 */
+ "\x75\xcc\x80\0" /* offset 237 */
+ "\x75\xcc\x81\0" /* offset 241 */
+ "\x75\xcc\x82\0" /* offset 245 */
+ "\x75\xcc\x88\0" /* offset 249 */
+ "\x79\xcc\x81\0" /* offset 253 */
+ "\x79\xcc\x88\0" /* offset 257 */
+ "\x41\xcc\x84\0" /* offset 261 */
+ "\x61\xcc\x84\0" /* offset 265 */
+ "\x41\xcc\x86\0" /* offset 269 */
+ "\x61\xcc\x86\0" /* offset 273 */
+ "\x41\xcc\xa8\0" /* offset 277 */
+ "\x61\xcc\xa8\0" /* offset 281 */
+ "\x43\xcc\x81\0" /* offset 285 */
+ "\x63\xcc\x81\0" /* offset 289 */
+ "\x43\xcc\x82\0" /* offset 293 */
+ "\x63\xcc\x82\0" /* offset 297 */
+ "\x43\xcc\x87\0" /* offset 301 */
+ "\x63\xcc\x87\0" /* offset 305 */
+ "\x43\xcc\x8c\0" /* offset 309 */
+ "\x63\xcc\x8c\0" /* offset 313 */
+ "\x44\xcc\x8c\0" /* offset 317 */
+ "\x64\xcc\x8c\0" /* offset 321 */
+ "\x45\xcc\x84\0" /* offset 325 */
+ "\x65\xcc\x84\0" /* offset 329 */
+ "\x45\xcc\x86\0" /* offset 333 */
+ "\x65\xcc\x86\0" /* offset 337 */
+ "\x45\xcc\x87\0" /* offset 341 */
+ "\x65\xcc\x87\0" /* offset 345 */
+ "\x45\xcc\xa8\0" /* offset 349 */
+ "\x65\xcc\xa8\0" /* offset 353 */
+ "\x45\xcc\x8c\0" /* offset 357 */
+ "\x65\xcc\x8c\0" /* offset 361 */
+ "\x47\xcc\x82\0" /* offset 365 */
+ "\x67\xcc\x82\0" /* offset 369 */
+ "\x47\xcc\x86\0" /* offset 373 */
+ "\x67\xcc\x86\0" /* offset 377 */
+ "\x47\xcc\x87\0" /* offset 381 */
+ "\x67\xcc\x87\0" /* offset 385 */
+ "\x47\xcc\xa7\0" /* offset 389 */
+ "\x67\xcc\xa7\0" /* offset 393 */
+ "\x48\xcc\x82\0" /* offset 397 */
+ "\x68\xcc\x82\0" /* offset 401 */
+ "\x49\xcc\x83\0" /* offset 405 */
+ "\x69\xcc\x83\0" /* offset 409 */
+ "\x49\xcc\x84\0" /* offset 413 */
+ "\x69\xcc\x84\0" /* offset 417 */
+ "\x49\xcc\x86\0" /* offset 421 */
+ "\x69\xcc\x86\0" /* offset 425 */
+ "\x49\xcc\xa8\0" /* offset 429 */
+ "\x69\xcc\xa8\0" /* offset 433 */
+ "\x49\xcc\x87\0" /* offset 437 */
+ "\x49\x4a\0" /* offset 441 */
+ "\x69\x6a\0" /* offset 444 */
+ "\x4a\xcc\x82\0" /* offset 447 */
+ "\x6a\xcc\x82\0" /* offset 451 */
+ "\x4b\xcc\xa7\0" /* offset 455 */
+ "\x6b\xcc\xa7\0" /* offset 459 */
+ "\x4c\xcc\x81\0" /* offset 463 */
+ "\x6c\xcc\x81\0" /* offset 467 */
+ "\x4c\xcc\xa7\0" /* offset 471 */
+ "\x6c\xcc\xa7\0" /* offset 475 */
+ "\x4c\xcc\x8c\0" /* offset 479 */
+ "\x6c\xcc\x8c\0" /* offset 483 */
+ "\x4c\xc2\xb7\0" /* offset 487 */
+ "\x6c\xc2\xb7\0" /* offset 491 */
+ "\x4e\xcc\x81\0" /* offset 495 */
+ "\x6e\xcc\x81\0" /* offset 499 */
+ "\x4e\xcc\xa7\0" /* offset 503 */
+ "\x6e\xcc\xa7\0" /* offset 507 */
+ "\x4e\xcc\x8c\0" /* offset 511 */
+ "\x6e\xcc\x8c\0" /* offset 515 */
+ "\xca\xbc\x6e\0" /* offset 519 */
+ "\x4f\xcc\x84\0" /* offset 523 */
+ "\x6f\xcc\x84\0" /* offset 527 */
+ "\x4f\xcc\x86\0" /* offset 531 */
+ "\x6f\xcc\x86\0" /* offset 535 */
+ "\x4f\xcc\x8b\0" /* offset 539 */
+ "\x6f\xcc\x8b\0" /* offset 543 */
+ "\x52\xcc\x81\0" /* offset 547 */
+ "\x72\xcc\x81\0" /* offset 551 */
+ "\x52\xcc\xa7\0" /* offset 555 */
+ "\x72\xcc\xa7\0" /* offset 559 */
+ "\x52\xcc\x8c\0" /* offset 563 */
+ "\x72\xcc\x8c\0" /* offset 567 */
+ "\x53\xcc\x81\0" /* offset 571 */
+ "\x73\xcc\x81\0" /* offset 575 */
+ "\x53\xcc\x82\0" /* offset 579 */
+ "\x73\xcc\x82\0" /* offset 583 */
+ "\x53\xcc\xa7\0" /* offset 587 */
+ "\x73\xcc\xa7\0" /* offset 591 */
+ "\x53\xcc\x8c\0" /* offset 595 */
+ "\x73\xcc\x8c\0" /* offset 599 */
+ "\x54\xcc\xa7\0" /* offset 603 */
+ "\x74\xcc\xa7\0" /* offset 607 */
+ "\x54\xcc\x8c\0" /* offset 611 */
+ "\x74\xcc\x8c\0" /* offset 615 */
+ "\x55\xcc\x83\0" /* offset 619 */
+ "\x75\xcc\x83\0" /* offset 623 */
+ "\x55\xcc\x84\0" /* offset 627 */
+ "\x75\xcc\x84\0" /* offset 631 */
+ "\x55\xcc\x86\0" /* offset 635 */
+ "\x75\xcc\x86\0" /* offset 639 */
+ "\x55\xcc\x8a\0" /* offset 643 */
+ "\x75\xcc\x8a\0" /* offset 647 */
+ "\x55\xcc\x8b\0" /* offset 651 */
+ "\x75\xcc\x8b\0" /* offset 655 */
+ "\x55\xcc\xa8\0" /* offset 659 */
+ "\x75\xcc\xa8\0" /* offset 663 */
+ "\x57\xcc\x82\0" /* offset 667 */
+ "\x77\xcc\x82\0" /* offset 671 */
+ "\x59\xcc\x82\0" /* offset 675 */
+ "\x79\xcc\x82\0" /* offset 679 */
+ "\x59\xcc\x88\0" /* offset 683 */
+ "\x5a\xcc\x81\0" /* offset 687 */
+ "\x7a\xcc\x81\0" /* offset 691 */
+ "\x5a\xcc\x87\0" /* offset 695 */
+ "\x7a\xcc\x87\0" /* offset 699 */
+ "\x5a\xcc\x8c\0" /* offset 703 */
+ "\x7a\xcc\x8c\0" /* offset 707 */
+ "\x73\0" /* offset 711 */
+ "\x4f\xcc\x9b\0" /* offset 713 */
+ "\x6f\xcc\x9b\0" /* offset 717 */
+ "\x55\xcc\x9b\0" /* offset 721 */
+ "\x75\xcc\x9b\0" /* offset 725 */
+ "\x44\x5a\xcc\x8c\0" /* offset 729 */
+ "\x44\x7a\xcc\x8c\0" /* offset 734 */
+ "\x64\x7a\xcc\x8c\0" /* offset 739 */
+ "\x4c\x4a\0" /* offset 744 */
+ "\x4c\x6a\0" /* offset 747 */
+ "\x6c\x6a\0" /* offset 750 */
+ "\x4e\x4a\0" /* offset 753 */
+ "\x4e\x6a\0" /* offset 756 */
+ "\x6e\x6a\0" /* offset 759 */
+ "\x41\xcc\x8c\0" /* offset 762 */
+ "\x61\xcc\x8c\0" /* offset 766 */
+ "\x49\xcc\x8c\0" /* offset 770 */
+ "\x69\xcc\x8c\0" /* offset 774 */
+ "\x4f\xcc\x8c\0" /* offset 778 */
+ "\x6f\xcc\x8c\0" /* offset 782 */
+ "\x55\xcc\x8c\0" /* offset 786 */
+ "\x75\xcc\x8c\0" /* offset 790 */
+ "\x55\xcc\x88\xcc\x84\0" /* offset 794 */
+ "\x75\xcc\x88\xcc\x84\0" /* offset 800 */
+ "\x55\xcc\x88\xcc\x81\0" /* offset 806 */
+ "\x75\xcc\x88\xcc\x81\0" /* offset 812 */
+ "\x55\xcc\x88\xcc\x8c\0" /* offset 818 */
+ "\x75\xcc\x88\xcc\x8c\0" /* offset 824 */
+ "\x55\xcc\x88\xcc\x80\0" /* offset 830 */
+ "\x75\xcc\x88\xcc\x80\0" /* offset 836 */
+ "\x41\xcc\x88\xcc\x84\0" /* offset 842 */
+ "\x61\xcc\x88\xcc\x84\0" /* offset 848 */
+ "\x41\xcc\x87\xcc\x84\0" /* offset 854 */
+ "\x61\xcc\x87\xcc\x84\0" /* offset 860 */
+ "\xc3\x86\xcc\x84\0" /* offset 866 */
+ "\xc3\xa6\xcc\x84\0" /* offset 871 */
+ "\x47\xcc\x8c\0" /* offset 876 */
+ "\x67\xcc\x8c\0" /* offset 880 */
+ "\x4b\xcc\x8c\0" /* offset 884 */
+ "\x6b\xcc\x8c\0" /* offset 888 */
+ "\x4f\xcc\xa8\0" /* offset 892 */
+ "\x6f\xcc\xa8\0" /* offset 896 */
+ "\x4f\xcc\xa8\xcc\x84\0" /* offset 900 */
+ "\x6f\xcc\xa8\xcc\x84\0" /* offset 906 */
+ "\xc6\xb7\xcc\x8c\0" /* offset 912 */
+ "\xca\x92\xcc\x8c\0" /* offset 917 */
+ "\x6a\xcc\x8c\0" /* offset 922 */
+ "\x44\x5a\0" /* offset 926 */
+ "\x44\x7a\0" /* offset 929 */
+ "\x64\x7a\0" /* offset 932 */
+ "\x47\xcc\x81\0" /* offset 935 */
+ "\x67\xcc\x81\0" /* offset 939 */
+ "\x4e\xcc\x80\0" /* offset 943 */
+ "\x6e\xcc\x80\0" /* offset 947 */
+ "\x41\xcc\x8a\xcc\x81\0" /* offset 951 */
+ "\x61\xcc\x8a\xcc\x81\0" /* offset 957 */
+ "\xc3\x86\xcc\x81\0" /* offset 963 */
+ "\xc3\xa6\xcc\x81\0" /* offset 968 */
+ "\xc3\x98\xcc\x81\0" /* offset 973 */
+ "\xc3\xb8\xcc\x81\0" /* offset 978 */
+ "\x41\xcc\x8f\0" /* offset 983 */
+ "\x61\xcc\x8f\0" /* offset 987 */
+ "\x41\xcc\x91\0" /* offset 991 */
+ "\x61\xcc\x91\0" /* offset 995 */
+ "\x45\xcc\x8f\0" /* offset 999 */
+ "\x65\xcc\x8f\0" /* offset 1003 */
+ "\x45\xcc\x91\0" /* offset 1007 */
+ "\x65\xcc\x91\0" /* offset 1011 */
+ "\x49\xcc\x8f\0" /* offset 1015 */
+ "\x69\xcc\x8f\0" /* offset 1019 */
+ "\x49\xcc\x91\0" /* offset 1023 */
+ "\x69\xcc\x91\0" /* offset 1027 */
+ "\x4f\xcc\x8f\0" /* offset 1031 */
+ "\x6f\xcc\x8f\0" /* offset 1035 */
+ "\x4f\xcc\x91\0" /* offset 1039 */
+ "\x6f\xcc\x91\0" /* offset 1043 */
+ "\x52\xcc\x8f\0" /* offset 1047 */
+ "\x72\xcc\x8f\0" /* offset 1051 */
+ "\x52\xcc\x91\0" /* offset 1055 */
+ "\x72\xcc\x91\0" /* offset 1059 */
+ "\x55\xcc\x8f\0" /* offset 1063 */
+ "\x75\xcc\x8f\0" /* offset 1067 */
+ "\x55\xcc\x91\0" /* offset 1071 */
+ "\x75\xcc\x91\0" /* offset 1075 */
+ "\x53\xcc\xa6\0" /* offset 1079 */
+ "\x73\xcc\xa6\0" /* offset 1083 */
+ "\x54\xcc\xa6\0" /* offset 1087 */
+ "\x74\xcc\xa6\0" /* offset 1091 */
+ "\x48\xcc\x8c\0" /* offset 1095 */
+ "\x68\xcc\x8c\0" /* offset 1099 */
+ "\x41\xcc\x87\0" /* offset 1103 */
+ "\x61\xcc\x87\0" /* offset 1107 */
+ "\x45\xcc\xa7\0" /* offset 1111 */
+ "\x65\xcc\xa7\0" /* offset 1115 */
+ "\x4f\xcc\x88\xcc\x84\0" /* offset 1119 */
+ "\x6f\xcc\x88\xcc\x84\0" /* offset 1125 */
+ "\x4f\xcc\x83\xcc\x84\0" /* offset 1131 */
+ "\x6f\xcc\x83\xcc\x84\0" /* offset 1137 */
+ "\x4f\xcc\x87\0" /* offset 1143 */
+ "\x6f\xcc\x87\0" /* offset 1147 */
+ "\x4f\xcc\x87\xcc\x84\0" /* offset 1151 */
+ "\x6f\xcc\x87\xcc\x84\0" /* offset 1157 */
+ "\x59\xcc\x84\0" /* offset 1163 */
+ "\x79\xcc\x84\0" /* offset 1167 */
+ "\x68\0" /* offset 1171 */
+ "\xc9\xa6\0" /* offset 1173 */
+ "\x6a\0" /* offset 1176 */
+ "\x72\0" /* offset 1178 */
+ "\xc9\xb9\0" /* offset 1180 */
+ "\xc9\xbb\0" /* offset 1183 */
+ "\xca\x81\0" /* offset 1186 */
+ "\x77\0" /* offset 1189 */
+ "\x79\0" /* offset 1191 */
+ "\x20\xcc\x86\0" /* offset 1193 */
+ "\x20\xcc\x87\0" /* offset 1197 */
+ "\x20\xcc\x8a\0" /* offset 1201 */
+ "\x20\xcc\xa8\0" /* offset 1205 */
+ "\x20\xcc\x83\0" /* offset 1209 */
+ "\x20\xcc\x8b\0" /* offset 1213 */
+ "\xc9\xa3\0" /* offset 1217 */
+ "\x6c\0" /* offset 1220 */
+ "\x78\0" /* offset 1222 */
+ "\xca\x95\0" /* offset 1224 */
+ "\xcc\x80\0" /* offset 1227 */
+ "\xcc\x81\0" /* offset 1230 */
+ "\xcc\x93\0" /* offset 1233 */
+ "\xcc\x88\xcc\x81\0" /* offset 1236 */
+ "\xca\xb9\0" /* offset 1241 */
+ "\x20\xcd\x85\0" /* offset 1244 */
+ "\x3b\0" /* offset 1248 */
+ "\xc2\xa8\xcc\x81\0" /* offset 1250 */
+ "\x20\xcc\x88\xcc\x81\0" /* offset 1255 */
+ "\xce\x91\xcc\x81\0" /* offset 1261 */
+ "\xc2\xb7\0" /* offset 1266 */
+ "\xce\x95\xcc\x81\0" /* offset 1269 */
+ "\xce\x97\xcc\x81\0" /* offset 1274 */
+ "\xce\x99\xcc\x81\0" /* offset 1279 */
+ "\xce\x9f\xcc\x81\0" /* offset 1284 */
+ "\xce\xa5\xcc\x81\0" /* offset 1289 */
+ "\xce\xa9\xcc\x81\0" /* offset 1294 */
+ "\xce\xb9\xcc\x88\xcc\x81\0" /* offset 1299 */
+ "\xce\x99\xcc\x88\0" /* offset 1306 */
+ "\xce\xa5\xcc\x88\0" /* offset 1311 */
+ "\xce\xb1\xcc\x81\0" /* offset 1316 */
+ "\xce\xb5\xcc\x81\0" /* offset 1321 */
+ "\xce\xb7\xcc\x81\0" /* offset 1326 */
+ "\xce\xb9\xcc\x81\0" /* offset 1331 */
+ "\xcf\x85\xcc\x88\xcc\x81\0" /* offset 1336 */
+ "\xce\xb9\xcc\x88\0" /* offset 1343 */
+ "\xcf\x85\xcc\x88\0" /* offset 1348 */
+ "\xce\xbf\xcc\x81\0" /* offset 1353 */
+ "\xcf\x85\xcc\x81\0" /* offset 1358 */
+ "\xcf\x89\xcc\x81\0" /* offset 1363 */
+ "\xce\xb2\0" /* offset 1368 */
+ "\xce\xb8\0" /* offset 1371 */
+ "\xce\xa5\0" /* offset 1374 */
+ "\xcf\x92\xcc\x81\0" /* offset 1377 */
+ "\xcf\x92\xcc\x88\0" /* offset 1382 */
+ "\xcf\x86\0" /* offset 1387 */
+ "\xcf\x80\0" /* offset 1390 */
+ "\xce\xba\0" /* offset 1393 */
+ "\xcf\x81\0" /* offset 1396 */
+ "\xcf\x82\0" /* offset 1399 */
+ "\xce\x98\0" /* offset 1402 */
+ "\xce\xb5\0" /* offset 1405 */
+ "\xce\xa3\0" /* offset 1408 */
+ "\xd0\x95\xcc\x80\0" /* offset 1411 */
+ "\xd0\x95\xcc\x88\0" /* offset 1416 */
+ "\xd0\x93\xcc\x81\0" /* offset 1421 */
+ "\xd0\x86\xcc\x88\0" /* offset 1426 */
+ "\xd0\x9a\xcc\x81\0" /* offset 1431 */
+ "\xd0\x98\xcc\x80\0" /* offset 1436 */
+ "\xd0\xa3\xcc\x86\0" /* offset 1441 */
+ "\xd0\x98\xcc\x86\0" /* offset 1446 */
+ "\xd0\xb8\xcc\x86\0" /* offset 1451 */
+ "\xd0\xb5\xcc\x80\0" /* offset 1456 */
+ "\xd0\xb5\xcc\x88\0" /* offset 1461 */
+ "\xd0\xb3\xcc\x81\0" /* offset 1466 */
+ "\xd1\x96\xcc\x88\0" /* offset 1471 */
+ "\xd0\xba\xcc\x81\0" /* offset 1476 */
+ "\xd0\xb8\xcc\x80\0" /* offset 1481 */
+ "\xd1\x83\xcc\x86\0" /* offset 1486 */
+ "\xd1\xb4\xcc\x8f\0" /* offset 1491 */
+ "\xd1\xb5\xcc\x8f\0" /* offset 1496 */
+ "\xd0\x96\xcc\x86\0" /* offset 1501 */
+ "\xd0\xb6\xcc\x86\0" /* offset 1506 */
+ "\xd0\x90\xcc\x86\0" /* offset 1511 */
+ "\xd0\xb0\xcc\x86\0" /* offset 1516 */
+ "\xd0\x90\xcc\x88\0" /* offset 1521 */
+ "\xd0\xb0\xcc\x88\0" /* offset 1526 */
+ "\xd0\x95\xcc\x86\0" /* offset 1531 */
+ "\xd0\xb5\xcc\x86\0" /* offset 1536 */
+ "\xd3\x98\xcc\x88\0" /* offset 1541 */
+ "\xd3\x99\xcc\x88\0" /* offset 1546 */
+ "\xd0\x96\xcc\x88\0" /* offset 1551 */
+ "\xd0\xb6\xcc\x88\0" /* offset 1556 */
+ "\xd0\x97\xcc\x88\0" /* offset 1561 */
+ "\xd0\xb7\xcc\x88\0" /* offset 1566 */
+ "\xd0\x98\xcc\x84\0" /* offset 1571 */
+ "\xd0\xb8\xcc\x84\0" /* offset 1576 */
+ "\xd0\x98\xcc\x88\0" /* offset 1581 */
+ "\xd0\xb8\xcc\x88\0" /* offset 1586 */
+ "\xd0\x9e\xcc\x88\0" /* offset 1591 */
+ "\xd0\xbe\xcc\x88\0" /* offset 1596 */
+ "\xd3\xa8\xcc\x88\0" /* offset 1601 */
+ "\xd3\xa9\xcc\x88\0" /* offset 1606 */
+ "\xd0\xad\xcc\x88\0" /* offset 1611 */
+ "\xd1\x8d\xcc\x88\0" /* offset 1616 */
+ "\xd0\xa3\xcc\x84\0" /* offset 1621 */
+ "\xd1\x83\xcc\x84\0" /* offset 1626 */
+ "\xd0\xa3\xcc\x88\0" /* offset 1631 */
+ "\xd1\x83\xcc\x88\0" /* offset 1636 */
+ "\xd0\xa3\xcc\x8b\0" /* offset 1641 */
+ "\xd1\x83\xcc\x8b\0" /* offset 1646 */
+ "\xd0\xa7\xcc\x88\0" /* offset 1651 */
+ "\xd1\x87\xcc\x88\0" /* offset 1656 */
+ "\xd0\xab\xcc\x88\0" /* offset 1661 */
+ "\xd1\x8b\xcc\x88\0" /* offset 1666 */
+ "\xd5\xa5\xd6\x82\0" /* offset 1671 */
+ "\xd8\xa7\xd9\x93\0" /* offset 1676 */
+ "\xd8\xa7\xd9\x94\0" /* offset 1681 */
+ "\xd9\x88\xd9\x94\0" /* offset 1686 */
+ "\xd8\xa7\xd9\x95\0" /* offset 1691 */
+ "\xd9\x8a\xd9\x94\0" /* offset 1696 */
+ "\xd8\xa7\xd9\xb4\0" /* offset 1701 */
+ "\xd9\x88\xd9\xb4\0" /* offset 1706 */
+ "\xdb\x87\xd9\xb4\0" /* offset 1711 */
+ "\xd9\x8a\xd9\xb4\0" /* offset 1716 */
+ "\xdb\x95\xd9\x94\0" /* offset 1721 */
+ "\xdb\x81\xd9\x94\0" /* offset 1726 */
+ "\xdb\x92\xd9\x94\0" /* offset 1731 */
+ "\xe0\xa4\xa8\xe0\xa4\xbc\0" /* offset 1736 */
+ "\xe0\xa4\xb0\xe0\xa4\xbc\0" /* offset 1743 */
+ "\xe0\xa4\xb3\xe0\xa4\xbc\0" /* offset 1750 */
+ "\xe0\xa4\x95\xe0\xa4\xbc\0" /* offset 1757 */
+ "\xe0\xa4\x96\xe0\xa4\xbc\0" /* offset 1764 */
+ "\xe0\xa4\x97\xe0\xa4\xbc\0" /* offset 1771 */
+ "\xe0\xa4\x9c\xe0\xa4\xbc\0" /* offset 1778 */
+ "\xe0\xa4\xa1\xe0\xa4\xbc\0" /* offset 1785 */
+ "\xe0\xa4\xa2\xe0\xa4\xbc\0" /* offset 1792 */
+ "\xe0\xa4\xab\xe0\xa4\xbc\0" /* offset 1799 */
+ "\xe0\xa4\xaf\xe0\xa4\xbc\0" /* offset 1806 */
+ "\xe0\xa7\x87\xe0\xa6\xbe\0" /* offset 1813 */
+ "\xe0\xa7\x87\xe0\xa7\x97\0" /* offset 1820 */
+ "\xe0\xa6\xa1\xe0\xa6\xbc\0" /* offset 1827 */
+ "\xe0\xa6\xa2\xe0\xa6\xbc\0" /* offset 1834 */
+ "\xe0\xa6\xaf\xe0\xa6\xbc\0" /* offset 1841 */
+ "\xe0\xa8\xb2\xe0\xa8\xbc\0" /* offset 1848 */
+ "\xe0\xa8\xb8\xe0\xa8\xbc\0" /* offset 1855 */
+ "\xe0\xa8\x96\xe0\xa8\xbc\0" /* offset 1862 */
+ "\xe0\xa8\x97\xe0\xa8\xbc\0" /* offset 1869 */
+ "\xe0\xa8\x9c\xe0\xa8\xbc\0" /* offset 1876 */
+ "\xe0\xa8\xab\xe0\xa8\xbc\0" /* offset 1883 */
+ "\xe0\xad\x87\xe0\xad\x96\0" /* offset 1890 */
+ "\xe0\xad\x87\xe0\xac\xbe\0" /* offset 1897 */
+ "\xe0\xad\x87\xe0\xad\x97\0" /* offset 1904 */
+ "\xe0\xac\xa1\xe0\xac\xbc\0" /* offset 1911 */
+ "\xe0\xac\xa2\xe0\xac\xbc\0" /* offset 1918 */
+ "\xe0\xae\x92\xe0\xaf\x97\0" /* offset 1925 */
+ "\xe0\xaf\x86\xe0\xae\xbe\0" /* offset 1932 */
+ "\xe0\xaf\x87\xe0\xae\xbe\0" /* offset 1939 */
+ "\xe0\xaf\x86\xe0\xaf\x97\0" /* offset 1946 */
+ "\xe0\xb1\x86\xe0\xb1\x96\0" /* offset 1953 */
+ "\xe0\xb2\xbf\xe0\xb3\x95\0" /* offset 1960 */
+ "\xe0\xb3\x86\xe0\xb3\x95\0" /* offset 1967 */
+ "\xe0\xb3\x86\xe0\xb3\x96\0" /* offset 1974 */
+ "\xe0\xb3\x86\xe0\xb3\x82\0" /* offset 1981 */
+ "\xe0\xb3\x86\xe0\xb3\x82\xe0\xb3\x95\0" /* offset 1988 */
+ "\xe0\xb5\x86\xe0\xb4\xbe\0" /* offset 1998 */
+ "\xe0\xb5\x87\xe0\xb4\xbe\0" /* offset 2005 */
+ "\xe0\xb5\x86\xe0\xb5\x97\0" /* offset 2012 */
+ "\xe0\xb7\x99\xe0\xb7\x8a\0" /* offset 2019 */
+ "\xe0\xb7\x99\xe0\xb7\x8f\0" /* offset 2026 */
+ "\xe0\xb7\x99\xe0\xb7\x8f\xe0\xb7\x8a\0" /* offset 2033 */
+ "\xe0\xb7\x99\xe0\xb7\x9f\0" /* offset 2043 */
+ "\xe0\xb9\x8d\xe0\xb8\xb2\0" /* offset 2050 */
+ "\xe0\xbb\x8d\xe0\xba\xb2\0" /* offset 2057 */
+ "\xe0\xba\xab\xe0\xba\x99\0" /* offset 2064 */
+ "\xe0\xba\xab\xe0\xba\xa1\0" /* offset 2071 */
+ "\xe0\xbc\x8b\0" /* offset 2078 */
+ "\xe0\xbd\x82\xe0\xbe\xb7\0" /* offset 2082 */
+ "\xe0\xbd\x8c\xe0\xbe\xb7\0" /* offset 2089 */
+ "\xe0\xbd\x91\xe0\xbe\xb7\0" /* offset 2096 */
+ "\xe0\xbd\x96\xe0\xbe\xb7\0" /* offset 2103 */
+ "\xe0\xbd\x9b\xe0\xbe\xb7\0" /* offset 2110 */
+ "\xe0\xbd\x80\xe0\xbe\xb5\0" /* offset 2117 */
+ "\xe0\xbd\xb1\xe0\xbd\xb2\0" /* offset 2124 */
+ "\xe0\xbd\xb1\xe0\xbd\xb4\0" /* offset 2131 */
+ "\xe0\xbe\xb2\xe0\xbe\x80\0" /* offset 2138 */
+ "\xe0\xbe\xb2\xe0\xbd\xb1\xe0\xbe\x80\0" /* offset 2145 */
+ "\xe0\xbe\xb3\xe0\xbe\x80\0" /* offset 2155 */
+ "\xe0\xbe\xb3\xe0\xbd\xb1\xe0\xbe\x80\0" /* offset 2162 */
+ "\xe0\xbd\xb1\xe0\xbe\x80\0" /* offset 2172 */
+ "\xe0\xbe\x92\xe0\xbe\xb7\0" /* offset 2179 */
+ "\xe0\xbe\x9c\xe0\xbe\xb7\0" /* offset 2186 */
+ "\xe0\xbe\xa1\xe0\xbe\xb7\0" /* offset 2193 */
+ "\xe0\xbe\xa6\xe0\xbe\xb7\0" /* offset 2200 */
+ "\xe0\xbe\xab\xe0\xbe\xb7\0" /* offset 2207 */
+ "\xe0\xbe\x90\xe0\xbe\xb5\0" /* offset 2214 */
+ "\xe1\x80\xa5\xe1\x80\xae\0" /* offset 2221 */
+ "\xe1\x83\x9c\0" /* offset 2228 */
+ "\xe1\xac\x85\xe1\xac\xb5\0" /* offset 2232 */
+ "\xe1\xac\x87\xe1\xac\xb5\0" /* offset 2239 */
+ "\xe1\xac\x89\xe1\xac\xb5\0" /* offset 2246 */
+ "\xe1\xac\x8b\xe1\xac\xb5\0" /* offset 2253 */
+ "\xe1\xac\x8d\xe1\xac\xb5\0" /* offset 2260 */
+ "\xe1\xac\x91\xe1\xac\xb5\0" /* offset 2267 */
+ "\xe1\xac\xba\xe1\xac\xb5\0" /* offset 2274 */
+ "\xe1\xac\xbc\xe1\xac\xb5\0" /* offset 2281 */
+ "\xe1\xac\xbe\xe1\xac\xb5\0" /* offset 2288 */
+ "\xe1\xac\xbf\xe1\xac\xb5\0" /* offset 2295 */
+ "\xe1\xad\x82\xe1\xac\xb5\0" /* offset 2302 */
+ "\x41\0" /* offset 2309 */
+ "\xc3\x86\0" /* offset 2311 */
+ "\x42\0" /* offset 2314 */
+ "\x44\0" /* offset 2316 */
+ "\x45\0" /* offset 2318 */
+ "\xc6\x8e\0" /* offset 2320 */
+ "\x47\0" /* offset 2323 */
+ "\x48\0" /* offset 2325 */
+ "\x49\0" /* offset 2327 */
+ "\x4a\0" /* offset 2329 */
+ "\x4b\0" /* offset 2331 */
+ "\x4c\0" /* offset 2333 */
+ "\x4d\0" /* offset 2335 */
+ "\x4e\0" /* offset 2337 */
+ "\x4f\0" /* offset 2339 */
+ "\xc8\xa2\0" /* offset 2341 */
+ "\x50\0" /* offset 2344 */
+ "\x52\0" /* offset 2346 */
+ "\x54\0" /* offset 2348 */
+ "\x55\0" /* offset 2350 */
+ "\x57\0" /* offset 2352 */
+ "\xc9\x90\0" /* offset 2354 */
+ "\xc9\x91\0" /* offset 2357 */
+ "\xe1\xb4\x82\0" /* offset 2360 */
+ "\x62\0" /* offset 2364 */
+ "\x64\0" /* offset 2366 */
+ "\x65\0" /* offset 2368 */
+ "\xc9\x99\0" /* offset 2370 */
+ "\xc9\x9b\0" /* offset 2373 */
+ "\xc9\x9c\0" /* offset 2376 */
+ "\x67\0" /* offset 2379 */
+ "\x6b\0" /* offset 2381 */
+ "\x6d\0" /* offset 2383 */
+ "\xc5\x8b\0" /* offset 2385 */
+ "\xc9\x94\0" /* offset 2388 */
+ "\xe1\xb4\x96\0" /* offset 2391 */
+ "\xe1\xb4\x97\0" /* offset 2395 */
+ "\x70\0" /* offset 2399 */
+ "\x74\0" /* offset 2401 */
+ "\x75\0" /* offset 2403 */
+ "\xe1\xb4\x9d\0" /* offset 2405 */
+ "\xc9\xaf\0" /* offset 2409 */
+ "\x76\0" /* offset 2412 */
+ "\xe1\xb4\xa5\0" /* offset 2414 */
+ "\xce\xb3\0" /* offset 2418 */
+ "\xce\xb4\0" /* offset 2421 */
+ "\xcf\x87\0" /* offset 2424 */
+ "\x69\0" /* offset 2427 */
+ "\xd0\xbd\0" /* offset 2429 */
+ "\xc9\x92\0" /* offset 2432 */
+ "\x63\0" /* offset 2435 */
+ "\xc9\x95\0" /* offset 2437 */
+ "\xc3\xb0\0" /* offset 2440 */
+ "\x66\0" /* offset 2443 */
+ "\xc9\x9f\0" /* offset 2445 */
+ "\xc9\xa1\0" /* offset 2448 */
+ "\xc9\xa5\0" /* offset 2451 */
+ "\xc9\xa8\0" /* offset 2454 */
+ "\xc9\xa9\0" /* offset 2457 */
+ "\xc9\xaa\0" /* offset 2460 */
+ "\xe1\xb5\xbb\0" /* offset 2463 */
+ "\xca\x9d\0" /* offset 2467 */
+ "\xc9\xad\0" /* offset 2470 */
+ "\xe1\xb6\x85\0" /* offset 2473 */
+ "\xca\x9f\0" /* offset 2477 */
+ "\xc9\xb1\0" /* offset 2480 */
+ "\xc9\xb0\0" /* offset 2483 */
+ "\xc9\xb2\0" /* offset 2486 */
+ "\xc9\xb3\0" /* offset 2489 */
+ "\xc9\xb4\0" /* offset 2492 */
+ "\xc9\xb5\0" /* offset 2495 */
+ "\xc9\xb8\0" /* offset 2498 */
+ "\xca\x82\0" /* offset 2501 */
+ "\xca\x83\0" /* offset 2504 */
+ "\xc6\xab\0" /* offset 2507 */
+ "\xca\x89\0" /* offset 2510 */
+ "\xca\x8a\0" /* offset 2513 */
+ "\xe1\xb4\x9c\0" /* offset 2516 */
+ "\xca\x8b\0" /* offset 2520 */
+ "\xca\x8c\0" /* offset 2523 */
+ "\x7a\0" /* offset 2526 */
+ "\xca\x90\0" /* offset 2528 */
+ "\xca\x91\0" /* offset 2531 */
+ "\xca\x92\0" /* offset 2534 */
+ "\x41\xcc\xa5\0" /* offset 2537 */
+ "\x61\xcc\xa5\0" /* offset 2541 */
+ "\x42\xcc\x87\0" /* offset 2545 */
+ "\x62\xcc\x87\0" /* offset 2549 */
+ "\x42\xcc\xa3\0" /* offset 2553 */
+ "\x62\xcc\xa3\0" /* offset 2557 */
+ "\x42\xcc\xb1\0" /* offset 2561 */
+ "\x62\xcc\xb1\0" /* offset 2565 */
+ "\x43\xcc\xa7\xcc\x81\0" /* offset 2569 */
+ "\x63\xcc\xa7\xcc\x81\0" /* offset 2575 */
+ "\x44\xcc\x87\0" /* offset 2581 */
+ "\x64\xcc\x87\0" /* offset 2585 */
+ "\x44\xcc\xa3\0" /* offset 2589 */
+ "\x64\xcc\xa3\0" /* offset 2593 */
+ "\x44\xcc\xb1\0" /* offset 2597 */
+ "\x64\xcc\xb1\0" /* offset 2601 */
+ "\x44\xcc\xa7\0" /* offset 2605 */
+ "\x64\xcc\xa7\0" /* offset 2609 */
+ "\x44\xcc\xad\0" /* offset 2613 */
+ "\x64\xcc\xad\0" /* offset 2617 */
+ "\x45\xcc\x84\xcc\x80\0" /* offset 2621 */
+ "\x65\xcc\x84\xcc\x80\0" /* offset 2627 */
+ "\x45\xcc\x84\xcc\x81\0" /* offset 2633 */
+ "\x65\xcc\x84\xcc\x81\0" /* offset 2639 */
+ "\x45\xcc\xad\0" /* offset 2645 */
+ "\x65\xcc\xad\0" /* offset 2649 */
+ "\x45\xcc\xb0\0" /* offset 2653 */
+ "\x65\xcc\xb0\0" /* offset 2657 */
+ "\x45\xcc\xa7\xcc\x86\0" /* offset 2661 */
+ "\x65\xcc\xa7\xcc\x86\0" /* offset 2667 */
+ "\x46\xcc\x87\0" /* offset 2673 */
+ "\x66\xcc\x87\0" /* offset 2677 */
+ "\x47\xcc\x84\0" /* offset 2681 */
+ "\x67\xcc\x84\0" /* offset 2685 */
+ "\x48\xcc\x87\0" /* offset 2689 */
+ "\x68\xcc\x87\0" /* offset 2693 */
+ "\x48\xcc\xa3\0" /* offset 2697 */
+ "\x68\xcc\xa3\0" /* offset 2701 */
+ "\x48\xcc\x88\0" /* offset 2705 */
+ "\x68\xcc\x88\0" /* offset 2709 */
+ "\x48\xcc\xa7\0" /* offset 2713 */
+ "\x68\xcc\xa7\0" /* offset 2717 */
+ "\x48\xcc\xae\0" /* offset 2721 */
+ "\x68\xcc\xae\0" /* offset 2725 */
+ "\x49\xcc\xb0\0" /* offset 2729 */
+ "\x69\xcc\xb0\0" /* offset 2733 */
+ "\x49\xcc\x88\xcc\x81\0" /* offset 2737 */
+ "\x69\xcc\x88\xcc\x81\0" /* offset 2743 */
+ "\x4b\xcc\x81\0" /* offset 2749 */
+ "\x6b\xcc\x81\0" /* offset 2753 */
+ "\x4b\xcc\xa3\0" /* offset 2757 */
+ "\x6b\xcc\xa3\0" /* offset 2761 */
+ "\x4b\xcc\xb1\0" /* offset 2765 */
+ "\x6b\xcc\xb1\0" /* offset 2769 */
+ "\x4c\xcc\xa3\0" /* offset 2773 */
+ "\x6c\xcc\xa3\0" /* offset 2777 */
+ "\x4c\xcc\xa3\xcc\x84\0" /* offset 2781 */
+ "\x6c\xcc\xa3\xcc\x84\0" /* offset 2787 */
+ "\x4c\xcc\xb1\0" /* offset 2793 */
+ "\x6c\xcc\xb1\0" /* offset 2797 */
+ "\x4c\xcc\xad\0" /* offset 2801 */
+ "\x6c\xcc\xad\0" /* offset 2805 */
+ "\x4d\xcc\x81\0" /* offset 2809 */
+ "\x6d\xcc\x81\0" /* offset 2813 */
+ "\x4d\xcc\x87\0" /* offset 2817 */
+ "\x6d\xcc\x87\0" /* offset 2821 */
+ "\x4d\xcc\xa3\0" /* offset 2825 */
+ "\x6d\xcc\xa3\0" /* offset 2829 */
+ "\x4e\xcc\x87\0" /* offset 2833 */
+ "\x6e\xcc\x87\0" /* offset 2837 */
+ "\x4e\xcc\xa3\0" /* offset 2841 */
+ "\x6e\xcc\xa3\0" /* offset 2845 */
+ "\x4e\xcc\xb1\0" /* offset 2849 */
+ "\x6e\xcc\xb1\0" /* offset 2853 */
+ "\x4e\xcc\xad\0" /* offset 2857 */
+ "\x6e\xcc\xad\0" /* offset 2861 */
+ "\x4f\xcc\x83\xcc\x81\0" /* offset 2865 */
+ "\x6f\xcc\x83\xcc\x81\0" /* offset 2871 */
+ "\x4f\xcc\x83\xcc\x88\0" /* offset 2877 */
+ "\x6f\xcc\x83\xcc\x88\0" /* offset 2883 */
+ "\x4f\xcc\x84\xcc\x80\0" /* offset 2889 */
+ "\x6f\xcc\x84\xcc\x80\0" /* offset 2895 */
+ "\x4f\xcc\x84\xcc\x81\0" /* offset 2901 */
+ "\x6f\xcc\x84\xcc\x81\0" /* offset 2907 */
+ "\x50\xcc\x81\0" /* offset 2913 */
+ "\x70\xcc\x81\0" /* offset 2917 */
+ "\x50\xcc\x87\0" /* offset 2921 */
+ "\x70\xcc\x87\0" /* offset 2925 */
+ "\x52\xcc\x87\0" /* offset 2929 */
+ "\x72\xcc\x87\0" /* offset 2933 */
+ "\x52\xcc\xa3\0" /* offset 2937 */
+ "\x72\xcc\xa3\0" /* offset 2941 */
+ "\x52\xcc\xa3\xcc\x84\0" /* offset 2945 */
+ "\x72\xcc\xa3\xcc\x84\0" /* offset 2951 */
+ "\x52\xcc\xb1\0" /* offset 2957 */
+ "\x72\xcc\xb1\0" /* offset 2961 */
+ "\x53\xcc\x87\0" /* offset 2965 */
+ "\x73\xcc\x87\0" /* offset 2969 */
+ "\x53\xcc\xa3\0" /* offset 2973 */
+ "\x73\xcc\xa3\0" /* offset 2977 */
+ "\x53\xcc\x81\xcc\x87\0" /* offset 2981 */
+ "\x73\xcc\x81\xcc\x87\0" /* offset 2987 */
+ "\x53\xcc\x8c\xcc\x87\0" /* offset 2993 */
+ "\x73\xcc\x8c\xcc\x87\0" /* offset 2999 */
+ "\x53\xcc\xa3\xcc\x87\0" /* offset 3005 */
+ "\x73\xcc\xa3\xcc\x87\0" /* offset 3011 */
+ "\x54\xcc\x87\0" /* offset 3017 */
+ "\x74\xcc\x87\0" /* offset 3021 */
+ "\x54\xcc\xa3\0" /* offset 3025 */
+ "\x74\xcc\xa3\0" /* offset 3029 */
+ "\x54\xcc\xb1\0" /* offset 3033 */
+ "\x74\xcc\xb1\0" /* offset 3037 */
+ "\x54\xcc\xad\0" /* offset 3041 */
+ "\x74\xcc\xad\0" /* offset 3045 */
+ "\x55\xcc\xa4\0" /* offset 3049 */
+ "\x75\xcc\xa4\0" /* offset 3053 */
+ "\x55\xcc\xb0\0" /* offset 3057 */
+ "\x75\xcc\xb0\0" /* offset 3061 */
+ "\x55\xcc\xad\0" /* offset 3065 */
+ "\x75\xcc\xad\0" /* offset 3069 */
+ "\x55\xcc\x83\xcc\x81\0" /* offset 3073 */
+ "\x75\xcc\x83\xcc\x81\0" /* offset 3079 */
+ "\x55\xcc\x84\xcc\x88\0" /* offset 3085 */
+ "\x75\xcc\x84\xcc\x88\0" /* offset 3091 */
+ "\x56\xcc\x83\0" /* offset 3097 */
+ "\x76\xcc\x83\0" /* offset 3101 */
+ "\x56\xcc\xa3\0" /* offset 3105 */
+ "\x76\xcc\xa3\0" /* offset 3109 */
+ "\x57\xcc\x80\0" /* offset 3113 */
+ "\x77\xcc\x80\0" /* offset 3117 */
+ "\x57\xcc\x81\0" /* offset 3121 */
+ "\x77\xcc\x81\0" /* offset 3125 */
+ "\x57\xcc\x88\0" /* offset 3129 */
+ "\x77\xcc\x88\0" /* offset 3133 */
+ "\x57\xcc\x87\0" /* offset 3137 */
+ "\x77\xcc\x87\0" /* offset 3141 */
+ "\x57\xcc\xa3\0" /* offset 3145 */
+ "\x77\xcc\xa3\0" /* offset 3149 */
+ "\x58\xcc\x87\0" /* offset 3153 */
+ "\x78\xcc\x87\0" /* offset 3157 */
+ "\x58\xcc\x88\0" /* offset 3161 */
+ "\x78\xcc\x88\0" /* offset 3165 */
+ "\x59\xcc\x87\0" /* offset 3169 */
+ "\x79\xcc\x87\0" /* offset 3173 */
+ "\x5a\xcc\x82\0" /* offset 3177 */
+ "\x7a\xcc\x82\0" /* offset 3181 */
+ "\x5a\xcc\xa3\0" /* offset 3185 */
+ "\x7a\xcc\xa3\0" /* offset 3189 */
+ "\x5a\xcc\xb1\0" /* offset 3193 */
+ "\x7a\xcc\xb1\0" /* offset 3197 */
+ "\x68\xcc\xb1\0" /* offset 3201 */
+ "\x74\xcc\x88\0" /* offset 3205 */
+ "\x77\xcc\x8a\0" /* offset 3209 */
+ "\x79\xcc\x8a\0" /* offset 3213 */
+ "\x61\xca\xbe\0" /* offset 3217 */
+ "\xc5\xbf\xcc\x87\0" /* offset 3221 */
+ "\x41\xcc\xa3\0" /* offset 3226 */
+ "\x61\xcc\xa3\0" /* offset 3230 */
+ "\x41\xcc\x89\0" /* offset 3234 */
+ "\x61\xcc\x89\0" /* offset 3238 */
+ "\x41\xcc\x82\xcc\x81\0" /* offset 3242 */
+ "\x61\xcc\x82\xcc\x81\0" /* offset 3248 */
+ "\x41\xcc\x82\xcc\x80\0" /* offset 3254 */
+ "\x61\xcc\x82\xcc\x80\0" /* offset 3260 */
+ "\x41\xcc\x82\xcc\x89\0" /* offset 3266 */
+ "\x61\xcc\x82\xcc\x89\0" /* offset 3272 */
+ "\x41\xcc\x82\xcc\x83\0" /* offset 3278 */
+ "\x61\xcc\x82\xcc\x83\0" /* offset 3284 */
+ "\x41\xcc\xa3\xcc\x82\0" /* offset 3290 */
+ "\x61\xcc\xa3\xcc\x82\0" /* offset 3296 */
+ "\x41\xcc\x86\xcc\x81\0" /* offset 3302 */
+ "\x61\xcc\x86\xcc\x81\0" /* offset 3308 */
+ "\x41\xcc\x86\xcc\x80\0" /* offset 3314 */
+ "\x61\xcc\x86\xcc\x80\0" /* offset 3320 */
+ "\x41\xcc\x86\xcc\x89\0" /* offset 3326 */
+ "\x61\xcc\x86\xcc\x89\0" /* offset 3332 */
+ "\x41\xcc\x86\xcc\x83\0" /* offset 3338 */
+ "\x61\xcc\x86\xcc\x83\0" /* offset 3344 */
+ "\x41\xcc\xa3\xcc\x86\0" /* offset 3350 */
+ "\x61\xcc\xa3\xcc\x86\0" /* offset 3356 */
+ "\x45\xcc\xa3\0" /* offset 3362 */
+ "\x65\xcc\xa3\0" /* offset 3366 */
+ "\x45\xcc\x89\0" /* offset 3370 */
+ "\x65\xcc\x89\0" /* offset 3374 */
+ "\x45\xcc\x83\0" /* offset 3378 */
+ "\x65\xcc\x83\0" /* offset 3382 */
+ "\x45\xcc\x82\xcc\x81\0" /* offset 3386 */
+ "\x65\xcc\x82\xcc\x81\0" /* offset 3392 */
+ "\x45\xcc\x82\xcc\x80\0" /* offset 3398 */
+ "\x65\xcc\x82\xcc\x80\0" /* offset 3404 */
+ "\x45\xcc\x82\xcc\x89\0" /* offset 3410 */
+ "\x65\xcc\x82\xcc\x89\0" /* offset 3416 */
+ "\x45\xcc\x82\xcc\x83\0" /* offset 3422 */
+ "\x65\xcc\x82\xcc\x83\0" /* offset 3428 */
+ "\x45\xcc\xa3\xcc\x82\0" /* offset 3434 */
+ "\x65\xcc\xa3\xcc\x82\0" /* offset 3440 */
+ "\x49\xcc\x89\0" /* offset 3446 */
+ "\x69\xcc\x89\0" /* offset 3450 */
+ "\x49\xcc\xa3\0" /* offset 3454 */
+ "\x69\xcc\xa3\0" /* offset 3458 */
+ "\x4f\xcc\xa3\0" /* offset 3462 */
+ "\x6f\xcc\xa3\0" /* offset 3466 */
+ "\x4f\xcc\x89\0" /* offset 3470 */
+ "\x6f\xcc\x89\0" /* offset 3474 */
+ "\x4f\xcc\x82\xcc\x81\0" /* offset 3478 */
+ "\x6f\xcc\x82\xcc\x81\0" /* offset 3484 */
+ "\x4f\xcc\x82\xcc\x80\0" /* offset 3490 */
+ "\x6f\xcc\x82\xcc\x80\0" /* offset 3496 */
+ "\x4f\xcc\x82\xcc\x89\0" /* offset 3502 */
+ "\x6f\xcc\x82\xcc\x89\0" /* offset 3508 */
+ "\x4f\xcc\x82\xcc\x83\0" /* offset 3514 */
+ "\x6f\xcc\x82\xcc\x83\0" /* offset 3520 */
+ "\x4f\xcc\xa3\xcc\x82\0" /* offset 3526 */
+ "\x6f\xcc\xa3\xcc\x82\0" /* offset 3532 */
+ "\x4f\xcc\x9b\xcc\x81\0" /* offset 3538 */
+ "\x6f\xcc\x9b\xcc\x81\0" /* offset 3544 */
+ "\x4f\xcc\x9b\xcc\x80\0" /* offset 3550 */
+ "\x6f\xcc\x9b\xcc\x80\0" /* offset 3556 */
+ "\x4f\xcc\x9b\xcc\x89\0" /* offset 3562 */
+ "\x6f\xcc\x9b\xcc\x89\0" /* offset 3568 */
+ "\x4f\xcc\x9b\xcc\x83\0" /* offset 3574 */
+ "\x6f\xcc\x9b\xcc\x83\0" /* offset 3580 */
+ "\x4f\xcc\x9b\xcc\xa3\0" /* offset 3586 */
+ "\x6f\xcc\x9b\xcc\xa3\0" /* offset 3592 */
+ "\x55\xcc\xa3\0" /* offset 3598 */
+ "\x75\xcc\xa3\0" /* offset 3602 */
+ "\x55\xcc\x89\0" /* offset 3606 */
+ "\x75\xcc\x89\0" /* offset 3610 */
+ "\x55\xcc\x9b\xcc\x81\0" /* offset 3614 */
+ "\x75\xcc\x9b\xcc\x81\0" /* offset 3620 */
+ "\x55\xcc\x9b\xcc\x80\0" /* offset 3626 */
+ "\x75\xcc\x9b\xcc\x80\0" /* offset 3632 */
+ "\x55\xcc\x9b\xcc\x89\0" /* offset 3638 */
+ "\x75\xcc\x9b\xcc\x89\0" /* offset 3644 */
+ "\x55\xcc\x9b\xcc\x83\0" /* offset 3650 */
+ "\x75\xcc\x9b\xcc\x83\0" /* offset 3656 */
+ "\x55\xcc\x9b\xcc\xa3\0" /* offset 3662 */
+ "\x75\xcc\x9b\xcc\xa3\0" /* offset 3668 */
+ "\x59\xcc\x80\0" /* offset 3674 */
+ "\x79\xcc\x80\0" /* offset 3678 */
+ "\x59\xcc\xa3\0" /* offset 3682 */
+ "\x79\xcc\xa3\0" /* offset 3686 */
+ "\x59\xcc\x89\0" /* offset 3690 */
+ "\x79\xcc\x89\0" /* offset 3694 */
+ "\x59\xcc\x83\0" /* offset 3698 */
+ "\x79\xcc\x83\0" /* offset 3702 */
+ "\xce\xb1\xcc\x93\0" /* offset 3706 */
+ "\xce\xb1\xcc\x94\0" /* offset 3711 */
+ "\xce\xb1\xcc\x93\xcc\x80\0" /* offset 3716 */
+ "\xce\xb1\xcc\x94\xcc\x80\0" /* offset 3723 */
+ "\xce\xb1\xcc\x93\xcc\x81\0" /* offset 3730 */
+ "\xce\xb1\xcc\x94\xcc\x81\0" /* offset 3737 */
+ "\xce\xb1\xcc\x93\xcd\x82\0" /* offset 3744 */
+ "\xce\xb1\xcc\x94\xcd\x82\0" /* offset 3751 */
+ "\xce\x91\xcc\x93\0" /* offset 3758 */
+ "\xce\x91\xcc\x94\0" /* offset 3763 */
+ "\xce\x91\xcc\x93\xcc\x80\0" /* offset 3768 */
+ "\xce\x91\xcc\x94\xcc\x80\0" /* offset 3775 */
+ "\xce\x91\xcc\x93\xcc\x81\0" /* offset 3782 */
+ "\xce\x91\xcc\x94\xcc\x81\0" /* offset 3789 */
+ "\xce\x91\xcc\x93\xcd\x82\0" /* offset 3796 */
+ "\xce\x91\xcc\x94\xcd\x82\0" /* offset 3803 */
+ "\xce\xb5\xcc\x93\0" /* offset 3810 */
+ "\xce\xb5\xcc\x94\0" /* offset 3815 */
+ "\xce\xb5\xcc\x93\xcc\x80\0" /* offset 3820 */
+ "\xce\xb5\xcc\x94\xcc\x80\0" /* offset 3827 */
+ "\xce\xb5\xcc\x93\xcc\x81\0" /* offset 3834 */
+ "\xce\xb5\xcc\x94\xcc\x81\0" /* offset 3841 */
+ "\xce\x95\xcc\x93\0" /* offset 3848 */
+ "\xce\x95\xcc\x94\0" /* offset 3853 */
+ "\xce\x95\xcc\x93\xcc\x80\0" /* offset 3858 */
+ "\xce\x95\xcc\x94\xcc\x80\0" /* offset 3865 */
+ "\xce\x95\xcc\x93\xcc\x81\0" /* offset 3872 */
+ "\xce\x95\xcc\x94\xcc\x81\0" /* offset 3879 */
+ "\xce\xb7\xcc\x93\0" /* offset 3886 */
+ "\xce\xb7\xcc\x94\0" /* offset 3891 */
+ "\xce\xb7\xcc\x93\xcc\x80\0" /* offset 3896 */
+ "\xce\xb7\xcc\x94\xcc\x80\0" /* offset 3903 */
+ "\xce\xb7\xcc\x93\xcc\x81\0" /* offset 3910 */
+ "\xce\xb7\xcc\x94\xcc\x81\0" /* offset 3917 */
+ "\xce\xb7\xcc\x93\xcd\x82\0" /* offset 3924 */
+ "\xce\xb7\xcc\x94\xcd\x82\0" /* offset 3931 */
+ "\xce\x97\xcc\x93\0" /* offset 3938 */
+ "\xce\x97\xcc\x94\0" /* offset 3943 */
+ "\xce\x97\xcc\x93\xcc\x80\0" /* offset 3948 */
+ "\xce\x97\xcc\x94\xcc\x80\0" /* offset 3955 */
+ "\xce\x97\xcc\x93\xcc\x81\0" /* offset 3962 */
+ "\xce\x97\xcc\x94\xcc\x81\0" /* offset 3969 */
+ "\xce\x97\xcc\x93\xcd\x82\0" /* offset 3976 */
+ "\xce\x97\xcc\x94\xcd\x82\0" /* offset 3983 */
+ "\xce\xb9\xcc\x93\0" /* offset 3990 */
+ "\xce\xb9\xcc\x94\0" /* offset 3995 */
+ "\xce\xb9\xcc\x93\xcc\x80\0" /* offset 4000 */
+ "\xce\xb9\xcc\x94\xcc\x80\0" /* offset 4007 */
+ "\xce\xb9\xcc\x93\xcc\x81\0" /* offset 4014 */
+ "\xce\xb9\xcc\x94\xcc\x81\0" /* offset 4021 */
+ "\xce\xb9\xcc\x93\xcd\x82\0" /* offset 4028 */
+ "\xce\xb9\xcc\x94\xcd\x82\0" /* offset 4035 */
+ "\xce\x99\xcc\x93\0" /* offset 4042 */
+ "\xce\x99\xcc\x94\0" /* offset 4047 */
+ "\xce\x99\xcc\x93\xcc\x80\0" /* offset 4052 */
+ "\xce\x99\xcc\x94\xcc\x80\0" /* offset 4059 */
+ "\xce\x99\xcc\x93\xcc\x81\0" /* offset 4066 */
+ "\xce\x99\xcc\x94\xcc\x81\0" /* offset 4073 */
+ "\xce\x99\xcc\x93\xcd\x82\0" /* offset 4080 */
+ "\xce\x99\xcc\x94\xcd\x82\0" /* offset 4087 */
+ "\xce\xbf\xcc\x93\0" /* offset 4094 */
+ "\xce\xbf\xcc\x94\0" /* offset 4099 */
+ "\xce\xbf\xcc\x93\xcc\x80\0" /* offset 4104 */
+ "\xce\xbf\xcc\x94\xcc\x80\0" /* offset 4111 */
+ "\xce\xbf\xcc\x93\xcc\x81\0" /* offset 4118 */
+ "\xce\xbf\xcc\x94\xcc\x81\0" /* offset 4125 */
+ "\xce\x9f\xcc\x93\0" /* offset 4132 */
+ "\xce\x9f\xcc\x94\0" /* offset 4137 */
+ "\xce\x9f\xcc\x93\xcc\x80\0" /* offset 4142 */
+ "\xce\x9f\xcc\x94\xcc\x80\0" /* offset 4149 */
+ "\xce\x9f\xcc\x93\xcc\x81\0" /* offset 4156 */
+ "\xce\x9f\xcc\x94\xcc\x81\0" /* offset 4163 */
+ "\xcf\x85\xcc\x93\0" /* offset 4170 */
+ "\xcf\x85\xcc\x94\0" /* offset 4175 */
+ "\xcf\x85\xcc\x93\xcc\x80\0" /* offset 4180 */
+ "\xcf\x85\xcc\x94\xcc\x80\0" /* offset 4187 */
+ "\xcf\x85\xcc\x93\xcc\x81\0" /* offset 4194 */
+ "\xcf\x85\xcc\x94\xcc\x81\0" /* offset 4201 */
+ "\xcf\x85\xcc\x93\xcd\x82\0" /* offset 4208 */
+ "\xcf\x85\xcc\x94\xcd\x82\0" /* offset 4215 */
+ "\xce\xa5\xcc\x94\0" /* offset 4222 */
+ "\xce\xa5\xcc\x94\xcc\x80\0" /* offset 4227 */
+ "\xce\xa5\xcc\x94\xcc\x81\0" /* offset 4234 */
+ "\xce\xa5\xcc\x94\xcd\x82\0" /* offset 4241 */
+ "\xcf\x89\xcc\x93\0" /* offset 4248 */
+ "\xcf\x89\xcc\x94\0" /* offset 4253 */
+ "\xcf\x89\xcc\x93\xcc\x80\0" /* offset 4258 */
+ "\xcf\x89\xcc\x94\xcc\x80\0" /* offset 4265 */
+ "\xcf\x89\xcc\x93\xcc\x81\0" /* offset 4272 */
+ "\xcf\x89\xcc\x94\xcc\x81\0" /* offset 4279 */
+ "\xcf\x89\xcc\x93\xcd\x82\0" /* offset 4286 */
+ "\xcf\x89\xcc\x94\xcd\x82\0" /* offset 4293 */
+ "\xce\xa9\xcc\x93\0" /* offset 4300 */
+ "\xce\xa9\xcc\x94\0" /* offset 4305 */
+ "\xce\xa9\xcc\x93\xcc\x80\0" /* offset 4310 */
+ "\xce\xa9\xcc\x94\xcc\x80\0" /* offset 4317 */
+ "\xce\xa9\xcc\x93\xcc\x81\0" /* offset 4324 */
+ "\xce\xa9\xcc\x94\xcc\x81\0" /* offset 4331 */
+ "\xce\xa9\xcc\x93\xcd\x82\0" /* offset 4338 */
+ "\xce\xa9\xcc\x94\xcd\x82\0" /* offset 4345 */
+ "\xce\xb1\xcc\x80\0" /* offset 4352 */
+ "\xce\xb5\xcc\x80\0" /* offset 4357 */
+ "\xce\xb7\xcc\x80\0" /* offset 4362 */
+ "\xce\xb9\xcc\x80\0" /* offset 4367 */
+ "\xce\xbf\xcc\x80\0" /* offset 4372 */
+ "\xcf\x85\xcc\x80\0" /* offset 4377 */
+ "\xcf\x89\xcc\x80\0" /* offset 4382 */
+ "\xce\xb1\xcc\x93\xcd\x85\0" /* offset 4387 */
+ "\xce\xb1\xcc\x94\xcd\x85\0" /* offset 4394 */
+ "\xce\xb1\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4401 */
+ "\xce\xb1\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4410 */
+ "\xce\xb1\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4419 */
+ "\xce\xb1\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4428 */
+ "\xce\xb1\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4437 */
+ "\xce\xb1\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4446 */
+ "\xce\x91\xcc\x93\xcd\x85\0" /* offset 4455 */
+ "\xce\x91\xcc\x94\xcd\x85\0" /* offset 4462 */
+ "\xce\x91\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4469 */
+ "\xce\x91\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4478 */
+ "\xce\x91\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4487 */
+ "\xce\x91\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4496 */
+ "\xce\x91\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4505 */
+ "\xce\x91\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4514 */
+ "\xce\xb7\xcc\x93\xcd\x85\0" /* offset 4523 */
+ "\xce\xb7\xcc\x94\xcd\x85\0" /* offset 4530 */
+ "\xce\xb7\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4537 */
+ "\xce\xb7\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4546 */
+ "\xce\xb7\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4555 */
+ "\xce\xb7\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4564 */
+ "\xce\xb7\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4573 */
+ "\xce\xb7\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4582 */
+ "\xce\x97\xcc\x93\xcd\x85\0" /* offset 4591 */
+ "\xce\x97\xcc\x94\xcd\x85\0" /* offset 4598 */
+ "\xce\x97\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4605 */
+ "\xce\x97\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4614 */
+ "\xce\x97\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4623 */
+ "\xce\x97\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4632 */
+ "\xce\x97\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4641 */
+ "\xce\x97\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4650 */
+ "\xcf\x89\xcc\x93\xcd\x85\0" /* offset 4659 */
+ "\xcf\x89\xcc\x94\xcd\x85\0" /* offset 4666 */
+ "\xcf\x89\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4673 */
+ "\xcf\x89\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4682 */
+ "\xcf\x89\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4691 */
+ "\xcf\x89\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4700 */
+ "\xcf\x89\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4709 */
+ "\xcf\x89\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4718 */
+ "\xce\xa9\xcc\x93\xcd\x85\0" /* offset 4727 */
+ "\xce\xa9\xcc\x94\xcd\x85\0" /* offset 4734 */
+ "\xce\xa9\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4741 */
+ "\xce\xa9\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4750 */
+ "\xce\xa9\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4759 */
+ "\xce\xa9\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4768 */
+ "\xce\xa9\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4777 */
+ "\xce\xa9\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4786 */
+ "\xce\xb1\xcc\x86\0" /* offset 4795 */
+ "\xce\xb1\xcc\x84\0" /* offset 4800 */
+ "\xce\xb1\xcc\x80\xcd\x85\0" /* offset 4805 */
+ "\xce\xb1\xcd\x85\0" /* offset 4812 */
+ "\xce\xb1\xcc\x81\xcd\x85\0" /* offset 4817 */
+ "\xce\xb1\xcd\x82\0" /* offset 4824 */
+ "\xce\xb1\xcd\x82\xcd\x85\0" /* offset 4829 */
+ "\xce\x91\xcc\x86\0" /* offset 4836 */
+ "\xce\x91\xcc\x84\0" /* offset 4841 */
+ "\xce\x91\xcc\x80\0" /* offset 4846 */
+ "\xce\x91\xcd\x85\0" /* offset 4851 */
+ "\x20\xcc\x93\0" /* offset 4856 */
+ "\xce\xb9\0" /* offset 4860 */
+ "\x20\xcd\x82\0" /* offset 4863 */
+ "\xc2\xa8\xcd\x82\0" /* offset 4867 */
+ "\x20\xcc\x88\xcd\x82\0" /* offset 4872 */
+ "\xce\xb7\xcc\x80\xcd\x85\0" /* offset 4878 */
+ "\xce\xb7\xcd\x85\0" /* offset 4885 */
+ "\xce\xb7\xcc\x81\xcd\x85\0" /* offset 4890 */
+ "\xce\xb7\xcd\x82\0" /* offset 4897 */
+ "\xce\xb7\xcd\x82\xcd\x85\0" /* offset 4902 */
+ "\xce\x95\xcc\x80\0" /* offset 4909 */
+ "\xce\x97\xcc\x80\0" /* offset 4914 */
+ "\xce\x97\xcd\x85\0" /* offset 4919 */
+ "\xe1\xbe\xbf\xcc\x80\0" /* offset 4924 */
+ "\x20\xcc\x93\xcc\x80\0" /* offset 4930 */
+ "\xe1\xbe\xbf\xcc\x81\0" /* offset 4936 */
+ "\x20\xcc\x93\xcc\x81\0" /* offset 4942 */
+ "\xe1\xbe\xbf\xcd\x82\0" /* offset 4948 */
+ "\x20\xcc\x93\xcd\x82\0" /* offset 4954 */
+ "\xce\xb9\xcc\x86\0" /* offset 4960 */
+ "\xce\xb9\xcc\x84\0" /* offset 4965 */
+ "\xce\xb9\xcc\x88\xcc\x80\0" /* offset 4970 */
+ "\xce\xb9\xcd\x82\0" /* offset 4977 */
+ "\xce\xb9\xcc\x88\xcd\x82\0" /* offset 4982 */
+ "\xce\x99\xcc\x86\0" /* offset 4989 */
+ "\xce\x99\xcc\x84\0" /* offset 4994 */
+ "\xce\x99\xcc\x80\0" /* offset 4999 */
+ "\xe1\xbf\xbe\xcc\x80\0" /* offset 5004 */
+ "\x20\xcc\x94\xcc\x80\0" /* offset 5010 */
+ "\xe1\xbf\xbe\xcc\x81\0" /* offset 5016 */
+ "\x20\xcc\x94\xcc\x81\0" /* offset 5022 */
+ "\xe1\xbf\xbe\xcd\x82\0" /* offset 5028 */
+ "\x20\xcc\x94\xcd\x82\0" /* offset 5034 */
+ "\xcf\x85\xcc\x86\0" /* offset 5040 */
+ "\xcf\x85\xcc\x84\0" /* offset 5045 */
+ "\xcf\x85\xcc\x88\xcc\x80\0" /* offset 5050 */
+ "\xcf\x81\xcc\x93\0" /* offset 5057 */
+ "\xcf\x81\xcc\x94\0" /* offset 5062 */
+ "\xcf\x85\xcd\x82\0" /* offset 5067 */
+ "\xcf\x85\xcc\x88\xcd\x82\0" /* offset 5072 */
+ "\xce\xa5\xcc\x86\0" /* offset 5079 */
+ "\xce\xa5\xcc\x84\0" /* offset 5084 */
+ "\xce\xa5\xcc\x80\0" /* offset 5089 */
+ "\xce\xa1\xcc\x94\0" /* offset 5094 */
+ "\xc2\xa8\xcc\x80\0" /* offset 5099 */
+ "\x20\xcc\x88\xcc\x80\0" /* offset 5104 */
+ "\x60\0" /* offset 5110 */
+ "\xcf\x89\xcc\x80\xcd\x85\0" /* offset 5112 */
+ "\xcf\x89\xcd\x85\0" /* offset 5119 */
+ "\xcf\x89\xcc\x81\xcd\x85\0" /* offset 5124 */
+ "\xcf\x89\xcd\x82\0" /* offset 5131 */
+ "\xcf\x89\xcd\x82\xcd\x85\0" /* offset 5136 */
+ "\xce\x9f\xcc\x80\0" /* offset 5143 */
+ "\xce\xa9\xcc\x80\0" /* offset 5148 */
+ "\xce\xa9\xcd\x85\0" /* offset 5153 */
+ "\xc2\xb4\0" /* offset 5158 */
+ "\x20\xcc\x94\0" /* offset 5161 */
+ "\xe2\x80\x82\0" /* offset 5165 */
+ "\xe2\x80\x83\0" /* offset 5169 */
+ "\xe2\x80\x90\0" /* offset 5173 */
+ "\x20\xcc\xb3\0" /* offset 5177 */
+ "\x2e\0" /* offset 5181 */
+ "\x2e\x2e\0" /* offset 5183 */
+ "\x2e\x2e\x2e\0" /* offset 5186 */
+ "\xe2\x80\xb2\xe2\x80\xb2\0" /* offset 5190 */
+ "\xe2\x80\xb2\xe2\x80\xb2\xe2\x80\xb2\0" /* offset 5197 */
+ "\xe2\x80\xb5\xe2\x80\xb5\0" /* offset 5207 */
+ "\xe2\x80\xb5\xe2\x80\xb5\xe2\x80\xb5\0" /* offset 5214 */
+ "\x21\x21\0" /* offset 5224 */
+ "\x20\xcc\x85\0" /* offset 5227 */
+ "\x3f\x3f\0" /* offset 5231 */
+ "\x3f\x21\0" /* offset 5234 */
+ "\x21\x3f\0" /* offset 5237 */
+ "\xe2\x80\xb2\xe2\x80\xb2\xe2\x80\xb2\xe2\x80\xb2\0" /* offset 5240 */
+ "\x30\0" /* offset 5253 */
+ "\x34\0" /* offset 5255 */
+ "\x35\0" /* offset 5257 */
+ "\x36\0" /* offset 5259 */
+ "\x37\0" /* offset 5261 */
+ "\x38\0" /* offset 5263 */
+ "\x39\0" /* offset 5265 */
+ "\x2b\0" /* offset 5267 */
+ "\xe2\x88\x92\0" /* offset 5269 */
+ "\x3d\0" /* offset 5273 */
+ "\x28\0" /* offset 5275 */
+ "\x29\0" /* offset 5277 */
+ "\x6e\0" /* offset 5279 */
+ "\x52\x73\0" /* offset 5281 */
+ "\x61\x2f\x63\0" /* offset 5284 */
+ "\x61\x2f\x73\0" /* offset 5288 */
+ "\x43\0" /* offset 5292 */
+ "\xc2\xb0\x43\0" /* offset 5294 */
+ "\x63\x2f\x6f\0" /* offset 5298 */
+ "\x63\x2f\x75\0" /* offset 5302 */
+ "\xc6\x90\0" /* offset 5306 */
+ "\xc2\xb0\x46\0" /* offset 5309 */
+ "\xc4\xa7\0" /* offset 5313 */
+ "\x4e\x6f\0" /* offset 5316 */
+ "\x51\0" /* offset 5319 */
+ "\x53\x4d\0" /* offset 5321 */
+ "\x54\x45\x4c\0" /* offset 5324 */
+ "\x54\x4d\0" /* offset 5328 */
+ "\x5a\0" /* offset 5331 */
+ "\xce\xa9\0" /* offset 5333 */
+ "\x46\0" /* offset 5336 */
+ "\xd7\x90\0" /* offset 5338 */
+ "\xd7\x91\0" /* offset 5341 */
+ "\xd7\x92\0" /* offset 5344 */
+ "\xd7\x93\0" /* offset 5347 */
+ "\x46\x41\x58\0" /* offset 5350 */
+ "\xce\x93\0" /* offset 5354 */
+ "\xce\xa0\0" /* offset 5357 */
+ "\xe2\x88\x91\0" /* offset 5360 */
+ "\x31\xe2\x81\x84\x33\0" /* offset 5364 */
+ "\x32\xe2\x81\x84\x33\0" /* offset 5370 */
+ "\x31\xe2\x81\x84\x35\0" /* offset 5376 */
+ "\x32\xe2\x81\x84\x35\0" /* offset 5382 */
+ "\x33\xe2\x81\x84\x35\0" /* offset 5388 */
+ "\x34\xe2\x81\x84\x35\0" /* offset 5394 */
+ "\x31\xe2\x81\x84\x36\0" /* offset 5400 */
+ "\x35\xe2\x81\x84\x36\0" /* offset 5406 */
+ "\x31\xe2\x81\x84\x38\0" /* offset 5412 */
+ "\x33\xe2\x81\x84\x38\0" /* offset 5418 */
+ "\x35\xe2\x81\x84\x38\0" /* offset 5424 */
+ "\x37\xe2\x81\x84\x38\0" /* offset 5430 */
+ "\x31\xe2\x81\x84\0" /* offset 5436 */
+ "\x49\x49\0" /* offset 5441 */
+ "\x49\x49\x49\0" /* offset 5444 */
+ "\x49\x56\0" /* offset 5448 */
+ "\x56\0" /* offset 5451 */
+ "\x56\x49\0" /* offset 5453 */
+ "\x56\x49\x49\0" /* offset 5456 */
+ "\x56\x49\x49\x49\0" /* offset 5460 */
+ "\x49\x58\0" /* offset 5465 */
+ "\x58\0" /* offset 5468 */
+ "\x58\x49\0" /* offset 5470 */
+ "\x58\x49\x49\0" /* offset 5473 */
+ "\x69\x69\0" /* offset 5477 */
+ "\x69\x69\x69\0" /* offset 5480 */
+ "\x69\x76\0" /* offset 5484 */
+ "\x76\x69\0" /* offset 5487 */
+ "\x76\x69\x69\0" /* offset 5490 */
+ "\x76\x69\x69\x69\0" /* offset 5494 */
+ "\x69\x78\0" /* offset 5499 */
+ "\x78\x69\0" /* offset 5502 */
+ "\x78\x69\x69\0" /* offset 5505 */
+ "\xe2\x86\x90\xcc\xb8\0" /* offset 5509 */
+ "\xe2\x86\x92\xcc\xb8\0" /* offset 5515 */
+ "\xe2\x86\x94\xcc\xb8\0" /* offset 5521 */
+ "\xe2\x87\x90\xcc\xb8\0" /* offset 5527 */
+ "\xe2\x87\x94\xcc\xb8\0" /* offset 5533 */
+ "\xe2\x87\x92\xcc\xb8\0" /* offset 5539 */
+ "\xe2\x88\x83\xcc\xb8\0" /* offset 5545 */
+ "\xe2\x88\x88\xcc\xb8\0" /* offset 5551 */
+ "\xe2\x88\x8b\xcc\xb8\0" /* offset 5557 */
+ "\xe2\x88\xa3\xcc\xb8\0" /* offset 5563 */
+ "\xe2\x88\xa5\xcc\xb8\0" /* offset 5569 */
+ "\xe2\x88\xab\xe2\x88\xab\0" /* offset 5575 */
+ "\xe2\x88\xab\xe2\x88\xab\xe2\x88\xab\0" /* offset 5582 */
+ "\xe2\x88\xae\xe2\x88\xae\0" /* offset 5592 */
+ "\xe2\x88\xae\xe2\x88\xae\xe2\x88\xae\0" /* offset 5599 */
+ "\xe2\x88\xbc\xcc\xb8\0" /* offset 5609 */
+ "\xe2\x89\x83\xcc\xb8\0" /* offset 5615 */
+ "\xe2\x89\x85\xcc\xb8\0" /* offset 5621 */
+ "\xe2\x89\x88\xcc\xb8\0" /* offset 5627 */
+ "\x3d\xcc\xb8\0" /* offset 5633 */
+ "\xe2\x89\xa1\xcc\xb8\0" /* offset 5637 */
+ "\xe2\x89\x8d\xcc\xb8\0" /* offset 5643 */
+ "\x3c\xcc\xb8\0" /* offset 5649 */
+ "\x3e\xcc\xb8\0" /* offset 5653 */
+ "\xe2\x89\xa4\xcc\xb8\0" /* offset 5657 */
+ "\xe2\x89\xa5\xcc\xb8\0" /* offset 5663 */
+ "\xe2\x89\xb2\xcc\xb8\0" /* offset 5669 */
+ "\xe2\x89\xb3\xcc\xb8\0" /* offset 5675 */
+ "\xe2\x89\xb6\xcc\xb8\0" /* offset 5681 */
+ "\xe2\x89\xb7\xcc\xb8\0" /* offset 5687 */
+ "\xe2\x89\xba\xcc\xb8\0" /* offset 5693 */
+ "\xe2\x89\xbb\xcc\xb8\0" /* offset 5699 */
+ "\xe2\x8a\x82\xcc\xb8\0" /* offset 5705 */
+ "\xe2\x8a\x83\xcc\xb8\0" /* offset 5711 */
+ "\xe2\x8a\x86\xcc\xb8\0" /* offset 5717 */
+ "\xe2\x8a\x87\xcc\xb8\0" /* offset 5723 */
+ "\xe2\x8a\xa2\xcc\xb8\0" /* offset 5729 */
+ "\xe2\x8a\xa8\xcc\xb8\0" /* offset 5735 */
+ "\xe2\x8a\xa9\xcc\xb8\0" /* offset 5741 */
+ "\xe2\x8a\xab\xcc\xb8\0" /* offset 5747 */
+ "\xe2\x89\xbc\xcc\xb8\0" /* offset 5753 */
+ "\xe2\x89\xbd\xcc\xb8\0" /* offset 5759 */
+ "\xe2\x8a\x91\xcc\xb8\0" /* offset 5765 */
+ "\xe2\x8a\x92\xcc\xb8\0" /* offset 5771 */
+ "\xe2\x8a\xb2\xcc\xb8\0" /* offset 5777 */
+ "\xe2\x8a\xb3\xcc\xb8\0" /* offset 5783 */
+ "\xe2\x8a\xb4\xcc\xb8\0" /* offset 5789 */
+ "\xe2\x8a\xb5\xcc\xb8\0" /* offset 5795 */
+ "\xe3\x80\x88\0" /* offset 5801 */
+ "\xe3\x80\x89\0" /* offset 5805 */
+ "\x31\x30\0" /* offset 5809 */
+ "\x31\x31\0" /* offset 5812 */
+ "\x31\x32\0" /* offset 5815 */
+ "\x31\x33\0" /* offset 5818 */
+ "\x31\x34\0" /* offset 5821 */
+ "\x31\x35\0" /* offset 5824 */
+ "\x31\x36\0" /* offset 5827 */
+ "\x31\x37\0" /* offset 5830 */
+ "\x31\x38\0" /* offset 5833 */
+ "\x31\x39\0" /* offset 5836 */
+ "\x32\x30\0" /* offset 5839 */
+ "\x28\x31\x29\0" /* offset 5842 */
+ "\x28\x32\x29\0" /* offset 5846 */
+ "\x28\x33\x29\0" /* offset 5850 */
+ "\x28\x34\x29\0" /* offset 5854 */
+ "\x28\x35\x29\0" /* offset 5858 */
+ "\x28\x36\x29\0" /* offset 5862 */
+ "\x28\x37\x29\0" /* offset 5866 */
+ "\x28\x38\x29\0" /* offset 5870 */
+ "\x28\x39\x29\0" /* offset 5874 */
+ "\x28\x31\x30\x29\0" /* offset 5878 */
+ "\x28\x31\x31\x29\0" /* offset 5883 */
+ "\x28\x31\x32\x29\0" /* offset 5888 */
+ "\x28\x31\x33\x29\0" /* offset 5893 */
+ "\x28\x31\x34\x29\0" /* offset 5898 */
+ "\x28\x31\x35\x29\0" /* offset 5903 */
+ "\x28\x31\x36\x29\0" /* offset 5908 */
+ "\x28\x31\x37\x29\0" /* offset 5913 */
+ "\x28\x31\x38\x29\0" /* offset 5918 */
+ "\x28\x31\x39\x29\0" /* offset 5923 */
+ "\x28\x32\x30\x29\0" /* offset 5928 */
+ "\x31\x2e\0" /* offset 5933 */
+ "\x32\x2e\0" /* offset 5936 */
+ "\x33\x2e\0" /* offset 5939 */
+ "\x34\x2e\0" /* offset 5942 */
+ "\x35\x2e\0" /* offset 5945 */
+ "\x36\x2e\0" /* offset 5948 */
+ "\x37\x2e\0" /* offset 5951 */
+ "\x38\x2e\0" /* offset 5954 */
+ "\x39\x2e\0" /* offset 5957 */
+ "\x31\x30\x2e\0" /* offset 5960 */
+ "\x31\x31\x2e\0" /* offset 5964 */
+ "\x31\x32\x2e\0" /* offset 5968 */
+ "\x31\x33\x2e\0" /* offset 5972 */
+ "\x31\x34\x2e\0" /* offset 5976 */
+ "\x31\x35\x2e\0" /* offset 5980 */
+ "\x31\x36\x2e\0" /* offset 5984 */
+ "\x31\x37\x2e\0" /* offset 5988 */
+ "\x31\x38\x2e\0" /* offset 5992 */
+ "\x31\x39\x2e\0" /* offset 5996 */
+ "\x32\x30\x2e\0" /* offset 6000 */
+ "\x28\x61\x29\0" /* offset 6004 */
+ "\x28\x62\x29\0" /* offset 6008 */
+ "\x28\x63\x29\0" /* offset 6012 */
+ "\x28\x64\x29\0" /* offset 6016 */
+ "\x28\x65\x29\0" /* offset 6020 */
+ "\x28\x66\x29\0" /* offset 6024 */
+ "\x28\x67\x29\0" /* offset 6028 */
+ "\x28\x68\x29\0" /* offset 6032 */
+ "\x28\x69\x29\0" /* offset 6036 */
+ "\x28\x6a\x29\0" /* offset 6040 */
+ "\x28\x6b\x29\0" /* offset 6044 */
+ "\x28\x6c\x29\0" /* offset 6048 */
+ "\x28\x6d\x29\0" /* offset 6052 */
+ "\x28\x6e\x29\0" /* offset 6056 */
+ "\x28\x6f\x29\0" /* offset 6060 */
+ "\x28\x70\x29\0" /* offset 6064 */
+ "\x28\x71\x29\0" /* offset 6068 */
+ "\x28\x72\x29\0" /* offset 6072 */
+ "\x28\x73\x29\0" /* offset 6076 */
+ "\x28\x74\x29\0" /* offset 6080 */
+ "\x28\x75\x29\0" /* offset 6084 */
+ "\x28\x76\x29\0" /* offset 6088 */
+ "\x28\x77\x29\0" /* offset 6092 */
+ "\x28\x78\x29\0" /* offset 6096 */
+ "\x28\x79\x29\0" /* offset 6100 */
+ "\x28\x7a\x29\0" /* offset 6104 */
+ "\x53\0" /* offset 6108 */
+ "\x59\0" /* offset 6110 */
+ "\x71\0" /* offset 6112 */
+ "\xe2\x88\xab\xe2\x88\xab\xe2\x88\xab\xe2\x88\xab\0" /* offset 6114 */
+ "\x3a\x3a\x3d\0" /* offset 6127 */
+ "\x3d\x3d\0" /* offset 6131 */
+ "\x3d\x3d\x3d\0" /* offset 6134 */
+ "\xe2\xab\x9d\xcc\xb8\0" /* offset 6138 */
+ "\xe2\xb5\xa1\0" /* offset 6144 */
+ "\xe6\xaf\x8d\0" /* offset 6148 */
+ "\xe9\xbe\x9f\0" /* offset 6152 */
+ "\xe4\xb8\x80\0" /* offset 6156 */
+ "\xe4\xb8\xa8\0" /* offset 6160 */
+ "\xe4\xb8\xb6\0" /* offset 6164 */
+ "\xe4\xb8\xbf\0" /* offset 6168 */
+ "\xe4\xb9\x99\0" /* offset 6172 */
+ "\xe4\xba\x85\0" /* offset 6176 */
+ "\xe4\xba\x8c\0" /* offset 6180 */
+ "\xe4\xba\xa0\0" /* offset 6184 */
+ "\xe4\xba\xba\0" /* offset 6188 */
+ "\xe5\x84\xbf\0" /* offset 6192 */
+ "\xe5\x85\xa5\0" /* offset 6196 */
+ "\xe5\x85\xab\0" /* offset 6200 */
+ "\xe5\x86\x82\0" /* offset 6204 */
+ "\xe5\x86\x96\0" /* offset 6208 */
+ "\xe5\x86\xab\0" /* offset 6212 */
+ "\xe5\x87\xa0\0" /* offset 6216 */
+ "\xe5\x87\xb5\0" /* offset 6220 */
+ "\xe5\x88\x80\0" /* offset 6224 */
+ "\xe5\x8a\x9b\0" /* offset 6228 */
+ "\xe5\x8b\xb9\0" /* offset 6232 */
+ "\xe5\x8c\x95\0" /* offset 6236 */
+ "\xe5\x8c\x9a\0" /* offset 6240 */
+ "\xe5\x8c\xb8\0" /* offset 6244 */
+ "\xe5\x8d\x81\0" /* offset 6248 */
+ "\xe5\x8d\x9c\0" /* offset 6252 */
+ "\xe5\x8d\xa9\0" /* offset 6256 */
+ "\xe5\x8e\x82\0" /* offset 6260 */
+ "\xe5\x8e\xb6\0" /* offset 6264 */
+ "\xe5\x8f\x88\0" /* offset 6268 */
+ "\xe5\x8f\xa3\0" /* offset 6272 */
+ "\xe5\x9b\x97\0" /* offset 6276 */
+ "\xe5\x9c\x9f\0" /* offset 6280 */
+ "\xe5\xa3\xab\0" /* offset 6284 */
+ "\xe5\xa4\x82\0" /* offset 6288 */
+ "\xe5\xa4\x8a\0" /* offset 6292 */
+ "\xe5\xa4\x95\0" /* offset 6296 */
+ "\xe5\xa4\xa7\0" /* offset 6300 */
+ "\xe5\xa5\xb3\0" /* offset 6304 */
+ "\xe5\xad\x90\0" /* offset 6308 */
+ "\xe5\xae\x80\0" /* offset 6312 */
+ "\xe5\xaf\xb8\0" /* offset 6316 */
+ "\xe5\xb0\x8f\0" /* offset 6320 */
+ "\xe5\xb0\xa2\0" /* offset 6324 */
+ "\xe5\xb0\xb8\0" /* offset 6328 */
+ "\xe5\xb1\xae\0" /* offset 6332 */
+ "\xe5\xb1\xb1\0" /* offset 6336 */
+ "\xe5\xb7\x9b\0" /* offset 6340 */
+ "\xe5\xb7\xa5\0" /* offset 6344 */
+ "\xe5\xb7\xb1\0" /* offset 6348 */
+ "\xe5\xb7\xbe\0" /* offset 6352 */
+ "\xe5\xb9\xb2\0" /* offset 6356 */
+ "\xe5\xb9\xba\0" /* offset 6360 */
+ "\xe5\xb9\xbf\0" /* offset 6364 */
+ "\xe5\xbb\xb4\0" /* offset 6368 */
+ "\xe5\xbb\xbe\0" /* offset 6372 */
+ "\xe5\xbc\x8b\0" /* offset 6376 */
+ "\xe5\xbc\x93\0" /* offset 6380 */
+ "\xe5\xbd\x90\0" /* offset 6384 */
+ "\xe5\xbd\xa1\0" /* offset 6388 */
+ "\xe5\xbd\xb3\0" /* offset 6392 */
+ "\xe5\xbf\x83\0" /* offset 6396 */
+ "\xe6\x88\x88\0" /* offset 6400 */
+ "\xe6\x88\xb6\0" /* offset 6404 */
+ "\xe6\x89\x8b\0" /* offset 6408 */
+ "\xe6\x94\xaf\0" /* offset 6412 */
+ "\xe6\x94\xb4\0" /* offset 6416 */
+ "\xe6\x96\x87\0" /* offset 6420 */
+ "\xe6\x96\x97\0" /* offset 6424 */
+ "\xe6\x96\xa4\0" /* offset 6428 */
+ "\xe6\x96\xb9\0" /* offset 6432 */
+ "\xe6\x97\xa0\0" /* offset 6436 */
+ "\xe6\x97\xa5\0" /* offset 6440 */
+ "\xe6\x9b\xb0\0" /* offset 6444 */
+ "\xe6\x9c\x88\0" /* offset 6448 */
+ "\xe6\x9c\xa8\0" /* offset 6452 */
+ "\xe6\xac\xa0\0" /* offset 6456 */
+ "\xe6\xad\xa2\0" /* offset 6460 */
+ "\xe6\xad\xb9\0" /* offset 6464 */
+ "\xe6\xae\xb3\0" /* offset 6468 */
+ "\xe6\xaf\x8b\0" /* offset 6472 */
+ "\xe6\xaf\x94\0" /* offset 6476 */
+ "\xe6\xaf\x9b\0" /* offset 6480 */
+ "\xe6\xb0\x8f\0" /* offset 6484 */
+ "\xe6\xb0\x94\0" /* offset 6488 */
+ "\xe6\xb0\xb4\0" /* offset 6492 */
+ "\xe7\x81\xab\0" /* offset 6496 */
+ "\xe7\x88\xaa\0" /* offset 6500 */
+ "\xe7\x88\xb6\0" /* offset 6504 */
+ "\xe7\x88\xbb\0" /* offset 6508 */
+ "\xe7\x88\xbf\0" /* offset 6512 */
+ "\xe7\x89\x87\0" /* offset 6516 */
+ "\xe7\x89\x99\0" /* offset 6520 */
+ "\xe7\x89\x9b\0" /* offset 6524 */
+ "\xe7\x8a\xac\0" /* offset 6528 */
+ "\xe7\x8e\x84\0" /* offset 6532 */
+ "\xe7\x8e\x89\0" /* offset 6536 */
+ "\xe7\x93\x9c\0" /* offset 6540 */
+ "\xe7\x93\xa6\0" /* offset 6544 */
+ "\xe7\x94\x98\0" /* offset 6548 */
+ "\xe7\x94\x9f\0" /* offset 6552 */
+ "\xe7\x94\xa8\0" /* offset 6556 */
+ "\xe7\x94\xb0\0" /* offset 6560 */
+ "\xe7\x96\x8b\0" /* offset 6564 */
+ "\xe7\x96\x92\0" /* offset 6568 */
+ "\xe7\x99\xb6\0" /* offset 6572 */
+ "\xe7\x99\xbd\0" /* offset 6576 */
+ "\xe7\x9a\xae\0" /* offset 6580 */
+ "\xe7\x9a\xbf\0" /* offset 6584 */
+ "\xe7\x9b\xae\0" /* offset 6588 */
+ "\xe7\x9f\x9b\0" /* offset 6592 */
+ "\xe7\x9f\xa2\0" /* offset 6596 */
+ "\xe7\x9f\xb3\0" /* offset 6600 */
+ "\xe7\xa4\xba\0" /* offset 6604 */
+ "\xe7\xa6\xb8\0" /* offset 6608 */
+ "\xe7\xa6\xbe\0" /* offset 6612 */
+ "\xe7\xa9\xb4\0" /* offset 6616 */
+ "\xe7\xab\x8b\0" /* offset 6620 */
+ "\xe7\xab\xb9\0" /* offset 6624 */
+ "\xe7\xb1\xb3\0" /* offset 6628 */
+ "\xe7\xb3\xb8\0" /* offset 6632 */
+ "\xe7\xbc\xb6\0" /* offset 6636 */
+ "\xe7\xbd\x91\0" /* offset 6640 */
+ "\xe7\xbe\x8a\0" /* offset 6644 */
+ "\xe7\xbe\xbd\0" /* offset 6648 */
+ "\xe8\x80\x81\0" /* offset 6652 */
+ "\xe8\x80\x8c\0" /* offset 6656 */
+ "\xe8\x80\x92\0" /* offset 6660 */
+ "\xe8\x80\xb3\0" /* offset 6664 */
+ "\xe8\x81\xbf\0" /* offset 6668 */
+ "\xe8\x82\x89\0" /* offset 6672 */
+ "\xe8\x87\xa3\0" /* offset 6676 */
+ "\xe8\x87\xaa\0" /* offset 6680 */
+ "\xe8\x87\xb3\0" /* offset 6684 */
+ "\xe8\x87\xbc\0" /* offset 6688 */
+ "\xe8\x88\x8c\0" /* offset 6692 */
+ "\xe8\x88\x9b\0" /* offset 6696 */
+ "\xe8\x88\x9f\0" /* offset 6700 */
+ "\xe8\x89\xae\0" /* offset 6704 */
+ "\xe8\x89\xb2\0" /* offset 6708 */
+ "\xe8\x89\xb8\0" /* offset 6712 */
+ "\xe8\x99\x8d\0" /* offset 6716 */
+ "\xe8\x99\xab\0" /* offset 6720 */
+ "\xe8\xa1\x80\0" /* offset 6724 */
+ "\xe8\xa1\x8c\0" /* offset 6728 */
+ "\xe8\xa1\xa3\0" /* offset 6732 */
+ "\xe8\xa5\xbe\0" /* offset 6736 */
+ "\xe8\xa6\x8b\0" /* offset 6740 */
+ "\xe8\xa7\x92\0" /* offset 6744 */
+ "\xe8\xa8\x80\0" /* offset 6748 */
+ "\xe8\xb0\xb7\0" /* offset 6752 */
+ "\xe8\xb1\x86\0" /* offset 6756 */
+ "\xe8\xb1\x95\0" /* offset 6760 */
+ "\xe8\xb1\xb8\0" /* offset 6764 */
+ "\xe8\xb2\x9d\0" /* offset 6768 */
+ "\xe8\xb5\xa4\0" /* offset 6772 */
+ "\xe8\xb5\xb0\0" /* offset 6776 */
+ "\xe8\xb6\xb3\0" /* offset 6780 */
+ "\xe8\xba\xab\0" /* offset 6784 */
+ "\xe8\xbb\x8a\0" /* offset 6788 */
+ "\xe8\xbe\x9b\0" /* offset 6792 */
+ "\xe8\xbe\xb0\0" /* offset 6796 */
+ "\xe8\xbe\xb5\0" /* offset 6800 */
+ "\xe9\x82\x91\0" /* offset 6804 */
+ "\xe9\x85\x89\0" /* offset 6808 */
+ "\xe9\x87\x86\0" /* offset 6812 */
+ "\xe9\x87\x8c\0" /* offset 6816 */
+ "\xe9\x87\x91\0" /* offset 6820 */
+ "\xe9\x95\xb7\0" /* offset 6824 */
+ "\xe9\x96\x80\0" /* offset 6828 */
+ "\xe9\x98\x9c\0" /* offset 6832 */
+ "\xe9\x9a\xb6\0" /* offset 6836 */
+ "\xe9\x9a\xb9\0" /* offset 6840 */
+ "\xe9\x9b\xa8\0" /* offset 6844 */
+ "\xe9\x9d\x91\0" /* offset 6848 */
+ "\xe9\x9d\x9e\0" /* offset 6852 */
+ "\xe9\x9d\xa2\0" /* offset 6856 */
+ "\xe9\x9d\xa9\0" /* offset 6860 */
+ "\xe9\x9f\x8b\0" /* offset 6864 */
+ "\xe9\x9f\xad\0" /* offset 6868 */
+ "\xe9\x9f\xb3\0" /* offset 6872 */
+ "\xe9\xa0\x81\0" /* offset 6876 */
+ "\xe9\xa2\xa8\0" /* offset 6880 */
+ "\xe9\xa3\x9b\0" /* offset 6884 */
+ "\xe9\xa3\x9f\0" /* offset 6888 */
+ "\xe9\xa6\x96\0" /* offset 6892 */
+ "\xe9\xa6\x99\0" /* offset 6896 */
+ "\xe9\xa6\xac\0" /* offset 6900 */
+ "\xe9\xaa\xa8\0" /* offset 6904 */
+ "\xe9\xab\x98\0" /* offset 6908 */
+ "\xe9\xab\x9f\0" /* offset 6912 */
+ "\xe9\xac\xa5\0" /* offset 6916 */
+ "\xe9\xac\xaf\0" /* offset 6920 */
+ "\xe9\xac\xb2\0" /* offset 6924 */
+ "\xe9\xac\xbc\0" /* offset 6928 */
+ "\xe9\xad\x9a\0" /* offset 6932 */
+ "\xe9\xb3\xa5\0" /* offset 6936 */
+ "\xe9\xb9\xb5\0" /* offset 6940 */
+ "\xe9\xb9\xbf\0" /* offset 6944 */
+ "\xe9\xba\xa5\0" /* offset 6948 */
+ "\xe9\xba\xbb\0" /* offset 6952 */
+ "\xe9\xbb\x83\0" /* offset 6956 */
+ "\xe9\xbb\x8d\0" /* offset 6960 */
+ "\xe9\xbb\x91\0" /* offset 6964 */
+ "\xe9\xbb\xb9\0" /* offset 6968 */
+ "\xe9\xbb\xbd\0" /* offset 6972 */
+ "\xe9\xbc\x8e\0" /* offset 6976 */
+ "\xe9\xbc\x93\0" /* offset 6980 */
+ "\xe9\xbc\xa0\0" /* offset 6984 */
+ "\xe9\xbc\xbb\0" /* offset 6988 */
+ "\xe9\xbd\x8a\0" /* offset 6992 */
+ "\xe9\xbd\x92\0" /* offset 6996 */
+ "\xe9\xbe\x8d\0" /* offset 7000 */
+ "\xe9\xbe\x9c\0" /* offset 7004 */
+ "\xe9\xbe\xa0\0" /* offset 7008 */
+ "\xe3\x80\x92\0" /* offset 7012 */
+ "\xe5\x8d\x84\0" /* offset 7016 */
+ "\xe5\x8d\x85\0" /* offset 7020 */
+ "\xe3\x81\x8b\xe3\x82\x99\0" /* offset 7024 */
+ "\xe3\x81\x8d\xe3\x82\x99\0" /* offset 7031 */
+ "\xe3\x81\x8f\xe3\x82\x99\0" /* offset 7038 */
+ "\xe3\x81\x91\xe3\x82\x99\0" /* offset 7045 */
+ "\xe3\x81\x93\xe3\x82\x99\0" /* offset 7052 */
+ "\xe3\x81\x95\xe3\x82\x99\0" /* offset 7059 */
+ "\xe3\x81\x97\xe3\x82\x99\0" /* offset 7066 */
+ "\xe3\x81\x99\xe3\x82\x99\0" /* offset 7073 */
+ "\xe3\x81\x9b\xe3\x82\x99\0" /* offset 7080 */
+ "\xe3\x81\x9d\xe3\x82\x99\0" /* offset 7087 */
+ "\xe3\x81\x9f\xe3\x82\x99\0" /* offset 7094 */
+ "\xe3\x81\xa1\xe3\x82\x99\0" /* offset 7101 */
+ "\xe3\x81\xa4\xe3\x82\x99\0" /* offset 7108 */
+ "\xe3\x81\xa6\xe3\x82\x99\0" /* offset 7115 */
+ "\xe3\x81\xa8\xe3\x82\x99\0" /* offset 7122 */
+ "\xe3\x81\xaf\xe3\x82\x99\0" /* offset 7129 */
+ "\xe3\x81\xaf\xe3\x82\x9a\0" /* offset 7136 */
+ "\xe3\x81\xb2\xe3\x82\x99\0" /* offset 7143 */
+ "\xe3\x81\xb2\xe3\x82\x9a\0" /* offset 7150 */
+ "\xe3\x81\xb5\xe3\x82\x99\0" /* offset 7157 */
+ "\xe3\x81\xb5\xe3\x82\x9a\0" /* offset 7164 */
+ "\xe3\x81\xb8\xe3\x82\x99\0" /* offset 7171 */
+ "\xe3\x81\xb8\xe3\x82\x9a\0" /* offset 7178 */
+ "\xe3\x81\xbb\xe3\x82\x99\0" /* offset 7185 */
+ "\xe3\x81\xbb\xe3\x82\x9a\0" /* offset 7192 */
+ "\xe3\x81\x86\xe3\x82\x99\0" /* offset 7199 */
+ "\x20\xe3\x82\x99\0" /* offset 7206 */
+ "\x20\xe3\x82\x9a\0" /* offset 7211 */
+ "\xe3\x82\x9d\xe3\x82\x99\0" /* offset 7216 */
+ "\xe3\x82\x88\xe3\x82\x8a\0" /* offset 7223 */
+ "\xe3\x82\xab\xe3\x82\x99\0" /* offset 7230 */
+ "\xe3\x82\xad\xe3\x82\x99\0" /* offset 7237 */
+ "\xe3\x82\xaf\xe3\x82\x99\0" /* offset 7244 */
+ "\xe3\x82\xb1\xe3\x82\x99\0" /* offset 7251 */
+ "\xe3\x82\xb3\xe3\x82\x99\0" /* offset 7258 */
+ "\xe3\x82\xb5\xe3\x82\x99\0" /* offset 7265 */
+ "\xe3\x82\xb7\xe3\x82\x99\0" /* offset 7272 */
+ "\xe3\x82\xb9\xe3\x82\x99\0" /* offset 7279 */
+ "\xe3\x82\xbb\xe3\x82\x99\0" /* offset 7286 */
+ "\xe3\x82\xbd\xe3\x82\x99\0" /* offset 7293 */
+ "\xe3\x82\xbf\xe3\x82\x99\0" /* offset 7300 */
+ "\xe3\x83\x81\xe3\x82\x99\0" /* offset 7307 */
+ "\xe3\x83\x84\xe3\x82\x99\0" /* offset 7314 */
+ "\xe3\x83\x86\xe3\x82\x99\0" /* offset 7321 */
+ "\xe3\x83\x88\xe3\x82\x99\0" /* offset 7328 */
+ "\xe3\x83\x8f\xe3\x82\x99\0" /* offset 7335 */
+ "\xe3\x83\x8f\xe3\x82\x9a\0" /* offset 7342 */
+ "\xe3\x83\x92\xe3\x82\x99\0" /* offset 7349 */
+ "\xe3\x83\x92\xe3\x82\x9a\0" /* offset 7356 */
+ "\xe3\x83\x95\xe3\x82\x99\0" /* offset 7363 */
+ "\xe3\x83\x95\xe3\x82\x9a\0" /* offset 7370 */
+ "\xe3\x83\x98\xe3\x82\x99\0" /* offset 7377 */
+ "\xe3\x83\x98\xe3\x82\x9a\0" /* offset 7384 */
+ "\xe3\x83\x9b\xe3\x82\x99\0" /* offset 7391 */
+ "\xe3\x83\x9b\xe3\x82\x9a\0" /* offset 7398 */
+ "\xe3\x82\xa6\xe3\x82\x99\0" /* offset 7405 */
+ "\xe3\x83\xaf\xe3\x82\x99\0" /* offset 7412 */
+ "\xe3\x83\xb0\xe3\x82\x99\0" /* offset 7419 */
+ "\xe3\x83\xb1\xe3\x82\x99\0" /* offset 7426 */
+ "\xe3\x83\xb2\xe3\x82\x99\0" /* offset 7433 */
+ "\xe3\x83\xbd\xe3\x82\x99\0" /* offset 7440 */
+ "\xe3\x82\xb3\xe3\x83\x88\0" /* offset 7447 */
+ "\xe1\x84\x80\0" /* offset 7454 */
+ "\xe1\x84\x81\0" /* offset 7458 */
+ "\xe1\x86\xaa\0" /* offset 7462 */
+ "\xe1\x84\x82\0" /* offset 7466 */
+ "\xe1\x86\xac\0" /* offset 7470 */
+ "\xe1\x86\xad\0" /* offset 7474 */
+ "\xe1\x84\x83\0" /* offset 7478 */
+ "\xe1\x84\x84\0" /* offset 7482 */
+ "\xe1\x84\x85\0" /* offset 7486 */
+ "\xe1\x86\xb0\0" /* offset 7490 */
+ "\xe1\x86\xb1\0" /* offset 7494 */
+ "\xe1\x86\xb2\0" /* offset 7498 */
+ "\xe1\x86\xb3\0" /* offset 7502 */
+ "\xe1\x86\xb4\0" /* offset 7506 */
+ "\xe1\x86\xb5\0" /* offset 7510 */
+ "\xe1\x84\x9a\0" /* offset 7514 */
+ "\xe1\x84\x86\0" /* offset 7518 */
+ "\xe1\x84\x87\0" /* offset 7522 */
+ "\xe1\x84\x88\0" /* offset 7526 */
+ "\xe1\x84\xa1\0" /* offset 7530 */
+ "\xe1\x84\x89\0" /* offset 7534 */
+ "\xe1\x84\x8a\0" /* offset 7538 */
+ "\xe1\x84\x8b\0" /* offset 7542 */
+ "\xe1\x84\x8c\0" /* offset 7546 */
+ "\xe1\x84\x8d\0" /* offset 7550 */
+ "\xe1\x84\x8e\0" /* offset 7554 */
+ "\xe1\x84\x8f\0" /* offset 7558 */
+ "\xe1\x84\x90\0" /* offset 7562 */
+ "\xe1\x84\x91\0" /* offset 7566 */
+ "\xe1\x84\x92\0" /* offset 7570 */
+ "\xe1\x85\xa1\0" /* offset 7574 */
+ "\xe1\x85\xa2\0" /* offset 7578 */
+ "\xe1\x85\xa3\0" /* offset 7582 */
+ "\xe1\x85\xa4\0" /* offset 7586 */
+ "\xe1\x85\xa5\0" /* offset 7590 */
+ "\xe1\x85\xa6\0" /* offset 7594 */
+ "\xe1\x85\xa7\0" /* offset 7598 */
+ "\xe1\x85\xa8\0" /* offset 7602 */
+ "\xe1\x85\xa9\0" /* offset 7606 */
+ "\xe1\x85\xaa\0" /* offset 7610 */
+ "\xe1\x85\xab\0" /* offset 7614 */
+ "\xe1\x85\xac\0" /* offset 7618 */
+ "\xe1\x85\xad\0" /* offset 7622 */
+ "\xe1\x85\xae\0" /* offset 7626 */
+ "\xe1\x85\xaf\0" /* offset 7630 */
+ "\xe1\x85\xb0\0" /* offset 7634 */
+ "\xe1\x85\xb1\0" /* offset 7638 */
+ "\xe1\x85\xb2\0" /* offset 7642 */
+ "\xe1\x85\xb3\0" /* offset 7646 */
+ "\xe1\x85\xb4\0" /* offset 7650 */
+ "\xe1\x85\xb5\0" /* offset 7654 */
+ "\xe1\x85\xa0\0" /* offset 7658 */
+ "\xe1\x84\x94\0" /* offset 7662 */
+ "\xe1\x84\x95\0" /* offset 7666 */
+ "\xe1\x87\x87\0" /* offset 7670 */
+ "\xe1\x87\x88\0" /* offset 7674 */
+ "\xe1\x87\x8c\0" /* offset 7678 */
+ "\xe1\x87\x8e\0" /* offset 7682 */
+ "\xe1\x87\x93\0" /* offset 7686 */
+ "\xe1\x87\x97\0" /* offset 7690 */
+ "\xe1\x87\x99\0" /* offset 7694 */
+ "\xe1\x84\x9c\0" /* offset 7698 */
+ "\xe1\x87\x9d\0" /* offset 7702 */
+ "\xe1\x87\x9f\0" /* offset 7706 */
+ "\xe1\x84\x9d\0" /* offset 7710 */
+ "\xe1\x84\x9e\0" /* offset 7714 */
+ "\xe1\x84\xa0\0" /* offset 7718 */
+ "\xe1\x84\xa2\0" /* offset 7722 */
+ "\xe1\x84\xa3\0" /* offset 7726 */
+ "\xe1\x84\xa7\0" /* offset 7730 */
+ "\xe1\x84\xa9\0" /* offset 7734 */
+ "\xe1\x84\xab\0" /* offset 7738 */
+ "\xe1\x84\xac\0" /* offset 7742 */
+ "\xe1\x84\xad\0" /* offset 7746 */
+ "\xe1\x84\xae\0" /* offset 7750 */
+ "\xe1\x84\xaf\0" /* offset 7754 */
+ "\xe1\x84\xb2\0" /* offset 7758 */
+ "\xe1\x84\xb6\0" /* offset 7762 */
+ "\xe1\x85\x80\0" /* offset 7766 */
+ "\xe1\x85\x87\0" /* offset 7770 */
+ "\xe1\x85\x8c\0" /* offset 7774 */
+ "\xe1\x87\xb1\0" /* offset 7778 */
+ "\xe1\x87\xb2\0" /* offset 7782 */
+ "\xe1\x85\x97\0" /* offset 7786 */
+ "\xe1\x85\x98\0" /* offset 7790 */
+ "\xe1\x85\x99\0" /* offset 7794 */
+ "\xe1\x86\x84\0" /* offset 7798 */
+ "\xe1\x86\x85\0" /* offset 7802 */
+ "\xe1\x86\x88\0" /* offset 7806 */
+ "\xe1\x86\x91\0" /* offset 7810 */
+ "\xe1\x86\x92\0" /* offset 7814 */
+ "\xe1\x86\x94\0" /* offset 7818 */
+ "\xe1\x86\x9e\0" /* offset 7822 */
+ "\xe1\x86\xa1\0" /* offset 7826 */
+ "\xe4\xb8\x89\0" /* offset 7830 */
+ "\xe5\x9b\x9b\0" /* offset 7834 */
+ "\xe4\xb8\x8a\0" /* offset 7838 */
+ "\xe4\xb8\xad\0" /* offset 7842 */
+ "\xe4\xb8\x8b\0" /* offset 7846 */
+ "\xe7\x94\xb2\0" /* offset 7850 */
+ "\xe4\xb8\x99\0" /* offset 7854 */
+ "\xe4\xb8\x81\0" /* offset 7858 */
+ "\xe5\xa4\xa9\0" /* offset 7862 */
+ "\xe5\x9c\xb0\0" /* offset 7866 */
+ "\x28\xe1\x84\x80\x29\0" /* offset 7870 */
+ "\x28\xe1\x84\x82\x29\0" /* offset 7876 */
+ "\x28\xe1\x84\x83\x29\0" /* offset 7882 */
+ "\x28\xe1\x84\x85\x29\0" /* offset 7888 */
+ "\x28\xe1\x84\x86\x29\0" /* offset 7894 */
+ "\x28\xe1\x84\x87\x29\0" /* offset 7900 */
+ "\x28\xe1\x84\x89\x29\0" /* offset 7906 */
+ "\x28\xe1\x84\x8b\x29\0" /* offset 7912 */
+ "\x28\xe1\x84\x8c\x29\0" /* offset 7918 */
+ "\x28\xe1\x84\x8e\x29\0" /* offset 7924 */
+ "\x28\xe1\x84\x8f\x29\0" /* offset 7930 */
+ "\x28\xe1\x84\x90\x29\0" /* offset 7936 */
+ "\x28\xe1\x84\x91\x29\0" /* offset 7942 */
+ "\x28\xe1\x84\x92\x29\0" /* offset 7948 */
+ "\x28\xe1\x84\x80\xe1\x85\xa1\x29\0" /* offset 7954 */
+ "\x28\xe1\x84\x82\xe1\x85\xa1\x29\0" /* offset 7963 */
+ "\x28\xe1\x84\x83\xe1\x85\xa1\x29\0" /* offset 7972 */
+ "\x28\xe1\x84\x85\xe1\x85\xa1\x29\0" /* offset 7981 */
+ "\x28\xe1\x84\x86\xe1\x85\xa1\x29\0" /* offset 7990 */
+ "\x28\xe1\x84\x87\xe1\x85\xa1\x29\0" /* offset 7999 */
+ "\x28\xe1\x84\x89\xe1\x85\xa1\x29\0" /* offset 8008 */
+ "\x28\xe1\x84\x8b\xe1\x85\xa1\x29\0" /* offset 8017 */
+ "\x28\xe1\x84\x8c\xe1\x85\xa1\x29\0" /* offset 8026 */
+ "\x28\xe1\x84\x8e\xe1\x85\xa1\x29\0" /* offset 8035 */
+ "\x28\xe1\x84\x8f\xe1\x85\xa1\x29\0" /* offset 8044 */
+ "\x28\xe1\x84\x90\xe1\x85\xa1\x29\0" /* offset 8053 */
+ "\x28\xe1\x84\x91\xe1\x85\xa1\x29\0" /* offset 8062 */
+ "\x28\xe1\x84\x92\xe1\x85\xa1\x29\0" /* offset 8071 */
+ "\x28\xe1\x84\x8c\xe1\x85\xae\x29\0" /* offset 8080 */
+ "\x28\xe1\x84\x8b\xe1\x85\xa9\xe1\x84\x8c\xe1\x85\xa5\xe1\x86\xab\x29\0" /* offset 8089 */
+ "\x28\xe1\x84\x8b\xe1\x85\xa9\xe1\x84\x92\xe1\x85\xae\x29\0" /* offset 8107 */
+ "\x28\xe4\xb8\x80\x29\0" /* offset 8122 */
+ "\x28\xe4\xba\x8c\x29\0" /* offset 8128 */
+ "\x28\xe4\xb8\x89\x29\0" /* offset 8134 */
+ "\x28\xe5\x9b\x9b\x29\0" /* offset 8140 */
+ "\x28\xe4\xba\x94\x29\0" /* offset 8146 */
+ "\x28\xe5\x85\xad\x29\0" /* offset 8152 */
+ "\x28\xe4\xb8\x83\x29\0" /* offset 8158 */
+ "\x28\xe5\x85\xab\x29\0" /* offset 8164 */
+ "\x28\xe4\xb9\x9d\x29\0" /* offset 8170 */
+ "\x28\xe5\x8d\x81\x29\0" /* offset 8176 */
+ "\x28\xe6\x9c\x88\x29\0" /* offset 8182 */
+ "\x28\xe7\x81\xab\x29\0" /* offset 8188 */
+ "\x28\xe6\xb0\xb4\x29\0" /* offset 8194 */
+ "\x28\xe6\x9c\xa8\x29\0" /* offset 8200 */
+ "\x28\xe9\x87\x91\x29\0" /* offset 8206 */
+ "\x28\xe5\x9c\x9f\x29\0" /* offset 8212 */
+ "\x28\xe6\x97\xa5\x29\0" /* offset 8218 */
+ "\x28\xe6\xa0\xaa\x29\0" /* offset 8224 */
+ "\x28\xe6\x9c\x89\x29\0" /* offset 8230 */
+ "\x28\xe7\xa4\xbe\x29\0" /* offset 8236 */
+ "\x28\xe5\x90\x8d\x29\0" /* offset 8242 */
+ "\x28\xe7\x89\xb9\x29\0" /* offset 8248 */
+ "\x28\xe8\xb2\xa1\x29\0" /* offset 8254 */
+ "\x28\xe7\xa5\x9d\x29\0" /* offset 8260 */
+ "\x28\xe5\x8a\xb4\x29\0" /* offset 8266 */
+ "\x28\xe4\xbb\xa3\x29\0" /* offset 8272 */
+ "\x28\xe5\x91\xbc\x29\0" /* offset 8278 */
+ "\x28\xe5\xad\xa6\x29\0" /* offset 8284 */
+ "\x28\xe7\x9b\xa3\x29\0" /* offset 8290 */
+ "\x28\xe4\xbc\x81\x29\0" /* offset 8296 */
+ "\x28\xe8\xb3\x87\x29\0" /* offset 8302 */
+ "\x28\xe5\x8d\x94\x29\0" /* offset 8308 */
+ "\x28\xe7\xa5\xad\x29\0" /* offset 8314 */
+ "\x28\xe4\xbc\x91\x29\0" /* offset 8320 */
+ "\x28\xe8\x87\xaa\x29\0" /* offset 8326 */
+ "\x28\xe8\x87\xb3\x29\0" /* offset 8332 */
+ "\x50\x54\x45\0" /* offset 8338 */
+ "\x32\x31\0" /* offset 8342 */
+ "\x32\x32\0" /* offset 8345 */
+ "\x32\x33\0" /* offset 8348 */
+ "\x32\x34\0" /* offset 8351 */
+ "\x32\x35\0" /* offset 8354 */
+ "\x32\x36\0" /* offset 8357 */
+ "\x32\x37\0" /* offset 8360 */
+ "\x32\x38\0" /* offset 8363 */
+ "\x32\x39\0" /* offset 8366 */
+ "\x33\x30\0" /* offset 8369 */
+ "\x33\x31\0" /* offset 8372 */
+ "\x33\x32\0" /* offset 8375 */
+ "\x33\x33\0" /* offset 8378 */
+ "\x33\x34\0" /* offset 8381 */
+ "\x33\x35\0" /* offset 8384 */
+ "\xe1\x84\x80\xe1\x85\xa1\0" /* offset 8387 */
+ "\xe1\x84\x82\xe1\x85\xa1\0" /* offset 8394 */
+ "\xe1\x84\x83\xe1\x85\xa1\0" /* offset 8401 */
+ "\xe1\x84\x85\xe1\x85\xa1\0" /* offset 8408 */
+ "\xe1\x84\x86\xe1\x85\xa1\0" /* offset 8415 */
+ "\xe1\x84\x87\xe1\x85\xa1\0" /* offset 8422 */
+ "\xe1\x84\x89\xe1\x85\xa1\0" /* offset 8429 */
+ "\xe1\x84\x8b\xe1\x85\xa1\0" /* offset 8436 */
+ "\xe1\x84\x8c\xe1\x85\xa1\0" /* offset 8443 */
+ "\xe1\x84\x8e\xe1\x85\xa1\0" /* offset 8450 */
+ "\xe1\x84\x8f\xe1\x85\xa1\0" /* offset 8457 */
+ "\xe1\x84\x90\xe1\x85\xa1\0" /* offset 8464 */
+ "\xe1\x84\x91\xe1\x85\xa1\0" /* offset 8471 */
+ "\xe1\x84\x92\xe1\x85\xa1\0" /* offset 8478 */
+ "\xe1\x84\x8e\xe1\x85\xa1\xe1\x86\xb7\xe1\x84\x80\xe1\x85\xa9\0" /* offset 8485 */
+ "\xe1\x84\x8c\xe1\x85\xae\xe1\x84\x8b\xe1\x85\xb4\0" /* offset 8501 */
+ "\xe1\x84\x8b\xe1\x85\xae\0" /* offset 8514 */
+ "\xe4\xba\x94\0" /* offset 8521 */
+ "\xe5\x85\xad\0" /* offset 8525 */
+ "\xe4\xb8\x83\0" /* offset 8529 */
+ "\xe4\xb9\x9d\0" /* offset 8533 */
+ "\xe6\xa0\xaa\0" /* offset 8537 */
+ "\xe6\x9c\x89\0" /* offset 8541 */
+ "\xe7\xa4\xbe\0" /* offset 8545 */
+ "\xe5\x90\x8d\0" /* offset 8549 */
+ "\xe7\x89\xb9\0" /* offset 8553 */
+ "\xe8\xb2\xa1\0" /* offset 8557 */
+ "\xe7\xa5\x9d\0" /* offset 8561 */
+ "\xe5\x8a\xb4\0" /* offset 8565 */
+ "\xe7\xa7\x98\0" /* offset 8569 */
+ "\xe7\x94\xb7\0" /* offset 8573 */
+ "\xe9\x81\xa9\0" /* offset 8577 */
+ "\xe5\x84\xaa\0" /* offset 8581 */
+ "\xe5\x8d\xb0\0" /* offset 8585 */
+ "\xe6\xb3\xa8\0" /* offset 8589 */
+ "\xe9\xa0\x85\0" /* offset 8593 */
+ "\xe4\xbc\x91\0" /* offset 8597 */
+ "\xe5\x86\x99\0" /* offset 8601 */
+ "\xe6\xad\xa3\0" /* offset 8605 */
+ "\xe5\xb7\xa6\0" /* offset 8609 */
+ "\xe5\x8f\xb3\0" /* offset 8613 */
+ "\xe5\x8c\xbb\0" /* offset 8617 */
+ "\xe5\xae\x97\0" /* offset 8621 */
+ "\xe5\xad\xa6\0" /* offset 8625 */
+ "\xe7\x9b\xa3\0" /* offset 8629 */
+ "\xe4\xbc\x81\0" /* offset 8633 */
+ "\xe8\xb3\x87\0" /* offset 8637 */
+ "\xe5\x8d\x94\0" /* offset 8641 */
+ "\xe5\xa4\x9c\0" /* offset 8645 */
+ "\x33\x36\0" /* offset 8649 */
+ "\x33\x37\0" /* offset 8652 */
+ "\x33\x38\0" /* offset 8655 */
+ "\x33\x39\0" /* offset 8658 */
+ "\x34\x30\0" /* offset 8661 */
+ "\x34\x31\0" /* offset 8664 */
+ "\x34\x32\0" /* offset 8667 */
+ "\x34\x33\0" /* offset 8670 */
+ "\x34\x34\0" /* offset 8673 */
+ "\x34\x35\0" /* offset 8676 */
+ "\x34\x36\0" /* offset 8679 */
+ "\x34\x37\0" /* offset 8682 */
+ "\x34\x38\0" /* offset 8685 */
+ "\x34\x39\0" /* offset 8688 */
+ "\x35\x30\0" /* offset 8691 */
+ "\x31\xe6\x9c\x88\0" /* offset 8694 */
+ "\x32\xe6\x9c\x88\0" /* offset 8699 */
+ "\x33\xe6\x9c\x88\0" /* offset 8704 */
+ "\x34\xe6\x9c\x88\0" /* offset 8709 */
+ "\x35\xe6\x9c\x88\0" /* offset 8714 */
+ "\x36\xe6\x9c\x88\0" /* offset 8719 */
+ "\x37\xe6\x9c\x88\0" /* offset 8724 */
+ "\x38\xe6\x9c\x88\0" /* offset 8729 */
+ "\x39\xe6\x9c\x88\0" /* offset 8734 */
+ "\x31\x30\xe6\x9c\x88\0" /* offset 8739 */
+ "\x31\x31\xe6\x9c\x88\0" /* offset 8745 */
+ "\x31\x32\xe6\x9c\x88\0" /* offset 8751 */
+ "\x48\x67\0" /* offset 8757 */
+ "\x65\x72\x67\0" /* offset 8760 */
+ "\x65\x56\0" /* offset 8764 */
+ "\x4c\x54\x44\0" /* offset 8767 */
+ "\xe3\x82\xa2\0" /* offset 8771 */
+ "\xe3\x82\xa4\0" /* offset 8775 */
+ "\xe3\x82\xa6\0" /* offset 8779 */
+ "\xe3\x82\xa8\0" /* offset 8783 */
+ "\xe3\x82\xaa\0" /* offset 8787 */
+ "\xe3\x82\xab\0" /* offset 8791 */
+ "\xe3\x82\xad\0" /* offset 8795 */
+ "\xe3\x82\xaf\0" /* offset 8799 */
+ "\xe3\x82\xb1\0" /* offset 8803 */
+ "\xe3\x82\xb3\0" /* offset 8807 */
+ "\xe3\x82\xb5\0" /* offset 8811 */
+ "\xe3\x82\xb7\0" /* offset 8815 */
+ "\xe3\x82\xb9\0" /* offset 8819 */
+ "\xe3\x82\xbb\0" /* offset 8823 */
+ "\xe3\x82\xbd\0" /* offset 8827 */
+ "\xe3\x82\xbf\0" /* offset 8831 */
+ "\xe3\x83\x81\0" /* offset 8835 */
+ "\xe3\x83\x84\0" /* offset 8839 */
+ "\xe3\x83\x86\0" /* offset 8843 */
+ "\xe3\x83\x88\0" /* offset 8847 */
+ "\xe3\x83\x8a\0" /* offset 8851 */
+ "\xe3\x83\x8b\0" /* offset 8855 */
+ "\xe3\x83\x8c\0" /* offset 8859 */
+ "\xe3\x83\x8d\0" /* offset 8863 */
+ "\xe3\x83\x8e\0" /* offset 8867 */
+ "\xe3\x83\x8f\0" /* offset 8871 */
+ "\xe3\x83\x92\0" /* offset 8875 */
+ "\xe3\x83\x95\0" /* offset 8879 */
+ "\xe3\x83\x98\0" /* offset 8883 */
+ "\xe3\x83\x9b\0" /* offset 8887 */
+ "\xe3\x83\x9e\0" /* offset 8891 */
+ "\xe3\x83\x9f\0" /* offset 8895 */
+ "\xe3\x83\xa0\0" /* offset 8899 */
+ "\xe3\x83\xa1\0" /* offset 8903 */
+ "\xe3\x83\xa2\0" /* offset 8907 */
+ "\xe3\x83\xa4\0" /* offset 8911 */
+ "\xe3\x83\xa6\0" /* offset 8915 */
+ "\xe3\x83\xa8\0" /* offset 8919 */
+ "\xe3\x83\xa9\0" /* offset 8923 */
+ "\xe3\x83\xaa\0" /* offset 8927 */
+ "\xe3\x83\xab\0" /* offset 8931 */
+ "\xe3\x83\xac\0" /* offset 8935 */
+ "\xe3\x83\xad\0" /* offset 8939 */
+ "\xe3\x83\xaf\0" /* offset 8943 */
+ "\xe3\x83\xb0\0" /* offset 8947 */
+ "\xe3\x83\xb1\0" /* offset 8951 */
+ "\xe3\x83\xb2\0" /* offset 8955 */
+ "\xe3\x82\xa2\xe3\x83\x8f\xe3\x82\x9a\xe3\x83\xbc\xe3\x83\x88\0" /* offset 8959 */
+ "\xe3\x82\xa2\xe3\x83\xab\xe3\x83\x95\xe3\x82\xa1\0" /* offset 8975 */
+ "\xe3\x82\xa2\xe3\x83\xb3\xe3\x83\x98\xe3\x82\x9a\xe3\x82\xa2\0" /* offset 8988 */
+ "\xe3\x82\xa2\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9004 */
+ "\xe3\x82\xa4\xe3\x83\x8b\xe3\x83\xb3\xe3\x82\xaf\xe3\x82\x99\0" /* offset 9014 */
+ "\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x81\0" /* offset 9030 */
+ "\xe3\x82\xa6\xe3\x82\xa9\xe3\x83\xb3\0" /* offset 9040 */
+ "\xe3\x82\xa8\xe3\x82\xb9\xe3\x82\xaf\xe3\x83\xbc\xe3\x83\x88\xe3\x82\x99\0" /* offset 9050 */
+ "\xe3\x82\xa8\xe3\x83\xbc\xe3\x82\xab\xe3\x83\xbc\0" /* offset 9069 */
+ "\xe3\x82\xaa\xe3\x83\xb3\xe3\x82\xb9\0" /* offset 9082 */
+ "\xe3\x82\xaa\xe3\x83\xbc\xe3\x83\xa0\0" /* offset 9092 */
+ "\xe3\x82\xab\xe3\x82\xa4\xe3\x83\xaa\0" /* offset 9102 */
+ "\xe3\x82\xab\xe3\x83\xa9\xe3\x83\x83\xe3\x83\x88\0" /* offset 9112 */
+ "\xe3\x82\xab\xe3\x83\xad\xe3\x83\xaa\xe3\x83\xbc\0" /* offset 9125 */
+ "\xe3\x82\xab\xe3\x82\x99\xe3\x83\xad\xe3\x83\xb3\0" /* offset 9138 */
+ "\xe3\x82\xab\xe3\x82\x99\xe3\x83\xb3\xe3\x83\x9e\0" /* offset 9151 */
+ "\xe3\x82\xad\xe3\x82\x99\xe3\x82\xab\xe3\x82\x99\0" /* offset 9164 */
+ "\xe3\x82\xad\xe3\x82\x99\xe3\x83\x8b\xe3\x83\xbc\0" /* offset 9177 */
+ "\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\xbc\0" /* offset 9190 */
+ "\xe3\x82\xad\xe3\x82\x99\xe3\x83\xab\xe3\x82\xbf\xe3\x82\x99\xe3\x83\xbc\0" /* offset 9203 */
+ "\xe3\x82\xad\xe3\x83\xad\0" /* offset 9222 */
+ "\xe3\x82\xad\xe3\x83\xad\xe3\x82\xaf\xe3\x82\x99\xe3\x83\xa9\xe3\x83\xa0\0" /* offset 9229 */
+ "\xe3\x82\xad\xe3\x83\xad\xe3\x83\xa1\xe3\x83\xbc\xe3\x83\x88\xe3\x83\xab\0" /* offset 9248 */
+ "\xe3\x82\xad\xe3\x83\xad\xe3\x83\xaf\xe3\x83\x83\xe3\x83\x88\0" /* offset 9267 */
+ "\xe3\x82\xaf\xe3\x82\x99\xe3\x83\xa9\xe3\x83\xa0\0" /* offset 9283 */
+ "\xe3\x82\xaf\xe3\x82\x99\xe3\x83\xa9\xe3\x83\xa0\xe3\x83\x88\xe3\x83\xb3\0" /* offset 9296 */
+ "\xe3\x82\xaf\xe3\x83\xab\xe3\x82\xbb\xe3\x82\x99\xe3\x82\xa4\xe3\x83\xad\0" /* offset 9315 */
+ "\xe3\x82\xaf\xe3\x83\xad\xe3\x83\xbc\xe3\x83\x8d\0" /* offset 9334 */
+ "\xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xb9\0" /* offset 9347 */
+ "\xe3\x82\xb3\xe3\x83\xab\xe3\x83\x8a\0" /* offset 9357 */
+ "\xe3\x82\xb3\xe3\x83\xbc\xe3\x83\x9b\xe3\x82\x9a\0" /* offset 9367 */
+ "\xe3\x82\xb5\xe3\x82\xa4\xe3\x82\xaf\xe3\x83\xab\0" /* offset 9380 */
+ "\xe3\x82\xb5\xe3\x83\xb3\xe3\x83\x81\xe3\x83\xbc\xe3\x83\xa0\0" /* offset 9393 */
+ "\xe3\x82\xb7\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xaf\xe3\x82\x99\0" /* offset 9409 */
+ "\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x81\0" /* offset 9425 */
+ "\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x88\0" /* offset 9435 */
+ "\xe3\x82\xbf\xe3\x82\x99\xe3\x83\xbc\xe3\x82\xb9\0" /* offset 9445 */
+ "\xe3\x83\x86\xe3\x82\x99\xe3\x82\xb7\0" /* offset 9458 */
+ "\xe3\x83\x88\xe3\x82\x99\xe3\x83\xab\0" /* offset 9468 */
+ "\xe3\x83\x88\xe3\x83\xb3\0" /* offset 9478 */
+ "\xe3\x83\x8a\xe3\x83\x8e\0" /* offset 9485 */
+ "\xe3\x83\x8e\xe3\x83\x83\xe3\x83\x88\0" /* offset 9492 */
+ "\xe3\x83\x8f\xe3\x82\xa4\xe3\x83\x84\0" /* offset 9502 */
+ "\xe3\x83\x8f\xe3\x82\x9a\xe3\x83\xbc\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x88\0" /* offset 9512 */
+ "\xe3\x83\x8f\xe3\x82\x9a\xe3\x83\xbc\xe3\x83\x84\0" /* offset 9531 */
+ "\xe3\x83\x8f\xe3\x82\x99\xe3\x83\xbc\xe3\x83\xac\xe3\x83\xab\0" /* offset 9544 */
+ "\xe3\x83\x92\xe3\x82\x9a\xe3\x82\xa2\xe3\x82\xb9\xe3\x83\x88\xe3\x83\xab\0" /* offset 9560 */
+ "\xe3\x83\x92\xe3\x82\x9a\xe3\x82\xaf\xe3\x83\xab\0" /* offset 9579 */
+ "\xe3\x83\x92\xe3\x82\x9a\xe3\x82\xb3\0" /* offset 9592 */
+ "\xe3\x83\x92\xe3\x82\x99\xe3\x83\xab\0" /* offset 9602 */
+ "\xe3\x83\x95\xe3\x82\xa1\xe3\x83\xa9\xe3\x83\x83\xe3\x83\x88\xe3\x82\x99\0" /* offset 9612 */
+ "\xe3\x83\x95\xe3\x82\xa3\xe3\x83\xbc\xe3\x83\x88\0" /* offset 9631 */
+ "\xe3\x83\x95\xe3\x82\x99\xe3\x83\x83\xe3\x82\xb7\xe3\x82\xa7\xe3\x83\xab\0" /* offset 9644 */
+ "\xe3\x83\x95\xe3\x83\xa9\xe3\x83\xb3\0" /* offset 9663 */
+ "\xe3\x83\x98\xe3\x82\xaf\xe3\x82\xbf\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9673 */
+ "\xe3\x83\x98\xe3\x82\x9a\xe3\x82\xbd\0" /* offset 9689 */
+ "\xe3\x83\x98\xe3\x82\x9a\xe3\x83\x8b\xe3\x83\x92\0" /* offset 9699 */
+ "\xe3\x83\x98\xe3\x83\xab\xe3\x83\x84\0" /* offset 9712 */
+ "\xe3\x83\x98\xe3\x82\x9a\xe3\x83\xb3\xe3\x82\xb9\0" /* offset 9722 */
+ "\xe3\x83\x98\xe3\x82\x9a\xe3\x83\xbc\xe3\x82\xb7\xe3\x82\x99\0" /* offset 9735 */
+ "\xe3\x83\x98\xe3\x82\x99\xe3\x83\xbc\xe3\x82\xbf\0" /* offset 9751 */
+ "\xe3\x83\x9b\xe3\x82\x9a\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88\0" /* offset 9764 */
+ "\xe3\x83\x9b\xe3\x82\x99\xe3\x83\xab\xe3\x83\x88\0" /* offset 9780 */
+ "\xe3\x83\x9b\xe3\x83\xb3\0" /* offset 9793 */
+ "\xe3\x83\x9b\xe3\x82\x9a\xe3\x83\xb3\xe3\x83\x88\xe3\x82\x99\0" /* offset 9800 */
+ "\xe3\x83\x9b\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9816 */
+ "\xe3\x83\x9b\xe3\x83\xbc\xe3\x83\xb3\0" /* offset 9826 */
+ "\xe3\x83\x9e\xe3\x82\xa4\xe3\x82\xaf\xe3\x83\xad\0" /* offset 9836 */
+ "\xe3\x83\x9e\xe3\x82\xa4\xe3\x83\xab\0" /* offset 9849 */
+ "\xe3\x83\x9e\xe3\x83\x83\xe3\x83\x8f\0" /* offset 9859 */
+ "\xe3\x83\x9e\xe3\x83\xab\xe3\x82\xaf\0" /* offset 9869 */
+ "\xe3\x83\x9e\xe3\x83\xb3\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\0" /* offset 9879 */
+ "\xe3\x83\x9f\xe3\x82\xaf\xe3\x83\xad\xe3\x83\xb3\0" /* offset 9895 */
+ "\xe3\x83\x9f\xe3\x83\xaa\0" /* offset 9908 */
+ "\xe3\x83\x9f\xe3\x83\xaa\xe3\x83\x8f\xe3\x82\x99\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9915 */
+ "\xe3\x83\xa1\xe3\x82\xab\xe3\x82\x99\0" /* offset 9934 */
+ "\xe3\x83\xa1\xe3\x82\xab\xe3\x82\x99\xe3\x83\x88\xe3\x83\xb3\0" /* offset 9944 */
+ "\xe3\x83\xa1\xe3\x83\xbc\xe3\x83\x88\xe3\x83\xab\0" /* offset 9960 */
+ "\xe3\x83\xa4\xe3\x83\xbc\xe3\x83\x88\xe3\x82\x99\0" /* offset 9973 */
+ "\xe3\x83\xa4\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9986 */
+ "\xe3\x83\xa6\xe3\x82\xa2\xe3\x83\xb3\0" /* offset 9996 */
+ "\xe3\x83\xaa\xe3\x83\x83\xe3\x83\x88\xe3\x83\xab\0" /* offset 10006 */
+ "\xe3\x83\xaa\xe3\x83\xa9\0" /* offset 10019 */
+ "\xe3\x83\xab\xe3\x83\x92\xe3\x82\x9a\xe3\x83\xbc\0" /* offset 10026 */
+ "\xe3\x83\xab\xe3\x83\xbc\xe3\x83\x95\xe3\x82\x99\xe3\x83\xab\0" /* offset 10039 */
+ "\xe3\x83\xac\xe3\x83\xa0\0" /* offset 10055 */
+ "\xe3\x83\xac\xe3\x83\xb3\xe3\x83\x88\xe3\x82\xb1\xe3\x82\x99\xe3\x83\xb3\0" /* offset 10062 */
+ "\xe3\x83\xaf\xe3\x83\x83\xe3\x83\x88\0" /* offset 10081 */
+ "\x30\xe7\x82\xb9\0" /* offset 10091 */
+ "\x31\xe7\x82\xb9\0" /* offset 10096 */
+ "\x32\xe7\x82\xb9\0" /* offset 10101 */
+ "\x33\xe7\x82\xb9\0" /* offset 10106 */
+ "\x34\xe7\x82\xb9\0" /* offset 10111 */
+ "\x35\xe7\x82\xb9\0" /* offset 10116 */
+ "\x36\xe7\x82\xb9\0" /* offset 10121 */
+ "\x37\xe7\x82\xb9\0" /* offset 10126 */
+ "\x38\xe7\x82\xb9\0" /* offset 10131 */
+ "\x39\xe7\x82\xb9\0" /* offset 10136 */
+ "\x31\x30\xe7\x82\xb9\0" /* offset 10141 */
+ "\x31\x31\xe7\x82\xb9\0" /* offset 10147 */
+ "\x31\x32\xe7\x82\xb9\0" /* offset 10153 */
+ "\x31\x33\xe7\x82\xb9\0" /* offset 10159 */
+ "\x31\x34\xe7\x82\xb9\0" /* offset 10165 */
+ "\x31\x35\xe7\x82\xb9\0" /* offset 10171 */
+ "\x31\x36\xe7\x82\xb9\0" /* offset 10177 */
+ "\x31\x37\xe7\x82\xb9\0" /* offset 10183 */
+ "\x31\x38\xe7\x82\xb9\0" /* offset 10189 */
+ "\x31\x39\xe7\x82\xb9\0" /* offset 10195 */
+ "\x32\x30\xe7\x82\xb9\0" /* offset 10201 */
+ "\x32\x31\xe7\x82\xb9\0" /* offset 10207 */
+ "\x32\x32\xe7\x82\xb9\0" /* offset 10213 */
+ "\x32\x33\xe7\x82\xb9\0" /* offset 10219 */
+ "\x32\x34\xe7\x82\xb9\0" /* offset 10225 */
+ "\x68\x50\x61\0" /* offset 10231 */
+ "\x64\x61\0" /* offset 10235 */
+ "\x41\x55\0" /* offset 10238 */
+ "\x62\x61\x72\0" /* offset 10241 */
+ "\x6f\x56\0" /* offset 10245 */
+ "\x70\x63\0" /* offset 10248 */
+ "\x64\x6d\0" /* offset 10251 */
+ "\x64\x6d\x32\0" /* offset 10254 */
+ "\x64\x6d\x33\0" /* offset 10258 */
+ "\x49\x55\0" /* offset 10262 */
+ "\xe5\xb9\xb3\xe6\x88\x90\0" /* offset 10265 */
+ "\xe6\x98\xad\xe5\x92\x8c\0" /* offset 10272 */
+ "\xe5\xa4\xa7\xe6\xad\xa3\0" /* offset 10279 */
+ "\xe6\x98\x8e\xe6\xb2\xbb\0" /* offset 10286 */
+ "\xe6\xa0\xaa\xe5\xbc\x8f\xe4\xbc\x9a\xe7\xa4\xbe\0" /* offset 10293 */
+ "\x70\x41\0" /* offset 10306 */
+ "\x6e\x41\0" /* offset 10309 */
+ "\xce\xbc\x41\0" /* offset 10312 */
+ "\x6d\x41\0" /* offset 10316 */
+ "\x6b\x41\0" /* offset 10319 */
+ "\x4b\x42\0" /* offset 10322 */
+ "\x4d\x42\0" /* offset 10325 */
+ "\x47\x42\0" /* offset 10328 */
+ "\x63\x61\x6c\0" /* offset 10331 */
+ "\x6b\x63\x61\x6c\0" /* offset 10335 */
+ "\x70\x46\0" /* offset 10340 */
+ "\x6e\x46\0" /* offset 10343 */
+ "\xce\xbc\x46\0" /* offset 10346 */
+ "\xce\xbc\x67\0" /* offset 10350 */
+ "\x6d\x67\0" /* offset 10354 */
+ "\x6b\x67\0" /* offset 10357 */
+ "\x48\x7a\0" /* offset 10360 */
+ "\x6b\x48\x7a\0" /* offset 10363 */
+ "\x4d\x48\x7a\0" /* offset 10367 */
+ "\x47\x48\x7a\0" /* offset 10371 */
+ "\x54\x48\x7a\0" /* offset 10375 */
+ "\xce\xbc\x6c\0" /* offset 10379 */
+ "\x6d\x6c\0" /* offset 10383 */
+ "\x64\x6c\0" /* offset 10386 */
+ "\x6b\x6c\0" /* offset 10389 */
+ "\x66\x6d\0" /* offset 10392 */
+ "\x6e\x6d\0" /* offset 10395 */
+ "\xce\xbc\x6d\0" /* offset 10398 */
+ "\x6d\x6d\0" /* offset 10402 */
+ "\x63\x6d\0" /* offset 10405 */
+ "\x6b\x6d\0" /* offset 10408 */
+ "\x6d\x6d\x32\0" /* offset 10411 */
+ "\x63\x6d\x32\0" /* offset 10415 */
+ "\x6d\x32\0" /* offset 10419 */
+ "\x6b\x6d\x32\0" /* offset 10422 */
+ "\x6d\x6d\x33\0" /* offset 10426 */
+ "\x63\x6d\x33\0" /* offset 10430 */
+ "\x6d\x33\0" /* offset 10434 */
+ "\x6b\x6d\x33\0" /* offset 10437 */
+ "\x6d\xe2\x88\x95\x73\0" /* offset 10441 */
+ "\x6d\xe2\x88\x95\x73\x32\0" /* offset 10447 */
+ "\x50\x61\0" /* offset 10454 */
+ "\x6b\x50\x61\0" /* offset 10457 */
+ "\x4d\x50\x61\0" /* offset 10461 */
+ "\x47\x50\x61\0" /* offset 10465 */
+ "\x72\x61\x64\0" /* offset 10469 */
+ "\x72\x61\x64\xe2\x88\x95\x73\0" /* offset 10473 */
+ "\x72\x61\x64\xe2\x88\x95\x73\x32\0" /* offset 10481 */
+ "\x70\x73\0" /* offset 10490 */
+ "\x6e\x73\0" /* offset 10493 */
+ "\xce\xbc\x73\0" /* offset 10496 */
+ "\x6d\x73\0" /* offset 10500 */
+ "\x70\x56\0" /* offset 10503 */
+ "\x6e\x56\0" /* offset 10506 */
+ "\xce\xbc\x56\0" /* offset 10509 */
+ "\x6d\x56\0" /* offset 10513 */
+ "\x6b\x56\0" /* offset 10516 */
+ "\x4d\x56\0" /* offset 10519 */
+ "\x70\x57\0" /* offset 10522 */
+ "\x6e\x57\0" /* offset 10525 */
+ "\xce\xbc\x57\0" /* offset 10528 */
+ "\x6d\x57\0" /* offset 10532 */
+ "\x6b\x57\0" /* offset 10535 */
+ "\x4d\x57\0" /* offset 10538 */
+ "\x6b\xce\xa9\0" /* offset 10541 */
+ "\x4d\xce\xa9\0" /* offset 10545 */
+ "\x61\x2e\x6d\x2e\0" /* offset 10549 */
+ "\x42\x71\0" /* offset 10554 */
+ "\x63\x63\0" /* offset 10557 */
+ "\x63\x64\0" /* offset 10560 */
+ "\x43\xe2\x88\x95\x6b\x67\0" /* offset 10563 */
+ "\x43\x6f\x2e\0" /* offset 10570 */
+ "\x64\x42\0" /* offset 10574 */
+ "\x47\x79\0" /* offset 10577 */
+ "\x68\x61\0" /* offset 10580 */
+ "\x48\x50\0" /* offset 10583 */
+ "\x69\x6e\0" /* offset 10586 */
+ "\x4b\x4b\0" /* offset 10589 */
+ "\x4b\x4d\0" /* offset 10592 */
+ "\x6b\x74\0" /* offset 10595 */
+ "\x6c\x6d\0" /* offset 10598 */
+ "\x6c\x6e\0" /* offset 10601 */
+ "\x6c\x6f\x67\0" /* offset 10604 */
+ "\x6c\x78\0" /* offset 10608 */
+ "\x6d\x62\0" /* offset 10611 */
+ "\x6d\x69\x6c\0" /* offset 10614 */
+ "\x6d\x6f\x6c\0" /* offset 10618 */
+ "\x50\x48\0" /* offset 10622 */
+ "\x70\x2e\x6d\x2e\0" /* offset 10625 */
+ "\x50\x50\x4d\0" /* offset 10630 */
+ "\x50\x52\0" /* offset 10634 */
+ "\x73\x72\0" /* offset 10637 */
+ "\x53\x76\0" /* offset 10640 */
+ "\x57\x62\0" /* offset 10643 */
+ "\x56\xe2\x88\x95\x6d\0" /* offset 10646 */
+ "\x41\xe2\x88\x95\x6d\0" /* offset 10652 */
+ "\x31\xe6\x97\xa5\0" /* offset 10658 */
+ "\x32\xe6\x97\xa5\0" /* offset 10663 */
+ "\x33\xe6\x97\xa5\0" /* offset 10668 */
+ "\x34\xe6\x97\xa5\0" /* offset 10673 */
+ "\x35\xe6\x97\xa5\0" /* offset 10678 */
+ "\x36\xe6\x97\xa5\0" /* offset 10683 */
+ "\x37\xe6\x97\xa5\0" /* offset 10688 */
+ "\x38\xe6\x97\xa5\0" /* offset 10693 */
+ "\x39\xe6\x97\xa5\0" /* offset 10698 */
+ "\x31\x30\xe6\x97\xa5\0" /* offset 10703 */
+ "\x31\x31\xe6\x97\xa5\0" /* offset 10709 */
+ "\x31\x32\xe6\x97\xa5\0" /* offset 10715 */
+ "\x31\x33\xe6\x97\xa5\0" /* offset 10721 */
+ "\x31\x34\xe6\x97\xa5\0" /* offset 10727 */
+ "\x31\x35\xe6\x97\xa5\0" /* offset 10733 */
+ "\x31\x36\xe6\x97\xa5\0" /* offset 10739 */
+ "\x31\x37\xe6\x97\xa5\0" /* offset 10745 */
+ "\x31\x38\xe6\x97\xa5\0" /* offset 10751 */
+ "\x31\x39\xe6\x97\xa5\0" /* offset 10757 */
+ "\x32\x30\xe6\x97\xa5\0" /* offset 10763 */
+ "\x32\x31\xe6\x97\xa5\0" /* offset 10769 */
+ "\x32\x32\xe6\x97\xa5\0" /* offset 10775 */
+ "\x32\x33\xe6\x97\xa5\0" /* offset 10781 */
+ "\x32\x34\xe6\x97\xa5\0" /* offset 10787 */
+ "\x32\x35\xe6\x97\xa5\0" /* offset 10793 */
+ "\x32\x36\xe6\x97\xa5\0" /* offset 10799 */
+ "\x32\x37\xe6\x97\xa5\0" /* offset 10805 */
+ "\x32\x38\xe6\x97\xa5\0" /* offset 10811 */
+ "\x32\x39\xe6\x97\xa5\0" /* offset 10817 */
+ "\x33\x30\xe6\x97\xa5\0" /* offset 10823 */
+ "\x33\x31\xe6\x97\xa5\0" /* offset 10829 */
+ "\x67\x61\x6c\0" /* offset 10835 */
+ "\xe8\xb1\x88\0" /* offset 10839 */
+ "\xe6\x9b\xb4\0" /* offset 10843 */
+ "\xe8\xb3\x88\0" /* offset 10847 */
+ "\xe6\xbb\x91\0" /* offset 10851 */
+ "\xe4\xb8\xb2\0" /* offset 10855 */
+ "\xe5\x8f\xa5\0" /* offset 10859 */
+ "\xe5\xa5\x91\0" /* offset 10863 */
+ "\xe5\x96\x87\0" /* offset 10867 */
+ "\xe5\xa5\x88\0" /* offset 10871 */
+ "\xe6\x87\xb6\0" /* offset 10875 */
+ "\xe7\x99\xa9\0" /* offset 10879 */
+ "\xe7\xbe\x85\0" /* offset 10883 */
+ "\xe8\x98\xbf\0" /* offset 10887 */
+ "\xe8\x9e\xba\0" /* offset 10891 */
+ "\xe8\xa3\xb8\0" /* offset 10895 */
+ "\xe9\x82\x8f\0" /* offset 10899 */
+ "\xe6\xa8\x82\0" /* offset 10903 */
+ "\xe6\xb4\x9b\0" /* offset 10907 */
+ "\xe7\x83\x99\0" /* offset 10911 */
+ "\xe7\x8f\x9e\0" /* offset 10915 */
+ "\xe8\x90\xbd\0" /* offset 10919 */
+ "\xe9\x85\xaa\0" /* offset 10923 */
+ "\xe9\xa7\xb1\0" /* offset 10927 */
+ "\xe4\xba\x82\0" /* offset 10931 */
+ "\xe5\x8d\xb5\0" /* offset 10935 */
+ "\xe6\xac\x84\0" /* offset 10939 */
+ "\xe7\x88\x9b\0" /* offset 10943 */
+ "\xe8\x98\xad\0" /* offset 10947 */
+ "\xe9\xb8\x9e\0" /* offset 10951 */
+ "\xe5\xb5\x90\0" /* offset 10955 */
+ "\xe6\xbf\xab\0" /* offset 10959 */
+ "\xe8\x97\x8d\0" /* offset 10963 */
+ "\xe8\xa5\xa4\0" /* offset 10967 */
+ "\xe6\x8b\x89\0" /* offset 10971 */
+ "\xe8\x87\x98\0" /* offset 10975 */
+ "\xe8\xa0\x9f\0" /* offset 10979 */
+ "\xe5\xbb\x8a\0" /* offset 10983 */
+ "\xe6\x9c\x97\0" /* offset 10987 */
+ "\xe6\xb5\xaa\0" /* offset 10991 */
+ "\xe7\x8b\xbc\0" /* offset 10995 */
+ "\xe9\x83\x8e\0" /* offset 10999 */
+ "\xe4\xbe\x86\0" /* offset 11003 */
+ "\xe5\x86\xb7\0" /* offset 11007 */
+ "\xe5\x8b\x9e\0" /* offset 11011 */
+ "\xe6\x93\x84\0" /* offset 11015 */
+ "\xe6\xab\x93\0" /* offset 11019 */
+ "\xe7\x88\x90\0" /* offset 11023 */
+ "\xe7\x9b\xa7\0" /* offset 11027 */
+ "\xe8\x98\x86\0" /* offset 11031 */
+ "\xe8\x99\x9c\0" /* offset 11035 */
+ "\xe8\xb7\xaf\0" /* offset 11039 */
+ "\xe9\x9c\xb2\0" /* offset 11043 */
+ "\xe9\xad\xaf\0" /* offset 11047 */
+ "\xe9\xb7\xba\0" /* offset 11051 */
+ "\xe7\xa2\x8c\0" /* offset 11055 */
+ "\xe7\xa5\xbf\0" /* offset 11059 */
+ "\xe7\xb6\xa0\0" /* offset 11063 */
+ "\xe8\x8f\x89\0" /* offset 11067 */
+ "\xe9\x8c\x84\0" /* offset 11071 */
+ "\xe8\xab\x96\0" /* offset 11075 */
+ "\xe5\xa3\x9f\0" /* offset 11079 */
+ "\xe5\xbc\x84\0" /* offset 11083 */
+ "\xe7\xb1\xa0\0" /* offset 11087 */
+ "\xe8\x81\xbe\0" /* offset 11091 */
+ "\xe7\x89\xa2\0" /* offset 11095 */
+ "\xe7\xa3\x8a\0" /* offset 11099 */
+ "\xe8\xb3\x82\0" /* offset 11103 */
+ "\xe9\x9b\xb7\0" /* offset 11107 */
+ "\xe5\xa3\x98\0" /* offset 11111 */
+ "\xe5\xb1\xa2\0" /* offset 11115 */
+ "\xe6\xa8\x93\0" /* offset 11119 */
+ "\xe6\xb7\x9a\0" /* offset 11123 */
+ "\xe6\xbc\x8f\0" /* offset 11127 */
+ "\xe7\xb4\xaf\0" /* offset 11131 */
+ "\xe7\xb8\xb7\0" /* offset 11135 */
+ "\xe9\x99\x8b\0" /* offset 11139 */
+ "\xe5\x8b\x92\0" /* offset 11143 */
+ "\xe8\x82\x8b\0" /* offset 11147 */
+ "\xe5\x87\x9c\0" /* offset 11151 */
+ "\xe5\x87\x8c\0" /* offset 11155 */
+ "\xe7\xa8\x9c\0" /* offset 11159 */
+ "\xe7\xb6\xbe\0" /* offset 11163 */
+ "\xe8\x8f\xb1\0" /* offset 11167 */
+ "\xe9\x99\xb5\0" /* offset 11171 */
+ "\xe8\xae\x80\0" /* offset 11175 */
+ "\xe6\x8b\x8f\0" /* offset 11179 */
+ "\xe8\xab\xbe\0" /* offset 11183 */
+ "\xe4\xb8\xb9\0" /* offset 11187 */
+ "\xe5\xaf\xa7\0" /* offset 11191 */
+ "\xe6\x80\x92\0" /* offset 11195 */
+ "\xe7\x8e\x87\0" /* offset 11199 */
+ "\xe7\x95\xb0\0" /* offset 11203 */
+ "\xe5\x8c\x97\0" /* offset 11207 */
+ "\xe7\xa3\xbb\0" /* offset 11211 */
+ "\xe4\xbe\xbf\0" /* offset 11215 */
+ "\xe5\xbe\xa9\0" /* offset 11219 */
+ "\xe4\xb8\x8d\0" /* offset 11223 */
+ "\xe6\xb3\x8c\0" /* offset 11227 */
+ "\xe6\x95\xb8\0" /* offset 11231 */
+ "\xe7\xb4\xa2\0" /* offset 11235 */
+ "\xe5\x8f\x83\0" /* offset 11239 */
+ "\xe5\xa1\x9e\0" /* offset 11243 */
+ "\xe7\x9c\x81\0" /* offset 11247 */
+ "\xe8\x91\x89\0" /* offset 11251 */
+ "\xe8\xaa\xaa\0" /* offset 11255 */
+ "\xe6\xae\xba\0" /* offset 11259 */
+ "\xe6\xb2\x88\0" /* offset 11263 */
+ "\xe6\x8b\xbe\0" /* offset 11267 */
+ "\xe8\x8b\xa5\0" /* offset 11271 */
+ "\xe6\x8e\xa0\0" /* offset 11275 */
+ "\xe7\x95\xa5\0" /* offset 11279 */
+ "\xe4\xba\xae\0" /* offset 11283 */
+ "\xe5\x85\xa9\0" /* offset 11287 */
+ "\xe5\x87\x89\0" /* offset 11291 */
+ "\xe6\xa2\x81\0" /* offset 11295 */
+ "\xe7\xb3\xa7\0" /* offset 11299 */
+ "\xe8\x89\xaf\0" /* offset 11303 */
+ "\xe8\xab\x92\0" /* offset 11307 */
+ "\xe9\x87\x8f\0" /* offset 11311 */
+ "\xe5\x8b\xb5\0" /* offset 11315 */
+ "\xe5\x91\x82\0" /* offset 11319 */
+ "\xe5\xbb\xac\0" /* offset 11323 */
+ "\xe6\x97\x85\0" /* offset 11327 */
+ "\xe6\xbf\xbe\0" /* offset 11331 */
+ "\xe7\xa4\xaa\0" /* offset 11335 */
+ "\xe9\x96\xad\0" /* offset 11339 */
+ "\xe9\xa9\xaa\0" /* offset 11343 */
+ "\xe9\xba\x97\0" /* offset 11347 */
+ "\xe9\xbb\x8e\0" /* offset 11351 */
+ "\xe6\x9b\x86\0" /* offset 11355 */
+ "\xe6\xad\xb7\0" /* offset 11359 */
+ "\xe8\xbd\xa2\0" /* offset 11363 */
+ "\xe5\xb9\xb4\0" /* offset 11367 */
+ "\xe6\x86\x90\0" /* offset 11371 */
+ "\xe6\x88\x80\0" /* offset 11375 */
+ "\xe6\x92\x9a\0" /* offset 11379 */
+ "\xe6\xbc\xa3\0" /* offset 11383 */
+ "\xe7\x85\x89\0" /* offset 11387 */
+ "\xe7\x92\x89\0" /* offset 11391 */
+ "\xe7\xa7\x8a\0" /* offset 11395 */
+ "\xe7\xb7\xb4\0" /* offset 11399 */
+ "\xe8\x81\xaf\0" /* offset 11403 */
+ "\xe8\xbc\xa6\0" /* offset 11407 */
+ "\xe8\x93\xae\0" /* offset 11411 */
+ "\xe9\x80\xa3\0" /* offset 11415 */
+ "\xe9\x8d\x8a\0" /* offset 11419 */
+ "\xe5\x88\x97\0" /* offset 11423 */
+ "\xe5\x8a\xa3\0" /* offset 11427 */
+ "\xe5\x92\xbd\0" /* offset 11431 */
+ "\xe7\x83\x88\0" /* offset 11435 */
+ "\xe8\xa3\x82\0" /* offset 11439 */
+ "\xe5\xbb\x89\0" /* offset 11443 */
+ "\xe5\xbf\xb5\0" /* offset 11447 */
+ "\xe6\x8d\xbb\0" /* offset 11451 */
+ "\xe6\xae\xae\0" /* offset 11455 */
+ "\xe7\xb0\xbe\0" /* offset 11459 */
+ "\xe7\x8d\xb5\0" /* offset 11463 */
+ "\xe4\xbb\xa4\0" /* offset 11467 */
+ "\xe5\x9b\xb9\0" /* offset 11471 */
+ "\xe5\xb6\xba\0" /* offset 11475 */
+ "\xe6\x80\x9c\0" /* offset 11479 */
+ "\xe7\x8e\xb2\0" /* offset 11483 */
+ "\xe7\x91\xa9\0" /* offset 11487 */
+ "\xe7\xbe\x9a\0" /* offset 11491 */
+ "\xe8\x81\x86\0" /* offset 11495 */
+ "\xe9\x88\xb4\0" /* offset 11499 */
+ "\xe9\x9b\xb6\0" /* offset 11503 */
+ "\xe9\x9d\x88\0" /* offset 11507 */
+ "\xe9\xa0\x98\0" /* offset 11511 */
+ "\xe4\xbe\x8b\0" /* offset 11515 */
+ "\xe7\xa6\xae\0" /* offset 11519 */
+ "\xe9\x86\xb4\0" /* offset 11523 */
+ "\xe9\x9a\xb8\0" /* offset 11527 */
+ "\xe6\x83\xa1\0" /* offset 11531 */
+ "\xe4\xba\x86\0" /* offset 11535 */
+ "\xe5\x83\x9a\0" /* offset 11539 */
+ "\xe5\xaf\xae\0" /* offset 11543 */
+ "\xe5\xb0\xbf\0" /* offset 11547 */
+ "\xe6\x96\x99\0" /* offset 11551 */
+ "\xe7\x87\x8e\0" /* offset 11555 */
+ "\xe7\x99\x82\0" /* offset 11559 */
+ "\xe8\x93\xbc\0" /* offset 11563 */
+ "\xe9\x81\xbc\0" /* offset 11567 */
+ "\xe6\x9a\x88\0" /* offset 11571 */
+ "\xe9\x98\xae\0" /* offset 11575 */
+ "\xe5\x8a\x89\0" /* offset 11579 */
+ "\xe6\x9d\xbb\0" /* offset 11583 */
+ "\xe6\x9f\xb3\0" /* offset 11587 */
+ "\xe6\xb5\x81\0" /* offset 11591 */
+ "\xe6\xba\x9c\0" /* offset 11595 */
+ "\xe7\x90\x89\0" /* offset 11599 */
+ "\xe7\x95\x99\0" /* offset 11603 */
+ "\xe7\xa1\xab\0" /* offset 11607 */
+ "\xe7\xb4\x90\0" /* offset 11611 */
+ "\xe9\xa1\x9e\0" /* offset 11615 */
+ "\xe6\x88\xae\0" /* offset 11619 */
+ "\xe9\x99\xb8\0" /* offset 11623 */
+ "\xe5\x80\xab\0" /* offset 11627 */
+ "\xe5\xb4\x99\0" /* offset 11631 */
+ "\xe6\xb7\xaa\0" /* offset 11635 */
+ "\xe8\xbc\xaa\0" /* offset 11639 */
+ "\xe5\xbe\x8b\0" /* offset 11643 */
+ "\xe6\x85\x84\0" /* offset 11647 */
+ "\xe6\xa0\x97\0" /* offset 11651 */
+ "\xe9\x9a\x86\0" /* offset 11655 */
+ "\xe5\x88\xa9\0" /* offset 11659 */
+ "\xe5\x90\x8f\0" /* offset 11663 */
+ "\xe5\xb1\xa5\0" /* offset 11667 */
+ "\xe6\x98\x93\0" /* offset 11671 */
+ "\xe6\x9d\x8e\0" /* offset 11675 */
+ "\xe6\xa2\xa8\0" /* offset 11679 */
+ "\xe6\xb3\xa5\0" /* offset 11683 */
+ "\xe7\x90\x86\0" /* offset 11687 */
+ "\xe7\x97\xa2\0" /* offset 11691 */
+ "\xe7\xbd\xb9\0" /* offset 11695 */
+ "\xe8\xa3\x8f\0" /* offset 11699 */
+ "\xe8\xa3\xa1\0" /* offset 11703 */
+ "\xe9\x9b\xa2\0" /* offset 11707 */
+ "\xe5\x8c\xbf\0" /* offset 11711 */
+ "\xe6\xba\xba\0" /* offset 11715 */
+ "\xe5\x90\x9d\0" /* offset 11719 */
+ "\xe7\x87\x90\0" /* offset 11723 */
+ "\xe7\x92\x98\0" /* offset 11727 */
+ "\xe8\x97\xba\0" /* offset 11731 */
+ "\xe9\x9a\xa3\0" /* offset 11735 */
+ "\xe9\xb1\x97\0" /* offset 11739 */
+ "\xe9\xba\x9f\0" /* offset 11743 */
+ "\xe6\x9e\x97\0" /* offset 11747 */
+ "\xe6\xb7\x8b\0" /* offset 11751 */
+ "\xe8\x87\xa8\0" /* offset 11755 */
+ "\xe7\xac\xa0\0" /* offset 11759 */
+ "\xe7\xb2\x92\0" /* offset 11763 */
+ "\xe7\x8b\x80\0" /* offset 11767 */
+ "\xe7\x82\x99\0" /* offset 11771 */
+ "\xe8\xad\x98\0" /* offset 11775 */
+ "\xe4\xbb\x80\0" /* offset 11779 */
+ "\xe8\x8c\xb6\0" /* offset 11783 */
+ "\xe5\x88\xba\0" /* offset 11787 */
+ "\xe5\x88\x87\0" /* offset 11791 */
+ "\xe5\xba\xa6\0" /* offset 11795 */
+ "\xe6\x8b\x93\0" /* offset 11799 */
+ "\xe7\xb3\x96\0" /* offset 11803 */
+ "\xe5\xae\x85\0" /* offset 11807 */
+ "\xe6\xb4\x9e\0" /* offset 11811 */
+ "\xe6\x9a\xb4\0" /* offset 11815 */
+ "\xe8\xbc\xbb\0" /* offset 11819 */
+ "\xe9\x99\x8d\0" /* offset 11823 */
+ "\xe5\xbb\x93\0" /* offset 11827 */
+ "\xe5\x85\x80\0" /* offset 11831 */
+ "\xe5\x97\x80\0" /* offset 11835 */
+ "\xe5\xa1\x9a\0" /* offset 11839 */
+ "\xe6\x99\xb4\0" /* offset 11843 */
+ "\xe5\x87\x9e\0" /* offset 11847 */
+ "\xe7\x8c\xaa\0" /* offset 11851 */
+ "\xe7\x9b\x8a\0" /* offset 11855 */
+ "\xe7\xa4\xbc\0" /* offset 11859 */
+ "\xe7\xa5\x9e\0" /* offset 11863 */
+ "\xe7\xa5\xa5\0" /* offset 11867 */
+ "\xe7\xa6\x8f\0" /* offset 11871 */
+ "\xe9\x9d\x96\0" /* offset 11875 */
+ "\xe7\xb2\xbe\0" /* offset 11879 */
+ "\xe8\x98\x92\0" /* offset 11883 */
+ "\xe8\xab\xb8\0" /* offset 11887 */
+ "\xe9\x80\xb8\0" /* offset 11891 */
+ "\xe9\x83\xbd\0" /* offset 11895 */
+ "\xe9\xa3\xaf\0" /* offset 11899 */
+ "\xe9\xa3\xbc\0" /* offset 11903 */
+ "\xe9\xa4\xa8\0" /* offset 11907 */
+ "\xe9\xb6\xb4\0" /* offset 11911 */
+ "\xe4\xbe\xae\0" /* offset 11915 */
+ "\xe5\x83\xa7\0" /* offset 11919 */
+ "\xe5\x85\x8d\0" /* offset 11923 */
+ "\xe5\x8b\x89\0" /* offset 11927 */
+ "\xe5\x8b\xa4\0" /* offset 11931 */
+ "\xe5\x8d\x91\0" /* offset 11935 */
+ "\xe5\x96\x9d\0" /* offset 11939 */
+ "\xe5\x98\x86\0" /* offset 11943 */
+ "\xe5\x99\xa8\0" /* offset 11947 */
+ "\xe5\xa1\x80\0" /* offset 11951 */
+ "\xe5\xa2\xa8\0" /* offset 11955 */
+ "\xe5\xb1\xa4\0" /* offset 11959 */
+ "\xe6\x82\x94\0" /* offset 11963 */
+ "\xe6\x85\xa8\0" /* offset 11967 */
+ "\xe6\x86\x8e\0" /* offset 11971 */
+ "\xe6\x87\xb2\0" /* offset 11975 */
+ "\xe6\x95\x8f\0" /* offset 11979 */
+ "\xe6\x97\xa2\0" /* offset 11983 */
+ "\xe6\x9a\x91\0" /* offset 11987 */
+ "\xe6\xa2\x85\0" /* offset 11991 */
+ "\xe6\xb5\xb7\0" /* offset 11995 */
+ "\xe6\xb8\x9a\0" /* offset 11999 */
+ "\xe6\xbc\xa2\0" /* offset 12003 */
+ "\xe7\x85\xae\0" /* offset 12007 */
+ "\xe7\x88\xab\0" /* offset 12011 */
+ "\xe7\x90\xa2\0" /* offset 12015 */
+ "\xe7\xa2\x91\0" /* offset 12019 */
+ "\xe7\xa5\x89\0" /* offset 12023 */
+ "\xe7\xa5\x88\0" /* offset 12027 */
+ "\xe7\xa5\x90\0" /* offset 12031 */
+ "\xe7\xa5\x96\0" /* offset 12035 */
+ "\xe7\xa6\x8d\0" /* offset 12039 */
+ "\xe7\xa6\x8e\0" /* offset 12043 */
+ "\xe7\xa9\x80\0" /* offset 12047 */
+ "\xe7\xaa\x81\0" /* offset 12051 */
+ "\xe7\xaf\x80\0" /* offset 12055 */
+ "\xe7\xb8\x89\0" /* offset 12059 */
+ "\xe7\xb9\x81\0" /* offset 12063 */
+ "\xe7\xbd\xb2\0" /* offset 12067 */
+ "\xe8\x80\x85\0" /* offset 12071 */
+ "\xe8\x87\xad\0" /* offset 12075 */
+ "\xe8\x89\xb9\0" /* offset 12079 */
+ "\xe8\x91\x97\0" /* offset 12083 */
+ "\xe8\xa4\x90\0" /* offset 12087 */
+ "\xe8\xa6\x96\0" /* offset 12091 */
+ "\xe8\xac\x81\0" /* offset 12095 */
+ "\xe8\xac\xb9\0" /* offset 12099 */
+ "\xe8\xb3\x93\0" /* offset 12103 */
+ "\xe8\xb4\x88\0" /* offset 12107 */
+ "\xe8\xbe\xb6\0" /* offset 12111 */
+ "\xe9\x9b\xa3\0" /* offset 12115 */
+ "\xe9\x9f\xbf\0" /* offset 12119 */
+ "\xe9\xa0\xbb\0" /* offset 12123 */
+ "\xe4\xb8\xa6\0" /* offset 12127 */
+ "\xe5\x86\xb5\0" /* offset 12131 */
+ "\xe5\x85\xa8\0" /* offset 12135 */
+ "\xe4\xbe\x80\0" /* offset 12139 */
+ "\xe5\x85\x85\0" /* offset 12143 */
+ "\xe5\x86\x80\0" /* offset 12147 */
+ "\xe5\x8b\x87\0" /* offset 12151 */
+ "\xe5\x8b\xba\0" /* offset 12155 */
+ "\xe5\x95\x95\0" /* offset 12159 */
+ "\xe5\x96\x99\0" /* offset 12163 */
+ "\xe5\x97\xa2\0" /* offset 12167 */
+ "\xe5\xa2\xb3\0" /* offset 12171 */
+ "\xe5\xa5\x84\0" /* offset 12175 */
+ "\xe5\xa5\x94\0" /* offset 12179 */
+ "\xe5\xa9\xa2\0" /* offset 12183 */
+ "\xe5\xac\xa8\0" /* offset 12187 */
+ "\xe5\xbb\x92\0" /* offset 12191 */
+ "\xe5\xbb\x99\0" /* offset 12195 */
+ "\xe5\xbd\xa9\0" /* offset 12199 */
+ "\xe5\xbe\xad\0" /* offset 12203 */
+ "\xe6\x83\x98\0" /* offset 12207 */
+ "\xe6\x85\x8e\0" /* offset 12211 */
+ "\xe6\x84\x88\0" /* offset 12215 */
+ "\xe6\x85\xa0\0" /* offset 12219 */
+ "\xe6\x88\xb4\0" /* offset 12223 */
+ "\xe6\x8f\x84\0" /* offset 12227 */
+ "\xe6\x90\x9c\0" /* offset 12231 */
+ "\xe6\x91\x92\0" /* offset 12235 */
+ "\xe6\x95\x96\0" /* offset 12239 */
+ "\xe6\x9c\x9b\0" /* offset 12243 */
+ "\xe6\x9d\x96\0" /* offset 12247 */
+ "\xe6\xbb\x9b\0" /* offset 12251 */
+ "\xe6\xbb\x8b\0" /* offset 12255 */
+ "\xe7\x80\x9e\0" /* offset 12259 */
+ "\xe7\x9e\xa7\0" /* offset 12263 */
+ "\xe7\x88\xb5\0" /* offset 12267 */
+ "\xe7\x8a\xaf\0" /* offset 12271 */
+ "\xe7\x91\xb1\0" /* offset 12275 */
+ "\xe7\x94\x86\0" /* offset 12279 */
+ "\xe7\x94\xbb\0" /* offset 12283 */
+ "\xe7\x98\x9d\0" /* offset 12287 */
+ "\xe7\x98\x9f\0" /* offset 12291 */
+ "\xe7\x9b\x9b\0" /* offset 12295 */
+ "\xe7\x9b\xb4\0" /* offset 12299 */
+ "\xe7\x9d\x8a\0" /* offset 12303 */
+ "\xe7\x9d\x80\0" /* offset 12307 */
+ "\xe7\xa3\x8c\0" /* offset 12311 */
+ "\xe7\xaa\xb1\0" /* offset 12315 */
+ "\xe7\xb1\xbb\0" /* offset 12319 */
+ "\xe7\xb5\x9b\0" /* offset 12323 */
+ "\xe7\xbc\xbe\0" /* offset 12327 */
+ "\xe8\x8d\x92\0" /* offset 12331 */
+ "\xe8\x8f\xaf\0" /* offset 12335 */
+ "\xe8\x9d\xb9\0" /* offset 12339 */
+ "\xe8\xa5\x81\0" /* offset 12343 */
+ "\xe8\xa6\x86\0" /* offset 12347 */
+ "\xe8\xaa\xbf\0" /* offset 12351 */
+ "\xe8\xab\x8b\0" /* offset 12355 */
+ "\xe8\xab\xad\0" /* offset 12359 */
+ "\xe8\xae\x8a\0" /* offset 12363 */
+ "\xe8\xbc\xb8\0" /* offset 12367 */
+ "\xe9\x81\xb2\0" /* offset 12371 */
+ "\xe9\x86\x99\0" /* offset 12375 */
+ "\xe9\x89\xb6\0" /* offset 12379 */
+ "\xe9\x99\xbc\0" /* offset 12383 */
+ "\xe9\x9f\x9b\0" /* offset 12387 */
+ "\xe9\xa0\x8b\0" /* offset 12391 */
+ "\xe9\xac\x92\0" /* offset 12395 */
+ "\xf0\xa2\xa1\x8a\0" /* offset 12399 */
+ "\xf0\xa2\xa1\x84\0" /* offset 12404 */
+ "\xf0\xa3\x8f\x95\0" /* offset 12409 */
+ "\xe3\xae\x9d\0" /* offset 12414 */
+ "\xe4\x80\x98\0" /* offset 12418 */
+ "\xe4\x80\xb9\0" /* offset 12422 */
+ "\xf0\xa5\x89\x89\0" /* offset 12426 */
+ "\xf0\xa5\xb3\x90\0" /* offset 12431 */
+ "\xf0\xa7\xbb\x93\0" /* offset 12436 */
+ "\xe9\xbd\x83\0" /* offset 12441 */
+ "\xe9\xbe\x8e\0" /* offset 12445 */
+ "\x66\x66\0" /* offset 12449 */
+ "\x66\x69\0" /* offset 12452 */
+ "\x66\x6c\0" /* offset 12455 */
+ "\x66\x66\x69\0" /* offset 12458 */
+ "\x66\x66\x6c\0" /* offset 12462 */
+ "\x73\x74\0" /* offset 12466 */
+ "\xd5\xb4\xd5\xb6\0" /* offset 12469 */
+ "\xd5\xb4\xd5\xa5\0" /* offset 12474 */
+ "\xd5\xb4\xd5\xab\0" /* offset 12479 */
+ "\xd5\xbe\xd5\xb6\0" /* offset 12484 */
+ "\xd5\xb4\xd5\xad\0" /* offset 12489 */
+ "\xd7\x99\xd6\xb4\0" /* offset 12494 */
+ "\xd7\xb2\xd6\xb7\0" /* offset 12499 */
+ "\xd7\xa2\0" /* offset 12504 */
+ "\xd7\x94\0" /* offset 12507 */
+ "\xd7\x9b\0" /* offset 12510 */
+ "\xd7\x9c\0" /* offset 12513 */
+ "\xd7\x9d\0" /* offset 12516 */
+ "\xd7\xa8\0" /* offset 12519 */
+ "\xd7\xaa\0" /* offset 12522 */
+ "\xd7\xa9\xd7\x81\0" /* offset 12525 */
+ "\xd7\xa9\xd7\x82\0" /* offset 12530 */
+ "\xd7\xa9\xd6\xbc\xd7\x81\0" /* offset 12535 */
+ "\xd7\xa9\xd6\xbc\xd7\x82\0" /* offset 12542 */
+ "\xd7\x90\xd6\xb7\0" /* offset 12549 */
+ "\xd7\x90\xd6\xb8\0" /* offset 12554 */
+ "\xd7\x90\xd6\xbc\0" /* offset 12559 */
+ "\xd7\x91\xd6\xbc\0" /* offset 12564 */
+ "\xd7\x92\xd6\xbc\0" /* offset 12569 */
+ "\xd7\x93\xd6\xbc\0" /* offset 12574 */
+ "\xd7\x94\xd6\xbc\0" /* offset 12579 */
+ "\xd7\x95\xd6\xbc\0" /* offset 12584 */
+ "\xd7\x96\xd6\xbc\0" /* offset 12589 */
+ "\xd7\x98\xd6\xbc\0" /* offset 12594 */
+ "\xd7\x99\xd6\xbc\0" /* offset 12599 */
+ "\xd7\x9a\xd6\xbc\0" /* offset 12604 */
+ "\xd7\x9b\xd6\xbc\0" /* offset 12609 */
+ "\xd7\x9c\xd6\xbc\0" /* offset 12614 */
+ "\xd7\x9e\xd6\xbc\0" /* offset 12619 */
+ "\xd7\xa0\xd6\xbc\0" /* offset 12624 */
+ "\xd7\xa1\xd6\xbc\0" /* offset 12629 */
+ "\xd7\xa3\xd6\xbc\0" /* offset 12634 */
+ "\xd7\xa4\xd6\xbc\0" /* offset 12639 */
+ "\xd7\xa6\xd6\xbc\0" /* offset 12644 */
+ "\xd7\xa7\xd6\xbc\0" /* offset 12649 */
+ "\xd7\xa8\xd6\xbc\0" /* offset 12654 */
+ "\xd7\xa9\xd6\xbc\0" /* offset 12659 */
+ "\xd7\xaa\xd6\xbc\0" /* offset 12664 */
+ "\xd7\x95\xd6\xb9\0" /* offset 12669 */
+ "\xd7\x91\xd6\xbf\0" /* offset 12674 */
+ "\xd7\x9b\xd6\xbf\0" /* offset 12679 */
+ "\xd7\xa4\xd6\xbf\0" /* offset 12684 */
+ "\xd7\x90\xd7\x9c\0" /* offset 12689 */
+ "\xd9\xb1\0" /* offset 12694 */
+ "\xd9\xbb\0" /* offset 12697 */
+ "\xd9\xbe\0" /* offset 12700 */
+ "\xda\x80\0" /* offset 12703 */
+ "\xd9\xba\0" /* offset 12706 */
+ "\xd9\xbf\0" /* offset 12709 */
+ "\xd9\xb9\0" /* offset 12712 */
+ "\xda\xa4\0" /* offset 12715 */
+ "\xda\xa6\0" /* offset 12718 */
+ "\xda\x84\0" /* offset 12721 */
+ "\xda\x83\0" /* offset 12724 */
+ "\xda\x86\0" /* offset 12727 */
+ "\xda\x87\0" /* offset 12730 */
+ "\xda\x8d\0" /* offset 12733 */
+ "\xda\x8c\0" /* offset 12736 */
+ "\xda\x8e\0" /* offset 12739 */
+ "\xda\x88\0" /* offset 12742 */
+ "\xda\x98\0" /* offset 12745 */
+ "\xda\x91\0" /* offset 12748 */
+ "\xda\xa9\0" /* offset 12751 */
+ "\xda\xaf\0" /* offset 12754 */
+ "\xda\xb3\0" /* offset 12757 */
+ "\xda\xb1\0" /* offset 12760 */
+ "\xda\xba\0" /* offset 12763 */
+ "\xda\xbb\0" /* offset 12766 */
+ "\xdb\x81\0" /* offset 12769 */
+ "\xda\xbe\0" /* offset 12772 */
+ "\xdb\x92\0" /* offset 12775 */
+ "\xda\xad\0" /* offset 12778 */
+ "\xdb\x87\0" /* offset 12781 */
+ "\xdb\x86\0" /* offset 12784 */
+ "\xdb\x88\0" /* offset 12787 */
+ "\xdb\x8b\0" /* offset 12790 */
+ "\xdb\x85\0" /* offset 12793 */
+ "\xdb\x89\0" /* offset 12796 */
+ "\xdb\x90\0" /* offset 12799 */
+ "\xd9\x89\0" /* offset 12802 */
+ "\xd9\x8a\xd9\x94\xd8\xa7\0" /* offset 12805 */
+ "\xd9\x8a\xd9\x94\xdb\x95\0" /* offset 12812 */
+ "\xd9\x8a\xd9\x94\xd9\x88\0" /* offset 12819 */
+ "\xd9\x8a\xd9\x94\xdb\x87\0" /* offset 12826 */
+ "\xd9\x8a\xd9\x94\xdb\x86\0" /* offset 12833 */
+ "\xd9\x8a\xd9\x94\xdb\x88\0" /* offset 12840 */
+ "\xd9\x8a\xd9\x94\xdb\x90\0" /* offset 12847 */
+ "\xd9\x8a\xd9\x94\xd9\x89\0" /* offset 12854 */
+ "\xdb\x8c\0" /* offset 12861 */
+ "\xd9\x8a\xd9\x94\xd8\xac\0" /* offset 12864 */
+ "\xd9\x8a\xd9\x94\xd8\xad\0" /* offset 12871 */
+ "\xd9\x8a\xd9\x94\xd9\x85\0" /* offset 12878 */
+ "\xd9\x8a\xd9\x94\xd9\x8a\0" /* offset 12885 */
+ "\xd8\xa8\xd8\xac\0" /* offset 12892 */
+ "\xd8\xa8\xd8\xad\0" /* offset 12897 */
+ "\xd8\xa8\xd8\xae\0" /* offset 12902 */
+ "\xd8\xa8\xd9\x85\0" /* offset 12907 */
+ "\xd8\xa8\xd9\x89\0" /* offset 12912 */
+ "\xd8\xa8\xd9\x8a\0" /* offset 12917 */
+ "\xd8\xaa\xd8\xac\0" /* offset 12922 */
+ "\xd8\xaa\xd8\xad\0" /* offset 12927 */
+ "\xd8\xaa\xd8\xae\0" /* offset 12932 */
+ "\xd8\xaa\xd9\x85\0" /* offset 12937 */
+ "\xd8\xaa\xd9\x89\0" /* offset 12942 */
+ "\xd8\xaa\xd9\x8a\0" /* offset 12947 */
+ "\xd8\xab\xd8\xac\0" /* offset 12952 */
+ "\xd8\xab\xd9\x85\0" /* offset 12957 */
+ "\xd8\xab\xd9\x89\0" /* offset 12962 */
+ "\xd8\xab\xd9\x8a\0" /* offset 12967 */
+ "\xd8\xac\xd8\xad\0" /* offset 12972 */
+ "\xd8\xac\xd9\x85\0" /* offset 12977 */
+ "\xd8\xad\xd8\xac\0" /* offset 12982 */
+ "\xd8\xad\xd9\x85\0" /* offset 12987 */
+ "\xd8\xae\xd8\xac\0" /* offset 12992 */
+ "\xd8\xae\xd8\xad\0" /* offset 12997 */
+ "\xd8\xae\xd9\x85\0" /* offset 13002 */
+ "\xd8\xb3\xd8\xac\0" /* offset 13007 */
+ "\xd8\xb3\xd8\xad\0" /* offset 13012 */
+ "\xd8\xb3\xd8\xae\0" /* offset 13017 */
+ "\xd8\xb3\xd9\x85\0" /* offset 13022 */
+ "\xd8\xb5\xd8\xad\0" /* offset 13027 */
+ "\xd8\xb5\xd9\x85\0" /* offset 13032 */
+ "\xd8\xb6\xd8\xac\0" /* offset 13037 */
+ "\xd8\xb6\xd8\xad\0" /* offset 13042 */
+ "\xd8\xb6\xd8\xae\0" /* offset 13047 */
+ "\xd8\xb6\xd9\x85\0" /* offset 13052 */
+ "\xd8\xb7\xd8\xad\0" /* offset 13057 */
+ "\xd8\xb7\xd9\x85\0" /* offset 13062 */
+ "\xd8\xb8\xd9\x85\0" /* offset 13067 */
+ "\xd8\xb9\xd8\xac\0" /* offset 13072 */
+ "\xd8\xb9\xd9\x85\0" /* offset 13077 */
+ "\xd8\xba\xd8\xac\0" /* offset 13082 */
+ "\xd8\xba\xd9\x85\0" /* offset 13087 */
+ "\xd9\x81\xd8\xac\0" /* offset 13092 */
+ "\xd9\x81\xd8\xad\0" /* offset 13097 */
+ "\xd9\x81\xd8\xae\0" /* offset 13102 */
+ "\xd9\x81\xd9\x85\0" /* offset 13107 */
+ "\xd9\x81\xd9\x89\0" /* offset 13112 */
+ "\xd9\x81\xd9\x8a\0" /* offset 13117 */
+ "\xd9\x82\xd8\xad\0" /* offset 13122 */
+ "\xd9\x82\xd9\x85\0" /* offset 13127 */
+ "\xd9\x82\xd9\x89\0" /* offset 13132 */
+ "\xd9\x82\xd9\x8a\0" /* offset 13137 */
+ "\xd9\x83\xd8\xa7\0" /* offset 13142 */
+ "\xd9\x83\xd8\xac\0" /* offset 13147 */
+ "\xd9\x83\xd8\xad\0" /* offset 13152 */
+ "\xd9\x83\xd8\xae\0" /* offset 13157 */
+ "\xd9\x83\xd9\x84\0" /* offset 13162 */
+ "\xd9\x83\xd9\x85\0" /* offset 13167 */
+ "\xd9\x83\xd9\x89\0" /* offset 13172 */
+ "\xd9\x83\xd9\x8a\0" /* offset 13177 */
+ "\xd9\x84\xd8\xac\0" /* offset 13182 */
+ "\xd9\x84\xd8\xad\0" /* offset 13187 */
+ "\xd9\x84\xd8\xae\0" /* offset 13192 */
+ "\xd9\x84\xd9\x85\0" /* offset 13197 */
+ "\xd9\x84\xd9\x89\0" /* offset 13202 */
+ "\xd9\x84\xd9\x8a\0" /* offset 13207 */
+ "\xd9\x85\xd8\xac\0" /* offset 13212 */
+ "\xd9\x85\xd8\xad\0" /* offset 13217 */
+ "\xd9\x85\xd8\xae\0" /* offset 13222 */
+ "\xd9\x85\xd9\x85\0" /* offset 13227 */
+ "\xd9\x85\xd9\x89\0" /* offset 13232 */
+ "\xd9\x85\xd9\x8a\0" /* offset 13237 */
+ "\xd9\x86\xd8\xac\0" /* offset 13242 */
+ "\xd9\x86\xd8\xad\0" /* offset 13247 */
+ "\xd9\x86\xd8\xae\0" /* offset 13252 */
+ "\xd9\x86\xd9\x85\0" /* offset 13257 */
+ "\xd9\x86\xd9\x89\0" /* offset 13262 */
+ "\xd9\x86\xd9\x8a\0" /* offset 13267 */
+ "\xd9\x87\xd8\xac\0" /* offset 13272 */
+ "\xd9\x87\xd9\x85\0" /* offset 13277 */
+ "\xd9\x87\xd9\x89\0" /* offset 13282 */
+ "\xd9\x87\xd9\x8a\0" /* offset 13287 */
+ "\xd9\x8a\xd8\xac\0" /* offset 13292 */
+ "\xd9\x8a\xd8\xad\0" /* offset 13297 */
+ "\xd9\x8a\xd8\xae\0" /* offset 13302 */
+ "\xd9\x8a\xd9\x85\0" /* offset 13307 */
+ "\xd9\x8a\xd9\x89\0" /* offset 13312 */
+ "\xd9\x8a\xd9\x8a\0" /* offset 13317 */
+ "\xd8\xb0\xd9\xb0\0" /* offset 13322 */
+ "\xd8\xb1\xd9\xb0\0" /* offset 13327 */
+ "\xd9\x89\xd9\xb0\0" /* offset 13332 */
+ "\x20\xd9\x8c\xd9\x91\0" /* offset 13337 */
+ "\x20\xd9\x8d\xd9\x91\0" /* offset 13343 */
+ "\x20\xd9\x8e\xd9\x91\0" /* offset 13349 */
+ "\x20\xd9\x8f\xd9\x91\0" /* offset 13355 */
+ "\x20\xd9\x90\xd9\x91\0" /* offset 13361 */
+ "\x20\xd9\x91\xd9\xb0\0" /* offset 13367 */
+ "\xd9\x8a\xd9\x94\xd8\xb1\0" /* offset 13373 */
+ "\xd9\x8a\xd9\x94\xd8\xb2\0" /* offset 13380 */
+ "\xd9\x8a\xd9\x94\xd9\x86\0" /* offset 13387 */
+ "\xd8\xa8\xd8\xb1\0" /* offset 13394 */
+ "\xd8\xa8\xd8\xb2\0" /* offset 13399 */
+ "\xd8\xa8\xd9\x86\0" /* offset 13404 */
+ "\xd8\xaa\xd8\xb1\0" /* offset 13409 */
+ "\xd8\xaa\xd8\xb2\0" /* offset 13414 */
+ "\xd8\xaa\xd9\x86\0" /* offset 13419 */
+ "\xd8\xab\xd8\xb1\0" /* offset 13424 */
+ "\xd8\xab\xd8\xb2\0" /* offset 13429 */
+ "\xd8\xab\xd9\x86\0" /* offset 13434 */
+ "\xd9\x85\xd8\xa7\0" /* offset 13439 */
+ "\xd9\x86\xd8\xb1\0" /* offset 13444 */
+ "\xd9\x86\xd8\xb2\0" /* offset 13449 */
+ "\xd9\x86\xd9\x86\0" /* offset 13454 */
+ "\xd9\x8a\xd8\xb1\0" /* offset 13459 */
+ "\xd9\x8a\xd8\xb2\0" /* offset 13464 */
+ "\xd9\x8a\xd9\x86\0" /* offset 13469 */
+ "\xd9\x8a\xd9\x94\xd8\xae\0" /* offset 13474 */
+ "\xd9\x8a\xd9\x94\xd9\x87\0" /* offset 13481 */
+ "\xd8\xa8\xd9\x87\0" /* offset 13488 */
+ "\xd8\xaa\xd9\x87\0" /* offset 13493 */
+ "\xd8\xb5\xd8\xae\0" /* offset 13498 */
+ "\xd9\x84\xd9\x87\0" /* offset 13503 */
+ "\xd9\x86\xd9\x87\0" /* offset 13508 */
+ "\xd9\x87\xd9\xb0\0" /* offset 13513 */
+ "\xd9\x8a\xd9\x87\0" /* offset 13518 */
+ "\xd8\xab\xd9\x87\0" /* offset 13523 */
+ "\xd8\xb3\xd9\x87\0" /* offset 13528 */
+ "\xd8\xb4\xd9\x85\0" /* offset 13533 */
+ "\xd8\xb4\xd9\x87\0" /* offset 13538 */
+ "\xd9\x80\xd9\x8e\xd9\x91\0" /* offset 13543 */
+ "\xd9\x80\xd9\x8f\xd9\x91\0" /* offset 13550 */
+ "\xd9\x80\xd9\x90\xd9\x91\0" /* offset 13557 */
+ "\xd8\xb7\xd9\x89\0" /* offset 13564 */
+ "\xd8\xb7\xd9\x8a\0" /* offset 13569 */
+ "\xd8\xb9\xd9\x89\0" /* offset 13574 */
+ "\xd8\xb9\xd9\x8a\0" /* offset 13579 */
+ "\xd8\xba\xd9\x89\0" /* offset 13584 */
+ "\xd8\xba\xd9\x8a\0" /* offset 13589 */
+ "\xd8\xb3\xd9\x89\0" /* offset 13594 */
+ "\xd8\xb3\xd9\x8a\0" /* offset 13599 */
+ "\xd8\xb4\xd9\x89\0" /* offset 13604 */
+ "\xd8\xb4\xd9\x8a\0" /* offset 13609 */
+ "\xd8\xad\xd9\x89\0" /* offset 13614 */
+ "\xd8\xad\xd9\x8a\0" /* offset 13619 */
+ "\xd8\xac\xd9\x89\0" /* offset 13624 */
+ "\xd8\xac\xd9\x8a\0" /* offset 13629 */
+ "\xd8\xae\xd9\x89\0" /* offset 13634 */
+ "\xd8\xae\xd9\x8a\0" /* offset 13639 */
+ "\xd8\xb5\xd9\x89\0" /* offset 13644 */
+ "\xd8\xb5\xd9\x8a\0" /* offset 13649 */
+ "\xd8\xb6\xd9\x89\0" /* offset 13654 */
+ "\xd8\xb6\xd9\x8a\0" /* offset 13659 */
+ "\xd8\xb4\xd8\xac\0" /* offset 13664 */
+ "\xd8\xb4\xd8\xad\0" /* offset 13669 */
+ "\xd8\xb4\xd8\xae\0" /* offset 13674 */
+ "\xd8\xb4\xd8\xb1\0" /* offset 13679 */
+ "\xd8\xb3\xd8\xb1\0" /* offset 13684 */
+ "\xd8\xb5\xd8\xb1\0" /* offset 13689 */
+ "\xd8\xb6\xd8\xb1\0" /* offset 13694 */
+ "\xd8\xa7\xd9\x8b\0" /* offset 13699 */
+ "\xd8\xaa\xd8\xac\xd9\x85\0" /* offset 13704 */
+ "\xd8\xaa\xd8\xad\xd8\xac\0" /* offset 13711 */
+ "\xd8\xaa\xd8\xad\xd9\x85\0" /* offset 13718 */
+ "\xd8\xaa\xd8\xae\xd9\x85\0" /* offset 13725 */
+ "\xd8\xaa\xd9\x85\xd8\xac\0" /* offset 13732 */
+ "\xd8\xaa\xd9\x85\xd8\xad\0" /* offset 13739 */
+ "\xd8\xaa\xd9\x85\xd8\xae\0" /* offset 13746 */
+ "\xd8\xac\xd9\x85\xd8\xad\0" /* offset 13753 */
+ "\xd8\xad\xd9\x85\xd9\x8a\0" /* offset 13760 */
+ "\xd8\xad\xd9\x85\xd9\x89\0" /* offset 13767 */
+ "\xd8\xb3\xd8\xad\xd8\xac\0" /* offset 13774 */
+ "\xd8\xb3\xd8\xac\xd8\xad\0" /* offset 13781 */
+ "\xd8\xb3\xd8\xac\xd9\x89\0" /* offset 13788 */
+ "\xd8\xb3\xd9\x85\xd8\xad\0" /* offset 13795 */
+ "\xd8\xb3\xd9\x85\xd8\xac\0" /* offset 13802 */
+ "\xd8\xb3\xd9\x85\xd9\x85\0" /* offset 13809 */
+ "\xd8\xb5\xd8\xad\xd8\xad\0" /* offset 13816 */
+ "\xd8\xb5\xd9\x85\xd9\x85\0" /* offset 13823 */
+ "\xd8\xb4\xd8\xad\xd9\x85\0" /* offset 13830 */
+ "\xd8\xb4\xd8\xac\xd9\x8a\0" /* offset 13837 */
+ "\xd8\xb4\xd9\x85\xd8\xae\0" /* offset 13844 */
+ "\xd8\xb4\xd9\x85\xd9\x85\0" /* offset 13851 */
+ "\xd8\xb6\xd8\xad\xd9\x89\0" /* offset 13858 */
+ "\xd8\xb6\xd8\xae\xd9\x85\0" /* offset 13865 */
+ "\xd8\xb7\xd9\x85\xd8\xad\0" /* offset 13872 */
+ "\xd8\xb7\xd9\x85\xd9\x85\0" /* offset 13879 */
+ "\xd8\xb7\xd9\x85\xd9\x8a\0" /* offset 13886 */
+ "\xd8\xb9\xd8\xac\xd9\x85\0" /* offset 13893 */
+ "\xd8\xb9\xd9\x85\xd9\x85\0" /* offset 13900 */
+ "\xd8\xb9\xd9\x85\xd9\x89\0" /* offset 13907 */
+ "\xd8\xba\xd9\x85\xd9\x85\0" /* offset 13914 */
+ "\xd8\xba\xd9\x85\xd9\x8a\0" /* offset 13921 */
+ "\xd8\xba\xd9\x85\xd9\x89\0" /* offset 13928 */
+ "\xd9\x81\xd8\xae\xd9\x85\0" /* offset 13935 */
+ "\xd9\x82\xd9\x85\xd8\xad\0" /* offset 13942 */
+ "\xd9\x82\xd9\x85\xd9\x85\0" /* offset 13949 */
+ "\xd9\x84\xd8\xad\xd9\x85\0" /* offset 13956 */
+ "\xd9\x84\xd8\xad\xd9\x8a\0" /* offset 13963 */
+ "\xd9\x84\xd8\xad\xd9\x89\0" /* offset 13970 */
+ "\xd9\x84\xd8\xac\xd8\xac\0" /* offset 13977 */
+ "\xd9\x84\xd8\xae\xd9\x85\0" /* offset 13984 */
+ "\xd9\x84\xd9\x85\xd8\xad\0" /* offset 13991 */
+ "\xd9\x85\xd8\xad\xd8\xac\0" /* offset 13998 */
+ "\xd9\x85\xd8\xad\xd9\x85\0" /* offset 14005 */
+ "\xd9\x85\xd8\xad\xd9\x8a\0" /* offset 14012 */
+ "\xd9\x85\xd8\xac\xd8\xad\0" /* offset 14019 */
+ "\xd9\x85\xd8\xac\xd9\x85\0" /* offset 14026 */
+ "\xd9\x85\xd8\xae\xd8\xac\0" /* offset 14033 */
+ "\xd9\x85\xd8\xae\xd9\x85\0" /* offset 14040 */
+ "\xd9\x85\xd8\xac\xd8\xae\0" /* offset 14047 */
+ "\xd9\x87\xd9\x85\xd8\xac\0" /* offset 14054 */
+ "\xd9\x87\xd9\x85\xd9\x85\0" /* offset 14061 */
+ "\xd9\x86\xd8\xad\xd9\x85\0" /* offset 14068 */
+ "\xd9\x86\xd8\xad\xd9\x89\0" /* offset 14075 */
+ "\xd9\x86\xd8\xac\xd9\x85\0" /* offset 14082 */
+ "\xd9\x86\xd8\xac\xd9\x89\0" /* offset 14089 */
+ "\xd9\x86\xd9\x85\xd9\x8a\0" /* offset 14096 */
+ "\xd9\x86\xd9\x85\xd9\x89\0" /* offset 14103 */
+ "\xd9\x8a\xd9\x85\xd9\x85\0" /* offset 14110 */
+ "\xd8\xa8\xd8\xae\xd9\x8a\0" /* offset 14117 */
+ "\xd8\xaa\xd8\xac\xd9\x8a\0" /* offset 14124 */
+ "\xd8\xaa\xd8\xac\xd9\x89\0" /* offset 14131 */
+ "\xd8\xaa\xd8\xae\xd9\x8a\0" /* offset 14138 */
+ "\xd8\xaa\xd8\xae\xd9\x89\0" /* offset 14145 */
+ "\xd8\xaa\xd9\x85\xd9\x8a\0" /* offset 14152 */
+ "\xd8\xaa\xd9\x85\xd9\x89\0" /* offset 14159 */
+ "\xd8\xac\xd9\x85\xd9\x8a\0" /* offset 14166 */
+ "\xd8\xac\xd8\xad\xd9\x89\0" /* offset 14173 */
+ "\xd8\xac\xd9\x85\xd9\x89\0" /* offset 14180 */
+ "\xd8\xb3\xd8\xae\xd9\x89\0" /* offset 14187 */
+ "\xd8\xb5\xd8\xad\xd9\x8a\0" /* offset 14194 */
+ "\xd8\xb4\xd8\xad\xd9\x8a\0" /* offset 14201 */
+ "\xd8\xb6\xd8\xad\xd9\x8a\0" /* offset 14208 */
+ "\xd9\x84\xd8\xac\xd9\x8a\0" /* offset 14215 */
+ "\xd9\x84\xd9\x85\xd9\x8a\0" /* offset 14222 */
+ "\xd9\x8a\xd8\xad\xd9\x8a\0" /* offset 14229 */
+ "\xd9\x8a\xd8\xac\xd9\x8a\0" /* offset 14236 */
+ "\xd9\x8a\xd9\x85\xd9\x8a\0" /* offset 14243 */
+ "\xd9\x85\xd9\x85\xd9\x8a\0" /* offset 14250 */
+ "\xd9\x82\xd9\x85\xd9\x8a\0" /* offset 14257 */
+ "\xd9\x86\xd8\xad\xd9\x8a\0" /* offset 14264 */
+ "\xd8\xb9\xd9\x85\xd9\x8a\0" /* offset 14271 */
+ "\xd9\x83\xd9\x85\xd9\x8a\0" /* offset 14278 */
+ "\xd9\x86\xd8\xac\xd8\xad\0" /* offset 14285 */
+ "\xd9\x85\xd8\xae\xd9\x8a\0" /* offset 14292 */
+ "\xd9\x84\xd8\xac\xd9\x85\0" /* offset 14299 */
+ "\xd9\x83\xd9\x85\xd9\x85\0" /* offset 14306 */
+ "\xd8\xac\xd8\xad\xd9\x8a\0" /* offset 14313 */
+ "\xd8\xad\xd8\xac\xd9\x8a\0" /* offset 14320 */
+ "\xd9\x85\xd8\xac\xd9\x8a\0" /* offset 14327 */
+ "\xd9\x81\xd9\x85\xd9\x8a\0" /* offset 14334 */
+ "\xd8\xa8\xd8\xad\xd9\x8a\0" /* offset 14341 */
+ "\xd8\xb3\xd8\xae\xd9\x8a\0" /* offset 14348 */
+ "\xd9\x86\xd8\xac\xd9\x8a\0" /* offset 14355 */
+ "\xd8\xb5\xd9\x84\xdb\x92\0" /* offset 14362 */
+ "\xd9\x82\xd9\x84\xdb\x92\0" /* offset 14369 */
+ "\xd8\xa7\xd9\x84\xd9\x84\xd9\x87\0" /* offset 14376 */
+ "\xd8\xa7\xd9\x83\xd8\xa8\xd8\xb1\0" /* offset 14385 */
+ "\xd9\x85\xd8\xad\xd9\x85\xd8\xaf\0" /* offset 14394 */
+ "\xd8\xb5\xd9\x84\xd8\xb9\xd9\x85\0" /* offset 14403 */
+ "\xd8\xb1\xd8\xb3\xd9\x88\xd9\x84\0" /* offset 14412 */
+ "\xd8\xb9\xd9\x84\xd9\x8a\xd9\x87\0" /* offset 14421 */
+ "\xd9\x88\xd8\xb3\xd9\x84\xd9\x85\0" /* offset 14430 */
+ "\xd8\xb5\xd9\x84\xd9\x89\0" /* offset 14439 */
+ "\xd8\xb5\xd9\x84\xd9\x89\x20\xd8\xa7\xd9\x84\xd9\x84\xd9\x87\x20\xd8\xb9\xd9\x84\xd9\x8a\xd9\x87\x20\xd9\x88\xd8\xb3\xd9\x84\xd9\x85\0" /* offset 14446 */
+ "\xd8\xac\xd9\x84\x20\xd8\xac\xd9\x84\xd8\xa7\xd9\x84\xd9\x87\0" /* offset 14480 */
+ "\xd8\xb1\xdb\x8c\xd8\xa7\xd9\x84\0" /* offset 14496 */
+ "\x2c\0" /* offset 14505 */
+ "\xe3\x80\x81\0" /* offset 14507 */
+ "\xe3\x80\x82\0" /* offset 14511 */
+ "\x3a\0" /* offset 14515 */
+ "\x21\0" /* offset 14517 */
+ "\x3f\0" /* offset 14519 */
+ "\xe3\x80\x96\0" /* offset 14521 */
+ "\xe3\x80\x97\0" /* offset 14525 */
+ "\xe2\x80\x94\0" /* offset 14529 */
+ "\xe2\x80\x93\0" /* offset 14533 */
+ "\x5f\0" /* offset 14537 */
+ "\x7b\0" /* offset 14539 */
+ "\x7d\0" /* offset 14541 */
+ "\xe3\x80\x94\0" /* offset 14543 */
+ "\xe3\x80\x95\0" /* offset 14547 */
+ "\xe3\x80\x90\0" /* offset 14551 */
+ "\xe3\x80\x91\0" /* offset 14555 */
+ "\xe3\x80\x8a\0" /* offset 14559 */
+ "\xe3\x80\x8b\0" /* offset 14563 */
+ "\xe3\x80\x8c\0" /* offset 14567 */
+ "\xe3\x80\x8d\0" /* offset 14571 */
+ "\xe3\x80\x8e\0" /* offset 14575 */
+ "\xe3\x80\x8f\0" /* offset 14579 */
+ "\x5b\0" /* offset 14583 */
+ "\x5d\0" /* offset 14585 */
+ "\x23\0" /* offset 14587 */
+ "\x26\0" /* offset 14589 */
+ "\x2a\0" /* offset 14591 */
+ "\x2d\0" /* offset 14593 */
+ "\x3c\0" /* offset 14595 */
+ "\x3e\0" /* offset 14597 */
+ "\x5c\0" /* offset 14599 */
+ "\x24\0" /* offset 14601 */
+ "\x25\0" /* offset 14603 */
+ "\x40\0" /* offset 14605 */
+ "\x20\xd9\x8b\0" /* offset 14607 */
+ "\xd9\x80\xd9\x8b\0" /* offset 14611 */
+ "\x20\xd9\x8c\0" /* offset 14616 */
+ "\x20\xd9\x8d\0" /* offset 14620 */
+ "\x20\xd9\x8e\0" /* offset 14624 */
+ "\xd9\x80\xd9\x8e\0" /* offset 14628 */
+ "\x20\xd9\x8f\0" /* offset 14633 */
+ "\xd9\x80\xd9\x8f\0" /* offset 14637 */
+ "\x20\xd9\x90\0" /* offset 14642 */
+ "\xd9\x80\xd9\x90\0" /* offset 14646 */
+ "\x20\xd9\x91\0" /* offset 14651 */
+ "\xd9\x80\xd9\x91\0" /* offset 14655 */
+ "\x20\xd9\x92\0" /* offset 14660 */
+ "\xd9\x80\xd9\x92\0" /* offset 14664 */
+ "\xd8\xa1\0" /* offset 14669 */
+ "\xd8\xa7\0" /* offset 14672 */
+ "\xd8\xa8\0" /* offset 14675 */
+ "\xd8\xa9\0" /* offset 14678 */
+ "\xd8\xaa\0" /* offset 14681 */
+ "\xd8\xab\0" /* offset 14684 */
+ "\xd8\xac\0" /* offset 14687 */
+ "\xd8\xad\0" /* offset 14690 */
+ "\xd8\xae\0" /* offset 14693 */
+ "\xd8\xaf\0" /* offset 14696 */
+ "\xd8\xb0\0" /* offset 14699 */
+ "\xd8\xb1\0" /* offset 14702 */
+ "\xd8\xb2\0" /* offset 14705 */
+ "\xd8\xb3\0" /* offset 14708 */
+ "\xd8\xb4\0" /* offset 14711 */
+ "\xd8\xb5\0" /* offset 14714 */
+ "\xd8\xb6\0" /* offset 14717 */
+ "\xd8\xb7\0" /* offset 14720 */
+ "\xd8\xb8\0" /* offset 14723 */
+ "\xd8\xb9\0" /* offset 14726 */
+ "\xd8\xba\0" /* offset 14729 */
+ "\xd9\x81\0" /* offset 14732 */
+ "\xd9\x82\0" /* offset 14735 */
+ "\xd9\x83\0" /* offset 14738 */
+ "\xd9\x84\0" /* offset 14741 */
+ "\xd9\x85\0" /* offset 14744 */
+ "\xd9\x86\0" /* offset 14747 */
+ "\xd9\x87\0" /* offset 14750 */
+ "\xd9\x88\0" /* offset 14753 */
+ "\xd9\x8a\0" /* offset 14756 */
+ "\xd9\x84\xd8\xa7\xd9\x93\0" /* offset 14759 */
+ "\xd9\x84\xd8\xa7\xd9\x94\0" /* offset 14766 */
+ "\xd9\x84\xd8\xa7\xd9\x95\0" /* offset 14773 */
+ "\xd9\x84\xd8\xa7\0" /* offset 14780 */
+ "\x22\0" /* offset 14785 */
+ "\x27\0" /* offset 14787 */
+ "\x2f\0" /* offset 14789 */
+ "\x5e\0" /* offset 14791 */
+ "\x7c\0" /* offset 14793 */
+ "\x7e\0" /* offset 14795 */
+ "\xe2\xa6\x85\0" /* offset 14797 */
+ "\xe2\xa6\x86\0" /* offset 14801 */
+ "\xe3\x83\xbb\0" /* offset 14805 */
+ "\xe3\x82\xa1\0" /* offset 14809 */
+ "\xe3\x82\xa3\0" /* offset 14813 */
+ "\xe3\x82\xa5\0" /* offset 14817 */
+ "\xe3\x82\xa7\0" /* offset 14821 */
+ "\xe3\x82\xa9\0" /* offset 14825 */
+ "\xe3\x83\xa3\0" /* offset 14829 */
+ "\xe3\x83\xa5\0" /* offset 14833 */
+ "\xe3\x83\xa7\0" /* offset 14837 */
+ "\xe3\x83\x83\0" /* offset 14841 */
+ "\xe3\x83\xbc\0" /* offset 14845 */
+ "\xe3\x83\xb3\0" /* offset 14849 */
+ "\xe3\x82\x99\0" /* offset 14853 */
+ "\xe3\x82\x9a\0" /* offset 14857 */
+ "\xc2\xa2\0" /* offset 14861 */
+ "\xc2\xa3\0" /* offset 14864 */
+ "\xc2\xac\0" /* offset 14867 */
+ "\xc2\xa6\0" /* offset 14870 */
+ "\xc2\xa5\0" /* offset 14873 */
+ "\xe2\x82\xa9\0" /* offset 14876 */
+ "\xe2\x94\x82\0" /* offset 14880 */
+ "\xe2\x86\x90\0" /* offset 14884 */
+ "\xe2\x86\x91\0" /* offset 14888 */
+ "\xe2\x86\x92\0" /* offset 14892 */
+ "\xe2\x86\x93\0" /* offset 14896 */
+ "\xe2\x96\xa0\0" /* offset 14900 */
+ "\xe2\x97\x8b\0" /* offset 14904 */
+ "\xf0\x9d\x85\x97\xf0\x9d\x85\xa5\0" /* offset 14908 */
+ "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\0" /* offset 14917 */
+ "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 14926 */
+ "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 14939 */
+ "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb0\0" /* offset 14952 */
+ "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb1\0" /* offset 14965 */
+ "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb2\0" /* offset 14978 */
+ "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\0" /* offset 14991 */
+ "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\0" /* offset 15000 */
+ "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 15009 */
+ "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 15022 */
+ "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 15035 */
+ "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 15048 */
+ "\xc4\xb1\0" /* offset 15061 */
+ "\xc8\xb7\0" /* offset 15064 */
+ "\xce\x91\0" /* offset 15067 */
+ "\xce\x92\0" /* offset 15070 */
+ "\xce\x94\0" /* offset 15073 */
+ "\xce\x95\0" /* offset 15076 */
+ "\xce\x96\0" /* offset 15079 */
+ "\xce\x97\0" /* offset 15082 */
+ "\xce\x99\0" /* offset 15085 */
+ "\xce\x9a\0" /* offset 15088 */
+ "\xce\x9b\0" /* offset 15091 */
+ "\xce\x9c\0" /* offset 15094 */
+ "\xce\x9d\0" /* offset 15097 */
+ "\xce\x9e\0" /* offset 15100 */
+ "\xce\x9f\0" /* offset 15103 */
+ "\xce\xa1\0" /* offset 15106 */
+ "\xce\xa4\0" /* offset 15109 */
+ "\xce\xa6\0" /* offset 15112 */
+ "\xce\xa7\0" /* offset 15115 */
+ "\xce\xa8\0" /* offset 15118 */
+ "\xe2\x88\x87\0" /* offset 15121 */
+ "\xce\xb1\0" /* offset 15125 */
+ "\xce\xb6\0" /* offset 15128 */
+ "\xce\xb7\0" /* offset 15131 */
+ "\xce\xbb\0" /* offset 15134 */
+ "\xce\xbd\0" /* offset 15137 */
+ "\xce\xbe\0" /* offset 15140 */
+ "\xce\xbf\0" /* offset 15143 */
+ "\xcf\x83\0" /* offset 15146 */
+ "\xcf\x84\0" /* offset 15149 */
+ "\xcf\x85\0" /* offset 15152 */
+ "\xcf\x88\0" /* offset 15155 */
+ "\xcf\x89\0" /* offset 15158 */
+ "\xe2\x88\x82\0" /* offset 15161 */
+ "\xcf\x9c\0" /* offset 15165 */
+ "\xcf\x9d\0" /* offset 15168 */
+ "\xe4\xb8\xbd\0" /* offset 15171 */
+ "\xe4\xb8\xb8\0" /* offset 15175 */
+ "\xe4\xb9\x81\0" /* offset 15179 */
+ "\xf0\xa0\x84\xa2\0" /* offset 15183 */
+ "\xe4\xbd\xa0\0" /* offset 15188 */
+ "\xe4\xbe\xbb\0" /* offset 15192 */
+ "\xe5\x80\x82\0" /* offset 15196 */
+ "\xe5\x81\xba\0" /* offset 15200 */
+ "\xe5\x82\x99\0" /* offset 15204 */
+ "\xe5\x83\x8f\0" /* offset 15208 */
+ "\xe3\x92\x9e\0" /* offset 15212 */
+ "\xf0\xa0\x98\xba\0" /* offset 15216 */
+ "\xe5\x85\x94\0" /* offset 15221 */
+ "\xe5\x85\xa4\0" /* offset 15225 */
+ "\xe5\x85\xb7\0" /* offset 15229 */
+ "\xf0\xa0\x94\x9c\0" /* offset 15233 */
+ "\xe3\x92\xb9\0" /* offset 15238 */
+ "\xe5\x85\xa7\0" /* offset 15242 */
+ "\xe5\x86\x8d\0" /* offset 15246 */
+ "\xf0\xa0\x95\x8b\0" /* offset 15250 */
+ "\xe5\x86\x97\0" /* offset 15255 */
+ "\xe5\x86\xa4\0" /* offset 15259 */
+ "\xe4\xbb\x8c\0" /* offset 15263 */
+ "\xe5\x86\xac\0" /* offset 15267 */
+ "\xf0\xa9\x87\x9f\0" /* offset 15271 */
+ "\xe5\x88\x83\0" /* offset 15276 */
+ "\xe3\x93\x9f\0" /* offset 15280 */
+ "\xe5\x88\xbb\0" /* offset 15284 */
+ "\xe5\x89\x86\0" /* offset 15288 */
+ "\xe5\x89\xb2\0" /* offset 15292 */
+ "\xe5\x89\xb7\0" /* offset 15296 */
+ "\xe3\x94\x95\0" /* offset 15300 */
+ "\xe5\x8c\x85\0" /* offset 15304 */
+ "\xe5\x8c\x86\0" /* offset 15308 */
+ "\xe5\x8d\x89\0" /* offset 15312 */
+ "\xe5\x8d\x9a\0" /* offset 15316 */
+ "\xe5\x8d\xb3\0" /* offset 15320 */
+ "\xe5\x8d\xbd\0" /* offset 15324 */
+ "\xe5\x8d\xbf\0" /* offset 15328 */
+ "\xf0\xa0\xa8\xac\0" /* offset 15332 */
+ "\xe7\x81\xb0\0" /* offset 15337 */
+ "\xe5\x8f\x8a\0" /* offset 15341 */
+ "\xe5\x8f\x9f\0" /* offset 15345 */
+ "\xf0\xa0\xad\xa3\0" /* offset 15349 */
+ "\xe5\x8f\xab\0" /* offset 15354 */
+ "\xe5\x8f\xb1\0" /* offset 15358 */
+ "\xe5\x90\x86\0" /* offset 15362 */
+ "\xe5\x92\x9e\0" /* offset 15366 */
+ "\xe5\x90\xb8\0" /* offset 15370 */
+ "\xe5\x91\x88\0" /* offset 15374 */
+ "\xe5\x91\xa8\0" /* offset 15378 */
+ "\xe5\x92\xa2\0" /* offset 15382 */
+ "\xe5\x93\xb6\0" /* offset 15386 */
+ "\xe5\x94\x90\0" /* offset 15390 */
+ "\xe5\x95\x93\0" /* offset 15394 */
+ "\xe5\x95\xa3\0" /* offset 15398 */
+ "\xe5\x96\x84\0" /* offset 15402 */
+ "\xe5\x96\xab\0" /* offset 15406 */
+ "\xe5\x96\xb3\0" /* offset 15410 */
+ "\xe5\x97\x82\0" /* offset 15414 */
+ "\xe5\x9c\x96\0" /* offset 15418 */
+ "\xe5\x9c\x97\0" /* offset 15422 */
+ "\xe5\x99\x91\0" /* offset 15426 */
+ "\xe5\x99\xb4\0" /* offset 15430 */
+ "\xe5\xa3\xae\0" /* offset 15434 */
+ "\xe5\x9f\x8e\0" /* offset 15438 */
+ "\xe5\x9f\xb4\0" /* offset 15442 */
+ "\xe5\xa0\x8d\0" /* offset 15446 */
+ "\xe5\x9e\x8b\0" /* offset 15450 */
+ "\xe5\xa0\xb2\0" /* offset 15454 */
+ "\xe5\xa0\xb1\0" /* offset 15458 */
+ "\xe5\xa2\xac\0" /* offset 15462 */
+ "\xf0\xa1\x93\xa4\0" /* offset 15466 */
+ "\xe5\xa3\xb2\0" /* offset 15471 */
+ "\xe5\xa3\xb7\0" /* offset 15475 */
+ "\xe5\xa4\x86\0" /* offset 15479 */
+ "\xe5\xa4\x9a\0" /* offset 15483 */
+ "\xe5\xa4\xa2\0" /* offset 15487 */
+ "\xe5\xa5\xa2\0" /* offset 15491 */
+ "\xf0\xa1\x9a\xa8\0" /* offset 15495 */
+ "\xf0\xa1\x9b\xaa\0" /* offset 15500 */
+ "\xe5\xa7\xac\0" /* offset 15505 */
+ "\xe5\xa8\x9b\0" /* offset 15509 */
+ "\xe5\xa8\xa7\0" /* offset 15513 */
+ "\xe5\xa7\x98\0" /* offset 15517 */
+ "\xe5\xa9\xa6\0" /* offset 15521 */
+ "\xe3\x9b\xae\0" /* offset 15525 */
+ "\xe3\x9b\xbc\0" /* offset 15529 */
+ "\xe5\xac\x88\0" /* offset 15533 */
+ "\xe5\xac\xbe\0" /* offset 15537 */
+ "\xf0\xa1\xa7\x88\0" /* offset 15541 */
+ "\xe5\xaf\x83\0" /* offset 15546 */
+ "\xe5\xaf\x98\0" /* offset 15550 */
+ "\xe5\xaf\xb3\0" /* offset 15554 */
+ "\xf0\xa1\xac\x98\0" /* offset 15558 */
+ "\xe5\xaf\xbf\0" /* offset 15563 */
+ "\xe5\xb0\x86\0" /* offset 15567 */
+ "\xe5\xbd\x93\0" /* offset 15571 */
+ "\xe3\x9e\x81\0" /* offset 15575 */
+ "\xe5\xb1\xa0\0" /* offset 15579 */
+ "\xe5\xb3\x80\0" /* offset 15583 */
+ "\xe5\xb2\x8d\0" /* offset 15587 */
+ "\xf0\xa1\xb7\xa4\0" /* offset 15591 */
+ "\xe5\xb5\x83\0" /* offset 15596 */
+ "\xf0\xa1\xb7\xa6\0" /* offset 15600 */
+ "\xe5\xb5\xae\0" /* offset 15605 */
+ "\xe5\xb5\xab\0" /* offset 15609 */
+ "\xe5\xb5\xbc\0" /* offset 15613 */
+ "\xe5\xb7\xa1\0" /* offset 15617 */
+ "\xe5\xb7\xa2\0" /* offset 15621 */
+ "\xe3\xa0\xaf\0" /* offset 15625 */
+ "\xe5\xb7\xbd\0" /* offset 15629 */
+ "\xe5\xb8\xa8\0" /* offset 15633 */
+ "\xe5\xb8\xbd\0" /* offset 15637 */
+ "\xe5\xb9\xa9\0" /* offset 15641 */
+ "\xe3\xa1\xa2\0" /* offset 15645 */
+ "\xf0\xa2\x86\x83\0" /* offset 15649 */
+ "\xe3\xa1\xbc\0" /* offset 15654 */
+ "\xe5\xba\xb0\0" /* offset 15658 */
+ "\xe5\xba\xb3\0" /* offset 15662 */
+ "\xe5\xba\xb6\0" /* offset 15666 */
+ "\xf0\xaa\x8e\x92\0" /* offset 15670 */
+ "\xf0\xa2\x8c\xb1\0" /* offset 15675 */
+ "\xe8\x88\x81\0" /* offset 15680 */
+ "\xe5\xbc\xa2\0" /* offset 15684 */
+ "\xe3\xa3\x87\0" /* offset 15688 */
+ "\xf0\xa3\x8a\xb8\0" /* offset 15692 */
+ "\xf0\xa6\x87\x9a\0" /* offset 15697 */
+ "\xe5\xbd\xa2\0" /* offset 15702 */
+ "\xe5\xbd\xab\0" /* offset 15706 */
+ "\xe3\xa3\xa3\0" /* offset 15710 */
+ "\xe5\xbe\x9a\0" /* offset 15714 */
+ "\xe5\xbf\x8d\0" /* offset 15718 */
+ "\xe5\xbf\x97\0" /* offset 15722 */
+ "\xe5\xbf\xb9\0" /* offset 15726 */
+ "\xe6\x82\x81\0" /* offset 15730 */
+ "\xe3\xa4\xba\0" /* offset 15734 */
+ "\xe3\xa4\x9c\0" /* offset 15738 */
+ "\xf0\xa2\x9b\x94\0" /* offset 15742 */
+ "\xe6\x83\x87\0" /* offset 15747 */
+ "\xe6\x85\x88\0" /* offset 15751 */
+ "\xe6\x85\x8c\0" /* offset 15755 */
+ "\xe6\x85\xba\0" /* offset 15759 */
+ "\xe6\x86\xb2\0" /* offset 15763 */
+ "\xe6\x86\xa4\0" /* offset 15767 */
+ "\xe6\x86\xaf\0" /* offset 15771 */
+ "\xe6\x87\x9e\0" /* offset 15775 */
+ "\xe6\x88\x90\0" /* offset 15779 */
+ "\xe6\x88\x9b\0" /* offset 15783 */
+ "\xe6\x89\x9d\0" /* offset 15787 */
+ "\xe6\x8a\xb1\0" /* offset 15791 */
+ "\xe6\x8b\x94\0" /* offset 15795 */
+ "\xe6\x8d\x90\0" /* offset 15799 */
+ "\xf0\xa2\xac\x8c\0" /* offset 15803 */
+ "\xe6\x8c\xbd\0" /* offset 15808 */
+ "\xe6\x8b\xbc\0" /* offset 15812 */
+ "\xe6\x8d\xa8\0" /* offset 15816 */
+ "\xe6\x8e\x83\0" /* offset 15820 */
+ "\xe6\x8f\xa4\0" /* offset 15824 */
+ "\xf0\xa2\xaf\xb1\0" /* offset 15828 */
+ "\xe6\x90\xa2\0" /* offset 15833 */
+ "\xe6\x8f\x85\0" /* offset 15837 */
+ "\xe6\x8e\xa9\0" /* offset 15841 */
+ "\xe3\xa8\xae\0" /* offset 15845 */
+ "\xe6\x91\xa9\0" /* offset 15849 */
+ "\xe6\x91\xbe\0" /* offset 15853 */
+ "\xe6\x92\x9d\0" /* offset 15857 */
+ "\xe6\x91\xb7\0" /* offset 15861 */
+ "\xe3\xa9\xac\0" /* offset 15865 */
+ "\xe6\x95\xac\0" /* offset 15869 */
+ "\xf0\xa3\x80\x8a\0" /* offset 15873 */
+ "\xe6\x97\xa3\0" /* offset 15878 */
+ "\xe6\x9b\xb8\0" /* offset 15882 */
+ "\xe6\x99\x89\0" /* offset 15886 */
+ "\xe3\xac\x99\0" /* offset 15890 */
+ "\xe3\xac\x88\0" /* offset 15894 */
+ "\xe3\xab\xa4\0" /* offset 15898 */
+ "\xe5\x86\x92\0" /* offset 15902 */
+ "\xe5\x86\x95\0" /* offset 15906 */
+ "\xe6\x9c\x80\0" /* offset 15910 */
+ "\xe6\x9a\x9c\0" /* offset 15914 */
+ "\xe8\x82\xad\0" /* offset 15918 */
+ "\xe4\x8f\x99\0" /* offset 15922 */
+ "\xe6\x9c\xa1\0" /* offset 15926 */
+ "\xe6\x9d\x9e\0" /* offset 15930 */
+ "\xe6\x9d\x93\0" /* offset 15934 */
+ "\xf0\xa3\x8f\x83\0" /* offset 15938 */
+ "\xe3\xad\x89\0" /* offset 15943 */
+ "\xe6\x9f\xba\0" /* offset 15947 */
+ "\xe6\x9e\x85\0" /* offset 15951 */
+ "\xe6\xa1\x92\0" /* offset 15955 */
+ "\xf0\xa3\x91\xad\0" /* offset 15959 */
+ "\xe6\xa2\x8e\0" /* offset 15964 */
+ "\xe6\xa0\x9f\0" /* offset 15968 */
+ "\xe6\xa4\x94\0" /* offset 15972 */
+ "\xe6\xa5\x82\0" /* offset 15976 */
+ "\xe6\xa6\xa3\0" /* offset 15980 */
+ "\xe6\xa7\xaa\0" /* offset 15984 */
+ "\xe6\xaa\xa8\0" /* offset 15988 */
+ "\xf0\xa3\x9a\xa3\0" /* offset 15992 */
+ "\xe6\xab\x9b\0" /* offset 15997 */
+ "\xe3\xb0\x98\0" /* offset 16001 */
+ "\xe6\xac\xa1\0" /* offset 16005 */
+ "\xf0\xa3\xa2\xa7\0" /* offset 16009 */
+ "\xe6\xad\x94\0" /* offset 16014 */
+ "\xe3\xb1\x8e\0" /* offset 16018 */
+ "\xe6\xad\xb2\0" /* offset 16022 */
+ "\xe6\xae\x9f\0" /* offset 16026 */
+ "\xe6\xae\xbb\0" /* offset 16030 */
+ "\xf0\xa3\xaa\x8d\0" /* offset 16034 */
+ "\xf0\xa1\xb4\x8b\0" /* offset 16039 */
+ "\xf0\xa3\xab\xba\0" /* offset 16044 */
+ "\xe6\xb1\x8e\0" /* offset 16049 */
+ "\xf0\xa3\xb2\xbc\0" /* offset 16053 */
+ "\xe6\xb2\xbf\0" /* offset 16058 */
+ "\xe6\xb3\x8d\0" /* offset 16062 */
+ "\xe6\xb1\xa7\0" /* offset 16066 */
+ "\xe6\xb4\x96\0" /* offset 16070 */
+ "\xe6\xb4\xbe\0" /* offset 16074 */
+ "\xe6\xb5\xa9\0" /* offset 16078 */
+ "\xe6\xb5\xb8\0" /* offset 16082 */
+ "\xe6\xb6\x85\0" /* offset 16086 */
+ "\xf0\xa3\xb4\x9e\0" /* offset 16090 */
+ "\xe6\xb4\xb4\0" /* offset 16095 */
+ "\xe6\xb8\xaf\0" /* offset 16099 */
+ "\xe6\xb9\xae\0" /* offset 16103 */
+ "\xe3\xb4\xb3\0" /* offset 16107 */
+ "\xe6\xbb\x87\0" /* offset 16111 */
+ "\xf0\xa3\xbb\x91\0" /* offset 16115 */
+ "\xe6\xb7\xb9\0" /* offset 16120 */
+ "\xe6\xbd\xae\0" /* offset 16124 */
+ "\xf0\xa3\xbd\x9e\0" /* offset 16128 */
+ "\xf0\xa3\xbe\x8e\0" /* offset 16133 */
+ "\xe6\xbf\x86\0" /* offset 16138 */
+ "\xe7\x80\xb9\0" /* offset 16142 */
+ "\xe7\x80\x9b\0" /* offset 16146 */
+ "\xe3\xb6\x96\0" /* offset 16150 */
+ "\xe7\x81\x8a\0" /* offset 16154 */
+ "\xe7\x81\xbd\0" /* offset 16158 */
+ "\xe7\x81\xb7\0" /* offset 16162 */
+ "\xe7\x82\xad\0" /* offset 16166 */
+ "\xf0\xa0\x94\xa5\0" /* offset 16170 */
+ "\xe7\x85\x85\0" /* offset 16175 */
+ "\xf0\xa4\x89\xa3\0" /* offset 16179 */
+ "\xe7\x86\x9c\0" /* offset 16184 */
+ "\xf0\xa4\x8e\xab\0" /* offset 16188 */
+ "\xe7\x88\xa8\0" /* offset 16193 */
+ "\xe7\x89\x90\0" /* offset 16197 */
+ "\xf0\xa4\x98\x88\0" /* offset 16201 */
+ "\xe7\x8a\x80\0" /* offset 16206 */
+ "\xe7\x8a\x95\0" /* offset 16210 */
+ "\xf0\xa4\x9c\xb5\0" /* offset 16214 */
+ "\xf0\xa4\xa0\x94\0" /* offset 16219 */
+ "\xe7\x8d\xba\0" /* offset 16224 */
+ "\xe7\x8e\x8b\0" /* offset 16228 */
+ "\xe3\xba\xac\0" /* offset 16232 */
+ "\xe7\x8e\xa5\0" /* offset 16236 */
+ "\xe3\xba\xb8\0" /* offset 16240 */
+ "\xe7\x91\x87\0" /* offset 16244 */
+ "\xe7\x91\x9c\0" /* offset 16248 */
+ "\xe7\x92\x85\0" /* offset 16252 */
+ "\xe7\x93\x8a\0" /* offset 16256 */
+ "\xe3\xbc\x9b\0" /* offset 16260 */
+ "\xe7\x94\xa4\0" /* offset 16264 */
+ "\xf0\xa4\xb0\xb6\0" /* offset 16268 */
+ "\xe7\x94\xbe\0" /* offset 16273 */
+ "\xf0\xa4\xb2\x92\0" /* offset 16277 */
+ "\xf0\xa2\x86\x9f\0" /* offset 16282 */
+ "\xe7\x98\x90\0" /* offset 16287 */
+ "\xf0\xa4\xbe\xa1\0" /* offset 16291 */
+ "\xf0\xa4\xbe\xb8\0" /* offset 16296 */
+ "\xf0\xa5\x81\x84\0" /* offset 16301 */
+ "\xe3\xbf\xbc\0" /* offset 16306 */
+ "\xe4\x80\x88\0" /* offset 16310 */
+ "\xf0\xa5\x83\xb3\0" /* offset 16314 */
+ "\xf0\xa5\x83\xb2\0" /* offset 16319 */
+ "\xf0\xa5\x84\x99\0" /* offset 16324 */
+ "\xf0\xa5\x84\xb3\0" /* offset 16329 */
+ "\xe7\x9c\x9e\0" /* offset 16334 */
+ "\xe7\x9c\x9f\0" /* offset 16338 */
+ "\xe7\x9e\x8b\0" /* offset 16342 */
+ "\xe4\x81\x86\0" /* offset 16346 */
+ "\xe4\x82\x96\0" /* offset 16350 */
+ "\xf0\xa5\x90\x9d\0" /* offset 16354 */
+ "\xe7\xa1\x8e\0" /* offset 16359 */
+ "\xe4\x83\xa3\0" /* offset 16363 */
+ "\xf0\xa5\x98\xa6\0" /* offset 16367 */
+ "\xf0\xa5\x9a\x9a\0" /* offset 16372 */
+ "\xf0\xa5\x9b\x85\0" /* offset 16377 */
+ "\xe7\xa7\xab\0" /* offset 16382 */
+ "\xe4\x84\xaf\0" /* offset 16386 */
+ "\xe7\xa9\x8a\0" /* offset 16390 */
+ "\xe7\xa9\x8f\0" /* offset 16394 */
+ "\xf0\xa5\xa5\xbc\0" /* offset 16398 */
+ "\xf0\xa5\xaa\xa7\0" /* offset 16403 */
+ "\xe7\xab\xae\0" /* offset 16408 */
+ "\xe4\x88\x82\0" /* offset 16412 */
+ "\xf0\xa5\xae\xab\0" /* offset 16416 */
+ "\xe7\xaf\x86\0" /* offset 16421 */
+ "\xe7\xaf\x89\0" /* offset 16425 */
+ "\xe4\x88\xa7\0" /* offset 16429 */
+ "\xf0\xa5\xb2\x80\0" /* offset 16433 */
+ "\xe7\xb3\x92\0" /* offset 16438 */
+ "\xe4\x8a\xa0\0" /* offset 16442 */
+ "\xe7\xb3\xa8\0" /* offset 16446 */
+ "\xe7\xb3\xa3\0" /* offset 16450 */
+ "\xe7\xb4\x80\0" /* offset 16454 */
+ "\xf0\xa5\xbe\x86\0" /* offset 16458 */
+ "\xe7\xb5\xa3\0" /* offset 16463 */
+ "\xe4\x8c\x81\0" /* offset 16467 */
+ "\xe7\xb7\x87\0" /* offset 16471 */
+ "\xe7\xb8\x82\0" /* offset 16475 */
+ "\xe7\xb9\x85\0" /* offset 16479 */
+ "\xe4\x8c\xb4\0" /* offset 16483 */
+ "\xf0\xa6\x88\xa8\0" /* offset 16487 */
+ "\xf0\xa6\x89\x87\0" /* offset 16492 */
+ "\xe4\x8d\x99\0" /* offset 16497 */
+ "\xf0\xa6\x8b\x99\0" /* offset 16501 */
+ "\xe7\xbd\xba\0" /* offset 16506 */
+ "\xf0\xa6\x8c\xbe\0" /* offset 16510 */
+ "\xe7\xbe\x95\0" /* offset 16515 */
+ "\xe7\xbf\xba\0" /* offset 16519 */
+ "\xf0\xa6\x93\x9a\0" /* offset 16523 */
+ "\xf0\xa6\x94\xa3\0" /* offset 16528 */
+ "\xe8\x81\xa0\0" /* offset 16533 */
+ "\xf0\xa6\x96\xa8\0" /* offset 16537 */
+ "\xe8\x81\xb0\0" /* offset 16542 */
+ "\xf0\xa3\x8d\x9f\0" /* offset 16546 */
+ "\xe4\x8f\x95\0" /* offset 16551 */
+ "\xe8\x82\xb2\0" /* offset 16555 */
+ "\xe8\x84\x83\0" /* offset 16559 */
+ "\xe4\x90\x8b\0" /* offset 16563 */
+ "\xe8\x84\xbe\0" /* offset 16567 */
+ "\xe5\xaa\xb5\0" /* offset 16571 */
+ "\xf0\xa6\x9e\xa7\0" /* offset 16575 */
+ "\xf0\xa6\x9e\xb5\0" /* offset 16580 */
+ "\xf0\xa3\x8e\x93\0" /* offset 16585 */
+ "\xf0\xa3\x8e\x9c\0" /* offset 16590 */
+ "\xe8\x88\x84\0" /* offset 16595 */
+ "\xe8\xbe\x9e\0" /* offset 16599 */
+ "\xe4\x91\xab\0" /* offset 16603 */
+ "\xe8\x8a\x91\0" /* offset 16607 */
+ "\xe8\x8a\x8b\0" /* offset 16611 */
+ "\xe8\x8a\x9d\0" /* offset 16615 */
+ "\xe5\x8a\xb3\0" /* offset 16619 */
+ "\xe8\x8a\xb1\0" /* offset 16623 */
+ "\xe8\x8a\xb3\0" /* offset 16627 */
+ "\xe8\x8a\xbd\0" /* offset 16631 */
+ "\xe8\x8b\xa6\0" /* offset 16635 */
+ "\xf0\xa6\xac\xbc\0" /* offset 16639 */
+ "\xe8\x8c\x9d\0" /* offset 16644 */
+ "\xe8\x8d\xa3\0" /* offset 16648 */
+ "\xe8\x8e\xad\0" /* offset 16652 */
+ "\xe8\x8c\xa3\0" /* offset 16656 */
+ "\xe8\x8e\xbd\0" /* offset 16660 */
+ "\xe8\x8f\xa7\0" /* offset 16664 */
+ "\xe8\x8d\x93\0" /* offset 16668 */
+ "\xe8\x8f\x8a\0" /* offset 16672 */
+ "\xe8\x8f\x8c\0" /* offset 16676 */
+ "\xe8\x8f\x9c\0" /* offset 16680 */
+ "\xf0\xa6\xb0\xb6\0" /* offset 16684 */
+ "\xf0\xa6\xb5\xab\0" /* offset 16689 */
+ "\xf0\xa6\xb3\x95\0" /* offset 16694 */
+ "\xe4\x94\xab\0" /* offset 16699 */
+ "\xe8\x93\xb1\0" /* offset 16703 */
+ "\xe8\x93\xb3\0" /* offset 16707 */
+ "\xe8\x94\x96\0" /* offset 16711 */
+ "\xf0\xa7\x8f\x8a\0" /* offset 16715 */
+ "\xe8\x95\xa4\0" /* offset 16720 */
+ "\xf0\xa6\xbc\xac\0" /* offset 16724 */
+ "\xe4\x95\x9d\0" /* offset 16729 */
+ "\xe4\x95\xa1\0" /* offset 16733 */
+ "\xf0\xa6\xbe\xb1\0" /* offset 16737 */
+ "\xf0\xa7\x83\x92\0" /* offset 16742 */
+ "\xe4\x95\xab\0" /* offset 16747 */
+ "\xe8\x99\x90\0" /* offset 16751 */
+ "\xe8\x99\xa7\0" /* offset 16755 */
+ "\xe8\x99\xa9\0" /* offset 16759 */
+ "\xe8\x9a\xa9\0" /* offset 16763 */
+ "\xe8\x9a\x88\0" /* offset 16767 */
+ "\xe8\x9c\x8e\0" /* offset 16771 */
+ "\xe8\x9b\xa2\0" /* offset 16775 */
+ "\xe8\x9c\xa8\0" /* offset 16779 */
+ "\xe8\x9d\xab\0" /* offset 16783 */
+ "\xe8\x9e\x86\0" /* offset 16787 */
+ "\xe4\x97\x97\0" /* offset 16791 */
+ "\xe8\x9f\xa1\0" /* offset 16795 */
+ "\xe8\xa0\x81\0" /* offset 16799 */
+ "\xe4\x97\xb9\0" /* offset 16803 */
+ "\xe8\xa1\xa0\0" /* offset 16807 */
+ "\xf0\xa7\x99\xa7\0" /* offset 16811 */
+ "\xe8\xa3\x97\0" /* offset 16816 */
+ "\xe8\xa3\x9e\0" /* offset 16820 */
+ "\xe4\x98\xb5\0" /* offset 16824 */
+ "\xe8\xa3\xba\0" /* offset 16828 */
+ "\xe3\x92\xbb\0" /* offset 16832 */
+ "\xf0\xa7\xa2\xae\0" /* offset 16836 */
+ "\xf0\xa7\xa5\xa6\0" /* offset 16841 */
+ "\xe4\x9a\xbe\0" /* offset 16846 */
+ "\xe4\x9b\x87\0" /* offset 16850 */
+ "\xe8\xaa\xa0\0" /* offset 16854 */
+ "\xf0\xa7\xb2\xa8\0" /* offset 16858 */
+ "\xe8\xb2\xab\0" /* offset 16863 */
+ "\xe8\xb3\x81\0" /* offset 16867 */
+ "\xe8\xb4\x9b\0" /* offset 16871 */
+ "\xe8\xb5\xb7\0" /* offset 16875 */
+ "\xf0\xa7\xbc\xaf\0" /* offset 16879 */
+ "\xf0\xa0\xa0\x84\0" /* offset 16884 */
+ "\xe8\xb7\x8b\0" /* offset 16889 */
+ "\xe8\xb6\xbc\0" /* offset 16893 */
+ "\xe8\xb7\xb0\0" /* offset 16897 */
+ "\xf0\xa0\xa3\x9e\0" /* offset 16901 */
+ "\xe8\xbb\x94\0" /* offset 16906 */
+ "\xf0\xa8\x97\x92\0" /* offset 16910 */
+ "\xf0\xa8\x97\xad\0" /* offset 16915 */
+ "\xe9\x82\x94\0" /* offset 16920 */
+ "\xe9\x83\xb1\0" /* offset 16924 */
+ "\xe9\x84\x91\0" /* offset 16928 */
+ "\xf0\xa8\x9c\xae\0" /* offset 16932 */
+ "\xe9\x84\x9b\0" /* offset 16937 */
+ "\xe9\x88\xb8\0" /* offset 16941 */
+ "\xe9\x8b\x97\0" /* offset 16945 */
+ "\xe9\x8b\x98\0" /* offset 16949 */
+ "\xe9\x89\xbc\0" /* offset 16953 */
+ "\xe9\x8f\xb9\0" /* offset 16957 */
+ "\xe9\x90\x95\0" /* offset 16961 */
+ "\xf0\xa8\xaf\xba\0" /* offset 16965 */
+ "\xe9\x96\x8b\0" /* offset 16970 */
+ "\xe4\xa6\x95\0" /* offset 16974 */
+ "\xe9\x96\xb7\0" /* offset 16978 */
+ "\xf0\xa8\xb5\xb7\0" /* offset 16982 */
+ "\xe4\xa7\xa6\0" /* offset 16987 */
+ "\xe9\x9b\x83\0" /* offset 16991 */
+ "\xe5\xb6\xb2\0" /* offset 16995 */
+ "\xe9\x9c\xa3\0" /* offset 16999 */
+ "\xf0\xa9\x85\x85\0" /* offset 17003 */
+ "\xf0\xa9\x88\x9a\0" /* offset 17008 */
+ "\xe4\xa9\xae\0" /* offset 17013 */
+ "\xe4\xa9\xb6\0" /* offset 17017 */
+ "\xe9\x9f\xa0\0" /* offset 17021 */
+ "\xf0\xa9\x90\x8a\0" /* offset 17025 */
+ "\xe4\xaa\xb2\0" /* offset 17030 */
+ "\xf0\xa9\x92\x96\0" /* offset 17034 */
+ "\xe9\xa0\xa9\0" /* offset 17039 */
+ "\xf0\xa9\x96\xb6\0" /* offset 17043 */
+ "\xe9\xa3\xa2\0" /* offset 17048 */
+ "\xe4\xac\xb3\0" /* offset 17052 */
+ "\xe9\xa4\xa9\0" /* offset 17056 */
+ "\xe9\xa6\xa7\0" /* offset 17060 */
+ "\xe9\xa7\x82\0" /* offset 17064 */
+ "\xe9\xa7\xbe\0" /* offset 17068 */
+ "\xe4\xaf\x8e\0" /* offset 17072 */
+ "\xf0\xa9\xac\xb0\0" /* offset 17076 */
+ "\xe9\xb1\x80\0" /* offset 17081 */
+ "\xe9\xb3\xbd\0" /* offset 17085 */
+ "\xe4\xb3\x8e\0" /* offset 17089 */
+ "\xe4\xb3\xad\0" /* offset 17093 */
+ "\xe9\xb5\xa7\0" /* offset 17097 */
+ "\xf0\xaa\x83\x8e\0" /* offset 17101 */
+ "\xe4\xb3\xb8\0" /* offset 17106 */
+ "\xf0\xaa\x84\x85\0" /* offset 17110 */
+ "\xf0\xaa\x88\x8e\0" /* offset 17115 */
+ "\xf0\xaa\x8a\x91\0" /* offset 17120 */
+ "\xe4\xb5\x96\0" /* offset 17125 */
+ "\xe9\xbb\xbe\0" /* offset 17129 */
+ "\xe9\xbc\x85\0" /* offset 17133 */
+ "\xe9\xbc\x8f\0" /* offset 17137 */
+ "\xe9\xbc\x96\0" /* offset 17141 */
+ "\xf0\xaa\x98\x80\0" /* offset 17145 */;
+
+#endif /* DECOMP_H */
diff --git a/trunk/glib/guniprop.c b/trunk/glib/guniprop.c
new file mode 100644
index 000000000..c66a02c86
--- /dev/null
+++ b/trunk/glib/guniprop.c
@@ -0,0 +1,1305 @@
+/* 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 "config.h"
+
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <locale.h>
+
+#include "glib.h"
+#include "gunichartables.h"
+#include "gmirroringtable.h"
+#include "gscripttable.h"
+#include "gunicodeprivate.h"
+#include "galias.h"
+
+#define ATTR_TABLE(Page) (((Page) <= G_UNICODE_LAST_PAGE_PART1) \
+ ? attr_table_part1[Page] \
+ : attr_table_part2[(Page) - 0xe00])
+
+#define ATTTABLE(Page, Char) \
+ ((ATTR_TABLE(Page) == G_UNICODE_MAX_TABLE_INDEX) ? 0 : (attr_data[ATTR_TABLE(Page)][Char]))
+
+#define TTYPE_PART1(Page, Char) \
+ ((type_table_part1[Page] >= G_UNICODE_MAX_TABLE_INDEX) \
+ ? (type_table_part1[Page] - G_UNICODE_MAX_TABLE_INDEX) \
+ : (type_data[type_table_part1[Page]][Char]))
+
+#define TTYPE_PART2(Page, Char) \
+ ((type_table_part2[Page] >= G_UNICODE_MAX_TABLE_INDEX) \
+ ? (type_table_part2[Page] - G_UNICODE_MAX_TABLE_INDEX) \
+ : (type_data[type_table_part2[Page]][Char]))
+
+#define TYPE(Char) \
+ (((Char) <= G_UNICODE_LAST_CHAR_PART1) \
+ ? TTYPE_PART1 ((Char) >> 8, (Char) & 0xff) \
+ : (((Char) >= 0xe0000 && (Char) <= G_UNICODE_LAST_CHAR) \
+ ? TTYPE_PART2 (((Char) - 0xe0000) >> 8, (Char) & 0xff) \
+ : G_UNICODE_UNASSIGNED))
+
+
+#define IS(Type, Class) (((guint)1 << (Type)) & (Class))
+#define OR(Type, Rest) (((guint)1 << (Type)) | (Rest))
+
+
+
+#define ISALPHA(Type) IS ((Type), \
+ OR (G_UNICODE_LOWERCASE_LETTER, \
+ OR (G_UNICODE_UPPERCASE_LETTER, \
+ OR (G_UNICODE_TITLECASE_LETTER, \
+ OR (G_UNICODE_MODIFIER_LETTER, \
+ OR (G_UNICODE_OTHER_LETTER, 0))))))
+
+#define ISALDIGIT(Type) IS ((Type), \
+ OR (G_UNICODE_DECIMAL_NUMBER, \
+ OR (G_UNICODE_LETTER_NUMBER, \
+ OR (G_UNICODE_OTHER_NUMBER, \
+ OR (G_UNICODE_LOWERCASE_LETTER, \
+ OR (G_UNICODE_UPPERCASE_LETTER, \
+ OR (G_UNICODE_TITLECASE_LETTER, \
+ OR (G_UNICODE_MODIFIER_LETTER, \
+ OR (G_UNICODE_OTHER_LETTER, 0)))))))))
+
+#define ISMARK(Type) IS ((Type), \
+ OR (G_UNICODE_NON_SPACING_MARK, \
+ OR (G_UNICODE_COMBINING_MARK, \
+ OR (G_UNICODE_ENCLOSING_MARK, 0))))
+
+#define ISZEROWIDTHTYPE(Type) IS ((Type), \
+ OR (G_UNICODE_NON_SPACING_MARK, \
+ OR (G_UNICODE_ENCLOSING_MARK, \
+ OR (G_UNICODE_FORMAT, 0))))
+
+/**
+ * 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)
+{
+ return ISALDIGIT (TYPE (c)) ? TRUE : FALSE;
+}
+
+/**
+ * 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)
+{
+ return ISALPHA (TYPE (c)) ? TRUE : FALSE;
+}
+
+
+/**
+ * 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)
+{
+ return !IS (TYPE(c),
+ OR (G_UNICODE_CONTROL,
+ OR (G_UNICODE_FORMAT,
+ OR (G_UNICODE_UNASSIGNED,
+ OR (G_UNICODE_PRIVATE_USE,
+ OR (G_UNICODE_SURROGATE,
+ OR (G_UNICODE_SPACE_SEPARATOR,
+ 0)))))));
+}
+
+/**
+ * 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)
+{
+ return !IS (TYPE(c),
+ OR (G_UNICODE_CONTROL,
+ OR (G_UNICODE_FORMAT,
+ OR (G_UNICODE_UNASSIGNED,
+ OR (G_UNICODE_PRIVATE_USE,
+ OR (G_UNICODE_SURROGATE,
+ 0))))));
+}
+
+/**
+ * g_unichar_ispunct:
+ * @c: a Unicode character
+ *
+ * Determines whether a character is punctuation or a symbol.
+ * Given some UTF-8 text, obtain a character value with
+ * g_utf8_get_char().
+ *
+ * Return value: %TRUE if @c is a punctuation or symbol character
+ **/
+gboolean
+g_unichar_ispunct (gunichar c)
+{
+ return IS (TYPE(c),
+ OR (G_UNICODE_CONNECT_PUNCTUATION,
+ OR (G_UNICODE_DASH_PUNCTUATION,
+ OR (G_UNICODE_CLOSE_PUNCTUATION,
+ OR (G_UNICODE_FINAL_PUNCTUATION,
+ OR (G_UNICODE_INITIAL_PUNCTUATION,
+ OR (G_UNICODE_OTHER_PUNCTUATION,
+ OR (G_UNICODE_OPEN_PUNCTUATION,
+ OR (G_UNICODE_CURRENCY_SYMBOL,
+ OR (G_UNICODE_MODIFIER_SYMBOL,
+ OR (G_UNICODE_MATH_SYMBOL,
+ OR (G_UNICODE_OTHER_SYMBOL,
+ 0)))))))))))) ? TRUE : FALSE;
+}
+
+/**
+ * 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 space 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':
+ return TRUE;
+ break;
+
+ default:
+ {
+ return IS (TYPE(c),
+ OR (G_UNICODE_SPACE_SEPARATOR,
+ OR (G_UNICODE_LINE_SEPARATOR,
+ OR (G_UNICODE_PARAGRAPH_SEPARATOR,
+ 0)))) ? TRUE : FALSE;
+ }
+ break;
+ }
+}
+
+/**
+ * g_unichar_ismark:
+ * @c: a Unicode character
+ *
+ * Determines whether a character is a mark (non-spacing mark,
+ * combining mark, or enclosing mark in Unicode speak).
+ * Given some UTF-8 text, obtain a character value
+ * with g_utf8_get_char().
+ *
+ * Note: in most cases where isalpha characters are allowed,
+ * ismark characters should be allowed to as they are essential
+ * for writing most European languages as well as many non-Latin
+ * scripts.
+ *
+ * Return value: %TRUE if @c is a mark character
+ *
+ * Since: 2.14
+ **/
+gboolean
+g_unichar_ismark (gunichar c)
+{
+ return ISMARK (TYPE (c));
+}
+
+/**
+ * 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 < G_N_ELEMENTS (title_table); ++i)
+ if (title_table[i][0] == c)
+ return TRUE;
+ return FALSE;
+}
+
+/**
+ * g_unichar_isxdigit:
+ * @c: a Unicode character.
+ *
+ * Determines if a character is a hexidecimal digit.
+ *
+ * Return value: %TRUE if the character is a hexadecimal digit
+ **/
+gboolean
+g_unichar_isxdigit (gunichar c)
+{
+ return ((c >= 'a' && c <= 'f')
+ || (c >= 'A' && c <= 'F')
+ || (TYPE (c) == G_UNICODE_DECIMAL_NUMBER));
+}
+
+/**
+ * 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)
+{
+ return TYPE (c) != G_UNICODE_UNASSIGNED;
+}
+
+/**
+ * g_unichar_iszerowidth:
+ * @c: a Unicode character
+ *
+ * Determines if a given character typically takes zero width when rendered.
+ * The return value is %TRUE for all non-spacing and enclosing marks
+ * (e.g., combining accents), format characters, zero-width
+ * space, but not U+00AD SOFT HYPHEN.
+ *
+ * A typical use of this function is with one of g_unichar_iswide() or
+ * g_unichar_iswide_cjk() to determine the number of cells a string occupies
+ * when displayed on a grid display (terminals). However, note that not all
+ * terminals support zero-width rendering of zero-width marks.
+ *
+ * Return value: %TRUE if the character has zero width
+ *
+ * Since: 2.14
+ **/
+gboolean
+g_unichar_iszerowidth (gunichar c)
+{
+ if (G_UNLIKELY (c == 0x00AD))
+ return FALSE;
+
+ if (G_UNLIKELY (ISZEROWIDTHTYPE (TYPE (c))))
+ return TRUE;
+
+ if (G_UNLIKELY ((c >= 0x1160 && c < 0x1200) ||
+ c == 0x200B))
+ return TRUE;
+
+ return FALSE;
+}
+
+/**
+ * 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
+ **/
+gboolean
+g_unichar_iswide (gunichar c)
+{
+ gunichar ucs = c;
+
+ /* The following block is stolen from Markus Kuhn <Markus.Kuhn@cl.cam.ac.uk>'s
+ * wcwidth implementation. */
+ return
+ (ucs >= 0x1100 &&
+ (ucs <= 0x115f || /* Hangul Jamo init. consonants */
+ ucs == 0x2329 || ucs == 0x232a ||
+ (ucs >= 0x2e80 && ucs <= 0xa4cf &&
+ ucs != 0x303f) || /* CJK ... Yi */
+ (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */
+ (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */
+ (ucs >= 0xfe10 && ucs <= 0xfe19) || /* Vertical forms */
+ (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */
+ (ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */
+ (ucs >= 0xffe0 && ucs <= 0xffe6) ||
+ (ucs >= 0x20000 && ucs <= 0x2fffd) ||
+ (ucs >= 0x30000 && ucs <= 0x3fffd)));
+}
+
+
+/* The following block is stolen from Markus Kuhn <Markus.Kuhn@cl.cam.ac.uk>'s
+ * wcwidth implementation. */
+struct Interval
+{
+ gunichar start, end;
+};
+
+/* The following block is stolen from Markus Kuhn <Markus.Kuhn@cl.cam.ac.uk>'s
+ * wcwidth implementation. */
+static int
+interval_compare (const void *key, const void *elt)
+{
+ gunichar c = GPOINTER_TO_UINT (key);
+ struct Interval *interval = (struct Interval *)elt;
+
+ if (c < interval->start)
+ return -1;
+ if (c > interval->end)
+ return +1;
+
+ return 0;
+}
+
+/**
+ * g_unichar_iswide_cjk:
+ * @c: a Unicode character
+ *
+ * Determines if a character is typically rendered in a double-width
+ * cell under legacy East Asian locales. If a character is wide according to
+ * g_unichar_iswide(), then it is also reported wide with this function, but
+ * the converse is not necessarily true. See the
+ * <ulink url="http://www.unicode.org/reports/tr11/">Unicode Standard
+ * Annex #11</ulink> for details.
+ *
+ * Return value: %TRUE if the character is wide in legacy East Asian locales
+ *
+ * Since: 2.12
+ */
+gboolean
+g_unichar_iswide_cjk (gunichar c)
+{
+ /* The following block is stolen from Markus Kuhn <Markus.Kuhn@cl.cam.ac.uk>'s
+ * wcwidth implementation. */
+ /* sorted list of non-overlapping intervals of East Asian Ambiguous
+ * characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */
+ static const struct Interval ambiguous[] = {
+ { 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 },
+ { 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 },
+ { 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 },
+ { 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 },
+ { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED },
+ { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A },
+ { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 },
+ { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D },
+ { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 },
+ { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD },
+ { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C },
+ { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D },
+ { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC },
+ { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD },
+ { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C },
+ { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D },
+ { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 },
+ { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC },
+ { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD },
+ { 0x0CE2, 0x0CE3 }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D },
+ { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 },
+ { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E },
+ { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC },
+ { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 },
+ { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E },
+ { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 },
+ { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 },
+ { 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 },
+ { 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x135F, 0x135F },
+ { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 },
+ { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD },
+ { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD },
+ { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 },
+ { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B },
+ { 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 },
+ { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 },
+ { 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF },
+ { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 },
+ { 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x302A, 0x302F },
+ { 0x3099, 0x309A }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B },
+ { 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F },
+ { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB },
+ { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F },
+ { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, { 0x1D167, 0x1D169 },
+ { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD },
+ { 0x1D242, 0x1D244 }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F },
+ { 0xE0100, 0xE01EF }
+ };
+
+ if (g_unichar_iswide (c))
+ return TRUE;
+
+ if (bsearch (GUINT_TO_POINTER (c), ambiguous, G_N_ELEMENTS (ambiguous), sizeof ambiguous[0],
+ interval_compare))
+ return TRUE;
+
+ return FALSE;
+}
+
+
+/**
+ * g_unichar_toupper:
+ * @c: a Unicode character
+ *
+ * Converts a character to uppercase.
+ *
+ * Return value: the result of converting @c to uppercase.
+ * If @c is not an lowercase or titlecase character,
+ * or has no upper case equivalent @c is returned unchanged.
+ **/
+gunichar
+g_unichar_toupper (gunichar c)
+{
+ int t = TYPE (c);
+ if (t == G_UNICODE_LOWERCASE_LETTER)
+ {
+ gunichar val = ATTTABLE (c >> 8, c & 0xff);
+ if (val >= 0x1000000)
+ {
+ const gchar *p = special_case_table + val - 0x1000000;
+ val = g_utf8_get_char (p);
+ }
+ /* Some lowercase letters, e.g., U+000AA, FEMININE ORDINAL INDICATOR,
+ * do not have an uppercase equivalent, in which case val will be
+ * zero.
+ */
+ return val ? val : c;
+ }
+ else if (t == G_UNICODE_TITLECASE_LETTER)
+ {
+ unsigned int i;
+ for (i = 0; i < G_N_ELEMENTS (title_table); ++i)
+ {
+ if (title_table[i][0] == c)
+ return title_table[i][1];
+ }
+ }
+ return c;
+}
+
+/**
+ * g_unichar_tolower:
+ * @c: a Unicode character.
+ *
+ * Converts a character to lower case.
+ *
+ * Return value: the result of converting @c to lower case.
+ * If @c is not an upperlower or titlecase character,
+ * or has no lowercase equivalent @c is returned unchanged.
+ **/
+gunichar
+g_unichar_tolower (gunichar c)
+{
+ int t = TYPE (c);
+ if (t == G_UNICODE_UPPERCASE_LETTER)
+ {
+ gunichar val = ATTTABLE (c >> 8, c & 0xff);
+ if (val >= 0x1000000)
+ {
+ const gchar *p = special_case_table + val - 0x1000000;
+ return g_utf8_get_char (p);
+ }
+ else
+ {
+ /* Not all uppercase letters are guaranteed to have a lowercase
+ * equivalent. If this is the case, val will be zero. */
+ return val ? val : c;
+ }
+ }
+ else if (t == G_UNICODE_TITLECASE_LETTER)
+ {
+ unsigned int i;
+ for (i = 0; i < G_N_ELEMENTS (title_table); ++i)
+ {
+ if (title_table[i][0] == c)
+ return title_table[i][2];
+ }
+ }
+ return c;
+}
+
+/**
+ * g_unichar_totitle:
+ * @c: a Unicode character
+ *
+ * Converts 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 < G_N_ELEMENTS (title_table); ++i)
+ {
+ if (title_table[i][0] == c || title_table[i][1] == c
+ || title_table[i][2] == c)
+ return title_table[i][0];
+ }
+
+ if (TYPE (c) == G_UNICODE_LOWERCASE_LETTER)
+ return g_unichar_toupper (c);
+
+ return c;
+}
+
+/**
+ * g_unichar_digit_value:
+ * @c: a Unicode character
+ *
+ * Determines the numeric value of a character as a decimal
+ * digit.
+ *
+ * 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
+ * digit.
+ *
+ * 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' + 10;
+ if (c >= 'a' && c <= 'f')
+ return c - 'a' + 10;
+ 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);
+}
+
+/*
+ * Case mapping functions
+ */
+
+typedef enum {
+ LOCALE_NORMAL,
+ LOCALE_TURKIC,
+ LOCALE_LITHUANIAN
+} LocaleType;
+
+static LocaleType
+get_locale_type (void)
+{
+#ifdef G_OS_WIN32
+ char *tem = g_win32_getlocale ();
+ char locale[2];
+
+ locale[0] = tem[0];
+ locale[1] = tem[1];
+ g_free (tem);
+#else
+ const char *locale = setlocale (LC_CTYPE, NULL);
+#endif
+
+ switch (locale[0])
+ {
+ case 'a':
+ if (locale[1] == 'z')
+ return LOCALE_TURKIC;
+ break;
+ case 'l':
+ if (locale[1] == 't')
+ return LOCALE_LITHUANIAN;
+ break;
+ case 't':
+ if (locale[1] == 'r')
+ return LOCALE_TURKIC;
+ break;
+ }
+
+ return LOCALE_NORMAL;
+}
+
+static gint
+output_marks (const char **p_inout,
+ char *out_buffer,
+ gboolean remove_dot)
+{
+ const char *p = *p_inout;
+ gint len = 0;
+
+ while (*p)
+ {
+ gunichar c = g_utf8_get_char (p);
+
+ if (ISMARK (TYPE (c)))
+ {
+ if (!remove_dot || c != 0x307 /* COMBINING DOT ABOVE */)
+ len += g_unichar_to_utf8 (c, out_buffer ? out_buffer + len : NULL);
+ p = g_utf8_next_char (p);
+ }
+ else
+ break;
+ }
+
+ *p_inout = p;
+ return len;
+}
+
+static gint
+output_special_case (gchar *out_buffer,
+ int offset,
+ int type,
+ int which)
+{
+ const gchar *p = special_case_table + offset;
+ gint len;
+
+ if (type != G_UNICODE_TITLECASE_LETTER)
+ p = g_utf8_next_char (p);
+
+ if (which == 1)
+ p += strlen (p) + 1;
+
+ len = strlen (p);
+ if (out_buffer)
+ memcpy (out_buffer, p, len);
+
+ return len;
+}
+
+static gsize
+real_toupper (const gchar *str,
+ gssize max_len,
+ gchar *out_buffer,
+ LocaleType locale_type)
+{
+ const gchar *p = str;
+ const char *last = NULL;
+ gsize len = 0;
+ gboolean last_was_i = FALSE;
+
+ while ((max_len < 0 || p < str + max_len) && *p)
+ {
+ gunichar c = g_utf8_get_char (p);
+ int t = TYPE (c);
+ gunichar val;
+
+ last = p;
+ p = g_utf8_next_char (p);
+
+ if (locale_type == LOCALE_LITHUANIAN)
+ {
+ if (c == 'i')
+ last_was_i = TRUE;
+ else
+ {
+ if (last_was_i)
+ {
+ /* Nasty, need to remove any dot above. Though
+ * I think only E WITH DOT ABOVE occurs in practice
+ * which could simplify this considerably.
+ */
+ gsize decomp_len, i;
+ gunichar *decomp;
+
+ decomp = g_unicode_canonical_decomposition (c, &decomp_len);
+ for (i=0; i < decomp_len; i++)
+ {
+ if (decomp[i] != 0x307 /* COMBINING DOT ABOVE */)
+ len += g_unichar_to_utf8 (g_unichar_toupper (decomp[i]), out_buffer ? out_buffer + len : NULL);
+ }
+ g_free (decomp);
+
+ len += output_marks (&p, out_buffer ? out_buffer + len : NULL, TRUE);
+
+ continue;
+ }
+
+ if (!ISMARK (t))
+ last_was_i = FALSE;
+ }
+ }
+
+ if (locale_type == LOCALE_TURKIC && c == 'i')
+ {
+ /* i => LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ len += g_unichar_to_utf8 (0x130, out_buffer ? out_buffer + len : NULL);
+ }
+ else if (c == 0x0345) /* COMBINING GREEK YPOGEGRAMMENI */
+ {
+ /* Nasty, need to move it after other combining marks .. this would go away if
+ * we normalized first.
+ */
+ len += output_marks (&p, out_buffer ? out_buffer + len : NULL, FALSE);
+
+ /* And output as GREEK CAPITAL LETTER IOTA */
+ len += g_unichar_to_utf8 (0x399, out_buffer ? out_buffer + len : NULL);
+ }
+ else if (IS (t,
+ OR (G_UNICODE_LOWERCASE_LETTER,
+ OR (G_UNICODE_TITLECASE_LETTER,
+ 0))))
+ {
+ val = ATTTABLE (c >> 8, c & 0xff);
+
+ if (val >= 0x1000000)
+ {
+ len += output_special_case (out_buffer ? out_buffer + len : NULL, val - 0x1000000, t,
+ t == G_UNICODE_LOWERCASE_LETTER ? 0 : 1);
+ }
+ else
+ {
+ if (t == G_UNICODE_TITLECASE_LETTER)
+ {
+ unsigned int i;
+ for (i = 0; i < G_N_ELEMENTS (title_table); ++i)
+ {
+ if (title_table[i][0] == c)
+ {
+ val = title_table[i][1];
+ break;
+ }
+ }
+ }
+
+ /* Some lowercase letters, e.g., U+000AA, FEMININE ORDINAL INDICATOR,
+ * do not have an uppercase equivalent, in which case val will be
+ * zero. */
+ len += g_unichar_to_utf8 (val ? val : c, out_buffer ? out_buffer + len : NULL);
+ }
+ }
+ else
+ {
+ gsize char_len = g_utf8_skip[*(guchar *)last];
+
+ if (out_buffer)
+ memcpy (out_buffer + len, last, char_len);
+
+ len += char_len;
+ }
+
+ }
+
+ return len;
+}
+
+/**
+ * g_utf8_strup:
+ * @str: a UTF-8 encoded string
+ * @len: length of @str, in bytes, or -1 if @str is nul-terminated.
+ *
+ * Converts all Unicode characters in the string that have a case
+ * to uppercase. The exact manner that this is done depends
+ * on the current locale, and may result in the number of
+ * characters in the string increasing. (For instance, the
+ * German ess-zet will be changed to SS.)
+ *
+ * Return value: a newly allocated string, with all characters
+ * converted to uppercase.
+ **/
+gchar *
+g_utf8_strup (const gchar *str,
+ gssize len)
+{
+ gsize result_len;
+ LocaleType locale_type;
+ gchar *result;
+
+ g_return_val_if_fail (str != NULL, NULL);
+
+ locale_type = get_locale_type ();
+
+ /*
+ * We use a two pass approach to keep memory management simple
+ */
+ result_len = real_toupper (str, len, NULL, locale_type);
+ result = g_malloc (result_len + 1);
+ real_toupper (str, len, result, locale_type);
+ result[result_len] = '\0';
+
+ return result;
+}
+
+/* traverses the string checking for characters with combining class == 230
+ * until a base character is found */
+static gboolean
+has_more_above (const gchar *str)
+{
+ const gchar *p = str;
+ gint combining_class;
+
+ while (*p)
+ {
+ combining_class = _g_unichar_combining_class (g_utf8_get_char (p));
+ if (combining_class == 230)
+ return TRUE;
+ else if (combining_class == 0)
+ break;
+
+ p = g_utf8_next_char (p);
+ }
+
+ return FALSE;
+}
+
+static gsize
+real_tolower (const gchar *str,
+ gssize max_len,
+ gchar *out_buffer,
+ LocaleType locale_type)
+{
+ const gchar *p = str;
+ const char *last = NULL;
+ gsize len = 0;
+
+ while ((max_len < 0 || p < str + max_len) && *p)
+ {
+ gunichar c = g_utf8_get_char (p);
+ int t = TYPE (c);
+ gunichar val;
+
+ last = p;
+ p = g_utf8_next_char (p);
+
+ if (locale_type == LOCALE_TURKIC && c == 'I')
+ {
+ if (g_utf8_get_char (p) == 0x0307)
+ {
+ /* I + COMBINING DOT ABOVE => i (U+0069) */
+ len += g_unichar_to_utf8 (0x0069, out_buffer ? out_buffer + len : NULL);
+ p = g_utf8_next_char (p);
+ }
+ else
+ {
+ /* I => LATIN SMALL LETTER DOTLESS I */
+ len += g_unichar_to_utf8 (0x131, out_buffer ? out_buffer + len : NULL);
+ }
+ }
+ /* Introduce an explicit dot above when lowercasing capital I's and J's
+ * whenever there are more accents above. [SpecialCasing.txt] */
+ else if (locale_type == LOCALE_LITHUANIAN &&
+ (c == 0x00cc || c == 0x00cd || c == 0x0128))
+ {
+ len += g_unichar_to_utf8 (0x0069, out_buffer ? out_buffer + len : NULL);
+ len += g_unichar_to_utf8 (0x0307, out_buffer ? out_buffer + len : NULL);
+
+ switch (c)
+ {
+ case 0x00cc:
+ len += g_unichar_to_utf8 (0x0300, out_buffer ? out_buffer + len : NULL);
+ break;
+ case 0x00cd:
+ len += g_unichar_to_utf8 (0x0301, out_buffer ? out_buffer + len : NULL);
+ break;
+ case 0x0128:
+ len += g_unichar_to_utf8 (0x0303, out_buffer ? out_buffer + len : NULL);
+ break;
+ }
+ }
+ else if (locale_type == LOCALE_LITHUANIAN &&
+ (c == 'I' || c == 'J' || c == 0x012e) &&
+ has_more_above (p))
+ {
+ len += g_unichar_to_utf8 (g_unichar_tolower (c), out_buffer ? out_buffer + len : NULL);
+ len += g_unichar_to_utf8 (0x0307, out_buffer ? out_buffer + len : NULL);
+ }
+ else if (c == 0x03A3) /* GREEK CAPITAL LETTER SIGMA */
+ {
+ if ((max_len < 0 || p < str + max_len) && *p)
+ {
+ gunichar next_c = g_utf8_get_char (p);
+ int next_type = TYPE(next_c);
+
+ /* SIGMA mapps differently depending on whether it is
+ * final or not. The following simplified test would
+ * fail in the case of combining marks following the
+ * sigma, but I don't think that occurs in real text.
+ * The test here matches that in ICU.
+ */
+ if (ISALPHA (next_type)) /* Lu,Ll,Lt,Lm,Lo */
+ val = 0x3c3; /* GREEK SMALL SIGMA */
+ else
+ val = 0x3c2; /* GREEK SMALL FINAL SIGMA */
+ }
+ else
+ val = 0x3c2; /* GREEK SMALL FINAL SIGMA */
+
+ len += g_unichar_to_utf8 (val, out_buffer ? out_buffer + len : NULL);
+ }
+ else if (IS (t,
+ OR (G_UNICODE_UPPERCASE_LETTER,
+ OR (G_UNICODE_TITLECASE_LETTER,
+ 0))))
+ {
+ val = ATTTABLE (c >> 8, c & 0xff);
+
+ if (val >= 0x1000000)
+ {
+ len += output_special_case (out_buffer ? out_buffer + len : NULL, val - 0x1000000, t, 0);
+ }
+ else
+ {
+ if (t == G_UNICODE_TITLECASE_LETTER)
+ {
+ unsigned int i;
+ for (i = 0; i < G_N_ELEMENTS (title_table); ++i)
+ {
+ if (title_table[i][0] == c)
+ {
+ val = title_table[i][2];
+ break;
+ }
+ }
+ }
+
+ /* Not all uppercase letters are guaranteed to have a lowercase
+ * equivalent. If this is the case, val will be zero. */
+ len += g_unichar_to_utf8 (val ? val : c, out_buffer ? out_buffer + len : NULL);
+ }
+ }
+ else
+ {
+ gsize char_len = g_utf8_skip[*(guchar *)last];
+
+ if (out_buffer)
+ memcpy (out_buffer + len, last, char_len);
+
+ len += char_len;
+ }
+
+ }
+
+ return len;
+}
+
+/**
+ * g_utf8_strdown:
+ * @str: a UTF-8 encoded string
+ * @len: length of @str, in bytes, or -1 if @str is nul-terminated.
+ *
+ * Converts all Unicode characters in the string that have a case
+ * to lowercase. The exact manner that this is done depends
+ * on the current locale, and may result in the number of
+ * characters in the string changing.
+ *
+ * Return value: a newly allocated string, with all characters
+ * converted to lowercase.
+ **/
+gchar *
+g_utf8_strdown (const gchar *str,
+ gssize len)
+{
+ gsize result_len;
+ LocaleType locale_type;
+ gchar *result;
+
+ g_return_val_if_fail (str != NULL, NULL);
+
+ locale_type = get_locale_type ();
+
+ /*
+ * We use a two pass approach to keep memory management simple
+ */
+ result_len = real_tolower (str, len, NULL, locale_type);
+ result = g_malloc (result_len + 1);
+ real_tolower (str, len, result, locale_type);
+ result[result_len] = '\0';
+
+ return result;
+}
+
+/**
+ * g_utf8_casefold:
+ * @str: a UTF-8 encoded string
+ * @len: length of @str, in bytes, or -1 if @str is nul-terminated.
+ *
+ * Converts a string into a form that is independent of case. The
+ * result will not correspond to any particular case, but can be
+ * compared for equality or ordered with the results of calling
+ * g_utf8_casefold() on other strings.
+ *
+ * Note that calling g_utf8_casefold() followed by g_utf8_collate() is
+ * only an approximation to the correct linguistic case insensitive
+ * ordering, though it is a fairly good one. Getting this exactly
+ * right would require a more sophisticated collation function that
+ * takes case sensitivity into account. GLib does not currently
+ * provide such a function.
+ *
+ * Return value: a newly allocated string, that is a
+ * case independent form of @str.
+ **/
+gchar *
+g_utf8_casefold (const gchar *str,
+ gssize len)
+{
+ GString *result;
+ const char *p;
+
+ g_return_val_if_fail (str != NULL, NULL);
+
+ result = g_string_new (NULL);
+ p = str;
+ while ((len < 0 || p < str + len) && *p)
+ {
+ gunichar ch = g_utf8_get_char (p);
+
+ int start = 0;
+ int end = G_N_ELEMENTS (casefold_table);
+
+ if (ch >= casefold_table[start].ch &&
+ ch <= casefold_table[end - 1].ch)
+ {
+ while (TRUE)
+ {
+ int half = (start + end) / 2;
+ if (ch == casefold_table[half].ch)
+ {
+ g_string_append (result, casefold_table[half].data);
+ goto next;
+ }
+ else if (half == start)
+ break;
+ else if (ch > casefold_table[half].ch)
+ start = half;
+ else
+ end = half;
+ }
+ }
+
+ g_string_append_unichar (result, g_unichar_tolower (ch));
+
+ next:
+ p = g_utf8_next_char (p);
+ }
+
+ return g_string_free (result, FALSE);
+}
+
+/**
+ * g_unichar_get_mirror_char:
+ * @ch: a Unicode character
+ * @mirrored_ch: location to store the mirrored character
+ *
+ * In Unicode, some characters are <firstterm>mirrored</firstterm>. This
+ * means that their images are mirrored horizontally in text that is laid
+ * out from right to left. For instance, "(" would become its mirror image,
+ * ")", in right-to-left text.
+ *
+ * If @ch has the Unicode mirrored property and there is another unicode
+ * character that typically has a glyph that is the mirror image of @ch's
+ * glyph and @mirrored_ch is set, it puts that character in the address
+ * pointed to by @mirrored_ch. Otherwise the original character is put.
+ *
+ * Return value: %TRUE if @ch has a mirrored character, %FALSE otherwise
+ *
+ * Since: 2.4
+ **/
+gboolean
+g_unichar_get_mirror_char (gunichar ch,
+ gunichar *mirrored_ch)
+{
+ gboolean found;
+ gunichar mirrored;
+
+ mirrored = GLIB_GET_MIRRORING(ch);
+
+ found = ch != mirrored;
+ if (mirrored_ch)
+ *mirrored_ch = mirrored;
+
+ return found;
+
+}
+
+#define G_SCRIPT_TABLE_MIDPOINT (G_N_ELEMENTS (g_script_table) / 2)
+
+static inline GUnicodeScript
+g_unichar_get_script_bsearch (gunichar ch)
+{
+ int lower = 0;
+ int upper = G_N_ELEMENTS (g_script_table) - 1;
+ static int saved_mid = G_SCRIPT_TABLE_MIDPOINT;
+ int mid = saved_mid;
+
+
+ do
+ {
+ if (ch < g_script_table[mid].start)
+ upper = mid - 1;
+ else if (ch >= g_script_table[mid].start + g_script_table[mid].chars)
+ lower = mid + 1;
+ else
+ return g_script_table[saved_mid = mid].script;
+
+ mid = (lower + upper) / 2;
+ }
+ while (lower <= upper);
+
+ return G_UNICODE_SCRIPT_UNKNOWN;
+}
+
+/**
+ * g_unichar_get_script:
+ * @ch: a Unicode character
+ *
+ * Looks up the #GUnicodeScript for a particular character (as defined
+ * by Unicode Standard Annex #24). No check is made for @ch being a
+ * valid Unicode character; if you pass in invalid character, the
+ * result is undefined.
+ *
+ * Return value: the #GUnicodeScript for the character.
+ *
+ * Since: 2.14
+ */
+GUnicodeScript
+g_unichar_get_script (gunichar ch)
+{
+ if (ch < G_EASY_SCRIPTS_RANGE)
+ return g_script_easy_table[ch];
+ else
+ return g_unichar_get_script_bsearch (ch);
+}
+
+
+#define __G_UNIPROP_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gutf8.c b/trunk/glib/gutf8.c
new file mode 100644
index 000000000..7ff31a108
--- /dev/null
+++ b/trunk/glib/gutf8.c
@@ -0,0 +1,1851 @@
+/* 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 "config.h"
+
+#include <stdlib.h>
+#ifdef HAVE_CODESET
+#include <langinfo.h>
+#endif
+#include <string.h>
+
+#include "glib.h"
+
+#ifdef G_PLATFORM_WIN32
+#include <stdio.h>
+#define STRICT
+#include <windows.h>
+#undef STRICT
+#endif
+
+#include "libcharset/libcharset.h"
+
+#include "glibintl.h"
+#include "galias.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) & 0xFFFFF800) != 0xD800) && \
+ ((Char) < 0xFDD0 || (Char) > 0xFDEF) && \
+ ((Char) & 0xFFFE) != 0xFFFE)
+
+
+static const gchar utf8_skip_data[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,1,1
+};
+
+const gchar * const g_utf8_skip = utf8_skip_data;
+
+/**
+ * g_utf8_find_prev_char:
+ * @str: pointer to the beginning of a UTF-8 encoded 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 @str 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.
+ *
+ * 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 nul-terminated, in which case
+ * the returned value will be
+ *
+ * Finds 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 character. 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
+ *
+ * Finds 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 encoded string.
+ * @max: the maximum number of bytes to examine. If @max
+ * is less than 0, then the string is assumed to be
+ * nul-terminated. If @max is 0, @p will not be examined and
+ * may be %NULL.
+ *
+ * Returns the length of the string in characters.
+ *
+ * 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;
+ g_return_val_if_fail (p != NULL || max == 0, 0);
+
+ 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
+ *
+ * Converts 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. If you are not sure that the bytes are complete
+ * valid Unicode characters, you should use g_utf8_get_char_validated()
+ * instead.
+ *
+ * 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 @str
+ *
+ * Converts from an integer character offset to a pointer to a position
+ * within the string.
+ *
+ * Since 2.10, this function allows to pass a negative @offset to
+ * step backwards. It is usually worth stepping backwards from the end
+ * instead of forwards if @offset is in the last fourth of the string,
+ * since moving forward is about 3 times faster than moving backward.
+ *
+ * Return value: the resulting pointer
+ **/
+gchar *
+g_utf8_offset_to_pointer (const gchar *str,
+ glong offset)
+{
+ const gchar *s = str;
+
+ if (offset > 0)
+ while (offset--)
+ s = g_utf8_next_char (s);
+ else
+ {
+ const char *s1;
+
+ /* This nice technique for fast backwards stepping
+ * through a UTF-8 string was dubbed "stutter stepping"
+ * by its inventor, Larry Ewing.
+ */
+ while (offset)
+ {
+ s1 = s;
+ s += offset;
+ while ((*s & 0xc0) == 0x80)
+ s--;
+
+ offset += g_utf8_pointer_to_offset (s, s1);
+ }
+ }
+
+ 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.
+ *
+ * Since 2.10, this function allows @pos to be before @str, and returns
+ * a negative offset in this case.
+ *
+ * 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;
+
+ if (pos < str)
+ offset = - g_utf8_pointer_to_offset (pos, str);
+ else
+ 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 encoded 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,
+ gsize 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;
+}
+
+G_LOCK_DEFINE_STATIC (aliases);
+
+static GHashTable *
+get_alias_hash (void)
+{
+ static GHashTable *alias_hash = NULL;
+ const char *aliases;
+
+ G_LOCK (aliases);
+
+ if (!alias_hash)
+ {
+ alias_hash = g_hash_table_new (g_str_hash, g_str_equal);
+
+ aliases = _g_locale_get_charset_aliases ();
+ while (*aliases != '\0')
+ {
+ const char *canonical;
+ const char *alias;
+ const char **alias_array;
+ int count = 0;
+
+ alias = aliases;
+ aliases += strlen (aliases) + 1;
+ canonical = aliases;
+ aliases += strlen (aliases) + 1;
+
+ alias_array = g_hash_table_lookup (alias_hash, canonical);
+ if (alias_array)
+ {
+ while (alias_array[count])
+ count++;
+ }
+
+ alias_array = g_renew (const char *, alias_array, count + 2);
+ alias_array[count] = alias;
+ alias_array[count + 1] = NULL;
+
+ g_hash_table_insert (alias_hash, (char *)canonical, alias_array);
+ }
+ }
+
+ G_UNLOCK (aliases);
+
+ return alias_hash;
+}
+
+/* As an abuse of the alias table, the following routines gets
+ * the charsets that are aliases for the canonical name.
+ */
+G_GNUC_INTERNAL const char **
+_g_charset_get_aliases (const char *canonical_name)
+{
+ GHashTable *alias_hash = get_alias_hash ();
+
+ return g_hash_table_lookup (alias_hash, canonical_name);
+}
+
+static gboolean
+g_utf8_get_charset_internal (const char *raw_data,
+ const char **a)
+{
+ const char *charset = getenv("CHARSET");
+
+ if (charset && *charset)
+ {
+ *a = charset;
+
+ if (charset && strstr (charset, "UTF-8"))
+ return TRUE;
+ else
+ return FALSE;
+ }
+
+ /* The libcharset code tries to be thread-safe without
+ * a lock, but has a memory leak and a missing memory
+ * barrier, so we lock for it
+ */
+ G_LOCK (aliases);
+ charset = _g_locale_charset_unalias (raw_data);
+ G_UNLOCK (aliases);
+
+ if (charset && *charset)
+ {
+ *a = charset;
+
+ if (charset && strstr (charset, "UTF-8"))
+ return TRUE;
+ else
+ return FALSE;
+ }
+
+ /* Assume this for compatibility at present. */
+ *a = "US-ASCII";
+
+ return FALSE;
+}
+
+typedef struct _GCharsetCache GCharsetCache;
+
+struct _GCharsetCache {
+ gboolean is_utf8;
+ gchar *raw;
+ gchar *charset;
+};
+
+static void
+charset_cache_free (gpointer data)
+{
+ GCharsetCache *cache = data;
+ g_free (cache->raw);
+ g_free (cache->charset);
+ g_free (cache);
+}
+
+/**
+ * g_get_charset:
+ * @charset: return location for character set name
+ *
+ * Obtains the character set for the <link linkend="setlocale">current
+ * locale</link>; 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)
+{
+ static GStaticPrivate cache_private = G_STATIC_PRIVATE_INIT;
+ GCharsetCache *cache = g_static_private_get (&cache_private);
+ const gchar *raw;
+
+ if (!cache)
+ {
+ cache = g_new0 (GCharsetCache, 1);
+ g_static_private_set (&cache_private, cache, charset_cache_free);
+ }
+
+ raw = _g_locale_charset_raw ();
+
+ if (!(cache->raw && strcmp (cache->raw, raw) == 0))
+ {
+ const gchar *new_charset;
+
+ g_free (cache->raw);
+ g_free (cache->charset);
+ cache->raw = g_strdup (raw);
+ cache->is_utf8 = g_utf8_get_charset_internal (raw, &new_charset);
+ cache->charset = g_strdup (new_charset);
+ }
+
+ if (charset)
+ *charset = cache->charset;
+
+ return cache->is_utf8;
+}
+
+/* unicode_strchr */
+
+/**
+ * g_unichar_to_utf8:
+ * @c: a Unicode 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 @outbuf.
+ *
+ * Converts a single character to UTF-8.
+ *
+ * Return value: number of bytes written
+ **/
+int
+g_unichar_to_utf8 (gunichar c,
+ gchar *outbuf)
+{
+ /* If this gets modified, also update the copy in g_string_insert_unichar() */
+ 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 encoded string
+ * @len: the maximum length of @p
+ * @c: a Unicode character
+ *
+ * Finds the leftmost occurrence of the given Unicode character
+ * in a UTF-8 encoded string, while limiting the search to @len bytes.
+ * If @len is -1, allow unbounded search.
+ *
+ * Return value: %NULL if the string does not contain the character,
+ * otherwise, a pointer to the start of the leftmost occurrence of
+ * the character in the string.
+ **/
+gchar *
+g_utf8_strchr (const char *p,
+ gssize len,
+ gunichar c)
+{
+ gchar ch[10];
+
+ gint charlen = g_unichar_to_utf8 (c, ch);
+ ch[charlen] = '\0';
+
+ return g_strstr_len (p, len, ch);
+}
+
+
+/**
+ * g_utf8_strrchr:
+ * @p: a nul-terminated UTF-8 encoded string
+ * @len: the maximum length of @p
+ * @c: a Unicode character
+ *
+ * Find the rightmost occurrence of the given Unicode character
+ * in a UTF-8 encoded string, while limiting the search to @len bytes.
+ * If @len is -1, allow unbounded search.
+ *
+ * Return value: %NULL if the string does not contain the character,
+ * otherwise, a pointer to the start of the rightmost occurrence of the
+ * character in the string.
+ **/
+gchar *
+g_utf8_strrchr (const char *p,
+ gssize len,
+ gunichar c)
+{
+ gchar ch[10];
+
+ gint charlen = g_unichar_to_utf8 (c, ch);
+ ch[charlen] = '\0';
+
+ return g_strrstr_len (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,
+ gssize 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_get_char_validated:
+ * @p: a pointer to Unicode character encoded as UTF-8
+ * @max_len: the maximum number of bytes to read, or -1, for no maximum or
+ * if @p is nul-terminated
+ *
+ * Convert a sequence of bytes encoded as UTF-8 to a Unicode character.
+ * This function checks for incomplete characters, for invalid characters
+ * such as characters that are out of the range of Unicode, and for
+ * overlong encodings of valid characters.
+ *
+ * Return value: the resulting character. If @p points to a partial
+ * sequence at the end of a string that could begin a valid
+ * character (or if @max_len is zero), returns (gunichar)-2;
+ * otherwise, if @p does not point to a valid UTF-8 encoded
+ * Unicode character, returns (gunichar)-1.
+ **/
+gunichar
+g_utf8_get_char_validated (const gchar *p,
+ gssize max_len)
+{
+ gunichar result;
+
+ if (max_len == 0)
+ return (gunichar)-2;
+
+ result = g_utf8_get_char_extended (p, max_len);
+
+ if (result & 0x80000000)
+ return result;
+ else if (!UNICODE_VALID (result))
+ return (gunichar)-1;
+ else
+ return result;
+}
+
+/**
+ * g_utf8_to_ucs4_fast:
+ * @str: a UTF-8 encoded string
+ * @len: the maximum length of @str to use. If @len < 0, then
+ * the string is nul-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 @len < 0, then
+ * the string is nul-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, len < 0 ? 6 : 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 (number of characters) of @str to use.
+ * If @len < 0, then the string is terminated with a 0 character.
+ * @items_read: location to store number of characters 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. In that case, @items_read will be
+ * set to the position of the first invalid input
+ * character.
+ **/
+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)
+ {
+ 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 (number of <type>gunichar2</type>) of @str to use.
+ * If @len < 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.
+ *
+ * Note that the input is expected to be already in native endianness,
+ * an initial byte-order-mark character is not handled specially.
+ * g_convert() can be used to convert a byte buffer of UTF-16 data of
+ * ambiguous endianess.
+ *
+ * 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 (number of <type>gunichar2</type>) of @str to use.
+ * If @len < 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 (number of characters) of @str to use.
+ * If @len < 0, then the string is nul-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 <type>gunichar2</type> written,
+ * or %NULL.
+ * The value stored here does not include the trailing 0.
+ * @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 character 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, len < 0 ? 6 : 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 (number of characters) of @str to use.
+ * If @len < 0, then the string is terminated with a 0 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 <type>gunichar2</type>
+ * written, or %NULL. The value stored here does not
+ * include the trailing 0.
+ * @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 character 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;
+}
+
+#define CONTINUATION_CHAR \
+ G_STMT_START { \
+ if ((*(guchar *)p & 0xc0) != 0x80) /* 10xxxxxx */ \
+ goto error; \
+ val <<= 6; \
+ val |= (*(guchar *)p) & 0x3f; \
+ } G_STMT_END
+
+static const gchar *
+fast_validate (const char *str)
+
+{
+ gunichar val = 0;
+ gunichar min = 0;
+ const gchar *p;
+
+ for (p = str; *p; p++)
+ {
+ if (*(guchar *)p < 128)
+ /* done */;
+ else
+ {
+ const gchar *last;
+
+ last = p;
+ if ((*(guchar *)p & 0xe0) == 0xc0) /* 110xxxxx */
+ {
+ if (G_UNLIKELY ((*(guchar *)p & 0x1e) == 0))
+ goto error;
+ p++;
+ if (G_UNLIKELY ((*(guchar *)p & 0xc0) != 0x80)) /* 10xxxxxx */
+ goto error;
+ }
+ else
+ {
+ if ((*(guchar *)p & 0xf0) == 0xe0) /* 1110xxxx */
+ {
+ min = (1 << 11);
+ val = *(guchar *)p & 0x0f;
+ goto TWO_REMAINING;
+ }
+ else if ((*(guchar *)p & 0xf8) == 0xf0) /* 11110xxx */
+ {
+ min = (1 << 16);
+ val = *(guchar *)p & 0x07;
+ }
+ else
+ goto error;
+
+ p++;
+ CONTINUATION_CHAR;
+ TWO_REMAINING:
+ p++;
+ CONTINUATION_CHAR;
+ p++;
+ CONTINUATION_CHAR;
+
+ if (G_UNLIKELY (val < min))
+ goto error;
+
+ if (G_UNLIKELY (!UNICODE_VALID(val)))
+ goto error;
+ }
+
+ continue;
+
+ error:
+ return last;
+ }
+ }
+
+ return p;
+}
+
+static const gchar *
+fast_validate_len (const char *str,
+ gssize max_len)
+
+{
+ gunichar val = 0;
+ gunichar min = 0;
+ const gchar *p;
+
+ g_assert (max_len >= 0);
+
+ for (p = str; ((p - str) < max_len) && *p; p++)
+ {
+ if (*(guchar *)p < 128)
+ /* done */;
+ else
+ {
+ const gchar *last;
+
+ last = p;
+ if ((*(guchar *)p & 0xe0) == 0xc0) /* 110xxxxx */
+ {
+ if (G_UNLIKELY (max_len - (p - str) < 2))
+ goto error;
+
+ if (G_UNLIKELY ((*(guchar *)p & 0x1e) == 0))
+ goto error;
+ p++;
+ if (G_UNLIKELY ((*(guchar *)p & 0xc0) != 0x80)) /* 10xxxxxx */
+ goto error;
+ }
+ else
+ {
+ if ((*(guchar *)p & 0xf0) == 0xe0) /* 1110xxxx */
+ {
+ if (G_UNLIKELY (max_len - (p - str) < 3))
+ goto error;
+
+ min = (1 << 11);
+ val = *(guchar *)p & 0x0f;
+ goto TWO_REMAINING;
+ }
+ else if ((*(guchar *)p & 0xf8) == 0xf0) /* 11110xxx */
+ {
+ if (G_UNLIKELY (max_len - (p - str) < 4))
+ goto error;
+
+ min = (1 << 16);
+ val = *(guchar *)p & 0x07;
+ }
+ else
+ goto error;
+
+ p++;
+ CONTINUATION_CHAR;
+ TWO_REMAINING:
+ p++;
+ CONTINUATION_CHAR;
+ p++;
+ CONTINUATION_CHAR;
+
+ if (G_UNLIKELY (val < min))
+ goto error;
+ if (G_UNLIKELY (!UNICODE_VALID(val)))
+ goto error;
+ }
+
+ continue;
+
+ error:
+ return last;
+ }
+ }
+
+ return p;
+}
+
+/**
+ * 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 start of the first invalid
+ * character if some bytes were invalid, or the end of the text
+ * being validated otherwise).
+ *
+ * Note that g_utf8_validate() returns %FALSE if @max_len is
+ * positive and NUL is met before @max_len bytes have been read.
+ *
+ * Returns %TRUE if all of @str was valid. Many GLib and GTK+
+ * routines <emphasis>require</emphasis> valid UTF-8 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 char *str,
+ gssize max_len,
+ const gchar **end)
+
+{
+ const gchar *p;
+
+ if (max_len < 0)
+ p = fast_validate (str);
+ else
+ p = fast_validate_len (str, max_len);
+
+ if (end)
+ *end = p;
+
+ if ((max_len >= 0 && p != str + max_len) ||
+ (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);
+}
+
+/**
+ * g_utf8_strreverse:
+ * @str: a UTF-8 encoded string
+ * @len: the maximum length of @str to use. If @len < 0, then
+ * the string is nul-terminated.
+ *
+ * Reverses a UTF-8 string. @str must be valid UTF-8 encoded text.
+ * (Use g_utf8_validate() on all text before trying to use UTF-8
+ * utility functions with it.)
+ *
+ * Note that unlike g_strreverse(), this function returns
+ * newly-allocated memory, which should be freed with g_free() when
+ * no longer needed.
+ *
+ * Returns: a newly-allocated string which is the reverse of @str.
+ *
+ * Since: 2.2
+ */
+gchar *
+g_utf8_strreverse (const gchar *str,
+ gssize len)
+{
+ gchar *result;
+ const gchar *p;
+ gchar *m, *r, skip;
+
+ if (len < 0)
+ len = strlen (str);
+
+ result = g_new (gchar, len + 1);
+ r = result + len;
+ p = str;
+ while (*p)
+ {
+ skip = g_utf8_skip[*(guchar*)p];
+ r -= skip;
+ for (m = r; skip; skip--)
+ *m++ = *p++;
+ }
+ result[len] = 0;
+
+ return result;
+}
+
+
+gchar *
+_g_utf8_make_valid (const gchar *name)
+{
+ GString *string;
+ const gchar *remainder, *invalid;
+ gint remaining_bytes, valid_bytes;
+
+ string = NULL;
+ remainder = name;
+ remaining_bytes = strlen (name);
+
+ while (remaining_bytes != 0)
+ {
+ if (g_utf8_validate (remainder, remaining_bytes, &invalid))
+ break;
+ valid_bytes = invalid - remainder;
+
+ if (string == NULL)
+ string = g_string_sized_new (remaining_bytes);
+
+ g_string_append_len (string, remainder, valid_bytes);
+ /* append U+FFFD REPLACEMENT CHARACTER */
+ g_string_append (string, "\357\277\275");
+
+ remaining_bytes -= valid_bytes + 1;
+ remainder = invalid + 1;
+ }
+
+ if (string == NULL)
+ return g_strdup (name);
+
+ g_string_append (string, remainder);
+
+ g_assert (g_utf8_validate (string->str, -1, NULL));
+
+ return g_string_free (string, FALSE);
+}
+
+
+#define __G_UTF8_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gutils.c b/trunk/glib/gutils.c
new file mode 100644
index 000000000..6565e8eb1
--- /dev/null
+++ b/trunk/glib/gutils.c
@@ -0,0 +1,3352 @@
+/* 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.
+ */
+
+#include "config.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <locale.h>
+#include <string.h>
+#include <ctype.h> /* For tolower() */
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_PWD_H
+#include <pwd.h>
+#endif
+#include <sys/types.h>
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#ifdef HAVE_CRT_EXTERNS_H
+#include <crt_externs.h> /* for _NSGetEnviron */
+#endif
+
+/* implement gutils's inline functions
+ */
+#define G_IMPLEMENT_INLINES 1
+#define __G_UTILS_C__
+#include "glib.h"
+#include "gprintfint.h"
+#include "gthreadprivate.h"
+#include "galias.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 <windows.h>
+# undef STRICT
+# ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
+# define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 2
+# define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 4
+# endif
+# include <lmcons.h> /* For UNLEN */
+#endif /* G_PLATFORM_WIN32 */
+
+#ifdef G_OS_WIN32
+# include <direct.h>
+# include <shlobj.h>
+ /* older SDK (e.g. msvc 5.0) does not have these*/
+# ifndef CSIDL_INTERNET_CACHE
+# define CSIDL_INTERNET_CACHE 32
+# endif
+# ifndef CSIDL_COMMON_APPDATA
+# define CSIDL_COMMON_APPDATA 35
+# endif
+# ifndef CSIDL_COMMON_DOCUMENTS
+# define CSIDL_COMMON_DOCUMENTS 46
+# endif
+# ifndef CSIDL_PROFILE
+# define CSIDL_PROFILE 40
+# endif
+# include <process.h>
+#endif
+
+#ifdef HAVE_CARBON
+#include <CoreServices/CoreServices.h>
+#endif
+
+#ifdef HAVE_CODESET
+#include <langinfo.h>
+#endif
+
+#ifdef HAVE_BIND_TEXTDOMAIN_CODESET
+#include <libintl.h>
+#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;
+
+#ifdef G_PLATFORM_WIN32
+
+G_WIN32_DLLMAIN_FOR_DLL_NAME (static, dll_name)
+
+#endif
+
+/**
+ * glib_check_version:
+ * @required_major: the required major version.
+ * @required_minor: the required minor version.
+ * @required_micro: the required micro version.
+ *
+ * Checks that the GLib library in use is compatible with the
+ * given version. Generally you would pass in the constants
+ * #GLIB_MAJOR_VERSION, #GLIB_MINOR_VERSION, #GLIB_MICRO_VERSION
+ * as the three arguments to this function; that produces
+ * a check that the library in use is compatible with
+ * the version of GLib the application or module was compiled
+ * against.
+ *
+ * Compatibility is defined by two things: first the version
+ * of the running library is newer than the version
+ * @required_major.required_minor.@required_micro. Second
+ * the running library must be binary compatible with the
+ * version @required_major.required_minor.@required_micro
+ * (same major version.)
+ *
+ * Return value: %NULL if the GLib library is compatible with the
+ * given version, or a string describing the version mismatch.
+ * The returned string is owned by GLib and must not be modified
+ * or freed.
+ *
+ * Since: 2.6
+ **/
+const gchar *
+glib_check_version (guint required_major,
+ guint required_minor,
+ guint required_micro)
+{
+ gint glib_effective_micro = 100 * GLIB_MINOR_VERSION + GLIB_MICRO_VERSION;
+ gint required_effective_micro = 100 * required_minor + required_micro;
+
+ if (required_major > GLIB_MAJOR_VERSION)
+ return "GLib version too old (major mismatch)";
+ if (required_major < GLIB_MAJOR_VERSION)
+ return "GLib version too new (major mismatch)";
+ if (required_effective_micro < glib_effective_micro - GLIB_BINARY_AGE)
+ return "GLib version too new (micro mismatch)";
+ if (required_effective_micro > glib_effective_micro)
+ return "GLib version too old (micro mismatch)";
+ return NULL;
+}
+
+#if !defined (HAVE_MEMMOVE) && !defined (HAVE_WORKING_BCOPY)
+/**
+ * g_memmove:
+ * @dest: the destination address to copy the bytes to.
+ * @src: the source address to copy the bytes from.
+ * @len: the number of bytes to copy.
+ *
+ * Copies a block of memory @len bytes long, from @src to @dest.
+ * The source and destination areas may overlap.
+ *
+ * In order to use this function, you must include
+ * <filename>string.h</filename> yourself, because this macro will
+ * typically simply resolve to memmove() and GLib does not include
+ * <filename>string.h</filename> for you.
+ */
+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 */
+
+#ifdef G_OS_WIN32
+#undef g_atexit
+#endif
+
+/**
+ * g_atexit:
+ * @func: the function to call on normal program termination.
+ *
+ * Specifies a function to be called at normal program termination.
+ *
+ * Since GLib 2.8.2, on Windows g_atexit() actually is a preprocessor
+ * macro that maps to a call to the atexit() function in the C
+ * library. This means that in case the code that calls g_atexit(),
+ * i.e. atexit(), is in a DLL, the function will be called when the
+ * DLL is detached from the program. This typically makes more sense
+ * than that the function is called when the GLib DLL is detached,
+ * which happened earlier when g_atexit() was a function in the GLib
+ * DLL.
+ *
+ * The behaviour of atexit() in the context of dynamically loaded
+ * modules is not formally specified and varies wildly.
+ *
+ * On POSIX systems, calling g_atexit() (or atexit()) in a dynamically
+ * loaded module which is unloaded before the program terminates might
+ * well cause a crash at program exit.
+ *
+ * Some POSIX systems implement atexit() like Windows, and have each
+ * dynamically loaded module maintain an own atexit chain that is
+ * called when the module is unloaded.
+ *
+ * On other POSIX systems, before a dynamically loaded module is
+ * unloaded, the registered atexit functions (if any) residing in that
+ * module are called, regardless where the code that registered them
+ * resided. This is presumably the most robust approach.
+ *
+ * As can be seen from the above, for portability it's best to avoid
+ * calling g_atexit() (or atexit()) except in the main executable of a
+ * program.
+ */
+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
+
+static 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 ||
+ strchr (last_dot, '/') != NULL)
+ {
+ const gint program_length = strlen (program);
+ gchar *pathext = g_build_path (";",
+ ".exe;.cmd;.bat;.com",
+ g_getenv ("PATHEXT"),
+ NULL);
+ gchar *p;
+ gchar *decorated_program;
+ gchar *retval;
+
+ p = pathext;
+ do
+ {
+ gchar *q = my_strchrnul (p, ';');
+
+ decorated_program = g_malloc (program_length + (q-p) + 1);
+ memcpy (decorated_program, program, program_length);
+ memcpy (decorated_program+program_length, p, q-p);
+ decorated_program [program_length + (q-p)] = '\0';
+
+ retval = inner_find_program_in_path (decorated_program);
+ g_free (decorated_program);
+
+ if (retval != NULL)
+ {
+ g_free (pathext);
+ return retval;
+ }
+ p = q;
+ } while (*p++ != '\0');
+ g_free (pathext);
+ return NULL;
+ }
+ else
+ return inner_find_program_in_path (program);
+}
+
+#endif
+
+/**
+ * g_find_program_in_path:
+ * @program: a program name in the GLib file name encoding
+ *
+ * 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
+ * with the suffixes .exe, .cmd, .bat and .com, and the suffixes in
+ * the <envar>PATHEXT</envar> environment variable.
+ *
+ * On Windows, it looks for the file in the same way as CreateProcess()
+ * would. This means first in the directory where the executing
+ * 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 <envar>PATH</envar> environment
+ * variable. If the program is found, the return value contains the
+ * full name including the type suffix.
+ *
+ * Return value: absolute path, or %NULL
+ **/
+#ifdef G_OS_WIN32
+static gchar *
+inner_find_program_in_path (const gchar *program)
+#else
+gchar*
+g_find_program_in_path (const gchar *program)
+#endif
+{
+ const gchar *path, *p;
+ gchar *name, *freeme;
+#ifdef G_OS_WIN32
+ const gchar *path_copy;
+ gchar *filename = NULL, *appdir = NULL;
+ gchar *sysdir = NULL, *windir = NULL;
+ int n;
+ wchar_t wfilename[MAXPATHLEN], wsysdir[MAXPATHLEN],
+ wwindir[MAXPATHLEN];
+#endif
+ gsize len;
+ gsize 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
+#ifdef G_OS_WIN32
+ || strchr (program, '/') != NULL
+#endif
+ )
+ {
+ if (g_file_test (program, G_FILE_TEST_IS_EXECUTABLE) &&
+ !g_file_test (program, G_FILE_TEST_IS_DIR))
+ return g_strdup (program);
+ else
+ return NULL;
+ }
+
+ path = g_getenv ("PATH");
+#if defined(G_OS_UNIX) || defined(G_OS_BEOS)
+ 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
+ n = GetModuleFileNameW (NULL, wfilename, MAXPATHLEN);
+ if (n > 0 && n < MAXPATHLEN)
+ filename = g_utf16_to_utf8 (wfilename, -1, NULL, NULL, NULL);
+
+ n = GetSystemDirectoryW (wsysdir, MAXPATHLEN);
+ if (n > 0 && n < MAXPATHLEN)
+ sysdir = g_utf16_to_utf8 (wsysdir, -1, NULL, NULL, NULL);
+
+ n = GetWindowsDirectoryW (wwindir, MAXPATHLEN);
+ if (n > 0 && n < MAXPATHLEN)
+ windir = g_utf16_to_utf8 (wwindir, -1, NULL, NULL, NULL);
+
+ if (filename)
+ {
+ appdir = g_path_get_dirname (filename);
+ g_free (filename);
+ }
+
+ path = g_strdup (path);
+
+ if (windir)
+ {
+ const gchar *tem = path;
+ path = g_strconcat (windir, ";", path, NULL);
+ g_free ((gchar *) tem);
+ g_free (windir);
+ }
+
+ if (sysdir)
+ {
+ const gchar *tem = path;
+ path = g_strconcat (sysdir, ";", path, NULL);
+ g_free ((gchar *) tem);
+ g_free (sysdir);
+ }
+
+ {
+ const gchar *tem = path;
+ path = g_strconcat (".;", path, NULL);
+ g_free ((gchar *) tem);
+ }
+
+ if (appdir)
+ {
+ const gchar *tem = path;
+ path = g_strconcat (appdir, ";", path, NULL);
+ g_free ((gchar *) tem);
+ g_free (appdir);
+ }
+
+ path_copy = path;
+#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) &&
+ !g_file_test (startp, G_FILE_TEST_IS_DIR))
+ {
+ gchar *ret;
+ ret = g_strdup (startp);
+ g_free (freeme);
+#ifdef G_OS_WIN32
+ g_free ((gchar *) path_copy);
+#endif
+ return ret;
+ }
+ }
+ while (*p++ != '\0');
+
+ g_free (freeme);
+#ifdef G_OS_WIN32
+ g_free ((gchar *) path_copy);
+#endif
+
+ return NULL;
+}
+
+static gboolean
+debug_key_matches (const gchar *key,
+ const gchar *token,
+ guint length)
+{
+ for (; length; length--, key++, token++)
+ {
+ char k = (*key == '_') ? '-' : tolower (*key );
+ char t = (*token == '_') ? '-' : tolower (*token);
+
+ if (k != t)
+ return FALSE;
+ }
+
+ return *key == '\0';
+}
+
+/**
+ * g_parse_debug_string:
+ * @string: a list of debug options separated by colons, spaces, or
+ * commas; or the string "all" to set all flags.
+ * @keys: pointer to an array of #GDebugKey which associate
+ * strings with bit flags.
+ * @nkeys: the number of #GDebugKey<!-- -->s in the array.
+ *
+ * Parses a string containing debugging options
+ * into a %guint containing bit flags. This is used
+ * within GDK and GTK+ to parse the debug options passed on the
+ * command line or through environment variables.
+ *
+ * Returns: the combined set of bit flags.
+ */
+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);
+
+ /* this function is used by gmem.c/gslice.c initialization code,
+ * so introducing malloc dependencies here would require adaptions
+ * of those code portions.
+ */
+
+ if (!g_ascii_strcasecmp (string, "all"))
+ {
+ for (i=0; i<nkeys; i++)
+ result |= keys[i].value;
+ }
+ else
+ {
+ const gchar *p = string;
+ const gchar *q;
+
+ while (*p)
+ {
+ q = strpbrk (p, ":;, \t");
+ if (!q)
+ q = p + strlen(p);
+
+ for (i = 0; i < nkeys; i++)
+ if (debug_key_matches (keys[i].key, p, q - p))
+ result |= keys[i].value;
+
+ p = q;
+ if (*p)
+ p++;
+ }
+ }
+
+ return result;
+}
+
+/**
+ * g_basename:
+ * @file_name: the name of the file.
+ *
+ * Gets the name of the file without any leading directory components.
+ * It returns a pointer into the given file name string.
+ *
+ * Return value: the name of the file without any leading directory components.
+ *
+ * Deprecated:2.2: Use g_path_get_basename() instead, but notice that
+ * g_path_get_basename() allocates new memory for the returned string, unlike
+ * this function which returns a pointer into the argument.
+ **/
+G_CONST_RETURN gchar*
+g_basename (const gchar *file_name)
+{
+ register gchar *base;
+
+ g_return_val_if_fail (file_name != NULL, NULL);
+
+ base = strrchr (file_name, G_DIR_SEPARATOR);
+
+#ifdef G_OS_WIN32
+ {
+ gchar *q = strrchr (file_name, '/');
+ if (base == NULL || (q != NULL && q > base))
+ base = q;
+ }
+#endif
+
+ if (base)
+ return base + 1;
+
+#ifdef G_OS_WIN32
+ if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':')
+ return (gchar*) file_name + 2;
+#endif /* G_OS_WIN32 */
+
+ return (gchar*) file_name;
+}
+
+/**
+ * g_path_get_basename:
+ * @file_name: the name of the file.
+ *
+ * Gets the last component of the filename. If @file_name ends with a
+ * directory separator it gets the component before the last slash. If
+ * @file_name consists only of directory separators (and on Windows,
+ * possibly a drive letter), a single separator is returned. If
+ * @file_name is empty, it gets ".".
+ *
+ * Return value: a newly allocated string containing the last component of
+ * the filename.
+ */
+gchar*
+g_path_get_basename (const gchar *file_name)
+{
+ register gssize base;
+ register gssize last_nonslash;
+ gsize len;
+ gchar *retval;
+
+ g_return_val_if_fail (file_name != NULL, NULL);
+
+ if (file_name[0] == '\0')
+ /* empty string */
+ return g_strdup (".");
+
+ last_nonslash = strlen (file_name) - 1;
+
+ while (last_nonslash >= 0 && G_IS_DIR_SEPARATOR (file_name [last_nonslash]))
+ 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 && g_ascii_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 && !G_IS_DIR_SEPARATOR (file_name [base]))
+ base--;
+
+#ifdef G_OS_WIN32
+ if (base == -1 && g_ascii_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;
+}
+
+/**
+ * g_path_is_absolute:
+ * @file_name: a file name.
+ *
+ * Returns %TRUE if the given @file_name is an absolute file name,
+ * i.e. it contains a full path from the root directory such as "/usr/local"
+ * on UNIX or "C:\windows" on Windows systems.
+ *
+ * Returns: %TRUE if @file_name is an absolute path.
+ */
+gboolean
+g_path_is_absolute (const gchar *file_name)
+{
+ g_return_val_if_fail (file_name != NULL, FALSE);
+
+ if (G_IS_DIR_SEPARATOR (file_name[0]))
+ return TRUE;
+
+#ifdef G_OS_WIN32
+ /* Recognize drive letter on native Windows */
+ if (g_ascii_isalpha (file_name[0]) &&
+ file_name[1] == ':' && G_IS_DIR_SEPARATOR (file_name[2]))
+ return TRUE;
+#endif /* G_OS_WIN32 */
+
+ return FALSE;
+}
+
+/**
+ * g_path_skip_root:
+ * @file_name: a file name.
+ *
+ * Returns a pointer into @file_name after the root component, i.e. after
+ * the "/" in UNIX or "C:\" under Windows. If @file_name is not an absolute
+ * path it returns %NULL.
+ *
+ * Returns: a pointer into @file_name after the root component.
+ */
+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 or //server/share */
+ if (G_IS_DIR_SEPARATOR (file_name[0]) &&
+ G_IS_DIR_SEPARATOR (file_name[1]) &&
+ file_name[2] &&
+ !G_IS_DIR_SEPARATOR (file_name[2]))
+ {
+ gchar *p;
+
+ p = strchr (file_name + 2, G_DIR_SEPARATOR);
+#ifdef G_OS_WIN32
+ {
+ gchar *q = strchr (file_name + 2, '/');
+ if (p == NULL || (q != NULL && q < p))
+ p = q;
+ }
+#endif
+ if (p &&
+ p > file_name + 2 &&
+ p[1])
+ {
+ file_name = p + 1;
+
+ while (file_name[0] && !G_IS_DIR_SEPARATOR (file_name[0]))
+ file_name++;
+
+ /* Possibly skip a backslash after the share name */
+ if (G_IS_DIR_SEPARATOR (file_name[0]))
+ file_name++;
+
+ return (gchar *)file_name;
+ }
+ }
+#endif
+
+ /* Skip initial slashes */
+ if (G_IS_DIR_SEPARATOR (file_name[0]))
+ {
+ while (G_IS_DIR_SEPARATOR (file_name[0]))
+ file_name++;
+ return (gchar *)file_name;
+ }
+
+#ifdef G_OS_WIN32
+ /* Skip X:\ */
+ if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':' && G_IS_DIR_SEPARATOR (file_name[2]))
+ return (gchar *)file_name + 3;
+#endif
+
+ return NULL;
+}
+
+/**
+ * g_path_get_dirname:
+ * @file_name: the name of the file.
+ *
+ * Gets the directory components of a file name. If the file name has no
+ * directory components "." is returned. The returned string should be
+ * freed when no longer needed.
+ *
+ * Returns: the directory components of the file.
+ */
+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);
+#ifdef G_OS_WIN32
+ {
+ gchar *q = strrchr (file_name, '/');
+ if (base == NULL || (q != NULL && q > base))
+ base = q;
+ }
+#endif
+ if (!base)
+ {
+#ifdef G_OS_WIN32
+ if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':')
+ {
+ gchar drive_colon_dot[4];
+
+ drive_colon_dot[0] = file_name[0];
+ drive_colon_dot[1] = ':';
+ drive_colon_dot[2] = '.';
+ drive_colon_dot[3] = '\0';
+
+ return g_strdup (drive_colon_dot);
+ }
+#endif
+ return g_strdup (".");
+ }
+
+ while (base > file_name && G_IS_DIR_SEPARATOR (*base))
+ base--;
+
+#ifdef G_OS_WIN32
+ /* base points to the char before the last slash.
+ *
+ * In case file_name is the root of a drive (X:\) or a child of the
+ * root of a drive (X:\foo), include the slash.
+ *
+ * In case file_name is the root share of an UNC path
+ * (\\server\share), add a slash, returning \\server\share\ .
+ *
+ * In case file_name is a direct child of a share in an UNC path
+ * (\\server\share\foo), include the slash after the share name,
+ * returning \\server\share\ .
+ */
+ if (base == file_name + 1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':')
+ base++;
+ else if (G_IS_DIR_SEPARATOR (file_name[0]) &&
+ G_IS_DIR_SEPARATOR (file_name[1]) &&
+ file_name[2] &&
+ !G_IS_DIR_SEPARATOR (file_name[2]) &&
+ base >= file_name + 2)
+ {
+ const gchar *p = file_name + 2;
+ while (*p && !G_IS_DIR_SEPARATOR (*p))
+ p++;
+ if (p == base + 1)
+ {
+ len = (guint) strlen (file_name) + 1;
+ base = g_new (gchar, len + 1);
+ strcpy (base, file_name);
+ base[len-1] = G_DIR_SEPARATOR;
+ base[len] = 0;
+ return base;
+ }
+ if (G_IS_DIR_SEPARATOR (*p))
+ {
+ p++;
+ while (*p && !G_IS_DIR_SEPARATOR (*p))
+ p++;
+ if (p == base + 1)
+ base++;
+ }
+ }
+#endif
+
+ len = (guint) 1 + base - file_name;
+
+ base = g_new (gchar, len + 1);
+ g_memmove (base, file_name, len);
+ base[len] = 0;
+
+ return base;
+}
+
+/**
+ * g_get_current_dir:
+ *
+ * Gets the current directory.
+ * The returned string should be freed when no longer needed. The encoding
+ * of the returned string is system defined. On Windows, it is always UTF-8.
+ *
+ * Returns: the current directory.
+ */
+gchar*
+g_get_current_dir (void)
+{
+#ifdef G_OS_WIN32
+
+ gchar *dir = NULL;
+ wchar_t dummy[2], *wdir;
+ int len;
+
+ len = GetCurrentDirectoryW (2, dummy);
+ wdir = g_new (wchar_t, len);
+
+ if (GetCurrentDirectoryW (len, wdir) == len - 1)
+ dir = g_utf16_to_utf8 (wdir, -1, NULL, NULL, NULL);
+
+ g_free (wdir);
+
+ if (dir == NULL)
+ dir = g_strdup ("\\");
+
+ return dir;
+
+#else
+
+ 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;
+#endif /* !Win32 */
+}
+
+/**
+ * g_getenv:
+ * @variable: the environment variable to get, in the GLib file name encoding.
+ *
+ * Returns the value of an environment variable. The name and value
+ * are in the GLib file name encoding. On UNIX, this means the actual
+ * bytes which might or might not be in some consistent character set
+ * and encoding. On Windows, it is in UTF-8. On Windows, in case the
+ * environment variable's value contains references to other
+ * environment variables, they are expanded.
+ *
+ * Return value: the value of the environment variable, or %NULL if
+ * the environment variable is not found. The returned string may be
+ * overwritten by the next call to g_getenv(), g_setenv() or
+ * g_unsetenv().
+ **/
+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_OS_WIN32 */
+
+ GQuark quark;
+ gchar *value;
+ wchar_t dummy[2], *wname, *wvalue;
+ int len;
+
+ g_return_val_if_fail (variable != NULL, NULL);
+ g_return_val_if_fail (g_utf8_validate (variable, -1, NULL), NULL);
+
+ /* On Windows NT, it is relatively typical that environment
+ * variables contain references to other environment variables. If
+ * so, use ExpandEnvironmentStrings(). (In an ideal world, such
+ * environment variables would be stored in the Registry as
+ * REG_EXPAND_SZ type values, and would then get automatically
+ * expanded before a program sees them. But there is broken software
+ * that stores environment variables as REG_SZ values even if they
+ * contain references to other environment variables.)
+ */
+
+ wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL);
+
+ len = GetEnvironmentVariableW (wname, dummy, 2);
+
+ if (len == 0)
+ {
+ g_free (wname);
+ return NULL;
+ }
+ else if (len == 1)
+ len = 2;
+
+ wvalue = g_new (wchar_t, len);
+
+ if (GetEnvironmentVariableW (wname, wvalue, len) != len - 1)
+ {
+ g_free (wname);
+ g_free (wvalue);
+ return NULL;
+ }
+
+ if (wcschr (wvalue, L'%') != NULL)
+ {
+ wchar_t *tem = wvalue;
+
+ len = ExpandEnvironmentStringsW (wvalue, dummy, 2);
+
+ if (len > 0)
+ {
+ wvalue = g_new (wchar_t, len);
+
+ if (ExpandEnvironmentStringsW (tem, wvalue, len) != len)
+ {
+ g_free (wvalue);
+ wvalue = tem;
+ }
+ else
+ g_free (tem);
+ }
+ }
+
+ value = g_utf16_to_utf8 (wvalue, -1, NULL, NULL, NULL);
+
+ g_free (wname);
+ g_free (wvalue);
+
+ quark = g_quark_from_string (value);
+ g_free (value);
+
+ return g_quark_to_string (quark);
+
+#endif /* G_OS_WIN32 */
+}
+
+/* _g_getenv_nomalloc
+ * this function does a getenv() without doing any kind of allocation
+ * through glib. it's suitable for chars <= 127 only (both, for the
+ * variable name and the contents) and for contents < 1024 chars in
+ * length. also, it aliases "" to a NULL return value.
+ **/
+const gchar*
+_g_getenv_nomalloc (const gchar *variable,
+ gchar buffer[1024])
+{
+ const gchar *retval = getenv (variable);
+ if (retval && retval[0])
+ {
+ gint l = strlen (retval);
+ if (l < 1024)
+ {
+ strncpy (buffer, retval, l);
+ buffer[l] = 0;
+ return buffer;
+ }
+ }
+ return NULL;
+}
+
+/**
+ * g_setenv:
+ * @variable: the environment variable to set, must not contain '='.
+ * @value: the value for to set the variable to.
+ * @overwrite: whether to change the variable if it already exists.
+ *
+ * Sets an environment variable. Both the variable's name and value
+ * should be in the GLib file name encoding. On UNIX, this means that
+ * they can be any sequence of bytes. On Windows, they should be in
+ * UTF-8.
+ *
+ * Note that on some systems, when variables are overwritten, the memory
+ * used for the previous variables and its value isn't reclaimed.
+ *
+ * Returns: %FALSE if the environment variable couldn't be set.
+ *
+ * Since: 2.4
+ */
+gboolean
+g_setenv (const gchar *variable,
+ const gchar *value,
+ gboolean overwrite)
+{
+#ifndef G_OS_WIN32
+
+ gint result;
+#ifndef HAVE_SETENV
+ gchar *string;
+#endif
+
+ g_return_val_if_fail (variable != NULL, FALSE);
+ g_return_val_if_fail (strchr (variable, '=') == NULL, FALSE);
+
+#ifdef HAVE_SETENV
+ result = setenv (variable, value, overwrite);
+#else
+ if (!overwrite && getenv (variable) != NULL)
+ return TRUE;
+
+ /* This results in a leak when you overwrite existing
+ * settings. It would be fairly easy to fix this by keeping
+ * our own parallel array or hash table.
+ */
+ string = g_strconcat (variable, "=", value, NULL);
+ result = putenv (string);
+#endif
+ return result == 0;
+
+#else /* G_OS_WIN32 */
+
+ gboolean retval;
+ wchar_t *wname, *wvalue, *wassignment;
+ gchar *tem;
+
+ g_return_val_if_fail (variable != NULL, FALSE);
+ g_return_val_if_fail (strchr (variable, '=') == NULL, FALSE);
+ g_return_val_if_fail (g_utf8_validate (variable, -1, NULL), FALSE);
+ g_return_val_if_fail (g_utf8_validate (value, -1, NULL), FALSE);
+
+ if (!overwrite && g_getenv (variable) != NULL)
+ return TRUE;
+
+ /* We want to (if possible) set both the environment variable copy
+ * kept by the C runtime and the one kept by the system.
+ *
+ * We can't use only the C runtime's putenv or _wputenv() as that
+ * won't work for arbitrary Unicode strings in a "non-Unicode" app
+ * (with main() and not wmain()). In a "main()" app the C runtime
+ * initializes the C runtime's environment table by converting the
+ * real (wide char) environment variables to system codepage, thus
+ * breaking those that aren't representable in the system codepage.
+ *
+ * As the C runtime's putenv() will also set the system copy, we do
+ * the putenv() first, then call SetEnvironmentValueW ourselves.
+ */
+
+ wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL);
+ wvalue = g_utf8_to_utf16 (value, -1, NULL, NULL, NULL);
+ tem = g_strconcat (variable, "=", value, NULL);
+ wassignment = g_utf8_to_utf16 (tem, -1, NULL, NULL, NULL);
+
+ g_free (tem);
+ _wputenv (wassignment);
+ g_free (wassignment);
+
+ retval = (SetEnvironmentVariableW (wname, wvalue) != 0);
+
+ g_free (wname);
+ g_free (wvalue);
+
+ return retval;
+
+#endif /* G_OS_WIN32 */
+}
+
+#ifdef HAVE__NSGETENVIRON
+#define environ (*_NSGetEnviron())
+#elif !defined(G_OS_WIN32)
+
+/* According to the Single Unix Specification, environ is not in
+ * any system header, although unistd.h often declares it.
+ */
+extern char **environ;
+#endif
+
+/**
+ * g_unsetenv:
+ * @variable: the environment variable to remove, must not contain '='.
+ *
+ * Removes an environment variable from the environment.
+ *
+ * Note that on some systems, when variables are overwritten, the memory
+ * used for the previous variables and its value isn't reclaimed.
+ * Furthermore, this function can't be guaranteed to operate in a
+ * threadsafe way.
+ *
+ * Since: 2.4
+ **/
+void
+g_unsetenv (const gchar *variable)
+{
+#ifndef G_OS_WIN32
+
+#ifdef HAVE_UNSETENV
+ g_return_if_fail (variable != NULL);
+ g_return_if_fail (strchr (variable, '=') == NULL);
+
+ unsetenv (variable);
+#else /* !HAVE_UNSETENV */
+ int len;
+ gchar **e, **f;
+
+ g_return_if_fail (variable != NULL);
+ g_return_if_fail (strchr (variable, '=') == NULL);
+
+ len = strlen (variable);
+
+ /* Mess directly with the environ array.
+ * This seems to be the only portable way to do this.
+ *
+ * Note that we remove *all* environment entries for
+ * the variable name, not just the first.
+ */
+ e = f = environ;
+ while (*e != NULL)
+ {
+ if (strncmp (*e, variable, len) != 0 || (*e)[len] != '=')
+ {
+ *f = *e;
+ f++;
+ }
+ e++;
+ }
+ *f = NULL;
+#endif /* !HAVE_UNSETENV */
+
+#else /* G_OS_WIN32 */
+
+ wchar_t *wname, *wassignment;
+ gchar *tem;
+
+ g_return_if_fail (variable != NULL);
+ g_return_if_fail (strchr (variable, '=') == NULL);
+ g_return_if_fail (g_utf8_validate (variable, -1, NULL));
+
+ wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL);
+ tem = g_strconcat (variable, "=", NULL);
+ wassignment = g_utf8_to_utf16 (tem, -1, NULL, NULL, NULL);
+
+ g_free (tem);
+ _wputenv (wassignment);
+ g_free (wassignment);
+
+ SetEnvironmentVariableW (wname, NULL);
+
+ g_free (wname);
+
+#endif /* G_OS_WIN32 */
+}
+
+/**
+ * g_listenv:
+ *
+ * Gets the names of all variables set in the environment.
+ *
+ * Returns: a %NULL-terminated list of strings which must be freed
+ * with g_strfreev().
+ *
+ * Programs that want to be portable to Windows should typically use
+ * this function and g_getenv() instead of using the environ array
+ * from the C library directly. On Windows, the strings in the environ
+ * array are in system codepage encoding, while in most of the typical
+ * use cases for environment variables in GLib-using programs you want
+ * the UTF-8 encoding that this function and g_getenv() provide.
+ *
+ * Since: 2.8
+ */
+gchar **
+g_listenv (void)
+{
+#ifndef G_OS_WIN32
+ gchar **result, *eq;
+ gint len, i, j;
+
+ len = g_strv_length (environ);
+ result = g_new0 (gchar *, len + 1);
+
+ j = 0;
+ for (i = 0; i < len; i++)
+ {
+ eq = strchr (environ[i], '=');
+ if (eq)
+ result[j++] = g_strndup (environ[i], eq - environ[i]);
+ }
+
+ result[j] = NULL;
+
+ return result;
+#else
+ gchar **result, *eq;
+ gint len = 0, j;
+ wchar_t *p, *q;
+
+ p = (wchar_t *) GetEnvironmentStringsW ();
+ if (p != NULL)
+ {
+ q = p;
+ while (*q)
+ {
+ q += wcslen (q) + 1;
+ len++;
+ }
+ }
+ result = g_new0 (gchar *, len + 1);
+
+ j = 0;
+ q = p;
+ while (*q)
+ {
+ result[j] = g_utf16_to_utf8 (q, -1, NULL, NULL, NULL);
+ if (result[j] != NULL)
+ {
+ eq = strchr (result[j], '=');
+ if (eq && eq > result[j])
+ {
+ *eq = '\0';
+ j++;
+ }
+ else
+ g_free (result[j]);
+ }
+ q += wcslen (q) + 1;
+ }
+ result[j] = NULL;
+ FreeEnvironmentStringsW (p);
+
+ return result;
+#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;
+static gchar *g_host_name = NULL;
+
+#ifdef G_OS_WIN32
+/* System codepage versions of the above, kept at file level so that they,
+ * too, are produced only once.
+ */
+static gchar *g_tmp_dir_cp = NULL;
+static gchar *g_user_name_cp = NULL;
+static gchar *g_real_name_cp = NULL;
+static gchar *g_home_dir_cp = NULL;
+#endif
+
+static gchar *g_user_data_dir = NULL;
+static gchar **g_system_data_dirs = NULL;
+static gchar *g_user_cache_dir = NULL;
+static gchar *g_user_config_dir = NULL;
+static gchar **g_system_config_dirs = NULL;
+
+static gchar **g_user_special_dirs = NULL;
+static time_t g_user_special_dirs_mtime = (time_t) -1;
+static time_t g_user_special_dirs_stat_time = (time_t) -1;
+
+/* fifteen minutes of fame for everybody */
+#define G_USER_DIRS_EXPIRE 15 * 60
+
+#ifdef G_OS_WIN32
+
+static gchar *
+get_special_folder (int csidl)
+{
+ union {
+ char c[MAX_PATH+1];
+ wchar_t wc[MAX_PATH+1];
+ } path;
+ HRESULT hr;
+ LPITEMIDLIST pidl = NULL;
+ BOOL b;
+ gchar *retval = NULL;
+
+ hr = SHGetSpecialFolderLocation (NULL, csidl, &pidl);
+ if (hr == S_OK)
+ {
+ b = SHGetPathFromIDListW (pidl, path.wc);
+ if (b)
+ retval = g_utf16_to_utf8 (path.wc, -1, NULL, NULL, NULL);
+ CoTaskMemFree (pidl);
+ }
+ return retval;
+}
+
+static char *
+get_windows_directory_root (void)
+{
+ wchar_t wwindowsdir[MAX_PATH];
+
+ if (GetWindowsDirectoryW (wwindowsdir, G_N_ELEMENTS (wwindowsdir)))
+ {
+ /* Usually X:\Windows, but in terminal server environments
+ * might be an UNC path, AFAIK.
+ */
+ char *windowsdir = g_utf16_to_utf8 (wwindowsdir, -1, NULL, NULL, NULL);
+ char *p;
+
+ if (windowsdir == NULL)
+ return g_strdup ("C:\\");
+
+ p = (char *) g_path_skip_root (windowsdir);
+ if (G_IS_DIR_SEPARATOR (p[-1]) && p[-2] != ':')
+ p--;
+ *p = '\0';
+ return windowsdir;
+ }
+ else
+ return g_strdup ("C:\\");
+}
+
+#endif
+
+/* HOLDS: g_utils_global_lock */
+static void
+g_get_any_init_do (void)
+{
+ gchar hostname[100];
+
+ 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 G_OS_WIN32
+ if (!g_tmp_dir)
+ g_tmp_dir = get_windows_directory_root ();
+#else
+#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_IS_DIR_SEPARATOR (g_tmp_dir[k - 1]))
+ g_tmp_dir[k - 1] = '\0';
+ }
+#endif
+
+ if (!g_tmp_dir)
+ {
+ g_tmp_dir = g_strdup ("/tmp");
+ }
+#endif /* !G_OS_WIN32 */
+
+#ifdef G_OS_WIN32
+ /* We check $HOME first for Win32, though it is a last resort for Unix
+ * where we prefer the results of getpwuid().
+ */
+ g_home_dir = g_strdup (g_getenv ("HOME"));
+
+ /* Only believe HOME if it is an absolute path and exists */
+ if (g_home_dir)
+ {
+ if (!(g_path_is_absolute (g_home_dir) &&
+ g_file_test (g_home_dir, G_FILE_TEST_IS_DIR)))
+ {
+ g_free (g_home_dir);
+ g_home_dir = NULL;
+ }
+ }
+
+ /* 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 (g_getenv ("USERPROFILE") != NULL)
+ g_home_dir = g_strdup (g_getenv ("USERPROFILE"));
+ }
+
+ if (!g_home_dir)
+ g_home_dir = get_special_folder (CSIDL_PROFILE);
+
+ if (!g_home_dir)
+ g_home_dir = get_windows_directory_root ();
+#endif /* G_OS_WIN32 */
+
+#ifdef HAVE_PWD_H
+ {
+ struct passwd *pw = NULL;
+ gpointer buffer = NULL;
+ gint error;
+ gchar *logname;
+
+# 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);
+
+ if (bufsize < 0)
+ bufsize = 64;
+# else /* _SC_GETPW_R_SIZE_MAX */
+ glong bufsize = 64;
+# endif /* _SC_GETPW_R_SIZE_MAX */
+
+ logname = (gchar *) g_getenv ("LOGNAME");
+
+ do
+ {
+ g_free (buffer);
+ /* we allocate 6 extra bytes to work around a bug in
+ * Mac OS < 10.3. See #156446
+ */
+ buffer = g_malloc (bufsize + 6);
+ errno = 0;
+
+# ifdef HAVE_POSIX_GETPWUID_R
+ if (logname) {
+ error = getpwnam_r (logname, &pwd, buffer, bufsize, &pw);
+ if (!pw || (pw->pw_uid != getuid ())) {
+ /* LOGNAME is lying, fall back to looking up the uid */
+ error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
+ }
+ } else {
+ error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
+ }
+ error = error < 0 ? errno : error;
+# else /* HAVE_NONPOSIX_GETPWUID_R */
+ /* HPUX 11 falls into the HAVE_POSIX_GETPWUID_R case */
+# if defined(_AIX) || defined(__hpux)
+ error = getpwuid_r (getuid (), &pwd, buffer, bufsize);
+ pw = error == 0 ? &pwd : NULL;
+# else /* !_AIX */
+ if (logname) {
+ pw = getpwnam_r (logname, &pwd, buffer, bufsize);
+ if (!pw || (pw->pw_uid != getuid ())) {
+ /* LOGNAME is lying, fall back to looking up the uid */
+ pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
+ }
+ } else {
+ 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);
+
+ if (pw->pw_gecos && *pw->pw_gecos != '\0')
+ {
+ gchar **gecos_fields;
+ gchar **name_parts;
+
+ /* split the gecos field and substitute '&' */
+ gecos_fields = g_strsplit (pw->pw_gecos, ",", 0);
+ name_parts = g_strsplit (gecos_fields[0], "&", 0);
+ pw->pw_name[0] = g_ascii_toupper (pw->pw_name[0]);
+ g_real_name = g_strjoinv (pw->pw_name, name_parts);
+ g_strfreev (gecos_fields);
+ g_strfreev (name_parts);
+ }
+
+ 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 = UNLEN+1;
+ wchar_t buffer[UNLEN+1];
+
+ if (GetUserNameW (buffer, (LPDWORD) &len))
+ {
+ g_user_name = g_utf16_to_utf8 (buffer, -1, NULL, NULL, NULL);
+ g_real_name = g_strdup (g_user_name);
+ }
+ }
+#endif /* G_OS_WIN32 */
+
+#endif /* !HAVE_PWD_H */
+
+#ifndef G_OS_WIN32
+ if (!g_home_dir)
+ g_home_dir = g_strdup (g_getenv ("HOME"));
+#endif
+
+#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");
+
+ {
+#ifndef G_OS_WIN32
+ gboolean hostname_fail = (gethostname (hostname, sizeof (hostname)) == -1);
+#else
+ DWORD size = sizeof (hostname);
+ gboolean hostname_fail = (!GetComputerName (hostname, &size));
+#endif
+ g_host_name = g_strdup (hostname_fail ? "localhost" : hostname);
+ }
+
+#ifdef G_OS_WIN32
+ g_tmp_dir_cp = g_locale_from_utf8 (g_tmp_dir, -1, NULL, NULL, NULL);
+ g_user_name_cp = g_locale_from_utf8 (g_user_name, -1, NULL, NULL, NULL);
+ g_real_name_cp = g_locale_from_utf8 (g_real_name, -1, NULL, NULL, NULL);
+
+ if (!g_tmp_dir_cp)
+ g_tmp_dir_cp = g_strdup ("\\");
+ if (!g_user_name_cp)
+ g_user_name_cp = g_strdup ("somebody");
+ if (!g_real_name_cp)
+ g_real_name_cp = g_strdup ("Unknown");
+
+ /* home_dir might be NULL, unlike tmp_dir, user_name and
+ * real_name.
+ */
+ if (g_home_dir)
+ g_home_dir_cp = g_locale_from_utf8 (g_home_dir, -1, NULL, NULL, NULL);
+ else
+ g_home_dir_cp = NULL;
+#endif /* G_OS_WIN32 */
+}
+
+static inline void
+g_get_any_init (void)
+{
+ if (!g_tmp_dir)
+ g_get_any_init_do ();
+}
+
+static inline void
+g_get_any_init_locked (void)
+{
+ G_LOCK (g_utils_global);
+ g_get_any_init ();
+ G_UNLOCK (g_utils_global);
+}
+
+
+/**
+ * g_get_user_name:
+ *
+ * Gets the user name of the current user. The encoding of the returned
+ * string is system-defined. On UNIX, it might be the preferred file name
+ * encoding, or something else, and there is no guarantee that it is even
+ * consistent on a machine. On Windows, it is always UTF-8.
+ *
+ * Returns: the user name of the current user.
+ */
+G_CONST_RETURN gchar*
+g_get_user_name (void)
+{
+ g_get_any_init_locked ();
+ return g_user_name;
+}
+
+/**
+ * g_get_real_name:
+ *
+ * Gets the real name of the user. This usually comes from the user's entry
+ * in the <filename>passwd</filename> file. The encoding of the returned
+ * string is system-defined. (On Windows, it is, however, always UTF-8.)
+ * If the real user name cannot be determined, the string "Unknown" is
+ * returned.
+ *
+ * Returns: the user's real name.
+ */
+G_CONST_RETURN gchar*
+g_get_real_name (void)
+{
+ g_get_any_init_locked ();
+ return g_real_name;
+}
+
+/**
+ * g_get_home_dir:
+ *
+ * Gets the current user's home directory as defined in the
+ * password database.
+ *
+ * Note that in contrast to traditional UNIX tools, this function
+ * prefers <filename>passwd</filename> entries over the <envar>HOME</envar>
+ * environment variable.
+ *
+ * Returns: the current user's home directory.
+ */
+G_CONST_RETURN gchar*
+g_get_home_dir (void)
+{
+ g_get_any_init_locked ();
+ return g_home_dir;
+}
+
+/**
+ * g_get_tmp_dir:
+ *
+ * Gets the directory to use for temporary files. This is found from
+ * inspecting the environment variables <envar>TMPDIR</envar>,
+ * <envar>TMP</envar>, and <envar>TEMP</envar> in that order. If none
+ * of those are defined "/tmp" is returned on UNIX and "C:\" on Windows.
+ * The encoding of the returned string is system-defined. On Windows,
+ * it is always UTF-8. The return value is never %NULL.
+ *
+ * Returns: the directory to use for temporary files.
+ */
+G_CONST_RETURN gchar*
+g_get_tmp_dir (void)
+{
+ g_get_any_init_locked ();
+ return g_tmp_dir;
+}
+
+/**
+ * g_get_host_name:
+ *
+ * Return a name for the machine.
+ *
+ * The returned name is not necessarily a fully-qualified domain name,
+ * or even present in DNS or some other name service at all. It need
+ * not even be unique on your local network or site, but usually it
+ * is. Callers should not rely on the return value having any specific
+ * properties like uniqueness for security purposes. Even if the name
+ * of the machine is changed while an application is running, the
+ * return value from this function does not change. The returned
+ * string is owned by GLib and should not be modified or freed. If no
+ * name can be determined, a default fixed string "localhost" is
+ * returned.
+ *
+ * Returns: the host name of the machine.
+ *
+ * Since: 2.8
+ */
+const gchar *
+g_get_host_name (void)
+{
+ g_get_any_init_locked ();
+ return g_host_name;
+}
+
+G_LOCK_DEFINE_STATIC (g_prgname);
+static gchar *g_prgname = NULL;
+
+/**
+ * g_get_prgname:
+ *
+ * Gets the name of the program. This name should <emphasis>not</emphasis>
+ * be localized, contrast with g_get_application_name().
+ * (If you are using GDK or GTK+ the program name is set in gdk_init(),
+ * which is called by gtk_init(). The program name is found by taking
+ * the last component of <literal>argv[0]</literal>.)
+ *
+ * Returns: the name of the program. The returned string belongs
+ * to GLib and must not be modified or freed.
+ */
+gchar*
+g_get_prgname (void)
+{
+ gchar* retval;
+
+ G_LOCK (g_prgname);
+#ifdef G_OS_WIN32
+ if (g_prgname == NULL)
+ {
+ static gboolean beenhere = FALSE;
+
+ if (!beenhere)
+ {
+ gchar *utf8_buf = NULL;
+ wchar_t buf[MAX_PATH+1];
+
+ beenhere = TRUE;
+ if (GetModuleFileNameW (GetModuleHandle (NULL),
+ buf, G_N_ELEMENTS (buf)) > 0)
+ utf8_buf = g_utf16_to_utf8 (buf, -1, NULL, NULL, NULL);
+
+ if (utf8_buf)
+ {
+ g_prgname = g_path_get_basename (utf8_buf);
+ g_free (utf8_buf);
+ }
+ }
+ }
+#endif
+ retval = g_prgname;
+ G_UNLOCK (g_prgname);
+
+ return retval;
+}
+
+/**
+ * g_set_prgname:
+ * @prgname: the name of the program.
+ *
+ * Sets the name of the program. This name should <emphasis>not</emphasis>
+ * be localized, contrast with g_set_application_name(). Note that for
+ * thread-safety reasons this function can only be called once.
+ */
+void
+g_set_prgname (const gchar *prgname)
+{
+ G_LOCK (g_prgname);
+ g_free (g_prgname);
+ g_prgname = g_strdup (prgname);
+ G_UNLOCK (g_prgname);
+}
+
+G_LOCK_DEFINE_STATIC (g_application_name);
+static gchar *g_application_name = NULL;
+
+/**
+ * g_get_application_name:
+ *
+ * Gets a human-readable name for the application, as set by
+ * g_set_application_name(). This name should be localized if
+ * possible, and is intended for display to the user. Contrast with
+ * g_get_prgname(), which gets a non-localized name. If
+ * g_set_application_name() has not been called, returns the result of
+ * g_get_prgname() (which may be %NULL if g_set_prgname() has also not
+ * been called).
+ *
+ * Return value: human-readable application name. may return %NULL
+ *
+ * Since: 2.2
+ **/
+G_CONST_RETURN gchar*
+g_get_application_name (void)
+{
+ gchar* retval;
+
+ G_LOCK (g_application_name);
+ retval = g_application_name;
+ G_UNLOCK (g_application_name);
+
+ if (retval == NULL)
+ return g_get_prgname ();
+
+ return retval;
+}
+
+/**
+ * g_set_application_name:
+ * @application_name: localized name of the application
+ *
+ * Sets a human-readable name for the application. This name should be
+ * localized if possible, and is intended for display to the user.
+ * Contrast with g_set_prgname(), which sets a non-localized name.
+ * g_set_prgname() will be called automatically by gtk_init(),
+ * but g_set_application_name() will not.
+ *
+ * Note that for thread safety reasons, this function can only
+ * be called once.
+ *
+ * The application name will be used in contexts such as error messages,
+ * or when displaying an application's name in the task list.
+ *
+ **/
+void
+g_set_application_name (const gchar *application_name)
+{
+ gboolean already_set = FALSE;
+
+ G_LOCK (g_application_name);
+ if (g_application_name)
+ already_set = TRUE;
+ else
+ g_application_name = g_strdup (application_name);
+ G_UNLOCK (g_application_name);
+
+ if (already_set)
+ g_warning ("g_set_application() name called multiple times");
+}
+
+/**
+ * g_get_user_data_dir:
+ *
+ * Returns a base directory in which to access application data such
+ * as icons that is customized for a particular user.
+ *
+ * On UNIX platforms this is determined using the mechanisms described in
+ * the <ulink url="http://www.freedesktop.org/Standards/basedir-spec">
+ * XDG Base Directory Specification</ulink>
+ *
+ * Return value: a string owned by GLib that must not be modified
+ * or freed.
+ * Since: 2.6
+ **/
+G_CONST_RETURN gchar*
+g_get_user_data_dir (void)
+{
+ gchar *data_dir;
+
+ G_LOCK (g_utils_global);
+
+ if (!g_user_data_dir)
+ {
+#ifdef G_OS_WIN32
+ data_dir = get_special_folder (CSIDL_PERSONAL);
+#else
+ data_dir = (gchar *) g_getenv ("XDG_DATA_HOME");
+
+ if (data_dir && data_dir[0])
+ data_dir = g_strdup (data_dir);
+#endif
+ if (!data_dir || !data_dir[0])
+ {
+ g_get_any_init ();
+
+ if (g_home_dir)
+ data_dir = g_build_filename (g_home_dir, ".local",
+ "share", NULL);
+ else
+ data_dir = g_build_filename (g_tmp_dir, g_user_name, ".local",
+ "share", NULL);
+ }
+
+ g_user_data_dir = data_dir;
+ }
+ else
+ data_dir = g_user_data_dir;
+
+ G_UNLOCK (g_utils_global);
+
+ return data_dir;
+}
+
+static void
+g_init_user_config_dir (void)
+{
+ gchar *config_dir;
+
+ if (!g_user_config_dir)
+ {
+#ifdef G_OS_WIN32
+ config_dir = get_special_folder (CSIDL_APPDATA);
+#else
+ config_dir = (gchar *) g_getenv ("XDG_CONFIG_HOME");
+
+ if (config_dir && config_dir[0])
+ config_dir = g_strdup (config_dir);
+#endif
+ if (!config_dir || !config_dir[0])
+ {
+ g_get_any_init ();
+
+ if (g_home_dir)
+ config_dir = g_build_filename (g_home_dir, ".config", NULL);
+ else
+ config_dir = g_build_filename (g_tmp_dir, g_user_name, ".config", NULL);
+ }
+
+ g_user_config_dir = config_dir;
+ }
+}
+
+/**
+ * g_get_user_config_dir:
+ *
+ * Returns a base directory in which to store user-specific application
+ * configuration information such as user preferences and settings.
+ *
+ * On UNIX platforms this is determined using the mechanisms described in
+ * the <ulink url="http://www.freedesktop.org/Standards/basedir-spec">
+ * XDG Base Directory Specification</ulink>
+ *
+ * Return value: a string owned by GLib that must not be modified
+ * or freed.
+ * Since: 2.6
+ **/
+G_CONST_RETURN gchar*
+g_get_user_config_dir (void)
+{
+ G_LOCK (g_utils_global);
+
+ g_init_user_config_dir ();
+
+ G_UNLOCK (g_utils_global);
+
+ return g_user_config_dir;
+}
+
+/**
+ * g_get_user_cache_dir:
+ *
+ * Returns a base directory in which to store non-essential, cached
+ * data specific to particular user.
+ *
+ * On UNIX platforms this is determined using the mechanisms described in
+ * the <ulink url="http://www.freedesktop.org/Standards/basedir-spec">
+ * XDG Base Directory Specification</ulink>
+ *
+ * Return value: a string owned by GLib that must not be modified
+ * or freed.
+ * Since: 2.6
+ **/
+G_CONST_RETURN gchar*
+g_get_user_cache_dir (void)
+{
+ gchar *cache_dir;
+
+ G_LOCK (g_utils_global);
+
+ if (!g_user_cache_dir)
+ {
+#ifdef G_OS_WIN32
+ cache_dir = get_special_folder (CSIDL_INTERNET_CACHE); /* XXX correct? */
+#else
+ cache_dir = (gchar *) g_getenv ("XDG_CACHE_HOME");
+
+ if (cache_dir && cache_dir[0])
+ cache_dir = g_strdup (cache_dir);
+#endif
+ if (!cache_dir || !cache_dir[0])
+ {
+ g_get_any_init ();
+
+ if (g_home_dir)
+ cache_dir = g_build_filename (g_home_dir, ".cache", NULL);
+ else
+ cache_dir = g_build_filename (g_tmp_dir, g_user_name, ".cache", NULL);
+ }
+ g_user_cache_dir = cache_dir;
+ }
+ else
+ cache_dir = g_user_cache_dir;
+
+ G_UNLOCK (g_utils_global);
+
+ return cache_dir;
+}
+
+#ifdef HAVE_CARBON
+
+static gchar *
+find_folder (OSType type)
+{
+ gchar *filename = NULL;
+ FSRef found;
+
+ if (FSFindFolder (kUserDomain, type, kDontCreateFolder, &found) == noErr)
+ {
+ CFURLRef url = CFURLCreateFromFSRef (kCFAllocatorSystemDefault, &found);
+
+ if (url)
+ {
+ CFStringRef path = CFURLCopyFileSystemPath (url, kCFURLPOSIXPathStyle);
+
+ if (path)
+ {
+ filename = g_strdup (CFStringGetCStringPtr (path, kCFStringEncodingUTF8));
+
+ if (! filename)
+ {
+ filename = g_new0 (gchar, CFStringGetLength (path) * 3 + 1);
+
+ CFStringGetCString (path, filename,
+ CFStringGetLength (path) * 3 + 1,
+ kCFStringEncodingUTF8);
+ }
+
+ CFRelease (path);
+ }
+
+ CFRelease (url);
+ }
+ }
+
+ return filename;
+}
+
+static void
+load_user_special_dirs (void)
+{
+ g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = find_folder (kDesktopFolderType);
+ g_user_special_dirs[G_USER_DIRECTORY_DOCUMENTS] = find_folder (kDocumentsFolderType);
+ g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = find_folder (kDesktopFolderType); /* XXX correct ? */
+ g_user_special_dirs[G_USER_DIRECTORY_MUSIC] = find_folder (kMusicDocumentsFolderType);
+ g_user_special_dirs[G_USER_DIRECTORY_PICTURES] = find_folder (kPictureDocumentsFolderType);
+ g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = NULL;
+ g_user_special_dirs[G_USER_DIRECTORY_TEMPLATES] = NULL;
+ g_user_special_dirs[G_USER_DIRECTORY_VIDEOS] = find_folder (kMovieDocumentsFolderType);
+}
+
+#endif /* HAVE_CARBON */
+
+#if defined(G_OS_WIN32)
+static void
+load_user_special_dirs (void)
+{
+ g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = get_special_folder (CSIDL_DESKTOPDIRECTORY);
+ g_user_special_dirs[G_USER_DIRECTORY_DOCUMENTS] = get_special_folder (CSIDL_MYDOCUMENTS);
+ g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = get_special_folder (CSIDL_DESKTOPDIRECTORY); /* XXX correct ? */
+ g_user_special_dirs[G_USER_DIRECTORY_MUSIC] = get_special_folder (CSIDL_MYMUSIC);
+ g_user_special_dirs[G_USER_DIRECTORY_PICTURES] = get_special_folder (CSIDL_MYPICTURES);
+ g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = get_special_folder (CSIDL_COMMON_DOCUMENTS); /* XXX correct ? */
+ g_user_special_dirs[G_USER_DIRECTORY_TEMPLATES] = get_special_folder (CSIDL_TEMPLATES);
+ g_user_special_dirs[G_USER_DIRECTORY_VIDEOS] = get_special_folder (CSIDL_MYVIDEO);
+}
+#endif /* G_OS_WIN32 */
+
+#if defined(G_OS_WIN32) || defined(HAVE_CARBON)
+static void
+maybe_expire_user_special_dirs (void)
+{
+ /* expire the user dirs after G_USER_DIRS_EXPIRE seconds */
+ time_t now;
+
+ time (&now);
+ if (now > g_user_special_dirs_mtime + G_USER_DIRS_EXPIRE &&
+ g_user_special_dirs)
+ {
+ gint i;
+
+ for (i = 0; i < G_USER_N_DIRECTORIES; i++)
+ g_free (g_user_special_dirs[i]);
+
+ g_free (g_user_special_dirs);
+ g_user_special_dirs = NULL;
+ }
+
+ if (g_user_special_dirs == NULL)
+ g_user_special_dirs_mtime = now;
+}
+#endif
+
+#if defined(G_OS_UNIX) && !defined(HAVE_CARBON)
+
+/* expire g_user_special_dirs if the config file
+ * was modified between different reads
+ */
+static void
+maybe_expire_user_special_dirs (void)
+{
+ gchar *config_file;
+ struct stat stat_buf;
+ time_t now;
+
+ /* don't stat() the file more often than necessary */
+ time (&now);
+ if (now < g_user_special_dirs_stat_time + 5)
+ return;
+
+ g_user_special_dirs_stat_time = now;
+
+ config_file = g_build_filename (g_user_config_dir,
+ "user-dirs.dirs",
+ NULL);
+
+ if (stat (config_file, &stat_buf) < 0)
+ goto out;
+
+ if (stat_buf.st_mtime != g_user_special_dirs_mtime &&
+ g_user_special_dirs != NULL)
+ {
+ gint i;
+
+ for (i = 0; i < G_USER_N_DIRECTORIES; i++)
+ g_free (g_user_special_dirs[i]);
+
+ g_free (g_user_special_dirs);
+ g_user_special_dirs = NULL;
+ }
+
+ g_user_special_dirs_mtime = stat_buf.st_mtime;
+
+out:
+ g_free (config_file);
+}
+
+
+static void g_init_user_config_dir (void);
+
+/* adapted from xdg-user-dir-lookup.c
+ *
+ * Copyright (C) 2007 Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+/* included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+static void
+load_user_special_dirs (void)
+{
+ gchar *config_file;
+ gchar *data;
+ gchar **lines;
+ gint n_lines, i;
+
+ g_init_user_config_dir ();
+ config_file = g_build_filename (g_user_config_dir,
+ "user-dirs.dirs",
+ NULL);
+
+ if (!g_file_get_contents (config_file, &data, NULL, NULL))
+ {
+ g_free (config_file);
+ return;
+ }
+
+ lines = g_strsplit (data, "\n", -1);
+ n_lines = g_strv_length (lines);
+ g_free (data);
+
+ for (i = 0; i < n_lines; i++)
+ {
+ gchar *buffer = lines[i];
+ gchar *d, *p;
+ gint len;
+ gboolean is_relative = FALSE;
+ GUserDirectory directory;
+
+ /* Remove newline at end */
+ len = strlen (buffer);
+ if (len > 0 && buffer[len - 1] == '\n')
+ buffer[len - 1] = 0;
+
+ p = buffer;
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ if (strncmp (p, "XDG_DESKTOP_DIR", strlen ("XDG_DESKTOP_DIR")) == 0)
+ {
+ directory = G_USER_DIRECTORY_DESKTOP;
+ p += strlen ("XDG_DESKTOP_DIR");
+ }
+ else if (strncmp (p, "XDG_DOCUMENTS_DIR", strlen ("XDG_DOCUMENTS_DIR")) == 0)
+ {
+ directory = G_USER_DIRECTORY_DOCUMENTS;
+ p += strlen ("XDG_DOCUMENTS_DIR");
+ }
+ else if (strncmp (p, "XDG_DOWNLOAD_DIR", strlen ("XDG_DOWNLOAD_DIR")) == 0)
+ {
+ directory = G_USER_DIRECTORY_DOWNLOAD;
+ p += strlen ("XDG_DOWNLOAD_DIR");
+ }
+ else if (strncmp (p, "XDG_MUSIC_DIR", strlen ("XDG_MUSIC_DIR")) == 0)
+ {
+ directory = G_USER_DIRECTORY_MUSIC;
+ p += strlen ("XDG_MUSIC_DIR");
+ }
+ else if (strncmp (p, "XDG_PICTURES_DIR", strlen ("XDG_PICTURES_DIR")) == 0)
+ {
+ directory = G_USER_DIRECTORY_PICTURES;
+ p += strlen ("XDG_PICTURES_DIR");
+ }
+ else if (strncmp (p, "XDG_PUBLICSHARE_DIR", strlen ("XDG_PUBLICSHARE_DIR")) == 0)
+ {
+ directory = G_USER_DIRECTORY_PUBLIC_SHARE;
+ p += strlen ("XDG_PUBLICSHARE_DIR");
+ }
+ else if (strncmp (p, "XDG_TEMPLATES_DIR", strlen ("XDG_TEMPLATES_DIR")) == 0)
+ {
+ directory = G_USER_DIRECTORY_TEMPLATES;
+ p += strlen ("XDG_TEMPLATES_DIR");
+ }
+ else if (strncmp (p, "XDG_VIDEOS_DIR", strlen ("XDG_VIDEOS_DIR")) == 0)
+ {
+ directory = G_USER_DIRECTORY_VIDEOS;
+ p += strlen ("XDG_VIDEOS_DIR");
+ }
+ else
+ continue;
+
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ if (*p != '=')
+ continue;
+ p++;
+
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ if (*p != '"')
+ continue;
+ p++;
+
+ if (strncmp (p, "$HOME", 5) == 0)
+ {
+ p += 5;
+ is_relative = TRUE;
+ }
+ else if (*p != '/')
+ continue;
+
+ d = strrchr (p, '"');
+ if (!d)
+ continue;
+ *d = 0;
+
+ d = p;
+
+ /* remove trailing slashes */
+ len = strlen (d);
+ if (d[len - 1] == '/')
+ d[len - 1] = 0;
+
+ if (is_relative)
+ {
+ g_get_any_init ();
+ g_user_special_dirs[directory] = g_build_filename (g_home_dir, d, NULL);
+ }
+ else
+ g_user_special_dirs[directory] = g_strdup (d);
+ }
+
+ g_strfreev (lines);
+ g_free (config_file);
+}
+
+#endif /* G_OS_UNIX && !HAVE_CARBON */
+
+/**
+ * g_get_user_special_dir:
+ * @directory: the logical id of special directory
+ *
+ * Returns the full path of a special directory using its logical id.
+ *
+ * On Unix this is done using the XDG special user directories.
+ *
+ * Return value: the path to the specified special directory, or %NULL
+ * if the logical id was not found. The returned string is owned by
+ * GLib and should not be modified or freed.
+ *
+ * Since: 2.14
+ */
+G_CONST_RETURN gchar *
+g_get_user_special_dir (GUserDirectory directory)
+{
+ g_return_val_if_fail (directory >= G_USER_DIRECTORY_DESKTOP &&
+ directory < G_USER_N_DIRECTORIES, NULL);
+
+ G_LOCK (g_utils_global);
+
+ maybe_expire_user_special_dirs ();
+ if (g_user_special_dirs == NULL)
+ {
+ g_user_special_dirs = g_new0 (gchar *, G_USER_N_DIRECTORIES);
+ load_user_special_dirs ();
+ }
+
+ G_UNLOCK (g_utils_global);
+
+ return g_user_special_dirs[directory];
+}
+
+#ifdef G_OS_WIN32
+
+#undef g_get_system_data_dirs
+
+static HMODULE
+get_module_for_address (gconstpointer address)
+{
+ /* Holds the g_utils_global lock */
+
+ static gboolean beenhere = FALSE;
+ typedef BOOL (WINAPI *t_GetModuleHandleExA) (DWORD, LPCTSTR, HMODULE *);
+ static t_GetModuleHandleExA p_GetModuleHandleExA = NULL;
+ HMODULE hmodule;
+
+ if (!address)
+ return NULL;
+
+ if (!beenhere)
+ {
+ p_GetModuleHandleExA =
+ (t_GetModuleHandleExA) GetProcAddress (LoadLibrary ("kernel32.dll"),
+ "GetModuleHandleExA");
+ beenhere = TRUE;
+ }
+
+ if (p_GetModuleHandleExA == NULL ||
+ !(*p_GetModuleHandleExA) (GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT |
+ GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
+ address, &hmodule))
+ {
+ MEMORY_BASIC_INFORMATION mbi;
+ VirtualQuery (address, &mbi, sizeof (mbi));
+ hmodule = (HMODULE) mbi.AllocationBase;
+ }
+
+ return hmodule;
+}
+
+static gchar *
+get_module_share_dir (gconstpointer address)
+{
+ HMODULE hmodule;
+ gchar *filename = NULL;
+ gchar *p, *retval;
+ wchar_t wfilename[MAX_PATH];
+
+ hmodule = get_module_for_address (address);
+ if (hmodule == NULL)
+ return NULL;
+
+ if (GetModuleFileNameW (hmodule, wfilename, G_N_ELEMENTS (wfilename)))
+ filename = g_utf16_to_utf8 (wfilename, -1, NULL, NULL, NULL);
+
+ if (filename == NULL)
+ return NULL;
+
+ if ((p = strrchr (filename, G_DIR_SEPARATOR)) != NULL)
+ *p = '\0';
+
+ p = strrchr (filename, G_DIR_SEPARATOR);
+ if (p && (g_ascii_strcasecmp (p + 1, "bin") == 0))
+ *p = '\0';
+
+ retval = g_build_filename (filename, "share", NULL);
+ g_free (filename);
+
+ return retval;
+}
+
+G_CONST_RETURN gchar * G_CONST_RETURN *
+g_win32_get_system_data_dirs_for_module (gconstpointer address)
+{
+ GArray *data_dirs;
+ HMODULE hmodule;
+ static GHashTable *per_module_data_dirs = NULL;
+ gchar **retval;
+ gchar *p;
+
+ if (address)
+ {
+ G_LOCK (g_utils_global);
+ hmodule = get_module_for_address (address);
+ if (hmodule != NULL)
+ {
+ if (per_module_data_dirs == NULL)
+ per_module_data_dirs = g_hash_table_new (NULL, NULL);
+ else
+ {
+ retval = g_hash_table_lookup (per_module_data_dirs, hmodule);
+
+ if (retval != NULL)
+ {
+ G_UNLOCK (g_utils_global);
+ return (G_CONST_RETURN gchar * G_CONST_RETURN *) retval;
+ }
+ }
+ }
+ }
+
+ data_dirs = g_array_new (TRUE, TRUE, sizeof (char *));
+
+ /* Documents and Settings\All Users\Application Data */
+ p = get_special_folder (CSIDL_COMMON_APPDATA);
+ if (p)
+ g_array_append_val (data_dirs, p);
+
+ /* Documents and Settings\All Users\Documents */
+ p = get_special_folder (CSIDL_COMMON_DOCUMENTS);
+ if (p)
+ g_array_append_val (data_dirs, p);
+
+ /* Using the above subfolders of Documents and Settings perhaps
+ * makes sense from a Windows perspective.
+ *
+ * But looking at the actual use cases of this function in GTK+
+ * and GNOME software, what we really want is the "share"
+ * subdirectory of the installation directory for the package
+ * our caller is a part of.
+ *
+ * The address parameter, if non-NULL, points to a function in the
+ * calling module. Use that to determine that module's installation
+ * folder, and use its "share" subfolder.
+ *
+ * Additionally, also use the "share" subfolder of the installation
+ * locations of GLib and the .exe file being run.
+ *
+ * To guard against none of the above being what is really wanted,
+ * callers of this function should have Win32-specific code to look
+ * up their installation folder themselves, and handle a subfolder
+ * "share" of it in the same way as the folders returned from this
+ * function.
+ */
+
+ p = get_module_share_dir (address);
+ if (p)
+ g_array_append_val (data_dirs, p);
+
+ p = g_win32_get_package_installation_subdirectory (NULL, dll_name, "share");
+ if (p)
+ g_array_append_val (data_dirs, p);
+
+ p = g_win32_get_package_installation_subdirectory (NULL, NULL, "share");
+ if (p)
+ g_array_append_val (data_dirs, p);
+
+ retval = (gchar **) g_array_free (data_dirs, FALSE);
+
+ if (address)
+ {
+ if (hmodule != NULL)
+ g_hash_table_insert (per_module_data_dirs, hmodule, retval);
+ G_UNLOCK (g_utils_global);
+ }
+
+ return (G_CONST_RETURN gchar * G_CONST_RETURN *) retval;
+}
+
+#endif
+
+/**
+ * g_get_system_data_dirs:
+ *
+ * Returns an ordered list of base directories in which to access
+ * system-wide application data.
+ *
+ * On UNIX platforms this is determined using the mechanisms described in
+ * the <ulink url="http://www.freedesktop.org/Standards/basedir-spec">
+ * XDG Base Directory Specification</ulink>
+ *
+ * On Windows the first elements in the list are the Application Data
+ * and Documents folders for All Users. (These can be determined only
+ * on Windows 2000 or later and are not present in the list on other
+ * Windows versions.) See documentation for CSIDL_COMMON_APPDATA and
+ * CSIDL_COMMON_DOCUMENTS.
+ *
+ * Then follows the "share" subfolder in the installation folder for
+ * the package containing the DLL that calls this function, if it can
+ * be determined.
+ *
+ * Finally the list contains the "share" subfolder in the installation
+ * folder for GLib, and in the installation folder for the package the
+ * application's .exe file belongs to.
+ *
+ * The installation folders above are determined by looking up the
+ * folder where the module (DLL or EXE) in question is located. If the
+ * folder's name is "bin", its parent is used, otherwise the folder
+ * itself.
+ *
+ * Note that on Windows the returned list can vary depending on where
+ * this function is called.
+ *
+ * Return value: a %NULL-terminated array of strings owned by GLib that must
+ * not be modified or freed.
+ * Since: 2.6
+ **/
+G_CONST_RETURN gchar * G_CONST_RETURN *
+g_get_system_data_dirs (void)
+{
+ gchar **data_dir_vector;
+
+ G_LOCK (g_utils_global);
+
+ if (!g_system_data_dirs)
+ {
+#ifdef G_OS_WIN32
+ data_dir_vector = (gchar **) g_win32_get_system_data_dirs_for_module (NULL);
+#else
+ gchar *data_dirs = (gchar *) g_getenv ("XDG_DATA_DIRS");
+
+ if (!data_dirs || !data_dirs[0])
+ data_dirs = "/usr/local/share/:/usr/share/";
+
+ data_dir_vector = g_strsplit (data_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
+#endif
+
+ g_system_data_dirs = data_dir_vector;
+ }
+ else
+ data_dir_vector = g_system_data_dirs;
+
+ G_UNLOCK (g_utils_global);
+
+ return (G_CONST_RETURN gchar * G_CONST_RETURN *) data_dir_vector;
+}
+
+/**
+ * g_get_system_config_dirs:
+ *
+ * Returns an ordered list of base directories in which to access
+ * system-wide configuration information.
+ *
+ * On UNIX platforms this is determined using the mechanisms described in
+ * the <ulink url="http://www.freedesktop.org/Standards/basedir-spec">
+ * XDG Base Directory Specification</ulink>
+ *
+ * Return value: a %NULL-terminated array of strings owned by GLib that must
+ * not be modified or freed.
+ * Since: 2.6
+ **/
+G_CONST_RETURN gchar * G_CONST_RETURN *
+g_get_system_config_dirs (void)
+{
+ gchar *conf_dirs, **conf_dir_vector;
+
+ G_LOCK (g_utils_global);
+
+ if (!g_system_config_dirs)
+ {
+#ifdef G_OS_WIN32
+ conf_dirs = get_special_folder (CSIDL_COMMON_APPDATA);
+ if (conf_dirs)
+ {
+ conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
+ g_free (conf_dirs);
+ }
+ else
+ {
+ /* Return empty list */
+ conf_dir_vector = g_strsplit ("", G_SEARCHPATH_SEPARATOR_S, 0);
+ }
+#else
+ conf_dirs = (gchar *) g_getenv ("XDG_CONFIG_DIRS");
+
+ if (!conf_dirs || !conf_dirs[0])
+ conf_dirs = "/etc/xdg";
+
+ conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
+#endif
+
+ g_system_config_dirs = conf_dir_vector;
+ }
+ else
+ conf_dir_vector = g_system_config_dirs;
+ G_UNLOCK (g_utils_global);
+
+ return (G_CONST_RETURN gchar * G_CONST_RETURN *) conf_dir_vector;
+}
+
+#ifndef G_OS_WIN32
+
+static GHashTable *alias_table = NULL;
+
+/* read an alias file for the locales */
+static void
+read_aliases (gchar *file)
+{
+ FILE *fp;
+ char buf[256];
+
+ if (!alias_table)
+ alias_table = g_hash_table_new (g_str_hash, g_str_equal);
+ fp = fopen (file,"r");
+ if (!fp)
+ return;
+ while (fgets (buf, 256, fp))
+ {
+ char *p, *q;
+
+ g_strstrip (buf);
+
+ /* Line is a comment */
+ if ((buf[0] == '#') || (buf[0] == '\0'))
+ continue;
+
+ /* Reads first column */
+ for (p = buf, q = NULL; *p; p++) {
+ if ((*p == '\t') || (*p == ' ') || (*p == ':')) {
+ *p = '\0';
+ q = p+1;
+ while ((*q == '\t') || (*q == ' ')) {
+ q++;
+ }
+ break;
+ }
+ }
+ /* The line only had one column */
+ if (!q || *q == '\0')
+ continue;
+
+ /* Read second column */
+ for (p = q; *p; p++) {
+ if ((*p == '\t') || (*p == ' ')) {
+ *p = '\0';
+ break;
+ }
+ }
+
+ /* Add to alias table if necessary */
+ if (!g_hash_table_lookup (alias_table, buf)) {
+ g_hash_table_insert (alias_table, g_strdup (buf), g_strdup (q));
+ }
+ }
+ fclose (fp);
+}
+
+#endif
+
+static char *
+unalias_lang (char *lang)
+{
+#ifndef G_OS_WIN32
+ char *p;
+ int i;
+
+ if (!alias_table)
+ read_aliases ("/usr/share/locale/locale.alias");
+
+ i = 0;
+ while ((p = g_hash_table_lookup (alias_table, lang)) && (strcmp (p, lang) != 0))
+ {
+ lang = p;
+ if (i++ == 30)
+ {
+ static gboolean said_before = FALSE;
+ if (!said_before)
+ g_warning ("Too many alias levels for a locale, "
+ "may indicate a loop");
+ said_before = TRUE;
+ return lang;
+ }
+ }
+#endif
+ return lang;
+}
+
+/* Mask for components of locale spec. The ordering here is from
+ * least significant to most significant
+ */
+enum
+{
+ COMPONENT_CODESET = 1 << 0,
+ COMPONENT_TERRITORY = 1 << 1,
+ COMPONENT_MODIFIER = 1 << 2
+};
+
+/* Break an X/Open style locale specification into components
+ */
+static guint
+explode_locale (const gchar *locale,
+ gchar **language,
+ gchar **territory,
+ gchar **codeset,
+ gchar **modifier)
+{
+ const gchar *uscore_pos;
+ const gchar *at_pos;
+ const gchar *dot_pos;
+
+ guint mask = 0;
+
+ uscore_pos = strchr (locale, '_');
+ dot_pos = strchr (uscore_pos ? uscore_pos : locale, '.');
+ at_pos = strchr (dot_pos ? dot_pos : (uscore_pos ? uscore_pos : locale), '@');
+
+ if (at_pos)
+ {
+ mask |= COMPONENT_MODIFIER;
+ *modifier = g_strdup (at_pos);
+ }
+ else
+ at_pos = locale + strlen (locale);
+
+ if (dot_pos)
+ {
+ mask |= COMPONENT_CODESET;
+ *codeset = g_strndup (dot_pos, at_pos - dot_pos);
+ }
+ else
+ dot_pos = at_pos;
+
+ if (uscore_pos)
+ {
+ mask |= COMPONENT_TERRITORY;
+ *territory = g_strndup (uscore_pos, dot_pos - uscore_pos);
+ }
+ else
+ uscore_pos = dot_pos;
+
+ *language = g_strndup (locale, uscore_pos - locale);
+
+ return mask;
+}
+
+/*
+ * Compute all interesting variants for a given locale name -
+ * by stripping off different components of the value.
+ *
+ * For simplicity, we assume that the locale is in
+ * X/Open format: language[_territory][.codeset][@modifier]
+ *
+ * TODO: Extend this to handle the CEN format (see the GNUlibc docs)
+ * as well. We could just copy the code from glibc wholesale
+ * but it is big, ugly, and complicated, so I'm reluctant
+ * to do so when this should handle 99% of the time...
+ */
+GSList *
+_g_compute_locale_variants (const gchar *locale)
+{
+ GSList *retval = NULL;
+
+ gchar *language = NULL;
+ gchar *territory = NULL;
+ gchar *codeset = NULL;
+ gchar *modifier = NULL;
+
+ guint mask;
+ guint i;
+
+ g_return_val_if_fail (locale != NULL, NULL);
+
+ mask = explode_locale (locale, &language, &territory, &codeset, &modifier);
+
+ /* Iterate through all possible combinations, from least attractive
+ * to most attractive.
+ */
+ for (i = 0; i <= mask; i++)
+ if ((i & ~mask) == 0)
+ {
+ gchar *val = g_strconcat (language,
+ (i & COMPONENT_TERRITORY) ? territory : "",
+ (i & COMPONENT_CODESET) ? codeset : "",
+ (i & COMPONENT_MODIFIER) ? modifier : "",
+ NULL);
+ retval = g_slist_prepend (retval, val);
+ }
+
+ g_free (language);
+ if (mask & COMPONENT_CODESET)
+ g_free (codeset);
+ if (mask & COMPONENT_TERRITORY)
+ g_free (territory);
+ if (mask & COMPONENT_MODIFIER)
+ g_free (modifier);
+
+ return retval;
+}
+
+/* The following is (partly) taken from the gettext package.
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. */
+
+static const gchar *
+guess_category_value (const gchar *category_name)
+{
+ const gchar *retval;
+
+ /* The highest priority value is the `LANGUAGE' environment
+ variable. This is a GNU extension. */
+ retval = g_getenv ("LANGUAGE");
+ if ((retval != NULL) && (retval[0] != '\0'))
+ return retval;
+
+ /* `LANGUAGE' is not set. So we have to proceed with the POSIX
+ methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some
+ systems this can be done by the `setlocale' function itself. */
+
+ /* Setting of LC_ALL overwrites all other. */
+ retval = g_getenv ("LC_ALL");
+ if ((retval != NULL) && (retval[0] != '\0'))
+ return retval;
+
+ /* Next comes the name of the desired category. */
+ retval = g_getenv (category_name);
+ if ((retval != NULL) && (retval[0] != '\0'))
+ return retval;
+
+ /* Last possibility is the LANG environment variable. */
+ retval = g_getenv ("LANG");
+ if ((retval != NULL) && (retval[0] != '\0'))
+ return retval;
+
+#ifdef G_PLATFORM_WIN32
+ /* g_win32_getlocale() first checks for LC_ALL, LC_MESSAGES and
+ * LANG, which we already did above. Oh well. The main point of
+ * calling g_win32_getlocale() is to get the thread's locale as used
+ * by Windows and the Microsoft C runtime (in the "English_United
+ * States" format) translated into the Unixish format.
+ */
+ retval = g_win32_getlocale ();
+ if ((retval != NULL) && (retval[0] != '\0'))
+ return retval;
+#endif
+
+ return NULL;
+}
+
+typedef struct _GLanguageNamesCache GLanguageNamesCache;
+
+struct _GLanguageNamesCache {
+ gchar *languages;
+ gchar **language_names;
+};
+
+static void
+language_names_cache_free (gpointer data)
+{
+ GLanguageNamesCache *cache = data;
+ g_free (cache->languages);
+ g_strfreev (cache->language_names);
+ g_free (cache);
+}
+
+/**
+ * g_get_language_names:
+ *
+ * Computes a list of applicable locale names, which can be used to
+ * e.g. construct locale-dependent filenames or search paths. The returned
+ * list is sorted from most desirable to least desirable and always contains
+ * the default locale "C".
+ *
+ * For example, if LANGUAGE=de:en_US, then the returned list is
+ * "de", "en_US", "en", "C".
+ *
+ * This function consults the environment variables <envar>LANGUAGE</envar>,
+ * <envar>LC_ALL</envar>, <envar>LC_MESSAGES</envar> and <envar>LANG</envar>
+ * to find the list of locales specified by the user.
+ *
+ * Return value: a %NULL-terminated array of strings owned by GLib
+ * that must not be modified or freed.
+ *
+ * Since: 2.6
+ **/
+G_CONST_RETURN gchar * G_CONST_RETURN *
+g_get_language_names (void)
+{
+ static GStaticPrivate cache_private = G_STATIC_PRIVATE_INIT;
+ GLanguageNamesCache *cache = g_static_private_get (&cache_private);
+ const gchar *value;
+
+ if (!cache)
+ {
+ cache = g_new0 (GLanguageNamesCache, 1);
+ g_static_private_set (&cache_private, cache, language_names_cache_free);
+ }
+
+ value = guess_category_value ("LC_MESSAGES");
+ if (!value)
+ value = "C";
+
+ if (!(cache->languages && strcmp (cache->languages, value) == 0))
+ {
+ gchar **languages;
+ gchar **alist, **a;
+ GSList *list, *l;
+ gint i;
+
+ g_free (cache->languages);
+ g_strfreev (cache->language_names);
+ cache->languages = g_strdup (value);
+
+ alist = g_strsplit (value, ":", 0);
+ list = NULL;
+ for (a = alist; *a; a++)
+ {
+ gchar *b = unalias_lang (*a);
+ list = g_slist_concat (list, _g_compute_locale_variants (b));
+ }
+ g_strfreev (alist);
+ list = g_slist_append (list, g_strdup ("C"));
+
+ cache->language_names = languages = g_new (gchar *, g_slist_length (list) + 1);
+ for (l = list, i = 0; l; l = l->next, i++)
+ languages[i] = l->data;
+ languages[i] = NULL;
+
+ g_slist_free (list);
+ }
+
+ return (G_CONST_RETURN gchar * G_CONST_RETURN *) cache->language_names;
+}
+
+/**
+ * g_direct_hash:
+ * @v: a #gpointer key
+ *
+ * Converts a gpointer to a hash value.
+ * It can be passed to g_hash_table_new() as the @hash_func parameter,
+ * when using pointers as keys in a #GHashTable.
+ *
+ * Returns: a hash value corresponding to the key.
+ */
+guint
+g_direct_hash (gconstpointer v)
+{
+ return GPOINTER_TO_UINT (v);
+}
+
+/**
+ * g_direct_equal:
+ * @v1: a key.
+ * @v2: a key to compare with @v1.
+ *
+ * Compares two #gpointer arguments and returns %TRUE if they are equal.
+ * It can be passed to g_hash_table_new() as the @key_equal_func
+ * parameter, when using pointers as keys in a #GHashTable.
+ *
+ * Returns: %TRUE if the two keys match.
+ */
+gboolean
+g_direct_equal (gconstpointer v1,
+ gconstpointer v2)
+{
+ return v1 == v2;
+}
+
+/**
+ * g_int_equal:
+ * @v1: a pointer to a #gint key.
+ * @v2: a pointer to a #gint key to compare with @v1.
+ *
+ * Compares the two #gint values being pointed to and returns
+ * %TRUE if they are equal.
+ * It can be passed to g_hash_table_new() as the @key_equal_func
+ * parameter, when using pointers to integers as keys in a #GHashTable.
+ *
+ * Returns: %TRUE if the two keys match.
+ */
+gboolean
+g_int_equal (gconstpointer v1,
+ gconstpointer v2)
+{
+ return *((const gint*) v1) == *((const gint*) v2);
+}
+
+/**
+ * g_int_hash:
+ * @v: a pointer to a #gint key
+ *
+ * Converts a pointer to a #gint to a hash value.
+ * It can be passed to g_hash_table_new() as the @hash_func parameter,
+ * when using pointers to integers values as keys in a #GHashTable.
+ *
+ * Returns: a hash value corresponding to the key.
+ */
+guint
+g_int_hash (gconstpointer v)
+{
+ return *(const gint*) v;
+}
+
+/**
+ * g_nullify_pointer:
+ * @nullify_location: the memory address of the pointer.
+ *
+ * Set the pointer at the specified location to %NULL.
+ **/
+void
+g_nullify_pointer (gpointer *nullify_location)
+{
+ g_return_if_fail (nullify_location != NULL);
+
+ *nullify_location = NULL;
+}
+
+/**
+ * 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)
+{
+ const gchar *charset;
+
+ g_get_charset (&charset);
+
+ return g_strdup (charset);
+}
+
+/* This is called from g_thread_init(). It's used to
+ * initialize some static data in a threadsafe way.
+ */
+void
+_g_utils_thread_init (void)
+{
+ g_get_language_names ();
+}
+
+#ifdef ENABLE_NLS
+
+#include <libintl.h>
+
+#ifdef G_OS_WIN32
+
+/**
+ * _glib_get_locale_dir:
+ *
+ * Return the path to the lib\locale subfolder of the GLib
+ * installation folder. The path is in the system codepage. We have to
+ * use system codepage as bindtextdomain() doesn't have a UTF-8
+ * interface.
+ */
+static const gchar *
+_glib_get_locale_dir (void)
+{
+ gchar *dir, *cp_dir;
+ gchar *retval = NULL;
+
+ dir = g_win32_get_package_installation_directory (GETTEXT_PACKAGE, dll_name);
+ cp_dir = g_win32_locale_filename_from_utf8 (dir);
+ g_free (dir);
+
+ if (cp_dir)
+ {
+ /* Don't use g_build_filename() on pathnames in the system
+ * codepage. In CJK locales cp_dir might end with a double-byte
+ * character whose trailing byte is a backslash.
+ */
+ retval = g_strconcat (cp_dir, "\\lib\\locale", NULL);
+ g_free (cp_dir);
+ }
+
+ if (retval)
+ return retval;
+ else
+ return g_strdup ("");
+}
+
+#undef GLIB_LOCALE_DIR
+#define GLIB_LOCALE_DIR _glib_get_locale_dir ()
+
+#endif /* G_OS_WIN32 */
+
+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);
+# ifdef HAVE_BIND_TEXTDOMAIN_CODESET
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+# endif
+ _glib_gettext_initialized = TRUE;
+ }
+
+ return dgettext (GETTEXT_PACKAGE, str);
+}
+
+#endif /* ENABLE_NLS */
+
+#ifdef G_OS_WIN32
+
+/* Binary compatibility versions. Not for newly compiled code. */
+
+#undef g_find_program_in_path
+
+gchar*
+g_find_program_in_path (const gchar *program)
+{
+ gchar *utf8_program = g_locale_to_utf8 (program, -1, NULL, NULL, NULL);
+ gchar *utf8_retval = g_find_program_in_path_utf8 (utf8_program);
+ gchar *retval;
+
+ g_free (utf8_program);
+ if (utf8_retval == NULL)
+ return NULL;
+ retval = g_locale_from_utf8 (utf8_retval, -1, NULL, NULL, NULL);
+ g_free (utf8_retval);
+
+ return retval;
+}
+
+#undef g_get_current_dir
+
+gchar*
+g_get_current_dir (void)
+{
+ gchar *utf8_dir = g_get_current_dir_utf8 ();
+ gchar *dir = g_locale_from_utf8 (utf8_dir, -1, NULL, NULL, NULL);
+ g_free (utf8_dir);
+ return dir;
+}
+
+#undef g_getenv
+
+G_CONST_RETURN gchar*
+g_getenv (const gchar *variable)
+{
+ gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL);
+ const gchar *utf8_value = g_getenv_utf8 (utf8_variable);
+ gchar *value;
+ GQuark quark;
+
+ g_free (utf8_variable);
+ if (!utf8_value)
+ return NULL;
+ value = g_locale_from_utf8 (utf8_value, -1, NULL, NULL, NULL);
+ quark = g_quark_from_string (value);
+ g_free (value);
+
+ return g_quark_to_string (quark);
+}
+
+#undef g_setenv
+
+gboolean
+g_setenv (const gchar *variable,
+ const gchar *value,
+ gboolean overwrite)
+{
+ gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL);
+ gchar *utf8_value = g_locale_to_utf8 (value, -1, NULL, NULL, NULL);
+ gboolean retval = g_setenv_utf8 (utf8_variable, utf8_value, overwrite);
+
+ g_free (utf8_variable);
+ g_free (utf8_value);
+
+ return retval;
+}
+
+#undef g_unsetenv
+
+void
+g_unsetenv (const gchar *variable)
+{
+ gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL);
+
+ g_unsetenv_utf8 (utf8_variable);
+
+ g_free (utf8_variable);
+}
+
+#undef g_get_user_name
+
+G_CONST_RETURN gchar*
+g_get_user_name (void)
+{
+ g_get_any_init_locked ();
+ return g_user_name_cp;
+}
+
+#undef g_get_real_name
+
+G_CONST_RETURN gchar*
+g_get_real_name (void)
+{
+ g_get_any_init_locked ();
+ return g_real_name_cp;
+}
+
+#undef g_get_home_dir
+
+G_CONST_RETURN gchar*
+g_get_home_dir (void)
+{
+ g_get_any_init_locked ();
+ return g_home_dir_cp;
+}
+
+#undef g_get_tmp_dir
+
+G_CONST_RETURN gchar*
+g_get_tmp_dir (void)
+{
+ g_get_any_init_locked ();
+ return g_tmp_dir_cp;
+}
+
+#endif
+
+#define __G_UTILS_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gutils.h b/trunk/glib/gutils.h
new file mode 100644
index 000000000..4e64b71c9
--- /dev/null
+++ b/trunk/glib/gutils.h
@@ -0,0 +1,467 @@
+/* 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 <glib/gtypes.h>
+#include <stdarg.h>
+
+G_BEGIN_DECLS
+
+#ifdef G_OS_WIN32
+
+/* On Win32, the canonical directory separator is the backslash, and
+ * the search path separator is the semicolon. Note that also the
+ * (forward) slash works as directory separator.
+ */
+#define G_DIR_SEPARATOR '\\'
+#define G_DIR_SEPARATOR_S "\\"
+#define G_IS_DIR_SEPARATOR(c) ((c) == G_DIR_SEPARATOR || (c) == '/')
+#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_IS_DIR_SEPARATOR(c) ((c) == G_DIR_SEPARATOR)
+#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'.
+ * G_CAN_INLINE is defined in glibconfig.h if the compiler seems to be
+ * actually *capable* to do function inlining, in which case inline
+ * function bodies 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.
+ */
+#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 */
+# endif
+#endif
+#ifdef G_IMPLEMENT_INLINES
+# define G_INLINE_FUNC
+# undef G_CAN_INLINE
+#elif defined (__GNUC__)
+# define G_INLINE_FUNC extern inline
+#elif defined (G_CAN_INLINE)
+# define G_INLINE_FUNC static inline
+#else /* can't inline */
+# define G_INLINE_FUNC
+#endif /* !G_INLINE_FUNC */
+
+/* Retrive static string info
+ */
+#ifdef G_OS_WIN32
+#define g_get_user_name g_get_user_name_utf8
+#define g_get_real_name g_get_real_name_utf8
+#define g_get_home_dir g_get_home_dir_utf8
+#define g_get_tmp_dir g_get_tmp_dir_utf8
+#endif
+
+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);
+G_CONST_RETURN gchar* g_get_host_name (void);
+gchar* g_get_prgname (void);
+void g_set_prgname (const gchar *prgname);
+G_CONST_RETURN gchar* g_get_application_name (void);
+void g_set_application_name (const gchar *application_name);
+
+G_CONST_RETURN gchar* g_get_user_data_dir (void);
+G_CONST_RETURN gchar* g_get_user_config_dir (void);
+G_CONST_RETURN gchar* g_get_user_cache_dir (void);
+G_CONST_RETURN gchar* G_CONST_RETURN * g_get_system_data_dirs (void);
+
+#ifdef G_OS_WIN32
+G_CONST_RETURN gchar* G_CONST_RETURN * g_win32_get_system_data_dirs_for_module (gconstpointer address);
+#endif
+
+#if defined (G_OS_WIN32) && defined (G_CAN_INLINE) && !defined (__cplusplus)
+static inline G_CONST_RETURN gchar * G_CONST_RETURN *
+g_win32_get_system_data_dirs (void)
+{
+ return g_win32_get_system_data_dirs_for_module ((gconstpointer) &g_win32_get_system_data_dirs);
+}
+#define g_get_system_data_dirs g_win32_get_system_data_dirs
+#endif
+
+G_CONST_RETURN gchar* G_CONST_RETURN * g_get_system_config_dirs (void);
+
+G_CONST_RETURN gchar* G_CONST_RETURN * g_get_language_names (void);
+
+/**
+ * GUserDirectory:
+ *
+ * These are logical ids for special directories which are defined
+ * depending on the platform used. You should use g_get_user_special_dir()
+ * to retrieve the full path associated to the logical id.
+ *
+ * The #GUserDirectory enumeration can be extended at later date. Not
+ * every platform has a directory for every logical id in this
+ * enumeration.
+ *
+ * @G_USER_DIRECTORY_DESKTOP: the user's Desktop directory
+ * @G_USER_DIRECTORY_DOCUMENTS: the user's Documents directory
+ * @G_USER_DIRECTORY_DOWNLOAD: the user's Downloads directory
+ * @G_USER_DIRECTORY_MUSIC: the user's Music directory
+ * @G_USER_DIRECTORY_PICTURES: the user's Pictures directory
+ * @G_USER_DIRECTORY_PUBLIC_SHARE: the user's shared directory
+ * @G_USER_DIRECTORY_TEMPLATES: the user's Templates directory
+ * @G_USER_DIRECTORY_VIDEOS: the user's Movies directory
+ *
+ * Since: 2.14
+ */
+typedef enum {
+ G_USER_DIRECTORY_DESKTOP,
+ G_USER_DIRECTORY_DOCUMENTS,
+ G_USER_DIRECTORY_DOWNLOAD,
+ G_USER_DIRECTORY_MUSIC,
+ G_USER_DIRECTORY_PICTURES,
+ G_USER_DIRECTORY_PUBLIC_SHARE,
+ G_USER_DIRECTORY_TEMPLATES,
+ G_USER_DIRECTORY_VIDEOS,
+
+ G_USER_N_DIRECTORIES
+} GUserDirectory;
+
+G_CONST_RETURN gchar* g_get_user_special_dir (GUserDirectory directory);
+
+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 */
+
+#ifdef G_OS_WIN32
+#define g_get_current_dir g_get_current_dir_utf8
+#endif
+
+/* The returned strings are newly allocated with g_malloc() */
+gchar* g_get_current_dir (void);
+gchar* g_path_get_basename (const gchar *file_name) G_GNUC_MALLOC;
+gchar* g_path_get_dirname (const gchar *file_name) G_GNUC_MALLOC;
+
+/* Set the pointer at the specified location to NULL */
+void g_nullify_pointer (gpointer *nullify_location);
+
+/* return the environment string for the variable. The returned memory
+ * must not be freed. */
+#ifdef G_OS_WIN32
+#define g_getenv g_getenv_utf8
+#define g_setenv g_setenv_utf8
+#define g_unsetenv g_unsetenv_utf8
+#define g_find_program_in_path g_find_program_in_path_utf8
+#endif
+
+G_CONST_RETURN gchar* g_getenv (const gchar *variable);
+gboolean g_setenv (const gchar *variable,
+ const gchar *value,
+ gboolean overwrite);
+void g_unsetenv (const gchar *variable);
+gchar** g_listenv (void);
+
+/* private */
+const gchar* _g_getenv_nomalloc (const gchar *variable,
+ gchar buffer[1024]);
+
+/* we try to provide a useful 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);
+
+#ifdef G_OS_WIN32
+/* It's a bad idea to wrap atexit() on Windows. If the GLib DLL calls
+ * atexit(), the function will be called when the GLib DLL is detached
+ * from the program, which is not what the caller wants. The caller
+ * wants the function to be called when it *itself* exits (or is
+ * detached, in case the caller, too, is a DLL).
+ */
+int atexit (void (*)(void));
+#define g_atexit(func) atexit(func)
+#endif
+
+/* 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 (gulong mask,
+ gint nth_bit) G_GNUC_CONST;
+G_INLINE_FUNC gint g_bit_nth_msf (gulong mask,
+ gint nth_bit) G_GNUC_CONST;
+G_INLINE_FUNC guint g_bit_storage (gulong number) G_GNUC_CONST;
+
+/* 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 (gulong mask,
+ gint nth_bit)
+{
+ if (G_UNLIKELY (nth_bit < -1))
+ nth_bit = -1;
+ while (nth_bit < ((GLIB_SIZEOF_LONG * 8) - 1))
+ {
+ nth_bit++;
+ if (mask & (1UL << nth_bit))
+ return nth_bit;
+ }
+ return -1;
+}
+G_INLINE_FUNC gint
+g_bit_nth_msf (gulong mask,
+ gint nth_bit)
+{
+ if (nth_bit < 0 || G_UNLIKELY (nth_bit > GLIB_SIZEOF_LONG * 8))
+ nth_bit = GLIB_SIZEOF_LONG * 8;
+ while (nth_bit > 0)
+ {
+ nth_bit--;
+ if (mask & (1UL << nth_bit))
+ return nth_bit;
+ }
+ return -1;
+}
+G_INLINE_FUNC guint
+g_bit_storage (gulong number)
+{
+#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__)
+ return G_LIKELY (number) ?
+ ((GLIB_SIZEOF_LONG * 8 - 1) ^ __builtin_clzl(number)) + 1 : 1;
+#else
+ register guint n_bits = 0;
+
+ do
+ {
+ n_bits++;
+ number >>= 1;
+ }
+ while (number);
+ return n_bits;
+#endif
+}
+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;
+
+const gchar * glib_check_version (guint required_major,
+ guint required_minor,
+ guint required_micro);
+
+#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
+
+/*
+ * On Windows, this macro defines a DllMain function that stores the
+ * actual DLL name that the code being compiled will be included in.
+ * STATIC should be empty or 'static'. DLL_NAME is the name of the
+ * (pointer to the) char array where the DLL name will be stored. If
+ * this is used, you must also include <windows.h>. If you need a more complex
+ * DLL entry point function, you cannot use this.
+ *
+ * On non-Windows platforms, expands to nothing.
+ */
+
+#ifndef G_PLATFORM_WIN32
+# define G_WIN32_DLLMAIN_FOR_DLL_NAME(static, dll_name)
+#else
+# define G_WIN32_DLLMAIN_FOR_DLL_NAME(static, dll_name) \
+static char *dll_name; \
+ \
+BOOL WINAPI \
+DllMain (HINSTANCE hinstDLL, \
+ DWORD fdwReason, \
+ LPVOID lpvReserved) \
+{ \
+ wchar_t wcbfr[1000]; \
+ char *tem; \
+ switch (fdwReason) \
+ { \
+ case DLL_PROCESS_ATTACH: \
+ GetModuleFileNameW ((HMODULE) hinstDLL, wcbfr, G_N_ELEMENTS (wcbfr)); \
+ tem = g_utf16_to_utf8 (wcbfr, -1, NULL, NULL, NULL); \
+ dll_name = g_path_get_basename (tem); \
+ g_free (tem); \
+ break; \
+ } \
+ \
+ return TRUE; \
+}
+#endif /* G_PLATFORM_WIN32 */
+
+#endif /* __G_UTILS_H__ */
diff --git a/trunk/glib/gwin32.c b/trunk/glib/gwin32.c
new file mode 100644
index 000000000..f7de19f98
--- /dev/null
+++ b/trunk/glib/gwin32.c
@@ -0,0 +1,570 @@
+/* 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.
+ */
+
+#include "config.h"
+
+#include "glibconfig.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <wchar.h>
+#include <errno.h>
+
+#define STRICT /* Strict typing, please */
+#include <windows.h>
+#undef STRICT
+#ifndef G_WITH_CYGWIN
+#include <direct.h>
+#endif
+#include <errno.h>
+#include <ctype.h>
+#if defined(_MSC_VER) || defined(__DMC__)
+# include <io.h>
+#endif /* _MSC_VER || __DMC__ */
+
+#include "glib.h"
+#include "galias.h"
+
+#ifdef G_WITH_CYGWIN
+#include <sys/cygwin.h>
+#endif
+
+#ifndef G_WITH_CYGWIN
+
+gint
+g_win32_ftruncate (gint fd,
+ guint size)
+{
+ return _chsize (fd, size);
+}
+
+#endif
+
+/**
+ * g_win32_getlocale:
+ *
+ * The setlocale() function in the Microsoft C library uses locale
+ * names of the form "English_United States.1252" etc. We want the
+ * UNIXish standard form "en_US", "zh_TW" etc. This function gets the
+ * current thread locale from Windows - without any encoding info -
+ * 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: newly-allocated locale name.
+ **/
+
+#ifndef SUBLANG_SERBIAN_LATIN_BA
+#define SUBLANG_SERBIAN_LATIN_BA 0x06
+#endif
+
+gchar *
+g_win32_getlocale (void)
+{
+ LCID lcid;
+ LANGID langid;
+ gchar *ev;
+ gint primary, sub;
+ char iso639[10];
+ char iso3166[10];
+ const gchar *script = NULL;
+
+ /* Let the user override the system settings through environment
+ * variables, as on POSIX systems. Note that in GTK+ applications
+ * since GTK+ 2.10.7 setting either LC_ALL or LANG also sets the
+ * Win32 locale and C library locale through code in gtkmain.c.
+ */
+ if (((ev = getenv ("LC_ALL")) != NULL && ev[0] != '\0')
+ || ((ev = getenv ("LC_MESSAGES")) != NULL && ev[0] != '\0')
+ || ((ev = getenv ("LANG")) != NULL && ev[0] != '\0'))
+ return g_strdup (ev);
+
+ lcid = GetThreadLocale ();
+
+ if (!GetLocaleInfo (lcid, LOCALE_SISO639LANGNAME, iso639, sizeof (iso639)) ||
+ !GetLocaleInfo (lcid, LOCALE_SISO3166CTRYNAME, iso3166, sizeof (iso3166)))
+ return g_strdup ("C");
+
+ /* Strip off the sorting rules, keep only the language part. */
+ langid = LANGIDFROMLCID (lcid);
+
+ /* Split into language and territory part. */
+ primary = PRIMARYLANGID (langid);
+ sub = SUBLANGID (langid);
+
+ /* Handle special cases */
+ switch (primary)
+ {
+ case LANG_AZERI:
+ switch (sub)
+ {
+ case SUBLANG_AZERI_LATIN:
+ script = "@Latn";
+ break;
+ case SUBLANG_AZERI_CYRILLIC:
+ script = "@Cyrl";
+ break;
+ }
+ break;
+ case LANG_SERBIAN: /* LANG_CROATIAN == LANG_SERBIAN */
+ switch (sub)
+ {
+ case SUBLANG_SERBIAN_LATIN:
+ case 0x06: /* Serbian (Latin) - Bosnia and Herzegovina */
+ script = "@Latn";
+ break;
+ }
+ break;
+ case LANG_UZBEK:
+ switch (sub)
+ {
+ case SUBLANG_UZBEK_LATIN:
+ script = "@Latn";
+ break;
+ case SUBLANG_UZBEK_CYRILLIC:
+ script = "@Cyrl";
+ break;
+ }
+ break;
+ }
+ return g_strconcat (iso639, "_", iso3166, script, NULL);
+}
+
+/**
+ * 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
+ * language, or US English (see docs for FormatMessage()). The
+ * returned string is in UTF-8. It should be deallocated with
+ * g_free().
+ *
+ * Returns: newly-allocated error message
+ **/
+gchar *
+g_win32_error_message (gint error)
+{
+ gchar *retval;
+ wchar_t *msg = NULL;
+ int nchars;
+
+ FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER
+ |FORMAT_MESSAGE_IGNORE_INSERTS
+ |FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL, error, 0,
+ (LPWSTR) &msg, 0, NULL);
+ if (msg != NULL)
+ {
+ nchars = wcslen (msg);
+
+ if (nchars > 2 && msg[nchars-1] == '\n' && msg[nchars-2] == '\r')
+ msg[nchars-2] = '\0';
+
+ retval = g_utf16_to_utf8 (msg, -1, NULL, NULL, NULL);
+
+ LocalFree (msg);
+ }
+ else
+ retval = g_strdup ("");
+
+ return retval;
+}
+
+static gchar *
+get_package_directory_from_module (const gchar *module_name)
+{
+ static GHashTable *module_dirs = NULL;
+ G_LOCK_DEFINE_STATIC (module_dirs);
+ HMODULE hmodule = NULL;
+ gchar *fn;
+ gchar *p;
+ gchar *result;
+ wchar_t wc_fn[MAX_PATH];
+
+ G_LOCK (module_dirs);
+
+ 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)
+ {
+ G_UNLOCK (module_dirs);
+ return g_strdup (result);
+ }
+
+ if (module_name)
+ {
+ wchar_t *wc_module_name = g_utf8_to_utf16 (module_name, -1, NULL, NULL, NULL);
+ hmodule = GetModuleHandleW (wc_module_name);
+ g_free (wc_module_name);
+
+ if (!hmodule)
+ return NULL;
+ }
+
+ if (!GetModuleFileNameW (hmodule, wc_fn, MAX_PATH))
+ {
+ G_UNLOCK (module_dirs);
+ return NULL;
+ }
+ fn = g_utf16_to_utf8 (wc_fn, -1, NULL, NULL, NULL);
+
+ if ((p = strrchr (fn, G_DIR_SEPARATOR)) != NULL)
+ *p = '\0';
+
+ p = strrchr (fn, G_DIR_SEPARATOR);
+ if (p && (g_ascii_strcasecmp (p + 1, "bin") == 0 ||
+ g_ascii_strcasecmp (p + 1, "lib") == 0))
+ *p = '\0';
+
+#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
+
+ g_hash_table_insert (module_dirs, module_name ? g_strdup (module_name) : "", fn);
+
+ G_UNLOCK (module_dirs);
+
+ return g_strdup (fn);
+}
+
+/**
+ * g_win32_get_package_installation_directory:
+ * @package: An identifier for a software package, or %NULL, in UTF-8
+ * @dll_name: The name of a DLL that a package provides, or %NULL, in UTF-8
+ *
+ * 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
+ * <literal>GETTEXT_PACKAGE</literal> in software configured according
+ * to GNU standards. The function first looks in the Windows Registry
+ * for the value <literal>&num;InstallationDirectory</literal> in the key
+ * <literal>&num;HKLM\Software\@package</literal>, 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 used instead in
+ * the same way as above.
+ *
+ * Returns: a string containing the installation directory for
+ * @package. The string is in the GLib file name encoding, i.e. UTF-8
+ * on Windows. The return value should be freed with g_free() when not
+ * needed any longer.
+ **/
+
+gchar *
+g_win32_get_package_installation_directory (const gchar *package,
+ const gchar *dll_name)
+{
+ static GHashTable *package_dirs = NULL;
+ G_LOCK_DEFINE_STATIC (package_dirs);
+ gchar *result = NULL;
+ gchar *key;
+ wchar_t *wc_key;
+ HKEY reg_key = NULL;
+ DWORD type;
+ DWORD nbytes;
+
+ if (package != NULL)
+ {
+ G_LOCK (package_dirs);
+
+ 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])
+ {
+ G_UNLOCK (package_dirs);
+ return g_strdup (result);
+ }
+
+ key = g_strconcat ("Software\\", package, NULL);
+
+ nbytes = 0;
+
+ wc_key = g_utf8_to_utf16 (key, -1, NULL, NULL, NULL);
+ if (((RegOpenKeyExW (HKEY_CURRENT_USER, wc_key, 0,
+ KEY_QUERY_VALUE, &reg_key) == ERROR_SUCCESS
+ && RegQueryValueExW (reg_key, L"InstallationDirectory", 0,
+ &type, NULL, &nbytes) == ERROR_SUCCESS)
+ ||
+ (RegOpenKeyExW (HKEY_LOCAL_MACHINE, wc_key, 0,
+ KEY_QUERY_VALUE, &reg_key) == ERROR_SUCCESS
+ && RegQueryValueExW (reg_key, L"InstallationDirectory", 0,
+ &type, NULL, &nbytes) == ERROR_SUCCESS))
+ && type == REG_SZ)
+ {
+ wchar_t *wc_temp = g_new (wchar_t, (nbytes+1)/2 + 1);
+ RegQueryValueExW (reg_key, L"InstallationDirectory", 0,
+ &type, (LPBYTE) wc_temp, &nbytes);
+ wc_temp[nbytes/2] = '\0';
+ result = g_utf16_to_utf8 (wc_temp, -1, NULL, NULL, NULL);
+ g_free (wc_temp);
+ }
+ g_free (wc_key);
+
+ if (reg_key != NULL)
+ RegCloseKey (reg_key);
+
+ g_free (key);
+
+ if (result)
+ {
+ g_hash_table_insert (package_dirs, g_strdup (package), result);
+ G_UNLOCK (package_dirs);
+ return g_strdup (result);
+ }
+ G_UNLOCK (package_dirs);
+ }
+
+ if (dll_name != NULL)
+ result = get_package_directory_from_module (dll_name);
+
+ if (result == NULL)
+ result = get_package_directory_from_module (NULL);
+
+ return result;
+}
+
+#undef g_win32_get_package_installation_directory
+
+/* DLL ABI binary compatibility version that uses system codepage file names */
+
+gchar *
+g_win32_get_package_installation_directory (const gchar *package,
+ const gchar *dll_name)
+{
+ gchar *utf8_package = NULL, *utf8_dll_name = NULL;
+ gchar *utf8_retval, *retval;
+
+ if (package != NULL)
+ utf8_package = g_locale_to_utf8 (package, -1, NULL, NULL, NULL);
+
+ if (dll_name != NULL)
+ utf8_dll_name = g_locale_to_utf8 (dll_name, -1, NULL, NULL, NULL);
+
+ utf8_retval =
+ g_win32_get_package_installation_directory_utf8 (utf8_package,
+ utf8_dll_name);
+
+ retval = g_locale_from_utf8 (utf8_retval, -1, NULL, NULL, NULL);
+
+ g_free (utf8_package);
+ g_free (utf8_dll_name);
+ g_free (utf8_retval);
+
+ return retval;
+}
+
+/**
+ * g_win32_get_package_installation_subdirectory:
+ * @package: An identifier for a software package, in UTF-8, or %NULL
+ * @dll_name: The name of a DLL that a package provides, in UTF-8, or %NULL
+ * @subdir: A subdirectory of the package installation directory, also in UTF-8
+ *
+ * Returns a newly-allocated string containing 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.
+ *
+ * Returns: a string containing the complete path to @subdir inside
+ * the installation directory of @package. The returned string is in
+ * the GLib file name encoding, i.e. UTF-8 on Windows. The return
+ * value should be freed with g_free() when no longer needed.
+ **/
+
+gchar *
+g_win32_get_package_installation_subdirectory (const gchar *package,
+ const gchar *dll_name,
+ const gchar *subdir)
+{
+ gchar *prefix;
+ gchar *dirname;
+
+ prefix = g_win32_get_package_installation_directory_utf8 (package, dll_name);
+
+ dirname = g_build_filename (prefix, subdir, NULL);
+ g_free (prefix);
+
+ return dirname;
+}
+
+#undef g_win32_get_package_installation_subdirectory
+
+/* DLL ABI binary compatibility version that uses system codepage file names */
+
+gchar *
+g_win32_get_package_installation_subdirectory (const gchar *package,
+ const gchar *dll_name,
+ const gchar *subdir)
+{
+ gchar *prefix;
+ gchar *dirname;
+
+ prefix = g_win32_get_package_installation_directory (package, dll_name);
+
+ dirname = g_build_filename (prefix, subdir, NULL);
+ g_free (prefix);
+
+ return dirname;
+}
+
+static guint windows_version;
+
+static void
+g_win32_windows_version_init (void)
+{
+ static gboolean beenhere = FALSE;
+
+ if (!beenhere)
+ {
+ beenhere = TRUE;
+ windows_version = GetVersion ();
+
+ if (windows_version & 0x80000000)
+ g_error ("This version of GLib requires NT-based Windows.");
+ }
+}
+
+void
+_g_win32_thread_init (void)
+{
+ g_win32_windows_version_init ();
+}
+
+/**
+ * g_win32_get_windows_version:
+ *
+ * Returns version information for the Windows operating system the
+ * code is running on. See MSDN documentation for the GetVersion()
+ * function. To summarize, the most significant bit is one on Win9x,
+ * and zero on NT-based systems. Since version 2.14, GLib works only
+ * on NT-based systems, so checking whether your are running on Win9x
+ * in your own software is moot. The least significant byte is 4 on
+ * Windows NT 4, and 5 on Windows XP. Software that needs really
+ * detailled version and feature information should use Win32 API like
+ * GetVersionEx() and VerifyVersionInfo().
+ *
+ * Returns: The version information.
+ *
+ * Since: 2.6
+ **/
+guint
+g_win32_get_windows_version (void)
+{
+ g_win32_windows_version_init ();
+
+ return windows_version;
+}
+
+/**
+ * g_win32_locale_filename_from_utf8:
+ * @utf8filename: a UTF-8 encoded filename.
+ *
+ * Converts a filename from UTF-8 to the system codepage.
+ *
+ * On NT-based Windows, on NTFS file systems, file names are in
+ * Unicode. It is quite possible that Unicode file names contain
+ * characters not representable in the system codepage. (For instance,
+ * Greek or Cyrillic characters on Western European or US Windows
+ * installations, or various less common CJK characters on CJK Windows
+ * installations.)
+ *
+ * In such a case, and if the filename refers to an existing file, and
+ * the file system stores alternate short (8.3) names for directory
+ * entries, the short form of the filename is returned. Note that the
+ * "short" name might in fact be longer than the Unicode name if the
+ * Unicode name has very short pathname components containing
+ * non-ASCII characters. If no system codepage name for the file is
+ * possible, %NULL is returned.
+ *
+ * The return value is dynamically allocated and should be freed with
+ * g_free() when no longer needed.
+ *
+ * Return value: The converted filename, or %NULL on conversion
+ * failure and lack of short names.
+ *
+ * Since: 2.8
+ */
+gchar *
+g_win32_locale_filename_from_utf8 (const gchar *utf8filename)
+{
+ gchar *retval = g_locale_from_utf8 (utf8filename, -1, NULL, NULL, NULL);
+
+ if (retval == NULL)
+ {
+ /* Conversion failed, so convert to wide chars, check if there
+ * is a 8.3 version, and use that.
+ */
+ wchar_t *wname = g_utf8_to_utf16 (utf8filename, -1, NULL, NULL, NULL);
+ if (wname != NULL)
+ {
+ wchar_t wshortname[MAX_PATH + 1];
+ if (GetShortPathNameW (wname, wshortname, G_N_ELEMENTS (wshortname)))
+ {
+ gchar *tem = g_utf16_to_utf8 (wshortname, -1, NULL, NULL, NULL);
+ retval = g_locale_from_utf8 (tem, -1, NULL, NULL, NULL);
+ g_free (tem);
+ }
+ g_free (wname);
+ }
+ }
+ return retval;
+}
+
+#define __G_WIN32_C__
+#include "galiasdef.c"
diff --git a/trunk/glib/gwin32.h b/trunk/glib/gwin32.h
new file mode 100644
index 000000000..431b1989f
--- /dev/null
+++ b/trunk/glib/gwin32.h
@@ -0,0 +1,104 @@
+/* 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 <glib/gtypes.h>
+
+#ifdef G_PLATFORM_WIN32
+
+G_BEGIN_DECLS
+
+#ifndef MAXPATHLEN
+#define MAXPATHLEN 1024
+#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). But note that
+ * for POSIX functions that take or return file names in the system
+ * codepage, in many cases you would want to use the GLib wrappers in
+ * gstdio.h and UTF-8 instead.
+ *
+ * getcwd: <direct.h> (MSVC), <io.h> (mingw32)
+ * getpid: <process.h>
+ * access: <io.h>
+ * unlink: <stdio.h> or <io.h>
+ * open, read, write, lseek, close: <io.h>
+ * rmdir: <io.h>
+ * pipe: <io.h> (actually, _pipe())
+ */
+
+/* For some POSIX functions that are not provided by the MS runtime,
+ * we provide emulation functions in glib, which are prefixed with
+ * g_win32_. Or that was the idea at some time, but there is just one
+ * of those:
+ */
+gint g_win32_ftruncate (gint f,
+ guint size);
+#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);
+
+#define g_win32_get_package_installation_directory g_win32_get_package_installation_directory_utf8
+#define g_win32_get_package_installation_subdirectory g_win32_get_package_installation_subdirectory_utf8
+
+gchar* g_win32_get_package_installation_directory (const gchar *package,
+ const gchar *dll_name);
+
+gchar* g_win32_get_package_installation_subdirectory (const gchar *package,
+ const gchar *dll_name,
+ const gchar *subdir);
+
+guint g_win32_get_windows_version (void);
+
+gchar* g_win32_locale_filename_from_utf8 (const gchar *utf8filename);
+
+/* As of GLib 2.14 we only support NT-based Windows */
+#define G_WIN32_IS_NT_BASED() TRUE
+#define G_WIN32_HAVE_WIDECHAR_API() TRUE
+
+G_END_DECLS
+
+#endif /* G_PLATFORM_WIN32 */
+
+#endif /* __G_WIN32_H__ */
diff --git a/trunk/glib/libcharset/Makefile.am b/trunk/glib/libcharset/Makefile.am
new file mode 100644
index 000000000..c01945722
--- /dev/null
+++ b/trunk/glib/libcharset/Makefile.am
@@ -0,0 +1,62 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = \
+ -DLIBDIR=\"$(libdir)\" -I$(top_srcdir)
+
+noinst_LTLIBRARIES = libcharset.la
+
+libcharset_la_SOURCES = \
+ libcharset.h \
+ localcharset.c
+
+EXTRA_DIST = \
+ README \
+ config.charset \
+ ref-add.sin \
+ ref-del.sin \
+ glibc21.m4 \
+ codeset.m4 \
+ update.sh \
+ make-patch.sh \
+ libcharset-glib.patch
+
+charset_alias = $(DESTDIR)$(libdir)/charset.alias
+charset_tmp = $(DESTDIR)$(libdir)/charset.tmp
+install-exec-local: all-local
+ $(mkinstalldirs) $(DESTDIR)$(libdir)
+ if test -f $(charset_alias); then \
+ sed -f ref-add.sed $(charset_alias) > $(charset_tmp) ; \
+ $(INSTALL_DATA) $(charset_tmp) $(charset_alias) ; \
+ rm -f $(charset_tmp) ; \
+ else \
+ if test @GLIBC21@ = no; then \
+ sed -f ref-add.sed charset.alias > $(charset_tmp) ; \
+ $(INSTALL_DATA) $(charset_tmp) $(charset_alias) ; \
+ rm -f $(charset_tmp) ; \
+ fi ; \
+ fi
+
+uninstall-local: all-local
+ if test -f $(charset_alias); then \
+ sed -f ref-del.sed $(charset_alias) > $(charset_tmp); \
+ if grep '^# Packages using this file: $$' $(charset_tmp) \
+ > /dev/null; then \
+ rm -f $(charset_alias); \
+ else \
+ $(INSTALL_DATA) $(charset_tmp) $(charset_alias); \
+ fi; \
+ rm -f $(charset_tmp); \
+ fi
+
+charset.alias: config.charset
+ $(SHELL) $(srcdir)/config.charset '@host@' > t-$@
+ mv t-$@ $@
+
+all-local: ref-add.sed ref-del.sed charset.alias
+
+SUFFIXES = .sed .sin
+.sin.sed:
+ sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $< > t-$@
+ mv t-$@ $@
+
+CLEANFILES = charset.alias ref-add.sed ref-del.sed
diff --git a/trunk/glib/libcharset/README b/trunk/glib/libcharset/README
new file mode 100644
index 000000000..cbb4f1ef3
--- /dev/null
+++ b/trunk/glib/libcharset/README
@@ -0,0 +1,41 @@
+The sources are derived from Bruno Haible's libcharset library included
+with libiconv:
+
+ http//www.gnu.org/software/libiconv
+
+The 'update.sh' script in this directory, when pointed at
+the original sources updates the files in this directory
+(and elsewhere in the GLib distribution) to the new version
+
+The 'make-patch.sh' script in this directory regenerates
+the patch files included in this directory from a copy
+of the pristine sources and the files in this directory.
+
+The license on the portions from libiconv portions is reproduced
+below.
+
+Owen Taylor
+26 September 2001
+
+====
+
+/* Determine a canonical name for the current locale's character encoding.
+
+ Copyright (C) 2000-2001 Free Software Foundation, Inc.
+
+ This program 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, 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library 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. */
+
+/* Written by Bruno Haible <haible@clisp.cons.org>. */
diff --git a/trunk/glib/libcharset/codeset.m4 b/trunk/glib/libcharset/codeset.m4
new file mode 100644
index 000000000..e08ec6665
--- /dev/null
+++ b/trunk/glib/libcharset/codeset.m4
@@ -0,0 +1,20 @@
+#serial 2
+
+dnl From Bruno Haible.
+
+AC_DEFUN([jm_LANGINFO_CODESET],
+[
+ AC_CHECK_HEADERS(langinfo.h)
+ AC_CHECK_FUNCS(nl_langinfo)
+
+ AC_CACHE_CHECK([for nl_langinfo and CODESET], jm_cv_langinfo_codeset,
+ [AC_TRY_LINK([#include <langinfo.h>],
+ [char* cs = nl_langinfo(CODESET);],
+ jm_cv_langinfo_codeset=yes,
+ jm_cv_langinfo_codeset=no)
+ ])
+ if test $jm_cv_langinfo_codeset = yes; then
+ AC_DEFINE(HAVE_LANGINFO_CODESET, 1,
+ [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+ fi
+])
diff --git a/trunk/glib/libcharset/config.charset b/trunk/glib/libcharset/config.charset
new file mode 100755
index 000000000..c1bb7e919
--- /dev/null
+++ b/trunk/glib/libcharset/config.charset
@@ -0,0 +1,467 @@
+#! /bin/sh
+# Output a system dependent table of character encoding aliases.
+#
+# Copyright (C) 2000-2002 Free Software Foundation, Inc.
+#
+# This program 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, 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
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library 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.
+#
+# The table consists of lines of the form
+# ALIAS CANONICAL
+#
+# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)".
+# ALIAS is compared in a case sensitive way.
+#
+# CANONICAL is the GNU canonical name for this character encoding.
+# It must be an encoding supported by libiconv. Support by GNU libc is
+# also desirable. CANONICAL is case insensitive. Usually an upper case
+# MIME charset name is preferred.
+# The current list of GNU canonical charset names is as follows.
+#
+# name used by which systems a MIME name?
+# ASCII, ANSI_X3.4-1968 glibc solaris freebsd
+# ISO-8859-1 glibc aix hpux irix osf solaris freebsd yes
+# ISO-8859-2 glibc aix hpux irix osf solaris freebsd yes
+# ISO-8859-3 glibc solaris yes
+# ISO-8859-4 osf solaris freebsd yes
+# ISO-8859-5 glibc aix hpux irix osf solaris freebsd yes
+# ISO-8859-6 glibc aix hpux solaris yes
+# ISO-8859-7 glibc aix hpux irix osf solaris yes
+# ISO-8859-8 glibc aix hpux osf solaris yes
+# ISO-8859-9 glibc aix hpux irix osf solaris yes
+# ISO-8859-13 glibc
+# ISO-8859-14 glibc
+# ISO-8859-15 glibc aix osf solaris freebsd
+# KOI8-R glibc solaris freebsd yes
+# KOI8-U glibc freebsd yes
+# KOI8-T glibc
+# CP437 dos
+# CP775 dos
+# CP850 aix osf dos
+# CP852 dos
+# CP855 dos
+# CP856 aix
+# CP857 dos
+# CP861 dos
+# CP862 dos
+# CP864 dos
+# CP865 dos
+# CP866 freebsd dos
+# CP869 dos
+# CP874 woe32 dos
+# CP922 aix
+# CP932 aix woe32 dos
+# CP943 aix
+# CP949 osf woe32 dos
+# CP950 woe32 dos
+# CP1046 aix
+# CP1124 aix
+# CP1125 dos
+# CP1129 aix
+# CP1250 woe32
+# CP1251 glibc woe32 solaris
+# CP1252 aix woe32
+# CP1253 woe32
+# CP1254 woe32
+# CP1255 glibc woe32
+# CP1256 woe32
+# CP1257 woe32
+# GB2312 glibc aix hpux irix solaris freebsd yes
+# EUC-JP glibc aix hpux irix osf solaris freebsd yes
+# EUC-KR glibc aix hpux irix osf solaris freebsd yes
+# EUC-TW glibc aix hpux irix osf solaris
+# BIG5 glibc aix hpux osf solaris freebsd yes
+# BIG5-HKSCS glibc solaris
+# GBK glibc aix osf solaris woe32 dos
+# GB18030 glibc solaris
+# SHIFT_JIS hpux osf solaris freebsd yes
+# JOHAB glibc solaris woe32
+# TIS-620 glibc aix hpux osf solaris
+# VISCII glibc yes
+# TCVN5712-1 glibc
+# GEORGIAN-PS glibc
+# HP-ROMAN8 hpux
+# HP-ARABIC8 hpux
+# HP-GREEK8 hpux
+# HP-HEBREW8 hpux
+# HP-TURKISH8 hpux
+# HP-KANA8 hpux
+# DEC-KANJI osf
+# DEC-HANYU osf
+# UTF-8 glibc aix hpux osf solaris yes
+#
+# Note: Names which are not marked as being a MIME name should not be used in
+# Internet protocols for information interchange (mail, news, etc.).
+#
+# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications
+# must understand both names and treat them as equivalent.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+
+host="$1"
+os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'`
+echo "# This file contains a table of character encoding aliases,"
+echo "# suitable for operating system '${os}'."
+echo "# It was automatically generated from config.charset."
+# List of references, updated during installation:
+echo "# Packages using this file: "
+case "$os" in
+ linux* | *-gnu*)
+ # With glibc-2.1 or newer, we don't need any canonicalization,
+ # because glibc has iconv and both glibc and libiconv support all
+ # GNU canonical names directly. Therefore, the Makefile does not
+ # need to install the alias file at all.
+ # The following applies only to glibc-2.0.x and older libcs.
+ echo "ISO_646.IRV:1983 ASCII"
+ ;;
+ aix*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-6 ISO-8859-6"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "IBM-850 CP850"
+ echo "IBM-856 CP856"
+ echo "IBM-921 ISO-8859-13"
+ echo "IBM-922 CP922"
+ echo "IBM-932 CP932"
+ echo "IBM-943 CP943"
+ echo "IBM-1046 CP1046"
+ echo "IBM-1124 CP1124"
+ echo "IBM-1129 CP1129"
+ echo "IBM-1252 CP1252"
+ echo "IBM-eucCN GB2312"
+ echo "IBM-eucJP EUC-JP"
+ echo "IBM-eucKR EUC-KR"
+ echo "IBM-eucTW EUC-TW"
+ echo "big5 BIG5"
+ echo "GBK GBK"
+ echo "TIS-620 TIS-620"
+ echo "UTF-8 UTF-8"
+ ;;
+ hpux*)
+ echo "iso88591 ISO-8859-1"
+ echo "iso88592 ISO-8859-2"
+ echo "iso88595 ISO-8859-5"
+ echo "iso88596 ISO-8859-6"
+ echo "iso88597 ISO-8859-7"
+ echo "iso88598 ISO-8859-8"
+ echo "iso88599 ISO-8859-9"
+ echo "iso885915 ISO-8859-15"
+ echo "roman8 HP-ROMAN8"
+ echo "arabic8 HP-ARABIC8"
+ echo "greek8 HP-GREEK8"
+ echo "hebrew8 HP-HEBREW8"
+ echo "turkish8 HP-TURKISH8"
+ echo "kana8 HP-KANA8"
+ echo "tis620 TIS-620"
+ echo "big5 BIG5"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "hp15CN GB2312"
+ #echo "ccdc ?" # what is this?
+ echo "SJIS SHIFT_JIS"
+ echo "utf8 UTF-8"
+ ;;
+ irix*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "eucCN GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ ;;
+ osf*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "cp850 CP850"
+ echo "big5 BIG5"
+ echo "dechanyu DEC-HANYU"
+ echo "dechanzi GB2312"
+ echo "deckanji DEC-KANJI"
+ echo "deckorean EUC-KR"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "GBK GBK"
+ echo "KSC5601 CP949"
+ echo "sdeckanji EUC-JP"
+ echo "SJIS SHIFT_JIS"
+ echo "TACTIS TIS-620"
+ echo "UTF-8 UTF-8"
+ ;;
+ solaris*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-3 ISO-8859-3"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-6 ISO-8859-6"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "koi8-r KOI8-R"
+ echo "ansi-1251 CP1251"
+ echo "BIG5 BIG5"
+ echo "Big5-HKSCS BIG5-HKSCS"
+ echo "gb2312 GB2312"
+ echo "GBK GBK"
+ echo "GB18030 GB18030"
+ echo "cns11643 EUC-TW"
+ echo "5601 EUC-KR"
+ echo "ko_KR.johap92 JOHAB"
+ echo "eucJP EUC-JP"
+ echo "PCK SHIFT_JIS"
+ echo "TIS620.2533 TIS-620"
+ #echo "sun_eu_greek ?" # what is this?
+ echo "UTF-8 UTF-8"
+ ;;
+ freebsd* | os2*)
+ # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just
+ # reuse FreeBSD's locale data for OS/2.
+ echo "C ASCII"
+ echo "US-ASCII ASCII"
+ for l in la_LN lt_LN; do
+ echo "$l.ASCII ASCII"
+ done
+ for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \
+ lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do
+ echo "$l.ISO_8859-1 ISO-8859-1"
+ echo "$l.DIS_8859-15 ISO-8859-15"
+ done
+ for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do
+ echo "$l.ISO_8859-2 ISO-8859-2"
+ done
+ for l in la_LN lt_LT; do
+ echo "$l.ISO_8859-4 ISO-8859-4"
+ done
+ for l in ru_RU ru_SU; do
+ echo "$l.KOI8-R KOI8-R"
+ echo "$l.ISO_8859-5 ISO-8859-5"
+ echo "$l.CP866 CP866"
+ done
+ echo "uk_UA.KOI8-U KOI8-U"
+ echo "zh_TW.BIG5 BIG5"
+ echo "zh_TW.Big5 BIG5"
+ echo "zh_CN.EUC GB2312"
+ echo "ja_JP.EUC EUC-JP"
+ echo "ja_JP.SJIS SHIFT_JIS"
+ echo "ja_JP.Shift_JIS SHIFT_JIS"
+ echo "ko_KR.EUC EUC-KR"
+ ;;
+ netbsd*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "eucCN GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "BIG5 BIG5"
+ echo "SJIS SHIFT_JIS"
+ ;;
+ beos*)
+ # BeOS has a single locale, and it has UTF-8 encoding.
+ echo "* UTF-8"
+ ;;
+ msdosdjgpp*)
+ # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "#"
+ echo "# The encodings given here may not all be correct."
+ echo "# If you find that the encoding given for your language and"
+ echo "# country is not the one your DOS machine actually uses, just"
+ echo "# correct it in this file, and send a mail to"
+ echo "# Juan Manuel Guerrero <st001906@hrz1.hrz.tu-darmstadt.de>"
+ echo "# and Bruno Haible <bruno@clisp.org>."
+ echo "#"
+ echo "C ASCII"
+ # ISO-8859-1 languages
+ echo "ca CP850"
+ echo "ca_ES CP850"
+ echo "da CP865" # not CP850 ??
+ echo "da_DK CP865" # not CP850 ??
+ echo "de CP850"
+ echo "de_AT CP850"
+ echo "de_CH CP850"
+ echo "de_DE CP850"
+ echo "en CP850"
+ echo "en_AU CP850" # not CP437 ??
+ echo "en_CA CP850"
+ echo "en_GB CP850"
+ echo "en_NZ CP437"
+ echo "en_US CP437"
+ echo "en_ZA CP850" # not CP437 ??
+ echo "es CP850"
+ echo "es_AR CP850"
+ echo "es_BO CP850"
+ echo "es_CL CP850"
+ echo "es_CO CP850"
+ echo "es_CR CP850"
+ echo "es_CU CP850"
+ echo "es_DO CP850"
+ echo "es_EC CP850"
+ echo "es_ES CP850"
+ echo "es_GT CP850"
+ echo "es_HN CP850"
+ echo "es_MX CP850"
+ echo "es_NI CP850"
+ echo "es_PA CP850"
+ echo "es_PY CP850"
+ echo "es_PE CP850"
+ echo "es_SV CP850"
+ echo "es_UY CP850"
+ echo "es_VE CP850"
+ echo "et CP850"
+ echo "et_EE CP850"
+ echo "eu CP850"
+ echo "eu_ES CP850"
+ echo "fi CP850"
+ echo "fi_FI CP850"
+ echo "fr CP850"
+ echo "fr_BE CP850"
+ echo "fr_CA CP850"
+ echo "fr_CH CP850"
+ echo "fr_FR CP850"
+ echo "ga CP850"
+ echo "ga_IE CP850"
+ echo "gd CP850"
+ echo "gd_GB CP850"
+ echo "gl CP850"
+ echo "gl_ES CP850"
+ echo "id CP850" # not CP437 ??
+ echo "id_ID CP850" # not CP437 ??
+ echo "is CP861" # not CP850 ??
+ echo "is_IS CP861" # not CP850 ??
+ echo "it CP850"
+ echo "it_CH CP850"
+ echo "it_IT CP850"
+ echo "lt CP775"
+ echo "lt_LT CP775"
+ echo "lv CP775"
+ echo "lv_LV CP775"
+ echo "nb CP865" # not CP850 ??
+ echo "nb_NO CP865" # not CP850 ??
+ echo "nl CP850"
+ echo "nl_BE CP850"
+ echo "nl_NL CP850"
+ echo "nn CP865" # not CP850 ??
+ echo "nn_NO CP865" # not CP850 ??
+ echo "no CP865" # not CP850 ??
+ echo "no_NO CP865" # not CP850 ??
+ echo "pt CP850"
+ echo "pt_BR CP850"
+ echo "pt_PT CP850"
+ echo "sv CP850"
+ echo "sv_SE CP850"
+ # ISO-8859-2 languages
+ echo "cs CP852"
+ echo "cs_CZ CP852"
+ echo "hr CP852"
+ echo "hr_HR CP852"
+ echo "hu CP852"
+ echo "hu_HU CP852"
+ echo "pl CP852"
+ echo "pl_PL CP852"
+ echo "ro CP852"
+ echo "ro_RO CP852"
+ echo "sk CP852"
+ echo "sk_SK CP852"
+ echo "sl CP852"
+ echo "sl_SI CP852"
+ echo "sq CP852"
+ echo "sq_AL CP852"
+ echo "sr CP852" # CP852 or CP866 or CP855 ??
+ echo "sr_YU CP852" # CP852 or CP866 or CP855 ??
+ # ISO-8859-3 languages
+ echo "mt CP850"
+ echo "mt_MT CP850"
+ # ISO-8859-5 languages
+ echo "be CP866"
+ echo "be_BE CP866"
+ echo "bg CP866" # not CP855 ??
+ echo "bg_BG CP866" # not CP855 ??
+ echo "mk CP866" # not CP855 ??
+ echo "mk_MK CP866" # not CP855 ??
+ echo "ru CP866"
+ echo "ru_RU CP866"
+ echo "uk CP1125"
+ echo "uk_UA CP1125"
+ # ISO-8859-6 languages
+ echo "ar CP864"
+ echo "ar_AE CP864"
+ echo "ar_DZ CP864"
+ echo "ar_EG CP864"
+ echo "ar_IQ CP864"
+ echo "ar_IR CP864"
+ echo "ar_JO CP864"
+ echo "ar_KW CP864"
+ echo "ar_MA CP864"
+ echo "ar_OM CP864"
+ echo "ar_QA CP864"
+ echo "ar_SA CP864"
+ echo "ar_SY CP864"
+ # ISO-8859-7 languages
+ echo "el CP869"
+ echo "el_GR CP869"
+ # ISO-8859-8 languages
+ echo "he CP862"
+ echo "he_IL CP862"
+ # ISO-8859-9 languages
+ echo "tr CP857"
+ echo "tr_TR CP857"
+ # Japanese
+ echo "ja CP932"
+ echo "ja_JP CP932"
+ # Chinese
+ echo "zh_CN GBK"
+ echo "zh_TW CP950" # not CP938 ??
+ # Korean
+ echo "kr CP949" # not CP934 ??
+ echo "kr_KR CP949" # not CP934 ??
+ # Thai
+ echo "th CP874"
+ echo "th_TH CP874"
+ # Other
+ echo "eo CP850"
+ echo "eo_EO CP850"
+ ;;
+esac
diff --git a/trunk/glib/libcharset/glibc21.m4 b/trunk/glib/libcharset/glibc21.m4
new file mode 100644
index 000000000..5b88ef231
--- /dev/null
+++ b/trunk/glib/libcharset/glibc21.m4
@@ -0,0 +1,26 @@
+#serial 2
+
+# Test for the GNU C Library, version 2.1 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([jm_GLIBC21],
+ [
+ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer,
+ ac_cv_gnu_library_2_1,
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ ac_cv_gnu_library_2_1=yes,
+ ac_cv_gnu_library_2_1=no)
+ ]
+ )
+ AC_SUBST(GLIBC21)
+ GLIBC21="$ac_cv_gnu_library_2_1"
+ ]
+)
diff --git a/trunk/glib/libcharset/libcharset-glib.patch b/trunk/glib/libcharset/libcharset-glib.patch
new file mode 100644
index 000000000..c48910a11
--- /dev/null
+++ b/trunk/glib/libcharset/libcharset-glib.patch
@@ -0,0 +1,94 @@
+diff -ur libcharset/localcharset.c /home/otaylor/cvs/gnome2/glib-head/glib/libcharset/localcharset.c
+--- libcharset/localcharset.c Sat Dec 14 20:04:44 2002
++++ /home/otaylor/cvs/gnome2/glib-head/glib/libcharset/localcharset.c Sat Dec 14 20:09:45 2002
+@@ -102,8 +102,8 @@
+ static const char * volatile charset_aliases;
+
+ /* Return a pointer to the contents of the charset.alias file. */
+-static const char *
+-get_charset_aliases ()
++const char *
++_g_locale_get_charset_aliases ()
+ {
+ const char *cp;
+
+@@ -235,14 +235,10 @@
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+
+-#ifdef STATIC
+-STATIC
+-#endif
+ const char *
+-locale_charset ()
++_g_locale_charset_raw ()
+ {
+ const char *codeset;
+- const char *aliases;
+
+ #if !(defined WIN32 || defined OS2)
+
+@@ -344,12 +340,23 @@
+
+ #endif
+
++ return codeset;
++}
++
++#ifdef STATIC
++STATIC
++#endif
++const char *
++_g_locale_charset_unalias (const char *codeset)
++{
++ const char *aliases;
++
+ if (codeset == NULL)
+ /* The canonical name cannot be determined. */
+ codeset = "";
+
+ /* Resolve alias. */
+- for (aliases = get_charset_aliases ();
++ for (aliases = _g_locale_get_charset_aliases ();
+ *aliases != '\0';
+ aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
+ if (strcmp (codeset, aliases) == 0
+diff -ur libcharset/glibc21.m4 /home/otaylor/cvs/gnome2/glib-head/glib/libcharset/glibc21.m4
+--- libcharset/glibc21.m4 Sat Dec 14 20:04:44 2002
++++ /home/otaylor/cvs/gnome2/glib-head/glib/libcharset/glibc21.m4 Fri Sep 28 19:44:46 2001
+@@ -3,7 +3,7 @@
+ # Test for the GNU C Library, version 2.1 or newer.
+ # From Bruno Haible.
+
+-AC_DEFUN(jm_GLIBC21,
++AC_DEFUN([jm_GLIBC21],
+ [
+ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer,
+ ac_cv_gnu_library_2_1,
+diff -ur libcharset/codeset.m4 /home/otaylor/cvs/gnome2/glib-head/glib/libcharset/codeset.m4
+--- libcharset/codeset.m4 Sat Dec 14 20:04:44 2002
++++ /home/otaylor/cvs/gnome2/glib-head/glib/libcharset/codeset.m4 Fri Sep 28 19:44:46 2001
+@@ -2,7 +2,7 @@
+
+ dnl From Bruno Haible.
+
+-AC_DEFUN(jm_LANGINFO_CODESET,
++AC_DEFUN([jm_LANGINFO_CODESET],
+ [
+ AC_CHECK_HEADERS(langinfo.h)
+ AC_CHECK_FUNCS(nl_langinfo)
+diff -ur libcharset/libcharset.h /home/otaylor/cvs/gnome2/glib-head/glib/libcharset/libcharset.h
+--- libcharset/libcharset.h Sat Dec 14 20:04:44 2002
++++ /home/otaylor/cvs/gnome2/glib-head/glib/libcharset/libcharset.h Sat Dec 14 19:03:11 2002
+@@ -30,8 +30,9 @@
+ The result must not be freed; it is statically allocated.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+-extern const char * locale_charset (void);
+-
++extern const char * _g_locale_charset_raw (void);
++extern const char * _g_locale_charset_unalias (const char *codeset);
++extern const char * _g_locale_get_charset_aliases (void);
+
+ #ifdef __cplusplus
+ }
diff --git a/trunk/glib/libcharset/libcharset.h b/trunk/glib/libcharset/libcharset.h
new file mode 100644
index 000000000..3af1d1719
--- /dev/null
+++ b/trunk/glib/libcharset/libcharset.h
@@ -0,0 +1,42 @@
+/* Copyright (C) 2000-2001 Free Software Foundation, Inc.
+ This file is part of the GNU CHARSET Library.
+
+ The GNU CHARSET 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.
+
+ The GNU CHARSET 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 the GNU CHARSET 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 _LIBCHARSET_H
+#define _LIBCHARSET_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed in config.charset.
+ The result must not be freed; it is statically allocated.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+extern const char * _g_locale_charset_raw (void);
+extern const char * _g_locale_charset_unalias (const char *codeset);
+extern const char * _g_locale_get_charset_aliases (void);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _LIBCHARSET_H */
diff --git a/trunk/glib/libcharset/localcharset.c b/trunk/glib/libcharset/localcharset.c
new file mode 100644
index 000000000..eaa997e28
--- /dev/null
+++ b/trunk/glib/libcharset/localcharset.c
@@ -0,0 +1,390 @@
+/* Determine a canonical name for the current locale's character encoding.
+
+ Copyright (C) 2000-2002 Free Software Foundation, Inc.
+
+ This program 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, 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library 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. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <glibconfig.h>
+
+#if defined G_PLATFORM_WIN32
+/* Want to use Win32-specific code in this file also on Cygwin */
+# define _WIN32 1
+#endif
+
+#if HAVE_STDDEF_H
+# include <stddef.h>
+#endif
+
+#include <stdio.h>
+#if HAVE_STRING_H
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+#if HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# undef WIN32 /* avoid warning on mingw32 */
+# define WIN32
+#endif
+
+#if defined __EMX__
+/* Assume EMX program runs on OS/2, even if compiled under DOS. */
+# define OS2
+#endif
+
+#if !defined WIN32
+# if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+# else
+# if HAVE_SETLOCALE
+# include <locale.h>
+# endif
+# endif
+#elif defined WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+#if defined OS2
+# define INCL_DOS
+# include <os2.h>
+#endif
+
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#endif
+
+#ifndef DIRECTORY_SEPARATOR
+# define DIRECTORY_SEPARATOR '/'
+#endif
+
+#ifndef ISSLASH
+# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
+#endif
+
+#ifdef HAVE_GETC_UNLOCKED
+# undef getc
+# define getc getc_unlocked
+#endif
+
+#ifdef __cplusplus
+/* When compiling with "gcc -x c++", produce a function with C linkage. */
+extern "C" const char * locale_charset (void);
+#endif
+
+/* The following static variable is declared 'volatile' to avoid a
+ possible multithread problem in the function get_charset_aliases. If we
+ are running in a threaded environment, and if two threads initialize
+ 'charset_aliases' simultaneously, both will produce the same value,
+ and everything will be ok if the two assignments to 'charset_aliases'
+ are atomic. But I don't know what will happen if the two assignments mix. */
+#if __STDC__ != 1
+# define volatile /* empty */
+#endif
+/* Pointer to the contents of the charset.alias file, if it has already been
+ read, else NULL. Its format is:
+ ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */
+static const char * volatile charset_aliases;
+
+/* Return a pointer to the contents of the charset.alias file. */
+const char *
+_g_locale_get_charset_aliases (void)
+{
+ const char *cp;
+
+ cp = charset_aliases;
+ if (cp == NULL)
+ {
+#if !defined WIN32
+ FILE *fp;
+ const char *dir = getenv ("LIBCHARSET_ALIAS_DIR");
+ const char *base = "charset.alias";
+ char *file_name;
+
+ if (dir == NULL)
+ dir = LIBDIR;
+
+ /* Concatenate dir and base into freshly allocated file_name. */
+ {
+ size_t dir_len = strlen (dir);
+ size_t base_len = strlen (base);
+ int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
+ file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
+ if (file_name != NULL)
+ {
+ memcpy (file_name, dir, dir_len);
+ if (add_slash)
+ file_name[dir_len] = DIRECTORY_SEPARATOR;
+ memcpy (file_name + dir_len + add_slash, base, base_len + 1);
+ }
+ }
+
+ if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL)
+ /* Out of memory or file not found, treat it as empty. */
+ cp = "";
+ else
+ {
+ /* Parse the file's contents. */
+ int c;
+ char buf1[50+1];
+ char buf2[50+1];
+ char *res_ptr = NULL;
+ size_t res_size = 0;
+ size_t l1, l2;
+
+ for (;;)
+ {
+ c = getc (fp);
+ if (c == EOF)
+ break;
+ if (c == '\n' || c == ' ' || c == '\t')
+ continue;
+ if (c == '#')
+ {
+ /* Skip comment, to end of line. */
+ do
+ c = getc (fp);
+ while (!(c == EOF || c == '\n'));
+ if (c == EOF)
+ break;
+ continue;
+ }
+ ungetc (c, fp);
+ if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
+ break;
+ l1 = strlen (buf1);
+ l2 = strlen (buf2);
+ if (res_size == 0)
+ {
+ res_size = l1 + 1 + l2 + 1;
+ res_ptr = (char *) malloc (res_size + 1);
+ }
+ else
+ {
+ char * p = res_ptr;
+ res_size += l1 + 1 + l2 + 1;
+ res_ptr = (char *) realloc (res_ptr, res_size + 1);
+ if (res_ptr == NULL) {
+ free(p);
+ }
+ }
+ if (res_ptr == NULL)
+ {
+ /* Out of memory. */
+ res_size = 0;
+ break;
+ }
+ strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
+ strcpy (res_ptr + res_size - (l2 + 1), buf2);
+ }
+ fclose (fp);
+ if (res_size == 0)
+ cp = "";
+ else
+ {
+ *(res_ptr + res_size) = '\0';
+ cp = res_ptr;
+ }
+ }
+
+ if (file_name != NULL)
+ free (file_name);
+
+#else
+
+ /* To avoid the troubles of installing a separate file in the same
+ directory as the DLL and of retrieving the DLL's directory at
+ runtime, simply inline the aliases here. */
+
+# if defined WIN32
+ cp = "CP936" "\0" "GBK" "\0"
+ "CP1361" "\0" "JOHAB" "\0"
+ "CP20127" "\0" "ASCII" "\0"
+ "CP20866" "\0" "KOI8-R" "\0"
+ "CP21866" "\0" "KOI8-RU" "\0"
+ "CP28591" "\0" "ISO-8859-1" "\0"
+ "CP28592" "\0" "ISO-8859-2" "\0"
+ "CP28593" "\0" "ISO-8859-3" "\0"
+ "CP28594" "\0" "ISO-8859-4" "\0"
+ "CP28595" "\0" "ISO-8859-5" "\0"
+ "CP28596" "\0" "ISO-8859-6" "\0"
+ "CP28597" "\0" "ISO-8859-7" "\0"
+ "CP28598" "\0" "ISO-8859-8" "\0"
+ "CP28599" "\0" "ISO-8859-9" "\0"
+ "CP28605" "\0" "ISO-8859-15" "\0";
+# endif
+#endif
+
+ charset_aliases = cp;
+ }
+
+ return cp;
+}
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed in config.charset.
+ The result must not be freed; it is statically allocated.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+
+const char *
+_g_locale_charset_raw (void)
+{
+ const char *codeset;
+
+#if !(defined WIN32 || defined OS2)
+
+# if HAVE_LANGINFO_CODESET
+
+ /* Most systems support nl_langinfo (CODESET) nowadays. */
+ codeset = nl_langinfo (CODESET);
+
+# else
+
+ /* On old systems which lack it, use setlocale or getenv. */
+ const char *locale = NULL;
+
+ /* But most old systems don't have a complete set of locales. Some
+ (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't
+ use setlocale here; it would return "C" when it doesn't support the
+ locale name the user has set. */
+# if HAVE_SETLOCALE && 0
+ locale = setlocale (LC_CTYPE, NULL);
+# endif
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ }
+
+ /* On some old systems, one used to set locale = "iso8859_1". On others,
+ you set it to "language_COUNTRY.charset". In any case, we resolve it
+ through the charset.alias file. */
+ codeset = locale;
+
+# endif
+
+#elif defined WIN32
+
+ static char buf[2 + 10 + 1];
+
+ /* Woe32 has a function returning the locale's codepage as a number. */
+ sprintf (buf, "CP%u", GetACP ());
+ codeset = buf;
+
+#elif defined OS2
+
+ const char *locale;
+ static char buf[2 + 10 + 1];
+ ULONG cp[3];
+ ULONG cplen;
+
+ /* Allow user to override the codeset, as set in the operating system,
+ with standard language environment variables. */
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (buf))
+ {
+ memcpy (buf, dot, modifier - dot);
+ buf [modifier - dot] = '\0';
+ return buf;
+ }
+ }
+
+ /* Resolve through the charset.alias file. */
+ codeset = locale;
+ }
+ else
+ {
+ /* OS/2 has a function returning the locale's codepage as a number. */
+ if (DosQueryCp (sizeof (cp), cp, &cplen))
+ codeset = "";
+ else
+ {
+ sprintf (buf, "CP%u", cp[0]);
+ codeset = buf;
+ }
+ }
+
+#endif
+
+ return codeset;
+}
+
+#ifdef STATIC
+STATIC
+#endif
+const char *
+_g_locale_charset_unalias (const char *codeset)
+{
+ const char *aliases;
+
+ if (codeset == NULL)
+ /* The canonical name cannot be determined. */
+ codeset = "";
+
+ /* Resolve alias. */
+ for (aliases = _g_locale_get_charset_aliases ();
+ *aliases != '\0';
+ aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
+ if (strcmp (codeset, aliases) == 0
+ || (aliases[0] == '*' && aliases[1] == '\0'))
+ {
+ codeset = aliases + strlen (aliases) + 1;
+ break;
+ }
+
+ /* Don't return an empty string. GNU libc and GNU libiconv interpret
+ the empty string as denoting "the locale's character encoding",
+ thus GNU libiconv would call this function a second time. */
+ if (codeset[0] == '\0')
+ codeset = "ASCII";
+
+ return codeset;
+}
diff --git a/trunk/glib/libcharset/make-patch.sh b/trunk/glib/libcharset/make-patch.sh
new file mode 100755
index 000000000..e8156bbbe
--- /dev/null
+++ b/trunk/glib/libcharset/make-patch.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+if test $# = 1 ; then
+ ORIGINAL=$1
+else
+ echo "Usage: make-patch.sh /path/to/libcharset" 1>&2
+ exit 1
+fi
+
+if test -f $ORIGINAL/lib/localcharset.c ; then : ; else
+ echo "Usage: make-patch.sh /path/to/libcharset" 1>&2
+ exit 1
+fi
+
+VERSION=`grep VERSION= $ORIGINAL/configure.in | sed s/VERSION=//`
+
+echo "# Patch against libcharset version $VERSION" > libcharset-glib.patch
+
+for i in localcharset.c ref-add.sin ref-del.sin ; do
+ diff -u $ORIGINAL/lib/$i $i >> libcharset-glib.patch
+done
+
+for i in glibc21.m4 codeset.m4 ; do
+ diff -u $ORIGINAL/m4/$i $i >> libcharset-glib.patch
+done
+
+diff -u $ORIGINAL/include/libcharset.h.in libcharset.h >> libcharset-glib.patch
diff --git a/trunk/glib/libcharset/ref-add.sin b/trunk/glib/libcharset/ref-add.sin
new file mode 100644
index 000000000..8986029bb
--- /dev/null
+++ b/trunk/glib/libcharset/ref-add.sin
@@ -0,0 +1,31 @@
+# Add this package to a list of references stored in a text file.
+#
+# Copyright (C) 2000 Free Software Foundation, Inc.
+#
+# This program 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, 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
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library 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.
+#
+# Written by Bruno Haible <bruno@clisp.org>.
+#
+/^# Packages using this file: / {
+ s/# Packages using this file://
+ ta
+ :a
+ s/ @PACKAGE@ / @PACKAGE@ /
+ tb
+ s/ $/ @PACKAGE@ /
+ :b
+ s/^/# Packages using this file:/
+}
diff --git a/trunk/glib/libcharset/ref-del.sin b/trunk/glib/libcharset/ref-del.sin
new file mode 100644
index 000000000..3a557970c
--- /dev/null
+++ b/trunk/glib/libcharset/ref-del.sin
@@ -0,0 +1,26 @@
+# Remove this package from a list of references stored in a text file.
+#
+# Copyright (C) 2000 Free Software Foundation, Inc.
+#
+# This program 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, 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
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library 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.
+#
+# Written by Bruno Haible <bruno@clisp.org>.
+#
+/^# Packages using this file: / {
+ s/# Packages using this file://
+ s/ @PACKAGE@ / /
+ s/^/# Packages using this file:/
+}
diff --git a/trunk/glib/libcharset/update.sh b/trunk/glib/libcharset/update.sh
new file mode 100755
index 000000000..9548d3608
--- /dev/null
+++ b/trunk/glib/libcharset/update.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+if test $# = 1 ; then
+ ORIGINAL=$1
+else
+ echo "Usage: update.sh /path/to/libcharset" 1>&2
+ exit 1
+fi
+
+if test -f $ORIGINAL/lib/localcharset.c ; then : ; else
+ echo "Usage: update.sh /path/to/libcharset" 1>&2
+ exit 1
+fi
+
+VERSION=`grep VERSION= $ORIGINAL/configure.in | sed s/VERSION=//`
+
+for i in localcharset.c ref-add.sin ref-del.sin config.charset ; do
+ cp $ORIGINAL/lib/$i .
+done
+
+cp $ORIGINAL/include/libcharset.h.in ./libcharset.h
+
+for i in codeset.m4 glibc21.m4 ; do
+ cp $ORIGINAL/m4/$i .
+done
+
+patch -p0 < libcharset-glib.patch
+
+echo "dnl From libcharset $VERSION" > ../../aclibcharset.m4
+
+
diff --git a/trunk/glib/makefile.msc.in b/trunk/glib/makefile.msc.in
new file mode 100644
index 000000000..0c658f035
--- /dev/null
+++ b/trunk/glib/makefile.msc.in
@@ -0,0 +1,138 @@
+## Makefile for building the GLib dlls with Microsoft C
+## Use: nmake -f makefile.msc
+
+TOP = ..\..
+
+!INCLUDE ..\build\win32\make.msc
+
+################################################################
+
+INCLUDES = -FImsvc_recommended_pragmas.h -I . -I ..
+DEFINES = -DHAVE_CONFIG_H -DGLIB_COMPILATION -DG_LOG_DOMAIN=\"GLib\" -DG_ENABLE_DEBUG -DPCRE_STATIC
+DEPCFLAGS = -Zm400 $(INTL_CFLAGS) $(LIBICONV_CFLAGS) $(DIRENT_CFLAGS)
+
+all : \
+ ..\config.h \
+ ..\glibconfig.h \
+ galias.h \
+ galiasdef.c \
+ gnulib\gnulib.lib \
+ pcre\pcre.lib \
+ libglib-2.0-0.dll \
+ glib-@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@s.lib \
+ gspawn-win32-helper.exe \
+
+
+gnulib\gnulib.lib :
+ cd gnulib
+ nmake -f makefile.msc
+ cd ..
+
+pcre\pcre.lib :
+ cd pcre
+ nmake -f makefile.msc
+ cd ..
+
+glib_OBJECTS = \
+ garray.obj \
+ gasyncqueue.obj \
+ gatomic.obj \
+ gbacktrace.obj \
+ gbase64.obj \
+ gbookmarkfile.obj \
+ gcache.obj \
+ gcompletion.obj \
+ gconvert.obj \
+ gdataset.obj \
+ gdate.obj \
+ gdir.obj \
+ gerror.obj \
+ gfileutils.obj \
+ ghash.obj \
+ ghook.obj \
+ gkeyfile.obj \
+ gmappedfile.obj \
+ giochannel.obj \
+ giowin32.obj \
+ glist.obj \
+ gmain.obj \
+ gmarkup.obj \
+ gmem.obj \
+ gmessages.obj \
+ gnode.obj \
+ goption.obj \
+ gprimes.obj \
+ gqsort.obj \
+ gqueue.obj \
+ gpattern.obj \
+ gprintf.obj \
+ grand.obj \
+ gregex.obj \
+ grel.obj \
+ gscanner.obj \
+ gsequence.obj \
+ gshell.obj \
+ gslice.obj \
+ gslist.obj \
+ gspawn-win32.obj \
+ gstdio.obj \
+ gstrfuncs.obj \
+ gstring.obj \
+ gthread.obj \
+ gthreadpool.obj \
+ gtimer.obj \
+ gtree.obj \
+ gunibreak.obj \
+ gunicollate.obj \
+ gunidecomp.obj \
+ guniprop.obj \
+ gutf8.obj \
+ gutils.obj \
+ gwin32.obj \
+ localcharset.obj
+
+..\glibconfig.h: ..\glibconfig.h.win32
+ copy ..\glibconfig.h.win32 ..\glibconfig.h
+
+..\config.h: ..\config.h.win32
+ copy ..\config.h.win32 ..\config.h
+
+galias.h: glib.symbols
+ perl makegalias.pl < glib.symbols > galias.h
+
+galiasdef.c: glib.symbols
+ perl makegalias.pl -def < glib.symbols > galiasdef.c
+
+localcharset.c : libcharset/localcharset.c
+ copy libcharset\localcharset.c localcharset.c
+
+glib.def: glib.symbols
+ echo EXPORTS > glib.def
+ cl /EP -DINCLUDE_VARIABLES -DG_OS_WIN32 -DINCLUDE_INTERNAL_SYMBOLS -DALL_FILES \
+ -DG_GNUC_MALLOC= -DG_GNUC_CONST= -DG_GNUC_NULL_TERMINATED= -DG_GNUC_NORETURN= \
+ -DG_GNUC_PRINTF=;G_GNUC_PRINTF glib.symbols >> glib.def
+
+glib.res : glib.rc
+ rc -DBUILDNUMBER=0 -r -fo glib.res glib.rc
+
+################ glib
+
+# create a static libary
+# static library can well have the real version number in the name
+glib-@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@s.lib : $(glib_OBJECTS) gnulib\gnulib.lib pcre\pcre.lib
+ lib /out:glib-@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@s.lib $(glib_OBJECTS) gnulib\gnulib.lib pcre\pcre.lib
+
+libglib-2.0-0.dll : $(glib_OBJECTS) gnulib\gnulib.lib pcre\pcre.lib glib.def glib.res
+ $(CC) $(CFLAGS) -LD -Fe$@ $(glib_OBJECTS) glib.res $(LIBICONV_LIBS) $(INTL_LIBS) \
+ gnulib\gnulib.lib pcre\pcre.lib $(DIRENT_LIBS) user32.lib advapi32.lib shell32.lib wsock32.lib ole32.lib ws2_32.lib \
+ $(LDFLAGS) /implib:glib-2.0.lib /def:glib.def
+
+gspawn-win32-helper.exe : gspawn-win32-helper.c libglib-2.0-@LT_CURRENT_MINUS_AGE@.dll
+ $(CC) $(CFLAGS) -Fe$@ -DG_LOG_DOMAIN=\"gspawn-win32-helper\" gspawn-win32-helper.c glib-2.0.lib $(LDFLAGS) /subsystem:windows user32.lib
+
+################ other stuff
+
+clean::
+ del ..\config.h
+ del ..\glibconfig.h
+
diff --git a/trunk/glib/makegalias.pl b/trunk/glib/makegalias.pl
new file mode 100755
index 000000000..f7ee76965
--- /dev/null
+++ b/trunk/glib/makegalias.pl
@@ -0,0 +1,136 @@
+#!/usr/bin/perl -w
+
+my $do_def = 0;
+
+if (($#ARGV >= 0) && ($ARGV[0] eq "-def")) {
+ shift;
+ $do_def = 1;
+}
+
+print <<EOF;
+/* Generated by makegalias.pl */
+
+#ifndef DISABLE_VISIBILITY
+
+#include "glibconfig.h"
+
+#ifdef G_HAVE_GNUC_VISIBILITY
+
+EOF
+
+if ($do_def) {
+ print <<EOF
+#undef IN_FILE
+#define IN_FILE defined
+
+#undef IN_HEADER
+#define IN_HEADER(x) 1
+
+EOF
+}
+else {
+ print <<EOF
+#define IN_FILE(x) 1
+#define IN_HEADER defined
+
+EOF
+}
+
+my $in_comment = 0;
+my $in_skipped_section = 0;
+
+while (<>) {
+
+ # ignore empty lines
+ next if /^\s*$/;
+
+ # skip comments
+ if ($_ =~ /^\s*\/\*/)
+ {
+ $in_comment = 1;
+ }
+
+ if ($in_comment)
+ {
+ if ($_ =~ /\*\/\s$/)
+ {
+ $in_comment = 0;
+ }
+
+ next;
+ }
+
+ # handle ifdefs
+ if ($_ =~ /^\#endif/)
+ {
+ if (!$in_skipped_section)
+ {
+ print $_;
+ }
+
+ $in_skipped_section = 0;
+
+ next;
+ }
+
+ if ($_ =~ /^\#ifdef\s+(INCLUDE_VARIABLES|INCLUDE_INTERNAL_SYMBOLS|ALL_FILES)/)
+ {
+ $in_skipped_section = 1;
+ }
+
+ if ($in_skipped_section)
+ {
+ next;
+ }
+
+ if ($_ =~ /^\#ifn?def\s+(G|DISABLE_MEM_POOLS)/)
+ {
+ print $_;
+
+ next;
+ }
+
+ if ($_ =~ /^\#if.*(G_STDIO_NO_WRAP_ON_UNIX|IN_FILE|IN_HEADER|IN_FILE)/)
+ {
+ print $_;
+
+ next;
+ }
+
+ chop;
+ my $str = $_;
+ my @words;
+ my $attributes = "";
+
+ @words = split(/ /, $str);
+ $str = shift(@words);
+ chomp($str);
+ my $alias = "IA__".$str;
+
+ # Drop any Win32 specific .def file syntax, but keep attributes
+ foreach $word (@words) {
+ $attributes = "$attributes $word" unless $word eq "PRIVATE";
+ }
+
+ if (!$do_def) {
+ print <<EOF
+extern __typeof ($str) $alias __attribute((visibility("hidden")))$attributes;
+\#define $str $alias
+
+EOF
+ }
+ else {
+ print <<EOF
+\#undef $str
+extern __typeof ($str) $str __attribute((alias("$alias"), visibility("default")));
+
+EOF
+ }
+}
+
+print <<EOF
+
+#endif /* G_HAVE_GNUC_VISIBILITY */
+#endif /* DISABLE_VISIBILITY */
+EOF
+
diff --git a/trunk/glib/pcre/COPYING b/trunk/glib/pcre/COPYING
new file mode 100644
index 000000000..58241b2bd
--- /dev/null
+++ b/trunk/glib/pcre/COPYING
@@ -0,0 +1,68 @@
+PCRE LICENCE
+------------
+
+PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+Release 7 of PCRE is distributed under the terms of the "BSD" licence, as
+specified below. The documentation for PCRE, supplied in the "doc"
+directory, is distributed under the same terms as the software itself.
+
+The basic library functions are written in C and are freestanding. Also
+included in the distribution is a set of C++ wrapper functions.
+
+
+THE BASIC LIBRARY FUNCTIONS
+---------------------------
+
+Written by: Philip Hazel
+Email local part: ph10
+Email domain: cam.ac.uk
+
+University of Cambridge Computing Service,
+Cambridge, England. Phone: +44 1223 334714.
+
+Copyright (c) 1997-2006 University of Cambridge
+All rights reserved.
+
+
+THE C++ WRAPPER FUNCTIONS
+-------------------------
+
+Contributed by: Google Inc.
+
+Copyright (c) 2006, Google Inc.
+All rights reserved.
+
+
+THE "BSD" LICENCE
+-----------------
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the name of Google
+ Inc. nor the names of their contributors may be used to endorse or
+ promote products derived from this software without specific prior
+ written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+End
diff --git a/trunk/glib/pcre/Makefile.am b/trunk/glib/pcre/Makefile.am
new file mode 100644
index 000000000..da31685f3
--- /dev/null
+++ b/trunk/glib/pcre/Makefile.am
@@ -0,0 +1,64 @@
+INCLUDES = \
+ -DG_LOG_DOMAIN=\"GLib-GRegex\" \
+ -DSUPPORT_UCP \
+ -DSUPPORT_UTF8 \
+ -DNEWLINE=-1 \
+ -DMATCH_LIMIT=10000000 \
+ -DMATCH_LIMIT_RECURSION=10000000 \
+ -DMAX_NAME_SIZE=32 \
+ -DMAX_NAME_COUNT=10000 \
+ -DMAX_DUPLENGTH=30000 \
+ -DLINK_SIZE=2 \
+ -DEBCDIC=0 \
+ -DPOSIX_MALLOC_THRESHOLD=10 \
+ -I$(top_srcdir) \
+ -I$(srcdir) \
+ -I$(top_srcdir)/glib \
+ -I$(top_builddir)/glib \
+ @GLIB_DEBUG_FLAGS@ \
+ -DG_DISABLE_DEPRECATED \
+ -DGLIB_COMPILATION \
+ $(DEPRECATED_FLAGS)\
+ $(WARN_CFLAGS) \
+ $(PCRE_WARN_CFLAGS) \
+ $(DEP_CFLAGS)
+
+noinst_LTLIBRARIES = libpcre.la
+
+libpcre_headers =
+
+libpcre_la_SOURCES = \
+ pcre_chartables.c \
+ pcre_compile.c \
+ pcre_config.c \
+ pcre_dfa_exec.c \
+ pcre_exec.c \
+ pcre_fullinfo.c \
+ pcre_get.c \
+ pcre_globals.c \
+ pcre_info.c \
+ pcre_maketables.c \
+ pcre_newline.c \
+ pcre_ord2utf8.c \
+ pcre_refcount.c \
+ pcre_study.c \
+ pcre_tables.c \
+ pcre_try_flipped.c \
+ pcre_ucp_searchfuncs.c \
+ pcre_valid_utf8.c \
+ pcre_version.c \
+ pcre_xclass.c \
+ pcre.h \
+ pcre_internal.h \
+ ucp.h \
+ ucpinternal.h \
+ $(libpcre_headers)
+
+libpcre_la_LIBADD = $(DEP_LIBS)
+
+libpcre_la_LDFLAGS = -no-undefined
+
+EXTRA_DIST = \
+ COPYING \
+ makefile.msc
+
diff --git a/trunk/glib/pcre/makefile.msc b/trunk/glib/pcre/makefile.msc
new file mode 100644
index 000000000..3e4278bd6
--- /dev/null
+++ b/trunk/glib/pcre/makefile.msc
@@ -0,0 +1,49 @@
+TOP = ..\..\..
+!INCLUDE ..\..\build\win32\make.msc
+
+INCLUDES = \
+ -I ..\.. \
+ -I ..
+
+DEFINES = \
+ -DPCRE_STATIC \
+ -DHAVE_CONFIG_H \
+ -DHAVE_LONG_LONG_FORMAT \
+ -DSUPPORT_UCP \
+ -DSUPPORT_UTF8 \
+ -DNEWLINE=-1 \
+ -DMATCH_LIMIT=10000000 \
+ -DMATCH_LIMIT_RECURSION=10000000 \
+ -DMAX_NAME_SIZE=32 \
+ -DMAX_NAME_COUNT=10000 \
+ -DMAX_DUPLENGTH=30000 \
+ -DLINK_SIZE=2 \
+ -DEBCDIC=0 \
+ -DPOSIX_MALLOC_THRESHOLD=10
+
+OBJECTS = \
+ pcre_chartables.obj \
+ pcre_compile.obj \
+ pcre_config.obj \
+ pcre_dfa_exec.obj \
+ pcre_exec.obj \
+ pcre_fullinfo.obj \
+ pcre_get.obj \
+ pcre_globals.obj \
+ pcre_info.obj \
+ pcre_maketables.obj \
+ pcre_newline.obj \
+ pcre_ord2utf8.obj \
+ pcre_refcount.obj \
+ pcre_study.obj \
+ pcre_tables.obj \
+ pcre_try_flipped.obj \
+ pcre_ucp_searchfuncs.obj \
+ pcre_valid_utf8.obj \
+ pcre_version.obj \
+ pcre_xclass.obj \
+
+all : pcre.lib
+
+pcre.lib : $(OBJECTS)
+ lib -out:pcre.lib $(OBJECTS)
diff --git a/trunk/glib/pcre/pcre.h b/trunk/glib/pcre/pcre.h
new file mode 100644
index 000000000..f32856446
--- /dev/null
+++ b/trunk/glib/pcre/pcre.h
@@ -0,0 +1,286 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* This is the public header file for the PCRE library, to be #included by
+applications that call the PCRE functions.
+
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+#ifndef _PCRE_H
+#define _PCRE_H
+
+/* The current PCRE version information. */
+
+/* NOTES FOR FUTURE MAINTAINERS: Do not use numbers with leading zeros, because
+they may be treated as octal constants. The PCRE_PRERELEASE feature is for
+identifying release candidates. It might be defined as -RC2, for example. In
+real releases, it should be defined empty. Do not change the alignment of these
+statments. The code in ./configure greps out the version numbers by using "cut"
+to get values from column 29 onwards. These are substituted into pcre-config
+and libpcre.pc. The values are not put into configure.ac and substituted here
+(which would simplify this issue) because that makes life harder for those who
+cannot run ./configure. As it now stands, this file need not be edited in that
+circumstance. */
+
+#define PCRE_MAJOR 7
+#define PCRE_MINOR 0
+#define PCRE_PRERELEASE
+#define PCRE_DATE 18-Dec-2006
+
+/* Win32 uses DLL by default; it needs special stuff for exported functions
+when building PCRE. */
+
+/* But don't do that when building as part of GLib */
+#if 0
+#ifdef _WIN32
+# ifdef PCRE_DEFINITION
+# ifdef DLL_EXPORT
+# define PCRE_DATA_SCOPE __declspec(dllexport)
+# endif
+# else
+# ifndef PCRE_STATIC
+# define PCRE_DATA_SCOPE extern __declspec(dllimport)
+# endif
+# endif
+#endif
+#endif
+
+/* Otherwise, we use the standard "extern". */
+
+#ifndef PCRE_DATA_SCOPE
+# ifdef __cplusplus
+# define PCRE_DATA_SCOPE extern "C"
+# else
+# define PCRE_DATA_SCOPE extern
+# endif
+#endif
+
+/* Have to include stdlib.h in order to ensure that size_t is defined;
+it is needed here for malloc. */
+
+#include <stdlib.h>
+
+/* Allow for C++ users */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Options */
+
+#define PCRE_CASELESS 0x00000001
+#define PCRE_MULTILINE 0x00000002
+#define PCRE_DOTALL 0x00000004
+#define PCRE_EXTENDED 0x00000008
+#define PCRE_ANCHORED 0x00000010
+#define PCRE_DOLLAR_ENDONLY 0x00000020
+#define PCRE_EXTRA 0x00000040
+#define PCRE_NOTBOL 0x00000080
+#define PCRE_NOTEOL 0x00000100
+#define PCRE_UNGREEDY 0x00000200
+#define PCRE_NOTEMPTY 0x00000400
+#define PCRE_UTF8 0x00000800
+#define PCRE_NO_AUTO_CAPTURE 0x00001000
+#define PCRE_NO_UTF8_CHECK 0x00002000
+#define PCRE_AUTO_CALLOUT 0x00004000
+#define PCRE_PARTIAL 0x00008000
+#define PCRE_DFA_SHORTEST 0x00010000
+#define PCRE_DFA_RESTART 0x00020000
+#define PCRE_FIRSTLINE 0x00040000
+#define PCRE_DUPNAMES 0x00080000
+#define PCRE_NEWLINE_CR 0x00100000
+#define PCRE_NEWLINE_LF 0x00200000
+#define PCRE_NEWLINE_CRLF 0x00300000
+#define PCRE_NEWLINE_ANY 0x00400000
+
+/* Exec-time and get/set-time error codes */
+
+#define PCRE_ERROR_NOMATCH (-1)
+#define PCRE_ERROR_NULL (-2)
+#define PCRE_ERROR_BADOPTION (-3)
+#define PCRE_ERROR_BADMAGIC (-4)
+#define PCRE_ERROR_UNKNOWN_OPCODE (-5)
+#define PCRE_ERROR_UNKNOWN_NODE (-5) /* For backward compatibility */
+#define PCRE_ERROR_NOMEMORY (-6)
+#define PCRE_ERROR_NOSUBSTRING (-7)
+#define PCRE_ERROR_MATCHLIMIT (-8)
+#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */
+#define PCRE_ERROR_BADUTF8 (-10)
+#define PCRE_ERROR_BADUTF8_OFFSET (-11)
+#define PCRE_ERROR_PARTIAL (-12)
+#define PCRE_ERROR_BADPARTIAL (-13)
+#define PCRE_ERROR_INTERNAL (-14)
+#define PCRE_ERROR_BADCOUNT (-15)
+#define PCRE_ERROR_DFA_UITEM (-16)
+#define PCRE_ERROR_DFA_UCOND (-17)
+#define PCRE_ERROR_DFA_UMLIMIT (-18)
+#define PCRE_ERROR_DFA_WSSIZE (-19)
+#define PCRE_ERROR_DFA_RECURSE (-20)
+#define PCRE_ERROR_RECURSIONLIMIT (-21)
+#define PCRE_ERROR_NULLWSLIMIT (-22)
+#define PCRE_ERROR_BADNEWLINE (-23)
+
+/* Request types for pcre_fullinfo() */
+
+#define PCRE_INFO_OPTIONS 0
+#define PCRE_INFO_SIZE 1
+#define PCRE_INFO_CAPTURECOUNT 2
+#define PCRE_INFO_BACKREFMAX 3
+#define PCRE_INFO_FIRSTBYTE 4
+#define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */
+#define PCRE_INFO_FIRSTTABLE 5
+#define PCRE_INFO_LASTLITERAL 6
+#define PCRE_INFO_NAMEENTRYSIZE 7
+#define PCRE_INFO_NAMECOUNT 8
+#define PCRE_INFO_NAMETABLE 9
+#define PCRE_INFO_STUDYSIZE 10
+#define PCRE_INFO_DEFAULT_TABLES 11
+
+/* Request types for pcre_config(). Do not re-arrange, in order to remain
+compatible. */
+
+#define PCRE_CONFIG_UTF8 0
+#define PCRE_CONFIG_NEWLINE 1
+#define PCRE_CONFIG_LINK_SIZE 2
+#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3
+#define PCRE_CONFIG_MATCH_LIMIT 4
+#define PCRE_CONFIG_STACKRECURSE 5
+#define PCRE_CONFIG_UNICODE_PROPERTIES 6
+#define PCRE_CONFIG_MATCH_LIMIT_RECURSION 7
+
+/* Bit flags for the pcre_extra structure. Do not re-arrange or redefine
+these bits, just add new ones on the end, in order to remain compatible. */
+
+#define PCRE_EXTRA_STUDY_DATA 0x0001
+#define PCRE_EXTRA_MATCH_LIMIT 0x0002
+#define PCRE_EXTRA_CALLOUT_DATA 0x0004
+#define PCRE_EXTRA_TABLES 0x0008
+#define PCRE_EXTRA_MATCH_LIMIT_RECURSION 0x0010
+
+/* Types */
+
+struct real_pcre; /* declaration; the definition is private */
+typedef struct real_pcre pcre;
+
+/* When PCRE is compiled as a C++ library, the subject pointer type can be
+replaced with a custom type. For conventional use, the public interface is a
+const char *. */
+
+#ifndef PCRE_SPTR
+#define PCRE_SPTR const char *
+#endif
+
+/* The structure for passing additional data to pcre_exec(). This is defined in
+such as way as to be extensible. Always add new fields at the end, in order to
+remain compatible. */
+
+typedef struct pcre_extra {
+ unsigned long int flags; /* Bits for which fields are set */
+ void *study_data; /* Opaque data from pcre_study() */
+ unsigned long int match_limit; /* Maximum number of calls to match() */
+ void *callout_data; /* Data passed back in callouts */
+ const unsigned char *tables; /* Pointer to character tables */
+ unsigned long int match_limit_recursion; /* Max recursive calls to match() */
+} pcre_extra;
+
+/* The structure for passing out data via the pcre_callout_function. We use a
+structure so that new fields can be added on the end in future versions,
+without changing the API of the function, thereby allowing old clients to work
+without modification. */
+
+typedef struct pcre_callout_block {
+ int version; /* Identifies version of block */
+ /* ------------------------ Version 0 ------------------------------- */
+ int callout_number; /* Number compiled into pattern */
+ int *offset_vector; /* The offset vector */
+ PCRE_SPTR subject; /* The subject being matched */
+ int subject_length; /* The length of the subject */
+ int start_match; /* Offset to start of this match attempt */
+ int current_position; /* Where we currently are in the subject */
+ int capture_top; /* Max current capture */
+ int capture_last; /* Most recently closed capture */
+ void *callout_data; /* Data passed in with the call */
+ /* ------------------- Added for Version 1 -------------------------- */
+ int pattern_position; /* Offset to next item in the pattern */
+ int next_item_length; /* Length of next item in the pattern */
+ /* ------------------------------------------------------------------ */
+} pcre_callout_block;
+
+#include "glib.h"
+#include "galias.h"
+
+#define pcre_malloc g_try_malloc
+#define pcre_free g_free
+#define pcre_stack_malloc g_try_malloc
+
+PCRE_DATA_SCOPE int (*pcre_callout)(pcre_callout_block *);
+
+/* Exported PCRE functions */
+
+PCRE_DATA_SCOPE pcre *pcre_compile(const char *, int, const char **, int *,
+ const unsigned char *);
+PCRE_DATA_SCOPE pcre *pcre_compile2(const char *, int, int *, const char **,
+ int *, const unsigned char *);
+PCRE_DATA_SCOPE int pcre_config(int, void *);
+PCRE_DATA_SCOPE int pcre_copy_named_substring(const pcre *, const char *,
+ int *, int, const char *, char *, int);
+PCRE_DATA_SCOPE int pcre_copy_substring(const char *, int *, int, int, char *,
+ int);
+PCRE_DATA_SCOPE int pcre_dfa_exec(const pcre *, const pcre_extra *,
+ const char *, int, int, int, int *, int , int *, int);
+PCRE_DATA_SCOPE int pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR,
+ int, int, int, int *, int);
+PCRE_DATA_SCOPE void pcre_free_substring(const char *);
+PCRE_DATA_SCOPE void pcre_free_substring_list(const char **);
+PCRE_DATA_SCOPE int pcre_fullinfo(const pcre *, const pcre_extra *, int,
+ void *);
+PCRE_DATA_SCOPE int pcre_get_named_substring(const pcre *, const char *,
+ int *, int, const char *, const char **);
+PCRE_DATA_SCOPE int pcre_get_stringnumber(const pcre *, const char *);
+PCRE_DATA_SCOPE int pcre_get_stringtable_entries(const pcre *, const char *,
+ char **, char **);
+PCRE_DATA_SCOPE int pcre_get_substring(const char *, int *, int, int,
+ const char **);
+PCRE_DATA_SCOPE int pcre_get_substring_list(const char *, int *, int,
+ const char ***);
+PCRE_DATA_SCOPE int pcre_info(const pcre *, int *, int *);
+PCRE_DATA_SCOPE const unsigned char *pcre_maketables(void);
+PCRE_DATA_SCOPE int pcre_refcount(pcre *, int);
+PCRE_DATA_SCOPE pcre_extra *pcre_study(const pcre *, int, const char **);
+PCRE_DATA_SCOPE const char *pcre_version(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* End of pcre.h */
diff --git a/trunk/glib/pcre/pcre_chartables.c b/trunk/glib/pcre/pcre_chartables.c
new file mode 100644
index 000000000..e89c71aea
--- /dev/null
+++ b/trunk/glib/pcre/pcre_chartables.c
@@ -0,0 +1,195 @@
+/* This file is autogenerated by ../update-pcre/update.sh during
+ * the update of the local copy of PCRE.
+ */
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* This file is automatically written by the dftables auxiliary
+program. If you edit it by hand, you might like to edit the Makefile to
+prevent its ever being regenerated.
+
+This file contains the default tables for characters with codes less than
+128 (ASCII characters). These tables are used when no external tables are
+passed to PCRE.
+
+The following #include is present because without it gcc 4.x may remove
+the array definition from the final binary if PCRE is built into a static
+library and dead code stripping is activated. This leads to link errors.
+Pulling in the header ensures that the array gets flagged as "someone
+outside this compilation unit might reference this" and so it will always
+be supplied to the linker. */
+
+#include "pcre_internal.h"
+
+const unsigned char _pcre_default_tables[] = {
+
+/* This table is a lower casing table. */
+
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 97, 98, 99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,
+ 120,121,122, 91, 92, 93, 94, 95,
+ 96, 97, 98, 99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,
+ 120,121,122,123,124,125,126,127,
+ 128,129,130,131,132,133,134,135,
+ 136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,
+ 152,153,154,155,156,157,158,159,
+ 160,161,162,163,164,165,166,167,
+ 168,169,170,171,172,173,174,175,
+ 176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,
+ 192,193,194,195,196,197,198,199,
+ 200,201,202,203,204,205,206,207,
+ 208,209,210,211,212,213,214,215,
+ 216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,
+ 232,233,234,235,236,237,238,239,
+ 240,241,242,243,244,245,246,247,
+ 248,249,250,251,252,253,254,255,
+
+/* This table is a case flipping table. */
+
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 97, 98, 99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,
+ 120,121,122, 91, 92, 93, 94, 95,
+ 96, 65, 66, 67, 68, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87,
+ 88, 89, 90,123,124,125,126,127,
+ 128,129,130,131,132,133,134,135,
+ 136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,
+ 152,153,154,155,156,157,158,159,
+ 160,161,162,163,164,165,166,167,
+ 168,169,170,171,172,173,174,175,
+ 176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,
+ 192,193,194,195,196,197,198,199,
+ 200,201,202,203,204,205,206,207,
+ 208,209,210,211,212,213,214,215,
+ 216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,
+ 232,233,234,235,236,237,238,239,
+ 240,241,242,243,244,245,246,247,
+ 248,249,250,251,252,253,254,255,
+
+/* This table contains bit maps for various character classes.
+Each map is 32 bytes long and the bits run from the least
+significant end of each byte. The classes that have their own
+maps are: space, xdigit, digit, upper, lower, word, graph
+print, punct, and cntrl. Other classes are built from combinations. */
+
+ 0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
+ 0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
+ 0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc,
+ 0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+/* This table identifies various classes of character by individual bits:
+ 0x01 white space character
+ 0x02 letter
+ 0x04 decimal digit
+ 0x08 hexadecimal digit
+ 0x10 alphanumeric or '_'
+ 0x80 regular expression metacharacter or binary zero
+*/
+
+ 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */
+ 0x00,0x01,0x01,0x00,0x01,0x01,0x00,0x00, /* 8- 15 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */
+ 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /* - ' */
+ 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /* ( - / */
+ 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */
+ 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /* 8 - ? */
+ 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* @ - G */
+ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* H - O */
+ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* P - W */
+ 0x12,0x12,0x12,0x80,0x80,0x00,0x80,0x10, /* X - _ */
+ 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* ` - g */
+ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* h - o */
+ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* p - w */
+ 0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /* x -127 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */
+
+/* End of chartables.c */
diff --git a/trunk/glib/pcre/pcre_compile.c b/trunk/glib/pcre/pcre_compile.c
new file mode 100644
index 000000000..6eaeac100
--- /dev/null
+++ b/trunk/glib/pcre/pcre_compile.c
@@ -0,0 +1,5385 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_compile(), along with
+supporting internal functions that are not used by other modules. */
+
+
+#define NLBLOCK cd /* Block containing newline information */
+#define PSSTART start_pattern /* Field containing processed string start */
+#define PSEND end_pattern /* Field containing processed string end */
+
+
+#include "pcre_internal.h"
+
+
+/* When DEBUG is defined, we need the pcre_printint() function, which is also
+used by pcretest. DEBUG is not defined when building a production library. */
+
+#ifdef DEBUG
+#include "pcre_printint.src"
+#endif
+
+
+/*************************************************
+* Code parameters and static tables *
+*************************************************/
+
+/* This value specifies the size of stack workspace that is used during the
+first pre-compile phase that determines how much memory is required. The regex
+is partly compiled into this space, but the compiled parts are discarded as
+soon as they can be, so that hopefully there will never be an overrun. The code
+does, however, check for an overrun. The largest amount I've seen used is 218,
+so this number is very generous.
+
+The same workspace is used during the second, actual compile phase for
+remembering forward references to groups so that they can be filled in at the
+end. Each entry in this list occupies LINK_SIZE bytes, so even when LINK_SIZE
+is 4 there is plenty of room. */
+
+#define COMPILE_WORK_SIZE (4096)
+
+
+/* Table for handling escaped characters in the range '0'-'z'. Positive returns
+are simple data values; negative values are for special things like \d and so
+on. Zero means further processing is needed (for things like \x), or the escape
+is invalid. */
+
+#if !EBCDIC /* This is the "normal" table for ASCII systems */
+static const short int escapes[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0 - 7 */
+ 0, 0, ':', ';', '<', '=', '>', '?', /* 8 - ? */
+ '@', -ESC_A, -ESC_B, -ESC_C, -ESC_D, -ESC_E, 0, -ESC_G, /* @ - G */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* H - O */
+-ESC_P, -ESC_Q, -ESC_R, -ESC_S, 0, 0, 0, -ESC_W, /* P - W */
+-ESC_X, 0, -ESC_Z, '[', '\\', ']', '^', '_', /* X - _ */
+ '`', 7, -ESC_b, 0, -ESC_d, ESC_e, ESC_f, 0, /* ` - g */
+ 0, 0, 0, -ESC_k, 0, 0, ESC_n, 0, /* h - o */
+-ESC_p, 0, ESC_r, -ESC_s, ESC_tee, 0, 0, -ESC_w, /* p - w */
+ 0, 0, -ESC_z /* x - z */
+};
+
+#else /* This is the "abnormal" table for EBCDIC systems */
+static const short int escapes[] = {
+/* 48 */ 0, 0, 0, '.', '<', '(', '+', '|',
+/* 50 */ '&', 0, 0, 0, 0, 0, 0, 0,
+/* 58 */ 0, 0, '!', '$', '*', ')', ';', '~',
+/* 60 */ '-', '/', 0, 0, 0, 0, 0, 0,
+/* 68 */ 0, 0, '|', ',', '%', '_', '>', '?',
+/* 70 */ 0, 0, 0, 0, 0, 0, 0, 0,
+/* 78 */ 0, '`', ':', '#', '@', '\'', '=', '"',
+/* 80 */ 0, 7, -ESC_b, 0, -ESC_d, ESC_e, ESC_f, 0,
+/* 88 */ 0, 0, 0, '{', 0, 0, 0, 0,
+/* 90 */ 0, 0, -ESC_k, 'l', 0, ESC_n, 0, -ESC_p,
+/* 98 */ 0, ESC_r, 0, '}', 0, 0, 0, 0,
+/* A0 */ 0, '~', -ESC_s, ESC_tee, 0, 0, -ESC_w, 0,
+/* A8 */ 0,-ESC_z, 0, 0, 0, '[', 0, 0,
+/* B0 */ 0, 0, 0, 0, 0, 0, 0, 0,
+/* B8 */ 0, 0, 0, 0, 0, ']', '=', '-',
+/* C0 */ '{',-ESC_A, -ESC_B, -ESC_C, -ESC_D,-ESC_E, 0, -ESC_G,
+/* C8 */ 0, 0, 0, 0, 0, 0, 0, 0,
+/* D0 */ '}', 0, 0, 0, 0, 0, 0, -ESC_P,
+/* D8 */-ESC_Q,-ESC_R, 0, 0, 0, 0, 0, 0,
+/* E0 */ '\\', 0, -ESC_S, 0, 0, 0, -ESC_W, -ESC_X,
+/* E8 */ 0,-ESC_Z, 0, 0, 0, 0, 0, 0,
+/* F0 */ 0, 0, 0, 0, 0, 0, 0, 0,
+/* F8 */ 0, 0, 0, 0, 0, 0, 0, 0
+};
+#endif
+
+
+/* Tables of names of POSIX character classes and their lengths. The list is
+terminated by a zero length entry. The first three must be alpha, lower, upper,
+as this is assumed for handling case independence. */
+
+static const char posix_names[] =
+ "alpha\0"
+ "lower\0"
+ "upper\0"
+ "alnum\0"
+ "ascii\0"
+ "blank\0"
+ "cntrl\0"
+ "digit\0"
+ "graph\0"
+ "print\0"
+ "punct\0"
+ "space\0"
+ "word\0"
+ "xdigit";
+
+static const uschar posix_name_lengths[] = {
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 };
+
+/* Table of class bit maps for each POSIX class. Each class is formed from a
+base map, with an optional addition or removal of another map. Then, for some
+classes, there is some additional tweaking: for [:blank:] the vertical space
+characters are removed, and for [:alpha:] and [:alnum:] the underscore
+character is removed. The triples in the table consist of the base map offset,
+second map offset or -1 if no second map, and a non-negative value for map
+addition or a negative value for map subtraction (if there are two maps). The
+absolute value of the third field has these meanings: 0 => no tweaking, 1 =>
+remove vertical space characters, 2 => remove underscore. */
+
+static const int posix_class_maps[] = {
+ cbit_word, cbit_digit, -2, /* alpha */
+ cbit_lower, -1, 0, /* lower */
+ cbit_upper, -1, 0, /* upper */
+ cbit_word, -1, 2, /* alnum - word without underscore */
+ cbit_print, cbit_cntrl, 0, /* ascii */
+ cbit_space, -1, 1, /* blank - a GNU extension */
+ cbit_cntrl, -1, 0, /* cntrl */
+ cbit_digit, -1, 0, /* digit */
+ cbit_graph, -1, 0, /* graph */
+ cbit_print, -1, 0, /* print */
+ cbit_punct, -1, 0, /* punct */
+ cbit_space, -1, 0, /* space */
+ cbit_word, -1, 0, /* word - a Perl extension */
+ cbit_xdigit,-1, 0 /* xdigit */
+};
+
+
+#define STRING(a) # a
+#define XSTRING(s) STRING(s)
+
+/* The texts of compile-time error messages. These are "char *" because they
+are passed to the outside world. Do not ever re-use any error number, because
+they are documented. Always add a new error instead. Messages marked DEAD below
+are no longer used. */
+
+#define DEAD(s) "\0"
+
+static const char error_texts[] =
+ "no error\0"
+ "\\ at end of pattern\0"
+ "\\c at end of pattern\0"
+ "unrecognized character follows \\\0"
+ "numbers out of order in {} quantifier\0"
+ /* 5 */
+ "number too big in {} quantifier\0"
+ "missing terminating ] for character class\0"
+ "invalid escape sequence in character class\0"
+ "range out of order in character class\0"
+ "nothing to repeat\0"
+ /* 10 */
+ DEAD("operand of unlimited repeat could match the empty string")
+ "internal error: unexpected repeat\0"
+ "unrecognized character after (?\0"
+ "POSIX named classes are supported only within a class\0"
+ "missing )\0"
+ /* 15 */
+ "reference to non-existent subpattern\0"
+ "erroffset passed as NULL\0"
+ "unknown option bit(s) set\0"
+ "missing ) after comment\0"
+ DEAD("parentheses nested too deeply")
+ /* 20 */
+ "regular expression too large\0"
+ "failed to get memory\0"
+ "unmatched parentheses\0"
+ "internal error: code overflow\0"
+ "unrecognized character after (?<\0"
+ /* 25 */
+ "lookbehind assertion is not fixed length\0"
+ "malformed number or name after (?(\0"
+ "conditional group contains more than two branches\0"
+ "assertion expected after (?(\0"
+ "(?R or (?digits must be followed by )\0"
+ /* 30 */
+ "unknown POSIX class name\0"
+ "POSIX collating elements are not supported\0"
+ "this version of PCRE is not compiled with PCRE_UTF8 support\0"
+ DEAD("spare error")
+ "character value in \\x{...} sequence is too large\0"
+ /* 35 */
+ "invalid condition (?(0)\0"
+ "\\C not allowed in lookbehind assertion\0"
+ "PCRE does not support \\L, \\l, \\N, \\U, or \\u\0"
+ "number after (?C is > 255\0"
+ "closing ) for (?C expected\0"
+ /* 40 */
+ "recursive call could loop indefinitely\0"
+ "unrecognized character after (?P\0"
+ "syntax error in subpattern name (missing terminator)\0"
+ "two named subpatterns have the same name\0"
+ "invalid UTF-8 string\0"
+ /* 45 */
+ "support for \\P, \\p, and \\X has not been compiled\0"
+ "malformed \\P or \\p sequence\0"
+ "unknown property name after \\P or \\p\0"
+ "subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)\0"
+ "too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")\0"
+ /* 50 */
+ "repeated subpattern is too long\0"
+ "octal value is greater than \\377 (not in UTF-8 mode)\0"
+ "internal error: overran compiling workspace\0"
+ "internal error: previously-checked referenced subpattern not found\0"
+ "DEFINE group contains more than one branch\0"
+ /* 55 */
+ "repeating a DEFINE group is not allowed\0"
+ "inconsistent NEWLINE options\0"
+ "\\g is not followed by an (optionally braced) non-zero number";
+
+static const int error_texts_offsets[] = {
+ 0,
+ 9,
+ 29,
+ 50,
+ 83,
+ 121,
+ 153,
+ 195,
+ 238,
+ 276,
+ 294,
+ 295,
+ 329,
+ 361,
+ 415,
+ 425,
+ 462,
+ 487,
+ 513,
+ 537,
+ 538,
+ 567,
+ 588,
+ 610,
+ 640,
+ 673,
+ 714,
+ 749,
+ 799,
+ 828,
+ 866,
+ 891,
+ 934,
+ 994,
+ 995,
+ 1044,
+ 1068,
+ 1107,
+ 1151,
+ 1177,
+ 1204,
+ 1243,
+ 1276,
+ 1329,
+ 1370,
+ 1391,
+ 1440,
+ 1468,
+ 1505,
+ 1557,
+ 1600,
+ 1632,
+ 1685,
+ 1729,
+ 1796,
+ 1839,
+ 1879,
+ 1908
+};
+
+
+/* Definition to allow mutual recursion */
+
+static BOOL
+ compile_regex(int, int, uschar **, const uschar **, int *, BOOL, int, int *,
+ int *, branch_chain *, compile_data *, int *);
+
+
+
+/*************************************************
+* Handle escapes *
+*************************************************/
+
+/* This function is called when a \ has been encountered. It either returns a
+positive value for a simple escape such as \n, or a negative value which
+encodes one of the more complicated things such as \d. A backreference to group
+n is returned as -(ESC_REF + n); ESC_REF is the highest ESC_xxx macro. When
+UTF-8 is enabled, a positive value greater than 255 may be returned. On entry,
+ptr is pointing at the \. On exit, it is on the final character of the escape
+sequence.
+
+Arguments:
+ ptrptr points to the pattern position pointer
+ errorcodeptr points to the errorcode variable
+ bracount number of previous extracting brackets
+ options the options bits
+ isclass TRUE if inside a character class
+
+Returns: zero or positive => a data character
+ negative => a special escape sequence
+ on error, errorptr is set
+*/
+
+static int
+check_escape(const uschar **ptrptr, int *errorcodeptr, int bracount,
+ int options, BOOL isclass)
+{
+BOOL utf8 = (options & PCRE_UTF8) != 0;
+const uschar *ptr = *ptrptr + 1;
+int c, i;
+
+GETCHARINCTEST(c, ptr); /* Get character value, increment pointer */
+ptr--; /* Set pointer back to the last byte */
+
+/* If backslash is at the end of the pattern, it's an error. */
+
+if (c == 0) *errorcodeptr = ERR1;
+
+/* Non-alphamerics are literals. For digits or letters, do an initial lookup in
+a table. A non-zero result is something that can be returned immediately.
+Otherwise further processing may be required. */
+
+#if !EBCDIC /* ASCII coding */
+else if (c < '0' || c > 'z') {} /* Not alphameric */
+else if ((i = escapes[c - '0']) != 0) c = i;
+
+#else /* EBCDIC coding */
+else if (c < 'a' || (ebcdic_chartab[c] & 0x0E) == 0) {} /* Not alphameric */
+else if ((i = escapes[c - 0x48]) != 0) c = i;
+#endif
+
+/* Escapes that need further processing, or are illegal. */
+
+else
+ {
+ const uschar *oldptr;
+ BOOL braced, negated;
+
+ switch (c)
+ {
+ /* A number of Perl escapes are not handled by PCRE. We give an explicit
+ error. */
+
+ case 'l':
+ case 'L':
+ case 'N':
+ case 'u':
+ case 'U':
+ *errorcodeptr = ERR37;
+ break;
+
+ /* \g must be followed by a number, either plain or braced. If positive, it
+ is an absolute backreference. If negative, it is a relative backreference.
+ This is a Perl 5.10 feature. */
+
+ case 'g':
+ if (ptr[1] == '{')
+ {
+ braced = TRUE;
+ ptr++;
+ }
+ else braced = FALSE;
+
+ if (ptr[1] == '-')
+ {
+ negated = TRUE;
+ ptr++;
+ }
+ else negated = FALSE;
+
+ c = 0;
+ while (g_ascii_isdigit(ptr[1]) != 0)
+ c = c * 10 + *(++ptr) - '0';
+
+ if (c == 0 || (braced && *(++ptr) != '}'))
+ {
+ *errorcodeptr = ERR57;
+ return 0;
+ }
+
+ if (negated)
+ {
+ if (c > bracount)
+ {
+ *errorcodeptr = ERR15;
+ return 0;
+ }
+ c = bracount - (c - 1);
+ }
+
+ c = -(ESC_REF + c);
+ break;
+
+ /* The handling of escape sequences consisting of a string of digits
+ starting with one that is not zero is not straightforward. By experiment,
+ the way Perl works seems to be as follows:
+
+ Outside a character class, the digits are read as a decimal number. If the
+ number is less than 10, or if there are that many previous extracting
+ left brackets, then it is a back reference. Otherwise, up to three octal
+ digits are read to form an escaped byte. Thus \123 is likely to be octal
+ 123 (cf \0123, which is octal 012 followed by the literal 3). If the octal
+ value is greater than 377, the least significant 8 bits are taken. Inside a
+ character class, \ followed by a digit is always an octal number. */
+
+ case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+
+ if (!isclass)
+ {
+ oldptr = ptr;
+ c -= '0';
+ while (g_ascii_isdigit(ptr[1]) != 0)
+ c = c * 10 + *(++ptr) - '0';
+ if (c < 10 || c <= bracount)
+ {
+ c = -(ESC_REF + c);
+ break;
+ }
+ ptr = oldptr; /* Put the pointer back and fall through */
+ }
+
+ /* Handle an octal number following \. If the first digit is 8 or 9, Perl
+ generates a binary zero byte and treats the digit as a following literal.
+ Thus we have to pull back the pointer by one. */
+
+ if ((c = *ptr) >= '8')
+ {
+ ptr--;
+ c = 0;
+ break;
+ }
+
+ /* \0 always starts an octal number, but we may drop through to here with a
+ larger first octal digit. The original code used just to take the least
+ significant 8 bits of octal numbers (I think this is what early Perls used
+ to do). Nowadays we allow for larger numbers in UTF-8 mode, but no more
+ than 3 octal digits. */
+
+ case '0':
+ c -= '0';
+ while(i++ < 2 && ptr[1] >= '0' && ptr[1] <= '7')
+ c = c * 8 + *(++ptr) - '0';
+ if (!utf8 && c > 255) *errorcodeptr = ERR51;
+ break;
+
+ /* \x is complicated. \x{ddd} is a character number which can be greater
+ than 0xff in utf8 mode, but only if the ddd are hex digits. If not, { is
+ treated as a data character. */
+
+ case 'x':
+ if (ptr[1] == '{')
+ {
+ const uschar *pt = ptr + 2;
+ int count = 0;
+
+ c = 0;
+ while (g_ascii_isxdigit(*pt) != 0)
+ {
+ register int cc = *pt++;
+ if (c == 0 && cc == '0') continue; /* Leading zeroes */
+ count++;
+
+#if !EBCDIC /* ASCII coding */
+ if (cc >= 'a') cc -= 32; /* Convert to upper case */
+ c = (c << 4) + cc - ((cc < 'A')? '0' : ('A' - 10));
+#else /* EBCDIC coding */
+ if (cc >= 'a' && cc <= 'z') cc += 64; /* Convert to upper case */
+ c = (c << 4) + cc - ((cc >= '0')? '0' : ('A' - 10));
+#endif
+ }
+
+ if (*pt == '}')
+ {
+ if (c < 0 || count > (utf8? 8 : 2)) *errorcodeptr = ERR34;
+ ptr = pt;
+ break;
+ }
+
+ /* If the sequence of hex digits does not end with '}', then we don't
+ recognize this construct; fall through to the normal \x handling. */
+ }
+
+ /* Read just a single-byte hex-defined char */
+
+ c = 0;
+ while (i++ < 2 && g_ascii_isxdigit(ptr[1]) != 0)
+ {
+ int cc; /* Some compilers don't like ++ */
+ cc = *(++ptr); /* in initializers */
+#if !EBCDIC /* ASCII coding */
+ if (cc >= 'a') cc -= 32; /* Convert to upper case */
+ c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10));
+#else /* EBCDIC coding */
+ if (cc <= 'z') cc += 64; /* Convert to upper case */
+ c = c * 16 + cc - ((cc >= '0')? '0' : ('A' - 10));
+#endif
+ }
+ break;
+
+ /* For \c, a following letter is upper-cased; then the 0x40 bit is flipped.
+ This coding is ASCII-specific, but then the whole concept of \cx is
+ ASCII-specific. (However, an EBCDIC equivalent has now been added.) */
+
+ case 'c':
+ c = *(++ptr);
+ if (c == 0)
+ {
+ *errorcodeptr = ERR2;
+ return 0;
+ }
+
+#if !EBCDIC /* ASCII coding */
+ if (c >= 'a' && c <= 'z') c -= 32;
+ c ^= 0x40;
+#else /* EBCDIC coding */
+ if (c >= 'a' && c <= 'z') c += 64;
+ c ^= 0xC0;
+#endif
+ break;
+
+ /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any
+ other alphameric following \ is an error if PCRE_EXTRA was set; otherwise,
+ for Perl compatibility, it is a literal. This code looks a bit odd, but
+ there used to be some cases other than the default, and there may be again
+ in future, so I haven't "optimized" it. */
+
+ default:
+ if ((options & PCRE_EXTRA) != 0) switch(c)
+ {
+ default:
+ *errorcodeptr = ERR3;
+ break;
+ }
+ break;
+ }
+ }
+
+*ptrptr = ptr;
+return c;
+}
+
+
+
+#ifdef SUPPORT_UCP
+/*************************************************
+* Handle \P and \p *
+*************************************************/
+
+/* This function is called after \P or \p has been encountered, provided that
+PCRE is compiled with support for Unicode properties. On entry, ptrptr is
+pointing at the P or p. On exit, it is pointing at the final character of the
+escape sequence.
+
+Argument:
+ ptrptr points to the pattern position pointer
+ negptr points to a boolean that is set TRUE for negation else FALSE
+ dptr points to an int that is set to the detailed property value
+ errorcodeptr points to the error code variable
+
+Returns: type value from ucp_type_table, or -1 for an invalid type
+*/
+
+static int
+get_ucp(const uschar **ptrptr, BOOL *negptr, int *dptr, int *errorcodeptr)
+{
+int c, i, bot, top;
+const uschar *ptr = *ptrptr;
+char name[32];
+
+c = *(++ptr);
+if (c == 0) goto ERROR_RETURN;
+
+*negptr = FALSE;
+
+/* \P or \p can be followed by a name in {}, optionally preceded by ^ for
+negation. */
+
+if (c == '{')
+ {
+ if (ptr[1] == '^')
+ {
+ *negptr = TRUE;
+ ptr++;
+ }
+ for (i = 0; i < sizeof(name) - 1; i++)
+ {
+ c = *(++ptr);
+ if (c == 0) goto ERROR_RETURN;
+ if (c == '}') break;
+ name[i] = c;
+ }
+ if (c !='}') goto ERROR_RETURN;
+ name[i] = 0;
+ }
+
+/* Otherwise there is just one following character */
+
+else
+ {
+ name[0] = c;
+ name[1] = 0;
+ }
+
+*ptrptr = ptr;
+
+/* Search for a recognized property name using binary chop */
+
+bot = 0;
+top = _pcre_utt_size;
+
+while (bot < top)
+ {
+ i = (bot + top) >> 1;
+ c = strcmp(name, &_pcre_ucp_names[_pcre_utt[i].offset]);
+ if (c == 0)
+ {
+ *dptr = _pcre_utt[i].value;
+ return _pcre_utt[i].type;
+ }
+ if (c > 0) bot = i + 1; else top = i;
+ }
+
+*errorcodeptr = ERR47;
+*ptrptr = ptr;
+return -1;
+
+ERROR_RETURN:
+*errorcodeptr = ERR46;
+*ptrptr = ptr;
+return -1;
+}
+#endif
+
+
+
+
+/*************************************************
+* Check for counted repeat *
+*************************************************/
+
+/* This function is called when a '{' is encountered in a place where it might
+start a quantifier. It looks ahead to see if it really is a quantifier or not.
+It is only a quantifier if it is one of the forms {ddd} {ddd,} or {ddd,ddd}
+where the ddds are digits.
+
+Arguments:
+ p pointer to the first char after '{'
+
+Returns: TRUE or FALSE
+*/
+
+static BOOL
+is_counted_repeat(const uschar *p)
+{
+if (g_ascii_isdigit(*p++) == 0) return FALSE;
+while (g_ascii_isdigit(*p) != 0) p++;
+if (*p == '}') return TRUE;
+
+if (*p++ != ',') return FALSE;
+if (*p == '}') return TRUE;
+
+if (g_ascii_isdigit(*p++) == 0) return FALSE;
+while (g_ascii_isdigit(*p) != 0) p++;
+
+return (*p == '}');
+}
+
+
+
+/*************************************************
+* Read repeat counts *
+*************************************************/
+
+/* Read an item of the form {n,m} and return the values. This is called only
+after is_counted_repeat() has confirmed that a repeat-count quantifier exists,
+so the syntax is guaranteed to be correct, but we need to check the values.
+
+Arguments:
+ p pointer to first char after '{'
+ minp pointer to int for min
+ maxp pointer to int for max
+ returned as -1 if no max
+ errorcodeptr points to error code variable
+
+Returns: pointer to '}' on success;
+ current ptr on error, with errorcodeptr set non-zero
+*/
+
+static const uschar *
+read_repeat_counts(const uschar *p, int *minp, int *maxp, int *errorcodeptr)
+{
+int min = 0;
+int max = -1;
+
+/* Read the minimum value and do a paranoid check: a negative value indicates
+an integer overflow. */
+
+while (g_ascii_isdigit(*p) != 0) min = min * 10 + *p++ - '0';
+if (min < 0 || min > 65535)
+ {
+ *errorcodeptr = ERR5;
+ return p;
+ }
+
+/* Read the maximum value if there is one, and again do a paranoid on its size.
+Also, max must not be less than min. */
+
+if (*p == '}') max = min; else
+ {
+ if (*(++p) != '}')
+ {
+ max = 0;
+ while(g_ascii_isdigit(*p) != 0) max = max * 10 + *p++ - '0';
+ if (max < 0 || max > 65535)
+ {
+ *errorcodeptr = ERR5;
+ return p;
+ }
+ if (max < min)
+ {
+ *errorcodeptr = ERR4;
+ return p;
+ }
+ }
+ }
+
+/* Fill in the required variables, and pass back the pointer to the terminating
+'}'. */
+
+*minp = min;
+*maxp = max;
+return p;
+}
+
+
+
+/*************************************************
+* Find forward referenced subpattern *
+*************************************************/
+
+/* This function scans along a pattern's text looking for capturing
+subpatterns, and counting them. If it finds a named pattern that matches the
+name it is given, it returns its number. Alternatively, if the name is NULL, it
+returns when it reaches a given numbered subpattern. This is used for forward
+references to subpatterns. We know that if (?P< is encountered, the name will
+be terminated by '>' because that is checked in the first pass.
+
+Arguments:
+ ptr current position in the pattern
+ count current count of capturing parens so far encountered
+ name name to seek, or NULL if seeking a numbered subpattern
+ lorn name length, or subpattern number if name is NULL
+ xmode TRUE if we are in /x mode
+
+Returns: the number of the named subpattern, or -1 if not found
+*/
+
+static int
+find_parens(const uschar *ptr, int count, const uschar *name, int lorn,
+ BOOL xmode)
+{
+const uschar *thisname;
+
+for (; *ptr != 0; ptr++)
+ {
+ int term;
+
+ /* Skip over backslashed characters and also entire \Q...\E */
+
+ if (*ptr == '\\')
+ {
+ if (*(++ptr) == 0) return -1;
+ if (*ptr == 'Q') for (;;)
+ {
+ while (*(++ptr) != 0 && *ptr != '\\');
+ if (*ptr == 0) return -1;
+ if (*(++ptr) == 'E') break;
+ }
+ continue;
+ }
+
+ /* Skip over character classes */
+
+ if (*ptr == '[')
+ {
+ while (*(++ptr) != ']')
+ {
+ if (*ptr == '\\')
+ {
+ if (*(++ptr) == 0) return -1;
+ if (*ptr == 'Q') for (;;)
+ {
+ while (*(++ptr) != 0 && *ptr != '\\');
+ if (*ptr == 0) return -1;
+ if (*(++ptr) == 'E') break;
+ }
+ continue;
+ }
+ }
+ continue;
+ }
+
+ /* Skip comments in /x mode */
+
+ if (xmode && *ptr == '#')
+ {
+ while (*(++ptr) != 0 && *ptr != '\n');
+ if (*ptr == 0) return -1;
+ continue;
+ }
+
+ /* An opening parens must now be a real metacharacter */
+
+ if (*ptr != '(') continue;
+ if (ptr[1] != '?')
+ {
+ count++;
+ if (name == NULL && count == lorn) return count;
+ continue;
+ }
+
+ ptr += 2;
+ if (*ptr == 'P') ptr++; /* Allow optional P */
+
+ /* We have to disambiguate (?<! and (?<= from (?<name> */
+
+ if ((*ptr != '<' || ptr[1] == '!' || ptr[1] == '=') &&
+ *ptr != '\'')
+ continue;
+
+ count++;
+
+ if (name == NULL && count == lorn) return count;
+ term = *ptr++;
+ if (term == '<') term = '>';
+ thisname = ptr;
+ while (*ptr != term) ptr++;
+ if (name != NULL && lorn == ptr - thisname &&
+ strncmp((const char *)name, (const char *)thisname, lorn) == 0)
+ return count;
+ }
+
+return -1;
+}
+
+
+
+/*************************************************
+* Find first significant op code *
+*************************************************/
+
+/* This is called by several functions that scan a compiled expression looking
+for a fixed first character, or an anchoring op code etc. It skips over things
+that do not influence this. For some calls, a change of option is important.
+For some calls, it makes sense to skip negative forward and all backward
+assertions, and also the \b assertion; for others it does not.
+
+Arguments:
+ code pointer to the start of the group
+ options pointer to external options
+ optbit the option bit whose changing is significant, or
+ zero if none are
+ skipassert TRUE if certain assertions are to be skipped
+
+Returns: pointer to the first significant opcode
+*/
+
+static const uschar*
+first_significant_code(const uschar *code, int *options, int optbit,
+ BOOL skipassert)
+{
+for (;;)
+ {
+ switch ((int)*code)
+ {
+ case OP_OPT:
+ if (optbit > 0 && ((int)code[1] & optbit) != (*options & optbit))
+ *options = (int)code[1];
+ code += 2;
+ break;
+
+ case OP_ASSERT_NOT:
+ case OP_ASSERTBACK:
+ case OP_ASSERTBACK_NOT:
+ if (!skipassert) return code;
+ do code += GET(code, 1); while (*code == OP_ALT);
+ code += _pcre_OP_lengths[*code];
+ break;
+
+ case OP_WORD_BOUNDARY:
+ case OP_NOT_WORD_BOUNDARY:
+ if (!skipassert) return code;
+ /* Fall through */
+
+ case OP_CALLOUT:
+ case OP_CREF:
+ case OP_RREF:
+ case OP_DEF:
+ code += _pcre_OP_lengths[*code];
+ break;
+
+ default:
+ return code;
+ }
+ }
+/* Control never reaches here */
+}
+
+
+
+
+/*************************************************
+* Find the fixed length of a pattern *
+*************************************************/
+
+/* Scan a pattern and compute the fixed length of subject that will match it,
+if the length is fixed. This is needed for dealing with backward assertions.
+In UTF8 mode, the result is in characters rather than bytes.
+
+Arguments:
+ code points to the start of the pattern (the bracket)
+ options the compiling options
+
+Returns: the fixed length, or -1 if there is no fixed length,
+ or -2 if \C was encountered
+*/
+
+static int
+find_fixedlength(uschar *code, int options)
+{
+int length = -1;
+
+register int branchlength = 0;
+register uschar *cc = code + 1 + LINK_SIZE;
+
+/* Scan along the opcodes for this branch. If we get to the end of the
+branch, check the length against that of the other branches. */
+
+for (;;)
+ {
+ int d;
+ register int op = *cc;
+
+ switch (op)
+ {
+ case OP_CBRA:
+ case OP_BRA:
+ case OP_ONCE:
+ case OP_COND:
+ d = find_fixedlength(cc + ((op == OP_CBRA)? 2:0), options);
+ if (d < 0) return d;
+ branchlength += d;
+ do cc += GET(cc, 1); while (*cc == OP_ALT);
+ cc += 1 + LINK_SIZE;
+ break;
+
+ /* Reached end of a branch; if it's a ket it is the end of a nested
+ call. If it's ALT it is an alternation in a nested call. If it is
+ END it's the end of the outer call. All can be handled by the same code. */
+
+ case OP_ALT:
+ case OP_KET:
+ case OP_KETRMAX:
+ case OP_KETRMIN:
+ case OP_END:
+ if (length < 0) length = branchlength;
+ else if (length != branchlength) return -1;
+ if (*cc != OP_ALT) return length;
+ cc += 1 + LINK_SIZE;
+ branchlength = 0;
+ break;
+
+ /* Skip over assertive subpatterns */
+
+ case OP_ASSERT:
+ case OP_ASSERT_NOT:
+ case OP_ASSERTBACK:
+ case OP_ASSERTBACK_NOT:
+ do cc += GET(cc, 1); while (*cc == OP_ALT);
+ /* Fall through */
+
+ /* Skip over things that don't match chars */
+
+ case OP_REVERSE:
+ case OP_CREF:
+ case OP_RREF:
+ case OP_DEF:
+ case OP_OPT:
+ case OP_CALLOUT:
+ case OP_SOD:
+ case OP_SOM:
+ case OP_EOD:
+ case OP_EODN:
+ case OP_CIRC:
+ case OP_DOLL:
+ case OP_NOT_WORD_BOUNDARY:
+ case OP_WORD_BOUNDARY:
+ cc += _pcre_OP_lengths[*cc];
+ break;
+
+ /* Handle literal characters */
+
+ case OP_CHAR:
+ case OP_CHARNC:
+ case OP_NOT:
+ branchlength++;
+ cc += 2;
+#ifdef SUPPORT_UTF8
+ if ((options & PCRE_UTF8) != 0)
+ {
+ while ((*cc & 0xc0) == 0x80) cc++;
+ }
+#endif
+ break;
+
+ /* Handle exact repetitions. The count is already in characters, but we
+ need to skip over a multibyte character in UTF8 mode. */
+
+ case OP_EXACT:
+ branchlength += GET2(cc,1);
+ cc += 4;
+#ifdef SUPPORT_UTF8
+ if ((options & PCRE_UTF8) != 0)
+ {
+ while((*cc & 0x80) == 0x80) cc++;
+ }
+#endif
+ break;
+
+ case OP_TYPEEXACT:
+ branchlength += GET2(cc,1);
+ cc += 4;
+ break;
+
+ /* Handle single-char matchers */
+
+ case OP_PROP:
+ case OP_NOTPROP:
+ cc += 2;
+ /* Fall through */
+
+ case OP_NOT_DIGIT:
+ case OP_DIGIT:
+ case OP_NOT_WHITESPACE:
+ case OP_WHITESPACE:
+ case OP_NOT_WORDCHAR:
+ case OP_WORDCHAR:
+ case OP_ANY:
+ branchlength++;
+ cc++;
+ break;
+
+ /* The single-byte matcher isn't allowed */
+
+ case OP_ANYBYTE:
+ return -2;
+
+ /* Check a class for variable quantification */
+
+#ifdef SUPPORT_UTF8
+ case OP_XCLASS:
+ cc += GET(cc, 1) - 33;
+ /* Fall through */
+#endif
+
+ case OP_CLASS:
+ case OP_NCLASS:
+ cc += 33;
+
+ switch (*cc)
+ {
+ case OP_CRSTAR:
+ case OP_CRMINSTAR:
+ case OP_CRQUERY:
+ case OP_CRMINQUERY:
+ return -1;
+
+ case OP_CRRANGE:
+ case OP_CRMINRANGE:
+ if (GET2(cc,1) != GET2(cc,3)) return -1;
+ branchlength += GET2(cc,1);
+ cc += 5;
+ break;
+
+ default:
+ branchlength++;
+ }
+ break;
+
+ /* Anything else is variable length */
+
+ default:
+ return -1;
+ }
+ }
+/* Control never gets here */
+}
+
+
+
+
+/*************************************************
+* Scan compiled regex for numbered bracket *
+*************************************************/
+
+/* This little function scans through a compiled pattern until it finds a
+capturing bracket with the given number.
+
+Arguments:
+ code points to start of expression
+ utf8 TRUE in UTF-8 mode
+ number the required bracket number
+
+Returns: pointer to the opcode for the bracket, or NULL if not found
+*/
+
+static const uschar *
+find_bracket(const uschar *code, BOOL utf8, int number)
+{
+for (;;)
+ {
+ register int c = *code;
+ if (c == OP_END) return NULL;
+
+ /* XCLASS is used for classes that cannot be represented just by a bit
+ map. This includes negated single high-valued characters. The length in
+ the table is zero; the actual length is stored in the compiled code. */
+
+ if (c == OP_XCLASS) code += GET(code, 1);
+
+ /* Handle capturing bracket */
+
+ else if (c == OP_CBRA)
+ {
+ int n = GET2(code, 1+LINK_SIZE);
+ if (n == number) return (uschar *)code;
+ code += _pcre_OP_lengths[c];
+ }
+
+ /* In UTF-8 mode, opcodes that are followed by a character may be followed by
+ a multi-byte character. The length in the table is a minimum, so we have to
+ arrange to skip the extra bytes. */
+
+ else
+ {
+ code += _pcre_OP_lengths[c];
+ if (utf8) switch(c)
+ {
+ case OP_CHAR:
+ case OP_CHARNC:
+ case OP_EXACT:
+ case OP_UPTO:
+ case OP_MINUPTO:
+ case OP_POSUPTO:
+ case OP_STAR:
+ case OP_MINSTAR:
+ case OP_POSSTAR:
+ case OP_PLUS:
+ case OP_MINPLUS:
+ case OP_POSPLUS:
+ case OP_QUERY:
+ case OP_MINQUERY:
+ case OP_POSQUERY:
+ if (code[-1] >= 0xc0) code += _pcre_utf8_table4[code[-1] & 0x3f];
+ break;
+ }
+ }
+ }
+}
+
+
+
+/*************************************************
+* Scan compiled regex for recursion reference *
+*************************************************/
+
+/* This little function scans through a compiled pattern until it finds an
+instance of OP_RECURSE.
+
+Arguments:
+ code points to start of expression
+ utf8 TRUE in UTF-8 mode
+
+Returns: pointer to the opcode for OP_RECURSE, or NULL if not found
+*/
+
+static const uschar *
+find_recurse(const uschar *code, BOOL utf8)
+{
+for (;;)
+ {
+ register int c = *code;
+ if (c == OP_END) return NULL;
+ if (c == OP_RECURSE) return code;
+
+ /* XCLASS is used for classes that cannot be represented just by a bit
+ map. This includes negated single high-valued characters. The length in
+ the table is zero; the actual length is stored in the compiled code. */
+
+ if (c == OP_XCLASS) code += GET(code, 1);
+
+ /* Otherwise, we get the item's length from the table. In UTF-8 mode, opcodes
+ that are followed by a character may be followed by a multi-byte character.
+ The length in the table is a minimum, so we have to arrange to skip the extra
+ bytes. */
+
+ else
+ {
+ code += _pcre_OP_lengths[c];
+ if (utf8) switch(c)
+ {
+ case OP_CHAR:
+ case OP_CHARNC:
+ case OP_EXACT:
+ case OP_UPTO:
+ case OP_MINUPTO:
+ case OP_POSUPTO:
+ case OP_STAR:
+ case OP_MINSTAR:
+ case OP_POSSTAR:
+ case OP_PLUS:
+ case OP_MINPLUS:
+ case OP_POSPLUS:
+ case OP_QUERY:
+ case OP_MINQUERY:
+ case OP_POSQUERY:
+ if (code[-1] >= 0xc0) code += _pcre_utf8_table4[code[-1] & 0x3f];
+ break;
+ }
+ }
+ }
+}
+
+
+
+/*************************************************
+* Scan compiled branch for non-emptiness *
+*************************************************/
+
+/* This function scans through a branch of a compiled pattern to see whether it
+can match the empty string or not. It is called from could_be_empty()
+below and from compile_branch() when checking for an unlimited repeat of a
+group that can match nothing. Note that first_significant_code() skips over
+assertions. If we hit an unclosed bracket, we return "empty" - this means we've
+struck an inner bracket whose current branch will already have been scanned.
+
+Arguments:
+ code points to start of search
+ endcode points to where to stop
+ utf8 TRUE if in UTF8 mode
+
+Returns: TRUE if what is matched could be empty
+*/
+
+static BOOL
+could_be_empty_branch(const uschar *code, const uschar *endcode, BOOL utf8)
+{
+register int c;
+for (code = first_significant_code(code + _pcre_OP_lengths[*code], NULL, 0, TRUE);
+ code < endcode;
+ code = first_significant_code(code + _pcre_OP_lengths[c], NULL, 0, TRUE))
+ {
+ const uschar *ccode;
+
+ c = *code;
+
+ if (c == OP_BRA || c == OP_CBRA || c == OP_ONCE)
+ {
+ BOOL empty_branch;
+ if (GET(code, 1) == 0) return TRUE; /* Hit unclosed bracket */
+
+ /* Scan a closed bracket */
+
+ empty_branch = FALSE;
+ do
+ {
+ if (!empty_branch && could_be_empty_branch(code, endcode, utf8))
+ empty_branch = TRUE;
+ code += GET(code, 1);
+ }
+ while (*code == OP_ALT);
+ if (!empty_branch) return FALSE; /* All branches are non-empty */
+
+ /* Move past the KET and fudge things so that the increment in the "for"
+ above has no effect. */
+
+ c = OP_END;
+ code += 1 + LINK_SIZE - _pcre_OP_lengths[c];
+ continue;
+ }
+
+ /* Handle the other opcodes */
+
+ switch (c)
+ {
+ /* Check for quantifiers after a class */
+
+#ifdef SUPPORT_UTF8
+ case OP_XCLASS:
+ ccode = code + GET(code, 1);
+ goto CHECK_CLASS_REPEAT;
+#endif
+
+ case OP_CLASS:
+ case OP_NCLASS:
+ ccode = code + 33;
+
+#ifdef SUPPORT_UTF8
+ CHECK_CLASS_REPEAT:
+#endif
+
+ switch (*ccode)
+ {
+ case OP_CRSTAR: /* These could be empty; continue */
+ case OP_CRMINSTAR:
+ case OP_CRQUERY:
+ case OP_CRMINQUERY:
+ break;
+
+ default: /* Non-repeat => class must match */
+ case OP_CRPLUS: /* These repeats aren't empty */
+ case OP_CRMINPLUS:
+ return FALSE;
+
+ case OP_CRRANGE:
+ case OP_CRMINRANGE:
+ if (GET2(ccode, 1) > 0) return FALSE; /* Minimum > 0 */
+ break;
+ }
+ break;
+
+ /* Opcodes that must match a character */
+
+ case OP_PROP:
+ case OP_NOTPROP:
+ case OP_EXTUNI:
+ case OP_NOT_DIGIT:
+ case OP_DIGIT:
+ case OP_NOT_WHITESPACE:
+ case OP_WHITESPACE:
+ case OP_NOT_WORDCHAR:
+ case OP_WORDCHAR:
+ case OP_ANY:
+ case OP_ANYBYTE:
+ case OP_CHAR:
+ case OP_CHARNC:
+ case OP_NOT:
+ case OP_PLUS:
+ case OP_MINPLUS:
+ case OP_POSPLUS:
+ case OP_EXACT:
+ case OP_NOTPLUS:
+ case OP_NOTMINPLUS:
+ case OP_NOTPOSPLUS:
+ case OP_NOTEXACT:
+ case OP_TYPEPLUS:
+ case OP_TYPEMINPLUS:
+ case OP_TYPEPOSPLUS:
+ case OP_TYPEEXACT:
+ return FALSE;
+
+ /* End of branch */
+
+ case OP_KET:
+ case OP_KETRMAX:
+ case OP_KETRMIN:
+ case OP_ALT:
+ return TRUE;
+
+ /* In UTF-8 mode, STAR, MINSTAR, POSSTAR, QUERY, MINQUERY, POSQUERY, UPTO,
+ MINUPTO, and POSUPTO may be followed by a multibyte character */
+
+#ifdef SUPPORT_UTF8
+ case OP_STAR:
+ case OP_MINSTAR:
+ case OP_POSSTAR:
+ case OP_QUERY:
+ case OP_MINQUERY:
+ case OP_POSQUERY:
+ case OP_UPTO:
+ case OP_MINUPTO:
+ case OP_POSUPTO:
+ if (utf8) while ((code[2] & 0xc0) == 0x80) code++;
+ break;
+#endif
+ }
+ }
+
+return TRUE;
+}
+
+
+
+/*************************************************
+* Scan compiled regex for non-emptiness *
+*************************************************/
+
+/* This function is called to check for left recursive calls. We want to check
+the current branch of the current pattern to see if it could match the empty
+string. If it could, we must look outwards for branches at other levels,
+stopping when we pass beyond the bracket which is the subject of the recursion.
+
+Arguments:
+ code points to start of the recursion
+ endcode points to where to stop (current RECURSE item)
+ bcptr points to the chain of current (unclosed) branch starts
+ utf8 TRUE if in UTF-8 mode
+
+Returns: TRUE if what is matched could be empty
+*/
+
+static BOOL
+could_be_empty(const uschar *code, const uschar *endcode, branch_chain *bcptr,
+ BOOL utf8)
+{
+while (bcptr != NULL && bcptr->current >= code)
+ {
+ if (!could_be_empty_branch(bcptr->current, endcode, utf8)) return FALSE;
+ bcptr = bcptr->outer;
+ }
+return TRUE;
+}
+
+
+
+/*************************************************
+* Check for POSIX class syntax *
+*************************************************/
+
+/* This function is called when the sequence "[:" or "[." or "[=" is
+encountered in a character class. It checks whether this is followed by an
+optional ^ and then a sequence of letters, terminated by a matching ":]" or
+".]" or "=]".
+
+Argument:
+ ptr pointer to the initial [
+ endptr where to return the end pointer
+ cd pointer to compile data
+
+Returns: TRUE or FALSE
+*/
+
+static BOOL
+check_posix_syntax(const uschar *ptr, const uschar **endptr, compile_data *cd)
+{
+int terminator; /* Don't combine these lines; the Solaris cc */
+terminator = *(++ptr); /* compiler warns about "non-constant" initializer. */
+if (*(++ptr) == '^') ptr++;
+while ((cd->ctypes[*ptr] & ctype_letter) != 0) ptr++;
+if (*ptr == terminator && ptr[1] == ']')
+ {
+ *endptr = ptr;
+ return TRUE;
+ }
+return FALSE;
+}
+
+
+
+
+/*************************************************
+* Check POSIX class name *
+*************************************************/
+
+/* This function is called to check the name given in a POSIX-style class entry
+such as [:alnum:].
+
+Arguments:
+ ptr points to the first letter
+ len the length of the name
+
+Returns: a value representing the name, or -1 if unknown
+*/
+
+static int
+check_posix_name(const uschar *ptr, int len)
+{
+ int offset = 0;
+ int yield = 0;
+ while (posix_name_lengths[yield] != 0)
+ {
+ if (len == posix_name_lengths[yield] &&
+ strcmp((const char *)ptr, posix_names + offset) == 0) return yield;
+ offset += posix_name_lengths[yield] + 1;
+ yield++;
+ }
+ return -1;
+}
+
+
+/*************************************************
+* Adjust OP_RECURSE items in repeated group *
+*************************************************/
+
+/* OP_RECURSE items contain an offset from the start of the regex to the group
+that is referenced. This means that groups can be replicated for fixed
+repetition simply by copying (because the recursion is allowed to refer to
+earlier groups that are outside the current group). However, when a group is
+optional (i.e. the minimum quantifier is zero), OP_BRAZERO is inserted before
+it, after it has been compiled. This means that any OP_RECURSE items within it
+that refer to the group itself or any contained groups have to have their
+offsets adjusted. That one of the jobs of this function. Before it is called,
+the partially compiled regex must be temporarily terminated with OP_END.
+
+This function has been extended with the possibility of forward references for
+recursions and subroutine calls. It must also check the list of such references
+for the group we are dealing with. If it finds that one of the recursions in
+the current group is on this list, it adjusts the offset in the list, not the
+value in the reference (which is a group number).
+
+Arguments:
+ group points to the start of the group
+ adjust the amount by which the group is to be moved
+ utf8 TRUE in UTF-8 mode
+ cd contains pointers to tables etc.
+ save_hwm the hwm forward reference pointer at the start of the group
+
+Returns: nothing
+*/
+
+static void
+adjust_recurse(uschar *group, int adjust, BOOL utf8, compile_data *cd,
+ uschar *save_hwm)
+{
+uschar *ptr = group;
+while ((ptr = (uschar *)find_recurse(ptr, utf8)) != NULL)
+ {
+ int offset;
+ uschar *hc;
+
+ /* See if this recursion is on the forward reference list. If so, adjust the
+ reference. */
+
+ for (hc = save_hwm; hc < cd->hwm; hc += LINK_SIZE)
+ {
+ offset = GET(hc, 0);
+ if (cd->start_code + offset == ptr + 1)
+ {
+ PUT(hc, 0, offset + adjust);
+ break;
+ }
+ }
+
+ /* Otherwise, adjust the recursion offset if it's after the start of this
+ group. */
+
+ if (hc >= cd->hwm)
+ {
+ offset = GET(ptr, 1);
+ if (cd->start_code + offset >= group) PUT(ptr, 1, offset + adjust);
+ }
+
+ ptr += 1 + LINK_SIZE;
+ }
+}
+
+
+
+/*************************************************
+* Insert an automatic callout point *
+*************************************************/
+
+/* This function is called when the PCRE_AUTO_CALLOUT option is set, to insert
+callout points before each pattern item.
+
+Arguments:
+ code current code pointer
+ ptr current pattern pointer
+ cd pointers to tables etc
+
+Returns: new code pointer
+*/
+
+static uschar *
+auto_callout(uschar *code, const uschar *ptr, compile_data *cd)
+{
+*code++ = OP_CALLOUT;
+*code++ = 255;
+PUT(code, 0, ptr - cd->start_pattern); /* Pattern offset */
+PUT(code, LINK_SIZE, 0); /* Default length */
+return code + 2*LINK_SIZE;
+}
+
+
+
+/*************************************************
+* Complete a callout item *
+*************************************************/
+
+/* A callout item contains the length of the next item in the pattern, which
+we can't fill in till after we have reached the relevant point. This is used
+for both automatic and manual callouts.
+
+Arguments:
+ previous_callout points to previous callout item
+ ptr current pattern pointer
+ cd pointers to tables etc
+
+Returns: nothing
+*/
+
+static void
+complete_callout(uschar *previous_callout, const uschar *ptr, compile_data *cd)
+{
+int length = ptr - cd->start_pattern - GET(previous_callout, 2);
+PUT(previous_callout, 2 + LINK_SIZE, length);
+}
+
+
+
+#ifdef SUPPORT_UCP
+/*************************************************
+* Get othercase range *
+*************************************************/
+
+/* This function is passed the start and end of a class range, in UTF-8 mode
+with UCP support. It searches up the characters, looking for internal ranges of
+characters in the "other" case. Each call returns the next one, updating the
+start address.
+
+Arguments:
+ cptr points to starting character value; updated
+ d end value
+ ocptr where to put start of othercase range
+ odptr where to put end of othercase range
+
+Yield: TRUE when range returned; FALSE when no more
+*/
+
+static BOOL
+get_othercase_range(unsigned int *cptr, unsigned int d, unsigned int *ocptr,
+ unsigned int *odptr)
+{
+unsigned int c, othercase, next;
+
+for (c = *cptr; c <= d; c++)
+ { if ((othercase = _pcre_ucp_othercase(c)) != NOTACHAR) break; }
+
+if (c > d) return FALSE;
+
+*ocptr = othercase;
+next = othercase + 1;
+
+for (++c; c <= d; c++)
+ {
+ if (_pcre_ucp_othercase(c) != next) break;
+ next++;
+ }
+
+*odptr = next - 1;
+*cptr = c;
+
+return TRUE;
+}
+#endif /* SUPPORT_UCP */
+
+
+
+/*************************************************
+* Check if auto-possessifying is possible *
+*************************************************/
+
+/* This function is called for unlimited repeats of certain items, to see
+whether the next thing could possibly match the repeated item. If not, it makes
+sense to automatically possessify the repeated item.
+
+Arguments:
+ op_code the repeated op code
+ this data for this item, depends on the opcode
+ utf8 TRUE in UTF-8 mode
+ utf8_char used for utf8 character bytes, NULL if not relevant
+ ptr next character in pattern
+ options options bits
+ cd contains pointers to tables etc.
+
+Returns: TRUE if possessifying is wanted
+*/
+
+static BOOL
+check_auto_possessive(int op_code, int item, BOOL utf8, uschar *utf8_char,
+ const uschar *ptr, int options, compile_data *cd)
+{
+int next;
+
+/* Skip whitespace and comments in extended mode */
+
+if ((options & PCRE_EXTENDED) != 0)
+ {
+ for (;;)
+ {
+ while ((cd->ctypes[*ptr] & ctype_space) != 0) ptr++;
+ if (*ptr == '#')
+ {
+ while (*(++ptr) != 0)
+ if (IS_NEWLINE(ptr)) { ptr += cd->nllen; break; }
+ }
+ else break;
+ }
+ }
+
+/* If the next item is one that we can handle, get its value. A non-negative
+value is a character, a negative value is an escape value. */
+
+if (*ptr == '\\')
+ {
+ int temperrorcode = 0;
+ next = check_escape(&ptr, &temperrorcode, cd->bracount, options, FALSE);
+ if (temperrorcode != 0) return FALSE;
+ ptr++; /* Point after the escape sequence */
+ }
+
+else if ((cd->ctypes[*ptr] & ctype_meta) == 0)
+ {
+#ifdef SUPPORT_UTF8
+ if (utf8) { GETCHARINC(next, ptr); } else
+#endif
+ next = *ptr++;
+ }
+
+else return FALSE;
+
+/* Skip whitespace and comments in extended mode */
+
+if ((options & PCRE_EXTENDED) != 0)
+ {
+ for (;;)
+ {
+ while ((cd->ctypes[*ptr] & ctype_space) != 0) ptr++;
+ if (*ptr == '#')
+ {
+ while (*(++ptr) != 0)
+ if (IS_NEWLINE(ptr)) { ptr += cd->nllen; break; }
+ }
+ else break;
+ }
+ }
+
+/* If the next thing is itself optional, we have to give up. */
+
+if (*ptr == '*' || *ptr == '?' || strncmp((char *)ptr, "{0,", 3) == 0)
+ return FALSE;
+
+/* Now compare the next item with the previous opcode. If the previous is a
+positive single character match, "item" either contains the character or, if
+"item" is greater than 127 in utf8 mode, the character's bytes are in
+utf8_char. */
+
+
+/* Handle cases when the next item is a character. */
+
+if (next >= 0) switch(op_code)
+ {
+ case OP_CHAR:
+#ifdef SUPPORT_UTF8
+ if (utf8 && item > 127) { GETCHAR(item, utf8_char); }
+#endif
+ return item != next;
+
+ /* For CHARNC (caseless character) we must check the other case. If we have
+ Unicode property support, we can use it to test the other case of
+ high-valued characters. */
+
+ case OP_CHARNC:
+#ifdef SUPPORT_UTF8
+ if (utf8 && item > 127) { GETCHAR(item, utf8_char); }
+#endif
+ if (item == next) return FALSE;
+#ifdef SUPPORT_UTF8
+ if (utf8)
+ {
+ unsigned int othercase;
+ if (next < 128) othercase = cd->fcc[next]; else
+#ifdef SUPPORT_UCP
+ othercase = _pcre_ucp_othercase((unsigned int)next);
+#else
+ othercase = NOTACHAR;
+#endif
+ return (unsigned int)item != othercase;
+ }
+ else
+#endif /* SUPPORT_UTF8 */
+ return (item != cd->fcc[next]); /* Non-UTF-8 mode */
+
+ /* For OP_NOT, "item" must be a single-byte character. */
+
+ case OP_NOT:
+ if (next < 0) return FALSE; /* Not a character */
+ if (item == next) return TRUE;
+ if ((options & PCRE_CASELESS) == 0) return FALSE;
+#ifdef SUPPORT_UTF8
+ if (utf8)
+ {
+ unsigned int othercase;
+ if (next < 128) othercase = cd->fcc[next]; else
+#ifdef SUPPORT_UCP
+ othercase = _pcre_ucp_othercase(next);
+#else
+ othercase = NOTACHAR;
+#endif
+ return (unsigned int)item == othercase;
+ }
+ else
+#endif /* SUPPORT_UTF8 */
+ return (item == cd->fcc[next]); /* Non-UTF-8 mode */
+
+ case OP_DIGIT:
+ return next > 127 || (cd->ctypes[next] & ctype_digit) == 0;
+
+ case OP_NOT_DIGIT:
+ return next <= 127 && (cd->ctypes[next] & ctype_digit) != 0;
+
+ case OP_WHITESPACE:
+ return next > 127 || (cd->ctypes[next] & ctype_space) == 0;
+
+ case OP_NOT_WHITESPACE:
+ return next <= 127 && (cd->ctypes[next] & ctype_space) != 0;
+
+ case OP_WORDCHAR:
+ return next > 127 || (cd->ctypes[next] & ctype_word) == 0;
+
+ case OP_NOT_WORDCHAR:
+ return next <= 127 && (cd->ctypes[next] & ctype_word) != 0;
+
+ default:
+ return FALSE;
+ }
+
+
+/* Handle the case when the next item is \d, \s, etc. */
+
+switch(op_code)
+ {
+ case OP_CHAR:
+ case OP_CHARNC:
+#ifdef SUPPORT_UTF8
+ if (utf8 && item > 127) { GETCHAR(item, utf8_char); }
+#endif
+ switch(-next)
+ {
+ case ESC_d:
+ return item > 127 || (cd->ctypes[item] & ctype_digit) == 0;
+
+ case ESC_D:
+ return item <= 127 && (cd->ctypes[item] & ctype_digit) != 0;
+
+ case ESC_s:
+ return item > 127 || (cd->ctypes[item] & ctype_space) == 0;
+
+ case ESC_S:
+ return item <= 127 && (cd->ctypes[item] & ctype_space) != 0;
+
+ case ESC_w:
+ return item > 127 || (cd->ctypes[item] & ctype_word) == 0;
+
+ case ESC_W:
+ return item <= 127 && (cd->ctypes[item] & ctype_word) != 0;
+
+ default:
+ return FALSE;
+ }
+
+ case OP_DIGIT:
+ return next == -ESC_D || next == -ESC_s || next == -ESC_W;
+
+ case OP_NOT_DIGIT:
+ return next == -ESC_d;
+
+ case OP_WHITESPACE:
+ return next == -ESC_S || next == -ESC_d || next == -ESC_w;
+
+ case OP_NOT_WHITESPACE:
+ return next == -ESC_s;
+
+ case OP_WORDCHAR:
+ return next == -ESC_W || next == -ESC_s;
+
+ case OP_NOT_WORDCHAR:
+ return next == -ESC_w || next == -ESC_d;
+
+ default:
+ return FALSE;
+ }
+
+/* Control does not reach here */
+}
+
+
+
+/*************************************************
+* Compile one branch *
+*************************************************/
+
+/* Scan the pattern, compiling it into the a vector. If the options are
+changed during the branch, the pointer is used to change the external options
+bits. This function is used during the pre-compile phase when we are trying
+to find out the amount of memory needed, as well as during the real compile
+phase. The value of lengthptr distinguishes the two phases.
+
+Arguments:
+ optionsptr pointer to the option bits
+ codeptr points to the pointer to the current code point
+ ptrptr points to the current pattern pointer
+ errorcodeptr points to error code variable
+ firstbyteptr set to initial literal character, or < 0 (REQ_UNSET, REQ_NONE)
+ reqbyteptr set to the last literal character required, else < 0
+ bcptr points to current branch chain
+ cd contains pointers to tables etc.
+ lengthptr NULL during the real compile phase
+ points to length accumulator during pre-compile phase
+
+Returns: TRUE on success
+ FALSE, with *errorcodeptr set non-zero on error
+*/
+
+static BOOL
+compile_branch(int *optionsptr, uschar **codeptr, const uschar **ptrptr,
+ int *errorcodeptr, int *firstbyteptr, int *reqbyteptr, branch_chain *bcptr,
+ compile_data *cd, int *lengthptr)
+{
+int repeat_type, op_type;
+int repeat_min = 0, repeat_max = 0; /* To please picky compilers */
+int bravalue = 0;
+int greedy_default, greedy_non_default;
+int firstbyte, reqbyte;
+int zeroreqbyte, zerofirstbyte;
+int req_caseopt, reqvary, tempreqvary;
+int options = *optionsptr;
+int after_manual_callout = 0;
+int length_prevgroup = 0;
+register int c;
+register uschar *code = *codeptr;
+uschar *last_code = code;
+uschar *orig_code = code;
+uschar *tempcode;
+BOOL inescq = FALSE;
+BOOL groupsetfirstbyte = FALSE;
+const uschar *ptr = *ptrptr;
+const uschar *tempptr;
+uschar *previous = NULL;
+uschar *previous_callout = NULL;
+uschar *save_hwm = NULL;
+uschar classbits[32];
+
+#ifdef SUPPORT_UTF8
+BOOL class_utf8;
+BOOL utf8 = (options & PCRE_UTF8) != 0;
+uschar *class_utf8data;
+uschar utf8_char[6];
+#else
+BOOL utf8 = FALSE;
+uschar *utf8_char = NULL;
+#endif
+
+#ifdef DEBUG
+if (lengthptr != NULL) DPRINTF((">> start branch\n"));
+#endif
+
+/* Set up the default and non-default settings for greediness */
+
+greedy_default = ((options & PCRE_UNGREEDY) != 0);
+greedy_non_default = greedy_default ^ 1;
+
+/* Initialize no first byte, no required byte. REQ_UNSET means "no char
+matching encountered yet". It gets changed to REQ_NONE if we hit something that
+matches a non-fixed char first char; reqbyte just remains unset if we never
+find one.
+
+When we hit a repeat whose minimum is zero, we may have to adjust these values
+to take the zero repeat into account. This is implemented by setting them to
+zerofirstbyte and zeroreqbyte when such a repeat is encountered. The individual
+item types that can be repeated set these backoff variables appropriately. */
+
+firstbyte = reqbyte = zerofirstbyte = zeroreqbyte = REQ_UNSET;
+
+/* The variable req_caseopt contains either the REQ_CASELESS value or zero,
+according to the current setting of the caseless flag. REQ_CASELESS is a bit
+value > 255. It is added into the firstbyte or reqbyte variables to record the
+case status of the value. This is used only for ASCII characters. */
+
+req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0;
+
+/* Switch on next character until the end of the branch */
+
+for (;; ptr++)
+ {
+ BOOL negate_class;
+ BOOL possessive_quantifier;
+ BOOL is_quantifier;
+ BOOL is_recurse;
+ int class_charcount;
+ int class_lastchar;
+ int newoptions;
+ int recno;
+ int skipbytes;
+ int subreqbyte;
+ int subfirstbyte;
+ int terminator;
+ int mclength;
+ uschar mcbuffer[8];
+
+ /* Get next byte in the pattern */
+
+ c = *ptr;
+
+ /* If we are in the pre-compile phase, accumulate the length used for the
+ previous cycle of this loop. */
+
+ if (lengthptr != NULL)
+ {
+#ifdef DEBUG
+ if (code > cd->hwm) cd->hwm = code; /* High water info */
+#endif
+ if (code > cd->start_workspace + COMPILE_WORK_SIZE) /* Check for overrun */
+ {
+ *errorcodeptr = ERR52;
+ goto FAILED;
+ }
+
+ /* There is at least one situation where code goes backwards: this is the
+ case of a zero quantifier after a class (e.g. [ab]{0}). At compile time,
+ the class is simply eliminated. However, it is created first, so we have to
+ allow memory for it. Therefore, don't ever reduce the length at this point.
+ */
+
+ if (code < last_code) code = last_code;
+ *lengthptr += code - last_code;
+ DPRINTF(("length=%d added %d c=%c\n", *lengthptr, code - last_code, c));
+
+ /* If "previous" is set and it is not at the start of the work space, move
+ it back to there, in order to avoid filling up the work space. Otherwise,
+ if "previous" is NULL, reset the current code pointer to the start. */
+
+ if (previous != NULL)
+ {
+ if (previous > orig_code)
+ {
+ memmove(orig_code, previous, code - previous);
+ code -= previous - orig_code;
+ previous = orig_code;
+ }
+ }
+ else code = orig_code;
+
+ /* Remember where this code item starts so we can pick up the length
+ next time round. */
+
+ last_code = code;
+ }
+
+ /* In the real compile phase, just check the workspace used by the forward
+ reference list. */
+
+ else if (cd->hwm > cd->start_workspace + COMPILE_WORK_SIZE)
+ {
+ *errorcodeptr = ERR52;
+ goto FAILED;
+ }
+
+ /* If in \Q...\E, check for the end; if not, we have a literal */
+
+ if (inescq && c != 0)
+ {
+ if (c == '\\' && ptr[1] == 'E')
+ {
+ inescq = FALSE;
+ ptr++;
+ continue;
+ }
+ else
+ {
+ if (previous_callout != NULL)
+ {
+ if (lengthptr == NULL) /* Don't attempt in pre-compile phase */
+ complete_callout(previous_callout, ptr, cd);
+ previous_callout = NULL;
+ }
+ if ((options & PCRE_AUTO_CALLOUT) != 0)
+ {
+ previous_callout = code;
+ code = auto_callout(code, ptr, cd);
+ }
+ goto NORMAL_CHAR;
+ }
+ }
+
+ /* Fill in length of a previous callout, except when the next thing is
+ a quantifier. */
+
+ is_quantifier = c == '*' || c == '+' || c == '?' ||
+ (c == '{' && is_counted_repeat(ptr+1));
+
+ if (!is_quantifier && previous_callout != NULL &&
+ after_manual_callout-- <= 0)
+ {
+ if (lengthptr == NULL) /* Don't attempt in pre-compile phase */
+ complete_callout(previous_callout, ptr, cd);
+ previous_callout = NULL;
+ }
+
+ /* In extended mode, skip white space and comments */
+
+ if ((options & PCRE_EXTENDED) != 0)
+ {
+ if ((cd->ctypes[c] & ctype_space) != 0) continue;
+ if (c == '#')
+ {
+ while (*(++ptr) != 0)
+ {
+ if (IS_NEWLINE(ptr)) { ptr += cd->nllen - 1; break; }
+ }
+ if (*ptr != 0) continue;
+
+ /* Else fall through to handle end of string */
+ c = 0;
+ }
+ }
+
+ /* No auto callout for quantifiers. */
+
+ if ((options & PCRE_AUTO_CALLOUT) != 0 && !is_quantifier)
+ {
+ previous_callout = code;
+ code = auto_callout(code, ptr, cd);
+ }
+
+ switch(c)
+ {
+ /* ===================================================================*/
+ case 0: /* The branch terminates at string end */
+ case '|': /* or | or ) */
+ case ')':
+ *firstbyteptr = firstbyte;
+ *reqbyteptr = reqbyte;
+ *codeptr = code;
+ *ptrptr = ptr;
+ if (lengthptr != NULL)
+ {
+ *lengthptr += code - last_code; /* To include callout length */
+ DPRINTF((">> end branch\n"));
+ }
+ return TRUE;
+
+
+ /* ===================================================================*/
+ /* Handle single-character metacharacters. In multiline mode, ^ disables
+ the setting of any following char as a first character. */
+
+ case '^':
+ if ((options & PCRE_MULTILINE) != 0)
+ {
+ if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
+ }
+ previous = NULL;
+ *code++ = OP_CIRC;
+ break;
+
+ case '$':
+ previous = NULL;
+ *code++ = OP_DOLL;
+ break;
+
+ /* There can never be a first char if '.' is first, whatever happens about
+ repeats. The value of reqbyte doesn't change either. */
+
+ case '.':
+ if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
+ zerofirstbyte = firstbyte;
+ zeroreqbyte = reqbyte;
+ previous = code;
+ *code++ = OP_ANY;
+ break;
+
+
+ /* ===================================================================*/
+ /* Character classes. If the included characters are all < 256, we build a
+ 32-byte bitmap of the permitted characters, except in the special case
+ where there is only one such character. For negated classes, we build the
+ map as usual, then invert it at the end. However, we use a different opcode
+ so that data characters > 255 can be handled correctly.
+
+ If the class contains characters outside the 0-255 range, a different
+ opcode is compiled. It may optionally have a bit map for characters < 256,
+ but those above are are explicitly listed afterwards. A flag byte tells
+ whether the bitmap is present, and whether this is a negated class or not.
+ */
+
+ case '[':
+ previous = code;
+
+ /* PCRE supports POSIX class stuff inside a class. Perl gives an error if
+ they are encountered at the top level, so we'll do that too. */
+
+ if ((ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') &&
+ check_posix_syntax(ptr, &tempptr, cd))
+ {
+ *errorcodeptr = (ptr[1] == ':')? ERR13 : ERR31;
+ goto FAILED;
+ }
+
+ /* If the first character is '^', set the negation flag and skip it. */
+
+ if ((c = *(++ptr)) == '^')
+ {
+ negate_class = TRUE;
+ c = *(++ptr);
+ }
+ else
+ {
+ negate_class = FALSE;
+ }
+
+ /* Keep a count of chars with values < 256 so that we can optimize the case
+ of just a single character (as long as it's < 256). However, For higher
+ valued UTF-8 characters, we don't yet do any optimization. */
+
+ class_charcount = 0;
+ class_lastchar = -1;
+
+ /* Initialize the 32-char bit map to all zeros. We build the map in a
+ temporary bit of memory, in case the class contains only 1 character (less
+ than 256), because in that case the compiled code doesn't use the bit map.
+ */
+
+ memset(classbits, 0, 32 * sizeof(uschar));
+
+#ifdef SUPPORT_UTF8
+ class_utf8 = FALSE; /* No chars >= 256 */
+ class_utf8data = code + LINK_SIZE + 2; /* For UTF-8 items */
+#endif
+
+ /* Process characters until ] is reached. By writing this as a "do" it
+ means that an initial ] is taken as a data character. At the start of the
+ loop, c contains the first byte of the character. */
+
+ if (c != 0) do
+ {
+ const uschar *oldptr;
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && c > 127)
+ { /* Braces are required because the */
+ GETCHARLEN(c, ptr, ptr); /* macro generates multiple statements */
+ }
+#endif
+
+ /* Inside \Q...\E everything is literal except \E */
+
+ if (inescq)
+ {
+ if (c == '\\' && ptr[1] == 'E') /* If we are at \E */
+ {
+ inescq = FALSE; /* Reset literal state */
+ ptr++; /* Skip the 'E' */
+ continue; /* Carry on with next */
+ }
+ goto CHECK_RANGE; /* Could be range if \E follows */
+ }
+
+ /* Handle POSIX class names. Perl allows a negation extension of the
+ form [:^name:]. A square bracket that doesn't match the syntax is
+ treated as a literal. We also recognize the POSIX constructions
+ [.ch.] and [=ch=] ("collating elements") and fault them, as Perl
+ 5.6 and 5.8 do. */
+
+ if (c == '[' &&
+ (ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') &&
+ check_posix_syntax(ptr, &tempptr, cd))
+ {
+ BOOL local_negate = FALSE;
+ int posix_class, taboffset, tabopt;
+ register const uschar *cbits = cd->cbits;
+ uschar pbits[32];
+
+ if (ptr[1] != ':')
+ {
+ *errorcodeptr = ERR31;
+ goto FAILED;
+ }
+
+ ptr += 2;
+ if (*ptr == '^')
+ {
+ local_negate = TRUE;
+ ptr++;
+ }
+
+ posix_class = check_posix_name(ptr, tempptr - ptr);
+ if (posix_class < 0)
+ {
+ *errorcodeptr = ERR30;
+ goto FAILED;
+ }
+
+ /* If matching is caseless, upper and lower are converted to
+ alpha. This relies on the fact that the class table starts with
+ alpha, lower, upper as the first 3 entries. */
+
+ if ((options & PCRE_CASELESS) != 0 && posix_class <= 2)
+ posix_class = 0;
+
+ /* We build the bit map for the POSIX class in a chunk of local store
+ because we may be adding and subtracting from it, and we don't want to
+ subtract bits that may be in the main map already. At the end we or the
+ result into the bit map that is being built. */
+
+ posix_class *= 3;
+
+ /* Copy in the first table (always present) */
+
+ memcpy(pbits, cbits + posix_class_maps[posix_class],
+ 32 * sizeof(uschar));
+
+ /* If there is a second table, add or remove it as required. */
+
+ taboffset = posix_class_maps[posix_class + 1];
+ tabopt = posix_class_maps[posix_class + 2];
+
+ if (taboffset >= 0)
+ {
+ if (tabopt >= 0)
+ for (c = 0; c < 32; c++) pbits[c] |= cbits[c + taboffset];
+ else
+ for (c = 0; c < 32; c++) pbits[c] &= ~cbits[c + taboffset];
+ }
+
+ /* Not see if we need to remove any special characters. An option
+ value of 1 removes vertical space and 2 removes underscore. */
+
+ if (tabopt < 0) tabopt = -tabopt;
+ if (tabopt == 1) pbits[1] &= ~0x3c;
+ else if (tabopt == 2) pbits[11] &= 0x7f;
+
+ /* Add the POSIX table or its complement into the main table that is
+ being built and we are done. */
+
+ if (local_negate)
+ for (c = 0; c < 32; c++) classbits[c] |= ~pbits[c];
+ else
+ for (c = 0; c < 32; c++) classbits[c] |= pbits[c];
+
+ ptr = tempptr + 1;
+ class_charcount = 10; /* Set > 1; assumes more than 1 per class */
+ continue; /* End of POSIX syntax handling */
+ }
+
+ /* Backslash may introduce a single character, or it may introduce one
+ of the specials, which just set a flag. The sequence \b is a special
+ case. Inside a class (and only there) it is treated as backspace.
+ Elsewhere it marks a word boundary. Other escapes have preset maps ready
+ to or into the one we are building. We assume they have more than one
+ character in them, so set class_charcount bigger than one. */
+
+ if (c == '\\')
+ {
+ c = check_escape(&ptr, errorcodeptr, cd->bracount, options, TRUE);
+ if (*errorcodeptr != 0) goto FAILED;
+
+ if (-c == ESC_b) c = '\b'; /* \b is backslash in a class */
+ else if (-c == ESC_X) c = 'X'; /* \X is literal X in a class */
+ else if (-c == ESC_R) c = 'R'; /* \R is literal R in a class */
+ else if (-c == ESC_Q) /* Handle start of quoted string */
+ {
+ if (ptr[1] == '\\' && ptr[2] == 'E')
+ {
+ ptr += 2; /* avoid empty string */
+ }
+ else inescq = TRUE;
+ continue;
+ }
+
+ if (c < 0)
+ {
+ register const uschar *cbits = cd->cbits;
+ class_charcount += 2; /* Greater than 1 is what matters */
+
+ /* Save time by not doing this in the pre-compile phase. */
+
+ if (lengthptr == NULL) switch (-c)
+ {
+ case ESC_d:
+ for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_digit];
+ continue;
+
+ case ESC_D:
+ for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_digit];
+ continue;
+
+ case ESC_w:
+ for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_word];
+ continue;
+
+ case ESC_W:
+ for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_word];
+ continue;
+
+ case ESC_s:
+ for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_space];
+ classbits[1] &= ~0x08; /* Perl 5.004 onwards omits VT from \s */
+ continue;
+
+ case ESC_S:
+ for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_space];
+ classbits[1] |= 0x08; /* Perl 5.004 onwards omits VT from \s */
+ continue;
+
+ case ESC_E: /* Perl ignores an orphan \E */
+ continue;
+
+ default: /* Not recognized; fall through */
+ break; /* Need "default" setting to stop compiler warning. */
+ }
+
+ /* In the pre-compile phase, just do the recognition. */
+
+ else if (c == -ESC_d || c == -ESC_D || c == -ESC_w ||
+ c == -ESC_W || c == -ESC_s || c == -ESC_S) continue;
+
+ /* We need to deal with \P and \p in both phases. */
+
+#ifdef SUPPORT_UCP
+ if (-c == ESC_p || -c == ESC_P)
+ {
+ BOOL negated;
+ int pdata;
+ int ptype = get_ucp(&ptr, &negated, &pdata, errorcodeptr);
+ if (ptype < 0) goto FAILED;
+ class_utf8 = TRUE;
+ *class_utf8data++ = ((-c == ESC_p) != negated)?
+ XCL_PROP : XCL_NOTPROP;
+ *class_utf8data++ = ptype;
+ *class_utf8data++ = pdata;
+ class_charcount -= 2; /* Not a < 256 character */
+ continue;
+ }
+#endif
+ /* Unrecognized escapes are faulted if PCRE is running in its
+ strict mode. By default, for compatibility with Perl, they are
+ treated as literals. */
+
+ if ((options & PCRE_EXTRA) != 0)
+ {
+ *errorcodeptr = ERR7;
+ goto FAILED;
+ }
+
+ class_charcount -= 2; /* Undo the default count from above */
+ c = *ptr; /* Get the final character and fall through */
+ }
+
+ /* Fall through if we have a single character (c >= 0). This may be
+ greater than 256 in UTF-8 mode. */
+
+ } /* End of backslash handling */
+
+ /* A single character may be followed by '-' to form a range. However,
+ Perl does not permit ']' to be the end of the range. A '-' character
+ at the end is treated as a literal. Perl ignores orphaned \E sequences
+ entirely. The code for handling \Q and \E is messy. */
+
+ CHECK_RANGE:
+ while (ptr[1] == '\\' && ptr[2] == 'E')
+ {
+ inescq = FALSE;
+ ptr += 2;
+ }
+
+ oldptr = ptr;
+
+ if (!inescq && ptr[1] == '-')
+ {
+ int d;
+ ptr += 2;
+ while (*ptr == '\\' && ptr[1] == 'E') ptr += 2;
+
+ /* If we hit \Q (not followed by \E) at this point, go into escaped
+ mode. */
+
+ while (*ptr == '\\' && ptr[1] == 'Q')
+ {
+ ptr += 2;
+ if (*ptr == '\\' && ptr[1] == 'E') { ptr += 2; continue; }
+ inescq = TRUE;
+ break;
+ }
+
+ if (*ptr == 0 || (!inescq && *ptr == ']'))
+ {
+ ptr = oldptr;
+ goto LONE_SINGLE_CHARACTER;
+ }
+
+#ifdef SUPPORT_UTF8
+ if (utf8)
+ { /* Braces are required because the */
+ GETCHARLEN(d, ptr, ptr); /* macro generates multiple statements */
+ }
+ else
+#endif
+ d = *ptr; /* Not UTF-8 mode */
+
+ /* The second part of a range can be a single-character escape, but
+ not any of the other escapes. Perl 5.6 treats a hyphen as a literal
+ in such circumstances. */
+
+ if (!inescq && d == '\\')
+ {
+ d = check_escape(&ptr, errorcodeptr, cd->bracount, options, TRUE);
+ if (*errorcodeptr != 0) goto FAILED;
+
+ /* \b is backslash; \X is literal X; \R is literal R; any other
+ special means the '-' was literal */
+
+ if (d < 0)
+ {
+ if (d == -ESC_b) d = '\b';
+ else if (d == -ESC_X) d = 'X';
+ else if (d == -ESC_R) d = 'R'; else
+ {
+ ptr = oldptr;
+ goto LONE_SINGLE_CHARACTER; /* A few lines below */
+ }
+ }
+ }
+
+ /* Check that the two values are in the correct order. Optimize
+ one-character ranges */
+
+ if (d < c)
+ {
+ *errorcodeptr = ERR8;
+ goto FAILED;
+ }
+
+ if (d == c) goto LONE_SINGLE_CHARACTER; /* A few lines below */
+
+ /* In UTF-8 mode, if the upper limit is > 255, or > 127 for caseless
+ matching, we have to use an XCLASS with extra data items. Caseless
+ matching for characters > 127 is available only if UCP support is
+ available. */
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && (d > 255 || ((options & PCRE_CASELESS) != 0 && d > 127)))
+ {
+ class_utf8 = TRUE;
+
+ /* With UCP support, we can find the other case equivalents of
+ the relevant characters. There may be several ranges. Optimize how
+ they fit with the basic range. */
+
+#ifdef SUPPORT_UCP
+ if ((options & PCRE_CASELESS) != 0)
+ {
+ unsigned int occ, ocd;
+ unsigned int cc = c;
+ unsigned int origd = d;
+ while (get_othercase_range(&cc, origd, &occ, &ocd))
+ {
+ if (occ >= c && ocd <= d) continue; /* Skip embedded ranges */
+
+ if (occ < c && ocd >= c - 1) /* Extend the basic range */
+ { /* if there is overlap, */
+ c = occ; /* noting that if occ < c */
+ continue; /* we can't have ocd > d */
+ } /* because a subrange is */
+ if (ocd > d && occ <= d + 1) /* always shorter than */
+ { /* the basic range. */
+ d = ocd;
+ continue;
+ }
+
+ if (occ == ocd)
+ {
+ *class_utf8data++ = XCL_SINGLE;
+ }
+ else
+ {
+ *class_utf8data++ = XCL_RANGE;
+ class_utf8data += _pcre_ord2utf8(occ, class_utf8data);
+ }
+ class_utf8data += _pcre_ord2utf8(ocd, class_utf8data);
+ }
+ }
+#endif /* SUPPORT_UCP */
+
+ /* Now record the original range, possibly modified for UCP caseless
+ overlapping ranges. */
+
+ *class_utf8data++ = XCL_RANGE;
+ class_utf8data += _pcre_ord2utf8(c, class_utf8data);
+ class_utf8data += _pcre_ord2utf8(d, class_utf8data);
+
+ /* With UCP support, we are done. Without UCP support, there is no
+ caseless matching for UTF-8 characters > 127; we can use the bit map
+ for the smaller ones. */
+
+#ifdef SUPPORT_UCP
+ continue; /* With next character in the class */
+#else
+ if ((options & PCRE_CASELESS) == 0 || c > 127) continue;
+
+ /* Adjust upper limit and fall through to set up the map */
+
+ d = 127;
+
+#endif /* SUPPORT_UCP */
+ }
+#endif /* SUPPORT_UTF8 */
+
+ /* We use the bit map for all cases when not in UTF-8 mode; else
+ ranges that lie entirely within 0-127 when there is UCP support; else
+ for partial ranges without UCP support. */
+
+ class_charcount += d - c + 1;
+ class_lastchar = d;
+
+ /* We can save a bit of time by skipping this in the pre-compile. */
+
+ if (lengthptr == NULL) for (; c <= d; c++)
+ {
+ classbits[c/8] |= (1 << (c&7));
+ if ((options & PCRE_CASELESS) != 0)
+ {
+ int uc = cd->fcc[c]; /* flip case */
+ classbits[uc/8] |= (1 << (uc&7));
+ }
+ }
+
+ continue; /* Go get the next char in the class */
+ }
+
+ /* Handle a lone single character - we can get here for a normal
+ non-escape char, or after \ that introduces a single character or for an
+ apparent range that isn't. */
+
+ LONE_SINGLE_CHARACTER:
+
+ /* Handle a character that cannot go in the bit map */
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && (c > 255 || ((options & PCRE_CASELESS) != 0 && c > 127)))
+ {
+ class_utf8 = TRUE;
+ *class_utf8data++ = XCL_SINGLE;
+ class_utf8data += _pcre_ord2utf8(c, class_utf8data);
+
+#ifdef SUPPORT_UCP
+ if ((options & PCRE_CASELESS) != 0)
+ {
+ unsigned int othercase;
+ if ((othercase = _pcre_ucp_othercase(c)) != NOTACHAR)
+ {
+ *class_utf8data++ = XCL_SINGLE;
+ class_utf8data += _pcre_ord2utf8(othercase, class_utf8data);
+ }
+ }
+#endif /* SUPPORT_UCP */
+
+ }
+ else
+#endif /* SUPPORT_UTF8 */
+
+ /* Handle a single-byte character */
+ {
+ classbits[c/8] |= (1 << (c&7));
+ if ((options & PCRE_CASELESS) != 0)
+ {
+ c = cd->fcc[c]; /* flip case */
+ classbits[c/8] |= (1 << (c&7));
+ }
+ class_charcount++;
+ class_lastchar = c;
+ }
+ }
+
+ /* Loop until ']' reached. This "while" is the end of the "do" above. */
+
+ while ((c = *(++ptr)) != 0 && (c != ']' || inescq));
+
+ if (c == 0) /* Missing terminating ']' */
+ {
+ *errorcodeptr = ERR6;
+ goto FAILED;
+ }
+
+ /* If class_charcount is 1, we saw precisely one character whose value is
+ less than 256. In non-UTF-8 mode we can always optimize. In UTF-8 mode, we
+ can optimize the negative case only if there were no characters >= 128
+ because OP_NOT and the related opcodes like OP_NOTSTAR operate on
+ single-bytes only. This is an historical hangover. Maybe one day we can
+ tidy these opcodes to handle multi-byte characters.
+
+ The optimization throws away the bit map. We turn the item into a
+ 1-character OP_CHAR[NC] if it's positive, or OP_NOT if it's negative. Note
+ that OP_NOT does not support multibyte characters. In the positive case, it
+ can cause firstbyte to be set. Otherwise, there can be no first char if
+ this item is first, whatever repeat count may follow. In the case of
+ reqbyte, save the previous value for reinstating. */
+
+#ifdef SUPPORT_UTF8
+ if (class_charcount == 1 &&
+ (!utf8 ||
+ (!class_utf8 && (!negate_class || class_lastchar < 128))))
+
+#else
+ if (class_charcount == 1)
+#endif
+ {
+ zeroreqbyte = reqbyte;
+
+ /* The OP_NOT opcode works on one-byte characters only. */
+
+ if (negate_class)
+ {
+ if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
+ zerofirstbyte = firstbyte;
+ *code++ = OP_NOT;
+ *code++ = class_lastchar;
+ break;
+ }
+
+ /* For a single, positive character, get the value into mcbuffer, and
+ then we can handle this with the normal one-character code. */
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && class_lastchar > 127)
+ mclength = _pcre_ord2utf8(class_lastchar, mcbuffer);
+ else
+#endif
+ {
+ mcbuffer[0] = class_lastchar;
+ mclength = 1;
+ }
+ goto ONE_CHAR;
+ } /* End of 1-char optimization */
+
+ /* The general case - not the one-char optimization. If this is the first
+ thing in the branch, there can be no first char setting, whatever the
+ repeat count. Any reqbyte setting must remain unchanged after any kind of
+ repeat. */
+
+ if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
+ zerofirstbyte = firstbyte;
+ zeroreqbyte = reqbyte;
+
+ /* If there are characters with values > 255, we have to compile an
+ extended class, with its own opcode. If there are no characters < 256,
+ we can omit the bitmap in the actual compiled code. */
+
+#ifdef SUPPORT_UTF8
+ if (class_utf8)
+ {
+ *class_utf8data++ = XCL_END; /* Marks the end of extra data */
+ *code++ = OP_XCLASS;
+ code += LINK_SIZE;
+ *code = negate_class? XCL_NOT : 0;
+
+ /* If the map is required, move up the extra data to make room for it;
+ otherwise just move the code pointer to the end of the extra data. */
+
+ if (class_charcount > 0)
+ {
+ *code++ |= XCL_MAP;
+ memmove(code + 32, code, class_utf8data - code);
+ memcpy(code, classbits, 32);
+ code = class_utf8data + 32;
+ }
+ else code = class_utf8data;
+
+ /* Now fill in the complete length of the item */
+
+ PUT(previous, 1, code - previous);
+ break; /* End of class handling */
+ }
+#endif
+
+ /* If there are no characters > 255, negate the 32-byte map if necessary,
+ and copy it into the code vector. If this is the first thing in the branch,
+ there can be no first char setting, whatever the repeat count. Any reqbyte
+ setting must remain unchanged after any kind of repeat. */
+
+ if (negate_class)
+ {
+ *code++ = OP_NCLASS;
+ if (lengthptr == NULL) /* Save time in the pre-compile phase */
+ for (c = 0; c < 32; c++) code[c] = ~classbits[c];
+ }
+ else
+ {
+ *code++ = OP_CLASS;
+ memcpy(code, classbits, 32);
+ }
+ code += 32;
+ break;
+
+
+ /* ===================================================================*/
+ /* Various kinds of repeat; '{' is not necessarily a quantifier, but this
+ has been tested above. */
+
+ case '{':
+ if (!is_quantifier) goto NORMAL_CHAR;
+ ptr = read_repeat_counts(ptr+1, &repeat_min, &repeat_max, errorcodeptr);
+ if (*errorcodeptr != 0) goto FAILED;
+ goto REPEAT;
+
+ case '*':
+ repeat_min = 0;
+ repeat_max = -1;
+ goto REPEAT;
+
+ case '+':
+ repeat_min = 1;
+ repeat_max = -1;
+ goto REPEAT;
+
+ case '?':
+ repeat_min = 0;
+ repeat_max = 1;
+
+ REPEAT:
+ if (previous == NULL)
+ {
+ *errorcodeptr = ERR9;
+ goto FAILED;
+ }
+
+ if (repeat_min == 0)
+ {
+ firstbyte = zerofirstbyte; /* Adjust for zero repeat */
+ reqbyte = zeroreqbyte; /* Ditto */
+ }
+
+ /* Remember whether this is a variable length repeat */
+
+ reqvary = (repeat_min == repeat_max)? 0 : REQ_VARY;
+
+ op_type = 0; /* Default single-char op codes */
+ possessive_quantifier = FALSE; /* Default not possessive quantifier */
+
+ /* Save start of previous item, in case we have to move it up to make space
+ for an inserted OP_ONCE for the additional '+' extension. */
+
+ tempcode = previous;
+
+ /* If the next character is '+', we have a possessive quantifier. This
+ implies greediness, whatever the setting of the PCRE_UNGREEDY option.
+ If the next character is '?' this is a minimizing repeat, by default,
+ but if PCRE_UNGREEDY is set, it works the other way round. We change the
+ repeat type to the non-default. */
+
+ if (ptr[1] == '+')
+ {
+ repeat_type = 0; /* Force greedy */
+ possessive_quantifier = TRUE;
+ ptr++;
+ }
+ else if (ptr[1] == '?')
+ {
+ repeat_type = greedy_non_default;
+ ptr++;
+ }
+ else repeat_type = greedy_default;
+
+ /* If previous was a character match, abolish the item and generate a
+ repeat item instead. If a char item has a minumum of more than one, ensure
+ that it is set in reqbyte - it might not be if a sequence such as x{3} is
+ the first thing in a branch because the x will have gone into firstbyte
+ instead. */
+
+ if (*previous == OP_CHAR || *previous == OP_CHARNC)
+ {
+ /* Deal with UTF-8 characters that take up more than one byte. It's
+ easier to write this out separately than try to macrify it. Use c to
+ hold the length of the character in bytes, plus 0x80 to flag that it's a
+ length rather than a small character. */
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && (code[-1] & 0x80) != 0)
+ {
+ uschar *lastchar = code - 1;
+ while((*lastchar & 0xc0) == 0x80) lastchar--;
+ c = code - lastchar; /* Length of UTF-8 character */
+ memcpy(utf8_char, lastchar, c); /* Save the char */
+ c |= 0x80; /* Flag c as a length */
+ }
+ else
+#endif
+
+ /* Handle the case of a single byte - either with no UTF8 support, or
+ with UTF-8 disabled, or for a UTF-8 character < 128. */
+
+ {
+ c = code[-1];
+ if (repeat_min > 1) reqbyte = c | req_caseopt | cd->req_varyopt;
+ }
+
+ /* If the repetition is unlimited, it pays to see if the next thing on
+ the line is something that cannot possibly match this character. If so,
+ automatically possessifying this item gains some performance in the case
+ where the match fails. */
+
+ if (!possessive_quantifier &&
+ repeat_max < 0 &&
+ check_auto_possessive(*previous, c, utf8, utf8_char, ptr + 1,
+ options, cd))
+ {
+ repeat_type = 0; /* Force greedy */
+ possessive_quantifier = TRUE;
+ }
+
+ goto OUTPUT_SINGLE_REPEAT; /* Code shared with single character types */
+ }
+
+ /* If previous was a single negated character ([^a] or similar), we use
+ one of the special opcodes, replacing it. The code is shared with single-
+ character repeats by setting opt_type to add a suitable offset into
+ repeat_type. We can also test for auto-possessification. OP_NOT is
+ currently used only for single-byte chars. */
+
+ else if (*previous == OP_NOT)
+ {
+ op_type = OP_NOTSTAR - OP_STAR; /* Use "not" opcodes */
+ c = previous[1];
+ if (!possessive_quantifier &&
+ repeat_max < 0 &&
+ check_auto_possessive(OP_NOT, c, utf8, NULL, ptr + 1, options, cd))
+ {
+ repeat_type = 0; /* Force greedy */
+ possessive_quantifier = TRUE;
+ }
+ goto OUTPUT_SINGLE_REPEAT;
+ }
+
+ /* If previous was a character type match (\d or similar), abolish it and
+ create a suitable repeat item. The code is shared with single-character
+ repeats by setting op_type to add a suitable offset into repeat_type. Note
+ the the Unicode property types will be present only when SUPPORT_UCP is
+ defined, but we don't wrap the little bits of code here because it just
+ makes it horribly messy. */
+
+ else if (*previous < OP_EODN)
+ {
+ uschar *oldcode;
+ int prop_type, prop_value;
+ op_type = OP_TYPESTAR - OP_STAR; /* Use type opcodes */
+ c = *previous;
+
+ if (!possessive_quantifier &&
+ repeat_max < 0 &&
+ check_auto_possessive(c, 0, utf8, NULL, ptr + 1, options, cd))
+ {
+ repeat_type = 0; /* Force greedy */
+ possessive_quantifier = TRUE;
+ }
+
+ OUTPUT_SINGLE_REPEAT:
+ if (*previous == OP_PROP || *previous == OP_NOTPROP)
+ {
+ prop_type = previous[1];
+ prop_value = previous[2];
+ }
+ else prop_type = prop_value = -1;
+
+ oldcode = code;
+ code = previous; /* Usually overwrite previous item */
+
+ /* If the maximum is zero then the minimum must also be zero; Perl allows
+ this case, so we do too - by simply omitting the item altogether. */
+
+ if (repeat_max == 0) goto END_REPEAT;
+
+ /* All real repeats make it impossible to handle partial matching (maybe
+ one day we will be able to remove this restriction). */
+
+ if (repeat_max != 1) cd->nopartial = TRUE;
+
+ /* Combine the op_type with the repeat_type */
+
+ repeat_type += op_type;
+
+ /* A minimum of zero is handled either as the special case * or ?, or as
+ an UPTO, with the maximum given. */
+
+ if (repeat_min == 0)
+ {
+ if (repeat_max == -1) *code++ = OP_STAR + repeat_type;
+ else if (repeat_max == 1) *code++ = OP_QUERY + repeat_type;
+ else
+ {
+ *code++ = OP_UPTO + repeat_type;
+ PUT2INC(code, 0, repeat_max);
+ }
+ }
+
+ /* A repeat minimum of 1 is optimized into some special cases. If the
+ maximum is unlimited, we use OP_PLUS. Otherwise, the original item is
+ left in place and, if the maximum is greater than 1, we use OP_UPTO with
+ one less than the maximum. */
+
+ else if (repeat_min == 1)
+ {
+ if (repeat_max == -1)
+ *code++ = OP_PLUS + repeat_type;
+ else
+ {
+ code = oldcode; /* leave previous item in place */
+ if (repeat_max == 1) goto END_REPEAT;
+ *code++ = OP_UPTO + repeat_type;
+ PUT2INC(code, 0, repeat_max - 1);
+ }
+ }
+
+ /* The case {n,n} is just an EXACT, while the general case {n,m} is
+ handled as an EXACT followed by an UPTO. */
+
+ else
+ {
+ *code++ = OP_EXACT + op_type; /* NB EXACT doesn't have repeat_type */
+ PUT2INC(code, 0, repeat_min);
+
+ /* If the maximum is unlimited, insert an OP_STAR. Before doing so,
+ we have to insert the character for the previous code. For a repeated
+ Unicode property match, there are two extra bytes that define the
+ required property. In UTF-8 mode, long characters have their length in
+ c, with the 0x80 bit as a flag. */
+
+ if (repeat_max < 0)
+ {
+#ifdef SUPPORT_UTF8
+ if (utf8 && c >= 128)
+ {
+ memcpy(code, utf8_char, c & 7);
+ code += c & 7;
+ }
+ else
+#endif
+ {
+ *code++ = c;
+ if (prop_type >= 0)
+ {
+ *code++ = prop_type;
+ *code++ = prop_value;
+ }
+ }
+ *code++ = OP_STAR + repeat_type;
+ }
+
+ /* Else insert an UPTO if the max is greater than the min, again
+ preceded by the character, for the previously inserted code. If the
+ UPTO is just for 1 instance, we can use QUERY instead. */
+
+ else if (repeat_max != repeat_min)
+ {
+#ifdef SUPPORT_UTF8
+ if (utf8 && c >= 128)
+ {
+ memcpy(code, utf8_char, c & 7);
+ code += c & 7;
+ }
+ else
+#endif
+ *code++ = c;
+ if (prop_type >= 0)
+ {
+ *code++ = prop_type;
+ *code++ = prop_value;
+ }
+ repeat_max -= repeat_min;
+
+ if (repeat_max == 1)
+ {
+ *code++ = OP_QUERY + repeat_type;
+ }
+ else
+ {
+ *code++ = OP_UPTO + repeat_type;
+ PUT2INC(code, 0, repeat_max);
+ }
+ }
+ }
+
+ /* The character or character type itself comes last in all cases. */
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && c >= 128)
+ {
+ memcpy(code, utf8_char, c & 7);
+ code += c & 7;
+ }
+ else
+#endif
+ *code++ = c;
+
+ /* For a repeated Unicode property match, there are two extra bytes that
+ define the required property. */
+
+#ifdef SUPPORT_UCP
+ if (prop_type >= 0)
+ {
+ *code++ = prop_type;
+ *code++ = prop_value;
+ }
+#endif
+ }
+
+ /* If previous was a character class or a back reference, we put the repeat
+ stuff after it, but just skip the item if the repeat was {0,0}. */
+
+ else if (*previous == OP_CLASS ||
+ *previous == OP_NCLASS ||
+#ifdef SUPPORT_UTF8
+ *previous == OP_XCLASS ||
+#endif
+ *previous == OP_REF)
+ {
+ if (repeat_max == 0)
+ {
+ code = previous;
+ goto END_REPEAT;
+ }
+
+ /* All real repeats make it impossible to handle partial matching (maybe
+ one day we will be able to remove this restriction). */
+
+ if (repeat_max != 1) cd->nopartial = TRUE;
+
+ if (repeat_min == 0 && repeat_max == -1)
+ *code++ = OP_CRSTAR + repeat_type;
+ else if (repeat_min == 1 && repeat_max == -1)
+ *code++ = OP_CRPLUS + repeat_type;
+ else if (repeat_min == 0 && repeat_max == 1)
+ *code++ = OP_CRQUERY + repeat_type;
+ else
+ {
+ *code++ = OP_CRRANGE + repeat_type;
+ PUT2INC(code, 0, repeat_min);
+ if (repeat_max == -1) repeat_max = 0; /* 2-byte encoding for max */
+ PUT2INC(code, 0, repeat_max);
+ }
+ }
+
+ /* If previous was a bracket group, we may have to replicate it in certain
+ cases. */
+
+ else if (*previous == OP_BRA || *previous == OP_CBRA ||
+ *previous == OP_ONCE || *previous == OP_COND)
+ {
+ register int i;
+ int ketoffset = 0;
+ int len = code - previous;
+ uschar *bralink = NULL;
+
+ /* Repeating a DEFINE group is pointless */
+
+ if (*previous == OP_COND && previous[LINK_SIZE+1] == OP_DEF)
+ {
+ *errorcodeptr = ERR55;
+ goto FAILED;
+ }
+
+ /* This is a paranoid check to stop integer overflow later on */
+
+ if (len > MAX_DUPLENGTH)
+ {
+ *errorcodeptr = ERR50;
+ goto FAILED;
+ }
+
+ /* If the maximum repeat count is unlimited, find the end of the bracket
+ by scanning through from the start, and compute the offset back to it
+ from the current code pointer. There may be an OP_OPT setting following
+ the final KET, so we can't find the end just by going back from the code
+ pointer. */
+
+ if (repeat_max == -1)
+ {
+ register uschar *ket = previous;
+ do ket += GET(ket, 1); while (*ket != OP_KET);
+ ketoffset = code - ket;
+ }
+
+ /* The case of a zero minimum is special because of the need to stick
+ OP_BRAZERO in front of it, and because the group appears once in the
+ data, whereas in other cases it appears the minimum number of times. For
+ this reason, it is simplest to treat this case separately, as otherwise
+ the code gets far too messy. There are several special subcases when the
+ minimum is zero. */
+
+ if (repeat_min == 0)
+ {
+ /* If the maximum is also zero, we just omit the group from the output
+ altogether. */
+
+ if (repeat_max == 0)
+ {
+ code = previous;
+ goto END_REPEAT;
+ }
+
+ /* If the maximum is 1 or unlimited, we just have to stick in the
+ BRAZERO and do no more at this point. However, we do need to adjust
+ any OP_RECURSE calls inside the group that refer to the group itself or
+ any internal or forward referenced group, because the offset is from
+ the start of the whole regex. Temporarily terminate the pattern while
+ doing this. */
+
+ if (repeat_max <= 1)
+ {
+ *code = OP_END;
+ adjust_recurse(previous, 1, utf8, cd, save_hwm);
+ memmove(previous+1, previous, len);
+ code++;
+ *previous++ = OP_BRAZERO + repeat_type;
+ }
+
+ /* If the maximum is greater than 1 and limited, we have to replicate
+ in a nested fashion, sticking OP_BRAZERO before each set of brackets.
+ The first one has to be handled carefully because it's the original
+ copy, which has to be moved up. The remainder can be handled by code
+ that is common with the non-zero minimum case below. We have to
+ adjust the value or repeat_max, since one less copy is required. Once
+ again, we may have to adjust any OP_RECURSE calls inside the group. */
+
+ else
+ {
+ int offset;
+ *code = OP_END;
+ adjust_recurse(previous, 2 + LINK_SIZE, utf8, cd, save_hwm);
+ memmove(previous + 2 + LINK_SIZE, previous, len);
+ code += 2 + LINK_SIZE;
+ *previous++ = OP_BRAZERO + repeat_type;
+ *previous++ = OP_BRA;
+
+ /* We chain together the bracket offset fields that have to be
+ filled in later when the ends of the brackets are reached. */
+
+ offset = (bralink == NULL)? 0 : previous - bralink;
+ bralink = previous;
+ PUTINC(previous, 0, offset);
+ }
+
+ repeat_max--;
+ }
+
+ /* If the minimum is greater than zero, replicate the group as many
+ times as necessary, and adjust the maximum to the number of subsequent
+ copies that we need. If we set a first char from the group, and didn't
+ set a required char, copy the latter from the former. If there are any
+ forward reference subroutine calls in the group, there will be entries on
+ the workspace list; replicate these with an appropriate increment. */
+
+ else
+ {
+ if (repeat_min > 1)
+ {
+ /* In the pre-compile phase, we don't actually do the replication. We
+ just adjust the length as if we had. */
+
+ if (lengthptr != NULL)
+ *lengthptr += (repeat_min - 1)*length_prevgroup;
+
+ /* This is compiling for real */
+
+ else
+ {
+ if (groupsetfirstbyte && reqbyte < 0) reqbyte = firstbyte;
+ for (i = 1; i < repeat_min; i++)
+ {
+ uschar *hc;
+ uschar *this_hwm = cd->hwm;
+ memcpy(code, previous, len);
+ for (hc = save_hwm; hc < this_hwm; hc += LINK_SIZE)
+ {
+ PUT(cd->hwm, 0, GET(hc, 0) + len);
+ cd->hwm += LINK_SIZE;
+ }
+ save_hwm = this_hwm;
+ code += len;
+ }
+ }
+ }
+
+ if (repeat_max > 0) repeat_max -= repeat_min;
+ }
+
+ /* This code is common to both the zero and non-zero minimum cases. If
+ the maximum is limited, it replicates the group in a nested fashion,
+ remembering the bracket starts on a stack. In the case of a zero minimum,
+ the first one was set up above. In all cases the repeat_max now specifies
+ the number of additional copies needed. Again, we must remember to
+ replicate entries on the forward reference list. */
+
+ if (repeat_max >= 0)
+ {
+ /* In the pre-compile phase, we don't actually do the replication. We
+ just adjust the length as if we had. For each repetition we must add 1
+ to the length for BRAZERO and for all but the last repetition we must
+ add 2 + 2*LINKSIZE to allow for the nesting that occurs. */
+
+ if (lengthptr != NULL && repeat_max > 0)
+ *lengthptr += repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) -
+ 2 - 2*LINK_SIZE; /* Last one doesn't nest */
+
+ /* This is compiling for real */
+
+ else for (i = repeat_max - 1; i >= 0; i--)
+ {
+ uschar *hc;
+ uschar *this_hwm = cd->hwm;
+
+ *code++ = OP_BRAZERO + repeat_type;
+
+ /* All but the final copy start a new nesting, maintaining the
+ chain of brackets outstanding. */
+
+ if (i != 0)
+ {
+ int offset;
+ *code++ = OP_BRA;
+ offset = (bralink == NULL)? 0 : code - bralink;
+ bralink = code;
+ PUTINC(code, 0, offset);
+ }
+
+ memcpy(code, previous, len);
+ for (hc = save_hwm; hc < this_hwm; hc += LINK_SIZE)
+ {
+ PUT(cd->hwm, 0, GET(hc, 0) + len + ((i != 0)? 2+LINK_SIZE : 1));
+ cd->hwm += LINK_SIZE;
+ }
+ save_hwm = this_hwm;
+ code += len;
+ }
+
+ /* Now chain through the pending brackets, and fill in their length
+ fields (which are holding the chain links pro tem). */
+
+ while (bralink != NULL)
+ {
+ int oldlinkoffset;
+ int offset = code - bralink + 1;
+ uschar *bra = code - offset;
+ oldlinkoffset = GET(bra, 1);
+ bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset;
+ *code++ = OP_KET;
+ PUTINC(code, 0, offset);
+ PUT(bra, 1, offset);
+ }
+ }
+
+ /* If the maximum is unlimited, set a repeater in the final copy. We
+ can't just offset backwards from the current code point, because we
+ don't know if there's been an options resetting after the ket. The
+ correct offset was computed above.
+
+ Then, when we are doing the actual compile phase, check to see whether
+ this group is a non-atomic one that could match an empty string. If so,
+ convert the initial operator to the S form (e.g. OP_BRA -> OP_SBRA) so
+ that runtime checking can be done. [This check is also applied to
+ atomic groups at runtime, but in a different way.] */
+
+ else
+ {
+ uschar *ketcode = code - ketoffset;
+ uschar *bracode = ketcode - GET(ketcode, 1);
+ *ketcode = OP_KETRMAX + repeat_type;
+ if (lengthptr == NULL && *bracode != OP_ONCE)
+ {
+ uschar *scode = bracode;
+ do
+ {
+ if (could_be_empty_branch(scode, ketcode, utf8))
+ {
+ *bracode += OP_SBRA - OP_BRA;
+ break;
+ }
+ scode += GET(scode, 1);
+ }
+ while (*scode == OP_ALT);
+ }
+ }
+ }
+
+ /* Else there's some kind of shambles */
+
+ else
+ {
+ *errorcodeptr = ERR11;
+ goto FAILED;
+ }
+
+ /* If the character following a repeat is '+', or if certain optimization
+ tests above succeeded, possessive_quantifier is TRUE. For some of the
+ simpler opcodes, there is an special alternative opcode for this. For
+ anything else, we wrap the entire repeated item inside OP_ONCE brackets.
+ The '+' notation is just syntactic sugar, taken from Sun's Java package,
+ but the special opcodes can optimize it a bit. The repeated item starts at
+ tempcode, not at previous, which might be the first part of a string whose
+ (former) last char we repeated.
+
+ Possessifying an 'exact' quantifier has no effect, so we can ignore it. But
+ an 'upto' may follow. We skip over an 'exact' item, and then test the
+ length of what remains before proceeding. */
+
+ if (possessive_quantifier)
+ {
+ int len;
+ if (*tempcode == OP_EXACT || *tempcode == OP_TYPEEXACT ||
+ *tempcode == OP_NOTEXACT)
+ tempcode += _pcre_OP_lengths[*tempcode];
+ len = code - tempcode;
+ if (len > 0) switch (*tempcode)
+ {
+ case OP_STAR: *tempcode = OP_POSSTAR; break;
+ case OP_PLUS: *tempcode = OP_POSPLUS; break;
+ case OP_QUERY: *tempcode = OP_POSQUERY; break;
+ case OP_UPTO: *tempcode = OP_POSUPTO; break;
+
+ case OP_TYPESTAR: *tempcode = OP_TYPEPOSSTAR; break;
+ case OP_TYPEPLUS: *tempcode = OP_TYPEPOSPLUS; break;
+ case OP_TYPEQUERY: *tempcode = OP_TYPEPOSQUERY; break;
+ case OP_TYPEUPTO: *tempcode = OP_TYPEPOSUPTO; break;
+
+ case OP_NOTSTAR: *tempcode = OP_NOTPOSSTAR; break;
+ case OP_NOTPLUS: *tempcode = OP_NOTPOSPLUS; break;
+ case OP_NOTQUERY: *tempcode = OP_NOTPOSQUERY; break;
+ case OP_NOTUPTO: *tempcode = OP_NOTPOSUPTO; break;
+
+ default:
+ memmove(tempcode + 1+LINK_SIZE, tempcode, len);
+ code += 1 + LINK_SIZE;
+ len += 1 + LINK_SIZE;
+ tempcode[0] = OP_ONCE;
+ *code++ = OP_KET;
+ PUTINC(code, 0, len);
+ PUT(tempcode, 1, len);
+ break;
+ }
+ }
+
+ /* In all case we no longer have a previous item. We also set the
+ "follows varying string" flag for subsequently encountered reqbytes if
+ it isn't already set and we have just passed a varying length item. */
+
+ END_REPEAT:
+ previous = NULL;
+ cd->req_varyopt |= reqvary;
+ break;
+
+
+ /* ===================================================================*/
+ /* Start of nested parenthesized sub-expression, or comment or lookahead or
+ lookbehind or option setting or condition or all the other extended
+ parenthesis forms. First deal with the specials; all are introduced by ?,
+ and the appearance of any of them means that this is not a capturing
+ group. */
+
+ case '(':
+ newoptions = options;
+ skipbytes = 0;
+ bravalue = OP_CBRA;
+ save_hwm = cd->hwm;
+
+ if (*(++ptr) == '?')
+ {
+ int i, set, unset, namelen;
+ int *optset;
+ const uschar *name;
+ uschar *slot;
+
+ switch (*(++ptr))
+ {
+ case '#': /* Comment; skip to ket */
+ ptr++;
+ while (*ptr != 0 && *ptr != ')') ptr++;
+ if (*ptr == 0)
+ {
+ *errorcodeptr = ERR18;
+ goto FAILED;
+ }
+ continue;
+
+
+ /* ------------------------------------------------------------ */
+ case ':': /* Non-capturing bracket */
+ bravalue = OP_BRA;
+ ptr++;
+ break;
+
+
+ /* ------------------------------------------------------------ */
+ case '(':
+ bravalue = OP_COND; /* Conditional group */
+
+ /* A condition can be an assertion, a number (referring to a numbered
+ group), a name (referring to a named group), or 'R', referring to
+ recursion. R<digits> and R&name are also permitted for recursion tests.
+
+ There are several syntaxes for testing a named group: (?(name)) is used
+ by Python; Perl 5.10 onwards uses (?(<name>) or (?('name')).
+
+ There are two unfortunate ambiguities, caused by history. (a) 'R' can
+ be the recursive thing or the name 'R' (and similarly for 'R' followed
+ by digits), and (b) a number could be a name that consists of digits.
+ In both cases, we look for a name first; if not found, we try the other
+ cases. */
+
+ /* For conditions that are assertions, check the syntax, and then exit
+ the switch. This will take control down to where bracketed groups,
+ including assertions, are processed. */
+
+ if (ptr[1] == '?' && (ptr[2] == '=' || ptr[2] == '!' || ptr[2] == '<'))
+ break;
+
+ /* Most other conditions use OP_CREF (a couple change to OP_RREF
+ below), and all need to skip 3 bytes at the start of the group. */
+
+ code[1+LINK_SIZE] = OP_CREF;
+ skipbytes = 3;
+
+ /* Check for a test for recursion in a named group. */
+
+ if (ptr[1] == 'R' && ptr[2] == '&')
+ {
+ terminator = -1;
+ ptr += 2;
+ code[1+LINK_SIZE] = OP_RREF; /* Change the type of test */
+ }
+
+ /* Check for a test for a named group's having been set, using the Perl
+ syntax (?(<name>) or (?('name') */
+
+ else if (ptr[1] == '<')
+ {
+ terminator = '>';
+ ptr++;
+ }
+ else if (ptr[1] == '\'')
+ {
+ terminator = '\'';
+ ptr++;
+ }
+ else terminator = 0;
+
+ /* We now expect to read a name; any thing else is an error */
+
+ if ((cd->ctypes[ptr[1]] & ctype_word) == 0)
+ {
+ ptr += 1; /* To get the right offset */
+ *errorcodeptr = ERR28;
+ goto FAILED;
+ }
+
+ /* Read the name, but also get it as a number if it's all digits */
+
+ recno = 0;
+ name = ++ptr;
+ while ((cd->ctypes[*ptr] & ctype_word) != 0)
+ {
+ if (recno >= 0)
+ recno = (g_ascii_isdigit(*ptr) != 0)?
+ recno * 10 + *ptr - '0' : -1;
+ ptr++;
+ }
+ namelen = ptr - name;
+
+ if ((terminator > 0 && *ptr++ != terminator) || *ptr++ != ')')
+ {
+ ptr--; /* Error offset */
+ *errorcodeptr = ERR26;
+ goto FAILED;
+ }
+
+ /* Do no further checking in the pre-compile phase. */
+
+ if (lengthptr != NULL) break;
+
+ /* In the real compile we do the work of looking for the actual
+ reference. */
+
+ slot = cd->name_table;
+ for (i = 0; i < cd->names_found; i++)
+ {
+ if (strncmp((char *)name, (char *)slot+2, namelen) == 0) break;
+ slot += cd->name_entry_size;
+ }
+
+ /* Found a previous named subpattern */
+
+ if (i < cd->names_found)
+ {
+ recno = GET2(slot, 0);
+ PUT2(code, 2+LINK_SIZE, recno);
+ }
+
+ /* Search the pattern for a forward reference */
+
+ else if ((i = find_parens(ptr, cd->bracount, name, namelen,
+ (options & PCRE_EXTENDED) != 0)) > 0)
+ {
+ PUT2(code, 2+LINK_SIZE, i);
+ }
+
+ /* If terminator == 0 it means that the name followed directly after
+ the opening parenthesis [e.g. (?(abc)...] and in this case there are
+ some further alternatives to try. For the cases where terminator != 0
+ [things like (?(<name>... or (?('name')... or (?(R&name)... ] we have
+ now checked all the possibilities, so give an error. */
+
+ else if (terminator != 0)
+ {
+ *errorcodeptr = ERR15;
+ goto FAILED;
+ }
+
+ /* Check for (?(R) for recursion. Allow digits after R to specify a
+ specific group number. */
+
+ else if (*name == 'R')
+ {
+ recno = 0;
+ for (i = 1; i < namelen; i++)
+ {
+ if (g_ascii_isdigit(name[i]) == 0)
+ {
+ *errorcodeptr = ERR15;
+ goto FAILED;
+ }
+ recno = recno * 10 + name[i] - '0';
+ }
+ if (recno == 0) recno = RREF_ANY;
+ code[1+LINK_SIZE] = OP_RREF; /* Change test type */
+ PUT2(code, 2+LINK_SIZE, recno);
+ }
+
+ /* Similarly, check for the (?(DEFINE) "condition", which is always
+ false. */
+
+ else if (namelen == 6 && strncmp((char *)name, "DEFINE", 6) == 0)
+ {
+ code[1+LINK_SIZE] = OP_DEF;
+ skipbytes = 1;
+ }
+
+ /* Check for the "name" actually being a subpattern number. */
+
+ else if (recno > 0)
+ {
+ PUT2(code, 2+LINK_SIZE, recno);
+ }
+
+ /* Either an unidentified subpattern, or a reference to (?(0) */
+
+ else
+ {
+ *errorcodeptr = (recno == 0)? ERR35: ERR15;
+ goto FAILED;
+ }
+ break;
+
+
+ /* ------------------------------------------------------------ */
+ case '=': /* Positive lookahead */
+ bravalue = OP_ASSERT;
+ ptr++;
+ break;
+
+
+ /* ------------------------------------------------------------ */
+ case '!': /* Negative lookahead */
+ bravalue = OP_ASSERT_NOT;
+ ptr++;
+ break;
+
+
+ /* ------------------------------------------------------------ */
+ case '<': /* Lookbehind or named define */
+ switch (ptr[1])
+ {
+ case '=': /* Positive lookbehind */
+ bravalue = OP_ASSERTBACK;
+ ptr += 2;
+ break;
+
+ case '!': /* Negative lookbehind */
+ bravalue = OP_ASSERTBACK_NOT;
+ ptr += 2;
+ break;
+
+ default: /* Could be name define, else bad */
+ if ((cd->ctypes[ptr[1]] & ctype_word) != 0) goto DEFINE_NAME;
+ ptr++; /* Correct offset for error */
+ *errorcodeptr = ERR24;
+ goto FAILED;
+ }
+ break;
+
+
+ /* ------------------------------------------------------------ */
+ case '>': /* One-time brackets */
+ bravalue = OP_ONCE;
+ ptr++;
+ break;
+
+
+ /* ------------------------------------------------------------ */
+ case 'C': /* Callout - may be followed by digits; */
+ previous_callout = code; /* Save for later completion */
+ after_manual_callout = 1; /* Skip one item before completing */
+ *code++ = OP_CALLOUT;
+ {
+ int n = 0;
+ while (g_ascii_isdigit(*(++ptr)) != 0)
+ n = n * 10 + *ptr - '0';
+ if (*ptr != ')')
+ {
+ *errorcodeptr = ERR39;
+ goto FAILED;
+ }
+ if (n > 255)
+ {
+ *errorcodeptr = ERR38;
+ goto FAILED;
+ }
+ *code++ = n;
+ PUT(code, 0, ptr - cd->start_pattern + 1); /* Pattern offset */
+ PUT(code, LINK_SIZE, 0); /* Default length */
+ code += 2 * LINK_SIZE;
+ }
+ previous = NULL;
+ continue;
+
+
+ /* ------------------------------------------------------------ */
+ case 'P': /* Python-style named subpattern handling */
+ if (*(++ptr) == '=' || *ptr == '>') /* Reference or recursion */
+ {
+ is_recurse = *ptr == '>';
+ terminator = ')';
+ goto NAMED_REF_OR_RECURSE;
+ }
+ else if (*ptr != '<') /* Test for Python-style definition */
+ {
+ *errorcodeptr = ERR41;
+ goto FAILED;
+ }
+ /* Fall through to handle (?P< as (?< is handled */
+
+
+ /* ------------------------------------------------------------ */
+ DEFINE_NAME: /* Come here from (?< handling */
+ case '\'':
+ {
+ terminator = (*ptr == '<')? '>' : '\'';
+ name = ++ptr;
+
+ while ((cd->ctypes[*ptr] & ctype_word) != 0) ptr++;
+ namelen = ptr - name;
+
+ /* In the pre-compile phase, just do a syntax check. */
+
+ if (lengthptr != NULL)
+ {
+ if (*ptr != terminator)
+ {
+ *errorcodeptr = ERR42;
+ goto FAILED;
+ }
+ if (cd->names_found >= MAX_NAME_COUNT)
+ {
+ *errorcodeptr = ERR49;
+ goto FAILED;
+ }
+ if (namelen + 3 > cd->name_entry_size)
+ {
+ cd->name_entry_size = namelen + 3;
+ if (namelen > MAX_NAME_SIZE)
+ {
+ *errorcodeptr = ERR48;
+ goto FAILED;
+ }
+ }
+ }
+
+ /* In the real compile, create the entry in the table */
+
+ else
+ {
+ slot = cd->name_table;
+ for (i = 0; i < cd->names_found; i++)
+ {
+ int crc = memcmp(name, slot+2, namelen);
+ if (crc == 0)
+ {
+ if (slot[2+namelen] == 0)
+ {
+ if ((options & PCRE_DUPNAMES) == 0)
+ {
+ *errorcodeptr = ERR43;
+ goto FAILED;
+ }
+ }
+ else crc = -1; /* Current name is substring */
+ }
+ if (crc < 0)
+ {
+ memmove(slot + cd->name_entry_size, slot,
+ (cd->names_found - i) * cd->name_entry_size);
+ break;
+ }
+ slot += cd->name_entry_size;
+ }
+
+ PUT2(slot, 0, cd->bracount + 1);
+ memcpy(slot + 2, name, namelen);
+ slot[2+namelen] = 0;
+ }
+ }
+
+ /* In both cases, count the number of names we've encountered. */
+
+ ptr++; /* Move past > or ' */
+ cd->names_found++;
+ goto NUMBERED_GROUP;
+
+
+ /* ------------------------------------------------------------ */
+ case '&': /* Perl recursion/subroutine syntax */
+ terminator = ')';
+ is_recurse = TRUE;
+ /* Fall through */
+
+ /* We come here from the Python syntax above that handles both
+ references (?P=name) and recursion (?P>name), as well as falling
+ through from the Perl recursion syntax (?&name). */
+
+ NAMED_REF_OR_RECURSE:
+ name = ++ptr;
+ while ((cd->ctypes[*ptr] & ctype_word) != 0) ptr++;
+ namelen = ptr - name;
+
+ /* In the pre-compile phase, do a syntax check and set a dummy
+ reference number. */
+
+ if (lengthptr != NULL)
+ {
+ if (*ptr != terminator)
+ {
+ *errorcodeptr = ERR42;
+ goto FAILED;
+ }
+ if (namelen > MAX_NAME_SIZE)
+ {
+ *errorcodeptr = ERR48;
+ goto FAILED;
+ }
+ recno = 0;
+ }
+
+ /* In the real compile, seek the name in the table */
+
+ else
+ {
+ slot = cd->name_table;
+ for (i = 0; i < cd->names_found; i++)
+ {
+ if (strncmp((char *)name, (char *)slot+2, namelen) == 0) break;
+ slot += cd->name_entry_size;
+ }
+
+ if (i < cd->names_found) /* Back reference */
+ {
+ recno = GET2(slot, 0);
+ }
+ else if ((recno = /* Forward back reference */
+ find_parens(ptr, cd->bracount, name, namelen,
+ (options & PCRE_EXTENDED) != 0)) <= 0)
+ {
+ *errorcodeptr = ERR15;
+ goto FAILED;
+ }
+ }
+
+ /* In both phases, we can now go to the code than handles numerical
+ recursion or backreferences. */
+
+ if (is_recurse) goto HANDLE_RECURSION;
+ else goto HANDLE_REFERENCE;
+
+
+ /* ------------------------------------------------------------ */
+ case 'R': /* Recursion */
+ ptr++; /* Same as (?0) */
+ /* Fall through */
+
+
+ /* ------------------------------------------------------------ */
+ case '0': case '1': case '2': case '3': case '4': /* Recursion or */
+ case '5': case '6': case '7': case '8': case '9': /* subroutine */
+ {
+ const uschar *called;
+ recno = 0;
+ while(g_ascii_isdigit(*ptr) != 0)
+ recno = recno * 10 + *ptr++ - '0';
+ if (*ptr != ')')
+ {
+ *errorcodeptr = ERR29;
+ goto FAILED;
+ }
+
+ /* Come here from code above that handles a named recursion */
+
+ HANDLE_RECURSION:
+
+ previous = code;
+ called = cd->start_code;
+
+ /* When we are actually compiling, find the bracket that is being
+ referenced. Temporarily end the regex in case it doesn't exist before
+ this point. If we end up with a forward reference, first check that
+ the bracket does occur later so we can give the error (and position)
+ now. Then remember this forward reference in the workspace so it can
+ be filled in at the end. */
+
+ if (lengthptr == NULL)
+ {
+ *code = OP_END;
+ if (recno != 0) called = find_bracket(cd->start_code, utf8, recno);
+
+ /* Forward reference */
+
+ if (called == NULL)
+ {
+ if (find_parens(ptr, cd->bracount, NULL, recno,
+ (options & PCRE_EXTENDED) != 0) < 0)
+ {
+ *errorcodeptr = ERR15;
+ goto FAILED;
+ }
+ called = cd->start_code + recno;
+ PUTINC(cd->hwm, 0, code + 2 + LINK_SIZE - cd->start_code);
+ }
+
+ /* If not a forward reference, and the subpattern is still open,
+ this is a recursive call. We check to see if this is a left
+ recursion that could loop for ever, and diagnose that case. */
+
+ else if (GET(called, 1) == 0 &&
+ could_be_empty(called, code, bcptr, utf8))
+ {
+ *errorcodeptr = ERR40;
+ goto FAILED;
+ }
+ }
+
+ /* Insert the recursion/subroutine item, automatically wrapped inside
+ "once" brackets. Set up a "previous group" length so that a
+ subsequent quantifier will work. */
+
+ *code = OP_ONCE;
+ PUT(code, 1, 2 + 2*LINK_SIZE);
+ code += 1 + LINK_SIZE;
+
+ *code = OP_RECURSE;
+ PUT(code, 1, called - cd->start_code);
+ code += 1 + LINK_SIZE;
+
+ *code = OP_KET;
+ PUT(code, 1, 2 + 2*LINK_SIZE);
+ code += 1 + LINK_SIZE;
+
+ length_prevgroup = 3 + 3*LINK_SIZE;
+ }
+
+ /* Can't determine a first byte now */
+
+ if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
+ continue;
+
+
+ /* ------------------------------------------------------------ */
+ default: /* Other characters: check option setting */
+ set = unset = 0;
+ optset = &set;
+
+ while (*ptr != ')' && *ptr != ':')
+ {
+ switch (*ptr++)
+ {
+ case '-': optset = &unset; break;
+
+ case 'J': /* Record that it changed in the external options */
+ *optset |= PCRE_DUPNAMES;
+ cd->external_options |= PCRE_JCHANGED;
+ break;
+
+ case 'i': *optset |= PCRE_CASELESS; break;
+ case 'm': *optset |= PCRE_MULTILINE; break;
+ case 's': *optset |= PCRE_DOTALL; break;
+ case 'x': *optset |= PCRE_EXTENDED; break;
+ case 'U': *optset |= PCRE_UNGREEDY; break;
+ case 'X': *optset |= PCRE_EXTRA; break;
+
+ default: *errorcodeptr = ERR12;
+ ptr--; /* Correct the offset */
+ goto FAILED;
+ }
+ }
+
+ /* Set up the changed option bits, but don't change anything yet. */
+
+ newoptions = (options | set) & (~unset);
+
+ /* If the options ended with ')' this is not the start of a nested
+ group with option changes, so the options change at this level. If this
+ item is right at the start of the pattern, the options can be
+ abstracted and made external in the pre-compile phase, and ignored in
+ the compile phase. This can be helpful when matching -- for instance in
+ caseless checking of required bytes.
+
+ If the code pointer is not (cd->start_code + 1 + LINK_SIZE), we are
+ definitely *not* at the start of the pattern because something has been
+ compiled. In the pre-compile phase, however, the code pointer can have
+ that value after the start, because it gets reset as code is discarded
+ during the pre-compile. However, this can happen only at top level - if
+ we are within parentheses, the starting BRA will still be present. At
+ any parenthesis level, the length value can be used to test if anything
+ has been compiled at that level. Thus, a test for both these conditions
+ is necessary to ensure we correctly detect the start of the pattern in
+ both phases.
+
+ If we are not at the pattern start, compile code to change the ims
+ options if this setting actually changes any of them. We also pass the
+ new setting back so that it can be put at the start of any following
+ branches, and when this group ends (if we are in a group), a resetting
+ item can be compiled. */
+
+ if (*ptr == ')')
+ {
+ if (code == cd->start_code + 1 + LINK_SIZE &&
+ (lengthptr == NULL || *lengthptr == 2 + 2*LINK_SIZE))
+ {
+ cd->external_options = newoptions;
+ options = newoptions;
+ }
+ else
+ {
+ if ((options & PCRE_IMS) != (newoptions & PCRE_IMS))
+ {
+ *code++ = OP_OPT;
+ *code++ = newoptions & PCRE_IMS;
+ }
+
+ /* Change options at this level, and pass them back for use
+ in subsequent branches. Reset the greedy defaults and the case
+ value for firstbyte and reqbyte. */
+
+ *optionsptr = options = newoptions;
+ greedy_default = ((newoptions & PCRE_UNGREEDY) != 0);
+ greedy_non_default = greedy_default ^ 1;
+ req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0;
+ }
+
+ previous = NULL; /* This item can't be repeated */
+ continue; /* It is complete */
+ }
+
+ /* If the options ended with ':' we are heading into a nested group
+ with possible change of options. Such groups are non-capturing and are
+ not assertions of any kind. All we need to do is skip over the ':';
+ the newoptions value is handled below. */
+
+ bravalue = OP_BRA;
+ ptr++;
+ } /* End of switch for character following (? */
+ } /* End of (? handling */
+
+ /* Opening parenthesis not followed by '?'. If PCRE_NO_AUTO_CAPTURE is set,
+ all unadorned brackets become non-capturing and behave like (?:...)
+ brackets. */
+
+ else if ((options & PCRE_NO_AUTO_CAPTURE) != 0)
+ {
+ bravalue = OP_BRA;
+ }
+
+ /* Else we have a capturing group. */
+
+ else
+ {
+ NUMBERED_GROUP:
+ cd->bracount += 1;
+ PUT2(code, 1+LINK_SIZE, cd->bracount);
+ skipbytes = 2;
+ }
+
+ /* Process nested bracketed regex. Assertions may not be repeated, but
+ other kinds can be. All their opcodes are >= OP_ONCE. We copy code into a
+ non-register variable in order to be able to pass its address because some
+ compilers complain otherwise. Pass in a new setting for the ims options if
+ they have changed. */
+
+ previous = (bravalue >= OP_ONCE)? code : NULL;
+ *code = bravalue;
+ tempcode = code;
+ tempreqvary = cd->req_varyopt; /* Save value before bracket */
+ length_prevgroup = 0; /* Initialize for pre-compile phase */
+
+ if (!compile_regex(
+ newoptions, /* The complete new option state */
+ options & PCRE_IMS, /* The previous ims option state */
+ &tempcode, /* Where to put code (updated) */
+ &ptr, /* Input pointer (updated) */
+ errorcodeptr, /* Where to put an error message */
+ (bravalue == OP_ASSERTBACK ||
+ bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */
+ skipbytes, /* Skip over bracket number */
+ &subfirstbyte, /* For possible first char */
+ &subreqbyte, /* For possible last char */
+ bcptr, /* Current branch chain */
+ cd, /* Tables block */
+ (lengthptr == NULL)? NULL : /* Actual compile phase */
+ &length_prevgroup /* Pre-compile phase */
+ ))
+ goto FAILED;
+
+ /* At the end of compiling, code is still pointing to the start of the
+ group, while tempcode has been updated to point past the end of the group
+ and any option resetting that may follow it. The pattern pointer (ptr)
+ is on the bracket. */
+
+ /* If this is a conditional bracket, check that there are no more than
+ two branches in the group, or just one if it's a DEFINE group. */
+
+ if (bravalue == OP_COND)
+ {
+ uschar *tc = code;
+ int condcount = 0;
+
+ do {
+ condcount++;
+ tc += GET(tc,1);
+ }
+ while (*tc != OP_KET);
+
+ /* A DEFINE group is never obeyed inline (the "condition" is always
+ false). It must have only one branch. */
+
+ if (code[LINK_SIZE+1] == OP_DEF)
+ {
+ if (condcount > 1)
+ {
+ *errorcodeptr = ERR54;
+ goto FAILED;
+ }
+ bravalue = OP_DEF; /* Just a flag to suppress char handling below */
+ }
+
+ /* A "normal" conditional group. If there is just one branch, we must not
+ make use of its firstbyte or reqbyte, because this is equivalent to an
+ empty second branch. */
+
+ else
+ {
+ if (condcount > 2)
+ {
+ *errorcodeptr = ERR27;
+ goto FAILED;
+ }
+ if (condcount == 1) subfirstbyte = subreqbyte = REQ_NONE;
+ }
+ }
+
+ /* Error if hit end of pattern */
+
+ if (*ptr != ')')
+ {
+ *errorcodeptr = ERR14;
+ goto FAILED;
+ }
+
+ /* In the pre-compile phase, update the length by the length of the nested
+ group, less the brackets at either end. Then reduce the compiled code to
+ just the brackets so that it doesn't use much memory if it is duplicated by
+ a quantifier. */
+
+ if (lengthptr != NULL)
+ {
+ *lengthptr += length_prevgroup - 2 - 2*LINK_SIZE;
+ code++;
+ PUTINC(code, 0, 1 + LINK_SIZE);
+ *code++ = OP_KET;
+ PUTINC(code, 0, 1 + LINK_SIZE);
+ }
+
+ /* Otherwise update the main code pointer to the end of the group. */
+
+ else code = tempcode;
+
+ /* For a DEFINE group, required and first character settings are not
+ relevant. */
+
+ if (bravalue == OP_DEF) break;
+
+ /* Handle updating of the required and first characters for other types of
+ group. Update for normal brackets of all kinds, and conditions with two
+ branches (see code above). If the bracket is followed by a quantifier with
+ zero repeat, we have to back off. Hence the definition of zeroreqbyte and
+ zerofirstbyte outside the main loop so that they can be accessed for the
+ back off. */
+
+ zeroreqbyte = reqbyte;
+ zerofirstbyte = firstbyte;
+ groupsetfirstbyte = FALSE;
+
+ if (bravalue >= OP_ONCE)
+ {
+ /* If we have not yet set a firstbyte in this branch, take it from the
+ subpattern, remembering that it was set here so that a repeat of more
+ than one can replicate it as reqbyte if necessary. If the subpattern has
+ no firstbyte, set "none" for the whole branch. In both cases, a zero
+ repeat forces firstbyte to "none". */
+
+ if (firstbyte == REQ_UNSET)
+ {
+ if (subfirstbyte >= 0)
+ {
+ firstbyte = subfirstbyte;
+ groupsetfirstbyte = TRUE;
+ }
+ else firstbyte = REQ_NONE;
+ zerofirstbyte = REQ_NONE;
+ }
+
+ /* If firstbyte was previously set, convert the subpattern's firstbyte
+ into reqbyte if there wasn't one, using the vary flag that was in
+ existence beforehand. */
+
+ else if (subfirstbyte >= 0 && subreqbyte < 0)
+ subreqbyte = subfirstbyte | tempreqvary;
+
+ /* If the subpattern set a required byte (or set a first byte that isn't
+ really the first byte - see above), set it. */
+
+ if (subreqbyte >= 0) reqbyte = subreqbyte;
+ }
+
+ /* For a forward assertion, we take the reqbyte, if set. This can be
+ helpful if the pattern that follows the assertion doesn't set a different
+ char. For example, it's useful for /(?=abcde).+/. We can't set firstbyte
+ for an assertion, however because it leads to incorrect effect for patterns
+ such as /(?=a)a.+/ when the "real" "a" would then become a reqbyte instead
+ of a firstbyte. This is overcome by a scan at the end if there's no
+ firstbyte, looking for an asserted first char. */
+
+ else if (bravalue == OP_ASSERT && subreqbyte >= 0) reqbyte = subreqbyte;
+ break; /* End of processing '(' */
+
+
+ /* ===================================================================*/
+ /* Handle metasequences introduced by \. For ones like \d, the ESC_ values
+ are arranged to be the negation of the corresponding OP_values. For the
+ back references, the values are ESC_REF plus the reference number. Only
+ back references and those types that consume a character may be repeated.
+ We can test for values between ESC_b and ESC_Z for the latter; this may
+ have to change if any new ones are ever created. */
+
+ case '\\':
+ tempptr = ptr;
+ c = check_escape(&ptr, errorcodeptr, cd->bracount, options, FALSE);
+ if (*errorcodeptr != 0) goto FAILED;
+
+ if (c < 0)
+ {
+ if (-c == ESC_Q) /* Handle start of quoted string */
+ {
+ if (ptr[1] == '\\' && ptr[2] == 'E') ptr += 2; /* avoid empty string */
+ else inescq = TRUE;
+ continue;
+ }
+
+ if (-c == ESC_E) continue; /* Perl ignores an orphan \E */
+
+ /* For metasequences that actually match a character, we disable the
+ setting of a first character if it hasn't already been set. */
+
+ if (firstbyte == REQ_UNSET && -c > ESC_b && -c < ESC_Z)
+ firstbyte = REQ_NONE;
+
+ /* Set values to reset to if this is followed by a zero repeat. */
+
+ zerofirstbyte = firstbyte;
+ zeroreqbyte = reqbyte;
+
+ /* \k<name> or \k'name' is a back reference by name (Perl syntax) */
+
+ if (-c == ESC_k && (ptr[1] == '<' || ptr[1] == '\''))
+ {
+ is_recurse = FALSE;
+ terminator = (*(++ptr) == '<')? '>' : '\'';
+ goto NAMED_REF_OR_RECURSE;
+ }
+
+ /* Back references are handled specially; must disable firstbyte if
+ not set to cope with cases like (?=(\w+))\1: which would otherwise set
+ ':' later. */
+
+ if (-c >= ESC_REF)
+ {
+ recno = -c - ESC_REF;
+
+ HANDLE_REFERENCE: /* Come here from named backref handling */
+ if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
+ previous = code;
+ *code++ = OP_REF;
+ PUT2INC(code, 0, recno);
+ cd->backref_map |= (recno < 32)? (1 << recno) : 1;
+ if (recno > cd->top_backref) cd->top_backref = recno;
+ }
+
+ /* So are Unicode property matches, if supported. */
+
+#ifdef SUPPORT_UCP
+ else if (-c == ESC_P || -c == ESC_p)
+ {
+ BOOL negated;
+ int pdata;
+ int ptype = get_ucp(&ptr, &negated, &pdata, errorcodeptr);
+ if (ptype < 0) goto FAILED;
+ previous = code;
+ *code++ = ((-c == ESC_p) != negated)? OP_PROP : OP_NOTPROP;
+ *code++ = ptype;
+ *code++ = pdata;
+ }
+#else
+
+ /* If Unicode properties are not supported, \X, \P, and \p are not
+ allowed. */
+
+ else if (-c == ESC_X || -c == ESC_P || -c == ESC_p)
+ {
+ *errorcodeptr = ERR45;
+ goto FAILED;
+ }
+#endif
+
+ /* For the rest (including \X when Unicode properties are supported), we
+ can obtain the OP value by negating the escape value. */
+
+ else
+ {
+ previous = (-c > ESC_b && -c < ESC_Z)? code : NULL;
+ *code++ = -c;
+ }
+ continue;
+ }
+
+ /* We have a data character whose value is in c. In UTF-8 mode it may have
+ a value > 127. We set its representation in the length/buffer, and then
+ handle it as a data character. */
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && c > 127)
+ mclength = _pcre_ord2utf8(c, mcbuffer);
+ else
+#endif
+
+ {
+ mcbuffer[0] = c;
+ mclength = 1;
+ }
+ goto ONE_CHAR;
+
+
+ /* ===================================================================*/
+ /* Handle a literal character. It is guaranteed not to be whitespace or #
+ when the extended flag is set. If we are in UTF-8 mode, it may be a
+ multi-byte literal character. */
+
+ default:
+ NORMAL_CHAR:
+ mclength = 1;
+ mcbuffer[0] = c;
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && c >= 0xc0)
+ {
+ while ((ptr[1] & 0xc0) == 0x80)
+ mcbuffer[mclength++] = *(++ptr);
+ }
+#endif
+
+ /* At this point we have the character's bytes in mcbuffer, and the length
+ in mclength. When not in UTF-8 mode, the length is always 1. */
+
+ ONE_CHAR:
+ previous = code;
+ *code++ = ((options & PCRE_CASELESS) != 0)? OP_CHARNC : OP_CHAR;
+ for (c = 0; c < mclength; c++) *code++ = mcbuffer[c];
+
+ /* Set the first and required bytes appropriately. If no previous first
+ byte, set it from this character, but revert to none on a zero repeat.
+ Otherwise, leave the firstbyte value alone, and don't change it on a zero
+ repeat. */
+
+ if (firstbyte == REQ_UNSET)
+ {
+ zerofirstbyte = REQ_NONE;
+ zeroreqbyte = reqbyte;
+
+ /* If the character is more than one byte long, we can set firstbyte
+ only if it is not to be matched caselessly. */
+
+ if (mclength == 1 || req_caseopt == 0)
+ {
+ firstbyte = mcbuffer[0] | req_caseopt;
+ if (mclength != 1) reqbyte = code[-1] | cd->req_varyopt;
+ }
+ else firstbyte = reqbyte = REQ_NONE;
+ }
+
+ /* firstbyte was previously set; we can set reqbyte only the length is
+ 1 or the matching is caseful. */
+
+ else
+ {
+ zerofirstbyte = firstbyte;
+ zeroreqbyte = reqbyte;
+ if (mclength == 1 || req_caseopt == 0)
+ reqbyte = code[-1] | req_caseopt | cd->req_varyopt;
+ }
+
+ break; /* End of literal character handling */
+ }
+ } /* end of big loop */
+
+
+/* Control never reaches here by falling through, only by a goto for all the
+error states. Pass back the position in the pattern so that it can be displayed
+to the user for diagnosing the error. */
+
+FAILED:
+*ptrptr = ptr;
+return FALSE;
+}
+
+
+
+
+/*************************************************
+* Compile sequence of alternatives *
+*************************************************/
+
+/* On entry, ptr is pointing past the bracket character, but on return it
+points to the closing bracket, or vertical bar, or end of string. The code
+variable is pointing at the byte into which the BRA operator has been stored.
+If the ims options are changed at the start (for a (?ims: group) or during any
+branch, we need to insert an OP_OPT item at the start of every following branch
+to ensure they get set correctly at run time, and also pass the new options
+into every subsequent branch compile.
+
+This function is used during the pre-compile phase when we are trying to find
+out the amount of memory needed, as well as during the real compile phase. The
+value of lengthptr distinguishes the two phases.
+
+Argument:
+ options option bits, including any changes for this subpattern
+ oldims previous settings of ims option bits
+ codeptr -> the address of the current code pointer
+ ptrptr -> the address of the current pattern pointer
+ errorcodeptr -> pointer to error code variable
+ lookbehind TRUE if this is a lookbehind assertion
+ skipbytes skip this many bytes at start (for brackets and OP_COND)
+ firstbyteptr place to put the first required character, or a negative number
+ reqbyteptr place to put the last required character, or a negative number
+ bcptr pointer to the chain of currently open branches
+ cd points to the data block with tables pointers etc.
+ lengthptr NULL during the real compile phase
+ points to length accumulator during pre-compile phase
+
+Returns: TRUE on success
+*/
+
+static BOOL
+compile_regex(int options, int oldims, uschar **codeptr, const uschar **ptrptr,
+ int *errorcodeptr, BOOL lookbehind, int skipbytes, int *firstbyteptr,
+ int *reqbyteptr, branch_chain *bcptr, compile_data *cd, int *lengthptr)
+{
+const uschar *ptr = *ptrptr;
+uschar *code = *codeptr;
+uschar *last_branch = code;
+uschar *start_bracket = code;
+uschar *reverse_count = NULL;
+int firstbyte, reqbyte;
+int branchfirstbyte, branchreqbyte;
+int length;
+branch_chain bc;
+
+bc.outer = bcptr;
+bc.current = code;
+
+firstbyte = reqbyte = REQ_UNSET;
+
+/* Accumulate the length for use in the pre-compile phase. Start with the
+length of the BRA and KET and any extra bytes that are required at the
+beginning. We accumulate in a local variable to save frequent testing of
+lenthptr for NULL. We cannot do this by looking at the value of code at the
+start and end of each alternative, because compiled items are discarded during
+the pre-compile phase so that the work space is not exceeded. */
+
+length = 2 + 2*LINK_SIZE + skipbytes;
+
+/* WARNING: If the above line is changed for any reason, you must also change
+the code that abstracts option settings at the start of the pattern and makes
+them global. It tests the value of length for (2 + 2*LINK_SIZE) in the
+pre-compile phase to find out whether anything has yet been compiled or not. */
+
+/* Offset is set zero to mark that this bracket is still open */
+
+PUT(code, 1, 0);
+code += 1 + LINK_SIZE + skipbytes;
+
+/* Loop for each alternative branch */
+
+for (;;)
+ {
+ /* Handle a change of ims options at the start of the branch */
+
+ if ((options & PCRE_IMS) != oldims)
+ {
+ *code++ = OP_OPT;
+ *code++ = options & PCRE_IMS;
+ length += 2;
+ }
+
+ /* Set up dummy OP_REVERSE if lookbehind assertion */
+
+ if (lookbehind)
+ {
+ *code++ = OP_REVERSE;
+ reverse_count = code;
+ PUTINC(code, 0, 0);
+ length += 1 + LINK_SIZE;
+ }
+
+ /* Now compile the branch; in the pre-compile phase its length gets added
+ into the length. */
+
+ if (!compile_branch(&options, &code, &ptr, errorcodeptr, &branchfirstbyte,
+ &branchreqbyte, &bc, cd, (lengthptr == NULL)? NULL : &length))
+ {
+ *ptrptr = ptr;
+ return FALSE;
+ }
+
+ /* In the real compile phase, there is some post-processing to be done. */
+
+ if (lengthptr == NULL)
+ {
+ /* If this is the first branch, the firstbyte and reqbyte values for the
+ branch become the values for the regex. */
+
+ if (*last_branch != OP_ALT)
+ {
+ firstbyte = branchfirstbyte;
+ reqbyte = branchreqbyte;
+ }
+
+ /* If this is not the first branch, the first char and reqbyte have to
+ match the values from all the previous branches, except that if the
+ previous value for reqbyte didn't have REQ_VARY set, it can still match,
+ and we set REQ_VARY for the regex. */
+
+ else
+ {
+ /* If we previously had a firstbyte, but it doesn't match the new branch,
+ we have to abandon the firstbyte for the regex, but if there was
+ previously no reqbyte, it takes on the value of the old firstbyte. */
+
+ if (firstbyte >= 0 && firstbyte != branchfirstbyte)
+ {
+ if (reqbyte < 0) reqbyte = firstbyte;
+ firstbyte = REQ_NONE;
+ }
+
+ /* If we (now or from before) have no firstbyte, a firstbyte from the
+ branch becomes a reqbyte if there isn't a branch reqbyte. */
+
+ if (firstbyte < 0 && branchfirstbyte >= 0 && branchreqbyte < 0)
+ branchreqbyte = branchfirstbyte;
+
+ /* Now ensure that the reqbytes match */
+
+ if ((reqbyte & ~REQ_VARY) != (branchreqbyte & ~REQ_VARY))
+ reqbyte = REQ_NONE;
+ else reqbyte |= branchreqbyte; /* To "or" REQ_VARY */
+ }
+
+ /* If lookbehind, check that this branch matches a fixed-length string, and
+ put the length into the OP_REVERSE item. Temporarily mark the end of the
+ branch with OP_END. */
+
+ if (lookbehind)
+ {
+ int fixed_length;
+ *code = OP_END;
+ fixed_length = find_fixedlength(last_branch, options);
+ DPRINTF(("fixed length = %d\n", fixed_length));
+ if (fixed_length < 0)
+ {
+ *errorcodeptr = (fixed_length == -2)? ERR36 : ERR25;
+ *ptrptr = ptr;
+ return FALSE;
+ }
+ PUT(reverse_count, 0, fixed_length);
+ }
+ }
+
+ /* Reached end of expression, either ')' or end of pattern. Go back through
+ the alternative branches and reverse the chain of offsets, with the field in
+ the BRA item now becoming an offset to the first alternative. If there are
+ no alternatives, it points to the end of the group. The length in the
+ terminating ket is always the length of the whole bracketed item. If any of
+ the ims options were changed inside the group, compile a resetting op-code
+ following, except at the very end of the pattern. Return leaving the pointer
+ at the terminating char. */
+
+ if (*ptr != '|')
+ {
+ int branch_length = code - last_branch;
+ do
+ {
+ int prev_length = GET(last_branch, 1);
+ PUT(last_branch, 1, branch_length);
+ branch_length = prev_length;
+ last_branch -= branch_length;
+ }
+ while (branch_length > 0);
+
+ /* Fill in the ket */
+
+ *code = OP_KET;
+ PUT(code, 1, code - start_bracket);
+ code += 1 + LINK_SIZE;
+
+ /* Resetting option if needed */
+
+ if ((options & PCRE_IMS) != oldims && *ptr == ')')
+ {
+ *code++ = OP_OPT;
+ *code++ = oldims;
+ length += 2;
+ }
+
+ /* Set values to pass back */
+
+ *codeptr = code;
+ *ptrptr = ptr;
+ *firstbyteptr = firstbyte;
+ *reqbyteptr = reqbyte;
+ if (lengthptr != NULL) *lengthptr += length;
+ return TRUE;
+ }
+
+ /* Another branch follows; insert an "or" node. Its length field points back
+ to the previous branch while the bracket remains open. At the end the chain
+ is reversed. It's done like this so that the start of the bracket has a
+ zero offset until it is closed, making it possible to detect recursion. */
+
+ *code = OP_ALT;
+ PUT(code, 1, code - last_branch);
+ bc.current = last_branch = code;
+ code += 1 + LINK_SIZE;
+ ptr++;
+ length += 1 + LINK_SIZE;
+ }
+/* Control never reaches here */
+}
+
+
+
+
+/*************************************************
+* Check for anchored expression *
+*************************************************/
+
+/* Try to find out if this is an anchored regular expression. Consider each
+alternative branch. If they all start with OP_SOD or OP_CIRC, or with a bracket
+all of whose alternatives start with OP_SOD or OP_CIRC (recurse ad lib), then
+it's anchored. However, if this is a multiline pattern, then only OP_SOD
+counts, since OP_CIRC can match in the middle.
+
+We can also consider a regex to be anchored if OP_SOM starts all its branches.
+This is the code for \G, which means "match at start of match position, taking
+into account the match offset".
+
+A branch is also implicitly anchored if it starts with .* and DOTALL is set,
+because that will try the rest of the pattern at all possible matching points,
+so there is no point trying again.... er ....
+
+.... except when the .* appears inside capturing parentheses, and there is a
+subsequent back reference to those parentheses. We haven't enough information
+to catch that case precisely.
+
+At first, the best we could do was to detect when .* was in capturing brackets
+and the highest back reference was greater than or equal to that level.
+However, by keeping a bitmap of the first 31 back references, we can catch some
+of the more common cases more precisely.
+
+Arguments:
+ code points to start of expression (the bracket)
+ options points to the options setting
+ bracket_map a bitmap of which brackets we are inside while testing; this
+ handles up to substring 31; after that we just have to take
+ the less precise approach
+ backref_map the back reference bitmap
+
+Returns: TRUE or FALSE
+*/
+
+static BOOL
+is_anchored(register const uschar *code, int *options, unsigned int bracket_map,
+ unsigned int backref_map)
+{
+do {
+ const uschar *scode = first_significant_code(code + _pcre_OP_lengths[*code],
+ options, PCRE_MULTILINE, FALSE);
+ register int op = *scode;
+
+ /* Non-capturing brackets */
+
+ if (op == OP_BRA)
+ {
+ if (!is_anchored(scode, options, bracket_map, backref_map)) return FALSE;
+ }
+
+ /* Capturing brackets */
+
+ else if (op == OP_CBRA)
+ {
+ int n = GET2(scode, 1+LINK_SIZE);
+ int new_map = bracket_map | ((n < 32)? (1 << n) : 1);
+ if (!is_anchored(scode, options, new_map, backref_map)) return FALSE;
+ }
+
+ /* Other brackets */
+
+ else if (op == OP_ASSERT || op == OP_ONCE || op == OP_COND)
+ {
+ if (!is_anchored(scode, options, bracket_map, backref_map)) return FALSE;
+ }
+
+ /* .* is not anchored unless DOTALL is set and it isn't in brackets that
+ are or may be referenced. */
+
+ else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR ||
+ op == OP_TYPEPOSSTAR) &&
+ (*options & PCRE_DOTALL) != 0)
+ {
+ if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE;
+ }
+
+ /* Check for explicit anchoring */
+
+ else if (op != OP_SOD && op != OP_SOM &&
+ ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC))
+ return FALSE;
+ code += GET(code, 1);
+ }
+while (*code == OP_ALT); /* Loop for each alternative */
+return TRUE;
+}
+
+
+
+/*************************************************
+* Check for starting with ^ or .* *
+*************************************************/
+
+/* This is called to find out if every branch starts with ^ or .* so that
+"first char" processing can be done to speed things up in multiline
+matching and for non-DOTALL patterns that start with .* (which must start at
+the beginning or after \n). As in the case of is_anchored() (see above), we
+have to take account of back references to capturing brackets that contain .*
+because in that case we can't make the assumption.
+
+Arguments:
+ code points to start of expression (the bracket)
+ bracket_map a bitmap of which brackets we are inside while testing; this
+ handles up to substring 31; after that we just have to take
+ the less precise approach
+ backref_map the back reference bitmap
+
+Returns: TRUE or FALSE
+*/
+
+static BOOL
+is_startline(const uschar *code, unsigned int bracket_map,
+ unsigned int backref_map)
+{
+do {
+ const uschar *scode = first_significant_code(code + _pcre_OP_lengths[*code],
+ NULL, 0, FALSE);
+ register int op = *scode;
+
+ /* Non-capturing brackets */
+
+ if (op == OP_BRA)
+ {
+ if (!is_startline(scode, bracket_map, backref_map)) return FALSE;
+ }
+
+ /* Capturing brackets */
+
+ else if (op == OP_CBRA)
+ {
+ int n = GET2(scode, 1+LINK_SIZE);
+ int new_map = bracket_map | ((n < 32)? (1 << n) : 1);
+ if (!is_startline(scode, new_map, backref_map)) return FALSE;
+ }
+
+ /* Other brackets */
+
+ else if (op == OP_ASSERT || op == OP_ONCE || op == OP_COND)
+ { if (!is_startline(scode, bracket_map, backref_map)) return FALSE; }
+
+ /* .* means "start at start or after \n" if it isn't in brackets that
+ may be referenced. */
+
+ else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR || op == OP_TYPEPOSSTAR)
+ {
+ if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE;
+ }
+
+ /* Check for explicit circumflex */
+
+ else if (op != OP_CIRC) return FALSE;
+
+ /* Move on to the next alternative */
+
+ code += GET(code, 1);
+ }
+while (*code == OP_ALT); /* Loop for each alternative */
+return TRUE;
+}
+
+
+
+/*************************************************
+* Check for asserted fixed first char *
+*************************************************/
+
+/* During compilation, the "first char" settings from forward assertions are
+discarded, because they can cause conflicts with actual literals that follow.
+However, if we end up without a first char setting for an unanchored pattern,
+it is worth scanning the regex to see if there is an initial asserted first
+char. If all branches start with the same asserted char, or with a bracket all
+of whose alternatives start with the same asserted char (recurse ad lib), then
+we return that char, otherwise -1.
+
+Arguments:
+ code points to start of expression (the bracket)
+ options pointer to the options (used to check casing changes)
+ inassert TRUE if in an assertion
+
+Returns: -1 or the fixed first char
+*/
+
+static int
+find_firstassertedchar(const uschar *code, int *options, BOOL inassert)
+{
+register int c = -1;
+do {
+ int d;
+ const uschar *scode =
+ first_significant_code(code + 1+LINK_SIZE, options, PCRE_CASELESS, TRUE);
+ register int op = *scode;
+
+ switch(op)
+ {
+ default:
+ return -1;
+
+ case OP_BRA:
+ case OP_CBRA:
+ case OP_ASSERT:
+ case OP_ONCE:
+ case OP_COND:
+ if ((d = find_firstassertedchar(scode, options, op == OP_ASSERT)) < 0)
+ return -1;
+ if (c < 0) c = d; else if (c != d) return -1;
+ break;
+
+ case OP_EXACT: /* Fall through */
+ scode += 2;
+
+ case OP_CHAR:
+ case OP_CHARNC:
+ case OP_PLUS:
+ case OP_MINPLUS:
+ case OP_POSPLUS:
+ if (!inassert) return -1;
+ if (c < 0)
+ {
+ c = scode[1];
+ if ((*options & PCRE_CASELESS) != 0) c |= REQ_CASELESS;
+ }
+ else if (c != scode[1]) return -1;
+ break;
+ }
+
+ code += GET(code, 1);
+ }
+while (*code == OP_ALT);
+return c;
+}
+
+
+
+/*************************************************
+* Compile a Regular Expression *
+*************************************************/
+
+/* This function takes a string and returns a pointer to a block of store
+holding a compiled version of the expression. The original API for this
+function had no error code return variable; it is retained for backwards
+compatibility. The new function is given a new name.
+
+Arguments:
+ pattern the regular expression
+ options various option bits
+ errorcodeptr pointer to error code variable (pcre_compile2() only)
+ can be NULL if you don't want a code value
+ errorptr pointer to pointer to error text
+ erroroffset ptr offset in pattern where error was detected
+ tables pointer to character tables or NULL
+
+Returns: pointer to compiled data block, or NULL on error,
+ with errorptr and erroroffset set
+*/
+
+PCRE_DATA_SCOPE pcre *
+pcre_compile(const char *pattern, int options, const char **errorptr,
+ int *erroroffset, const unsigned char *tables)
+{
+return pcre_compile2(pattern, options, NULL, errorptr, erroroffset, tables);
+}
+
+
+PCRE_DATA_SCOPE pcre *
+pcre_compile2(const char *pattern, int options, int *errorcodeptr,
+ const char **errorptr, int *erroroffset, const unsigned char *tables)
+{
+real_pcre *re;
+int length = 1; /* For final END opcode */
+int firstbyte, reqbyte, newline;
+int errorcode = 0;
+#ifdef SUPPORT_UTF8
+BOOL utf8;
+#endif
+size_t size;
+uschar *code;
+const uschar *codestart;
+const uschar *ptr;
+compile_data compile_block;
+compile_data *cd = &compile_block;
+
+/* This space is used for "compiling" into during the first phase, when we are
+computing the amount of memory that is needed. Compiled items are thrown away
+as soon as possible, so that a fairly large buffer should be sufficient for
+this purpose. The same space is used in the second phase for remembering where
+to fill in forward references to subpatterns. */
+
+uschar cworkspace[COMPILE_WORK_SIZE];
+
+
+/* Set this early so that early errors get offset 0. */
+
+ptr = (const uschar *)pattern;
+
+/* We can't pass back an error message if errorptr is NULL; I guess the best we
+can do is just return NULL, but we can set a code value if there is a code
+pointer. */
+
+if (errorptr == NULL)
+ {
+ if (errorcodeptr != NULL) *errorcodeptr = 99;
+ return NULL;
+ }
+
+*errorptr = NULL;
+if (errorcodeptr != NULL) *errorcodeptr = ERR0;
+
+/* However, we can give a message for this error */
+
+if (erroroffset == NULL)
+ {
+ errorcode = ERR16;
+ goto PCRE_EARLY_ERROR_RETURN;
+ }
+
+*erroroffset = 0;
+
+/* Can't support UTF8 unless PCRE has been compiled to include the code. */
+
+#ifdef SUPPORT_UTF8
+utf8 = (options & PCRE_UTF8) != 0;
+if (utf8 && (options & PCRE_NO_UTF8_CHECK) == 0 &&
+ (*erroroffset = _pcre_valid_utf8((uschar *)pattern, -1)) >= 0)
+ {
+ errorcode = ERR44;
+ goto PCRE_UTF8_ERROR_RETURN;
+ }
+#else
+if ((options & PCRE_UTF8) != 0)
+ {
+ errorcode = ERR32;
+ goto PCRE_EARLY_ERROR_RETURN;
+ }
+#endif
+
+if ((options & ~PUBLIC_OPTIONS) != 0)
+ {
+ errorcode = ERR17;
+ goto PCRE_EARLY_ERROR_RETURN;
+ }
+
+/* Set up pointers to the individual character tables */
+
+if (tables == NULL) tables = _pcre_default_tables;
+cd->lcc = tables + lcc_offset;
+cd->fcc = tables + fcc_offset;
+cd->cbits = tables + cbits_offset;
+cd->ctypes = tables + ctypes_offset;
+
+/* Handle different types of newline. The three bits give seven cases. The
+current code allows for fixed one- or two-byte sequences, plus "any". */
+
+switch (options & (PCRE_NEWLINE_CRLF | PCRE_NEWLINE_ANY))
+ {
+ case 0: newline = NEWLINE; break; /* Compile-time default */
+ case PCRE_NEWLINE_CR: newline = '\r'; break;
+ case PCRE_NEWLINE_LF: newline = '\n'; break;
+ case PCRE_NEWLINE_CR+
+ PCRE_NEWLINE_LF: newline = ('\r' << 8) | '\n'; break;
+ case PCRE_NEWLINE_ANY: newline = -1; break;
+ default: errorcode = ERR56; goto PCRE_EARLY_ERROR_RETURN;
+ }
+
+if (newline < 0)
+ {
+ cd->nltype = NLTYPE_ANY;
+ }
+else
+ {
+ cd->nltype = NLTYPE_FIXED;
+ if (newline > 255)
+ {
+ cd->nllen = 2;
+ cd->nl[0] = (newline >> 8) & 255;
+ cd->nl[1] = newline & 255;
+ }
+ else
+ {
+ cd->nllen = 1;
+ cd->nl[0] = newline;
+ }
+ }
+
+/* Maximum back reference and backref bitmap. The bitmap records up to 31 back
+references to help in deciding whether (.*) can be treated as anchored or not.
+*/
+
+cd->top_backref = 0;
+cd->backref_map = 0;
+
+/* Reflect pattern for debugging output */
+
+DPRINTF(("------------------------------------------------------------------\n"));
+DPRINTF(("%s\n", pattern));
+
+/* Pretend to compile the pattern while actually just accumulating the length
+of memory required. This behaviour is triggered by passing a non-NULL final
+argument to compile_regex(). We pass a block of workspace (cworkspace) for it
+to compile parts of the pattern into; the compiled code is discarded when it is
+no longer needed, so hopefully this workspace will never overflow, though there
+is a test for its doing so. */
+
+cd->bracount = 0;
+cd->names_found = 0;
+cd->name_entry_size = 0;
+cd->name_table = NULL;
+cd->start_workspace = cworkspace;
+cd->start_code = cworkspace;
+cd->hwm = cworkspace;
+cd->start_pattern = (const uschar *)pattern;
+cd->end_pattern = (const uschar *)(pattern + strlen(pattern));
+cd->req_varyopt = 0;
+cd->nopartial = FALSE;
+cd->external_options = options;
+
+/* Now do the pre-compile. On error, errorcode will be set non-zero, so we
+don't need to look at the result of the function here. The initial options have
+been put into the cd block so that they can be changed if an option setting is
+found within the regex right at the beginning. Bringing initial option settings
+outside can help speed up starting point checks. */
+
+code = cworkspace;
+*code = OP_BRA;
+(void)compile_regex(cd->external_options, cd->external_options & PCRE_IMS,
+ &code, &ptr, &errorcode, FALSE, 0, &firstbyte, &reqbyte, NULL, cd, &length);
+if (errorcode != 0) goto PCRE_EARLY_ERROR_RETURN;
+
+DPRINTF(("end pre-compile: length=%d workspace=%d\n", length,
+ cd->hwm - cworkspace));
+
+if (length > MAX_PATTERN_SIZE)
+ {
+ errorcode = ERR20;
+ goto PCRE_EARLY_ERROR_RETURN;
+ }
+
+/* Compute the size of data block needed and get it, either from malloc or
+externally provided function. Integer overflow should no longer be possible
+because nowadays we limit the maximum value of cd->names_found and
+cd->name_entry_size. */
+
+size = length + sizeof(real_pcre) + cd->names_found * (cd->name_entry_size + 3);
+re = (real_pcre *)(pcre_malloc)(size);
+
+if (re == NULL)
+ {
+ errorcode = ERR21;
+ goto PCRE_EARLY_ERROR_RETURN;
+ }
+
+/* Put in the magic number, and save the sizes, initial options, and character
+table pointer. NULL is used for the default character tables. The nullpad field
+is at the end; it's there to help in the case when a regex compiled on a system
+with 4-byte pointers is run on another with 8-byte pointers. */
+
+re->magic_number = MAGIC_NUMBER;
+re->size = size;
+re->options = cd->external_options;
+re->dummy1 = 0;
+re->first_byte = 0;
+re->req_byte = 0;
+re->name_table_offset = sizeof(real_pcre);
+re->name_entry_size = cd->name_entry_size;
+re->name_count = cd->names_found;
+re->ref_count = 0;
+re->tables = (tables == _pcre_default_tables)? NULL : tables;
+re->nullpad = NULL;
+
+/* The starting points of the name/number translation table and of the code are
+passed around in the compile data block. The start/end pattern and initial
+options are already set from the pre-compile phase, as is the name_entry_size
+field. Reset the bracket count and the names_found field. Also reset the hwm
+field; this time it's used for remembering forward references to subpatterns.
+*/
+
+cd->bracount = 0;
+cd->names_found = 0;
+cd->name_table = (uschar *)re + re->name_table_offset;
+codestart = cd->name_table + re->name_entry_size * re->name_count;
+cd->start_code = codestart;
+cd->hwm = cworkspace;
+cd->req_varyopt = 0;
+cd->nopartial = FALSE;
+
+/* Set up a starting, non-extracting bracket, then compile the expression. On
+error, errorcode will be set non-zero, so we don't need to look at the result
+of the function here. */
+
+ptr = (const uschar *)pattern;
+code = (uschar *)codestart;
+*code = OP_BRA;
+(void)compile_regex(re->options, re->options & PCRE_IMS, &code, &ptr,
+ &errorcode, FALSE, 0, &firstbyte, &reqbyte, NULL, cd, NULL);
+re->top_bracket = cd->bracount;
+re->top_backref = cd->top_backref;
+
+if (cd->nopartial) re->options |= PCRE_NOPARTIAL;
+
+/* If not reached end of pattern on success, there's an excess bracket. */
+
+if (errorcode == 0 && *ptr != 0) errorcode = ERR22;
+
+/* Fill in the terminating state and check for disastrous overflow, but
+if debugging, leave the test till after things are printed out. */
+
+*code++ = OP_END;
+
+#ifndef DEBUG
+if (code - codestart > length) errorcode = ERR23;
+#endif
+
+/* Fill in any forward references that are required. */
+
+while (errorcode == 0 && cd->hwm > cworkspace)
+ {
+ int offset, recno;
+ const uschar *groupptr;
+ cd->hwm -= LINK_SIZE;
+ offset = GET(cd->hwm, 0);
+ recno = GET(codestart, offset);
+ groupptr = find_bracket(codestart, (re->options & PCRE_UTF8) != 0, recno);
+ if (groupptr == NULL) errorcode = ERR53;
+ else PUT(((uschar *)codestart), offset, groupptr - codestart);
+ }
+
+/* Give an error if there's back reference to a non-existent capturing
+subpattern. */
+
+if (errorcode == 0 && re->top_backref > re->top_bracket) errorcode = ERR15;
+
+/* Failed to compile, or error while post-processing */
+
+if (errorcode != 0)
+ {
+ (pcre_free)(re);
+ PCRE_EARLY_ERROR_RETURN:
+ *erroroffset = ptr - (const uschar *)pattern;
+#ifdef SUPPORT_UTF8
+ PCRE_UTF8_ERROR_RETURN:
+#endif
+ *errorptr = error_texts + error_texts_offsets[errorcode];
+ if (errorcodeptr != NULL) *errorcodeptr = errorcode;
+ return NULL;
+ }
+
+/* If the anchored option was not passed, set the flag if we can determine that
+the pattern is anchored by virtue of ^ characters or \A or anything else (such
+as starting with .* when DOTALL is set).
+
+Otherwise, if we know what the first byte has to be, save it, because that
+speeds up unanchored matches no end. If not, see if we can set the
+PCRE_STARTLINE flag. This is helpful for multiline matches when all branches
+start with ^. and also when all branches start with .* for non-DOTALL matches.
+*/
+
+if ((re->options & PCRE_ANCHORED) == 0)
+ {
+ int temp_options = re->options; /* May get changed during these scans */
+ if (is_anchored(codestart, &temp_options, 0, cd->backref_map))
+ re->options |= PCRE_ANCHORED;
+ else
+ {
+ if (firstbyte < 0)
+ firstbyte = find_firstassertedchar(codestart, &temp_options, FALSE);
+ if (firstbyte >= 0) /* Remove caseless flag for non-caseable chars */
+ {
+ int ch = firstbyte & 255;
+ re->first_byte = ((firstbyte & REQ_CASELESS) != 0 &&
+ cd->fcc[ch] == ch)? ch : firstbyte;
+ re->options |= PCRE_FIRSTSET;
+ }
+ else if (is_startline(codestart, 0, cd->backref_map))
+ re->options |= PCRE_STARTLINE;
+ }
+ }
+
+/* For an anchored pattern, we use the "required byte" only if it follows a
+variable length item in the regex. Remove the caseless flag for non-caseable
+bytes. */
+
+if (reqbyte >= 0 &&
+ ((re->options & PCRE_ANCHORED) == 0 || (reqbyte & REQ_VARY) != 0))
+ {
+ int ch = reqbyte & 255;
+ re->req_byte = ((reqbyte & REQ_CASELESS) != 0 &&
+ cd->fcc[ch] == ch)? (reqbyte & ~REQ_CASELESS) : reqbyte;
+ re->options |= PCRE_REQCHSET;
+ }
+
+/* Print out the compiled data if debugging is enabled. This is never the
+case when building a production library. */
+
+#ifdef DEBUG
+
+printf("Length = %d top_bracket = %d top_backref = %d\n",
+ length, re->top_bracket, re->top_backref);
+
+if (re->options != 0)
+ {
+ printf("%s%s%s%s%s%s%s%s%s\n",
+ ((re->options & PCRE_NOPARTIAL) != 0)? "nopartial " : "",
+ ((re->options & PCRE_ANCHORED) != 0)? "anchored " : "",
+ ((re->options & PCRE_CASELESS) != 0)? "caseless " : "",
+ ((re->options & PCRE_EXTENDED) != 0)? "extended " : "",
+ ((re->options & PCRE_MULTILINE) != 0)? "multiline " : "",
+ ((re->options & PCRE_DOTALL) != 0)? "dotall " : "",
+ ((re->options & PCRE_DOLLAR_ENDONLY) != 0)? "endonly " : "",
+ ((re->options & PCRE_EXTRA) != 0)? "extra " : "",
+ ((re->options & PCRE_UNGREEDY) != 0)? "ungreedy " : "");
+ }
+
+if ((re->options & PCRE_FIRSTSET) != 0)
+ {
+ int ch = re->first_byte & 255;
+ const char *caseless = ((re->first_byte & REQ_CASELESS) == 0)?
+ "" : " (caseless)";
+ if (isprint(ch)) printf("First char = %c%s\n", ch, caseless);
+ else printf("First char = \\x%02x%s\n", ch, caseless);
+ }
+
+if ((re->options & PCRE_REQCHSET) != 0)
+ {
+ int ch = re->req_byte & 255;
+ const char *caseless = ((re->req_byte & REQ_CASELESS) == 0)?
+ "" : " (caseless)";
+ if (isprint(ch)) printf("Req char = %c%s\n", ch, caseless);
+ else printf("Req char = \\x%02x%s\n", ch, caseless);
+ }
+
+pcre_printint(re, stdout);
+
+/* This check is done here in the debugging case so that the code that
+was compiled can be seen. */
+
+if (code - codestart > length)
+ {
+ (pcre_free)(re);
+ *errorptr = error_texts + error_texts_offsets[ERR23];
+ *erroroffset = ptr - (uschar *)pattern;
+ if (errorcodeptr != NULL) *errorcodeptr = ERR23;
+ return NULL;
+ }
+#endif /* DEBUG */
+
+return (pcre *)re;
+}
+
+/* End of pcre_compile.c */
diff --git a/trunk/glib/pcre/pcre_config.c b/trunk/glib/pcre/pcre_config.c
new file mode 100644
index 000000000..29e6c1a35
--- /dev/null
+++ b/trunk/glib/pcre/pcre_config.c
@@ -0,0 +1,116 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_config(). */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+* Return info about what features are configured *
+*************************************************/
+
+/* This function has an extensible interface so that additional items can be
+added compatibly.
+
+Arguments:
+ what what information is required
+ where where to put the information
+
+Returns: 0 if data returned, negative on error
+*/
+
+PCRE_DATA_SCOPE int
+pcre_config(int what, void *where)
+{
+switch (what)
+ {
+ case PCRE_CONFIG_UTF8:
+#ifdef SUPPORT_UTF8
+ *((int *)where) = 1;
+#else
+ *((int *)where) = 0;
+#endif
+ break;
+
+ case PCRE_CONFIG_UNICODE_PROPERTIES:
+#ifdef SUPPORT_UCP
+ *((int *)where) = 1;
+#else
+ *((int *)where) = 0;
+#endif
+ break;
+
+ case PCRE_CONFIG_NEWLINE:
+ *((int *)where) = NEWLINE;
+ break;
+
+ case PCRE_CONFIG_LINK_SIZE:
+ *((int *)where) = LINK_SIZE;
+ break;
+
+ case PCRE_CONFIG_POSIX_MALLOC_THRESHOLD:
+ *((int *)where) = POSIX_MALLOC_THRESHOLD;
+ break;
+
+ case PCRE_CONFIG_MATCH_LIMIT:
+ *((unsigned int *)where) = MATCH_LIMIT;
+ break;
+
+ case PCRE_CONFIG_MATCH_LIMIT_RECURSION:
+ *((unsigned int *)where) = MATCH_LIMIT_RECURSION;
+ break;
+
+ case PCRE_CONFIG_STACKRECURSE:
+#ifdef NO_RECURSE
+ *((int *)where) = 0;
+#else
+ *((int *)where) = 1;
+#endif
+ break;
+
+ default: return PCRE_ERROR_BADOPTION;
+ }
+
+return 0;
+}
+
+/* End of pcre_config.c */
diff --git a/trunk/glib/pcre/pcre_dfa_exec.c b/trunk/glib/pcre/pcre_dfa_exec.c
new file mode 100644
index 000000000..5f1301fce
--- /dev/null
+++ b/trunk/glib/pcre/pcre_dfa_exec.c
@@ -0,0 +1,2433 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_dfa_exec(), which is an
+alternative matching function that uses a sort of DFA algorithm (not a true
+FSM). This is NOT Perl- compatible, but it has advantages in certain
+applications. */
+
+
+#define NLBLOCK md /* Block containing newline information */
+#define PSSTART start_subject /* Field containing processed string start */
+#define PSEND end_subject /* Field containing processed string end */
+
+#include "pcre_internal.h"
+
+
+/* For use to indent debugging output */
+
+#define SP " "
+
+
+
+/*************************************************
+* Code parameters and static tables *
+*************************************************/
+
+/* These are offsets that are used to turn the OP_TYPESTAR and friends opcodes
+into others, under special conditions. A gap of 20 between the blocks should be
+enough. */
+
+#define OP_PROP_EXTRA 100
+#define OP_EXTUNI_EXTRA 120
+#define OP_ANYNL_EXTRA 140
+
+
+/* This table identifies those opcodes that are followed immediately by a
+character that is to be tested in some way. This makes is possible to
+centralize the loading of these characters. In the case of Type * etc, the
+"character" is the opcode for \D, \d, \S, \s, \W, or \w, which will always be a
+small value. */
+
+static uschar coptable[] = {
+ 0, /* End */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* \A, \G, \B, \b, \D, \d, \S, \s, \W, \w */
+ 0, 0, /* Any, Anybyte */
+ 0, 0, 0, 0, /* NOTPROP, PROP, EXTUNI, ANYNL */
+ 0, 0, 0, 0, 0, /* \Z, \z, Opt, ^, $ */
+ 1, /* Char */
+ 1, /* Charnc */
+ 1, /* not */
+ /* Positive single-char repeats */
+ 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */
+ 3, 3, 3, /* upto, minupto, exact */
+ 1, 1, 1, 3, /* *+, ++, ?+, upto+ */
+ /* Negative single-char repeats - only for chars < 256 */
+ 1, 1, 1, 1, 1, 1, /* NOT *, *?, +, +?, ?, ?? */
+ 3, 3, 3, /* NOT upto, minupto, exact */
+ 1, 1, 1, 3, /* NOT *+, ++, ?+, updo+ */
+ /* Positive type repeats */
+ 1, 1, 1, 1, 1, 1, /* Type *, *?, +, +?, ?, ?? */
+ 3, 3, 3, /* Type upto, minupto, exact */
+ 1, 1, 1, 3, /* Type *+, ++, ?+, upto+ */
+ /* Character class & ref repeats */
+ 0, 0, 0, 0, 0, 0, /* *, *?, +, +?, ?, ?? */
+ 0, 0, /* CRRANGE, CRMINRANGE */
+ 0, /* CLASS */
+ 0, /* NCLASS */
+ 0, /* XCLASS - variable length */
+ 0, /* REF */
+ 0, /* RECURSE */
+ 0, /* CALLOUT */
+ 0, /* Alt */
+ 0, /* Ket */
+ 0, /* KetRmax */
+ 0, /* KetRmin */
+ 0, /* Assert */
+ 0, /* Assert not */
+ 0, /* Assert behind */
+ 0, /* Assert behind not */
+ 0, /* Reverse */
+ 0, 0, 0, 0, /* ONCE, BRA, CBRA, COND */
+ 0, 0, 0, /* SBRA, SCBRA, SCOND */
+ 0, /* CREF */
+ 0, /* RREF */
+ 0, /* DEF */
+ 0, 0 /* BRAZERO, BRAMINZERO */
+};
+
+/* These 2 tables allow for compact code for testing for \D, \d, \S, \s, \W,
+and \w */
+
+static uschar toptable1[] = {
+ 0, 0, 0, 0, 0,
+ ctype_digit, ctype_digit,
+ ctype_space, ctype_space,
+ ctype_word, ctype_word,
+ 0 /* OP_ANY */
+};
+
+static uschar toptable2[] = {
+ 0, 0, 0, 0, 0,
+ ctype_digit, 0,
+ ctype_space, 0,
+ ctype_word, 0,
+ 1 /* OP_ANY */
+};
+
+
+/* Structure for holding data about a particular state, which is in effect the
+current data for an active path through the match tree. It must consist
+entirely of ints because the working vector we are passed, and which we put
+these structures in, is a vector of ints. */
+
+typedef struct stateblock {
+ int offset; /* Offset to opcode */
+ int count; /* Count for repeats */
+ int ims; /* ims flag bits */
+ int data; /* Some use extra data */
+} stateblock;
+
+#define INTS_PER_STATEBLOCK (sizeof(stateblock)/sizeof(int))
+
+
+#ifdef DEBUG
+/*************************************************
+* Print character string *
+*************************************************/
+
+/* Character string printing function for debugging.
+
+Arguments:
+ p points to string
+ length number of bytes
+ f where to print
+
+Returns: nothing
+*/
+
+static void
+pchars(unsigned char *p, int length, FILE *f)
+{
+int c;
+while (length-- > 0)
+ {
+ if (isprint(c = *(p++)))
+ fprintf(f, "%c", c);
+ else
+ fprintf(f, "\\x%02x", c);
+ }
+}
+#endif
+
+
+
+/*************************************************
+* Execute a Regular Expression - DFA engine *
+*************************************************/
+
+/* This internal function applies a compiled pattern to a subject string,
+starting at a given point, using a DFA engine. This function is called from the
+external one, possibly multiple times if the pattern is not anchored. The
+function calls itself recursively for some kinds of subpattern.
+
+Arguments:
+ md the match_data block with fixed information
+ this_start_code the opening bracket of this subexpression's code
+ current_subject where we currently are in the subject string
+ start_offset start offset in the subject string
+ offsets vector to contain the matching string offsets
+ offsetcount size of same
+ workspace vector of workspace
+ wscount size of same
+ ims the current ims flags
+ rlevel function call recursion level
+ recursing regex recursive call level
+
+Returns: > 0 =>
+ = 0 =>
+ -1 => failed to match
+ < -1 => some kind of unexpected problem
+
+The following macros are used for adding states to the two state vectors (one
+for the current character, one for the following character). */
+
+#define ADD_ACTIVE(x,y) \
+ if (active_count++ < wscount) \
+ { \
+ next_active_state->offset = (x); \
+ next_active_state->count = (y); \
+ next_active_state->ims = ims; \
+ next_active_state++; \
+ DPRINTF(("%.*sADD_ACTIVE(%d,%d)\n", rlevel*2-2, SP, (x), (y))); \
+ } \
+ else return PCRE_ERROR_DFA_WSSIZE
+
+#define ADD_ACTIVE_DATA(x,y,z) \
+ if (active_count++ < wscount) \
+ { \
+ next_active_state->offset = (x); \
+ next_active_state->count = (y); \
+ next_active_state->ims = ims; \
+ next_active_state->data = (z); \
+ next_active_state++; \
+ DPRINTF(("%.*sADD_ACTIVE_DATA(%d,%d,%d)\n", rlevel*2-2, SP, (x), (y), (z))); \
+ } \
+ else return PCRE_ERROR_DFA_WSSIZE
+
+#define ADD_NEW(x,y) \
+ if (new_count++ < wscount) \
+ { \
+ next_new_state->offset = (x); \
+ next_new_state->count = (y); \
+ next_new_state->ims = ims; \
+ next_new_state++; \
+ DPRINTF(("%.*sADD_NEW(%d,%d)\n", rlevel*2-2, SP, (x), (y))); \
+ } \
+ else return PCRE_ERROR_DFA_WSSIZE
+
+#define ADD_NEW_DATA(x,y,z) \
+ if (new_count++ < wscount) \
+ { \
+ next_new_state->offset = (x); \
+ next_new_state->count = (y); \
+ next_new_state->ims = ims; \
+ next_new_state->data = (z); \
+ next_new_state++; \
+ DPRINTF(("%.*sADD_NEW_DATA(%d,%d,%d)\n", rlevel*2-2, SP, (x), (y), (z))); \
+ } \
+ else return PCRE_ERROR_DFA_WSSIZE
+
+/* And now, here is the code */
+
+static int
+internal_dfa_exec(
+ dfa_match_data *md,
+ const uschar *this_start_code,
+ const uschar *current_subject,
+ int start_offset,
+ int *offsets,
+ int offsetcount,
+ int *workspace,
+ int wscount,
+ int ims,
+ int rlevel,
+ int recursing)
+{
+stateblock *active_states, *new_states, *temp_states;
+stateblock *next_active_state, *next_new_state;
+
+const uschar *ctypes, *lcc, *fcc;
+const uschar *ptr;
+const uschar *end_code, *first_op;
+
+int active_count, new_count, match_count;
+
+/* Some fields in the md block are frequently referenced, so we load them into
+independent variables in the hope that this will perform better. */
+
+const uschar *start_subject = md->start_subject;
+const uschar *end_subject = md->end_subject;
+const uschar *start_code = md->start_code;
+
+#ifdef SUPPORT_UTF8
+BOOL utf8 = (md->poptions & PCRE_UTF8) != 0;
+#else
+BOOL utf8 = FALSE;
+#endif
+
+rlevel++;
+offsetcount &= (-2);
+
+wscount -= 2;
+wscount = (wscount - (wscount % (INTS_PER_STATEBLOCK * 2))) /
+ (2 * INTS_PER_STATEBLOCK);
+
+DPRINTF(("\n%.*s---------------------\n"
+ "%.*sCall to internal_dfa_exec f=%d r=%d\n",
+ rlevel*2-2, SP, rlevel*2-2, SP, rlevel, recursing));
+
+ctypes = md->tables + ctypes_offset;
+lcc = md->tables + lcc_offset;
+fcc = md->tables + fcc_offset;
+
+match_count = PCRE_ERROR_NOMATCH; /* A negative number */
+
+active_states = (stateblock *)(workspace + 2);
+next_new_state = new_states = active_states + wscount;
+new_count = 0;
+
+first_op = this_start_code + 1 + LINK_SIZE +
+ ((*this_start_code == OP_CBRA || *this_start_code == OP_SCBRA)? 2:0);
+
+/* The first thing in any (sub) pattern is a bracket of some sort. Push all
+the alternative states onto the list, and find out where the end is. This
+makes is possible to use this function recursively, when we want to stop at a
+matching internal ket rather than at the end.
+
+If the first opcode in the first alternative is OP_REVERSE, we are dealing with
+a backward assertion. In that case, we have to find out the maximum amount to
+move back, and set up each alternative appropriately. */
+
+if (*first_op == OP_REVERSE)
+ {
+ int max_back = 0;
+ int gone_back;
+
+ end_code = this_start_code;
+ do
+ {
+ int back = GET(end_code, 2+LINK_SIZE);
+ if (back > max_back) max_back = back;
+ end_code += GET(end_code, 1);
+ }
+ while (*end_code == OP_ALT);
+
+ /* If we can't go back the amount required for the longest lookbehind
+ pattern, go back as far as we can; some alternatives may still be viable. */
+
+#ifdef SUPPORT_UTF8
+ /* In character mode we have to step back character by character */
+
+ if (utf8)
+ {
+ for (gone_back = 0; gone_back < max_back; gone_back++)
+ {
+ if (current_subject <= start_subject) break;
+ current_subject--;
+ while (current_subject > start_subject &&
+ (*current_subject & 0xc0) == 0x80)
+ current_subject--;
+ }
+ }
+ else
+#endif
+
+ /* In byte-mode we can do this quickly. */
+
+ {
+ gone_back = (current_subject - max_back < start_subject)?
+ current_subject - start_subject : max_back;
+ current_subject -= gone_back;
+ }
+
+ /* Now we can process the individual branches. */
+
+ end_code = this_start_code;
+ do
+ {
+ int back = GET(end_code, 2+LINK_SIZE);
+ if (back <= gone_back)
+ {
+ int bstate = end_code - start_code + 2 + 2*LINK_SIZE;
+ ADD_NEW_DATA(-bstate, 0, gone_back - back);
+ }
+ end_code += GET(end_code, 1);
+ }
+ while (*end_code == OP_ALT);
+ }
+
+/* This is the code for a "normal" subpattern (not a backward assertion). The
+start of a whole pattern is always one of these. If we are at the top level,
+we may be asked to restart matching from the same point that we reached for a
+previous partial match. We still have to scan through the top-level branches to
+find the end state. */
+
+else
+ {
+ end_code = this_start_code;
+
+ /* Restarting */
+
+ if (rlevel == 1 && (md->moptions & PCRE_DFA_RESTART) != 0)
+ {
+ do { end_code += GET(end_code, 1); } while (*end_code == OP_ALT);
+ new_count = workspace[1];
+ if (!workspace[0])
+ memcpy(new_states, active_states, new_count * sizeof(stateblock));
+ }
+
+ /* Not restarting */
+
+ else
+ {
+ int length = 1 + LINK_SIZE +
+ ((*this_start_code == OP_CBRA || *this_start_code == OP_SCBRA)? 2:0);
+ do
+ {
+ ADD_NEW(end_code - start_code + length, 0);
+ end_code += GET(end_code, 1);
+ length = 1 + LINK_SIZE;
+ }
+ while (*end_code == OP_ALT);
+ }
+ }
+
+workspace[0] = 0; /* Bit indicating which vector is current */
+
+DPRINTF(("%.*sEnd state = %d\n", rlevel*2-2, SP, end_code - start_code));
+
+/* Loop for scanning the subject */
+
+ptr = current_subject;
+for (;;)
+ {
+ int i, j;
+ int clen, dlen;
+ unsigned int c, d;
+
+ /* Make the new state list into the active state list and empty the
+ new state list. */
+
+ temp_states = active_states;
+ active_states = new_states;
+ new_states = temp_states;
+ active_count = new_count;
+ new_count = 0;
+
+ workspace[0] ^= 1; /* Remember for the restarting feature */
+ workspace[1] = active_count;
+
+#ifdef DEBUG
+ printf("%.*sNext character: rest of subject = \"", rlevel*2-2, SP);
+ pchars((uschar *)ptr, strlen((char *)ptr), stdout);
+ printf("\"\n");
+
+ printf("%.*sActive states: ", rlevel*2-2, SP);
+ for (i = 0; i < active_count; i++)
+ printf("%d/%d ", active_states[i].offset, active_states[i].count);
+ printf("\n");
+#endif
+
+ /* Set the pointers for adding new states */
+
+ next_active_state = active_states + active_count;
+ next_new_state = new_states;
+
+ /* Load the current character from the subject outside the loop, as many
+ different states may want to look at it, and we assume that at least one
+ will. */
+
+ if (ptr < end_subject)
+ {
+ clen = 1; /* Number of bytes in the character */
+#ifdef SUPPORT_UTF8
+ if (utf8) { GETCHARLEN(c, ptr, clen); } else
+#endif /* SUPPORT_UTF8 */
+ c = *ptr;
+ }
+ else
+ {
+ clen = 0; /* This indicates the end of the subject */
+ c = NOTACHAR; /* This value should never actually be used */
+ }
+
+ /* Scan up the active states and act on each one. The result of an action
+ may be to add more states to the currently active list (e.g. on hitting a
+ parenthesis) or it may be to put states on the new list, for considering
+ when we move the character pointer on. */
+
+ for (i = 0; i < active_count; i++)
+ {
+ stateblock *current_state = active_states + i;
+ const uschar *code;
+ int state_offset = current_state->offset;
+ int count, codevalue;
+ int chartype, script;
+
+#ifdef DEBUG
+ printf ("%.*sProcessing state %d c=", rlevel*2-2, SP, state_offset);
+ if (clen == 0) printf("EOL\n");
+ else if (c > 32 && c < 127) printf("'%c'\n", c);
+ else printf("0x%02x\n", c);
+#endif
+
+ /* This variable is referred to implicity in the ADD_xxx macros. */
+
+ ims = current_state->ims;
+
+ /* A negative offset is a special case meaning "hold off going to this
+ (negated) state until the number of characters in the data field have
+ been skipped". */
+
+ if (state_offset < 0)
+ {
+ if (current_state->data > 0)
+ {
+ DPRINTF(("%.*sSkipping this character\n", rlevel*2-2, SP));
+ ADD_NEW_DATA(state_offset, current_state->count,
+ current_state->data - 1);
+ continue;
+ }
+ else
+ {
+ current_state->offset = state_offset = -state_offset;
+ }
+ }
+
+ /* Check for a duplicate state with the same count, and skip if found. */
+
+ for (j = 0; j < i; j++)
+ {
+ if (active_states[j].offset == state_offset &&
+ active_states[j].count == current_state->count)
+ {
+ DPRINTF(("%.*sDuplicate state: skipped\n", rlevel*2-2, SP));
+ goto NEXT_ACTIVE_STATE;
+ }
+ }
+
+ /* The state offset is the offset to the opcode */
+
+ code = start_code + state_offset;
+ codevalue = *code;
+
+ /* If this opcode is followed by an inline character, load it. It is
+ tempting to test for the presence of a subject character here, but that
+ is wrong, because sometimes zero repetitions of the subject are
+ permitted.
+
+ We also use this mechanism for opcodes such as OP_TYPEPLUS that take an
+ argument that is not a data character - but is always one byte long.
+ Unfortunately, we have to take special action to deal with \P, \p, and
+ \X in this case. To keep the other cases fast, convert these ones to new
+ opcodes. */
+
+ if (coptable[codevalue] > 0)
+ {
+ dlen = 1;
+#ifdef SUPPORT_UTF8
+ if (utf8) { GETCHARLEN(d, (code + coptable[codevalue]), dlen); } else
+#endif /* SUPPORT_UTF8 */
+ d = code[coptable[codevalue]];
+ if (codevalue >= OP_TYPESTAR)
+ {
+ switch(d)
+ {
+ case OP_ANYBYTE: return PCRE_ERROR_DFA_UITEM;
+ case OP_NOTPROP:
+ case OP_PROP: codevalue += OP_PROP_EXTRA; break;
+ case OP_ANYNL: codevalue += OP_ANYNL_EXTRA; break;
+ case OP_EXTUNI: codevalue += OP_EXTUNI_EXTRA; break;
+ default: break;
+ }
+ }
+ }
+ else
+ {
+ dlen = 0; /* Not strictly necessary, but compilers moan */
+ d = NOTACHAR; /* if these variables are not set. */
+ }
+
+
+ /* Now process the individual opcodes */
+
+ switch (codevalue)
+ {
+
+/* ========================================================================== */
+ /* Reached a closing bracket. If not at the end of the pattern, carry
+ on with the next opcode. Otherwise, unless we have an empty string and
+ PCRE_NOTEMPTY is set, save the match data, shifting up all previous
+ matches so we always have the longest first. */
+
+ case OP_KET:
+ case OP_KETRMIN:
+ case OP_KETRMAX:
+ if (code != end_code)
+ {
+ ADD_ACTIVE(state_offset + 1 + LINK_SIZE, 0);
+ if (codevalue != OP_KET)
+ {
+ ADD_ACTIVE(state_offset - GET(code, 1), 0);
+ }
+ }
+ else if (ptr > current_subject || (md->moptions & PCRE_NOTEMPTY) == 0)
+ {
+ if (match_count < 0) match_count = (offsetcount >= 2)? 1 : 0;
+ else if (match_count > 0 && ++match_count * 2 >= offsetcount)
+ match_count = 0;
+ count = ((match_count == 0)? offsetcount : match_count * 2) - 2;
+ if (count > 0) memmove(offsets + 2, offsets, count * sizeof(int));
+ if (offsetcount >= 2)
+ {
+ offsets[0] = current_subject - start_subject;
+ offsets[1] = ptr - start_subject;
+ DPRINTF(("%.*sSet matched string = \"%.*s\"\n", rlevel*2-2, SP,
+ offsets[1] - offsets[0], current_subject));
+ }
+ if ((md->moptions & PCRE_DFA_SHORTEST) != 0)
+ {
+ DPRINTF(("%.*sEnd of internal_dfa_exec %d: returning %d\n"
+ "%.*s---------------------\n\n", rlevel*2-2, SP, rlevel,
+ match_count, rlevel*2-2, SP));
+ return match_count;
+ }
+ }
+ break;
+
+/* ========================================================================== */
+ /* These opcodes add to the current list of states without looking
+ at the current character. */
+
+ /*-----------------------------------------------------------------*/
+ case OP_ALT:
+ do { code += GET(code, 1); } while (*code == OP_ALT);
+ ADD_ACTIVE(code - start_code, 0);
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_BRA:
+ case OP_SBRA:
+ do
+ {
+ ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0);
+ code += GET(code, 1);
+ }
+ while (*code == OP_ALT);
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_CBRA:
+ case OP_SCBRA:
+ ADD_ACTIVE(code - start_code + 3 + LINK_SIZE, 0);
+ code += GET(code, 1);
+ while (*code == OP_ALT)
+ {
+ ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0);
+ code += GET(code, 1);
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_BRAZERO:
+ case OP_BRAMINZERO:
+ ADD_ACTIVE(state_offset + 1, 0);
+ code += 1 + GET(code, 2);
+ while (*code == OP_ALT) code += GET(code, 1);
+ ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0);
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_CIRC:
+ if ((ptr == start_subject && (md->moptions & PCRE_NOTBOL) == 0) ||
+ ((ims & PCRE_MULTILINE) != 0 &&
+ ptr != end_subject &&
+ WAS_NEWLINE(ptr)))
+ { ADD_ACTIVE(state_offset + 1, 0); }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_EOD:
+ if (ptr >= end_subject) { ADD_ACTIVE(state_offset + 1, 0); }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_OPT:
+ ims = code[1];
+ ADD_ACTIVE(state_offset + 2, 0);
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_SOD:
+ if (ptr == start_subject) { ADD_ACTIVE(state_offset + 1, 0); }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_SOM:
+ if (ptr == start_subject + start_offset) { ADD_ACTIVE(state_offset + 1, 0); }
+ break;
+
+
+/* ========================================================================== */
+ /* These opcodes inspect the next subject character, and sometimes
+ the previous one as well, but do not have an argument. The variable
+ clen contains the length of the current character and is zero if we are
+ at the end of the subject. */
+
+ /*-----------------------------------------------------------------*/
+ case OP_ANY:
+ if (clen > 0 && ((ims & PCRE_DOTALL) != 0 || !IS_NEWLINE(ptr)))
+ { ADD_NEW(state_offset + 1, 0); }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_EODN:
+ if (clen == 0 || (IS_NEWLINE(ptr) && ptr == end_subject - md->nllen))
+ { ADD_ACTIVE(state_offset + 1, 0); }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_DOLL:
+ if ((md->moptions & PCRE_NOTEOL) == 0)
+ {
+ if (clen == 0 ||
+ (IS_NEWLINE(ptr) &&
+ ((ims & PCRE_MULTILINE) != 0 || ptr == end_subject - md->nllen)
+ ))
+ { ADD_ACTIVE(state_offset + 1, 0); }
+ }
+ else if ((ims & PCRE_MULTILINE) != 0 && IS_NEWLINE(ptr))
+ { ADD_ACTIVE(state_offset + 1, 0); }
+ break;
+
+ /*-----------------------------------------------------------------*/
+
+ case OP_DIGIT:
+ case OP_WHITESPACE:
+ case OP_WORDCHAR:
+ if (clen > 0 && c < 256 &&
+ ((ctypes[c] & toptable1[codevalue]) ^ toptable2[codevalue]) != 0)
+ { ADD_NEW(state_offset + 1, 0); }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_NOT_DIGIT:
+ case OP_NOT_WHITESPACE:
+ case OP_NOT_WORDCHAR:
+ if (clen > 0 && (c >= 256 ||
+ ((ctypes[c] & toptable1[codevalue]) ^ toptable2[codevalue]) != 0))
+ { ADD_NEW(state_offset + 1, 0); }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_WORD_BOUNDARY:
+ case OP_NOT_WORD_BOUNDARY:
+ {
+ int left_word, right_word;
+
+ if (ptr > start_subject)
+ {
+ const uschar *temp = ptr - 1;
+#ifdef SUPPORT_UTF8
+ if (utf8) BACKCHAR(temp);
+#endif
+ GETCHARTEST(d, temp);
+ left_word = d < 256 && (ctypes[d] & ctype_word) != 0;
+ }
+ else left_word = 0;
+
+ if (clen > 0) right_word = c < 256 && (ctypes[c] & ctype_word) != 0;
+ else right_word = 0;
+
+ if ((left_word == right_word) == (codevalue == OP_NOT_WORD_BOUNDARY))
+ { ADD_ACTIVE(state_offset + 1, 0); }
+ }
+ break;
+
+
+#ifdef SUPPORT_UCP
+
+ /*-----------------------------------------------------------------*/
+ /* Check the next character by Unicode property. We will get here only
+ if the support is in the binary; otherwise a compile-time error occurs.
+ */
+
+ case OP_PROP:
+ case OP_NOTPROP:
+ if (clen > 0)
+ {
+ BOOL OK;
+ int category = _pcre_ucp_findprop(c, &chartype, &script);
+ switch(code[1])
+ {
+ case PT_ANY:
+ OK = TRUE;
+ break;
+
+ case PT_LAMP:
+ OK = chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt;
+ break;
+
+ case PT_GC:
+ OK = category == code[2];
+ break;
+
+ case PT_PC:
+ OK = chartype == code[2];
+ break;
+
+ case PT_SC:
+ OK = script == code[2];
+ break;
+
+ /* Should never occur, but keep compilers from grumbling. */
+
+ default:
+ OK = codevalue != OP_PROP;
+ break;
+ }
+
+ if (OK == (codevalue == OP_PROP)) { ADD_NEW(state_offset + 3, 0); }
+ }
+ break;
+#endif
+
+
+
+/* ========================================================================== */
+ /* These opcodes likewise inspect the subject character, but have an
+ argument that is not a data character. It is one of these opcodes:
+ OP_ANY, OP_DIGIT, OP_NOT_DIGIT, OP_WHITESPACE, OP_NOT_SPACE, OP_WORDCHAR,
+ OP_NOT_WORDCHAR. The value is loaded into d. */
+
+ case OP_TYPEPLUS:
+ case OP_TYPEMINPLUS:
+ case OP_TYPEPOSPLUS:
+ count = current_state->count; /* Already matched */
+ if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); }
+ if (clen > 0)
+ {
+ if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
+ (c < 256 &&
+ (d != OP_ANY ||
+ (ims & PCRE_DOTALL) != 0 ||
+ !IS_NEWLINE(ptr)
+ ) &&
+ ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
+ {
+ if (count > 0 && codevalue == OP_TYPEPOSPLUS)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ count++;
+ ADD_NEW(state_offset, count);
+ }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_TYPEQUERY:
+ case OP_TYPEMINQUERY:
+ case OP_TYPEPOSQUERY:
+ ADD_ACTIVE(state_offset + 2, 0);
+ if (clen > 0)
+ {
+ if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
+ (c < 256 &&
+ (d != OP_ANY ||
+ (ims & PCRE_DOTALL) != 0 ||
+ !IS_NEWLINE(ptr)
+ ) &&
+ ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
+ {
+ if (codevalue == OP_TYPEPOSQUERY)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ ADD_NEW(state_offset + 2, 0);
+ }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_TYPESTAR:
+ case OP_TYPEMINSTAR:
+ case OP_TYPEPOSSTAR:
+ ADD_ACTIVE(state_offset + 2, 0);
+ if (clen > 0)
+ {
+ if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
+ (c < 256 &&
+ (d != OP_ANY ||
+ (ims & PCRE_DOTALL) != 0 ||
+ !IS_NEWLINE(ptr)
+ ) &&
+ ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
+ {
+ if (codevalue == OP_TYPEPOSSTAR)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ ADD_NEW(state_offset, 0);
+ }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_TYPEEXACT:
+ count = current_state->count; /* Number already matched */
+ if (clen > 0)
+ {
+ if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
+ (c < 256 &&
+ (d != OP_ANY ||
+ (ims & PCRE_DOTALL) != 0 ||
+ !IS_NEWLINE(ptr)
+ ) &&
+ ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
+ {
+ if (++count >= GET2(code, 1))
+ { ADD_NEW(state_offset + 4, 0); }
+ else
+ { ADD_NEW(state_offset, count); }
+ }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_TYPEUPTO:
+ case OP_TYPEMINUPTO:
+ case OP_TYPEPOSUPTO:
+ ADD_ACTIVE(state_offset + 4, 0);
+ count = current_state->count; /* Number already matched */
+ if (clen > 0)
+ {
+ if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
+ (c < 256 &&
+ (d != OP_ANY ||
+ (ims & PCRE_DOTALL) != 0 ||
+ !IS_NEWLINE(ptr)
+ ) &&
+ ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
+ {
+ if (codevalue == OP_TYPEPOSUPTO)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ if (++count >= GET2(code, 1))
+ { ADD_NEW(state_offset + 4, 0); }
+ else
+ { ADD_NEW(state_offset, count); }
+ }
+ }
+ break;
+
+/* ========================================================================== */
+ /* These are virtual opcodes that are used when something like
+ OP_TYPEPLUS has OP_PROP, OP_NOTPROP, OP_ANYNL, or OP_EXTUNI as its
+ argument. It keeps the code above fast for the other cases. The argument
+ is in the d variable. */
+
+ case OP_PROP_EXTRA + OP_TYPEPLUS:
+ case OP_PROP_EXTRA + OP_TYPEMINPLUS:
+ case OP_PROP_EXTRA + OP_TYPEPOSPLUS:
+ count = current_state->count; /* Already matched */
+ if (count > 0) { ADD_ACTIVE(state_offset + 4, 0); }
+ if (clen > 0)
+ {
+ BOOL OK;
+ int category = _pcre_ucp_findprop(c, &chartype, &script);
+ switch(code[2])
+ {
+ case PT_ANY:
+ OK = TRUE;
+ break;
+
+ case PT_LAMP:
+ OK = chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt;
+ break;
+
+ case PT_GC:
+ OK = category == code[3];
+ break;
+
+ case PT_PC:
+ OK = chartype == code[3];
+ break;
+
+ case PT_SC:
+ OK = script == code[3];
+ break;
+
+ /* Should never occur, but keep compilers from grumbling. */
+
+ default:
+ OK = codevalue != OP_PROP;
+ break;
+ }
+
+ if (OK == (d == OP_PROP))
+ {
+ if (count > 0 && codevalue == OP_PROP_EXTRA + OP_TYPEPOSPLUS)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ count++;
+ ADD_NEW(state_offset, count);
+ }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_EXTUNI_EXTRA + OP_TYPEPLUS:
+ case OP_EXTUNI_EXTRA + OP_TYPEMINPLUS:
+ case OP_EXTUNI_EXTRA + OP_TYPEPOSPLUS:
+ count = current_state->count; /* Already matched */
+ if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); }
+ if (clen > 0 && _pcre_ucp_findprop(c, &chartype, &script) != ucp_M)
+ {
+ const uschar *nptr = ptr + clen;
+ int ncount = 0;
+ if (count > 0 && codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSPLUS)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ while (nptr < end_subject)
+ {
+ int nd;
+ int ndlen = 1;
+ GETCHARLEN(nd, nptr, ndlen);
+ if (_pcre_ucp_findprop(nd, &chartype, &script) != ucp_M) break;
+ ncount++;
+ nptr += ndlen;
+ }
+ count++;
+ ADD_NEW_DATA(-state_offset, count, ncount);
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_ANYNL_EXTRA + OP_TYPEPLUS:
+ case OP_ANYNL_EXTRA + OP_TYPEMINPLUS:
+ case OP_ANYNL_EXTRA + OP_TYPEPOSPLUS:
+ count = current_state->count; /* Already matched */
+ if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); }
+ if (clen > 0)
+ {
+ int ncount = 0;
+ switch (c)
+ {
+ case 0x000d:
+ if (ptr + 1 < end_subject && ptr[1] == 0x0a) ncount = 1;
+ /* Fall through */
+ case 0x000a:
+ case 0x000b:
+ case 0x000c:
+ case 0x0085:
+ case 0x2028:
+ case 0x2029:
+ if (count > 0 && codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSPLUS)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ count++;
+ ADD_NEW_DATA(-state_offset, count, ncount);
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_PROP_EXTRA + OP_TYPEQUERY:
+ case OP_PROP_EXTRA + OP_TYPEMINQUERY:
+ case OP_PROP_EXTRA + OP_TYPEPOSQUERY:
+ count = 4;
+ goto QS1;
+
+ case OP_PROP_EXTRA + OP_TYPESTAR:
+ case OP_PROP_EXTRA + OP_TYPEMINSTAR:
+ case OP_PROP_EXTRA + OP_TYPEPOSSTAR:
+ count = 0;
+
+ QS1:
+
+ ADD_ACTIVE(state_offset + 4, 0);
+ if (clen > 0)
+ {
+ BOOL OK;
+ int category = _pcre_ucp_findprop(c, &chartype, &script);
+ switch(code[2])
+ {
+ case PT_ANY:
+ OK = TRUE;
+ break;
+
+ case PT_LAMP:
+ OK = chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt;
+ break;
+
+ case PT_GC:
+ OK = category == code[3];
+ break;
+
+ case PT_PC:
+ OK = chartype == code[3];
+ break;
+
+ case PT_SC:
+ OK = script == code[3];
+ break;
+
+ /* Should never occur, but keep compilers from grumbling. */
+
+ default:
+ OK = codevalue != OP_PROP;
+ break;
+ }
+
+ if (OK == (d == OP_PROP))
+ {
+ if (codevalue == OP_PROP_EXTRA + OP_TYPEPOSSTAR ||
+ codevalue == OP_PROP_EXTRA + OP_TYPEPOSQUERY)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ ADD_NEW(state_offset + count, 0);
+ }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_EXTUNI_EXTRA + OP_TYPEQUERY:
+ case OP_EXTUNI_EXTRA + OP_TYPEMINQUERY:
+ case OP_EXTUNI_EXTRA + OP_TYPEPOSQUERY:
+ count = 2;
+ goto QS2;
+
+ case OP_EXTUNI_EXTRA + OP_TYPESTAR:
+ case OP_EXTUNI_EXTRA + OP_TYPEMINSTAR:
+ case OP_EXTUNI_EXTRA + OP_TYPEPOSSTAR:
+ count = 0;
+
+ QS2:
+
+ ADD_ACTIVE(state_offset + 2, 0);
+ if (clen > 0 && _pcre_ucp_findprop(c, &chartype, &script) != ucp_M)
+ {
+ const uschar *nptr = ptr + clen;
+ int ncount = 0;
+ if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSSTAR ||
+ codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSQUERY)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ while (nptr < end_subject)
+ {
+ int nd;
+ int ndlen = 1;
+ GETCHARLEN(nd, nptr, ndlen);
+ if (_pcre_ucp_findprop(nd, &chartype, &script) != ucp_M) break;
+ ncount++;
+ nptr += ndlen;
+ }
+ ADD_NEW_DATA(-(state_offset + count), 0, ncount);
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_ANYNL_EXTRA + OP_TYPEQUERY:
+ case OP_ANYNL_EXTRA + OP_TYPEMINQUERY:
+ case OP_ANYNL_EXTRA + OP_TYPEPOSQUERY:
+ count = 2;
+ goto QS3;
+
+ case OP_ANYNL_EXTRA + OP_TYPESTAR:
+ case OP_ANYNL_EXTRA + OP_TYPEMINSTAR:
+ case OP_ANYNL_EXTRA + OP_TYPEPOSSTAR:
+ count = 0;
+
+ QS3:
+ ADD_ACTIVE(state_offset + 2, 0);
+ if (clen > 0)
+ {
+ int ncount = 0;
+ switch (c)
+ {
+ case 0x000d:
+ if (ptr + 1 < end_subject && ptr[1] == 0x0a) ncount = 1;
+ /* Fall through */
+ case 0x000a:
+ case 0x000b:
+ case 0x000c:
+ case 0x0085:
+ case 0x2028:
+ case 0x2029:
+ if (codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSSTAR ||
+ codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSQUERY)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ ADD_NEW_DATA(-(state_offset + count), 0, ncount);
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_PROP_EXTRA + OP_TYPEEXACT:
+ case OP_PROP_EXTRA + OP_TYPEUPTO:
+ case OP_PROP_EXTRA + OP_TYPEMINUPTO:
+ case OP_PROP_EXTRA + OP_TYPEPOSUPTO:
+ if (codevalue != OP_PROP_EXTRA + OP_TYPEEXACT)
+ { ADD_ACTIVE(state_offset + 6, 0); }
+ count = current_state->count; /* Number already matched */
+ if (clen > 0)
+ {
+ BOOL OK;
+ int category = _pcre_ucp_findprop(c, &chartype, &script);
+ switch(code[4])
+ {
+ case PT_ANY:
+ OK = TRUE;
+ break;
+
+ case PT_LAMP:
+ OK = chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt;
+ break;
+
+ case PT_GC:
+ OK = category == code[5];
+ break;
+
+ case PT_PC:
+ OK = chartype == code[5];
+ break;
+
+ case PT_SC:
+ OK = script == code[5];
+ break;
+
+ /* Should never occur, but keep compilers from grumbling. */
+
+ default:
+ OK = codevalue != OP_PROP;
+ break;
+ }
+
+ if (OK == (d == OP_PROP))
+ {
+ if (codevalue == OP_PROP_EXTRA + OP_TYPEPOSUPTO)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ if (++count >= GET2(code, 1))
+ { ADD_NEW(state_offset + 6, 0); }
+ else
+ { ADD_NEW(state_offset, count); }
+ }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_EXTUNI_EXTRA + OP_TYPEEXACT:
+ case OP_EXTUNI_EXTRA + OP_TYPEUPTO:
+ case OP_EXTUNI_EXTRA + OP_TYPEMINUPTO:
+ case OP_EXTUNI_EXTRA + OP_TYPEPOSUPTO:
+ if (codevalue != OP_EXTUNI_EXTRA + OP_TYPEEXACT)
+ { ADD_ACTIVE(state_offset + 4, 0); }
+ count = current_state->count; /* Number already matched */
+ if (clen > 0 && _pcre_ucp_findprop(c, &chartype, &script) != ucp_M)
+ {
+ const uschar *nptr = ptr + clen;
+ int ncount = 0;
+ if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSUPTO)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ while (nptr < end_subject)
+ {
+ int nd;
+ int ndlen = 1;
+ GETCHARLEN(nd, nptr, ndlen);
+ if (_pcre_ucp_findprop(nd, &chartype, &script) != ucp_M) break;
+ ncount++;
+ nptr += ndlen;
+ }
+ if (++count >= GET2(code, 1))
+ { ADD_NEW_DATA(-(state_offset + 4), 0, ncount); }
+ else
+ { ADD_NEW_DATA(-state_offset, count, ncount); }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_ANYNL_EXTRA + OP_TYPEEXACT:
+ case OP_ANYNL_EXTRA + OP_TYPEUPTO:
+ case OP_ANYNL_EXTRA + OP_TYPEMINUPTO:
+ case OP_ANYNL_EXTRA + OP_TYPEPOSUPTO:
+ if (codevalue != OP_ANYNL_EXTRA + OP_TYPEEXACT)
+ { ADD_ACTIVE(state_offset + 4, 0); }
+ count = current_state->count; /* Number already matched */
+ if (clen > 0)
+ {
+ int ncount = 0;
+ switch (c)
+ {
+ case 0x000d:
+ if (ptr + 1 < end_subject && ptr[1] == 0x0a) ncount = 1;
+ /* Fall through */
+ case 0x000a:
+ case 0x000b:
+ case 0x000c:
+ case 0x0085:
+ case 0x2028:
+ case 0x2029:
+ if (codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSUPTO)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ if (++count >= GET2(code, 1))
+ { ADD_NEW_DATA(-(state_offset + 4), 0, ncount); }
+ else
+ { ADD_NEW_DATA(-state_offset, count, ncount); }
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+
+/* ========================================================================== */
+ /* These opcodes are followed by a character that is usually compared
+ to the current subject character; it is loaded into d. We still get
+ here even if there is no subject character, because in some cases zero
+ repetitions are permitted. */
+
+ /*-----------------------------------------------------------------*/
+ case OP_CHAR:
+ if (clen > 0 && c == d) { ADD_NEW(state_offset + dlen + 1, 0); }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_CHARNC:
+ if (clen == 0) break;
+
+#ifdef SUPPORT_UTF8
+ if (utf8)
+ {
+ if (c == d) { ADD_NEW(state_offset + dlen + 1, 0); } else
+ {
+ unsigned int othercase;
+ if (c < 128) othercase = fcc[c]; else
+
+ /* If we have Unicode property support, we can use it to test the
+ other case of the character. */
+
+#ifdef SUPPORT_UCP
+ othercase = _pcre_ucp_othercase(c);
+#else
+ othercase = NOTACHAR;
+#endif
+
+ if (d == othercase) { ADD_NEW(state_offset + dlen + 1, 0); }
+ }
+ }
+ else
+#endif /* SUPPORT_UTF8 */
+
+ /* Non-UTF-8 mode */
+ {
+ if (lcc[c] == lcc[d]) { ADD_NEW(state_offset + 2, 0); }
+ }
+ break;
+
+
+#ifdef SUPPORT_UCP
+ /*-----------------------------------------------------------------*/
+ /* This is a tricky one because it can match more than one character.
+ Find out how many characters to skip, and then set up a negative state
+ to wait for them to pass before continuing. */
+
+ case OP_EXTUNI:
+ if (clen > 0 && _pcre_ucp_findprop(c, &chartype, &script) != ucp_M)
+ {
+ const uschar *nptr = ptr + clen;
+ int ncount = 0;
+ while (nptr < end_subject)
+ {
+ int nclen = 1;
+ GETCHARLEN(c, nptr, nclen);
+ if (_pcre_ucp_findprop(c, &chartype, &script) != ucp_M) break;
+ ncount++;
+ nptr += nclen;
+ }
+ ADD_NEW_DATA(-(state_offset + 1), 0, ncount);
+ }
+ break;
+#endif
+
+ /*-----------------------------------------------------------------*/
+ /* This is a tricky like EXTUNI because it too can match more than one
+ character (when CR is followed by LF). In this case, set up a negative
+ state to wait for one character to pass before continuing. */
+
+ case OP_ANYNL:
+ if (clen > 0) switch(c)
+ {
+ case 0x000a:
+ case 0x000b:
+ case 0x000c:
+ case 0x0085:
+ case 0x2028:
+ case 0x2029:
+ ADD_NEW(state_offset + 1, 0);
+ break;
+ case 0x000d:
+ if (ptr + 1 < end_subject && ptr[1] == 0x0a)
+ {
+ ADD_NEW_DATA(-(state_offset + 1), 0, 1);
+ }
+ else
+ {
+ ADD_NEW(state_offset + 1, 0);
+ }
+ break;
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ /* Match a negated single character. This is only used for one-byte
+ characters, that is, we know that d < 256. The character we are
+ checking (c) can be multibyte. */
+
+ case OP_NOT:
+ if (clen > 0)
+ {
+ unsigned int otherd = ((ims & PCRE_CASELESS) != 0)? fcc[d] : d;
+ if (c != d && c != otherd) { ADD_NEW(state_offset + dlen + 1, 0); }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_PLUS:
+ case OP_MINPLUS:
+ case OP_POSPLUS:
+ case OP_NOTPLUS:
+ case OP_NOTMINPLUS:
+ case OP_NOTPOSPLUS:
+ count = current_state->count; /* Already matched */
+ if (count > 0) { ADD_ACTIVE(state_offset + dlen + 1, 0); }
+ if (clen > 0)
+ {
+ unsigned int otherd = NOTACHAR;
+ if ((ims & PCRE_CASELESS) != 0)
+ {
+#ifdef SUPPORT_UTF8
+ if (utf8 && d >= 128)
+ {
+#ifdef SUPPORT_UCP
+ otherd = _pcre_ucp_othercase(d);
+#endif /* SUPPORT_UCP */
+ }
+ else
+#endif /* SUPPORT_UTF8 */
+ otherd = fcc[d];
+ }
+ if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
+ {
+ if (count > 0 &&
+ (codevalue == OP_POSPLUS || codevalue == OP_NOTPOSPLUS))
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ count++;
+ ADD_NEW(state_offset, count);
+ }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_QUERY:
+ case OP_MINQUERY:
+ case OP_POSQUERY:
+ case OP_NOTQUERY:
+ case OP_NOTMINQUERY:
+ case OP_NOTPOSQUERY:
+ ADD_ACTIVE(state_offset + dlen + 1, 0);
+ if (clen > 0)
+ {
+ unsigned int otherd = NOTACHAR;
+ if ((ims & PCRE_CASELESS) != 0)
+ {
+#ifdef SUPPORT_UTF8
+ if (utf8 && d >= 128)
+ {
+#ifdef SUPPORT_UCP
+ otherd = _pcre_ucp_othercase(d);
+#endif /* SUPPORT_UCP */
+ }
+ else
+#endif /* SUPPORT_UTF8 */
+ otherd = fcc[d];
+ }
+ if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
+ {
+ if (codevalue == OP_POSQUERY || codevalue == OP_NOTPOSQUERY)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ ADD_NEW(state_offset + dlen + 1, 0);
+ }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_STAR:
+ case OP_MINSTAR:
+ case OP_POSSTAR:
+ case OP_NOTSTAR:
+ case OP_NOTMINSTAR:
+ case OP_NOTPOSSTAR:
+ ADD_ACTIVE(state_offset + dlen + 1, 0);
+ if (clen > 0)
+ {
+ unsigned int otherd = NOTACHAR;
+ if ((ims & PCRE_CASELESS) != 0)
+ {
+#ifdef SUPPORT_UTF8
+ if (utf8 && d >= 128)
+ {
+#ifdef SUPPORT_UCP
+ otherd = _pcre_ucp_othercase(d);
+#endif /* SUPPORT_UCP */
+ }
+ else
+#endif /* SUPPORT_UTF8 */
+ otherd = fcc[d];
+ }
+ if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
+ {
+ if (codevalue == OP_POSSTAR || codevalue == OP_NOTPOSSTAR)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ ADD_NEW(state_offset, 0);
+ }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_EXACT:
+ case OP_NOTEXACT:
+ count = current_state->count; /* Number already matched */
+ if (clen > 0)
+ {
+ unsigned int otherd = NOTACHAR;
+ if ((ims & PCRE_CASELESS) != 0)
+ {
+#ifdef SUPPORT_UTF8
+ if (utf8 && d >= 128)
+ {
+#ifdef SUPPORT_UCP
+ otherd = _pcre_ucp_othercase(d);
+#endif /* SUPPORT_UCP */
+ }
+ else
+#endif /* SUPPORT_UTF8 */
+ otherd = fcc[d];
+ }
+ if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
+ {
+ if (++count >= GET2(code, 1))
+ { ADD_NEW(state_offset + dlen + 3, 0); }
+ else
+ { ADD_NEW(state_offset, count); }
+ }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_UPTO:
+ case OP_MINUPTO:
+ case OP_POSUPTO:
+ case OP_NOTUPTO:
+ case OP_NOTMINUPTO:
+ case OP_NOTPOSUPTO:
+ ADD_ACTIVE(state_offset + dlen + 3, 0);
+ count = current_state->count; /* Number already matched */
+ if (clen > 0)
+ {
+ unsigned int otherd = NOTACHAR;
+ if ((ims & PCRE_CASELESS) != 0)
+ {
+#ifdef SUPPORT_UTF8
+ if (utf8 && d >= 128)
+ {
+#ifdef SUPPORT_UCP
+ otherd = _pcre_ucp_othercase(d);
+#endif /* SUPPORT_UCP */
+ }
+ else
+#endif /* SUPPORT_UTF8 */
+ otherd = fcc[d];
+ }
+ if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
+ {
+ if (codevalue == OP_POSUPTO || codevalue == OP_NOTPOSUPTO)
+ {
+ active_count--; /* Remove non-match possibility */
+ next_active_state--;
+ }
+ if (++count >= GET2(code, 1))
+ { ADD_NEW(state_offset + dlen + 3, 0); }
+ else
+ { ADD_NEW(state_offset, count); }
+ }
+ }
+ break;
+
+
+/* ========================================================================== */
+ /* These are the class-handling opcodes */
+
+ case OP_CLASS:
+ case OP_NCLASS:
+ case OP_XCLASS:
+ {
+ BOOL isinclass = FALSE;
+ int next_state_offset;
+ const uschar *ecode;
+
+ /* For a simple class, there is always just a 32-byte table, and we
+ can set isinclass from it. */
+
+ if (codevalue != OP_XCLASS)
+ {
+ ecode = code + 33;
+ if (clen > 0)
+ {
+ isinclass = (c > 255)? (codevalue == OP_NCLASS) :
+ ((code[1 + c/8] & (1 << (c&7))) != 0);
+ }
+ }
+
+ /* An extended class may have a table or a list of single characters,
+ ranges, or both, and it may be positive or negative. There's a
+ function that sorts all this out. */
+
+ else
+ {
+ ecode = code + GET(code, 1);
+ if (clen > 0) isinclass = _pcre_xclass(c, code + 1 + LINK_SIZE);
+ }
+
+ /* At this point, isinclass is set for all kinds of class, and ecode
+ points to the byte after the end of the class. If there is a
+ quantifier, this is where it will be. */
+
+ next_state_offset = ecode - start_code;
+
+ switch (*ecode)
+ {
+ case OP_CRSTAR:
+ case OP_CRMINSTAR:
+ ADD_ACTIVE(next_state_offset + 1, 0);
+ if (isinclass) { ADD_NEW(state_offset, 0); }
+ break;
+
+ case OP_CRPLUS:
+ case OP_CRMINPLUS:
+ count = current_state->count; /* Already matched */
+ if (count > 0) { ADD_ACTIVE(next_state_offset + 1, 0); }
+ if (isinclass) { count++; ADD_NEW(state_offset, count); }
+ break;
+
+ case OP_CRQUERY:
+ case OP_CRMINQUERY:
+ ADD_ACTIVE(next_state_offset + 1, 0);
+ if (isinclass) { ADD_NEW(next_state_offset + 1, 0); }
+ break;
+
+ case OP_CRRANGE:
+ case OP_CRMINRANGE:
+ count = current_state->count; /* Already matched */
+ if (count >= GET2(ecode, 1))
+ { ADD_ACTIVE(next_state_offset + 5, 0); }
+ if (isinclass)
+ {
+ int max = GET2(ecode, 3);
+ if (++count >= max && max != 0) /* Max 0 => no limit */
+ { ADD_NEW(next_state_offset + 5, 0); }
+ else
+ { ADD_NEW(state_offset, count); }
+ }
+ break;
+
+ default:
+ if (isinclass) { ADD_NEW(next_state_offset, 0); }
+ break;
+ }
+ }
+ break;
+
+/* ========================================================================== */
+ /* These are the opcodes for fancy brackets of various kinds. We have
+ to use recursion in order to handle them. */
+
+ case OP_ASSERT:
+ case OP_ASSERT_NOT:
+ case OP_ASSERTBACK:
+ case OP_ASSERTBACK_NOT:
+ {
+ int rc;
+ int local_offsets[2];
+ int local_workspace[1000];
+ const uschar *endasscode = code + GET(code, 1);
+
+ while (*endasscode == OP_ALT) endasscode += GET(endasscode, 1);
+
+ rc = internal_dfa_exec(
+ md, /* static match data */
+ code, /* this subexpression's code */
+ ptr, /* where we currently are */
+ ptr - start_subject, /* start offset */
+ local_offsets, /* offset vector */
+ sizeof(local_offsets)/sizeof(int), /* size of same */
+ local_workspace, /* workspace vector */
+ sizeof(local_workspace)/sizeof(int), /* size of same */
+ ims, /* the current ims flags */
+ rlevel, /* function recursion level */
+ recursing); /* pass on regex recursion */
+
+ if ((rc >= 0) == (codevalue == OP_ASSERT || codevalue == OP_ASSERTBACK))
+ { ADD_ACTIVE(endasscode + LINK_SIZE + 1 - start_code, 0); }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_COND:
+ case OP_SCOND:
+ {
+ int local_offsets[1000];
+ int local_workspace[1000];
+ int condcode = code[LINK_SIZE+1];
+
+ /* Back reference conditions are not supported */
+
+ if (condcode == OP_CREF) return PCRE_ERROR_DFA_UCOND;
+
+ /* The DEFINE condition is always false */
+
+ if (condcode == OP_DEF)
+ {
+ ADD_ACTIVE(state_offset + GET(code, 1) + LINK_SIZE + 1, 0);
+ }
+
+ /* The only supported version of OP_RREF is for the value RREF_ANY,
+ which means "test if in any recursion". We can't test for specifically
+ recursed groups. */
+
+ else if (condcode == OP_RREF)
+ {
+ int value = GET2(code, LINK_SIZE+2);
+ if (value != RREF_ANY) return PCRE_ERROR_DFA_UCOND;
+ if (recursing > 0) { ADD_ACTIVE(state_offset + LINK_SIZE + 4, 0); }
+ else { ADD_ACTIVE(state_offset + GET(code, 1) + LINK_SIZE + 1, 0); }
+ }
+
+ /* Otherwise, the condition is an assertion */
+
+ else
+ {
+ int rc;
+ const uschar *asscode = code + LINK_SIZE + 1;
+ const uschar *endasscode = asscode + GET(asscode, 1);
+
+ while (*endasscode == OP_ALT) endasscode += GET(endasscode, 1);
+
+ rc = internal_dfa_exec(
+ md, /* fixed match data */
+ asscode, /* this subexpression's code */
+ ptr, /* where we currently are */
+ ptr - start_subject, /* start offset */
+ local_offsets, /* offset vector */
+ sizeof(local_offsets)/sizeof(int), /* size of same */
+ local_workspace, /* workspace vector */
+ sizeof(local_workspace)/sizeof(int), /* size of same */
+ ims, /* the current ims flags */
+ rlevel, /* function recursion level */
+ recursing); /* pass on regex recursion */
+
+ if ((rc >= 0) ==
+ (condcode == OP_ASSERT || condcode == OP_ASSERTBACK))
+ { ADD_ACTIVE(endasscode + LINK_SIZE + 1 - start_code, 0); }
+ else
+ { ADD_ACTIVE(state_offset + GET(code, 1) + LINK_SIZE + 1, 0); }
+ }
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_RECURSE:
+ {
+ int local_offsets[1000];
+ int local_workspace[1000];
+ int rc;
+
+ DPRINTF(("%.*sStarting regex recursion %d\n", rlevel*2-2, SP,
+ recursing + 1));
+
+ rc = internal_dfa_exec(
+ md, /* fixed match data */
+ start_code + GET(code, 1), /* this subexpression's code */
+ ptr, /* where we currently are */
+ ptr - start_subject, /* start offset */
+ local_offsets, /* offset vector */
+ sizeof(local_offsets)/sizeof(int), /* size of same */
+ local_workspace, /* workspace vector */
+ sizeof(local_workspace)/sizeof(int), /* size of same */
+ ims, /* the current ims flags */
+ rlevel, /* function recursion level */
+ recursing + 1); /* regex recurse level */
+
+ DPRINTF(("%.*sReturn from regex recursion %d: rc=%d\n", rlevel*2-2, SP,
+ recursing + 1, rc));
+
+ /* Ran out of internal offsets */
+
+ if (rc == 0) return PCRE_ERROR_DFA_RECURSE;
+
+ /* For each successful matched substring, set up the next state with a
+ count of characters to skip before trying it. Note that the count is in
+ characters, not bytes. */
+
+ if (rc > 0)
+ {
+ for (rc = rc*2 - 2; rc >= 0; rc -= 2)
+ {
+ const uschar *p = start_subject + local_offsets[rc];
+ const uschar *pp = start_subject + local_offsets[rc+1];
+ int charcount = local_offsets[rc+1] - local_offsets[rc];
+ while (p < pp) if ((*p++ & 0xc0) == 0x80) charcount--;
+ if (charcount > 0)
+ {
+ ADD_NEW_DATA(-(state_offset + LINK_SIZE + 1), 0, (charcount - 1));
+ }
+ else
+ {
+ ADD_ACTIVE(state_offset + LINK_SIZE + 1, 0);
+ }
+ }
+ }
+ else if (rc != PCRE_ERROR_NOMATCH) return rc;
+ }
+ break;
+
+ /*-----------------------------------------------------------------*/
+ case OP_ONCE:
+ {
+ int local_offsets[2];
+ int local_workspace[1000];
+
+ int rc = internal_dfa_exec(
+ md, /* fixed match data */
+ code, /* this subexpression's code */
+ ptr, /* where we currently are */
+ ptr - start_subject, /* start offset */
+ local_offsets, /* offset vector */
+ sizeof(local_offsets)/sizeof(int), /* size of same */
+ local_workspace, /* workspace vector */
+ sizeof(local_workspace)/sizeof(int), /* size of same */
+ ims, /* the current ims flags */
+ rlevel, /* function recursion level */
+ recursing); /* pass on regex recursion */
+
+ if (rc >= 0)
+ {
+ const uschar *end_subpattern = code;
+ int charcount = local_offsets[1] - local_offsets[0];
+ int next_state_offset, repeat_state_offset;
+
+ do { end_subpattern += GET(end_subpattern, 1); }
+ while (*end_subpattern == OP_ALT);
+ next_state_offset = end_subpattern - start_code + LINK_SIZE + 1;
+
+ /* If the end of this subpattern is KETRMAX or KETRMIN, we must
+ arrange for the repeat state also to be added to the relevant list.
+ Calculate the offset, or set -1 for no repeat. */
+
+ repeat_state_offset = (*end_subpattern == OP_KETRMAX ||
+ *end_subpattern == OP_KETRMIN)?
+ end_subpattern - start_code - GET(end_subpattern, 1) : -1;
+
+ /* If we have matched an empty string, add the next state at the
+ current character pointer. This is important so that the duplicate
+ checking kicks in, which is what breaks infinite loops that match an
+ empty string. */
+
+ if (charcount == 0)
+ {
+ ADD_ACTIVE(next_state_offset, 0);
+ }
+
+ /* Optimization: if there are no more active states, and there
+ are no new states yet set up, then skip over the subject string
+ right here, to save looping. Otherwise, set up the new state to swing
+ into action when the end of the substring is reached. */
+
+ else if (i + 1 >= active_count && new_count == 0)
+ {
+ ptr += charcount;
+ clen = 0;
+ ADD_NEW(next_state_offset, 0);
+
+ /* If we are adding a repeat state at the new character position,
+ we must fudge things so that it is the only current state.
+ Otherwise, it might be a duplicate of one we processed before, and
+ that would cause it to be skipped. */
+
+ if (repeat_state_offset >= 0)
+ {
+ next_active_state = active_states;
+ active_count = 0;
+ i = -1;
+ ADD_ACTIVE(repeat_state_offset, 0);
+ }
+ }
+ else
+ {
+ const uschar *p = start_subject + local_offsets[0];
+ const uschar *pp = start_subject + local_offsets[1];
+ while (p < pp) if ((*p++ & 0xc0) == 0x80) charcount--;
+ ADD_NEW_DATA(-next_state_offset, 0, (charcount - 1));
+ if (repeat_state_offset >= 0)
+ { ADD_NEW_DATA(-repeat_state_offset, 0, (charcount - 1)); }
+ }
+
+ }
+ else if (rc != PCRE_ERROR_NOMATCH) return rc;
+ }
+ break;
+
+
+/* ========================================================================== */
+ /* Handle callouts */
+
+ case OP_CALLOUT:
+ if (pcre_callout != NULL)
+ {
+ int rrc;
+ pcre_callout_block cb;
+ cb.version = 1; /* Version 1 of the callout block */
+ cb.callout_number = code[1];
+ cb.offset_vector = offsets;
+ cb.subject = (PCRE_SPTR)start_subject;
+ cb.subject_length = end_subject - start_subject;
+ cb.start_match = current_subject - start_subject;
+ cb.current_position = ptr - start_subject;
+ cb.pattern_position = GET(code, 2);
+ cb.next_item_length = GET(code, 2 + LINK_SIZE);
+ cb.capture_top = 1;
+ cb.capture_last = -1;
+ cb.callout_data = md->callout_data;
+ if ((rrc = (*pcre_callout)(&cb)) < 0) return rrc; /* Abandon */
+ if (rrc == 0) { ADD_ACTIVE(state_offset + 2 + 2*LINK_SIZE, 0); }
+ }
+ break;
+
+
+/* ========================================================================== */
+ default: /* Unsupported opcode */
+ return PCRE_ERROR_DFA_UITEM;
+ }
+
+ NEXT_ACTIVE_STATE: continue;
+
+ } /* End of loop scanning active states */
+
+ /* We have finished the processing at the current subject character. If no
+ new states have been set for the next character, we have found all the
+ matches that we are going to find. If we are at the top level and partial
+ matching has been requested, check for appropriate conditions. */
+
+ if (new_count <= 0)
+ {
+ if (match_count < 0 && /* No matches found */
+ rlevel == 1 && /* Top level match function */
+ (md->moptions & PCRE_PARTIAL) != 0 && /* Want partial matching */
+ ptr >= end_subject && /* Reached end of subject */
+ ptr > current_subject) /* Matched non-empty string */
+ {
+ if (offsetcount >= 2)
+ {
+ offsets[0] = current_subject - start_subject;
+ offsets[1] = end_subject - start_subject;
+ }
+ match_count = PCRE_ERROR_PARTIAL;
+ }
+
+ DPRINTF(("%.*sEnd of internal_dfa_exec %d: returning %d\n"
+ "%.*s---------------------\n\n", rlevel*2-2, SP, rlevel, match_count,
+ rlevel*2-2, SP));
+ break; /* In effect, "return", but see the comment below */
+ }
+
+ /* One or more states are active for the next character. */
+
+ ptr += clen; /* Advance to next subject character */
+ } /* Loop to move along the subject string */
+
+/* Control gets here from "break" a few lines above. We do it this way because
+if we use "return" above, we have compiler trouble. Some compilers warn if
+there's nothing here because they think the function doesn't return a value. On
+the other hand, if we put a dummy statement here, some more clever compilers
+complain that it can't be reached. Sigh. */
+
+return match_count;
+}
+
+
+
+
+/*************************************************
+* Execute a Regular Expression - DFA engine *
+*************************************************/
+
+/* This external function applies a compiled re to a subject string using a DFA
+engine. This function calls the internal function multiple times if the pattern
+is not anchored.
+
+Arguments:
+ argument_re points to the compiled expression
+ extra_data points to extra data or is NULL (not currently used)
+ subject points to the subject string
+ length length of subject string (may contain binary zeros)
+ start_offset where to start in the subject string
+ options option bits
+ offsets vector of match offsets
+ offsetcount size of same
+ workspace workspace vector
+ wscount size of same
+
+Returns: > 0 => number of match offset pairs placed in offsets
+ = 0 => offsets overflowed; longest matches are present
+ -1 => failed to match
+ < -1 => some kind of unexpected problem
+*/
+
+PCRE_DATA_SCOPE int
+pcre_dfa_exec(const pcre *argument_re, const pcre_extra *extra_data,
+ const char *subject, int length, int start_offset, int options, int *offsets,
+ int offsetcount, int *workspace, int wscount)
+{
+real_pcre *re = (real_pcre *)argument_re;
+dfa_match_data match_block;
+dfa_match_data *md = &match_block;
+BOOL utf8, anchored, startline, firstline;
+const uschar *current_subject, *end_subject, *lcc;
+
+pcre_study_data internal_study;
+const pcre_study_data *study = NULL;
+real_pcre internal_re;
+
+const uschar *req_byte_ptr;
+const uschar *start_bits = NULL;
+BOOL first_byte_caseless = FALSE;
+BOOL req_byte_caseless = FALSE;
+int first_byte = -1;
+int req_byte = -1;
+int req_byte2 = -1;
+int newline;
+
+/* Plausibility checks */
+
+if ((options & ~PUBLIC_DFA_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION;
+if (re == NULL || subject == NULL || workspace == NULL ||
+ (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL;
+if (offsetcount < 0) return PCRE_ERROR_BADCOUNT;
+if (wscount < 20) return PCRE_ERROR_DFA_WSSIZE;
+
+/* We need to find the pointer to any study data before we test for byte
+flipping, so we scan the extra_data block first. This may set two fields in the
+match block, so we must initialize them beforehand. However, the other fields
+in the match block must not be set until after the byte flipping. */
+
+md->tables = re->tables;
+md->callout_data = NULL;
+
+if (extra_data != NULL)
+ {
+ unsigned int flags = extra_data->flags;
+ if ((flags & PCRE_EXTRA_STUDY_DATA) != 0)
+ study = (const pcre_study_data *)extra_data->study_data;
+ if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0) return PCRE_ERROR_DFA_UMLIMIT;
+ if ((flags & PCRE_EXTRA_MATCH_LIMIT_RECURSION) != 0)
+ return PCRE_ERROR_DFA_UMLIMIT;
+ if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0)
+ md->callout_data = extra_data->callout_data;
+ if ((flags & PCRE_EXTRA_TABLES) != 0)
+ md->tables = extra_data->tables;
+ }
+
+/* Check that the first field in the block is the magic number. If it is not,
+test for a regex that was compiled on a host of opposite endianness. If this is
+the case, flipped values are put in internal_re and internal_study if there was
+study data too. */
+
+if (re->magic_number != MAGIC_NUMBER)
+ {
+ re = _pcre_try_flipped(re, &internal_re, study, &internal_study);
+ if (re == NULL) return PCRE_ERROR_BADMAGIC;
+ if (study != NULL) study = &internal_study;
+ }
+
+/* Set some local values */
+
+current_subject = (const unsigned char *)subject + start_offset;
+end_subject = (const unsigned char *)subject + length;
+req_byte_ptr = current_subject - 1;
+
+#ifdef SUPPORT_UTF8
+utf8 = (re->options & PCRE_UTF8) != 0;
+#else
+utf8 = FALSE;
+#endif
+
+anchored = (options & (PCRE_ANCHORED|PCRE_DFA_RESTART)) != 0 ||
+ (re->options & PCRE_ANCHORED) != 0;
+
+/* The remaining fixed data for passing around. */
+
+md->start_code = (const uschar *)argument_re +
+ re->name_table_offset + re->name_count * re->name_entry_size;
+md->start_subject = (const unsigned char *)subject;
+md->end_subject = end_subject;
+md->moptions = options;
+md->poptions = re->options;
+
+/* Handle different types of newline. The two bits give four cases. If nothing
+is set at run time, whatever was used at compile time applies. */
+
+switch ((((options & PCRE_NEWLINE_BITS) == 0)? re->options : options) &
+ PCRE_NEWLINE_BITS)
+ {
+ case 0: newline = NEWLINE; break; /* Compile-time default */
+ case PCRE_NEWLINE_CR: newline = '\r'; break;
+ case PCRE_NEWLINE_LF: newline = '\n'; break;
+ case PCRE_NEWLINE_CR+
+ PCRE_NEWLINE_LF: newline = ('\r' << 8) | '\n'; break;
+ case PCRE_NEWLINE_ANY: newline = -1; break;
+ default: return PCRE_ERROR_BADNEWLINE;
+ }
+
+if (newline < 0)
+ {
+ md->nltype = NLTYPE_ANY;
+ }
+else
+ {
+ md->nltype = NLTYPE_FIXED;
+ if (newline > 255)
+ {
+ md->nllen = 2;
+ md->nl[0] = (newline >> 8) & 255;
+ md->nl[1] = newline & 255;
+ }
+ else
+ {
+ md->nllen = 1;
+ md->nl[0] = newline;
+ }
+ }
+
+/* Check a UTF-8 string if required. Unfortunately there's no way of passing
+back the character offset. */
+
+#ifdef SUPPORT_UTF8
+if (utf8 && (options & PCRE_NO_UTF8_CHECK) == 0)
+ {
+ if (_pcre_valid_utf8((uschar *)subject, length) >= 0)
+ return PCRE_ERROR_BADUTF8;
+ if (start_offset > 0 && start_offset < length)
+ {
+ int tb = ((uschar *)subject)[start_offset];
+ if (tb > 127)
+ {
+ tb &= 0xc0;
+ if (tb != 0 && tb != 0xc0) return PCRE_ERROR_BADUTF8_OFFSET;
+ }
+ }
+ }
+#endif
+
+/* If the exec call supplied NULL for tables, use the inbuilt ones. This
+is a feature that makes it possible to save compiled regex and re-use them
+in other programs later. */
+
+if (md->tables == NULL) md->tables = _pcre_default_tables;
+
+/* The lower casing table and the "must be at the start of a line" flag are
+used in a loop when finding where to start. */
+
+lcc = md->tables + lcc_offset;
+startline = (re->options & PCRE_STARTLINE) != 0;
+firstline = (re->options & PCRE_FIRSTLINE) != 0;
+
+/* Set up the first character to match, if available. The first_byte value is
+never set for an anchored regular expression, but the anchoring may be forced
+at run time, so we have to test for anchoring. The first char may be unset for
+an unanchored pattern, of course. If there's no first char and the pattern was
+studied, there may be a bitmap of possible first characters. */
+
+if (!anchored)
+ {
+ if ((re->options & PCRE_FIRSTSET) != 0)
+ {
+ first_byte = re->first_byte & 255;
+ if ((first_byte_caseless = ((re->first_byte & REQ_CASELESS) != 0)) == TRUE)
+ first_byte = lcc[first_byte];
+ }
+ else
+ {
+ if (startline && study != NULL &&
+ (study->options & PCRE_STUDY_MAPPED) != 0)
+ start_bits = study->start_bits;
+ }
+ }
+
+/* For anchored or unanchored matches, there may be a "last known required
+character" set. */
+
+if ((re->options & PCRE_REQCHSET) != 0)
+ {
+ req_byte = re->req_byte & 255;
+ req_byte_caseless = (re->req_byte & REQ_CASELESS) != 0;
+ req_byte2 = (md->tables + fcc_offset)[req_byte]; /* case flipped */
+ }
+
+/* Call the main matching function, looping for a non-anchored regex after a
+failed match. Unless restarting, optimize by moving to the first match
+character if possible, when not anchored. Then unless wanting a partial match,
+check for a required later character. */
+
+for (;;)
+ {
+ int rc;
+
+ if ((options & PCRE_DFA_RESTART) == 0)
+ {
+ const uschar *save_end_subject = end_subject;
+
+ /* Advance to a unique first char if possible. If firstline is TRUE, the
+ start of the match is constrained to the first line of a multiline string.
+ Implement this by temporarily adjusting end_subject so that we stop
+ scanning at a newline. If the match fails at the newline, later code breaks
+ this loop. */
+
+ if (firstline)
+ {
+ const uschar *t = current_subject;
+ while (t < md->end_subject && !IS_NEWLINE(t)) t++;
+ end_subject = t;
+ }
+
+ if (first_byte >= 0)
+ {
+ if (first_byte_caseless)
+ while (current_subject < end_subject &&
+ lcc[*current_subject] != first_byte)
+ current_subject++;
+ else
+ while (current_subject < end_subject && *current_subject != first_byte)
+ current_subject++;
+ }
+
+ /* Or to just after a linebreak for a multiline match if possible */
+
+ else if (startline)
+ {
+ if (current_subject > md->start_subject + start_offset)
+ {
+ while (current_subject <= end_subject && !WAS_NEWLINE(current_subject))
+ current_subject++;
+ }
+ }
+
+ /* Or to a non-unique first char after study */
+
+ else if (start_bits != NULL)
+ {
+ while (current_subject < end_subject)
+ {
+ register unsigned int c = *current_subject;
+ if ((start_bits[c/8] & (1 << (c&7))) == 0) current_subject++;
+ else break;
+ }
+ }
+
+ /* Restore fudged end_subject */
+
+ end_subject = save_end_subject;
+ }
+
+ /* If req_byte is set, we know that that character must appear in the subject
+ for the match to succeed. If the first character is set, req_byte must be
+ later in the subject; otherwise the test starts at the match point. This
+ optimization can save a huge amount of work in patterns with nested unlimited
+ repeats that aren't going to match. Writing separate code for cased/caseless
+ versions makes it go faster, as does using an autoincrement and backing off
+ on a match.
+
+ HOWEVER: when the subject string is very, very long, searching to its end can
+ take a long time, and give bad performance on quite ordinary patterns. This
+ showed up when somebody was matching /^C/ on a 32-megabyte string... so we
+ don't do this when the string is sufficiently long.
+
+ ALSO: this processing is disabled when partial matching is requested.
+ */
+
+ if (req_byte >= 0 &&
+ end_subject - current_subject < REQ_BYTE_MAX &&
+ (options & PCRE_PARTIAL) == 0)
+ {
+ register const uschar *p = current_subject + ((first_byte >= 0)? 1 : 0);
+
+ /* We don't need to repeat the search if we haven't yet reached the
+ place we found it at last time. */
+
+ if (p > req_byte_ptr)
+ {
+ if (req_byte_caseless)
+ {
+ while (p < end_subject)
+ {
+ register int pp = *p++;
+ if (pp == req_byte || pp == req_byte2) { p--; break; }
+ }
+ }
+ else
+ {
+ while (p < end_subject)
+ {
+ if (*p++ == req_byte) { p--; break; }
+ }
+ }
+
+ /* If we can't find the required character, break the matching loop,
+ which will cause a return or PCRE_ERROR_NOMATCH. */
+
+ if (p >= end_subject) break;
+
+ /* If we have found the required character, save the point where we
+ found it, so that we don't search again next time round the loop if
+ the start hasn't passed this character yet. */
+
+ req_byte_ptr = p;
+ }
+ }
+
+ /* OK, now we can do the business */
+
+ rc = internal_dfa_exec(
+ md, /* fixed match data */
+ md->start_code, /* this subexpression's code */
+ current_subject, /* where we currently are */
+ start_offset, /* start offset in subject */
+ offsets, /* offset vector */
+ offsetcount, /* size of same */
+ workspace, /* workspace vector */
+ wscount, /* size of same */
+ re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL), /* ims flags */
+ 0, /* function recurse level */
+ 0); /* regex recurse level */
+
+ /* Anything other than "no match" means we are done, always; otherwise, carry
+ on only if not anchored. */
+
+ if (rc != PCRE_ERROR_NOMATCH || anchored) return rc;
+
+ /* Advance to the next subject character unless we are at the end of a line
+ and firstline is set. */
+
+ if (firstline && IS_NEWLINE(current_subject)) break;
+ current_subject++;
+ if (utf8)
+ {
+ while (current_subject < end_subject && (*current_subject & 0xc0) == 0x80)
+ current_subject++;
+ }
+ if (current_subject > end_subject) break;
+
+ /* If we have just passed a CR and the newline option is CRLF or ANY, and we
+ are now at a LF, advance the match position by one more character. */
+
+ if (current_subject[-1] == '\r' &&
+ (md->nltype == NLTYPE_ANY || md->nllen == 2) &&
+ current_subject < end_subject &&
+ *current_subject == '\n')
+ current_subject++;
+
+ } /* "Bumpalong" loop */
+
+return PCRE_ERROR_NOMATCH;
+}
+
+/* End of pcre_dfa_exec.c */
diff --git a/trunk/glib/pcre/pcre_exec.c b/trunk/glib/pcre/pcre_exec.c
new file mode 100644
index 000000000..890e0f731
--- /dev/null
+++ b/trunk/glib/pcre/pcre_exec.c
@@ -0,0 +1,4199 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains pcre_exec(), the externally visible function that does
+pattern matching using an NFA algorithm, trying to mimic Perl as closely as
+possible. There are also some static supporting functions. */
+
+#define NLBLOCK md /* Block containing newline information */
+#define PSSTART start_subject /* Field containing processed string start */
+#define PSEND end_subject /* Field containing processed string end */
+
+#include "pcre_internal.h"
+
+/* The chain of eptrblocks for tail recursions uses memory in stack workspace,
+obtained at top level, the size of which is defined by EPTR_WORK_SIZE. */
+
+#define EPTR_WORK_SIZE (1000)
+
+/* Flag bits for the match() function */
+
+#define match_condassert 0x01 /* Called to check a condition assertion */
+#define match_cbegroup 0x02 /* Could-be-empty unlimited repeat group */
+#define match_tail_recursed 0x04 /* Tail recursive call */
+
+/* Non-error returns from the match() function. Error returns are externally
+defined PCRE_ERROR_xxx codes, which are all negative. */
+
+#define MATCH_MATCH 1
+#define MATCH_NOMATCH 0
+
+/* Maximum number of ints of offset to save on the stack for recursive calls.
+If the offset vector is bigger, malloc is used. This should be a multiple of 3,
+because the offset vector is always a multiple of 3 long. */
+
+#define REC_STACK_SAVE_MAX 30
+
+/* Min and max values for the common repeats; for the maxima, 0 => infinity */
+
+static const char rep_min[] = { 0, 0, 1, 1, 0, 0 };
+static const char rep_max[] = { 0, 0, 0, 0, 1, 1 };
+
+
+
+#ifdef DEBUG
+/*************************************************
+* Debugging function to print chars *
+*************************************************/
+
+/* Print a sequence of chars in printable format, stopping at the end of the
+subject if the requested.
+
+Arguments:
+ p points to characters
+ length number to print
+ is_subject TRUE if printing from within md->start_subject
+ md pointer to matching data block, if is_subject is TRUE
+
+Returns: nothing
+*/
+
+static void
+pchars(const uschar *p, int length, BOOL is_subject, match_data *md)
+{
+unsigned int c;
+if (is_subject && length > md->end_subject - p) length = md->end_subject - p;
+while (length-- > 0)
+ if (isprint(c = *(p++))) printf("%c", c); else printf("\\x%02x", c);
+}
+#endif
+
+
+
+/*************************************************
+* Match a back-reference *
+*************************************************/
+
+/* If a back reference hasn't been set, the length that is passed is greater
+than the number of characters left in the string, so the match fails.
+
+Arguments:
+ offset index into the offset vector
+ eptr points into the subject
+ length length to be matched
+ md points to match data block
+ ims the ims flags
+
+Returns: TRUE if matched
+*/
+
+static BOOL
+match_ref(int offset, register USPTR eptr, int length, match_data *md,
+ unsigned long int ims)
+{
+USPTR p = md->start_subject + md->offset_vector[offset];
+
+#ifdef DEBUG
+if (eptr >= md->end_subject)
+ printf("matching subject <null>");
+else
+ {
+ printf("matching subject ");
+ pchars(eptr, length, TRUE, md);
+ }
+printf(" against backref ");
+pchars(p, length, FALSE, md);
+printf("\n");
+#endif
+
+/* Always fail if not enough characters left */
+
+if (length > md->end_subject - eptr) return FALSE;
+
+/* Separate the caselesss case for speed */
+
+if ((ims & PCRE_CASELESS) != 0)
+ {
+ while (length-- > 0)
+ if (md->lcc[*p++] != md->lcc[*eptr++]) return FALSE;
+ }
+else
+ { while (length-- > 0) if (*p++ != *eptr++) return FALSE; }
+
+return TRUE;
+}
+
+
+
+/***************************************************************************
+****************************************************************************
+ RECURSION IN THE match() FUNCTION
+
+The match() function is highly recursive, though not every recursive call
+increases the recursive depth. Nevertheless, some regular expressions can cause
+it to recurse to a great depth. I was writing for Unix, so I just let it call
+itself recursively. This uses the stack for saving everything that has to be
+saved for a recursive call. On Unix, the stack can be large, and this works
+fine.
+
+It turns out that on some non-Unix-like systems there are problems with
+programs that use a lot of stack. (This despite the fact that every last chip
+has oodles of memory these days, and techniques for extending the stack have
+been known for decades.) So....
+
+There is a fudge, triggered by defining NO_RECURSE, which avoids recursive
+calls by keeping local variables that need to be preserved in blocks of memory
+obtained from malloc() instead instead of on the stack. Macros are used to
+achieve this so that the actual code doesn't look very different to what it
+always used to.
+****************************************************************************
+***************************************************************************/
+
+
+/* These versions of the macros use the stack, as normal. There are debugging
+versions and production versions. */
+
+#ifndef NO_RECURSE
+#define REGISTER register
+#ifdef DEBUG
+#define RMATCH(rx,ra,rb,rc,rd,re,rf,rg) \
+ { \
+ printf("match() called in line %d\n", __LINE__); \
+ rx = match(ra,rb,rc,rd,re,rf,rg,rdepth+1); \
+ printf("to line %d\n", __LINE__); \
+ }
+#define RRETURN(ra) \
+ { \
+ printf("match() returned %d from line %d ", ra, __LINE__); \
+ return ra; \
+ }
+#else
+#define RMATCH(rx,ra,rb,rc,rd,re,rf,rg) \
+ rx = match(ra,rb,rc,rd,re,rf,rg,rdepth+1)
+#define RRETURN(ra) return ra
+#endif
+
+#else
+
+
+/* These versions of the macros manage a private stack on the heap. Note
+that the rd argument of RMATCH isn't actually used. It's the md argument of
+match(), which never changes. */
+
+#define REGISTER
+
+#define RMATCH(rx,ra,rb,rc,rd,re,rf,rg)\
+ {\
+ heapframe *newframe = (pcre_stack_malloc)(sizeof(heapframe));\
+ if (setjmp(frame->Xwhere) == 0)\
+ {\
+ newframe->Xeptr = ra;\
+ newframe->Xecode = rb;\
+ newframe->Xoffset_top = rc;\
+ newframe->Xims = re;\
+ newframe->Xeptrb = rf;\
+ newframe->Xflags = rg;\
+ newframe->Xrdepth = frame->Xrdepth + 1;\
+ newframe->Xprevframe = frame;\
+ frame = newframe;\
+ DPRINTF(("restarting from line %d\n", __LINE__));\
+ goto HEAP_RECURSE;\
+ }\
+ else\
+ {\
+ DPRINTF(("longjumped back to line %d\n", __LINE__));\
+ frame = md->thisframe;\
+ rx = frame->Xresult;\
+ }\
+ }
+
+#define RRETURN(ra)\
+ {\
+ heapframe *newframe = frame;\
+ frame = newframe->Xprevframe;\
+ (pcre_stack_free)(newframe);\
+ if (frame != NULL)\
+ {\
+ frame->Xresult = ra;\
+ md->thisframe = frame;\
+ longjmp(frame->Xwhere, 1);\
+ }\
+ return ra;\
+ }
+
+
+/* Structure for remembering the local variables in a private frame */
+
+typedef struct heapframe {
+ struct heapframe *Xprevframe;
+
+ /* Function arguments that may change */
+
+ const uschar *Xeptr;
+ const uschar *Xecode;
+ int Xoffset_top;
+ long int Xims;
+ eptrblock *Xeptrb;
+ int Xflags;
+ unsigned int Xrdepth;
+
+ /* Function local variables */
+
+ const uschar *Xcallpat;
+ const uschar *Xcharptr;
+ const uschar *Xdata;
+ const uschar *Xnext;
+ const uschar *Xpp;
+ const uschar *Xprev;
+ const uschar *Xsaved_eptr;
+
+ recursion_info Xnew_recursive;
+
+ BOOL Xcur_is_word;
+ BOOL Xcondition;
+ BOOL Xprev_is_word;
+
+ unsigned long int Xoriginal_ims;
+
+#ifdef SUPPORT_UCP
+ int Xprop_type;
+ int Xprop_value;
+ int Xprop_fail_result;
+ int Xprop_category;
+ int Xprop_chartype;
+ int Xprop_script;
+#endif
+
+ int Xctype;
+ unsigned int Xfc;
+ int Xfi;
+ int Xlength;
+ int Xmax;
+ int Xmin;
+ int Xnumber;
+ int Xoffset;
+ int Xop;
+ int Xsave_capture_last;
+ int Xsave_offset1, Xsave_offset2, Xsave_offset3;
+ int Xstacksave[REC_STACK_SAVE_MAX];
+
+ eptrblock Xnewptrb;
+
+ /* Place to pass back result, and where to jump back to */
+
+ int Xresult;
+ jmp_buf Xwhere;
+
+} heapframe;
+
+#endif
+
+
+/***************************************************************************
+***************************************************************************/
+
+
+
+/*************************************************
+* Match from current position *
+*************************************************/
+
+/* This function is called recursively in many circumstances. Whenever it
+returns a negative (error) response, the outer incarnation must also return the
+same response.
+
+Performance note: It might be tempting to extract commonly used fields from the
+md structure (e.g. utf8, end_subject) into individual variables to improve
+performance. Tests using gcc on a SPARC disproved this; in the first case, it
+made performance worse.
+
+Arguments:
+ eptr pointer to current character in subject
+ ecode pointer to current position in compiled code
+ offset_top current top pointer
+ md pointer to "static" info for the match
+ ims current /i, /m, and /s options
+ eptrb pointer to chain of blocks containing eptr at start of
+ brackets - for testing for empty matches
+ flags can contain
+ match_condassert - this is an assertion condition
+ match_cbegroup - this is the start of an unlimited repeat
+ group that can match an empty string
+ match_tail_recursed - this is a tail_recursed group
+ rdepth the recursion depth
+
+Returns: MATCH_MATCH if matched ) these values are >= 0
+ MATCH_NOMATCH if failed to match )
+ a negative PCRE_ERROR_xxx value if aborted by an error condition
+ (e.g. stopped by repeated call or recursion limit)
+*/
+
+static int
+match(REGISTER USPTR eptr, REGISTER const uschar *ecode,
+ int offset_top, match_data *md, unsigned long int ims, eptrblock *eptrb,
+ int flags, unsigned int rdepth)
+{
+/* These variables do not need to be preserved over recursion in this function,
+so they can be ordinary variables in all cases. Mark some of them with
+"register" because they are used a lot in loops. */
+
+register int rrc; /* Returns from recursive calls */
+register int i; /* Used for loops not involving calls to RMATCH() */
+register unsigned int c; /* Character values not kept over RMATCH() calls */
+register BOOL utf8; /* Local copy of UTF-8 flag for speed */
+
+BOOL minimize, possessive; /* Quantifier options */
+
+/* When recursion is not being used, all "local" variables that have to be
+preserved over calls to RMATCH() are part of a "frame" which is obtained from
+heap storage. Set up the top-level frame here; others are obtained from the
+heap whenever RMATCH() does a "recursion". See the macro definitions above. */
+
+#ifdef NO_RECURSE
+heapframe *frame = (pcre_stack_malloc)(sizeof(heapframe));
+frame->Xprevframe = NULL; /* Marks the top level */
+
+/* Copy in the original argument variables */
+
+frame->Xeptr = eptr;
+frame->Xecode = ecode;
+frame->Xoffset_top = offset_top;
+frame->Xims = ims;
+frame->Xeptrb = eptrb;
+frame->Xflags = flags;
+frame->Xrdepth = rdepth;
+
+/* This is where control jumps back to to effect "recursion" */
+
+HEAP_RECURSE:
+
+/* Macros make the argument variables come from the current frame */
+
+#define eptr frame->Xeptr
+#define ecode frame->Xecode
+#define offset_top frame->Xoffset_top
+#define ims frame->Xims
+#define eptrb frame->Xeptrb
+#define flags frame->Xflags
+#define rdepth frame->Xrdepth
+
+/* Ditto for the local variables */
+
+#ifdef SUPPORT_UTF8
+#define charptr frame->Xcharptr
+#endif
+#define callpat frame->Xcallpat
+#define data frame->Xdata
+#define next frame->Xnext
+#define pp frame->Xpp
+#define prev frame->Xprev
+#define saved_eptr frame->Xsaved_eptr
+
+#define new_recursive frame->Xnew_recursive
+
+#define cur_is_word frame->Xcur_is_word
+#define condition frame->Xcondition
+#define prev_is_word frame->Xprev_is_word
+
+#define original_ims frame->Xoriginal_ims
+
+#ifdef SUPPORT_UCP
+#define prop_type frame->Xprop_type
+#define prop_value frame->Xprop_value
+#define prop_fail_result frame->Xprop_fail_result
+#define prop_category frame->Xprop_category
+#define prop_chartype frame->Xprop_chartype
+#define prop_script frame->Xprop_script
+#endif
+
+#define ctype frame->Xctype
+#define fc frame->Xfc
+#define fi frame->Xfi
+#define length frame->Xlength
+#define max frame->Xmax
+#define min frame->Xmin
+#define number frame->Xnumber
+#define offset frame->Xoffset
+#define op frame->Xop
+#define save_capture_last frame->Xsave_capture_last
+#define save_offset1 frame->Xsave_offset1
+#define save_offset2 frame->Xsave_offset2
+#define save_offset3 frame->Xsave_offset3
+#define stacksave frame->Xstacksave
+
+#define newptrb frame->Xnewptrb
+
+/* When recursion is being used, local variables are allocated on the stack and
+get preserved during recursion in the normal way. In this environment, fi and
+i, and fc and c, can be the same variables. */
+
+#else /* NO_RECURSE not defined */
+#define fi i
+#define fc c
+
+
+#ifdef SUPPORT_UTF8 /* Many of these variables are used only */
+const uschar *charptr; /* in small blocks of the code. My normal */
+#endif /* style of coding would have declared */
+const uschar *callpat; /* them within each of those blocks. */
+const uschar *data; /* However, in order to accommodate the */
+const uschar *next; /* version of this code that uses an */
+USPTR pp; /* external "stack" implemented on the */
+const uschar *prev; /* heap, it is easier to declare them all */
+USPTR saved_eptr; /* here, so the declarations can be cut */
+ /* out in a block. The only declarations */
+recursion_info new_recursive; /* within blocks below are for variables */
+ /* that do not have to be preserved over */
+BOOL cur_is_word; /* a recursive call to RMATCH(). */
+BOOL condition;
+BOOL prev_is_word;
+
+unsigned long int original_ims;
+
+#ifdef SUPPORT_UCP
+int prop_type;
+int prop_value;
+int prop_fail_result;
+int prop_category;
+int prop_chartype;
+int prop_script;
+#endif
+
+int ctype;
+int length;
+int max;
+int min;
+int number;
+int offset;
+int op;
+int save_capture_last;
+int save_offset1, save_offset2, save_offset3;
+int stacksave[REC_STACK_SAVE_MAX];
+
+eptrblock newptrb;
+#endif /* NO_RECURSE */
+
+/* These statements are here to stop the compiler complaining about unitialized
+variables. */
+
+#ifdef SUPPORT_UCP
+prop_value = 0;
+prop_fail_result = 0;
+#endif
+
+
+/* This label is used for tail recursion, which is used in a few cases even
+when NO_RECURSE is not defined, in order to reduce the amount of stack that is
+used. Thanks to Ian Taylor for noticing this possibility and sending the
+original patch. */
+
+TAIL_RECURSE:
+
+/* OK, now we can get on with the real code of the function. Recursive calls
+are specified by the macro RMATCH and RRETURN is used to return. When
+NO_RECURSE is *not* defined, these just turn into a recursive call to match()
+and a "return", respectively (possibly with some debugging if DEBUG is
+defined). However, RMATCH isn't like a function call because it's quite a
+complicated macro. It has to be used in one particular way. This shouldn't,
+however, impact performance when true recursion is being used. */
+
+/* First check that we haven't called match() too many times, or that we
+haven't exceeded the recursive call limit. */
+
+if (md->match_call_count++ >= md->match_limit) RRETURN(PCRE_ERROR_MATCHLIMIT);
+if (rdepth >= md->match_limit_recursion) RRETURN(PCRE_ERROR_RECURSIONLIMIT);
+
+original_ims = ims; /* Save for resetting on ')' */
+
+#ifdef SUPPORT_UTF8
+utf8 = md->utf8; /* Local copy of the flag */
+#else
+utf8 = FALSE;
+#endif
+
+/* At the start of a group with an unlimited repeat that may match an empty
+string, the match_cbegroup flag is set. When this is the case, add the current
+subject pointer to the chain of such remembered pointers, to be checked when we
+hit the closing ket, in order to break infinite loops that match no characters.
+When match() is called in other circumstances, don't add to the chain. If this
+is a tail recursion, use a block from the workspace, as the one on the stack is
+already used. */
+
+if ((flags & match_cbegroup) != 0)
+ {
+ eptrblock *p;
+ if ((flags & match_tail_recursed) != 0)
+ {
+ if (md->eptrn >= EPTR_WORK_SIZE) RRETURN(PCRE_ERROR_NULLWSLIMIT);
+ p = md->eptrchain + md->eptrn++;
+ }
+ else p = &newptrb;
+ p->epb_saved_eptr = eptr;
+ p->epb_prev = eptrb;
+ eptrb = p;
+ }
+
+/* Now start processing the opcodes. */
+
+for (;;)
+ {
+ minimize = possessive = FALSE;
+ op = *ecode;
+
+ /* For partial matching, remember if we ever hit the end of the subject after
+ matching at least one subject character. */
+
+ if (md->partial &&
+ eptr >= md->end_subject &&
+ eptr > md->start_match)
+ md->hitend = TRUE;
+
+ switch(op)
+ {
+ /* Handle a capturing bracket. If there is space in the offset vector, save
+ the current subject position in the working slot at the top of the vector.
+ We mustn't change the current values of the data slot, because they may be
+ set from a previous iteration of this group, and be referred to by a
+ reference inside the group.
+
+ If the bracket fails to match, we need to restore this value and also the
+ values of the final offsets, in case they were set by a previous iteration
+ of the same bracket.
+
+ If there isn't enough space in the offset vector, treat this as if it were
+ a non-capturing bracket. Don't worry about setting the flag for the error
+ case here; that is handled in the code for KET. */
+
+ case OP_CBRA:
+ case OP_SCBRA:
+ number = GET2(ecode, 1+LINK_SIZE);
+ offset = number << 1;
+
+#ifdef DEBUG
+ printf("start bracket %d\n", number);
+ printf("subject=");
+ pchars(eptr, 16, TRUE, md);
+ printf("\n");
+#endif
+
+ if (offset < md->offset_max)
+ {
+ save_offset1 = md->offset_vector[offset];
+ save_offset2 = md->offset_vector[offset+1];
+ save_offset3 = md->offset_vector[md->offset_end - number];
+ save_capture_last = md->capture_last;
+
+ DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3));
+ md->offset_vector[md->offset_end - number] = eptr - md->start_subject;
+
+ flags = (op == OP_SCBRA)? match_cbegroup : 0;
+ do
+ {
+ RMATCH(rrc, eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md,
+ ims, eptrb, flags);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ md->capture_last = save_capture_last;
+ ecode += GET(ecode, 1);
+ }
+ while (*ecode == OP_ALT);
+
+ DPRINTF(("bracket %d failed\n", number));
+
+ md->offset_vector[offset] = save_offset1;
+ md->offset_vector[offset+1] = save_offset2;
+ md->offset_vector[md->offset_end - number] = save_offset3;
+
+ RRETURN(MATCH_NOMATCH);
+ }
+
+ /* Insufficient room for saving captured contents. Treat as a non-capturing
+ bracket. */
+
+ DPRINTF(("insufficient capture room: treat as non-capturing\n"));
+
+ /* Non-capturing bracket. Loop for all the alternatives. When we get to the
+ final alternative within the brackets, we would return the result of a
+ recursive call to match() whatever happened. We can reduce stack usage by
+ turning this into a tail recursion. */
+
+ case OP_BRA:
+ case OP_SBRA:
+ DPRINTF(("start non-capturing bracket\n"));
+ flags = (op >= OP_SBRA)? match_cbegroup : 0;
+ for (;;)
+ {
+ if (ecode[GET(ecode, 1)] != OP_ALT)
+ {
+ ecode += _pcre_OP_lengths[*ecode];
+ flags |= match_tail_recursed;
+ DPRINTF(("bracket 0 tail recursion\n"));
+ goto TAIL_RECURSE;
+ }
+
+ /* For non-final alternatives, continue the loop for a NOMATCH result;
+ otherwise return. */
+
+ RMATCH(rrc, eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, ims,
+ eptrb, flags);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ ecode += GET(ecode, 1);
+ }
+ /* Control never reaches here. */
+
+ /* Conditional group: compilation checked that there are no more than
+ two branches. If the condition is false, skipping the first branch takes us
+ past the end if there is only one branch, but that's OK because that is
+ exactly what going to the ket would do. As there is only one branch to be
+ obeyed, we can use tail recursion to avoid using another stack frame. */
+
+ case OP_COND:
+ case OP_SCOND:
+ if (ecode[LINK_SIZE+1] == OP_RREF) /* Recursion test */
+ {
+ offset = GET2(ecode, LINK_SIZE + 2); /* Recursion group number*/
+ condition = md->recursive != NULL &&
+ (offset == RREF_ANY || offset == md->recursive->group_num);
+ ecode += condition? 3 : GET(ecode, 1);
+ }
+
+ else if (ecode[LINK_SIZE+1] == OP_CREF) /* Group used test */
+ {
+ offset = GET2(ecode, LINK_SIZE+2) << 1; /* Doubled ref number */
+ condition = offset < offset_top && md->offset_vector[offset] >= 0;
+ ecode += condition? 3 : GET(ecode, 1);
+ }
+
+ else if (ecode[LINK_SIZE+1] == OP_DEF) /* DEFINE - always false */
+ {
+ condition = FALSE;
+ ecode += GET(ecode, 1);
+ }
+
+ /* The condition is an assertion. Call match() to evaluate it - setting
+ the final argument match_condassert causes it to stop at the end of an
+ assertion. */
+
+ else
+ {
+ RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL,
+ match_condassert);
+ if (rrc == MATCH_MATCH)
+ {
+ condition = TRUE;
+ ecode += 1 + LINK_SIZE + GET(ecode, LINK_SIZE + 2);
+ while (*ecode == OP_ALT) ecode += GET(ecode, 1);
+ }
+ else if (rrc != MATCH_NOMATCH)
+ {
+ RRETURN(rrc); /* Need braces because of following else */
+ }
+ else
+ {
+ condition = FALSE;
+ ecode += GET(ecode, 1);
+ }
+ }
+
+ /* We are now at the branch that is to be obeyed. As there is only one,
+ we can use tail recursion to avoid using another stack frame. If the second
+ alternative doesn't exist, we can just plough on. */
+
+ if (condition || *ecode == OP_ALT)
+ {
+ ecode += 1 + LINK_SIZE;
+ flags = match_tail_recursed | ((op == OP_SCOND)? match_cbegroup : 0);
+ goto TAIL_RECURSE;
+ }
+ else
+ {
+ ecode += 1 + LINK_SIZE;
+ }
+ break;
+
+
+ /* End of the pattern. If we are in a top-level recursion, we should
+ restore the offsets appropriately and continue from after the call. */
+
+ case OP_END:
+ if (md->recursive != NULL && md->recursive->group_num == 0)
+ {
+ recursion_info *rec = md->recursive;
+ DPRINTF(("End of pattern in a (?0) recursion\n"));
+ md->recursive = rec->prevrec;
+ memmove(md->offset_vector, rec->offset_save,
+ rec->saved_max * sizeof(int));
+ md->start_match = rec->save_start;
+ ims = original_ims;
+ ecode = rec->after_call;
+ break;
+ }
+
+ /* Otherwise, if PCRE_NOTEMPTY is set, fail if we have matched an empty
+ string - backtracking will then try other alternatives, if any. */
+
+ if (md->notempty && eptr == md->start_match) RRETURN(MATCH_NOMATCH);
+ md->end_match_ptr = eptr; /* Record where we ended */
+ md->end_offset_top = offset_top; /* and how many extracts were taken */
+ RRETURN(MATCH_MATCH);
+
+ /* Change option settings */
+
+ case OP_OPT:
+ ims = ecode[1];
+ ecode += 2;
+ DPRINTF(("ims set to %02lx\n", ims));
+ break;
+
+ /* Assertion brackets. Check the alternative branches in turn - the
+ matching won't pass the KET for an assertion. If any one branch matches,
+ the assertion is true. Lookbehind assertions have an OP_REVERSE item at the
+ start of each branch to move the current point backwards, so the code at
+ this level is identical to the lookahead case. */
+
+ case OP_ASSERT:
+ case OP_ASSERTBACK:
+ do
+ {
+ RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, 0);
+ if (rrc == MATCH_MATCH) break;
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ ecode += GET(ecode, 1);
+ }
+ while (*ecode == OP_ALT);
+ if (*ecode == OP_KET) RRETURN(MATCH_NOMATCH);
+
+ /* If checking an assertion for a condition, return MATCH_MATCH. */
+
+ if ((flags & match_condassert) != 0) RRETURN(MATCH_MATCH);
+
+ /* Continue from after the assertion, updating the offsets high water
+ mark, since extracts may have been taken during the assertion. */
+
+ do ecode += GET(ecode,1); while (*ecode == OP_ALT);
+ ecode += 1 + LINK_SIZE;
+ offset_top = md->end_offset_top;
+ continue;
+
+ /* Negative assertion: all branches must fail to match */
+
+ case OP_ASSERT_NOT:
+ case OP_ASSERTBACK_NOT:
+ do
+ {
+ RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, 0);
+ if (rrc == MATCH_MATCH) RRETURN(MATCH_NOMATCH);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ ecode += GET(ecode,1);
+ }
+ while (*ecode == OP_ALT);
+
+ if ((flags & match_condassert) != 0) RRETURN(MATCH_MATCH);
+
+ ecode += 1 + LINK_SIZE;
+ continue;
+
+ /* Move the subject pointer back. This occurs only at the start of
+ each branch of a lookbehind assertion. If we are too close to the start to
+ move back, this match function fails. When working with UTF-8 we move
+ back a number of characters, not bytes. */
+
+ case OP_REVERSE:
+#ifdef SUPPORT_UTF8
+ if (utf8)
+ {
+ i = GET(ecode, 1);
+ while (i-- > 0)
+ {
+ eptr--;
+ if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH);
+ BACKCHAR(eptr)
+ }
+ }
+ else
+#endif
+
+ /* No UTF-8 support, or not in UTF-8 mode: count is byte count */
+
+ {
+ eptr -= GET(ecode, 1);
+ if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH);
+ }
+
+ /* Skip to next op code */
+
+ ecode += 1 + LINK_SIZE;
+ break;
+
+ /* The callout item calls an external function, if one is provided, passing
+ details of the match so far. This is mainly for debugging, though the
+ function is able to force a failure. */
+
+ case OP_CALLOUT:
+ if (pcre_callout != NULL)
+ {
+ pcre_callout_block cb;
+ cb.version = 1; /* Version 1 of the callout block */
+ cb.callout_number = ecode[1];
+ cb.offset_vector = md->offset_vector;
+ cb.subject = (PCRE_SPTR)md->start_subject;
+ cb.subject_length = md->end_subject - md->start_subject;
+ cb.start_match = md->start_match - md->start_subject;
+ cb.current_position = eptr - md->start_subject;
+ cb.pattern_position = GET(ecode, 2);
+ cb.next_item_length = GET(ecode, 2 + LINK_SIZE);
+ cb.capture_top = offset_top/2;
+ cb.capture_last = md->capture_last;
+ cb.callout_data = md->callout_data;
+ if ((rrc = (*pcre_callout)(&cb)) > 0) RRETURN(MATCH_NOMATCH);
+ if (rrc < 0) RRETURN(rrc);
+ }
+ ecode += 2 + 2*LINK_SIZE;
+ break;
+
+ /* Recursion either matches the current regex, or some subexpression. The
+ offset data is the offset to the starting bracket from the start of the
+ whole pattern. (This is so that it works from duplicated subpatterns.)
+
+ If there are any capturing brackets started but not finished, we have to
+ save their starting points and reinstate them after the recursion. However,
+ we don't know how many such there are (offset_top records the completed
+ total) so we just have to save all the potential data. There may be up to
+ 65535 such values, which is too large to put on the stack, but using malloc
+ for small numbers seems expensive. As a compromise, the stack is used when
+ there are no more than REC_STACK_SAVE_MAX values to store; otherwise malloc
+ is used. A problem is what to do if the malloc fails ... there is no way of
+ returning to the top level with an error. Save the top REC_STACK_SAVE_MAX
+ values on the stack, and accept that the rest may be wrong.
+
+ There are also other values that have to be saved. We use a chained
+ sequence of blocks that actually live on the stack. Thanks to Robin Houston
+ for the original version of this logic. */
+
+ case OP_RECURSE:
+ {
+ callpat = md->start_code + GET(ecode, 1);
+ new_recursive.group_num = (callpat == md->start_code)? 0 :
+ GET2(callpat, 1 + LINK_SIZE);
+
+ /* Add to "recursing stack" */
+
+ new_recursive.prevrec = md->recursive;
+ md->recursive = &new_recursive;
+
+ /* Find where to continue from afterwards */
+
+ ecode += 1 + LINK_SIZE;
+ new_recursive.after_call = ecode;
+
+ /* Now save the offset data. */
+
+ new_recursive.saved_max = md->offset_end;
+ if (new_recursive.saved_max <= REC_STACK_SAVE_MAX)
+ new_recursive.offset_save = stacksave;
+ else
+ {
+ new_recursive.offset_save =
+ (int *)(pcre_malloc)(new_recursive.saved_max * sizeof(int));
+ if (new_recursive.offset_save == NULL) RRETURN(PCRE_ERROR_NOMEMORY);
+ }
+
+ memcpy(new_recursive.offset_save, md->offset_vector,
+ new_recursive.saved_max * sizeof(int));
+ new_recursive.save_start = md->start_match;
+ md->start_match = eptr;
+
+ /* OK, now we can do the recursion. For each top-level alternative we
+ restore the offset and recursion data. */
+
+ DPRINTF(("Recursing into group %d\n", new_recursive.group_num));
+ flags = (*callpat >= OP_SBRA)? match_cbegroup : 0;
+ do
+ {
+ RMATCH(rrc, eptr, callpat + _pcre_OP_lengths[*callpat], offset_top,
+ md, ims, eptrb, flags);
+ if (rrc == MATCH_MATCH)
+ {
+ DPRINTF(("Recursion matched\n"));
+ md->recursive = new_recursive.prevrec;
+ if (new_recursive.offset_save != stacksave)
+ (pcre_free)(new_recursive.offset_save);
+ RRETURN(MATCH_MATCH);
+ }
+ else if (rrc != MATCH_NOMATCH)
+ {
+ DPRINTF(("Recursion gave error %d\n", rrc));
+ RRETURN(rrc);
+ }
+
+ md->recursive = &new_recursive;
+ memcpy(md->offset_vector, new_recursive.offset_save,
+ new_recursive.saved_max * sizeof(int));
+ callpat += GET(callpat, 1);
+ }
+ while (*callpat == OP_ALT);
+
+ DPRINTF(("Recursion didn't match\n"));
+ md->recursive = new_recursive.prevrec;
+ if (new_recursive.offset_save != stacksave)
+ (pcre_free)(new_recursive.offset_save);
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never reaches here */
+
+ /* "Once" brackets are like assertion brackets except that after a match,
+ the point in the subject string is not moved back. Thus there can never be
+ a move back into the brackets. Friedl calls these "atomic" subpatterns.
+ Check the alternative branches in turn - the matching won't pass the KET
+ for this kind of subpattern. If any one branch matches, we carry on as at
+ the end of a normal bracket, leaving the subject pointer. */
+
+ case OP_ONCE:
+ prev = ecode;
+ saved_eptr = eptr;
+
+ do
+ {
+ RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims,
+ eptrb, 0);
+ if (rrc == MATCH_MATCH) break;
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ ecode += GET(ecode,1);
+ }
+ while (*ecode == OP_ALT);
+
+ /* If hit the end of the group (which could be repeated), fail */
+
+ if (*ecode != OP_ONCE && *ecode != OP_ALT) RRETURN(MATCH_NOMATCH);
+
+ /* Continue as from after the assertion, updating the offsets high water
+ mark, since extracts may have been taken. */
+
+ do ecode += GET(ecode, 1); while (*ecode == OP_ALT);
+
+ offset_top = md->end_offset_top;
+ eptr = md->end_match_ptr;
+
+ /* For a non-repeating ket, just continue at this level. This also
+ happens for a repeating ket if no characters were matched in the group.
+ This is the forcible breaking of infinite loops as implemented in Perl
+ 5.005. If there is an options reset, it will get obeyed in the normal
+ course of events. */
+
+ if (*ecode == OP_KET || eptr == saved_eptr)
+ {
+ ecode += 1+LINK_SIZE;
+ break;
+ }
+
+ /* The repeating kets try the rest of the pattern or restart from the
+ preceding bracket, in the appropriate order. The second "call" of match()
+ uses tail recursion, to avoid using another stack frame. We need to reset
+ any options that changed within the bracket before re-running it, so
+ check the next opcode. */
+
+ if (ecode[1+LINK_SIZE] == OP_OPT)
+ {
+ ims = (ims & ~PCRE_IMS) | ecode[4];
+ DPRINTF(("ims set to %02lx at group repeat\n", ims));
+ }
+
+ if (*ecode == OP_KETRMIN)
+ {
+ RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ ecode = prev;
+ flags = match_tail_recursed;
+ goto TAIL_RECURSE;
+ }
+ else /* OP_KETRMAX */
+ {
+ RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_cbegroup);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ ecode += 1 + LINK_SIZE;
+ flags = match_tail_recursed;
+ goto TAIL_RECURSE;
+ }
+ /* Control never gets here */
+
+ /* An alternation is the end of a branch; scan along to find the end of the
+ bracketed group and go to there. */
+
+ case OP_ALT:
+ do ecode += GET(ecode,1); while (*ecode == OP_ALT);
+ break;
+
+ /* BRAZERO and BRAMINZERO occur just before a bracket group, indicating
+ that it may occur zero times. It may repeat infinitely, or not at all -
+ i.e. it could be ()* or ()? in the pattern. Brackets with fixed upper
+ repeat limits are compiled as a number of copies, with the optional ones
+ preceded by BRAZERO or BRAMINZERO. */
+
+ case OP_BRAZERO:
+ {
+ next = ecode+1;
+ RMATCH(rrc, eptr, next, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ do next += GET(next,1); while (*next == OP_ALT);
+ ecode = next + 1 + LINK_SIZE;
+ }
+ break;
+
+ case OP_BRAMINZERO:
+ {
+ next = ecode+1;
+ do next += GET(next, 1); while (*next == OP_ALT);
+ RMATCH(rrc, eptr, next + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ ecode++;
+ }
+ break;
+
+ /* End of a group, repeated or non-repeating. */
+
+ case OP_KET:
+ case OP_KETRMIN:
+ case OP_KETRMAX:
+ prev = ecode - GET(ecode, 1);
+
+ /* If this was a group that remembered the subject start, in order to break
+ infinite repeats of empty string matches, retrieve the subject start from
+ the chain. Otherwise, set it NULL. */
+
+ if (*prev >= OP_SBRA)
+ {
+ saved_eptr = eptrb->epb_saved_eptr; /* Value at start of group */
+ eptrb = eptrb->epb_prev; /* Backup to previous group */
+ }
+ else saved_eptr = NULL;
+
+ /* If we are at the end of an assertion group, stop matching and return
+ MATCH_MATCH, but record the current high water mark for use by positive
+ assertions. Do this also for the "once" (atomic) groups. */
+
+ if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT ||
+ *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT ||
+ *prev == OP_ONCE)
+ {
+ md->end_match_ptr = eptr; /* For ONCE */
+ md->end_offset_top = offset_top;
+ RRETURN(MATCH_MATCH);
+ }
+
+ /* For capturing groups we have to check the group number back at the start
+ and if necessary complete handling an extraction by setting the offsets and
+ bumping the high water mark. Note that whole-pattern recursion is coded as
+ a recurse into group 0, so it won't be picked up here. Instead, we catch it
+ when the OP_END is reached. Other recursion is handled here. */
+
+ if (*prev == OP_CBRA || *prev == OP_SCBRA)
+ {
+ number = GET2(prev, 1+LINK_SIZE);
+ offset = number << 1;
+
+#ifdef DEBUG
+ printf("end bracket %d", number);
+ printf("\n");
+#endif
+
+ md->capture_last = number;
+ if (offset >= md->offset_max) md->offset_overflow = TRUE; else
+ {
+ md->offset_vector[offset] =
+ md->offset_vector[md->offset_end - number];
+ md->offset_vector[offset+1] = eptr - md->start_subject;
+ if (offset_top <= offset) offset_top = offset + 2;
+ }
+
+ /* Handle a recursively called group. Restore the offsets
+ appropriately and continue from after the call. */
+
+ if (md->recursive != NULL && md->recursive->group_num == number)
+ {
+ recursion_info *rec = md->recursive;
+ DPRINTF(("Recursion (%d) succeeded - continuing\n", number));
+ md->recursive = rec->prevrec;
+ md->start_match = rec->save_start;
+ memcpy(md->offset_vector, rec->offset_save,
+ rec->saved_max * sizeof(int));
+ ecode = rec->after_call;
+ ims = original_ims;
+ break;
+ }
+ }
+
+ /* For both capturing and non-capturing groups, reset the value of the ims
+ flags, in case they got changed during the group. */
+
+ ims = original_ims;
+ DPRINTF(("ims reset to %02lx\n", ims));
+
+ /* For a non-repeating ket, just continue at this level. This also
+ happens for a repeating ket if no characters were matched in the group.
+ This is the forcible breaking of infinite loops as implemented in Perl
+ 5.005. If there is an options reset, it will get obeyed in the normal
+ course of events. */
+
+ if (*ecode == OP_KET || eptr == saved_eptr)
+ {
+ ecode += 1 + LINK_SIZE;
+ break;
+ }
+
+ /* The repeating kets try the rest of the pattern or restart from the
+ preceding bracket, in the appropriate order. In the second case, we can use
+ tail recursion to avoid using another stack frame. */
+
+ flags = (*prev >= OP_SBRA)? match_cbegroup : 0;
+
+ if (*ecode == OP_KETRMIN)
+ {
+ RMATCH(rrc, eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ ecode = prev;
+ flags |= match_tail_recursed;
+ goto TAIL_RECURSE;
+ }
+ else /* OP_KETRMAX */
+ {
+ RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, flags);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ ecode += 1 + LINK_SIZE;
+ flags = match_tail_recursed;
+ goto TAIL_RECURSE;
+ }
+ /* Control never gets here */
+
+ /* Start of subject unless notbol, or after internal newline if multiline */
+
+ case OP_CIRC:
+ if (md->notbol && eptr == md->start_subject) RRETURN(MATCH_NOMATCH);
+ if ((ims & PCRE_MULTILINE) != 0)
+ {
+ if (eptr != md->start_subject &&
+ (eptr == md->end_subject || !WAS_NEWLINE(eptr)))
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+ }
+ /* ... else fall through */
+
+ /* Start of subject assertion */
+
+ case OP_SOD:
+ if (eptr != md->start_subject) RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ /* Start of match assertion */
+
+ case OP_SOM:
+ if (eptr != md->start_subject + md->start_offset) RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ /* Assert before internal newline if multiline, or before a terminating
+ newline unless endonly is set, else end of subject unless noteol is set. */
+
+ case OP_DOLL:
+ if ((ims & PCRE_MULTILINE) != 0)
+ {
+ if (eptr < md->end_subject)
+ { if (!IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); }
+ else
+ { if (md->noteol) RRETURN(MATCH_NOMATCH); }
+ ecode++;
+ break;
+ }
+ else
+ {
+ if (md->noteol) RRETURN(MATCH_NOMATCH);
+ if (!md->endonly)
+ {
+ if (eptr != md->end_subject &&
+ (!IS_NEWLINE(eptr) || eptr != md->end_subject - md->nllen))
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+ }
+ }
+ /* ... else fall through for endonly */
+
+ /* End of subject assertion (\z) */
+
+ case OP_EOD:
+ if (eptr < md->end_subject) RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ /* End of subject or ending \n assertion (\Z) */
+
+ case OP_EODN:
+ if (eptr != md->end_subject &&
+ (!IS_NEWLINE(eptr) || eptr != md->end_subject - md->nllen))
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ /* Word boundary assertions */
+
+ case OP_NOT_WORD_BOUNDARY:
+ case OP_WORD_BOUNDARY:
+ {
+
+ /* Find out if the previous and current characters are "word" characters.
+ It takes a bit more work in UTF-8 mode. Characters > 255 are assumed to
+ be "non-word" characters. */
+
+#ifdef SUPPORT_UTF8
+ if (utf8)
+ {
+ if (eptr == md->start_subject) prev_is_word = FALSE; else
+ {
+ const uschar *lastptr = eptr - 1;
+ while((*lastptr & 0xc0) == 0x80) lastptr--;
+ GETCHAR(c, lastptr);
+ prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;
+ }
+ if (eptr >= md->end_subject) cur_is_word = FALSE; else
+ {
+ GETCHAR(c, eptr);
+ cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;
+ }
+ }
+ else
+#endif
+
+ /* More streamlined when not in UTF-8 mode */
+
+ {
+ prev_is_word = (eptr != md->start_subject) &&
+ ((md->ctypes[eptr[-1]] & ctype_word) != 0);
+ cur_is_word = (eptr < md->end_subject) &&
+ ((md->ctypes[*eptr] & ctype_word) != 0);
+ }
+
+ /* Now see if the situation is what we want */
+
+ if ((*ecode++ == OP_WORD_BOUNDARY)?
+ cur_is_word == prev_is_word : cur_is_word != prev_is_word)
+ RRETURN(MATCH_NOMATCH);
+ }
+ break;
+
+ /* Match a single character type; inline for speed */
+
+ case OP_ANY:
+ if ((ims & PCRE_DOTALL) == 0)
+ {
+ if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);
+ }
+ if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ if (utf8)
+ while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+ ecode++;
+ break;
+
+ /* Match a single byte, even in UTF-8 mode. This opcode really does match
+ any byte, even newline, independent of the setting of PCRE_DOTALL. */
+
+ case OP_ANYBYTE:
+ if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ case OP_NOT_DIGIT:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ if (
+#ifdef SUPPORT_UTF8
+ c < 256 &&
+#endif
+ (md->ctypes[c] & ctype_digit) != 0
+ )
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ case OP_DIGIT:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ if (
+#ifdef SUPPORT_UTF8
+ c >= 256 ||
+#endif
+ (md->ctypes[c] & ctype_digit) == 0
+ )
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ case OP_NOT_WHITESPACE:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ if (
+#ifdef SUPPORT_UTF8
+ c < 256 &&
+#endif
+ (md->ctypes[c] & ctype_space) != 0
+ )
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ case OP_WHITESPACE:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ if (
+#ifdef SUPPORT_UTF8
+ c >= 256 ||
+#endif
+ (md->ctypes[c] & ctype_space) == 0
+ )
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ case OP_NOT_WORDCHAR:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ if (
+#ifdef SUPPORT_UTF8
+ c < 256 &&
+#endif
+ (md->ctypes[c] & ctype_word) != 0
+ )
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ case OP_WORDCHAR:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ if (
+#ifdef SUPPORT_UTF8
+ c >= 256 ||
+#endif
+ (md->ctypes[c] & ctype_word) == 0
+ )
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ case OP_ANYNL:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ switch(c)
+ {
+ default: RRETURN(MATCH_NOMATCH);
+ case 0x000d:
+ if (eptr < md->end_subject && *eptr == 0x0a) eptr++;
+ break;
+ case 0x000a:
+ case 0x000b:
+ case 0x000c:
+ case 0x0085:
+ case 0x2028:
+ case 0x2029:
+ break;
+ }
+ ecode++;
+ break;
+
+#ifdef SUPPORT_UCP
+ /* Check the next character by Unicode property. We will get here only
+ if the support is in the binary; otherwise a compile-time error occurs. */
+
+ case OP_PROP:
+ case OP_NOTPROP:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ {
+ int chartype, script;
+ int category = _pcre_ucp_findprop(c, &chartype, &script);
+
+ switch(ecode[1])
+ {
+ case PT_ANY:
+ if (op == OP_NOTPROP) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case PT_LAMP:
+ if ((chartype == ucp_Lu ||
+ chartype == ucp_Ll ||
+ chartype == ucp_Lt) == (op == OP_NOTPROP))
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ case PT_GC:
+ if ((ecode[2] != category) == (op == OP_PROP))
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ case PT_PC:
+ if ((ecode[2] != chartype) == (op == OP_PROP))
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ case PT_SC:
+ if ((ecode[2] != script) == (op == OP_PROP))
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ default:
+ RRETURN(PCRE_ERROR_INTERNAL);
+ }
+
+ ecode += 3;
+ }
+ break;
+
+ /* Match an extended Unicode sequence. We will get here only if the support
+ is in the binary; otherwise a compile-time error occurs. */
+
+ case OP_EXTUNI:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ {
+ int chartype, script;
+ int category = _pcre_ucp_findprop(c, &chartype, &script);
+ if (category == ucp_M) RRETURN(MATCH_NOMATCH);
+ while (eptr < md->end_subject)
+ {
+ int len = 1;
+ if (!utf8) c = *eptr; else
+ {
+ GETCHARLEN(c, eptr, len);
+ }
+ category = _pcre_ucp_findprop(c, &chartype, &script);
+ if (category != ucp_M) break;
+ eptr += len;
+ }
+ }
+ ecode++;
+ break;
+#endif
+
+
+ /* Match a back reference, possibly repeatedly. Look past the end of the
+ item to see if there is repeat information following. The code is similar
+ to that for character classes, but repeated for efficiency. Then obey
+ similar code to character type repeats - written out again for speed.
+ However, if the referenced string is the empty string, always treat
+ it as matched, any number of times (otherwise there could be infinite
+ loops). */
+
+ case OP_REF:
+ {
+ offset = GET2(ecode, 1) << 1; /* Doubled ref number */
+ ecode += 3; /* Advance past item */
+
+ /* If the reference is unset, set the length to be longer than the amount
+ of subject left; this ensures that every attempt at a match fails. We
+ can't just fail here, because of the possibility of quantifiers with zero
+ minima. */
+
+ length = (offset >= offset_top || md->offset_vector[offset] < 0)?
+ md->end_subject - eptr + 1 :
+ md->offset_vector[offset+1] - md->offset_vector[offset];
+
+ /* Set up for repetition, or handle the non-repeated case */
+
+ switch (*ecode)
+ {
+ case OP_CRSTAR:
+ case OP_CRMINSTAR:
+ case OP_CRPLUS:
+ case OP_CRMINPLUS:
+ case OP_CRQUERY:
+ case OP_CRMINQUERY:
+ c = *ecode++ - OP_CRSTAR;
+ minimize = (c & 1) != 0;
+ min = rep_min[c]; /* Pick up values from tables; */
+ max = rep_max[c]; /* zero for max => infinity */
+ if (max == 0) max = INT_MAX;
+ break;
+
+ case OP_CRRANGE:
+ case OP_CRMINRANGE:
+ minimize = (*ecode == OP_CRMINRANGE);
+ min = GET2(ecode, 1);
+ max = GET2(ecode, 3);
+ if (max == 0) max = INT_MAX;
+ ecode += 5;
+ break;
+
+ default: /* No repeat follows */
+ if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH);
+ eptr += length;
+ continue; /* With the main loop */
+ }
+
+ /* If the length of the reference is zero, just continue with the
+ main loop. */
+
+ if (length == 0) continue;
+
+ /* First, ensure the minimum number of matches are present. We get back
+ the length of the reference string explicitly rather than passing the
+ address of eptr, so that eptr can be a register variable. */
+
+ for (i = 1; i <= min; i++)
+ {
+ if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH);
+ eptr += length;
+ }
+
+ /* If min = max, continue at the same level without recursion.
+ They are not both allowed to be zero. */
+
+ if (min == max) continue;
+
+ /* If minimizing, keep trying and advancing the pointer */
+
+ if (minimize)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || !match_ref(offset, eptr, length, md, ims))
+ RRETURN(MATCH_NOMATCH);
+ eptr += length;
+ }
+ /* Control never gets here */
+ }
+
+ /* If maximizing, find the longest string and work backwards */
+
+ else
+ {
+ pp = eptr;
+ for (i = min; i < max; i++)
+ {
+ if (!match_ref(offset, eptr, length, md, ims)) break;
+ eptr += length;
+ }
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ eptr -= length;
+ }
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ /* Control never gets here */
+
+
+
+ /* Match a bit-mapped character class, possibly repeatedly. This op code is
+ used when all the characters in the class have values in the range 0-255,
+ and either the matching is caseful, or the characters are in the range
+ 0-127 when UTF-8 processing is enabled. The only difference between
+ OP_CLASS and OP_NCLASS occurs when a data character outside the range is
+ encountered.
+
+ First, look past the end of the item to see if there is repeat information
+ following. Then obey similar code to character type repeats - written out
+ again for speed. */
+
+ case OP_NCLASS:
+ case OP_CLASS:
+ {
+ data = ecode + 1; /* Save for matching */
+ ecode += 33; /* Advance past the item */
+
+ switch (*ecode)
+ {
+ case OP_CRSTAR:
+ case OP_CRMINSTAR:
+ case OP_CRPLUS:
+ case OP_CRMINPLUS:
+ case OP_CRQUERY:
+ case OP_CRMINQUERY:
+ c = *ecode++ - OP_CRSTAR;
+ minimize = (c & 1) != 0;
+ min = rep_min[c]; /* Pick up values from tables; */
+ max = rep_max[c]; /* zero for max => infinity */
+ if (max == 0) max = INT_MAX;
+ break;
+
+ case OP_CRRANGE:
+ case OP_CRMINRANGE:
+ minimize = (*ecode == OP_CRMINRANGE);
+ min = GET2(ecode, 1);
+ max = GET2(ecode, 3);
+ if (max == 0) max = INT_MAX;
+ ecode += 5;
+ break;
+
+ default: /* No repeat follows */
+ min = max = 1;
+ break;
+ }
+
+ /* First, ensure the minimum number of matches are present. */
+
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (utf8)
+ {
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ if (c > 255)
+ {
+ if (op == OP_CLASS) RRETURN(MATCH_NOMATCH);
+ }
+ else
+ {
+ if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);
+ }
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ c = *eptr++;
+ if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);
+ }
+ }
+
+ /* If max == min we can continue with the main loop without the
+ need to recurse. */
+
+ if (min == max) continue;
+
+ /* If minimizing, keep testing the rest of the expression and advancing
+ the pointer while it matches the class. */
+
+ if (minimize)
+ {
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (utf8)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ if (c > 255)
+ {
+ if (op == OP_CLASS) RRETURN(MATCH_NOMATCH);
+ }
+ else
+ {
+ if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);
+ }
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ c = *eptr++;
+ if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);
+ }
+ }
+ /* Control never gets here */
+ }
+
+ /* If maximizing, find the longest possible run, then work backwards. */
+
+ else
+ {
+ pp = eptr;
+
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (utf8)
+ {
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (c > 255)
+ {
+ if (op == OP_CLASS) break;
+ }
+ else
+ {
+ if ((data[c/8] & (1 << (c&7))) == 0) break;
+ }
+ eptr += len;
+ }
+ for (;;)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (eptr-- == pp) break; /* Stop if tried at original pos */
+ BACKCHAR(eptr);
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject) break;
+ c = *eptr;
+ if ((data[c/8] & (1 << (c&7))) == 0) break;
+ eptr++;
+ }
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ eptr--;
+ }
+ }
+
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ /* Control never gets here */
+
+
+ /* Match an extended character class. This opcode is encountered only
+ in UTF-8 mode, because that's the only time it is compiled. */
+
+#ifdef SUPPORT_UTF8
+ case OP_XCLASS:
+ {
+ data = ecode + 1 + LINK_SIZE; /* Save for matching */
+ ecode += GET(ecode, 1); /* Advance past the item */
+
+ switch (*ecode)
+ {
+ case OP_CRSTAR:
+ case OP_CRMINSTAR:
+ case OP_CRPLUS:
+ case OP_CRMINPLUS:
+ case OP_CRQUERY:
+ case OP_CRMINQUERY:
+ c = *ecode++ - OP_CRSTAR;
+ minimize = (c & 1) != 0;
+ min = rep_min[c]; /* Pick up values from tables; */
+ max = rep_max[c]; /* zero for max => infinity */
+ if (max == 0) max = INT_MAX;
+ break;
+
+ case OP_CRRANGE:
+ case OP_CRMINRANGE:
+ minimize = (*ecode == OP_CRMINRANGE);
+ min = GET2(ecode, 1);
+ max = GET2(ecode, 3);
+ if (max == 0) max = INT_MAX;
+ ecode += 5;
+ break;
+
+ default: /* No repeat follows */
+ min = max = 1;
+ break;
+ }
+
+ /* First, ensure the minimum number of matches are present. */
+
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH);
+ }
+
+ /* If max == min we can continue with the main loop without the
+ need to recurse. */
+
+ if (min == max) continue;
+
+ /* If minimizing, keep testing the rest of the expression and advancing
+ the pointer while it matches the class. */
+
+ if (minimize)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+ }
+
+ /* If maximizing, find the longest possible run, then work backwards. */
+
+ else
+ {
+ pp = eptr;
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (!_pcre_xclass(c, data)) break;
+ eptr += len;
+ }
+ for(;;)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (eptr-- == pp) break; /* Stop if tried at original pos */
+ BACKCHAR(eptr)
+ }
+ RRETURN(MATCH_NOMATCH);
+ }
+
+ /* Control never gets here */
+ }
+#endif /* End of XCLASS */
+
+ /* Match a single character, casefully */
+
+ case OP_CHAR:
+#ifdef SUPPORT_UTF8
+ if (utf8)
+ {
+ length = 1;
+ ecode++;
+ GETCHARLEN(fc, ecode, length);
+ if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+ while (length-- > 0) if (*ecode++ != *eptr++) RRETURN(MATCH_NOMATCH);
+ }
+ else
+#endif
+
+ /* Non-UTF-8 mode */
+ {
+ if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH);
+ if (ecode[1] != *eptr++) RRETURN(MATCH_NOMATCH);
+ ecode += 2;
+ }
+ break;
+
+ /* Match a single character, caselessly */
+
+ case OP_CHARNC:
+#ifdef SUPPORT_UTF8
+ if (utf8)
+ {
+ length = 1;
+ ecode++;
+ GETCHARLEN(fc, ecode, length);
+
+ if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+
+ /* If the pattern character's value is < 128, we have only one byte, and
+ can use the fast lookup table. */
+
+ if (fc < 128)
+ {
+ if (md->lcc[*ecode++] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);
+ }
+
+ /* Otherwise we must pick up the subject character */
+
+ else
+ {
+ unsigned int dc;
+ GETCHARINC(dc, eptr);
+ ecode += length;
+
+ /* If we have Unicode property support, we can use it to test the other
+ case of the character, if there is one. */
+
+ if (fc != dc)
+ {
+#ifdef SUPPORT_UCP
+ if (dc != _pcre_ucp_othercase(fc))
+#endif
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ }
+ else
+#endif /* SUPPORT_UTF8 */
+
+ /* Non-UTF-8 mode */
+ {
+ if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH);
+ if (md->lcc[ecode[1]] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);
+ ecode += 2;
+ }
+ break;
+
+ /* Match a single character repeatedly. */
+
+ case OP_EXACT:
+ min = max = GET2(ecode, 1);
+ ecode += 3;
+ goto REPEATCHAR;
+
+ case OP_POSUPTO:
+ possessive = TRUE;
+ /* Fall through */
+
+ case OP_UPTO:
+ case OP_MINUPTO:
+ min = 0;
+ max = GET2(ecode, 1);
+ minimize = *ecode == OP_MINUPTO;
+ ecode += 3;
+ goto REPEATCHAR;
+
+ case OP_POSSTAR:
+ possessive = TRUE;
+ min = 0;
+ max = INT_MAX;
+ ecode++;
+ goto REPEATCHAR;
+
+ case OP_POSPLUS:
+ possessive = TRUE;
+ min = 1;
+ max = INT_MAX;
+ ecode++;
+ goto REPEATCHAR;
+
+ case OP_POSQUERY:
+ possessive = TRUE;
+ min = 0;
+ max = 1;
+ ecode++;
+ goto REPEATCHAR;
+
+ case OP_STAR:
+ case OP_MINSTAR:
+ case OP_PLUS:
+ case OP_MINPLUS:
+ case OP_QUERY:
+ case OP_MINQUERY:
+ c = *ecode++ - OP_STAR;
+ minimize = (c & 1) != 0;
+ min = rep_min[c]; /* Pick up values from tables; */
+ max = rep_max[c]; /* zero for max => infinity */
+ if (max == 0) max = INT_MAX;
+
+ /* Common code for all repeated single-character matches. We can give
+ up quickly if there are fewer than the minimum number of characters left in
+ the subject. */
+
+ REPEATCHAR:
+#ifdef SUPPORT_UTF8
+ if (utf8)
+ {
+ length = 1;
+ charptr = ecode;
+ GETCHARLEN(fc, ecode, length);
+ if (min * length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+ ecode += length;
+
+ /* Handle multibyte character matching specially here. There is
+ support for caseless matching if UCP support is present. */
+
+ if (length > 1)
+ {
+ int oclength = 0;
+ uschar occhars[8];
+
+#ifdef SUPPORT_UCP
+ unsigned int othercase;
+ if ((ims & PCRE_CASELESS) != 0 &&
+ (othercase = _pcre_ucp_othercase(fc)) != NOTACHAR)
+ oclength = _pcre_ord2utf8(othercase, occhars);
+#endif /* SUPPORT_UCP */
+
+ for (i = 1; i <= min; i++)
+ {
+ if (memcmp(eptr, charptr, length) == 0) eptr += length;
+ /* Need braces because of following else */
+ else if (oclength == 0) { RRETURN(MATCH_NOMATCH); }
+ else
+ {
+ if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH);
+ eptr += oclength;
+ }
+ }
+
+ if (min == max) continue;
+
+ if (minimize)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ if (memcmp(eptr, charptr, length) == 0) eptr += length;
+ /* Need braces because of following else */
+ else if (oclength == 0) { RRETURN(MATCH_NOMATCH); }
+ else
+ {
+ if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH);
+ eptr += oclength;
+ }
+ }
+ /* Control never gets here */
+ }
+
+ else /* Maximize */
+ {
+ pp = eptr;
+ for (i = min; i < max; i++)
+ {
+ if (eptr > md->end_subject - length) break;
+ if (memcmp(eptr, charptr, length) == 0) eptr += length;
+ else if (oclength == 0) break;
+ else
+ {
+ if (memcmp(eptr, occhars, oclength) != 0) break;
+ eptr += oclength;
+ }
+ }
+
+ if (possessive) continue;
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ eptr -= length;
+ }
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+ }
+
+ /* If the length of a UTF-8 character is 1, we fall through here, and
+ obey the code as for non-UTF-8 characters below, though in this case the
+ value of fc will always be < 128. */
+ }
+ else
+#endif /* SUPPORT_UTF8 */
+
+ /* When not in UTF-8 mode, load a single-byte character. */
+ {
+ if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+ fc = *ecode++;
+ }
+
+ /* The value of fc at this point is always less than 256, though we may or
+ may not be in UTF-8 mode. The code is duplicated for the caseless and
+ caseful cases, for speed, since matching characters is likely to be quite
+ common. First, ensure the minimum number of matches are present. If min =
+ max, continue at the same level without recursing. Otherwise, if
+ minimizing, keep trying the rest of the expression and advancing one
+ matching character if failing, up to the maximum. Alternatively, if
+ maximizing, find the maximum number of characters and work backwards. */
+
+ DPRINTF(("matching %c{%d,%d} against subject %.*s\n", fc, min, max,
+ max, eptr));
+
+ if ((ims & PCRE_CASELESS) != 0)
+ {
+ fc = md->lcc[fc];
+ for (i = 1; i <= min; i++)
+ if (fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);
+ if (min == max) continue;
+ if (minimize)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject ||
+ fc != md->lcc[*eptr++])
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+ }
+ else /* Maximize */
+ {
+ pp = eptr;
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || fc != md->lcc[*eptr]) break;
+ eptr++;
+ }
+ if (possessive) continue;
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ eptr--;
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ }
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+ }
+
+ /* Caseful comparisons (includes all multi-byte characters) */
+
+ else
+ {
+ for (i = 1; i <= min; i++) if (fc != *eptr++) RRETURN(MATCH_NOMATCH);
+ if (min == max) continue;
+ if (minimize)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject || fc != *eptr++)
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+ }
+ else /* Maximize */
+ {
+ pp = eptr;
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || fc != *eptr) break;
+ eptr++;
+ }
+ if (possessive) continue;
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ eptr--;
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ }
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ /* Control never gets here */
+
+ /* Match a negated single one-byte character. The character we are
+ checking can be multibyte. */
+
+ case OP_NOT:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ ecode++;
+ GETCHARINCTEST(c, eptr);
+ if ((ims & PCRE_CASELESS) != 0)
+ {
+#ifdef SUPPORT_UTF8
+ if (c < 256)
+#endif
+ c = md->lcc[c];
+ if (md->lcc[*ecode++] == c) RRETURN(MATCH_NOMATCH);
+ }
+ else
+ {
+ if (*ecode++ == c) RRETURN(MATCH_NOMATCH);
+ }
+ break;
+
+ /* Match a negated single one-byte character repeatedly. This is almost a
+ repeat of the code for a repeated single character, but I haven't found a
+ nice way of commoning these up that doesn't require a test of the
+ positive/negative option for each character match. Maybe that wouldn't add
+ very much to the time taken, but character matching *is* what this is all
+ about... */
+
+ case OP_NOTEXACT:
+ min = max = GET2(ecode, 1);
+ ecode += 3;
+ goto REPEATNOTCHAR;
+
+ case OP_NOTUPTO:
+ case OP_NOTMINUPTO:
+ min = 0;
+ max = GET2(ecode, 1);
+ minimize = *ecode == OP_NOTMINUPTO;
+ ecode += 3;
+ goto REPEATNOTCHAR;
+
+ case OP_NOTPOSSTAR:
+ possessive = TRUE;
+ min = 0;
+ max = INT_MAX;
+ ecode++;
+ goto REPEATNOTCHAR;
+
+ case OP_NOTPOSPLUS:
+ possessive = TRUE;
+ min = 1;
+ max = INT_MAX;
+ ecode++;
+ goto REPEATNOTCHAR;
+
+ case OP_NOTPOSQUERY:
+ possessive = TRUE;
+ min = 0;
+ max = 1;
+ ecode++;
+ goto REPEATNOTCHAR;
+
+ case OP_NOTPOSUPTO:
+ possessive = TRUE;
+ min = 0;
+ max = GET2(ecode, 1);
+ ecode += 3;
+ goto REPEATNOTCHAR;
+
+ case OP_NOTSTAR:
+ case OP_NOTMINSTAR:
+ case OP_NOTPLUS:
+ case OP_NOTMINPLUS:
+ case OP_NOTQUERY:
+ case OP_NOTMINQUERY:
+ c = *ecode++ - OP_NOTSTAR;
+ minimize = (c & 1) != 0;
+ min = rep_min[c]; /* Pick up values from tables; */
+ max = rep_max[c]; /* zero for max => infinity */
+ if (max == 0) max = INT_MAX;
+
+ /* Common code for all repeated single-byte matches. We can give up quickly
+ if there are fewer than the minimum number of bytes left in the
+ subject. */
+
+ REPEATNOTCHAR:
+ if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+ fc = *ecode++;
+
+ /* The code is duplicated for the caseless and caseful cases, for speed,
+ since matching characters is likely to be quite common. First, ensure the
+ minimum number of matches are present. If min = max, continue at the same
+ level without recursing. Otherwise, if minimizing, keep trying the rest of
+ the expression and advancing one matching character if failing, up to the
+ maximum. Alternatively, if maximizing, find the maximum number of
+ characters and work backwards. */
+
+ DPRINTF(("negative matching %c{%d,%d} against subject %.*s\n", fc, min, max,
+ max, eptr));
+
+ if ((ims & PCRE_CASELESS) != 0)
+ {
+ fc = md->lcc[fc];
+
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (utf8)
+ {
+ register unsigned int d;
+ for (i = 1; i <= min; i++)
+ {
+ GETCHARINC(d, eptr);
+ if (d < 256) d = md->lcc[d];
+ if (fc == d) RRETURN(MATCH_NOMATCH);
+ }
+ }
+ else
+#endif
+
+ /* Not UTF-8 mode */
+ {
+ for (i = 1; i <= min; i++)
+ if (fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);
+ }
+
+ if (min == max) continue;
+
+ if (minimize)
+ {
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (utf8)
+ {
+ register unsigned int d;
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ GETCHARINC(d, eptr);
+ if (d < 256) d = md->lcc[d];
+ if (fi >= max || eptr >= md->end_subject || fc == d)
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject || fc == md->lcc[*eptr++])
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ /* Control never gets here */
+ }
+
+ /* Maximize case */
+
+ else
+ {
+ pp = eptr;
+
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (utf8)
+ {
+ register unsigned int d;
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(d, eptr, len);
+ if (d < 256) d = md->lcc[d];
+ if (fc == d) break;
+ eptr += len;
+ }
+ if (possessive) continue;
+ for(;;)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (eptr-- == pp) break; /* Stop if tried at original pos */
+ BACKCHAR(eptr);
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || fc == md->lcc[*eptr]) break;
+ eptr++;
+ }
+ if (possessive) continue;
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ eptr--;
+ }
+ }
+
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+ }
+
+ /* Caseful comparisons */
+
+ else
+ {
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (utf8)
+ {
+ register unsigned int d;
+ for (i = 1; i <= min; i++)
+ {
+ GETCHARINC(d, eptr);
+ if (fc == d) RRETURN(MATCH_NOMATCH);
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (i = 1; i <= min; i++)
+ if (fc == *eptr++) RRETURN(MATCH_NOMATCH);
+ }
+
+ if (min == max) continue;
+
+ if (minimize)
+ {
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (utf8)
+ {
+ register unsigned int d;
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ GETCHARINC(d, eptr);
+ if (fi >= max || eptr >= md->end_subject || fc == d)
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject || fc == *eptr++)
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ /* Control never gets here */
+ }
+
+ /* Maximize case */
+
+ else
+ {
+ pp = eptr;
+
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (utf8)
+ {
+ register unsigned int d;
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(d, eptr, len);
+ if (fc == d) break;
+ eptr += len;
+ }
+ if (possessive) continue;
+ for(;;)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (eptr-- == pp) break; /* Stop if tried at original pos */
+ BACKCHAR(eptr);
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || fc == *eptr) break;
+ eptr++;
+ }
+ if (possessive) continue;
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ eptr--;
+ }
+ }
+
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ /* Control never gets here */
+
+ /* Match a single character type repeatedly; several different opcodes
+ share code. This is very similar to the code for single characters, but we
+ repeat it in the interests of efficiency. */
+
+ case OP_TYPEEXACT:
+ min = max = GET2(ecode, 1);
+ minimize = TRUE;
+ ecode += 3;
+ goto REPEATTYPE;
+
+ case OP_TYPEUPTO:
+ case OP_TYPEMINUPTO:
+ min = 0;
+ max = GET2(ecode, 1);
+ minimize = *ecode == OP_TYPEMINUPTO;
+ ecode += 3;
+ goto REPEATTYPE;
+
+ case OP_TYPEPOSSTAR:
+ possessive = TRUE;
+ min = 0;
+ max = INT_MAX;
+ ecode++;
+ goto REPEATTYPE;
+
+ case OP_TYPEPOSPLUS:
+ possessive = TRUE;
+ min = 1;
+ max = INT_MAX;
+ ecode++;
+ goto REPEATTYPE;
+
+ case OP_TYPEPOSQUERY:
+ possessive = TRUE;
+ min = 0;
+ max = 1;
+ ecode++;
+ goto REPEATTYPE;
+
+ case OP_TYPEPOSUPTO:
+ possessive = TRUE;
+ min = 0;
+ max = GET2(ecode, 1);
+ ecode += 3;
+ goto REPEATTYPE;
+
+ case OP_TYPESTAR:
+ case OP_TYPEMINSTAR:
+ case OP_TYPEPLUS:
+ case OP_TYPEMINPLUS:
+ case OP_TYPEQUERY:
+ case OP_TYPEMINQUERY:
+ c = *ecode++ - OP_TYPESTAR;
+ minimize = (c & 1) != 0;
+ min = rep_min[c]; /* Pick up values from tables; */
+ max = rep_max[c]; /* zero for max => infinity */
+ if (max == 0) max = INT_MAX;
+
+ /* Common code for all repeated single character type matches. Note that
+ in UTF-8 mode, '.' matches a character of any length, but for the other
+ character types, the valid characters are all one-byte long. */
+
+ REPEATTYPE:
+ ctype = *ecode++; /* Code for the character type */
+
+#ifdef SUPPORT_UCP
+ if (ctype == OP_PROP || ctype == OP_NOTPROP)
+ {
+ prop_fail_result = ctype == OP_NOTPROP;
+ prop_type = *ecode++;
+ prop_value = *ecode++;
+ }
+ else prop_type = -1;
+#endif
+
+ /* First, ensure the minimum number of matches are present. Use inline
+ code for maximizing the speed, and do the type test once at the start
+ (i.e. keep it out of the loop). Also we can test that there are at least
+ the minimum number of bytes before we start. This isn't as effective in
+ UTF-8 mode, but it does no harm. Separate the UTF-8 code completely as that
+ is tidier. Also separate the UCP code, which can be the same for both UTF-8
+ and single-bytes. */
+
+ if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+ if (min > 0)
+ {
+#ifdef SUPPORT_UCP
+ if (prop_type >= 0)
+ {
+ switch(prop_type)
+ {
+ case PT_ANY:
+ if (prop_fail_result) RRETURN(MATCH_NOMATCH);
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ }
+ break;
+
+ case PT_LAMP:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if ((prop_chartype == ucp_Lu ||
+ prop_chartype == ucp_Ll ||
+ prop_chartype == ucp_Lt) == prop_fail_result)
+ RRETURN(MATCH_NOMATCH);
+ }
+ break;
+
+ case PT_GC:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if ((prop_category == prop_value) == prop_fail_result)
+ RRETURN(MATCH_NOMATCH);
+ }
+ break;
+
+ case PT_PC:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if ((prop_chartype == prop_value) == prop_fail_result)
+ RRETURN(MATCH_NOMATCH);
+ }
+ break;
+
+ case PT_SC:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if ((prop_script == prop_value) == prop_fail_result)
+ RRETURN(MATCH_NOMATCH);
+ }
+ break;
+
+ default:
+ RRETURN(PCRE_ERROR_INTERNAL);
+ }
+ }
+
+ /* Match extended Unicode sequences. We will get here only if the
+ support is in the binary; otherwise a compile-time error occurs. */
+
+ else if (ctype == OP_EXTUNI)
+ {
+ for (i = 1; i <= min; i++)
+ {
+ GETCHARINCTEST(c, eptr);
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH);
+ while (eptr < md->end_subject)
+ {
+ int len = 1;
+ if (!utf8) c = *eptr; else
+ {
+ GETCHARLEN(c, eptr, len);
+ }
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if (prop_category != ucp_M) break;
+ eptr += len;
+ }
+ }
+ }
+
+ else
+#endif /* SUPPORT_UCP */
+
+/* Handle all other cases when the coding is UTF-8 */
+
+#ifdef SUPPORT_UTF8
+ if (utf8) switch(ctype)
+ {
+ case OP_ANY:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject ||
+ ((ims & PCRE_DOTALL) == 0 && IS_NEWLINE(eptr)))
+ RRETURN(MATCH_NOMATCH);
+ eptr++;
+ while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+ }
+ break;
+
+ case OP_ANYBYTE:
+ eptr += min;
+ break;
+
+ case OP_ANYNL:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ switch(c)
+ {
+ default: RRETURN(MATCH_NOMATCH);
+ case 0x000d:
+ if (eptr < md->end_subject && *eptr == 0x0a) eptr++;
+ break;
+ case 0x000a:
+ case 0x000b:
+ case 0x000c:
+ case 0x0085:
+ case 0x2028:
+ case 0x2029:
+ break;
+ }
+ }
+ break;
+
+ case OP_NOT_DIGIT:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ if (c < 128 && (md->ctypes[c] & ctype_digit) != 0)
+ RRETURN(MATCH_NOMATCH);
+ }
+ break;
+
+ case OP_DIGIT:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject ||
+ *eptr >= 128 || (md->ctypes[*eptr++] & ctype_digit) == 0)
+ RRETURN(MATCH_NOMATCH);
+ /* No need to skip more bytes - we know it's a 1-byte character */
+ }
+ break;
+
+ case OP_NOT_WHITESPACE:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject ||
+ (*eptr < 128 && (md->ctypes[*eptr++] & ctype_space) != 0))
+ RRETURN(MATCH_NOMATCH);
+ while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+ }
+ break;
+
+ case OP_WHITESPACE:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject ||
+ *eptr >= 128 || (md->ctypes[*eptr++] & ctype_space) == 0)
+ RRETURN(MATCH_NOMATCH);
+ /* No need to skip more bytes - we know it's a 1-byte character */
+ }
+ break;
+
+ case OP_NOT_WORDCHAR:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject ||
+ (*eptr < 128 && (md->ctypes[*eptr++] & ctype_word) != 0))
+ RRETURN(MATCH_NOMATCH);
+ while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+ }
+ break;
+
+ case OP_WORDCHAR:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject ||
+ *eptr >= 128 || (md->ctypes[*eptr++] & ctype_word) == 0)
+ RRETURN(MATCH_NOMATCH);
+ /* No need to skip more bytes - we know it's a 1-byte character */
+ }
+ break;
+
+ default:
+ RRETURN(PCRE_ERROR_INTERNAL);
+ } /* End switch(ctype) */
+
+ else
+#endif /* SUPPORT_UTF8 */
+
+ /* Code for the non-UTF-8 case for minimum matching of operators other
+ than OP_PROP and OP_NOTPROP. We can assume that there are the minimum
+ number of bytes present, as this was tested above. */
+
+ switch(ctype)
+ {
+ case OP_ANY:
+ if ((ims & PCRE_DOTALL) == 0)
+ {
+ for (i = 1; i <= min; i++)
+ {
+ if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);
+ eptr++;
+ }
+ }
+ else eptr += min;
+ break;
+
+ case OP_ANYBYTE:
+ eptr += min;
+ break;
+
+ /* Because of the CRLF case, we can't assume the minimum number of
+ bytes are present in this case. */
+
+ case OP_ANYNL:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ switch(*eptr++)
+ {
+ default: RRETURN(MATCH_NOMATCH);
+ case 0x000d:
+ if (eptr < md->end_subject && *eptr == 0x0a) eptr++;
+ break;
+ case 0x000a:
+ case 0x000b:
+ case 0x000c:
+ case 0x0085:
+ break;
+ }
+ }
+ break;
+
+ case OP_NOT_DIGIT:
+ for (i = 1; i <= min; i++)
+ if ((md->ctypes[*eptr++] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_DIGIT:
+ for (i = 1; i <= min; i++)
+ if ((md->ctypes[*eptr++] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_NOT_WHITESPACE:
+ for (i = 1; i <= min; i++)
+ if ((md->ctypes[*eptr++] & ctype_space) != 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_WHITESPACE:
+ for (i = 1; i <= min; i++)
+ if ((md->ctypes[*eptr++] & ctype_space) == 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_NOT_WORDCHAR:
+ for (i = 1; i <= min; i++)
+ if ((md->ctypes[*eptr++] & ctype_word) != 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_WORDCHAR:
+ for (i = 1; i <= min; i++)
+ if ((md->ctypes[*eptr++] & ctype_word) == 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ default:
+ RRETURN(PCRE_ERROR_INTERNAL);
+ }
+ }
+
+ /* If min = max, continue at the same level without recursing */
+
+ if (min == max) continue;
+
+ /* If minimizing, we have to test the rest of the pattern before each
+ subsequent match. Again, separate the UTF-8 case for speed, and also
+ separate the UCP cases. */
+
+ if (minimize)
+ {
+#ifdef SUPPORT_UCP
+ if (prop_type >= 0)
+ {
+ switch(prop_type)
+ {
+ case PT_ANY:
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ if (prop_fail_result) RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+
+ case PT_LAMP:
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if ((prop_chartype == ucp_Lu ||
+ prop_chartype == ucp_Ll ||
+ prop_chartype == ucp_Lt) == prop_fail_result)
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+
+ case PT_GC:
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if ((prop_category == prop_value) == prop_fail_result)
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+
+ case PT_PC:
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if ((prop_chartype == prop_value) == prop_fail_result)
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+
+ case PT_SC:
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if ((prop_script == prop_value) == prop_fail_result)
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+
+ default:
+ RRETURN(PCRE_ERROR_INTERNAL);
+ }
+ }
+
+ /* Match extended Unicode sequences. We will get here only if the
+ support is in the binary; otherwise a compile-time error occurs. */
+
+ else if (ctype == OP_EXTUNI)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH);
+ while (eptr < md->end_subject)
+ {
+ int len = 1;
+ if (!utf8) c = *eptr; else
+ {
+ GETCHARLEN(c, eptr, len);
+ }
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if (prop_category != ucp_M) break;
+ eptr += len;
+ }
+ }
+ }
+
+ else
+#endif /* SUPPORT_UCP */
+
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (utf8)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject ||
+ (ctype == OP_ANY && (ims & PCRE_DOTALL) == 0 &&
+ IS_NEWLINE(eptr)))
+ RRETURN(MATCH_NOMATCH);
+
+ GETCHARINC(c, eptr);
+ switch(ctype)
+ {
+ case OP_ANY: /* This is the DOTALL case */
+ break;
+
+ case OP_ANYBYTE:
+ break;
+
+ case OP_ANYNL:
+ switch(c)
+ {
+ default: RRETURN(MATCH_NOMATCH);
+ case 0x000d:
+ if (eptr < md->end_subject && *eptr == 0x0a) eptr++;
+ break;
+ case 0x000a:
+ case 0x000b:
+ case 0x000c:
+ case 0x0085:
+ case 0x2028:
+ case 0x2029:
+ break;
+ }
+ break;
+
+ case OP_NOT_DIGIT:
+ if (c < 256 && (md->ctypes[c] & ctype_digit) != 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_DIGIT:
+ if (c >= 256 || (md->ctypes[c] & ctype_digit) == 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_NOT_WHITESPACE:
+ if (c < 256 && (md->ctypes[c] & ctype_space) != 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_WHITESPACE:
+ if (c >= 256 || (md->ctypes[c] & ctype_space) == 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_NOT_WORDCHAR:
+ if (c < 256 && (md->ctypes[c] & ctype_word) != 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_WORDCHAR:
+ if (c >= 256 || (md->ctypes[c] & ctype_word) == 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ default:
+ RRETURN(PCRE_ERROR_INTERNAL);
+ }
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject ||
+ ((ims & PCRE_DOTALL) == 0 && IS_NEWLINE(eptr)))
+ RRETURN(MATCH_NOMATCH);
+
+ c = *eptr++;
+ switch(ctype)
+ {
+ case OP_ANY: /* This is the DOTALL case */
+ break;
+
+ case OP_ANYBYTE:
+ break;
+
+ case OP_ANYNL:
+ switch(c)
+ {
+ default: RRETURN(MATCH_NOMATCH);
+ case 0x000d:
+ if (eptr < md->end_subject && *eptr == 0x0a) eptr++;
+ break;
+ case 0x000a:
+ case 0x000b:
+ case 0x000c:
+ case 0x0085:
+ break;
+ }
+ break;
+
+ case OP_NOT_DIGIT:
+ if ((md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_DIGIT:
+ if ((md->ctypes[c] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_NOT_WHITESPACE:
+ if ((md->ctypes[c] & ctype_space) != 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_WHITESPACE:
+ if ((md->ctypes[c] & ctype_space) == 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_NOT_WORDCHAR:
+ if ((md->ctypes[c] & ctype_word) != 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_WORDCHAR:
+ if ((md->ctypes[c] & ctype_word) == 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ default:
+ RRETURN(PCRE_ERROR_INTERNAL);
+ }
+ }
+ }
+ /* Control never gets here */
+ }
+
+ /* If maximizing, it is worth using inline code for speed, doing the type
+ test once at the start (i.e. keep it out of the loop). Again, keep the
+ UTF-8 and UCP stuff separate. */
+
+ else
+ {
+ pp = eptr; /* Remember where we started */
+
+#ifdef SUPPORT_UCP
+ if (prop_type >= 0)
+ {
+ switch(prop_type)
+ {
+ case PT_ANY:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (prop_fail_result) break;
+ eptr+= len;
+ }
+ break;
+
+ case PT_LAMP:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if ((prop_chartype == ucp_Lu ||
+ prop_chartype == ucp_Ll ||
+ prop_chartype == ucp_Lt) == prop_fail_result)
+ break;
+ eptr+= len;
+ }
+ break;
+
+ case PT_GC:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if ((prop_category == prop_value) == prop_fail_result)
+ break;
+ eptr+= len;
+ }
+ break;
+
+ case PT_PC:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if ((prop_chartype == prop_value) == prop_fail_result)
+ break;
+ eptr+= len;
+ }
+ break;
+
+ case PT_SC:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if ((prop_script == prop_value) == prop_fail_result)
+ break;
+ eptr+= len;
+ }
+ break;
+ }
+
+ /* eptr is now past the end of the maximum run */
+
+ if (possessive) continue;
+ for(;;)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (eptr-- == pp) break; /* Stop if tried at original pos */
+ BACKCHAR(eptr);
+ }
+ }
+
+ /* Match extended Unicode sequences. We will get here only if the
+ support is in the binary; otherwise a compile-time error occurs. */
+
+ else if (ctype == OP_EXTUNI)
+ {
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject) break;
+ GETCHARINCTEST(c, eptr);
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if (prop_category == ucp_M) break;
+ while (eptr < md->end_subject)
+ {
+ int len = 1;
+ if (!utf8) c = *eptr; else
+ {
+ GETCHARLEN(c, eptr, len);
+ }
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if (prop_category != ucp_M) break;
+ eptr += len;
+ }
+ }
+
+ /* eptr is now past the end of the maximum run */
+
+ if (possessive) continue;
+ for(;;)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (eptr-- == pp) break; /* Stop if tried at original pos */
+ for (;;) /* Move back over one extended */
+ {
+ int len = 1;
+ BACKCHAR(eptr);
+ if (!utf8) c = *eptr; else
+ {
+ GETCHARLEN(c, eptr, len);
+ }
+ prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script);
+ if (prop_category != ucp_M) break;
+ eptr--;
+ }
+ }
+ }
+
+ else
+#endif /* SUPPORT_UCP */
+
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+
+ if (utf8)
+ {
+ switch(ctype)
+ {
+ case OP_ANY:
+
+ /* Special code is required for UTF8, but when the maximum is
+ unlimited we don't need it, so we repeat the non-UTF8 code. This is
+ probably worth it, because .* is quite a common idiom. */
+
+ if (max < INT_MAX)
+ {
+ if ((ims & PCRE_DOTALL) == 0)
+ {
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break;
+ eptr++;
+ while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+ }
+ }
+ else
+ {
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject) break;
+ eptr++;
+ while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+ }
+ }
+ }
+
+ /* Handle unlimited UTF-8 repeat */
+
+ else
+ {
+ if ((ims & PCRE_DOTALL) == 0)
+ {
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break;
+ eptr++;
+ }
+ break;
+ }
+ else
+ {
+ c = max - min;
+ if (c > (unsigned int)(md->end_subject - eptr))
+ c = md->end_subject - eptr;
+ eptr += c;
+ }
+ }
+ break;
+
+ /* The byte case is the same as non-UTF8 */
+
+ case OP_ANYBYTE:
+ c = max - min;
+ if (c > (unsigned int)(md->end_subject - eptr))
+ c = md->end_subject - eptr;
+ eptr += c;
+ break;
+
+ case OP_ANYNL:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (c == 0x000d)
+ {
+ if (++eptr >= md->end_subject) break;
+ if (*eptr == 0x000a) eptr++;
+ }
+ else
+ {
+ if (c != 0x000a && c != 0x000b && c != 0x000c &&
+ c != 0x0085 && c != 0x2028 && c != 0x2029)
+ break;
+ eptr += len;
+ }
+ }
+ break;
+
+ case OP_NOT_DIGIT:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) break;
+ eptr+= len;
+ }
+ break;
+
+ case OP_DIGIT:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (c >= 256 ||(md->ctypes[c] & ctype_digit) == 0) break;
+ eptr+= len;
+ }
+ break;
+
+ case OP_NOT_WHITESPACE:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (c < 256 && (md->ctypes[c] & ctype_space) != 0) break;
+ eptr+= len;
+ }
+ break;
+
+ case OP_WHITESPACE:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (c >= 256 ||(md->ctypes[c] & ctype_space) == 0) break;
+ eptr+= len;
+ }
+ break;
+
+ case OP_NOT_WORDCHAR:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (c < 256 && (md->ctypes[c] & ctype_word) != 0) break;
+ eptr+= len;
+ }
+ break;
+
+ case OP_WORDCHAR:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) break;
+ eptr+= len;
+ }
+ break;
+
+ default:
+ RRETURN(PCRE_ERROR_INTERNAL);
+ }
+
+ /* eptr is now past the end of the maximum run */
+
+ if (possessive) continue;
+ for(;;)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (eptr-- == pp) break; /* Stop if tried at original pos */
+ BACKCHAR(eptr);
+ }
+ }
+ else
+#endif
+
+ /* Not UTF-8 mode */
+ {
+ switch(ctype)
+ {
+ case OP_ANY:
+ if ((ims & PCRE_DOTALL) == 0)
+ {
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break;
+ eptr++;
+ }
+ break;
+ }
+ /* For DOTALL case, fall through and treat as \C */
+
+ case OP_ANYBYTE:
+ c = max - min;
+ if (c > (unsigned int)(md->end_subject - eptr))
+ c = md->end_subject - eptr;
+ eptr += c;
+ break;
+
+ case OP_ANYNL:
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject) break;
+ c = *eptr;
+ if (c == 0x000d)
+ {
+ if (++eptr >= md->end_subject) break;
+ if (*eptr == 0x000a) eptr++;
+ }
+ else
+ {
+ if (c != 0x000a && c != 0x000b && c != 0x000c && c != 0x0085)
+ break;
+ eptr++;
+ }
+ }
+ break;
+
+ case OP_NOT_DIGIT:
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0)
+ break;
+ eptr++;
+ }
+ break;
+
+ case OP_DIGIT:
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0)
+ break;
+ eptr++;
+ }
+ break;
+
+ case OP_NOT_WHITESPACE:
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0)
+ break;
+ eptr++;
+ }
+ break;
+
+ case OP_WHITESPACE:
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0)
+ break;
+ eptr++;
+ }
+ break;
+
+ case OP_NOT_WORDCHAR:
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0)
+ break;
+ eptr++;
+ }
+ break;
+
+ case OP_WORDCHAR:
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0)
+ break;
+ eptr++;
+ }
+ break;
+
+ default:
+ RRETURN(PCRE_ERROR_INTERNAL);
+ }
+
+ /* eptr is now past the end of the maximum run */
+
+ if (possessive) continue;
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ eptr--;
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ }
+ }
+
+ /* Get here if we can't make it match with any permitted repetitions */
+
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+
+ /* There's been some horrible disaster. Arrival here can only mean there is
+ something seriously wrong in the code above or the OP_xxx definitions. */
+
+ default:
+ DPRINTF(("Unknown opcode %d\n", *ecode));
+ RRETURN(PCRE_ERROR_UNKNOWN_OPCODE);
+ }
+
+ /* Do not stick any code in here without much thought; it is assumed
+ that "continue" in the code above comes out to here to repeat the main
+ loop. */
+
+ } /* End of main loop */
+/* Control never reaches here */
+}
+
+
+/***************************************************************************
+****************************************************************************
+ RECURSION IN THE match() FUNCTION
+
+Undefine all the macros that were defined above to handle this. */
+
+#ifdef NO_RECURSE
+#undef eptr
+#undef ecode
+#undef offset_top
+#undef ims
+#undef eptrb
+#undef flags
+
+#undef callpat
+#undef charptr
+#undef data
+#undef next
+#undef pp
+#undef prev
+#undef saved_eptr
+
+#undef new_recursive
+
+#undef cur_is_word
+#undef condition
+#undef prev_is_word
+
+#undef original_ims
+
+#undef ctype
+#undef length
+#undef max
+#undef min
+#undef number
+#undef offset
+#undef op
+#undef save_capture_last
+#undef save_offset1
+#undef save_offset2
+#undef save_offset3
+#undef stacksave
+
+#undef newptrb
+
+#endif
+
+/* These two are defined as macros in both cases */
+
+#undef fc
+#undef fi
+
+/***************************************************************************
+***************************************************************************/
+
+
+
+/*************************************************
+* Execute a Regular Expression *
+*************************************************/
+
+/* This function applies a compiled re to a subject string and picks out
+portions of the string if it matches. Two elements in the vector are set for
+each substring: the offsets to the start and end of the substring.
+
+Arguments:
+ argument_re points to the compiled expression
+ extra_data points to extra data or is NULL
+ subject points to the subject string
+ length length of subject string (may contain binary zeros)
+ start_offset where to start in the subject string
+ options option bits
+ offsets points to a vector of ints to be filled in with offsets
+ offsetcount the number of elements in the vector
+
+Returns: > 0 => success; value is the number of elements filled in
+ = 0 => success, but offsets is not big enough
+ -1 => failed to match
+ < -1 => some kind of unexpected problem
+*/
+
+PCRE_DATA_SCOPE int
+pcre_exec(const pcre *argument_re, const pcre_extra *extra_data,
+ PCRE_SPTR subject, int length, int start_offset, int options, int *offsets,
+ int offsetcount)
+{
+int rc, resetcount, ocount;
+int first_byte = -1;
+int req_byte = -1;
+int req_byte2 = -1;
+int newline;
+unsigned long int ims;
+BOOL using_temporary_offsets = FALSE;
+BOOL anchored;
+BOOL startline;
+BOOL firstline;
+BOOL first_byte_caseless = FALSE;
+BOOL req_byte_caseless = FALSE;
+BOOL utf8;
+match_data match_block;
+match_data *md = &match_block;
+const uschar *tables;
+const uschar *start_bits = NULL;
+USPTR start_match = (USPTR)subject + start_offset;
+USPTR end_subject;
+USPTR req_byte_ptr = start_match - 1;
+eptrblock eptrchain[EPTR_WORK_SIZE];
+
+pcre_study_data internal_study;
+const pcre_study_data *study;
+
+real_pcre internal_re;
+const real_pcre *external_re = (const real_pcre *)argument_re;
+const real_pcre *re = external_re;
+
+/* Plausibility checks */
+
+if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION;
+if (re == NULL || subject == NULL ||
+ (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL;
+if (offsetcount < 0) return PCRE_ERROR_BADCOUNT;
+
+/* Fish out the optional data from the extra_data structure, first setting
+the default values. */
+
+study = NULL;
+md->match_limit = MATCH_LIMIT;
+md->match_limit_recursion = MATCH_LIMIT_RECURSION;
+md->callout_data = NULL;
+
+/* The table pointer is always in native byte order. */
+
+tables = external_re->tables;
+
+if (extra_data != NULL)
+ {
+ register unsigned int flags = extra_data->flags;
+ if ((flags & PCRE_EXTRA_STUDY_DATA) != 0)
+ study = (const pcre_study_data *)extra_data->study_data;
+ if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0)
+ md->match_limit = extra_data->match_limit;
+ if ((flags & PCRE_EXTRA_MATCH_LIMIT_RECURSION) != 0)
+ md->match_limit_recursion = extra_data->match_limit_recursion;
+ if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0)
+ md->callout_data = extra_data->callout_data;
+ if ((flags & PCRE_EXTRA_TABLES) != 0) tables = extra_data->tables;
+ }
+
+/* If the exec call supplied NULL for tables, use the inbuilt ones. This
+is a feature that makes it possible to save compiled regex and re-use them
+in other programs later. */
+
+if (tables == NULL) tables = _pcre_default_tables;
+
+/* Check that the first field in the block is the magic number. If it is not,
+test for a regex that was compiled on a host of opposite endianness. If this is
+the case, flipped values are put in internal_re and internal_study if there was
+study data too. */
+
+if (re->magic_number != MAGIC_NUMBER)
+ {
+ re = _pcre_try_flipped(re, &internal_re, study, &internal_study);
+ if (re == NULL) return PCRE_ERROR_BADMAGIC;
+ if (study != NULL) study = &internal_study;
+ }
+
+/* Set up other data */
+
+anchored = ((re->options | options) & PCRE_ANCHORED) != 0;
+startline = (re->options & PCRE_STARTLINE) != 0;
+firstline = (re->options & PCRE_FIRSTLINE) != 0;
+
+/* The code starts after the real_pcre block and the capture name table. */
+
+md->start_code = (const uschar *)external_re + re->name_table_offset +
+ re->name_count * re->name_entry_size;
+
+md->start_subject = (USPTR)subject;
+md->start_offset = start_offset;
+md->end_subject = md->start_subject + length;
+end_subject = md->end_subject;
+
+md->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0;
+utf8 = md->utf8 = (re->options & PCRE_UTF8) != 0;
+
+md->notbol = (options & PCRE_NOTBOL) != 0;
+md->noteol = (options & PCRE_NOTEOL) != 0;
+md->notempty = (options & PCRE_NOTEMPTY) != 0;
+md->partial = (options & PCRE_PARTIAL) != 0;
+md->hitend = FALSE;
+
+md->recursive = NULL; /* No recursion at top level */
+md->eptrchain = eptrchain; /* Make workspace generally available */
+
+md->lcc = tables + lcc_offset;
+md->ctypes = tables + ctypes_offset;
+
+/* Handle different types of newline. The two bits give four cases. If nothing
+is set at run time, whatever was used at compile time applies. */
+
+switch ((((options & PCRE_NEWLINE_BITS) == 0)? re->options : options) &
+ PCRE_NEWLINE_BITS)
+ {
+ case 0: newline = NEWLINE; break; /* Compile-time default */
+ case PCRE_NEWLINE_CR: newline = '\r'; break;
+ case PCRE_NEWLINE_LF: newline = '\n'; break;
+ case PCRE_NEWLINE_CR+
+ PCRE_NEWLINE_LF: newline = ('\r' << 8) | '\n'; break;
+ case PCRE_NEWLINE_ANY: newline = -1; break;
+ default: return PCRE_ERROR_BADNEWLINE;
+ }
+
+if (newline < 0)
+ {
+ md->nltype = NLTYPE_ANY;
+ }
+else
+ {
+ md->nltype = NLTYPE_FIXED;
+ if (newline > 255)
+ {
+ md->nllen = 2;
+ md->nl[0] = (newline >> 8) & 255;
+ md->nl[1] = newline & 255;
+ }
+ else
+ {
+ md->nllen = 1;
+ md->nl[0] = newline;
+ }
+ }
+
+/* Partial matching is supported only for a restricted set of regexes at the
+moment. */
+
+if (md->partial && (re->options & PCRE_NOPARTIAL) != 0)
+ return PCRE_ERROR_BADPARTIAL;
+
+/* Check a UTF-8 string if required. Unfortunately there's no way of passing
+back the character offset. */
+
+#ifdef SUPPORT_UTF8
+if (utf8 && (options & PCRE_NO_UTF8_CHECK) == 0)
+ {
+ if (_pcre_valid_utf8((uschar *)subject, length) >= 0)
+ return PCRE_ERROR_BADUTF8;
+ if (start_offset > 0 && start_offset < length)
+ {
+ int tb = ((uschar *)subject)[start_offset];
+ if (tb > 127)
+ {
+ tb &= 0xc0;
+ if (tb != 0 && tb != 0xc0) return PCRE_ERROR_BADUTF8_OFFSET;
+ }
+ }
+ }
+#endif
+
+/* The ims options can vary during the matching as a result of the presence
+of (?ims) items in the pattern. They are kept in a local variable so that
+restoring at the exit of a group is easy. */
+
+ims = re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL);
+
+/* If the expression has got more back references than the offsets supplied can
+hold, we get a temporary chunk of working store to use during the matching.
+Otherwise, we can use the vector supplied, rounding down its size to a multiple
+of 3. */
+
+ocount = offsetcount - (offsetcount % 3);
+
+if (re->top_backref > 0 && re->top_backref >= ocount/3)
+ {
+ ocount = re->top_backref * 3 + 3;
+ md->offset_vector = (int *)(pcre_malloc)(ocount * sizeof(int));
+ if (md->offset_vector == NULL) return PCRE_ERROR_NOMEMORY;
+ using_temporary_offsets = TRUE;
+ DPRINTF(("Got memory to hold back references\n"));
+ }
+else md->offset_vector = offsets;
+
+md->offset_end = ocount;
+md->offset_max = (2*ocount)/3;
+md->offset_overflow = FALSE;
+md->capture_last = -1;
+
+/* Compute the minimum number of offsets that we need to reset each time. Doing
+this makes a huge difference to execution time when there aren't many brackets
+in the pattern. */
+
+resetcount = 2 + re->top_bracket * 2;
+if (resetcount > offsetcount) resetcount = ocount;
+
+/* Reset the working variable associated with each extraction. These should
+never be used unless previously set, but they get saved and restored, and so we
+initialize them to avoid reading uninitialized locations. */
+
+if (md->offset_vector != NULL)
+ {
+ register int *iptr = md->offset_vector + ocount;
+ register int *iend = iptr - resetcount/2 + 1;
+ while (--iptr >= iend) *iptr = -1;
+ }
+
+/* Set up the first character to match, if available. The first_byte value is
+never set for an anchored regular expression, but the anchoring may be forced
+at run time, so we have to test for anchoring. The first char may be unset for
+an unanchored pattern, of course. If there's no first char and the pattern was
+studied, there may be a bitmap of possible first characters. */
+
+if (!anchored)
+ {
+ if ((re->options & PCRE_FIRSTSET) != 0)
+ {
+ first_byte = re->first_byte & 255;
+ if ((first_byte_caseless = ((re->first_byte & REQ_CASELESS) != 0)) == TRUE)
+ first_byte = md->lcc[first_byte];
+ }
+ else
+ if (!startline && study != NULL &&
+ (study->options & PCRE_STUDY_MAPPED) != 0)
+ start_bits = study->start_bits;
+ }
+
+/* For anchored or unanchored matches, there may be a "last known required
+character" set. */
+
+if ((re->options & PCRE_REQCHSET) != 0)
+ {
+ req_byte = re->req_byte & 255;
+ req_byte_caseless = (re->req_byte & REQ_CASELESS) != 0;
+ req_byte2 = (tables + fcc_offset)[req_byte]; /* case flipped */
+ }
+
+
+/* ==========================================================================*/
+
+/* Loop for handling unanchored repeated matching attempts; for anchored regexs
+the loop runs just once. */
+
+for(;;)
+ {
+ USPTR save_end_subject = end_subject;
+
+ /* Reset the maximum number of extractions we might see. */
+
+ if (md->offset_vector != NULL)
+ {
+ register int *iptr = md->offset_vector;
+ register int *iend = iptr + resetcount;
+ while (iptr < iend) *iptr++ = -1;
+ }
+
+ /* Advance to a unique first char if possible. If firstline is TRUE, the
+ start of the match is constrained to the first line of a multiline string.
+ That is, the match must be before or at the first newline. Implement this by
+ temporarily adjusting end_subject so that we stop scanning at a newline. If
+ the match fails at the newline, later code breaks this loop. */
+
+ if (firstline)
+ {
+ USPTR t = start_match;
+ while (t < md->end_subject && !IS_NEWLINE(t)) t++;
+ end_subject = t;
+ }
+
+ /* Now test for a unique first byte */
+
+ if (first_byte >= 0)
+ {
+ if (first_byte_caseless)
+ while (start_match < end_subject &&
+ md->lcc[*start_match] != first_byte)
+ start_match++;
+ else
+ while (start_match < end_subject && *start_match != first_byte)
+ start_match++;
+ }
+
+ /* Or to just after a linebreak for a multiline match if possible */
+
+ else if (startline)
+ {
+ if (start_match > md->start_subject + start_offset)
+ {
+ while (start_match <= end_subject && !WAS_NEWLINE(start_match))
+ start_match++;
+ }
+ }
+
+ /* Or to a non-unique first char after study */
+
+ else if (start_bits != NULL)
+ {
+ while (start_match < end_subject)
+ {
+ register unsigned int c = *start_match;
+ if ((start_bits[c/8] & (1 << (c&7))) == 0) start_match++; else break;
+ }
+ }
+
+ /* Restore fudged end_subject */
+
+ end_subject = save_end_subject;
+
+#ifdef DEBUG /* Sigh. Some compilers never learn. */
+ printf(">>>> Match against: ");
+ pchars(start_match, end_subject - start_match, TRUE, md);
+ printf("\n");
+#endif
+
+ /* If req_byte is set, we know that that character must appear in the subject
+ for the match to succeed. If the first character is set, req_byte must be
+ later in the subject; otherwise the test starts at the match point. This
+ optimization can save a huge amount of backtracking in patterns with nested
+ unlimited repeats that aren't going to match. Writing separate code for
+ cased/caseless versions makes it go faster, as does using an autoincrement
+ and backing off on a match.
+
+ HOWEVER: when the subject string is very, very long, searching to its end can
+ take a long time, and give bad performance on quite ordinary patterns. This
+ showed up when somebody was matching something like /^\d+C/ on a 32-megabyte
+ string... so we don't do this when the string is sufficiently long.
+
+ ALSO: this processing is disabled when partial matching is requested.
+ */
+
+ if (req_byte >= 0 &&
+ end_subject - start_match < REQ_BYTE_MAX &&
+ !md->partial)
+ {
+ register USPTR p = start_match + ((first_byte >= 0)? 1 : 0);
+
+ /* We don't need to repeat the search if we haven't yet reached the
+ place we found it at last time. */
+
+ if (p > req_byte_ptr)
+ {
+ if (req_byte_caseless)
+ {
+ while (p < end_subject)
+ {
+ register int pp = *p++;
+ if (pp == req_byte || pp == req_byte2) { p--; break; }
+ }
+ }
+ else
+ {
+ while (p < end_subject)
+ {
+ if (*p++ == req_byte) { p--; break; }
+ }
+ }
+
+ /* If we can't find the required character, break the matching loop,
+ forcing a match failure. */
+
+ if (p >= end_subject)
+ {
+ rc = MATCH_NOMATCH;
+ break;
+ }
+
+ /* If we have found the required character, save the point where we
+ found it, so that we don't search again next time round the loop if
+ the start hasn't passed this character yet. */
+
+ req_byte_ptr = p;
+ }
+ }
+
+ /* OK, we can now run the match. */
+
+ md->start_match = start_match;
+ md->match_call_count = 0;
+ md->eptrn = 0; /* Next free eptrchain slot */
+ rc = match(start_match, md->start_code, 2, md, ims, NULL, 0, 0);
+
+ /* Any return other than MATCH_NOMATCH breaks the loop. */
+
+ if (rc != MATCH_NOMATCH) break;
+
+ /* If PCRE_FIRSTLINE is set, the match must happen before or at the first
+ newline in the subject (though it may continue over the newline). Therefore,
+ if we have just failed to match, starting at a newline, do not continue. */
+
+ if (firstline && IS_NEWLINE(start_match)) break;
+
+ /* Advance the match position by one character. */
+
+ start_match++;
+#ifdef SUPPORT_UTF8
+ if (utf8)
+ while(start_match < end_subject && (*start_match & 0xc0) == 0x80)
+ start_match++;
+#endif
+
+ /* Break the loop if the pattern is anchored or if we have passed the end of
+ the subject. */
+
+ if (anchored || start_match > end_subject) break;
+
+ /* If we have just passed a CR and the newline option is CRLF or ANY, and we
+ are now at a LF, advance the match position by one more character. */
+
+ if (start_match[-1] == '\r' &&
+ (md->nltype == NLTYPE_ANY || md->nllen == 2) &&
+ start_match < end_subject &&
+ *start_match == '\n')
+ start_match++;
+
+ } /* End of for(;;) "bumpalong" loop */
+
+/* ==========================================================================*/
+
+/* We reach here when rc is not MATCH_NOMATCH, or if one of the stopping
+conditions is true:
+
+(1) The pattern is anchored;
+
+(2) We are past the end of the subject;
+
+(3) PCRE_FIRSTLINE is set and we have failed to match at a newline, because
+ this option requests that a match occur at or before the first newline in
+ the subject.
+
+When we have a match and the offset vector is big enough to deal with any
+backreferences, captured substring offsets will already be set up. In the case
+where we had to get some local store to hold offsets for backreference
+processing, copy those that we can. In this case there need not be overflow if
+certain parts of the pattern were not used, even though there are more
+capturing parentheses than vector slots. */
+
+if (rc == MATCH_MATCH)
+ {
+ if (using_temporary_offsets)
+ {
+ if (offsetcount >= 4)
+ {
+ memcpy(offsets + 2, md->offset_vector + 2,
+ (offsetcount - 2) * sizeof(int));
+ DPRINTF(("Copied offsets from temporary memory\n"));
+ }
+ if (md->end_offset_top > offsetcount) md->offset_overflow = TRUE;
+ DPRINTF(("Freeing temporary memory\n"));
+ (pcre_free)(md->offset_vector);
+ }
+
+ /* Set the return code to the number of captured strings, or 0 if there are
+ too many to fit into the vector. */
+
+ rc = md->offset_overflow? 0 : md->end_offset_top/2;
+
+ /* If there is space, set up the whole thing as substring 0. */
+
+ if (offsetcount < 2) rc = 0; else
+ {
+ offsets[0] = start_match - md->start_subject;
+ offsets[1] = md->end_match_ptr - md->start_subject;
+ }
+
+ DPRINTF((">>>> returning %d\n", rc));
+ return rc;
+ }
+
+/* Control gets here if there has been an error, or if the overall match
+attempt has failed at all permitted starting positions. */
+
+if (using_temporary_offsets)
+ {
+ DPRINTF(("Freeing temporary memory\n"));
+ (pcre_free)(md->offset_vector);
+ }
+
+if (rc != MATCH_NOMATCH)
+ {
+ DPRINTF((">>>> error: returning %d\n", rc));
+ return rc;
+ }
+else if (md->partial && md->hitend)
+ {
+ DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n"));
+ return PCRE_ERROR_PARTIAL;
+ }
+else
+ {
+ DPRINTF((">>>> returning PCRE_ERROR_NOMATCH\n"));
+ return PCRE_ERROR_NOMATCH;
+ }
+}
+
+/* End of pcre_exec.c */
diff --git a/trunk/glib/pcre/pcre_fullinfo.c b/trunk/glib/pcre/pcre_fullinfo.c
new file mode 100644
index 000000000..4a8edc6f4
--- /dev/null
+++ b/trunk/glib/pcre/pcre_fullinfo.c
@@ -0,0 +1,149 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/*PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_fullinfo(), which returns
+information about a compiled pattern. */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+* Return info about compiled pattern *
+*************************************************/
+
+/* This is a newer "info" function which has an extensible interface so
+that additional items can be added compatibly.
+
+Arguments:
+ argument_re points to compiled code
+ extra_data points extra data, or NULL
+ what what information is required
+ where where to put the information
+
+Returns: 0 if data returned, negative on error
+*/
+
+PCRE_DATA_SCOPE int
+pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data, int what,
+ void *where)
+{
+real_pcre internal_re;
+pcre_study_data internal_study;
+const real_pcre *re = (const real_pcre *)argument_re;
+const pcre_study_data *study = NULL;
+
+if (re == NULL || where == NULL) return PCRE_ERROR_NULL;
+
+if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0)
+ study = (const pcre_study_data *)extra_data->study_data;
+
+if (re->magic_number != MAGIC_NUMBER)
+ {
+ re = _pcre_try_flipped(re, &internal_re, study, &internal_study);
+ if (re == NULL) return PCRE_ERROR_BADMAGIC;
+ if (study != NULL) study = &internal_study;
+ }
+
+switch (what)
+ {
+ case PCRE_INFO_OPTIONS:
+ *((unsigned long int *)where) = re->options & PUBLIC_OPTIONS;
+ break;
+
+ case PCRE_INFO_SIZE:
+ *((size_t *)where) = re->size;
+ break;
+
+ case PCRE_INFO_STUDYSIZE:
+ *((size_t *)where) = (study == NULL)? 0 : study->size;
+ break;
+
+ case PCRE_INFO_CAPTURECOUNT:
+ *((int *)where) = re->top_bracket;
+ break;
+
+ case PCRE_INFO_BACKREFMAX:
+ *((int *)where) = re->top_backref;
+ break;
+
+ case PCRE_INFO_FIRSTBYTE:
+ *((int *)where) =
+ ((re->options & PCRE_FIRSTSET) != 0)? re->first_byte :
+ ((re->options & PCRE_STARTLINE) != 0)? -1 : -2;
+ break;
+
+ /* Make sure we pass back the pointer to the bit vector in the external
+ block, not the internal copy (with flipped integer fields). */
+
+ case PCRE_INFO_FIRSTTABLE:
+ *((const uschar **)where) =
+ (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)?
+ ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL;
+ break;
+
+ case PCRE_INFO_LASTLITERAL:
+ *((int *)where) =
+ ((re->options & PCRE_REQCHSET) != 0)? re->req_byte : -1;
+ break;
+
+ case PCRE_INFO_NAMEENTRYSIZE:
+ *((int *)where) = re->name_entry_size;
+ break;
+
+ case PCRE_INFO_NAMECOUNT:
+ *((int *)where) = re->name_count;
+ break;
+
+ case PCRE_INFO_NAMETABLE:
+ *((const uschar **)where) = (const uschar *)re + re->name_table_offset;
+ break;
+
+ case PCRE_INFO_DEFAULT_TABLES:
+ *((const uschar **)where) = (const uschar *)(_pcre_default_tables);
+ break;
+
+ default: return PCRE_ERROR_BADOPTION;
+ }
+
+return 0;
+}
+
+/* End of pcre_fullinfo.c */
diff --git a/trunk/glib/pcre/pcre_get.c b/trunk/glib/pcre/pcre_get.c
new file mode 100644
index 000000000..856e955a5
--- /dev/null
+++ b/trunk/glib/pcre/pcre_get.c
@@ -0,0 +1,461 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains some convenience functions for extracting substrings
+from the subject string after a regex match has succeeded. The original idea
+for these functions came from Scott Wimer. */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+* Find number for named string *
+*************************************************/
+
+/* This function is used by the get_first_set() function below, as well
+as being generally available. It assumes that names are unique.
+
+Arguments:
+ code the compiled regex
+ stringname the name whose number is required
+
+Returns: the number of the named parentheses, or a negative number
+ (PCRE_ERROR_NOSUBSTRING) if not found
+*/
+
+int
+pcre_get_stringnumber(const pcre *code, const char *stringname)
+{
+int rc;
+int entrysize;
+int top, bot;
+uschar *nametable;
+
+if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
+ return rc;
+if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
+
+if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
+ return rc;
+if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
+ return rc;
+
+bot = 0;
+while (top > bot)
+ {
+ int mid = (top + bot) / 2;
+ uschar *entry = nametable + entrysize*mid;
+ int c = strcmp(stringname, (char *)(entry + 2));
+ if (c == 0) return (entry[0] << 8) + entry[1];
+ if (c > 0) bot = mid + 1; else top = mid;
+ }
+
+return PCRE_ERROR_NOSUBSTRING;
+}
+
+
+
+/*************************************************
+* Find (multiple) entries for named string *
+*************************************************/
+
+/* This is used by the get_first_set() function below, as well as being
+generally available. It is used when duplicated names are permitted.
+
+Arguments:
+ code the compiled regex
+ stringname the name whose entries required
+ firstptr where to put the pointer to the first entry
+ lastptr where to put the pointer to the last entry
+
+Returns: the length of each entry, or a negative number
+ (PCRE_ERROR_NOSUBSTRING) if not found
+*/
+
+int
+pcre_get_stringtable_entries(const pcre *code, const char *stringname,
+ char **firstptr, char **lastptr)
+{
+int rc;
+int entrysize;
+int top, bot;
+uschar *nametable, *lastentry;
+
+if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
+ return rc;
+if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
+
+if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
+ return rc;
+if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
+ return rc;
+
+lastentry = nametable + entrysize * (top - 1);
+bot = 0;
+while (top > bot)
+ {
+ int mid = (top + bot) / 2;
+ uschar *entry = nametable + entrysize*mid;
+ int c = strcmp(stringname, (char *)(entry + 2));
+ if (c == 0)
+ {
+ uschar *first = entry;
+ uschar *last = entry;
+ while (first > nametable)
+ {
+ if (strcmp(stringname, (char *)(first - entrysize + 2)) != 0) break;
+ first -= entrysize;
+ }
+ while (last < lastentry)
+ {
+ if (strcmp(stringname, (char *)(last + entrysize + 2)) != 0) break;
+ last += entrysize;
+ }
+ *firstptr = (char *)first;
+ *lastptr = (char *)last;
+ return entrysize;
+ }
+ if (c > 0) bot = mid + 1; else top = mid;
+ }
+
+return PCRE_ERROR_NOSUBSTRING;
+}
+
+
+
+/*************************************************
+* Find first set of multiple named strings *
+*************************************************/
+
+/* This function allows for duplicate names in the table of named substrings.
+It returns the number of the first one that was set in a pattern match.
+
+Arguments:
+ code the compiled regex
+ stringname the name of the capturing substring
+ ovector the vector of matched substrings
+
+Returns: the number of the first that is set,
+ or the number of the last one if none are set,
+ or a negative number on error
+*/
+
+static int
+get_first_set(const pcre *code, const char *stringname, int *ovector)
+{
+const real_pcre *re = (const real_pcre *)code;
+int entrysize;
+char *first, *last;
+uschar *entry;
+if ((re->options & (PCRE_DUPNAMES | PCRE_JCHANGED)) == 0)
+ return pcre_get_stringnumber(code, stringname);
+entrysize = pcre_get_stringtable_entries(code, stringname, &first, &last);
+if (entrysize <= 0) return entrysize;
+for (entry = (uschar *)first; entry <= (uschar *)last; entry += entrysize)
+ {
+ int n = (entry[0] << 8) + entry[1];
+ if (ovector[n*2] >= 0) return n;
+ }
+return (first[0] << 8) + first[1];
+}
+
+
+
+
+/*************************************************
+* Copy captured string to given buffer *
+*************************************************/
+
+/* This function copies a single captured substring into a given buffer.
+Note that we use memcpy() rather than strncpy() in case there are binary zeros
+in the string.
+
+Arguments:
+ subject the subject string that was matched
+ ovector pointer to the offsets table
+ stringcount the number of substrings that were captured
+ (i.e. the yield of the pcre_exec call, unless
+ that was zero, in which case it should be 1/3
+ of the offset table size)
+ stringnumber the number of the required substring
+ buffer where to put the substring
+ size the size of the buffer
+
+Returns: if successful:
+ the length of the copied string, not including the zero
+ that is put on the end; can be zero
+ if not successful:
+ PCRE_ERROR_NOMEMORY (-6) buffer too small
+ PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
+*/
+
+int
+pcre_copy_substring(const char *subject, int *ovector, int stringcount,
+ int stringnumber, char *buffer, int size)
+{
+int yield;
+if (stringnumber < 0 || stringnumber >= stringcount)
+ return PCRE_ERROR_NOSUBSTRING;
+stringnumber *= 2;
+yield = ovector[stringnumber+1] - ovector[stringnumber];
+if (size < yield + 1) return PCRE_ERROR_NOMEMORY;
+memcpy(buffer, subject + ovector[stringnumber], yield);
+buffer[yield] = 0;
+return yield;
+}
+
+
+
+/*************************************************
+* Copy named captured string to given buffer *
+*************************************************/
+
+/* This function copies a single captured substring into a given buffer,
+identifying it by name. If the regex permits duplicate names, the first
+substring that is set is chosen.
+
+Arguments:
+ code the compiled regex
+ subject the subject string that was matched
+ ovector pointer to the offsets table
+ stringcount the number of substrings that were captured
+ (i.e. the yield of the pcre_exec call, unless
+ that was zero, in which case it should be 1/3
+ of the offset table size)
+ stringname the name of the required substring
+ buffer where to put the substring
+ size the size of the buffer
+
+Returns: if successful:
+ the length of the copied string, not including the zero
+ that is put on the end; can be zero
+ if not successful:
+ PCRE_ERROR_NOMEMORY (-6) buffer too small
+ PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
+*/
+
+int
+pcre_copy_named_substring(const pcre *code, const char *subject, int *ovector,
+ int stringcount, const char *stringname, char *buffer, int size)
+{
+int n = get_first_set(code, stringname, ovector);
+if (n <= 0) return n;
+return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size);
+}
+
+
+
+/*************************************************
+* Copy all captured strings to new store *
+*************************************************/
+
+/* This function gets one chunk of store and builds a list of pointers and all
+of the captured substrings in it. A NULL pointer is put on the end of the list.
+
+Arguments:
+ subject the subject string that was matched
+ ovector pointer to the offsets table
+ stringcount the number of substrings that were captured
+ (i.e. the yield of the pcre_exec call, unless
+ that was zero, in which case it should be 1/3
+ of the offset table size)
+ listptr set to point to the list of pointers
+
+Returns: if successful: 0
+ if not successful:
+ PCRE_ERROR_NOMEMORY (-6) failed to get store
+*/
+
+int
+pcre_get_substring_list(const char *subject, int *ovector, int stringcount,
+ const char ***listptr)
+{
+int i;
+int size = sizeof(char *);
+int double_count = stringcount * 2;
+char **stringlist;
+char *p;
+
+for (i = 0; i < double_count; i += 2)
+ size += sizeof(char *) + ovector[i+1] - ovector[i] + 1;
+
+stringlist = (char **)(pcre_malloc)(size);
+if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
+
+*listptr = (const char **)stringlist;
+p = (char *)(stringlist + stringcount + 1);
+
+for (i = 0; i < double_count; i += 2)
+ {
+ int len = ovector[i+1] - ovector[i];
+ memcpy(p, subject + ovector[i], len);
+ *stringlist++ = p;
+ p += len;
+ *p++ = 0;
+ }
+
+*stringlist = NULL;
+return 0;
+}
+
+
+
+/*************************************************
+* Free store obtained by get_substring_list *
+*************************************************/
+
+/* This function exists for the benefit of people calling PCRE from non-C
+programs that can call its functions, but not free() or (pcre_free)() directly.
+
+Argument: the result of a previous pcre_get_substring_list()
+Returns: nothing
+*/
+
+void
+pcre_free_substring_list(const char **pointer)
+{
+(pcre_free)((void *)pointer);
+}
+
+
+
+/*************************************************
+* Copy captured string to new store *
+*************************************************/
+
+/* This function copies a single captured substring into a piece of new
+store
+
+Arguments:
+ subject the subject string that was matched
+ ovector pointer to the offsets table
+ stringcount the number of substrings that were captured
+ (i.e. the yield of the pcre_exec call, unless
+ that was zero, in which case it should be 1/3
+ of the offset table size)
+ stringnumber the number of the required substring
+ stringptr where to put a pointer to the substring
+
+Returns: if successful:
+ the length of the string, not including the zero that
+ is put on the end; can be zero
+ if not successful:
+ PCRE_ERROR_NOMEMORY (-6) failed to get store
+ PCRE_ERROR_NOSUBSTRING (-7) substring not present
+*/
+
+int
+pcre_get_substring(const char *subject, int *ovector, int stringcount,
+ int stringnumber, const char **stringptr)
+{
+int yield;
+char *substring;
+if (stringnumber < 0 || stringnumber >= stringcount)
+ return PCRE_ERROR_NOSUBSTRING;
+stringnumber *= 2;
+yield = ovector[stringnumber+1] - ovector[stringnumber];
+substring = (char *)(pcre_malloc)(yield + 1);
+if (substring == NULL) return PCRE_ERROR_NOMEMORY;
+memcpy(substring, subject + ovector[stringnumber], yield);
+substring[yield] = 0;
+*stringptr = substring;
+return yield;
+}
+
+
+
+/*************************************************
+* Copy named captured string to new store *
+*************************************************/
+
+/* This function copies a single captured substring, identified by name, into
+new store. If the regex permits duplicate names, the first substring that is
+set is chosen.
+
+Arguments:
+ code the compiled regex
+ subject the subject string that was matched
+ ovector pointer to the offsets table
+ stringcount the number of substrings that were captured
+ (i.e. the yield of the pcre_exec call, unless
+ that was zero, in which case it should be 1/3
+ of the offset table size)
+ stringname the name of the required substring
+ stringptr where to put the pointer
+
+Returns: if successful:
+ the length of the copied string, not including the zero
+ that is put on the end; can be zero
+ if not successful:
+ PCRE_ERROR_NOMEMORY (-6) couldn't get memory
+ PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
+*/
+
+int
+pcre_get_named_substring(const pcre *code, const char *subject, int *ovector,
+ int stringcount, const char *stringname, const char **stringptr)
+{
+int n = get_first_set(code, stringname, ovector);
+if (n <= 0) return n;
+return pcre_get_substring(subject, ovector, stringcount, n, stringptr);
+}
+
+
+
+
+/*************************************************
+* Free store obtained by get_substring *
+*************************************************/
+
+/* This function exists for the benefit of people calling PCRE from non-C
+programs that can call its functions, but not free() or (pcre_free)() directly.
+
+Argument: the result of a previous pcre_get_substring()
+Returns: nothing
+*/
+
+void
+pcre_free_substring(const char *pointer)
+{
+(pcre_free)((void *)pointer);
+}
+
+/* End of pcre_get.c */
diff --git a/trunk/glib/pcre/pcre_globals.c b/trunk/glib/pcre/pcre_globals.c
new file mode 100644
index 000000000..8c0b3e67e
--- /dev/null
+++ b/trunk/glib/pcre/pcre_globals.c
@@ -0,0 +1,59 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains global variables that are exported by the PCRE library.
+PCRE is thread-clean and doesn't use any global variables in the normal sense.
+However, it calls memory allocation and freeing functions via the four
+indirections below, and it can optionally do callouts, using the fifth
+indirection. These values can be changed by the caller, but are shared between
+all threads. However, when compiling for Virtual Pascal, things are done
+differently, and global variables are not used (see pcre.in). */
+
+
+#include "pcre_internal.h"
+
+
+#ifdef __cplusplus
+extern "C" int (*pcre_callout)(pcre_callout_block *) = NULL;
+#else
+int (*pcre_callout)(pcre_callout_block *) = NULL;
+#endif
+
+/* End of pcre_globals.c */
diff --git a/trunk/glib/pcre/pcre_info.c b/trunk/glib/pcre/pcre_info.c
new file mode 100644
index 000000000..b318b93ea
--- /dev/null
+++ b/trunk/glib/pcre/pcre_info.c
@@ -0,0 +1,89 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_info(), which gives some
+information about a compiled pattern. However, use of this function is now
+deprecated, as it has been superseded by pcre_fullinfo(). */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+* (Obsolete) Return info about compiled pattern *
+*************************************************/
+
+/* This is the original "info" function. It picks potentially useful data out
+of the private structure, but its interface was too rigid. It remains for
+backwards compatibility. The public options are passed back in an int - though
+the re->options field has been expanded to a long int, all the public options
+at the low end of it, and so even on 16-bit systems this will still be OK.
+Therefore, I haven't changed the API for pcre_info().
+
+Arguments:
+ argument_re points to compiled code
+ optptr where to pass back the options
+ first_byte where to pass back the first character,
+ or -1 if multiline and all branches start ^,
+ or -2 otherwise
+
+Returns: number of capturing subpatterns
+ or negative values on error
+*/
+
+PCRE_DATA_SCOPE int
+pcre_info(const pcre *argument_re, int *optptr, int *first_byte)
+{
+real_pcre internal_re;
+const real_pcre *re = (const real_pcre *)argument_re;
+if (re == NULL) return PCRE_ERROR_NULL;
+if (re->magic_number != MAGIC_NUMBER)
+ {
+ re = _pcre_try_flipped(re, &internal_re, NULL, NULL);
+ if (re == NULL) return PCRE_ERROR_BADMAGIC;
+ }
+if (optptr != NULL) *optptr = (int)(re->options & PUBLIC_OPTIONS);
+if (first_byte != NULL)
+ *first_byte = ((re->options & PCRE_FIRSTSET) != 0)? re->first_byte :
+ ((re->options & PCRE_STARTLINE) != 0)? -1 : -2;
+return re->top_bracket;
+}
+
+/* End of pcre_info.c */
diff --git a/trunk/glib/pcre/pcre_internal.h b/trunk/glib/pcre/pcre_internal.h
new file mode 100644
index 000000000..2b5090205
--- /dev/null
+++ b/trunk/glib/pcre/pcre_internal.h
@@ -0,0 +1,1041 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+/* This header contains definitions that are shared between the different
+modules, but which are not relevant to the exported API. This includes some
+functions whose names all begin with "_pcre_". */
+
+#ifndef PCRE_INTERNAL_H
+#define PCRE_INTERNAL_H
+
+/* Define DEBUG to get debugging output on stdout. */
+
+#if 0
+#define DEBUG
+#endif
+
+/* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef
+inline, and there are *still* stupid compilers about that don't like indented
+pre-processor statements, or at least there were when I first wrote this. After
+all, it had only been about 10 years then...
+
+It turns out that the Mac Debugging.h header also defines the macro DPRINTF, so
+be absolutely sure we get our version. */
+
+#undef DPRINTF
+#ifdef DEBUG
+#define DPRINTF(p) printf p
+#else
+#define DPRINTF(p) /* Nothing */
+#endif
+
+
+/* Get the definitions provided by running "configure" */
+
+#include "config.h"
+
+/* Standard C headers plus the external interface definition. The only time
+setjmp and stdarg are used is when NO_RECURSE is set. */
+
+#include <ctype.h>
+#include <limits.h>
+#include <setjmp.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef PCRE_SPY
+#define PCRE_DEFINITION /* Win32 __declspec(export) trigger for .dll */
+#endif
+
+/* We need to have types that specify unsigned 16-bit and 32-bit integers. We
+cannot determine these outside the compilation (e.g. by running a program as
+part of "configure") because PCRE is often cross-compiled for use on other
+systems. Instead we make use of the maximum sizes that are available at
+preprocessor time in standard C environments. */
+
+#if USHRT_MAX == 65535
+ typedef unsigned short pcre_uint16;
+#elif UINT_MAX == 65535
+ typedef unsigned int pcre_uint16;
+#else
+ #error Cannot determine a type for 16-bit unsigned integers
+#endif
+
+#if UINT_MAX == 4294967295
+ typedef unsigned int pcre_uint32;
+#elif ULONG_MAX == 4294967295
+ typedef unsigned long int pcre_uint32;
+#else
+ #error Cannot determine a type for 32-bit unsigned integers
+#endif
+
+/* All character handling must be done as unsigned characters. Otherwise there
+are problems with top-bit-set characters and functions such as isspace().
+However, we leave the interface to the outside world as char *, because that
+should make things easier for callers. We define a short type for unsigned char
+to save lots of typing. I tried "uchar", but it causes problems on Digital
+Unix, where it is defined in sys/types, so use "uschar" instead. */
+
+typedef unsigned char uschar;
+
+/* This is an unsigned int value that no character can ever have. UTF-8
+characters only go up to 0x7fffffff (though Unicode doesn't go beyond
+0x0010ffff). */
+
+#define NOTACHAR 0xffffffff
+
+/* PCRE is able to support several different kinds of newline (CR, LF, CRLF,
+and "all" at present). The following macros are used to package up testing for
+newlines. NLBLOCK, PSSTART, and PSEND are defined in the various modules to
+indicate in which datablock the parameters exist, and what the start/end of
+string field names are. */
+
+#define NLTYPE_FIXED 0 /* Newline is a fixed length string */
+#define NLTYPE_ANY 1 /* Newline is any Unicode line ending */
+
+/* This macro checks for a newline at the given position */
+
+#define IS_NEWLINE(p) \
+ ((NLBLOCK->nltype != NLTYPE_FIXED)? \
+ ((p) < NLBLOCK->PSEND && \
+ _pcre_is_newline((p), NLBLOCK->PSEND, &(NLBLOCK->nllen), utf8) \
+ ) \
+ : \
+ ((p) <= NLBLOCK->PSEND - NLBLOCK->nllen && \
+ (p)[0] == NLBLOCK->nl[0] && \
+ (NLBLOCK->nllen == 1 || (p)[1] == NLBLOCK->nl[1]) \
+ ) \
+ )
+
+/* This macro checks for a newline immediately preceding the given position */
+
+#define WAS_NEWLINE(p) \
+ ((NLBLOCK->nltype != NLTYPE_FIXED)? \
+ ((p) > NLBLOCK->PSSTART && \
+ _pcre_was_newline((p), NLBLOCK->PSSTART, &(NLBLOCK->nllen), utf8) \
+ ) \
+ : \
+ ((p) >= NLBLOCK->PSSTART + NLBLOCK->nllen && \
+ (p)[-NLBLOCK->nllen] == NLBLOCK->nl[0] && \
+ (NLBLOCK->nllen == 1 || (p)[-NLBLOCK->nllen+1] == NLBLOCK->nl[1]) \
+ ) \
+ )
+
+/* When PCRE is compiled as a C++ library, the subject pointer can be replaced
+with a custom type. This makes it possible, for example, to allow pcre_exec()
+to process subject strings that are discontinuous by using a smart pointer
+class. It must always be possible to inspect all of the subject string in
+pcre_exec() because of the way it backtracks. Two macros are required in the
+normal case, for sign-unspecified and unsigned char pointers. The former is
+used for the external interface and appears in pcre.h, which is why its name
+must begin with PCRE_. */
+
+#ifdef CUSTOM_SUBJECT_PTR
+#define PCRE_SPTR CUSTOM_SUBJECT_PTR
+#define USPTR CUSTOM_SUBJECT_PTR
+#else
+#define PCRE_SPTR const char *
+#define USPTR const unsigned char *
+#endif
+
+/* Include the public PCRE header and the definitions of UCP character property
+values. */
+
+#include "pcre.h"
+#include "ucp.h"
+
+/* When compiling for use with the Virtual Pascal compiler, these functions
+need to have their names changed. PCRE must be compiled with the -DVPCOMPAT
+option on the command line. */
+
+#ifdef VPCOMPAT
+#define strncmp(s1,s2,m) _strncmp(s1,s2,m)
+#define memcpy(d,s,n) _memcpy(d,s,n)
+#define memmove(d,s,n) _memmove(d,s,n)
+#define memset(s,c,n) _memset(s,c,n)
+#else /* VPCOMPAT */
+
+/* To cope with SunOS4 and other systems that lack memmove() but have bcopy(),
+define a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY
+is set. Otherwise, include an emulating function for those systems that have
+neither (there some non-Unix environments where this is the case). This assumes
+that all calls to memmove are moving strings upwards in store, which is the
+case in PCRE. */
+
+#if ! HAVE_MEMMOVE
+#undef memmove /* some systems may have a macro */
+#if HAVE_BCOPY
+#define memmove(a, b, c) bcopy(b, a, c)
+#else /* HAVE_BCOPY */
+static void *
+pcre_memmove(unsigned char *dest, const unsigned char *src, size_t n)
+{
+size_t i;
+dest += n;
+src += n;
+for (i = 0; i < n; ++i) *(--dest) = *(--src);
+return dest;
+}
+#define memmove(a, b, c) pcre_memmove(a, b, c)
+#endif /* not HAVE_BCOPY */
+#endif /* not HAVE_MEMMOVE */
+#endif /* not VPCOMPAT */
+
+
+/* PCRE keeps offsets in its compiled code as 2-byte quantities (always stored
+in big-endian order) by default. These are used, for example, to link from the
+start of a subpattern to its alternatives and its end. The use of 2 bytes per
+offset limits the size of the compiled regex to around 64K, which is big enough
+for almost everybody. However, I received a request for an even bigger limit.
+For this reason, and also to make the code easier to maintain, the storing and
+loading of offsets from the byte string is now handled by the macros that are
+defined here.
+
+The macros are controlled by the value of LINK_SIZE. This defaults to 2 in
+the config.h file, but can be overridden by using -D on the command line. This
+is automated on Unix systems via the "configure" command. */
+
+#if LINK_SIZE == 2
+
+#define PUT(a,n,d) \
+ (a[n] = (d) >> 8), \
+ (a[(n)+1] = (d) & 255)
+
+#define GET(a,n) \
+ (((a)[n] << 8) | (a)[(n)+1])
+
+#define MAX_PATTERN_SIZE (1 << 16)
+
+
+#elif LINK_SIZE == 3
+
+#define PUT(a,n,d) \
+ (a[n] = (d) >> 16), \
+ (a[(n)+1] = (d) >> 8), \
+ (a[(n)+2] = (d) & 255)
+
+#define GET(a,n) \
+ (((a)[n] << 16) | ((a)[(n)+1] << 8) | (a)[(n)+2])
+
+#define MAX_PATTERN_SIZE (1 << 24)
+
+
+#elif LINK_SIZE == 4
+
+#define PUT(a,n,d) \
+ (a[n] = (d) >> 24), \
+ (a[(n)+1] = (d) >> 16), \
+ (a[(n)+2] = (d) >> 8), \
+ (a[(n)+3] = (d) & 255)
+
+#define GET(a,n) \
+ (((a)[n] << 24) | ((a)[(n)+1] << 16) | ((a)[(n)+2] << 8) | (a)[(n)+3])
+
+#define MAX_PATTERN_SIZE (1 << 30) /* Keep it positive */
+
+
+#else
+#error LINK_SIZE must be either 2, 3, or 4
+#endif
+
+
+/* Convenience macro defined in terms of the others */
+
+#define PUTINC(a,n,d) PUT(a,n,d), a += LINK_SIZE
+
+
+/* PCRE uses some other 2-byte quantities that do not change when the size of
+offsets changes. There are used for repeat counts and for other things such as
+capturing parenthesis numbers in back references. */
+
+#define PUT2(a,n,d) \
+ a[n] = (d) >> 8; \
+ a[(n)+1] = (d) & 255
+
+#define GET2(a,n) \
+ (((a)[n] << 8) | (a)[(n)+1])
+
+#define PUT2INC(a,n,d) PUT2(a,n,d), a += 2
+
+
+/* When UTF-8 encoding is being used, a character is no longer just a single
+byte. The macros for character handling generate simple sequences when used in
+byte-mode, and more complicated ones for UTF-8 characters. */
+
+#ifndef SUPPORT_UTF8
+#define GETCHAR(c, eptr) c = *eptr;
+#define GETCHARTEST(c, eptr) c = *eptr;
+#define GETCHARINC(c, eptr) c = *eptr++;
+#define GETCHARINCTEST(c, eptr) c = *eptr++;
+#define GETCHARLEN(c, eptr, len) c = *eptr;
+#define BACKCHAR(eptr)
+
+#else /* SUPPORT_UTF8 */
+
+/* Get the next UTF-8 character, not advancing the pointer. This is called when
+we know we are in UTF-8 mode. */
+
+#define GETCHAR(c, eptr) \
+ c = *eptr; \
+ if (c >= 0xc0) \
+ { \
+ int gcii; \
+ int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
+ int gcss = 6*gcaa; \
+ c = (c & _pcre_utf8_table3[gcaa]) << gcss; \
+ for (gcii = 1; gcii <= gcaa; gcii++) \
+ { \
+ gcss -= 6; \
+ c |= (eptr[gcii] & 0x3f) << gcss; \
+ } \
+ }
+
+/* Get the next UTF-8 character, testing for UTF-8 mode, and not advancing the
+pointer. */
+
+#define GETCHARTEST(c, eptr) \
+ c = *eptr; \
+ if (utf8 && c >= 0xc0) \
+ { \
+ int gcii; \
+ int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
+ int gcss = 6*gcaa; \
+ c = (c & _pcre_utf8_table3[gcaa]) << gcss; \
+ for (gcii = 1; gcii <= gcaa; gcii++) \
+ { \
+ gcss -= 6; \
+ c |= (eptr[gcii] & 0x3f) << gcss; \
+ } \
+ }
+
+/* Get the next UTF-8 character, advancing the pointer. This is called when we
+know we are in UTF-8 mode. */
+
+#define GETCHARINC(c, eptr) \
+ c = *eptr++; \
+ if (c >= 0xc0) \
+ { \
+ int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
+ int gcss = 6*gcaa; \
+ c = (c & _pcre_utf8_table3[gcaa]) << gcss; \
+ while (gcaa-- > 0) \
+ { \
+ gcss -= 6; \
+ c |= (*eptr++ & 0x3f) << gcss; \
+ } \
+ }
+
+/* Get the next character, testing for UTF-8 mode, and advancing the pointer */
+
+#define GETCHARINCTEST(c, eptr) \
+ c = *eptr++; \
+ if (utf8 && c >= 0xc0) \
+ { \
+ int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
+ int gcss = 6*gcaa; \
+ c = (c & _pcre_utf8_table3[gcaa]) << gcss; \
+ while (gcaa-- > 0) \
+ { \
+ gcss -= 6; \
+ c |= (*eptr++ & 0x3f) << gcss; \
+ } \
+ }
+
+/* Get the next UTF-8 character, not advancing the pointer, incrementing length
+if there are extra bytes. This is called when we know we are in UTF-8 mode. */
+
+#define GETCHARLEN(c, eptr, len) \
+ c = *eptr; \
+ if (c >= 0xc0) \
+ { \
+ int gcii; \
+ int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
+ int gcss = 6*gcaa; \
+ c = (c & _pcre_utf8_table3[gcaa]) << gcss; \
+ for (gcii = 1; gcii <= gcaa; gcii++) \
+ { \
+ gcss -= 6; \
+ c |= (eptr[gcii] & 0x3f) << gcss; \
+ } \
+ len += gcaa; \
+ }
+
+/* If the pointer is not at the start of a character, move it back until
+it is. Called only in UTF-8 mode. */
+
+#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--;
+
+#endif
+
+
+/* In case there is no definition of offsetof() provided - though any proper
+Standard C system should have one. */
+
+#ifndef offsetof
+#define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field))
+#endif
+
+
+/* These are the public options that can change during matching. */
+
+#define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL)
+
+/* Private options flags start at the most significant end of the four bytes.
+The public options defined in pcre.h start at the least significant end. Make
+sure they don't overlap! The bits are getting a bit scarce now -- when we run
+out, there is a dummy word in the structure that could be used for the private
+bits. */
+
+#define PCRE_NOPARTIAL 0x80000000 /* can't use partial with this regex */
+#define PCRE_FIRSTSET 0x40000000 /* first_byte is set */
+#define PCRE_REQCHSET 0x20000000 /* req_byte is set */
+#define PCRE_STARTLINE 0x10000000 /* start after \n for multiline */
+#define PCRE_JCHANGED 0x08000000 /* j option changes within regex */
+
+/* Options for the "extra" block produced by pcre_study(). */
+
+#define PCRE_STUDY_MAPPED 0x01 /* a map of starting chars exists */
+
+/* Masks for identifying the public options that are permitted at compile
+time, run time, or study time, respectively. */
+
+#define PCRE_NEWLINE_BITS (PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_ANY)
+
+#define PUBLIC_OPTIONS \
+ (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \
+ PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8| \
+ PCRE_NO_AUTO_CAPTURE|PCRE_NO_UTF8_CHECK|PCRE_AUTO_CALLOUT|PCRE_FIRSTLINE| \
+ PCRE_DUPNAMES|PCRE_NEWLINE_BITS)
+
+#define PUBLIC_EXEC_OPTIONS \
+ (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NO_UTF8_CHECK| \
+ PCRE_PARTIAL|PCRE_NEWLINE_BITS)
+
+#define PUBLIC_DFA_EXEC_OPTIONS \
+ (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NO_UTF8_CHECK| \
+ PCRE_PARTIAL|PCRE_DFA_SHORTEST|PCRE_DFA_RESTART|PCRE_NEWLINE_BITS)
+
+#define PUBLIC_STUDY_OPTIONS 0 /* None defined */
+
+/* Magic number to provide a small check against being handed junk. Also used
+to detect whether a pattern was compiled on a host of different endianness. */
+
+#define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */
+
+/* Negative values for the firstchar and reqchar variables */
+
+#define REQ_UNSET (-2)
+#define REQ_NONE (-1)
+
+/* The maximum remaining length of subject we are prepared to search for a
+req_byte match. */
+
+#define REQ_BYTE_MAX 1000
+
+/* Flags added to firstbyte or reqbyte; a "non-literal" item is either a
+variable-length repeat, or a anything other than literal characters. */
+
+#define REQ_CASELESS 0x0100 /* indicates caselessness */
+#define REQ_VARY 0x0200 /* reqbyte followed non-literal item */
+
+/* Miscellaneous definitions */
+
+typedef gboolean BOOL;
+
+/* Escape items that are just an encoding of a particular data value. */
+
+#ifndef ESC_e
+#define ESC_e 27
+#endif
+
+#ifndef ESC_f
+#define ESC_f '\f'
+#endif
+
+#ifndef ESC_n
+#define ESC_n '\n'
+#endif
+
+#ifndef ESC_r
+#define ESC_r '\r'
+#endif
+
+/* We can't officially use ESC_t because it is a POSIX reserved identifier
+(presumably because of all the others like size_t). */
+
+#ifndef ESC_tee
+#define ESC_tee '\t'
+#endif
+
+/* Codes for different types of Unicode property */
+
+#define PT_ANY 0 /* Any property - matches all chars */
+#define PT_LAMP 1 /* L& - the union of Lu, Ll, Lt */
+#define PT_GC 2 /* General characteristic (e.g. L) */
+#define PT_PC 3 /* Particular characteristic (e.g. Lu) */
+#define PT_SC 4 /* Script (e.g. Han) */
+
+/* Flag bits and data types for the extended class (OP_XCLASS) for classes that
+contain UTF-8 characters with values greater than 255. */
+
+#define XCL_NOT 0x01 /* Flag: this is a negative class */
+#define XCL_MAP 0x02 /* Flag: a 32-byte map is present */
+
+#define XCL_END 0 /* Marks end of individual items */
+#define XCL_SINGLE 1 /* Single item (one multibyte char) follows */
+#define XCL_RANGE 2 /* A range (two multibyte chars) follows */
+#define XCL_PROP 3 /* Unicode property (2-byte property code follows) */
+#define XCL_NOTPROP 4 /* Unicode inverted property (ditto) */
+
+/* These are escaped items that aren't just an encoding of a particular data
+value such as \n. They must have non-zero values, as check_escape() returns
+their negation. Also, they must appear in the same order as in the opcode
+definitions below, up to ESC_z. There's a dummy for OP_ANY because it
+corresponds to "." rather than an escape sequence. The final one must be
+ESC_REF as subsequent values are used for backreferences (\1, \2, \3, etc).
+There are two tests in the code for an escape greater than ESC_b and less than
+ESC_Z to detect the types that may be repeated. These are the types that
+consume characters. If any new escapes are put in between that don't consume a
+character, that code will have to change. */
+
+enum { ESC_A = 1, ESC_G, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, ESC_W,
+ ESC_w, ESC_dum1, ESC_C, ESC_P, ESC_p, ESC_R, ESC_X, ESC_Z, ESC_z,
+ ESC_E, ESC_Q, ESC_k, ESC_REF };
+
+
+/* Opcode table: OP_BRA must be last, as all values >= it are used for brackets
+that extract substrings. Starting from 1 (i.e. after OP_END), the values up to
+OP_EOD must correspond in order to the list of escapes immediately above.
+
+To keep stored, compiled patterns compatible, new opcodes should be added
+immediately before OP_BRA, where (since release 7.0) a gap is left for this
+purpose.
+
+*** NOTE NOTE NOTE *** Whenever this list is updated, the two macro definitions
+that follow must also be updated to match. There is also a table called
+"coptable" in pcre_dfa_exec.c that must be updated. */
+
+enum {
+ OP_END, /* 0 End of pattern */
+
+ /* Values corresponding to backslashed metacharacters */
+
+ OP_SOD, /* 1 Start of data: \A */
+ OP_SOM, /* 2 Start of match (subject + offset): \G */
+ OP_NOT_WORD_BOUNDARY, /* 3 \B */
+ OP_WORD_BOUNDARY, /* 4 \b */
+ OP_NOT_DIGIT, /* 5 \D */
+ OP_DIGIT, /* 6 \d */
+ OP_NOT_WHITESPACE, /* 7 \S */
+ OP_WHITESPACE, /* 8 \s */
+ OP_NOT_WORDCHAR, /* 9 \W */
+ OP_WORDCHAR, /* 10 \w */
+ OP_ANY, /* 11 Match any character */
+ OP_ANYBYTE, /* 12 Match any byte (\C); different to OP_ANY for UTF-8 */
+ OP_NOTPROP, /* 13 \P (not Unicode property) */
+ OP_PROP, /* 14 \p (Unicode property) */
+ OP_ANYNL, /* 15 \R (any newline sequence) */
+ OP_EXTUNI, /* 16 \X (extended Unicode sequence */
+ OP_EODN, /* 17 End of data or \n at end of data: \Z. */
+ OP_EOD, /* 18 End of data: \z */
+
+ OP_OPT, /* 19 Set runtime options */
+ OP_CIRC, /* 20 Start of line - varies with multiline switch */
+ OP_DOLL, /* 21 End of line - varies with multiline switch */
+ OP_CHAR, /* 22 Match one character, casefully */
+ OP_CHARNC, /* 23 Match one character, caselessly */
+ OP_NOT, /* 24 Match one character, not the following one */
+
+ OP_STAR, /* 25 The maximizing and minimizing versions of */
+ OP_MINSTAR, /* 26 these six opcodes must come in pairs, with */
+ OP_PLUS, /* 27 the minimizing one second. */
+ OP_MINPLUS, /* 28 This first set applies to single characters.*/
+ OP_QUERY, /* 29 */
+ OP_MINQUERY, /* 30 */
+
+ OP_UPTO, /* 31 From 0 to n matches */
+ OP_MINUPTO, /* 32 */
+ OP_EXACT, /* 33 Exactly n matches */
+
+ OP_POSSTAR, /* 34 Possessified star */
+ OP_POSPLUS, /* 35 Possessified plus */
+ OP_POSQUERY, /* 36 Posesssified query */
+ OP_POSUPTO, /* 37 Possessified upto */
+
+ OP_NOTSTAR, /* 38 The maximizing and minimizing versions of */
+ OP_NOTMINSTAR, /* 39 these six opcodes must come in pairs, with */
+ OP_NOTPLUS, /* 40 the minimizing one second. They must be in */
+ OP_NOTMINPLUS, /* 41 exactly the same order as those above. */
+ OP_NOTQUERY, /* 42 This set applies to "not" single characters. */
+ OP_NOTMINQUERY, /* 43 */
+
+ OP_NOTUPTO, /* 44 From 0 to n matches */
+ OP_NOTMINUPTO, /* 45 */
+ OP_NOTEXACT, /* 46 Exactly n matches */
+
+ OP_NOTPOSSTAR, /* 47 Possessified versions */
+ OP_NOTPOSPLUS, /* 48 */
+ OP_NOTPOSQUERY, /* 49 */
+ OP_NOTPOSUPTO, /* 50 */
+
+ OP_TYPESTAR, /* 51 The maximizing and minimizing versions of */
+ OP_TYPEMINSTAR, /* 52 these six opcodes must come in pairs, with */
+ OP_TYPEPLUS, /* 53 the minimizing one second. These codes must */
+ OP_TYPEMINPLUS, /* 54 be in exactly the same order as those above. */
+ OP_TYPEQUERY, /* 55 This set applies to character types such as \d */
+ OP_TYPEMINQUERY, /* 56 */
+
+ OP_TYPEUPTO, /* 57 From 0 to n matches */
+ OP_TYPEMINUPTO, /* 58 */
+ OP_TYPEEXACT, /* 59 Exactly n matches */
+
+ OP_TYPEPOSSTAR, /* 60 Possessified versions */
+ OP_TYPEPOSPLUS, /* 61 */
+ OP_TYPEPOSQUERY, /* 62 */
+ OP_TYPEPOSUPTO, /* 63 */
+
+ OP_CRSTAR, /* 64 The maximizing and minimizing versions of */
+ OP_CRMINSTAR, /* 65 all these opcodes must come in pairs, with */
+ OP_CRPLUS, /* 66 the minimizing one second. These codes must */
+ OP_CRMINPLUS, /* 67 be in exactly the same order as those above. */
+ OP_CRQUERY, /* 68 These are for character classes and back refs */
+ OP_CRMINQUERY, /* 69 */
+ OP_CRRANGE, /* 70 These are different to the three sets above. */
+ OP_CRMINRANGE, /* 71 */
+
+ OP_CLASS, /* 72 Match a character class, chars < 256 only */
+ OP_NCLASS, /* 73 Same, but the bitmap was created from a negative
+ class - the difference is relevant only when a UTF-8
+ character > 255 is encountered. */
+
+ OP_XCLASS, /* 74 Extended class for handling UTF-8 chars within the
+ class. This does both positive and negative. */
+
+ OP_REF, /* 75 Match a back reference */
+ OP_RECURSE, /* 76 Match a numbered subpattern (possibly recursive) */
+ OP_CALLOUT, /* 77 Call out to external function if provided */
+
+ OP_ALT, /* 78 Start of alternation */
+ OP_KET, /* 79 End of group that doesn't have an unbounded repeat */
+ OP_KETRMAX, /* 80 These two must remain together and in this */
+ OP_KETRMIN, /* 81 order. They are for groups the repeat for ever. */
+
+ /* The assertions must come before BRA, CBRA, ONCE, and COND.*/
+
+ OP_ASSERT, /* 82 Positive lookahead */
+ OP_ASSERT_NOT, /* 83 Negative lookahead */
+ OP_ASSERTBACK, /* 84 Positive lookbehind */
+ OP_ASSERTBACK_NOT, /* 85 Negative lookbehind */
+ OP_REVERSE, /* 86 Move pointer back - used in lookbehind assertions */
+
+ /* ONCE, BRA, CBRA, and COND must come after the assertions, with ONCE first,
+ as there's a test for >= ONCE for a subpattern that isn't an assertion. */
+
+ OP_ONCE, /* 87 Atomic group */
+ OP_BRA, /* 88 Start of non-capturing bracket */
+ OP_CBRA, /* 89 Start of capturing bracket */
+ OP_COND, /* 90 Conditional group */
+
+ /* These three must follow the previous three, in the same order. There's a
+ check for >= SBRA to distinguish the two sets. */
+
+ OP_SBRA, /* 91 Start of non-capturing bracket, check empty */
+ OP_SCBRA, /* 92 Start of capturing bracket, check empty */
+ OP_SCOND, /* 93 Conditional group, check empty */
+
+ OP_CREF, /* 94 Used to hold a capture number as condition */
+ OP_RREF, /* 95 Used to hold a recursion number as condition */
+ OP_DEF, /* 96 The DEFINE condition */
+
+ OP_BRAZERO, /* 97 These two must remain together and in this */
+ OP_BRAMINZERO /* 98 order. */
+};
+
+
+/* This macro defines textual names for all the opcodes. These are used only
+for debugging. The macro is referenced only in pcre_printint.c. */
+
+#define OP_NAME_LIST \
+ "End", "\\A", "\\G", "\\B", "\\b", "\\D", "\\d", \
+ "\\S", "\\s", "\\W", "\\w", "Any", "Anybyte", \
+ "notprop", "prop", "anynl", "extuni", \
+ "\\Z", "\\z", \
+ "Opt", "^", "$", "char", "charnc", "not", \
+ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \
+ "*+","++", "?+", "{", \
+ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \
+ "*+","++", "?+", "{", \
+ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \
+ "*+","++", "?+", "{", \
+ "*", "*?", "+", "+?", "?", "??", "{", "{", \
+ "class", "nclass", "xclass", "Ref", "Recurse", "Callout", \
+ "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not", \
+ "AssertB", "AssertB not", "Reverse", \
+ "Once", "Bra 0", "Bra", "Cond", "SBra 0", "SBra", "SCond", \
+ "Cond ref", "Cond rec", "Cond def", "Brazero", "Braminzero"
+
+
+/* This macro defines the length of fixed length operations in the compiled
+regex. The lengths are used when searching for specific things, and also in the
+debugging printing of a compiled regex. We use a macro so that it can be
+defined close to the definitions of the opcodes themselves.
+
+As things have been extended, some of these are no longer fixed lenths, but are
+minima instead. For example, the length of a single-character repeat may vary
+in UTF-8 mode. The code that uses this table must know about such things. */
+
+#define OP_LENGTHS \
+ 1, /* End */ \
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* \A, \G, \B, \B, \D, \d, \S, \s, \W, \w */ \
+ 1, 1, /* Any, Anybyte */ \
+ 3, 3, 1, 1, /* NOTPROP, PROP, EXTUNI, ANYNL */ \
+ 1, 1, 2, 1, 1, /* \Z, \z, Opt, ^, $ */ \
+ 2, /* Char - the minimum length */ \
+ 2, /* Charnc - the minimum length */ \
+ 2, /* not */ \
+ /* Positive single-char repeats ** These are */ \
+ 2, 2, 2, 2, 2, 2, /* *, *?, +, +?, ?, ?? ** minima in */ \
+ 4, 4, 4, /* upto, minupto, exact ** UTF-8 mode */ \
+ 2, 2, 2, 4, /* *+, ++, ?+, upto+ */ \
+ /* Negative single-char repeats - only for chars < 256 */ \
+ 2, 2, 2, 2, 2, 2, /* NOT *, *?, +, +?, ?, ?? */ \
+ 4, 4, 4, /* NOT upto, minupto, exact */ \
+ 2, 2, 2, 4, /* Possessive *, +, ?, upto */ \
+ /* Positive type repeats */ \
+ 2, 2, 2, 2, 2, 2, /* Type *, *?, +, +?, ?, ?? */ \
+ 4, 4, 4, /* Type upto, minupto, exact */ \
+ 2, 2, 2, 4, /* Possessive *+, ++, ?+, upto+ */ \
+ /* Character class & ref repeats */ \
+ 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ \
+ 5, 5, /* CRRANGE, CRMINRANGE */ \
+ 33, /* CLASS */ \
+ 33, /* NCLASS */ \
+ 0, /* XCLASS - variable length */ \
+ 3, /* REF */ \
+ 1+LINK_SIZE, /* RECURSE */ \
+ 2+2*LINK_SIZE, /* CALLOUT */ \
+ 1+LINK_SIZE, /* Alt */ \
+ 1+LINK_SIZE, /* Ket */ \
+ 1+LINK_SIZE, /* KetRmax */ \
+ 1+LINK_SIZE, /* KetRmin */ \
+ 1+LINK_SIZE, /* Assert */ \
+ 1+LINK_SIZE, /* Assert not */ \
+ 1+LINK_SIZE, /* Assert behind */ \
+ 1+LINK_SIZE, /* Assert behind not */ \
+ 1+LINK_SIZE, /* Reverse */ \
+ 1+LINK_SIZE, /* ONCE */ \
+ 1+LINK_SIZE, /* BRA */ \
+ 3+LINK_SIZE, /* CBRA */ \
+ 1+LINK_SIZE, /* COND */ \
+ 1+LINK_SIZE, /* SBRA */ \
+ 3+LINK_SIZE, /* SCBRA */ \
+ 1+LINK_SIZE, /* SCOND */ \
+ 3, /* CREF */ \
+ 3, /* RREF */ \
+ 1, /* DEF */ \
+ 1, 1, /* BRAZERO, BRAMINZERO */ \
+
+
+/* A magic value for OP_RREF to indicate the "any recursion" condition. */
+
+#define RREF_ANY 0xffff
+
+/* Error code numbers. They are given names so that they can more easily be
+tracked. */
+
+enum { ERR0, ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9,
+ ERR10, ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19,
+ ERR20, ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR28, ERR29,
+ ERR30, ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39,
+ ERR40, ERR41, ERR42, ERR43, ERR44, ERR45, ERR46, ERR47, ERR48, ERR49,
+ ERR50, ERR51, ERR52, ERR53, ERR54, ERR55, ERR56, ERR57 };
+
+/* The real format of the start of the pcre block; the index of names and the
+code vector run on as long as necessary after the end. We store an explicit
+offset to the name table so that if a regex is compiled on one host, saved, and
+then run on another where the size of pointers is different, all might still
+be well. For the case of compiled-on-4 and run-on-8, we include an extra
+pointer that is always NULL. For future-proofing, a few dummy fields were
+originally included - even though you can never get this planning right - but
+there is only one left now.
+
+NOTE NOTE NOTE:
+Because people can now save and re-use compiled patterns, any additions to this
+structure should be made at the end, and something earlier (e.g. a new
+flag in the options or one of the dummy fields) should indicate that the new
+fields are present. Currently PCRE always sets the dummy fields to zero.
+NOTE NOTE NOTE:
+*/
+
+typedef struct real_pcre {
+ pcre_uint32 magic_number;
+ pcre_uint32 size; /* Total that was malloced */
+ pcre_uint32 options;
+ pcre_uint32 dummy1; /* For future use, maybe */
+
+ pcre_uint16 top_bracket;
+ pcre_uint16 top_backref;
+ pcre_uint16 first_byte;
+ pcre_uint16 req_byte;
+ pcre_uint16 name_table_offset; /* Offset to name table that follows */
+ pcre_uint16 name_entry_size; /* Size of any name items */
+ pcre_uint16 name_count; /* Number of name items */
+ pcre_uint16 ref_count; /* Reference count */
+
+ const unsigned char *tables; /* Pointer to tables or NULL for std */
+ const unsigned char *nullpad; /* NULL padding */
+} real_pcre;
+
+/* The format of the block used to store data from pcre_study(). The same
+remark (see NOTE above) about extending this structure applies. */
+
+typedef struct pcre_study_data {
+ pcre_uint32 size; /* Total that was malloced */
+ pcre_uint32 options;
+ uschar start_bits[32];
+} pcre_study_data;
+
+/* Structure for passing "static" information around between the functions
+doing the compiling, so that they are thread-safe. */
+
+typedef struct compile_data {
+ const uschar *lcc; /* Points to lower casing table */
+ const uschar *fcc; /* Points to case-flipping table */
+ const uschar *cbits; /* Points to character type table */
+ const uschar *ctypes; /* Points to table of type maps */
+ const uschar *start_workspace;/* The start of working space */
+ const uschar *start_code; /* The start of the compiled code */
+ const uschar *start_pattern; /* The start of the pattern */
+ const uschar *end_pattern; /* The end of the pattern */
+ uschar *hwm; /* High watermark of workspace */
+ uschar *name_table; /* The name/number table */
+ int names_found; /* Number of entries so far */
+ int name_entry_size; /* Size of each entry */
+ int bracount; /* Count of capturing parens */
+ int top_backref; /* Maximum back reference */
+ unsigned int backref_map; /* Bitmap of low back refs */
+ int external_options; /* External (initial) options */
+ int req_varyopt; /* "After variable item" flag for reqbyte */
+ BOOL nopartial; /* Set TRUE if partial won't work */
+ int nltype; /* Newline type */
+ int nllen; /* Newline string length */
+ uschar nl[4]; /* Newline string when fixed length */
+} compile_data;
+
+/* Structure for maintaining a chain of pointers to the currently incomplete
+branches, for testing for left recursion. */
+
+typedef struct branch_chain {
+ struct branch_chain *outer;
+ uschar *current;
+} branch_chain;
+
+/* Structure for items in a linked list that represents an explicit recursive
+call within the pattern. */
+
+typedef struct recursion_info {
+ struct recursion_info *prevrec; /* Previous recursion record (or NULL) */
+ int group_num; /* Number of group that was called */
+ const uschar *after_call; /* "Return value": points after the call in the expr */
+ USPTR save_start; /* Old value of md->start_match */
+ int *offset_save; /* Pointer to start of saved offsets */
+ int saved_max; /* Number of saved offsets */
+} recursion_info;
+
+/* When compiling in a mode that doesn't use recursive calls to match(),
+a structure is used to remember local variables on the heap. It is defined in
+pcre_exec.c, close to the match() function, so that it is easy to keep it in
+step with any changes of local variable. However, the pointer to the current
+frame must be saved in some "static" place over a longjmp(). We declare the
+structure here so that we can put a pointer in the match_data structure. NOTE:
+This isn't used for a "normal" compilation of pcre. */
+
+struct heapframe;
+
+/* Structure for building a chain of data for holding the values of the subject
+pointer at the start of each subpattern, so as to detect when an empty string
+has been matched by a subpattern - to break infinite loops. */
+
+typedef struct eptrblock {
+ struct eptrblock *epb_prev;
+ USPTR epb_saved_eptr;
+} eptrblock;
+
+
+/* Structure for passing "static" information around between the functions
+doing traditional NFA matching, so that they are thread-safe. */
+
+typedef struct match_data {
+ unsigned long int match_call_count; /* As it says */
+ unsigned long int match_limit; /* As it says */
+ unsigned long int match_limit_recursion; /* As it says */
+ int *offset_vector; /* Offset vector */
+ int offset_end; /* One past the end */
+ int offset_max; /* The maximum usable for return data */
+ int nltype; /* Newline type */
+ int nllen; /* Newline string length */
+ uschar nl[4]; /* Newline string when fixed */
+ const uschar *lcc; /* Points to lower casing table */
+ const uschar *ctypes; /* Points to table of type maps */
+ BOOL offset_overflow; /* Set if too many extractions */
+ BOOL notbol; /* NOTBOL flag */
+ BOOL noteol; /* NOTEOL flag */
+ BOOL utf8; /* UTF8 flag */
+ BOOL endonly; /* Dollar not before final \n */
+ BOOL notempty; /* Empty string match not wanted */
+ BOOL partial; /* PARTIAL flag */
+ BOOL hitend; /* Hit the end of the subject at some point */
+ const uschar *start_code; /* For use when recursing */
+ USPTR start_subject; /* Start of the subject string */
+ USPTR end_subject; /* End of the subject string */
+ USPTR start_match; /* Start of this match attempt */
+ USPTR end_match_ptr; /* Subject position at end match */
+ int end_offset_top; /* Highwater mark at end of match */
+ int capture_last; /* Most recent capture number */
+ int start_offset; /* The start offset value */
+ eptrblock *eptrchain; /* Chain of eptrblocks for tail recursions */
+ int eptrn; /* Next free eptrblock */
+ recursion_info *recursive; /* Linked list of recursion data */
+ void *callout_data; /* To pass back to callouts */
+ struct heapframe *thisframe; /* Used only when compiling for no recursion */
+} match_data;
+
+/* A similar structure is used for the same purpose by the DFA matching
+functions. */
+
+typedef struct dfa_match_data {
+ const uschar *start_code; /* Start of the compiled pattern */
+ const uschar *start_subject; /* Start of the subject string */
+ const uschar *end_subject; /* End of subject string */
+ const uschar *tables; /* Character tables */
+ int moptions; /* Match options */
+ int poptions; /* Pattern options */
+ int nltype; /* Newline type */
+ int nllen; /* Newline string length */
+ uschar nl[4]; /* Newline string when fixed */
+ void *callout_data; /* To pass back to callouts */
+} dfa_match_data;
+
+/* Bit definitions for entries in the pcre_ctypes table. */
+
+#define ctype_space 0x01
+#define ctype_letter 0x02
+#define ctype_digit 0x04
+#define ctype_xdigit 0x08
+#define ctype_word 0x10 /* alphameric or '_' */
+#define ctype_meta 0x80 /* regexp meta char or zero (end pattern) */
+
+/* Offsets for the bitmap tables in pcre_cbits. Each table contains a set
+of bits for a class map. Some classes are built by combining these tables. */
+
+#define cbit_space 0 /* [:space:] or \s */
+#define cbit_xdigit 32 /* [:xdigit:] */
+#define cbit_digit 64 /* [:digit:] or \d */
+#define cbit_upper 96 /* [:upper:] */
+#define cbit_lower 128 /* [:lower:] */
+#define cbit_word 160 /* [:word:] or \w */
+#define cbit_graph 192 /* [:graph:] */
+#define cbit_print 224 /* [:print:] */
+#define cbit_punct 256 /* [:punct:] */
+#define cbit_cntrl 288 /* [:cntrl:] */
+#define cbit_length 320 /* Length of the cbits table */
+
+/* Offsets of the various tables from the base tables pointer, and
+total length. */
+
+#define lcc_offset 0
+#define fcc_offset 256
+#define cbits_offset 512
+#define ctypes_offset (cbits_offset + cbit_length)
+#define tables_length (ctypes_offset + 256)
+
+/* Layout of the UCP type table that translates property names into types and
+codes. */
+
+typedef struct {
+ pcre_uint16 offset;
+ pcre_uint16 type;
+ pcre_uint16 value;
+} ucp_type_table;
+
+
+/* Internal shared data tables. These are tables that are used by more than one
+of the exported public functions. They have to be "external" in the C sense,
+but are not part of the PCRE public API. The data for these tables is in the
+pcre_tables.c module. */
+
+extern const int _pcre_utf8_table1[];
+extern const int _pcre_utf8_table2[];
+extern const int _pcre_utf8_table3[];
+extern const uschar _pcre_utf8_table4[];
+
+extern const int _pcre_utf8_table1_size;
+
+extern const char _pcre_ucp_names[];
+extern const ucp_type_table _pcre_utt[];
+extern const int _pcre_utt_size;
+
+extern const uschar _pcre_default_tables[];
+
+extern const uschar _pcre_OP_lengths[];
+
+
+/* Internal shared functions. These are functions that are used by more than
+one of the exported public functions. They have to be "external" in the C
+sense, but are not part of the PCRE public API. */
+
+extern BOOL _pcre_is_newline(const uschar *, const uschar *, int *,
+ BOOL);
+extern int _pcre_ord2utf8(int, uschar *);
+extern real_pcre *_pcre_try_flipped(const real_pcre *, real_pcre *,
+ const pcre_study_data *, pcre_study_data *);
+extern int _pcre_ucp_findprop(const unsigned int, int *, int *);
+extern unsigned int _pcre_ucp_othercase(const unsigned int);
+extern int _pcre_valid_utf8(const uschar *, int);
+extern BOOL _pcre_was_newline(const uschar *, const uschar *, int *,
+ BOOL);
+extern BOOL _pcre_xclass(int, const uschar *);
+
+#endif
+
+/* End of pcre_internal.h */
diff --git a/trunk/glib/pcre/pcre_maketables.c b/trunk/glib/pcre/pcre_maketables.c
new file mode 100644
index 000000000..29e40989b
--- /dev/null
+++ b/trunk/glib/pcre/pcre_maketables.c
@@ -0,0 +1,140 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_maketables(), which builds
+character tables for PCRE in the current locale. The file is compiled on its
+own as part of the PCRE library. However, it is also included in the
+compilation of dftables.c, in which case the macro DFTABLES is defined. */
+
+
+#ifndef DFTABLES
+#include "pcre_internal.h"
+#endif
+
+
+/*************************************************
+* Create PCRE character tables *
+*************************************************/
+
+/* This function builds a set of character tables for use by PCRE and returns
+a pointer to them. They are build using the ctype functions, and consequently
+their contents will depend upon the current locale setting. When compiled as
+part of the library, the store is obtained via pcre_malloc(), but when compiled
+inside dftables, use malloc().
+
+Arguments: none
+Returns: pointer to the contiguous block of data
+*/
+
+const unsigned char *
+pcre_maketables(void)
+{
+unsigned char *yield, *p;
+int i;
+
+#ifndef DFTABLES
+yield = (unsigned char*)(pcre_malloc)(tables_length);
+#else
+yield = (unsigned char*)malloc(tables_length);
+#endif
+
+if (yield == NULL) return NULL;
+p = yield;
+
+/* First comes the lower casing table */
+
+for (i = 0; i < 256; i++) *p++ = tolower(i);
+
+/* Next the case-flipping table */
+
+for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i);
+
+/* Then the character class tables. Don't try to be clever and save effort on
+exclusive ones - in some locales things may be different. Note that the table
+for "space" includes everything "isspace" gives, including VT in the default
+locale. This makes it work for the POSIX class [:space:]. Note also that it is
+possible for a character to be alnum or alpha without being lower or upper,
+such as "male and female ordinals" (\xAA and \xBA) in the fr_FR locale (at
+least under Debian Linux's locales as of 12/2005). So we must test for alnum
+specially. */
+
+memset(p, 0, cbit_length);
+for (i = 0; i < 256; i++)
+ {
+ if (isdigit(i)) p[cbit_digit + i/8] |= 1 << (i&7);
+ if (isupper(i)) p[cbit_upper + i/8] |= 1 << (i&7);
+ if (islower(i)) p[cbit_lower + i/8] |= 1 << (i&7);
+ if (isalnum(i)) p[cbit_word + i/8] |= 1 << (i&7);
+ if (i == '_') p[cbit_word + i/8] |= 1 << (i&7);
+ if (isspace(i)) p[cbit_space + i/8] |= 1 << (i&7);
+ if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7);
+ if (isgraph(i)) p[cbit_graph + i/8] |= 1 << (i&7);
+ if (isprint(i)) p[cbit_print + i/8] |= 1 << (i&7);
+ if (ispunct(i)) p[cbit_punct + i/8] |= 1 << (i&7);
+ if (iscntrl(i)) p[cbit_cntrl + i/8] |= 1 << (i&7);
+ }
+p += cbit_length;
+
+/* Finally, the character type table. In this, we exclude VT from the white
+space chars, because Perl doesn't recognize it as such for \s and for comments
+within regexes. */
+
+for (i = 0; i < 256; i++)
+ {
+ int x = 0;
+ if (i != 0x0b && isspace(i)) x += ctype_space;
+ if (isalpha(i)) x += ctype_letter;
+ if (isdigit(i)) x += ctype_digit;
+ if (isxdigit(i)) x += ctype_xdigit;
+ if (isalnum(i) || i == '_') x += ctype_word;
+
+ /* Note: strchr includes the terminating zero in the characters it considers.
+ In this instance, that is ok because we want binary zero to be flagged as a
+ meta-character, which in this sense is any character that terminates a run
+ of data characters. */
+
+ if (strchr("\\*+?{^.$|()[", i) != 0) x += ctype_meta;
+ *p++ = x;
+ }
+
+return yield;
+}
+
+/* End of pcre_maketables.c */
diff --git a/trunk/glib/pcre/pcre_newline.c b/trunk/glib/pcre/pcre_newline.c
new file mode 100644
index 000000000..348791b1e
--- /dev/null
+++ b/trunk/glib/pcre/pcre_newline.c
@@ -0,0 +1,135 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains internal functions for testing newlines when more than
+one kind of newline is to be recognized. When a newline is found, its length is
+returned. In principle, we could implement several newline "types", each
+referring to a different set of newline characters. At present, PCRE supports
+only NLTYPE_FIXED, which gets handled without these functions, and NLTYPE_ALL,
+so for now the type isn't passed into the functions. It can easily be added
+later if required. The full list of Unicode newline characters is taken from
+http://unicode.org/unicode/reports/tr18/. */
+
+
+#include "pcre_internal.h"
+
+
+
+/*************************************************
+* Check for newline at given position *
+*************************************************/
+
+/* It is guaranteed that the initial value of ptr is less than the end of the
+string that is being processed.
+
+Arguments:
+ ptr pointer to possible newline
+ endptr pointer to the end of the string
+ lenptr where to return the length
+ utf8 TRUE if in utf8 mode
+
+Returns: TRUE or FALSE
+*/
+
+BOOL
+_pcre_is_newline(const uschar *ptr, const uschar *endptr, int *lenptr,
+ BOOL utf8)
+{
+int c;
+if (utf8) { GETCHAR(c, ptr); } else c = *ptr;
+switch(c)
+ {
+ case 0x000a: /* LF */
+ case 0x000b: /* VT */
+ case 0x000c: *lenptr = 1; return TRUE; /* FF */
+ case 0x000d: *lenptr = (ptr < endptr - 1 && ptr[1] == 0x0a)? 2 : 1;
+ return TRUE; /* CR */
+ case 0x0085: *lenptr = utf8? 2 : 1; return TRUE; /* NEL */
+ case 0x2028: /* LS */
+ case 0x2029: *lenptr = 3; return TRUE; /* PS */
+ default: return FALSE;
+ }
+}
+
+
+
+/*************************************************
+* Check for newline at previous position *
+*************************************************/
+
+/* It is guaranteed that the initial value of ptr is greater than the start of
+the string that is being processed.
+
+Arguments:
+ ptr pointer to possible newline
+ startptr pointer to the start of the string
+ lenptr where to return the length
+ utf8 TRUE if in utf8 mode
+
+Returns: TRUE or FALSE
+*/
+
+BOOL
+_pcre_was_newline(const uschar *ptr, const uschar *startptr, int *lenptr,
+ BOOL utf8)
+{
+int c;
+ptr--;
+if (utf8)
+ {
+ BACKCHAR(ptr);
+ GETCHAR(c, ptr);
+ }
+else c = *ptr;
+switch(c)
+ {
+ case 0x000a: *lenptr = (ptr > startptr && ptr[-1] == 0x0d)? 2 : 1;
+ return TRUE; /* LF */
+ case 0x000b: /* VT */
+ case 0x000c: /* FF */
+ case 0x000d: *lenptr = 1; return TRUE; /* CR */
+ case 0x0085: *lenptr = utf8? 2 : 1; return TRUE; /* NEL */
+ case 0x2028: /* LS */
+ case 0x2029: *lenptr = 3; return TRUE; /* PS */
+ default: return FALSE;
+ }
+}
+
+/* End of pcre_newline.c */
diff --git a/trunk/glib/pcre/pcre_ord2utf8.c b/trunk/glib/pcre/pcre_ord2utf8.c
new file mode 100644
index 000000000..fc4d6de81
--- /dev/null
+++ b/trunk/glib/pcre/pcre_ord2utf8.c
@@ -0,0 +1,78 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This file contains a private PCRE function that converts an ordinal
+character value into a UTF8 string. */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+* Convert character value to UTF-8 *
+*************************************************/
+
+/* This function takes an integer value in the range 0 - 0x7fffffff
+and encodes it as a UTF-8 character in 0 to 6 bytes.
+
+Arguments:
+ cvalue the character value
+ buffer pointer to buffer for result - at least 6 bytes long
+
+Returns: number of characters placed in the buffer
+*/
+
+int
+_pcre_ord2utf8(int cvalue, uschar *buffer)
+{
+register int i, j;
+for (i = 0; i < _pcre_utf8_table1_size; i++)
+ if (cvalue <= _pcre_utf8_table1[i]) break;
+buffer += i;
+for (j = i; j > 0; j--)
+ {
+ *buffer-- = 0x80 | (cvalue & 0x3f);
+ cvalue >>= 6;
+ }
+*buffer = _pcre_utf8_table2[i] | cvalue;
+return i + 1;
+}
+
+/* End of pcre_ord2utf8.c */
diff --git a/trunk/glib/pcre/pcre_refcount.c b/trunk/glib/pcre/pcre_refcount.c
new file mode 100644
index 000000000..e6965812e
--- /dev/null
+++ b/trunk/glib/pcre/pcre_refcount.c
@@ -0,0 +1,77 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_refcount(), which is an
+auxiliary function that can be used to maintain a reference count in a compiled
+pattern data block. This might be helpful in applications where the block is
+shared by different users. */
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+* Maintain reference count *
+*************************************************/
+
+/* The reference count is a 16-bit field, initialized to zero. It is not
+possible to transfer a non-zero count from one host to a different host that
+has a different byte order - though I can't see why anyone in their right mind
+would ever want to do that!
+
+Arguments:
+ argument_re points to compiled code
+ adjust value to add to the count
+
+Returns: the (possibly updated) count value (a non-negative number), or
+ a negative error number
+*/
+
+PCRE_DATA_SCOPE int
+pcre_refcount(pcre *argument_re, int adjust)
+{
+real_pcre *re = (real_pcre *)argument_re;
+if (re == NULL) return PCRE_ERROR_NULL;
+re->ref_count = (-adjust > re->ref_count)? 0 :
+ (adjust + re->ref_count > 65535)? 65535 :
+ re->ref_count + adjust;
+return re->ref_count;
+}
+
+/* End of pcre_refcount.c */
diff --git a/trunk/glib/pcre/pcre_study.c b/trunk/glib/pcre/pcre_study.c
new file mode 100644
index 000000000..87f8c6fb5
--- /dev/null
+++ b/trunk/glib/pcre/pcre_study.c
@@ -0,0 +1,570 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_study(), along with local
+supporting functions. */
+
+
+#include "pcre_internal.h"
+
+
+/* Returns from set_start_bits() */
+
+enum { SSB_FAIL, SSB_DONE, SSB_CONTINUE };
+
+
+/*************************************************
+* Set a bit and maybe its alternate case *
+*************************************************/
+
+/* Given a character, set its bit in the table, and also the bit for the other
+version of a letter if we are caseless.
+
+Arguments:
+ start_bits points to the bit map
+ c is the character
+ caseless the caseless flag
+ cd the block with char table pointers
+
+Returns: nothing
+*/
+
+static void
+set_bit(uschar *start_bits, unsigned int c, BOOL caseless, compile_data *cd)
+{
+start_bits[c/8] |= (1 << (c&7));
+if (caseless && (cd->ctypes[c] & ctype_letter) != 0)
+ start_bits[cd->fcc[c]/8] |= (1 << (cd->fcc[c]&7));
+}
+
+
+
+/*************************************************
+* Create bitmap of starting bytes *
+*************************************************/
+
+/* This function scans a compiled unanchored expression recursively and
+attempts to build a bitmap of the set of possible starting bytes. As time goes
+by, we may be able to get more clever at doing this. The SSB_CONTINUE return is
+useful for parenthesized groups in patterns such as (a*)b where the group
+provides some optional starting bytes but scanning must continue at the outer
+level to find at least one mandatory byte. At the outermost level, this
+function fails unless the result is SSB_DONE.
+
+Arguments:
+ code points to an expression
+ start_bits points to a 32-byte table, initialized to 0
+ caseless the current state of the caseless flag
+ utf8 TRUE if in UTF-8 mode
+ cd the block with char table pointers
+
+Returns: SSB_FAIL => Failed to find any starting bytes
+ SSB_DONE => Found mandatory starting bytes
+ SSB_CONTINUE => Found optional starting bytes
+*/
+
+static int
+set_start_bits(const uschar *code, uschar *start_bits, BOOL caseless,
+ BOOL utf8, compile_data *cd)
+{
+register int c;
+int yield = SSB_DONE;
+
+#if 0
+/* ========================================================================= */
+/* The following comment and code was inserted in January 1999. In May 2006,
+when it was observed to cause compiler warnings about unused values, I took it
+out again. If anybody is still using OS/2, they will have to put it back
+manually. */
+
+/* This next statement and the later reference to dummy are here in order to
+trick the optimizer of the IBM C compiler for OS/2 into generating correct
+code. Apparently IBM isn't going to fix the problem, and we would rather not
+disable optimization (in this module it actually makes a big difference, and
+the pcre module can use all the optimization it can get). */
+
+volatile int dummy;
+/* ========================================================================= */
+#endif
+
+do
+ {
+ const uschar *tcode = code + (((int)*code == OP_CBRA)? 3:1) + LINK_SIZE;
+ BOOL try_next = TRUE;
+
+ while (try_next) /* Loop for items in this branch */
+ {
+ int rc;
+ switch(*tcode)
+ {
+ /* Fail if we reach something we don't understand */
+
+ default:
+ return SSB_FAIL;
+
+ /* If we hit a bracket or a positive lookahead assertion, recurse to set
+ bits from within the subpattern. If it can't find anything, we have to
+ give up. If it finds some mandatory character(s), we are done for this
+ branch. Otherwise, carry on scanning after the subpattern. */
+
+ case OP_BRA:
+ case OP_SBRA:
+ case OP_CBRA:
+ case OP_SCBRA:
+ case OP_ONCE:
+ case OP_ASSERT:
+ rc = set_start_bits(tcode, start_bits, caseless, utf8, cd);
+ if (rc == SSB_FAIL) return SSB_FAIL;
+ if (rc == SSB_DONE) try_next = FALSE; else
+ {
+ do tcode += GET(tcode, 1); while (*tcode == OP_ALT);
+ tcode += 1 + LINK_SIZE;
+ }
+ break;
+
+ /* If we hit ALT or KET, it means we haven't found anything mandatory in
+ this branch, though we might have found something optional. For ALT, we
+ continue with the next alternative, but we have to arrange that the final
+ result from subpattern is SSB_CONTINUE rather than SSB_DONE. For KET,
+ return SSB_CONTINUE: if this is the top level, that indicates failure,
+ but after a nested subpattern, it causes scanning to continue. */
+
+ case OP_ALT:
+ yield = SSB_CONTINUE;
+ try_next = FALSE;
+ break;
+
+ case OP_KET:
+ case OP_KETRMAX:
+ case OP_KETRMIN:
+ return SSB_CONTINUE;
+
+ /* Skip over callout */
+
+ case OP_CALLOUT:
+ tcode += 2 + 2*LINK_SIZE;
+ break;
+
+ /* Skip over lookbehind and negative lookahead assertions */
+
+ case OP_ASSERT_NOT:
+ case OP_ASSERTBACK:
+ case OP_ASSERTBACK_NOT:
+ do tcode += GET(tcode, 1); while (*tcode == OP_ALT);
+ tcode += 1 + LINK_SIZE;
+ break;
+
+ /* Skip over an option setting, changing the caseless flag */
+
+ case OP_OPT:
+ caseless = (tcode[1] & PCRE_CASELESS) != 0;
+ tcode += 2;
+ break;
+
+ /* BRAZERO does the bracket, but carries on. */
+
+ case OP_BRAZERO:
+ case OP_BRAMINZERO:
+ if (set_start_bits(++tcode, start_bits, caseless, utf8, cd) == SSB_FAIL)
+ return SSB_FAIL;
+/* =========================================================================
+ See the comment at the head of this function concerning the next line,
+ which was an old fudge for the benefit of OS/2.
+ dummy = 1;
+ ========================================================================= */
+ do tcode += GET(tcode,1); while (*tcode == OP_ALT);
+ tcode += 1 + LINK_SIZE;
+ break;
+
+ /* Single-char * or ? sets the bit and tries the next item */
+
+ case OP_STAR:
+ case OP_MINSTAR:
+ case OP_POSSTAR:
+ case OP_QUERY:
+ case OP_MINQUERY:
+ case OP_POSQUERY:
+ set_bit(start_bits, tcode[1], caseless, cd);
+ tcode += 2;
+#ifdef SUPPORT_UTF8
+ if (utf8 && tcode[-1] >= 0xc0)
+ tcode += _pcre_utf8_table4[tcode[-1] & 0x3f];
+#endif
+ break;
+
+ /* Single-char upto sets the bit and tries the next */
+
+ case OP_UPTO:
+ case OP_MINUPTO:
+ case OP_POSUPTO:
+ set_bit(start_bits, tcode[3], caseless, cd);
+ tcode += 4;
+#ifdef SUPPORT_UTF8
+ if (utf8 && tcode[-1] >= 0xc0)
+ tcode += _pcre_utf8_table4[tcode[-1] & 0x3f];
+#endif
+ break;
+
+ /* At least one single char sets the bit and stops */
+
+ case OP_EXACT: /* Fall through */
+ tcode += 2;
+
+ case OP_CHAR:
+ case OP_CHARNC:
+ case OP_PLUS:
+ case OP_MINPLUS:
+ case OP_POSPLUS:
+ set_bit(start_bits, tcode[1], caseless, cd);
+ try_next = FALSE;
+ break;
+
+ /* Single character type sets the bits and stops */
+
+ case OP_NOT_DIGIT:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= ~cd->cbits[c+cbit_digit];
+ try_next = FALSE;
+ break;
+
+ case OP_DIGIT:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= cd->cbits[c+cbit_digit];
+ try_next = FALSE;
+ break;
+
+ /* The cbit_space table has vertical tab as whitespace; we have to
+ discard it. */
+
+ case OP_NOT_WHITESPACE:
+ for (c = 0; c < 32; c++)
+ {
+ int d = cd->cbits[c+cbit_space];
+ if (c == 1) d &= ~0x08;
+ start_bits[c] |= ~d;
+ }
+ try_next = FALSE;
+ break;
+
+ /* The cbit_space table has vertical tab as whitespace; we have to
+ discard it. */
+
+ case OP_WHITESPACE:
+ for (c = 0; c < 32; c++)
+ {
+ int d = cd->cbits[c+cbit_space];
+ if (c == 1) d &= ~0x08;
+ start_bits[c] |= d;
+ }
+ try_next = FALSE;
+ break;
+
+ case OP_NOT_WORDCHAR:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= ~cd->cbits[c+cbit_word];
+ try_next = FALSE;
+ break;
+
+ case OP_WORDCHAR:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= cd->cbits[c+cbit_word];
+ try_next = FALSE;
+ break;
+
+ /* One or more character type fudges the pointer and restarts, knowing
+ it will hit a single character type and stop there. */
+
+ case OP_TYPEPLUS:
+ case OP_TYPEMINPLUS:
+ tcode++;
+ break;
+
+ case OP_TYPEEXACT:
+ tcode += 3;
+ break;
+
+ /* Zero or more repeats of character types set the bits and then
+ try again. */
+
+ case OP_TYPEUPTO:
+ case OP_TYPEMINUPTO:
+ case OP_TYPEPOSUPTO:
+ tcode += 2; /* Fall through */
+
+ case OP_TYPESTAR:
+ case OP_TYPEMINSTAR:
+ case OP_TYPEPOSSTAR:
+ case OP_TYPEQUERY:
+ case OP_TYPEMINQUERY:
+ case OP_TYPEPOSQUERY:
+ switch(tcode[1])
+ {
+ case OP_ANY:
+ return SSB_FAIL;
+
+ case OP_NOT_DIGIT:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= ~cd->cbits[c+cbit_digit];
+ break;
+
+ case OP_DIGIT:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= cd->cbits[c+cbit_digit];
+ break;
+
+ /* The cbit_space table has vertical tab as whitespace; we have to
+ discard it. */
+
+ case OP_NOT_WHITESPACE:
+ for (c = 0; c < 32; c++)
+ {
+ int d = cd->cbits[c+cbit_space];
+ if (c == 1) d &= ~0x08;
+ start_bits[c] |= ~d;
+ }
+ break;
+
+ /* The cbit_space table has vertical tab as whitespace; we have to
+ discard it. */
+
+ case OP_WHITESPACE:
+ for (c = 0; c < 32; c++)
+ {
+ int d = cd->cbits[c+cbit_space];
+ if (c == 1) d &= ~0x08;
+ start_bits[c] |= d;
+ }
+ break;
+
+ case OP_NOT_WORDCHAR:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= ~cd->cbits[c+cbit_word];
+ break;
+
+ case OP_WORDCHAR:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= cd->cbits[c+cbit_word];
+ break;
+ }
+
+ tcode += 2;
+ break;
+
+ /* Character class where all the information is in a bit map: set the
+ bits and either carry on or not, according to the repeat count. If it was
+ a negative class, and we are operating with UTF-8 characters, any byte
+ with a value >= 0xc4 is a potentially valid starter because it starts a
+ character with a value > 255. */
+
+ case OP_NCLASS:
+ if (utf8)
+ {
+ start_bits[24] |= 0xf0; /* Bits for 0xc4 - 0xc8 */
+ memset(start_bits+25, 0xff, 7); /* Bits for 0xc9 - 0xff */
+ }
+ /* Fall through */
+
+ case OP_CLASS:
+ {
+ tcode++;
+
+ /* In UTF-8 mode, the bits in a bit map correspond to character
+ values, not to byte values. However, the bit map we are constructing is
+ for byte values. So we have to do a conversion for characters whose
+ value is > 127. In fact, there are only two possible starting bytes for
+ characters in the range 128 - 255. */
+
+ if (utf8)
+ {
+ for (c = 0; c < 16; c++) start_bits[c] |= tcode[c];
+ for (c = 128; c < 256; c++)
+ {
+ if ((tcode[c/8] && (1 << (c&7))) != 0)
+ {
+ int d = (c >> 6) | 0xc0; /* Set bit for this starter */
+ start_bits[d/8] |= (1 << (d&7)); /* and then skip on to the */
+ c = (c & 0xc0) + 0x40 - 1; /* next relevant character. */
+ }
+ }
+ }
+
+ /* In non-UTF-8 mode, the two bit maps are completely compatible. */
+
+ else
+ {
+ for (c = 0; c < 32; c++) start_bits[c] |= tcode[c];
+ }
+
+ /* Advance past the bit map, and act on what follows */
+
+ tcode += 32;
+ switch (*tcode)
+ {
+ case OP_CRSTAR:
+ case OP_CRMINSTAR:
+ case OP_CRQUERY:
+ case OP_CRMINQUERY:
+ tcode++;
+ break;
+
+ case OP_CRRANGE:
+ case OP_CRMINRANGE:
+ if (((tcode[1] << 8) + tcode[2]) == 0) tcode += 5;
+ else try_next = FALSE;
+ break;
+
+ default:
+ try_next = FALSE;
+ break;
+ }
+ }
+ break; /* End of bitmap class handling */
+
+ } /* End of switch */
+ } /* End of try_next loop */
+
+ code += GET(code, 1); /* Advance to next branch */
+ }
+while (*code == OP_ALT);
+return yield;
+}
+
+
+
+/*************************************************
+* Study a compiled expression *
+*************************************************/
+
+/* This function is handed a compiled expression that it must study to produce
+information that will speed up the matching. It returns a pcre_extra block
+which then gets handed back to pcre_exec().
+
+Arguments:
+ re points to the compiled expression
+ options contains option bits
+ errorptr points to where to place error messages;
+ set NULL unless error
+
+Returns: pointer to a pcre_extra block, with study_data filled in and the
+ appropriate flag set;
+ NULL on error or if no optimization possible
+*/
+
+PCRE_DATA_SCOPE pcre_extra *
+pcre_study(const pcre *external_re, int options, const char **errorptr)
+{
+uschar start_bits[32];
+pcre_extra *extra;
+pcre_study_data *study;
+const uschar *tables;
+uschar *code;
+compile_data compile_block;
+const real_pcre *re = (const real_pcre *)external_re;
+
+*errorptr = NULL;
+
+if (re == NULL || re->magic_number != MAGIC_NUMBER)
+ {
+ *errorptr = "argument is not a compiled regular expression";
+ return NULL;
+ }
+
+if ((options & ~PUBLIC_STUDY_OPTIONS) != 0)
+ {
+ *errorptr = "unknown or incorrect option bit(s) set";
+ return NULL;
+ }
+
+code = (uschar *)re + re->name_table_offset +
+ (re->name_count * re->name_entry_size);
+
+/* For an anchored pattern, or an unanchored pattern that has a first char, or
+a multiline pattern that matches only at "line starts", no further processing
+at present. */
+
+if ((re->options & (PCRE_ANCHORED|PCRE_FIRSTSET|PCRE_STARTLINE)) != 0)
+ return NULL;
+
+/* Set the character tables in the block that is passed around */
+
+tables = re->tables;
+if (tables == NULL)
+ (void)pcre_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES,
+ (void *)(&tables));
+
+compile_block.lcc = tables + lcc_offset;
+compile_block.fcc = tables + fcc_offset;
+compile_block.cbits = tables + cbits_offset;
+compile_block.ctypes = tables + ctypes_offset;
+
+/* See if we can find a fixed set of initial characters for the pattern. */
+
+memset(start_bits, 0, 32 * sizeof(uschar));
+if (set_start_bits(code, start_bits, (re->options & PCRE_CASELESS) != 0,
+ (re->options & PCRE_UTF8) != 0, &compile_block) != SSB_DONE) return NULL;
+
+/* Get a pcre_extra block and a pcre_study_data block. The study data is put in
+the latter, which is pointed to by the former, which may also get additional
+data set later by the calling program. At the moment, the size of
+pcre_study_data is fixed. We nevertheless save it in a field for returning via
+the pcre_fullinfo() function so that if it becomes variable in the future, we
+don't have to change that code. */
+
+extra = (pcre_extra *)(pcre_malloc)
+ (sizeof(pcre_extra) + sizeof(pcre_study_data));
+
+if (extra == NULL)
+ {
+ *errorptr = "failed to get memory";
+ return NULL;
+ }
+
+study = (pcre_study_data *)((char *)extra + sizeof(pcre_extra));
+extra->flags = PCRE_EXTRA_STUDY_DATA;
+extra->study_data = study;
+
+study->size = sizeof(pcre_study_data);
+study->options = PCRE_STUDY_MAPPED;
+memcpy(study->start_bits, start_bits, sizeof(start_bits));
+
+return extra;
+}
+
+/* End of pcre_study.c */
diff --git a/trunk/glib/pcre/pcre_tables.c b/trunk/glib/pcre/pcre_tables.c
new file mode 100644
index 000000000..b764b1d88
--- /dev/null
+++ b/trunk/glib/pcre/pcre_tables.c
@@ -0,0 +1,304 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains some fixed tables that are used by more than one of the
+PCRE code modules. The tables are also #included by the pcretest program, which
+uses macros to change their names from _pcre_xxx to xxxx, thereby avoiding name
+clashes with the library. */
+
+
+#include "pcre_internal.h"
+
+
+/* Table of sizes for the fixed-length opcodes. It's defined in a macro so that
+the definition is next to the definition of the opcodes in pcre_internal.h. */
+
+const uschar _pcre_OP_lengths[] = { OP_LENGTHS };
+
+
+
+/*************************************************
+* Tables for UTF-8 support *
+*************************************************/
+
+/* These are the breakpoints for different numbers of bytes in a UTF-8
+character. */
+
+const int _pcre_utf8_table1[] =
+ { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff};
+
+const int _pcre_utf8_table1_size = sizeof(_pcre_utf8_table1)/sizeof(int);
+
+/* These are the indicator bits and the mask for the data bits to set in the
+first byte of a character, indexed by the number of additional bytes. */
+
+const int _pcre_utf8_table2[] = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
+const int _pcre_utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
+
+/* Table of the number of extra bytes, indexed by the first byte masked with
+0x3f. The highest number for a valid UTF-8 first byte is in fact 0x3d. */
+
+const uschar _pcre_utf8_table4[] = {
+ 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,
+ 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 };
+
+/* This table translates Unicode property names into type and code values. It
+is searched by binary chop, so must be in collating sequence of name. */
+
+const char _pcre_ucp_names[] =
+ "Any\0"
+ "Arabic\0"
+ "Armenian\0"
+ "Balinese\0"
+ "Bengali\0"
+ "Bopomofo\0"
+ "Braille\0"
+ "Buginese\0"
+ "Buhid\0"
+ "C\0"
+ "Canadian_Aboriginal\0"
+ "Cc\0"
+ "Cf\0"
+ "Cherokee\0"
+ "Cn\0"
+ "Co\0"
+ "Common\0"
+ "Coptic\0"
+ "Cs\0"
+ "Cuneiform\0"
+ "Cypriot\0"
+ "Cyrillic\0"
+ "Deseret\0"
+ "Devanagari\0"
+ "Ethiopic\0"
+ "Georgian\0"
+ "Glagolitic\0"
+ "Gothic\0"
+ "Greek\0"
+ "Gujarati\0"
+ "Gurmukhi\0"
+ "Han\0"
+ "Hangul\0"
+ "Hanunoo\0"
+ "Hebrew\0"
+ "Hiragana\0"
+ "Inherited\0"
+ "Kannada\0"
+ "Katakana\0"
+ "Kharoshthi\0"
+ "Khmer\0"
+ "L\0"
+ "L&\0"
+ "Lao\0"
+ "Latin\0"
+ "Limbu\0"
+ "Linear_B\0"
+ "Ll\0"
+ "Lm\0"
+ "Lo\0"
+ "Lt\0"
+ "Lu\0"
+ "M\0"
+ "Malayalam\0"
+ "Mc\0"
+ "Me\0"
+ "Mn\0"
+ "Mongolian\0"
+ "Myanmar\0"
+ "N\0"
+ "Nd\0"
+ "New_Tai_Lue\0"
+ "Nko\0"
+ "Nl\0"
+ "No\0"
+ "Ogham\0"
+ "Old_Italic\0"
+ "Old_Persian\0"
+ "Oriya\0"
+ "Osmanya\0"
+ "P\0"
+ "Pc\0"
+ "Pd\0"
+ "Pe\0"
+ "Pf\0"
+ "Phags_Pa\0"
+ "Phoenician\0"
+ "Pi\0"
+ "Po\0"
+ "Ps\0"
+ "Runic\0"
+ "S\0"
+ "Sc\0"
+ "Shavian\0"
+ "Sinhala\0"
+ "Sk\0"
+ "Sm\0"
+ "So\0"
+ "Syloti_Nagri\0"
+ "Syriac\0"
+ "Tagalog\0"
+ "Tagbanwa\0"
+ "Tai_Le\0"
+ "Tamil\0"
+ "Telugu\0"
+ "Thaana\0"
+ "Thai\0"
+ "Tibetan\0"
+ "Tifinagh\0"
+ "Ugaritic\0"
+ "Yi\0"
+ "Z\0"
+ "Zl\0"
+ "Zp\0"
+ "Zs\0";
+
+const ucp_type_table _pcre_utt[] = {
+ { 0, PT_ANY, 0 },
+ { 4, PT_SC, ucp_Arabic },
+ { 11, PT_SC, ucp_Armenian },
+ { 20, PT_SC, ucp_Balinese },
+ { 29, PT_SC, ucp_Bengali },
+ { 37, PT_SC, ucp_Bopomofo },
+ { 46, PT_SC, ucp_Braille },
+ { 54, PT_SC, ucp_Buginese },
+ { 63, PT_SC, ucp_Buhid },
+ { 69, PT_GC, ucp_C },
+ { 71, PT_SC, ucp_Canadian_Aboriginal },
+ { 91, PT_PC, ucp_Cc },
+ { 94, PT_PC, ucp_Cf },
+ { 97, PT_SC, ucp_Cherokee },
+ { 106, PT_PC, ucp_Cn },
+ { 109, PT_PC, ucp_Co },
+ { 112, PT_SC, ucp_Common },
+ { 119, PT_SC, ucp_Coptic },
+ { 126, PT_PC, ucp_Cs },
+ { 129, PT_SC, ucp_Cuneiform },
+ { 139, PT_SC, ucp_Cypriot },
+ { 147, PT_SC, ucp_Cyrillic },
+ { 156, PT_SC, ucp_Deseret },
+ { 164, PT_SC, ucp_Devanagari },
+ { 175, PT_SC, ucp_Ethiopic },
+ { 184, PT_SC, ucp_Georgian },
+ { 193, PT_SC, ucp_Glagolitic },
+ { 204, PT_SC, ucp_Gothic },
+ { 211, PT_SC, ucp_Greek },
+ { 217, PT_SC, ucp_Gujarati },
+ { 226, PT_SC, ucp_Gurmukhi },
+ { 235, PT_SC, ucp_Han },
+ { 239, PT_SC, ucp_Hangul },
+ { 246, PT_SC, ucp_Hanunoo },
+ { 254, PT_SC, ucp_Hebrew },
+ { 261, PT_SC, ucp_Hiragana },
+ { 270, PT_SC, ucp_Inherited },
+ { 280, PT_SC, ucp_Kannada },
+ { 288, PT_SC, ucp_Katakana },
+ { 297, PT_SC, ucp_Kharoshthi },
+ { 308, PT_SC, ucp_Khmer },
+ { 314, PT_GC, ucp_L },
+ { 316, PT_LAMP, 0 },
+ { 319, PT_SC, ucp_Lao },
+ { 323, PT_SC, ucp_Latin },
+ { 329, PT_SC, ucp_Limbu },
+ { 335, PT_SC, ucp_Linear_B },
+ { 344, PT_PC, ucp_Ll },
+ { 347, PT_PC, ucp_Lm },
+ { 350, PT_PC, ucp_Lo },
+ { 353, PT_PC, ucp_Lt },
+ { 356, PT_PC, ucp_Lu },
+ { 359, PT_GC, ucp_M },
+ { 361, PT_SC, ucp_Malayalam },
+ { 371, PT_PC, ucp_Mc },
+ { 374, PT_PC, ucp_Me },
+ { 377, PT_PC, ucp_Mn },
+ { 380, PT_SC, ucp_Mongolian },
+ { 390, PT_SC, ucp_Myanmar },
+ { 398, PT_GC, ucp_N },
+ { 400, PT_PC, ucp_Nd },
+ { 403, PT_SC, ucp_New_Tai_Lue },
+ { 415, PT_SC, ucp_Nko },
+ { 419, PT_PC, ucp_Nl },
+ { 422, PT_PC, ucp_No },
+ { 425, PT_SC, ucp_Ogham },
+ { 431, PT_SC, ucp_Old_Italic },
+ { 442, PT_SC, ucp_Old_Persian },
+ { 454, PT_SC, ucp_Oriya },
+ { 460, PT_SC, ucp_Osmanya },
+ { 468, PT_GC, ucp_P },
+ { 470, PT_PC, ucp_Pc },
+ { 473, PT_PC, ucp_Pd },
+ { 476, PT_PC, ucp_Pe },
+ { 479, PT_PC, ucp_Pf },
+ { 482, PT_SC, ucp_Phags_Pa },
+ { 491, PT_SC, ucp_Phoenician },
+ { 502, PT_PC, ucp_Pi },
+ { 505, PT_PC, ucp_Po },
+ { 508, PT_PC, ucp_Ps },
+ { 511, PT_SC, ucp_Runic },
+ { 517, PT_GC, ucp_S },
+ { 519, PT_PC, ucp_Sc },
+ { 522, PT_SC, ucp_Shavian },
+ { 530, PT_SC, ucp_Sinhala },
+ { 538, PT_PC, ucp_Sk },
+ { 541, PT_PC, ucp_Sm },
+ { 544, PT_PC, ucp_So },
+ { 547, PT_SC, ucp_Syloti_Nagri },
+ { 560, PT_SC, ucp_Syriac },
+ { 567, PT_SC, ucp_Tagalog },
+ { 575, PT_SC, ucp_Tagbanwa },
+ { 584, PT_SC, ucp_Tai_Le },
+ { 591, PT_SC, ucp_Tamil },
+ { 597, PT_SC, ucp_Telugu },
+ { 604, PT_SC, ucp_Thaana },
+ { 611, PT_SC, ucp_Thai },
+ { 616, PT_SC, ucp_Tibetan },
+ { 624, PT_SC, ucp_Tifinagh },
+ { 633, PT_SC, ucp_Ugaritic },
+ { 642, PT_SC, ucp_Yi },
+ { 645, PT_GC, ucp_Z },
+ { 647, PT_PC, ucp_Zl },
+ { 650, PT_PC, ucp_Zp },
+ { 653, PT_PC, ucp_Zs }
+};
+
+const int _pcre_utt_size = sizeof(_pcre_utt)/sizeof(ucp_type_table);
+
+/* End of pcre_tables.c */
diff --git a/trunk/glib/pcre/pcre_try_flipped.c b/trunk/glib/pcre/pcre_try_flipped.c
new file mode 100644
index 000000000..00c94fccf
--- /dev/null
+++ b/trunk/glib/pcre/pcre_try_flipped.c
@@ -0,0 +1,132 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains an internal function that tests a compiled pattern to
+see if it was compiled with the opposite endianness. If so, it uses an
+auxiliary local function to flip the appropriate bytes. */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+* Flip bytes in an integer *
+*************************************************/
+
+/* This function is called when the magic number in a regex doesn't match, in
+order to flip its bytes to see if we are dealing with a pattern that was
+compiled on a host of different endianness. If so, this function is used to
+flip other byte values.
+
+Arguments:
+ value the number to flip
+ n the number of bytes to flip (assumed to be 2 or 4)
+
+Returns: the flipped value
+*/
+
+static unsigned long int
+byteflip(unsigned long int value, int n)
+{
+if (n == 2) return ((value & 0x00ff) << 8) | ((value & 0xff00) >> 8);
+return ((value & 0x000000ff) << 24) |
+ ((value & 0x0000ff00) << 8) |
+ ((value & 0x00ff0000) >> 8) |
+ ((value & 0xff000000) >> 24);
+}
+
+
+
+/*************************************************
+* Test for a byte-flipped compiled regex *
+*************************************************/
+
+/* This function is called from pcre_exec(), pcre_dfa_exec(), and also from
+pcre_fullinfo(). Its job is to test whether the regex is byte-flipped - that
+is, it was compiled on a system of opposite endianness. The function is called
+only when the native MAGIC_NUMBER test fails. If the regex is indeed flipped,
+we flip all the relevant values into a different data block, and return it.
+
+Arguments:
+ re points to the regex
+ study points to study data, or NULL
+ internal_re points to a new regex block
+ internal_study points to a new study block
+
+Returns: the new block if is is indeed a byte-flipped regex
+ NULL if it is not
+*/
+
+real_pcre *
+_pcre_try_flipped(const real_pcre *re, real_pcre *internal_re,
+ const pcre_study_data *study, pcre_study_data *internal_study)
+{
+if (byteflip(re->magic_number, sizeof(re->magic_number)) != MAGIC_NUMBER)
+ return NULL;
+
+*internal_re = *re; /* To copy other fields */
+internal_re->size = byteflip(re->size, sizeof(re->size));
+internal_re->options = byteflip(re->options, sizeof(re->options));
+internal_re->top_bracket =
+ (pcre_uint16)byteflip(re->top_bracket, sizeof(re->top_bracket));
+internal_re->top_backref =
+ (pcre_uint16)byteflip(re->top_backref, sizeof(re->top_backref));
+internal_re->first_byte =
+ (pcre_uint16)byteflip(re->first_byte, sizeof(re->first_byte));
+internal_re->req_byte =
+ (pcre_uint16)byteflip(re->req_byte, sizeof(re->req_byte));
+internal_re->name_table_offset =
+ (pcre_uint16)byteflip(re->name_table_offset, sizeof(re->name_table_offset));
+internal_re->name_entry_size =
+ (pcre_uint16)byteflip(re->name_entry_size, sizeof(re->name_entry_size));
+internal_re->name_count =
+ (pcre_uint16)byteflip(re->name_count, sizeof(re->name_count));
+
+if (study != NULL)
+ {
+ *internal_study = *study; /* To copy other fields */
+ internal_study->size = byteflip(study->size, sizeof(study->size));
+ internal_study->options = byteflip(study->options, sizeof(study->options));
+ }
+
+return internal_re;
+}
+
+/* End of pcre_tryflipped.c */
diff --git a/trunk/glib/pcre/pcre_ucp_searchfuncs.c b/trunk/glib/pcre/pcre_ucp_searchfuncs.c
new file mode 100644
index 000000000..b95d2794c
--- /dev/null
+++ b/trunk/glib/pcre/pcre_ucp_searchfuncs.c
@@ -0,0 +1,126 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+/* This file has been modified to use glib instead of the internal table
+ * in ucptable.c -- Marco Barisione */
+
+/* This module contains code for searching the table of Unicode character
+properties. */
+
+#include "pcre_internal.h"
+
+#include "ucp.h" /* Category definitions */
+#include "ucpinternal.h" /* Internal table details */
+
+
+/* Table to translate from particular type value to the general value. */
+
+static int ucp_gentype[] = {
+ ucp_C, ucp_C, ucp_C, ucp_C, ucp_C, /* Cc, Cf, Cn, Co, Cs */
+ ucp_L, ucp_L, ucp_L, ucp_L, ucp_L, /* Ll, Lu, Lm, Lo, Lt */
+ ucp_M, ucp_M, ucp_M, /* Mc, Me, Mn */
+ ucp_N, ucp_N, ucp_N, /* Nd, Nl, No */
+ ucp_P, ucp_P, ucp_P, ucp_P, ucp_P, /* Pc, Pd, Pe, Pf, Pi */
+ ucp_P, ucp_P, /* Ps, Po */
+ ucp_S, ucp_S, ucp_S, ucp_S, /* Sc, Sk, Sm, So */
+ ucp_Z, ucp_Z, ucp_Z /* Zl, Zp, Zs */
+};
+
+
+
+/*************************************************
+* Search table and return type *
+*************************************************/
+
+/* Three values are returned: the category is ucp_C, ucp_L, etc. The detailed
+character type is ucp_Lu, ucp_Nd, etc. The script is ucp_Latin, etc.
+
+Arguments:
+ c the character value
+ type_ptr the detailed character type is returned here
+ script_ptr the script is returned here
+
+Returns: the character type category
+*/
+
+int
+_pcre_ucp_findprop(const unsigned int c, int *type_ptr, int *script_ptr)
+{
+/* Note that the Unicode types have the same values in glib and in
+ * PCRE, so ucp_Ll == G_UNICODE_LOWERCASE_LETTER,
+ * ucp_Zs == G_UNICODE_SPACE_SEPARATOR, and so on. */
+*type_ptr = g_unichar_type(c);
+*script_ptr = g_unichar_get_script(c);
+return ucp_gentype[*type_ptr];
+}
+
+
+
+
+/*************************************************
+* Search table and return other case *
+*************************************************/
+
+/* If the given character is a letter, and there is another case for the
+letter, return the other case. Otherwise, return -1.
+
+Arguments:
+ c the character value
+
+Returns: the other case or NOTACHAR if none
+*/
+
+unsigned int
+_pcre_ucp_othercase(const unsigned int c)
+{
+int other_case = NOTACHAR;
+
+if (g_unichar_islower(c))
+ other_case = g_unichar_toupper(c);
+else if (g_unichar_isupper(c))
+ other_case = g_unichar_tolower(c);
+
+if (other_case == c)
+ other_case = NOTACHAR;
+
+return other_case;
+}
+
+
+/* End of pcre_ucp_searchfuncs.c */
diff --git a/trunk/glib/pcre/pcre_valid_utf8.c b/trunk/glib/pcre/pcre_valid_utf8.c
new file mode 100644
index 000000000..a5766b454
--- /dev/null
+++ b/trunk/glib/pcre/pcre_valid_utf8.c
@@ -0,0 +1,13 @@
+#include "pcre_internal.h"
+
+/*
+ * This function is not needed by GRegex, so print an error and
+ * return always -1, that is the string is a valid UTF-8 encoded
+ * string.
+ */
+int
+_pcre_valid_utf8(const uschar *string, int length)
+{
+g_warning ("%s: this function should not be called", G_STRLOC);
+return -1;
+}
diff --git a/trunk/glib/pcre/pcre_version.c b/trunk/glib/pcre/pcre_version.c
new file mode 100644
index 000000000..9edf3e013
--- /dev/null
+++ b/trunk/glib/pcre/pcre_version.c
@@ -0,0 +1,86 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_version(), which returns a
+string that identifies the PCRE version that is in use. */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+* Return version string *
+*************************************************/
+
+/* These macros are the standard way of turning unquoted text into C strings.
+They allow macros like PCRE_MAJOR to be defined without quotes, which is
+convenient for user programs that want to test its value. */
+
+#define STRING(a) # a
+#define XSTRING(s) STRING(s)
+
+/* A problem turned up with PCRE_PRERELEASE, which is defined empty for
+production releases. Originally, it was used naively in this code:
+
+ return XSTRING(PCRE_MAJOR)
+ "." XSTRING(PCRE_MINOR)
+ XSTRING(PCRE_PRERELEASE)
+ " " XSTRING(PCRE_DATE);
+
+However, when PCRE_PRERELEASE is empty, this leads to an attempted expansion of
+STRING(). The C standard states: "If (before argument substitution) any
+argument consists of no preprocessing tokens, the behavior is undefined." It
+turns out the gcc treats this case as a single empty string - which is what we
+really want - but Visual C grumbles about the lack of an argument for the
+macro. Unfortunately, both are within their rights. To cope with both ways of
+handling this, I had resort to some messy hackery that does a test at run time.
+I could find no way of detecting that a macro is defined as an empty string at
+pre-processor time. This hack uses a standard trick for avoiding calling
+the STRING macro with an empty argument when doing the test. */
+
+PCRE_DATA_SCOPE const char *
+pcre_version(void)
+{
+return (XSTRING(Z PCRE_PRERELEASE)[1] == 0)?
+ XSTRING(PCRE_MAJOR.PCRE_MINOR PCRE_DATE) :
+ XSTRING(PCRE_MAJOR.PCRE_MINOR) XSTRING(PCRE_PRERELEASE PCRE_DATE);
+}
+
+/* End of pcre_version.c */
diff --git a/trunk/glib/pcre/pcre_xclass.c b/trunk/glib/pcre/pcre_xclass.c
new file mode 100644
index 000000000..57c514b78
--- /dev/null
+++ b/trunk/glib/pcre/pcre_xclass.c
@@ -0,0 +1,144 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains an internal function that is used to match an extended
+class (one that contains characters whose values are > 255). It is used by both
+pcre_exec() and pcre_def_exec(). */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+* Match character against an XCLASS *
+*************************************************/
+
+/* This function is called to match a character against an extended class that
+might contain values > 255.
+
+Arguments:
+ c the character
+ data points to the flag byte of the XCLASS data
+
+Returns: TRUE if character matches, else FALSE
+*/
+
+BOOL
+_pcre_xclass(int c, const uschar *data)
+{
+int t;
+BOOL negated = (*data & XCL_NOT) != 0;
+
+/* Character values < 256 are matched against a bitmap, if one is present. If
+not, we still carry on, because there may be ranges that start below 256 in the
+additional data. */
+
+if (c < 256)
+ {
+ if ((*data & XCL_MAP) != 0 && (data[1 + c/8] & (1 << (c&7))) != 0)
+ return !negated; /* char found */
+ }
+
+/* First skip the bit map if present. Then match against the list of Unicode
+properties or large chars or ranges that end with a large char. We won't ever
+encounter XCL_PROP or XCL_NOTPROP when UCP support is not compiled. */
+
+if ((*data++ & XCL_MAP) != 0) data += 32;
+
+while ((t = *data++) != XCL_END)
+ {
+ int x, y;
+ if (t == XCL_SINGLE)
+ {
+ GETCHARINC(x, data);
+ if (c == x) return !negated;
+ }
+ else if (t == XCL_RANGE)
+ {
+ GETCHARINC(x, data);
+ GETCHARINC(y, data);
+ if (c >= x && c <= y) return !negated;
+ }
+
+#ifdef SUPPORT_UCP
+ else /* XCL_PROP & XCL_NOTPROP */
+ {
+ int chartype, script;
+ int category = _pcre_ucp_findprop(c, &chartype, &script);
+
+ switch(*data)
+ {
+ case PT_ANY:
+ if (t == XCL_PROP) return !negated;
+ break;
+
+ case PT_LAMP:
+ if ((chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt) ==
+ (t == XCL_PROP)) return !negated;
+ break;
+
+ case PT_GC:
+ if ((data[1] == category) == (t == XCL_PROP)) return !negated;
+ break;
+
+ case PT_PC:
+ if ((data[1] == chartype) == (t == XCL_PROP)) return !negated;
+ break;
+
+ case PT_SC:
+ if ((data[1] == script) == (t == XCL_PROP)) return !negated;
+ break;
+
+ /* This should never occur, but compilers may mutter if there is no
+ default. */
+
+ default:
+ return FALSE;
+ }
+
+ data += 2;
+ }
+#endif /* SUPPORT_UCP */
+ }
+
+return negated; /* char did not match */
+}
+
+/* End of pcre_xclass.c */
diff --git a/trunk/glib/pcre/ucp.h b/trunk/glib/pcre/ucp.h
new file mode 100644
index 000000000..b2616b273
--- /dev/null
+++ b/trunk/glib/pcre/ucp.h
@@ -0,0 +1,133 @@
+/*************************************************
+* Unicode Property Table handler *
+*************************************************/
+
+#ifndef _UCP_H
+#define _UCP_H
+
+/* This file contains definitions of the property values that are returned by
+the function _pcre_ucp_findprop(). New values that are added for new releases
+of Unicode should always be at the end of each enum, for backwards
+compatibility. */
+
+/* These are the general character categories. */
+
+enum {
+ ucp_C, /* Other */
+ ucp_L, /* Letter */
+ ucp_M, /* Mark */
+ ucp_N, /* Number */
+ ucp_P, /* Punctuation */
+ ucp_S, /* Symbol */
+ ucp_Z /* Separator */
+};
+
+/* These are the particular character types. */
+
+enum {
+ ucp_Cc, /* Control */
+ ucp_Cf, /* Format */
+ ucp_Cn, /* Unassigned */
+ ucp_Co, /* Private use */
+ ucp_Cs, /* Surrogate */
+ ucp_Ll, /* Lower case letter */
+ ucp_Lm, /* Modifier letter */
+ ucp_Lo, /* Other letter */
+ ucp_Lt, /* Title case letter */
+ ucp_Lu, /* Upper case letter */
+ ucp_Mc, /* Spacing mark */
+ ucp_Me, /* Enclosing mark */
+ ucp_Mn, /* Non-spacing mark */
+ ucp_Nd, /* Decimal number */
+ ucp_Nl, /* Letter number */
+ ucp_No, /* Other number */
+ ucp_Pc, /* Connector punctuation */
+ ucp_Pd, /* Dash punctuation */
+ ucp_Pe, /* Close punctuation */
+ ucp_Pf, /* Final punctuation */
+ ucp_Pi, /* Initial punctuation */
+ ucp_Po, /* Other punctuation */
+ ucp_Ps, /* Open punctuation */
+ ucp_Sc, /* Currency symbol */
+ ucp_Sk, /* Modifier symbol */
+ ucp_Sm, /* Mathematical symbol */
+ ucp_So, /* Other symbol */
+ ucp_Zl, /* Line separator */
+ ucp_Zp, /* Paragraph separator */
+ ucp_Zs /* Space separator */
+};
+
+/* These are the script identifications. */
+
+enum {
+ ucp_Arabic = G_UNICODE_SCRIPT_ARABIC,
+ ucp_Armenian = G_UNICODE_SCRIPT_ARMENIAN,
+ ucp_Bengali = G_UNICODE_SCRIPT_BENGALI,
+ ucp_Bopomofo = G_UNICODE_SCRIPT_BOPOMOFO,
+ ucp_Braille = G_UNICODE_SCRIPT_BRAILLE,
+ ucp_Buginese = G_UNICODE_SCRIPT_BUGINESE,
+ ucp_Buhid = G_UNICODE_SCRIPT_BUHID,
+ ucp_Canadian_Aboriginal = G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
+ ucp_Cherokee = G_UNICODE_SCRIPT_CHEROKEE,
+ ucp_Common = G_UNICODE_SCRIPT_COMMON,
+ ucp_Coptic = G_UNICODE_SCRIPT_COPTIC,
+ ucp_Cypriot = G_UNICODE_SCRIPT_CYPRIOT,
+ ucp_Cyrillic = G_UNICODE_SCRIPT_CYRILLIC,
+ ucp_Deseret = G_UNICODE_SCRIPT_DESERET,
+ ucp_Devanagari = G_UNICODE_SCRIPT_DEVANAGARI,
+ ucp_Ethiopic = G_UNICODE_SCRIPT_ETHIOPIC,
+ ucp_Georgian = G_UNICODE_SCRIPT_GEORGIAN,
+ ucp_Glagolitic = G_UNICODE_SCRIPT_GLAGOLITIC,
+ ucp_Gothic = G_UNICODE_SCRIPT_GOTHIC,
+ ucp_Greek = G_UNICODE_SCRIPT_GREEK,
+ ucp_Gujarati = G_UNICODE_SCRIPT_GUJARATI,
+ ucp_Gurmukhi = G_UNICODE_SCRIPT_GURMUKHI,
+ ucp_Han = G_UNICODE_SCRIPT_HAN,
+ ucp_Hangul = G_UNICODE_SCRIPT_HANGUL,
+ ucp_Hanunoo = G_UNICODE_SCRIPT_HANUNOO,
+ ucp_Hebrew = G_UNICODE_SCRIPT_HEBREW,
+ ucp_Hiragana = G_UNICODE_SCRIPT_HIRAGANA,
+ ucp_Inherited = G_UNICODE_SCRIPT_INHERITED,
+ ucp_Kannada = G_UNICODE_SCRIPT_KANNADA,
+ ucp_Katakana = G_UNICODE_SCRIPT_KATAKANA,
+ ucp_Kharoshthi = G_UNICODE_SCRIPT_KHAROSHTHI,
+ ucp_Khmer = G_UNICODE_SCRIPT_KHMER,
+ ucp_Lao = G_UNICODE_SCRIPT_LAO,
+ ucp_Latin = G_UNICODE_SCRIPT_LATIN,
+ ucp_Limbu = G_UNICODE_SCRIPT_LIMBU,
+ ucp_Linear_B = G_UNICODE_SCRIPT_LINEAR_B,
+ ucp_Malayalam = G_UNICODE_SCRIPT_MALAYALAM,
+ ucp_Mongolian = G_UNICODE_SCRIPT_MONGOLIAN,
+ ucp_Myanmar = G_UNICODE_SCRIPT_MYANMAR,
+ ucp_New_Tai_Lue = G_UNICODE_SCRIPT_NEW_TAI_LUE,
+ ucp_Ogham = G_UNICODE_SCRIPT_OGHAM,
+ ucp_Old_Italic = G_UNICODE_SCRIPT_OLD_ITALIC,
+ ucp_Old_Persian = G_UNICODE_SCRIPT_OLD_PERSIAN,
+ ucp_Oriya = G_UNICODE_SCRIPT_ORIYA,
+ ucp_Osmanya = G_UNICODE_SCRIPT_OSMANYA,
+ ucp_Runic = G_UNICODE_SCRIPT_RUNIC,
+ ucp_Shavian = G_UNICODE_SCRIPT_SHAVIAN,
+ ucp_Sinhala = G_UNICODE_SCRIPT_SINHALA,
+ ucp_Syloti_Nagri = G_UNICODE_SCRIPT_SYLOTI_NAGRI,
+ ucp_Syriac = G_UNICODE_SCRIPT_SYRIAC,
+ ucp_Tagalog = G_UNICODE_SCRIPT_TAGALOG,
+ ucp_Tagbanwa = G_UNICODE_SCRIPT_TAGBANWA,
+ ucp_Tai_Le = G_UNICODE_SCRIPT_TAI_LE,
+ ucp_Tamil = G_UNICODE_SCRIPT_TAMIL,
+ ucp_Telugu = G_UNICODE_SCRIPT_TELUGU,
+ ucp_Thaana = G_UNICODE_SCRIPT_THAANA,
+ ucp_Thai = G_UNICODE_SCRIPT_THAI,
+ ucp_Tibetan = G_UNICODE_SCRIPT_TIBETAN,
+ ucp_Tifinagh = G_UNICODE_SCRIPT_TIFINAGH,
+ ucp_Ugaritic = G_UNICODE_SCRIPT_UGARITIC,
+ ucp_Yi = G_UNICODE_SCRIPT_YI,
+ ucp_Balinese = G_UNICODE_SCRIPT_BALINESE, /* New for Unicode 5.0.0 */
+ ucp_Cuneiform = G_UNICODE_SCRIPT_CUNEIFORM, /* New for Unicode 5.0.0 */
+ ucp_Nko = G_UNICODE_SCRIPT_NKO, /* New for Unicode 5.0.0 */
+ ucp_Phags_Pa = G_UNICODE_SCRIPT_PHAGS_PA, /* New for Unicode 5.0.0 */
+ ucp_Phoenician = G_UNICODE_SCRIPT_PHOENICIAN /* New for Unicode 5.0.0 */
+};
+
+#endif
+
+/* End of ucp.h */
diff --git a/trunk/glib/pcre/ucpinternal.h b/trunk/glib/pcre/ucpinternal.h
new file mode 100644
index 000000000..811a373c8
--- /dev/null
+++ b/trunk/glib/pcre/ucpinternal.h
@@ -0,0 +1,92 @@
+/*************************************************
+* Unicode Property Table handler *
+*************************************************/
+
+#ifndef _UCPINTERNAL_H
+#define _UCPINTERNAL_H
+
+/* Internal header file defining the layout of the bits in each pair of 32-bit
+words that form a data item in the table. */
+
+typedef struct cnode {
+ pcre_uint32 f0;
+ pcre_uint32 f1;
+} cnode;
+
+/* Things for the f0 field */
+
+#define f0_scriptmask 0xff000000 /* Mask for script field */
+#define f0_scriptshift 24 /* Shift for script value */
+#define f0_rangeflag 0x00f00000 /* Flag for a range item */
+#define f0_charmask 0x001fffff /* Mask for code point value */
+
+/* Things for the f1 field */
+
+#define f1_typemask 0xfc000000 /* Mask for char type field */
+#define f1_typeshift 26 /* Shift for the type field */
+#define f1_rangemask 0x0000ffff /* Mask for a range offset */
+#define f1_casemask 0x0000ffff /* Mask for a case offset */
+#define f1_caseneg 0xffff8000 /* Bits for negation */
+
+/* The data consists of a vector of structures of type cnode. The two unsigned
+32-bit integers are used as follows:
+
+(f0) (1) The most significant byte holds the script number. The numbers are
+ defined by the enum in ucp.h.
+
+ (2) The 0x00800000 bit is set if this entry defines a range of characters.
+ It is not set if this entry defines a single character
+
+ (3) The 0x00600000 bits are spare.
+
+ (4) The 0x001fffff bits contain the code point. No Unicode code point will
+ ever be greater than 0x0010ffff, so this should be OK for ever.
+
+(f1) (1) The 0xfc000000 bits contain the character type number. The numbers are
+ defined by an enum in ucp.h.
+
+ (2) The 0x03ff0000 bits are spare.
+
+ (3) The 0x0000ffff bits contain EITHER the unsigned offset to the top of
+ range if this entry defines a range, OR the *signed* offset to the
+ character's "other case" partner if this entry defines a single
+ character. There is no partner if the value is zero.
+
+-------------------------------------------------------------------------------
+| script (8) |.|.|.| codepoint (21) || type (6) |.|.| spare (8) | offset (16) |
+-------------------------------------------------------------------------------
+ | | | | |
+ | | |-> spare | |-> spare
+ | | |
+ | |-> spare |-> spare
+ |
+ |-> range flag
+
+The upper/lower casing information is set only for characters that come in
+pairs. The non-one-to-one mappings in the Unicode data are ignored.
+
+When searching the data, proceed as follows:
+
+(1) Set up for a binary chop search.
+
+(2) If the top is not greater than the bottom, the character is not in the
+ table. Its type must therefore be "Cn" ("Undefined").
+
+(3) Find the middle vector element.
+
+(4) Extract the code point and compare. If equal, we are done.
+
+(5) If the test character is smaller, set the top to the current point, and
+ goto (2).
+
+(6) If the current entry defines a range, compute the last character by adding
+ the offset, and see if the test character is within the range. If it is,
+ we are done.
+
+(7) Otherwise, set the bottom to one element past the current point and goto
+ (2).
+*/
+
+#endif /* _UCPINTERNAL_H */
+
+/* End of ucpinternal.h */
diff --git a/trunk/glib/pltcheck.sh b/trunk/glib/pltcheck.sh
new file mode 100755
index 000000000..b2a04b794
--- /dev/null
+++ b/trunk/glib/pltcheck.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+LANG=C
+
+status=0
+
+if ! which readelf 2>/dev/null >/dev/null; then
+ echo "'readelf' not found; skipping test"
+ exit 0
+fi
+
+for so in .libs/lib*.so; do
+ echo Checking $so for local PLT entries
+ # g_string_insert_c is used in g_string_append_c_inline
+ # unaliased. Couldn't find a way to fix it.
+ readelf -r $so | grep 'JU\?MP_SLOT' | grep -v '\<g_string_insert_c\>' | grep '\<g_' && status=1
+done
+
+exit $status
diff --git a/trunk/glib/update-pcre/Makefile.am b/trunk/glib/update-pcre/Makefile.am
new file mode 100644
index 000000000..57af29d18
--- /dev/null
+++ b/trunk/glib/update-pcre/Makefile.am
@@ -0,0 +1,9 @@
+EXTRA_DIST = \
+ update.sh \
+ Makefile.am-1 \
+ Makefile.am-2 \
+ digitab.patch \
+ memory.patch \
+ notdll.patch \
+ pcre_ucp_searchfuncs.c \
+ pcre_valid_utf8.c
diff --git a/trunk/glib/update-pcre/Makefile.am-1 b/trunk/glib/update-pcre/Makefile.am-1
new file mode 100644
index 000000000..c26708e4d
--- /dev/null
+++ b/trunk/glib/update-pcre/Makefile.am-1
@@ -0,0 +1,29 @@
+INCLUDES = \
+ -DG_LOG_DOMAIN=\"GLib-GRegex\" \
+ -DSUPPORT_UCP \
+ -DSUPPORT_UTF8 \
+ -DNEWLINE=-1 \
+ -DMATCH_LIMIT=10000000 \
+ -DMATCH_LIMIT_RECURSION=10000000 \
+ -DMAX_NAME_SIZE=32 \
+ -DMAX_NAME_COUNT=10000 \
+ -DMAX_DUPLENGTH=30000 \
+ -DLINK_SIZE=2 \
+ -DEBCDIC=0 \
+ -DPOSIX_MALLOC_THRESHOLD=10 \
+ -I$(top_srcdir) \
+ -I$(srcdir) \
+ -I$(top_srcdir)/glib \
+ @GLIB_DEBUG_FLAGS@ \
+ -DG_DISABLE_DEPRECATED \
+ -DGLIB_COMPILATION \
+ $(DEPRECATED_FLAGS)\
+ $(WARN_CFLAGS) \
+ $(PCRE_WARN_CFLAGS) \
+ $(DEP_CFLAGS)
+
+noinst_LTLIBRARIES = libpcre.la
+
+libpcre_headers =
+
+libpcre_la_SOURCES = \
diff --git a/trunk/glib/update-pcre/Makefile.am-2 b/trunk/glib/update-pcre/Makefile.am-2
new file mode 100644
index 000000000..94d4d3c66
--- /dev/null
+++ b/trunk/glib/update-pcre/Makefile.am-2
@@ -0,0 +1,10 @@
+ $(libpcre_headers)
+
+libpcre_la_LIBADD = $(DEP_LIBS)
+
+libpcre_la_LDFLAGS = -no-undefined
+
+EXTRA_DIST = \
+ COPYING \
+ makefile.msc
+
diff --git a/trunk/glib/update-pcre/digitab.patch b/trunk/glib/update-pcre/digitab.patch
new file mode 100644
index 000000000..a745fbb42
--- /dev/null
+++ b/trunk/glib/update-pcre/digitab.patch
@@ -0,0 +1,133 @@
+--- pcre_compile.c 2006-10-10 12:00:00.000000000 +0200
++++ pcre_compile.c 2006-10-10 12:00:00.000000000 +0200
+@@ -246,130 +246,6 @@ static const char *error_texts[] = {
+ };
+
+
+-/* Table to identify digits and hex digits. This is used when compiling
+-patterns. Note that the tables in chartables are dependent on the locale, and
+-may mark arbitrary characters as digits - but the PCRE compiling code expects
+-to handle only 0-9, a-z, and A-Z as digits when compiling. That is why we have
+-a private table here. It costs 256 bytes, but it is a lot faster than doing
+-character value tests (at least in some simple cases I timed), and in some
+-applications one wants PCRE to compile efficiently as well as match
+-efficiently.
+-
+-For convenience, we use the same bit definitions as in chartables:
+-
+- 0x04 decimal digit
+- 0x08 hexadecimal digit
+-
+-Then we can use ctype_digit and ctype_xdigit in the code. */
+-
+-#if !EBCDIC /* This is the "normal" case, for ASCII systems */
+-static const unsigned char digitab[] =
+- {
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 8- 15 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - ' */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ( - / */
+- 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /* 0 - 7 */
+- 0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, /* 8 - ? */
+- 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* @ - G */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* H - O */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* P - W */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* X - _ */
+- 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* ` - g */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* h - o */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* p - w */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* x -127 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */
+-
+-#else /* This is the "abnormal" case, for EBCDIC systems */
+-static const unsigned char digitab[] =
+- {
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 0 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 8- 15 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 10 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 32- 39 20 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 40- 47 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 48- 55 30 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 56- 63 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - 71 40 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 72- | */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* & - 87 50 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 88- */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - -103 60 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 104- ? */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 70 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- " */
+- 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* 128- g 80 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* h -143 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144- p 90 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* q -159 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160- x A0 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* y -175 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ -183 B0 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */
+- 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* { - G C0 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* H -207 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* } - P D0 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Q -223 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* \ - X E0 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Y -239 */
+- 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /* 0 - 7 F0 */
+- 0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00};/* 8 -255 */
+-
+-static const unsigned char ebcdic_chartab[] = { /* chartable partial dup */
+- 0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 0- 7 */
+- 0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00, /* 8- 15 */
+- 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 16- 23 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */
+- 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 32- 39 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 40- 47 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 48- 55 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 56- 63 */
+- 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - 71 */
+- 0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80, /* 72- | */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* & - 87 */
+- 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00, /* 88- */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - -103 */
+- 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x80, /* 104- ? */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 */
+- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- " */
+- 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* 128- g */
+- 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* h -143 */
+- 0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* 144- p */
+- 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* q -159 */
+- 0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* 160- x */
+- 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* y -175 */
+- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ -183 */
+- 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 184-191 */
+- 0x80,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* { - G */
+- 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* H -207 */
+- 0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* } - P */
+- 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* Q -223 */
+- 0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* \ - X */
+- 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* Y -239 */
+- 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */
+- 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00};/* 8 -255 */
+-#endif
+-
+-
+ /* Definition to allow mutual recursion */
+
+ static BOOL
diff --git a/trunk/glib/update-pcre/make_utt.py b/trunk/glib/update-pcre/make_utt.py
new file mode 100644
index 000000000..20c720e08
--- /dev/null
+++ b/trunk/glib/update-pcre/make_utt.py
@@ -0,0 +1,57 @@
+#! /usr/bin/env python
+
+# Reduce the number of relocations using a single string for the
+# keys in the _pcre_utt table.
+
+import re
+
+fin = open('pcre_tables.c')
+data = fin.read()
+fin.close()
+
+mo = re.search(r'const ucp_type_table _pcre_utt\[] = {', data)
+assert mo, '_pcre_utt not found'
+before = data[:mo.start()]
+table_decl = data[mo.start():mo.end()]
+table_start = mo.end()
+
+mo = re.compile('};').search(data, table_start)
+assert mo, 'end of _pcre_utt not found'
+after = data[mo.end():]
+table_end = mo.start()
+
+table = data[table_start:table_end].strip()
+
+rs = '\s*\{\s*"(?P<name>[^"]*)",\s*(?P<type>PT_[A-Z]*),\s*(?P<value>(?:0|ucp_[A-Za-z_]*))\s*},?\s*$'
+r = re.compile(rs)
+
+lines = []
+names = []
+pos = 0
+for line in table.split('\n'):
+ mo = r.match(line)
+ assert mo, 'line not recognized'
+ name, type, value = mo.groups()
+ lines.append(' { %d, %s, %s }' % (pos, type, value))
+ names.append(name)
+ # +1 for the '\0'
+ pos += len(name) + 1
+
+table = ',\n'.join(lines)
+
+names = [' "%s\\0"' % n for n in names]
+names_string = ' \n'.join(names) + ';'
+
+data = before + \
+ 'const char _pcre_ucp_names[] =\n' + \
+ names_string + \
+ '\n\n' + \
+ table_decl + \
+ '\n' + \
+ table + \
+ '\n};' + \
+ after
+
+fout = open('pcre_tables.c', 'w')
+fout.write(data)
+fout.close()
diff --git a/trunk/glib/update-pcre/memory.patch b/trunk/glib/update-pcre/memory.patch
new file mode 100644
index 000000000..65b7b9790
--- /dev/null
+++ b/trunk/glib/update-pcre/memory.patch
@@ -0,0 +1,87 @@
+diff -r 0f4042339eb5 pcre/pcre.h
+--- pcre/pcre.h Tue Jul 25 22:39:16 2006 +0200
++++ pcre/pcre.h Tue Jul 25 22:52:10 2006 +0200
+@@ -233,25 +233,14 @@ typedef struct pcre_callout_block {
+ /* ------------------------------------------------------------------ */
+ } pcre_callout_block;
+
+-/* Indirection for store get and free functions. These can be set to
+-alternative malloc/free functions if required. Special ones are used in the
+-non-recursive case for "frames". There is also an optional callout function
+-that is triggered by the (?) regex item. For Virtual Pascal, these definitions
+-have to take another form. */
+-
+-#ifndef VPCOMPAT
+-PCRE_DATA_SCOPE void *(*pcre_malloc)(size_t);
+-PCRE_DATA_SCOPE void (*pcre_free)(void *);
+-PCRE_DATA_SCOPE void *(*pcre_stack_malloc)(size_t);
+-PCRE_DATA_SCOPE void (*pcre_stack_free)(void *);
++#include "glib.h"
++#include "galias.h"
++
++#define pcre_malloc g_try_malloc
++#define pcre_free g_free
++#define pcre_stack_malloc g_try_malloc
++
+ PCRE_DATA_SCOPE int (*pcre_callout)(pcre_callout_block *);
+-#else /* VPCOMPAT */
+-PCRE_DATA_SCOPE void *pcre_malloc(size_t);
+-PCRE_DATA_SCOPE void pcre_free(void *);
+-PCRE_DATA_SCOPE void *pcre_stack_malloc(size_t);
+-PCRE_DATA_SCOPE void pcre_stack_free(void *);
+-PCRE_DATA_SCOPE int pcre_callout(pcre_callout_block *);
+-#endif /* VPCOMPAT */
+
+ /* Exported PCRE functions */
+
+diff -r 0f4042339eb5 pcre/pcre_globals.c
+--- pcre/pcre_globals.c Tue Jul 25 22:39:16 2006 +0200
++++ pcre/pcre_globals.c Tue Jul 25 22:52:10 2006 +0200
+@@ -50,32 +50,9 @@ differently, and global variables are no
+ #include "pcre_internal.h"
+
+
+-#ifndef VPCOMPAT
+-
+-/**************************************************************************
+-This code used to be here for use when compiling as a C++ library. However,
+-according to Dair Grant it is not needed: "
+-
+- Including 'extern "C"' in the declaration generates an "initialized and
+- declared `extern'" warning from gcc 4.0.1. Since we include pcre_internal.h,
+- which includes pcre.h, which declares these prototypes within an extern "C" {}
+- block, we shouldn't need the prefix here.
+-
+-So, from Release 7.0 I have cut this out.
+-
+ #ifdef __cplusplus
+-extern "C" void *(*pcre_malloc)(size_t) = malloc;
+-extern "C" void (*pcre_free)(void *) = free;
+-extern "C" void *(*pcre_stack_malloc)(size_t) = malloc;
+-extern "C" void (*pcre_stack_free)(void *) = free;
+ extern "C" int (*pcre_callout)(pcre_callout_block *) = NULL;
+ #else
+-**************************************************************************/
+-
+-void *(*pcre_malloc)(size_t) = malloc;
+-void (*pcre_free)(void *) = free;
+-void *(*pcre_stack_malloc)(size_t) = malloc;
+-void (*pcre_stack_free)(void *) = free;
+ int (*pcre_callout)(pcre_callout_block *) = NULL;
+ #endif
+
+diff -r 0f4042339eb5 pcre/pcre_internal.h
+--- pcre/pcre_internal.h Tue Jul 25 22:39:16 2006 +0200
++++ pcre/pcre_internal.h Tue Jul 25 22:52:10 2006 +0200
+@@ -480,10 +480,7 @@ variable-length repeat, or a anything ot
+
+ /* Miscellaneous definitions */
+
+-typedef int BOOL;
+-
+-#define FALSE 0
+-#define TRUE 1
++typedef gboolean BOOL;
+
+ /* Escape items that are just an encoding of a particular data value. */
+
diff --git a/trunk/glib/update-pcre/notdll.patch b/trunk/glib/update-pcre/notdll.patch
new file mode 100644
index 000000000..951da2ba1
--- /dev/null
+++ b/trunk/glib/update-pcre/notdll.patch
@@ -0,0 +1,19 @@
+--- pcre/pcre.h 2006-07-05 13:28:01.000000000 +0200
++++ pcre/pcre.h 2006-07-05 13:28:01.000000000 +0200
+@@ -60,6 +60,8 @@
+ /* Win32 uses DLL by default; it needs special stuff for exported functions
+ when building PCRE. */
+
++/* But don't do that when building as part of GLib */
++#if 0
+ #ifdef _WIN32
+ # ifdef PCRE_DEFINITION
+ # ifdef DLL_EXPORT
+@@ -71,6 +71,7 @@
+ # endif
+ # endif
+ #endif
++#endif
+
+ /* Otherwise, we use the standard "extern". */
+
diff --git a/trunk/glib/update-pcre/pcre_ucp_searchfuncs.c b/trunk/glib/update-pcre/pcre_ucp_searchfuncs.c
new file mode 100644
index 000000000..b95d2794c
--- /dev/null
+++ b/trunk/glib/update-pcre/pcre_ucp_searchfuncs.c
@@ -0,0 +1,126 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Copyright (c) 1997-2006 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+/* This file has been modified to use glib instead of the internal table
+ * in ucptable.c -- Marco Barisione */
+
+/* This module contains code for searching the table of Unicode character
+properties. */
+
+#include "pcre_internal.h"
+
+#include "ucp.h" /* Category definitions */
+#include "ucpinternal.h" /* Internal table details */
+
+
+/* Table to translate from particular type value to the general value. */
+
+static int ucp_gentype[] = {
+ ucp_C, ucp_C, ucp_C, ucp_C, ucp_C, /* Cc, Cf, Cn, Co, Cs */
+ ucp_L, ucp_L, ucp_L, ucp_L, ucp_L, /* Ll, Lu, Lm, Lo, Lt */
+ ucp_M, ucp_M, ucp_M, /* Mc, Me, Mn */
+ ucp_N, ucp_N, ucp_N, /* Nd, Nl, No */
+ ucp_P, ucp_P, ucp_P, ucp_P, ucp_P, /* Pc, Pd, Pe, Pf, Pi */
+ ucp_P, ucp_P, /* Ps, Po */
+ ucp_S, ucp_S, ucp_S, ucp_S, /* Sc, Sk, Sm, So */
+ ucp_Z, ucp_Z, ucp_Z /* Zl, Zp, Zs */
+};
+
+
+
+/*************************************************
+* Search table and return type *
+*************************************************/
+
+/* Three values are returned: the category is ucp_C, ucp_L, etc. The detailed
+character type is ucp_Lu, ucp_Nd, etc. The script is ucp_Latin, etc.
+
+Arguments:
+ c the character value
+ type_ptr the detailed character type is returned here
+ script_ptr the script is returned here
+
+Returns: the character type category
+*/
+
+int
+_pcre_ucp_findprop(const unsigned int c, int *type_ptr, int *script_ptr)
+{
+/* Note that the Unicode types have the same values in glib and in
+ * PCRE, so ucp_Ll == G_UNICODE_LOWERCASE_LETTER,
+ * ucp_Zs == G_UNICODE_SPACE_SEPARATOR, and so on. */
+*type_ptr = g_unichar_type(c);
+*script_ptr = g_unichar_get_script(c);
+return ucp_gentype[*type_ptr];
+}
+
+
+
+
+/*************************************************
+* Search table and return other case *
+*************************************************/
+
+/* If the given character is a letter, and there is another case for the
+letter, return the other case. Otherwise, return -1.
+
+Arguments:
+ c the character value
+
+Returns: the other case or NOTACHAR if none
+*/
+
+unsigned int
+_pcre_ucp_othercase(const unsigned int c)
+{
+int other_case = NOTACHAR;
+
+if (g_unichar_islower(c))
+ other_case = g_unichar_toupper(c);
+else if (g_unichar_isupper(c))
+ other_case = g_unichar_tolower(c);
+
+if (other_case == c)
+ other_case = NOTACHAR;
+
+return other_case;
+}
+
+
+/* End of pcre_ucp_searchfuncs.c */
diff --git a/trunk/glib/update-pcre/pcre_valid_utf8.c b/trunk/glib/update-pcre/pcre_valid_utf8.c
new file mode 100644
index 000000000..a5766b454
--- /dev/null
+++ b/trunk/glib/update-pcre/pcre_valid_utf8.c
@@ -0,0 +1,13 @@
+#include "pcre_internal.h"
+
+/*
+ * This function is not needed by GRegex, so print an error and
+ * return always -1, that is the string is a valid UTF-8 encoded
+ * string.
+ */
+int
+_pcre_valid_utf8(const uschar *string, int length)
+{
+g_warning ("%s: this function should not be called", G_STRLOC);
+return -1;
+}
diff --git a/trunk/glib/update-pcre/table-reduction.patch b/trunk/glib/update-pcre/table-reduction.patch
new file mode 100644
index 000000000..7cc78192b
--- /dev/null
+++ b/trunk/glib/update-pcre/table-reduction.patch
@@ -0,0 +1,269 @@
+--- pcre_compile.c 2006-10-10 12:00:00.000000000 +0200
++++ pcre_compile.c 2006-10-10 12:00:00.000000000 +0200
+@@ -129,10 +129,21 @@
+ terminated by a zero length entry. The first three must be alpha, lower, upper,
+ as this is assumed for handling case independence. */
+
+-static const char *const posix_names[] = {
+- "alpha", "lower", "upper",
+- "alnum", "ascii", "blank", "cntrl", "digit", "graph",
+- "print", "punct", "space", "word", "xdigit" };
++static const char posix_names[] =
++ "alpha\0"
++ "lower\0"
++ "upper\0"
++ "alnum\0"
++ "ascii\0"
++ "blank\0"
++ "cntrl\0"
++ "digit\0"
++ "graph\0"
++ "print\0"
++ "punct\0"
++ "space\0"
++ "word\0"
++ "xdigit";
+
+ static const uschar posix_name_lengths[] = {
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 };
+@@ -173,76 +184,138 @@
+ they are documented. Always add a new error instead. Messages marked DEAD below
+ are no longer used. */
+
+-static const char *error_texts[] = {
+- "no error",
+- "\\ at end of pattern",
+- "\\c at end of pattern",
+- "unrecognized character follows \\",
+- "numbers out of order in {} quantifier",
++#define DEAD(s) "\0"
++
++static const char error_texts[] =
++ "no error\0"
++ "\\ at end of pattern\0"
++ "\\c at end of pattern\0"
++ "unrecognized character follows \\\0"
++ "numbers out of order in {} quantifier\0"
+ /* 5 */
+- "number too big in {} quantifier",
+- "missing terminating ] for character class",
+- "invalid escape sequence in character class",
+- "range out of order in character class",
+- "nothing to repeat",
++ "number too big in {} quantifier\0"
++ "missing terminating ] for character class\0"
++ "invalid escape sequence in character class\0"
++ "range out of order in character class\0"
++ "nothing to repeat\0"
+ /* 10 */
+- "operand of unlimited repeat could match the empty string", /** DEAD **/
+- "internal error: unexpected repeat",
+- "unrecognized character after (?",
+- "POSIX named classes are supported only within a class",
+- "missing )",
++ DEAD("operand of unlimited repeat could match the empty string")
++ "internal error: unexpected repeat\0"
++ "unrecognized character after (?\0"
++ "POSIX named classes are supported only within a class\0"
++ "missing )\0"
+ /* 15 */
+- "reference to non-existent subpattern",
+- "erroffset passed as NULL",
+- "unknown option bit(s) set",
+- "missing ) after comment",
+- "parentheses nested too deeply", /** DEAD **/
++ "reference to non-existent subpattern\0"
++ "erroffset passed as NULL\0"
++ "unknown option bit(s) set\0"
++ "missing ) after comment\0"
++ DEAD("parentheses nested too deeply")
+ /* 20 */
+- "regular expression too large",
+- "failed to get memory",
+- "unmatched parentheses",
+- "internal error: code overflow",
+- "unrecognized character after (?<",
++ "regular expression too large\0"
++ "failed to get memory\0"
++ "unmatched parentheses\0"
++ "internal error: code overflow\0"
++ "unrecognized character after (?<\0"
+ /* 25 */
+- "lookbehind assertion is not fixed length",
+- "malformed number or name after (?(",
+- "conditional group contains more than two branches",
+- "assertion expected after (?(",
+- "(?R or (?digits must be followed by )",
++ "lookbehind assertion is not fixed length\0"
++ "malformed number or name after (?(\0"
++ "conditional group contains more than two branches\0"
++ "assertion expected after (?(\0"
++ "(?R or (?digits must be followed by )\0"
+ /* 30 */
+- "unknown POSIX class name",
+- "POSIX collating elements are not supported",
+- "this version of PCRE is not compiled with PCRE_UTF8 support",
+- "spare error", /** DEAD **/
+- "character value in \\x{...} sequence is too large",
++ "unknown POSIX class name\0"
++ "POSIX collating elements are not supported\0"
++ "this version of PCRE is not compiled with PCRE_UTF8 support\0"
++ DEAD("spare error")
++ "character value in \\x{...} sequence is too large\0"
+ /* 35 */
+- "invalid condition (?(0)",
+- "\\C not allowed in lookbehind assertion",
+- "PCRE does not support \\L, \\l, \\N, \\U, or \\u",
+- "number after (?C is > 255",
+- "closing ) for (?C expected",
++ "invalid condition (?(0)\0"
++ "\\C not allowed in lookbehind assertion\0"
++ "PCRE does not support \\L, \\l, \\N, \\U, or \\u\0"
++ "number after (?C is > 255\0"
++ "closing ) for (?C expected\0"
+ /* 40 */
+- "recursive call could loop indefinitely",
+- "unrecognized character after (?P",
+- "syntax error in subpattern name (missing terminator)",
+- "two named subpatterns have the same name",
+- "invalid UTF-8 string",
++ "recursive call could loop indefinitely\0"
++ "unrecognized character after (?P\0"
++ "syntax error in subpattern name (missing terminator)\0"
++ "two named subpatterns have the same name\0"
++ "invalid UTF-8 string\0"
+ /* 45 */
+- "support for \\P, \\p, and \\X has not been compiled",
+- "malformed \\P or \\p sequence",
+- "unknown property name after \\P or \\p",
+- "subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)",
+- "too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")",
++ "support for \\P, \\p, and \\X has not been compiled\0"
++ "malformed \\P or \\p sequence\0"
++ "unknown property name after \\P or \\p\0"
++ "subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)\0"
++ "too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")\0"
+ /* 50 */
+- "repeated subpattern is too long",
+- "octal value is greater than \\377 (not in UTF-8 mode)",
+- "internal error: overran compiling workspace",
+- "internal error: previously-checked referenced subpattern not found",
+- "DEFINE group contains more than one branch",
++ "repeated subpattern is too long\0"
++ "octal value is greater than \\377 (not in UTF-8 mode)\0"
++ "internal error: overran compiling workspace\0"
++ "internal error: previously-checked referenced subpattern not found\0"
++ "DEFINE group contains more than one branch\0"
+ /* 55 */
+- "repeating a DEFINE group is not allowed",
+- "inconsistent NEWLINE options",
+- "\\g is not followed by an (optionally braced) non-zero number"
++ "repeating a DEFINE group is not allowed\0"
++ "inconsistent NEWLINE options\0"
++ "\\g is not followed by an (optionally braced) non-zero number";
++
++static const int error_texts_offsets[] = {
++ 0,
++ 9,
++ 29,
++ 50,
++ 83,
++ 121,
++ 153,
++ 195,
++ 238,
++ 276,
++ 294,
++ 295,
++ 329,
++ 361,
++ 415,
++ 425,
++ 462,
++ 487,
++ 513,
++ 537,
++ 538,
++ 567,
++ 588,
++ 610,
++ 640,
++ 673,
++ 714,
++ 749,
++ 799,
++ 828,
++ 866,
++ 891,
++ 934,
++ 994,
++ 995,
++ 1044,
++ 1068,
++ 1107,
++ 1151,
++ 1177,
++ 1204,
++ 1243,
++ 1276,
++ 1329,
++ 1370,
++ 1391,
++ 1440,
++ 1468,
++ 1505,
++ 1557,
++ 1600,
++ 1632,
++ 1685,
++ 1729,
++ 1796,
++ 1839,
++ 1879,
++ 1908
+ };
+
+
+@@ -1453,14 +1526,16 @@
+ static int
+ check_posix_name(const uschar *ptr, int len)
+ {
+-register int yield = 0;
+-while (posix_name_lengths[yield] != 0)
+- {
+- if (len == posix_name_lengths[yield] &&
+- strncmp((const char *)ptr, posix_names[yield], len) == 0) return yield;
+- yield++;
+- }
+-return -1;
++ int offset = 0;
++ int yield = 0;
++ while (posix_name_lengths[yield] != 0)
++ {
++ if (len == posix_name_lengths[yield] &&
++ strcmp((const char *)ptr, posix_names + offset) == 0) return yield;
++ offset += posix_name_lengths[yield] + 1;
++ yield++;
++ }
++ return -1;
+ }
+
+
+@@ -5200,7 +5275,7 @@
+ #ifdef SUPPORT_UTF8
+ PCRE_UTF8_ERROR_RETURN:
+ #endif
+- *errorptr = error_texts[errorcode];
++ *errorptr = error_texts + error_texts_offsets[errorcode];
+ if (errorcodeptr != NULL) *errorcodeptr = errorcode;
+ return NULL;
+ }
+@@ -5297,7 +5372,7 @@
+ if (code - codestart > length)
+ {
+ (pcre_free)(re);
+- *errorptr = error_texts[ERR23];
++ *errorptr = error_texts + error_texts_offsets[ERR23];
+ *erroroffset = ptr - (uschar *)pattern;
+ if (errorcodeptr != NULL) *errorcodeptr = ERR23;
+ return NULL;
diff --git a/trunk/glib/update-pcre/ucp.patch b/trunk/glib/update-pcre/ucp.patch
new file mode 100644
index 000000000..8abd812e5
--- /dev/null
+++ b/trunk/glib/update-pcre/ucp.patch
@@ -0,0 +1,141 @@
+--- pcre/ucp.h 2006-07-05 13:28:01.000000000 +0200
++++ pcre/ucp.h 2006-10-09 16:27:19.000000000 +0200
+@@ -60,72 +60,72 @@ enum {
+ /* These are the script identifications. */
+
+ enum {
+- ucp_Arabic,
+- ucp_Armenian,
+- ucp_Bengali,
+- ucp_Bopomofo,
+- ucp_Braille,
+- ucp_Buginese,
+- ucp_Buhid,
+- ucp_Canadian_Aboriginal,
+- ucp_Cherokee,
+- ucp_Common,
+- ucp_Coptic,
+- ucp_Cypriot,
+- ucp_Cyrillic,
+- ucp_Deseret,
+- ucp_Devanagari,
+- ucp_Ethiopic,
+- ucp_Georgian,
+- ucp_Glagolitic,
+- ucp_Gothic,
+- ucp_Greek,
+- ucp_Gujarati,
+- ucp_Gurmukhi,
+- ucp_Han,
+- ucp_Hangul,
+- ucp_Hanunoo,
+- ucp_Hebrew,
+- ucp_Hiragana,
+- ucp_Inherited,
+- ucp_Kannada,
+- ucp_Katakana,
+- ucp_Kharoshthi,
+- ucp_Khmer,
+- ucp_Lao,
+- ucp_Latin,
+- ucp_Limbu,
+- ucp_Linear_B,
+- ucp_Malayalam,
+- ucp_Mongolian,
+- ucp_Myanmar,
+- ucp_New_Tai_Lue,
+- ucp_Ogham,
+- ucp_Old_Italic,
+- ucp_Old_Persian,
+- ucp_Oriya,
+- ucp_Osmanya,
+- ucp_Runic,
+- ucp_Shavian,
+- ucp_Sinhala,
+- ucp_Syloti_Nagri,
+- ucp_Syriac,
+- ucp_Tagalog,
+- ucp_Tagbanwa,
+- ucp_Tai_Le,
+- ucp_Tamil,
+- ucp_Telugu,
+- ucp_Thaana,
+- ucp_Thai,
+- ucp_Tibetan,
+- ucp_Tifinagh,
+- ucp_Ugaritic,
+- ucp_Yi,
+- ucp_Balinese, /* New for Unicode 5.0.0 */
+- ucp_Cuneiform, /* New for Unicode 5.0.0 */
+- ucp_Nko, /* New for Unicode 5.0.0 */
+- ucp_Phags_Pa, /* New for Unicode 5.0.0 */
+- ucp_Phoenician /* New for Unicode 5.0.0 */
++ ucp_Arabic = G_UNICODE_SCRIPT_ARABIC,
++ ucp_Armenian = G_UNICODE_SCRIPT_ARMENIAN,
++ ucp_Bengali = G_UNICODE_SCRIPT_BENGALI,
++ ucp_Bopomofo = G_UNICODE_SCRIPT_BOPOMOFO,
++ ucp_Braille = G_UNICODE_SCRIPT_BRAILLE,
++ ucp_Buginese = G_UNICODE_SCRIPT_BUGINESE,
++ ucp_Buhid = G_UNICODE_SCRIPT_BUHID,
++ ucp_Canadian_Aboriginal = G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,
++ ucp_Cherokee = G_UNICODE_SCRIPT_CHEROKEE,
++ ucp_Common = G_UNICODE_SCRIPT_COMMON,
++ ucp_Coptic = G_UNICODE_SCRIPT_COPTIC,
++ ucp_Cypriot = G_UNICODE_SCRIPT_CYPRIOT,
++ ucp_Cyrillic = G_UNICODE_SCRIPT_CYRILLIC,
++ ucp_Deseret = G_UNICODE_SCRIPT_DESERET,
++ ucp_Devanagari = G_UNICODE_SCRIPT_DEVANAGARI,
++ ucp_Ethiopic = G_UNICODE_SCRIPT_ETHIOPIC,
++ ucp_Georgian = G_UNICODE_SCRIPT_GEORGIAN,
++ ucp_Glagolitic = G_UNICODE_SCRIPT_GLAGOLITIC,
++ ucp_Gothic = G_UNICODE_SCRIPT_GOTHIC,
++ ucp_Greek = G_UNICODE_SCRIPT_GREEK,
++ ucp_Gujarati = G_UNICODE_SCRIPT_GUJARATI,
++ ucp_Gurmukhi = G_UNICODE_SCRIPT_GURMUKHI,
++ ucp_Han = G_UNICODE_SCRIPT_HAN,
++ ucp_Hangul = G_UNICODE_SCRIPT_HANGUL,
++ ucp_Hanunoo = G_UNICODE_SCRIPT_HANUNOO,
++ ucp_Hebrew = G_UNICODE_SCRIPT_HEBREW,
++ ucp_Hiragana = G_UNICODE_SCRIPT_HIRAGANA,
++ ucp_Inherited = G_UNICODE_SCRIPT_INHERITED,
++ ucp_Kannada = G_UNICODE_SCRIPT_KANNADA,
++ ucp_Katakana = G_UNICODE_SCRIPT_KATAKANA,
++ ucp_Kharoshthi = G_UNICODE_SCRIPT_KHAROSHTHI,
++ ucp_Khmer = G_UNICODE_SCRIPT_KHMER,
++ ucp_Lao = G_UNICODE_SCRIPT_LAO,
++ ucp_Latin = G_UNICODE_SCRIPT_LATIN,
++ ucp_Limbu = G_UNICODE_SCRIPT_LIMBU,
++ ucp_Linear_B = G_UNICODE_SCRIPT_LINEAR_B,
++ ucp_Malayalam = G_UNICODE_SCRIPT_MALAYALAM,
++ ucp_Mongolian = G_UNICODE_SCRIPT_MONGOLIAN,
++ ucp_Myanmar = G_UNICODE_SCRIPT_MYANMAR,
++ ucp_New_Tai_Lue = G_UNICODE_SCRIPT_NEW_TAI_LUE,
++ ucp_Ogham = G_UNICODE_SCRIPT_OGHAM,
++ ucp_Old_Italic = G_UNICODE_SCRIPT_OLD_ITALIC,
++ ucp_Old_Persian = G_UNICODE_SCRIPT_OLD_PERSIAN,
++ ucp_Oriya = G_UNICODE_SCRIPT_ORIYA,
++ ucp_Osmanya = G_UNICODE_SCRIPT_OSMANYA,
++ ucp_Runic = G_UNICODE_SCRIPT_RUNIC,
++ ucp_Shavian = G_UNICODE_SCRIPT_SHAVIAN,
++ ucp_Sinhala = G_UNICODE_SCRIPT_SINHALA,
++ ucp_Syloti_Nagri = G_UNICODE_SCRIPT_SYLOTI_NAGRI,
++ ucp_Syriac = G_UNICODE_SCRIPT_SYRIAC,
++ ucp_Tagalog = G_UNICODE_SCRIPT_TAGALOG,
++ ucp_Tagbanwa = G_UNICODE_SCRIPT_TAGBANWA,
++ ucp_Tai_Le = G_UNICODE_SCRIPT_TAI_LE,
++ ucp_Tamil = G_UNICODE_SCRIPT_TAMIL,
++ ucp_Telugu = G_UNICODE_SCRIPT_TELUGU,
++ ucp_Thaana = G_UNICODE_SCRIPT_THAANA,
++ ucp_Thai = G_UNICODE_SCRIPT_THAI,
++ ucp_Tibetan = G_UNICODE_SCRIPT_TIBETAN,
++ ucp_Tifinagh = G_UNICODE_SCRIPT_TIFINAGH,
++ ucp_Ugaritic = G_UNICODE_SCRIPT_UGARITIC,
++ ucp_Yi = G_UNICODE_SCRIPT_YI,
++ ucp_Balinese = G_UNICODE_SCRIPT_BALINESE, /* New for Unicode 5.0.0 */
++ ucp_Cuneiform = G_UNICODE_SCRIPT_CUNEIFORM, /* New for Unicode 5.0.0 */
++ ucp_Nko = G_UNICODE_SCRIPT_NKO, /* New for Unicode 5.0.0 */
++ ucp_Phags_Pa = G_UNICODE_SCRIPT_PHAGS_PA, /* New for Unicode 5.0.0 */
++ ucp_Phoenician = G_UNICODE_SCRIPT_PHOENICIAN /* New for Unicode 5.0.0 */
+ };
+
+ #endif
diff --git a/trunk/glib/update-pcre/update.sh b/trunk/glib/update-pcre/update.sh
new file mode 100644
index 000000000..9194e41d4
--- /dev/null
+++ b/trunk/glib/update-pcre/update.sh
@@ -0,0 +1,162 @@
+#! /bin/sh
+
+IN="../update-pcre"
+PCRE=$1
+
+if [ "x$PCRE" = x -o "x$PCRE" = x--help -o "x$PCRE" = x-h ]; then
+ cat >&2 << EOF
+
+$0 PCRE-DIR
+
+ Updates the local PCRE copy with a different version of the library,
+ contained in the directory PCRE-DIR.
+
+ This will delete the content of the local pcre directory, copy the
+ necessary files from PCRE-DIR, and generate other needed files, such
+ as Makefile.am
+EOF
+ exit
+fi
+
+if [ ! -f gregex.h ]; then
+ echo "This script should be executed from the directory containing gregex.c." 2> /dev/null
+ exit 1
+fi
+
+if [ ! -f $PCRE/Makefile.in -o ! -f $PCRE/pcre_compile.c ]; then
+ echo "'$PCRE' does not contain a valid PCRE version." 2> /dev/null
+ exit 1
+fi
+
+
+echo "Deleting old PCRE library"
+mv pcre/.svn tmp-pcre-svn
+rm -R pcre 2> /dev/null
+mkdir pcre
+cd pcre
+
+# pcre_chartables.c is generated by dfatables.
+# We do not want to compile and execute dfatables.c every time, because
+# this could be a problem (e.g. when cross-compiling), so now generate
+# the file and then distribuite it with GRegex.
+echo "Generating pcre_chartables.c"
+cp -R $PCRE tmp-build
+cd tmp-build
+./configure --enable-utf8 --enable-unicode-properties --disable-cpp > /dev/null
+make pcre_chartables.c > /dev/null
+cat > ../pcre_chartables.c << \EOF
+/* This file is autogenerated by ../update-pcre/update.sh during
+ * the update of the local copy of PCRE.
+ */
+EOF
+cat pcre_chartables.c >> ../pcre_chartables.c
+cd ..
+rm -R tmp-build
+
+# Compiled C files.
+echo "Generating makefiles"
+all_files=`awk '/^OBJ = /, /^\\s*$/ \
+ { \
+ sub("^OBJ = ", ""); \
+ sub(".@OBJEXT@[[:blank:]]*\\\\\\\\", ""); \
+ sub("\\\\$\\\\(POSIX_OBJ\\\\)", ""); \
+ print; \
+ }' \
+ $PCRE/Makefile.in`
+
+# Headers.
+included_files="pcre.h pcre_internal.h ucp.h ucpinternal.h"
+
+# Generate Makefile.am.
+cat $IN/Makefile.am-1 > Makefile.am
+for name in $all_files; do
+ echo " $name.c \\" >> Makefile.am
+ if [ $name != pcre_chartables ]; then
+ # pcre_chartables.c is a generated file.
+ cp $PCRE/$name.c .
+ fi
+done
+for f in $included_files; do
+ echo " $f \\" >> Makefile.am
+ cp $PCRE/$f .
+done
+cat $IN/Makefile.am-2 >> Makefile.am
+
+# Generate makefile.msc
+cat > makefile.msc << EOF
+TOP = ..\..\..
+!INCLUDE ..\..\build\win32\make.msc
+
+INCLUDES = \\
+ -I ..\.. \\
+ -I ..
+
+DEFINES = \\
+ -DPCRE_STATIC \\
+ -DHAVE_CONFIG_H \\
+ -DHAVE_LONG_LONG_FORMAT \\
+ -DSUPPORT_UCP \\
+ -DSUPPORT_UTF8 \\
+ -DNEWLINE=-1 \\
+ -DMATCH_LIMIT=10000000 \\
+ -DMATCH_LIMIT_RECURSION=10000000 \\
+ -DMAX_NAME_SIZE=32 \\
+ -DMAX_NAME_COUNT=10000 \\
+ -DMAX_DUPLENGTH=30000 \\
+ -DLINK_SIZE=2 \\
+ -DEBCDIC=0 \\
+ -DPOSIX_MALLOC_THRESHOLD=10
+
+OBJECTS = \\
+`
+for f in $all_files; do
+ echo " $f.obj \\\\"
+done
+`
+
+all : pcre.lib
+
+pcre.lib : \$(OBJECTS)
+ lib -out:pcre.lib \$(OBJECTS)
+EOF
+
+echo "Patching PCRE"
+
+# Copy the license.
+cp $PCRE/COPYING .
+
+# Use glib for memory allocation.
+patch > /dev/null < $IN/memory.patch
+
+# No dllimport/dllexport of pcre symbols
+patch > /dev/null <$IN/notdll.patch
+
+# Copy the modified version of pcre_valid_utf8.c.
+cp $IN/pcre_valid_utf8.c .
+
+# Copy the modified version of pcre_ucp_searchfuncs.c that uses glib
+# for Unicode properties.
+cp $IN/pcre_ucp_searchfuncs.c .
+patch > /dev/null < $IN/ucp.patch
+
+# Remove the digitab array in pcre_compile.c.
+patch > /dev/null < $IN/digitab.patch
+sed -i -e 's/(digitab\[\(.*\)\] & ctype_digit)/g_ascii_isdigit(\1)/' pcre_compile.c
+sed -i -e 's/(digitab\[\(.*\)\] & ctype_xdigit)/g_ascii_isxdigit(\1)/' pcre_compile.c
+
+# Reduce the number of relocations.
+python $IN/make_utt.py
+patch > /dev/null < $IN/utt.patch
+patch > /dev/null < $IN/table-reduction.patch
+
+# Copy back the old SVN directory.
+mv ../tmp-pcre-svn .svn
+
+
+cat << EOF
+
+Update completed. You now should check that everything is working.
+Remember to update the regex syntax doc with the new features
+(docs/reference/glib/regex-syntax.sgml) and to run the tests.
+EOF
+
diff --git a/trunk/glib/update-pcre/utt.patch b/trunk/glib/update-pcre/utt.patch
new file mode 100644
index 000000000..171445f71
--- /dev/null
+++ b/trunk/glib/update-pcre/utt.patch
@@ -0,0 +1,30 @@
+--- pcre_compile.c 2006-10-10 12:00:00.000000000 +0200
++++ pcre_compile.c 2006-10-10 12:00:00.000000000 +0200
+@@ -589,7 +589,7 @@ while (bot < top)
+ while (bot < top)
+ {
+ i = (bot + top) >> 1;
+- c = strcmp(name, _pcre_utt[i].name);
++ c = strcmp(name, &_pcre_ucp_names[_pcre_utt[i].offset]);
+ if (c == 0)
+ {
+ *dptr = _pcre_utt[i].value;
+--- pcre_internal.h 2006-10-10 12:00:00.000000000 +0200
++++ pcre_internal.h 2006-10-10 12:00:00.000000000 +0200
+@@ -993,7 +993,7 @@ codes. */
+ codes. */
+
+ typedef struct {
+- const char *name;
++ pcre_uint16 offset;
+ pcre_uint16 type;
+ pcre_uint16 value;
+ } ucp_type_table;
+@@ -1011,6 +1011,7 @@ extern const uschar _pcre_utf8_table4[];
+
+ extern const int _pcre_utf8_table1_size;
+
++extern const char _pcre_ucp_names[];
+ extern const ucp_type_table _pcre_utt[];
+ extern const int _pcre_utt_size;
+
diff --git a/trunk/glibconfig.h.win32.in b/trunk/glibconfig.h.win32.in
new file mode 100644
index 000000000..7aaf65517
--- /dev/null
+++ b/trunk/glibconfig.h.win32.in
@@ -0,0 +1,191 @@
+/* glibconfig.h.win32.in Merged from two versions generated by configure for gcc and MSVC. */
+/* glibconfig.h
+ *
+ * This is a generated file. Please modify 'configure.in'
+ */
+
+#ifndef __G_LIBCONFIG_H__
+#define __G_LIBCONFIG_H__
+
+#include <glib/gmacros.h>
+
+#include <limits.h>
+#include <float.h>
+
+G_BEGIN_DECLS
+
+#define G_MINFLOAT FLT_MIN
+#define G_MAXFLOAT FLT_MAX
+#define G_MINDOUBLE DBL_MIN
+#define G_MAXDOUBLE DBL_MAX
+#define G_MINSHORT SHRT_MIN
+#define G_MAXSHORT SHRT_MAX
+#define G_MAXUSHORT USHRT_MAX
+#define G_MININT INT_MIN
+#define G_MAXINT INT_MAX
+#define G_MAXUINT UINT_MAX
+#define G_MINLONG LONG_MIN
+#define G_MAXLONG LONG_MAX
+#define G_MAXULONG ULONG_MAX
+
+typedef signed char gint8;
+typedef unsigned char guint8;
+typedef signed short gint16;
+typedef unsigned short guint16;
+#define G_GINT16_MODIFIER "h"
+#define G_GINT16_FORMAT "hi"
+#define G_GUINT16_FORMAT "hu"
+typedef signed int gint32;
+typedef unsigned int guint32;
+#define G_GINT32_MODIFIER ""
+#define G_GINT32_FORMAT "i"
+#define G_GUINT32_FORMAT "u"
+#define G_HAVE_GINT64 1 /* deprecated, always true */
+
+#ifndef _MSC_VER
+G_GNUC_EXTENSION typedef signed long long gint64;
+G_GNUC_EXTENSION typedef unsigned long long guint64;
+#else /* _MSC_VER */
+typedef signed __int64 gint64;
+typedef unsigned __int64 guint64;
+#endif /* _MSC_VER */
+
+#ifndef _MSC_VER
+#define G_GINT64_CONSTANT(val) (G_GNUC_EXTENSION (val##LL))
+#else /* _MSC_VER */
+#define G_GINT64_CONSTANT(val) (val##i64)
+#endif /* _MSC_VER */
+#ifndef _MSC_VER
+#define G_GUINT64_CONSTANT(val) (G_GNUC_EXTENSION (val##ULL))
+#else /* _MSC_VER */
+#define G_GUINT64_CONSTANT(val) (val##Ui64)
+#endif /* _MSC_VER */
+#define G_GINT64_MODIFIER "I64"
+#define G_GINT64_FORMAT "I64i"
+#define G_GUINT64_FORMAT "I64u"
+
+#define GLIB_SIZEOF_VOID_P 4
+#define GLIB_SIZEOF_LONG 4
+#define GLIB_SIZEOF_SIZE_T 4
+
+typedef signed int gssize;
+typedef unsigned int gsize;
+#define G_GSIZE_MODIFIER ""
+#define G_GSSIZE_FORMAT "i"
+#define G_GSIZE_FORMAT "u"
+
+#define G_MAXSIZE G_MAXUINT
+
+#define GPOINTER_TO_INT(p) ((gint) (p))
+#define GPOINTER_TO_UINT(p) ((guint) (p))
+
+#define GINT_TO_POINTER(i) ((gpointer) (i))
+#define GUINT_TO_POINTER(u) ((gpointer) (u))
+
+#ifdef NeXT /* @#%@! NeXTStep */
+# define g_ATEXIT(proc) (!atexit (proc))
+#else
+# define g_ATEXIT(proc) (atexit (proc))
+#endif
+
+#define g_memmove(dest,src,len) G_STMT_START { memmove ((dest), (src), (len)); } G_STMT_END
+
+#define GLIB_MAJOR_VERSION @GLIB_MAJOR_VERSION@
+#define GLIB_MINOR_VERSION @GLIB_MINOR_VERSION@
+#define GLIB_MICRO_VERSION @GLIB_MICRO_VERSION@
+
+#define G_OS_WIN32
+#define G_PLATFORM_WIN32
+
+#ifndef _MSC_VER
+#define G_VA_COPY va_copy
+#endif /* not _MSC_VER */
+
+#ifdef __cplusplus
+#define G_HAVE_INLINE 1
+#else /* !__cplusplus */
+#ifndef _MSC_VER
+#define G_HAVE_INLINE 1
+#endif /* _MSC_VER */
+#define G_HAVE___INLINE 1
+#if !defined(_MSC_VER) && !defined(__DMC__)
+#define G_HAVE___INLINE__ 1
+#endif /* !_MSC_VER and !__DMC__ */
+#endif /* !__cplusplus */
+
+#if defined(__cplusplus) || !defined(_MSC_VER)
+#define G_CAN_INLINE 1
+#endif
+
+#ifndef _MSC_VER
+#define G_HAVE_ISO_VARARGS 1
+
+/* gcc-2.95.x supports both gnu style and ISO varargs, but if -ansi
+ * is passed ISO vararg support is turned off, and there is no work
+ * around to turn it on, so we unconditionally turn it off.
+ */
+#if __GNUC__ == 2 && __GNUC_MINOR__ == 95
+# undef G_HAVE_ISO_VARARGS
+#endif
+
+#define G_HAVE_GNUC_VARARGS 1
+#endif /* not _MSC_VER */
+#define G_HAVE_GROWING_STACK 0
+
+#define G_GNUC_INTERNAL
+
+#define G_THREADS_ENABLED
+#define G_THREADS_IMPL_WIN32
+typedef struct _GMutex* GStaticMutex;
+#define G_STATIC_MUTEX_INIT NULL
+#define g_static_mutex_get_mutex(mutex) \
+ (g_static_mutex_get_mutex_impl_shortcut (mutex))
+/* This represents a system thread as used by the implementation. An
+ * alien implementaion, as loaded by g_thread_init can only count on
+ * "sizeof (gpointer)" bytes to store their info. We however need more
+ * for some of our native implementations. */
+typedef union _GSystemThread GSystemThread;
+union _GSystemThread
+{
+ char data[4];
+ double dummy_double;
+ void *dummy_pointer;
+ long dummy_long;
+};
+
+#define GINT16_TO_LE(val) ((gint16) (val))
+#define GUINT16_TO_LE(val) ((guint16) (val))
+#define GINT16_TO_BE(val) ((gint16) GUINT16_SWAP_LE_BE (val))
+#define GUINT16_TO_BE(val) (GUINT16_SWAP_LE_BE (val))
+#define GINT32_TO_LE(val) ((gint32) (val))
+#define GUINT32_TO_LE(val) ((guint32) (val))
+#define GINT32_TO_BE(val) ((gint32) GUINT32_SWAP_LE_BE (val))
+#define GUINT32_TO_BE(val) (GUINT32_SWAP_LE_BE (val))
+#define GINT64_TO_LE(val) ((gint64) (val))
+#define GUINT64_TO_LE(val) ((guint64) (val))
+#define GINT64_TO_BE(val) ((gint64) GUINT64_SWAP_LE_BE (val))
+#define GUINT64_TO_BE(val) (GUINT64_SWAP_LE_BE (val))
+#define GLONG_TO_LE(val) ((glong) GINT32_TO_LE (val))
+#define GULONG_TO_LE(val) ((gulong) GUINT32_TO_LE (val))
+#define GLONG_TO_BE(val) ((glong) GINT32_TO_BE (val))
+#define GULONG_TO_BE(val) ((gulong) GUINT32_TO_BE (val))
+#define GINT_TO_LE(val) ((gint) GINT32_TO_LE (val))
+#define GUINT_TO_LE(val) ((guint) GUINT32_TO_LE (val))
+#define GINT_TO_BE(val) ((gint) GINT32_TO_BE (val))
+#define GUINT_TO_BE(val) ((guint) GUINT32_TO_BE (val))
+#define G_BYTE_ORDER G_LITTLE_ENDIAN
+
+#define GLIB_SYSDEF_POLLIN =1
+#define GLIB_SYSDEF_POLLOUT =4
+#define GLIB_SYSDEF_POLLPRI =2
+#define GLIB_SYSDEF_POLLHUP =16
+#define GLIB_SYSDEF_POLLERR =8
+#define GLIB_SYSDEF_POLLNVAL =32
+
+#define G_MODULE_SUFFIX "dll"
+
+typedef void * GPid;
+
+G_END_DECLS
+
+#endif /* GLIBCONFIG_H */
diff --git a/trunk/gmodule-2.0-uninstalled.pc.in b/trunk/gmodule-2.0-uninstalled.pc.in
new file mode 100644
index 000000000..680cb6c24
--- /dev/null
+++ b/trunk/gmodule-2.0-uninstalled.pc.in
@@ -0,0 +1,8 @@
+gmodule_supported=@G_MODULE_SUPPORTED@
+
+Name: GModule Uninstalled
+Description: Dynamic module loader for GLib, Not Installed
+Requires: glib-2.0-uninstalled
+Version: @VERSION@
+Libs: @G_MODULE_LDFLAGS@ ${pc_top_builddir}/${pcfiledir}/gmodule/libgmodule-2.0.la @G_MODULE_LIBS@
+Cflags: -I${pc_top_builddir}/${pcfiledir}/@srcdir@/gmodule
diff --git a/trunk/gmodule-2.0.pc.in b/trunk/gmodule-2.0.pc.in
new file mode 100644
index 000000000..e723007a9
--- /dev/null
+++ b/trunk/gmodule-2.0.pc.in
@@ -0,0 +1,13 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+gmodule_supported=@G_MODULE_SUPPORTED@
+
+Name: GModule
+Description: Dynamic module loader for GLib
+Requires: glib-2.0
+Version: @VERSION@
+Libs: -L${libdir} @G_MODULE_LDFLAGS@ -lgmodule-2.0 @G_MODULE_LIBS@
+Cflags:
diff --git a/trunk/gmodule-export-2.0.pc.in b/trunk/gmodule-export-2.0.pc.in
new file mode 100644
index 000000000..e723007a9
--- /dev/null
+++ b/trunk/gmodule-export-2.0.pc.in
@@ -0,0 +1,13 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+gmodule_supported=@G_MODULE_SUPPORTED@
+
+Name: GModule
+Description: Dynamic module loader for GLib
+Requires: glib-2.0
+Version: @VERSION@
+Libs: -L${libdir} @G_MODULE_LDFLAGS@ -lgmodule-2.0 @G_MODULE_LIBS@
+Cflags:
diff --git a/trunk/gmodule-no-export-2.0-uninstalled.pc.in b/trunk/gmodule-no-export-2.0-uninstalled.pc.in
new file mode 100644
index 000000000..bd49e9dc9
--- /dev/null
+++ b/trunk/gmodule-no-export-2.0-uninstalled.pc.in
@@ -0,0 +1,14 @@
+prefix=/usr
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+gmodule_supported=true
+
+Name: GModule
+Description: Dynamic module loader for GLib
+Requires: glib-2.0
+Version: @VERSION@
+Libs: ${pc_top_builddir}/${pcfiledir}/gmodule/libgmodule-2.0.la
+Cflags: -I${pc_top_builddir}/${pcfiledir}/@srcdir@/gmodule
+
diff --git a/trunk/gmodule-no-export-2.0.pc.in b/trunk/gmodule-no-export-2.0.pc.in
new file mode 100644
index 000000000..eff829487
--- /dev/null
+++ b/trunk/gmodule-no-export-2.0.pc.in
@@ -0,0 +1,13 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+gmodule_supported=@G_MODULE_SUPPORTED@
+
+Name: GModule
+Description: Dynamic module loader for GLib
+Requires: glib-2.0
+Version: @VERSION@
+Libs: -L${libdir} -lgmodule-2.0 @G_MODULE_LIBS@
+Cflags:
diff --git a/trunk/gmodule/AUTHORS b/trunk/gmodule/AUTHORS
new file mode 100644
index 000000000..328269585
--- /dev/null
+++ b/trunk/gmodule/AUTHORS
@@ -0,0 +1 @@
+Tim Janik <timj@gtk.org>
diff --git a/trunk/gmodule/COPYING b/trunk/gmodule/COPYING
new file mode 100644
index 000000000..bf50f20de
--- /dev/null
+++ b/trunk/gmodule/COPYING
@@ -0,0 +1,482 @@
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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.
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/trunk/gmodule/ChangeLog b/trunk/gmodule/ChangeLog
new file mode 100644
index 000000000..e4767f6e4
--- /dev/null
+++ b/trunk/gmodule/ChangeLog
@@ -0,0 +1,805 @@
+2007-06-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.4 ===
+
+2007-06-04 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.3 ===
+
+2007-05-22 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.2 ===
+
+2007-05-03 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.1 ===
+
+2007-03-16 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.0 ===
+
+2007-01-19 Tor Lillqvist <tml@novell.com>
+
+ * Makefile.am (gmodule-2.0.lib): Use $(srcdir) for builds outside
+ srcdir.
+
+2006-12-31 Matthias Clasen <mclasen@redhat.com>
+
+ * gmodule.c: Fix include order for win32. (#390943,
+ Kazuki Iwamoto)
+
+2006-12-28 Matthias Clasen <mclasen@redhat.com>
+
+ * gmodule.c: Clean up includes.
+
+2006-12-13 Matthias Clasen <mclasen@redhat.com>
+
+ * gmodule.c (g_module_open):
+ * gmodule-dl.c (_g_module_symbol): Handle valid symbols
+ that are NULL correctly. (#385388, Felix Kater)
+
+Mon Sep 11 14:58:56 2006 Tim Janik <timj@imendio.com>
+
+ * gmodule.c: applied patch from Christian Persch to support
+ G_DEBUG flags resident-modules and bind-now-modules, bug #345099.
+
+2006-08-29 Tor Lillqvist <tml@novell.com>
+
+ Remove support for Windows 9x/ME. GTK+ hasn't worked on Win9x
+ since 2.6. It's pointless to keep the Win9x code in here as it
+ isn't being maintained anyway. If somebody is interested, it is in
+ older GLib versions, and in CVS.
+
+ * gmodule-win32.c (_g_module_open): Remove the Win9x branch of if
+ statement.
+
+2006-08-15 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.12.2 ===
+
+2006-07-22 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.12.1 ===
+
+2006-07-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.12.0 ===
+
+2006-06-20 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.4 ===
+
+2006-06-12 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.3 ===
+
+2006-06-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.2 ===
+
+2006-05-15 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.1 ===
+
+2006-05-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.0 ===
+
+2006-03-29 Matthias Clasen <mclasen@redhat.com>
+
+ * gmodule.c (g_module_symbol): Make sure to
+ not return TRUE if symbol is NULL. (#334440,
+ ITOH Yasufumi)
+
+2006-03-07 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.10.1 ===
+
+2006-02-24 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.10.0 ===
+
+2006-02-10 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.6 ===
+
+2006-01-27 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.5 ===
+
+2006-01-18 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.4 ===
+
+2006-01-16 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.3 ===
+
+2006-01-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.2 ===
+
+2005-12-09 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.1 ===
+
+2005-11-28 Matthias Clasen <mclasen@redhat.com>
+
+ * gmodule.c (parse_libtool_archive): Silence
+ compiler warnings.
+
+2005-11-17 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.0 ===
+
+2005-08-23 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.8.1 ===
+
+2005-08-12 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.8.0 ===
+
+2005-08-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.7 ===
+
+2005-08-03 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.6 ===
+
+2005-08-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.5 ===
+
+2005-07-21 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.4 ===
+
+2005-07-15 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.3 ===
+
+2005-07-09 Tor Lillqvist <tml@novell.com>
+
+ * Makefile.am: Don't use the scripts in build/win32 to compile
+ gmodule.rc into a resource object file. (This means we lose the
+ build number increment magic, but I doubt it was that useful
+ anyway.) Instead use windres directly. To pass the normal .o file
+ produced by windres through libtool, which wants .lo files, pass
+ it directly to the linker using a -Wl option.
+
+ * gmodule.rc.in: Thus replace BUILDNUMBER with 0.
+
+2005-07-08 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.2 ===
+
+2005-06-30 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.1 ===
+
+2005-06-30 Matthias Clasen <mclasen@redhat.com>
+
+ * gmodule-ar.c: Include stdlib.h
+
+2005-06-26 Tor Lillqvist <tml@novell.com>
+
+ * Makefile.am: libtool installs/uninstalls the import library, no
+ need to do it ourselves. Do still install/uninstall the .def file,
+ though.
+
+2005-06-24 Tor Lillqvist <tml@novell.com>
+
+ * Makefile.am (install-libtool-import-lib): Current GNU tools do
+ understand the PRIVATE keyword.
+
+2005-06-10 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.0 ===
+
+2005-01-07 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.6.1 ===
+
+2004-12-31 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule.c (g_module_open): It's wrong to call g_file_test() with
+ more than one test (both G_FILE_TEST_EXISTS and _IS_REGULAR). (It
+ would succeed even if the pathname existed as a nonregular file.)
+ Just G_FILE_TEST_IS_REGULAR works fine. (#162594)
+
+2004-12-16 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.6.0 ===
+
+2004-12-06 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am
+ * gmodule.def
+ * gmodule.[hc]: Win32 DLL ABI stability cruft like in ../glib.
+
+2004-12-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.7 ===
+
+2004-11-12 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.6 ===
+
+2004-11-04 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule-win32.c (_g_module_open): Argument is in UTF-8. Use wide
+ character Win32 API if present.
+
+ * gmodule.c (parse_libtool_archive, g_module_open): Convert file
+ name to UTF-8 before storing in the error message string.
+
+ * gmodule.c (parse_libtool_archive): Use g_open().
+
+2004-11-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.5 ===
+
+2004-10-27 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.4 ===
+
+2004-09-18 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.3 ===
+
+2004-08-25 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.2 ===
+
+2004-08-01 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.1 ===
+
+Sun Jul 18 18:03:08 2004 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * === Released 2.5.0 ===
+
+Mon May 31 00:09:10 2004 Matthias Clasen <maclas@gmx.de>
+
+ * Makefile.am (EXTRA_DIST): Add gmodule-ar.c. (#85930, Tomas gren)
+
+Tue May 11 23:23:21 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gmodule-ar.c (_g_module_open): Make it compile on AIX.
+ (#141159, Michael Wilson)
+
+2004-03-31 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule-win32.c (_g_module_build_path): On Cygwin, use the "cyg"
+ prefix, and accept also the normal "lib". (#138403, Roger Leigh)
+
+Tue Feb 24 14:09:21 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.3.3 ===
+
+Sun Feb 22 02:28:43 2004 Matthias Clasen <maclas@gmx.de>
+
+ Bug #85930, Laurent Vivier:
+
+ * gmodule-ar.c: Implementation of native module management for AIX.
+ * gmoduleconf.h.in:
+ * gmodule.c: Support gmodule-ar.c
+
+2003-01-01 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule-win32.c (_g_module_build_path): Use g_ascii_strcasecmp().
+
+Tue Dec 3 20:56:19 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gmodule.c (g_module_open): Properly refcount the
+ main module if it is already open. (#98648)
+
+Sat Mar 2 14:46:17 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gmodule-beos.c (_g_module_build_path) * gmodule-dyld.c (_g_module_build_path)
+ gmodule-dl.c (_g_module_build_path): Use G_MODULE_SUFFIX rather than
+ a hardcoded ".so". (#72803)
+
+Sun Feb 17 18:15:22 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gmodule.c (g_module_open): Fix typo when checking
+ if file + module_suffix exists. (Miroslaw Dobrzanski-Neumann,
+ #71801)
+
+2001-11-24 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am: Remove rule for testgmodule.exp, too.
+
+2001-11-22 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule-win32.c: Current w32api headers do include tlhelp32.h,
+ so no need to have an extract from it here.
+
+Mon Nov 19 16:12:12 2001 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.am makefile.msc.in makefile.mingw.in: Remove
+ testgmodule and associated plugin files; we don't need _both_ this
+ and ../tests/module-test.c
+
+2001-11-16 Michael Meeks <michael@ximian.com>
+
+ * gmodule.c (parse_libtool_archive): fix leak.
+
+2001-10-30 Dan Winship <danw@ximian.com>
+
+ * Makefile.am (EXTRA_DIST): Add gmodule-dyld.c
+
+2001-10-23 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am: (Win32): If we have built the MSVC import library,
+ install it. Install the gcc import library. Also support
+ uninstall.
+
+2001-10-09 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule-win32.c (_g_module_build_path): More Unix compatibility:
+ Add "lib" prefix in case the module name doesn't already have it,
+ except if it ends with ".dll" (in which case it probably already
+ is the name of an existing DLL). This is needed for instance for
+ the gdk-pixbuf loaders, which are called "lib*.dll", but
+ gdk-pixbuf-io calls g_module_build_path without the "lib" prefix.
+
+2001-10-03 jacob berkman <jacob@ximian.com>
+
+ * libgplugin_a.c: (gplugin_a_module_func):
+ * gmodule.h: s/retrive/retrieve/
+
+2001-09-25 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.mingw.in: Fix missing end @ in @LT_CURRENT@.
+
+ * makefile.msc.in: Use same DLL and import library names as
+ libtool.
+
+2001-09-19 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule.rc.in: Correct InternalName and OriginalFilename to
+ match what we actually produce.
+
+2001-09-18 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am: On Win32, pass a dummy -rpath flag to libtool when
+ building libgplugin_[ab].la, otherwise libtool doesn't create a
+ DLL, but a static archive.
+
+2001-07-20 Hans Breuer <hans@breuer.org>
+
+ * makefile.msc.in : reflect glib move
+
+2001-05-21 Mark Murnane <Mark.Murnane@ireland.sun.com>
+
+ * gmodule.c (g_str_check_suffix): Modified type of string_len
+ and suffix_len to be gsize. Properly accommodates return from
+ strlen().
+
+2001-05-29 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gmodule.c (g_module_set_error_unduped): Do not g_strdup, as
+ promised in the function name.
+
+Tue May 29 12:57:51 2001 Tim Janik <timj@gtk.org>
+
+ * gmodule.c (g_module_symbol): erk, strconcat needs NULL as last arg.
+ make sure we pass module name with suffix into backend open.
+
+Mon May 28 20:19:25 2001 Tim Janik <timj@gtk.org>
+
+ * gmodule.c (g_module_open): as a last resort, if we can't access()
+ the module, leave it up to the platform backends to find it.
+ (fixes implicit search patch loading i broke with my last
+ commit, spotted by Padraig O'Briain).
+
+Thu May 24 03:43:12 2001 Tim Janik <timj@gtk.org>
+
+ * gmodule.c (g_module_open): reordered code so we have a single
+ module loading point (for reliable error messages). do access()
+ tests to figure plausible file names.
+ make error messages more verbose so users canfigure what's going on.
+
+2001-04-20 Dan Winship <danw@ximian.com>
+
+ * gmodule-dyld.c: gmodule implementation for Darwin/Mac OS X
+
+ * gmodule.c:
+ * gmoduleconf.h.in: Add gmodule-dyld support
+
+ * testgmodule.c (main): Fix spelling
+
+2001-03-13 Tor Lillqvist <tml@iki.fi>
+
+ From Edward M. Lee <tailbert@yahoo.com>:
+
+ * gmodule-win32.c (_g_module_build_path): use (cygwin friendly) dir
+ separator.
+
+2001-03-12 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am (libgplugin_a_la_LIBADD, libgplugin_b_la_LIBADD):
+ Link with the libgmodule la only on Win32.
+
+2001-03-10 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am: Use the _LIBADD dependency on libglib only on the
+ Win32 platform (including Cygwin).
+
+2001-03-07 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * Makefile.am, makefile.mingw.in, makefile.msc.in: Set
+ G_LOG_DOMAIN to \"GModule\" instead of g_log_domain_gmodule.
+
+ * gmodule.def, gmodule.h, gmodule.c: Removed g_log_domain_gmodule.
+
+2001-02-21 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule.h: Use G_BEGIN_DECLS and G_END_DECLS. Define
+ G_MODULE_EXPORT correctly on Cygwin, too.
+
+ * gmodule-win32.c (_g_module_open): Convert path to Windows format
+ on Cygwin.
+
+ * Makefile.am (libglib): Use libglib-1.3.la from
+ top_builddir. Invoke libtool with -no-undefined for Win32 and
+ Cygwin.
+
+2001-02-17 Havoc Pennington <hp@pobox.com>
+
+ Applied patch from Soeren Sandmann:
+
+ * gmodule.c (g_module_error): G_CONST_RETURN
+ (g_module_name): G_CONST_RETURN
+
+Sat Feb 17 07:27:15 2001 Tim Janik <timj@gtk.org>
+
+ * gmodule.c: work around platforms that have broken RTLD_GLOBAL.
+
+2001-01-27 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule.c: (Win32) Need <io.h> for open() and close().
+
+2000-12-22 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gmodule.c: Make g_module_open more tolerant wrt to the module
+ name. First it tries to open the module as named, if that fails,
+ it checks, whether it is a libtool archive and parses it, if that
+ fails it appends the systems shared library suffix
+ (i.e. ".so") (if not already found) and tries again and if that
+ fails it tries to append the ".la" libtool suffix (if not already
+ found) and parses it.
+
+ * gmodule.c: Lock recursive mutex during most module functions for
+ safety.
+
+ * gmodule-dl.c: Return an error from _g_module_symbol only, if
+ dlerror says so. All other functions return an error as well, if
+ dlerror returns NULL.
+
+ * testgmodule.c: Thanks to the above change the #ifdefs have
+ vanished.
+
+2000-10-15 Raja R Harinath <harinath@cs.umn.edu>
+
+ * Makefile.am (BUILT_EXTRA_DIST): New variable.
+ (dist-hook): Handle $(BUILT_EXTRA_DIST).
+
+2000-09-28 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gmodule.h: Moved declaration of g_log_domain_gmodule up before
+ the inclusion of glib.h to make it compile on non-gcc compilers.
+
+2000-07-22 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.mingw.in: Remove leftover gmodule-win32res.o stuff. The
+ build-dll script automagically handles resources.
+
+2000-07-20 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * libgplugin_a.c, testgmodule.c: Use g_path_get_basename instead
+ of the deprecated g_basename.
+
+2000-07-19 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gmodule.h: include glib.h before doing extern "C". Makes some C++
+ compiler happy. Reported by Denis Vakatov
+ <vakatov@peony.nlm.nih.gov>.
+
+2000-07-19 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule-win32.c: Don't #include <tlhelp32.h> when compiling with
+ gcc, as it isn't provided. Declaration of a needed struct (from
+ www.microsoft.com) inserted instead.
+
+2000-05-13 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.mingw.in: New file, with gmodule stuff
+ moved from ../makefile.mingw.in.
+
+ * Makefile.am: Add to EXTRA_DIST, and add rule to make makefile.mingw.
+
+2000-05-02 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule-win32.c: No need to include <psapi.h>
+
+2000-03-23 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule-win32.c (_g_module_symbol): When looking for symbols in
+ the "main" module we must search both the main program and all
+ currently loaded DLLs. Not only the main program, or even just the
+ DLLs loaded as gmodules. Libglade requires this.
+
+ Thus we need to get a list of all modules in the current
+ process. There are two alternative APIs to do this: PSAPI and
+ Toolhelp. The former is only available on NT (including Win2k),
+ the latter on Win9x and Win2k. Check which one works, and use
+ that.
+
+ First check for the symbol in the main program, and if not found
+ there, in all the modules.
+
+ Code for using PSAPI and Toolhelp was borrowed from the Dr. Mingw
+ tool written by Jos Fonseca <em96115@fe.up.pt>. Thanks.
+
+2000-03-04 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule-win32.c: Call g_win32_error_message() to get the error
+ message strings.
+
+ * libgplugin_a.c
+ * libgplugin_b.c
+ * gmodule.c: Remove LibMain functions that were needed by LCC,
+ which is not a supported compiler.
+
+ * testgmodule.c (main): Test for G_MODULE_IMPL ==
+ G_MODULE_IMPL_WIN32, not G_OS_WIN32.
+
+ * gmoduleconf.h.win32: Remove LCC stuff from here, too.
+
+Wed Mar 1 05:34:47 2000 Tim Janik <timj@gtk.org>
+
+ * gmodule-beos.c (_g_module_symbol): do not return NULL symbols.
+
+ * gmodule-os2.c: removed NetBSD specific defines.
+ (_g_module_self): set an error message for unsupported behaviour.
+
+ * gmodule-beos.c: many coding style fixups.
+ (_g_module_open):
+ (_g_module_self):
+ (_g_module_close):
+ (_g_module_symbol): bunch of memory leaks plugged.
+
+ * gmodule-dl.c: make sure the error message returned from dlerror()
+ is always != NULL, by using a wrapper function fetch_dlerror(). based
+ on a patch to fix _g_module_symbol() for NetBSD from Scott Presnell
+ <srp@zgi.com>.
+
+ * gmodule-dld.c: minor indentation.
+
+ * gmodule-win32.c: minor cleanups.
+
+ * merges from glib-1-2.
+
+Sat Feb 19 19:43:29 2000 Tim Janik <timj@gtk.org>
+
+ * testgmodule.c (main): added test to check that not yet bound symbols
+ in shared libraries of the main module are retrievable, from David Gero.
+
+2000-01-13 Martin Baulig <martin@home-of-linux.org>
+
+ * gmodule.c (g_module_open): Check whether `check_init' is not NULL
+ before we attempt to call it.
+
+Sun Oct 3 19:30:52 PDT 1999 Manish Singh <yosh@gimp.org>
+
+ * gmodule.h
+ * testgmodule.c: use G_OS stuff
+
+Sat Jul 24 20:47:18 1999 Tim Janik <timj@gtk.org>
+
+ * merged changes from GLib-1-2 branch.
+
+1999-05-06 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule.c: Remove LibMain.
+
+Sat May 1 10:58:57 PDT 1999 Manish Singh <yosh@gimp.org>
+
+ * Makefile.am: use -avoid-version and -module for test plugins
+
+Mon Apr 19 08:43:59 1999 ape@lrdpf.spacetec.no (Asbjorn Pettersen)
+
+ * Makefile.am (EXTRA_DIST): Add gmodule-os2.c
+
+Wed Apr 7 20:12:58 1999 ape@lrdpf.spacetec.no (Asbjorn Pettersen)
+
+ * gmodule-os2.c: OS/2 specific file for gmodule.
+ * gmodule.c (_g_module_open): Add gmodule-os2.c if G_MODULE_IMPL_OS2.
+ * gmoduleconf.h.in: Add G_MODULE_IMPL_OS2.
+
+Fri Apr 23 09:03:48 1999 Tim Janik <timj@gtk.org>
+
+ * gmodule.c (g_module_symbol): removed inline variable assignment.
+ s/CHECK_ERROR/SUPPORT_OR_RETURN/ to make the code more self descriptive.
+
+Wed Feb 10 12:06:30 1999 Tim Janik <timj@gtk.org>
+
+ * gmodule.c (CHECK_ERROR): be more descriptive on unsupported systems.
+
+Wed Feb 10 07:56:33 1999 Tim Janik <timj@gtk.org>
+
+ * gmodule.c (g_module_error): fixed errernerous code wrt to thread
+ specific error string allocation handling.
+
+Thu Jan 21 12:40:11 EST 1999 Jeff Garzik <jgarzik@pobox.com>
+
+ * gmodule-dl.c (_g_module_build_path):
+ Add braces to eliminate an ambiguous else warning.
+
+1999-01-16 Tor Lillqvist <tml@iki.fi>
+
+ * gmodule-dl.c gmodule-dld.c: In
+ _g_module_build_path, don't add the "lib" prefix and
+ ".so" or ".sl" suffix if already there.
+
+ * gmodule-win32.c: Likewise for the ".dll" suffix.
+
+1998-12-10 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gmodule.c: Made it MT safe, the g_module_error() is now thread
+ specific.
+
+Fri Nov 20 14:43:44 1998 Tim Janik <timj@gtk.org>
+
+ * gmodule.c (_g_module_build_path): added empty default imlementation
+ so gmodule.so compiles on systems that are not yet supported, fix from
+ Erik Bagfors <bagfors@hpc2n.umu.se>.
+
+1998-11-13 Nuno Ferreira <nmrf@rnl.ist.utl.pt>
+
+ * Makefile.am (INCLUDES): The previous commit message is wrong
+ about the -I$(top_srcdir) being redundant. I put it back.
+
+Wed Nov 11 23:23:22 EST 1998 Jeff Garzik <jgarzik@pobox.com>
+
+ * Makefile.am : INCLUDES is the right way to add to CFLAGS, not
+ DEFS. Also there are bugs with '+=' in makefiles.
+ Got rid of DEFS line by moving G_LOG_DOMAIN setting into INCLUDES.
+ Removed redundant -I from INCLUDES.
+
+Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
+
+ * testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
+ this needs to be more constistent throughout the code, do we go for
+ NATIVE_WIN32 or WIN32?
+
+ * gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
+ NATIVE_WIN32, since lcc maybe used on other platforms as well.
+ * libgplugin_a.c (LibMain):
+ * libgplugin_b.c (LibMain):
+ likewise. not sure i like this special requirement for lcc in here.
+
+ * gmodule-dl.c (_g_module_build_path):
+ feature empty "" directories and prepend the module name with "lib".
+
+ * gmodule-dld.c (_g_module_build_path):
+ * gmodule-win32.c (_g_module_build_path):
+ feature empty "" directories.
+
+ * we need some more magic in the _g_module_build_path variants
+ so we don't append/prepend lib and .so, .sl or .dll for those names
+ that already contain it.
+
+ * applied patch from Tor Lillqvist for g_module_build_path() and
+ windows support.
+
+1998-10-20: Tor Lillqvist <tml@iki.fi>
+
+ * gmodule/gmodule-win32.c:
+ New file.
+
+ * gmodule/gmodule.c gmodule/gmodule.h:
+ Added the funcion g_module_build_path that builds the path to
+ a module file, decorating the name according to the system's
+ conventions. Added the Windows implementation.
+
+ * gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
+ Added LibMain for LCC-Win32.
+
+ * gmodule/testgmodule.c:
+ Handle Windows dll names.
+
+1998-10-25 Raja R Harinath <harinath@cs.umn.edu>
+
+ * gmodule.h: Remove `#pragma }'.
+ * gmoduleconf.h.in: Likewise.
+
+Wed Oct 21 19:58:27 1998 Tim Janik <timj@gtk.org>
+
+ * gmodule.c (g_module_symbol): fixed a string pointer bug that could
+ cause garbage error messages from g_module_symbol() for systems that
+ NEED_USCORE.
+
+Mon Sep 21 01:54:48 1998 Tim Janik <timj@gtk.org>
+
+ * gmodule.h:
+ * gmodule.c: renamed old _de_init functionality to _unload.
+ modules are now expected to export:
+ G_MODULE_EXPORT const gchar* g_module_check_init (GModule *module);
+ and
+ G_MODULE_EXPORT void g_module_unload (GModule *module);
+ returning a string other than NULL from g_module_check_init() will
+ prevent the module from being loaded. a call to g_module_make_resident()
+ from g_module_unload() will prevent the module from being unloaded and
+ still make it resident.
+
+Thu Sep 17 06:34:22 1998 Tim Janik <timj@gtk.org>
+
+ * gmodule.h:
+ * gmodule.c: implemented g_module_make_resident() which can be
+ used to make modules resident.
+ fixed a buglet about the optional "g_module_de_init" function in
+ modules, which could get invoked twice on very obscure occasions.
+
+Tue Sep 15 14:57:30 1998 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.am: Update to libtool-1.2b,
+ change library versioning scheme to drop LT_RELEASE
+ from the -l line, while keeping it in the soname.
+
+Thu Aug 20 07:08:16 1998 Tim Janik <timj@gtk.org>
+
+ * gmodule.c: provide no operation implementation for the underlying
+ _g_module_* functions, so we at least compile on systems that have
+ neither of G_MODULE_IMPL_DL or G_MODULE_IMPL_DLD.
+
+Mon Aug 17 03:41:52 1998 Tim Janik <timj@gtk.org>
+
+ * gmodule.h:
+ * gmodule.c (g_module_open): changed the return type for the
+ GModuleCheckInit function to be a string, describing the error
+ condition.
+ (g_module_symbol): show the failing symbol on error messages.
+
+Fri Aug 14 02:24:39 1998 Tim Janik <timj@gtk.org>
+
+ * Makefile.am: feature the G_LOG_DOMAIN macro to set the log domain
+ to "GModule" upon compilation. we currently have to add this definition
+ to the DEFS variable.
+ * testgmodule.c: we need an ugly #undef G_LOG_DOMAIN at the start
+ of this file currently, since automake doesn't support per target
+ _CFLAGS yet.
+
+Mon Aug 10 03:35:57 1998 Tim Janik <timj@gtk.org>
+
+ * gmodule.c: minor changes to internal interface.
+ * gmodule-dl.c:
+ * gmodule-dld.c: put some comments into the files, and provided
+ better error checking for shl_findsym(). whish i had a system to
+ test this stuff on.
+
+Mon Aug 10 02:18:31 1998 Tim Janik <timj@gtk.org>
+
+ * Makefile.am (lib_LTLIBRARIES): for now, skip the dependency on
+ -lglib for libgmodule-1.1.la, libgplugin_a.la and libgplugin_b.la
+ since this clashes with inter-library-dependencies for not installed
+ libraries. glib-config takes care of this for the usuall case, but
+ there needs to be a better way...
+
+Sun Aug 9 15:57:38 1998 Tim Janik <timj@gtk.org>
+
+ * testgmodule.c: test program for GModule.
+ * libgplugin_a.c:
+ * libgplugin_b.c: test plugins for testgmodule.c.
+
+ * gmodule.h:
+ * gmodule.c: GModule library implementation, which is basically
+ a wrapper about system specifc dynamic loading facilities.
+
+Sun Aug 9 10:31:05 1998 Tim Janik <timj@gtk.org>
+
+ * ChangeLog start for gmodule.
diff --git a/trunk/gmodule/Makefile.am b/trunk/gmodule/Makefile.am
new file mode 100644
index 000000000..84118bd9e
--- /dev/null
+++ b/trunk/gmodule/Makefile.am
@@ -0,0 +1,110 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/glib -I$(top_srcdir)/gmodule \
+ -DG_LOG_DOMAIN=\"GModule\" @GLIB_DEBUG_FLAGS@ -DG_DISABLE_DEPRECATED
+
+EXTRA_DIST = \
+ makefile.msc.in \
+ gmoduleconf.h.in \
+ gmodule.def \
+ gmodule-dl.c \
+ gmodule-dld.c \
+ gmodule-dyld.c \
+ gmodule-os2.c \
+ gmodule-win32.c \
+ gmodule-beos.c \
+ gmodule-ar.c \
+ gmoduleconf.h.win32 \
+ gmodule.rc.in
+
+BUILT_EXTRA_DIST = \
+ makefile.msc \
+ gmodule.rc
+
+BUILT_SOURCES = gmoduleconf.h
+gmoduleconf.h: gmoduleconf.h.in
+
+glibincludedir=$(includedir)/glib-2.0
+glibinclude_HEADERS = \
+ gmodule.h
+
+libglib = $(top_builddir)/glib/libglib-2.0.la
+
+top_builddir_full=`cd \$(top_builddir); pwd`
+
+lib_LTLIBRARIES = libgmodule-2.0.la
+
+if MS_LIB_AVAILABLE
+noinst_DATA = gmodule-2.0.lib
+
+install-ms-lib:
+ $(INSTALL) gmodule-2.0.lib $(DESTDIR)$(libdir)
+
+uninstall-ms-lib:
+ -rm $(DESTDIR)$(libdir)/gmodule-2.0.lib
+else
+install-ms-lib:
+uninstall-ms-lib:
+endif
+
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif
+
+if OS_WIN32
+export_symbols = -export-symbols $(srcdir)/gmodule.def
+
+install-def-file:
+ $(INSTALL) $(srcdir)/gmodule.def $(DESTDIR)$(libdir)/gmodule-2.0.def
+
+uninstall-def-file:
+ -rm $(DESTDIR)$(libdir)/gmodule-2.0.def
+else
+install-def-file:
+uninstall-def-file:
+endif
+
+if OS_WIN32
+gmodule_win32_res = gmodule-win32-res.o
+gmodule_win32_res_ldflag = -Wl,$(gmodule_win32_res)
+endif
+
+libgmodule_2_0_la_SOURCES = gmodule.c
+libgmodule_2_0_la_LDFLAGS = \
+ $(gmodule_win32_res_ldflag) \
+ $(G_MODULE_LDFLAGS) \
+ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \
+ -export-dynamic $(no_undefined) $(export_symbols)
+
+libgmodule_2_0_la_LIBADD = $(G_MODULE_LIBS_EXTRA) $(G_MODULE_LIBS) $(libglib)
+
+libgmodule_2_0_la_DEPENDENCIES = $(gmodule_win32_res) $(GMODULE_DEF)
+
+if OS_WIN32
+gmodule-win32-res.o: gmodule.rc
+ $(WINDRES) gmodule.rc $@
+endif
+
+gmodule-2.0.lib: libgmodule-2.0.la gmodule.def
+ lib -name:libgmodule-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:$(srcdir)/gmodule.def -out:$@
+
+.PHONY: files release
+
+files:
+ @files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \
+ echo $$p; \
+ done
+
+release:
+ $(MAKE) dist distdir=$(PACKAGE)`date +"%y%m%d"`
+
+dist-hook: $(BUILT_EXTRA_DIST)
+ @files='$(BUILT_EXTRA_DIST)'; \
+ for f in $$files; do \
+ if test -f $$f; then d=.; else d=$(srcdir); fi; \
+ cp $$d/$$f $(distdir) || exit 1; done
+
+
+install-data-local: install-ms-lib install-def-file
+
+uninstall-local: uninstall-ms-lib uninstall-def-file
diff --git a/trunk/gmodule/gmodule-ar.c b/trunk/gmodule/gmodule-ar.c
new file mode 100644
index 000000000..353a05779
--- /dev/null
+++ b/trunk/gmodule/gmodule-ar.c
@@ -0,0 +1,184 @@
+/* GMODULE - GLIB wrapper code for dynamic module loading
+ * Copyright (C) 1998, 2000 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
+ */
+
+/* because we are compatible with archive format only since AIX 4.3 */
+
+#define __AR_BIG__
+#include <ar.h>
+#include <stdlib.h>
+
+#include <dlfcn.h>
+
+/* --- functions --- */
+static gchar*
+fetch_dlerror (gboolean replace_null)
+{
+ gchar *msg = dlerror ();
+
+ /* make sure we always return an error message != NULL, if
+ * expected to do so. */
+
+ if (!msg && replace_null)
+ return "unknown dl-error";
+
+ return msg;
+}
+
+static gchar* _g_module_get_member(const gchar* file_name)
+{
+ gchar* member = NULL;
+ struct fl_hdr file_header;
+ struct ar_hdr ar_header;
+ long first_member;
+ long name_len;
+ int fd;
+
+ fd = open(file_name, O_RDONLY);
+ if (fd == -1)
+ return NULL;
+
+ if (read(fd, (void*)&file_header, FL_HSZ) != FL_HSZ)
+ goto exit;
+
+ if (strncmp(file_header.fl_magic, AIAMAGBIG, SAIAMAG) != 0)
+ goto exit;
+
+ /* read first archive file member header */
+
+ first_member = atol(file_header.fl_fstmoff);
+
+ if (lseek(fd, first_member, SEEK_SET) != first_member)
+ goto exit;
+
+ if (read(fd, (void*)&ar_header, AR_HSZ - 2) != AR_HSZ - 2)
+ goto exit;
+
+ /* read member name */
+
+ name_len = atol(ar_header.ar_namlen);
+
+ member = g_malloc(name_len+1);
+ if (!member)
+ goto exit;
+
+ if (read(fd, (void*)member, name_len) != name_len)
+ {
+ g_free(member);
+ member = NULL;
+ goto exit;
+ }
+
+ member[name_len] = 0;
+
+exit:
+ close(fd);
+
+ return member;
+}
+
+static gpointer
+_g_module_open (const gchar *file_name,
+ gboolean bind_lazy,
+ gboolean bind_local)
+{
+ gpointer handle;
+ gchar* member;
+ gchar* full_name;
+
+ /* extract name of first member of archive */
+
+ member = _g_module_get_member (file_name);
+ if (member != NULL)
+ {
+ full_name = g_strconcat (file_name, "(", member, ")", NULL);
+ g_free (member);
+ }
+ else
+ full_name = g_strdup (file_name);
+
+ handle = dlopen (full_name,
+ (bind_local ? RTLD_LOCAL : RTLD_GLOBAL) | RTLD_MEMBER | (bind_lazy ? RTLD_LAZY : RTLD_NOW));
+
+ g_free (full_name);
+
+ if (!handle)
+ g_module_set_error (fetch_dlerror (TRUE));
+
+ return handle;
+}
+
+static gpointer
+_g_module_self (void)
+{
+ gpointer handle;
+
+ handle = dlopen (NULL, RTLD_GLOBAL | RTLD_LAZY);
+ if (!handle)
+ g_module_set_error (fetch_dlerror (TRUE));
+
+ return handle;
+}
+
+static void
+_g_module_close (gpointer handle,
+ gboolean is_unref)
+{
+ /* are there any systems out there that have dlopen()/dlclose()
+ * without a reference count implementation?
+ */
+ is_unref |= 1;
+
+ if (is_unref)
+ {
+ if (dlclose (handle) != 0)
+ g_module_set_error (fetch_dlerror (TRUE));
+ }
+}
+
+static gpointer
+_g_module_symbol (gpointer handle,
+ const gchar *symbol_name)
+{
+ gpointer p;
+
+ p = dlsym (handle, symbol_name);
+ if (!p)
+ g_module_set_error (fetch_dlerror (FALSE));
+
+ return p;
+}
+
+static gchar*
+_g_module_build_path (const gchar *directory,
+ const gchar *module_name)
+{
+ if (directory && *directory) {
+ if (strncmp (module_name, "lib", 3) == 0)
+ return g_strconcat (directory, "/", module_name, NULL);
+ else
+ return g_strconcat (directory, "/lib", module_name, "." G_MODULE_SUFFIX, NULL);
+ } else if (strncmp (module_name, "lib", 3) == 0)
+ return g_strdup (module_name);
+ else
+ return g_strconcat ("lib", module_name, "." G_MODULE_SUFFIX, NULL);
+}
diff --git a/trunk/gmodule/gmodule-beos.c b/trunk/gmodule/gmodule-beos.c
new file mode 100644
index 000000000..159bc985a
--- /dev/null
+++ b/trunk/gmodule/gmodule-beos.c
@@ -0,0 +1,203 @@
+/* GMODULE - GLIB wrapper code for dynamic module loading
+ * Copyright (C) 1998, 2000 Tim Janik
+ *
+ * BeOS GMODULE implementation
+ * Copyright (C) 1999 Richard Offer and Shawn T. Amundson (amundson@gtk.org)
+ *
+ * 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 <be/kernel/image.h> /* image (aka DSO) handling functions... */
+
+/*
+ * The BeOS doesn't use the same symantics as Unix's dlopen....
+ *
+ */
+#ifndef RTLD_GLOBAL
+#define RTLD_GLOBAL 0
+#endif /* RTLD_GLOBAL */
+#ifndef RTLD_LAZY
+#define RTLD_LAZY 1
+#endif /* RTLD_LAZY */
+#ifndef RTLD_NOW
+#define RTLD_NOW 0
+#endif /* RTLD_NOW */
+
+
+/*
+ * Points to Ponder
+ *
+ * You can load the same DSO more than once, in which case you'll have
+ * different image_id's. While this means that we don't have to worry about
+ * reference counts, it could lead to problems in the future....
+ * richard.
+ *
+ * load_add_on() apparently does not support lazy or local binding. Need
+ * to confirm that the actual behavior is non-lazy/local. --ds
+ */
+
+#include <Errors.h>
+#include <stdio.h>
+
+/* --- functions --- */
+static gpointer
+_g_module_open (const gchar *file_name,
+ gboolean bind_lazy,
+ gboolean bind_local)
+{
+ image_id handle;
+
+ handle = load_add_on (file_name);
+ if (handle < B_OK)
+ {
+ gchar *msg = g_strdup_printf ("failed to load_add_on(%s): %s",
+ file_name,
+ strerror (handle));
+
+ g_module_set_error (msg);
+ g_free (msg);
+
+ return NULL;
+ }
+
+ return (gpointer) handle;
+}
+
+static gpointer
+_g_module_self (void)
+{
+ image_info info;
+ int32 cookie = 0;
+ status_t status;
+
+ /* Is it always the first one? I'm guessing yes. */
+ status = get_next_image_info (0, &cookie, &info);
+ if (status == B_OK)
+ return (gpointer) info.id;
+ else
+ {
+ gchar *msg = g_strdup_printf ("failed to get_next_image_info(self): %s",
+ strerror (status));
+
+ g_module_set_error (msg);
+ g_free (msg);
+
+ return NULL;
+ }
+}
+
+static void
+_g_module_close (gpointer handle,
+ gboolean is_unref)
+{
+ image_info info;
+ gchar *name;
+
+ if (unload_add_on ((image_id) handle) != B_OK)
+ {
+ gchar *msg;
+
+ /* Try and get the name of the image. */
+ if (get_image_info ((image_id) handle, &info) != B_OK)
+ name = g_strdup ("unknown");
+ else
+ name = g_strdup (info.name);
+
+ msg = g_strdup_printf ("failed to unload_add_on(%s): %s", name, strerror (status));
+ g_module_set_error (msg);
+ g_free (msg);
+ g_free (name);
+ }
+}
+
+static gpointer
+_g_module_symbol (gpointer handle,
+ const gchar *symbol_name)
+{
+ image_id id;
+ status_t status;
+ image_info info;
+ int32 type, name_len;
+ void *p;
+ gchar *msg, name[256];
+ gint n, l;
+
+ id = (image_id) handle;
+
+ status = get_image_info (id, &info);
+ if (status != B_OK)
+ {
+ msg = g_strdup_printf ("failed to get_image_info(): %s", strerror (status));
+ g_module_set_error (msg);
+ g_free (msg);
+
+ return NULL;
+ }
+
+ l = strlen (symbol_name);
+ name_len = 256;
+ type = B_SYMBOL_TYPE_ANY;
+ n = 0;
+ status = get_nth_image_symbol (id, n, name, &name_len, &type, &p);
+ while (status == B_OK)
+ {
+ if (p && strncmp (name, symbol_name, l) == 0)
+ return p;
+
+ if (strcmp (name, "_end") == 0)
+ {
+ msg = g_strdup_printf ("unmatched symbol name `%s'", symbol_name);
+ g_module_set_error (msg);
+ g_free (msg);
+
+ return NULL;
+ }
+
+ name_len = 256;
+ type = B_SYMBOL_TYPE_ANY;
+ n++;
+ status = get_nth_image_symbol (id, n, name, &name_len, &type, &p);
+ }
+
+ msg = g_strdup_printf ("failed to get_image_symbol(%s): %s", symbol_name, strerror (status));
+ g_module_set_error (msg);
+ g_free (msg);
+
+ return NULL;
+}
+
+static gchar*
+_g_module_build_path (const gchar *directory,
+ const gchar *module_name)
+{
+ g_warning ("_g_module_build_path() untested for BeOS!");
+
+ if (directory && *directory)
+ {
+ if (strncmp (module_name, "lib", 3) == 0)
+ return g_strconcat (directory, "/", module_name, NULL);
+ else
+ return g_strconcat (directory, "/lib", module_name, "." G_MODULE_SUFFIX, NULL);
+ }
+ else if (strncmp (module_name, "lib", 3) == 0)
+ return g_strdup (module_name);
+ else
+ return g_strconcat ("lib", module_name, "." G_MODULE_SUFFIX, NULL);
+}
diff --git a/trunk/gmodule/gmodule-dl.c b/trunk/gmodule/gmodule-dl.c
new file mode 100644
index 000000000..ce3377767
--- /dev/null
+++ b/trunk/gmodule/gmodule-dl.c
@@ -0,0 +1,167 @@
+/* GMODULE - GLIB wrapper code for dynamic module loading
+ * Copyright (C) 1998, 2000 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 <dlfcn.h>
+
+/* Perl includes <nlist.h> and <link.h> instead of <dlfcn.h> on some systmes? */
+
+
+/* dlerror() is not implemented on all systems
+ */
+#ifndef G_MODULE_HAVE_DLERROR
+# ifdef __NetBSD__
+# define dlerror() g_strerror (errno)
+# else /* !__NetBSD__ */
+/* could we rely on errno's state here? */
+# define dlerror() "unknown dl-error"
+# endif /* !__NetBSD__ */
+#endif /* G_MODULE_HAVE_DLERROR */
+
+/* some flags are missing on some systems, so we provide
+ * harmless defaults.
+ * The Perl sources say, RTLD_LAZY needs to be defined as (1),
+ * at least for Solaris 1.
+ *
+ * Mandatory:
+ * RTLD_LAZY - resolve undefined symbols as code from the dynamic library
+ * is executed.
+ * RTLD_NOW - resolve all undefined symbols before dlopen returns, and fail
+ * if this cannot be done.
+ * Optionally:
+ * RTLD_GLOBAL - the external symbols defined in the library will be made
+ * available to subsequently loaded libraries.
+ */
+#ifndef RTLD_LAZY
+#define RTLD_LAZY 1
+#endif /* RTLD_LAZY */
+#ifndef RTLD_NOW
+#define RTLD_NOW 0
+#endif /* RTLD_NOW */
+/* some systems (OSF1 V5.0) have broken RTLD_GLOBAL linkage */
+#ifdef G_MODULE_BROKEN_RTLD_GLOBAL
+#undef RTLD_GLOBAL
+#endif /* G_MODULE_BROKEN_RTLD_GLOBAL */
+#ifndef RTLD_GLOBAL
+#define RTLD_GLOBAL 0
+#endif /* RTLD_GLOBAL */
+
+
+/* --- functions --- */
+static gchar*
+fetch_dlerror (gboolean replace_null)
+{
+ gchar *msg = dlerror ();
+
+ /* make sure we always return an error message != NULL, if
+ * expected to do so. */
+
+ if (!msg && replace_null)
+ return "unknown dl-error";
+
+ return msg;
+}
+
+static gpointer
+_g_module_open (const gchar *file_name,
+ gboolean bind_lazy,
+ gboolean bind_local)
+{
+ gpointer handle;
+
+ handle = dlopen (file_name,
+ (bind_local ? 0 : RTLD_GLOBAL) | (bind_lazy ? RTLD_LAZY : RTLD_NOW));
+ if (!handle)
+ g_module_set_error (fetch_dlerror (TRUE));
+
+ return handle;
+}
+
+static gpointer
+_g_module_self (void)
+{
+ gpointer handle;
+
+ /* to query symbols from the program itself, special link options
+ * are required on some systems.
+ */
+
+ handle = dlopen (NULL, RTLD_GLOBAL | RTLD_LAZY);
+ if (!handle)
+ g_module_set_error (fetch_dlerror (TRUE));
+
+ return handle;
+}
+
+static void
+_g_module_close (gpointer handle,
+ gboolean is_unref)
+{
+ /* are there any systems out there that have dlopen()/dlclose()
+ * without a reference count implementation?
+ */
+ is_unref |= 1;
+
+ if (is_unref)
+ {
+ if (dlclose (handle) != 0)
+ g_module_set_error (fetch_dlerror (TRUE));
+ }
+}
+
+static gpointer
+_g_module_symbol (gpointer handle,
+ const gchar *symbol_name)
+{
+ gpointer p;
+ gchar *msg;
+
+ fetch_dlerror (FALSE);
+ p = dlsym (handle, symbol_name);
+ msg = fetch_dlerror (FALSE);
+ if (msg)
+ g_module_set_error (msg);
+
+ return p;
+}
+
+static gchar*
+_g_module_build_path (const gchar *directory,
+ const gchar *module_name)
+{
+ if (directory && *directory) {
+ if (strncmp (module_name, "lib", 3) == 0)
+ return g_strconcat (directory, "/", module_name, NULL);
+ else
+ return g_strconcat (directory, "/lib", module_name, "." G_MODULE_SUFFIX, NULL);
+ } else if (strncmp (module_name, "lib", 3) == 0)
+ return g_strdup (module_name);
+ else
+ return g_strconcat ("lib", module_name, "." G_MODULE_SUFFIX, NULL);
+}
diff --git a/trunk/gmodule/gmodule-dld.c b/trunk/gmodule/gmodule-dld.c
new file mode 100644
index 000000000..913ac453b
--- /dev/null
+++ b/trunk/gmodule/gmodule-dld.c
@@ -0,0 +1,162 @@
+/* GMODULE - GLIB wrapper code for dynamic module loading
+ * Copyright (C) 1998, 2000 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 <dl.h>
+
+
+/* some flags are missing on some systems, so we provide
+ * harmless defaults.
+ *
+ * Mandatory:
+ * BIND_IMMEDIATE - Resolve symbol references when the library is loaded.
+ * BIND_DEFERRED - Delay code symbol resolution until actual reference.
+ *
+ * Optionally:
+ * BIND_FIRST - Place the library at the head of the symbol search order.
+ * BIND_NONFATAL - The default BIND_IMMEDIATE behavior is to treat all unsatisfied
+ * symbols as fatal. This flag allows binding of unsatisfied code
+ * symbols to be deferred until use.
+ * [Perl: For certain libraries, like DCE, deferred binding often
+ * causes run time problems. Adding BIND_NONFATAL to BIND_IMMEDIATE
+ * still allows unresolved references in situations like this.]
+ * BIND_NOSTART - Do not call the initializer for the shared library when the
+ * library is loaded, nor on a future call to shl_unload().
+ * BIND_VERBOSE - Print verbose messages concerning possible unsatisfied symbols.
+ *
+ * hp9000s700/hp9000s800:
+ * BIND_RESTRICTED - Restrict symbols visible by the library to those present at
+ * library load time.
+ * DYNAMIC_PATH - Allow the loader to dynamically search for the library specified
+ * by the path argument.
+ */
+#ifndef DYNAMIC_PATH
+#define DYNAMIC_PATH 0
+#endif /* DYNAMIC_PATH */
+#ifndef BIND_RESTRICTED
+#define BIND_RESTRICTED 0
+#endif /* BIND_RESTRICTED */
+
+#define OPT_BIND_FLAGS (BIND_NONFATAL | BIND_VERBOSE)
+
+
+/* --- functions --- */
+
+/*
+ * shl_load() does not appear to support making symbols invisible to
+ * the global namespace. However, the default is to put the library
+ * last in the search order, which is approximately what we want,
+ * since it will cause symbols that conflict with existing symbols to
+ * be invisible. It is unclear if BIND_FIRST should be used when
+ * bind_local==0, since it may cause the loaded symbols to be used
+ * preferentially to the application's symbols, which is Almost
+ * Always Wrong. --ds
+ */
+static gpointer
+_g_module_open (const gchar *file_name,
+ gboolean bind_lazy,
+ gboolean bind_local)
+{
+ shl_t shl_handle;
+
+ shl_handle = shl_load (file_name,
+ (bind_lazy ? BIND_DEFERRED : BIND_IMMEDIATE) | OPT_BIND_FLAGS, 0);
+ if (!shl_handle)
+ {
+ /* the hp-docs say we should better abort() if errno==ENOSYM ;( */
+ g_module_set_error (g_strerror (errno));
+ }
+
+ return (gpointer) shl_handle;
+}
+
+static gpointer
+_g_module_self (void)
+{
+ shl_t shl_handle;
+
+ shl_handle = PROG_HANDLE;
+ if (!shl_handle)
+ g_module_set_error (g_strerror (errno));
+
+ return shl_handle;
+}
+
+static void
+_g_module_close (gpointer handle,
+ gboolean is_unref)
+{
+ if (!is_unref)
+ {
+ if (shl_unload ((shl_t) handle) != 0)
+ g_module_set_error (g_strerror (errno));
+ }
+}
+
+static gpointer
+_g_module_symbol (gpointer handle,
+ const gchar *symbol_name)
+{
+ gpointer p = NULL;
+
+ /* should we restrict lookups to TYPE_PROCEDURE?
+ */
+ if (handle == PROG_HANDLE)
+ {
+ /* PROG_HANDLE will only lookup symbols in the program itself, not honouring
+ * libraries. passing NULL as a handle will also try to lookup the symbol
+ * in currently loaded libraries. fix pointed out and supplied by:
+ * David Gero <dgero@nortelnetworks.com>
+ */
+ handle = NULL;
+ }
+ if (shl_findsym ((shl_t*) &handle, symbol_name, TYPE_UNDEFINED, &p) != 0 ||
+ handle == NULL || p == NULL)
+ {
+ /* the hp-docs say we should better abort() if errno==ENOSYM ;( */
+ g_module_set_error (g_strerror (errno));
+ }
+
+ return p;
+}
+
+static gchar*
+_g_module_build_path (const gchar *directory,
+ const gchar *module_name)
+{
+ if (directory && *directory)
+ if (strncmp (module_name, "lib", 3) == 0)
+ return g_strconcat (directory, "/", module_name, NULL);
+ else
+ return g_strconcat (directory, "/lib", module_name, ".sl", NULL);
+ else if (strncmp (module_name, "lib", 3) == 0)
+ return g_strdup (module_name);
+ else
+ return g_strconcat ("lib", module_name, ".sl", NULL);
+}
diff --git a/trunk/gmodule/gmodule-dyld.c b/trunk/gmodule/gmodule-dyld.c
new file mode 100644
index 000000000..3a96017d1
--- /dev/null
+++ b/trunk/gmodule/gmodule-dyld.c
@@ -0,0 +1,153 @@
+/* GMODULE - GLIB wrapper code for dynamic module loading
+ * Copyright (C) 1998, 2000 Tim Janik
+ *
+ * dyld (Darwin) GMODULE implementation
+ * Copyright (C) 2001 Dan Winship
+ *
+ * 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 <mach-o/dyld.h>
+
+static gpointer self_module = GINT_TO_POINTER (1);
+
+static gpointer
+_g_module_open (const gchar *file_name,
+ gboolean bind_lazy,
+ gboolean bind_local)
+{
+ NSObjectFileImage image;
+ NSObjectFileImageReturnCode ret;
+ NSModule module;
+ unsigned long options;
+ char *msg;
+
+ ret = NSCreateObjectFileImageFromFile (file_name, &image);
+ if (ret != NSObjectFileImageSuccess)
+ {
+ switch (ret)
+ {
+ case NSObjectFileImageInappropriateFile:
+ case NSObjectFileImageFormat:
+ msg = g_strdup_printf ("%s is not a loadable module", file_name);
+ break;
+
+ case NSObjectFileImageArch:
+ msg = g_strdup_printf ("%s is not built for this architecture",
+ file_name);
+ break;
+
+ case NSObjectFileImageAccess:
+ if (access (file_name, F_OK) == 0)
+ msg = g_strdup_printf ("%s: permission denied", file_name);
+ else
+ msg = g_strdup_printf ("%s: no such file or directory", file_name);
+ break;
+
+ default:
+ msg = g_strdup_printf ("unknown error for %s", file_name);
+ break;
+ }
+
+ g_module_set_error (msg);
+ g_free (msg);
+ return NULL;
+ }
+
+ options = NSLINKMODULE_OPTION_RETURN_ON_ERROR;
+ if (bind_local)
+ options |= NSLINKMODULE_OPTION_PRIVATE;
+ if (!bind_lazy)
+ options |= NSLINKMODULE_OPTION_BINDNOW;
+ module = NSLinkModule (image, file_name, options);
+ NSDestroyObjectFileImage (image);
+ if (!module)
+ {
+ NSLinkEditErrors c;
+ int error_number;
+ const char *file, *error;
+
+ NSLinkEditError (&c, &error_number, &file, &error);
+ msg = g_strdup_printf ("could not link %s: %s", file_name, error);
+ g_module_set_error (msg);
+ g_free (msg);
+ return NULL;
+ }
+
+ return module;
+}
+
+static gpointer
+_g_module_self (void)
+{
+ return &self_module;
+}
+
+static void
+_g_module_close (gpointer handle,
+ gboolean is_unref)
+{
+ if (handle == &self_module)
+ return;
+
+ if (!NSUnLinkModule (handle, 0))
+ g_module_set_error ("could not unlink module");
+}
+
+static gpointer
+_g_module_symbol (gpointer handle,
+ const gchar *symbol_name)
+{
+ NSSymbol sym;
+ char *msg;
+
+ if (handle == &self_module)
+ {
+ if (NSIsSymbolNameDefined (symbol_name))
+ sym = NSLookupAndBindSymbol (symbol_name);
+ else
+ sym = NULL;
+ }
+ else
+ sym = NSLookupSymbolInModule (handle, symbol_name);
+
+ if (!sym)
+ {
+ msg = g_strdup_printf ("no such symbol %s", symbol_name);
+ g_module_set_error (msg);
+ g_free (msg);
+ return NULL;
+ }
+
+ return NSAddressOfSymbol (sym);
+}
+
+static gchar*
+_g_module_build_path (const gchar *directory,
+ const gchar *module_name)
+{
+ if (directory && *directory)
+ {
+ if (strncmp (module_name, "lib", 3) == 0)
+ return g_strconcat (directory, "/", module_name, NULL);
+ else
+ return g_strconcat (directory, "/lib", module_name, "." G_MODULE_SUFFIX, NULL);
+ }
+ else if (strncmp (module_name, "lib", 3) == 0)
+ return g_strdup (module_name);
+ else
+ return g_strconcat ("lib", module_name, "." G_MODULE_SUFFIX, NULL);
+}
diff --git a/trunk/gmodule/gmodule-os2.c b/trunk/gmodule/gmodule-os2.c
new file mode 100644
index 000000000..4dd0404d7
--- /dev/null
+++ b/trunk/gmodule/gmodule-os2.c
@@ -0,0 +1,143 @@
+/* GMODULE - GLIB wrapper code for dynamic module loading
+ * Copyright (C) 1998, 2000 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 <dlfcn.h>
+
+/* Perl includes <nlist.h> and <link.h> instead of <dlfcn.h> on some systmes? */
+
+
+/* dlerror() is not implemented on all systems
+ */
+#ifndef G_MODULE_HAVE_DLERROR
+/* could we rely on errno's state here? */
+# define dlerror() "unknown dl-error"
+#endif /* G_MODULE_HAVE_DLERROR */
+
+/* some flags are missing on some systems, so we provide
+ * harmless defaults.
+ * The Perl sources say, RTLD_LAZY needs to be defined as (1),
+ * at least for Solaris 1.
+ *
+ * Mandatory:
+ * RTLD_LAZY - resolve undefined symbols as code from the dynamic library
+ * is executed.
+ * RTLD_NOW - resolve all undefined symbols before dlopen returns, and fail
+ * if this cannot be done.
+ * Optionally:
+ * RTLD_GLOBAL - the external symbols defined in the library will be made
+ * available to subsequently loaded libraries.
+ */
+#ifndef RTLD_GLOBAL
+#define RTLD_GLOBAL 0
+#endif /* RTLD_GLOBAL */
+#ifndef RTLD_LAZY
+#define RTLD_LAZY 1
+#endif /* RTLD_LAZY */
+#ifndef RTLD_NOW
+#define RTLD_NOW 0
+#endif /* RTLD_NOW */
+
+
+/* --- functions --- */
+static gpointer
+_g_module_open (const gchar *file_name,
+ gboolean bind_lazy,
+ gboolean bind_local)
+{
+ gpointer handle;
+
+ handle = dlopen (file_name,
+ (bind_local ? 0 : RTLD_GLOBAL) | (bind_lazy ? RTLD_LAZY : RTLD_NOW));
+ if (!handle)
+ g_module_set_error (dlerror ());
+
+ return handle;
+}
+
+static gpointer
+_g_module_self (void)
+{
+ gpointer handle;
+
+ /* to query symbols from the program itself, special link options
+ * are required on some systems.
+ */
+
+ /* XXX, not supported */
+ handle = NULL;
+ g_module_set_error ("module handle for self not supported");
+
+ return handle;
+}
+
+static void
+_g_module_close (gpointer handle,
+ gboolean is_unref)
+{
+ /* are there any systems out there that have dlopen()/dlclose()
+ * without a reference count implementation?
+ */
+ is_unref |= 1;
+
+ if (is_unref)
+ {
+ /* XXX, no return code */
+ dlclose (handle);
+ }
+}
+
+static gpointer
+_g_module_symbol (gpointer handle,
+ const gchar *symbol_name)
+{
+ gpointer p;
+
+ p = dlsym (handle, symbol_name);
+ if (!p)
+ g_module_set_error (dlerror ());
+
+ return p;
+}
+
+static gchar*
+_g_module_build_path (const gchar *directory,
+ const gchar *module_name)
+{
+ gchar *suffix = strrchr(module_name, '.');
+ if (directory && *directory)
+ if (suffix && (stricmp (suffix, ".dll") == 0))
+ return g_strconcat (directory, "/", module_name, NULL);
+ else
+ return g_strconcat (directory, "/", module_name, ".dll", NULL);
+ else if (suffix && (stricmp (suffix, ".dll") == 0))
+ return g_strdup (module_name);
+ else
+ return g_strconcat (module_name, ".dll", NULL);
+}
diff --git a/trunk/gmodule/gmodule-win32.c b/trunk/gmodule/gmodule-win32.c
new file mode 100644
index 000000000..3e8fe02fe
--- /dev/null
+++ b/trunk/gmodule/gmodule-win32.c
@@ -0,0 +1,261 @@
+/* GMODULE - GLIB wrapper code for dynamic module loading
+ * Copyright (C) 1998, 2000 Tim Janik
+ *
+ * Win32 GMODULE implementation
+ * Copyright (C) 1998 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
+ */
+
+#include <stdio.h>
+#include <windows.h>
+
+#include <tlhelp32.h>
+
+#ifdef G_WITH_CYGWIN
+#include <sys/cygwin.h>
+#endif
+
+static void
+set_error (void)
+{
+ gchar *error = g_win32_error_message (GetLastError ());
+
+ g_module_set_error (error);
+ g_free (error);
+}
+
+/* --- functions --- */
+static gpointer
+_g_module_open (const gchar *file_name,
+ gboolean bind_lazy,
+ gboolean bind_local)
+{
+ HINSTANCE handle;
+ wchar_t *wfilename;
+#ifdef G_WITH_CYGWIN
+ gchar tmp[MAX_PATH];
+
+ cygwin_conv_to_win32_path(file_name, tmp);
+ file_name = tmp;
+#endif
+ wfilename = g_utf8_to_utf16 (file_name, -1, NULL, NULL, NULL);
+
+ handle = LoadLibraryW (wfilename);
+ g_free (wfilename);
+
+ if (!handle)
+ set_error ();
+
+ return handle;
+}
+
+static gint dummy;
+static gpointer null_module_handle = &dummy;
+
+static gpointer
+_g_module_self (void)
+{
+ return null_module_handle;
+}
+
+static void
+_g_module_close (gpointer handle,
+ gboolean is_unref)
+{
+ if (handle != null_module_handle)
+ if (!FreeLibrary (handle))
+ set_error ();
+}
+
+static gpointer
+find_in_any_module_using_toolhelp (const gchar *symbol_name)
+{
+ typedef HANDLE (WINAPI *PFNCREATETOOLHELP32SNAPSHOT)(DWORD, DWORD);
+ static PFNCREATETOOLHELP32SNAPSHOT pfnCreateToolhelp32Snapshot = NULL;
+
+ typedef BOOL (WINAPI *PFNMODULE32FIRST)(HANDLE, MODULEENTRY32*);
+ static PFNMODULE32FIRST pfnModule32First= NULL;
+
+ typedef BOOL (WINAPI *PFNMODULE32NEXT)(HANDLE, MODULEENTRY32*);
+ static PFNMODULE32NEXT pfnModule32Next = NULL;
+
+ static HMODULE kernel32;
+
+ HANDLE snapshot;
+ MODULEENTRY32 me32;
+
+ gpointer p;
+
+ if (!pfnCreateToolhelp32Snapshot || !pfnModule32First || !pfnModule32Next)
+ {
+ if (!kernel32)
+ if (!(kernel32 = GetModuleHandle ("kernel32.dll")))
+ return NULL;
+
+ if (!(pfnCreateToolhelp32Snapshot = (PFNCREATETOOLHELP32SNAPSHOT) GetProcAddress (kernel32, "CreateToolhelp32Snapshot"))
+ || !(pfnModule32First = (PFNMODULE32FIRST) GetProcAddress (kernel32, "Module32First"))
+ || !(pfnModule32Next = (PFNMODULE32NEXT) GetProcAddress (kernel32, "Module32Next")))
+ return NULL;
+ }
+
+ if ((snapshot = (*pfnCreateToolhelp32Snapshot) (TH32CS_SNAPMODULE, 0)) == (HANDLE) -1)
+ return NULL;
+
+ me32.dwSize = sizeof (me32);
+ p = NULL;
+ if ((*pfnModule32First) (snapshot, &me32))
+ {
+ do {
+ if ((p = GetProcAddress (me32.hModule, symbol_name)) != NULL)
+ break;
+ } while ((*pfnModule32Next) (snapshot, &me32));
+ }
+
+ CloseHandle (snapshot);
+
+ return p;
+}
+
+static gpointer
+find_in_any_module_using_psapi (const gchar *symbol_name)
+{
+ static HMODULE psapi = NULL;
+
+ typedef BOOL (WINAPI *PFNENUMPROCESSMODULES) (HANDLE, HMODULE *, DWORD, LPDWORD) ;
+ static PFNENUMPROCESSMODULES pfnEnumProcessModules = NULL;
+
+ HMODULE *modules;
+ HMODULE dummy;
+ gint i, size;
+ DWORD needed;
+
+ gpointer p;
+
+ if (!pfnEnumProcessModules)
+ {
+ if (!psapi)
+ if ((psapi = LoadLibrary ("psapi.dll")) == NULL)
+ return NULL;
+
+ if (!(pfnEnumProcessModules = (PFNENUMPROCESSMODULES) GetProcAddress (psapi, "EnumProcessModules")))
+ return NULL;
+ }
+
+ if (!(*pfnEnumProcessModules) (GetCurrentProcess (), &dummy,
+ sizeof (HMODULE), &needed))
+ return NULL;
+
+ size = needed + 10 * sizeof (HMODULE);
+ modules = g_malloc (size);
+
+ if (!(*pfnEnumProcessModules) (GetCurrentProcess (), modules,
+ size, &needed)
+ || needed > size)
+ {
+ g_free (modules);
+ return NULL;
+ }
+
+ p = NULL;
+ for (i = 0; i < needed / sizeof (HMODULE); i++)
+ if ((p = GetProcAddress (modules[i], symbol_name)) != NULL)
+ break;
+
+ g_free (modules);
+
+ return p;
+}
+
+static gpointer
+find_in_any_module (const gchar *symbol_name)
+{
+ gpointer result;
+
+ if ((result = find_in_any_module_using_toolhelp (symbol_name)) == NULL
+ && (result = find_in_any_module_using_psapi (symbol_name)) == NULL)
+ return NULL;
+ else
+ return result;
+}
+
+static gpointer
+_g_module_symbol (gpointer handle,
+ const gchar *symbol_name)
+{
+ gpointer p;
+
+ if (handle == null_module_handle)
+ {
+ if ((p = GetProcAddress (GetModuleHandle (NULL), symbol_name)) == NULL)
+ p = find_in_any_module (symbol_name);
+ }
+ else
+ p = GetProcAddress (handle, symbol_name);
+
+ if (!p)
+ set_error ();
+
+ return p;
+}
+
+static gchar*
+_g_module_build_path (const gchar *directory,
+ const gchar *module_name)
+{
+ gint k;
+
+ k = strlen (module_name);
+
+ if (directory && *directory)
+ if (k > 4 && g_ascii_strcasecmp (module_name + k - 4, ".dll") == 0)
+ return g_strconcat (directory, G_DIR_SEPARATOR_S, module_name, NULL);
+#ifdef G_WITH_CYGWIN
+ else if (strncmp (module_name, "lib", 3) == 0 || strncmp (module_name, "cyg", 3) == 0)
+ return g_strconcat (directory, G_DIR_SEPARATOR_S, module_name, ".dll", NULL);
+ else
+ return g_strconcat (directory, G_DIR_SEPARATOR_S, "cyg", module_name, ".dll", NULL);
+#else
+ else if (strncmp (module_name, "lib", 3) == 0)
+ return g_strconcat (directory, G_DIR_SEPARATOR_S, module_name, ".dll", NULL);
+ else
+ return g_strconcat (directory, G_DIR_SEPARATOR_S, "lib", module_name, ".dll", NULL);
+#endif
+ else if (k > 4 && g_ascii_strcasecmp (module_name + k - 4, ".dll") == 0)
+ return g_strdup (module_name);
+#ifdef G_WITH_CYGWIN
+ else if (strncmp (module_name, "lib", 3) == 0 || strncmp (module_name, "cyg", 3) == 0)
+ return g_strconcat (module_name, ".dll", NULL);
+ else
+ return g_strconcat ("cyg", module_name, ".dll", NULL);
+#else
+ else if (strncmp (module_name, "lib", 3) == 0)
+ return g_strconcat (module_name, ".dll", NULL);
+ else
+ return g_strconcat ("lib", module_name, ".dll", NULL);
+#endif
+}
diff --git a/trunk/gmodule/gmodule.c b/trunk/gmodule/gmodule.c
new file mode 100644
index 000000000..be00e53aa
--- /dev/null
+++ b/trunk/gmodule/gmodule.c
@@ -0,0 +1,678 @@
+/* GMODULE - GLIB wrapper code for dynamic module loading
+ * 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 <config.h>
+#include "gmoduleconf.h"
+#include "gstdio.h"
+#include "gmodule.h"
+
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#if defined (G_OS_WIN32)
+#include <io.h> /* For open() and close() prototypes. */
+#endif
+
+
+/* We maintain a list of modules, so we can reference count them.
+ * That's needed because some platforms don't support refernce counts on
+ * modules e.g. the shl_* implementation of HP-UX
+ * (http://www.stat.umn.edu/~luke/xls/projects/dlbasics/dlbasics.html).
+ * Also, the module for the program itself is kept seperatedly for
+ * faster access and because it has special semantics.
+ */
+
+
+/* --- structures --- */
+struct _GModule
+{
+ gchar *file_name;
+#ifdef G_OS_WIN32
+ gchar *cp_file_name;
+#endif
+ gpointer handle;
+ guint ref_count : 31;
+ guint is_resident : 1;
+ GModuleUnload unload;
+ GModule *next;
+};
+
+
+/* --- prototypes --- */
+static gpointer _g_module_open (const gchar *file_name,
+ gboolean bind_lazy,
+ gboolean bind_local);
+static void _g_module_close (gpointer handle,
+ gboolean is_unref);
+static gpointer _g_module_self (void);
+static gpointer _g_module_symbol (gpointer handle,
+ const gchar *symbol_name);
+static gchar* _g_module_build_path (const gchar *directory,
+ const gchar *module_name);
+static inline void g_module_set_error (const gchar *error);
+static inline GModule* g_module_find_by_handle (gpointer handle);
+static inline GModule* g_module_find_by_name (const gchar *name);
+
+
+/* --- variables --- */
+static GModule *modules = NULL;
+static GModule *main_module = NULL;
+static GStaticPrivate module_error_private = G_STATIC_PRIVATE_INIT;
+static gboolean module_debug_initialized = FALSE;
+static guint module_debug_flags = 0;
+
+
+/* --- inline functions --- */
+static inline GModule*
+g_module_find_by_handle (gpointer handle)
+{
+ GModule *module;
+ GModule *retval = NULL;
+
+ if (main_module && main_module->handle == handle)
+ retval = main_module;
+ else
+ for (module = modules; module; module = module->next)
+ if (handle == module->handle)
+ {
+ retval = module;
+ break;
+ }
+
+ return retval;
+}
+
+static inline GModule*
+g_module_find_by_name (const gchar *name)
+{
+ GModule *module;
+ GModule *retval = NULL;
+
+ for (module = modules; module; module = module->next)
+ if (strcmp (name, module->file_name) == 0)
+ {
+ retval = module;
+ break;
+ }
+
+ return retval;
+}
+
+static inline void
+g_module_set_error_unduped (gchar *error)
+{
+ g_static_private_set (&module_error_private, error, g_free);
+ errno = 0;
+}
+
+static inline void
+g_module_set_error (const gchar *error)
+{
+ g_module_set_error_unduped (g_strdup (error));
+}
+
+
+/* --- include platform specifc code --- */
+#define SUPPORT_OR_RETURN(rv) { g_module_set_error (NULL); }
+#if (G_MODULE_IMPL == G_MODULE_IMPL_DL)
+#include "gmodule-dl.c"
+#elif (G_MODULE_IMPL == G_MODULE_IMPL_DLD)
+#include "gmodule-dld.c"
+#elif (G_MODULE_IMPL == G_MODULE_IMPL_WIN32)
+#include "gmodule-win32.c"
+#elif (G_MODULE_IMPL == G_MODULE_IMPL_DYLD)
+#include "gmodule-dyld.c"
+#elif (G_MODULE_IMPL == G_MODULE_IMPL_AR)
+#include "gmodule-ar.c"
+#else
+#undef SUPPORT_OR_RETURN
+#define SUPPORT_OR_RETURN(rv) { g_module_set_error ("dynamic modules are " \
+ "not supported by this system"); return rv; }
+static gpointer
+_g_module_open (const gchar *file_name,
+ gboolean bind_lazy,
+ gboolean bind_local)
+{
+ return NULL;
+}
+static void
+_g_module_close (gpointer handle,
+ gboolean is_unref)
+{
+}
+static gpointer
+_g_module_self (void)
+{
+ return NULL;
+}
+static gpointer
+_g_module_symbol (gpointer handle,
+ const gchar *symbol_name)
+{
+ return NULL;
+}
+static gchar*
+_g_module_build_path (const gchar *directory,
+ const gchar *module_name)
+{
+ return NULL;
+}
+#endif /* no implementation */
+
+/* --- functions --- */
+gboolean
+g_module_supported (void)
+{
+ SUPPORT_OR_RETURN (FALSE);
+
+ return TRUE;
+}
+
+static gchar*
+parse_libtool_archive (const gchar* libtool_name)
+{
+ const guint TOKEN_DLNAME = G_TOKEN_LAST + 1;
+ const guint TOKEN_INSTALLED = G_TOKEN_LAST + 2;
+ const guint TOKEN_LIBDIR = G_TOKEN_LAST + 3;
+ gchar *lt_dlname = NULL;
+ gboolean lt_installed = TRUE;
+ gchar *lt_libdir = NULL;
+ gchar *name;
+ GTokenType token;
+ GScanner *scanner;
+
+ int fd = g_open (libtool_name, O_RDONLY, 0);
+ if (fd < 0)
+ {
+ gchar *display_libtool_name = g_filename_display_name (libtool_name);
+ g_module_set_error_unduped (g_strdup_printf ("failed to open libtool archive \"%s\"", display_libtool_name));
+ g_free (display_libtool_name);
+ return NULL;
+ }
+ /* search libtool's dlname specification */
+ scanner = g_scanner_new (NULL);
+ g_scanner_input_file (scanner, fd);
+ scanner->config->symbol_2_token = TRUE;
+ g_scanner_scope_add_symbol (scanner, 0, "dlname",
+ GUINT_TO_POINTER (TOKEN_DLNAME));
+ g_scanner_scope_add_symbol (scanner, 0, "installed",
+ GUINT_TO_POINTER (TOKEN_INSTALLED));
+ g_scanner_scope_add_symbol (scanner, 0, "libdir",
+ GUINT_TO_POINTER (TOKEN_LIBDIR));
+ while (!g_scanner_eof (scanner))
+ {
+ token = g_scanner_get_next_token (scanner);
+ if (token == TOKEN_DLNAME || token == TOKEN_INSTALLED ||
+ token == TOKEN_LIBDIR)
+ {
+ if (g_scanner_get_next_token (scanner) != '=' ||
+ g_scanner_get_next_token (scanner) !=
+ (token == TOKEN_INSTALLED ?
+ G_TOKEN_IDENTIFIER : G_TOKEN_STRING))
+ {
+ gchar *display_libtool_name = g_filename_display_name (libtool_name);
+ g_module_set_error_unduped (g_strdup_printf ("unable to parse libtool archive \"%s\"", display_libtool_name));
+ g_free (display_libtool_name);
+
+ g_free (lt_dlname);
+ g_free (lt_libdir);
+ g_scanner_destroy (scanner);
+ close (fd);
+
+ return NULL;
+ }
+ else
+ {
+ if (token == TOKEN_DLNAME)
+ {
+ g_free (lt_dlname);
+ lt_dlname = g_strdup (scanner->value.v_string);
+ }
+ else if (token == TOKEN_INSTALLED)
+ lt_installed =
+ strcmp (scanner->value.v_identifier, "yes") == 0;
+ else /* token == TOKEN_LIBDIR */
+ {
+ g_free (lt_libdir);
+ lt_libdir = g_strdup (scanner->value.v_string);
+ }
+ }
+ }
+ }
+
+ if (!lt_installed)
+ {
+ gchar *dir = g_path_get_dirname (libtool_name);
+ g_free (lt_libdir);
+ lt_libdir = g_strconcat (dir, G_DIR_SEPARATOR_S ".libs", NULL);
+ g_free (dir);
+ }
+
+ name = g_strconcat (lt_libdir, G_DIR_SEPARATOR_S, lt_dlname, NULL);
+
+ g_free (lt_dlname);
+ g_free (lt_libdir);
+ g_scanner_destroy (scanner);
+ close (fd);
+
+ return name;
+}
+
+static inline gboolean
+str_check_suffix (const gchar* string,
+ const gchar* suffix)
+{
+ gsize string_len = strlen (string);
+ gsize suffix_len = strlen (suffix);
+
+ return string_len >= suffix_len &&
+ strcmp (string + string_len - suffix_len, suffix) == 0;
+}
+
+enum
+{
+ G_MODULE_DEBUG_RESIDENT_MODULES = 1 << 0,
+ G_MODULE_DEBUG_BIND_NOW_MODULES = 1 << 1
+};
+
+static void
+_g_module_debug_init (void)
+{
+ const GDebugKey keys[] = {
+ { "resident-modules", G_MODULE_DEBUG_RESIDENT_MODULES },
+ { "bind-now-modules", G_MODULE_DEBUG_BIND_NOW_MODULES }
+ };
+ const gchar *env;
+
+ env = g_getenv ("G_DEBUG");
+
+ module_debug_flags =
+ !env ? 0 : g_parse_debug_string (env, keys, G_N_ELEMENTS (keys));
+
+ module_debug_initialized = TRUE;
+}
+
+static GStaticRecMutex g_module_global_lock = G_STATIC_REC_MUTEX_INIT;
+
+GModule*
+g_module_open (const gchar *file_name,
+ GModuleFlags flags)
+{
+ GModule *module;
+ gpointer handle = NULL;
+ gchar *name = NULL;
+
+ SUPPORT_OR_RETURN (NULL);
+
+ g_static_rec_mutex_lock (&g_module_global_lock);
+
+ if (G_UNLIKELY (!module_debug_initialized))
+ _g_module_debug_init ();
+
+ if (module_debug_flags & G_MODULE_DEBUG_BIND_NOW_MODULES)
+ flags &= ~G_MODULE_BIND_LAZY;
+
+ if (!file_name)
+ {
+ if (!main_module)
+ {
+ handle = _g_module_self ();
+ if (handle)
+ {
+ main_module = g_new (GModule, 1);
+ main_module->file_name = NULL;
+#ifdef G_OS_WIN32
+ main_module->cp_file_name = NULL;
+#endif
+ main_module->handle = handle;
+ main_module->ref_count = 1;
+ main_module->is_resident = TRUE;
+ main_module->unload = NULL;
+ main_module->next = NULL;
+ }
+ }
+ else
+ main_module->ref_count++;
+
+ g_static_rec_mutex_unlock (&g_module_global_lock);
+ return main_module;
+ }
+
+ /* we first search the module list by name */
+ module = g_module_find_by_name (file_name);
+ if (module)
+ {
+ module->ref_count++;
+
+ g_static_rec_mutex_unlock (&g_module_global_lock);
+ return module;
+ }
+
+ /* check whether we have a readable file right away */
+ if (g_file_test (file_name, G_FILE_TEST_IS_REGULAR))
+ name = g_strdup (file_name);
+ /* try completing file name with standard library suffix */
+ if (!name)
+ {
+ name = g_strconcat (file_name, "." G_MODULE_SUFFIX, NULL);
+ if (!g_file_test (name, G_FILE_TEST_IS_REGULAR))
+ {
+ g_free (name);
+ name = NULL;
+ }
+ }
+ /* try completing by appending libtool suffix */
+ if (!name)
+ {
+ name = g_strconcat (file_name, ".la", NULL);
+ if (!g_file_test (name, G_FILE_TEST_IS_REGULAR))
+ {
+ g_free (name);
+ name = NULL;
+ }
+ }
+ /* we can't access() the file, lets hope the platform backends finds
+ * it via library paths
+ */
+ if (!name)
+ {
+ gchar *dot = strrchr (file_name, '.');
+ gchar *slash = strrchr (file_name, G_DIR_SEPARATOR);
+
+ /* make sure the name has a suffix */
+ if (!dot || dot < slash)
+ name = g_strconcat (file_name, "." G_MODULE_SUFFIX, NULL);
+ else
+ name = g_strdup (file_name);
+ }
+
+ /* ok, try loading the module */
+ if (name)
+ {
+ /* if it's a libtool archive, figure library file to load */
+ if (str_check_suffix (name, ".la")) /* libtool archive? */
+ {
+ gchar *real_name = parse_libtool_archive (name);
+
+ /* real_name might be NULL, but then module error is already set */
+ g_free (name);
+ name = real_name;
+ }
+ if (name)
+ handle = _g_module_open (name, (flags & G_MODULE_BIND_LAZY) != 0,
+ (flags & G_MODULE_BIND_LOCAL) != 0);
+ }
+ else
+ {
+ gchar *display_file_name = g_filename_display_name (file_name);
+ g_module_set_error_unduped (g_strdup_printf ("unable to access file \"%s\"", display_file_name));
+ g_free (display_file_name);
+ }
+ g_free (name);
+
+ if (handle)
+ {
+ gchar *saved_error;
+ GModuleCheckInit check_init;
+ const gchar *check_failed = NULL;
+
+ /* search the module list by handle, since file names are not unique */
+ module = g_module_find_by_handle (handle);
+ if (module)
+ {
+ _g_module_close (module->handle, TRUE);
+ module->ref_count++;
+ g_module_set_error (NULL);
+
+ g_static_rec_mutex_unlock (&g_module_global_lock);
+ return module;
+ }
+
+ saved_error = g_strdup (g_module_error ());
+ g_module_set_error (NULL);
+
+ module = g_new (GModule, 1);
+ module->file_name = g_strdup (file_name);
+#ifdef G_OS_WIN32
+ module->cp_file_name = g_locale_from_utf8 (file_name, -1,
+ NULL, NULL, NULL);
+#endif
+ module->handle = handle;
+ module->ref_count = 1;
+ module->is_resident = FALSE;
+ module->unload = NULL;
+ module->next = modules;
+ modules = module;
+
+ /* check initialization */
+ if (g_module_symbol (module, "g_module_check_init", (gpointer) &check_init) && check_init != NULL)
+ check_failed = check_init (module);
+
+ /* we don't call unload() if the initialization check failed. */
+ if (!check_failed)
+ g_module_symbol (module, "g_module_unload", (gpointer) &module->unload);
+
+ if (check_failed)
+ {
+ gchar *error;
+
+ error = g_strconcat ("GModule initialization check failed: ", check_failed, NULL);
+ g_module_close (module);
+ module = NULL;
+ g_module_set_error (error);
+ g_free (error);
+ }
+ else
+ g_module_set_error (saved_error);
+
+ g_free (saved_error);
+ }
+
+ if (module != NULL &&
+ (module_debug_flags & G_MODULE_DEBUG_RESIDENT_MODULES))
+ g_module_make_resident (module);
+
+ g_static_rec_mutex_unlock (&g_module_global_lock);
+ return module;
+}
+
+#ifdef G_OS_WIN32
+
+#undef g_module_open
+
+GModule*
+g_module_open (const gchar *file_name,
+ GModuleFlags flags)
+{
+ gchar *utf8_file_name = g_locale_to_utf8 (file_name, -1, NULL, NULL, NULL);
+ GModule *retval = g_module_open_utf8 (utf8_file_name, flags);
+
+ g_free (utf8_file_name);
+
+ return retval;
+}
+
+#endif
+
+gboolean
+g_module_close (GModule *module)
+{
+ SUPPORT_OR_RETURN (FALSE);
+
+ g_return_val_if_fail (module != NULL, FALSE);
+ g_return_val_if_fail (module->ref_count > 0, FALSE);
+
+ g_static_rec_mutex_lock (&g_module_global_lock);
+
+ module->ref_count--;
+
+ if (!module->ref_count && !module->is_resident && module->unload)
+ {
+ GModuleUnload unload;
+
+ unload = module->unload;
+ module->unload = NULL;
+ unload (module);
+ }
+
+ if (!module->ref_count && !module->is_resident)
+ {
+ GModule *last;
+ GModule *node;
+
+ last = NULL;
+
+ node = modules;
+ while (node)
+ {
+ if (node == module)
+ {
+ if (last)
+ last->next = node->next;
+ else
+ modules = node->next;
+ break;
+ }
+ last = node;
+ node = last->next;
+ }
+ module->next = NULL;
+
+ _g_module_close (module->handle, FALSE);
+ g_free (module->file_name);
+#ifdef G_OS_WIN32
+ g_free (module->cp_file_name);
+#endif
+ g_free (module);
+ }
+
+ g_static_rec_mutex_unlock (&g_module_global_lock);
+ return g_module_error() == NULL;
+}
+
+void
+g_module_make_resident (GModule *module)
+{
+ g_return_if_fail (module != NULL);
+
+ module->is_resident = TRUE;
+}
+
+G_CONST_RETURN gchar*
+g_module_error (void)
+{
+ return g_static_private_get (&module_error_private);
+}
+
+gboolean
+g_module_symbol (GModule *module,
+ const gchar *symbol_name,
+ gpointer *symbol)
+{
+ const gchar *module_error;
+
+ if (symbol)
+ *symbol = NULL;
+ SUPPORT_OR_RETURN (FALSE);
+
+ g_return_val_if_fail (module != NULL, FALSE);
+ g_return_val_if_fail (symbol_name != NULL, FALSE);
+ g_return_val_if_fail (symbol != NULL, FALSE);
+
+ g_static_rec_mutex_lock (&g_module_global_lock);
+
+#ifdef G_MODULE_NEED_USCORE
+ {
+ gchar *name;
+
+ name = g_strconcat ("_", symbol_name, NULL);
+ *symbol = _g_module_symbol (module->handle, name);
+ g_free (name);
+ }
+#else /* !G_MODULE_NEED_USCORE */
+ *symbol = _g_module_symbol (module->handle, symbol_name);
+#endif /* !G_MODULE_NEED_USCORE */
+
+ module_error = g_module_error ();
+ if (module_error)
+ {
+ gchar *error;
+
+ error = g_strconcat ("`", symbol_name, "': ", module_error, NULL);
+ g_module_set_error (error);
+ g_free (error);
+ *symbol = NULL;
+ }
+
+ g_static_rec_mutex_unlock (&g_module_global_lock);
+ return !module_error;
+}
+
+G_CONST_RETURN gchar*
+g_module_name (GModule *module)
+{
+ g_return_val_if_fail (module != NULL, NULL);
+
+ if (module == main_module)
+ return "main";
+
+ return module->file_name;
+}
+
+#ifdef G_OS_WIN32
+
+#undef g_module_name
+
+G_CONST_RETURN gchar*
+g_module_name (GModule *module)
+{
+ g_return_val_if_fail (module != NULL, NULL);
+
+ if (module == main_module)
+ return "main";
+
+ return module->cp_file_name;
+}
+
+#endif
+
+gchar*
+g_module_build_path (const gchar *directory,
+ const gchar *module_name)
+{
+ g_return_val_if_fail (module_name != NULL, NULL);
+
+ return _g_module_build_path (directory, module_name);
+}
diff --git a/trunk/gmodule/gmodule.def b/trunk/gmodule/gmodule.def
new file mode 100644
index 000000000..ef202a947
--- /dev/null
+++ b/trunk/gmodule/gmodule.def
@@ -0,0 +1,11 @@
+EXPORTS
+ g_module_build_path
+ g_module_close
+ g_module_error
+ g_module_make_resident
+ g_module_name PRIVATE
+ g_module_name_utf8
+ g_module_open PRIVATE
+ g_module_open_utf8
+ g_module_supported
+ g_module_symbol
diff --git a/trunk/gmodule/gmodule.h b/trunk/gmodule/gmodule.h
new file mode 100644
index 000000000..ae7f8e54a
--- /dev/null
+++ b/trunk/gmodule/gmodule.h
@@ -0,0 +1,101 @@
+/* GMODULE - GLIB wrapper code for dynamic module loading
+ * 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/.
+ */
+
+#ifndef __GMODULE_H__
+#define __GMODULE_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+/* exporting and importing functions, this is special cased
+ * to feature Windows dll stubs.
+ */
+#define G_MODULE_IMPORT extern
+#ifdef G_PLATFORM_WIN32
+# define G_MODULE_EXPORT __declspec(dllexport)
+#else /* !G_PLATFORM_WIN32 */
+# define G_MODULE_EXPORT
+#endif /* !G_PLATFORM_WIN32 */
+
+typedef enum
+{
+ G_MODULE_BIND_LAZY = 1 << 0,
+ G_MODULE_BIND_LOCAL = 1 << 1,
+ G_MODULE_BIND_MASK = 0x03
+} GModuleFlags;
+
+typedef struct _GModule GModule;
+typedef const gchar* (*GModuleCheckInit) (GModule *module);
+typedef void (*GModuleUnload) (GModule *module);
+
+#ifdef G_OS_WIN32
+#define g_module_open g_module_open_utf8
+#define g_module_name g_module_name_utf8
+#endif
+
+/* return TRUE if dynamic module loading is supported */
+gboolean g_module_supported (void) G_GNUC_CONST;
+
+/* open a module `file_name' and return handle, which is NULL on error */
+GModule* g_module_open (const gchar *file_name,
+ GModuleFlags flags);
+
+/* close a previously opened module, returns TRUE on success */
+gboolean g_module_close (GModule *module);
+
+/* make a module resident so g_module_close on it will be ignored */
+void g_module_make_resident (GModule *module);
+
+/* query the last module error as a string */
+G_CONST_RETURN gchar* g_module_error (void);
+
+/* retrieve a symbol pointer from `module', returns TRUE on success */
+gboolean g_module_symbol (GModule *module,
+ const gchar *symbol_name,
+ gpointer *symbol);
+
+/* retrieve the file name from an existing module */
+G_CONST_RETURN gchar* g_module_name (GModule *module);
+
+/* Build the actual file name containing a module. `directory' is the
+ * directory where the module file is supposed to be, or NULL or empty
+ * in which case it should either be in the current directory or, on
+ * some operating systems, in some standard place, for instance on the
+ * PATH. Hence, to be absoultely sure to get the correct module,
+ * always pass in a directory. The file name consists of the directory,
+ * if supplied, and `module_name' suitably decorated accoring to
+ * the operating system's conventions (for instance lib*.so or *.dll).
+ *
+ * No checks are made that the file exists, or is of correct type.
+ */
+gchar* g_module_build_path (const gchar *directory,
+ const gchar *module_name);
+
+
+G_END_DECLS
+
+#endif /* __GMODULE_H__ */
diff --git a/trunk/gmodule/gmodule.rc.in b/trunk/gmodule/gmodule.rc.in
new file mode 100644
index 000000000..cc4901446
--- /dev/null
+++ b/trunk/gmodule/gmodule.rc.in
@@ -0,0 +1,30 @@
+#include <winver.h>
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0
+ PRODUCTVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0
+ FILEFLAGSMASK 0
+ FILEFLAGS 0
+ FILEOS VOS__WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE VFT2_UNKNOWN
+ BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "CompanyName", "The GLib developer community"
+ VALUE "FileDescription", "GModule"
+ VALUE "FileVersion", "@GLIB_VERSION@.0"
+ VALUE "InternalName", "libgmodule-2.0-@LT_CURRENT_MINUS_AGE@"
+ VALUE "LegalCopyright", "Copyright 1998-2000 Tim Janik. Modified by the GLib Team and others 1998-2004."
+ VALUE "OriginalFilename", "libgmodule-2.0-@LT_CURRENT_MINUS_AGE@.dll"
+ VALUE "ProductName", "GLib"
+ VALUE "ProductVersion", "@GLIB_VERSION@"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+ END
diff --git a/trunk/gmodule/gmoduleconf.h.in b/trunk/gmodule/gmoduleconf.h.in
new file mode 100644
index 000000000..168cf23d2
--- /dev/null
+++ b/trunk/gmodule/gmoduleconf.h.in
@@ -0,0 +1,54 @@
+/* GMODULE - GLIB wrapper code for dynamic module loading
+ * 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.
+ */
+#ifndef __G_MODULE_CONF_H__
+#define __G_MODULE_CONF_H__
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+#define G_MODULE_IMPL_NONE 0
+#define G_MODULE_IMPL_DL 1
+#define G_MODULE_IMPL_DLD 2
+#define G_MODULE_IMPL_WIN32 3
+#define G_MODULE_IMPL_OS2 4
+#define G_MODULE_IMPL_BEOS 5
+#define G_MODULE_IMPL_DYLD 6
+#define G_MODULE_IMPL_AR 7
+
+#define G_MODULE_IMPL @G_MODULE_IMPL@
+#undef G_MODULE_HAVE_DLERROR
+#if (@G_MODULE_HAVE_DLERROR@)
+#define G_MODULE_HAVE_DLERROR
+#endif
+#if (@G_MODULE_NEED_USCORE@) || defined (hp9000s300) || defined (__hp9000s300) || defined (__hp9000s300__)
+#define G_MODULE_NEED_USCORE
+#endif
+#if (@G_MODULE_BROKEN_RTLD_GLOBAL@)
+#define G_MODULE_BROKEN_RTLD_GLOBAL
+#endif
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* __G_MODULE_CONF_H__ */
diff --git a/trunk/gmodule/gmoduleconf.h.win32 b/trunk/gmodule/gmoduleconf.h.win32
new file mode 100644
index 000000000..18bee9b35
--- /dev/null
+++ b/trunk/gmodule/gmoduleconf.h.win32
@@ -0,0 +1,44 @@
+/* GMODULE - GLIB wrapper code for dynamic module loading
+ * 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.
+ */
+#ifndef __G_MODULE_CONF_H__
+#define __G_MODULE_CONF_H__
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+#define G_MODULE_IMPL_NONE 0
+#define G_MODULE_IMPL_DL 1
+#define G_MODULE_IMPL_DLD 2
+#define G_MODULE_IMPL_WIN32 3
+#define G_MODULE_IMPL_OS2 4
+#define G_MODULE_IMPL_BEOS 5
+#define G_MODULE_IMPL_DYLD 6
+
+#define G_MODULE_IMPL G_MODULE_IMPL_WIN32
+#undef G_MODULE_HAVE_DLERROR
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* __G_MODULE_CONF_H__ */
diff --git a/trunk/gmodule/makefile.msc.in b/trunk/gmodule/makefile.msc.in
new file mode 100644
index 000000000..da365116b
--- /dev/null
+++ b/trunk/gmodule/makefile.msc.in
@@ -0,0 +1,31 @@
+## Makefile for building the gmodule dll with Microsoft C
+## Use: nmake -f makefile.msc install
+
+TOP = ..\..
+
+!INCLUDE ..\build\win32\make.msc
+
+################################################################
+
+INCLUDES = -FImsvc_recommended_pragmas.h -I .. -I . -I ..\glib
+DEFINES = -DHAVE_CONFIG_H -DG_LOG_DOMAIN=\"GModule\"
+
+all : \
+ gmoduleconf.h \
+ libgmodule-2.0-@LT_CURRENT_MINUS_AGE@.dll
+
+gmodule_OBJECTS = \
+ gmodule.obj
+
+gmoduleconf.h: gmoduleconf.h.win32
+ copy gmoduleconf.h.win32 gmoduleconf.h
+
+gmodule.res : gmodule.rc
+ rc -DBUILDNUMBER=0 -r -fo gmodule.res gmodule.rc
+
+libgmodule-2.0-@LT_CURRENT_MINUS_AGE@.dll : $(gmodule_OBJECTS) gmodule.def gmodule.res
+ $(CC) $(CFLAGS) -LD -Fe$@ $(gmodule_OBJECTS) gmodule.res \
+ ..\glib\glib-2.0.lib $(LDFLAGS) /implib:gmodule-2.0.lib /def:gmodule.def
+
+clean::
+ del gmoduleconf.h
diff --git a/trunk/gobject-2.0-uninstalled.pc.in b/trunk/gobject-2.0-uninstalled.pc.in
new file mode 100644
index 000000000..1aab1b5eb
--- /dev/null
+++ b/trunk/gobject-2.0-uninstalled.pc.in
@@ -0,0 +1,7 @@
+Name: GObject Uninstalled
+Description: Object/type system for GLib, Not Installed
+Requires: glib-2.0-uninstalled
+Version: @VERSION@
+Libs: ${pc_top_builddir}/${pcfiledir}/gobject/libgobject-2.0.la
+## cflags contains builddir in addition to srcdir because of gmarshal.h
+Cflags: -I${pc_top_builddir}/${pcfiledir}/@srcdir@ -I${pc_top_builddir}/${pcfiledir}
diff --git a/trunk/gobject-2.0.pc.in b/trunk/gobject-2.0.pc.in
new file mode 100644
index 000000000..31fe34d45
--- /dev/null
+++ b/trunk/gobject-2.0.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: GObject
+Description: GLib Type, Object, Parameter and Signal Library
+Requires: glib-2.0
+Version: @VERSION@
+Libs: -L${libdir} -lgobject-2.0
+Cflags:
diff --git a/trunk/gobject/ChangeLog b/trunk/gobject/ChangeLog
new file mode 100644
index 000000000..a95eef29b
--- /dev/null
+++ b/trunk/gobject/ChangeLog
@@ -0,0 +1,3356 @@
+2007-06-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.4 ===
+
+2007-06-04 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.3 ===
+
+2007-05-22 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.2 ===
+
+2007-05-17 Matthias Clasen <mclasen@redhat.com>
+
+ * gtype.h: Move G_GNUC_INTERNAL before function
+ declarations to fix compilation with sun studio. (#438873,
+ Damien Carbery)
+
+2007-05-03 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.1 ===
+
+2007-04-25 Michael Natterer <mitch@imendio.com>
+
+ * gparamspecs.c (param_string_validate): also clear the
+ NOCOPY_CONTENTS flag when replacing NULL with the empty string.
+
+2007-04-24 Michael Natterer <mitch@imendio.com>
+
+ * gparamspecs.c (param_string_validate): don't free or modify
+ static strings, dup them when needed and clear the
+ G_VALUE_NOCOPY_CONTENTS flag. Fixes bug #432895.
+
+Tue Apr 3 12:34:14 2007 Tim Janik <timj@gtk.org>
+
+ * gobject.[hc]: invoke GObjectClass.constructed() only for newly
+ constructed objects, and invoke it while the notify queue is
+ still being frozen, after all CONSTRUCT* properties have been
+ set and before random other properties are being set.
+
+ * applied modified patch from Ryan Lortie to implement
+ GObjectClass.constructed() to fix #425324.
+
+2007-04-02 Ryan Lortie <desrt@desrt.ca>
+
+ * gobject/gobject.h: Add 'constructed' vcall to GObjectClass.
+ * gobject/gobject.c (g_object_newv): call ->constructed() as last
+ step of object construction.
+
+2007-03-16 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.0 ===
+
+2007-03-15 Matthias Clasen <mclasen@redhat.com>
+
+ * gvaluearray.c: Use g_slice. (#404430, Chris Wilson)
+
+2007-03-14 Stefan Kost <ensonic@users.sf.net>
+
+ * gparam.h:
+ Add G_PARAM_STATIC_STRINGS define (fixes #418021).
+
+Mon Mar 12 13:30:20 2007 Tim Janik <timj@gtk.org>
+
+ * gtype.h: marked purely functional g_type accessors as PURE or CONST,
+ closes #305100.
+
+2007-01-02 Tor Lillqvist <tml@novell.com>
+
+ * glib-genmarshal.c (main): Handle "/dev/stdin" by dup()ing fd 0
+ so that it works on Win32 and other systems without
+ /dev/stdin. (#407431)
+
+2006-12-29 Matthias Clasen <mclasen@redhat.com>
+
+ * gtypemodule.h: Define G_DEFINE_DYNAMIC_TYPE and
+ and _EXTENDED variant. (#334437)
+
+Fri Dec 15 2006 Matthias Clasen <mclasen@redhat.com>
+
+ * gtype.c (instance_real_class_get): Dereference the pointer
+ before dropping the lock. (#378078, Jonathan Matthew)
+
+Tue Oct 10 12:06:08 2006 Tim Janik <timj@gtk.org>
+
+ * glib-mkenums.in:
+ * glib-mkenums.1: applied patch from David Necas which introduces
+ an underscore_name option and fixes #358734.
+
+Mon Oct 2 15:50:16 2006 Tim Janik <timj@gtk.org>
+
+ * gvalue.c (g_value_peek_pointer): reverted a change to have an
+ assert instead of a g_return_val_if_fail() here. libraries (and
+ programs) should only ever g_assert or g_error if there is no way
+ to carry on with the current program state. that's clearly not
+ the case here.
+
+ * ChangeLog: added missing changelog entry for 2003-12-30.
+
+Sat Sep 30 2006 Matthias Clasen <mclasen@redhat.com>
+
+ * pltcheck.sh: Script to check PLT entries.
+
+ * Makefile.am (TESTS): Run pltcheck.sh
+
+ * gtype.c:
+ * gsignal.c:
+ * gobject.c:
+ * gvaluetypes.c: Move all includes before gobjectalias.h.
+ (#3545422, Behdad Esfahbod)
+
+Fri Sep 22 13:41:02 2006 Tim Janik <timj@imendio.com>
+
+ * gtype.h: applied patch from Behdad with slight optimization,
+ fixes #356175.
+
+ * gobjectnotifyqueue.c: fixed include-guard macro name.
+
+Mon Sep 11 12:12:45 2006 Tim Janik <timj@imendio.com>
+
+ * gparam.c (g_param_spec_sink): reimplemented floating flag handling by
+ atomically accessing a reserved GData bit, fixes #330556.
+
+Tue Aug 29 13:27:33 2006 Tim Janik <timj@gtk.org>
+
+ * glib-mkenums.in: fixed to print usage and version info on STDOUT
+ (#322502).
+
+ * gobject.c (g_initially_unowned_init): restore ; after G_DEFINE_TYPE.
+
+2006-08-26 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject.c: Remove ; after G_DEFINE_TYPE. (#351741, Kjartan Maraas)
+
+Wed Aug 23 10:35:32 2006 Tim Janik <timj@gtk.org>
+
+ * gobject.[hc]: changed return value of g_value_dup_object(), fixes #343292.
+
+2006-08-23 Sven Neumann <sven@gimp.org>
+
+ * gobject/glib-genmarshal.[c1]: added new command-line option
+ "--internal" that can be used to let glib-genmarshal generate
+ internal functions using the G_GNUC_INTERNAL attribute (bug #346647).
+
+Wed Aug 16 13:55:08 2006 Tim Janik <timj@imendio.com>
+
+ * gobject.c: conditionally thaw the notify queue after construction,
+ so we don't trigger warnings when trying to thaw an unfrozen singleton.
+
+2006-08-15 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.12.2 ===
+
+2006-08-05 Matthias Clasen <mclasen@redhat.com>
+
+ * gparamspecs.c (g_param_spec_types_init): Don't initialize
+ struct members with function calls. (#349952)
+
+2006-07-22 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.12.1 ===
+
+2006-07-21 Matthias Clasen <mclasen@redhat.com>
+
+ * gtypemodule.c (g_type_module_register_type): Copy the complete
+ value table, not just the first 4 bytes. (#348136, Coverity)
+
+2006-07-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.12.0 ===
+
+2006-06-20 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.4 ===
+
+2006-06-15 Federico Mena Quintero <federico@novell.com>
+
+ * gtype.c (g_type_instance_get_private): Fix the error message so
+ that it mentions the right functions:
+ "g_type_instance_get_private() requires a prior call to
+ g_type_class_add_private()".
+
+2006-06-12 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.3 ===
+
+2006-06-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.2 ===
+
+2006-06-02 Behdad Esfahbod <behdad@gnome.org>
+
+ * gobject/genum.h: Make value_name and value_nick const in structs
+ _GEnumValue and _GFlagValue. (#317793)
+
+Tue May 16 14:01:43 2006 Tim Janik <timj@imendio.com>
+
+ * gtype.h (G_IMPLEMENT_INTERFACE): turn off compiler warnings, #337129.
+
+2006-05-15 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.1 ===
+
+2006-05-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.0 ===
+
+Tue May 2 14:51:03 2006 Tim Janik <timj@gtk.org>
+
+ * gtype.h: split up G_DEFINE_*TYPE macro definitions so C CODE arguments
+ are not passed on to nested macro calls. patch mostly courtesy of Behdad
+ Esfahbod, fixes #337128.
+
+2006-04-23 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject.symbols: Fix a typo.
+
+ * gtype.c: (g_type_register_static_simple): Add a
+ missing return.
+
+ * gtype.h: Silence warnings from G_DEFINE_TYPE.
+
+2006-04-21 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject.symbols:
+ * gtype.[hc]: Add a g_type_register_static_simple
+ variant of g_type_register_static that does not take
+ a relocation-causing GTypeInfo struct, and use it
+ in G_DEFINE_TYPE.
+
+2006-03-07 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.10.1 ===
+
+Tue Mar 7 17:09:07 2006 Tim Janik <timj@gtk.org>
+
+ * gobject.c (g_object_compat_control): added case3 to hand out the
+ original floating flag handler. required by gtk+ >= 2.10.
+
+2006-02-24 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.10.0 ===
+
+2006-02-10 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.6 ===
+
+2006-01-29 Matthias Clasen <mclasen@redhat.com>
+
+ * gclosure.c: Remove C++ comment.
+
+2006-01-27 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.5 ===
+
+2006-01-18 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.4 ===
+
+2006-01-18 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject.h: Make g_object_compat_control() visible
+ for GTK+ compilation, to avoid segfaults on 64bit
+ platforms.
+
+2006-01-16 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.3 ===
+
+2006-01-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.2 ===
+
+2006-01-04 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject.symbols: Add g_initially_unowned_get_type.
+
+2005-12-30 Matthias Clasen <mclasen@redhat.com>
+
+ * gsignal.c: Remove the handler trash stack, which
+ is now unused.
+ (g_signal_init): Remove the restriction that HandlerMatch
+ must be the same size as GList, and obsolete comments
+ referring to mem chunks.
+
+2005-12-24 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject.symbols: Add new functions.
+
+Thu Dec 22 18:53:14 2005 Tim Janik <timj@gtk.org>
+
+ * gobject.[hc]: renamed GUnowned to GInitiallyUnowned.
+
+Thu Dec 22 14:59:24 2005 Tim Janik <timj@imendio.com>
+
+ * gvaluetypes.[hc]: implemented G_TYPE_GTPYE. applied patch
+ from matthias which implements GType accessors for GValue.
+
+ * gparamspecs.[hc]: applied patch from matthias which
+ implements G_TYPE_PARAM_GTYPE.
+
+ * gobject.[hc]:
+ GUnowned: introduced a new object type that has an initially
+ floating reference.
+ g_object_compat_control(): allow setting of a floating flag handler.
+
+2005-12-09 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.1 ===
+
+2005-12-05 Matthias Clasen <mclasen@redhat.com>
+
+ * genums.h (G_FLAGS_CLASS_TYPE_NAME): Use G_FLAGS_CLASS_TYPE.
+ (#323273, Kalle Vahlman)
+
+Thu Dec 1 12:53:26 2005 Tim Janik <timj@imendio.com>
+
+ * gtype.c: use g_slic_* for all object allocations.
+
+2005-11-28 Matthias Clasen <mclasen@redhat.com>
+
+ * gobjectnotifyqueue.c (g_object_notify_queue_thaw):
+ * gobject-query.c (main): Silence compiler warnings.
+
+ * glib-genmarshal.c (main): Use G_N_ELEMENTS.
+
+2005-11-27 Matthias Clasen <mclasen@redhat.com>
+
+ * gboxed.h: Declare g_hash_table_get_type.
+
+Wed Nov 23 18:01:46 2005 Tim Janik <timj@imendio.com>
+
+ * gobject.[hc]: added floating reference count.
+ g_object_is_floating():
+ g_object_ref_sink(): new functions to deal with floating references.
+ g_object_force_floating(): new funciton for object implementations
+ to set the floating flag.
+
+ * gobject.c (g_object_init): make objects initially floating.
+
+Wed Nov 23 17:58:13 2005 Tim Janik <timj@gtk.org>
+
+ * gparam.[hc]: added g_param_spec_ref_sink().
+
+Wed Nov 23 13:36:02 2005 Tim Janik <timj@gtk.org>
+
+ * gboxed.[hc]: minor cleanups, implemented G_TYPE_HASH_TABLE.
+
+2005-11-17 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.0 ===
+
+2005-11-17 Matthias Clasen <mclasen@redhat.com>
+
+ * glib-genmarshal.c: const correctness fixes, found
+ by Arjan van de Ven and gcc.
+
+Tue Nov 1 17:07:43 2005 Tim Janik <timj@imendio.com>
+
+ * gsignal.c: allocate signal handlers and handler match structures
+ via the new g_slice_*() API (get's rid of GList allocation hack).
+
+ * gtype.c: got rid of per-type memchunks. if GTypeInfo.n_preallocs
+ is > 0, objects are allocated via g_slice_*() instead of g_malloc().
+
+2005-10-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib-mkenums.in: Really fix #314890.
+
+2005-09-28 Michael Natterer <mitch@gimp.org>
+
+ * gtype.h (G_IMPLEMENT_INTERFACE): revert last change, it breaks
+ all users of G_IMPLEMENT_INTERFACE() inside
+ G_DEFINE_TYPE_WITH_CODE(), since apparently GCC doesn't like
+ commas enclosed in {}, not (), in nested macro calls.
+
+2005-09-26 DindinX <dindinx@gimp.org>
+
+ * gobject/gtype.h: initialize all the fields of GInterfaceInfo in the
+ G_IMPLEMENT_INTERFACE macro, to shut up a warning when compiling at -W
+
+2005-09-26 Matthias Clasen <mclasen@redhat.com>
+
+ * glib-mkenums.in: Don't hang on '{' following a trigraph comment
+ in the same line. (#314890, Mathias Hasselmann)
+
+Thu Sep 22 12:42:12 2005 Tim Janik <timj@gtk.org>
+
+ * gparam.c (g_param_spec_internal): fix pspec->name assignment which
+ needs to be strdup()ed for non G_PARAM_STATIC_NAME pspecs. this fixes
+ recently introduced crashes during plugin unloading.
+ also, ensure that static pspec names are canonicalized.
+
+ * gsignal.h: reverted last change from matthias, we don't guarantee
+ that type ids aren't mangled with G_SIGNAL_TYPE_STATIC_SCOPE anywhere.
+
+2005-09-20 Matthias Clasen <mclasen@redhat.com>
+
+ * gsignal.h (struct _GSignalQuery): Remove the misleading comment
+ about G_SIGNAL_TYPE_STATIC_SCOPE, since we don't allow that
+ on return types.
+
+2005-09-08 Kjartan Maraas <kmaraas@gnome.org>
+
+ * gclosure.c: (g_closure_set_meta_marshal): Remove some unused
+ code.
+ * gsignal.c: (g_signal_emitv): Same here
+ * gtype.c: (g_type_register_fundamental): And here
+ * testgobject.c: Mark some functions static.
+
+2005-09-05 Matthias Clasen <mclasen@redhat.com>
+
+ * gsignal.c (struct _SignalNode): Make the name field const.
+ (g_signal_newv): Don't keep an unnecessary extra copy of the
+ signal name around, and don't forget to free the name if
+ an existing node is reused.
+
+2005-08-31 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject.c (g_object_do_class_init): Intern the signal name.
+
+ * gparam.c (g_param_spec_internal): Intern the name here,
+ since we need the quark anyway when sending change notification.
+
+ * gboxed.c:
+ * gparamspecs.c:
+ * gtype.c (g_type_init_with_debug_flags): Intern type name
+ before registering the types.
+
+ * gtype.h (G_DEFINE_TYPE_EXTENDED): Intern type name
+ before registering the type.
+
+ * gvaluetypes.c (g_value_types_init):
+ * gtypeplugin.c (g_type_plugin_get_type):
+ * gtypemodule.c (g_type_module_get_type):
+ * gparam.c (g_param_type_init):
+ * gobject.c (g_object_type_init):
+ * genums.c (g_enum_types_init):
+ * gboxed.c (g_boxed_type_init): Intern type names
+ before registering the type to avoid unnecessary
+ copies.
+
+2005-08-23 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.8.1 ===
+
+2005-08-12 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.8.0 ===
+
+2005-08-09 Matthias Clasen <mclasen@redhat.com>
+
+ * gvaluetransform.c: Access enum and flags
+ values as v_long/v_ulong, not v_int/v_uint,
+ to make value transformation of such types
+ work on bigendian 64bit machines. (#312485,
+ Michael Lorenz)
+
+2005-08-05 Matthias Clasen <mclasen@redhat.com>
+
+ * abicheck.sh: Also check exported variables
+
+ * === Released 2.7.7 ===
+
+2005-08-03 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.6 ===
+
+2005-08-02 Matthias Clasen <mclasen@redhat.com>
+
+ * gclosure.c (union ClosureInt): Mark the vint member as
+ volatile, which seems to be necessary to make atomic operations
+ work on s390.
+
+ * === Released 2.7.5 ===
+
+Mon Aug 1 23:00:42 2005 Tim Janik <timj@imendio.com>
+
+ * gclosure.c: turned all modifications to the first 32 integer bits in a
+ closure into atomic accesses. wrapped write accesses into special macros
+ to keep the atomic modification logic in a single place. comment cleanups.
+
+ * gclosure.h: made all atomicly accessed closure fields volatile.
+
+ * gobject.h: made ref_count field volatile.
+
+Sun Jul 31 02:04:23 2005 Tim Janik <timj@gtk.org>
+
+ * gobject.c: use g_datalist_set_flags() and g_datalist_unset_flags() to
+ allow proper locking around &qdata modifications.
+
+Sat Jul 30 21:10:26 2005 Tim Janik <timj@gtk.org>
+
+ * gobject.c: reverted notify_mutex introduction, since this prevents
+ parallelized setting of object properties on different objects, and
+ serves no apparent purpose (to me at least).
+ g_object_real_dispose(): removed non-atomic reference count
+ modifications.
+ g_object_unref(): make sure the closures array is destroyed when
+ destroying signal handlers.
+
+ * gparam.c: cosmetic changes.
+
+ * gsignal.c: comment fixup. allow 16bit blocking count.
+
+ * gsignal.c: reverted GClosure related changes.
+
+ * gclosure.c: reverted premature commit of atomic reference
+ counting attempt.
+
+2005-07-21 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.4 ===
+
+2005-07-15 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.3 ===
+
+2005-07-15 Matthias Clasen <mclasen@redhat.com>
+
+ Make refcounting threadsafe by using atomic
+ operations. (#166020, Wim Taymans)
+
+ * gobject.c: Use a recursive lock to protect the
+ notify queue.
+ (g_object_unref): Get rid of g_object_last_unref and
+ do the last unref handling in g_object_unref.
+ (g_object_ref, g_object_unref): Use atomic operations.
+
+ * gsignal.c (struct _HandlerMatch): Use a full integer
+ for the ref_count field.
+ (handler_ref, handler_unref_R): Use atomic operations.
+
+ * gparam.c (g_param_spec_ref, g_param_spec_unref):
+ Use atomic operations instead of a lock to make the
+ refcounting threadsafe.
+
+ * gclosure.c (g_closure_ref, g_closure_unref): Use atomic
+ operations. This is more complicated here, since the
+ refcount is stored in a bitfield, so we also have
+ to access all other bitfield members atomically.
+
+ * gsignal.c (handlers_find): Read the meta_marshal flag
+ of the closure atomically.
+
+2005-07-11 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject.h:
+ * gobject.symbols: Remove G_GNUC_NULL_TERMINATED from
+ g_object_new again, since that makes gcc warn on calls of
+ the form g_object_new (some_type, NULL)
+
+2005-07-09 Tor Lillqvist <tml@novell.com>
+
+ * Makefile.am: Don't use the scripts in build/win32 to compile
+ gobject.rc into a resource object file. (This means we lose the
+ build number increment magic, but I doubt it was that useful
+ anyway.) Instead use windres directly. To pass the normal .o file
+ produced by windres through libtool, which wants .lo files, pass
+ it directly to the linker using a -Wl option.
+
+ * gobject.rc.in: Thus replace BUILDNUMBER with 0.
+
+2005-07-08 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.2 ===
+
+2005-06-30 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.1 ===
+
+2005-06-26 Tor Lillqvist <tml@novell.com>
+
+ * Makefile.am: libtool installs/uninstalls the import library, no
+ need to do it ourselves. Do still install/uninstall the .def file,
+ though.
+
+2005-06-24 Tor Lillqvist <tml@novell.com>
+
+ * Makefile.am (install-libtool-import-lib): Current GNU tools do
+ understand the PRIVATE keyword.
+
+2005-06-19 Matthias Clasen <mclasen@redhat.com>
+
+ * gparam.h (GParamFlags): Avoid a warning. (#308295,
+ Murray Cumming).
+
+2005-06-13 Matthias Clasen <mclasen@redhat.com>
+
+ * gparam.h (GParamFlags): Re-add G_PARAM_PRIVATE as a
+ deprecated name for bit 5, since some language bindings
+ have it bound.
+
+2005-06-10 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.0 ===
+
+2005-05-20 Matthias Clasen <mclasen@redhat.com>
+
+ * gvaluetypes.c (g_value_set_string): dup the new value
+ before freeing the old, just in case. (#172142, Morten
+ Welinder)
+
+2005-05-13 Matthias Clasen <mclasen@redhat.com>
+
+ * glib-genmarshal.1: Mention 64bit integer types.
+
+2005-05-05 Owen Taylor <otaylor@redhat.com>
+
+ * gobject.[ch] gobject.symbols: Add
+ g_object_add/remove_toggle_ref() functions to get notification
+ when a reference count is the last remaining reference; this
+ enables better memory management for language bindings.
+ (http://mail.gnome.org/archives/gtk-devel-list/2005-April/msg00095.html)
+
+2005-04-29 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject.symbols:
+ * gboxed.h (G_TYPE_DATE):
+ * gboxed.c: Add a boxed type for GDate. (#301787, Tim-Philipp
+ Müller)
+
+2005-03-25 Matthias Clasen <mclasen@redhat.com>
+
+ * gparam.c (param_spec_ht_lookup): Don't do the second
+ lookup if the name was already canonical. (#171502, Morten
+ Welinder)
+
+Tue Mar 22 14:15:23 2005 Manish Singh <yosh@gimp.org>
+
+ * gparam.c (g_param_spec_internal): cast away any constness on
+ assignment.
+
+2005-03-21 Matthias Clasen <mclasen@redhat.com>
+
+ * glib-mkenums.in: Avoid forcing extra newlines when using
+ template files. (#171005)
+
+2005-03-20 Matthias Clasen <mclasen@redhat.com>
+
+ * gparam.c (g_param_spec_internal): Don't copy strings
+ which are marked as static. Don't allow non-canonical static
+ names.
+
+ * gparam.h (GParamFlags): Add G_PARAM_STATIC_{NAME,NICK,BLURB}
+ flags. (#160655, Ben Maurer)
+
+2005-03-18 Hans Breuer <hans@breuer.org>
+
+ * makefile.msc.in : handle gobjectaliasdef.c
+
+2005-03-14 Matthias Clasen <mclasen@redhat.com>
+
+ Make PLT-reduction work with gcc4, and don't include
+ everything in gobjectalias.h:
+
+ * gobject.symbols: Group symbols by header and source
+ file.
+ * makegobjectalias.pl: Protect definitions by the same
+ preprocessor symbols used to guard the headers. Move
+ the alias declarations to a separate file which is
+ produced when calling makegalias.pl -def
+ * Makefile.am (gobjectaliasdef.c): Add a rule to
+ build this file.
+ * *.c: Include gobjectalias.h after the other i
+ GLib headers, include gobjectaliasdef.c at the bottom.
+
+2005-03-08 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject.symbols: Add the new attributes here, too.
+
+ * gobject.h: Use G_GNUC_NULL_TERMINATED where
+ appropriate. (#164706, Marc Meissner)
+
+ * gvaluearray.h: Small cleanup (use G_BEGIN/END_DECLS).
+ (#168474, Fabricio Barros Cabral)
+
+2005-02-24 Tor Lillqvist <tml@novell.com>
+
+ * Makefile.am (EXTRA_DIST): Don't distribute
+ gobject.def. (#167496, J. Ali Harlow)
+
+Sun Feb 6 22:00:46 2005 Manish Singh <yosh@gimp.org>
+
+ * abicheck.sh: feed the contents of config.h and glibconfig.h
+ into the preprocessor, since glib.symbols could need #defines
+ from them.
+
+2005-01-12 Matthias Clasen <mclasen@redhat.com>
+
+ Cosmetic fixes (#163792, Benoît Carpentier):
+
+ * gobject-query.c (main): Remove duplicate lines.
+
+ * gvaluetransform.c: Remove duplicate definitions of
+ value_transform_[u]int64_[u]int64.
+
+2005-01-07 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.6.1 ===
+
+2004-12-27 Matthias Clasen <mclasen@redhat.com>
+
+ * Makefile.am: Only check the ABI on linux, since
+ the shell script is not portable. (#161734, Adrian Bunk)
+
+2004-12-16 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.6.0 ===
+
+2004-12-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.7 ===
+
+2004-11-30 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am (gobject.def): gcc -E complains "linker input file
+ unused because linking not done" if told to preprocess the
+ gobject.symbols file. Use '-' and redirection to pass it as
+ standard input instead.
+
+Sun Nov 28 13:21:12 2004 Manish Singh <yosh@gimp.org>
+
+ * abicheck.sh: filter G_GNUC before PRIVATE so $ is still true.
+
+Sun Nov 28 01:37:54 2004 <timj@birnet.org>
+
+ * gsignal.c: applied patch by sven@gimp.org (#153727) to reduce
+ signal connection complexity from O(n_handlers) to O(1).
+
+Thu Nov 25 14:09:41 2004 Manish Singh <yosh@gimp.org>
+
+ * abicheck.sh: filter out G_GNUC stuff when doing the compare.
+
+2004-11-23 Matthias Clasen <mclasen@redhat.com>
+
+ * gobject.symbols: Typo fix.
+
+ Fix a problem with the PLT reduction changes which caused the
+ internal aliases to lose all attributes.
+
+ * gobject.symbols: Add attribute annotations.
+ * makegobjectalias.pl: Keep attribute annotations, but strip PRIVATE.
+ * Makefile.am (gobject.def): Strip attribute annotations, but keep
+ PRIVATE.
+
+ * gtypemodule.h (g_type_module_get_type): Mark as const,
+ like all other get_type() functions.
+
+2004-11-12 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.6 ===
+
+Mon Nov 8 10:47:41 2004 Manish Singh <yosh@gimp.org>
+
+ * gobject/gsourceclosure.c: removed wrap_g_io_channel_ref() hack,
+ since g_io_channel_ref() has a compatible API now.
+
+2004-11-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.5 ===
+
+2004-10-27 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.4 ===
+
+2004-10-27 Matthias Clasen <mclasen@redhat.com>
+
+ * abicheck.sh: Strip Win32 specific defs file syntax.
+
+ * Makefile.am (gobjectalias.h): Fix srcdir != builddir
+ builds. (#156447, Thomas Fitzsimmons)
+
+2004-10-26 Matthias Clasen <mclasen@redhat.com>
+
+ * abicheck.sh: Don't include symbols which are just in the
+ symbols list for .defs file compatibility.
+
+2004-10-23 Matthias Clasen <mclasen@redhat.com>
+
+ * gtype.h (GTypeInterfaceCheckFunc): Rename first parameter to
+ check_data, since apparently the system headers on AIX leak a
+ macro named func_data. (#155178, Andrea Campi)
+
+Wed Oct 6 02:12:44 2004 <timj@birnet.org>
+
+ * gtype.c (g_type_instance_get_private): applied patch from Jean-Yves
+ Lefort <jylefort@brutele.be> to not access the instance_real_class_bsa
+ pointer without holding the instance_real_class lock.
+
+2004-10-04 Matthias Clasen <mclasen@redhat.com>
+
+ * gsignal.c (g_signal_add_emission_hook): Improve the warning
+ if G_SIGNAL_NO_HOOKS is set. (#154299, Nickolay V. Shmyrev)
+
+2004-09-22 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am (install-libtool-import-lib): [Win32] Add code to
+ remove the bug-compatibility entries (see #134813, and related
+ comments below) from the import library. The PRIVATE keyword in
+ the .def file is supposed to mean that, but it isn't implemented
+ yet by GNU ld.
+
+ * makegobjectalias.pl: In case the symbol is followed by some
+ stuff ("PRIVATE") that's intended for the .def file, use just the
+ actual symbol.
+
+ * gobject.symbols: For binary bug compatibility on Win32, add the
+ g_slist_remove_all and g_unichar_validate symbols inside #ifdef
+ INCLUDE_INTERNAL_SYMBOLS. (See #134813 and log entries from March
+ below.)
+
+2004-09-18 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.3 ===
+
+Thu Sep 16 18:42:46 2004 Manish Singh <yosh@gimp.org>
+
+ * abicheck.sh: don't hardcode lengths for cut, instead split on
+ the third field.
+
+2004-09-16 Matthias Clasen <mclasen@redhat.com>
+
+ Implement the same PLT reduction technique used in GTK+:
+
+ * Makefile.am: Generate gobjectalias.h from gobject.symbols.
+ (BUILT_SOURCES): Add gobjectalias.h.
+
+ * makegobjectalias.pl: Script to generate gobjectalias.h.
+
+ * *.c: Include gobjectalias.h
+
+2004-09-16 Matthias Clasen <mclasen@redhat.com>
+
+ Add ABI control using the same technique that is used in GTK+.
+
+ * gobject.symbols: Master list of symbols.
+
+ * gobject.def: Removed. It is now generated from gobject.symbols.
+
+ * Makefile.am: Generate gobject.def from gobject.symbols.
+ (TESTS): Add abicheck.sh
+ (EXTRA_DIST): Add abicheck.sh
+ (export_symbols): Don't export _-prefixed symbols.
+
+ * gtype.h:
+ * gtype.c: Move the declarations of the various _init() functions
+ to the header, and mark them as G_GNUC_INTERNAL.
+
+2004-08-25 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.2 ===
+
+2004-08-01 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.1 ===
+
+2004-07-28 Matthias Clasen <mclasen@redhat.com>
+
+ * gtype.c (g_type_instance_get_private): Catch cases of
+ forgotten g_type_add_private(). (#148368, Tommi Komulainen)
+
+2004-07-21 Matthias Clasen <mclasen@redhat.com>
+
+ * glib-genmarshal.c (put_marshal_value_getters): Use the
+ correct fields for enums and flags. (#145015, Tommi Komulainen)
+
+Sun Jul 18 18:03:08 2004 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * === Released 2.5.0 ===
+
+2004-07-12 Matthias Clasen <mclasen@redhat.com>
+
+ * gsignal.c (g_signal_handler_is_connected): Don't
+ choke on a zero handler_id.
+
+Tue Jul 6 00:46:43 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gtypemodule.h:
+ * gtypemodule.c: Fix the declarations of the new
+ functions to return GType, not void.
+ Also add missing includes. (#145508, Morten Welinder)
+
+Tue Jul 6 00:46:43 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gtypemodule.h:
+ * gtypemodule.c (g_type_module_register_flags):
+ * gtypemodule.c (g_type_module_register_enum): New
+ functions to register enum and flags types from a
+ GTypeModule. (#145396, Sven Neumann)
+
+Wed Jun 23 12:55:34 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gtype.h (G_DEFINE_TYPE_EXTENDED): Add an initializer for
+ the g_define_type_info.value_table. (#144678, Mariano
+ Suárez-Alvarez)
+
+Tue Jun 22 21:50:47 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gsignal.c: Fix a couple of typos.
+
+Fri Jun 18 22:53:13 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gsourceclosure.h (__G_SOURCECLOSURE_H__): Actually
+ define the guard after checking for it. (#108038,
+ Morten Welinder)
+
+2004-04-30 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.4.1 ===
+
+2004-04-22 Matthias Clasen <mclasen@redhat.com>
+
+ * glib-mkenums.in: Actually convert escape chars in
+ --vprod. (#139058, Christophe Saout)
+
+2004-04-15 Matthias Clasen <mclasen@redhat.com>
+
+ * gparamspecs.c (param_float_init): Correct the initial
+ minimal value to be -G_MAXFLOAT. The initial values were
+ inconsistant before, with the initial default being smaller
+ than the inital minimum.
+ (param_double_init): Correct the initial minimal value
+ to be -G_MAXDOUBLE.
+
+Tue Mar 9 09:16:11 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.4.0 ===
+
+2004-03-10 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Mark the two entries that shouldn't be in the
+ import library (see below) as PRIVATE.
+
+Tue Mar 9 09:16:11 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.3.6 ===
+
+2004-03-04 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Another of the glib DLL's functions was erronously
+ present in the stable branch's gobject.def: g_unichar_validate,
+ and nobody noticed until too late. Thus there are applications
+ deployed that expect it to be found in the gobject DLL, and to
+ keep ABI compatibility, we must keep it there forever. Argh.
+
+Mon Mar 1 16:49:51 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.3.5 ===
+
+2004-03-01 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Add g_slist_remove_all back for ABI
+ compatibility. That entry point actually is in the glib DLL, but
+ it was at some time many years ago by mistake added to
+ gobject.def. Thus there presumably are executables out there that
+ expect it to be exported from the gobject DLL. We don't want to
+ break those. (#134813, J. Ali Harlow)
+
+Fri Feb 27 01:49:22 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib-mkenums.in: Support parsing of intializers containing
+ macros with arguments. (#129717)
+
+2003-02-28 Hans Breuer <hans@breuer.org>
+
+ * gobject.def : added g_strv_get_type
+
+Tue Feb 24 14:09:21 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.3.3 ===
+
+Fri Feb 20 02:44:54 2004 Tim Janik <timj@gtk.org>
+
+ * gtype.h (G_DEFINE_TYPE_EXTENDED): added (GTypeFlags) cast needed by C++.
+
+Tue Feb 3 21:24:01 2004 Tim Janik <timj@gtk.org>
+
+ * gtype.h (_G_TYPE_CVH): provide a short-cut version for
+ this macro in case value->g_type==checked_type for gcc, similar
+ to instance and class check short-cuts. this speeds up code that
+ makes frequent use of G_VALUE_HOLDS_*() (e.g. setters/getters).
+
+ * gtype.c (type_data_last_unref_Wm): don't call class-cache functions
+ for the uncached case, this rendered g_type_class_unref_uncached()
+ useless. pointed out by Stefan Westerfeld.
+
+Sat Jan 24 18:20:13 2004 Tim Janik <timj@gtk.org>
+
+ * gtype.h: prefixed the parent_class variable defined by G_DEFINE_TYPE()
+ with type_name. removed type_parent_class argument
+ from G_DEFINE_TYPE_EXTENDED().
+
+2004-01-24 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Add a missing entry.
+
+Sun Jan 11 15:34:35 2004 Manish Singh <yosh@gimp.org>
+
+ * gsourceclosure.c: wrap g_io_channel_ref in a function that returns
+ the passed in GIOChannel, so we aren't abusing GBoxedCopyFunc
+ semantics. Fixes bug #131076.
+
+Sat Jan 10 23:55:42 2004 Matthias Clasen <maclas@gmx.de>
+
+ * glib-mkenums.1: Document the lowercase_name trigraph option.
+
+Sat Jan 10 02:43:20 2004 Tim Janik <timj@gtk.org>
+
+ * gtype.h: made G_DEFINE_TYPE_INTERNAL() public by renaming it to
+ G_DEFINE_TYPE_EXTENDED() and moving it into the appropriate section.
+
+Fri Jan 9 23:41:00 2004 Matthias Clasen <maclas@gmx.de>
+
+ * gboxed.h:
+ * gboxed.c (g_strv_get_type): Add a boxed type for nul-terminated
+ string arrays. (#110528)
+
+Fri Jan 9 15:34:15 2004 Tim Janik <timj@gtk.org>
+
+ * gtype.h: added convenience macros G_IMPLEMENT_INTERFACE() and
+ G_DEFINE_TYPE() plus variants.
+
+2003-12-30 Murray Cumming <murrayc@usa.net>
+
+ * gobject/glib-mkenums.in: Added a lowercase_name option, to be used
+ next to the enum declaration, where the flag option is already used,
+ when it is not possible to guess where to put the underscores in the
+ _get_type() function name, for instance for GNOMEVFSURIHide.
+
+Fri Dec 26 01:34:01 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gtype.c (g_type_class_peek_parent): Don't acquire a read lock
+ here. (#106433, Owen Taylor)
+
+Wed Dec 17 23:29:17 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gvalue.c (g_value_peek_pointer): Use g_assert() instead of
+ g_return_val_if_fail(), suggested by Sheldon Simms.
+
+2003-12-13 Hans Breuer <hans@breuer.org>
+
+ gobject.def : update externals
+
+Sat Nov 29 14:57:20 2003 Tim Janik <timj@gtk.org>
+
+ * gobject.c: fix g_object_set() within _init() implementations
+ not working for construct-only properties.
+ (g_object_init): make the object enter a construct_objects list.
+ (g_object_newv): remove object from construct_objects after creation.
+ (g_object_set_valist):
+ (g_object_set_property): allow construct-only properties for
+ objects which are in construct_objects.
+
+Thu Nov 27 17:53:52 2003 Tim Janik <timj@gtk.org>
+
+ * gtype.[hc]:
+ (g_type_class_peek_static): variant of class_peek() which works for
+ static types only.
+
+ * gobject.c:
+ (g_object_do_class_init): make ::notify a run-action signal.
+ (g_object_newv): use g_type_class_peek_static() by default to
+ speed up common code path (trades two write-locks for one read-lock).
+ (g_object_disconnect):
+ (g_object_connect): allow signal specification words to be
+ seperated by '-'.
+ (g_object_set_valist):
+ (g_object_new_valist): don't leak values.
+ (g_object_get_property): check property for readability.
+ (g_object_set_property): check property for writability and to
+ not be construct-only.
+ (g_object_set_valist): check property to not be construct-only.
+
+Sat Oct 25 01:09:17 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gparam.h (struct _GParamSpecClass): Add /*< private >*/
+ marker for documentation purposes.
+
+Tue Oct 21 23:17:06 2003 Matthias Clasen <maclas@gmx.de>
+
+ * genums.h (struct _GEnumClass):
+ * genums.h (struct _GFlagsClass):
+ * gtypemodule.h (struct _GTypeModuleClass):
+ * gtypemodule.h (struct _GTypeModule): Add /*< public >*/
+ and /*< private >*/ markers for documentation purposes.
+
+Tue Oct 14 17:40:19 2003 Owen Taylor <otaylor@redhat.com>
+
+ * gparamspecs.[ch]: Add a new GParamSpecOverride type
+ that is a pointer to a different paramspec in a parent
+ class or interface.
+
+ * gparam.[ch]: Add g_paramspec_get_redirect_target()
+ which follows GParamSpecOverride to the real property.
+ Make g_param_spec_pool_list() hand redirections,
+ properties on interfaces.
+
+ * gobject.[ch] gobjectnotifyqueue.c: Add
+ g_object_interface_install_property,
+ g_object_interface_find_property,
+ g_object_interface_list_properties(). Redirect virtually all
+ publically exposed GParamSpec's to the redirect target if
+ any. (->constructor is the exception.)
+ (#105894)
+
+Mon Oct 20 22:06:12 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gobject.h (struct _GObjectClass): Add /*< public >*/
+ and /*< private >*/ markers for documentation purposes.
+
+Sat Oct 18 01:24:14 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gtypeplugin.h (struct _GTypePluginClass): Add /*< public >*/
+ and /*< private >*/ markers for documentation purposes.
+
+Thu Oct 2 07:37:12 2003 Tim Janik <timj@gtk.org>
+
+ * gtype.c: fix post class_init interface initialization logic
+ for child types.
+
+Thu Oct 2 01:16:50 2003 Owen Taylor <otaylor@redhat.com>
+
+ * gtype.[ch]: Add g_type_add/remove_interface_check(),
+ which allows inserting a post-interface-initialization
+ check.
+
+ * testgobject.c: Fix a deprecated usage.
+
+Mon Sep 29 10:51:01 2003 Owen Taylor <otaylor@redhat.com>
+
+ * gtype.[ch]: Add g_type_default_interface_ref/peek/unref
+ for accessing the default vtable of an interface.
+
+Fri Sep 26 17:24:53 2003 Owen Taylor <otaylor@redhat.com>
+
+ * gtype.c (g_type_instance_get_private): You can
+ have instance_real_class_bsa be non-NULL, but still
+ the class not be in the bsa. (Found by Kris Rietveld)
+
+2003-09-15 Matthias Clasen <maclas@gmx.de>
+
+ * glib-genmarshal.c (complete_out_arg): Don't generate code
+ using deprecated APIs. (#122292, Christian Persch)
+
+Fri Sep 12 16:31:40 2003 Owen Taylor <otaylor@redhat.com>
+
+ * gsignal.[ch]: Add g_signal_accumulator_true_handled(), to
+ do TRUE-stops-emit signals. (#80487, Ron Steinke)
+
+ * Makefile.am: Move testoverride.c and testifaceinit.c to
+ tests/gobject.
+
+2003-09-12 Matthias Clasen <maclas@gmx.de>
+
+ Make the g_value_set_x_take_ownership() functions "official"
+ part of the API (#100948):
+
+ * gvaluetypes.[hc]: Add g_value_take_string() (synonym to the
+ now deprecated g_value_set_string_take_ownership()).
+
+ * gparam.[hc]: Add g_value_take_param() (synonym to the
+ now deprecated g_value_set_param_take_ownership()).
+
+ * gobject.[hc]: Add g_value_take_object() (synonym to the
+ now deprecated g_value_set_object_take_ownership()).
+
+ * gboxed.[hc]: Add g_value_take_boxed() (synonym to the
+ now deprecated g_value_set_boxed_take_ownership()).
+
+Tue Sep 2 19:37:21 2003 Tim Janik <timj@gtk.org>
+
+ * gtype.[hc]: added support for a "default vtable" per interface,
+ that interface vtables are initialized from.
+ the default vtable is initialized and finalized through class_init,
+ class_finalize and class_data from the interfaces GTypeInfo struct.
+ (type_data_last_unref_Wm): unload child plugin before unreffing
+ parent type.
+
+ testifaceinit.c: minor fixups. fixed up base_init() assertions, since
+ with a default vtable, base_init() may be called multiple times.
+ added default initializer to iface1.
+
+Tue Sep 2 14:53:41 2003 Tim Janik <timj@gtk.org>
+
+ * gobject-query.c (main): fix iterating over fundamental types.
+
+ * gtype.c: applied patch from owen which keeps internal
+ class initialization state to maintain class and interface
+ initialization happen in the order of:
+ 1. class' base_init
+ 2. interface' base_init
+ = interfaces added after here are immediately base_init-ialized
+ 3. class_init
+ 4. Interface_init
+ = interfaces added here are immediately Interface_init-ialized
+
+Wed Aug 27 19:53:26 2003 Manish Singh <yosh@gimp.org>
+
+ * gobject.c: removed stray change from previous commit.
+
+Wed Aug 27 01:25:40 2003 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.am testifaceinit.c: Add a detailed test case
+ for interface initialization, testing the ability to
+ add interfaces during class initialization and the ordering
+ of interface base_init, class init, and interface_init.
+ (Expected to fail at the moment.)
+
+Mon Aug 25 14:51:46 2003 Manish Singh <yosh@gimp.org>
+
+ * gtypemodule.c (g_type_module_register_type): fix typo in last
+ commit, cast to GTypeValueTable * to get rid of const warning.
+
+Mon Aug 25 14:16:48 2003 Owen Taylor <otaylor@redhat.com>
+
+ * gtypemodule.c (g_type_module_register_type): Clarify
+ docs on the return. Fix a memory leak if a type with a
+ value table is reloaded. (#112439, Daniel Yacob)
+
+Tue Aug 19 05:21:04 2003 Tim Janik <timj@gtk.org>
+
+ * testgobject.c (main): check private instance data after
+ initialization.
+
+ * gtype.c: for instances with private data, store the real class
+ pointer in a bsearch array during class initialization.
+ (g_type_instance_get_private): fetch the real class of
+ an instance from the bsearch array if necessary.
+
+Tue Aug 19 04:08:14 2003 Tim Janik <timj@gtk.org>
+
+ * gvalue.c: adapt to new gbsearcharray.h code.
+ (g_value_register_transform_func): turn transform function
+ replacement into a valid operation.
+
+ * gsignal.c: adapt to new gbsearcharray.h code.
+
+ * gboxed.c: adapt to new gbsearcharray.h code.
+
+Tue Aug 19 01:31:28 2003 Tim Janik <timj@gtk.org>
+
+ * gsignal.c: added optimizations to skip NOP signal emissions.
+
+2003-08-08 Matthias Clasen <maclas@gmx.de>
+
+ * gobject.c (object_set_property): Improve the wording of the warning for invalid
+ values. (#117246, Mariano Suarez-Alvarez)
+
+Wed Aug 6 09:57:14 2003 Owen Taylor <otaylor@redhat.com>
+
+ * testgobject.c (test_signal_accumulator): Add check
+ for instance private usage within in instance_init.
+ (Currently will fail.)
+
+2003-07-20 Hans Breuer <hans@breuer.org>
+
+ * gobject.def : updated externals
+
+Tue Jul 8 22:29:31 2003 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * gtype.c (type_class_init_Wm): Only access node->data->instance
+ when the node is instantiable.
+
+Tue Jul 8 14:55:27 2003 Owen Taylor <otaylor@redhat.com>
+
+ * gtype.c (type_class_init_Wm): Initialize
+ node->data->instance.private_size here rather than
+ in type_data_make_W() since the class init for the parent
+ class may have changed pnode->data->instance.private_size.
+ (#116921, reported by Soeren Sandmann)
+
+2003-06-18 Matthias Clasen <maclas@gmx.de>
+
+ * Makefile.am (man_MANS): Removed, these are now installed from
+ docs/reference/gobject.
+
+Fri May 30 14:42:24 2003 Owen Taylor <otaylor@redhat.com>
+
+ * gobject.c (g_value_set_object): Order refs/unrefs
+ so setting the same object back is safe. (#112861,
+ Morten Welinder)
+
+2003-03-24 Sven Neumann <sven@gimp.org>
+
+ * gtype.c (type_data_finalize_class_ifaces_Wm): removed leftover
+ debugging message (bug #109093).
+
+Thu Feb 27 17:33:19 2003 Owen Taylor <otaylor@redhat.com>
+
+ * gtype.[ch] testgobject.c: Add support for instance-private data.
+ g_type_class_add_private(), g_type_instance_get_private(),
+ G_TYPE_INSTANCE_GET_PRIVATE(). (#101959, patch partly by
+ Mark McLoughlin, extensive feedback from Tim Janik.)
+
+2003-03-06 Matthias Clasen <maclas@gmx.de>
+
+ * gsignal.c (g_signal_handlers_block_matched):
+ (g_signal_handlers_unblock_matched):
+ (g_signal_handlers_disconnect_matched): Fix 0/FALSE confusion.
+ (#107662, Morten Welinder)
+
+Mon Feb 17 20:59:47 2003 Tim Janik <timj@gtk.org>
+
+ * gvalue.c (g_value_register_transform_func): don't assert the types
+ passed in to have value tables. this prevents dynamic types from
+ registering transform functions.
+
+Sun Feb 9 13:44:01 2003 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * gboxed.c (boxed_proxy_value_init): remove lookup of unused
+ BoxedNode.
+
+2003-02-07 Matthias Clasen <maclas@gmx.de>
+
+ * gtypemodule.c:
+ * gtype.c:
+ * gsourceclosure.c:
+ * gparamspecs.c:
+ * gparam.c:
+ * gobject.c:
+ * gsignal.c: Remove all docs from gobject at Tims
+ request. Documentation is only for weenies anyway...
+
+2003-01-12 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Add g_type_interface_prerequisites. Thanks to
+ Kenichi SUTO.
+
+2002-12-18 Matthias Clasen <maclas@gmx.de>
+
+ * gobject.c: Add docs.
+
+2002-12-18 Michael Natterer <mitch@gimp.org>
+
+ * gobject/gtype.c (type_data_finalize_class_ifaces_Wm): applied
+ patch I got from Tim Janik for testing which fixes bug #101521.
+ (restart iterating the interface enties each time we finalized one
+ because they might have been modified).
+
+2002-12-17 Matthias Clasen <maclas@gmx.de>
+
+ * gparam.c (g_param_spec_internal): Remove markup from doc
+ comment, as GObject doesn't use --sgml-mode yet.
+
+2002-12-15 Matthias Clasen <maclas@gmx.de>
+
+ * gsignal.c (g_signal_new): Typo fix.
+
+ * gparamspecs.c:
+ * gparam.c (g_param_spec_internal):
+ * gobject.c (g_object_class_install_property): Add docs.
+
+2002-12-13 Matthias Clasen <maclas@gmx.de>
+
+ * glib-genmarshal.c, gobject-query.c: Use g_printf() instead of
+ system printf. (#99319)
+
+Thu Dec 12 15:00:10 2002 Manish Singh <yosh@gimp.org>
+
+ * gvaluetransform.c: use G_G[U]INT64_FORMAT unconditionally,
+ since we'll always have it now.
+
+2002-12-07 Matthias Clasen <maclas@gmx.de>
+
+ * gparam.c (canonalize_key): Rename to canonicalize_key. Adjust
+ all callers.
+
+2002-12-05 Matthias Clasen <maclas@gmx.de>
+
+ * gsignal.c (g_signal_new): Explain allowed signal names in more
+ detail.
+
+2002-12-04 Matthias Clasen <maclas@gmx.de>
+
+ * gsignal.h (g_signal_add_emission_hook):
+ * gtype.h (g_type_interface_get_plugin): Sync parameter names with
+ docs and implementation.
+
+ * gtype.c (g_type_add_interface_dynamic):
+ (g_type_interface_get_plugin):
+ (g_type_interface_peek_parent):
+ (g_type_query): Add docs.
+
+2002-12-03 Matthias Clasen <maclas@gmx.de>
+
+ * gtype.c (g_type_get_qdata):
+ (g_type_set_qdata):
+ (g_type_interface_add_prerequisite): Add docs.
+
+2002-12-02 Matthias Clasen <maclas@gmx.de>
+
+ * gobject.c (g_signal_connect_object): Add docs.
+
+2002-11-30 Matthias Clasen <maclas@gmx.de>
+
+ * gsignal.c: More docs.
+
+2002-11-28 Matthias Clasen <maclas@gmx.de>
+
+ * gtype.c (g_type_interface_prerequisites): Document as 2.2
+ API addition.
+
+Thu Nov 21 16:05:50 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtype.c (g_type_check_instance_cast): Allow
+ NULL to be cast to any type. (Frequently requested,
+ most recently #99023, Lars Clausen.)
+
+Mon Nov 4 14:42:36 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtype.c gsignal.c gvaluearray.c: Include config.h
+ so DISABLE_MEMPOOLS actually has an effect.
+ (#96437, Morten Welinder)
+
+ * gsignal.c: Conditionalize definition of g_handler_ts
+ on DISABLE_MEM_POOLS (#96437)
+
+2002-10-20 Matthias Clasen <maclas@gmx.de>
+
+ * gtype.c (g_type_interface_prerequisites): Report only the most
+ specific instantiatable prerequisite, filter out all supertypes of
+ this one (the supertypes are added to the prerequisites array for
+ technical reasons).
+
+2002-10-16 Matthias Clasen <maclas@gmx.de>
+
+ * glib-mkenums.in: Support for template files.
+
+ * glib-mkenums.1: Document --template.
+
+2002-10-15 Matthias Clasen <maclas@gmx.de>
+
+ * gtype.c (g_type_interface_prerequisites): New function to obtain
+ the prerequisites of an interface type.
+
+Sat Oct 12 22:02:32 2002 Tim Janik <timj@gtk.org>
+
+ * merged up from 2.0:
+
+ * testgobject.c: test creation of new fundamental types.
+
+ * gtype.c (g_type_fundamental_next), (type_node_fundamental_new_W):
+ account for static_fundamental_next storing non-shifted fundamental
+ IDs. this fixes g_type_fundamental_next() not returning a new usable
+ fundamental ID.
+
+Wed Sep 11 16:50:20 2002 Dom Lachowicz <cinamod@hotmail.com>
+
+ * gtype.h: Fix problems with excessive C++ warnings: "ISO C++ forbids nested groups within expressions"
+
+Fri Jul 26 15:46:36 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gvaluetransform.c: Fix problems with excess ';'
+ by addition of strategic 'extern void glib_dummy_decl (void)'
+ (#83272, David L. Cooper II)
+
+Thu Jul 25 20:34:39 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtype.c (g_type_interface_add_prerequisite): When
+ adding ancestral prerequisites, add the grandparents,
+ not the siblings. (Problem found by Jon Trowbridge, patch from
+ Dave Camp, #86879)
+
+2002-07-05 Anders Carlsson <andersca@gnu.org>
+
+ * gobject.c (g_object_base_class_finalize): Remove debugging
+ message, approved by Tim Janik.
+
+2002-06-11 Anders Carlsson <andersca@gnu.org>
+
+ * gtypemodule.c: (g_type_module_complete_interface_info):
+ * gtypeplugin.h:
+ Fix argument order. Fixes #82806.
+
+Mon May 20 15:57:47 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gsignal.c: When printing errors, handle NULL
+ returns from g_type_debug(). (#73559, Laszlo Peter)
+
+ * gtype.c (type_descriptive_name_I): De-inline,
+ since it's only used for debugging.
+
+Tue May 7 15:03:02 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib-genmarshal.c: Fix include order for config.h (#71704,
+ Morten Welinder)
+
+2002-05-07 Michael Natterer <mitch@gimp.org>
+
+ * Makefile.am: use the glib-genmarshal found at configure time
+ if CROSS_COMPILING is set, use the one which was just built
+ otherwise.
+
+Mon May 6 16:06:23 2002 Owen Taylor <otaylor@redhat.com>
+
+ [ merged from stable ]
+
+ * gobject.c: Remove PROPERTIES_CHANGED enumeration
+ value that wasn't used any more. (#78833,
+ Matthias Clasen)
+
+ * gboxed.c (g_boxed_copy): Remove check on data[2]
+ that no longer exists. (#80814, Daniel Elstner)
+
+Tue Mar 26 15:21:47 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gsignal.h (g_signal_handlers_*_by_func): Add explicit
+ cast of G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA to
+ GSignalMatchType so that these macros work for C++.
+ (#76454, Damien Sandras)
+
+Mon Mar 25 17:51:05 2002 Owen Taylor <otaylor@redhat.com>
+
+ * glib-mkenums.in (parse_entries): Fix various bugs and
+ excessive stack usage that crept in the conversion from
+ gtk-mkenums. (#74431)
+
+Mon Mar 25 17:25:57 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtype.c (g_type_free_instance): Wrap setting freed instance
+ memory to 0xaa in #ifdef G_ENABLE_DEBUG
+
+Thu Mar 21 01:28:14 2002 Tim Janik <timj@gtk.org>
+
+ * gsignal.[hc]:
+ * gobject.[hc]: fix extraneous include.
+
+Tue Mar 19 18:57:12 2002 Tim Janik <timj@gtk.org>
+
+ * gtype.c (check_add_interface_L): applied patch from Matthias Clasen
+ <maclas@gmx.de> to check for prerequisite of interfaces, fixes #74427.
+ fixed mutex recursion in his patch (we can't call g_type_is_a() while
+ holding a read lock).
+
+ * gparam.c (canonalize_key): cleanup.
+
+2002-03-13 Alexander Larsson <alla@lysator.liu.se>
+
+ * gparam.c (canonalize_key):
+ Function to canonicalize parameter names. Faster than
+ using g_strcanon().
+ (g_param_spec_internal, param_spec_ht_lookup):
+ Use canonalize_key.
+
+2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
+ * gobject/gclosure.c
+ * gobject/gobject.c
+ * gobject/gsignal.c: fixed cast problems with function pointer
+ to avoid warnings (with forte compiler) (#73898)
+
+2002-03-05 Sven Neumann <sven@gimp.org>
+
+ * gvaluetransform.c (g_value_transforms_init): don't try to
+ register undeclared value transform functions if G_GINT64_FORMAT
+ or G_GUINT64_FORMAT are undefined (#73586).
+
+2002-03-03 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.msc.in
+ * makefile.mingw.in: Rename testgruntime to testgobject here, too.
+
+Sun Mar 3 04:11:58 2002 Tim Janik <timj@gtk.org>
+
+ * gobject.c: placed a comment about not changing CArray until we have
+ g_object_list_watched_closures().
+
+ * gparam.h (struct _GParamSpecClass): added padding.
+
+ * gobjectnotifyqueue.c (struct _GObjectNotifyQueue): abuse
+ g_list_alloc() to allocate GObjectNotifyQueue to et rid
+ of locking issues.
+
+Tue Feb 26 10:51:00 2002 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.am (testgobject_LDADD): Rename testgruntime
+ to testgobject.
+
+Sun Feb 24 22:08:29 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtypemodule.[ch] (g_type_module_add_interface): Make
+ GInterfaceInfo paramter const to correspond to the
+ conventions for the g_type_add_interface() functions.
+ (#72461, Miroslaw Dobrzanski-Neumann)
+
+Sat Feb 23 13:28:56 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtypeplugin.h (struct _GTypePluginClass): Add some
+ padding to the class.
+
+ * gclosure.h (struct _GClosure): Fix typo in comment.
+
+2002-02-20 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Add g_value_set_object_take_ownership and
+ g_value_set_param_take_ownership.
+
+Wed Feb 20 22:55:15 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gobject.c: Fix implicit conversions between void * and
+ function pointer (Miroslaw Dobrzanski-Neumann, #71963)
+
+Sun Feb 16 22:08:48 2002 Tim Janik <timj@gtk.org>
+
+ * gobject.[hc]:
+ * gparam.[hc]: provide marshaller specific value_set_*_take_ownership()
+ variants.
+
+ * gvalue.h: shrink GValue's data contents to 2 unions.
+
+ * glib-genmarshal.c: fix release and realeas_check hackage by always
+ using _take_ownership() variants. directly access value contents if
+ G_ENABLE_DEBUG is not defined.
+
+ * gobject.h: add padding pointers to the class struct.
+
+Wed Feb 13 17:22:37 2002 Tim Janik <timj@gtk.org>
+
+ * gtype.c (g_type_value_table_peek): fixed a check for node not being NULL.
+
+Wed Feb 13 06:53:50 2002 Tim Janik <timj@gtk.org>
+
+ * gparam.c: remove extraneous redefinition of G_PARAM_SPEC_CLASS().
+
+Wed Feb 13 06:29:51 2002 Tim Janik <timj@gtk.org>
+
+ * gvaluetransform.c: cosmetic cleanups, fixed [u]int64->string
+ conversions.
+
+ * ChangeLog: added entry from owen which went into the wrong
+ file.
+
+Fri Feb 8 23:52:27 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/gvaluetransform.c: Register transformations for
+ gint64, guint64. (#70780, patch from Andy Wingo)
+
+2002-02-10 Hans Breuer <hans@breuer.org>
+
+ * gvaluetransform.c : msvc 5.0 can't cast from uint64 to
+ double. Disable respective transform_func than.
+
+ * makefile.msc.in : build test programs
+
+Thu Jan 24 07:39:56 2002 Tim Janik <timj@gtk.org>
+
+ * gobject.c (g_signal_connect_object): return gulong instead
+ of guint.
+
+Fri Jan 11 12:26:36 2002 Tim Janik <timj@gtk.org>
+
+ * gparamspecs.c: fixed param_value_array_values_cmp(),
+ param_value_array_validate() and
+ param_value_array_set_default() to deal with NULL value
+ arrays.
+
+Wed Jan 9 05:23:27 2002 Tim Janik <timj@gtk.org>
+
+ * gobject.h (G_OBJECT_WARN_INVALID_PROPERTY_ID): cosmetic fix.
+
+2002-01-05 Hans Breuer <hans@breuer.org>
+
+ * makefile.msc.in : use -FImsvc_recommended_pragmas.h
+
+Fri Jan 4 04:36:46 2002 Tim Janik <timj@gtk.org>
+
+ * gtype.h (G_TYPE_FLAG_RESERVED_ID_BIT): turn this into a GType,
+ so negating it works on 64bit platforms.
+
+2001-12-21 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Add g_signal_get_invocation_hint.
+
+Tue Dec 18 21:39:57 2001 Tim Janik <timj@gtk.org>
+
+ * testoverride.c: added some assertions to test
+ g_signal_get_invocation_hint().
+
+ * gsignal.[hc]: remove signal_id argument from
+ g_signal_chain_from_overridden(), the parameters are assumed to match
+ the innermost signal currently in emission for this instance.
+ added g_signal_get_invocation_hint() to figure the invocation hint
+ of the innermost signal emission of an instance.
+
+ * gsignal.c (g_signal_list_ids): fix G_BSEARCH_ARRAY_NODES() to
+ access a bsearch array and not a pointer to it (discovered by
+ Sven Neumann).
+
+2001-12-17 Anders Carlsson <andersca@gnu.org>
+
+ * gtype.h (G_TYPE_FLAG_RESERVED_ID_BIT): Set the reserved bit
+ to (1 << 0) instead of (1 << 30).
+
+2001-12-14 James Henstridge <james@daa.com.au>
+
+ * Makefile.am: add rules to build it.
+
+ * testoverride.c: test program for closure override/chaining.
+
+Thu Dec 13 08:03:17 2001 Tim Janik <timj@gtk.org>
+
+ * gsignal.c: implemented closure chaining.
+
+2001-12-08 Christopher Blizzard <blizzard@redhat.com>
+
+ * gsignal.h (g_signal_connect): Explicitly add a cast to the last
+ argument so that the macro will work from C++.
+
+2001-12-06 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.mingw.in (gobject_OBJECTS): Add gsourceclosure.o.
+
+Mon Nov 26 09:55:12 2001 Tim Janik <timj@gtk.org>
+
+ * gtype.h: typedef GType to gulong instead of gsize, if possible.
+
+ * gtype.c: fixups for GType being sizeof(long) wide (changed
+ UINT casts).
+ * gsignal.c:
+ * gclosure.c:
+ * gparam.c: likewise.
+
+Sun Nov 25 22:33:32 2001 Tim Janik <timj@gtk.org>
+
+ * gtype.h: removed enum GTypeFundamentals. use macros
+ to provide the constant fundamental type IDs, so they
+ all return numbers of type GType, and not int.
+ sizeof(GTypeFundamentals) < sizeof(GType) problem reported
+ and fix sugegsted by Havoc.
+
+2001-11-23 Hans Breuer <hans@breuer.org>
+
+ * gobject.def : updated externals
+
+Mon Nov 19 14:35:56 2001 Owen Taylor <otaylor@redhat.com>
+
+ * *.h: Improve the detection of invalid includes by moving
+ the test outside the duplicate include guards.
+
+ * gsourceclosure.c (g_source_set_closure): Doc fix.
+
+Thu Nov 22 03:30:57 2001 Tim Janik <timj@gtk.org>
+
+ * gvalue.h (G_TYPE_IS_VALUE): use g_type_check_is_value_type()
+ instead of g_type_value_table_peek().
+
+ * gtype.[hc] (type_check_is_value_type_U): speed up check
+ LOCK-less by caching lookups in node->mutatable_has_value_table.
+
+ * gtype.[hc]: removed locks where possible. partly based on
+ patches from owen and alex.
+
+Thu Nov 22 00:26:26 2001 Tim Janik <timj@gtk.org>
+
+ * gtype.[hc]: provide G_TYPE_FUNDAMENTAL_SHIFT and
+ g_type_fundamental_next() to return next usable fundamental
+ type. use TypeNode pointers as type IDs.
+
+2001-11-22 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.mingw.in (DEFINES): Set G_LOG_DOMAIN as in Makefile.am.
+
+ * gparamspecs.h (GOBJECT_VAR): Can't use GLIB_VAR here, as that
+ makes sense only when building libglib. GOBJECT_VAR is similar for
+ libgobject.
+
+ * gobject.def: Add g_param_spec_types, remove
+ g_type_fundamental_branch_last.
+
+Wed Nov 21 17:23:33 2001 Tim Janik <timj@gtk.org>
+
+ * gparamspecs.[hc]: put newly created param spec types into a
+ global array.
+
+ * gboxed.[hc]: moved boxed types with _get_type() function here,
+ for: G_TYPE_CLOSURE, G_TYPE_VALUE, G_TYPE_VALUE_ARRAY,
+ G_TYPE_GSTRING.
+
+ * gtype.h: removed fundamental branch APIs and derived enum
+ values. define GType as gsize.
+
+2001-11-19 jacob berkman <jacob@ximian.com>
+
+ * gobjectnotifyqueue.c: include glib-object.h rather than
+ gobject/gobject.h
+
+2001-11-16 Mark McLoughlin <mark@skynet.ie>
+
+ * glib-mkenums.in: allow the enums name to not be on the same
+ line as the trailing '}'. (#64714)
+
+2001-11-18 Hans Breuer <hans@breuer.org>
+
+ * makefile.msc.in : remove g_log_domain_gruntime usage
+
+Sat Nov 17 18:14:40 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib-genmarshal.c: Exit with non-zero exit status if
+ any errors were encountered.
+
+ * glib-genmarshal.c: Instead of generating gobject/gmarshal.h
+ #include only for the header, generate glib-object.h
+ #include for both the header and body. (#63834)
+
+ * glib-genmarshal.c: Generate include guards around the
+ content unless --nostdinc is specified.
+
+2001-11-17 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Add g_pointer_type_register_static.
+
+2001-11-15 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Reflect recent changes.
+
+Tue Nov 13 23:18:10 2001 Tim Janik <timj@gtk.org>
+
+ * gsignal.[hc]: add API for chaining:
+ g_signal_chain_from_overridden() and g_signal_override_class_closure(),
+ implementation yet to come.
+
+ * gtype.[hc], Makefile.am: provide G_LOG_DOMAIN as compile flag.
+
+ * gparam.[hc]: s/g_param_get/g_param_spec_get/ for get_nick,
+ get_name and get_blurb, to be consistent with the rest of the
+ g_param_spec_*() functions.
+
+ * gparamspecs.[hc]: got rid of bogus GClosure paramspec.
+ G_TYPE_CLOSURE is a boxed type already.
+
+Tue Nov 13 22:16:41 2001 Tim Janik <timj@gtk.org>
+
+ * gtype.[hc]: API cleanups.
+ remove g_type_check_flags(), provide g_type_test_flags() as
+ a *private* function.
+ s/g_type_check_is_a/g_type_check_class_is_a/, private function.
+ s/g_type_instance_is_a/g_type_check_instance_is_a/, also private.
+
+Tue Nov 13 20:02:47 2001 Tim Janik <timj@gtk.org>
+
+ * gparam.h: fix standard type macros.
+
+Wed Nov 7 00:56:00 2001 Tim Janik <timj@gtk.org>
+
+ * gclosure.h: provide G_CLOSURE_N_NOTIFIERS() for people that need
+ to walk the notifier list (puhh, black magic, stay-away-warning ;).
+
+Mon Nov 5 18:59:08 2001 Tim Janik <timj@gtk.org>
+
+ * gobject.h:
+ * gsignal.h: we need signal.h for G_BREAKPOINT().
+
+Sun Nov 4 14:01:23 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gvaluetypes.[ch]: Add a function g_pointer_type_register_static()
+ to register a type derived from G_TYPE_POINTER.
+
+2001-11-03 Hans Breuer <hans@breuer.org>
+
+ * makefile.msc.in : gobject-query needs gmarshal.[hc,stings]
+ so build it after them. Add gsourceclosure.obj.
+
+ * gobject.def : removed duplicates, added mising
+
+Mon Oct 29 11:05:15 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib-mkenums.in: Generate glib-mkenums from glib-mkenums.in,
+ substituting in path to perl. (#63093, Dan Winship)
+
+ * Makefile.am (bin_SCRIPTS): Remove hack to copy glib-mkenums
+ from srcdir.
+
+2001-10-26 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.mingw.in: When running glib-genmarshal, set PATH to
+ include ../glib.
+
+2001-10-23 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am: (Win32): If we have built the MSVC import library,
+ install it. Install the gcc import library. Also support
+ uninstall.
+
+2001-10-13 Matthias Clasen <matthiasc@poet.de>
+
+ * glib-genmarshal.1, glib-mkenums.1: Typo fixes.
+
+Fri Oct 12 18:40:18 2001 Tim Janik <timj@gtk.org>
+
+ * cosmetic fixups.
+
+Wed Oct 10 17:25:22 2001 Joshua N Pritikin <vishnu@pobox.com>
+
+ * glib-genmarshal.c gparamspecs.[ch] gtype.[ch] gvalue.h
+ gvaluecollector.h gvaluetypes.[ch]: Fill in missing support for
+ gint64 & guint64 (#59254).
+
+ * Unconditionalize same (compile with or without G_HAVE_INT64).
+
+Wed Oct 10 15:38:58 2001 Joshua N Pritikin <vishnu@pobox.com>
+
+ * gparamspecs.h (G_IS_PARAM_SPEC_FLAGS): Fix order of
+ *_PARAM_SPEC_ULONG defines.
+
+Thu Oct 4 01:10:52 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gparamspecs.h: Add missing G_HAVE_GINT64 conditionalization.
+
+Wed Oct 3 16:02:24 2001 Owen Taylor <otaylor@redhat.com>
+
+ * glib-genmarshal.c gparamspecs.[ch] gvalue.h
+ gobject/gvaluetypes.[ch]: Add support for G_TYPE_INT64
+ and storing it in GValue (Patch from Mathieu Lacage, #59254.)
+
+2001-10-03 jacob berkman <jacob@ximian.com>
+
+ * gtype.c (type_iface_retrieve_holder_info_Wm):
+ (type_iface_vtable_init_Wm):
+ (type_iface_vtable_finalize_Wm):
+ (g_type_class_ref):
+
+ * gobject.c (g_object_get_property): s/retrive/retrieve/
+
+2001-09-25 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am: Use new macros for .def file, and check for
+ MS_LIB_AVAILABLE, new rule to build MS import library.
+
+ * makefile.msc.in: Use same DLL and import library names as
+ libtool.
+
+2001-09-21 Hans Breuer <hans@breuer.org>
+
+ * gobject.def : updated externals
+
+2001-09-19 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.rc.in: Correct InternalName and OriginalFilename to
+ match what we actually produce.
+
+Tue Sep 18 23:09:02 2001 Tim Janik <timj@gtk.org>
+
+ * gparam.[hc]: rename *nick and *blurb fields to catch
+ direct accesses in third party code.
+ provide g_param_get_nick(), g_param_get_blurb() and
+ g_param_get_name() accessors.
+
+Mon Sep 10 20:31:37 2001 Tim Janik <timj@gtk.org>
+
+ * gobject.[hc]: removed extraneous GObject* returns from a
+ couple functions that are very unlikely to be used in nested.
+ changed gpointer->GObject* for a couple return values/arguments.
+ this fixes #50206.
+
+Mon Sep 10 19:27:47 2001 Tim Janik <timj@gtk.org>
+
+ * gtype.[hc]:
+ g_type_add_interface*(): implement the ability to add an interface to
+ a type whose parents already conform to this interface.
+ such "overriding" interfaces, when initialized, are not just initialized
+ with 0, but with a copy of the interface they override.
+ g_type_interface_peek_parent(): new function, return the interface
+ that this interface "overrides", if any.
+
+ * testgruntime.c: test new interface stuff.
+
+2001-09-10 Alex Larsson <alexl@redhat.com>
+
+ * gobject/gboxed.[ch]:
+ * gobject/gsourceclosure.c:
+ Removed is_refcounted and GBoxedInitFunc from
+ g_boxed_type_register_static().
+
+Sat Sep 8 14:13:57 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gobject/Makefile.am: Move gbsearcharray.[ch] to glib
+ as a private ininstalled header.
+
+Tue Sep 4 22:24:48 2001 Matthias Clasen <matthiasc@poet.de>
+
+ * gobject.c (g_object_base_class_finalize): typo fix.
+
+Tue Sep 4 01:49:18 2001 Tim Janik <timj@gtk.org>
+
+ * gsourceclosure.c: make closure_callback_funcs static,
+ added some g_return_if_fail() statements.
+
+Mon Aug 27 14:55:27 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gsourceclosure.[ch] (g_source_set_closure): Implement.
+
+ * gsourceclosure.[ch]: Add GType's for GIOChannel, GIOCondition.
+
+2001-08-17 James Henstridge <james@daa.com.au>
+
+ * gobject.c (WeakRefStack): add an object member to the structure.
+ (weak_refs_notify): pass wstack->object as extra argument to
+ notify functions.
+ (g_object_weak_ref): set wstack->object when initialising
+ WeakRefStack.
+
+ * gobject.h (GWeakNotify): add second argument to prototype which
+ gives the pointer to where the object that is being disposed of
+ was.
+
+Wed Jul 18 19:42:31 2001 Tim Janik <timj@gtk.org>
+
+ * gtype.h: if __GNUC__ is defined, inline a test for an exact type
+ match for instances and classes in G_TYPE_CHECK_INSTANCE_TYPE() and
+ G_TYPE_CHECK_CLASS_TYPE() before calling g_type_instance_is_a().
+
+Sun Aug 12 02:07:10 2001 Tim Janik <timj@gtk.org>
+
+ * gvaluearray.[hc]: fix preallocation logic, support DISABLE_MEM_POOLS
+ properly, group value allocations.
+ (g_value_array_new): fix semantic of n_prealloced argument, so it's
+ really just about preallocation space.
+
+2001-07-23 Padraig O'Briain <Padraig.Obriain@Sun.COM>
+
+ * gobject/gobjectnotifyqueue.c: fix unconditional check of
+ first GParamSpec in g_object_notify_queue_thaw(); to prevent
+ property notification being lost.
+
+2001-08-06 Sven Neumann <sven@gimp.org>
+
+ * gobject.[ch]:
+ added new functions g_object_[add|remove]_weak_pointer().
+
+2001-08-01 Sven Neumann <sven@gimp.org>
+
+ * gsignal.h: added convenience macro g_signal_connect_after().
+
+2001-07-29 Hans Breuer <hans@breuer.org>
+
+ * gobject.def : updated externals
+
+2001-07-20 Hans Breuer <hans@breuer.org>
+
+ * gobject.def : updated externals
+
+ * makefile.msc.in : reflect glib move
+
+Tue Jul 10 18:50:16 2001 Tim Janik <timj@gtk.org>
+
+ * gsignal.h (struct _GSignalQuery): fix misplaced comment.
+
+Mon Jul 2 07:17:47 2001 Tim Janik <timj@gtk.org>
+
+ * gobject.c (g_object_weak_ref):
+ (g_object_watch_closure): congrats tim, introducing of-by-one
+ errors like on my very first day of C programming.
+
+Sat Jun 30 11:07:00 2001 Tim Janik <timj@gtk.org>
+
+ * gobject.[hc]: provide weak_ref/weak_unref functions,
+ invoked from ->dispose. renamed ->shutdown() to ->dispose(),
+ provide "public" API entry here: g_object_run_dispose(), this
+ fucntion should _only_ be called from object system implementations
+ (e.g. gtkobject.c) if at all.
+
+ * gtypemodule.c (g_type_module_dispose): s/shutdown/dispose/
+
+ * gsignal.h: removed compat aliases.
+
+ * gobject.c (g_object_connect): support data objects.
+
+Sat Jun 30 13:17:12 2001 Owen Taylor <otaylor@redhat.com>
+
+ * testgruntime.c (test_object_class_init)
+ gobject.c (g_object_do_class_init):
+ g_signal_newc() => g_signal_new().
+
+Thu Jun 28 22:49:40 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gtype.[ch] gobject-query.c testgruntime.c: Remove
+ debug flag argument to g_type_init() and add
+ g_type_init_with_debug_flags().
+
+Thu Jun 28 16:42:49 2001 Tim Janik <timj@gtk.org>
+
+ * gsignal.c (g_signal_lookup):
+ (g_signal_list_ids): give elaborate warnings about invalid types,
+ non-instantiatable types and unloaded types that we can't operate on.
+
+ * gparam.[hc]: g_param_spec_pool_belongings() ->
+ g_param_spec_pool_list_owned().
+
+ * gsignal.[hc]: renamed:
+ g_signal_newc -> g_signal_new
+ g_signal_disconnect_by_func -> g_signal_handlers_disconnect_by_func
+ g_signal_block_by_func -> g_signal_handlers_block_by_func
+ g_signal_unblock_by_func -> g_signal_handlers_unblock_by_func
+ added GConnectType to simplify (..gboolean swapped, gboolean after)
+ args.
+
+ * gobject.[hc]: changed prototypes accordingly.
+
+2001-06-22 Hans Breuer <hans@breuer.org>
+
+ * gobject.def : updated externals
+
+ * gobjectnotifyqueue.c : include <string.h> for memset ()
+
+Thu Jun 21 02:43:10 2001 Tim Janik <timj@gtk.org>
+
+ * gparamspecs.h: s/long/int/ for default_value in enum and flags
+ pspecs.
+
+Wed Jun 20 03:59:42 2001 Tim Janik <timj@gtk.org>
+
+ * gtype.[hc]: added debugging variants g_type_name_from_class(),
+ g_type_name_from_instance().
+
+Mon Jun 11 17:07:06 2001 Tim Janik <timj@gtk.org>
+
+ * gboxed.[hc]: remove left-over usages of an anonymous GBoxed typedef.
+
+ * gobjectnotifyqueue.c: moved property notify queue implementation
+ bits into this function.
+
+ * gparam.[hc]: added g_param_spec_pool_belongings(), completed
+ g_param_spec_pool_list(). added GParameter for _setv() functions.
+
+ * gobject.[hc]: use gobjectnotifyqueue.h implementation now.
+ got rid of properties_changed signal.
+ new functions g_object_newv(), g_object_class_list_properties().
+ removed "properties_changed" signal.
+
+ * gtype.[hc]: added g_type_depth() to figure number of parent
+ types + 1 for a type.
+
+ * gsignal.h: add g_signal_connect() (as per owen's request) and
+ g_signal_connect_swapped().
+
+2001-06-13 Havoc Pennington <hp@redhat.com>
+
+ * Makefile.am (progs_LDADD): link to ./libgobject-1.3.la
+ since an installed libgobject was somehow being found; think
+ it's a libtool bug, but this workaround should do for now.
+
+2001-06-12 Havoc Pennington <hp@redhat.com>
+
+ * Makefile.am (glib-mkenums): don't put $(srcdir)/glib-mkenums in
+ bin_SCRIPTS, that breaks make install. Instead put 'glib-mkenums'
+ in bin_SCRIPTS and cp it into builddir
+
+Thu May 31 17:56:47 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gobject-query.c: Fix mispelling in help output.
+ (#53952, Skip Montanaro)
+
+2001-05-28 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * Makefile.am (EXTRA_DIST): Really distribute glib-mkenums, now
+ that bin_SCRIPTS doesn't seem to care about doing so anymore.
+
+Mon May 28 06:51:24 2001 Tim Janik <timj@gtk.org>
+
+ * gsignal.c (signal_emit_unlocked_R): fixed bad faux-pass, forgot
+ to release signal lock when restarting emissions.
+
+Sun May 27 04:52:28 2001 Tim Janik <timj@gtk.org>
+
+ * gsignal.[hc] (g_signal_stop_emission_by_name): added variant
+ to stop signal emissions through a detailed_signal string.
+
+ * gsignal.c (signal_emit_R) (g_signal_emit_valist): account for
+ the fact that g_value_* functions may cause signal emissons by
+ unlocking the global signal system lock around g_value_* functions.
+ (signal_emit_unlocked_R): renamed this from signal_emit_R() to reflect
+ that this functions acquires the lock on its own now.
+
+2001-05-24 Hans Breuer <hans@breuer.org>
+
+ * makefile.msc.in : changed depndencies to build glib-genmarshal
+ first and statically linked with glib, which makes it independent
+ from the installed glib version. Added new object files to build.
+
+ * gobject.def : updated
+
+Thu May 24 08:52:02 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gobject.[ch] (g_value_set_object): gpointer, not
+ gpointer *.
+
+2001-05-22 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * Makefile.am (bin_SCRIPTS): made 'make distcheck' happy.
+
+ * gobject.def: Removed g_param_spec_stringc.
+
+Tue May 22 02:46:13 2001 Tim Janik <timj@gtk.org>
+
+ * gobject.c (g_value_set_object): make g_value_set_object()
+ take a gpointer v_object so people don't need to G_OBJECT()
+ cast NULL pointers (C code convenience).
+
+Mon May 14 01:49:01 2001 Tim Janik <timj@gtk.org>
+
+ * gsignal.[hc] (g_signal_handler_is_connected): new function
+ to check whether a handler is still connected to an instance
+ (by handler id).
+
+Thu May 10 14:00:48 2001 Tim Janik <timj@gtk.org>
+
+ * gparamspecs.[hc]: removed g_param_spec_stringc() in lack of
+ evidence of public need.
+
+ * gsignal.h: added g_signal_disconnect_by_func(),
+ g_signal_block_by_func() and g_signal_unblock_by_func() convenience
+ macros as per owen's request.
+
+ * gtype.c (SIZEOF_FUNDAMENTAL_INFO): align sizeof (GTypeFundamentalInfo)
+ to size of longs and pointers.
+
+2001-05-05 James Henstridge <james@daa.com.au>
+
+ * Makefile.am: glib-mkenums is not a compiled program, so shouldn't
+ be in the bin_PROGRAMS primary. Put it in bin_SCRIPTS instead, and
+ removed the glib_mkenums_SOURCES var.
+
+Thu May 3 06:10:23 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gobject.c (g_object_set_[q]data_full): Make types of ternary
+ operator correspond. (Fixes compilation errors with Sun CC,
+ #52230)
+
+Mon Apr 30 20:03:56 2001 Tim Janik <timj@gtk.org>
+
+ * glib-mkenums (usage): removed \v escaping, newer perl versions don't
+ support this, and it'S probably useless anyways.
+
+Sat Apr 28 23:39:42 2001 Tim Janik <timj@gtk.org>
+
+ * gsignal.[hc]: made signal handler and emission hook ids gulongs.
+ (signal_handlers_foreach_matched_R): only invoke callback for handlers
+ that are not disconnected (id>0).
+ (signal_emit_R): prevent invocation of signal handlers during the
+ emission they were connected within.
+
+ * glib-mkenums: publically installed perl-script to parse C code
+ enums and generate descriptions thereof.
+ * glib-mkenums.1: assorted man page.
+
+2001-04-19 Havoc Pennington <hp@redhat.com>
+
+ * gobject.c (g_object_get_valist): We were returning junk memory
+ here, because we didn't copy the value (G_VALUE_NOCOPY_CONTENTS
+ passed to G_VALUE_LCOPY) and then we freed the GValue immediately
+ after. Removed G_VALUE_NOCOPY_CONTENTS from here; need a
+ G_VALUE_STEAL_CONTENTS or the like if we want this optimization.
+
+Wed Apr 18 09:46:56 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gobject.c gsignal.c: Change C++ comments for FIXME's to
+ C comments. (Patch from Andres Salomon)
+
+2001-04-14 Hans Breuer <hans@breuer.org>
+
+ * gobject.def : updated
+
+Mon Apr 9 18:56:15 2001 Tim Janik <timj@gtk.org>
+
+ * gclosure.c (g_closure_invoke): only require marshal/meta_marshal if
+ we're valid (about to actually do marshalling).
+
+Tue Apr 3 20:23:24 2001 Tim Janik <timj@gtk.org>
+
+ * NEWS: updates.
+
+Tue Apr 3 14:06:00 2001 Tim Janik <timj@gtk.org>
+
+ * gparam.[hc]: added g_param_spec_pool_list() to list pspecs per
+ owner_type. the pspecs are not referenced, so the caller is
+ supposed to have some idea about owner_type not randomly
+ nuking his pspec's. if this is going to provide problems in
+ the future, we can either auto-ref the pspecs, or add a
+ _foreach variant, though the latter would have to invoke
+ the callback while pspec's mutex is acquired, so i just
+ went for the _list variant for now.
+
+ * gclosure.h (G_CALLBACK): made GCallback a void (*) (void) fucntion.
+
+Sat Mar 31 23:55:58 2001 Tim Janik <timj@gtk.org>
+
+ * gtype.h:
+ * gparamspecs.[hc]: applied patch from owen to implement
+ GParamSpecUnichar.
+
+Fri Mar 30 07:34:02 2001 Tim Janik <timj@gtk.org>
+
+ * gtype.c (type_iface_retrive_holder_info_Wm):
+ * gtypeplugin.c (g_type_plugin_complete_interface_info):
+ * gtypemodule.c (g_type_module_complete_interface_info):
+ change order of instance_type and interface_type so they match
+ the g_type_add_interface_*() API.
+
+ * gsignal.c (g_signal_emit_valist): always assign C return value
+ location, people depending on unaltered return values after emissions
+ that had no handlers to run need to use g_signal_emitv().
+
+ * gtype.[hc] (g_type_query): new function to allow querying of
+ class and object size (semantics like g_signal_query()).
+ currently the implementation is better held conservative so as to
+ only support types that are classed and static.
+
+2001-03-29 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Updates.
+
+Wed Mar 28 17:04:06 2001 Tim Janik <timj@gtk.org>
+
+ * gobject.c (object_queue_property): only queue readable properties
+ for notification changes.
+
+Thu Mar 22 13:36:50 2001 Tim Janik <timj@gtk.org>
+
+ * gsignal.c (g_signal_newv): catch G_SIGNAL_RUN_FIRST with a return value.
+
+2001-03-21 Martin Baulig <baulig@suse.de>
+
+ * gboxed.[ch] (g_value_dup_boxed): This takes a `const GValue *'
+ argument.
+
+2001-03-18 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Correct some renamed functions.
+
+Sat Mar 17 23:18:36 2001 Tim Janik <timj@gtk.org>
+
+ * gobject.c (g_object_get_property): minor bug-fix.
+
+ * gbsearcharray.[hc]: provide a macro for static initialization and
+ functions g_bsearch_array_new() and g_bsearch_array_destroy() for
+ dynamic allocations.
+
+ * gboxed.c: introduce G_TYPE_GSTRING, boxed type for GString.
+
+ * gclosure.[hc]: naming corrections.
+
+Fri Mar 9 16:42:08 2001 Tim Janik <timj@gtk.org>
+
+ * gvaluetypes.[hc]: moved g_strdup_value_contents() into this file as
+ a public function (was static in gobject.c before). it's a bit odd
+ to have that function here, especially since it requires extra includes,
+ but then it doesn't very well fit somewhere else either.
+
+ * gparamspecs.c: added default/max/min checks to param spec creation
+ functions.
+
+2001-03-10 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Add a couple of missing entries.
+
+ * Makefile.am (libgobject_1_3_la_LIBADD): Use only on Win32.
+
+Fri Mar 9 14:57:17 2001 Tim Janik <timj@gtk.org>
+
+ * testgruntime.c: test program. covers run first/last/cleanup signal
+ handlers, return value accumulator, signal string returns, and
+ interface types in signal arguments.
+
+ * gtype.c (g_type_value_table_peek): for interface types without
+ value table, try looking up a value table from an instantiatable
+ prerequisite type (this is safe as an interface may only have
+ one instantiatable prerequisiste).
+ (type_check_is_value_type_U): same here.
+
+ * gsignal.c (g_signal_newv): assert that return types never have
+ G_SIGNAL_TYPE_STATIC_SCOPE set.
+ (g_signal_newc): only create class closure if the class_offset is not
+ 0.
+
+Fri Mar 9 10:14:00 2001 Tim Janik <timj@gtk.org>
+
+ * gparamspecs.c (g_param_spec_object): use g_type_is_a() to check
+ for object_type being a G_TYPE_OBJECT, not G_TYPE_IS_OBJECT(), since
+ that wouldn't allow interface types.
+
+ * gtype.c (g_type_interface_add_prerequisite): arg, fixed small cnp bug
+ with bad implications and an off-by-one error.
+
+Thu Mar 8 16:34:22 2001 Owen Taylor <otaylor@redhat.com>
+
+ * gvaluetransform.c: Include <string.h> for memcpy.
+
+ * gvaluetransform.c (DEFINE_SPRINTF): Remove unnecessary
+ and ANSI-illegal ## token pasting.
+
+Thu Mar 8 18:11:52 2001 Tim Janik <timj@gtk.org>
+
+ * gsignal.c: eek, fixed old hook detail storage code.
+
+Thu Mar 8 16:35:48 2001 Tim Janik <timj@gtk.org>
+
+ * gparamspecs.[hc]: s/g_param_spec_string_c/g_param_spec_stringc/.
+
+ * gsignal.[hc]: fixed accumulator invocation, implemented emission
+ hooks. and no, neither of these callbacks are called via a closure,
+ language bindings can wrap the accumulator and emission hook
+ interface, they already get parameters marshalled into a GValue array.
+ (g_signal_connect): removed this function as its C specific, doesn't
+ cover the swapped argument, is too close to its broken original
+ gtk_signal_connect() and creates demand for _swapped, _after and
+ _swapped_after variants <brrr>.
+ (g_signal_connectc): convenience macro to connect a C handler
+ func with data, like the old g_signal_connect() plus swapped
+ argument.
+
+ * gtype.h:
+ * gboxed.c: added G_TYPE_VALUE boxed type.
+
+Wed Mar 7 19:02:51 2001 Tim Janik <timj@gtk.org>
+
+ * gtype.c (type_node_add_iface_entry_W): catch when adding an interface
+ to an ancestor of a child that already conforms to this interface.
+ currently we spew a warning here, should we be silent?
+ (g_type_interface_add_prerequisite): new function to add a prerequisite
+ type to an interface, that must succeed an instance is_a prerequisite
+ type check before the interface can be added to an instance. the
+ prerequisite types are also suuported in is_a checks of the interface.
+ (g_type_instance_is_a):
+ (g_type_check_instance_cast):
+ (g_type_check_instance): cleanups and optimizations.
+ (g_type_class_is_a):
+ (g_type_check_class_cast): same, also prevented these from accepting
+ interface types, as class structures don't nest interfaces.
+
+2001-03-07 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * Makefile.am: Avoid rebuilding everything everytime.
+
+Wed Mar 7 09:36:33 2001 Tim Janik <timj@gtk.org>
+
+ * gboxed.[hc]: changed prototype of g_boxed_type_register_static()
+ to contain an optional init function and a hint at whether the
+ boxed structure uses ref counting internally.
+ added g_value_set_boxed_take_ownership().
+ made G_TYPE_BOXED an abstract value type.
+
+ * genums.[hc]: made G_TYPE_ENUM and G_TYPE_FLAGS abstract value
+ types.
+
+ * glib-genmarshal.c: argument type changes, preparation for third-party
+ arg specification.
+
+ * gobject.[hc]: cleaned up get/set property code.
+ added g_strdup_value_contents() to improve warnings.
+
+ * gparam.[hc]: added g_param_value_convert(), taking over responsibility
+ of the old g_value_convert(). added G_PARAM_LAX_VALIDATION flag so
+ validation alterations may be valid a part of the property setting
+ process.
+
+ * gparamspecs.[hc]: made value comparisons stable (for sort applications).
+ added GParamSpecValueArray, a param spec for value arrays and
+ GParamSpecClosure. nuked the value exchange functions and
+ GParamSpecCCallback.
+
+ * gtype.[hc]: catch unintialized usages of the type system with
+ g_return_val_if_uninitialized(). introduced G_TYPE_FLAG_VALUE_ABSTRACT
+ to flag types that introduce a value table, but can't be used for
+ g_value_init(). cleaned up reserved type ids.
+
+ * gvalue.[hc]: code cleanups and saner checking.
+ nuked the value exchange API. implemented value transformations, we
+ can't really "convert" values, rather transforms are an anylogy to
+ C casts, real conversions need a param spec for validation, which is
+ why g_param_value_convert() does real conversions now.
+
+ * gvaluearray.[hc]: new files that implement a GValueArray, a struct
+ that can hold inhomogeneous arrays of value (to that extend that it
+ also allowes undefined values, i.e. G_VALUE_TYPE(value)==0).
+ this is exposed to the type system as a boxed type.
+
+ * gvaluetransform.c: new file implementing most of the former value
+ exchange functions as single-sided transformations.
+
+ * gvaluetypes.[hc]: nuked G_TYPE_CCALLBACK, added
+ g_value_set_string_take_ownership().
+
+ * *.h: s/G_IS_VALUE_/G_VALUE_HOLDS_/.
+
+ * *.[hc]: many fixes and cleanups.
+
+ * many warning improvements.
+
+Tue Feb 27 18:35:15 2001 Tim Janik <timj@gtk.org>
+
+ * gobject.c (g_object_get_valist): urg, pass G_VALUE_NOCOPY_CONTENTS
+ into G_VALUE_LCOPY(), this needs proper documenting.
+
+ * gparam.c: fixed G_PARAM_USER_MASK.
+
+ * gtype.c (type_data_make_W):
+ (type_data_last_unref_Wm): fixed invalid memory freeing.
+
+ * gobject.c (g_object_last_unref): destroy signal handlers associated
+ with object, right before finalization.
+
+ * gsignal.c (g_signal_parse_name): catch destroyed nodes or signals
+ that don't actually support details.
+
+ * gobject.[hc]: got rid of property trailers. nuked GObject
+ properties "data" and the "signal" variants.
+ (g_object_connect): new convenience function to do multiple
+ signal connections at once.
+ (g_object_disconnect): likewise, for disconnections.
+
+ * gparam.[hc] (g_param_spec_pool_lookup): took out trailer support.
+
+ * gvalue.[hc]: marked g_value_fits_pointer() and g_value_peek_pointer()
+ as private (the latter got renamed from g_value_get_as_pointer()).
+
+2001-02-21 Tor Lillqvist <tml@iki.fi>
+
+ * *.h: Use G_BEGIN_DECLS and G_END_DECLS.
+
+ * Makefile.am: Use libglib-1.3.la from top_builddir. Invoke
+ libtool with -no-undefined for Win32 and Cygwin.
+
+Wed Feb 21 18:31:46 2001 Jonathan Blandford <jrb@redhat.com>
+
+ * gsignal.h (g_signal_connect): Add g_signal_connect define to
+ make porting from gtk_signal_connect easy.
+
+ * gsignal.c (g_signal_emit_valist): Use G_TYPE_FROM_INSTANCE
+ (instance) instead of node->itype when initting the value.
+
+2001-02-17 Havoc Pennington <hp@pobox.com>
+
+ Applied patch from Soeren Sandmann:
+
+ * gvaluetypes.c (g_value_get_string): G_CONST_RETURN
+
+ * gtype.c (g_type_name): G_CONST_RETURN
+
+ * gsignal.c (g_signal_name): G_CONST_RETURN
+
+ * gobject-query.c (main): const fix
+
+Sat Feb 17 07:58:46 2001 Tim Janik <timj@gtk.org>
+
+ * genums.h (G_TYPE_IS_FLAGS): patch from sven to fixup
+ G_ENUM_CLASS_TYPE() macro.
+
+Sat Feb 17 04:55:35 2001 Tim Janik <timj@gtk.org>
+
+ * gtype.[hc]: changed collect_format, collect_value() and lcopy_format,
+ lcopy_value() in the GTypeValueTable. the collect functions are now
+ called only once per value, collect_format/lcopy_format are strings
+ that enlist all necessary GTypeCValues to be varargs-collected.
+
+ * gvalue.h: ranamed STATIC_TAG to G_VALUE_NOCOPY_CONTENTS to indicate that
+ a value shouldn't copy its contents.
+
+ * gvaluecollector.h: changed G_VALUE_COLLECT() and G_VALUE_LCOPY()
+ macros to carry an additional argument (flags) that can be used
+ to pass G_VALUE_NOCOPY_CONTENTS along to the collection functions.
+
+ * *.c: adapted collect_value() and lcopy_value() functions to the new
+ prototypes, support G_VALUE_NOCOPY_CONTENTS where apropriate.
+
+ * gsignal.[hc]: introduced a G_SIGNAL_TYPE_STATIC_SCOPE flag that can
+ be passed along (ORed) with the parameter types, indicating that the
+ emission arguments are to be considered static for the scope of the
+ emission. should be used with care and only if the caller knows that
+ a parameter cannot be destroyed/freed from signal handlers connected
+ to an emission.
+
+Fri Feb 16 07:10:44 2001 Tim Janik <timj@gtk.org>
+
+ * gclosure.c:
+ (g_closure_ref):
+ (g_closure_sink): make closure sinking explicit.
+
+ * gsignal.c:
+ (g_signal_connect_data):
+ (g_signal_connect_closure):
+ (g_signal_connect_closure_by_id):
+ (g_signal_newv): perform explicit closure sinking.
+
+Thu Feb 8 00:31:45 2001 Tim Janik <timj@gtk.org>
+
+ * gtype.h: added G_TYPE_DEBUG_NONE for/from Eric Lemings ;)
+
+2001-02-04 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Remove glib_debug_objects.
+
+Sun Feb 4 07:30:53 2001 Tim Janik <timj@gtk.org>
+
+ * gtype.[hc]: changed g_type_init() to take debugging flags
+ initially, a combination of G_TYPE_DEBUG_OBJECTS and
+ G_TYPE_DEBUG_SIGNALS. using the G_TYPE_ prefix is a bit odd
+ here, but basically g_type_int() serves as initialization
+ fucntion for all of GType, GObject, GSignal, so what the heck.
+
+ * gobject.c: special case debugging code properly.
+ changed glib_trap_object_ref to g_trap_object_ref.
+
+ * gsignal.c: add signal emission debugging abilities, along with
+ a new trap object g_trap_instance_signals.
+
+2001-02-04 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am (progs_LDADD): Change order of libs to libgobject
+ first, then libglib. Needed for cygwin, says jbdoll@kepri.re.kr.
+
+Wed Jan 31 06:19:49 2001 Tim Janik <timj@gtk.org>
+
+ * gparam.h: gtk-doc sucks for not dealing with #define inside enums.
+
+ * gtype.[hc]: added G_TYPE_FLAG_RESERVED_ID_BIT, a bit in the type
+ number that's supposed to be left untouched (preserved mainly
+ for the signal code).
+
+ * *.c: added thread safety code, based on an old patch from sebastian.
+ the remaining thread safety issues are now datalists on pspecs (to be
+ solved im gdataset.c) and gvalue.c where locking concerns value exchange
+ functionality only, and that's soon to be revised.
+
+2001-01-27 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.msc.in: Don't try to compile gmarshal.c on its own.
+
+2001-01-24 <alexl@redhat.com>
+
+ * gclosure.c (g_closure_unref):
+ Don't leak closure->notifiers.
+
+2001-01-05 Havoc Pennington <hp@redhat.com>
+
+ * gparamspecs.c (g_param_spec_enum): set the value_type in the
+ param spec; closes bug 40210
+ (g_param_spec_flags): ditto for flags
+
+2001-01-03 Alexander Larsson <alexl@redhat.com>
+
+ * gobject.c:
+ Move glib_debug_objects out of the G_ENABLE_DEBUG #ifdef.
+
+Thu Dec 28 11:36:44 2000 Tim Janik <timj@gtk.org>
+
+ * gbsearcharray.c (upper_power2): disable G_BSEARCH_ALIGN_POWER2
+ fucntionality if DISABLE_MEM_POOLS is defined.
+
+ * gtype.c: honour DISABLE_MEM_POOLS.
+
+ * gsignal.c (g_signal_init): flag signal key bsearch array with
+ G_BSEARCH_ALIGN_POWER2 to avoid excessive growth time. honour
+ DISABLE_MEM_POOLS.
+
+ * gparam.h: added G_PARAM_READWRITE alias for (G_PARAM_READABLE |
+ G_PARAM_WRITABLE).
+
+2000-12-15 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Update.
+
+2000-12-15 Havoc Pennington <hp@pobox.com>
+
+ * gobject.c (g_object_do_class_init): use g_signal_newc
+
+ * gsignal.c (g_signal_newc): convenience function for signals
+ created from C
+ (g_signal_new_valist): added
+ (g_signal_new): removed
+
+Fri Dec 15 04:40:23 2000 Tim Janik <timj@gtk.org>
+
+ * gparam.[hc]: add an instance member value_type so the default
+ value of the pspec class can be overridden.
+
+2000-12-14 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.mingw.in: Update, include parts from Makefile.am to
+ build gmarshal.[ch]. Some day, we won't need these separate
+ makefiles for Win32 compilation. I hope.
+
+ * makefile.msc.in: Update. No use trying to build gmarshal.[ch]
+ here, it would require Unixish tools. MSVC users building from CVS
+ sources are out of luck.
+
+ * gobject.def: Update.
+
+Wed Dec 13 09:31:26 2000 Tim Janik <timj@gtk.org>
+
+ * gparamspecs.[hc]: add G_TYPE_PARAM_BOXED implementation.
+
+ * gobject.[hc]: minor fixes.
+
+Tue Dec 12 23:38:02 2000 Tim Janik <timj@gtk.org>
+
+ * Makefile.am: _never_ touch oldest-source-stamp.
+
+ * gobject.[hc]: construct property handling fixes/improvements.
+ fixed trailer handling in get/set property.
+
+ * gparam.[hc]: implement param spec pool, got rid of param spec
+ hashtable. the most prominent change is that e deal with type
+ prefixes here.
+
+2000-12-12 Elliot Lee <sopwith@redhat.com>
+
+ * Makefile.am:
+ . You have to 'touch oldest-source-stamp' if you want to avoid having
+ the Makefile constantly rebuild itself.
+ . Fix marshaller generation rules to work with srcdir != builddir
+ (there were issues with trying to run "./glib-genmarshal", etc.)
+
+Mon Dec 11 04:44:11 2000 Tim Janik <timj@gtk.org>
+
+ * gboxed.c: fixed dealing with collection/lcopy of NULL values.
+
+ * gclosure.h: removed insane ramblings, added G_CALLBACK() a casting
+ convenience macro.
+
+ * Makefile.am: cleanups, marshaller generation rules.
+
+ * gmarshal.[hc]: new files with GRuntime standard marshallers.
+
+ * glib-genmarshal.c: fix log domain, support gruntime standard
+ marshallers, suport G_TYPE_PARAM, come with extern "C" and
+ #include gmarshal.h.
+
+ * glib-genmarshal.1: reflect glib-genmarshal.c updates.
+
+ * gobject.[hc]: implement object constructor. rework parameter
+ changed notification queueing, we support queue freezes now and
+ don't dispatch from an idle handler anymore.
+ parameter->property rename hassle.
+ implemented ::properties_changed and ::notify::* signals for
+ property change notification (the later supports property names
+ as details). added signal connection and named data properties.
+ (g_signal_connect_object): new function to setup while_alive
+ connections.
+ (g_object_class_install_property): sink properties now, since they
+ are initially floating.
+ (g_object_steal_data):
+ (g_object_set_data_full):
+ (g_object_set_data):
+ (g_object_get_data): set/get data by using g_datalist_*() functions
+ directly.
+ (g_object_queue_param_changed): nuked.
+ (g_object_freeze_notify): start queueing of property changes (freeze/
+ thaw calls stack).
+ (g_object_notify): announce changes of a certain property directly.
+ (g_object_thaw_notify): process queue of property changes, therefore
+ emitting GObject::notify::detail with detail being the changed
+ properties names.
+ (G_OBJECT_WARN_INVALID_PROPERTY_ID): saner macro variant of former
+ G_WARN_INVALID_PARAM_ID().
+
+ * gparam.[hc]: param specs are now initially floating and need to be
+ sunken with g_param_spec_sink(), support G_TYPE_PARAM values.
+ added G_PARAM_CONSTRUCT and G_PARAM_CONSTRUCT_ONLY parameter flags,
+ required by GObjectClass.constructor().
+
+ * gparamspecs.[hc]: added GParamSpecParam, GParamSpecPointer and
+ GParamSpecCCallback, param specs for G_TYPE_PARAM, G_TYPE_POINTER
+ and G_TYPE_CCALLBACK respectively.
+
+ * gsignal.[hc]: cleanups.
+ (signal_id_lookup): after walking the anchestry, try interfaces as well.
+ (g_signal_new): new function to create signals from varargs type list.
+ (g_signal_connect_closure): closure connection variant that works from
+ signal name+detail.
+ (g_signal_connect_data): c handler connection variant that works from
+ signal name+detail.
+ (g_signal_emit_valist): emit signal for an instance with paraneters
+ collected from a va_list.
+ (g_signal_emit): emit signal, taking parameters from varargs list.
+ (g_signal_emit_by_name): same as g_signal_emit, working from
+ signal name+detail.
+ (signal_emit_R): return whether return_value needs to be altered.
+
+ * gtype.[hc]: set log-domain to GRuntime, i'm slowly getting to all
+ the points that need to reflect the upcoming rename.
+ melt g_type_conforms_to() functionality into g_type_is_a(), as that
+ is what we really want (liskov substitution principle).
+ assorted changes to other files due to conforms_to->is_a.
+
+ * gvalue.[hc]: implemented g_value_set_instance() that sets a value
+ from an instantiatable type via the value_table's collect_value()
+ function (based on an idea from James Henstridge <james@daa.com.au>).
+ cleanups/fixes.
+
+ * gvaluetypes.[hc]: implement G_TYPE_CCALLBACK and G_TYPE_PARAM.
+
+Wed Nov 29 13:30:05 2000 Tim Janik <timj@gtk.org>
+
+ * gsignal.c (handlers_find): fix elliots "logic fix" that dereferences
+ NULL nodes if C handlers are searched for specific signals.
+
+2000-11-28 Elliot Lee <sopwith@redhat.com>
+
+ * gsignal.c: Fix warnings about possible use of uninitialized
+ variables, and fix logic that would leave 'node' unset in cases
+ that it might be used in.
+
+ * glib-genmarshal.c: Fix warning about printf format.
+
+2000-11-28 Tor Lillqvist <tml@iki.fi>
+
+ * gboxed.c: Include <string.h> for memset ().
+
+2000-11-22 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Update.
+
+2000-11-20 Havoc Pennington <hp@redhat.com>
+
+ * gobject.c (g_object_get_data)
+ (g_object_set_data)
+ (g_object_set_data_full)
+ (g_object_steal_data): More convenient data-setting functions
+
+Wed Nov 15 20:58:05 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gtypemodule.c (g_type_module_use): If loading the
+ module fails, don't increment the use count.
+
+Thu Nov 9 01:49:43 2000 Tim Janik <timj@gtk.org>
+
+ * gobject.h (G_WARN_INVALID_PARAM_ID): doh,
+ s/BSE_OBJECT_TYPE_NAME/G_OBJECT_TYPE_NAME/; reported by Maas-Maarten
+ Zeeman <maas@wanadoo.nl>.
+
+Mon Nov 13 00:48:39 2000 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.am (EXTRA_DIST): Add glib-genmarshal.1
+
+2000-11-11 Tor Lillqvist <tml@iki.fi>
+
+ * gtypemodule.c: Include stdlib.h for exit().
+
+ * makefile.{mingw,msc}.in (gobject_OBJECTS): Add gtypemodule.
+
+ * gobject.def: Add missing functions.
+
+Sun Nov 5 13:21:28 2000 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.am gtypemodule.[ch]: New basic implementation of
+ GTypePlugin interface as a GObject. Dynamically loaded modules can
+ register any number of types and interface on the module.
+
+Sun Nov 5 10:25:40 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gsignal.c (handlers_find): When appending handlers and
+ not matching on signal_id, use hlist->signal_id instead of
+ signal_id. Having the correct signal_id when unreffing
+ the handlers makes things work a lot better.
+
+2000-11-05 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.{mingw,msc}.in (gobject_OBJECTS): Add gtypeplugin.
+
+ * gobject.def: Update.
+
+Sun Nov 5 05:22:55 2000 Tim Janik <timj@gtk.org>
+
+ * gsignal.c:
+ fixed a bag full of subtle bugs of immensive screw-up potential in
+ handlers_find(), luckily no one found out about them yet ;)
+ fixed signal_handlers_foreach_matched_R() so it operates on an
+ initial handler list snapshot provided by handlers_find() to work
+ around general reentrancy problems and to avoid multiple callback()
+ invocations on the same handlers.
+ this code is now officially 80% bug free (10% remaining for interface
+ types, and 10% remaining for destroyed signals ;)
+
+Sat Nov 4 02:01:33 2000 Tim Janik <timj@gtk.org>
+
+ * gsignal.c (_g_signals_destroy): valid signal nodes start out at 1.
+
+ * gtypeplugin.[hc]: new files holding a GTypePlugin interface
+ implementation that provides the API required by GType to deal with
+ dynamically loadable types.
+
+ * gtype.[hc]: displace any GTypePlugin business to gtypeplugin.h.
+
+Fri Nov 3 07:35:00 2000 Tim Janik <timj@gtk.org>
+
+ * gsignal.[hc]: prefix internal functions with '_'. renamed
+ g_signal_connect_closure() to g_signal_connect_closure_by_id().
+ added g_signal_parse_name() to retrive signal_id and detail quark
+ from a signal name (internal).
+
+Wed Nov 1 03:36:54 2000 Tim Janik <timj@gtk.org>
+
+ * gobject.c (g_object_base_class_finalize): destroy all signals that
+ the finalized obejct type introduced.
+
+ * gsignal.c (g_signals_destroy): don't require itype to have
+ signals.
+
+ * gobject.c (g_object_do_finalize): make sure all signal handlers
+ are destroyed.
+
+ * gsignal.[hc]:
+ (g_signal_handler_find): only match on non-0 masks.
+ (g_signal_handlers_block_matched):
+ (g_signal_handlers_unblock_matched):
+ (g_signal_handlers_disconnect_matched): new functions to block/unblock
+ or disconnect handlers in groups.
+
+2000-10-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gvalue.c (exchange_entries_equal), gparam.c (param_spec_equals):
+ made both functions return gboolean just for the little extra
+ standard conformance now that GEqualFunc is introduced.
+
+Mon Oct 30 05:52:45 2000 Tim Janik <timj@gtk.org>
+
+ * gsignal.c (g_signal_list_ids): get rid of inline documentation owen
+ added, the doc system would ignore it anyways (for some reason not
+ aparent to me).
+
+Mon Oct 30 03:00:07 2000 Tim Janik <timj@gtk.org>
+
+ * gsignal.[hc] (g_signal_list_ids): renamed owen's g_type_signals(),
+ added required mutex locks.
+
+Sun Oct 29 02:31:03 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gsignal.c (g_type_signals): Fix problem where signals
+ with "_" in them appeared twice in the result array.
+
+Sun Oct 29 01:58:44 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gsignal.h: Add g_type_signals() - a function to list
+ all signals for a given type.
+
+Sat Oct 28 00:28:09 2000 Tim Janik <timj@gtk.org>
+
+ * gclosure.c (g_closure_add_marshal_guards): fixed notifier position
+ for post_marshal guard which was off at 0.
+
+Fri Oct 27 21:49:31 2000 Tim Janik <timj@gtk.org>
+
+ * gobject.[hc]: doh, fix argument order in for
+ g_cclosure_new_object_swap and g_cclosure_new_object.
+
+2000-10-28 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.{mingw,msc}.in: Make glib-genmarshal.exe.
+
+ * glib-genmarshal.c: Conditionalise include of unistd.h.
+ Include <io.h> on Win32.
+
+ * gobject.def: Add some missing entry points.
+
+Fri Oct 27 16:33:41 2000 Tim Janik <timj@gtk.org>
+
+ * gsignal.[hc]: publically define GSignalInvocationHint structure
+ that gets passed in to closure invocations. added signal details.
+ renamed GSignalType to GSignalFlags to comply with conventions.
+ quite some cleanups and minor fixes. avoid uneccessary handler list
+ walks upon invocation of after handlers. relookup handler list for
+ restarted emissions. preliminary abort normal handler invocation if
+ after handler is encountered.
+
+ * glib-genmarshal.c:
+ * gclosure.[hc]: moved invocation_hint to the end of the
+ g_closure_invoke() arguments as sugegsted by kenelson.
+ also made it a gpointer to be more generic. the invocation_hint
+ is a caller specific thing that can be used to pass additional
+ data in to closure invocations as documented with the caller
+ invoking the closure.
+
+Fri Oct 27 05:35:14 2000 Tim Janik <timj@gtk.org>
+
+ * gobject.c (g_object_watch_closure): fixed realloc bug, reported
+ by havoc.
+
+ * gsignal.c (g_signal_newv): fixed deadlock scenarion where
+ g_signal_lookup() would be called with the signal lock being
+ held. reported by james henstridge.
+
+ * gclosure.c (g_closure_set_meta_marshal): fixed memcpy/overwrite bug
+ reported by owen.
+
+2000-10-26 Tor Lillqvist <tml@iki.fi>
+
+ * gbsearcharray.c (bsearch_array_insert): Fix gccisms (pointer
+ arithmetic on void pointer, label without statement following.
+
+ * gtype.c (type_node_fundamental_info): Don't apply unary minus to
+ result of sizeof operator, it can be unsigned. Cast first to
+ gssize.
+
+ * gobject.def: Add new functions.
+
+ * makefile.{mingw,msc}.in: Add new objects.
+
+2000-10-26 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * Makefile.am: Remove empty SUBDIRS line _again_, as that _still_
+ prevents 'make dist' from working.
+
+Wed Oct 25 19:11:03 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gbsearcharray.h (g_bsearch_array_get_nth): Don't use implicit
+ casts from void * since this will get included from C++ too
+ at times.
+
+Thu Oct 26 00:30:27 2000 Tim Janik <timj@gtk.org>
+
+ * gvaluetypes.[hc]: added g_value_set_static_string().
+
+ * gboxed.[hc]: const corrections. added g_value_set_static_boxed().
+
+Wed Oct 25 20:27:02 2000 Tim Janik <timj@gtk.org>
+
+ * gtype.c (g_type_free_instance): for the moment, freeing object
+ structures will fill their memory portion with 0xAA. there's a
+ FIXME there, remove this line at a later point.
+
+Tue Oct 24 23:10:26 2000 Tim Janik <timj@gtk.org>
+
+ * glib-genmarshal.1:
+ * glib-genmarshal.c: added publically installed marshaller generator.
+
+ * gtype.h: added G_TYPE_INSTANCE_GET_INTERFACE() to retrive a certain
+ interface VTable from instances.
+
+Mon Oct 23 08:28:15 2000 Tim Janik <timj@gtk.org>
+
+ * gobject.[hc]: new functions for closure maintenance:
+ (g_object_watch_closure): maintain validity of the object and
+ the closure for objects that are used as data part of a closure.
+ (g_cclosure_new_object): convenience function to create C closures
+ that have an object as data argument.
+ (g_closure_new_object): convenience function to create closures
+ that have an object as data argument.
+
+ * gclosure.[hc]: implementation of GClosure mechanism.
+ a closure is basically an encapsulation of a callback function
+ and its environment. ideally, most places supporting callback
+ functions will simply take a GClosure* pointer and thus unify
+ callback environments wrg destroy notification etc.
+ GClosure provides destroy notifiers for arbitrary data pointers,
+ reference counting, invalidation notification (it can be invalidated
+ which is merely a deactivate state) and a marshallinbg abstraction.
+ GCClosure is also provided in these files, they present a specialized
+ GClosure implementation for C language callbacks.
+
+ * genum.c: macro cleanups.
+
+ * gboxed.[hc]: new files, for boxed type abstraction.
+ (g_boxed_copy): copy a boxed structure
+ (g_boxed_free): free a boxed structure
+ (g_value_set_boxed):
+ (g_value_get_boxed): standard GValue functions for boxed types
+ (g_boxed_type_register_static): convenience function for easy
+ introduction of new G_TYPE_BOXED derivatives.
+
+ * gparam.[hc]: introduced g_param_type_register_static(), a short hand
+ for creation of new GParamSpec derived types.
+
+ * gtype.[hc]: many fixes, introduced ability to flag individual
+ type nodes as ABSTRACT upon registration, added value_peek_pointer()
+ to the value table to peek at GValue contents as a pointer for types
+ that support this. fixed up GValue checks.
+
+ * gvalue.[hc]: added g_value_fits_pointer() and g_value_get_as_pointer()
+ to peek at the value contents as pointer.
+
+ * *.[hc]: adaptions to type macro fixes and changes in the type
+ registration API.
+
+ * many const corrections over the place.
+
+Sat Oct 21 02:49:56 2000 Tim Janik <timj@gtk.org>
+
+ * gtype.c (g_type_conforms_to): this function basically behaves like
+ and is_a check, except that it _additionally_ features interfaces
+ for instantiatable types. enforce this in the second branch as well
+ (`type' conforms_to `type') even if `type' is not an interface type.
+
+Fri Oct 20 15:31:04 2000 Tim Janik <timj@gtk.org>
+
+ * gvaluetypes.[hc]: added G_TYPE_POINTER implementation from jrb.
+
+ * gtype.[hc]:
+ * gobject.c:
+ * gvaluetypes.c: added GTypeValueTable.value_peek_pointer and
+ suitable implementations of this for G_TYPE_STRING, G_TYPE_OBJECT
+ and G_TYPE_POINTER.
+
+Mon Aug 21 04:13:37 2000 Tim Janik <timj@gtk.org>
+
+ * gbsearcharray.[hc]: long standing needed generic implementation
+ of a binary searchable, sorted and dynamically sized array.
+
+2000-10-15 Raja R Harinath <harinath@cs.umn.edu>
+
+ * Makefile.am (BUILT_EXTRA_DIST): New variable.
+ (dist-hook): Handle $(BUILT_EXTRA_DIST).
+ (*): Remove traces of @STRIP_{BEGIN,END}@.
+
+2000-09-29 Martin Baulig <baulig@suse.de>
+
+ Several minor ANSI C fixes.
+
+ Added missing casts:
+ * gtype.c (type_class_init):
+ `(gpointer) bnode->data->class.class_init_base'
+ in call to g_slist_prepend() and
+ 'GBaseInitFunc class_init_base = (GBaseInitFunc) slist->data'.
+
+ * gobject.c: Put text following #endif into comments.
+
+2000-09-25 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * Makefile.am: Remove empty SUBDIRS line, as that prevents make
+ dist from working.
+
+Sat Sep 9 20:04:13 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gobject.c (g_object_last_unref): Move call to
+ g_type_free_instance() here from g_object_do_finalize,
+ since g_type_free_instance() can unload the object's
+ implementation.
+
+2000-07-27 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.c: No, don't mark glib_debug_objects for export here,
+ it's handled specially in gtktypeutils.c.
+
+ * gobject.def: Export g_type_fundamental_last (the function).
+
+2000-07-26 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def
+ * gobject.c: Mark glib_debug_objects for export/import as it is
+ used by GTK+.
+
+Sun Jul 23 17:23:35 2000 Tim Janik <timj@gtk.org>
+
+ * gtype.[hc]: make g_type_fundamental_last() a function, avoiding all
+ that extern variable clutter and avoiding further problems with thread
+ safety.
+
+2000-07-19 Tor Lillqvist <tml@iki.fi>
+
+ * gparam.h
+ * gvalue.h
+ * gparam.c
+ * gtype.c: Shut up Sun's picky compiler.
+
+2000-07-14 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Add g_type_get_plugin.
+
+Thu Jul 13 02:07:54 2000 Tim Janik <timj@gtk.org>
+
+ * gparam.c (g_param_value_defaults): default initialize the temporary
+ default value, instead of nuking the caller's value contents.
+
+2000-07-11 Raja R Harinath <harinath@cs.umn.edu>
+
+ * gtype.c (g_type_get_plugin): Don't return just 0 or 1.
+
+Tue Jul 11 02:48:13 2000 Tim Janik <timj@gtk.org>
+
+ * gtype.[hc]: removed g_type_is_dynamic() and added g_type_get_plugin().
+
+2000-07-10 Tor Lillqvist <tml@iki.fi>
+
+ * gobject-query.c: Include ../config.h for HAVE_UNISTD_H. Use it
+ to guard inclusion of <unistd.h>.
+
+ * gtype.h: Fix copy-paste errors in the ifdefs on how to declare a
+ variable for export. Call the macro GOBJECT_VAR.
+
+ * gtype.c: Declare _g_type_fundamental_last for export here, too.
+ (type_node_any_new): Use only constant expressions for sizeof
+ operator (for instance MSVC requires this).
+
+ * makefile.mingw.in: Define GOBJECT_COMPILATION.
+
+Sun Jul 9 21:21:46 2000 Owen Taylor <otaylor@redhat.com>
+
+ * genums.c: Move string.h include into the .c file
+ instead of where it was in the .h file by mistake.
+
+Thu Jul 6 15:30:27 2000 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.am (EXTRA_DIST): dist fixes.
+
+ * gobject.c: Add a global variable glib_debug_objects
+ (not in header file) to control object tracing.
+
+2000-07-01 Tor Lillqvist <tml@iki.fi>
+
+ * gobject.def: Update added and renamed entry points.
+
+ * makefile.mingw.in: Add gvaluetypes.o.
+
+Thu Jun 29 16:02:07 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gobject.c:include string.h for memset
+ * genums.h: include string.h for strcpy
+ * gvalue.c: include string.h for memset, memcpy.
+
+Sat Jun 24 23:03:04 2000 Tim Janik <timj@gtk.org>
+
+ * gtype.[hc]: provide G_TYPE_CHAR, G_TYPE_UCHAR, G_TYPE_BOOLEAN,
+ G_TYPE_INT, G_TYPE_UINT, G_TYPE_LONG, G_TYPE_ULONG, G_TYPE_FLOAT,
+ G_TYPE_DOUBLE and G_TYPE_STRING fundamental types.
+ added a GTypeValueTable* pointer to GTypeInfo structure for types
+ to implement GValue handling functions.
+ GTypeValueTable contains the following members:
+ value_init(): initialize a GValue structure.
+ value_free(): free GValue structure contents (optional).
+ value_copy(): copy one GValue contents to another GValue structure of
+ collect_type: varargs collection type for the first variable argument
+ to be collected by collect_value().
+ collect_value(): variable arguments collection function (optional).
+ lcopy_type: varargs collection type for the first variable argument
+ to be location copyied by lcopy_value().
+ lcopy_value(): variable arguments location copy function (optional).
+ g_type_value_table_peek(): new function to retrive the GTypeValueTable*
+ for a type node. ValueTables get inherited from parent types, unless
+ overridden through the GTypeInfo structure. internally, GTypeValueTable
+ support means an added overhead of one pointer per static or used
+ dynamic type node.
+ g_type_add_class_cache_func(): provide a cache_func/data pair to be
+ called prior to a type nodes last_unref() function, this can be used
+ to prevent premature class destruction. multiple installed cache_func()
+ will be chained upon last_unref() untill one of them returns TRUE.
+ the cache_func()s have to check the class id passed in to figure whether
+ they actually want to cache the class of this type (since all classes
+ are routed through the cache_func() chain).
+ g_type_remove_class_cache_func(): remove a previously installed
+ cache_func/data pair. the cache maintained by this function has to be
+ clear when calling g_type_remove_class_cache_func() to avoid leaks.
+ g_type_class_unref_uncached(): class unref function for cache_func()
+ implementations, unreferences a class omitting the cache chain (and
+ therefore unref->cache->unref->... loops).
+
+ * gvaluetypes.[hc]: provide the value setters/getters for the primitive
+ fundamental types boolean, char, uchar, int, uint, long, ulong, float,
+ double and string.
+
+ * gvalue.[hc]: provide G_TYPE_IS_VALUE() in terms of whether a
+ GTypeValueTable is provided for this type.
+ removed g_value_init_default(), g_value_validate(), g_value_defaults(),
+ g_value_set_default() and g_values_cmp() as these are supplied by the
+ GParamSpec API now.
+ moved g_values_exchange() into the "implementation details" section,
+ since it just provides the underlying functionality for
+ g_value_convert().
+
+ * gvaluecollector.h: renamed the varargs value container from
+ GParamCValue to GTypeCValue as the value collection methods are
+ supplied by the type system now.
+ G_PARAM_COLLECT_VALUE() and G_PARAM_LCOPY_VALUE() got renamed to
+ G_VALUE_COLLECT() and G_VALUE_LCOPY() and operate without a
+ GParamSpec structure now.
+
+ * genums.h: macros cleanups/fixes.
+
+ * genum.c: provide G_TYPE_ENUM and G_TYPE_FLAGS type
+ and assorted g_value_{s|g}et_{enum|flags}() implementations.
+
+ * gobject.[hc]:
+ provide G_IS_VALUE_OBJECT(), G_TYPE_OBJECT ValueTable methods
+ and g_value_{s|g}et_object().
+
+ * gparam.[hc]: reduced class to value_set_default(),
+ value_validate() and values_cmp(). also parameters now need to fill
+ in a GType value_type; field to indicate the GValue type they
+ are handling. provide g_param_value_set_default(),
+ g_param_value_defaults(), g_param_value_validate() and
+ g_param_values_cmp().
+
+ * gparamspecs.[hc]: got rid of the g_value_* functions and
+ the G_IS_VALUE_* macros. adapted param spec implementations
+ according to the GParamSpecClass changes.
+
+Sat Jun 10 08:38:27 2000 Tim Janik <timj@gtk.org>
+
+ * gtype.c (type_class_init): fetch the nth iface entry of the
+ type node in the nth loop iteration, not alwys the first.
+ bug discovered by Walt Pohl <cher@suitware.com>.
+ (type_data_finalize_class_ifaces): same here, cut and paste
+ rulez.
+
+Wed Jun 7 09:21:05 2000 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.am (INCLUDES): Add top_builddir so glibconfig.h
+ is found properly when build srcdir != builddir. (Patch from
+ Eric Lemings)
+
+2000-05-13 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.mingw.in
+ * gobject.def
+ * gobject.rc.in: New files, for Win32 (mingw) build.
+
+ * Makefile.am: Add to EXTRA_DIST. Add rules to produce the
+ corresponding non-*.in files.
+
+ * gtype.h: (Win32:) Mark _g_type_fundamental_last for
+ export/import from DLL.
+
+Fri May 5 01:15:48 2000 Tim Janik <timj@gtk.org>
+
+ * gtype.h: add reserved fundamental ids for gtk types (for transition
+ time). added G_TYPE_FUNDAMENTAL_MAX for gtk.
+
+Mon Apr 17 20:45:50 2000 Tim Janik <timj@gtk.org>
+
+ * glib-gobject.c (g_object_base_class_finalize): oops, don't unset
+ n_params prior to destructing them.
+
+Tue Apr 11 04:28:10 2000 Tim Janik <timj@gtk.org>
+
+ * fixed a couple of bugs in the initial parameter/object
+ implementations, after getting beast running on GObject and GValue.
+
+Fri Apr 7 04:27:49 2000 Tim Janik <timj@gtk.org>
+
+ * glib-gobject.[hc]: completed parameter set/get implementations,
+ along with asyncronous parameter changed notification queue.
+
+Sun Apr 2 04:54:36 2000 Tim Janik <timj@gtk.org>
+
+ * glib-gobject.[hc]: GObject implementation, that is facilities
+ for setting/getting quarked data and reference counting.
+
+ * glib-gparamspecs.[hc]: first actuall parameter implementations
+ for GLib, so far we have: char, uchar, bool, int, uint, long,
+ ulong, enum, flags, float, double, string and object. each of these
+ GParamSpecs is a new instantiatable type in its own respect,
+ so the .c file derives 13 new types from G_TYPE_PARAM and
+ defines over 50 (*2) conversion facilities.
+
+ * glib-gvaluecollector.h: generic varargs handling stubs for
+ GParamSpecs, private header file (does get installed for
+ inclusion into user code though).
+
+ * glib-gvalue.[hc]: GValue functionality implementation.
+
+ * glib-gparam.[hc]: basis GParamSpec implementation for
+ the virtual base type G_TYPE_PARAM.
+
+ * glib-genums.[hc]: enum/flags type implementation, based on
+ bseenum.[hc].
+
+ * glib-gtype.[hc]: GLib Type System implementation, heavily
+ based on BSE's dynamic type system.
diff --git a/trunk/gobject/Makefile.am b/trunk/gobject/Makefile.am
new file mode 100644
index 000000000..6721ed5d7
--- /dev/null
+++ b/trunk/gobject/Makefile.am
@@ -0,0 +1,261 @@
+# GObject - GLib Type, Object, Parameter and Signal Library
+# Copyright (C) 1997,98,99,2000 Tim Janik and Red Hat, Inc.
+#
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = \
+ -DG_LOG_DOMAIN=\"GLib-GObject\" \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/glib \
+ -I$(top_builddir) \
+ $(GLIB_DEBUG_FLAGS) \
+ -DG_DISABLE_DEPRECATED \
+ -DGOBJECT_COMPILATION \
+ -DG_DISABLE_CONST_RETURNS
+
+gobject.def: gobject.symbols
+ (echo -e EXPORTS; $(CPP) -P -DINCLUDE_VARIABLES -DINCLUDE_INTERNAL_SYMBOLS -DG_OS_WIN32 -DALL_FILES - <$(srcdir)/gobject.symbols | sed -e '/^$$/d' -e 's/^/ /' -e 's/G_GNUC_[^ ]*//g' | sort) > gobject.def
+
+gobjectalias.h: gobject.symbols
+ $(PERL) $(srcdir)/makegobjectalias.pl < $(srcdir)/gobject.symbols > gobjectalias.h
+
+gobjectaliasdef.c: gobject.symbols
+ $(PERL) $(srcdir)/makegobjectalias.pl -def < $(srcdir)/gobject.symbols > gobjectaliasdef.c
+
+if OS_LINUX
+if HAVE_GNUC_VISIBILITY
+TESTS = abicheck.sh pltcheck.sh
+endif
+endif
+
+libglib = $(top_builddir)/glib/libglib-2.0.la
+
+# libraries to compile and install
+lib_LTLIBRARIES = libgobject-2.0.la
+
+if MS_LIB_AVAILABLE
+noinst_DATA = gobject-2.0.lib
+
+install-ms-lib:
+ $(INSTALL) gobject-2.0.lib $(DESTDIR)$(libdir)
+
+uninstall-ms-lib:
+ -rm $(DESTDIR)$(libdir)/gobject-2.0.lib
+else
+install-ms-lib:
+uninstall-ms-lib:
+endif
+
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif
+
+if OS_WIN32
+export_symbols = -export-symbols gobject.def
+
+install-def-file:
+ $(INSTALL) gobject.def $(DESTDIR)$(libdir)/gobject-2.0.def
+
+uninstall-def-file:
+ -rm $(DESTDIR)$(libdir)/gobject-2.0.def
+else
+install-def-file:
+uninstall-def-file:
+
+export_symbols = $(LIBTOOL_EXPORT_OPTIONS)
+endif
+
+if OS_WIN32
+gobject_win32_res = gobject-win32-res.o
+gobject_win32_res_ldflag = -Wl,$(gobject_win32_res)
+endif
+
+# libtool stuff: set version and export symbols for resolving
+libgobjectincludedir = $(includedir)/glib-2.0/gobject
+libgobject_2_0_la_LDFLAGS = \
+ $(gobject_win32_res_ldflag) \
+ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \
+ -export-dynamic $(no_undefined) $(export_symbols)
+
+libgobject_2_0_la_LIBADD = $(libglib)
+
+libgobject_2_0_la_DEPENDENCIES = $(gobject_win32_res) $(GOBJECT_DEF)
+
+#
+# setup source file variables
+#
+# GObject library header files for public installation
+gobject_public_h_sources = \
+ gboxed.h \
+ gclosure.h \
+ genums.h \
+ gobject.h \
+ gparam.h \
+ gparamspecs.h \
+ gsignal.h \
+ gsourceclosure.h \
+ gtype.h \
+ gtypemodule.h \
+ gtypeplugin.h \
+ gvalue.h \
+ gvaluearray.h \
+ gvaluecollector.h \
+ gvaluetypes.h \
+ gobjectnotifyqueue.c \
+ gmarshal.h
+
+# GObject library header files that don't get installed
+gobject_private_h_sources =
+# GObject library C sources to build the library from
+gobject_c_sources = \
+ gboxed.c \
+ gclosure.c \
+ genums.c \
+ gobject.c \
+ gparam.c \
+ gparamspecs.c \
+ gsignal.c \
+ gsourceclosure.c \
+ gtype.c \
+ gtypemodule.c \
+ gtypeplugin.c \
+ gvalue.c \
+ gvaluearray.c \
+ gvaluetransform.c \
+ gvaluetypes.c
+
+# these sources (also mentioned above) are generated.
+BUILT_SOURCES = gmarshal.h gmarshal.c gobjectalias.h gobjectaliasdef.c
+
+# non-header sources (headers should be specified in the above variables)
+# that don't serve as direct make target sources, i.e. they don't have
+# their own .lo rules and don't get publically installed
+gobject_extra_sources = \
+ gmarshal.list \
+ gmarshal.strings \
+ gobject.symbols
+
+
+#
+# setup GObject library sources and their dependancies
+#
+gobject_target_headers = $(gobject_public_h_sources)
+gobject_target_sources = $(gobject_c_sources)
+EXTRA_HEADERS =
+EXTRA_DIST = \
+ $(gobject_private_h_sources) \
+ $(gobject_extra_sources) \
+ makegobjectalias.pl \
+ marshal-genstrings.pl
+
+#
+# rules to generate built sources
+#
+# setup autogeneration dependancies
+gen_sources = xgen-gmh xgen-gmc xgen-gms
+CLEANFILES = $(gen_sources)
+
+# normal autogeneration rules
+# all autogenerated files need to be generated in the srcdir,
+# so old versions get remade and are not confused with newer
+# versions in the build dir. thus a development setup requires
+# srcdir to be writable, passing --disable-rebuilds to
+# ../configure will supress all autogeneration rules.
+
+if CROSS_COMPILING
+ glib_genmarshal=$(GLIB_GENMARSHAL)
+else
+ glib_genmarshal=./glib-genmarshal
+endif
+
+gmarshal.h: stamp-gmarshal.h
+ @true
+stamp-gmarshal.h: @REBUILD@ gmarshal.list glib-genmarshal$(EXEEXT)
+ $(MAKE) glib-genmarshal$(EXEEXT)
+ echo "#ifndef __G_MARSHAL_H__" > xgen-gmh \
+ && echo "#define __G_MARSHAL_H__" >> xgen-gmh \
+ && $(glib_genmarshal) --nostdinc --prefix=g_cclosure_marshal $(srcdir)/gmarshal.list --header >> xgen-gmh \
+ && echo "#endif /* __G_MARSHAL_H__ */" >> xgen-gmh \
+ && (cmp -s xgen-gmh gmarshal.h 2>/dev/null || cp xgen-gmh gmarshal.h) \
+ && rm -f xgen-gmh xgen-gmh~ \
+ && echo timestamp > $@
+
+gmarshal.c: @REBUILD@ stamp-gmarshal.h
+ $(glib_genmarshal) --nostdinc --prefix=g_cclosure_marshal $(srcdir)/gmarshal.list --body >> xgen-gmc \
+ && cp xgen-gmc gmarshal.c \
+ && rm -f xgen-gmc xgen-gmc~
+
+gmarshal.strings: @REBUILD@ $(srcdir)/gmarshal.list
+ grep '^[A-Z]' $(srcdir)/gmarshal.list \
+ | sed -e 's/^/"g_cclosure_marshal_/' -e 's/:/__/' -e 's/,/_/g' -e 's/$$/",/' > xgen-gms \
+ && cp xgen-gms gmarshal.strings \
+ && rm -f xgen-gms xgen-gms~
+
+glib-genmarshal.o: gmarshal.strings
+gsignal.lo: gmarshal.c
+
+
+# target platform:
+libgobjectinclude_HEADERS = $(gobject_target_headers)
+libgobject_2_0_la_SOURCES = $(gobject_target_sources)
+
+#
+# programs to compile and install
+#
+bin_PROGRAMS = gobject-query glib-genmarshal
+bin_SCRIPTS = glib-mkenums
+noinst_PROGRAMS = testgobject
+# source files
+gobject_query_SOURCES = gobject-query.c
+glib_genmarshal_SOURCES = glib-genmarshal.c
+testgobject_SOURCES = testgobject.c
+# link programs against libgobject
+progs_LDADD = ./libgobject-2.0.la $(libglib)
+glib_genmarshal_LDADD = $(libglib)
+gobject_query_LDADD = $(progs_LDADD)
+testgobject_LDADD = $(progs_LDADD)
+
+#
+# auxillary files
+#
+EXTRA_DIST += \
+ makefile.msc.in \
+ gobject.rc.in \
+ glib-genmarshal.1 \
+ glib-mkenums.in \
+ glib-mkenums.1 \
+ abicheck.sh \
+ pltcheck.sh
+
+BUILT_EXTRA_DIST = \
+ makefile.msc \
+ gobject.rc \
+ gmarshal.h \
+ gmarshal.c \
+ stamp-gmarshal.h \
+ gobjectalias.h \
+ gobjectaliasdef.c
+
+
+if OS_WIN32
+gobject-win32-res.o: gobject.rc
+ $(WINDRES) gobject.rc $@
+endif
+
+gobject-2.0.lib: libgobject-2.0.la gobject.def
+ lib -name:libgobject-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:gobject.def -out:$@
+
+dist-hook: $(BUILT_EXTRA_DIST)
+ files='$(BUILT_EXTRA_DIST)'; \
+ for f in $$files; do \
+ if test -f $$f; then d=.; else d=$(srcdir); fi; \
+ cp $$d/$$f $(distdir) || exit 1; done
+
+install-data-local: install-ms-lib install-def-file
+
+uninstall-local: uninstall-ms-lib uninstall-def-file
+
+distclean-local:
+ if test $(srcdir) = .; then :; else \
+ rm -f $(BUILT_EXTRA_DIST); \
+ fi
diff --git a/trunk/gobject/abicheck.sh b/trunk/gobject/abicheck.sh
new file mode 100755
index 000000000..74391cdea
--- /dev/null
+++ b/trunk/gobject/abicheck.sh
@@ -0,0 +1,13 @@
+#! /bin/sh
+
+egrep '^#([^i]|if).*[^\]$' "${top_builddir:-..}/glibconfig.h" > glibconfig.cpp
+
+INCLUDES="-include ${top_builddir:-..}/config.h"
+INCLUDES="$INCLUDES -include glibconfig.cpp"
+
+cpp -DINCLUDE_VARIABLES -P $INCLUDES -DALL_FILES ${srcdir:-.}/gobject.symbols | sed -e '/^$/d' -e 's/ G_GNUC.*$//' -e 's/ PRIVATE$//' | sort > expected-abi
+rm glibconfig.cpp
+
+nm -D -g --defined-only .libs/libgobject-2.0.so | cut -d ' ' -f 3 | sort > actual-abi
+
+diff -u expected-abi actual-abi && rm expected-abi actual-abi
diff --git a/trunk/gobject/gboxed.c b/trunk/gobject/gboxed.c
new file mode 100644
index 000000000..cab8164ec
--- /dev/null
+++ b/trunk/gobject/gboxed.c
@@ -0,0 +1,580 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2000-2001 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 "gboxed.h"
+
+#include "gbsearcharray.h"
+#include "gvalue.h"
+#include "gvaluearray.h"
+#include "gclosure.h"
+#include "gvaluecollector.h"
+
+#include "gobjectalias.h"
+
+#include <string.h>
+
+/* --- typedefs & structures --- */
+typedef struct
+{
+ GType type;
+ GBoxedCopyFunc copy;
+ GBoxedFreeFunc free;
+} BoxedNode;
+
+
+/* --- prototypes --- */
+static gint boxed_nodes_cmp (gconstpointer p1,
+ gconstpointer p2);
+
+
+/* --- variables --- */
+static GBSearchArray *boxed_bsa = NULL;
+static const GBSearchConfig boxed_bconfig = {
+ sizeof (BoxedNode),
+ boxed_nodes_cmp,
+ 0,
+};
+
+
+/* --- functions --- */
+static gint
+boxed_nodes_cmp (gconstpointer p1,
+ gconstpointer p2)
+{
+ const BoxedNode *node1 = p1, *node2 = p2;
+
+ return G_BSEARCH_ARRAY_CMP (node1->type, node2->type);
+}
+
+static inline void /* keep this function in sync with gvalue.c */
+value_meminit (GValue *value,
+ GType value_type)
+{
+ value->g_type = value_type;
+ memset (value->data, 0, sizeof (value->data));
+}
+
+static gpointer
+value_copy (gpointer boxed)
+{
+ const GValue *src_value = boxed;
+ GValue *dest_value = g_new0 (GValue, 1);
+
+ if (G_VALUE_TYPE (src_value))
+ {
+ g_value_init (dest_value, G_VALUE_TYPE (src_value));
+ g_value_copy (src_value, dest_value);
+ }
+ return dest_value;
+}
+
+static void
+value_free (gpointer boxed)
+{
+ GValue *value = boxed;
+
+ if (G_VALUE_TYPE (value))
+ g_value_unset (value);
+ g_free (value);
+}
+
+void
+g_boxed_type_init (void)
+{
+ static const GTypeInfo info = {
+ 0, /* class_size */
+ NULL, /* base_init */
+ NULL, /* base_destroy */
+ NULL, /* class_init */
+ NULL, /* class_destroy */
+ NULL, /* class_data */
+ 0, /* instance_size */
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ NULL, /* value_table */
+ };
+ const GTypeFundamentalInfo finfo = { G_TYPE_FLAG_DERIVABLE, };
+ GType type;
+
+ boxed_bsa = g_bsearch_array_create (&boxed_bconfig);
+
+ /* G_TYPE_BOXED
+ */
+ type = g_type_register_fundamental (G_TYPE_BOXED, g_intern_static_string ("GBoxed"), &info, &finfo,
+ G_TYPE_FLAG_ABSTRACT | G_TYPE_FLAG_VALUE_ABSTRACT);
+ g_assert (type == G_TYPE_BOXED);
+}
+
+GType
+g_closure_get_type (void)
+{
+ static GType type_id = 0;
+
+ if (!type_id)
+ type_id = g_boxed_type_register_static (g_intern_static_string ("GClosure"),
+ (GBoxedCopyFunc) g_closure_ref,
+ (GBoxedFreeFunc) g_closure_unref);
+ return type_id;
+}
+
+GType
+g_value_get_type (void)
+{
+ static GType type_id = 0;
+
+ if (!type_id)
+ type_id = g_boxed_type_register_static (g_intern_static_string ("GValue"),
+ value_copy,
+ value_free);
+ return type_id;
+}
+
+GType
+g_value_array_get_type (void)
+{
+ static GType type_id = 0;
+
+ if (!type_id)
+ type_id = g_boxed_type_register_static (g_intern_static_string ("GValueArray"),
+ (GBoxedCopyFunc) g_value_array_copy,
+ (GBoxedFreeFunc) g_value_array_free);
+ return type_id;
+}
+
+static gpointer
+gdate_copy (gpointer boxed)
+{
+ const GDate *date = (const GDate*) boxed;
+
+ return g_date_new_julian (g_date_get_julian (date));
+}
+
+GType
+g_date_get_type (void)
+{
+ static GType type_id = 0;
+
+ if (!type_id)
+ type_id = g_boxed_type_register_static (g_intern_static_string ("GDate"),
+ (GBoxedCopyFunc) gdate_copy,
+ (GBoxedFreeFunc) g_date_free);
+ return type_id;
+}
+
+GType
+g_strv_get_type (void)
+{
+ static GType type_id = 0;
+
+ if (!type_id)
+ type_id = g_boxed_type_register_static (g_intern_static_string ("GStrv"),
+ (GBoxedCopyFunc) g_strdupv,
+ (GBoxedFreeFunc) g_strfreev);
+ return type_id;
+}
+
+static gpointer
+gstring_copy (gpointer boxed)
+{
+ const GString *src_gstring = boxed;
+
+ return g_string_new_len (src_gstring->str, src_gstring->len);
+}
+
+static void
+gstring_free (gpointer boxed)
+{
+ GString *gstring = boxed;
+
+ g_string_free (gstring, TRUE);
+}
+
+GType
+g_gstring_get_type (void)
+{
+ static GType type_id = 0;
+
+ if (!type_id)
+ type_id = g_boxed_type_register_static (g_intern_static_string ("GString"),
+ /* the naming is a bit odd, but GString is obviously not G_TYPE_STRING */
+ gstring_copy,
+ gstring_free);
+ return type_id;
+}
+
+static gpointer
+hash_table_copy (gpointer boxed)
+{
+ GHashTable *hash_table = boxed;
+ return g_hash_table_ref (hash_table);
+}
+
+static void
+hash_table_free (gpointer boxed)
+{
+ GHashTable *hash_table = boxed;
+ g_hash_table_unref (hash_table);
+}
+
+GType
+g_hash_table_get_type (void)
+{
+ static GType type_id = 0;
+ if (!type_id)
+ type_id = g_boxed_type_register_static (g_intern_static_string ("GHashTable"),
+ hash_table_copy, hash_table_free);
+ return type_id;
+}
+
+static void
+boxed_proxy_value_init (GValue *value)
+{
+ value->data[0].v_pointer = NULL;
+}
+
+static void
+boxed_proxy_value_free (GValue *value)
+{
+ if (value->data[0].v_pointer && !(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
+ {
+ BoxedNode key, *node;
+
+ key.type = G_VALUE_TYPE (value);
+ node = g_bsearch_array_lookup (boxed_bsa, &boxed_bconfig, &key);
+ node->free (value->data[0].v_pointer);
+ }
+}
+
+static void
+boxed_proxy_value_copy (const GValue *src_value,
+ GValue *dest_value)
+{
+ if (src_value->data[0].v_pointer)
+ {
+ BoxedNode key, *node;
+
+ key.type = G_VALUE_TYPE (src_value);
+ node = g_bsearch_array_lookup (boxed_bsa, &boxed_bconfig, &key);
+ dest_value->data[0].v_pointer = node->copy (src_value->data[0].v_pointer);
+ }
+ else
+ dest_value->data[0].v_pointer = src_value->data[0].v_pointer;
+}
+
+static gpointer
+boxed_proxy_value_peek_pointer (const GValue *value)
+{
+ return value->data[0].v_pointer;
+}
+
+static gchar*
+boxed_proxy_collect_value (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ BoxedNode key, *node;
+
+ key.type = G_VALUE_TYPE (value);
+ node = g_bsearch_array_lookup (boxed_bsa, &boxed_bconfig, &key);
+
+ if (!collect_values[0].v_pointer)
+ value->data[0].v_pointer = NULL;
+ else
+ {
+ if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
+ {
+ value->data[0].v_pointer = collect_values[0].v_pointer;
+ value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
+ }
+ else
+ value->data[0].v_pointer = node->copy (collect_values[0].v_pointer);
+ }
+
+ return NULL;
+}
+
+static gchar*
+boxed_proxy_lcopy_value (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ gpointer *boxed_p = collect_values[0].v_pointer;
+
+ if (!boxed_p)
+ return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+
+ if (!value->data[0].v_pointer)
+ *boxed_p = NULL;
+ else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
+ *boxed_p = value->data[0].v_pointer;
+ else
+ {
+ BoxedNode key, *node;
+
+ key.type = G_VALUE_TYPE (value);
+ node = g_bsearch_array_lookup (boxed_bsa, &boxed_bconfig, &key);
+ *boxed_p = node->copy (value->data[0].v_pointer);
+ }
+
+ return NULL;
+}
+
+GType
+g_boxed_type_register_static (const gchar *name,
+ GBoxedCopyFunc boxed_copy,
+ GBoxedFreeFunc boxed_free)
+{
+ static const GTypeValueTable vtable = {
+ boxed_proxy_value_init,
+ boxed_proxy_value_free,
+ boxed_proxy_value_copy,
+ boxed_proxy_value_peek_pointer,
+ "p",
+ boxed_proxy_collect_value,
+ "p",
+ boxed_proxy_lcopy_value,
+ };
+ static const GTypeInfo type_info = {
+ 0, /* class_size */
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ NULL, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ 0, /* instance_size */
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ &vtable, /* value_table */
+ };
+ GType type;
+
+ g_return_val_if_fail (name != NULL, 0);
+ g_return_val_if_fail (boxed_copy != NULL, 0);
+ g_return_val_if_fail (boxed_free != NULL, 0);
+ g_return_val_if_fail (g_type_from_name (name) == 0, 0);
+
+ type = g_type_register_static (G_TYPE_BOXED, name, &type_info, 0);
+
+ /* install proxy functions upon successfull registration */
+ if (type)
+ {
+ BoxedNode key;
+
+ key.type = type;
+ key.copy = boxed_copy;
+ key.free = boxed_free;
+ boxed_bsa = g_bsearch_array_insert (boxed_bsa, &boxed_bconfig, &key);
+ }
+
+ return type;
+}
+
+gpointer
+g_boxed_copy (GType boxed_type,
+ gconstpointer src_boxed)
+{
+ GTypeValueTable *value_table;
+ gpointer dest_boxed;
+
+ g_return_val_if_fail (G_TYPE_IS_BOXED (boxed_type), NULL);
+ g_return_val_if_fail (G_TYPE_IS_ABSTRACT (boxed_type) == FALSE, NULL);
+ g_return_val_if_fail (src_boxed != NULL, NULL);
+
+ value_table = g_type_value_table_peek (boxed_type);
+ if (!value_table)
+ g_return_val_if_fail (G_TYPE_IS_VALUE_TYPE (boxed_type), NULL);
+
+ /* check if our proxying implementation is used, we can short-cut here */
+ if (value_table->value_copy == boxed_proxy_value_copy)
+ {
+ BoxedNode key, *node;
+
+ key.type = boxed_type;
+ node = g_bsearch_array_lookup (boxed_bsa, &boxed_bconfig, &key);
+ dest_boxed = node->copy ((gpointer) src_boxed);
+ }
+ else
+ {
+ GValue src_value, dest_value;
+
+ /* we heavily rely on third-party boxed type value vtable
+ * implementations to follow normal boxed value storage
+ * (data[0].v_pointer is the boxed struct, and
+ * data[1].v_uint holds the G_VALUE_NOCOPY_CONTENTS flag,
+ * rest zero).
+ * but then, we can expect that since we layed out the
+ * g_boxed_*() API.
+ * data[1].v_uint&G_VALUE_NOCOPY_CONTENTS shouldn't be set
+ * after a copy.
+ */
+ /* equiv. to g_value_set_static_boxed() */
+ value_meminit (&src_value, boxed_type);
+ src_value.data[0].v_pointer = (gpointer) src_boxed;
+ src_value.data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
+
+ /* call third-party code copy function, fingers-crossed */
+ value_meminit (&dest_value, boxed_type);
+ value_table->value_copy (&src_value, &dest_value);
+
+ /* double check and grouse if things went wrong */
+ if (dest_value.data[1].v_ulong)
+ g_warning ("the copy_value() implementation of type `%s' seems to make use of reserved GValue fields",
+ g_type_name (boxed_type));
+
+ dest_boxed = dest_value.data[0].v_pointer;
+ }
+
+ return dest_boxed;
+}
+
+void
+g_boxed_free (GType boxed_type,
+ gpointer boxed)
+{
+ GTypeValueTable *value_table;
+
+ g_return_if_fail (G_TYPE_IS_BOXED (boxed_type));
+ g_return_if_fail (G_TYPE_IS_ABSTRACT (boxed_type) == FALSE);
+ g_return_if_fail (boxed != NULL);
+
+ value_table = g_type_value_table_peek (boxed_type);
+ if (!value_table)
+ g_return_if_fail (G_TYPE_IS_VALUE_TYPE (boxed_type));
+
+ /* check if our proxying implementation is used, we can short-cut here */
+ if (value_table->value_free == boxed_proxy_value_free)
+ {
+ BoxedNode key, *node;
+
+ key.type = boxed_type;
+ node = g_bsearch_array_lookup (boxed_bsa, &boxed_bconfig, &key);
+ node->free (boxed);
+ }
+ else
+ {
+ GValue value;
+
+ /* see g_boxed_copy() on why we think we can do this */
+ value_meminit (&value, boxed_type);
+ value.data[0].v_pointer = boxed;
+ value_table->value_free (&value);
+ }
+}
+
+gpointer
+g_value_get_boxed (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_BOXED (value), NULL);
+ g_return_val_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)), NULL);
+
+ return value->data[0].v_pointer;
+}
+
+gpointer
+g_value_dup_boxed (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_BOXED (value), NULL);
+ g_return_val_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)), NULL);
+
+ return value->data[0].v_pointer ? g_boxed_copy (G_VALUE_TYPE (value), value->data[0].v_pointer) : NULL;
+}
+
+static inline void
+value_set_boxed_internal (GValue *value,
+ gconstpointer const_boxed,
+ gboolean need_copy,
+ gboolean need_free)
+{
+ BoxedNode key, *node;
+ gpointer boxed = (gpointer) const_boxed;
+
+ if (!boxed)
+ {
+ /* just resetting to NULL might not be desired, need to
+ * have value reinitialized also (for values defaulting
+ * to other default value states than a NULL data pointer),
+ * g_value_reset() will handle this
+ */
+ g_value_reset (value);
+ return;
+ }
+
+ key.type = G_VALUE_TYPE (value);
+ node = g_bsearch_array_lookup (boxed_bsa, &boxed_bconfig, &key);
+
+ if (node)
+ {
+ /* we proxy this type, free contents and copy right away */
+ if (value->data[0].v_pointer && !(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
+ node->free (value->data[0].v_pointer);
+ value->data[1].v_uint = need_free ? 0 : G_VALUE_NOCOPY_CONTENTS;
+ value->data[0].v_pointer = need_copy ? node->copy (boxed) : boxed;
+ }
+ else
+ {
+ /* we don't handle this type, free contents and let g_boxed_copy()
+ * figure what's required
+ */
+ if (value->data[0].v_pointer && !(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
+ g_boxed_free (G_VALUE_TYPE (value), value->data[0].v_pointer);
+ value->data[1].v_uint = need_free ? 0 : G_VALUE_NOCOPY_CONTENTS;
+ value->data[0].v_pointer = need_copy ? g_boxed_copy (G_VALUE_TYPE (value), boxed) : boxed;
+ }
+}
+
+void
+g_value_set_boxed (GValue *value,
+ gconstpointer boxed)
+{
+ g_return_if_fail (G_VALUE_HOLDS_BOXED (value));
+ g_return_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)));
+
+ value_set_boxed_internal (value, boxed, TRUE, TRUE);
+}
+
+void
+g_value_set_static_boxed (GValue *value,
+ gconstpointer boxed)
+{
+ g_return_if_fail (G_VALUE_HOLDS_BOXED (value));
+ g_return_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)));
+
+ value_set_boxed_internal (value, boxed, FALSE, FALSE);
+}
+
+void
+g_value_set_boxed_take_ownership (GValue *value,
+ gconstpointer boxed)
+{
+ g_value_take_boxed (value, boxed);
+}
+
+void
+g_value_take_boxed (GValue *value,
+ gconstpointer boxed)
+{
+ g_return_if_fail (G_VALUE_HOLDS_BOXED (value));
+ g_return_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)));
+
+ value_set_boxed_internal (value, boxed, FALSE, TRUE);
+}
+
+#define __G_BOXED_C__
+#include "gobjectaliasdef.c"
diff --git a/trunk/gobject/gboxed.h b/trunk/gobject/gboxed.h
new file mode 100644
index 000000000..6370cae37
--- /dev/null
+++ b/trunk/gobject/gboxed.h
@@ -0,0 +1,87 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2000-2001 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.
+ */
+#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
+#error "Only <glib-object.h> can be included directly."
+#endif
+
+#ifndef __G_BOXED_H__
+#define __G_BOXED_H__
+
+#include <gobject/gtype.h>
+
+G_BEGIN_DECLS
+
+/* --- type macros --- */
+#define G_TYPE_IS_BOXED(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_BOXED)
+#define G_VALUE_HOLDS_BOXED(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_BOXED))
+
+
+/* --- typedefs --- */
+typedef gpointer (*GBoxedCopyFunc) (gpointer boxed);
+typedef void (*GBoxedFreeFunc) (gpointer boxed);
+
+
+/* --- prototypes --- */
+gpointer g_boxed_copy (GType boxed_type,
+ gconstpointer src_boxed);
+void g_boxed_free (GType boxed_type,
+ gpointer boxed);
+void g_value_set_boxed (GValue *value,
+ gconstpointer v_boxed);
+void g_value_set_static_boxed (GValue *value,
+ gconstpointer v_boxed);
+gpointer g_value_get_boxed (const GValue *value);
+gpointer g_value_dup_boxed (const GValue *value);
+
+
+/* --- convenience --- */
+GType g_boxed_type_register_static (const gchar *name,
+ GBoxedCopyFunc boxed_copy,
+ GBoxedFreeFunc boxed_free);
+
+
+/* --- GLib boxed types --- */
+#define G_TYPE_CLOSURE (g_closure_get_type ())
+#define G_TYPE_VALUE (g_value_get_type ())
+#define G_TYPE_VALUE_ARRAY (g_value_array_get_type ())
+#define G_TYPE_DATE (g_date_get_type ())
+#define G_TYPE_STRV (g_strv_get_type ())
+#define G_TYPE_GSTRING (g_gstring_get_type ())
+#define G_TYPE_HASH_TABLE (g_hash_table_get_type ())
+
+
+void g_value_take_boxed (GValue *value,
+ gconstpointer v_boxed);
+#ifndef G_DISABLE_DEPRECATED
+void g_value_set_boxed_take_ownership (GValue *value,
+ gconstpointer v_boxed);
+#endif
+GType g_closure_get_type (void) G_GNUC_CONST;
+GType g_value_get_type (void) G_GNUC_CONST;
+GType g_value_array_get_type (void) G_GNUC_CONST;
+GType g_date_get_type (void) G_GNUC_CONST;
+GType g_strv_get_type (void) G_GNUC_CONST;
+GType g_gstring_get_type (void) G_GNUC_CONST;
+GType g_hash_table_get_type (void) G_GNUC_CONST;
+
+typedef gchar** GStrv;
+
+G_END_DECLS
+
+#endif /* __G_BOXED_H__ */
diff --git a/trunk/gobject/gclosure.c b/trunk/gobject/gclosure.c
new file mode 100644
index 000000000..e6568e771
--- /dev/null
+++ b/trunk/gobject/gclosure.c
@@ -0,0 +1,616 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2000-2001 Red Hat, Inc.
+ * Copyright (C) 2005 Imendio AB
+ *
+ * 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 "gclosure.h"
+
+/*
+ * MT safe with regards to reference counting.
+ */
+
+#include "gvalue.h"
+#include "gobjectalias.h"
+#include <string.h>
+
+
+#define CLOSURE_MAX_REF_COUNT ((1 << 15) - 1)
+#define CLOSURE_MAX_N_GUARDS ((1 << 1) - 1)
+#define CLOSURE_MAX_N_FNOTIFIERS ((1 << 2) - 1)
+#define CLOSURE_MAX_N_INOTIFIERS ((1 << 8) - 1)
+#define CLOSURE_N_MFUNCS(cl) ((cl)->meta_marshal + \
+ ((cl)->n_guards << 1L))
+/* same as G_CLOSURE_N_NOTIFIERS() (keep in sync) */
+#define CLOSURE_N_NOTIFIERS(cl) (CLOSURE_N_MFUNCS (cl) + \
+ (cl)->n_fnotifiers + \
+ (cl)->n_inotifiers)
+
+typedef union {
+ GClosure closure;
+ volatile gint vint;
+} ClosureInt;
+
+#define CHANGE_FIELD(_closure, _field, _OP, _value, _must_set, _SET_OLD, _SET_NEW) \
+G_STMT_START { \
+ ClosureInt *cunion = (ClosureInt*) _closure; \
+ gint new_int, old_int, success; \
+ do \
+ { \
+ ClosureInt tmp; \
+ tmp.vint = old_int = cunion->vint; \
+ _SET_OLD tmp.closure._field; \
+ tmp.closure._field _OP _value; \
+ _SET_NEW tmp.closure._field; \
+ new_int = tmp.vint; \
+ success = g_atomic_int_compare_and_exchange (&cunion->vint, old_int, new_int); \
+ } \
+ while (!success && _must_set); \
+} G_STMT_END
+
+#define SWAP(_closure, _field, _value, _oldv) CHANGE_FIELD (_closure, _field, =, _value, TRUE, *(_oldv) =, (void) )
+#define SET(_closure, _field, _value) CHANGE_FIELD (_closure, _field, =, _value, TRUE, (void), (void) )
+#define INC(_closure, _field) CHANGE_FIELD (_closure, _field, +=, 1, TRUE, (void), (void) )
+#define INC_ASSIGN(_closure, _field, _newv) CHANGE_FIELD (_closure, _field, +=, 1, TRUE, (void), *(_newv) = )
+#define DEC(_closure, _field) CHANGE_FIELD (_closure, _field, -=, 1, TRUE, (void), (void) )
+#define DEC_ASSIGN(_closure, _field, _newv) CHANGE_FIELD (_closure, _field, -=, 1, TRUE, (void), *(_newv) = )
+
+#if 0 /* for non-thread-safe closures */
+#define SWAP(cl,f,v,o) (void) (*(o) = cl->f, cl->f = v)
+#define SET(cl,f,v) (void) (cl->f = v)
+#define INC(cl,f) (void) (cl->f += 1)
+#define INC_ASSIGN(cl,f,n) (void) (cl->f += 1, *(n) = cl->f)
+#define DEC(cl,f) (void) (cl->f -= 1)
+#define DEC_ASSIGN(cl,f,n) (void) (cl->f -= 1, *(n) = cl->f)
+#endif
+
+enum {
+ FNOTIFY,
+ INOTIFY,
+ PRE_NOTIFY,
+ POST_NOTIFY
+};
+
+
+/* --- functions --- */
+GClosure*
+g_closure_new_simple (guint sizeof_closure,
+ gpointer data)
+{
+ GClosure *closure;
+
+ g_return_val_if_fail (sizeof_closure >= sizeof (GClosure), NULL);
+
+ closure = g_malloc0 (sizeof_closure);
+ SET (closure, ref_count, 1);
+ SET (closure, meta_marshal, 0);
+ SET (closure, n_guards, 0);
+ SET (closure, n_fnotifiers, 0);
+ SET (closure, n_inotifiers, 0);
+ SET (closure, in_inotify, FALSE);
+ SET (closure, floating, TRUE);
+ SET (closure, derivative_flag, 0);
+ SET (closure, in_marshal, FALSE);
+ SET (closure, is_invalid, FALSE);
+ closure->marshal = NULL;
+ closure->data = data;
+ closure->notifiers = NULL;
+ memset (G_STRUCT_MEMBER_P (closure, sizeof (*closure)), 0, sizeof_closure - sizeof (*closure));
+
+ return closure;
+}
+
+static inline void
+closure_invoke_notifiers (GClosure *closure,
+ guint notify_type)
+{
+ /* notifier layout:
+ * meta_marshal n_guards n_guards n_fnotif. n_inotifiers
+ * ->[[meta_marshal][pre_guards][post_guards][fnotifiers][inotifiers]]
+ *
+ * CLOSURE_N_MFUNCS(cl) = meta_marshal + n_guards + n_guards;
+ * CLOSURE_N_NOTIFIERS(cl) = CLOSURE_N_MFUNCS(cl) + n_fnotifiers + n_inotifiers
+ *
+ * constrains/catches:
+ * - closure->notifiers may be reloacted during callback
+ * - closure->n_fnotifiers and closure->n_inotifiers may change during callback
+ * - i.e. callbacks can be removed/added during invocation
+ * - must prepare for callback removal during FNOTIFY and INOTIFY (done via ->marshal= & ->data=)
+ * - must distinguish (->marshal= & ->data=) for INOTIFY vs. FNOTIFY (via ->in_inotify)
+ * + closure->n_guards is const during PRE_NOTIFY & POST_NOTIFY
+ * + closure->meta_marshal is const for all cases
+ * + none of the callbacks can cause recursion
+ * + closure->n_inotifiers is const 0 during FNOTIFY
+ */
+ switch (notify_type)
+ {
+ GClosureNotifyData *ndata;
+ guint i, offs;
+ case FNOTIFY:
+ while (closure->n_fnotifiers)
+ {
+ guint n;
+ DEC_ASSIGN (closure, n_fnotifiers, &n);
+
+ ndata = closure->notifiers + CLOSURE_N_MFUNCS (closure) + n;
+ closure->marshal = (GClosureMarshal) ndata->notify;
+ closure->data = ndata->data;
+ ndata->notify (ndata->data, closure);
+ }
+ closure->marshal = NULL;
+ closure->data = NULL;
+ break;
+ case INOTIFY:
+ SET (closure, in_inotify, TRUE);
+ while (closure->n_inotifiers)
+ {
+ guint n;
+ DEC_ASSIGN (closure, n_inotifiers, &n);
+
+ ndata = closure->notifiers + CLOSURE_N_MFUNCS (closure) + closure->n_fnotifiers + n;
+ closure->marshal = (GClosureMarshal) ndata->notify;
+ closure->data = ndata->data;
+ ndata->notify (ndata->data, closure);
+ }
+ closure->marshal = NULL;
+ closure->data = NULL;
+ SET (closure, in_inotify, FALSE);
+ break;
+ case PRE_NOTIFY:
+ i = closure->n_guards;
+ offs = closure->meta_marshal;
+ while (i--)
+ {
+ ndata = closure->notifiers + offs + i;
+ ndata->notify (ndata->data, closure);
+ }
+ break;
+ case POST_NOTIFY:
+ i = closure->n_guards;
+ offs = closure->meta_marshal + i;
+ while (i--)
+ {
+ ndata = closure->notifiers + offs + i;
+ ndata->notify (ndata->data, closure);
+ }
+ break;
+ }
+}
+
+void
+g_closure_set_meta_marshal (GClosure *closure,
+ gpointer marshal_data,
+ GClosureMarshal meta_marshal)
+{
+ GClosureNotifyData *notifiers;
+
+ g_return_if_fail (closure != NULL);
+ g_return_if_fail (meta_marshal != NULL);
+ g_return_if_fail (closure->is_invalid == FALSE);
+ g_return_if_fail (closure->in_marshal == FALSE);
+ g_return_if_fail (closure->meta_marshal == 0);
+
+ notifiers = closure->notifiers;
+ closure->notifiers = g_renew (GClosureNotifyData, NULL, CLOSURE_N_NOTIFIERS (closure) + 1);
+ if (notifiers)
+ {
+ /* usually the meta marshal will be setup right after creation, so the
+ * g_memmove() should be rare-case scenario
+ */
+ g_memmove (closure->notifiers + 1, notifiers, CLOSURE_N_NOTIFIERS (closure) * sizeof (notifiers[0]));
+ g_free (notifiers);
+ }
+ closure->notifiers[0].data = marshal_data;
+ closure->notifiers[0].notify = (GClosureNotify) meta_marshal;
+ SET (closure, meta_marshal, 1);
+}
+
+void
+g_closure_add_marshal_guards (GClosure *closure,
+ gpointer pre_marshal_data,
+ GClosureNotify pre_marshal_notify,
+ gpointer post_marshal_data,
+ GClosureNotify post_marshal_notify)
+{
+ guint i;
+
+ g_return_if_fail (closure != NULL);
+ g_return_if_fail (pre_marshal_notify != NULL);
+ g_return_if_fail (post_marshal_notify != NULL);
+ g_return_if_fail (closure->is_invalid == FALSE);
+ g_return_if_fail (closure->in_marshal == FALSE);
+ g_return_if_fail (closure->n_guards < CLOSURE_MAX_N_GUARDS);
+
+ closure->notifiers = g_renew (GClosureNotifyData, closure->notifiers, CLOSURE_N_NOTIFIERS (closure) + 2);
+ if (closure->n_inotifiers)
+ closure->notifiers[(CLOSURE_N_MFUNCS (closure) +
+ closure->n_fnotifiers +
+ closure->n_inotifiers + 1)] = closure->notifiers[(CLOSURE_N_MFUNCS (closure) +
+ closure->n_fnotifiers + 0)];
+ if (closure->n_inotifiers > 1)
+ closure->notifiers[(CLOSURE_N_MFUNCS (closure) +
+ closure->n_fnotifiers +
+ closure->n_inotifiers)] = closure->notifiers[(CLOSURE_N_MFUNCS (closure) +
+ closure->n_fnotifiers + 1)];
+ if (closure->n_fnotifiers)
+ closure->notifiers[(CLOSURE_N_MFUNCS (closure) +
+ closure->n_fnotifiers + 1)] = closure->notifiers[CLOSURE_N_MFUNCS (closure) + 0];
+ if (closure->n_fnotifiers > 1)
+ closure->notifiers[(CLOSURE_N_MFUNCS (closure) +
+ closure->n_fnotifiers)] = closure->notifiers[CLOSURE_N_MFUNCS (closure) + 1];
+ if (closure->n_guards)
+ closure->notifiers[(closure->meta_marshal +
+ closure->n_guards +
+ closure->n_guards + 1)] = closure->notifiers[closure->meta_marshal + closure->n_guards];
+ i = closure->n_guards;
+ closure->notifiers[closure->meta_marshal + i].data = pre_marshal_data;
+ closure->notifiers[closure->meta_marshal + i].notify = pre_marshal_notify;
+ closure->notifiers[closure->meta_marshal + i + 1].data = post_marshal_data;
+ closure->notifiers[closure->meta_marshal + i + 1].notify = post_marshal_notify;
+ INC (closure, n_guards);
+}
+
+void
+g_closure_add_finalize_notifier (GClosure *closure,
+ gpointer notify_data,
+ GClosureNotify notify_func)
+{
+ guint i;
+
+ g_return_if_fail (closure != NULL);
+ g_return_if_fail (notify_func != NULL);
+ g_return_if_fail (closure->n_fnotifiers < CLOSURE_MAX_N_FNOTIFIERS);
+
+ closure->notifiers = g_renew (GClosureNotifyData, closure->notifiers, CLOSURE_N_NOTIFIERS (closure) + 1);
+ if (closure->n_inotifiers)
+ closure->notifiers[(CLOSURE_N_MFUNCS (closure) +
+ closure->n_fnotifiers +
+ closure->n_inotifiers)] = closure->notifiers[(CLOSURE_N_MFUNCS (closure) +
+ closure->n_fnotifiers + 0)];
+ i = CLOSURE_N_MFUNCS (closure) + closure->n_fnotifiers;
+ closure->notifiers[i].data = notify_data;
+ closure->notifiers[i].notify = notify_func;
+ INC (closure, n_fnotifiers);
+}
+
+void
+g_closure_add_invalidate_notifier (GClosure *closure,
+ gpointer notify_data,
+ GClosureNotify notify_func)
+{
+ guint i;
+
+ g_return_if_fail (closure != NULL);
+ g_return_if_fail (notify_func != NULL);
+ g_return_if_fail (closure->is_invalid == FALSE);
+ g_return_if_fail (closure->n_inotifiers < CLOSURE_MAX_N_INOTIFIERS);
+
+ closure->notifiers = g_renew (GClosureNotifyData, closure->notifiers, CLOSURE_N_NOTIFIERS (closure) + 1);
+ i = CLOSURE_N_MFUNCS (closure) + closure->n_fnotifiers + closure->n_inotifiers;
+ closure->notifiers[i].data = notify_data;
+ closure->notifiers[i].notify = notify_func;
+ INC (closure, n_inotifiers);
+}
+
+static inline gboolean
+closure_try_remove_inotify (GClosure *closure,
+ gpointer notify_data,
+ GClosureNotify notify_func)
+{
+ GClosureNotifyData *ndata, *nlast;
+
+ nlast = closure->notifiers + CLOSURE_N_NOTIFIERS (closure) - 1;
+ for (ndata = nlast + 1 - closure->n_inotifiers; ndata <= nlast; ndata++)
+ if (ndata->notify == notify_func && ndata->data == notify_data)
+ {
+ DEC (closure, n_inotifiers);
+ if (ndata < nlast)
+ *ndata = *nlast;
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static inline gboolean
+closure_try_remove_fnotify (GClosure *closure,
+ gpointer notify_data,
+ GClosureNotify notify_func)
+{
+ GClosureNotifyData *ndata, *nlast;
+
+ nlast = closure->notifiers + CLOSURE_N_NOTIFIERS (closure) - closure->n_inotifiers - 1;
+ for (ndata = nlast + 1 - closure->n_fnotifiers; ndata <= nlast; ndata++)
+ if (ndata->notify == notify_func && ndata->data == notify_data)
+ {
+ DEC (closure, n_fnotifiers);
+ if (ndata < nlast)
+ *ndata = *nlast;
+ if (closure->n_inotifiers)
+ closure->notifiers[(CLOSURE_N_MFUNCS (closure) +
+ closure->n_fnotifiers)] = closure->notifiers[(CLOSURE_N_MFUNCS (closure) +
+ closure->n_fnotifiers +
+ closure->n_inotifiers)];
+ return TRUE;
+ }
+ return FALSE;
+}
+
+GClosure*
+g_closure_ref (GClosure *closure)
+{
+ guint new_ref_count;
+ g_return_val_if_fail (closure != NULL, NULL);
+ g_return_val_if_fail (closure->ref_count > 0, NULL);
+ g_return_val_if_fail (closure->ref_count < CLOSURE_MAX_REF_COUNT, NULL);
+
+ INC_ASSIGN (closure, ref_count, &new_ref_count);
+ g_return_val_if_fail (new_ref_count > 1, NULL);
+
+ return closure;
+}
+
+void
+g_closure_invalidate (GClosure *closure)
+{
+ g_return_if_fail (closure != NULL);
+
+ if (!closure->is_invalid)
+ {
+ gboolean was_invalid;
+ g_closure_ref (closure); /* preserve floating flag */
+ SWAP (closure, is_invalid, TRUE, &was_invalid);
+ /* invalidate only once */
+ if (!was_invalid)
+ closure_invoke_notifiers (closure, INOTIFY);
+ g_closure_unref (closure);
+ }
+}
+
+void
+g_closure_unref (GClosure *closure)
+{
+ guint new_ref_count;
+
+ g_return_if_fail (closure != NULL);
+ g_return_if_fail (closure->ref_count > 0);
+
+ if (closure->ref_count == 1) /* last unref, invalidate first */
+ g_closure_invalidate (closure);
+
+ DEC_ASSIGN (closure, ref_count, &new_ref_count);
+
+ if (new_ref_count == 0)
+ {
+ closure_invoke_notifiers (closure, FNOTIFY);
+ g_free (closure->notifiers);
+ g_free (closure);
+ }
+}
+
+void
+g_closure_sink (GClosure *closure)
+{
+ g_return_if_fail (closure != NULL);
+ g_return_if_fail (closure->ref_count > 0);
+
+ /* floating is basically a kludge to avoid creating closures
+ * with a ref_count of 0. so the intial ref_count a closure has
+ * is unowned. with invoking g_closure_sink() code may
+ * indicate that it takes over that intiial ref_count.
+ */
+ if (closure->floating)
+ {
+ gboolean was_floating;
+ SWAP (closure, floating, FALSE, &was_floating);
+ /* unref floating flag only once */
+ if (was_floating)
+ g_closure_unref (closure);
+ }
+}
+
+void
+g_closure_remove_invalidate_notifier (GClosure *closure,
+ gpointer notify_data,
+ GClosureNotify notify_func)
+{
+ g_return_if_fail (closure != NULL);
+ g_return_if_fail (notify_func != NULL);
+
+ if (closure->is_invalid && closure->in_inotify && /* account removal of notify_func() while its called */
+ ((gpointer) closure->marshal) == ((gpointer) notify_func) &&
+ closure->data == notify_data)
+ closure->marshal = NULL;
+ else if (!closure_try_remove_inotify (closure, notify_data, notify_func))
+ g_warning (G_STRLOC ": unable to remove uninstalled invalidation notifier: %p (%p)",
+ notify_func, notify_data);
+}
+
+void
+g_closure_remove_finalize_notifier (GClosure *closure,
+ gpointer notify_data,
+ GClosureNotify notify_func)
+{
+ g_return_if_fail (closure != NULL);
+ g_return_if_fail (notify_func != NULL);
+
+ if (closure->is_invalid && !closure->in_inotify && /* account removal of notify_func() while its called */
+ ((gpointer) closure->marshal) == ((gpointer) notify_func) &&
+ closure->data == notify_data)
+ closure->marshal = NULL;
+ else if (!closure_try_remove_fnotify (closure, notify_data, notify_func))
+ g_warning (G_STRLOC ": unable to remove uninstalled finalization notifier: %p (%p)",
+ notify_func, notify_data);
+}
+
+void
+g_closure_invoke (GClosure *closure,
+ GValue /*out*/ *return_value,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer invocation_hint)
+{
+ g_return_if_fail (closure != NULL);
+
+ g_closure_ref (closure); /* preserve floating flag */
+ if (!closure->is_invalid)
+ {
+ GClosureMarshal marshal;
+ gpointer marshal_data;
+ gboolean in_marshal = closure->in_marshal;
+
+ g_return_if_fail (closure->marshal || closure->meta_marshal);
+
+ SET (closure, in_marshal, TRUE);
+ if (closure->meta_marshal)
+ {
+ marshal_data = closure->notifiers[0].data;
+ marshal = (GClosureMarshal) closure->notifiers[0].notify;
+ }
+ else
+ {
+ marshal_data = NULL;
+ marshal = closure->marshal;
+ }
+ if (!in_marshal)
+ closure_invoke_notifiers (closure, PRE_NOTIFY);
+ marshal (closure,
+ return_value,
+ n_param_values, param_values,
+ invocation_hint,
+ marshal_data);
+ if (!in_marshal)
+ closure_invoke_notifiers (closure, POST_NOTIFY);
+ SET (closure, in_marshal, in_marshal);
+ }
+ g_closure_unref (closure);
+}
+
+void
+g_closure_set_marshal (GClosure *closure,
+ GClosureMarshal marshal)
+{
+ g_return_if_fail (closure != NULL);
+ g_return_if_fail (marshal != NULL);
+
+ if (closure->marshal && closure->marshal != marshal)
+ g_warning ("attempt to override closure->marshal (%p) with new marshal (%p)",
+ closure->marshal, marshal);
+ else
+ closure->marshal = marshal;
+}
+
+GClosure*
+g_cclosure_new (GCallback callback_func,
+ gpointer user_data,
+ GClosureNotify destroy_data)
+{
+ GClosure *closure;
+
+ g_return_val_if_fail (callback_func != NULL, NULL);
+
+ closure = g_closure_new_simple (sizeof (GCClosure), user_data);
+ if (destroy_data)
+ g_closure_add_finalize_notifier (closure, user_data, destroy_data);
+ ((GCClosure*) closure)->callback = (gpointer) callback_func;
+
+ return closure;
+}
+
+GClosure*
+g_cclosure_new_swap (GCallback callback_func,
+ gpointer user_data,
+ GClosureNotify destroy_data)
+{
+ GClosure *closure;
+
+ g_return_val_if_fail (callback_func != NULL, NULL);
+
+ closure = g_closure_new_simple (sizeof (GCClosure), user_data);
+ if (destroy_data)
+ g_closure_add_finalize_notifier (closure, user_data, destroy_data);
+ ((GCClosure*) closure)->callback = (gpointer) callback_func;
+ SET (closure, derivative_flag, TRUE);
+
+ return closure;
+}
+
+static void
+g_type_class_meta_marshal (GClosure *closure,
+ GValue /*out*/ *return_value,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer invocation_hint,
+ gpointer marshal_data)
+{
+ GTypeClass *class;
+ gpointer callback;
+ /* GType itype = (GType) closure->data; */
+ guint offset = GPOINTER_TO_UINT (marshal_data);
+
+ class = G_TYPE_INSTANCE_GET_CLASS (g_value_peek_pointer (param_values + 0), itype, GTypeClass);
+ callback = G_STRUCT_MEMBER (gpointer, class, offset);
+ if (callback)
+ closure->marshal (closure,
+ return_value,
+ n_param_values, param_values,
+ invocation_hint,
+ callback);
+}
+
+static void
+g_type_iface_meta_marshal (GClosure *closure,
+ GValue /*out*/ *return_value,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer invocation_hint,
+ gpointer marshal_data)
+{
+ GTypeClass *class;
+ gpointer callback;
+ GType itype = (GType) closure->data;
+ guint offset = GPOINTER_TO_UINT (marshal_data);
+
+ class = G_TYPE_INSTANCE_GET_INTERFACE (g_value_peek_pointer (param_values + 0), itype, GTypeClass);
+ callback = G_STRUCT_MEMBER (gpointer, class, offset);
+ if (callback)
+ closure->marshal (closure,
+ return_value,
+ n_param_values, param_values,
+ invocation_hint,
+ callback);
+}
+
+GClosure*
+g_signal_type_cclosure_new (GType itype,
+ guint struct_offset)
+{
+ GClosure *closure;
+
+ g_return_val_if_fail (G_TYPE_IS_CLASSED (itype) || G_TYPE_IS_INTERFACE (itype), NULL);
+ g_return_val_if_fail (struct_offset >= sizeof (GTypeClass), NULL);
+
+ closure = g_closure_new_simple (sizeof (GClosure), (gpointer) itype);
+ if (G_TYPE_IS_INTERFACE (itype))
+ g_closure_set_meta_marshal (closure, GUINT_TO_POINTER (struct_offset), g_type_iface_meta_marshal);
+ else
+ g_closure_set_meta_marshal (closure, GUINT_TO_POINTER (struct_offset), g_type_class_meta_marshal);
+
+ return closure;
+}
+
+#define __G_CLOSURE_C__
+#include "gobjectaliasdef.c"
diff --git a/trunk/gobject/gclosure.h b/trunk/gobject/gclosure.h
new file mode 100644
index 000000000..7a2078d58
--- /dev/null
+++ b/trunk/gobject/gclosure.h
@@ -0,0 +1,166 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2000-2001 Red Hat, Inc.
+ * Copyright (C) 2005 Imendio AB
+ *
+ * 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.
+ */
+#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
+#error "Only <glib-object.h> can be included directly."
+#endif
+
+#ifndef __G_CLOSURE_H__
+#define __G_CLOSURE_H__
+
+#include <gobject/gtype.h>
+
+G_BEGIN_DECLS
+
+/* --- defines --- */
+#define G_CLOSURE_NEEDS_MARSHAL(closure) (((GClosure*) (closure))->marshal == NULL)
+#define G_CLOSURE_N_NOTIFIERS(cl) ((cl)->meta_marshal + ((cl)->n_guards << 1L) + \
+ (cl)->n_fnotifiers + (cl)->n_inotifiers)
+#define G_CCLOSURE_SWAP_DATA(cclosure) (((GClosure*) (closure))->derivative_flag)
+#define G_CALLBACK(f) ((GCallback) (f))
+
+
+/* -- typedefs --- */
+typedef struct _GClosure GClosure;
+typedef struct _GClosureNotifyData GClosureNotifyData;
+typedef void (*GCallback) (void);
+typedef void (*GClosureNotify) (gpointer data,
+ GClosure *closure);
+typedef void (*GClosureMarshal) (GClosure *closure,
+ GValue *return_value,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer invocation_hint,
+ gpointer marshal_data);
+typedef struct _GCClosure GCClosure;
+
+
+/* --- structures --- */
+struct _GClosureNotifyData
+{
+ gpointer data;
+ GClosureNotify notify;
+};
+struct _GClosure
+{
+ /*< private >*/
+ volatile guint ref_count : 15;
+ volatile guint meta_marshal : 1;
+ volatile guint n_guards : 1;
+ volatile guint n_fnotifiers : 2; /* finalization notifiers */
+ volatile guint n_inotifiers : 8; /* invalidation notifiers */
+ volatile guint in_inotify : 1;
+ volatile guint floating : 1;
+ /*< protected >*/
+ volatile guint derivative_flag : 1;
+ /*< public >*/
+ volatile guint in_marshal : 1;
+ volatile guint is_invalid : 1;
+
+ /*< private >*/ void (*marshal) (GClosure *closure,
+ GValue /*out*/ *return_value,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer invocation_hint,
+ gpointer marshal_data);
+ /*< protected >*/ gpointer data;
+
+ /*< private >*/ GClosureNotifyData *notifiers;
+
+ /* invariants/constrains:
+ * - ->marshal and ->data are _invalid_ as soon as ->is_invalid==TRUE
+ * - invocation of all inotifiers occours prior to fnotifiers
+ * - order of inotifiers is random
+ * inotifiers may _not_ free/invalidate parameter values (e.g. ->data)
+ * - order of fnotifiers is random
+ * - each notifier may only be removed before or during its invocation
+ * - reference counting may only happen prior to fnotify invocation
+ * (in that sense, fnotifiers are really finalization handlers)
+ */
+};
+/* closure for C function calls, callback() is the user function
+ */
+struct _GCClosure
+{
+ GClosure closure;
+ gpointer callback;
+};
+
+
+/* --- prototypes --- */
+GClosure* g_cclosure_new (GCallback callback_func,
+ gpointer user_data,
+ GClosureNotify destroy_data);
+GClosure* g_cclosure_new_swap (GCallback callback_func,
+ gpointer user_data,
+ GClosureNotify destroy_data);
+GClosure* g_signal_type_cclosure_new (GType itype,
+ guint struct_offset);
+
+
+/* --- prototypes --- */
+GClosure* g_closure_ref (GClosure *closure);
+void g_closure_sink (GClosure *closure);
+void g_closure_unref (GClosure *closure);
+/* intimidating */
+GClosure* g_closure_new_simple (guint sizeof_closure,
+ gpointer data);
+void g_closure_add_finalize_notifier (GClosure *closure,
+ gpointer notify_data,
+ GClosureNotify notify_func);
+void g_closure_remove_finalize_notifier (GClosure *closure,
+ gpointer notify_data,
+ GClosureNotify notify_func);
+void g_closure_add_invalidate_notifier (GClosure *closure,
+ gpointer notify_data,
+ GClosureNotify notify_func);
+void g_closure_remove_invalidate_notifier (GClosure *closure,
+ gpointer notify_data,
+ GClosureNotify notify_func);
+void g_closure_add_marshal_guards (GClosure *closure,
+ gpointer pre_marshal_data,
+ GClosureNotify pre_marshal_notify,
+ gpointer post_marshal_data,
+ GClosureNotify post_marshal_notify);
+void g_closure_set_marshal (GClosure *closure,
+ GClosureMarshal marshal);
+void g_closure_set_meta_marshal (GClosure *closure,
+ gpointer marshal_data,
+ GClosureMarshal meta_marshal);
+void g_closure_invalidate (GClosure *closure);
+void g_closure_invoke (GClosure *closure,
+ GValue /*out*/ *return_value,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer invocation_hint);
+
+/* FIXME:
+ OK: data_object::destroy -> closure_invalidate();
+ MIS: closure_invalidate() -> disconnect(closure);
+ MIS: disconnect(closure) -> (unlink) closure_unref();
+ OK: closure_finalize() -> g_free (data_string);
+
+ random remarks:
+ - need marshaller repo with decent aliasing to base types
+ - provide marshaller collection, virtually covering anything out there
+*/
+
+G_END_DECLS
+
+#endif /* __G_CLOSURE_H__ */
diff --git a/trunk/gobject/genums.c b/trunk/gobject/genums.c
new file mode 100644
index 000000000..f5d2115b0
--- /dev/null
+++ b/trunk/gobject/genums.c
@@ -0,0 +1,435 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1998-1999, 2000-2001 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.
+ */
+
+/*
+ * MT safe
+ */
+
+#include <string.h>
+
+#include "genums.h"
+
+#include "gvalue.h"
+#include "gvaluecollector.h"
+
+#include "gobjectalias.h"
+
+
+/* --- prototypes --- */
+static void g_enum_class_init (GEnumClass *class,
+ gpointer class_data);
+static void g_flags_class_init (GFlagsClass *class,
+ gpointer class_data);
+static void value_flags_enum_init (GValue *value);
+static void value_flags_enum_copy_value (const GValue *src_value,
+ GValue *dest_value);
+static gchar* value_flags_enum_collect_value (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags);
+static gchar* value_flags_enum_lcopy_value (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags);
+
+/* --- functions --- */
+void
+g_enum_types_init (void)
+{
+ static gboolean initialized = FALSE;
+ static const GTypeValueTable flags_enum_value_table = {
+ value_flags_enum_init, /* value_init */
+ NULL, /* value_free */
+ value_flags_enum_copy_value, /* value_copy */
+ NULL, /* value_peek_pointer */
+ "i", /* collect_format */
+ value_flags_enum_collect_value, /* collect_value */
+ "p", /* lcopy_format */
+ value_flags_enum_lcopy_value, /* lcopy_value */
+ };
+ static GTypeInfo info = {
+ 0, /* class_size */
+ NULL, /* base_init */
+ NULL, /* base_destroy */
+ NULL, /* class_init */
+ NULL, /* class_destroy */
+ NULL, /* class_data */
+ 0, /* instance_size */
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ &flags_enum_value_table, /* value_table */
+ };
+ static const GTypeFundamentalInfo finfo = {
+ G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_DERIVABLE,
+ };
+ GType type;
+
+ g_return_if_fail (initialized == FALSE);
+ initialized = TRUE;
+
+ /* G_TYPE_ENUM
+ */
+ info.class_size = sizeof (GEnumClass);
+ type = g_type_register_fundamental (G_TYPE_ENUM, g_intern_static_string ("GEnum"), &info, &finfo,
+ G_TYPE_FLAG_ABSTRACT | G_TYPE_FLAG_VALUE_ABSTRACT);
+ g_assert (type == G_TYPE_ENUM);
+
+ /* G_TYPE_FLAGS
+ */
+ info.class_size = sizeof (GFlagsClass);
+ type = g_type_register_fundamental (G_TYPE_FLAGS, g_intern_static_string ("GFlags"), &info, &finfo,
+ G_TYPE_FLAG_ABSTRACT | G_TYPE_FLAG_VALUE_ABSTRACT);
+ g_assert (type == G_TYPE_FLAGS);
+}
+
+static void
+value_flags_enum_init (GValue *value)
+{
+ value->data[0].v_long = 0;
+}
+
+static void
+value_flags_enum_copy_value (const GValue *src_value,
+ GValue *dest_value)
+{
+ dest_value->data[0].v_long = src_value->data[0].v_long;
+}
+
+static gchar*
+value_flags_enum_collect_value (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ value->data[0].v_long = collect_values[0].v_int;
+
+ return NULL;
+}
+
+static gchar*
+value_flags_enum_lcopy_value (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ gint *int_p = collect_values[0].v_pointer;
+
+ if (!int_p)
+ return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+
+ *int_p = value->data[0].v_long;
+
+ return NULL;
+}
+
+GType
+g_enum_register_static (const gchar *name,
+ const GEnumValue *const_static_values)
+{
+ GTypeInfo enum_type_info = {
+ sizeof (GEnumClass), /* class_size */
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) g_enum_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ 0, /* instance_size */
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ NULL, /* value_table */
+ };
+ GType type;
+
+ g_return_val_if_fail (name != NULL, 0);
+ g_return_val_if_fail (const_static_values != NULL, 0);
+
+ enum_type_info.class_data = const_static_values;
+
+ type = g_type_register_static (G_TYPE_ENUM, name, &enum_type_info, 0);
+
+ return type;
+}
+
+GType
+g_flags_register_static (const gchar *name,
+ const GFlagsValue *const_static_values)
+{
+ GTypeInfo flags_type_info = {
+ sizeof (GFlagsClass), /* class_size */
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) g_flags_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ 0, /* instance_size */
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ NULL, /* value_table */
+ };
+ GType type;
+
+ g_return_val_if_fail (name != NULL, 0);
+ g_return_val_if_fail (const_static_values != NULL, 0);
+
+ flags_type_info.class_data = const_static_values;
+
+ type = g_type_register_static (G_TYPE_FLAGS, name, &flags_type_info, 0);
+
+ return type;
+}
+
+void
+g_enum_complete_type_info (GType g_enum_type,
+ GTypeInfo *info,
+ const GEnumValue *const_values)
+{
+ g_return_if_fail (G_TYPE_IS_ENUM (g_enum_type));
+ g_return_if_fail (info != NULL);
+ g_return_if_fail (const_values != NULL);
+
+ info->class_size = sizeof (GEnumClass);
+ info->base_init = NULL;
+ info->base_finalize = NULL;
+ info->class_init = (GClassInitFunc) g_enum_class_init;
+ info->class_finalize = NULL;
+ info->class_data = const_values;
+}
+
+void
+g_flags_complete_type_info (GType g_flags_type,
+ GTypeInfo *info,
+ const GFlagsValue *const_values)
+{
+ g_return_if_fail (G_TYPE_IS_FLAGS (g_flags_type));
+ g_return_if_fail (info != NULL);
+ g_return_if_fail (const_values != NULL);
+
+ info->class_size = sizeof (GFlagsClass);
+ info->base_init = NULL;
+ info->base_finalize = NULL;
+ info->class_init = (GClassInitFunc) g_flags_class_init;
+ info->class_finalize = NULL;
+ info->class_data = const_values;
+}
+
+static void
+g_enum_class_init (GEnumClass *class,
+ gpointer class_data)
+{
+ g_return_if_fail (G_IS_ENUM_CLASS (class));
+
+ class->minimum = 0;
+ class->maximum = 0;
+ class->n_values = 0;
+ class->values = class_data;
+
+ if (class->values)
+ {
+ GEnumValue *values;
+
+ class->minimum = class->values->value;
+ class->maximum = class->values->value;
+ for (values = class->values; values->value_name; values++)
+ {
+ class->minimum = MIN (class->minimum, values->value);
+ class->maximum = MAX (class->maximum, values->value);
+ class->n_values++;
+ }
+ }
+}
+
+static void
+g_flags_class_init (GFlagsClass *class,
+ gpointer class_data)
+{
+ g_return_if_fail (G_IS_FLAGS_CLASS (class));
+
+ class->mask = 0;
+ class->n_values = 0;
+ class->values = class_data;
+
+ if (class->values)
+ {
+ GFlagsValue *values;
+
+ for (values = class->values; values->value_name; values++)
+ {
+ class->mask |= values->value;
+ class->n_values++;
+ }
+ }
+}
+
+GEnumValue*
+g_enum_get_value_by_name (GEnumClass *enum_class,
+ const gchar *name)
+{
+ g_return_val_if_fail (G_IS_ENUM_CLASS (enum_class), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ if (enum_class->n_values)
+ {
+ GEnumValue *enum_value;
+
+ for (enum_value = enum_class->values; enum_value->value_name; enum_value++)
+ if (strcmp (name, enum_value->value_name) == 0)
+ return enum_value;
+ }
+
+ return NULL;
+}
+
+GFlagsValue*
+g_flags_get_value_by_name (GFlagsClass *flags_class,
+ const gchar *name)
+{
+ g_return_val_if_fail (G_IS_FLAGS_CLASS (flags_class), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ if (flags_class->n_values)
+ {
+ GFlagsValue *flags_value;
+
+ for (flags_value = flags_class->values; flags_value->value_name; flags_value++)
+ if (strcmp (name, flags_value->value_name) == 0)
+ return flags_value;
+ }
+
+ return NULL;
+}
+
+GEnumValue*
+g_enum_get_value_by_nick (GEnumClass *enum_class,
+ const gchar *nick)
+{
+ g_return_val_if_fail (G_IS_ENUM_CLASS (enum_class), NULL);
+ g_return_val_if_fail (nick != NULL, NULL);
+
+ if (enum_class->n_values)
+ {
+ GEnumValue *enum_value;
+
+ for (enum_value = enum_class->values; enum_value->value_name; enum_value++)
+ if (enum_value->value_nick && strcmp (nick, enum_value->value_nick) == 0)
+ return enum_value;
+ }
+
+ return NULL;
+}
+
+GFlagsValue*
+g_flags_get_value_by_nick (GFlagsClass *flags_class,
+ const gchar *nick)
+{
+ g_return_val_if_fail (G_IS_FLAGS_CLASS (flags_class), NULL);
+ g_return_val_if_fail (nick != NULL, NULL);
+
+ if (flags_class->n_values)
+ {
+ GFlagsValue *flags_value;
+
+ for (flags_value = flags_class->values; flags_value->value_nick; flags_value++)
+ if (flags_value->value_nick && strcmp (nick, flags_value->value_nick) == 0)
+ return flags_value;
+ }
+
+ return NULL;
+}
+
+GEnumValue*
+g_enum_get_value (GEnumClass *enum_class,
+ gint value)
+{
+ g_return_val_if_fail (G_IS_ENUM_CLASS (enum_class), NULL);
+
+ if (enum_class->n_values)
+ {
+ GEnumValue *enum_value;
+
+ for (enum_value = enum_class->values; enum_value->value_name; enum_value++)
+ if (enum_value->value == value)
+ return enum_value;
+ }
+
+ return NULL;
+}
+
+GFlagsValue*
+g_flags_get_first_value (GFlagsClass *flags_class,
+ guint value)
+{
+ g_return_val_if_fail (G_IS_FLAGS_CLASS (flags_class), NULL);
+
+ if (flags_class->n_values)
+ {
+ GFlagsValue *flags_value;
+
+ if (value == 0)
+ {
+ for (flags_value = flags_class->values; flags_value->value_name; flags_value++)
+ if (flags_value->value == 0)
+ return flags_value;
+ }
+ else
+ {
+ for (flags_value = flags_class->values; flags_value->value_name; flags_value++)
+ if (flags_value->value != 0 && (flags_value->value & value) == flags_value->value)
+ return flags_value;
+ }
+ }
+
+ return NULL;
+}
+
+void
+g_value_set_enum (GValue *value,
+ gint v_enum)
+{
+ g_return_if_fail (G_VALUE_HOLDS_ENUM (value));
+
+ value->data[0].v_long = v_enum;
+}
+
+gint
+g_value_get_enum (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_ENUM (value), 0);
+
+ return value->data[0].v_long;
+}
+
+void
+g_value_set_flags (GValue *value,
+ guint v_flags)
+{
+ g_return_if_fail (G_VALUE_HOLDS_FLAGS (value));
+
+ value->data[0].v_ulong = v_flags;
+}
+
+guint
+g_value_get_flags (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_FLAGS (value), 0);
+
+ return value->data[0].v_ulong;
+}
+
+#define __G_ENUMS_C__
+#include "gobjectaliasdef.c"
diff --git a/trunk/gobject/genums.h b/trunk/gobject/genums.h
new file mode 100644
index 000000000..5d16c53c0
--- /dev/null
+++ b/trunk/gobject/genums.h
@@ -0,0 +1,125 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1998-1999, 2000-2001 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.
+ */
+#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
+#error "Only <glib-object.h> can be included directly."
+#endif
+
+#ifndef __G_ENUMS_H__
+#define __G_ENUMS_H__
+
+#include <gobject/gtype.h>
+
+G_BEGIN_DECLS
+
+/* --- type macros --- */
+#define G_TYPE_IS_ENUM(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_ENUM)
+#define G_ENUM_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_ENUM, GEnumClass))
+#define G_IS_ENUM_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_ENUM))
+#define G_ENUM_CLASS_TYPE(class) (G_TYPE_FROM_CLASS (class))
+#define G_ENUM_CLASS_TYPE_NAME(class) (g_type_name (G_ENUM_CLASS_TYPE (class)))
+#define G_TYPE_IS_FLAGS(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_FLAGS)
+#define G_FLAGS_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_FLAGS, GFlagsClass))
+#define G_IS_FLAGS_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_FLAGS))
+#define G_FLAGS_CLASS_TYPE(class) (G_TYPE_FROM_CLASS (class))
+#define G_FLAGS_CLASS_TYPE_NAME(class) (g_type_name (G_FLAGS_CLASS_TYPE (class)))
+#define G_VALUE_HOLDS_ENUM(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_ENUM))
+#define G_VALUE_HOLDS_FLAGS(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_FLAGS))
+
+
+/* --- enum/flag values & classes --- */
+typedef struct _GEnumClass GEnumClass;
+typedef struct _GFlagsClass GFlagsClass;
+typedef struct _GEnumValue GEnumValue;
+typedef struct _GFlagsValue GFlagsValue;
+struct _GEnumClass
+{
+ GTypeClass g_type_class;
+
+ /*< public >*/
+ gint minimum;
+ gint maximum;
+ guint n_values;
+ GEnumValue *values;
+};
+struct _GFlagsClass
+{
+ GTypeClass g_type_class;
+
+ /*< public >*/
+ guint mask;
+ guint n_values;
+ GFlagsValue *values;
+};
+struct _GEnumValue
+{
+ gint value;
+ const gchar *value_name;
+ const gchar *value_nick;
+};
+struct _GFlagsValue
+{
+ guint value;
+ const gchar *value_name;
+ const gchar *value_nick;
+};
+
+
+/* --- prototypes --- */
+GEnumValue* g_enum_get_value (GEnumClass *enum_class,
+ gint value);
+GEnumValue* g_enum_get_value_by_name (GEnumClass *enum_class,
+ const gchar *name);
+GEnumValue* g_enum_get_value_by_nick (GEnumClass *enum_class,
+ const gchar *nick);
+GFlagsValue* g_flags_get_first_value (GFlagsClass *flags_class,
+ guint value);
+GFlagsValue* g_flags_get_value_by_name (GFlagsClass *flags_class,
+ const gchar *name);
+GFlagsValue* g_flags_get_value_by_nick (GFlagsClass *flags_class,
+ const gchar *nick);
+void g_value_set_enum (GValue *value,
+ gint v_enum);
+gint g_value_get_enum (const GValue *value);
+void g_value_set_flags (GValue *value,
+ guint v_flags);
+guint g_value_get_flags (const GValue *value);
+
+
+
+/* --- registration functions --- */
+/* const_static_values is a NULL terminated array of enum/flags
+ * values that is taken over!
+ */
+GType g_enum_register_static (const gchar *name,
+ const GEnumValue *const_static_values);
+GType g_flags_register_static (const gchar *name,
+ const GFlagsValue *const_static_values);
+/* functions to complete the type information
+ * for enums/flags implemented by plugins
+ */
+void g_enum_complete_type_info (GType g_enum_type,
+ GTypeInfo *info,
+ const GEnumValue *const_values);
+void g_flags_complete_type_info (GType g_flags_type,
+ GTypeInfo *info,
+ const GFlagsValue *const_values);
+
+G_END_DECLS
+
+#endif /* __G_ENUMS_H__ */
diff --git a/trunk/gobject/glib-genmarshal.1 b/trunk/gobject/glib-genmarshal.1
new file mode 100644
index 000000000..f0adfaafd
--- /dev/null
+++ b/trunk/gobject/glib-genmarshal.1
@@ -0,0 +1,212 @@
+.TH GLIB-GENMARSHAL 1 "18 Oct 2000"
+.SH NAME
+glib-genmarshal \- C code marshaller generation utility for GLib closures
+.SH SYNOPSIS
+
+\fBglib-genmarshal\fP [\fIoptions\fP] [\fIfiles...\fP]
+
+.SH DESCRIPTION
+\fBglib-genmarshal\fP is a small utility that generates C code marshallers
+for callback functions of the GClosure mechanism in the GObject sublibrary
+of GLib. The marshaller functions have a standard signature, they get passed
+in the invoking closure, an array of value structures holding the callback
+function parameters and a value structure for the return value of the
+callback. The marshaller is then responsible to call the respective C code
+function of the closure with all the parameters on the stack and to collect
+its return value.
+
+.SH INVOCATION
+
+\fBglib-genmarshal\fP takes a list of marshallers to generate as input.
+The marshaller list is either read from standard input or from files
+passed as additional arguments on the command line.
+
+.SS Options
+.TP
+\fI--header
+Generate header file contents of the marshallers.
+.TP
+\fI--body
+Generate C code file contents of the marshallers.
+.TP
+\fI--prefix=string, --prefix string
+Specify marshaller prefix. The default prefix is `\fIg_cclosure_marshal\fP'.
+.TP
+\fI--skip-source
+Skip source location remarks in generated comments.
+.TP
+\fI--nostdinc
+Do not use the standard marshallers of the GObject library, and skip
+gmarshal.h include directive in generated header files.
+.TP
+\fI--internal
+Mark generated function as internal by using the G_GNUC_INTERNAL macro.
+.TP
+\fI--g-fatal-warnings
+Make warnings fatal, that is, exit immediately once a warning occurs.
+.TP
+\fI-h, --help\fP
+Print brief help and exit.
+.TP
+\fI-v, --version\fP
+Print version and exit.
+.PP
+
+.SS Marshaller list format
+.PP
+The marshaller lists are processed line by line, a line can contain a
+comment in the form of
+.RS
+.PP
+# this is a comment
+.PP
+.RE
+or a marshaller specification of the form
+.RS
+.PP
+\fIRTYPE\fP:\fBPTYPE\fP
+.PP
+\fIRTYPE\fP:\fBPTYPE\fP,\fBPTYPE\fP
+.PP
+\fIRTYPE\fP:\fBPTYPE\fP,\fBPTYPE\fP,\fBPTYPE\fP
+.PP
+# up to 16 \fBPTYPE\fPs may be present
+.PP
+.RE
+The \fIRTYPE\fP part specifies the callback's return type and
+the \fBPTYPE\fPs right to the colon specify the callback's
+parameter list, except for the first and the last arguments which
+are always pointers.
+.PP
+
+.SS Parameter types
+Currently, the following types are supported:
+.TP 12
+\fIVOID
+indicates no return type, or no extra parameters. if \fIVOID\fP is used as
+the parameter list, no additional parameters may be present.
+.TP 12
+\fIBOOLEAN
+for boolean types (gboolean)
+.TP 12
+\fICHAR
+for signed char types (gchar)
+.TP 12
+\fIUCHAR
+for unsigned char types (guchar)
+.TP 12
+\fIINT
+for signed integer types (gint)
+.TP 12
+\fIUINT
+for unsigned integer types (guint)
+.TP 12
+\fILONG
+for signed long integer types (glong)
+.TP 12
+\fIULONG
+for unsigned long integer types (gulong)
+.TP 12
+\fIINT64
+for signed 64bit integer types (gint64)
+.TP 12
+\fIUINT64
+for unsigned 64bit integer types (guint64)
+.TP 12
+\fIENUM
+for enumeration types (gint)
+.TP 12
+\fIFLAGS
+for flag enumeration types (guint)
+.TP 12
+\fIFLOAT
+for single-precision float types (gfloat)
+.TP 12
+\fIDOUBLE
+for double-precision float types (gdouble)
+.TP 12
+\fISTRING
+for string types (gchar*)
+.TP 12
+\fIBOXED
+for boxed (anonymous but reference counted) types (GBoxed*)
+.TP 12
+\fIPARAM
+for GParamSpec or derived types (GParamSpec*)
+.TP 12
+\fIPOINTER
+for anonymous pointer types (gpointer)
+.TP 12
+\fIOBJECT
+for GObject or derived types (GObject*)
+.TP 12
+\fINONE
+deprecated alias for \fIVOID\fP
+.TP 12
+\fIBOOL
+deprecated alias for \fIBOOLEAN\fP
+
+.SH EXAMPLE
+To generate marshallers for the following callback functions:
+.PP
+.RS
+.nf
+void foo (gpointer data1,
+ gpointer data2);
+void bar (gpointer data1,
+ gint param1,
+ gpointer data2);
+gfloat baz (gpointer data1,
+ gboolean param1,
+ guchar param2,
+ gpointer data2);
+.fi
+.RE
+.PP
+The marshaller list has to look like this:
+.PP
+.RS
+.nf
+VOID:VOID
+VOID:INT
+FLOAT:BOOLEAN,UCHAR
+.fi
+.RE
+.PP
+The generated marshallers have the arguments encoded
+in their function name. For this particular list, they
+are
+g_cclosure_marshal_VOID__VOID(),
+g_cclosure_marshal_VOID__INT(),
+g_cclosure_marshal_FLOAT__BOOLEAN_UCHAR().
+.PP
+They can be used directly for GClosures or be passed in as
+the GSignalCMarshaller c_marshaller; argument upon creation
+of signals:
+.PP
+.nf
+GClosure *cc_foo, *cc_bar, *cc_baz;
+
+cc_foo = g_cclosure_new (NULL, foo, NULL);
+g_closure_set_marshal (cc_foo, g_cclosure_marshal_VOID__VOID);
+cc_bar = g_cclosure_new (NULL, bar, NULL);
+g_closure_set_marshal (cc_bar, g_cclosure_marshal_VOID__INT);
+cc_baz = g_cclosure_new (NULL, baz, NULL);
+g_closure_set_marshal (cc_baz, g_cclosure_marshal_FLOAT__BOOLEAN_UCHAR);
+.fi
+.PP
+
+
+.SH SEE ALSO
+\fB
+glib-mkenums(1)
+\fP
+
+.SH BUGS
+None known yet.
+
+.SH AUTHOR
+.B glib-genmarshal
+has been written by Tim Janik <timj@gtk.org>.
+.PP
+This manual page was provided by Tim Janik <timj@gtk.org>.
diff --git a/trunk/gobject/glib-genmarshal.c b/trunk/gobject/glib-genmarshal.c
new file mode 100644
index 000000000..a36842d4c
--- /dev/null
+++ b/trunk/gobject/glib-genmarshal.c
@@ -0,0 +1,884 @@
+/* GLIB-GenMarshal - Marshaller generator for GObject library
+ * Copyright (C) 2000-2001 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 "config.h"
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "GLib-Genmarshal"
+#include <glib.h>
+
+#include <glib/gprintf.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <string.h>
+#include <errno.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef G_OS_WIN32
+#include <io.h>
+#endif
+
+/* --- defines --- */
+#define PRG_NAME "glib-genmarshal"
+#define PKG_NAME "GLib"
+#define PKG_HTTP_HOME "http://www.gtk.org"
+
+
+/* --- typedefs & structures --- */
+typedef struct
+{
+ gchar *keyword; /* marhaller list keyword [MY_STRING] */
+ const gchar *sig_name; /* signature name [STRING] */
+ const gchar *ctype; /* C type name [gchar*] */
+ const gchar *getter; /* value getter function [g_value_get_string] */
+} InArgument;
+typedef struct
+{
+ gchar *keyword; /* marhaller list keyword [MY_STRING] */
+ const gchar *sig_name; /* signature name [STRING] */
+ const gchar *ctype; /* C type name [gchar*] */
+ const gchar *setter; /* value setter function [g_value_set_string] */
+} OutArgument;
+typedef struct
+{
+ gchar *ploc;
+ OutArgument *rarg;
+ GList *args; /* of type InArgument* */
+} Signature;
+
+
+/* --- prototypes --- */
+static void parse_args (gint *argc_p,
+ gchar ***argv_p);
+static void print_blurb (FILE *bout,
+ gboolean print_help);
+
+
+/* --- variables --- */
+static const GScannerConfig scanner_config_template =
+{
+ (
+ " \t\r" /* "\n" is statement delimiter */
+ ) /* cset_skip_characters */,
+ (
+ G_CSET_a_2_z
+ "_"
+ G_CSET_A_2_Z
+ ) /* cset_identifier_first */,
+ (
+ G_CSET_a_2_z
+ "_0123456789"
+ G_CSET_A_2_Z
+ ) /* 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 */,
+};
+static gchar * const std_marshaller_prefix = "g_cclosure_marshal";
+static gchar *marshaller_prefix = "g_cclosure_user_marshal";
+static GHashTable *marshallers = NULL;
+static FILE *fout = NULL;
+static gboolean gen_cheader = FALSE;
+static gboolean gen_cbody = FALSE;
+static gboolean gen_internal = FALSE;
+static gboolean skip_ploc = FALSE;
+static gboolean std_includes = TRUE;
+
+
+/* --- functions --- */
+static void
+put_marshal_value_getters (void)
+{
+ fputs ("\n", fout);
+ fputs ("#ifdef G_ENABLE_DEBUG\n", fout);
+ fputs ("#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_char(v) g_value_get_char (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_int(v) g_value_get_int (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_uint(v) g_value_get_uint (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_long(v) g_value_get_long (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_int64(v) g_value_get_int64 (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_enum(v) g_value_get_enum (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_flags(v) g_value_get_flags (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_float(v) g_value_get_float (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_double(v) g_value_get_double (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_param(v) g_value_get_param (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v)\n", fout);
+ fputs ("#define g_marshal_value_peek_object(v) g_value_get_object (v)\n", fout);
+ fputs ("#else /* !G_ENABLE_DEBUG */\n", fout);
+ fputs ("/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.\n", fout);
+ fputs (" * Do not access GValues directly in your code. Instead, use the\n", fout);
+ fputs (" * g_value_get_*() functions\n", fout);
+ fputs (" */\n", fout);
+ fputs ("#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int\n", fout);
+ fputs ("#define g_marshal_value_peek_char(v) (v)->data[0].v_int\n", fout);
+ fputs ("#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint\n", fout);
+ fputs ("#define g_marshal_value_peek_int(v) (v)->data[0].v_int\n", fout);
+ fputs ("#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint\n", fout);
+ fputs ("#define g_marshal_value_peek_long(v) (v)->data[0].v_long\n", fout);
+ fputs ("#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong\n", fout);
+ fputs ("#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64\n", fout);
+ fputs ("#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64\n", fout);
+ fputs ("#define g_marshal_value_peek_enum(v) (v)->data[0].v_long\n", fout);
+ fputs ("#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong\n", fout);
+ fputs ("#define g_marshal_value_peek_float(v) (v)->data[0].v_float\n", fout);
+ fputs ("#define g_marshal_value_peek_double(v) (v)->data[0].v_double\n", fout);
+ fputs ("#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer\n", fout);
+ fputs ("#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer\n", fout);
+ fputs ("#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer\n", fout);
+ fputs ("#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer\n", fout);
+ fputs ("#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer\n", fout);
+ fputs ("#endif /* !G_ENABLE_DEBUG */\n", fout);
+ fputs ("\n", fout);
+}
+
+static gboolean
+complete_in_arg (InArgument *iarg)
+{
+ static const InArgument args[] = {
+ /* keyword sig_name ctype getter */
+ { "VOID", "VOID", "void", NULL, },
+ { "BOOLEAN", "BOOLEAN", "gboolean", "g_marshal_value_peek_boolean", },
+ { "CHAR", "CHAR", "gchar", "g_marshal_value_peek_char", },
+ { "UCHAR", "UCHAR", "guchar", "g_marshal_value_peek_uchar", },
+ { "INT", "INT", "gint", "g_marshal_value_peek_int", },
+ { "UINT", "UINT", "guint", "g_marshal_value_peek_uint", },
+ { "LONG", "LONG", "glong", "g_marshal_value_peek_long", },
+ { "ULONG", "ULONG", "gulong", "g_marshal_value_peek_ulong", },
+ { "INT64", "INT64", "gint64", "g_marshal_value_peek_int64", },
+ { "UINT64", "UINT64", "guint64", "g_marshal_value_peek_uint64", },
+ { "ENUM", "ENUM", "gint", "g_marshal_value_peek_enum", },
+ { "FLAGS", "FLAGS", "guint", "g_marshal_value_peek_flags", },
+ { "FLOAT", "FLOAT", "gfloat", "g_marshal_value_peek_float", },
+ { "DOUBLE", "DOUBLE", "gdouble", "g_marshal_value_peek_double", },
+ { "STRING", "STRING", "gpointer", "g_marshal_value_peek_string", },
+ { "PARAM", "PARAM", "gpointer", "g_marshal_value_peek_param", },
+ { "BOXED", "BOXED", "gpointer", "g_marshal_value_peek_boxed", },
+ { "POINTER", "POINTER", "gpointer", "g_marshal_value_peek_pointer", },
+ { "OBJECT", "OBJECT", "gpointer", "g_marshal_value_peek_object", },
+ /* deprecated: */
+ { "NONE", "VOID", "void", NULL, },
+ { "BOOL", "BOOLEAN", "gboolean", "g_marshal_value_peek_boolean", },
+ };
+ guint i;
+
+ g_return_val_if_fail (iarg != NULL, FALSE);
+
+ for (i = 0; i < G_N_ELEMENTS (args); i++)
+ if (strcmp (args[i].keyword, iarg->keyword) == 0)
+ {
+ iarg->sig_name = args[i].sig_name;
+ iarg->ctype = args[i].ctype;
+ iarg->getter = args[i].getter;
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gboolean
+complete_out_arg (OutArgument *oarg)
+{
+ static const OutArgument args[] = {
+ /* keyword sig_name ctype setter */
+ { "VOID", "VOID", "void", NULL, },
+ { "BOOLEAN", "BOOLEAN", "gboolean", "g_value_set_boolean", },
+ { "CHAR", "CHAR", "gchar", "g_value_set_char", },
+ { "UCHAR", "UCHAR", "guchar", "g_value_set_uchar", },
+ { "INT", "INT", "gint", "g_value_set_int", },
+ { "UINT", "UINT", "guint", "g_value_set_uint", },
+ { "LONG", "LONG", "glong", "g_value_set_long", },
+ { "ULONG", "ULONG", "gulong", "g_value_set_ulong", },
+ { "INT64", "INT64", "gint64", "g_value_set_int64", },
+ { "UINT64", "UINT64", "guint64", "g_value_set_uint64", },
+ { "ENUM", "ENUM", "gint", "g_value_set_enum", },
+ { "FLAGS", "FLAGS", "guint", "g_value_set_flags", },
+ { "FLOAT", "FLOAT", "gfloat", "g_value_set_float", },
+ { "DOUBLE", "DOUBLE", "gdouble", "g_value_set_double", },
+ { "STRING", "STRING", "gchar*", "g_value_take_string", },
+ { "PARAM", "PARAM", "GParamSpec*", "g_value_take_param", },
+ { "BOXED", "BOXED", "gpointer", "g_value_take_boxed", },
+ { "POINTER", "POINTER", "gpointer", "g_value_set_pointer", },
+ { "OBJECT", "OBJECT", "GObject*", "g_value_take_object", },
+ /* deprecated: */
+ { "NONE", "VOID", "void", NULL, },
+ { "BOOL", "BOOLEAN", "gboolean", "g_value_set_boolean", },
+ };
+ guint i;
+
+ g_return_val_if_fail (oarg != NULL, FALSE);
+
+ for (i = 0; i < G_N_ELEMENTS (args); i++)
+ if (strcmp (args[i].keyword, oarg->keyword) == 0)
+ {
+ oarg->sig_name = args[i].sig_name;
+ oarg->ctype = args[i].ctype;
+ oarg->setter = args[i].setter;
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static const gchar*
+pad (const gchar *string)
+{
+#define PAD_LENGTH 12
+ static gchar *buffer = NULL;
+ gint i;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ if (!buffer)
+ buffer = g_new (gchar, PAD_LENGTH + 1);
+
+ /* paranoid check */
+ if (strlen (string) >= PAD_LENGTH)
+ {
+ g_free (buffer);
+ buffer = g_strdup_printf ("%s ", string);
+ g_warning ("overfull string (%u bytes) for padspace",
+ (guint) strlen (string));
+
+ return buffer;
+ }
+
+ for (i = 0; i < PAD_LENGTH; i++)
+ {
+ gboolean done = *string == 0;
+
+ buffer[i] = done ? ' ' : *string++;
+ }
+ buffer[i] = 0;
+
+ return buffer;
+}
+
+static const gchar*
+indent (guint n_spaces)
+{
+ static gchar *buffer = NULL;
+ static guint blength = 0;
+
+ if (blength <= n_spaces)
+ {
+ blength = n_spaces + 1;
+ g_free (buffer);
+ buffer = g_new (gchar, blength);
+ }
+ memset (buffer, ' ', n_spaces);
+ buffer[n_spaces] = 0;
+
+ return buffer;
+}
+
+static void
+generate_marshal (const gchar *signame,
+ Signature *sig)
+{
+ guint ind, a;
+ GList *node;
+ gchar *tmp = g_strconcat (marshaller_prefix, "_", signame, NULL);
+ gboolean have_std_marshaller = FALSE;
+
+ /* here we have to make sure a marshaller named <marshaller_prefix>_<signame>
+ * exists. we might have put it out already, can revert to a standard
+ * marshaller provided by glib, or need to generate one.
+ */
+
+ if (g_hash_table_lookup (marshallers, tmp))
+ {
+ /* done, marshaller already generated */
+ g_free (tmp);
+ return;
+ }
+ else
+ {
+ /* need to alias/generate marshaller, register name */
+ g_hash_table_insert (marshallers, tmp, tmp);
+ }
+
+ /* can we revert to a standard marshaller? */
+ if (std_includes)
+ {
+ tmp = g_strconcat (std_marshaller_prefix, "_", signame, NULL);
+ have_std_marshaller = g_hash_table_lookup (marshallers, tmp) != NULL;
+ g_free (tmp);
+ }
+
+ if (gen_cheader && have_std_marshaller)
+ {
+ g_fprintf (fout, "#define %s_%s\t%s_%s\n", marshaller_prefix, signame, std_marshaller_prefix, signame);
+ }
+ if (gen_cheader && !have_std_marshaller)
+ {
+ ind = g_fprintf (fout, gen_internal ? "G_GNUC_INTERNAL " : "extern ");
+ ind += g_fprintf (fout, "void ");
+ ind += g_fprintf (fout, "%s_%s (", marshaller_prefix, signame);
+ g_fprintf (fout, "GClosure *closure,\n");
+ g_fprintf (fout, "%sGValue *return_value,\n", indent (ind));
+ g_fprintf (fout, "%sguint n_param_values,\n", indent (ind));
+ g_fprintf (fout, "%sconst GValue *param_values,\n", indent (ind));
+ g_fprintf (fout, "%sgpointer invocation_hint,\n", indent (ind));
+ g_fprintf (fout, "%sgpointer marshal_data);\n",
+ indent (ind));
+ }
+ if (gen_cbody && !have_std_marshaller)
+ {
+ /* cfile marshal header */
+ g_fprintf (fout, "void\n");
+ ind = g_fprintf (fout, "%s_%s (", marshaller_prefix, signame);
+ g_fprintf (fout, "GClosure *closure,\n");
+ g_fprintf (fout, "%sGValue *return_value,\n", indent (ind));
+ g_fprintf (fout, "%sguint n_param_values,\n", indent (ind));
+ g_fprintf (fout, "%sconst GValue *param_values,\n", indent (ind));
+ g_fprintf (fout, "%sgpointer invocation_hint,\n", indent (ind));
+ g_fprintf (fout, "%sgpointer marshal_data)\n", indent (ind));
+ g_fprintf (fout, "{\n");
+
+ /* cfile GMarshalFunc typedef */
+ ind = g_fprintf (fout, " typedef %s (*GMarshalFunc_%s) (", sig->rarg->ctype, signame);
+ g_fprintf (fout, "%s data1,\n", pad ("gpointer"));
+ for (a = 1, node = sig->args; node; node = node->next)
+ {
+ InArgument *iarg = node->data;
+
+ if (iarg->getter)
+ g_fprintf (fout, "%s%s arg_%d,\n", indent (ind), pad (iarg->ctype), a++);
+ }
+ g_fprintf (fout, "%s%s data2);\n", indent (ind), pad ("gpointer"));
+
+ /* cfile marshal variables */
+ g_fprintf (fout, " register GMarshalFunc_%s callback;\n", signame);
+ g_fprintf (fout, " register GCClosure *cc = (GCClosure*) closure;\n");
+ g_fprintf (fout, " register gpointer data1, data2;\n");
+ if (sig->rarg->setter)
+ g_fprintf (fout, " %s v_return;\n", sig->rarg->ctype);
+
+ if (sig->args || sig->rarg->setter)
+ {
+ g_fprintf (fout, "\n");
+
+ if (sig->rarg->setter)
+ g_fprintf (fout, " g_return_if_fail (return_value != NULL);\n");
+ if (sig->args)
+ {
+ for (a = 0, node = sig->args; node; node = node->next)
+ {
+ InArgument *iarg = node->data;
+
+ if (iarg->getter)
+ a++;
+ }
+ g_fprintf (fout, " g_return_if_fail (n_param_values == %u);\n", 1 + a);
+ }
+ }
+
+ /* cfile marshal data1, data2 and callback setup */
+ g_fprintf (fout, "\n");
+ g_fprintf (fout, " if (G_CCLOSURE_SWAP_DATA (closure))\n {\n");
+ g_fprintf (fout, " data1 = closure->data;\n");
+ g_fprintf (fout, " data2 = g_value_peek_pointer (param_values + 0);\n");
+ g_fprintf (fout, " }\n else\n {\n");
+ g_fprintf (fout, " data1 = g_value_peek_pointer (param_values + 0);\n");
+ g_fprintf (fout, " data2 = closure->data;\n");
+ g_fprintf (fout, " }\n");
+ g_fprintf (fout, " callback = (GMarshalFunc_%s) (marshal_data ? marshal_data : cc->callback);\n", signame);
+
+ /* cfile marshal callback action */
+ g_fprintf (fout, "\n");
+ ind = g_fprintf (fout, " %s callback (", sig->rarg->setter ? " v_return =" : "");
+ g_fprintf (fout, "data1,\n");
+ for (a = 1, node = sig->args; node; node = node->next)
+ {
+ InArgument *iarg = node->data;
+
+ if (iarg->getter)
+ g_fprintf (fout, "%s%s (param_values + %d),\n", indent (ind), iarg->getter, a++);
+ }
+ g_fprintf (fout, "%sdata2);\n", indent (ind));
+
+ /* cfile marshal return value storage */
+ if (sig->rarg->setter)
+ {
+ g_fprintf (fout, "\n");
+ g_fprintf (fout, " %s (return_value, v_return);\n", sig->rarg->setter);
+ }
+
+ /* cfile marshal footer */
+ g_fprintf (fout, "}\n");
+ }
+}
+
+static void
+process_signature (Signature *sig)
+{
+ gchar *pname, *sname, *tmp;
+ GList *node;
+
+ /* lookup and complete info on arguments */
+ if (!complete_out_arg (sig->rarg))
+ {
+ g_warning ("unknown type: %s", sig->rarg->keyword);
+ return;
+ }
+ for (node = sig->args; node; node = node->next)
+ {
+ InArgument *iarg = node->data;
+
+ if (!complete_in_arg (iarg))
+ {
+ g_warning ("unknown type: %s", iarg->keyword);
+ return;
+ }
+ }
+
+ /* construct requested marshaller name and technical marshaller name */
+ pname = g_strconcat (sig->rarg->keyword, "_", NULL);
+ sname = g_strconcat (sig->rarg->sig_name, "_", NULL);
+ for (node = sig->args; node; node = node->next)
+ {
+ InArgument *iarg = node->data;
+ gchar *tmp;
+
+ tmp = sname;
+ sname = g_strconcat (tmp, "_", iarg->sig_name, NULL);
+ g_free (tmp);
+ tmp = pname;
+ pname = g_strconcat (tmp, "_", iarg->keyword, NULL);
+ g_free (tmp);
+ }
+
+ /* introductionary comment */
+ g_fprintf (fout, "\n/* %s", sig->rarg->keyword);
+ for (node = sig->args; node; node = node->next)
+ {
+ InArgument *iarg = node->data;
+
+ g_fprintf (fout, "%c%s", node->prev ? ',' : ':', iarg->keyword);
+ }
+ if (!skip_ploc)
+ g_fprintf (fout, " (%s)", sig->ploc);
+ g_fprintf (fout, " */\n");
+
+ /* ensure technical marshaller exists (<marshaller_prefix>_<sname>) */
+ generate_marshal (sname, sig);
+
+ /* put out marshaller alias for requested name if required (<marshaller_prefix>_<pname>) */
+ tmp = g_strconcat (marshaller_prefix, "_", pname, NULL);
+ if (gen_cheader && !g_hash_table_lookup (marshallers, tmp))
+ {
+ g_fprintf (fout, "#define %s_%s\t%s_%s\n", marshaller_prefix, pname, marshaller_prefix, sname);
+
+ g_hash_table_insert (marshallers, tmp, tmp);
+ }
+ else
+ g_free (tmp);
+
+ g_free (pname);
+ g_free (sname);
+}
+
+static InArgument*
+new_in_arg (const gchar *pname)
+{
+ InArgument *iarg = g_new0 (InArgument, 1);
+
+ iarg->keyword = g_strdup (pname);
+
+ return iarg;
+}
+
+static OutArgument*
+new_out_arg (const gchar *pname)
+{
+ OutArgument *oarg = g_new0 (OutArgument, 1);
+
+ oarg->keyword = g_strdup (pname);
+
+ return oarg;
+}
+
+static guint
+parse_line (GScanner *scanner,
+ Signature *sig)
+{
+ /* parse identifier for return value */
+ if (g_scanner_get_next_token (scanner) != G_TOKEN_IDENTIFIER)
+ return G_TOKEN_IDENTIFIER;
+ sig->rarg = new_out_arg (scanner->value.v_identifier);
+
+ /* keep a note on the location */
+ sig->ploc = g_strdup_printf ("%s:%u", scanner->input_name, scanner->line);
+
+ /* expect ':' */
+ if (g_scanner_get_next_token (scanner) != ':')
+ return ':';
+
+ /* parse first argument */
+ if (g_scanner_get_next_token (scanner) != G_TOKEN_IDENTIFIER)
+ return G_TOKEN_IDENTIFIER;
+ sig->args = g_list_append (sig->args, new_in_arg (scanner->value.v_identifier));
+
+ /* parse rest of argument list */
+ while (g_scanner_peek_next_token (scanner) == ',')
+ {
+ /* eat comma */
+ g_scanner_get_next_token (scanner);
+
+ /* parse arg identifier */
+ if (g_scanner_get_next_token (scanner) != G_TOKEN_IDENTIFIER)
+ return G_TOKEN_IDENTIFIER;
+ sig->args = g_list_append (sig->args, new_in_arg (scanner->value.v_identifier));
+ }
+
+ /* expect end of line, done */
+ if (g_scanner_get_next_token (scanner) != '\n')
+ return '\n';
+
+ /* success */
+ return G_TOKEN_NONE;
+}
+
+static gboolean
+string_key_destroy (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ g_free (key);
+
+ return TRUE;
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ const gchar *gobject_marshallers[] = {
+#include "gmarshal.strings"
+ };
+ GScanner *scanner;
+ GSList *slist, *files = NULL;
+ gint i;
+ gint result = 0;
+
+ /* parse args and do fast exits */
+ parse_args (&argc, &argv);
+
+ /* list input files */
+ for (i = 1; i < argc; i++)
+ files = g_slist_prepend (files, argv[i]);
+ if (files)
+ files = g_slist_reverse (files);
+ else
+ files = g_slist_prepend (files, "/dev/stdin");
+
+ /* setup auxillary structs */
+ scanner = g_scanner_new (&scanner_config_template);
+ fout = stdout;
+ marshallers = g_hash_table_new (g_str_hash, g_str_equal);
+
+ /* add standard marshallers of the GObject library */
+ if (std_includes)
+ for (i = 0; i < G_N_ELEMENTS (gobject_marshallers); i++)
+ {
+ gchar *tmp = g_strdup (gobject_marshallers[i]);
+
+ g_hash_table_insert (marshallers, tmp, tmp);
+ }
+
+ /* put out initial heading */
+ g_fprintf (fout, "\n");
+
+ if (gen_cheader && std_includes)
+ {
+ g_fprintf (fout, "#ifndef __%s_MARSHAL_H__\n", marshaller_prefix);
+ g_fprintf (fout, "#define __%s_MARSHAL_H__\n\n", marshaller_prefix);
+ }
+
+ if ((gen_cheader || gen_cbody) && std_includes)
+ g_fprintf (fout, "#include\t<glib-object.h>\n\n");
+
+ if (gen_cheader)
+ g_fprintf (fout, "G_BEGIN_DECLS\n");
+
+ /* generate necessary preprocessor directives */
+ if (gen_cbody)
+ put_marshal_value_getters ();
+
+ /* process input files */
+ for (slist = files; slist; slist = slist->next)
+ {
+ gchar *file = slist->data;
+ gint fd;
+
+ if (strcmp (file, "/dev/stdin") == 0)
+ /* Mostly for Win32. This is equivalent to opening /dev/stdin */
+ fd = dup (0);
+ else
+ fd = open (file, O_RDONLY);
+
+ if (fd < 0)
+ {
+ g_warning ("failed to open \"%s\": %s", file, g_strerror (errno));
+ result = 1;
+ continue;
+ }
+
+ /* set file name for error reports */
+ scanner->input_name = file;
+
+ /* parse & process file */
+ g_scanner_input_file (scanner, fd);
+
+ /* scanning loop, we parse the input untill it's end is reached,
+ * or our sub routine came across invalid syntax
+ */
+ do
+ {
+ guint expected_token = G_TOKEN_NONE;
+
+ switch (g_scanner_peek_next_token (scanner))
+ {
+ case '\n':
+ /* eat newline and restart */
+ g_scanner_get_next_token (scanner);
+ continue;
+ case G_TOKEN_EOF:
+ /* done */
+ break;
+ default:
+ /* parse and process signatures */
+ {
+ Signature signature = { NULL, NULL, NULL };
+ GList *node;
+
+ expected_token = parse_line (scanner, &signature);
+
+ /* once we got a valid signature, process it */
+ if (expected_token == G_TOKEN_NONE)
+ process_signature (&signature);
+
+ /* clean up signature contents */
+ g_free (signature.ploc);
+ if (signature.rarg)
+ g_free (signature.rarg->keyword);
+ g_free (signature.rarg);
+ for (node = signature.args; node; node = node->next)
+ {
+ InArgument *iarg = node->data;
+
+ g_free (iarg->keyword);
+ g_free (iarg);
+ }
+ g_list_free (signature.args);
+ }
+ break;
+ }
+
+ /* bail out on errors */
+ if (expected_token != G_TOKEN_NONE)
+ {
+ g_scanner_unexp_token (scanner, expected_token, "type name", NULL, NULL, NULL, TRUE);
+ result = 1;
+ break;
+ }
+
+ g_scanner_peek_next_token (scanner);
+ }
+ while (scanner->next_token != G_TOKEN_EOF);
+
+ close (fd);
+ }
+
+ /* put out trailer */
+ if (gen_cheader)
+ {
+ g_fprintf (fout, "\nG_END_DECLS\n");
+
+ if (std_includes)
+ g_fprintf (fout, "\n#endif /* __%s_MARSHAL_H__ */\n", marshaller_prefix);
+ }
+ g_fprintf (fout, "\n");
+
+ /* clean up */
+ g_slist_free (files);
+ g_scanner_destroy (scanner);
+ g_hash_table_foreach_remove (marshallers, string_key_destroy, NULL);
+ g_hash_table_destroy (marshallers);
+
+ return result;
+}
+
+static void
+parse_args (gint *argc_p,
+ gchar ***argv_p)
+{
+ guint argc = *argc_p;
+ gchar **argv = *argv_p;
+ guint i, e;
+
+ for (i = 1; i < argc; i++)
+ {
+ if (strcmp ("--header", argv[i]) == 0)
+ {
+ gen_cheader = TRUE;
+ argv[i] = NULL;
+ }
+ else if (strcmp ("--body", argv[i]) == 0)
+ {
+ gen_cbody = TRUE;
+ argv[i] = NULL;
+ }
+ else if (strcmp ("--skip-source", argv[i]) == 0)
+ {
+ skip_ploc = TRUE;
+ argv[i] = NULL;
+ }
+ else if (strcmp ("--nostdinc", argv[i]) == 0)
+ {
+ std_includes = FALSE;
+ argv[i] = NULL;
+ }
+ else if (strcmp ("--stdinc", argv[i]) == 0)
+ {
+ std_includes = TRUE;
+ argv[i] = NULL;
+ }
+ else if (strcmp ("--internal", argv[i]) == 0)
+ {
+ gen_internal = TRUE;
+ argv[i] = NULL;
+ }
+ else if ((strcmp ("--prefix", argv[i]) == 0) ||
+ (strncmp ("--prefix=", argv[i], 9) == 0))
+ {
+ gchar *equal = argv[i] + 8;
+
+ if (*equal == '=')
+ marshaller_prefix = g_strdup (equal + 1);
+ else if (i + 1 < argc)
+ {
+ marshaller_prefix = g_strdup (argv[i + 1]);
+ argv[i] = NULL;
+ i += 1;
+ }
+ argv[i] = NULL;
+ }
+ else if (strcmp ("-h", argv[i]) == 0 ||
+ strcmp ("--help", argv[i]) == 0)
+ {
+ print_blurb (stderr, TRUE);
+ argv[i] = NULL;
+ exit (0);
+ }
+ else if (strcmp ("-v", argv[i]) == 0 ||
+ strcmp ("--version", argv[i]) == 0)
+ {
+ print_blurb (stderr, FALSE);
+ argv[i] = NULL;
+ exit (0);
+ }
+ else if (strcmp (argv[i], "--g-fatal-warnings") == 0)
+ {
+ GLogLevelFlags fatal_mask;
+
+ fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
+ fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
+ g_log_set_always_fatal (fatal_mask);
+
+ argv[i] = NULL;
+ }
+ }
+
+ e = 0;
+ for (i = 1; i < argc; i++)
+ {
+ if (e)
+ {
+ if (argv[i])
+ {
+ argv[e++] = argv[i];
+ argv[i] = NULL;
+ }
+ }
+ else if (!argv[i])
+ e = i;
+ }
+ if (e)
+ *argc_p = e;
+}
+
+static void
+print_blurb (FILE *bout,
+ gboolean print_help)
+{
+ if (!print_help)
+ {
+ g_fprintf (bout, "%s version ", PRG_NAME);
+ g_fprintf (bout, "%u.%u.%u", GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
+ g_fprintf (bout, "\n");
+ g_fprintf (bout, "%s comes with ABSOLUTELY NO WARRANTY.\n", PRG_NAME);
+ g_fprintf (bout, "You may redistribute copies of %s under the terms of\n", PRG_NAME);
+ g_fprintf (bout, "the GNU General Public License which can be found in the\n");
+ g_fprintf (bout, "%s source package. Sources, examples and contact\n", PKG_NAME);
+ g_fprintf (bout, "information are available at %s\n", PKG_HTTP_HOME);
+ }
+ else
+ {
+ g_fprintf (bout, "Usage: %s [options] [files...]\n", PRG_NAME);
+ g_fprintf (bout, " --header generate C headers\n");
+ g_fprintf (bout, " --body generate C code\n");
+ g_fprintf (bout, " --prefix=string specify marshaller prefix\n");
+ g_fprintf (bout, " --skip-source skip source location comments\n");
+ g_fprintf (bout, " --stdinc, --nostdinc include/use standard marshallers\n");
+ g_fprintf (bout, " --internal mark generated functions as internal\n");
+ g_fprintf (bout, " -h, --help show this help message\n");
+ g_fprintf (bout, " -v, --version print version informations\n");
+ g_fprintf (bout, " --g-fatal-warnings make warnings fatal (abort)\n");
+ }
+}
diff --git a/trunk/gobject/glib-mkenums.1 b/trunk/gobject/glib-mkenums.1
new file mode 100644
index 000000000..0837d082c
--- /dev/null
+++ b/trunk/gobject/glib-mkenums.1
@@ -0,0 +1,166 @@
+.TH GLIB-MKENUMS 1 "27 Jul 2002"
+.SH NAME
+glib-mkenums \- C language enum description generation utility
+.SH SYNOPSIS
+
+\fBglib-mkenums\fP [\fIoptions\fP] [\fIfiles...\fP]
+
+.SH DESCRIPTION
+\fBglib-mkenums\fP is a small perl-script utility that parses C code to extract enum
+definitions and produces enum descriptions based on text templates specified
+by the user. Most frequently this script is used to produce C code that contains
+enum values as strings so programs can provide value name strings for introspection.
+
+.SH INVOCATION
+
+\fBglib-mkenums\fP takes a list of valid C code files as input. The options
+specified control the text that is output, certain substitutions are performed
+on the text templates for keywords enclosed in @ characters.
+
+
+.SS Options
+.TP
+\fI--fhead <text>
+Put out <text> prior to processing input files.
+.TP
+\fI--fprod <text>
+Put out <text> everytime a new input file is being processed.
+.TP
+\fI--ftail <text>
+Put out <text> after all input files have been processed.
+.TP
+\fI--eprod <text>
+Put out <text> everytime an enum is encountered in the input files.
+.TP
+\fI--vhead <text>
+Put out <text> before iterating over the set of values of an enum.
+.TP
+\fI--vprod <text>
+Put out <text> for every value of an enum.
+.TP
+\fI--vtail <text>
+Put out <text> after iterating over all values of an enum.
+.TP
+\fI--comments <text>
+Template for auto-generated comments, the default (for C code generations) is
+"/* @comment@ */".
+.TP
+\fI--template file
+Read templates from the given file. The templates are enclosed in
+specially-formatted C comments
+.PP
+.RS
+.nf
+/*** BEGIN section ***/
+/*** END section ***/
+.fi
+.PP
+where section may be file-header, file-production, file-tail,
+enumeration-production, value-header, value-production, value-tail or
+comment.
+.TP
+\fI-h, --help\fP
+Print brief help and exit.
+.TP
+\fI-v, --version\fP
+Print version and exit.
+.PP
+
+
+.SS Production text substitutions
+Certain keywords enclosed in @ characters will be substituted in the outputted
+text. For the substitution examples of the keywords below, the following example
+enum definition is assumed:
+.PP
+.RS
+.nf
+typedef enum
+{
+ PREFIX_THE_XVALUE = 1 << 3,
+ PREFIX_ANOTHER_VALUE = 1 << 4
+} PrefixTheXEnum;
+.fi
+.RE
+
+.TP 12
+\fI@EnumName@
+The name of the enum currently being processed, enum names are assumed to be
+properly namespaced and to use mixed capitalization to separate
+words (e.g. PrefixTheXEnum).
+.TP 12
+\fI@enum_name@
+The enum name with words lowercase and word-separated by underscores (e.g. prefix_the_xenum).
+.TP 12
+\fI@ENUMNAME@
+The enum name with words uppercase and word-separated by underscores (e.g. PREFIX_THE_XENUM).
+.TP 12
+\fI@ENUMSHORT@
+The enum name with words uppercase and word-separated by underscores, prefix stripped (e.g. THE_XENUM).
+.TP 12
+\fI@VALUENAME@
+The enum value name currently being processed with words uppercase and word-separated by underscores,
+this is the assumed literal notation of enum values in the C sources (e.g. PREFIX_THE_XVALUE).
+.TP 12
+\fI@valuenick@
+A nick name for the enum value currently being processed, this is usually generated by stripping
+common prefix words of all the enum values of the current enum, the words are lowercase and
+underscores are substituted by a minus (e.g. the-xvalue).
+.TP 12
+\fI@type@
+This is substituted either by "enum" or "flags", depending on whether the enum value definitions
+contained bit-shift operators or not (e.g. flags).
+.TP 12
+\fI@Type@
+The same as \fI@type@\fP with the first letter capitalized (e.g. Flags).
+.TP 12
+\fI@TYPE@
+The same as \fI@type@\fP with all letters uppercased (e.g. FLAGS).
+.TP 12
+\fI@filename@
+The name of the input file currently being processed (e.g. foo.h).
+
+.SS Trigraph extensions
+Some C comments are treated specially in the parsed enum definitions, such comments
+start out with the trigraph sequence "/*<" and end with the trigraph sequence ">*/".
+.PP
+Per enum definition, the options "skip" and "flags" can be specified, to indicate
+this enum definition to be skipped, or for it to be treated as a flags definition, or
+to specify the common prefix to be stripped from all values to generate value nicknames,
+respectively. The "underscore_name" option can be used to specify the underscorized name
+variant used in the *_get_type() function and *_TYPE_* macro. For instance,
+/*< underscore_name=gnome_vfs_uri_hide_options >*/.
+.PP
+Per value definition, the options "skip" and "nick" are supported. The former causes the
+value to be skipped, and the latter can be used to specify the otherwise auto-generated
+nickname.
+Examples:
+.PP
+.RS
+.nf
+typedef enum /*< skip >*/
+{
+ PREFIX_FOO
+} PrefixThisEnumWillBeSkipped;
+typedef enum /*< flags,prefix=PREFIX >*/
+{
+ PREFIX_THE_ZEROTH_VALUE, /*< skip >*/
+ PREFIX_THE_FIRST_VALUE,
+ PREFIX_THE_SECOND_VALUE,
+ PREFIX_THE_THIRD_VALUE, /*< nick=the-last-value >*/
+} PrefixTheFlagsEnum;
+.fi
+.RE
+
+.SH SEE ALSO
+\fB
+glib-genmarshal(1)
+\fP
+
+.SH BUGS
+None known yet.
+
+.SH AUTHOR
+.B glib-mkenums
+was written by Tim Janik <timj@gtk.org> and Owen Taylor <otaylor@redhat.com>.
+.PP
+This manual page was provided by Tim Janik <timj@gtk.org>.
diff --git a/trunk/gobject/glib-mkenums.in b/trunk/gobject/glib-mkenums.in
new file mode 100755
index 000000000..cabb0f777
--- /dev/null
+++ b/trunk/gobject/glib-mkenums.in
@@ -0,0 +1,486 @@
+#!@PERL_PATH@ -w
+
+# glib-mkenums.pl
+# Information about the current enumeration
+my $flags; # Is enumeration a bitmask?
+my $option_underscore_name; # Overriden underscore variant of the enum name
+ # for example to fix the cases we don't get the
+ # mixed-case -> underscorized transform right.
+my $option_lowercase_name; # DEPRECATED. A lower case name to use as part
+ # of the *_get_type() function, instead of the
+ # one that we guess. For instance, when an enum
+ # uses abnormal capitalization and we can not
+ # guess where to put the underscores.
+my $seenbitshift; # Have we seen bitshift operators?
+my $enum_prefix; # Prefix for this enumeration
+my $enumname; # Name for this enumeration
+my $enumshort; # $enumname without prefix
+my $enumindex = 0; # Global enum counter
+my $firstenum = 1; # Is this the first enumeration per file?
+my @entries; # [ $name, $val ] for each entry
+
+sub parse_trigraph {
+ my $opts = shift;
+ my @opts;
+
+ for $opt (split /\s*,\s*/, $opts) {
+ $opt =~ s/^\s*//;
+ $opt =~ s/\s*$//;
+ my ($key,$val) = $opt =~ /(\w+)(?:=(.+))?/;
+ defined $val or $val = 1;
+ push @opts, $key, $val;
+ }
+ @opts;
+}
+sub parse_entries {
+ my $file = shift;
+ my $file_name = shift;
+ my $looking_for_name = 0;
+
+ while (<$file>) {
+ # read lines until we have no open comments
+ while (m@/\*([^*]|\*(?!/))*$@) {
+ my $new;
+ defined ($new = <$file>) || die "Unmatched comment in $ARGV";
+ $_ .= $new;
+ }
+ # strip comments w/o options
+ s@/\*(?!<)
+ ([^*]+|\*(?!/))*
+ \*/@@gx;
+
+ # strip newlines
+ s@\n@ @;
+
+ # skip empty lines
+ next if m@^\s*$@;
+
+ if ($looking_for_name) {
+ if (/^\s*(\w+)/) {
+ $enumname = $1;
+ return 1;
+ }
+ }
+
+ # Handle include files
+ if (/^\#include\s*<([^>]*)>/ ) {
+ my $file= "../$1";
+ open NEWFILE, $file or die "Cannot open include file $file: $!\n";
+
+ if (parse_entries (\*NEWFILE, $NEWFILE)) {
+ return 1;
+ } else {
+ next;
+ }
+ }
+
+ if (/^\s*\}\s*(\w+)/) {
+ $enumname = $1;
+ $enumindex++;
+ return 1;
+ }
+
+ if (/^\s*\}/) {
+ $enumindex++;
+ $looking_for_name = 1;
+ next;
+ }
+
+ if (m@^\s*
+ (\w+)\s* # name
+ (?:=( # value
+ \s*\w+\s*\(.*\)\s* # macro with multiple args
+ | # OR
+ (?:[^,/]|/(?!\*))* # anything but a comma or comment
+ ))?,?\s*
+ (?:/\*< # options
+ (([^*]|\*(?!/))*)
+ >\s*\*/)?,?
+ \s*$
+ @x) {
+ my ($name, $value, $options) = ($1,$2,$3);
+
+ if (!defined $flags && defined $value && $value =~ /<</) {
+ $seenbitshift = 1;
+ }
+
+ if (defined $options) {
+ my %options = parse_trigraph($options);
+ if (!defined $options{skip}) {
+ push @entries, [ $name, $options{nick} ];
+ }
+ } else {
+ push @entries, [ $name ];
+ }
+ } elsif (m@^\s*\#@) {
+ # ignore preprocessor directives
+ } else {
+ print STDERR "$0: $file_name:$.: Failed to parse `$_'\n";
+ }
+ }
+
+ return 0;
+}
+
+sub version {
+ print "glib-mkenums version glib-@GLIB_VERSION@\n";
+ print "glib-mkenums comes with ABSOLUTELY NO WARRANTY.\n";
+ print "You may redistribute copies of glib-mkenums under the terms of\n";
+ print "the GNU General Public License which can be found in the\n";
+ print "GLib source package. Sources, examples and contact\n";
+ print "information are available at http://www.gtk.org\n";
+ exit 0;
+}
+sub usage {
+ print "Usage: glib-mkenums [options] [files...]\n";
+ print " --fhead <text> output file header\n";
+ print " --fprod <text> per input file production\n";
+ print " --ftail <text> output file trailer\n";
+ print " --eprod <text> per enum text (produced prior to value itarations)\n";
+ print " --vhead <text> value header, produced before iterating over enum values\n";
+ print " --vprod <text> value text, produced for each enum value\n";
+ print " --vtail <text> value tail, produced after iterating over enum values\n";
+ print " --comments <text> comment structure\n";
+ print " --template file template file\n";
+ print " -h, --help show this help message\n";
+ print " -v, --version print version informations\n";
+ print "Production text substitutions:\n";
+ print " \@EnumName\@ PrefixTheXEnum\n";
+ print " \@enum_name\@ prefix_the_xenum\n";
+ print " \@ENUMNAME\@ PREFIX_THE_XENUM\n";
+ print " \@ENUMSHORT\@ THE_XENUM\n";
+ print " \@VALUENAME\@ PREFIX_THE_XVALUE\n";
+ print " \@valuenick\@ the-xvalue\n";
+ print " \@type\@ either enum or flags\n";
+ print " \@Type\@ either Enum or Flags\n";
+ print " \@TYPE\@ either ENUM or FLAGS\n";
+ print " \@filename\@ name of current input file\n";
+ exit 0;
+}
+
+# production variables:
+my $fhead = ""; # output file header
+my $fprod = ""; # per input file production
+my $ftail = ""; # output file trailer
+my $eprod = ""; # per enum text (produced prior to value itarations)
+my $vhead = ""; # value header, produced before iterating over enum values
+my $vprod = ""; # value text, produced for each enum value
+my $vtail = ""; # value tail, produced after iterating over enum values
+# other options
+my $comment_tmpl = "/* \@comment\@ */";
+
+sub read_template_file {
+ my ($file) = @_;
+ my %tmpl = ('file-header', $fhead,
+ 'file-production', $fprod,
+ 'file-tail', $ftail,
+ 'enumeration-production', $eprod,
+ 'value-header', $vhead,
+ 'value-production', $vprod,
+ 'value-tail', $vtail,
+ 'comment', $comment_tmpl);
+ my $in = 'junk';
+ open (FILE, $file) || die "Can't open $file: $!\n";
+ while (<FILE>) {
+ if (/^\/\*\*\*\s+(BEGIN|END)\s+([\w-]+)\s+\*\*\*\//) {
+ if (($in eq 'junk') && ($1 eq 'BEGIN') && (exists($tmpl{$2}))) {
+ $in = $2;
+ next;
+ }
+ elsif (($in eq $2) && ($1 eq 'END') && (exists($tmpl{$2}))) {
+ $in = 'junk';
+ next;
+ } else {
+ die "Malformed template file $file\n";
+ }
+ }
+ if (!($in eq 'junk')) {
+ $tmpl{$in} .= $_;
+ }
+ }
+ close (FILE);
+ if (!($in eq 'junk')) {
+ die "Malformed template file $file\n";
+ }
+ $fhead = $tmpl{'file-header'};
+ $fprod = $tmpl{'file-production'};
+ $ftail = $tmpl{'file-tail'};
+ $eprod = $tmpl{'enumeration-production'};
+ $vhead = $tmpl{'value-header'};
+ $vprod = $tmpl{'value-production'};
+ $vtail = $tmpl{'value-tail'};
+ $comment_tmpl = $tmpl{'comment'};
+}
+
+if (!defined $ARGV[0]) {
+ usage;
+}
+while ($_ = $ARGV[0], /^-/) {
+ shift;
+ last if /^--$/;
+ if (/^--template$/) { read_template_file (shift); }
+ elsif (/^--fhead$/) { $fhead = $fhead . shift }
+ elsif (/^--fprod$/) { $fprod = $fprod . shift }
+ elsif (/^--ftail$/) { $ftail = $ftail . shift }
+ elsif (/^--eprod$/) { $eprod = $eprod . shift }
+ elsif (/^--vhead$/) { $vhead = $vhead . shift }
+ elsif (/^--vprod$/) { $vprod = $vprod . shift }
+ elsif (/^--vtail$/) { $vtail = $vtail . shift }
+ elsif (/^--comments$/) { $comment_tmpl = shift }
+ elsif (/^--help$/ || /^-h$/) { usage; }
+ elsif (/^--version$/ || /^-v$/) { version; }
+ else { usage; }
+}
+
+# put auto-generation comment
+{
+ my $comment = $comment_tmpl;
+ $comment =~ s/\@comment\@/Generated data (by glib-mkenums)/;
+ print "\n" . $comment . "\n\n";
+}
+
+if (length($fhead)) {
+ my $prod = $fhead;
+
+ $prod =~ s/\@filename\@/$ARGV[0]/g;
+ $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g;
+ $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g;
+ chomp ($prod);
+
+ print "$prod\n";
+}
+
+while (<>) {
+ if (eof) {
+ close (ARGV); # reset line numbering
+ $firstenum = 1; # Flag to print filename at next enum
+ }
+
+ # read lines until we have no open comments
+ while (m@/\*([^*]|\*(?!/))*$@) {
+ my $new;
+ defined ($new = <>) || die "Unmatched comment in $ARGV";
+ $_ .= $new;
+ }
+ # strip comments w/o options
+ s@/\*(?!<)
+ ([^*]+|\*(?!/))*
+ \*/@@gx;
+
+ if (m@^\s*typedef\s+enum\s*
+ ({)?\s*
+ (?:/\*<
+ (([^*]|\*(?!/))*)
+ >\s*\*/)?
+ \s*({)?
+ @x) {
+ if (defined $2) {
+ my %options = parse_trigraph ($2);
+ next if defined $options{skip};
+ $enum_prefix = $options{prefix};
+ $flags = $options{flags};
+ $option_lowercase_name = $options{lowercase_name};
+ $option_underscore_name = $options{underscore_name};
+ } else {
+ $enum_prefix = undef;
+ $flags = undef;
+ $option_lowercase_name = undef;
+ $option_underscore_name = undef;
+ }
+ if (defined $option_lowercase_name) {
+ if (defined $option_underscore_name) {
+ print STDERR "$0: $ARGV:$.: lowercase_name overriden with underscore_name\n";
+ $option_lowercase_name = undef;
+ } else {
+ print STDERR "$0: $ARGV:$.: lowercase_name is deprecated, use underscore_name\n";
+ }
+ }
+ # Didn't have trailing '{' look on next lines
+ if (!defined $1 && !defined $4) {
+ while (<>) {
+ if (s/^\s*\{//) {
+ last;
+ }
+ }
+ }
+
+ $seenbitshift = 0;
+ @entries = ();
+
+ # Now parse the entries
+ parse_entries (\*ARGV, $ARGV);
+
+ # figure out if this was a flags or enums enumeration
+ if (!defined $flags) {
+ $flags = $seenbitshift;
+ }
+
+ # Autogenerate a prefix
+ if (!defined $enum_prefix) {
+ for (@entries) {
+ my $nick = $_->[1];
+ if (!defined $nick) {
+ my $name = $_->[0];
+ if (defined $enum_prefix) {
+ my $tmp = ~ ($name ^ $enum_prefix);
+ ($tmp) = $tmp =~ /(^\xff*)/;
+ $enum_prefix = $enum_prefix & $tmp;
+ } else {
+ $enum_prefix = $name;
+ }
+ }
+ }
+ if (!defined $enum_prefix) {
+ $enum_prefix = "";
+ } else {
+ # Trim so that it ends in an underscore
+ $enum_prefix =~ s/_[^_]*$/_/;
+ }
+ } else {
+ # canonicalize user defined prefixes
+ $enum_prefix = uc($enum_prefix);
+ $enum_prefix =~ s/-/_/g;
+ $enum_prefix =~ s/(.*)([^_])$/$1$2_/;
+ }
+
+ for $entry (@entries) {
+ my ($name,$nick) = @{$entry};
+ if (!defined $nick) {
+ ($nick = $name) =~ s/^$enum_prefix//;
+ $nick =~ tr/_/-/;
+ $nick = lc($nick);
+ @{$entry} = ($name, $nick);
+ }
+ }
+
+
+ # Spit out the output
+ if (defined $option_underscore_name) {
+ $enumlong = uc $option_underscore_name;
+ $enumsym = lc $option_underscore_name;
+ $enumshort = $enumlong;
+ $enumshort =~ s/^[A-Z][A-Z0-9]*_//;
+ } else {
+ # enumname is e.g. GMatchType
+ $enspace = $enumname;
+ $enspace =~ s/^([A-Z][a-z]*).*$/$1/;
+
+ $enumshort = $enumname;
+ $enumshort =~ s/^[A-Z][a-z]*//;
+ $enumshort =~ s/([^A-Z])([A-Z])/$1_$2/g;
+ $enumshort =~ s/([A-Z][A-Z])([A-Z][0-9a-z])/$1_$2/g;
+ $enumshort = uc($enumshort);
+
+ $enumlong = uc($enspace) . "_" . $enumshort;
+ $enumsym = lc($enspace) . "_" . lc($enumshort);
+
+ if (defined($option_lowercase_name)) {
+ $enumsym = $option_lowercase_name;
+ }
+ }
+
+ if ($firstenum) {
+ $firstenum = 0;
+
+ if (length($fprod)) {
+ my $prod = $fprod;
+
+ $prod =~ s/\@filename\@/$ARGV/g;
+ $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g;
+ $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g;
+ chomp ($prod);
+
+ print "$prod\n";
+ }
+ }
+
+ if (length($eprod)) {
+ my $prod = $eprod;
+
+ $prod =~ s/\@enum_name\@/$enumsym/g;
+ $prod =~ s/\@EnumName\@/$enumname/g;
+ $prod =~ s/\@ENUMSHORT\@/$enumshort/g;
+ $prod =~ s/\@ENUMNAME\@/$enumlong/g;
+ if ($flags) { $prod =~ s/\@type\@/flags/g; } else { $prod =~ s/\@type\@/enum/g; }
+ if ($flags) { $prod =~ s/\@Type\@/Flags/g; } else { $prod =~ s/\@Type\@/Enum/g; }
+ if ($flags) { $prod =~ s/\@TYPE\@/FLAGS/g; } else { $prod =~ s/\@TYPE\@/ENUM/g; }
+ $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g;
+ $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g;
+ chomp ($prod);
+
+ print "$prod\n";
+ }
+
+ if (length($vhead)) {
+ my $prod = $vhead;
+
+ $prod =~ s/\@enum_name\@/$enumsym/g;
+ $prod =~ s/\@EnumName\@/$enumname/g;
+ $prod =~ s/\@ENUMSHORT\@/$enumshort/g;
+ $prod =~ s/\@ENUMNAME\@/$enumlong/g;
+ if ($flags) { $prod =~ s/\@type\@/flags/g; } else { $prod =~ s/\@type\@/enum/g; }
+ if ($flags) { $prod =~ s/\@Type\@/Flags/g; } else { $prod =~ s/\@Type\@/Enum/g; }
+ if ($flags) { $prod =~ s/\@TYPE\@/FLAGS/g; } else { $prod =~ s/\@TYPE\@/ENUM/g; }
+ $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g;
+ $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g;
+ chomp ($prod);
+
+ print "$prod\n";
+ }
+
+ if (length($vprod)) {
+ my $prod = $vprod;
+
+ $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g;
+ $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g;
+ for (@entries) {
+ my ($name,$nick) = @{$_};
+ my $tmp_prod = $prod;
+
+ $tmp_prod =~ s/\@VALUENAME\@/$name/g;
+ $tmp_prod =~ s/\@valuenick\@/$nick/g;
+ if ($flags) { $tmp_prod =~ s/\@type\@/flags/g; } else { $tmp_prod =~ s/\@type\@/enum/g; }
+ if ($flags) { $tmp_prod =~ s/\@Type\@/Flags/g; } else { $tmp_prod =~ s/\@Type\@/Enum/g; }
+ if ($flags) { $tmp_prod =~ s/\@TYPE\@/FLAGS/g; } else { $tmp_prod =~ s/\@TYPE\@/ENUM/g; }
+ chomp ($tmp_prod);
+
+ print "$tmp_prod\n";
+ }
+ }
+
+ if (length($vtail)) {
+ my $prod = $vtail;
+
+ $prod =~ s/\@enum_name\@/$enumsym/g;
+ $prod =~ s/\@EnumName\@/$enumname/g;
+ $prod =~ s/\@ENUMSHORT\@/$enumshort/g;
+ $prod =~ s/\@ENUMNAME\@/$enumlong/g;
+ if ($flags) { $prod =~ s/\@type\@/flags/g; } else { $prod =~ s/\@type\@/enum/g; }
+ if ($flags) { $prod =~ s/\@Type\@/Flags/g; } else { $prod =~ s/\@Type\@/Enum/g; }
+ if ($flags) { $prod =~ s/\@TYPE\@/FLAGS/g; } else { $prod =~ s/\@TYPE\@/ENUM/g; }
+ $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g;
+ $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g;
+ chomp ($prod);
+
+ print "$prod\n";
+ }
+ }
+}
+
+if (length($ftail)) {
+ my $prod = $ftail;
+
+ $prod =~ s/\@filename\@/$ARGV/g;
+ $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g;
+ $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g;
+ chomp ($prod);
+
+ print "$prod\n";
+}
+
+# put auto-generation comment
+{
+ my $comment = $comment_tmpl;
+ $comment =~ s/\@comment\@/Generated data ends here/;
+ print "\n" . $comment . "\n\n";
+}
diff --git a/trunk/gobject/gmarshal.list b/trunk/gobject/gmarshal.list
new file mode 100644
index 000000000..f3844a1e3
--- /dev/null
+++ b/trunk/gobject/gmarshal.list
@@ -0,0 +1,47 @@
+# see glib-genmarshal(1) for a detailed description of the file format,
+# possible parameter types are:
+# VOID indicates no return type, or no extra
+# parameters. if VOID is used as the parameter
+# list, no additional parameters may be present.
+# BOOLEAN for boolean types (gboolean)
+# CHAR for signed char types (gchar)
+# UCHAR for unsigned char types (guchar)
+# INT for signed integer types (gint)
+# UINT for unsigned integer types (guint)
+# LONG for signed long integer types (glong)
+# ULONG for unsigned long integer types (gulong)
+# ENUM for enumeration types (gint)
+# FLAGS for flag enumeration types (guint)
+# FLOAT for single-precision float types (gfloat)
+# DOUBLE for double-precision float types (gdouble)
+# STRING for string types (gchar*)
+# PARAM for GParamSpec or derived types (GParamSpec*)
+# BOXED for boxed (anonymous but reference counted) types (GBoxed*)
+# POINTER for anonymous pointer types (gpointer)
+# OBJECT for GObject or derived types (GObject*)
+# NONE deprecated alias for VOID
+# BOOL deprecated alias for BOOLEAN
+
+# standard VOID return marshallers
+VOID:VOID
+VOID:BOOLEAN
+VOID:CHAR
+VOID:UCHAR
+VOID:INT
+VOID:UINT
+VOID:LONG
+VOID:ULONG
+VOID:ENUM
+VOID:FLAGS
+VOID:FLOAT
+VOID:DOUBLE
+VOID:STRING
+VOID:PARAM
+VOID:BOXED
+VOID:POINTER
+VOID:OBJECT
+
+# GRuntime specific marshallers
+VOID:UINT,POINTER
+BOOL:FLAGS
+STRING:OBJECT,POINTER
diff --git a/trunk/gobject/gobject-query.c b/trunk/gobject/gobject-query.c
new file mode 100644
index 000000000..693474825
--- /dev/null
+++ b/trunk/gobject/gobject-query.c
@@ -0,0 +1,228 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1998-1999, 2000-2001 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.
+ */
+#include "../config.h"
+
+#include <glib-object.h>
+
+#include <glib/gprintf.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <sys/stat.h>
+#include <fcntl.h>
+
+static gchar *indent_inc = NULL;
+static guint spacing = 1;
+static FILE *f_out = NULL;
+static GType root = 0;
+static gboolean recursion = TRUE;
+
+#if 0
+# define O_SPACE "\\as"
+# define O_ESPACE " "
+# define O_BRANCH "\\aE"
+# define O_VLINE "\\al"
+# define O_LLEAF "\\aL"
+# define O_KEY_FILL "_"
+#else
+# define O_SPACE " "
+# define O_ESPACE ""
+# define O_BRANCH "+"
+# define O_VLINE "|"
+# define O_LLEAF "`"
+# define O_KEY_FILL "_"
+#endif
+
+static void
+show_nodes (GType type,
+ GType sibling,
+ const gchar *indent)
+{
+ GType *children;
+ guint i;
+
+ if (!type)
+ return;
+
+ children = g_type_children (type, NULL);
+
+ if (type != root)
+ for (i = 0; i < spacing; i++)
+ g_fprintf (f_out, "%s%s\n", indent, O_VLINE);
+
+ g_fprintf (f_out, "%s%s%s%s",
+ indent,
+ sibling ? O_BRANCH : (type != root ? O_LLEAF : O_SPACE),
+ O_ESPACE,
+ g_type_name (type));
+
+ for (i = strlen (g_type_name (type)); i <= strlen (indent_inc); i++)
+ fputs (O_KEY_FILL, f_out);
+
+ fputc ('\n', f_out);
+
+ if (children && recursion)
+ {
+ gchar *new_indent;
+ GType *child;
+
+ if (sibling)
+ new_indent = g_strconcat (indent, O_VLINE, indent_inc, NULL);
+ else
+ new_indent = g_strconcat (indent, O_SPACE, indent_inc, NULL);
+
+ for (child = children; *child; child++)
+ show_nodes (child[0], child[1], new_indent);
+
+ g_free (new_indent);
+ }
+
+ g_free (children);
+}
+
+static gint
+help (gchar *arg)
+{
+ g_fprintf (stderr, "usage: query <qualifier> [-r <type>] [-{i|b} \"\"] [-s #] [-{h|x|y}]\n");
+ g_fprintf (stderr, " -r specifiy root type\n");
+ g_fprintf (stderr, " -n don't descend type tree\n");
+ g_fprintf (stderr, " -h guess what ;)\n");
+ g_fprintf (stderr, " -b specify indent string\n");
+ g_fprintf (stderr, " -i specify incremental indent string\n");
+ g_fprintf (stderr, " -s specify line spacing\n");
+ g_fprintf (stderr, "qualifiers:\n");
+ g_fprintf (stderr, " froots iterate over fundamental roots\n");
+ g_fprintf (stderr, " tree print type tree\n");
+
+ return arg != NULL;
+}
+
+int
+main (gint argc,
+ gchar *argv[])
+{
+ GLogLevelFlags fatal_mask;
+ gboolean gen_froots = 0;
+ gboolean gen_tree = 0;
+ gint i;
+ gchar *iindent = "";
+
+ f_out = stdout;
+
+ fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
+ fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
+ g_log_set_always_fatal (fatal_mask);
+
+ root = G_TYPE_OBJECT;
+
+ g_type_init ();
+
+ for (i = 1; i < argc; i++)
+ {
+ if (strcmp ("-s", argv[i]) == 0)
+ {
+ i++;
+ if (i < argc)
+ spacing = atoi (argv[i]);
+ }
+ else if (strcmp ("-i", argv[i]) == 0)
+ {
+ i++;
+ if (i < argc)
+ {
+ char *p;
+ guint n;
+
+ p = argv[i];
+ while (*p)
+ p++;
+ n = p - argv[i];
+ indent_inc = g_new (gchar, n * strlen (O_SPACE) + 1);
+ *indent_inc = 0;
+ while (n)
+ {
+ n--;
+ strcpy (indent_inc, O_SPACE);
+ }
+ }
+ }
+ else if (strcmp ("-b", argv[i]) == 0)
+ {
+ i++;
+ if (i < argc)
+ iindent = argv[i];
+ }
+ else if (strcmp ("-r", argv[i]) == 0)
+ {
+ i++;
+ if (i < argc)
+ root = g_type_from_name (argv[i]);
+ }
+ else if (strcmp ("-n", argv[i]) == 0)
+ {
+ recursion = FALSE;
+ }
+ else if (strcmp ("froots", argv[i]) == 0)
+ {
+ gen_froots = 1;
+ }
+ else if (strcmp ("tree", argv[i]) == 0)
+ {
+ gen_tree = 1;
+ }
+ else if (strcmp ("-h", argv[i]) == 0)
+ {
+ return help (NULL);
+ }
+ else if (strcmp ("--help", argv[i]) == 0)
+ {
+ return help (NULL);
+ }
+ else
+ return help (argv[i]);
+ }
+
+ if (!gen_froots && !gen_tree)
+ return help (argv[i-1]);
+
+ if (!indent_inc)
+ {
+ indent_inc = g_new (gchar, strlen (O_SPACE) + 1);
+ *indent_inc = 0;
+ strcpy (indent_inc, O_SPACE);
+ }
+
+ if (gen_tree)
+ show_nodes (root, 0, iindent);
+ if (gen_froots)
+ {
+ root = ~0;
+ for (i = 0; i <= G_TYPE_FUNDAMENTAL_MAX; i += G_TYPE_MAKE_FUNDAMENTAL (1))
+ {
+ const gchar *name = g_type_name (i);
+
+ if (name)
+ show_nodes (i, 0, iindent);
+ }
+ }
+
+ return 0;
+}
diff --git a/trunk/gobject/gobject.c b/trunk/gobject/gobject.c
new file mode 100644
index 000000000..abcc56c93
--- /dev/null
+++ b/trunk/gobject/gobject.c
@@ -0,0 +1,2267 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1998-1999, 2000-2001 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.
+ */
+#include "gobject.h"
+#include <glib/gdatasetprivate.h>
+
+/*
+ * MT safe with regards to reference counting.
+ */
+
+#include "gvaluecollector.h"
+#include "gsignal.h"
+#include "gparamspecs.h"
+#include "gvaluetypes.h"
+#include <string.h>
+#include <signal.h>
+
+#include "gobjectalias.h"
+
+/* This should be included after gobjectalias.h (or pltcheck.sh will fail) */
+#include "gobjectnotifyqueue.c"
+
+
+#define PREALLOC_CPARAMS (8)
+
+
+/* --- macros --- */
+#define PARAM_SPEC_PARAM_ID(pspec) ((pspec)->param_id)
+#define PARAM_SPEC_SET_PARAM_ID(pspec, id) ((pspec)->param_id = (id))
+
+#define OBJECT_HAS_TOGGLE_REF_FLAG 0x1
+#define OBJECT_HAS_TOGGLE_REF(object) \
+ ((G_DATALIST_GET_FLAGS (&(object)->qdata) & OBJECT_HAS_TOGGLE_REF_FLAG) != 0)
+#define OBJECT_FLOATING_FLAG 0x2
+
+
+/* --- signals --- */
+enum {
+ NOTIFY,
+ LAST_SIGNAL
+};
+
+
+/* --- properties --- */
+enum {
+ PROP_NONE
+};
+
+
+/* --- prototypes --- */
+static void g_object_base_class_init (GObjectClass *class);
+static void g_object_base_class_finalize (GObjectClass *class);
+static void g_object_do_class_init (GObjectClass *class);
+static void g_object_init (GObject *object);
+static GObject* g_object_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_params);
+static void g_object_real_dispose (GObject *object);
+static void g_object_finalize (GObject *object);
+static void g_object_do_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void g_object_do_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void g_value_object_init (GValue *value);
+static void g_value_object_free_value (GValue *value);
+static void g_value_object_copy_value (const GValue *src_value,
+ GValue *dest_value);
+static void g_value_object_transform_value (const GValue *src_value,
+ GValue *dest_value);
+static gpointer g_value_object_peek_pointer (const GValue *value);
+static gchar* g_value_object_collect_value (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags);
+static gchar* g_value_object_lcopy_value (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags);
+static void g_object_dispatch_properties_changed (GObject *object,
+ guint n_pspecs,
+ GParamSpec **pspecs);
+static inline void object_get_property (GObject *object,
+ GParamSpec *pspec,
+ GValue *value);
+static inline void object_set_property (GObject *object,
+ GParamSpec *pspec,
+ const GValue *value,
+ GObjectNotifyQueue *nqueue);
+static guint object_floating_flag_handler (GObject *object,
+ gint job);
+
+static void object_interface_check_properties (gpointer func_data,
+ gpointer g_iface);
+
+
+/* --- variables --- */
+static GQuark quark_closure_array = 0;
+static GQuark quark_weak_refs = 0;
+static GQuark quark_toggle_refs = 0;
+static GParamSpecPool *pspec_pool = NULL;
+static GObjectNotifyContext property_notify_context = { 0, };
+static gulong gobject_signals[LAST_SIGNAL] = { 0, };
+static guint (*floating_flag_handler) (GObject*, gint) = object_floating_flag_handler;
+G_LOCK_DEFINE_STATIC (construction_mutex);
+static GSList *construction_objects = NULL;
+
+/* --- functions --- */
+#ifdef G_ENABLE_DEBUG
+#define IF_DEBUG(debug_type) if (_g_type_debug_flags & G_TYPE_DEBUG_ ## debug_type)
+G_LOCK_DEFINE_STATIC (debug_objects);
+static volatile GObject *g_trap_object_ref = NULL;
+static guint debug_objects_count = 0;
+static GHashTable *debug_objects_ht = NULL;
+static void
+debug_objects_foreach (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ GObject *object = value;
+
+ g_message ("[%p] stale %s\tref_count=%u",
+ object,
+ G_OBJECT_TYPE_NAME (object),
+ object->ref_count);
+}
+static void
+debug_objects_atexit (void)
+{
+ IF_DEBUG (OBJECTS)
+ {
+ G_LOCK (debug_objects);
+ g_message ("stale GObjects: %u", debug_objects_count);
+ g_hash_table_foreach (debug_objects_ht, debug_objects_foreach, NULL);
+ G_UNLOCK (debug_objects);
+ }
+}
+#endif /* G_ENABLE_DEBUG */
+
+void
+g_object_type_init (void)
+{
+ static gboolean initialized = FALSE;
+ static const GTypeFundamentalInfo finfo = {
+ G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE,
+ };
+ static GTypeInfo info = {
+ sizeof (GObjectClass),
+ (GBaseInitFunc) g_object_base_class_init,
+ (GBaseFinalizeFunc) g_object_base_class_finalize,
+ (GClassInitFunc) g_object_do_class_init,
+ NULL /* class_destroy */,
+ NULL /* class_data */,
+ sizeof (GObject),
+ 0 /* n_preallocs */,
+ (GInstanceInitFunc) g_object_init,
+ NULL, /* value_table */
+ };
+ static const GTypeValueTable value_table = {
+ g_value_object_init, /* value_init */
+ g_value_object_free_value, /* value_free */
+ g_value_object_copy_value, /* value_copy */
+ g_value_object_peek_pointer, /* value_peek_pointer */
+ "p", /* collect_format */
+ g_value_object_collect_value, /* collect_value */
+ "p", /* lcopy_format */
+ g_value_object_lcopy_value, /* lcopy_value */
+ };
+ GType type;
+
+ g_return_if_fail (initialized == FALSE);
+ initialized = TRUE;
+
+ /* G_TYPE_OBJECT
+ */
+ info.value_table = &value_table;
+ type = g_type_register_fundamental (G_TYPE_OBJECT, g_intern_static_string ("GObject"), &info, &finfo, 0);
+ g_assert (type == G_TYPE_OBJECT);
+ g_value_register_transform_func (G_TYPE_OBJECT, G_TYPE_OBJECT, g_value_object_transform_value);
+
+#ifdef G_ENABLE_DEBUG
+ IF_DEBUG (OBJECTS)
+ {
+ debug_objects_ht = g_hash_table_new (g_direct_hash, NULL);
+ g_atexit (debug_objects_atexit);
+ }
+#endif /* G_ENABLE_DEBUG */
+}
+
+static void
+g_object_base_class_init (GObjectClass *class)
+{
+ GObjectClass *pclass = g_type_class_peek_parent (class);
+
+ /* reset instance specific fields and methods that don't get inherited */
+ class->construct_properties = pclass ? g_slist_copy (pclass->construct_properties) : NULL;
+ class->get_property = NULL;
+ class->set_property = NULL;
+}
+
+static void
+g_object_base_class_finalize (GObjectClass *class)
+{
+ GList *list, *node;
+
+ _g_signals_destroy (G_OBJECT_CLASS_TYPE (class));
+
+ g_slist_free (class->construct_properties);
+ class->construct_properties = NULL;
+ list = g_param_spec_pool_list_owned (pspec_pool, G_OBJECT_CLASS_TYPE (class));
+ for (node = list; node; node = node->next)
+ {
+ GParamSpec *pspec = node->data;
+
+ g_param_spec_pool_remove (pspec_pool, pspec);
+ PARAM_SPEC_SET_PARAM_ID (pspec, 0);
+ g_param_spec_unref (pspec);
+ }
+ g_list_free (list);
+}
+
+static void
+g_object_notify_dispatcher (GObject *object,
+ guint n_pspecs,
+ GParamSpec **pspecs)
+{
+ G_OBJECT_GET_CLASS (object)->dispatch_properties_changed (object, n_pspecs, pspecs);
+}
+
+static void
+g_object_do_class_init (GObjectClass *class)
+{
+ /* read the comment about typedef struct CArray; on why not to change this quark */
+ quark_closure_array = g_quark_from_static_string ("GObject-closure-array");
+
+ quark_weak_refs = g_quark_from_static_string ("GObject-weak-references");
+ quark_toggle_refs = g_quark_from_static_string ("GObject-toggle-references");
+ pspec_pool = g_param_spec_pool_new (TRUE);
+ property_notify_context.quark_notify_queue = g_quark_from_static_string ("GObject-notify-queue");
+ property_notify_context.dispatcher = g_object_notify_dispatcher;
+
+ class->constructor = g_object_constructor;
+ class->set_property = g_object_do_set_property;
+ class->get_property = g_object_do_get_property;
+ class->dispose = g_object_real_dispose;
+ class->finalize = g_object_finalize;
+ class->dispatch_properties_changed = g_object_dispatch_properties_changed;
+ class->notify = NULL;
+
+ gobject_signals[NOTIFY] =
+ g_signal_new (g_intern_static_string ("notify"),
+ G_TYPE_FROM_CLASS (class),
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED | G_SIGNAL_NO_HOOKS | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (GObjectClass, notify),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__PARAM,
+ G_TYPE_NONE,
+ 1, G_TYPE_PARAM);
+
+ /* Install a check function that we'll use to verify that classes that
+ * implement an interface implement all properties for that interface
+ */
+ g_type_add_interface_check (NULL, object_interface_check_properties);
+}
+
+static void
+install_property_internal (GType g_type,
+ guint property_id,
+ GParamSpec *pspec)
+{
+ if (g_param_spec_pool_lookup (pspec_pool, pspec->name, g_type, FALSE))
+ {
+ g_warning ("When installing property: type `%s' already has a property named `%s'",
+ g_type_name (g_type),
+ pspec->name);
+ return;
+ }
+
+ g_param_spec_ref (pspec);
+ g_param_spec_sink (pspec);
+ PARAM_SPEC_SET_PARAM_ID (pspec, property_id);
+ g_param_spec_pool_insert (pspec_pool, pspec, g_type);
+}
+
+void
+g_object_class_install_property (GObjectClass *class,
+ guint property_id,
+ GParamSpec *pspec)
+{
+ g_return_if_fail (G_IS_OBJECT_CLASS (class));
+ g_return_if_fail (G_IS_PARAM_SPEC (pspec));
+ if (pspec->flags & G_PARAM_WRITABLE)
+ g_return_if_fail (class->set_property != NULL);
+ if (pspec->flags & G_PARAM_READABLE)
+ g_return_if_fail (class->get_property != NULL);
+ g_return_if_fail (property_id > 0);
+ g_return_if_fail (PARAM_SPEC_PARAM_ID (pspec) == 0); /* paranoid */
+ if (pspec->flags & G_PARAM_CONSTRUCT)
+ g_return_if_fail ((pspec->flags & G_PARAM_CONSTRUCT_ONLY) == 0);
+ if (pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY))
+ g_return_if_fail (pspec->flags & G_PARAM_WRITABLE);
+
+ install_property_internal (G_OBJECT_CLASS_TYPE (class), property_id, pspec);
+
+ if (pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY))
+ class->construct_properties = g_slist_prepend (class->construct_properties, pspec);
+
+ /* for property overrides of construct poperties, we have to get rid
+ * of the overidden inherited construct property
+ */
+ pspec = g_param_spec_pool_lookup (pspec_pool, pspec->name, g_type_parent (G_OBJECT_CLASS_TYPE (class)), TRUE);
+ if (pspec && pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY))
+ class->construct_properties = g_slist_remove (class->construct_properties, pspec);
+}
+
+void
+g_object_interface_install_property (gpointer g_iface,
+ GParamSpec *pspec)
+{
+ GTypeInterface *iface_class = g_iface;
+
+ g_return_if_fail (G_TYPE_IS_INTERFACE (iface_class->g_type));
+ g_return_if_fail (G_IS_PARAM_SPEC (pspec));
+ g_return_if_fail (!G_IS_PARAM_SPEC_OVERRIDE (pspec)); /* paranoid */
+ g_return_if_fail (PARAM_SPEC_PARAM_ID (pspec) == 0); /* paranoid */
+
+ install_property_internal (iface_class->g_type, 0, pspec);
+}
+
+GParamSpec*
+g_object_class_find_property (GObjectClass *class,
+ const gchar *property_name)
+{
+ GParamSpec *pspec;
+ GParamSpec *redirect;
+
+ g_return_val_if_fail (G_IS_OBJECT_CLASS (class), NULL);
+ g_return_val_if_fail (property_name != NULL, NULL);
+
+ pspec = g_param_spec_pool_lookup (pspec_pool,
+ property_name,
+ G_OBJECT_CLASS_TYPE (class),
+ TRUE);
+ if (pspec)
+ {
+ redirect = g_param_spec_get_redirect_target (pspec);
+ if (redirect)
+ return redirect;
+ else
+ return pspec;
+ }
+ else
+ return NULL;
+}
+
+GParamSpec*
+g_object_interface_find_property (gpointer g_iface,
+ const gchar *property_name)
+{
+ GTypeInterface *iface_class = g_iface;
+
+ g_return_val_if_fail (G_TYPE_IS_INTERFACE (iface_class->g_type), NULL);
+ g_return_val_if_fail (property_name != NULL, NULL);
+
+ return g_param_spec_pool_lookup (pspec_pool,
+ property_name,
+ iface_class->g_type,
+ FALSE);
+}
+
+void
+g_object_class_override_property (GObjectClass *oclass,
+ guint property_id,
+ const gchar *name)
+{
+ GParamSpec *overridden = NULL;
+ GParamSpec *new;
+ GType parent_type;
+
+ g_return_if_fail (G_IS_OBJECT_CLASS (oclass));
+ g_return_if_fail (property_id > 0);
+ g_return_if_fail (name != NULL);
+
+ /* Find the overridden property; first check parent types
+ */
+ parent_type = g_type_parent (G_OBJECT_CLASS_TYPE (oclass));
+ if (parent_type != G_TYPE_NONE)
+ overridden = g_param_spec_pool_lookup (pspec_pool,
+ name,
+ parent_type,
+ TRUE);
+ if (!overridden)
+ {
+ GType *ifaces;
+ guint n_ifaces;
+
+ /* Now check interfaces
+ */
+ ifaces = g_type_interfaces (G_OBJECT_CLASS_TYPE (oclass), &n_ifaces);
+ while (n_ifaces-- && !overridden)
+ {
+ overridden = g_param_spec_pool_lookup (pspec_pool,
+ name,
+ ifaces[n_ifaces],
+ FALSE);
+ }
+
+ g_free (ifaces);
+ }
+
+ if (!overridden)
+ {
+ g_warning ("%s: Can't find property to override for '%s::%s'",
+ G_STRFUNC, G_OBJECT_CLASS_NAME (oclass), name);
+ return;
+ }
+
+ new = g_param_spec_override (name, overridden);
+ g_object_class_install_property (oclass, property_id, new);
+}
+
+GParamSpec** /* free result */
+g_object_class_list_properties (GObjectClass *class,
+ guint *n_properties_p)
+{
+ GParamSpec **pspecs;
+ guint n;
+
+ g_return_val_if_fail (G_IS_OBJECT_CLASS (class), NULL);
+
+ pspecs = g_param_spec_pool_list (pspec_pool,
+ G_OBJECT_CLASS_TYPE (class),
+ &n);
+ if (n_properties_p)
+ *n_properties_p = n;
+
+ return pspecs;
+}
+
+GParamSpec** /* free result */
+g_object_interface_list_properties (gpointer g_iface,
+ guint *n_properties_p)
+{
+ GTypeInterface *iface_class = g_iface;
+ GParamSpec **pspecs;
+ guint n;
+
+ g_return_val_if_fail (G_TYPE_IS_INTERFACE (iface_class->g_type), NULL);
+
+ pspecs = g_param_spec_pool_list (pspec_pool,
+ iface_class->g_type,
+ &n);
+ if (n_properties_p)
+ *n_properties_p = n;
+
+ return pspecs;
+}
+
+static void
+g_object_init (GObject *object)
+{
+ object->ref_count = 1;
+ g_datalist_init (&object->qdata);
+
+ /* freeze object's notification queue, g_object_newv() preserves pairedness */
+ g_object_notify_queue_freeze (object, &property_notify_context);
+ /* enter construction list for notify_queue_thaw() and to allow construct-only properties */
+ G_LOCK (construction_mutex);
+ construction_objects = g_slist_prepend (construction_objects, object);
+ G_UNLOCK (construction_mutex);
+
+#ifdef G_ENABLE_DEBUG
+ IF_DEBUG (OBJECTS)
+ {
+ G_LOCK (debug_objects);
+ debug_objects_count++;
+ g_hash_table_insert (debug_objects_ht, object, object);
+ G_UNLOCK (debug_objects);
+ }
+#endif /* G_ENABLE_DEBUG */
+}
+
+static void
+g_object_do_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id)
+ {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+g_object_do_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id)
+ {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+g_object_real_dispose (GObject *object)
+{
+ g_signal_handlers_destroy (object);
+ g_datalist_id_set_data (&object->qdata, quark_closure_array, NULL);
+ g_datalist_id_set_data (&object->qdata, quark_weak_refs, NULL);
+}
+
+static void
+g_object_finalize (GObject *object)
+{
+ g_datalist_clear (&object->qdata);
+
+#ifdef G_ENABLE_DEBUG
+ IF_DEBUG (OBJECTS)
+ {
+ G_LOCK (debug_objects);
+ g_assert (g_hash_table_lookup (debug_objects_ht, object) == object);
+ g_hash_table_remove (debug_objects_ht, object);
+ debug_objects_count--;
+ G_UNLOCK (debug_objects);
+ }
+#endif /* G_ENABLE_DEBUG */
+}
+
+
+static void
+g_object_dispatch_properties_changed (GObject *object,
+ guint n_pspecs,
+ GParamSpec **pspecs)
+{
+ guint i;
+
+ for (i = 0; i < n_pspecs; i++)
+ g_signal_emit (object, gobject_signals[NOTIFY], g_quark_from_string (pspecs[i]->name), pspecs[i]);
+}
+
+void
+g_object_run_dispose (GObject *object)
+{
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (object->ref_count > 0);
+
+ g_object_ref (object);
+ G_OBJECT_GET_CLASS (object)->dispose (object);
+ g_object_unref (object);
+}
+
+void
+g_object_freeze_notify (GObject *object)
+{
+ g_return_if_fail (G_IS_OBJECT (object));
+
+ if (g_atomic_int_get (&object->ref_count) == 0)
+ return;
+
+ g_object_ref (object);
+ g_object_notify_queue_freeze (object, &property_notify_context);
+ g_object_unref (object);
+}
+
+void
+g_object_notify (GObject *object,
+ const gchar *property_name)
+{
+ GParamSpec *pspec;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (property_name != NULL);
+ if (g_atomic_int_get (&object->ref_count) == 0)
+ return;
+
+ g_object_ref (object);
+ /* We don't need to get the redirect target
+ * (by, e.g. calling g_object_class_find_property())
+ * because g_object_notify_queue_add() does that
+ */
+ pspec = g_param_spec_pool_lookup (pspec_pool,
+ property_name,
+ G_OBJECT_TYPE (object),
+ TRUE);
+
+ if (!pspec)
+ g_warning ("%s: object class `%s' has no property named `%s'",
+ G_STRFUNC,
+ G_OBJECT_TYPE_NAME (object),
+ property_name);
+ else
+ {
+ GObjectNotifyQueue *nqueue;
+
+ nqueue = g_object_notify_queue_freeze (object, &property_notify_context);
+ g_object_notify_queue_add (object, nqueue, pspec);
+ g_object_notify_queue_thaw (object, nqueue);
+ }
+ g_object_unref (object);
+}
+
+void
+g_object_thaw_notify (GObject *object)
+{
+ GObjectNotifyQueue *nqueue;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+ if (g_atomic_int_get (&object->ref_count) == 0)
+ return;
+
+ g_object_ref (object);
+ nqueue = g_object_notify_queue_from_object (object, &property_notify_context);
+ if (!nqueue || !nqueue->freeze_count)
+ g_warning ("%s: property-changed notification for %s(%p) is not frozen",
+ G_STRFUNC, G_OBJECT_TYPE_NAME (object), object);
+ else
+ g_object_notify_queue_thaw (object, nqueue);
+ g_object_unref (object);
+}
+
+static inline void
+object_get_property (GObject *object,
+ GParamSpec *pspec,
+ GValue *value)
+{
+ GObjectClass *class = g_type_class_peek (pspec->owner_type);
+ guint param_id = PARAM_SPEC_PARAM_ID (pspec);
+ GParamSpec *redirect;
+
+ redirect = g_param_spec_get_redirect_target (pspec);
+ if (redirect)
+ pspec = redirect;
+
+ class->get_property (object, param_id, value, pspec);
+}
+
+static inline void
+object_set_property (GObject *object,
+ GParamSpec *pspec,
+ const GValue *value,
+ GObjectNotifyQueue *nqueue)
+{
+ GValue tmp_value = { 0, };
+ GObjectClass *class = g_type_class_peek (pspec->owner_type);
+ guint param_id = PARAM_SPEC_PARAM_ID (pspec);
+ GParamSpec *redirect;
+
+ redirect = g_param_spec_get_redirect_target (pspec);
+ if (redirect)
+ pspec = redirect;
+
+ /* provide a copy to work from, convert (if necessary) and validate */
+ g_value_init (&tmp_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+ if (!g_value_transform (value, &tmp_value))
+ g_warning ("unable to set property `%s' of type `%s' from value of type `%s'",
+ pspec->name,
+ g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)),
+ G_VALUE_TYPE_NAME (value));
+ else if (g_param_value_validate (pspec, &tmp_value) && !(pspec->flags & G_PARAM_LAX_VALIDATION))
+ {
+ gchar *contents = g_strdup_value_contents (value);
+
+ g_warning ("value \"%s\" of type `%s' is invalid or out of range for property `%s' of type `%s'",
+ contents,
+ G_VALUE_TYPE_NAME (value),
+ pspec->name,
+ g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)));
+ g_free (contents);
+ }
+ else
+ {
+ class->set_property (object, param_id, &tmp_value, pspec);
+ g_object_notify_queue_add (object, nqueue, pspec);
+ }
+ g_value_unset (&tmp_value);
+}
+
+static void
+object_interface_check_properties (gpointer func_data,
+ gpointer g_iface)
+{
+ GTypeInterface *iface_class = g_iface;
+ GObjectClass *class = g_type_class_peek (iface_class->g_instance_type);
+ GType iface_type = iface_class->g_type;
+ GParamSpec **pspecs;
+ guint n;
+
+ if (!G_IS_OBJECT_CLASS (class))
+ return;
+
+ pspecs = g_param_spec_pool_list (pspec_pool, iface_type, &n);
+
+ while (n--)
+ {
+ GParamSpec *class_pspec = g_param_spec_pool_lookup (pspec_pool,
+ pspecs[n]->name,
+ G_OBJECT_CLASS_TYPE (class),
+ TRUE);
+
+ if (!class_pspec)
+ {
+ g_critical ("Object class %s doesn't implement property "
+ "'%s' from interface '%s'",
+ g_type_name (G_OBJECT_CLASS_TYPE (class)),
+ pspecs[n]->name,
+ g_type_name (iface_type));
+
+ continue;
+ }
+
+ /* The implementation paramspec must have a less restrictive
+ * type than the interface parameter spec for set() and a
+ * more restrictive type for get(). We just require equality,
+ * rather than doing something more complicated checking
+ * the READABLE and WRITABLE flags. We also simplify here
+ * by only checking the value type, not the G_PARAM_SPEC_TYPE.
+ */
+ if (class_pspec &&
+ !g_type_is_a (G_PARAM_SPEC_VALUE_TYPE (pspecs[n]),
+ G_PARAM_SPEC_VALUE_TYPE (class_pspec)))
+ {
+ g_critical ("Property '%s' on class '%s' has type '%s' "
+ "which is different from the type '%s', "
+ "of the property on interface '%s'\n",
+ pspecs[n]->name,
+ g_type_name (G_OBJECT_CLASS_TYPE (class)),
+ g_type_name (G_PARAM_SPEC_VALUE_TYPE (class_pspec)),
+ g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspecs[n])),
+ g_type_name (iface_type));
+ }
+
+#define SUBSET(a,b,mask) (((a) & ~(b) & (mask)) == 0)
+
+ /* CONSTRUCT and CONSTRUCT_ONLY add restrictions.
+ * READABLE and WRITABLE remove restrictions. The implementation
+ * paramspec must have less restrictive flags.
+ */
+ if (class_pspec &&
+ (!SUBSET (class_pspec->flags,
+ pspecs[n]->flags,
+ G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY) ||
+ !SUBSET (pspecs[n]->flags,
+ class_pspec->flags,
+ G_PARAM_READABLE | G_PARAM_WRITABLE)))
+ {
+ g_critical ("Flags for property '%s' on class '%s' "
+ "are not compatible with the property on"
+ "interface '%s'\n",
+ pspecs[n]->name,
+ g_type_name (G_OBJECT_CLASS_TYPE (class)),
+ g_type_name (iface_type));
+ }
+#undef SUBSET
+ }
+
+ g_free (pspecs);
+}
+
+gpointer
+g_object_new (GType object_type,
+ const gchar *first_property_name,
+ ...)
+{
+ GObject *object;
+ va_list var_args;
+
+ g_return_val_if_fail (G_TYPE_IS_OBJECT (object_type), NULL);
+
+ va_start (var_args, first_property_name);
+ object = g_object_new_valist (object_type, first_property_name, var_args);
+ va_end (var_args);
+
+ return object;
+}
+
+static gboolean
+slist_maybe_remove (GSList **slist,
+ gconstpointer data)
+{
+ GSList *last = NULL, *node = *slist;
+ while (node)
+ {
+ if (node->data == data)
+ {
+ if (last)
+ last->next = node->next;
+ else
+ *slist = node->next;
+ g_slist_free_1 (node);
+ return TRUE;
+ }
+ last = node;
+ node = last->next;
+ }
+ return FALSE;
+}
+
+static inline gboolean
+object_in_construction_list (GObject *object)
+{
+ gboolean in_construction;
+ G_LOCK (construction_mutex);
+ in_construction = g_slist_find (construction_objects, object) != NULL;
+ G_UNLOCK (construction_mutex);
+ return in_construction;
+}
+
+gpointer
+g_object_newv (GType object_type,
+ guint n_parameters,
+ GParameter *parameters)
+{
+ GObjectConstructParam *cparams, *oparams;
+ GObjectNotifyQueue *nqueue = NULL; /* shouldn't be initialized, just to silence compiler */
+ GObject *object;
+ GObjectClass *class, *unref_class = NULL;
+ GSList *slist;
+ guint n_total_cparams = 0, n_cparams = 0, n_oparams = 0, n_cvalues;
+ GValue *cvalues;
+ GList *clist = NULL;
+ gboolean newly_constructed;
+ guint i;
+
+ g_return_val_if_fail (G_TYPE_IS_OBJECT (object_type), NULL);
+
+ class = g_type_class_peek_static (object_type);
+ if (!class)
+ class = unref_class = g_type_class_ref (object_type);
+ for (slist = class->construct_properties; slist; slist = slist->next)
+ {
+ clist = g_list_prepend (clist, slist->data);
+ n_total_cparams += 1;
+ }
+
+ /* collect parameters, sort into construction and normal ones */
+ oparams = g_new (GObjectConstructParam, n_parameters);
+ cparams = g_new (GObjectConstructParam, n_total_cparams);
+ for (i = 0; i < n_parameters; i++)
+ {
+ GValue *value = &parameters[i].value;
+ GParamSpec *pspec = g_param_spec_pool_lookup (pspec_pool,
+ parameters[i].name,
+ object_type,
+ TRUE);
+ if (!pspec)
+ {
+ g_warning ("%s: object class `%s' has no property named `%s'",
+ G_STRFUNC,
+ g_type_name (object_type),
+ parameters[i].name);
+ continue;
+ }
+ if (!(pspec->flags & G_PARAM_WRITABLE))
+ {
+ g_warning ("%s: property `%s' of object class `%s' is not writable",
+ G_STRFUNC,
+ pspec->name,
+ g_type_name (object_type));
+ continue;
+ }
+ if (pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY))
+ {
+ GList *list = g_list_find (clist, pspec);
+
+ if (!list)
+ {
+ g_warning ("%s: construct property \"%s\" for object `%s' can't be set twice",
+ G_STRFUNC, pspec->name, g_type_name (object_type));
+ continue;
+ }
+ cparams[n_cparams].pspec = pspec;
+ cparams[n_cparams].value = value;
+ n_cparams++;
+ if (!list->prev)
+ clist = list->next;
+ else
+ list->prev->next = list->next;
+ if (list->next)
+ list->next->prev = list->prev;
+ g_list_free_1 (list);
+ }
+ else
+ {
+ oparams[n_oparams].pspec = pspec;
+ oparams[n_oparams].value = value;
+ n_oparams++;
+ }
+ }
+
+ /* set remaining construction properties to default values */
+ n_cvalues = n_total_cparams - n_cparams;
+ cvalues = g_new (GValue, n_cvalues);
+ while (clist)
+ {
+ GList *tmp = clist->next;
+ GParamSpec *pspec = clist->data;
+ GValue *value = cvalues + n_total_cparams - n_cparams - 1;
+
+ value->g_type = 0;
+ g_value_init (value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+ g_param_value_set_default (pspec, value);
+
+ cparams[n_cparams].pspec = pspec;
+ cparams[n_cparams].value = value;
+ n_cparams++;
+
+ g_list_free_1 (clist);
+ clist = tmp;
+ }
+
+ /* construct object from construction parameters */
+ object = class->constructor (object_type, n_total_cparams, cparams);
+ /* free construction values */
+ g_free (cparams);
+ while (n_cvalues--)
+ g_value_unset (cvalues + n_cvalues);
+ g_free (cvalues);
+
+ /* adjust freeze_count according to g_object_init() and remaining properties */
+ G_LOCK (construction_mutex);
+ newly_constructed = slist_maybe_remove (&construction_objects, object);
+ G_UNLOCK (construction_mutex);
+ if (newly_constructed || n_oparams)
+ nqueue = g_object_notify_queue_freeze (object, &property_notify_context);
+ if (newly_constructed)
+ g_object_notify_queue_thaw (object, nqueue);
+
+ /* run 'constructed' handler if there is one */
+ if (newly_constructed && class->constructed)
+ class->constructed (object);
+
+ /* set remaining properties */
+ for (i = 0; i < n_oparams; i++)
+ object_set_property (object, oparams[i].pspec, oparams[i].value, nqueue);
+ g_free (oparams);
+
+ /* release our own freeze count and handle notifications */
+ if (newly_constructed || n_oparams)
+ g_object_notify_queue_thaw (object, nqueue);
+
+ if (unref_class)
+ g_type_class_unref (unref_class);
+
+ return object;
+}
+
+GObject*
+g_object_new_valist (GType object_type,
+ const gchar *first_property_name,
+ va_list var_args)
+{
+ GObjectClass *class;
+ GParameter *params;
+ const gchar *name;
+ GObject *object;
+ guint n_params = 0, n_alloced_params = 16;
+
+ g_return_val_if_fail (G_TYPE_IS_OBJECT (object_type), NULL);
+
+ if (!first_property_name)
+ return g_object_newv (object_type, 0, NULL);
+
+ class = g_type_class_ref (object_type);
+
+ params = g_new (GParameter, n_alloced_params);
+ name = first_property_name;
+ while (name)
+ {
+ gchar *error = NULL;
+ GParamSpec *pspec = g_param_spec_pool_lookup (pspec_pool,
+ name,
+ object_type,
+ TRUE);
+ if (!pspec)
+ {
+ g_warning ("%s: object class `%s' has no property named `%s'",
+ G_STRFUNC,
+ g_type_name (object_type),
+ name);
+ break;
+ }
+ if (n_params >= n_alloced_params)
+ {
+ n_alloced_params += 16;
+ params = g_renew (GParameter, params, n_alloced_params);
+ }
+ params[n_params].name = name;
+ params[n_params].value.g_type = 0;
+ g_value_init (&params[n_params].value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+ G_VALUE_COLLECT (&params[n_params].value, var_args, 0, &error);
+ if (error)
+ {
+ g_warning ("%s: %s", G_STRFUNC, error);
+ g_free (error);
+ g_value_unset (&params[n_params].value);
+ break;
+ }
+ n_params++;
+ name = va_arg (var_args, gchar*);
+ }
+
+ object = g_object_newv (object_type, n_params, params);
+
+ while (n_params--)
+ g_value_unset (&params[n_params].value);
+ g_free (params);
+
+ g_type_class_unref (class);
+
+ return object;
+}
+
+static GObject*
+g_object_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_params)
+{
+ GObject *object;
+
+ /* create object */
+ object = (GObject*) g_type_create_instance (type);
+
+ /* set construction parameters */
+ if (n_construct_properties)
+ {
+ GObjectNotifyQueue *nqueue = g_object_notify_queue_freeze (object, &property_notify_context);
+
+ /* set construct properties */
+ while (n_construct_properties--)
+ {
+ GValue *value = construct_params->value;
+ GParamSpec *pspec = construct_params->pspec;
+
+ construct_params++;
+ object_set_property (object, pspec, value, nqueue);
+ }
+ g_object_notify_queue_thaw (object, nqueue);
+ /* the notification queue is still frozen from g_object_init(), so
+ * we don't need to handle it here, g_object_newv() takes
+ * care of that
+ */
+ }
+
+ return object;
+}
+
+void
+g_object_set_valist (GObject *object,
+ const gchar *first_property_name,
+ va_list var_args)
+{
+ GObjectNotifyQueue *nqueue;
+ const gchar *name;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+
+ g_object_ref (object);
+ nqueue = g_object_notify_queue_freeze (object, &property_notify_context);
+
+ name = first_property_name;
+ while (name)
+ {
+ GValue value = { 0, };
+ GParamSpec *pspec;
+ gchar *error = NULL;
+
+ pspec = g_param_spec_pool_lookup (pspec_pool,
+ name,
+ G_OBJECT_TYPE (object),
+ TRUE);
+ if (!pspec)
+ {
+ g_warning ("%s: object class `%s' has no property named `%s'",
+ G_STRFUNC,
+ G_OBJECT_TYPE_NAME (object),
+ name);
+ break;
+ }
+ if (!(pspec->flags & G_PARAM_WRITABLE))
+ {
+ g_warning ("%s: property `%s' of object class `%s' is not writable",
+ G_STRFUNC,
+ pspec->name,
+ G_OBJECT_TYPE_NAME (object));
+ break;
+ }
+ if ((pspec->flags & G_PARAM_CONSTRUCT_ONLY) && !object_in_construction_list (object))
+ {
+ g_warning ("%s: construct property \"%s\" for object `%s' can't be set after construction",
+ G_STRFUNC, pspec->name, G_OBJECT_TYPE_NAME (object));
+ break;
+ }
+
+ g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+
+ G_VALUE_COLLECT (&value, var_args, 0, &error);
+ if (error)
+ {
+ g_warning ("%s: %s", G_STRFUNC, error);
+ g_free (error);
+ g_value_unset (&value);
+ break;
+ }
+
+ object_set_property (object, pspec, &value, nqueue);
+ g_value_unset (&value);
+
+ name = va_arg (var_args, gchar*);
+ }
+
+ g_object_notify_queue_thaw (object, nqueue);
+ g_object_unref (object);
+}
+
+void
+g_object_get_valist (GObject *object,
+ const gchar *first_property_name,
+ va_list var_args)
+{
+ const gchar *name;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+
+ g_object_ref (object);
+
+ name = first_property_name;
+
+ while (name)
+ {
+ GValue value = { 0, };
+ GParamSpec *pspec;
+ gchar *error;
+
+ pspec = g_param_spec_pool_lookup (pspec_pool,
+ name,
+ G_OBJECT_TYPE (object),
+ TRUE);
+ if (!pspec)
+ {
+ g_warning ("%s: object class `%s' has no property named `%s'",
+ G_STRFUNC,
+ G_OBJECT_TYPE_NAME (object),
+ name);
+ break;
+ }
+ if (!(pspec->flags & G_PARAM_READABLE))
+ {
+ g_warning ("%s: property `%s' of object class `%s' is not readable",
+ G_STRFUNC,
+ pspec->name,
+ G_OBJECT_TYPE_NAME (object));
+ break;
+ }
+
+ g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+
+ object_get_property (object, pspec, &value);
+
+ G_VALUE_LCOPY (&value, var_args, 0, &error);
+ if (error)
+ {
+ g_warning ("%s: %s", G_STRFUNC, error);
+ g_free (error);
+ g_value_unset (&value);
+ break;
+ }
+
+ g_value_unset (&value);
+
+ name = va_arg (var_args, gchar*);
+ }
+
+ g_object_unref (object);
+}
+
+void
+g_object_set (gpointer _object,
+ const gchar *first_property_name,
+ ...)
+{
+ GObject *object = _object;
+ va_list var_args;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+
+ va_start (var_args, first_property_name);
+ g_object_set_valist (object, first_property_name, var_args);
+ va_end (var_args);
+}
+
+void
+g_object_get (gpointer _object,
+ const gchar *first_property_name,
+ ...)
+{
+ GObject *object = _object;
+ va_list var_args;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+
+ va_start (var_args, first_property_name);
+ g_object_get_valist (object, first_property_name, var_args);
+ va_end (var_args);
+}
+
+void
+g_object_set_property (GObject *object,
+ const gchar *property_name,
+ const GValue *value)
+{
+ GObjectNotifyQueue *nqueue;
+ GParamSpec *pspec;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (property_name != NULL);
+ g_return_if_fail (G_IS_VALUE (value));
+
+ g_object_ref (object);
+ nqueue = g_object_notify_queue_freeze (object, &property_notify_context);
+
+ pspec = g_param_spec_pool_lookup (pspec_pool,
+ property_name,
+ G_OBJECT_TYPE (object),
+ TRUE);
+ if (!pspec)
+ g_warning ("%s: object class `%s' has no property named `%s'",
+ G_STRFUNC,
+ G_OBJECT_TYPE_NAME (object),
+ property_name);
+ else if (!(pspec->flags & G_PARAM_WRITABLE))
+ g_warning ("%s: property `%s' of object class `%s' is not writable",
+ G_STRFUNC,
+ pspec->name,
+ G_OBJECT_TYPE_NAME (object));
+ else if ((pspec->flags & G_PARAM_CONSTRUCT_ONLY) && !object_in_construction_list (object))
+ g_warning ("%s: construct property \"%s\" for object `%s' can't be set after construction",
+ G_STRFUNC, pspec->name, G_OBJECT_TYPE_NAME (object));
+ else
+ object_set_property (object, pspec, value, nqueue);
+
+ g_object_notify_queue_thaw (object, nqueue);
+ g_object_unref (object);
+}
+
+void
+g_object_get_property (GObject *object,
+ const gchar *property_name,
+ GValue *value)
+{
+ GParamSpec *pspec;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (property_name != NULL);
+ g_return_if_fail (G_IS_VALUE (value));
+
+ g_object_ref (object);
+
+ pspec = g_param_spec_pool_lookup (pspec_pool,
+ property_name,
+ G_OBJECT_TYPE (object),
+ TRUE);
+ if (!pspec)
+ g_warning ("%s: object class `%s' has no property named `%s'",
+ G_STRFUNC,
+ G_OBJECT_TYPE_NAME (object),
+ property_name);
+ else if (!(pspec->flags & G_PARAM_READABLE))
+ g_warning ("%s: property `%s' of object class `%s' is not readable",
+ G_STRFUNC,
+ pspec->name,
+ G_OBJECT_TYPE_NAME (object));
+ else
+ {
+ GValue *prop_value, tmp_value = { 0, };
+
+ /* auto-conversion of the callers value type
+ */
+ if (G_VALUE_TYPE (value) == G_PARAM_SPEC_VALUE_TYPE (pspec))
+ {
+ g_value_reset (value);
+ prop_value = value;
+ }
+ else if (!g_value_type_transformable (G_PARAM_SPEC_VALUE_TYPE (pspec), G_VALUE_TYPE (value)))
+ {
+ g_warning ("%s: can't retrieve property `%s' of type `%s' as value of type `%s'",
+ G_STRFUNC, pspec->name,
+ g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)),
+ G_VALUE_TYPE_NAME (value));
+ g_object_unref (object);
+ return;
+ }
+ else
+ {
+ g_value_init (&tmp_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+ prop_value = &tmp_value;
+ }
+ object_get_property (object, pspec, prop_value);
+ if (prop_value != value)
+ {
+ g_value_transform (prop_value, value);
+ g_value_unset (&tmp_value);
+ }
+ }
+
+ g_object_unref (object);
+}
+
+gpointer
+g_object_connect (gpointer _object,
+ const gchar *signal_spec,
+ ...)
+{
+ GObject *object = _object;
+ va_list var_args;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+ g_return_val_if_fail (object->ref_count > 0, object);
+
+ va_start (var_args, signal_spec);
+ while (signal_spec)
+ {
+ GCallback callback = va_arg (var_args, GCallback);
+ gpointer data = va_arg (var_args, gpointer);
+ gulong sid;
+
+ if (strncmp (signal_spec, "signal::", 8) == 0)
+ sid = g_signal_connect_data (object, signal_spec + 8,
+ callback, data, NULL,
+ 0);
+ else if (strncmp (signal_spec, "object_signal::", 15) == 0 ||
+ strncmp (signal_spec, "object-signal::", 15) == 0)
+ sid = g_signal_connect_object (object, signal_spec + 15,
+ callback, data,
+ 0);
+ else if (strncmp (signal_spec, "swapped_signal::", 16) == 0 ||
+ strncmp (signal_spec, "swapped-signal::", 16) == 0)
+ sid = g_signal_connect_data (object, signal_spec + 16,
+ callback, data, NULL,
+ G_CONNECT_SWAPPED);
+ else if (strncmp (signal_spec, "swapped_object_signal::", 23) == 0 ||
+ strncmp (signal_spec, "swapped-object-signal::", 23) == 0)
+ sid = g_signal_connect_object (object, signal_spec + 23,
+ callback, data,
+ G_CONNECT_SWAPPED);
+ else if (strncmp (signal_spec, "signal_after::", 14) == 0 ||
+ strncmp (signal_spec, "signal-after::", 14) == 0)
+ sid = g_signal_connect_data (object, signal_spec + 14,
+ callback, data, NULL,
+ G_CONNECT_AFTER);
+ else if (strncmp (signal_spec, "object_signal_after::", 21) == 0 ||
+ strncmp (signal_spec, "object-signal-after::", 21) == 0)
+ sid = g_signal_connect_object (object, signal_spec + 21,
+ callback, data,
+ G_CONNECT_AFTER);
+ else if (strncmp (signal_spec, "swapped_signal_after::", 22) == 0 ||
+ strncmp (signal_spec, "swapped-signal-after::", 22) == 0)
+ sid = g_signal_connect_data (object, signal_spec + 22,
+ callback, data, NULL,
+ G_CONNECT_SWAPPED | G_CONNECT_AFTER);
+ else if (strncmp (signal_spec, "swapped_object_signal_after::", 29) == 0 ||
+ strncmp (signal_spec, "swapped-object-signal-after::", 29) == 0)
+ sid = g_signal_connect_object (object, signal_spec + 29,
+ callback, data,
+ G_CONNECT_SWAPPED | G_CONNECT_AFTER);
+ else
+ {
+ g_warning ("%s: invalid signal spec \"%s\"", G_STRFUNC, signal_spec);
+ break;
+ }
+ signal_spec = va_arg (var_args, gchar*);
+ }
+ va_end (var_args);
+
+ return object;
+}
+
+void
+g_object_disconnect (gpointer _object,
+ const gchar *signal_spec,
+ ...)
+{
+ GObject *object = _object;
+ va_list var_args;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (object->ref_count > 0);
+
+ va_start (var_args, signal_spec);
+ while (signal_spec)
+ {
+ GCallback callback = va_arg (var_args, GCallback);
+ gpointer data = va_arg (var_args, gpointer);
+ guint sid = 0, detail = 0, mask = 0;
+
+ if (strncmp (signal_spec, "any_signal::", 12) == 0 ||
+ strncmp (signal_spec, "any-signal::", 12) == 0)
+ {
+ signal_spec += 12;
+ mask = G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA;
+ }
+ else if (strcmp (signal_spec, "any_signal") == 0 ||
+ strcmp (signal_spec, "any-signal") == 0)
+ {
+ signal_spec += 10;
+ mask = G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA;
+ }
+ else
+ {
+ g_warning ("%s: invalid signal spec \"%s\"", G_STRFUNC, signal_spec);
+ break;
+ }
+
+ if ((mask & G_SIGNAL_MATCH_ID) &&
+ !g_signal_parse_name (signal_spec, G_OBJECT_TYPE (object), &sid, &detail, FALSE))
+ g_warning ("%s: invalid signal name \"%s\"", G_STRFUNC, signal_spec);
+ else if (!g_signal_handlers_disconnect_matched (object, mask | (detail ? G_SIGNAL_MATCH_DETAIL : 0),
+ sid, detail,
+ NULL, (gpointer)callback, data))
+ g_warning ("%s: signal handler %p(%p) is not connected", G_STRFUNC, callback, data);
+ signal_spec = va_arg (var_args, gchar*);
+ }
+ va_end (var_args);
+}
+
+typedef struct {
+ GObject *object;
+ guint n_weak_refs;
+ struct {
+ GWeakNotify notify;
+ gpointer data;
+ } weak_refs[1]; /* flexible array */
+} WeakRefStack;
+
+static void
+weak_refs_notify (gpointer data)
+{
+ WeakRefStack *wstack = data;
+ guint i;
+
+ for (i = 0; i < wstack->n_weak_refs; i++)
+ wstack->weak_refs[i].notify (wstack->weak_refs[i].data, wstack->object);
+ g_free (wstack);
+}
+
+void
+g_object_weak_ref (GObject *object,
+ GWeakNotify notify,
+ gpointer data)
+{
+ WeakRefStack *wstack;
+ guint i;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (notify != NULL);
+ g_return_if_fail (object->ref_count >= 1);
+
+ wstack = g_datalist_id_remove_no_notify (&object->qdata, quark_weak_refs);
+ if (wstack)
+ {
+ i = wstack->n_weak_refs++;
+ wstack = g_realloc (wstack, sizeof (*wstack) + sizeof (wstack->weak_refs[0]) * i);
+ }
+ else
+ {
+ wstack = g_renew (WeakRefStack, NULL, 1);
+ wstack->object = object;
+ wstack->n_weak_refs = 1;
+ i = 0;
+ }
+ wstack->weak_refs[i].notify = notify;
+ wstack->weak_refs[i].data = data;
+ g_datalist_id_set_data_full (&object->qdata, quark_weak_refs, wstack, weak_refs_notify);
+}
+
+void
+g_object_weak_unref (GObject *object,
+ GWeakNotify notify,
+ gpointer data)
+{
+ WeakRefStack *wstack;
+ gboolean found_one = FALSE;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (notify != NULL);
+
+ wstack = g_datalist_id_get_data (&object->qdata, quark_weak_refs);
+ if (wstack)
+ {
+ guint i;
+
+ for (i = 0; i < wstack->n_weak_refs; i++)
+ if (wstack->weak_refs[i].notify == notify &&
+ wstack->weak_refs[i].data == data)
+ {
+ found_one = TRUE;
+ wstack->n_weak_refs -= 1;
+ if (i != wstack->n_weak_refs)
+ wstack->weak_refs[i] = wstack->weak_refs[wstack->n_weak_refs];
+
+ break;
+ }
+ }
+ if (!found_one)
+ g_warning ("%s: couldn't find weak ref %p(%p)", G_STRFUNC, notify, data);
+}
+
+void
+g_object_add_weak_pointer (GObject *object,
+ gpointer *weak_pointer_location)
+{
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (weak_pointer_location != NULL);
+
+ g_object_weak_ref (object,
+ (GWeakNotify) g_nullify_pointer,
+ weak_pointer_location);
+}
+
+void
+g_object_remove_weak_pointer (GObject *object,
+ gpointer *weak_pointer_location)
+{
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (weak_pointer_location != NULL);
+
+ g_object_weak_unref (object,
+ (GWeakNotify) g_nullify_pointer,
+ weak_pointer_location);
+}
+
+static guint
+object_floating_flag_handler (GObject *object,
+ gint job)
+{
+ switch (job)
+ {
+ gpointer oldvalue;
+ case +1: /* force floating if possible */
+ do
+ oldvalue = g_atomic_pointer_get (&object->qdata);
+ while (!g_atomic_pointer_compare_and_exchange ((void**) &object->qdata, oldvalue,
+ (gpointer) ((gsize) oldvalue | OBJECT_FLOATING_FLAG)));
+ return (gsize) oldvalue & OBJECT_FLOATING_FLAG;
+ case -1: /* sink if possible */
+ do
+ oldvalue = g_atomic_pointer_get (&object->qdata);
+ while (!g_atomic_pointer_compare_and_exchange ((void**) &object->qdata, oldvalue,
+ (gpointer) ((gsize) oldvalue & ~(gsize) OBJECT_FLOATING_FLAG)));
+ return (gsize) oldvalue & OBJECT_FLOATING_FLAG;
+ default: /* check floating */
+ return 0 != ((gsize) g_atomic_pointer_get (&object->qdata) & OBJECT_FLOATING_FLAG);
+ }
+}
+
+gboolean
+g_object_is_floating (gpointer _object)
+{
+ GObject *object = _object;
+ g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
+ return floating_flag_handler (object, 0);
+}
+
+gpointer
+g_object_ref_sink (gpointer _object)
+{
+ GObject *object = _object;
+ gboolean was_floating;
+ g_return_val_if_fail (G_IS_OBJECT (object), object);
+ g_return_val_if_fail (object->ref_count >= 1, object);
+ g_object_ref (object);
+ was_floating = floating_flag_handler (object, -1);
+ if (was_floating)
+ g_object_unref (object);
+ return object;
+}
+
+void
+g_object_force_floating (GObject *object)
+{
+ gboolean was_floating;
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (object->ref_count >= 1);
+
+ was_floating = floating_flag_handler (object, +1);
+}
+
+typedef struct {
+ GObject *object;
+ guint n_toggle_refs;
+ struct {
+ GToggleNotify notify;
+ gpointer data;
+ } toggle_refs[1]; /* flexible array */
+} ToggleRefStack;
+
+static void
+toggle_refs_notify (GObject *object,
+ gboolean is_last_ref)
+{
+ ToggleRefStack *tstack = g_datalist_id_get_data (&object->qdata, quark_toggle_refs);
+
+ /* Reentrancy here is not as tricky as it seems, because a toggle reference
+ * will only be notified when there is exactly one of them.
+ */
+ g_assert (tstack->n_toggle_refs == 1);
+ tstack->toggle_refs[0].notify (tstack->toggle_refs[0].data, tstack->object, is_last_ref);
+}
+
+void
+g_object_add_toggle_ref (GObject *object,
+ GToggleNotify notify,
+ gpointer data)
+{
+ ToggleRefStack *tstack;
+ guint i;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (notify != NULL);
+ g_return_if_fail (object->ref_count >= 1);
+
+ g_object_ref (object);
+
+ tstack = g_datalist_id_remove_no_notify (&object->qdata, quark_toggle_refs);
+ if (tstack)
+ {
+ i = tstack->n_toggle_refs++;
+ /* allocate i = tstate->n_toggle_refs - 1 positions beyond the 1 declared
+ * in tstate->toggle_refs */
+ tstack = g_realloc (tstack, sizeof (*tstack) + sizeof (tstack->toggle_refs[0]) * i);
+ }
+ else
+ {
+ tstack = g_renew (ToggleRefStack, NULL, 1);
+ tstack->object = object;
+ tstack->n_toggle_refs = 1;
+ i = 0;
+ }
+
+ /* Set a flag for fast lookup after adding the first toggle reference */
+ if (tstack->n_toggle_refs == 1)
+ g_datalist_set_flags (&object->qdata, OBJECT_HAS_TOGGLE_REF_FLAG);
+
+ tstack->toggle_refs[i].notify = notify;
+ tstack->toggle_refs[i].data = data;
+ g_datalist_id_set_data_full (&object->qdata, quark_toggle_refs, tstack,
+ (GDestroyNotify)g_free);
+}
+
+void
+g_object_remove_toggle_ref (GObject *object,
+ GToggleNotify notify,
+ gpointer data)
+{
+ ToggleRefStack *tstack;
+ gboolean found_one = FALSE;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (notify != NULL);
+
+ tstack = g_datalist_id_get_data (&object->qdata, quark_toggle_refs);
+ if (tstack)
+ {
+ guint i;
+
+ for (i = 0; i < tstack->n_toggle_refs; i++)
+ if (tstack->toggle_refs[i].notify == notify &&
+ tstack->toggle_refs[i].data == data)
+ {
+ found_one = TRUE;
+ tstack->n_toggle_refs -= 1;
+ if (i != tstack->n_toggle_refs)
+ tstack->toggle_refs[i] = tstack->toggle_refs[tstack->n_toggle_refs];
+
+ if (tstack->n_toggle_refs == 0)
+ g_datalist_unset_flags (&object->qdata, OBJECT_HAS_TOGGLE_REF_FLAG);
+
+ g_object_unref (object);
+
+ break;
+ }
+ }
+
+ if (!found_one)
+ g_warning ("%s: couldn't find toggle ref %p(%p)", G_STRFUNC, notify, data);
+}
+
+gpointer
+g_object_ref (gpointer _object)
+{
+ GObject *object = _object;
+ gint old_val;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+ g_return_val_if_fail (object->ref_count > 0, NULL);
+
+#ifdef G_ENABLE_DEBUG
+ if (g_trap_object_ref == object)
+ G_BREAKPOINT ();
+#endif /* G_ENABLE_DEBUG */
+
+
+ old_val = g_atomic_int_exchange_and_add (&object->ref_count, 1);
+
+ if (old_val == 1 && OBJECT_HAS_TOGGLE_REF (object))
+ toggle_refs_notify (object, FALSE);
+
+ return object;
+}
+
+void
+g_object_unref (gpointer _object)
+{
+ GObject *object = _object;
+ gint old_ref;
+ gboolean is_zero;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (object->ref_count > 0);
+
+#ifdef G_ENABLE_DEBUG
+ if (g_trap_object_ref == object)
+ G_BREAKPOINT ();
+#endif /* G_ENABLE_DEBUG */
+
+ /* here we want to atomically do: if (ref_count>1) { ref_count--; return; } */
+ retry_atomic_decrement1:
+ old_ref = g_atomic_int_get (&object->ref_count);
+ if (old_ref > 1)
+ {
+ if (!g_atomic_int_compare_and_exchange (&object->ref_count, old_ref, old_ref - 1))
+ goto retry_atomic_decrement1;
+
+ /* if we went from 2->1 we need to notify toggle refs if any */
+ if (old_ref == 2 && OBJECT_HAS_TOGGLE_REF (object))
+ toggle_refs_notify (object, TRUE);
+ }
+ else
+ {
+ /* we are about tp remove the last reference */
+ G_OBJECT_GET_CLASS (object)->dispose (object);
+
+ /* may have been re-referenced meanwhile */
+ retry_atomic_decrement2:
+ old_ref = g_atomic_int_get (&object->ref_count);
+ if (old_ref > 1)
+ {
+ if (!g_atomic_int_compare_and_exchange (&object->ref_count, old_ref, old_ref - 1))
+ goto retry_atomic_decrement2;
+
+ /* if we went from 2->1 we need to notify toggle refs if any */
+ if (old_ref == 2 && OBJECT_HAS_TOGGLE_REF (object))
+ toggle_refs_notify (object, TRUE);
+
+ return;
+ }
+
+ /* we are still in the process of taking away the last ref */
+ g_datalist_id_set_data (&object->qdata, quark_closure_array, NULL);
+ g_signal_handlers_destroy (object);
+ g_datalist_id_set_data (&object->qdata, quark_weak_refs, NULL);
+
+ /* decrement the last reference */
+ is_zero = g_atomic_int_dec_and_test (&object->ref_count);
+
+ /* may have been re-referenced meanwhile */
+ if (G_LIKELY (is_zero))
+ {
+ G_OBJECT_GET_CLASS (object)->finalize (object);
+#ifdef G_ENABLE_DEBUG
+ IF_DEBUG (OBJECTS)
+ {
+ /* catch objects not chaining finalize handlers */
+ G_LOCK (debug_objects);
+ g_assert (g_hash_table_lookup (debug_objects_ht, object) == NULL);
+ G_UNLOCK (debug_objects);
+ }
+#endif /* G_ENABLE_DEBUG */
+ g_type_free_instance ((GTypeInstance*) object);
+ }
+ }
+}
+
+gpointer
+g_object_get_qdata (GObject *object,
+ GQuark quark)
+{
+ g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+
+ return quark ? g_datalist_id_get_data (&object->qdata, quark) : NULL;
+}
+
+void
+g_object_set_qdata (GObject *object,
+ GQuark quark,
+ gpointer data)
+{
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (quark > 0);
+
+ g_datalist_id_set_data (&object->qdata, quark, data);
+}
+
+void
+g_object_set_qdata_full (GObject *object,
+ GQuark quark,
+ gpointer data,
+ GDestroyNotify destroy)
+{
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (quark > 0);
+
+ g_datalist_id_set_data_full (&object->qdata, quark, data,
+ data ? destroy : (GDestroyNotify) NULL);
+}
+
+gpointer
+g_object_steal_qdata (GObject *object,
+ GQuark quark)
+{
+ g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+ g_return_val_if_fail (quark > 0, NULL);
+
+ return g_datalist_id_remove_no_notify (&object->qdata, quark);
+}
+
+gpointer
+g_object_get_data (GObject *object,
+ const gchar *key)
+{
+ GQuark quark;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+ g_return_val_if_fail (key != NULL, NULL);
+
+ quark = g_quark_try_string (key);
+
+ return quark ? g_datalist_id_get_data (&object->qdata, quark) : NULL;
+}
+
+void
+g_object_set_data (GObject *object,
+ const gchar *key,
+ gpointer data)
+{
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (key != NULL);
+
+ g_datalist_id_set_data (&object->qdata, g_quark_from_string (key), data);
+}
+
+void
+g_object_set_data_full (GObject *object,
+ const gchar *key,
+ gpointer data,
+ GDestroyNotify destroy)
+{
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (key != NULL);
+
+ g_datalist_id_set_data_full (&object->qdata, g_quark_from_string (key), data,
+ data ? destroy : (GDestroyNotify) NULL);
+}
+
+gpointer
+g_object_steal_data (GObject *object,
+ const gchar *key)
+{
+ GQuark quark;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+ g_return_val_if_fail (key != NULL, NULL);
+
+ quark = g_quark_try_string (key);
+
+ return quark ? g_datalist_id_remove_no_notify (&object->qdata, quark) : NULL;
+}
+
+static void
+g_value_object_init (GValue *value)
+{
+ value->data[0].v_pointer = NULL;
+}
+
+static void
+g_value_object_free_value (GValue *value)
+{
+ if (value->data[0].v_pointer)
+ g_object_unref (value->data[0].v_pointer);
+}
+
+static void
+g_value_object_copy_value (const GValue *src_value,
+ GValue *dest_value)
+{
+ if (src_value->data[0].v_pointer)
+ dest_value->data[0].v_pointer = g_object_ref (src_value->data[0].v_pointer);
+ else
+ dest_value->data[0].v_pointer = NULL;
+}
+
+static void
+g_value_object_transform_value (const GValue *src_value,
+ GValue *dest_value)
+{
+ if (src_value->data[0].v_pointer && g_type_is_a (G_OBJECT_TYPE (src_value->data[0].v_pointer), G_VALUE_TYPE (dest_value)))
+ dest_value->data[0].v_pointer = g_object_ref (src_value->data[0].v_pointer);
+ else
+ dest_value->data[0].v_pointer = NULL;
+}
+
+static gpointer
+g_value_object_peek_pointer (const GValue *value)
+{
+ return value->data[0].v_pointer;
+}
+
+static gchar*
+g_value_object_collect_value (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ if (collect_values[0].v_pointer)
+ {
+ GObject *object = collect_values[0].v_pointer;
+
+ if (object->g_type_instance.g_class == NULL)
+ return g_strconcat ("invalid unclassed object pointer for value type `",
+ G_VALUE_TYPE_NAME (value),
+ "'",
+ NULL);
+ else if (!g_value_type_compatible (G_OBJECT_TYPE (object), G_VALUE_TYPE (value)))
+ return g_strconcat ("invalid object type `",
+ G_OBJECT_TYPE_NAME (object),
+ "' for value type `",
+ G_VALUE_TYPE_NAME (value),
+ "'",
+ NULL);
+ /* never honour G_VALUE_NOCOPY_CONTENTS for ref-counted types */
+ value->data[0].v_pointer = g_object_ref (object);
+ }
+ else
+ value->data[0].v_pointer = NULL;
+
+ return NULL;
+}
+
+static gchar*
+g_value_object_lcopy_value (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ GObject **object_p = collect_values[0].v_pointer;
+
+ if (!object_p)
+ return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+
+ if (!value->data[0].v_pointer)
+ *object_p = NULL;
+ else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
+ *object_p = value->data[0].v_pointer;
+ else
+ *object_p = g_object_ref (value->data[0].v_pointer);
+
+ return NULL;
+}
+
+void
+g_value_set_object (GValue *value,
+ gpointer v_object)
+{
+ GObject *old;
+
+ g_return_if_fail (G_VALUE_HOLDS_OBJECT (value));
+
+ old = value->data[0].v_pointer;
+
+ if (v_object)
+ {
+ g_return_if_fail (G_IS_OBJECT (v_object));
+ g_return_if_fail (g_value_type_compatible (G_OBJECT_TYPE (v_object), G_VALUE_TYPE (value)));
+
+ value->data[0].v_pointer = v_object;
+ g_object_ref (value->data[0].v_pointer);
+ }
+ else
+ value->data[0].v_pointer = NULL;
+
+ if (old)
+ g_object_unref (old);
+}
+
+void
+g_value_set_object_take_ownership (GValue *value,
+ gpointer v_object)
+{
+ g_value_take_object (value, v_object);
+}
+
+void
+g_value_take_object (GValue *value,
+ gpointer v_object)
+{
+ g_return_if_fail (G_VALUE_HOLDS_OBJECT (value));
+
+ if (value->data[0].v_pointer)
+ {
+ g_object_unref (value->data[0].v_pointer);
+ value->data[0].v_pointer = NULL;
+ }
+
+ if (v_object)
+ {
+ g_return_if_fail (G_IS_OBJECT (v_object));
+ g_return_if_fail (g_value_type_compatible (G_OBJECT_TYPE (v_object), G_VALUE_TYPE (value)));
+
+ value->data[0].v_pointer = v_object; /* we take over the reference count */
+ }
+}
+
+gpointer
+g_value_get_object (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_OBJECT (value), NULL);
+
+ return value->data[0].v_pointer;
+}
+
+gpointer
+g_value_dup_object (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_OBJECT (value), NULL);
+
+ return value->data[0].v_pointer ? g_object_ref (value->data[0].v_pointer) : NULL;
+}
+
+gulong
+g_signal_connect_object (gpointer instance,
+ const gchar *detailed_signal,
+ GCallback c_handler,
+ gpointer gobject,
+ GConnectFlags connect_flags)
+{
+ g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0);
+ g_return_val_if_fail (detailed_signal != NULL, 0);
+ g_return_val_if_fail (c_handler != NULL, 0);
+
+ if (gobject)
+ {
+ GClosure *closure;
+
+ g_return_val_if_fail (G_IS_OBJECT (gobject), 0);
+
+ closure = ((connect_flags & G_CONNECT_SWAPPED) ? g_cclosure_new_object_swap : g_cclosure_new_object) (c_handler, gobject);
+
+ return g_signal_connect_closure (instance, detailed_signal, closure, connect_flags & G_CONNECT_AFTER);
+ }
+ else
+ return g_signal_connect_data (instance, detailed_signal, c_handler, NULL, NULL, connect_flags);
+}
+
+typedef struct {
+ GObject *object;
+ guint n_closures;
+ GClosure *closures[1]; /* flexible array */
+} CArray;
+/* don't change this structure without supplying an accessor for
+ * watched closures, e.g.:
+ * GSList* g_object_list_watched_closures (GObject *object)
+ * {
+ * CArray *carray;
+ * g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+ * carray = g_object_get_data (object, "GObject-closure-array");
+ * if (carray)
+ * {
+ * GSList *slist = NULL;
+ * guint i;
+ * for (i = 0; i < carray->n_closures; i++)
+ * slist = g_slist_prepend (slist, carray->closures[i]);
+ * return slist;
+ * }
+ * return NULL;
+ * }
+ */
+
+static void
+object_remove_closure (gpointer data,
+ GClosure *closure)
+{
+ GObject *object = data;
+ CArray *carray = g_object_get_qdata (object, quark_closure_array);
+ guint i;
+
+ for (i = 0; i < carray->n_closures; i++)
+ if (carray->closures[i] == closure)
+ {
+ carray->n_closures--;
+ if (i < carray->n_closures)
+ carray->closures[i] = carray->closures[carray->n_closures];
+ return;
+ }
+ g_assert_not_reached ();
+}
+
+static void
+destroy_closure_array (gpointer data)
+{
+ CArray *carray = data;
+ GObject *object = carray->object;
+ guint i, n = carray->n_closures;
+
+ for (i = 0; i < n; i++)
+ {
+ GClosure *closure = carray->closures[i];
+
+ /* removing object_remove_closure() upfront is probably faster than
+ * letting it fiddle with quark_closure_array which is empty anyways
+ */
+ g_closure_remove_invalidate_notifier (closure, object, object_remove_closure);
+ g_closure_invalidate (closure);
+ }
+ g_free (carray);
+}
+
+void
+g_object_watch_closure (GObject *object,
+ GClosure *closure)
+{
+ CArray *carray;
+ guint i;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (closure != NULL);
+ g_return_if_fail (closure->is_invalid == FALSE);
+ g_return_if_fail (closure->in_marshal == FALSE);
+ g_return_if_fail (object->ref_count > 0); /* this doesn't work on finalizing objects */
+
+ g_closure_add_invalidate_notifier (closure, object, object_remove_closure);
+ g_closure_add_marshal_guards (closure,
+ object, (GClosureNotify) g_object_ref,
+ object, (GClosureNotify) g_object_unref);
+ carray = g_datalist_id_remove_no_notify (&object->qdata, quark_closure_array);
+ if (!carray)
+ {
+ carray = g_renew (CArray, NULL, 1);
+ carray->object = object;
+ carray->n_closures = 1;
+ i = 0;
+ }
+ else
+ {
+ i = carray->n_closures++;
+ carray = g_realloc (carray, sizeof (*carray) + sizeof (carray->closures[0]) * i);
+ }
+ carray->closures[i] = closure;
+ g_datalist_id_set_data_full (&object->qdata, quark_closure_array, carray, destroy_closure_array);
+}
+
+GClosure*
+g_closure_new_object (guint sizeof_closure,
+ GObject *object)
+{
+ GClosure *closure;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+ g_return_val_if_fail (object->ref_count > 0, NULL); /* this doesn't work on finalizing objects */
+
+ closure = g_closure_new_simple (sizeof_closure, object);
+ g_object_watch_closure (object, closure);
+
+ return closure;
+}
+
+GClosure*
+g_cclosure_new_object (GCallback callback_func,
+ GObject *object)
+{
+ GClosure *closure;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+ g_return_val_if_fail (object->ref_count > 0, NULL); /* this doesn't work on finalizing objects */
+ g_return_val_if_fail (callback_func != NULL, NULL);
+
+ closure = g_cclosure_new (callback_func, object, NULL);
+ g_object_watch_closure (object, closure);
+
+ return closure;
+}
+
+GClosure*
+g_cclosure_new_object_swap (GCallback callback_func,
+ GObject *object)
+{
+ GClosure *closure;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+ g_return_val_if_fail (object->ref_count > 0, NULL); /* this doesn't work on finalizing objects */
+ g_return_val_if_fail (callback_func != NULL, NULL);
+
+ closure = g_cclosure_new_swap (callback_func, object, NULL);
+ g_object_watch_closure (object, closure);
+
+ return closure;
+}
+
+gsize
+g_object_compat_control (gsize what,
+ gpointer data)
+{
+ switch (what)
+ {
+ gpointer *pp;
+ case 1: /* floating base type */
+ return G_TYPE_INITIALLY_UNOWNED;
+ case 2: /* FIXME: remove this once GLib/Gtk+ break ABI again */
+ floating_flag_handler = (guint(*)(GObject*,gint)) data;
+ return 1;
+ case 3: /* FIXME: remove this once GLib/Gtk+ break ABI again */
+ pp = data;
+ *pp = floating_flag_handler;
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+G_DEFINE_TYPE (GInitiallyUnowned, g_initially_unowned, G_TYPE_OBJECT);
+
+static void
+g_initially_unowned_init (GInitiallyUnowned *object)
+{
+ g_object_force_floating (object);
+}
+
+static void
+g_initially_unowned_class_init (GInitiallyUnownedClass *klass)
+{
+}
+
+#define __G_OBJECT_C__
+#include "gobjectaliasdef.c"
diff --git a/trunk/gobject/gobject.h b/trunk/gobject/gobject.h
new file mode 100644
index 000000000..4f7ef570a
--- /dev/null
+++ b/trunk/gobject/gobject.h
@@ -0,0 +1,286 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1998-1999, 2000-2001 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.
+ */
+#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
+#error "Only <glib-object.h> can be included directly."
+#endif
+
+#ifndef __G_OBJECT_H__
+#define __G_OBJECT_H__
+
+#include <gobject/gtype.h>
+#include <gobject/gvalue.h>
+#include <gobject/gparam.h>
+#include <gobject/gclosure.h>
+#include <gobject/gsignal.h>
+
+G_BEGIN_DECLS
+
+/* --- type macros --- */
+#define G_TYPE_IS_OBJECT(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_OBJECT)
+#define G_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
+#define G_OBJECT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
+#define G_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_OBJECT))
+#define G_IS_OBJECT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_OBJECT))
+#define G_OBJECT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_OBJECT, GObjectClass))
+#define G_OBJECT_TYPE(object) (G_TYPE_FROM_INSTANCE (object))
+#define G_OBJECT_TYPE_NAME(object) (g_type_name (G_OBJECT_TYPE (object)))
+#define G_OBJECT_CLASS_TYPE(class) (G_TYPE_FROM_CLASS (class))
+#define G_OBJECT_CLASS_NAME(class) (g_type_name (G_OBJECT_CLASS_TYPE (class)))
+#define G_VALUE_HOLDS_OBJECT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_OBJECT))
+
+/* --- type macros --- */
+#define G_TYPE_INITIALLY_UNOWNED (g_initially_unowned_get_type())
+#define G_INITIALLY_UNOWNED(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnowned))
+#define G_INITIALLY_UNOWNED_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnownedClass))
+#define G_IS_INITIALLY_UNOWNED(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_INITIALLY_UNOWNED))
+#define G_IS_INITIALLY_UNOWNED_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_INITIALLY_UNOWNED))
+#define G_INITIALLY_UNOWNED_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnownedClass))
+/* GInitiallyUnowned ia a GObject with initially floating reference count */
+
+
+/* --- typedefs & structures --- */
+typedef struct _GObject GObject;
+typedef struct _GObjectClass GObjectClass;
+typedef struct _GObject GInitiallyUnowned;
+typedef struct _GObjectClass GInitiallyUnownedClass;
+typedef struct _GObjectConstructParam GObjectConstructParam;
+typedef void (*GObjectGetPropertyFunc) (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec);
+typedef void (*GObjectSetPropertyFunc) (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec);
+typedef void (*GObjectFinalizeFunc) (GObject *object);
+typedef void (*GWeakNotify) (gpointer data,
+ GObject *where_the_object_was);
+struct _GObject
+{
+ GTypeInstance g_type_instance;
+
+ /*< private >*/
+ volatile guint ref_count;
+ GData *qdata;
+};
+struct _GObjectClass
+{
+ GTypeClass g_type_class;
+
+ /*< private >*/
+ GSList *construct_properties;
+
+ /*< public >*/
+ /* seldomly overidden */
+ GObject* (*constructor) (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties);
+ /* overridable methods */
+ void (*set_property) (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec);
+ void (*get_property) (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec);
+ void (*dispose) (GObject *object);
+ void (*finalize) (GObject *object);
+ /* seldomly overidden */
+ void (*dispatch_properties_changed) (GObject *object,
+ guint n_pspecs,
+ GParamSpec **pspecs);
+ /* signals */
+ void (*notify) (GObject *object,
+ GParamSpec *pspec);
+
+ /* called when done constructing */
+ void (*constructed) (GObject *object);
+
+ /*< private >*/
+ /* padding */
+ gpointer pdummy[7];
+};
+struct _GObjectConstructParam
+{
+ GParamSpec *pspec;
+ GValue *value;
+};
+
+
+/* --- prototypes --- */
+GType g_initially_unowned_get_type (void);
+void g_object_class_install_property (GObjectClass *oclass,
+ guint property_id,
+ GParamSpec *pspec);
+GParamSpec* g_object_class_find_property (GObjectClass *oclass,
+ const gchar *property_name);
+GParamSpec**g_object_class_list_properties (GObjectClass *oclass,
+ guint *n_properties);
+void g_object_class_override_property (GObjectClass *oclass,
+ guint property_id,
+ const gchar *name);
+
+void g_object_interface_install_property (gpointer g_iface,
+ GParamSpec *pspec);
+GParamSpec* g_object_interface_find_property (gpointer g_iface,
+ const gchar *property_name);
+GParamSpec**g_object_interface_list_properties (gpointer g_iface,
+ guint *n_properties_p);
+
+gpointer g_object_new (GType object_type,
+ const gchar *first_property_name,
+ ...);
+gpointer g_object_newv (GType object_type,
+ guint n_parameters,
+ GParameter *parameters);
+GObject* g_object_new_valist (GType object_type,
+ const gchar *first_property_name,
+ va_list var_args);
+void g_object_set (gpointer object,
+ const gchar *first_property_name,
+ ...) G_GNUC_NULL_TERMINATED;
+void g_object_get (gpointer object,
+ const gchar *first_property_name,
+ ...) G_GNUC_NULL_TERMINATED;
+gpointer g_object_connect (gpointer object,
+ const gchar *signal_spec,
+ ...) G_GNUC_NULL_TERMINATED;
+void g_object_disconnect (gpointer object,
+ const gchar *signal_spec,
+ ...) G_GNUC_NULL_TERMINATED;
+void g_object_set_valist (GObject *object,
+ const gchar *first_property_name,
+ va_list var_args);
+void g_object_get_valist (GObject *object,
+ const gchar *first_property_name,
+ va_list var_args);
+void g_object_set_property (GObject *object,
+ const gchar *property_name,
+ const GValue *value);
+void g_object_get_property (GObject *object,
+ const gchar *property_name,
+ GValue *value);
+void g_object_freeze_notify (GObject *object);
+void g_object_notify (GObject *object,
+ const gchar *property_name);
+void g_object_thaw_notify (GObject *object);
+gboolean g_object_is_floating (gpointer object);
+gpointer g_object_ref_sink (gpointer object);
+gpointer g_object_ref (gpointer object);
+void g_object_unref (gpointer object);
+void g_object_weak_ref (GObject *object,
+ GWeakNotify notify,
+ gpointer data);
+void g_object_weak_unref (GObject *object,
+ GWeakNotify notify,
+ gpointer data);
+void g_object_add_weak_pointer (GObject *object,
+ gpointer *weak_pointer_location);
+void g_object_remove_weak_pointer (GObject *object,
+ gpointer *weak_pointer_location);
+
+typedef void (*GToggleNotify) (gpointer data,
+ GObject *object,
+ gboolean is_last_ref);
+
+void g_object_add_toggle_ref (GObject *object,
+ GToggleNotify notify,
+ gpointer data);
+void g_object_remove_toggle_ref (GObject *object,
+ GToggleNotify notify,
+ gpointer data);
+
+gpointer g_object_get_qdata (GObject *object,
+ GQuark quark);
+void g_object_set_qdata (GObject *object,
+ GQuark quark,
+ gpointer data);
+void g_object_set_qdata_full (GObject *object,
+ GQuark quark,
+ gpointer data,
+ GDestroyNotify destroy);
+gpointer g_object_steal_qdata (GObject *object,
+ GQuark quark);
+gpointer g_object_get_data (GObject *object,
+ const gchar *key);
+void g_object_set_data (GObject *object,
+ const gchar *key,
+ gpointer data);
+void g_object_set_data_full (GObject *object,
+ const gchar *key,
+ gpointer data,
+ GDestroyNotify destroy);
+gpointer g_object_steal_data (GObject *object,
+ const gchar *key);
+void g_object_watch_closure (GObject *object,
+ GClosure *closure);
+GClosure* g_cclosure_new_object (GCallback callback_func,
+ GObject *object);
+GClosure* g_cclosure_new_object_swap (GCallback callback_func,
+ GObject *object);
+GClosure* g_closure_new_object (guint sizeof_closure,
+ GObject *object);
+void g_value_set_object (GValue *value,
+ gpointer v_object);
+gpointer g_value_get_object (const GValue *value);
+gpointer g_value_dup_object (const GValue *value);
+gulong g_signal_connect_object (gpointer instance,
+ const gchar *detailed_signal,
+ GCallback c_handler,
+ gpointer gobject,
+ GConnectFlags connect_flags);
+
+/*< protected >*/
+void g_object_force_floating (GObject *object);
+void g_object_run_dispose (GObject *object);
+
+
+void g_value_take_object (GValue *value,
+ gpointer v_object);
+#ifndef G_DISABLE_DEPRECATED
+void g_value_set_object_take_ownership (GValue *value,
+ gpointer v_object);
+#endif
+
+#if !defined(G_DISABLE_DEPRECATED) || defined(GTK_COMPILATION)
+gsize g_object_compat_control (gsize what,
+ gpointer data);
+#endif
+
+/* --- implementation macros --- */
+#define G_OBJECT_WARN_INVALID_PSPEC(object, pname, property_id, pspec) \
+G_STMT_START { \
+ GObject *_object = (GObject*) (object); \
+ GParamSpec *_pspec = (GParamSpec*) (pspec); \
+ guint _property_id = (property_id); \
+ g_warning ("%s: invalid %s id %u for \"%s\" of type `%s' in `%s'", \
+ G_STRLOC, \
+ (pname), \
+ _property_id, \
+ _pspec->name, \
+ g_type_name (G_PARAM_SPEC_TYPE (_pspec)), \
+ G_OBJECT_TYPE_NAME (_object)); \
+} G_STMT_END
+#define G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec) \
+ G_OBJECT_WARN_INVALID_PSPEC ((object), "property", (property_id), (pspec))
+
+G_END_DECLS
+
+#endif /* __G_OBJECT_H__ */
diff --git a/trunk/gobject/gobject.rc.in b/trunk/gobject/gobject.rc.in
new file mode 100644
index 000000000..0c819b817
--- /dev/null
+++ b/trunk/gobject/gobject.rc.in
@@ -0,0 +1,30 @@
+#include <winver.h>
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0
+ PRODUCTVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0
+ FILEFLAGSMASK 0
+ FILEFLAGS 0
+ FILEOS VOS__WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE VFT2_UNKNOWN
+ BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "CompanyName", "The GLib developer community"
+ VALUE "FileDescription", "GObject"
+ VALUE "FileVersion", "@GLIB_VERSION@.0"
+ VALUE "InternalName", "libgobject-2.0-@LT_CURRENT_MINUS_AGE@"
+ VALUE "LegalCopyright", "Copyright 1998-2004 Tim Janik and Red Hat, Inc."
+ VALUE "OriginalFilename", "libgobject-2.0-@LT_CURRENT_MINUS_AGE@.dll"
+ VALUE "ProductName", "GLib"
+ VALUE "ProductVersion", "@GLIB_VERSION@"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+ END
diff --git a/trunk/gobject/gobject.symbols b/trunk/gobject/gobject.symbols
new file mode 100644
index 000000000..d723459f3
--- /dev/null
+++ b/trunk/gobject/gobject.symbols
@@ -0,0 +1,436 @@
+/* This file lists all exported symbols. It is used to generate
+ * the gobject.def file used to control exports on Windows and the
+ * gobjectalias.h/gobjectaliasdef.c files used to avoid PLT entries for
+ * internal uses of exported functions (see makegobjectalias.pl).
+ *
+ * Every symbol must be included in the right
+ * #ifdef IN_HEADER(sym) #endif and
+ * #ifdef IN_FILE(sym) #endif sections.
+ */
+#ifdef ALL_FILES
+#define IN_FILE(x) 1
+#define IN_HEADER(x) 1
+#endif
+#if IN_HEADER(__G_BOXED_H__)
+#if IN_FILE(__G_BOXED_C__)
+g_boxed_copy
+g_boxed_free
+g_boxed_type_register_static
+g_date_get_type G_GNUC_CONST
+g_gstring_get_type G_GNUC_CONST
+g_strv_get_type G_GNUC_CONST
+g_hash_table_get_type G_GNUC_CONST
+g_closure_get_type G_GNUC_CONST
+g_value_get_type G_GNUC_CONST
+g_value_array_get_type G_GNUC_CONST
+g_value_set_boxed
+g_value_take_boxed
+g_value_dup_boxed
+g_value_get_boxed
+g_value_set_static_boxed
+#ifndef G_DISABLE_DEPRECATED
+g_value_set_boxed_take_ownership
+#endif
+#endif
+#endif
+
+#if IN_HEADER(__G_MARSHAL_H__)
+#if IN_FILE(__G_SIGNAL_C__)
+g_cclosure_marshal_BOOLEAN__FLAGS
+g_cclosure_marshal_STRING__OBJECT_POINTER
+g_cclosure_marshal_VOID__BOOLEAN
+g_cclosure_marshal_VOID__BOXED
+g_cclosure_marshal_VOID__CHAR
+g_cclosure_marshal_VOID__DOUBLE
+g_cclosure_marshal_VOID__ENUM
+g_cclosure_marshal_VOID__FLAGS
+g_cclosure_marshal_VOID__FLOAT
+g_cclosure_marshal_VOID__INT
+g_cclosure_marshal_VOID__LONG
+g_cclosure_marshal_VOID__OBJECT
+g_cclosure_marshal_VOID__PARAM
+g_cclosure_marshal_VOID__POINTER
+g_cclosure_marshal_VOID__STRING
+g_cclosure_marshal_VOID__UCHAR
+g_cclosure_marshal_VOID__UINT
+g_cclosure_marshal_VOID__UINT_POINTER
+g_cclosure_marshal_VOID__ULONG
+g_cclosure_marshal_VOID__VOID
+#endif
+#endif
+
+#if IN_HEADER(__G_CLOSURE_H__)
+#if IN_FILE(__G_CLOSURE_C__)
+g_cclosure_new
+g_cclosure_new_swap
+g_closure_add_finalize_notifier
+g_closure_add_invalidate_notifier
+g_closure_add_marshal_guards
+g_closure_invalidate
+g_closure_invoke
+g_closure_new_simple
+g_closure_ref
+g_closure_remove_finalize_notifier
+g_closure_remove_invalidate_notifier
+g_closure_set_marshal
+g_closure_set_meta_marshal
+g_closure_sink
+g_closure_unref
+g_signal_type_cclosure_new
+#endif
+#endif
+
+#if IN_HEADER(__G_ENUMS_H__)
+#if IN_FILE(__G_ENUMS_C__)
+g_enum_complete_type_info
+g_enum_get_value
+g_enum_get_value_by_name
+g_enum_get_value_by_nick
+g_enum_register_static
+g_flags_complete_type_info
+g_flags_get_first_value
+g_flags_get_value_by_name
+g_flags_get_value_by_nick
+g_flags_register_static
+g_value_set_enum
+g_value_set_flags
+g_value_get_enum
+g_value_get_flags
+#endif
+#endif
+
+#if IN_HEADER(__G_SOURCECLOSURE_H__)
+#if IN_FILE(__G_SOURCECLOSURE_C__)
+g_io_channel_get_type
+g_io_condition_get_type
+g_source_set_closure
+#endif
+#endif
+
+#if IN_HEADER(__G_OBJECT_H__)
+#if IN_FILE(__G_OBJECT_C__)
+g_cclosure_new_object
+g_cclosure_new_object_swap
+g_closure_new_object
+g_initially_unowned_get_type
+g_object_add_weak_pointer
+g_object_class_find_property
+g_object_class_install_property
+g_object_class_list_properties
+g_object_class_override_property
+g_object_connect G_GNUC_NULL_TERMINATED
+g_object_disconnect G_GNUC_NULL_TERMINATED
+g_object_freeze_notify
+g_object_get G_GNUC_NULL_TERMINATED
+g_object_get_data
+g_object_get_property
+g_object_get_qdata
+g_object_get_valist
+g_object_interface_find_property
+g_object_interface_install_property
+g_object_interface_list_properties
+g_object_new
+g_object_newv
+g_object_new_valist
+g_object_notify
+g_object_is_floating
+g_object_ref_sink
+g_object_force_floating
+g_object_ref
+g_object_unref
+g_object_remove_weak_pointer
+g_object_run_dispose
+g_object_set G_GNUC_NULL_TERMINATED
+g_object_set_data
+g_object_set_data_full
+g_object_set_property
+g_object_set_qdata
+g_object_set_qdata_full
+g_object_set_valist
+g_object_steal_data
+g_object_steal_qdata
+g_object_thaw_notify
+g_object_watch_closure
+g_object_weak_ref
+g_object_weak_unref
+g_object_add_toggle_ref
+g_object_remove_toggle_ref
+g_value_get_object
+g_value_set_object
+g_value_dup_object
+g_value_take_object
+#ifndef G_DISABLE_DEPRECATED
+g_value_set_object_take_ownership
+g_object_compat_control
+#endif
+g_signal_connect_object
+#endif
+#endif
+
+#if IN_HEADER(__G_PARAMSPECS_H__)
+#if IN_FILE(__G_PARAMSPECS_C__)
+g_param_spec_boolean
+g_param_spec_boxed
+g_param_spec_char
+g_param_spec_double
+g_param_spec_enum
+g_param_spec_flags
+g_param_spec_float
+g_param_spec_int
+g_param_spec_int64
+g_param_spec_long
+g_param_spec_object
+g_param_spec_override
+g_param_spec_gtype
+g_param_spec_param
+g_param_spec_pointer
+g_param_spec_string
+g_param_spec_uchar
+g_param_spec_uint
+g_param_spec_uint64
+g_param_spec_ulong
+g_param_spec_unichar
+g_param_spec_value_array
+#endif
+#endif
+
+#if IN_HEADER(__G_PARAM_H__)
+#if IN_FILE(__G_PARAM_C__)
+g_param_spec_get_blurb
+g_param_spec_get_name
+g_param_spec_get_nick
+g_param_spec_get_redirect_target
+g_param_spec_internal
+g_param_type_register_static
+g_param_spec_ref
+g_param_spec_ref_sink
+g_param_spec_unref
+g_param_spec_sink
+g_param_spec_steal_qdata
+g_param_spec_set_qdata
+g_param_spec_set_qdata_full
+g_param_spec_get_qdata
+g_param_value_convert
+g_param_value_defaults
+g_param_values_cmp
+g_param_value_set_default
+g_param_value_validate
+g_param_spec_pool_insert
+g_param_spec_pool_list
+g_param_spec_pool_list_owned
+g_param_spec_pool_lookup
+g_param_spec_pool_new
+g_param_spec_pool_remove
+g_value_get_param
+g_value_set_param
+g_value_dup_param
+g_value_take_param
+#ifndef G_DISABLE_DEPRECATED
+g_value_set_param_take_ownership
+#endif
+#endif
+#endif
+
+#if IN_HEADER(__G_VALUETYPES_H__)
+#if IN_FILE(__G_VALUETYPES_C__)
+g_pointer_type_register_static
+g_strdup_value_contents
+g_value_set_boolean
+g_value_set_char
+g_value_set_double
+g_value_set_float
+g_value_set_int
+g_value_set_int64
+g_value_set_long
+g_value_set_pointer
+g_value_set_static_string
+g_value_set_string
+#ifndef G_DISABLE_DEPRECATED
+g_value_set_string_take_ownership
+#endif
+g_value_set_uchar
+g_value_set_uint
+g_value_set_uint64
+g_value_set_ulong
+g_value_dup_string
+g_value_get_boolean
+g_value_get_char
+g_value_get_double
+g_value_get_float
+g_value_get_int
+g_value_get_int64
+g_value_get_long
+g_value_get_pointer
+g_value_get_string
+g_value_get_uchar
+g_value_get_uint
+g_value_get_uint64
+g_value_get_ulong
+g_value_take_string
+g_gtype_get_type
+g_value_set_gtype
+g_value_get_gtype
+#endif
+#endif
+
+#if IN_HEADER(__G_SIGNAL_H__)
+#if IN_FILE(__G_SIGNAL_C__)
+g_signal_accumulator_true_handled
+g_signal_add_emission_hook
+g_signal_chain_from_overridden
+g_signal_connect_closure
+g_signal_connect_closure_by_id
+g_signal_connect_data
+g_signal_emit
+g_signal_emit_by_name
+g_signal_emitv
+g_signal_emit_valist
+g_signal_get_invocation_hint
+g_signal_handler_block
+g_signal_handler_disconnect
+g_signal_handler_find
+g_signal_handler_is_connected
+g_signal_handlers_block_matched
+g_signal_handlers_destroy
+g_signal_handlers_disconnect_matched
+g_signal_handlers_unblock_matched
+g_signal_handler_unblock
+g_signal_has_handler_pending
+g_signal_list_ids
+g_signal_lookup
+g_signal_name
+g_signal_new
+g_signal_newv
+g_signal_new_valist
+g_signal_override_class_closure
+g_signal_parse_name
+g_signal_query
+g_signal_remove_emission_hook
+g_signal_stop_emission
+g_signal_stop_emission_by_name
+#endif
+#endif
+
+#if IN_HEADER(__G_TYPE_H__)
+#if IN_FILE(__G_TYPE_C__)
+g_type_add_class_cache_func
+g_type_add_interface_check
+g_type_add_interface_dynamic
+g_type_add_interface_static
+g_type_check_class_cast
+g_type_check_class_is_a
+g_type_check_instance
+g_type_check_instance_cast
+g_type_check_instance_is_a
+g_type_check_is_value_type
+g_type_check_value
+g_type_check_value_holds
+g_type_children
+g_type_class_add_private
+g_type_class_peek
+g_type_class_peek_parent
+g_type_class_peek_static
+g_type_class_ref
+g_type_class_unref
+g_type_class_unref_uncached
+g_type_create_instance
+g_type_default_interface_peek
+g_type_default_interface_ref
+g_type_default_interface_unref
+g_type_depth
+g_type_free_instance
+g_type_from_name
+g_type_fundamental
+g_type_fundamental_next
+g_type_get_plugin
+g_type_get_qdata
+g_type_init
+g_type_init_with_debug_flags
+g_type_instance_get_private
+g_type_interface_add_prerequisite
+g_type_interface_get_plugin
+g_type_interface_peek
+g_type_interface_peek_parent
+g_type_interface_prerequisites
+g_type_interfaces
+g_type_is_a
+g_type_name
+g_type_name_from_class
+g_type_name_from_instance
+g_type_next_base
+g_type_parent
+g_type_qname
+g_type_query
+g_type_register_dynamic
+g_type_register_fundamental
+g_type_register_static
+g_type_register_static_simple
+g_type_remove_class_cache_func
+g_type_remove_interface_check
+g_type_set_qdata
+g_type_test_flags
+g_type_value_table_peek
+#endif
+#endif
+
+#if IN_HEADER(__G_TYPE_MODULE_H__)
+#if IN_FILE(__G_TYPE_MODULE_C__)
+g_type_module_add_interface
+g_type_module_get_type G_GNUC_CONST
+g_type_module_register_enum
+g_type_module_register_flags
+g_type_module_register_type
+g_type_module_set_name
+g_type_module_unuse
+g_type_module_use
+#endif
+#endif
+
+#if IN_HEADER(__G_VALUE_ARRAY_H__)
+#if IN_FILE(__G_VALUE_ARRAY_C__)
+g_value_array_append
+g_value_array_copy
+g_value_array_free
+g_value_array_get_nth
+g_value_array_insert
+g_value_array_new
+g_value_array_prepend
+g_value_array_remove
+g_value_array_sort
+g_value_array_sort_with_data
+#endif
+#endif
+
+#if IN_HEADER(__G_TYPE_PLUGIN_H__)
+#if IN_FILE(__G_TYPE_PLUGIN_C__)
+g_type_plugin_complete_interface_info
+g_type_plugin_complete_type_info
+g_type_plugin_get_type G_GNUC_CONST
+g_type_plugin_unuse
+g_type_plugin_use
+#endif
+#endif
+
+#if IN_HEADER(__G_VALUE_H__)
+#if IN_FILE(__G_VALUE_C__)
+g_value_copy
+g_value_fits_pointer
+g_value_init
+g_value_peek_pointer
+g_value_register_transform_func
+g_value_reset
+g_value_transform
+g_value_type_compatible
+g_value_type_transformable
+g_value_unset
+g_value_set_instance
+#endif
+#endif
+
+#ifdef INCLUDE_VARIABLES
+g_param_spec_types
+#endif
+#ifdef INCLUDE_INTERNAL_SYMBOLS
+g_slist_remove_all PRIVATE
+g_unichar_validate PRIVATE
+#endif
diff --git a/trunk/gobject/gobjectnotifyqueue.c b/trunk/gobject/gobjectnotifyqueue.c
new file mode 100644
index 000000000..60c1c2807
--- /dev/null
+++ b/trunk/gobject/gobjectnotifyqueue.c
@@ -0,0 +1,169 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1998-1999, 2000-2001 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 __G_OBJECT_NOTIFY_QUEUE_H__
+#define __G_OBJECT_NOTIFY_QUEUE_H__
+
+#include <string.h> /* memset */
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+
+/* --- typedefs --- */
+typedef struct _GObjectNotifyContext GObjectNotifyContext;
+typedef struct _GObjectNotifyQueue GObjectNotifyQueue;
+typedef void (*GObjectNotifyQueueDispatcher) (GObject *object,
+ guint n_pspecs,
+ GParamSpec **pspecs);
+
+
+/* --- structures --- */
+struct _GObjectNotifyContext
+{
+ GQuark quark_notify_queue;
+ GObjectNotifyQueueDispatcher dispatcher;
+ GTrashStack *_nqueue_trash; /* unused */
+};
+struct _GObjectNotifyQueue
+{
+ GObjectNotifyContext *context;
+ GSList *pspecs;
+ guint16 n_pspecs;
+ guint16 freeze_count;
+ /* currently, this structure abuses the GList allocation chain and thus
+ * must be <= sizeof (GList)
+ */
+};
+
+
+/* --- functions --- */
+static void
+g_object_notify_queue_free (gpointer data)
+{
+ GObjectNotifyQueue *nqueue = data;
+
+ g_slist_free (nqueue->pspecs);
+ g_list_free_1 ((void*) nqueue);
+}
+
+static inline GObjectNotifyQueue*
+g_object_notify_queue_freeze (GObject *object,
+ GObjectNotifyContext *context)
+{
+ GObjectNotifyQueue *nqueue;
+
+ nqueue = g_datalist_id_get_data (&object->qdata, context->quark_notify_queue);
+ if (!nqueue)
+ {
+ nqueue = (void*) g_list_alloc ();
+ memset (nqueue, 0, sizeof (*nqueue));
+ nqueue->context = context;
+ g_datalist_id_set_data_full (&object->qdata, context->quark_notify_queue,
+ nqueue, g_object_notify_queue_free);
+ }
+
+ g_return_val_if_fail (nqueue->freeze_count < 65535, nqueue);
+ nqueue->freeze_count++;
+
+ return nqueue;
+}
+
+static inline void
+g_object_notify_queue_thaw (GObject *object,
+ GObjectNotifyQueue *nqueue)
+{
+ GObjectNotifyContext *context = nqueue->context;
+ GParamSpec *pspecs_mem[16], **pspecs, **free_me = NULL;
+ GSList *slist;
+ guint n_pspecs = 0;
+
+ g_return_if_fail (nqueue->freeze_count > 0);
+
+ nqueue->freeze_count--;
+ if (nqueue->freeze_count)
+ return;
+ g_return_if_fail (object->ref_count > 0);
+
+ pspecs = nqueue->n_pspecs > 16 ? free_me = g_new (GParamSpec*, nqueue->n_pspecs) : pspecs_mem;
+ /* set first entry to NULL since it's checked unconditionally */
+ pspecs[0] = NULL;
+ for (slist = nqueue->pspecs; slist; slist = slist->next)
+ {
+ GParamSpec *pspec = slist->data;
+ guint i = 0;
+
+ /* dedup, make pspecs in the list unique */
+ redo_dedup_check:
+ if (pspecs[i] == pspec)
+ continue;
+ if (++i < n_pspecs)
+ goto redo_dedup_check;
+
+ pspecs[n_pspecs++] = pspec;
+ }
+ g_datalist_id_set_data (&object->qdata, context->quark_notify_queue, NULL);
+
+ if (n_pspecs)
+ context->dispatcher (object, n_pspecs, pspecs);
+ g_free (free_me);
+}
+
+static inline void
+g_object_notify_queue_clear (GObject *object,
+ GObjectNotifyQueue *nqueue)
+{
+ g_return_if_fail (nqueue->freeze_count > 0);
+
+ g_slist_free (nqueue->pspecs);
+ nqueue->pspecs = NULL;
+ nqueue->n_pspecs = 0;
+}
+
+static inline void
+g_object_notify_queue_add (GObject *object,
+ GObjectNotifyQueue *nqueue,
+ GParamSpec *pspec)
+{
+ if (pspec->flags & G_PARAM_READABLE)
+ {
+ GParamSpec *redirect;
+
+ g_return_if_fail (nqueue->n_pspecs < 65535);
+
+ redirect = g_param_spec_get_redirect_target (pspec);
+ if (redirect)
+ pspec = redirect;
+
+ /* we do the deduping in _thaw */
+ nqueue->pspecs = g_slist_prepend (nqueue->pspecs, pspec);
+ nqueue->n_pspecs++;
+ }
+}
+
+static inline GObjectNotifyQueue*
+g_object_notify_queue_from_object (GObject *object,
+ GObjectNotifyContext *context)
+{
+ return g_datalist_id_get_data (&object->qdata, context->quark_notify_queue);
+}
+
+
+G_END_DECLS
+
+#endif /* __G_OBJECT_NOTIFY_QUEUE_H__ */
diff --git a/trunk/gobject/gparam.c b/trunk/gobject/gparam.c
new file mode 100644
index 000000000..5642aec9f
--- /dev/null
+++ b/trunk/gobject/gparam.c
@@ -0,0 +1,1133 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1997-1999, 2000-2001 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.
+ */
+
+/*
+ * MT safe
+ */
+
+#include "gparam.h"
+#include "gparamspecs.h"
+
+#include "gvaluecollector.h"
+#include "gobjectalias.h"
+#include <string.h>
+
+
+
+/* --- defines --- */
+#define PARAM_FLOATING_FLAG 0x2
+#define G_PARAM_USER_MASK (~0 << G_PARAM_USER_SHIFT)
+#define PSPEC_APPLIES_TO_VALUE(pspec, value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_PARAM_SPEC_VALUE_TYPE (pspec)))
+#define G_SLOCK(mutex) g_static_mutex_lock (mutex)
+#define G_SUNLOCK(mutex) g_static_mutex_unlock (mutex)
+
+
+/* --- prototypes --- */
+static void g_param_spec_class_base_init (GParamSpecClass *class);
+static void g_param_spec_class_base_finalize (GParamSpecClass *class);
+static void g_param_spec_class_init (GParamSpecClass *class,
+ gpointer class_data);
+static void g_param_spec_init (GParamSpec *pspec,
+ GParamSpecClass *class);
+static void g_param_spec_finalize (GParamSpec *pspec);
+static void value_param_init (GValue *value);
+static void value_param_free_value (GValue *value);
+static void value_param_copy_value (const GValue *src_value,
+ GValue *dest_value);
+static void value_param_transform_value (const GValue *src_value,
+ GValue *dest_value);
+static gpointer value_param_peek_pointer (const GValue *value);
+static gchar* value_param_collect_value (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags);
+static gchar* value_param_lcopy_value (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags);
+
+
+/* --- functions --- */
+void
+g_param_type_init (void)
+{
+ static const GTypeFundamentalInfo finfo = {
+ (G_TYPE_FLAG_CLASSED |
+ G_TYPE_FLAG_INSTANTIATABLE |
+ G_TYPE_FLAG_DERIVABLE |
+ G_TYPE_FLAG_DEEP_DERIVABLE),
+ };
+ static const GTypeValueTable param_value_table = {
+ value_param_init, /* value_init */
+ value_param_free_value, /* value_free */
+ value_param_copy_value, /* value_copy */
+ value_param_peek_pointer, /* value_peek_pointer */
+ "p", /* collect_format */
+ value_param_collect_value, /* collect_value */
+ "p", /* lcopy_format */
+ value_param_lcopy_value, /* lcopy_value */
+ };
+ static const GTypeInfo param_spec_info = {
+ sizeof (GParamSpecClass),
+
+ (GBaseInitFunc) g_param_spec_class_base_init,
+ (GBaseFinalizeFunc) g_param_spec_class_base_finalize,
+ (GClassInitFunc) g_param_spec_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL, /* class_data */
+
+ sizeof (GParamSpec),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) g_param_spec_init,
+
+ &param_value_table,
+ };
+ GType type;
+
+ type = g_type_register_fundamental (G_TYPE_PARAM, g_intern_static_string ("GParam"), &param_spec_info, &finfo, G_TYPE_FLAG_ABSTRACT);
+ g_assert (type == G_TYPE_PARAM);
+ g_value_register_transform_func (G_TYPE_PARAM, G_TYPE_PARAM, value_param_transform_value);
+}
+
+static void
+g_param_spec_class_base_init (GParamSpecClass *class)
+{
+}
+
+static void
+g_param_spec_class_base_finalize (GParamSpecClass *class)
+{
+}
+
+static void
+g_param_spec_class_init (GParamSpecClass *class,
+ gpointer class_data)
+{
+ class->value_type = G_TYPE_NONE;
+ class->finalize = g_param_spec_finalize;
+ class->value_set_default = NULL;
+ class->value_validate = NULL;
+ class->values_cmp = NULL;
+}
+
+static void
+g_param_spec_init (GParamSpec *pspec,
+ GParamSpecClass *class)
+{
+ pspec->name = NULL;
+ pspec->_nick = NULL;
+ pspec->_blurb = NULL;
+ pspec->flags = 0;
+ pspec->value_type = class->value_type;
+ pspec->owner_type = 0;
+ pspec->qdata = NULL;
+ g_datalist_init (&pspec->qdata);
+ g_datalist_set_flags (&pspec->qdata, PARAM_FLOATING_FLAG);
+ pspec->ref_count = 1;
+ pspec->param_id = 0;
+}
+
+static void
+g_param_spec_finalize (GParamSpec *pspec)
+{
+ g_datalist_clear (&pspec->qdata);
+
+ if (!(pspec->flags & G_PARAM_STATIC_NAME))
+ g_free (pspec->name);
+
+ if (!(pspec->flags & G_PARAM_STATIC_NICK))
+ g_free (pspec->_nick);
+
+ if (!(pspec->flags & G_PARAM_STATIC_BLURB))
+ g_free (pspec->_blurb);
+
+ g_type_free_instance ((GTypeInstance*) pspec);
+}
+
+GParamSpec*
+g_param_spec_ref (GParamSpec *pspec)
+{
+ g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL);
+ g_return_val_if_fail (pspec->ref_count > 0, NULL);
+
+ g_atomic_int_inc (&pspec->ref_count);
+
+ return pspec;
+}
+
+void
+g_param_spec_unref (GParamSpec *pspec)
+{
+ gboolean is_zero;
+
+ g_return_if_fail (G_IS_PARAM_SPEC (pspec));
+ g_return_if_fail (pspec->ref_count > 0);
+
+ is_zero = g_atomic_int_dec_and_test (&pspec->ref_count);
+
+ if (G_UNLIKELY (is_zero))
+ {
+ G_PARAM_SPEC_GET_CLASS (pspec)->finalize (pspec);
+ }
+}
+
+void
+g_param_spec_sink (GParamSpec *pspec)
+{
+ gpointer oldvalue;
+ g_return_if_fail (G_IS_PARAM_SPEC (pspec));
+ g_return_if_fail (pspec->ref_count > 0);
+
+ do
+ oldvalue = g_atomic_pointer_get (&pspec->qdata);
+ while (!g_atomic_pointer_compare_and_exchange ((void**) &pspec->qdata, oldvalue,
+ (gpointer) ((gsize) oldvalue & ~(gsize) PARAM_FLOATING_FLAG)));
+ if ((gsize) oldvalue & PARAM_FLOATING_FLAG)
+ g_param_spec_unref (pspec);
+}
+
+GParamSpec*
+g_param_spec_ref_sink (GParamSpec *pspec)
+{
+ g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL);
+ g_return_val_if_fail (pspec->ref_count > 0, NULL);
+
+ g_param_spec_ref (pspec);
+ g_param_spec_sink (pspec);
+ return pspec;
+}
+
+G_CONST_RETURN gchar*
+g_param_spec_get_name (GParamSpec *pspec)
+{
+ g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL);
+
+ return pspec->name;
+}
+
+G_CONST_RETURN gchar*
+g_param_spec_get_nick (GParamSpec *pspec)
+{
+ g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL);
+
+ if (pspec->_nick)
+ return pspec->_nick;
+ else
+ {
+ GParamSpec *redirect_target;
+
+ redirect_target = g_param_spec_get_redirect_target (pspec);
+ if (redirect_target && redirect_target->_nick)
+ return redirect_target->_nick;
+ }
+
+ return pspec->name;
+}
+
+G_CONST_RETURN gchar*
+g_param_spec_get_blurb (GParamSpec *pspec)
+{
+ g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL);
+
+ if (pspec->_blurb)
+ return pspec->_blurb;
+ else
+ {
+ GParamSpec *redirect_target;
+
+ redirect_target = g_param_spec_get_redirect_target (pspec);
+ if (redirect_target && redirect_target->_blurb)
+ return redirect_target->_blurb;
+ }
+
+ return NULL;
+}
+
+static void
+canonicalize_key (gchar *key)
+{
+ gchar *p;
+
+ for (p = key; *p != 0; p++)
+ {
+ gchar c = *p;
+
+ if (c != '-' &&
+ (c < '0' || c > '9') &&
+ (c < 'A' || c > 'Z') &&
+ (c < 'a' || c > 'z'))
+ *p = '-';
+ }
+}
+
+static gboolean
+is_canonical (const gchar *key)
+{
+ const gchar *p;
+
+ for (p = key; *p != 0; p++)
+ {
+ gchar c = *p;
+
+ if (c != '-' &&
+ (c < '0' || c > '9') &&
+ (c < 'A' || c > 'Z') &&
+ (c < 'a' || c > 'z'))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+gpointer
+g_param_spec_internal (GType param_type,
+ const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GParamFlags flags)
+{
+ GParamSpec *pspec;
+
+ g_return_val_if_fail (G_TYPE_IS_PARAM (param_type) && param_type != G_TYPE_PARAM, NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+ g_return_val_if_fail ((name[0] >= 'A' && name[0] <= 'Z') || (name[0] >= 'a' && name[0] <= 'z'), NULL);
+ g_return_val_if_fail (!(flags & G_PARAM_STATIC_NAME) || is_canonical (name), NULL);
+
+ pspec = (gpointer) g_type_create_instance (param_type);
+
+ if (flags & G_PARAM_STATIC_NAME)
+ {
+ pspec->name = g_intern_static_string (name);
+ if (!is_canonical (pspec->name))
+ g_warning ("G_PARAM_STATIC_NAME used with non-canonical pspec name: %s", pspec->name);
+ }
+ else
+ {
+ pspec->name = g_strdup (name);
+ canonicalize_key (pspec->name);
+ g_intern_string (pspec->name);
+ }
+
+ if (flags & G_PARAM_STATIC_NICK)
+ pspec->_nick = (gchar*) nick;
+ else
+ pspec->_nick = g_strdup (nick);
+
+ if (flags & G_PARAM_STATIC_BLURB)
+ pspec->_blurb = (gchar*) blurb;
+ else
+ pspec->_blurb = g_strdup (blurb);
+
+ pspec->flags = (flags & G_PARAM_USER_MASK) | (flags & G_PARAM_MASK);
+
+ return pspec;
+}
+
+gpointer
+g_param_spec_get_qdata (GParamSpec *pspec,
+ GQuark quark)
+{
+ g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL);
+
+ return quark ? g_datalist_id_get_data (&pspec->qdata, quark) : NULL;
+}
+
+void
+g_param_spec_set_qdata (GParamSpec *pspec,
+ GQuark quark,
+ gpointer data)
+{
+ g_return_if_fail (G_IS_PARAM_SPEC (pspec));
+ g_return_if_fail (quark > 0);
+
+ g_datalist_id_set_data (&pspec->qdata, quark, data);
+}
+
+void
+g_param_spec_set_qdata_full (GParamSpec *pspec,
+ GQuark quark,
+ gpointer data,
+ GDestroyNotify destroy)
+{
+ g_return_if_fail (G_IS_PARAM_SPEC (pspec));
+ g_return_if_fail (quark > 0);
+
+ g_datalist_id_set_data_full (&pspec->qdata, quark, data, data ? destroy : (GDestroyNotify) NULL);
+}
+
+gpointer
+g_param_spec_steal_qdata (GParamSpec *pspec,
+ GQuark quark)
+{
+ g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL);
+ g_return_val_if_fail (quark > 0, NULL);
+
+ return g_datalist_id_remove_no_notify (&pspec->qdata, quark);
+}
+
+GParamSpec*
+g_param_spec_get_redirect_target (GParamSpec *pspec)
+{
+ g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL);
+
+ if (G_IS_PARAM_SPEC_OVERRIDE (pspec))
+ {
+ GParamSpecOverride *ospec = G_PARAM_SPEC_OVERRIDE (pspec);
+
+ return ospec->overridden;
+ }
+ else
+ return NULL;
+}
+
+void
+g_param_value_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ g_return_if_fail (G_IS_PARAM_SPEC (pspec));
+ g_return_if_fail (G_IS_VALUE (value));
+ g_return_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, value));
+
+ g_value_reset (value);
+ G_PARAM_SPEC_GET_CLASS (pspec)->value_set_default (pspec, value);
+}
+
+gboolean
+g_param_value_defaults (GParamSpec *pspec,
+ GValue *value)
+{
+ GValue dflt_value = { 0, };
+ gboolean defaults;
+
+ g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), FALSE);
+ g_return_val_if_fail (G_IS_VALUE (value), FALSE);
+ g_return_val_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, value), FALSE);
+
+ g_value_init (&dflt_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+ G_PARAM_SPEC_GET_CLASS (pspec)->value_set_default (pspec, &dflt_value);
+ defaults = G_PARAM_SPEC_GET_CLASS (pspec)->values_cmp (pspec, value, &dflt_value) == 0;
+ g_value_unset (&dflt_value);
+
+ return defaults;
+}
+
+gboolean
+g_param_value_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), FALSE);
+ g_return_val_if_fail (G_IS_VALUE (value), FALSE);
+ g_return_val_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, value), FALSE);
+
+ if (G_PARAM_SPEC_GET_CLASS (pspec)->value_validate)
+ {
+ GValue oval = *value;
+
+ if (G_PARAM_SPEC_GET_CLASS (pspec)->value_validate (pspec, value) ||
+ memcmp (&oval.data, &value->data, sizeof (oval.data)))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+gboolean
+g_param_value_convert (GParamSpec *pspec,
+ const GValue *src_value,
+ GValue *dest_value,
+ gboolean strict_validation)
+{
+ GValue tmp_value = { 0, };
+
+ g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), FALSE);
+ g_return_val_if_fail (G_IS_VALUE (src_value), FALSE);
+ g_return_val_if_fail (G_IS_VALUE (dest_value), FALSE);
+ g_return_val_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, dest_value), FALSE);
+
+ /* better leave dest_value untouched when returning FALSE */
+
+ g_value_init (&tmp_value, G_VALUE_TYPE (dest_value));
+ if (g_value_transform (src_value, &tmp_value) &&
+ (!g_param_value_validate (pspec, &tmp_value) || !strict_validation))
+ {
+ g_value_unset (dest_value);
+
+ /* values are relocatable */
+ memcpy (dest_value, &tmp_value, sizeof (tmp_value));
+
+ return TRUE;
+ }
+ else
+ {
+ g_value_unset (&tmp_value);
+
+ return FALSE;
+ }
+}
+
+gint
+g_param_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ gint cmp;
+
+ /* param_values_cmp() effectively does: value1 - value2
+ * so the return values are:
+ * -1) value1 < value2
+ * 0) value1 == value2
+ * 1) value1 > value2
+ */
+ g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), 0);
+ g_return_val_if_fail (G_IS_VALUE (value1), 0);
+ g_return_val_if_fail (G_IS_VALUE (value2), 0);
+ g_return_val_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, value1), 0);
+ g_return_val_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, value2), 0);
+
+ cmp = G_PARAM_SPEC_GET_CLASS (pspec)->values_cmp (pspec, value1, value2);
+
+ return CLAMP (cmp, -1, 1);
+}
+
+static void
+value_param_init (GValue *value)
+{
+ value->data[0].v_pointer = NULL;
+}
+
+static void
+value_param_free_value (GValue *value)
+{
+ if (value->data[0].v_pointer)
+ g_param_spec_unref (value->data[0].v_pointer);
+}
+
+static void
+value_param_copy_value (const GValue *src_value,
+ GValue *dest_value)
+{
+ if (src_value->data[0].v_pointer)
+ dest_value->data[0].v_pointer = g_param_spec_ref (src_value->data[0].v_pointer);
+ else
+ dest_value->data[0].v_pointer = NULL;
+}
+
+static void
+value_param_transform_value (const GValue *src_value,
+ GValue *dest_value)
+{
+ if (src_value->data[0].v_pointer &&
+ g_type_is_a (G_PARAM_SPEC_TYPE (dest_value->data[0].v_pointer), G_VALUE_TYPE (dest_value)))
+ dest_value->data[0].v_pointer = g_param_spec_ref (src_value->data[0].v_pointer);
+ else
+ dest_value->data[0].v_pointer = NULL;
+}
+
+static gpointer
+value_param_peek_pointer (const GValue *value)
+{
+ return value->data[0].v_pointer;
+}
+
+static gchar*
+value_param_collect_value (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ if (collect_values[0].v_pointer)
+ {
+ GParamSpec *param = collect_values[0].v_pointer;
+
+ if (param->g_type_instance.g_class == NULL)
+ return g_strconcat ("invalid unclassed param spec pointer for value type `",
+ G_VALUE_TYPE_NAME (value),
+ "'",
+ NULL);
+ else if (!g_value_type_compatible (G_PARAM_SPEC_TYPE (param), G_VALUE_TYPE (value)))
+ return g_strconcat ("invalid param spec type `",
+ G_PARAM_SPEC_TYPE_NAME (param),
+ "' for value type `",
+ G_VALUE_TYPE_NAME (value),
+ "'",
+ NULL);
+ value->data[0].v_pointer = g_param_spec_ref (param);
+ }
+ else
+ value->data[0].v_pointer = NULL;
+
+ return NULL;
+}
+
+static gchar*
+value_param_lcopy_value (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ GParamSpec **param_p = collect_values[0].v_pointer;
+
+ if (!param_p)
+ return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+
+ if (!value->data[0].v_pointer)
+ *param_p = NULL;
+ else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
+ *param_p = value->data[0].v_pointer;
+ else
+ *param_p = g_param_spec_ref (value->data[0].v_pointer);
+
+ return NULL;
+}
+
+
+/* --- param spec pool --- */
+struct _GParamSpecPool
+{
+ GStaticMutex smutex;
+ gboolean type_prefixing;
+ GHashTable *hash_table;
+};
+
+static guint
+param_spec_pool_hash (gconstpointer key_spec)
+{
+ const GParamSpec *key = key_spec;
+ const gchar *p;
+ guint h = key->owner_type;
+
+ for (p = key->name; *p; p++)
+ h = (h << 5) - h + *p;
+
+ return h;
+}
+
+static gboolean
+param_spec_pool_equals (gconstpointer key_spec_1,
+ gconstpointer key_spec_2)
+{
+ const GParamSpec *key1 = key_spec_1;
+ const GParamSpec *key2 = key_spec_2;
+
+ return (key1->owner_type == key2->owner_type &&
+ strcmp (key1->name, key2->name) == 0);
+}
+
+GParamSpecPool*
+g_param_spec_pool_new (gboolean type_prefixing)
+{
+ static GStaticMutex init_smutex = G_STATIC_MUTEX_INIT;
+ GParamSpecPool *pool = g_new (GParamSpecPool, 1);
+
+ memcpy (&pool->smutex, &init_smutex, sizeof (init_smutex));
+ pool->type_prefixing = type_prefixing != FALSE;
+ pool->hash_table = g_hash_table_new (param_spec_pool_hash, param_spec_pool_equals);
+
+ return pool;
+}
+
+void
+g_param_spec_pool_insert (GParamSpecPool *pool,
+ GParamSpec *pspec,
+ GType owner_type)
+{
+ gchar *p;
+
+ if (pool && pspec && owner_type > 0 && pspec->owner_type == 0)
+ {
+ G_SLOCK (&pool->smutex);
+ for (p = pspec->name; *p; p++)
+ {
+ if (!strchr (G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-_", *p))
+ {
+ g_warning (G_STRLOC ": pspec name \"%s\" contains invalid characters", pspec->name);
+ G_SUNLOCK (&pool->smutex);
+ return;
+ }
+ }
+
+ pspec->owner_type = owner_type;
+ g_param_spec_ref (pspec);
+ g_hash_table_insert (pool->hash_table, pspec, pspec);
+ G_SUNLOCK (&pool->smutex);
+ }
+ else
+ {
+ g_return_if_fail (pool != NULL);
+ g_return_if_fail (pspec);
+ g_return_if_fail (owner_type > 0);
+ g_return_if_fail (pspec->owner_type == 0);
+ }
+}
+
+void
+g_param_spec_pool_remove (GParamSpecPool *pool,
+ GParamSpec *pspec)
+{
+ if (pool && pspec)
+ {
+ G_SLOCK (&pool->smutex);
+ if (g_hash_table_remove (pool->hash_table, pspec))
+ g_param_spec_unref (pspec);
+ else
+ g_warning (G_STRLOC ": attempt to remove unknown pspec `%s' from pool", pspec->name);
+ G_SUNLOCK (&pool->smutex);
+ }
+ else
+ {
+ g_return_if_fail (pool != NULL);
+ g_return_if_fail (pspec);
+ }
+}
+
+static inline GParamSpec*
+param_spec_ht_lookup (GHashTable *hash_table,
+ const gchar *param_name,
+ GType owner_type,
+ gboolean walk_ancestors)
+{
+ GParamSpec key, *pspec;
+
+ key.owner_type = owner_type;
+ key.name = (gchar*) param_name;
+ if (walk_ancestors)
+ do
+ {
+ pspec = g_hash_table_lookup (hash_table, &key);
+ if (pspec)
+ return pspec;
+ key.owner_type = g_type_parent (key.owner_type);
+ }
+ while (key.owner_type);
+ else
+ pspec = g_hash_table_lookup (hash_table, &key);
+
+ if (!pspec && !is_canonical (param_name))
+ {
+ /* try canonicalized form */
+ key.name = g_strdup (param_name);
+ key.owner_type = owner_type;
+
+ canonicalize_key (key.name);
+ if (walk_ancestors)
+ do
+ {
+ pspec = g_hash_table_lookup (hash_table, &key);
+ if (pspec)
+ {
+ g_free (key.name);
+ return pspec;
+ }
+ key.owner_type = g_type_parent (key.owner_type);
+ }
+ while (key.owner_type);
+ else
+ pspec = g_hash_table_lookup (hash_table, &key);
+ g_free (key.name);
+ }
+
+ return pspec;
+}
+
+GParamSpec*
+g_param_spec_pool_lookup (GParamSpecPool *pool,
+ const gchar *param_name,
+ GType owner_type,
+ gboolean walk_ancestors)
+{
+ GParamSpec *pspec;
+ gchar *delim;
+
+ if (!pool || !param_name)
+ {
+ g_return_val_if_fail (pool != NULL, NULL);
+ g_return_val_if_fail (param_name != NULL, NULL);
+ }
+
+ G_SLOCK (&pool->smutex);
+
+ delim = pool->type_prefixing ? strchr (param_name, ':') : NULL;
+
+ /* try quick and away, i.e. without prefix */
+ if (!delim)
+ {
+ pspec = param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors);
+ G_SUNLOCK (&pool->smutex);
+
+ return pspec;
+ }
+
+ /* strip type prefix */
+ if (pool->type_prefixing && delim[1] == ':')
+ {
+ guint l = delim - param_name;
+ gchar stack_buffer[32], *buffer = l < 32 ? stack_buffer : g_new (gchar, l + 1);
+ GType type;
+
+ strncpy (buffer, param_name, delim - param_name);
+ buffer[l] = 0;
+ type = g_type_from_name (buffer);
+ if (l >= 32)
+ g_free (buffer);
+ if (type) /* type==0 isn't a valid type pefix */
+ {
+ /* sanity check, these cases don't make a whole lot of sense */
+ if ((!walk_ancestors && type != owner_type) || !g_type_is_a (owner_type, type))
+ {
+ G_SUNLOCK (&pool->smutex);
+
+ return NULL;
+ }
+ owner_type = type;
+ param_name += l + 2;
+ pspec = param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors);
+ G_SUNLOCK (&pool->smutex);
+
+ return pspec;
+ }
+ }
+ /* malformed param_name */
+
+ G_SUNLOCK (&pool->smutex);
+
+ return NULL;
+}
+
+static void
+pool_list (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ GParamSpec *pspec = value;
+ gpointer *data = user_data;
+ GType owner_type = (GType) data[1];
+
+ if (owner_type == pspec->owner_type)
+ data[0] = g_list_prepend (data[0], pspec);
+}
+
+GList*
+g_param_spec_pool_list_owned (GParamSpecPool *pool,
+ GType owner_type)
+{
+ gpointer data[2];
+
+ g_return_val_if_fail (pool != NULL, NULL);
+ g_return_val_if_fail (owner_type > 0, NULL);
+
+ G_SLOCK (&pool->smutex);
+ data[0] = NULL;
+ data[1] = (gpointer) owner_type;
+ g_hash_table_foreach (pool->hash_table, pool_list, &data);
+ G_SUNLOCK (&pool->smutex);
+
+ return data[0];
+}
+
+static gint
+pspec_compare_id (gconstpointer a,
+ gconstpointer b)
+{
+ const GParamSpec *pspec1 = a, *pspec2 = b;
+
+ return pspec1->param_id < pspec2->param_id ? -1 : pspec1->param_id > pspec2->param_id;
+}
+
+static inline GSList*
+pspec_list_remove_overridden_and_redirected (GSList *plist,
+ GHashTable *ht,
+ GType owner_type,
+ guint *n_p)
+{
+ GSList *rlist = NULL;
+
+ while (plist)
+ {
+ GSList *tmp = plist->next;
+ GParamSpec *pspec = plist->data;
+ GParamSpec *found;
+ gboolean remove = FALSE;
+
+ /* Remove paramspecs that are redirected, and also paramspecs
+ * that have are overridden by non-redirected properties.
+ * The idea is to get the single paramspec for each name that
+ * best corresponds to what the application sees.
+ */
+ if (g_param_spec_get_redirect_target (pspec))
+ remove = TRUE;
+ else
+ {
+ found = param_spec_ht_lookup (ht, pspec->name, owner_type, TRUE);
+ if (found != pspec)
+ {
+ GParamSpec *redirect = g_param_spec_get_redirect_target (found);
+ if (redirect != pspec)
+ remove = TRUE;
+ }
+ }
+
+ if (remove)
+ {
+ g_slist_free_1 (plist);
+ }
+ else
+ {
+ plist->next = rlist;
+ rlist = plist;
+ *n_p += 1;
+ }
+ plist = tmp;
+ }
+ return rlist;
+}
+
+static void
+pool_depth_list (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ GParamSpec *pspec = value;
+ gpointer *data = user_data;
+ GSList **slists = data[0];
+ GType owner_type = (GType) data[1];
+
+ if (g_type_is_a (owner_type, pspec->owner_type))
+ {
+ if (G_TYPE_IS_INTERFACE (pspec->owner_type))
+ {
+ slists[0] = g_slist_prepend (slists[0], pspec);
+ }
+ else
+ {
+ guint d = g_type_depth (pspec->owner_type);
+
+ slists[d - 1] = g_slist_prepend (slists[d - 1], pspec);
+ }
+ }
+}
+
+/* We handle interfaces specially since we don't want to
+ * count interface prerequsites like normal inheritance;
+ * the property comes from the direct inheritance from
+ * the prerequisite class, not from the interface that
+ * prerequires it.
+ *
+ * also 'depth' isn't a meaningful concept for interface
+ * prerequites.
+ */
+static void
+pool_depth_list_for_interface (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ GParamSpec *pspec = value;
+ gpointer *data = user_data;
+ GSList **slists = data[0];
+ GType owner_type = (GType) data[1];
+
+ if (pspec->owner_type == owner_type)
+ slists[0] = g_slist_prepend (slists[0], pspec);
+}
+
+GParamSpec** /* free result */
+g_param_spec_pool_list (GParamSpecPool *pool,
+ GType owner_type,
+ guint *n_pspecs_p)
+{
+ GParamSpec **pspecs, **p;
+ GSList **slists, *node;
+ gpointer data[2];
+ guint d, i;
+
+ g_return_val_if_fail (pool != NULL, NULL);
+ g_return_val_if_fail (owner_type > 0, NULL);
+ g_return_val_if_fail (n_pspecs_p != NULL, NULL);
+
+ G_SLOCK (&pool->smutex);
+ *n_pspecs_p = 0;
+ d = g_type_depth (owner_type);
+ slists = g_new0 (GSList*, d);
+ data[0] = slists;
+ data[1] = (gpointer) owner_type;
+
+ g_hash_table_foreach (pool->hash_table,
+ G_TYPE_IS_INTERFACE (owner_type) ?
+ pool_depth_list_for_interface :
+ pool_depth_list,
+ &data);
+
+ for (i = 0; i < d; i++)
+ slists[i] = pspec_list_remove_overridden_and_redirected (slists[i], pool->hash_table, owner_type, n_pspecs_p);
+ pspecs = g_new (GParamSpec*, *n_pspecs_p + 1);
+ p = pspecs;
+ for (i = 0; i < d; i++)
+ {
+ slists[i] = g_slist_sort (slists[i], pspec_compare_id);
+ for (node = slists[i]; node; node = node->next)
+ *p++ = node->data;
+ g_slist_free (slists[i]);
+ }
+ *p++ = NULL;
+ g_free (slists);
+ G_SUNLOCK (&pool->smutex);
+
+ return pspecs;
+}
+
+
+/* --- auxillary functions --- */
+typedef struct
+{
+ /* class portion */
+ GType value_type;
+ void (*finalize) (GParamSpec *pspec);
+ void (*value_set_default) (GParamSpec *pspec,
+ GValue *value);
+ gboolean (*value_validate) (GParamSpec *pspec,
+ GValue *value);
+ gint (*values_cmp) (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2);
+} ParamSpecClassInfo;
+
+static void
+param_spec_generic_class_init (gpointer g_class,
+ gpointer class_data)
+{
+ GParamSpecClass *class = g_class;
+ ParamSpecClassInfo *info = class_data;
+
+ class->value_type = info->value_type;
+ if (info->finalize)
+ class->finalize = info->finalize; /* optional */
+ class->value_set_default = info->value_set_default;
+ if (info->value_validate)
+ class->value_validate = info->value_validate; /* optional */
+ class->values_cmp = info->values_cmp;
+ g_free (class_data);
+}
+
+static void
+default_value_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ /* value is already zero initialized */
+}
+
+static gint
+default_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ return memcmp (&value1->data, &value2->data, sizeof (value1->data));
+}
+
+GType
+g_param_type_register_static (const gchar *name,
+ const GParamSpecTypeInfo *pspec_info)
+{
+ GTypeInfo info = {
+ sizeof (GParamSpecClass), /* class_size */
+ NULL, /* base_init */
+ NULL, /* base_destroy */
+ param_spec_generic_class_init, /* class_init */
+ NULL, /* class_destroy */
+ NULL, /* class_data */
+ 0, /* instance_size */
+ 16, /* n_preallocs */
+ NULL, /* instance_init */
+ };
+ ParamSpecClassInfo *cinfo;
+
+ g_return_val_if_fail (name != NULL, 0);
+ g_return_val_if_fail (pspec_info != NULL, 0);
+ g_return_val_if_fail (g_type_from_name (name) == 0, 0);
+ g_return_val_if_fail (pspec_info->instance_size >= sizeof (GParamSpec), 0);
+ g_return_val_if_fail (g_type_name (pspec_info->value_type) != NULL, 0);
+ /* default: g_return_val_if_fail (pspec_info->value_set_default != NULL, 0); */
+ /* optional: g_return_val_if_fail (pspec_info->value_validate != NULL, 0); */
+ /* default: g_return_val_if_fail (pspec_info->values_cmp != NULL, 0); */
+
+ info.instance_size = pspec_info->instance_size;
+ info.n_preallocs = pspec_info->n_preallocs;
+ info.instance_init = (GInstanceInitFunc) pspec_info->instance_init;
+ cinfo = g_new (ParamSpecClassInfo, 1);
+ cinfo->value_type = pspec_info->value_type;
+ cinfo->finalize = pspec_info->finalize;
+ cinfo->value_set_default = pspec_info->value_set_default ? pspec_info->value_set_default : default_value_set_default;
+ cinfo->value_validate = pspec_info->value_validate;
+ cinfo->values_cmp = pspec_info->values_cmp ? pspec_info->values_cmp : default_values_cmp;
+ info.class_data = cinfo;
+
+ return g_type_register_static (G_TYPE_PARAM, name, &info, 0);
+}
+
+void
+g_value_set_param (GValue *value,
+ GParamSpec *param)
+{
+ g_return_if_fail (G_VALUE_HOLDS_PARAM (value));
+ if (param)
+ g_return_if_fail (G_IS_PARAM_SPEC (param));
+
+ if (value->data[0].v_pointer)
+ g_param_spec_unref (value->data[0].v_pointer);
+ value->data[0].v_pointer = param;
+ if (value->data[0].v_pointer)
+ g_param_spec_ref (value->data[0].v_pointer);
+}
+
+void
+g_value_set_param_take_ownership (GValue *value,
+ GParamSpec *param)
+{
+ g_value_take_param (value, param);
+}
+
+void
+g_value_take_param (GValue *value,
+ GParamSpec *param)
+{
+ g_return_if_fail (G_VALUE_HOLDS_PARAM (value));
+ if (param)
+ g_return_if_fail (G_IS_PARAM_SPEC (param));
+
+ if (value->data[0].v_pointer)
+ g_param_spec_unref (value->data[0].v_pointer);
+ value->data[0].v_pointer = param; /* we take over the reference count */
+}
+
+GParamSpec*
+g_value_get_param (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_PARAM (value), NULL);
+
+ return value->data[0].v_pointer;
+}
+
+GParamSpec*
+g_value_dup_param (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_PARAM (value), NULL);
+
+ return value->data[0].v_pointer ? g_param_spec_ref (value->data[0].v_pointer) : NULL;
+}
+
+#define __G_PARAM_C__
+#include "gobjectaliasdef.c"
diff --git a/trunk/gobject/gparam.h b/trunk/gobject/gparam.h
new file mode 100644
index 000000000..3790712e0
--- /dev/null
+++ b/trunk/gobject/gparam.h
@@ -0,0 +1,235 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1997-1999, 2000-2001 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.
+ *
+ * gparam.h: GParamSpec base class implementation
+ */
+#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
+#error "Only <glib-object.h> can be included directly."
+#endif
+
+#ifndef __G_PARAM_H__
+#define __G_PARAM_H__
+
+#include <gobject/gvalue.h>
+
+G_BEGIN_DECLS
+
+/* --- standard type macros --- */
+#define G_TYPE_IS_PARAM(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_PARAM)
+#define G_PARAM_SPEC(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
+#define G_IS_PARAM_SPEC(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM))
+#define G_PARAM_SPEC_CLASS(pclass) (G_TYPE_CHECK_CLASS_CAST ((pclass), G_TYPE_PARAM, GParamSpecClass))
+#define G_IS_PARAM_SPEC_CLASS(pclass) (G_TYPE_CHECK_CLASS_TYPE ((pclass), G_TYPE_PARAM))
+#define G_PARAM_SPEC_GET_CLASS(pspec) (G_TYPE_INSTANCE_GET_CLASS ((pspec), G_TYPE_PARAM, GParamSpecClass))
+
+
+/* --- convenience macros --- */
+#define G_PARAM_SPEC_TYPE(pspec) (G_TYPE_FROM_INSTANCE (pspec))
+#define G_PARAM_SPEC_TYPE_NAME(pspec) (g_type_name (G_PARAM_SPEC_TYPE (pspec)))
+#define G_PARAM_SPEC_VALUE_TYPE(pspec) (G_PARAM_SPEC (pspec)->value_type)
+#define G_VALUE_HOLDS_PARAM(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_PARAM))
+
+
+/* --- flags --- */
+typedef enum
+{
+ G_PARAM_READABLE = 1 << 0,
+ G_PARAM_WRITABLE = 1 << 1,
+ G_PARAM_CONSTRUCT = 1 << 2,
+ G_PARAM_CONSTRUCT_ONLY = 1 << 3,
+ G_PARAM_LAX_VALIDATION = 1 << 4,
+ G_PARAM_STATIC_NAME = 1 << 5,
+#ifndef G_DISABLE_DEPRECATED
+ G_PARAM_PRIVATE = G_PARAM_STATIC_NAME,
+#endif
+ G_PARAM_STATIC_NICK = 1 << 6,
+ G_PARAM_STATIC_BLURB = 1 << 7
+} GParamFlags;
+#define G_PARAM_READWRITE (G_PARAM_READABLE | G_PARAM_WRITABLE)
+#define G_PARAM_STATIC_STRINGS (G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)
+#define G_PARAM_MASK (0x000000ff)
+/* bits in the range 0xffffff00 are reserved for 3rd party usage */
+#define G_PARAM_USER_SHIFT (8)
+
+
+/* --- typedefs & structures --- */
+typedef struct _GParamSpec GParamSpec;
+typedef struct _GParamSpecClass GParamSpecClass;
+typedef struct _GParameter GParameter;
+typedef struct _GParamSpecPool GParamSpecPool;
+struct _GParamSpec
+{
+ GTypeInstance g_type_instance;
+
+ gchar *name;
+ GParamFlags flags;
+ GType value_type;
+ GType owner_type; /* class or interface using this property */
+
+ /*< private >*/
+ gchar *_nick;
+ gchar *_blurb;
+ GData *qdata;
+ guint ref_count;
+ guint param_id; /* sort-criteria */
+};
+struct _GParamSpecClass
+{
+ GTypeClass g_type_class;
+
+ GType value_type;
+
+ void (*finalize) (GParamSpec *pspec);
+
+ /* GParam methods */
+ void (*value_set_default) (GParamSpec *pspec,
+ GValue *value);
+ gboolean (*value_validate) (GParamSpec *pspec,
+ GValue *value);
+ gint (*values_cmp) (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2);
+ /*< private >*/
+ gpointer dummy[4];
+};
+struct _GParameter /* auxillary structure for _setv() variants */
+{
+ const gchar *name;
+ GValue value;
+};
+
+
+/* --- prototypes --- */
+GParamSpec* g_param_spec_ref (GParamSpec *pspec);
+void g_param_spec_unref (GParamSpec *pspec);
+void g_param_spec_sink (GParamSpec *pspec);
+GParamSpec* g_param_spec_ref_sink (GParamSpec *pspec);
+gpointer g_param_spec_get_qdata (GParamSpec *pspec,
+ GQuark quark);
+void g_param_spec_set_qdata (GParamSpec *pspec,
+ GQuark quark,
+ gpointer data);
+void g_param_spec_set_qdata_full (GParamSpec *pspec,
+ GQuark quark,
+ gpointer data,
+ GDestroyNotify destroy);
+gpointer g_param_spec_steal_qdata (GParamSpec *pspec,
+ GQuark quark);
+GParamSpec* g_param_spec_get_redirect_target (GParamSpec *pspec);
+
+void g_param_value_set_default (GParamSpec *pspec,
+ GValue *value);
+gboolean g_param_value_defaults (GParamSpec *pspec,
+ GValue *value);
+gboolean g_param_value_validate (GParamSpec *pspec,
+ GValue *value);
+gboolean g_param_value_convert (GParamSpec *pspec,
+ const GValue *src_value,
+ GValue *dest_value,
+ gboolean strict_validation);
+gint g_param_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2);
+G_CONST_RETURN gchar* g_param_spec_get_name (GParamSpec *pspec);
+G_CONST_RETURN gchar* g_param_spec_get_nick (GParamSpec *pspec);
+G_CONST_RETURN gchar* g_param_spec_get_blurb (GParamSpec *pspec);
+void g_value_set_param (GValue *value,
+ GParamSpec *param);
+GParamSpec* g_value_get_param (const GValue *value);
+GParamSpec* g_value_dup_param (const GValue *value);
+
+
+void g_value_take_param (GValue *value,
+ GParamSpec *param);
+#ifndef G_DISABLE_DEPRECATED
+void g_value_set_param_take_ownership (GValue *value,
+ GParamSpec *param);
+#endif
+
+/* --- convenience functions --- */
+typedef struct _GParamSpecTypeInfo GParamSpecTypeInfo;
+struct _GParamSpecTypeInfo
+{
+ /* type system portion */
+ guint16 instance_size; /* obligatory */
+ guint16 n_preallocs; /* optional */
+ void (*instance_init) (GParamSpec *pspec); /* optional */
+
+ /* class portion */
+ GType value_type; /* obligatory */
+ void (*finalize) (GParamSpec *pspec); /* optional */
+ void (*value_set_default) (GParamSpec *pspec, /* recommended */
+ GValue *value);
+ gboolean (*value_validate) (GParamSpec *pspec, /* optional */
+ GValue *value);
+ gint (*values_cmp) (GParamSpec *pspec, /* recommended */
+ const GValue *value1,
+ const GValue *value2);
+};
+GType g_param_type_register_static (const gchar *name,
+ const GParamSpecTypeInfo *pspec_info);
+
+/* For registering builting types */
+GType _g_param_type_register_static_constant (const gchar *name,
+ const GParamSpecTypeInfo *pspec_info,
+ GType opt_type);
+
+
+/* --- protected --- */
+gpointer g_param_spec_internal (GType param_type,
+ const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GParamFlags flags);
+GParamSpecPool* g_param_spec_pool_new (gboolean type_prefixing);
+void g_param_spec_pool_insert (GParamSpecPool *pool,
+ GParamSpec *pspec,
+ GType owner_type);
+void g_param_spec_pool_remove (GParamSpecPool *pool,
+ GParamSpec *pspec);
+GParamSpec* g_param_spec_pool_lookup (GParamSpecPool *pool,
+ const gchar *param_name,
+ GType owner_type,
+ gboolean walk_ancestors);
+GList* g_param_spec_pool_list_owned (GParamSpecPool *pool,
+ GType owner_type);
+GParamSpec** g_param_spec_pool_list (GParamSpecPool *pool,
+ GType owner_type,
+ guint *n_pspecs_p);
+
+
+
+/* contracts:
+ *
+ * gboolean value_validate (GParamSpec *pspec,
+ * GValue *value):
+ * modify value contents in the least destructive way, so
+ * that it complies with pspec's requirements (i.e.
+ * according to minimum/maximum ranges etc...). return
+ * whether modification was necessary.
+ *
+ * gint values_cmp (GParamSpec *pspec,
+ * const GValue *value1,
+ * const GValue *value2):
+ * return value1 - value2, i.e. (-1) if value1 < value2,
+ * (+1) if value1 > value2, and (0) otherwise (equality)
+ */
+
+G_END_DECLS
+
+#endif /* __G_PARAM_H__ */
diff --git a/trunk/gobject/gparamspecs.c b/trunk/gobject/gparamspecs.c
new file mode 100644
index 000000000..5ba897711
--- /dev/null
+++ b/trunk/gobject/gparamspecs.c
@@ -0,0 +1,2031 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1997-1999, 2000-2001 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.
+ */
+
+/*
+ * MT safe
+ */
+
+#include "../config.h"
+
+#include "gparamspecs.h"
+
+#include "gvaluecollector.h"
+#include "gvaluearray.h"
+#include "gobjectalias.h"
+#include <string.h>
+
+#define G_FLOAT_EPSILON (1e-30)
+#define G_DOUBLE_EPSILON (1e-90)
+
+
+/* --- param spec functions --- */
+static void
+param_char_init (GParamSpec *pspec)
+{
+ GParamSpecChar *cspec = G_PARAM_SPEC_CHAR (pspec);
+
+ cspec->minimum = 0x7f;
+ cspec->maximum = 0x80;
+ cspec->default_value = 0;
+}
+
+static void
+param_char_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_int = G_PARAM_SPEC_CHAR (pspec)->default_value;
+}
+
+static gboolean
+param_char_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecChar *cspec = G_PARAM_SPEC_CHAR (pspec);
+ gint oval = value->data[0].v_int;
+
+ value->data[0].v_int = CLAMP (value->data[0].v_int, cspec->minimum, cspec->maximum);
+
+ return value->data[0].v_int != oval;
+}
+
+static void
+param_uchar_init (GParamSpec *pspec)
+{
+ GParamSpecUChar *uspec = G_PARAM_SPEC_UCHAR (pspec);
+
+ uspec->minimum = 0;
+ uspec->maximum = 0xff;
+ uspec->default_value = 0;
+}
+
+static void
+param_uchar_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_uint = G_PARAM_SPEC_UCHAR (pspec)->default_value;
+}
+
+static gboolean
+param_uchar_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecUChar *uspec = G_PARAM_SPEC_UCHAR (pspec);
+ guint oval = value->data[0].v_uint;
+
+ value->data[0].v_uint = CLAMP (value->data[0].v_uint, uspec->minimum, uspec->maximum);
+
+ return value->data[0].v_uint != oval;
+}
+
+static void
+param_boolean_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_int = G_PARAM_SPEC_BOOLEAN (pspec)->default_value;
+}
+
+static gboolean
+param_boolean_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ gint oval = value->data[0].v_int;
+
+ value->data[0].v_int = value->data[0].v_int != FALSE;
+
+ return value->data[0].v_int != oval;
+}
+
+static void
+param_int_init (GParamSpec *pspec)
+{
+ GParamSpecInt *ispec = G_PARAM_SPEC_INT (pspec);
+
+ ispec->minimum = 0x7fffffff;
+ ispec->maximum = 0x80000000;
+ ispec->default_value = 0;
+}
+
+static void
+param_int_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_int = G_PARAM_SPEC_INT (pspec)->default_value;
+}
+
+static gboolean
+param_int_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecInt *ispec = G_PARAM_SPEC_INT (pspec);
+ gint oval = value->data[0].v_int;
+
+ value->data[0].v_int = CLAMP (value->data[0].v_int, ispec->minimum, ispec->maximum);
+
+ return value->data[0].v_int != oval;
+}
+
+static gint
+param_int_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ if (value1->data[0].v_int < value2->data[0].v_int)
+ return -1;
+ else
+ return value1->data[0].v_int > value2->data[0].v_int;
+}
+
+static void
+param_uint_init (GParamSpec *pspec)
+{
+ GParamSpecUInt *uspec = G_PARAM_SPEC_UINT (pspec);
+
+ uspec->minimum = 0;
+ uspec->maximum = 0xffffffff;
+ uspec->default_value = 0;
+}
+
+static void
+param_uint_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_uint = G_PARAM_SPEC_UINT (pspec)->default_value;
+}
+
+static gboolean
+param_uint_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecUInt *uspec = G_PARAM_SPEC_UINT (pspec);
+ guint oval = value->data[0].v_uint;
+
+ value->data[0].v_uint = CLAMP (value->data[0].v_uint, uspec->minimum, uspec->maximum);
+
+ return value->data[0].v_uint != oval;
+}
+
+static gint
+param_uint_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ if (value1->data[0].v_uint < value2->data[0].v_uint)
+ return -1;
+ else
+ return value1->data[0].v_uint > value2->data[0].v_uint;
+}
+
+static void
+param_long_init (GParamSpec *pspec)
+{
+ GParamSpecLong *lspec = G_PARAM_SPEC_LONG (pspec);
+
+#if SIZEOF_LONG == 4
+ lspec->minimum = 0x7fffffff;
+ lspec->maximum = 0x80000000;
+#else /* SIZEOF_LONG != 4 (8) */
+ lspec->minimum = 0x7fffffffffffffff;
+ lspec->maximum = 0x8000000000000000;
+#endif
+ lspec->default_value = 0;
+}
+
+static void
+param_long_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_long = G_PARAM_SPEC_LONG (pspec)->default_value;
+}
+
+static gboolean
+param_long_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecLong *lspec = G_PARAM_SPEC_LONG (pspec);
+ glong oval = value->data[0].v_long;
+
+ value->data[0].v_long = CLAMP (value->data[0].v_long, lspec->minimum, lspec->maximum);
+
+ return value->data[0].v_long != oval;
+}
+
+static gint
+param_long_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ if (value1->data[0].v_long < value2->data[0].v_long)
+ return -1;
+ else
+ return value1->data[0].v_long > value2->data[0].v_long;
+}
+
+static void
+param_ulong_init (GParamSpec *pspec)
+{
+ GParamSpecULong *uspec = G_PARAM_SPEC_ULONG (pspec);
+
+ uspec->minimum = 0;
+#if SIZEOF_LONG == 4
+ uspec->maximum = 0xffffffff;
+#else /* SIZEOF_LONG != 4 (8) */
+ uspec->maximum = 0xffffffffffffffff;
+#endif
+ uspec->default_value = 0;
+}
+
+static void
+param_ulong_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_ulong = G_PARAM_SPEC_ULONG (pspec)->default_value;
+}
+
+static gboolean
+param_ulong_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecULong *uspec = G_PARAM_SPEC_ULONG (pspec);
+ gulong oval = value->data[0].v_ulong;
+
+ value->data[0].v_ulong = CLAMP (value->data[0].v_ulong, uspec->minimum, uspec->maximum);
+
+ return value->data[0].v_ulong != oval;
+}
+
+static gint
+param_ulong_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ if (value1->data[0].v_ulong < value2->data[0].v_ulong)
+ return -1;
+ else
+ return value1->data[0].v_ulong > value2->data[0].v_ulong;
+}
+
+static void
+param_int64_init (GParamSpec *pspec)
+{
+ GParamSpecInt64 *lspec = G_PARAM_SPEC_INT64 (pspec);
+
+ lspec->minimum = G_MININT64;
+ lspec->maximum = G_MAXINT64;
+ lspec->default_value = 0;
+}
+
+static void
+param_int64_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_int64 = G_PARAM_SPEC_INT64 (pspec)->default_value;
+}
+
+static gboolean
+param_int64_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecInt64 *lspec = G_PARAM_SPEC_INT64 (pspec);
+ gint64 oval = value->data[0].v_int64;
+
+ value->data[0].v_int64 = CLAMP (value->data[0].v_int64, lspec->minimum, lspec->maximum);
+
+ return value->data[0].v_int64 != oval;
+}
+
+static gint
+param_int64_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ if (value1->data[0].v_int64 < value2->data[0].v_int64)
+ return -1;
+ else
+ return value1->data[0].v_int64 > value2->data[0].v_int64;
+}
+
+static void
+param_uint64_init (GParamSpec *pspec)
+{
+ GParamSpecUInt64 *uspec = G_PARAM_SPEC_UINT64 (pspec);
+
+ uspec->minimum = 0;
+ uspec->maximum = G_MAXUINT64;
+ uspec->default_value = 0;
+}
+
+static void
+param_uint64_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_uint64 = G_PARAM_SPEC_UINT64 (pspec)->default_value;
+}
+
+static gboolean
+param_uint64_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecUInt64 *uspec = G_PARAM_SPEC_UINT64 (pspec);
+ guint64 oval = value->data[0].v_uint64;
+
+ value->data[0].v_uint64 = CLAMP (value->data[0].v_uint64, uspec->minimum, uspec->maximum);
+
+ return value->data[0].v_uint64 != oval;
+}
+
+static gint
+param_uint64_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ if (value1->data[0].v_uint64 < value2->data[0].v_uint64)
+ return -1;
+ else
+ return value1->data[0].v_uint64 > value2->data[0].v_uint64;
+}
+
+static void
+param_unichar_init (GParamSpec *pspec)
+{
+ GParamSpecUnichar *uspec = G_PARAM_SPEC_UNICHAR (pspec);
+
+ uspec->default_value = 0;
+}
+
+static void
+param_unichar_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_uint = G_PARAM_SPEC_UNICHAR (pspec)->default_value;
+}
+
+static gboolean
+param_unichar_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ gunichar oval = value->data[0].v_uint;
+ gboolean changed = FALSE;
+
+ if (!g_unichar_validate (oval))
+ {
+ value->data[0].v_uint = 0;
+ changed = TRUE;
+ }
+
+ return changed;
+}
+
+static gint
+param_unichar_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ if (value1->data[0].v_uint < value2->data[0].v_uint)
+ return -1;
+ else
+ return value1->data[0].v_uint > value2->data[0].v_uint;
+}
+
+static void
+param_enum_init (GParamSpec *pspec)
+{
+ GParamSpecEnum *espec = G_PARAM_SPEC_ENUM (pspec);
+
+ espec->enum_class = NULL;
+ espec->default_value = 0;
+}
+
+static void
+param_enum_finalize (GParamSpec *pspec)
+{
+ GParamSpecEnum *espec = G_PARAM_SPEC_ENUM (pspec);
+ GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_ENUM));
+
+ if (espec->enum_class)
+ {
+ g_type_class_unref (espec->enum_class);
+ espec->enum_class = NULL;
+ }
+
+ parent_class->finalize (pspec);
+}
+
+static void
+param_enum_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_long = G_PARAM_SPEC_ENUM (pspec)->default_value;
+}
+
+static gboolean
+param_enum_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecEnum *espec = G_PARAM_SPEC_ENUM (pspec);
+ glong oval = value->data[0].v_long;
+
+ if (!espec->enum_class ||
+ !g_enum_get_value (espec->enum_class, value->data[0].v_long))
+ value->data[0].v_long = espec->default_value;
+
+ return value->data[0].v_long != oval;
+}
+
+static void
+param_flags_init (GParamSpec *pspec)
+{
+ GParamSpecFlags *fspec = G_PARAM_SPEC_FLAGS (pspec);
+
+ fspec->flags_class = NULL;
+ fspec->default_value = 0;
+}
+
+static void
+param_flags_finalize (GParamSpec *pspec)
+{
+ GParamSpecFlags *fspec = G_PARAM_SPEC_FLAGS (pspec);
+ GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_FLAGS));
+
+ if (fspec->flags_class)
+ {
+ g_type_class_unref (fspec->flags_class);
+ fspec->flags_class = NULL;
+ }
+
+ parent_class->finalize (pspec);
+}
+
+static void
+param_flags_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_ulong = G_PARAM_SPEC_FLAGS (pspec)->default_value;
+}
+
+static gboolean
+param_flags_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecFlags *fspec = G_PARAM_SPEC_FLAGS (pspec);
+ gulong oval = value->data[0].v_ulong;
+
+ if (fspec->flags_class)
+ value->data[0].v_ulong &= fspec->flags_class->mask;
+ else
+ value->data[0].v_ulong = fspec->default_value;
+
+ return value->data[0].v_ulong != oval;
+}
+
+static void
+param_float_init (GParamSpec *pspec)
+{
+ GParamSpecFloat *fspec = G_PARAM_SPEC_FLOAT (pspec);
+
+ fspec->minimum = -G_MAXFLOAT;
+ fspec->maximum = G_MAXFLOAT;
+ fspec->default_value = 0;
+ fspec->epsilon = G_FLOAT_EPSILON;
+}
+
+static void
+param_float_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_float = G_PARAM_SPEC_FLOAT (pspec)->default_value;
+}
+
+static gboolean
+param_float_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecFloat *fspec = G_PARAM_SPEC_FLOAT (pspec);
+ gfloat oval = value->data[0].v_float;
+
+ value->data[0].v_float = CLAMP (value->data[0].v_float, fspec->minimum, fspec->maximum);
+
+ return value->data[0].v_float != oval;
+}
+
+static gint
+param_float_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ gfloat epsilon = G_PARAM_SPEC_FLOAT (pspec)->epsilon;
+
+ if (value1->data[0].v_float < value2->data[0].v_float)
+ return - (value2->data[0].v_float - value1->data[0].v_float > epsilon);
+ else
+ return value1->data[0].v_float - value2->data[0].v_float > epsilon;
+}
+
+static void
+param_double_init (GParamSpec *pspec)
+{
+ GParamSpecDouble *dspec = G_PARAM_SPEC_DOUBLE (pspec);
+
+ dspec->minimum = -G_MAXDOUBLE;
+ dspec->maximum = G_MAXDOUBLE;
+ dspec->default_value = 0;
+ dspec->epsilon = G_DOUBLE_EPSILON;
+}
+
+static void
+param_double_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_double = G_PARAM_SPEC_DOUBLE (pspec)->default_value;
+}
+
+static gboolean
+param_double_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecDouble *dspec = G_PARAM_SPEC_DOUBLE (pspec);
+ gdouble oval = value->data[0].v_double;
+
+ value->data[0].v_double = CLAMP (value->data[0].v_double, dspec->minimum, dspec->maximum);
+
+ return value->data[0].v_double != oval;
+}
+
+static gint
+param_double_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ gdouble epsilon = G_PARAM_SPEC_DOUBLE (pspec)->epsilon;
+
+ if (value1->data[0].v_double < value2->data[0].v_double)
+ return - (value2->data[0].v_double - value1->data[0].v_double > epsilon);
+ else
+ return value1->data[0].v_double - value2->data[0].v_double > epsilon;
+}
+
+static void
+param_string_init (GParamSpec *pspec)
+{
+ GParamSpecString *sspec = G_PARAM_SPEC_STRING (pspec);
+
+ sspec->default_value = NULL;
+ sspec->cset_first = NULL;
+ sspec->cset_nth = NULL;
+ sspec->substitutor = '_';
+ sspec->null_fold_if_empty = FALSE;
+ sspec->ensure_non_null = FALSE;
+}
+
+static void
+param_string_finalize (GParamSpec *pspec)
+{
+ GParamSpecString *sspec = G_PARAM_SPEC_STRING (pspec);
+ GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_STRING));
+
+ g_free (sspec->default_value);
+ g_free (sspec->cset_first);
+ g_free (sspec->cset_nth);
+ sspec->default_value = NULL;
+ sspec->cset_first = NULL;
+ sspec->cset_nth = NULL;
+
+ parent_class->finalize (pspec);
+}
+
+static void
+param_string_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_pointer = g_strdup (G_PARAM_SPEC_STRING (pspec)->default_value);
+}
+
+static gboolean
+param_string_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecString *sspec = G_PARAM_SPEC_STRING (pspec);
+ gchar *string = value->data[0].v_pointer;
+ guint changed = 0;
+
+ if (string && string[0])
+ {
+ gchar *s;
+
+ if (sspec->cset_first && !strchr (sspec->cset_first, string[0]))
+ {
+ if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)
+ {
+ value->data[0].v_pointer = g_strdup (string);
+ string = value->data[0].v_pointer;
+ value->data[1].v_uint &= ~G_VALUE_NOCOPY_CONTENTS;
+ }
+ string[0] = sspec->substitutor;
+ changed++;
+ }
+ if (sspec->cset_nth)
+ for (s = string + 1; *s; s++)
+ if (!strchr (sspec->cset_nth, *s))
+ {
+ if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)
+ {
+ value->data[0].v_pointer = g_strdup (string);
+ s = (gchar*) value->data[0].v_pointer + (s - string);
+ string = value->data[0].v_pointer;
+ value->data[1].v_uint &= ~G_VALUE_NOCOPY_CONTENTS;
+ }
+ *s = sspec->substitutor;
+ changed++;
+ }
+ }
+ if (sspec->null_fold_if_empty && string && string[0] == 0)
+ {
+ if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
+ g_free (value->data[0].v_pointer);
+ else
+ value->data[1].v_uint &= ~G_VALUE_NOCOPY_CONTENTS;
+ value->data[0].v_pointer = NULL;
+ changed++;
+ string = value->data[0].v_pointer;
+ }
+ if (sspec->ensure_non_null && !string)
+ {
+ value->data[1].v_uint &= ~G_VALUE_NOCOPY_CONTENTS;
+ value->data[0].v_pointer = g_strdup ("");
+ changed++;
+ string = value->data[0].v_pointer;
+ }
+
+ return changed;
+}
+
+static gint
+param_string_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ if (!value1->data[0].v_pointer)
+ return value2->data[0].v_pointer != NULL ? -1 : 0;
+ else if (!value2->data[0].v_pointer)
+ return value1->data[0].v_pointer != NULL;
+ else
+ return strcmp (value1->data[0].v_pointer, value2->data[0].v_pointer);
+}
+
+static void
+param_param_init (GParamSpec *pspec)
+{
+ /* GParamSpecParam *spec = G_PARAM_SPEC_PARAM (pspec); */
+}
+
+static void
+param_param_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_pointer = NULL;
+}
+
+static gboolean
+param_param_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ /* GParamSpecParam *spec = G_PARAM_SPEC_PARAM (pspec); */
+ GParamSpec *param = value->data[0].v_pointer;
+ guint changed = 0;
+
+ if (param && !g_value_type_compatible (G_PARAM_SPEC_TYPE (param), G_PARAM_SPEC_VALUE_TYPE (pspec)))
+ {
+ g_param_spec_unref (param);
+ value->data[0].v_pointer = NULL;
+ changed++;
+ }
+
+ return changed;
+}
+
+static void
+param_boxed_init (GParamSpec *pspec)
+{
+ /* GParamSpecBoxed *bspec = G_PARAM_SPEC_BOXED (pspec); */
+}
+
+static void
+param_boxed_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_pointer = NULL;
+}
+
+static gboolean
+param_boxed_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ /* GParamSpecBoxed *bspec = G_PARAM_SPEC_BOXED (pspec); */
+ guint changed = 0;
+
+ /* can't do a whole lot here since we haven't even G_BOXED_TYPE() */
+
+ return changed;
+}
+
+static gint
+param_boxed_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ guint8 *p1 = value1->data[0].v_pointer;
+ guint8 *p2 = value2->data[0].v_pointer;
+
+ /* not much to compare here, try to at least provide stable lesser/greater result */
+
+ return p1 < p2 ? -1 : p1 > p2;
+}
+
+static void
+param_pointer_init (GParamSpec *pspec)
+{
+ /* GParamSpecPointer *spec = G_PARAM_SPEC_POINTER (pspec); */
+}
+
+static void
+param_pointer_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_pointer = NULL;
+}
+
+static gboolean
+param_pointer_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ /* GParamSpecPointer *spec = G_PARAM_SPEC_POINTER (pspec); */
+ guint changed = 0;
+
+ return changed;
+}
+
+static gint
+param_pointer_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ guint8 *p1 = value1->data[0].v_pointer;
+ guint8 *p2 = value2->data[0].v_pointer;
+
+ /* not much to compare here, try to at least provide stable lesser/greater result */
+
+ return p1 < p2 ? -1 : p1 > p2;
+}
+
+static void
+param_value_array_init (GParamSpec *pspec)
+{
+ GParamSpecValueArray *aspec = G_PARAM_SPEC_VALUE_ARRAY (pspec);
+
+ aspec->element_spec = NULL;
+ aspec->fixed_n_elements = 0; /* disable */
+}
+
+static inline guint
+value_array_ensure_size (GValueArray *value_array,
+ guint fixed_n_elements)
+{
+ guint changed = 0;
+
+ if (fixed_n_elements)
+ {
+ while (value_array->n_values < fixed_n_elements)
+ {
+ g_value_array_append (value_array, NULL);
+ changed++;
+ }
+ while (value_array->n_values > fixed_n_elements)
+ {
+ g_value_array_remove (value_array, value_array->n_values - 1);
+ changed++;
+ }
+ }
+ return changed;
+}
+
+static void
+param_value_array_finalize (GParamSpec *pspec)
+{
+ GParamSpecValueArray *aspec = G_PARAM_SPEC_VALUE_ARRAY (pspec);
+ GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_VALUE_ARRAY));
+
+ if (aspec->element_spec)
+ {
+ g_param_spec_unref (aspec->element_spec);
+ aspec->element_spec = NULL;
+ }
+
+ parent_class->finalize (pspec);
+}
+
+static void
+param_value_array_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecValueArray *aspec = G_PARAM_SPEC_VALUE_ARRAY (pspec);
+
+ if (!value->data[0].v_pointer && aspec->fixed_n_elements)
+ value->data[0].v_pointer = g_value_array_new (aspec->fixed_n_elements);
+
+ if (value->data[0].v_pointer)
+ {
+ /* g_value_reset (value); already done */
+ value_array_ensure_size (value->data[0].v_pointer, aspec->fixed_n_elements);
+ }
+}
+
+static gboolean
+param_value_array_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecValueArray *aspec = G_PARAM_SPEC_VALUE_ARRAY (pspec);
+ GValueArray *value_array = value->data[0].v_pointer;
+ guint changed = 0;
+
+ if (!value->data[0].v_pointer && aspec->fixed_n_elements)
+ value->data[0].v_pointer = g_value_array_new (aspec->fixed_n_elements);
+
+ if (value->data[0].v_pointer)
+ {
+ /* ensure array size validity */
+ changed += value_array_ensure_size (value_array, aspec->fixed_n_elements);
+
+ /* ensure array values validity against a present element spec */
+ if (aspec->element_spec)
+ {
+ GParamSpec *element_spec = aspec->element_spec;
+ guint i;
+
+ for (i = 0; i < value_array->n_values; i++)
+ {
+ GValue *element = value_array->values + i;
+
+ /* need to fixup value type, or ensure that the array value is initialized at all */
+ if (!g_value_type_compatible (G_VALUE_TYPE (element), G_PARAM_SPEC_VALUE_TYPE (element_spec)))
+ {
+ if (G_VALUE_TYPE (element) != 0)
+ g_value_unset (element);
+ g_value_init (element, G_PARAM_SPEC_VALUE_TYPE (element_spec));
+ g_param_value_set_default (element_spec, element);
+ changed++;
+ }
+ /* validate array value against element_spec */
+ changed += g_param_value_validate (element_spec, element);
+ }
+ }
+ }
+
+ return changed;
+}
+
+static gint
+param_value_array_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ GParamSpecValueArray *aspec = G_PARAM_SPEC_VALUE_ARRAY (pspec);
+ GValueArray *value_array1 = value1->data[0].v_pointer;
+ GValueArray *value_array2 = value2->data[0].v_pointer;
+
+ if (!value_array1 || !value_array2)
+ return value_array2 ? -1 : value_array1 != value_array2;
+
+ if (value_array1->n_values != value_array2->n_values)
+ return value_array1->n_values < value_array2->n_values ? -1 : 1;
+ else if (!aspec->element_spec)
+ {
+ /* we need an element specification for comparisons, so there's not much
+ * to compare here, try to at least provide stable lesser/greater result
+ */
+ return value_array1->n_values < value_array2->n_values ? -1 : value_array1->n_values > value_array2->n_values;
+ }
+ else /* value_array1->n_values == value_array2->n_values */
+ {
+ guint i;
+
+ for (i = 0; i < value_array1->n_values; i++)
+ {
+ GValue *element1 = value_array1->values + i;
+ GValue *element2 = value_array2->values + i;
+ gint cmp;
+
+ /* need corresponding element types, provide stable result otherwise */
+ if (G_VALUE_TYPE (element1) != G_VALUE_TYPE (element2))
+ return G_VALUE_TYPE (element1) < G_VALUE_TYPE (element2) ? -1 : 1;
+ cmp = g_param_values_cmp (aspec->element_spec, element1, element2);
+ if (cmp)
+ return cmp;
+ }
+ return 0;
+ }
+}
+
+static void
+param_object_init (GParamSpec *pspec)
+{
+ /* GParamSpecObject *ospec = G_PARAM_SPEC_OBJECT (pspec); */
+}
+
+static void
+param_object_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_pointer = NULL;
+}
+
+static gboolean
+param_object_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecObject *ospec = G_PARAM_SPEC_OBJECT (pspec);
+ GObject *object = value->data[0].v_pointer;
+ guint changed = 0;
+
+ if (object && !g_value_type_compatible (G_OBJECT_TYPE (object), G_PARAM_SPEC_VALUE_TYPE (ospec)))
+ {
+ g_object_unref (object);
+ value->data[0].v_pointer = NULL;
+ changed++;
+ }
+
+ return changed;
+}
+
+static gint
+param_object_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ guint8 *p1 = value1->data[0].v_pointer;
+ guint8 *p2 = value2->data[0].v_pointer;
+
+ /* not much to compare here, try to at least provide stable lesser/greater result */
+
+ return p1 < p2 ? -1 : p1 > p2;
+}
+
+static void
+param_override_init (GParamSpec *pspec)
+{
+ /* GParamSpecOverride *ospec = G_PARAM_SPEC_OVERRIDE (pspec); */
+}
+
+static void
+param_override_finalize (GParamSpec *pspec)
+{
+ GParamSpecOverride *ospec = G_PARAM_SPEC_OVERRIDE (pspec);
+ GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_OVERRIDE));
+
+ if (ospec->overridden)
+ {
+ g_param_spec_unref (ospec->overridden);
+ ospec->overridden = NULL;
+ }
+
+ parent_class->finalize (pspec);
+}
+
+static void
+param_override_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecOverride *ospec = G_PARAM_SPEC_OVERRIDE (pspec);
+
+ g_param_value_set_default (ospec->overridden, value);
+}
+
+static gboolean
+param_override_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecOverride *ospec = G_PARAM_SPEC_OVERRIDE (pspec);
+
+ return g_param_value_validate (ospec->overridden, value);
+}
+
+static gint
+param_override_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ GParamSpecOverride *ospec = G_PARAM_SPEC_OVERRIDE (pspec);
+
+ return g_param_values_cmp (ospec->overridden, value1, value2);
+}
+
+static void
+param_gtype_init (GParamSpec *pspec)
+{
+}
+
+static void
+param_gtype_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ value->data[0].v_long = G_TYPE_NONE;
+}
+
+static gboolean
+param_gtype_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ GParamSpecGType *tspec = G_PARAM_SPEC_GTYPE (pspec);
+ GType gtype = value->data[0].v_long;
+ guint changed = 0;
+
+ if (tspec->is_a_type != G_TYPE_NONE && !g_type_is_a (gtype, tspec->is_a_type))
+ {
+ value->data[0].v_long = G_TYPE_NONE;
+ changed++;
+ }
+
+ return changed;
+}
+
+static gint
+param_gtype_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ GType p1 = value1->data[0].v_long;
+ GType p2 = value2->data[0].v_long;
+
+ /* not much to compare here, try to at least provide stable lesser/greater result */
+
+ return p1 < p2 ? -1 : p1 > p2;
+}
+
+/* --- type initialization --- */
+GType *g_param_spec_types = NULL;
+
+void
+g_param_spec_types_init (void)
+{
+ const guint n_types = 22;
+ GType type, *spec_types, *spec_types_bound;
+
+ g_param_spec_types = g_new0 (GType, n_types);
+ spec_types = g_param_spec_types;
+ spec_types_bound = g_param_spec_types + n_types;
+
+ /* G_TYPE_PARAM_CHAR
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecChar), /* instance_size */
+ 16, /* n_preallocs */
+ param_char_init, /* instance_init */
+ G_TYPE_CHAR, /* value_type */
+ NULL, /* finalize */
+ param_char_set_default, /* value_set_default */
+ param_char_validate, /* value_validate */
+ param_int_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamChar"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_CHAR);
+ }
+
+ /* G_TYPE_PARAM_UCHAR
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecUChar), /* instance_size */
+ 16, /* n_preallocs */
+ param_uchar_init, /* instance_init */
+ G_TYPE_UCHAR, /* value_type */
+ NULL, /* finalize */
+ param_uchar_set_default, /* value_set_default */
+ param_uchar_validate, /* value_validate */
+ param_uint_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamUChar"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_UCHAR);
+ }
+
+ /* G_TYPE_PARAM_BOOLEAN
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecBoolean), /* instance_size */
+ 16, /* n_preallocs */
+ NULL, /* instance_init */
+ G_TYPE_BOOLEAN, /* value_type */
+ NULL, /* finalize */
+ param_boolean_set_default, /* value_set_default */
+ param_boolean_validate, /* value_validate */
+ param_int_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamBoolean"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_BOOLEAN);
+ }
+
+ /* G_TYPE_PARAM_INT
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecInt), /* instance_size */
+ 16, /* n_preallocs */
+ param_int_init, /* instance_init */
+ G_TYPE_INT, /* value_type */
+ NULL, /* finalize */
+ param_int_set_default, /* value_set_default */
+ param_int_validate, /* value_validate */
+ param_int_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamInt"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_INT);
+ }
+
+ /* G_TYPE_PARAM_UINT
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecUInt), /* instance_size */
+ 16, /* n_preallocs */
+ param_uint_init, /* instance_init */
+ G_TYPE_UINT, /* value_type */
+ NULL, /* finalize */
+ param_uint_set_default, /* value_set_default */
+ param_uint_validate, /* value_validate */
+ param_uint_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamUInt"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_UINT);
+ }
+
+ /* G_TYPE_PARAM_LONG
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecLong), /* instance_size */
+ 16, /* n_preallocs */
+ param_long_init, /* instance_init */
+ G_TYPE_LONG, /* value_type */
+ NULL, /* finalize */
+ param_long_set_default, /* value_set_default */
+ param_long_validate, /* value_validate */
+ param_long_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamLong"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_LONG);
+ }
+
+ /* G_TYPE_PARAM_ULONG
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecULong), /* instance_size */
+ 16, /* n_preallocs */
+ param_ulong_init, /* instance_init */
+ G_TYPE_ULONG, /* value_type */
+ NULL, /* finalize */
+ param_ulong_set_default, /* value_set_default */
+ param_ulong_validate, /* value_validate */
+ param_ulong_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamULong"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_ULONG);
+ }
+
+ /* G_TYPE_PARAM_INT64
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecInt64), /* instance_size */
+ 16, /* n_preallocs */
+ param_int64_init, /* instance_init */
+ G_TYPE_INT64, /* value_type */
+ NULL, /* finalize */
+ param_int64_set_default, /* value_set_default */
+ param_int64_validate, /* value_validate */
+ param_int64_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamInt64"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_INT64);
+ }
+
+ /* G_TYPE_PARAM_UINT64
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecUInt64), /* instance_size */
+ 16, /* n_preallocs */
+ param_uint64_init, /* instance_init */
+ G_TYPE_UINT64, /* value_type */
+ NULL, /* finalize */
+ param_uint64_set_default, /* value_set_default */
+ param_uint64_validate, /* value_validate */
+ param_uint64_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamUInt64"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_UINT64);
+ }
+
+ /* G_TYPE_PARAM_UNICHAR
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecUnichar), /* instance_size */
+ 16, /* n_preallocs */
+ param_unichar_init, /* instance_init */
+ G_TYPE_UINT, /* value_type */
+ NULL, /* finalize */
+ param_unichar_set_default, /* value_set_default */
+ param_unichar_validate, /* value_validate */
+ param_unichar_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamUnichar"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_UNICHAR);
+ }
+
+ /* G_TYPE_PARAM_ENUM
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecEnum), /* instance_size */
+ 16, /* n_preallocs */
+ param_enum_init, /* instance_init */
+ G_TYPE_ENUM, /* value_type */
+ param_enum_finalize, /* finalize */
+ param_enum_set_default, /* value_set_default */
+ param_enum_validate, /* value_validate */
+ param_long_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamEnum"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_ENUM);
+ }
+
+ /* G_TYPE_PARAM_FLAGS
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecFlags), /* instance_size */
+ 16, /* n_preallocs */
+ param_flags_init, /* instance_init */
+ G_TYPE_FLAGS, /* value_type */
+ param_flags_finalize, /* finalize */
+ param_flags_set_default, /* value_set_default */
+ param_flags_validate, /* value_validate */
+ param_ulong_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamFlags"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_FLAGS);
+ }
+
+ /* G_TYPE_PARAM_FLOAT
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecFloat), /* instance_size */
+ 16, /* n_preallocs */
+ param_float_init, /* instance_init */
+ G_TYPE_FLOAT, /* value_type */
+ NULL, /* finalize */
+ param_float_set_default, /* value_set_default */
+ param_float_validate, /* value_validate */
+ param_float_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamFloat"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_FLOAT);
+ }
+
+ /* G_TYPE_PARAM_DOUBLE
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecDouble), /* instance_size */
+ 16, /* n_preallocs */
+ param_double_init, /* instance_init */
+ G_TYPE_DOUBLE, /* value_type */
+ NULL, /* finalize */
+ param_double_set_default, /* value_set_default */
+ param_double_validate, /* value_validate */
+ param_double_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamDouble"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_DOUBLE);
+ }
+
+ /* G_TYPE_PARAM_STRING
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecString), /* instance_size */
+ 16, /* n_preallocs */
+ param_string_init, /* instance_init */
+ G_TYPE_STRING, /* value_type */
+ param_string_finalize, /* finalize */
+ param_string_set_default, /* value_set_default */
+ param_string_validate, /* value_validate */
+ param_string_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamString"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_STRING);
+ }
+
+ /* G_TYPE_PARAM_PARAM
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecParam), /* instance_size */
+ 16, /* n_preallocs */
+ param_param_init, /* instance_init */
+ G_TYPE_PARAM, /* value_type */
+ NULL, /* finalize */
+ param_param_set_default, /* value_set_default */
+ param_param_validate, /* value_validate */
+ param_pointer_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamParam"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_PARAM);
+ }
+
+ /* G_TYPE_PARAM_BOXED
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecBoxed), /* instance_size */
+ 4, /* n_preallocs */
+ param_boxed_init, /* instance_init */
+ G_TYPE_BOXED, /* value_type */
+ NULL, /* finalize */
+ param_boxed_set_default, /* value_set_default */
+ param_boxed_validate, /* value_validate */
+ param_boxed_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamBoxed"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_BOXED);
+ }
+
+ /* G_TYPE_PARAM_POINTER
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecPointer), /* instance_size */
+ 0, /* n_preallocs */
+ param_pointer_init, /* instance_init */
+ G_TYPE_POINTER, /* value_type */
+ NULL, /* finalize */
+ param_pointer_set_default, /* value_set_default */
+ param_pointer_validate, /* value_validate */
+ param_pointer_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamPointer"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_POINTER);
+ }
+
+ /* G_TYPE_PARAM_VALUE_ARRAY
+ */
+ {
+ static /* const */ GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecValueArray), /* instance_size */
+ 0, /* n_preallocs */
+ param_value_array_init, /* instance_init */
+ 0xdeadbeef, /* value_type, assigned further down */
+ param_value_array_finalize, /* finalize */
+ param_value_array_set_default, /* value_set_default */
+ param_value_array_validate, /* value_validate */
+ param_value_array_values_cmp, /* values_cmp */
+ };
+ pspec_info.value_type = G_TYPE_VALUE_ARRAY;
+ type = g_param_type_register_static (g_intern_static_string ("GParamValueArray"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_VALUE_ARRAY);
+ }
+
+ /* G_TYPE_PARAM_OBJECT
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecObject), /* instance_size */
+ 16, /* n_preallocs */
+ param_object_init, /* instance_init */
+ G_TYPE_OBJECT, /* value_type */
+ NULL, /* finalize */
+ param_object_set_default, /* value_set_default */
+ param_object_validate, /* value_validate */
+ param_object_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamObject"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_OBJECT);
+ }
+
+ /* G_TYPE_PARAM_OVERRIDE
+ */
+ {
+ static const GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecOverride), /* instance_size */
+ 16, /* n_preallocs */
+ param_override_init, /* instance_init */
+ G_TYPE_NONE, /* value_type */
+ param_override_finalize, /* finalize */
+ param_override_set_default, /* value_set_default */
+ param_override_validate, /* value_validate */
+ param_override_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamOverride"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_OVERRIDE);
+ }
+
+ /* G_TYPE_PARAM_GTYPE
+ */
+ {
+ GType value_type = G_TYPE_GTYPE;
+ GParamSpecTypeInfo pspec_info = {
+ sizeof (GParamSpecGType), /* instance_size */
+ 0, /* n_preallocs */
+ param_gtype_init, /* instance_init */
+ value_type, /* value_type */
+ NULL, /* finalize */
+ param_gtype_set_default, /* value_set_default */
+ param_gtype_validate, /* value_validate */
+ param_gtype_values_cmp, /* values_cmp */
+ };
+ type = g_param_type_register_static (g_intern_static_string ("GParamGType"), &pspec_info);
+ *spec_types++ = type;
+ g_assert (type == G_TYPE_PARAM_GTYPE);
+ }
+
+ g_assert (spec_types == spec_types_bound);
+}
+
+/* --- GParamSpec initialization --- */
+
+GParamSpec*
+g_param_spec_char (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gint8 minimum,
+ gint8 maximum,
+ gint8 default_value,
+ GParamFlags flags)
+{
+ GParamSpecChar *cspec;
+
+ g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL);
+
+ cspec = g_param_spec_internal (G_TYPE_PARAM_CHAR,
+ name,
+ nick,
+ blurb,
+ flags);
+
+ cspec->minimum = minimum;
+ cspec->maximum = maximum;
+ cspec->default_value = default_value;
+
+ return G_PARAM_SPEC (cspec);
+}
+
+GParamSpec*
+g_param_spec_uchar (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ guint8 minimum,
+ guint8 maximum,
+ guint8 default_value,
+ GParamFlags flags)
+{
+ GParamSpecUChar *uspec;
+
+ g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL);
+
+ uspec = g_param_spec_internal (G_TYPE_PARAM_UCHAR,
+ name,
+ nick,
+ blurb,
+ flags);
+
+ uspec->minimum = minimum;
+ uspec->maximum = maximum;
+ uspec->default_value = default_value;
+
+ return G_PARAM_SPEC (uspec);
+}
+
+GParamSpec*
+g_param_spec_boolean (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gboolean default_value,
+ GParamFlags flags)
+{
+ GParamSpecBoolean *bspec;
+
+ g_return_val_if_fail (default_value == TRUE || default_value == FALSE, NULL);
+
+ bspec = g_param_spec_internal (G_TYPE_PARAM_BOOLEAN,
+ name,
+ nick,
+ blurb,
+ flags);
+
+ bspec->default_value = default_value;
+
+ return G_PARAM_SPEC (bspec);
+}
+
+GParamSpec*
+g_param_spec_int (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gint minimum,
+ gint maximum,
+ gint default_value,
+ GParamFlags flags)
+{
+ GParamSpecInt *ispec;
+
+ g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL);
+
+ ispec = g_param_spec_internal (G_TYPE_PARAM_INT,
+ name,
+ nick,
+ blurb,
+ flags);
+
+ ispec->minimum = minimum;
+ ispec->maximum = maximum;
+ ispec->default_value = default_value;
+
+ return G_PARAM_SPEC (ispec);
+}
+
+GParamSpec*
+g_param_spec_uint (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ guint minimum,
+ guint maximum,
+ guint default_value,
+ GParamFlags flags)
+{
+ GParamSpecUInt *uspec;
+
+ g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL);
+
+ uspec = g_param_spec_internal (G_TYPE_PARAM_UINT,
+ name,
+ nick,
+ blurb,
+ flags);
+
+ uspec->minimum = minimum;
+ uspec->maximum = maximum;
+ uspec->default_value = default_value;
+
+ return G_PARAM_SPEC (uspec);
+}
+
+GParamSpec*
+g_param_spec_long (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ glong minimum,
+ glong maximum,
+ glong default_value,
+ GParamFlags flags)
+{
+ GParamSpecLong *lspec;
+
+ g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL);
+
+ lspec = g_param_spec_internal (G_TYPE_PARAM_LONG,
+ name,
+ nick,
+ blurb,
+ flags);
+
+ lspec->minimum = minimum;
+ lspec->maximum = maximum;
+ lspec->default_value = default_value;
+
+ return G_PARAM_SPEC (lspec);
+}
+
+GParamSpec*
+g_param_spec_ulong (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gulong minimum,
+ gulong maximum,
+ gulong default_value,
+ GParamFlags flags)
+{
+ GParamSpecULong *uspec;
+
+ g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL);
+
+ uspec = g_param_spec_internal (G_TYPE_PARAM_ULONG,
+ name,
+ nick,
+ blurb,
+ flags);
+
+ uspec->minimum = minimum;
+ uspec->maximum = maximum;
+ uspec->default_value = default_value;
+
+ return G_PARAM_SPEC (uspec);
+}
+
+GParamSpec*
+g_param_spec_int64 (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gint64 minimum,
+ gint64 maximum,
+ gint64 default_value,
+ GParamFlags flags)
+{
+ GParamSpecInt64 *lspec;
+
+ g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL);
+
+ lspec = g_param_spec_internal (G_TYPE_PARAM_INT64,
+ name,
+ nick,
+ blurb,
+ flags);
+
+ lspec->minimum = minimum;
+ lspec->maximum = maximum;
+ lspec->default_value = default_value;
+
+ return G_PARAM_SPEC (lspec);
+}
+
+GParamSpec*
+g_param_spec_uint64 (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ guint64 minimum,
+ guint64 maximum,
+ guint64 default_value,
+ GParamFlags flags)
+{
+ GParamSpecUInt64 *uspec;
+
+ g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL);
+
+ uspec = g_param_spec_internal (G_TYPE_PARAM_UINT64,
+ name,
+ nick,
+ blurb,
+ flags);
+
+ uspec->minimum = minimum;
+ uspec->maximum = maximum;
+ uspec->default_value = default_value;
+
+ return G_PARAM_SPEC (uspec);
+}
+
+GParamSpec*
+g_param_spec_unichar (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gunichar default_value,
+ GParamFlags flags)
+{
+ GParamSpecUnichar *uspec;
+
+ uspec = g_param_spec_internal (G_TYPE_PARAM_UNICHAR,
+ name,
+ nick,
+ blurb,
+ flags);
+
+ uspec->default_value = default_value;
+
+ return G_PARAM_SPEC (uspec);
+}
+
+GParamSpec*
+g_param_spec_enum (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GType enum_type,
+ gint default_value,
+ GParamFlags flags)
+{
+ GParamSpecEnum *espec;
+ GEnumClass *enum_class;
+
+ g_return_val_if_fail (G_TYPE_IS_ENUM (enum_type), NULL);
+
+ enum_class = g_type_class_ref (enum_type);
+
+ g_return_val_if_fail (g_enum_get_value (enum_class, default_value) != NULL, NULL);
+
+ espec = g_param_spec_internal (G_TYPE_PARAM_ENUM,
+ name,
+ nick,
+ blurb,
+ flags);
+
+ espec->enum_class = enum_class;
+ espec->default_value = default_value;
+ G_PARAM_SPEC (espec)->value_type = enum_type;
+
+ return G_PARAM_SPEC (espec);
+}
+
+GParamSpec*
+g_param_spec_flags (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GType flags_type,
+ guint default_value,
+ GParamFlags flags)
+{
+ GParamSpecFlags *fspec;
+ GFlagsClass *flags_class;
+
+ g_return_val_if_fail (G_TYPE_IS_FLAGS (flags_type), NULL);
+
+ flags_class = g_type_class_ref (flags_type);
+
+ g_return_val_if_fail ((default_value & flags_class->mask) == default_value, NULL);
+
+ fspec = g_param_spec_internal (G_TYPE_PARAM_FLAGS,
+ name,
+ nick,
+ blurb,
+ flags);
+
+ fspec->flags_class = flags_class;
+ fspec->default_value = default_value;
+ G_PARAM_SPEC (fspec)->value_type = flags_type;
+
+ return G_PARAM_SPEC (fspec);
+}
+
+GParamSpec*
+g_param_spec_float (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gfloat minimum,
+ gfloat maximum,
+ gfloat default_value,
+ GParamFlags flags)
+{
+ GParamSpecFloat *fspec;
+
+ g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL);
+
+ fspec = g_param_spec_internal (G_TYPE_PARAM_FLOAT,
+ name,
+ nick,
+ blurb,
+ flags);
+
+ fspec->minimum = minimum;
+ fspec->maximum = maximum;
+ fspec->default_value = default_value;
+
+ return G_PARAM_SPEC (fspec);
+}
+
+GParamSpec*
+g_param_spec_double (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gdouble minimum,
+ gdouble maximum,
+ gdouble default_value,
+ GParamFlags flags)
+{
+ GParamSpecDouble *dspec;
+
+ g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL);
+
+ dspec = g_param_spec_internal (G_TYPE_PARAM_DOUBLE,
+ name,
+ nick,
+ blurb,
+ flags);
+
+ dspec->minimum = minimum;
+ dspec->maximum = maximum;
+ dspec->default_value = default_value;
+
+ return G_PARAM_SPEC (dspec);
+}
+
+GParamSpec*
+g_param_spec_string (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ const gchar *default_value,
+ GParamFlags flags)
+{
+ GParamSpecString *sspec = g_param_spec_internal (G_TYPE_PARAM_STRING,
+ name,
+ nick,
+ blurb,
+ flags);
+ g_free (sspec->default_value);
+ sspec->default_value = g_strdup (default_value);
+
+ return G_PARAM_SPEC (sspec);
+}
+
+GParamSpec*
+g_param_spec_param (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GType param_type,
+ GParamFlags flags)
+{
+ GParamSpecParam *pspec;
+
+ g_return_val_if_fail (G_TYPE_IS_PARAM (param_type), NULL);
+
+ pspec = g_param_spec_internal (G_TYPE_PARAM_PARAM,
+ name,
+ nick,
+ blurb,
+ flags);
+ G_PARAM_SPEC (pspec)->value_type = param_type;
+
+ return G_PARAM_SPEC (pspec);
+}
+
+GParamSpec*
+g_param_spec_boxed (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GType boxed_type,
+ GParamFlags flags)
+{
+ GParamSpecBoxed *bspec;
+
+ g_return_val_if_fail (G_TYPE_IS_BOXED (boxed_type), NULL);
+ g_return_val_if_fail (G_TYPE_IS_VALUE_TYPE (boxed_type), NULL);
+
+ bspec = g_param_spec_internal (G_TYPE_PARAM_BOXED,
+ name,
+ nick,
+ blurb,
+ flags);
+ G_PARAM_SPEC (bspec)->value_type = boxed_type;
+
+ return G_PARAM_SPEC (bspec);
+}
+
+GParamSpec*
+g_param_spec_pointer (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GParamFlags flags)
+{
+ GParamSpecPointer *pspec;
+
+ pspec = g_param_spec_internal (G_TYPE_PARAM_POINTER,
+ name,
+ nick,
+ blurb,
+ flags);
+ return G_PARAM_SPEC (pspec);
+}
+
+GParamSpec*
+g_param_spec_gtype (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GType is_a_type,
+ GParamFlags flags)
+{
+ GParamSpecGType *tspec;
+
+ tspec = g_param_spec_internal (G_TYPE_PARAM_GTYPE,
+ name,
+ nick,
+ blurb,
+ flags);
+
+ tspec->is_a_type = is_a_type;
+
+ return G_PARAM_SPEC (tspec);
+}
+
+GParamSpec*
+g_param_spec_value_array (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GParamSpec *element_spec,
+ GParamFlags flags)
+{
+ GParamSpecValueArray *aspec;
+
+ if (element_spec)
+ g_return_val_if_fail (G_IS_PARAM_SPEC (element_spec), NULL);
+
+ aspec = g_param_spec_internal (G_TYPE_PARAM_VALUE_ARRAY,
+ name,
+ nick,
+ blurb,
+ flags);
+ if (element_spec)
+ {
+ aspec->element_spec = g_param_spec_ref (element_spec);
+ g_param_spec_sink (element_spec);
+ }
+
+ return G_PARAM_SPEC (aspec);
+}
+
+GParamSpec*
+g_param_spec_object (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GType object_type,
+ GParamFlags flags)
+{
+ GParamSpecObject *ospec;
+
+ g_return_val_if_fail (g_type_is_a (object_type, G_TYPE_OBJECT), NULL);
+
+ ospec = g_param_spec_internal (G_TYPE_PARAM_OBJECT,
+ name,
+ nick,
+ blurb,
+ flags);
+ G_PARAM_SPEC (ospec)->value_type = object_type;
+
+ return G_PARAM_SPEC (ospec);
+}
+
+GParamSpec*
+g_param_spec_override (const gchar *name,
+ GParamSpec *overridden)
+{
+ GParamSpec *pspec;
+
+ g_return_val_if_fail (name != NULL, NULL);
+ g_return_val_if_fail (G_IS_PARAM_SPEC (overridden), NULL);
+
+ /* Dereference further redirections for property that was passed in
+ */
+ while (TRUE)
+ {
+ GParamSpec *indirect = g_param_spec_get_redirect_target (overridden);
+ if (indirect)
+ overridden = indirect;
+ else
+ break;
+ }
+
+ pspec = g_param_spec_internal (G_TYPE_PARAM_OVERRIDE,
+ name, NULL, NULL,
+ overridden->flags);
+
+ pspec->value_type = G_PARAM_SPEC_VALUE_TYPE (overridden);
+ G_PARAM_SPEC_OVERRIDE (pspec)->overridden = g_param_spec_ref (overridden);
+
+ return pspec;
+}
+
+#define __G_PARAMSPECS_C__
+#include "gobjectaliasdef.c"
diff --git a/trunk/gobject/gparamspecs.h b/trunk/gobject/gparamspecs.h
new file mode 100644
index 000000000..b6add1cbf
--- /dev/null
+++ b/trunk/gobject/gparamspecs.h
@@ -0,0 +1,439 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1997-1999, 2000-2001 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.
+ *
+ * gparamspecs.h: GLib default param specs
+ */
+#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
+#error "Only <glib-object.h> can be included directly."
+#endif
+
+#ifndef __G_PARAMSPECS_H__
+#define __G_PARAMSPECS_H__
+
+#include <gobject/gvalue.h>
+#include <gobject/genums.h>
+#include <gobject/gboxed.h>
+#include <gobject/gobject.h>
+
+G_BEGIN_DECLS
+
+/* --- type macros --- */
+#define G_TYPE_PARAM_CHAR (g_param_spec_types[0])
+#define G_IS_PARAM_SPEC_CHAR(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_CHAR))
+#define G_PARAM_SPEC_CHAR(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_CHAR, GParamSpecChar))
+#define G_TYPE_PARAM_UCHAR (g_param_spec_types[1])
+#define G_IS_PARAM_SPEC_UCHAR(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UCHAR))
+#define G_PARAM_SPEC_UCHAR(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UCHAR, GParamSpecUChar))
+#define G_TYPE_PARAM_BOOLEAN (g_param_spec_types[2])
+#define G_IS_PARAM_SPEC_BOOLEAN(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOOLEAN))
+#define G_PARAM_SPEC_BOOLEAN(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_BOOLEAN, GParamSpecBoolean))
+#define G_TYPE_PARAM_INT (g_param_spec_types[3])
+#define G_IS_PARAM_SPEC_INT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT))
+#define G_PARAM_SPEC_INT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_INT, GParamSpecInt))
+#define G_TYPE_PARAM_UINT (g_param_spec_types[4])
+#define G_IS_PARAM_SPEC_UINT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT))
+#define G_PARAM_SPEC_UINT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UINT, GParamSpecUInt))
+#define G_TYPE_PARAM_LONG (g_param_spec_types[5])
+#define G_IS_PARAM_SPEC_LONG(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_LONG))
+#define G_PARAM_SPEC_LONG(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_LONG, GParamSpecLong))
+#define G_TYPE_PARAM_ULONG (g_param_spec_types[6])
+#define G_IS_PARAM_SPEC_ULONG(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ULONG))
+#define G_PARAM_SPEC_ULONG(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_ULONG, GParamSpecULong))
+#define G_TYPE_PARAM_INT64 (g_param_spec_types[7])
+#define G_IS_PARAM_SPEC_INT64(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT64))
+#define G_PARAM_SPEC_INT64(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_INT64, GParamSpecInt64))
+#define G_TYPE_PARAM_UINT64 (g_param_spec_types[8])
+#define G_IS_PARAM_SPEC_UINT64(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT64))
+#define G_PARAM_SPEC_UINT64(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UINT64, GParamSpecUInt64))
+#define G_TYPE_PARAM_UNICHAR (g_param_spec_types[9])
+#define G_PARAM_SPEC_UNICHAR(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UNICHAR, GParamSpecUnichar))
+#define G_IS_PARAM_SPEC_UNICHAR(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UNICHAR))
+#define G_TYPE_PARAM_ENUM (g_param_spec_types[10])
+#define G_IS_PARAM_SPEC_ENUM(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ENUM))
+#define G_PARAM_SPEC_ENUM(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_ENUM, GParamSpecEnum))
+#define G_TYPE_PARAM_FLAGS (g_param_spec_types[11])
+#define G_IS_PARAM_SPEC_FLAGS(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLAGS))
+#define G_PARAM_SPEC_FLAGS(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_FLAGS, GParamSpecFlags))
+#define G_TYPE_PARAM_FLOAT (g_param_spec_types[12])
+#define G_IS_PARAM_SPEC_FLOAT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLOAT))
+#define G_PARAM_SPEC_FLOAT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_FLOAT, GParamSpecFloat))
+#define G_TYPE_PARAM_DOUBLE (g_param_spec_types[13])
+#define G_IS_PARAM_SPEC_DOUBLE(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_DOUBLE))
+#define G_PARAM_SPEC_DOUBLE(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_DOUBLE, GParamSpecDouble))
+#define G_TYPE_PARAM_STRING (g_param_spec_types[14])
+#define G_IS_PARAM_SPEC_STRING(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
+#define G_PARAM_SPEC_STRING(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_STRING, GParamSpecString))
+#define G_TYPE_PARAM_PARAM (g_param_spec_types[15])
+#define G_IS_PARAM_SPEC_PARAM(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_PARAM))
+#define G_PARAM_SPEC_PARAM(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_PARAM, GParamSpecParam))
+#define G_TYPE_PARAM_BOXED (g_param_spec_types[16])
+#define G_IS_PARAM_SPEC_BOXED(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
+#define G_PARAM_SPEC_BOXED(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_BOXED, GParamSpecBoxed))
+#define G_TYPE_PARAM_POINTER (g_param_spec_types[17])
+#define G_IS_PARAM_SPEC_POINTER(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_POINTER))
+#define G_PARAM_SPEC_POINTER(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_POINTER, GParamSpecPointer))
+#define G_TYPE_PARAM_VALUE_ARRAY (g_param_spec_types[18])
+#define G_IS_PARAM_SPEC_VALUE_ARRAY(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_VALUE_ARRAY))
+#define G_PARAM_SPEC_VALUE_ARRAY(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_VALUE_ARRAY, GParamSpecValueArray))
+#define G_TYPE_PARAM_OBJECT (g_param_spec_types[19])
+#define G_IS_PARAM_SPEC_OBJECT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
+#define G_PARAM_SPEC_OBJECT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_OBJECT, GParamSpecObject))
+#define G_TYPE_PARAM_OVERRIDE (g_param_spec_types[20])
+#define G_IS_PARAM_SPEC_OVERRIDE(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OVERRIDE))
+#define G_PARAM_SPEC_OVERRIDE(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_OVERRIDE, GParamSpecOverride))
+#define G_TYPE_PARAM_GTYPE (g_param_spec_types[21])
+#define G_IS_PARAM_SPEC_GTYPE(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_GTYPE))
+#define G_PARAM_SPEC_GTYPE(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_GTYPE, GParamSpecGType))
+
+
+/* --- typedefs & structures --- */
+typedef struct _GParamSpecChar GParamSpecChar;
+typedef struct _GParamSpecUChar GParamSpecUChar;
+typedef struct _GParamSpecBoolean GParamSpecBoolean;
+typedef struct _GParamSpecInt GParamSpecInt;
+typedef struct _GParamSpecUInt GParamSpecUInt;
+typedef struct _GParamSpecLong GParamSpecLong;
+typedef struct _GParamSpecULong GParamSpecULong;
+typedef struct _GParamSpecInt64 GParamSpecInt64;
+typedef struct _GParamSpecUInt64 GParamSpecUInt64;
+typedef struct _GParamSpecUnichar GParamSpecUnichar;
+typedef struct _GParamSpecEnum GParamSpecEnum;
+typedef struct _GParamSpecFlags GParamSpecFlags;
+typedef struct _GParamSpecFloat GParamSpecFloat;
+typedef struct _GParamSpecDouble GParamSpecDouble;
+typedef struct _GParamSpecString GParamSpecString;
+typedef struct _GParamSpecParam GParamSpecParam;
+typedef struct _GParamSpecBoxed GParamSpecBoxed;
+typedef struct _GParamSpecPointer GParamSpecPointer;
+typedef struct _GParamSpecValueArray GParamSpecValueArray;
+typedef struct _GParamSpecObject GParamSpecObject;
+typedef struct _GParamSpecOverride GParamSpecOverride;
+typedef struct _GParamSpecGType GParamSpecGType;
+
+struct _GParamSpecChar
+{
+ GParamSpec parent_instance;
+
+ gint8 minimum;
+ gint8 maximum;
+ gint8 default_value;
+};
+struct _GParamSpecUChar
+{
+ GParamSpec parent_instance;
+
+ guint8 minimum;
+ guint8 maximum;
+ guint8 default_value;
+};
+struct _GParamSpecBoolean
+{
+ GParamSpec parent_instance;
+
+ gboolean default_value;
+};
+struct _GParamSpecInt
+{
+ GParamSpec parent_instance;
+
+ gint minimum;
+ gint maximum;
+ gint default_value;
+};
+struct _GParamSpecUInt
+{
+ GParamSpec parent_instance;
+
+ guint minimum;
+ guint maximum;
+ guint default_value;
+};
+struct _GParamSpecLong
+{
+ GParamSpec parent_instance;
+
+ glong minimum;
+ glong maximum;
+ glong default_value;
+};
+struct _GParamSpecULong
+{
+ GParamSpec parent_instance;
+
+ gulong minimum;
+ gulong maximum;
+ gulong default_value;
+};
+struct _GParamSpecInt64
+{
+ GParamSpec parent_instance;
+
+ gint64 minimum;
+ gint64 maximum;
+ gint64 default_value;
+};
+struct _GParamSpecUInt64
+{
+ GParamSpec parent_instance;
+
+ guint64 minimum;
+ guint64 maximum;
+ guint64 default_value;
+};
+struct _GParamSpecUnichar
+{
+ GParamSpec parent_instance;
+
+ gunichar default_value;
+};
+struct _GParamSpecEnum
+{
+ GParamSpec parent_instance;
+
+ GEnumClass *enum_class;
+ gint default_value;
+};
+struct _GParamSpecFlags
+{
+ GParamSpec parent_instance;
+
+ GFlagsClass *flags_class;
+ guint default_value;
+};
+struct _GParamSpecFloat
+{
+ GParamSpec parent_instance;
+
+ gfloat minimum;
+ gfloat maximum;
+ gfloat default_value;
+ gfloat epsilon;
+};
+struct _GParamSpecDouble
+{
+ GParamSpec parent_instance;
+
+ gdouble minimum;
+ gdouble maximum;
+ gdouble default_value;
+ gdouble epsilon;
+};
+struct _GParamSpecString
+{
+ GParamSpec parent_instance;
+
+ gchar *default_value;
+ gchar *cset_first;
+ gchar *cset_nth;
+ gchar substitutor;
+ guint null_fold_if_empty : 1;
+ guint ensure_non_null : 1;
+};
+struct _GParamSpecParam
+{
+ GParamSpec parent_instance;
+};
+struct _GParamSpecBoxed
+{
+ GParamSpec parent_instance;
+};
+struct _GParamSpecPointer
+{
+ GParamSpec parent_instance;
+};
+struct _GParamSpecValueArray
+{
+ GParamSpec parent_instance;
+ GParamSpec *element_spec;
+ guint fixed_n_elements;
+};
+struct _GParamSpecObject
+{
+ GParamSpec parent_instance;
+};
+struct _GParamSpecOverride
+{
+ /*< private >*/
+ GParamSpec parent_instance;
+ GParamSpec *overridden;
+};
+struct _GParamSpecGType
+{
+ GParamSpec parent_instance;
+ GType is_a_type;
+};
+
+/* --- GParamSpec prototypes --- */
+GParamSpec* g_param_spec_char (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gint8 minimum,
+ gint8 maximum,
+ gint8 default_value,
+ GParamFlags flags);
+GParamSpec* g_param_spec_uchar (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ guint8 minimum,
+ guint8 maximum,
+ guint8 default_value,
+ GParamFlags flags);
+GParamSpec* g_param_spec_boolean (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gboolean default_value,
+ GParamFlags flags);
+GParamSpec* g_param_spec_int (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gint minimum,
+ gint maximum,
+ gint default_value,
+ GParamFlags flags);
+GParamSpec* g_param_spec_uint (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ guint minimum,
+ guint maximum,
+ guint default_value,
+ GParamFlags flags);
+GParamSpec* g_param_spec_long (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ glong minimum,
+ glong maximum,
+ glong default_value,
+ GParamFlags flags);
+GParamSpec* g_param_spec_ulong (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gulong minimum,
+ gulong maximum,
+ gulong default_value,
+ GParamFlags flags);
+GParamSpec* g_param_spec_int64 (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gint64 minimum,
+ gint64 maximum,
+ gint64 default_value,
+ GParamFlags flags);
+GParamSpec* g_param_spec_uint64 (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ guint64 minimum,
+ guint64 maximum,
+ guint64 default_value,
+ GParamFlags flags);
+GParamSpec* g_param_spec_unichar (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gunichar default_value,
+ GParamFlags flags);
+GParamSpec* g_param_spec_enum (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GType enum_type,
+ gint default_value,
+ GParamFlags flags);
+GParamSpec* g_param_spec_flags (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GType flags_type,
+ guint default_value,
+ GParamFlags flags);
+GParamSpec* g_param_spec_float (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gfloat minimum,
+ gfloat maximum,
+ gfloat default_value,
+ GParamFlags flags);
+GParamSpec* g_param_spec_double (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ gdouble minimum,
+ gdouble maximum,
+ gdouble default_value,
+ GParamFlags flags);
+GParamSpec* g_param_spec_string (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ const gchar *default_value,
+ GParamFlags flags);
+GParamSpec* g_param_spec_param (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GType param_type,
+ GParamFlags flags);
+GParamSpec* g_param_spec_boxed (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GType boxed_type,
+ GParamFlags flags);
+GParamSpec* g_param_spec_pointer (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GParamFlags flags);
+GParamSpec* g_param_spec_value_array (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GParamSpec *element_spec,
+ GParamFlags flags);
+GParamSpec* g_param_spec_object (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GType object_type,
+ GParamFlags flags);
+GParamSpec* g_param_spec_override (const gchar *name,
+ GParamSpec *overridden);
+GParamSpec* g_param_spec_gtype (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GType is_a_type,
+ GParamFlags flags);
+
+/* --- internal --- */
+/* We prefix variable declarations so they can
+ * properly get exported in windows dlls.
+ */
+#ifndef GOBJECT_VAR
+# ifdef G_PLATFORM_WIN32
+# ifdef GOBJECT_STATIC_COMPILATION
+# define GOBJECT_VAR extern
+# else /* !GOBJECT_STATIC_COMPILATION */
+# ifdef GOBJECT_COMPILATION
+# ifdef DLL_EXPORT
+# define GOBJECT_VAR __declspec(dllexport)
+# else /* !DLL_EXPORT */
+# define GOBJECT_VAR extern
+# endif /* !DLL_EXPORT */
+# else /* !GOBJECT_COMPILATION */
+# define GOBJECT_VAR extern __declspec(dllimport)
+# endif /* !GOBJECT_COMPILATION */
+# endif /* !GOBJECT_STATIC_COMPILATION */
+# else /* !G_PLATFORM_WIN32 */
+# define GOBJECT_VAR extern
+# endif /* !G_PLATFORM_WIN32 */
+#endif /* GOBJECT_VAR */
+
+GOBJECT_VAR GType *g_param_spec_types;
+
+G_END_DECLS
+
+#endif /* __G_PARAMSPECS_H__ */
diff --git a/trunk/gobject/gsignal.c b/trunk/gobject/gsignal.c
new file mode 100644
index 000000000..c65565ae2
--- /dev/null
+++ b/trunk/gobject/gsignal.c
@@ -0,0 +1,2613 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2000-2001 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.
+ *
+ * this code is based on the original GtkSignal implementation
+ * for the Gtk+ library by Peter Mattis <petm@xcf.berkeley.edu>
+ */
+
+/*
+ * MT safe
+ */
+
+#include <config.h>
+
+#include "gsignal.h"
+
+#include "gbsearcharray.h"
+#include "gvaluecollector.h"
+#include "gvaluetypes.h"
+#include "gboxed.h"
+#include "gobject.h"
+#include "genums.h"
+
+#include "gobjectalias.h"
+
+#include <string.h>
+#include <signal.h>
+
+
+/* pre allocation configurations
+ */
+#define MAX_STACK_VALUES (16)
+
+#define REPORT_BUG "please report occurrence circumstances to gtk-devel-list@gnome.org"
+#ifdef G_ENABLE_DEBUG
+#define IF_DEBUG(debug_type, cond) if ((_g_type_debug_flags & G_TYPE_DEBUG_ ## debug_type) || cond)
+static volatile gpointer g_trace_instance_signals = NULL;
+static volatile gpointer g_trap_instance_signals = NULL;
+#endif /* G_ENABLE_DEBUG */
+
+
+/* --- typedefs --- */
+typedef struct _SignalNode SignalNode;
+typedef struct _SignalKey SignalKey;
+typedef struct _Emission Emission;
+typedef struct _Handler Handler;
+typedef struct _HandlerList HandlerList;
+typedef struct _HandlerMatch HandlerMatch;
+typedef enum
+{
+ EMISSION_STOP,
+ EMISSION_RUN,
+ EMISSION_HOOK,
+ EMISSION_RESTART
+} EmissionState;
+
+
+/* --- prototypes --- */
+static inline guint signal_id_lookup (GQuark quark,
+ GType itype);
+static void signal_destroy_R (SignalNode *signal_node);
+static inline HandlerList* handler_list_ensure (guint signal_id,
+ gpointer instance);
+static inline HandlerList* handler_list_lookup (guint signal_id,
+ gpointer instance);
+static inline Handler* handler_new (gboolean after);
+static void handler_insert (guint signal_id,
+ gpointer instance,
+ Handler *handler);
+static Handler* handler_lookup (gpointer instance,
+ gulong handler_id,
+ guint *signal_id_p);
+static inline HandlerMatch* handler_match_prepend (HandlerMatch *list,
+ Handler *handler,
+ guint signal_id);
+static inline HandlerMatch* handler_match_free1_R (HandlerMatch *node,
+ gpointer instance);
+static HandlerMatch* handlers_find (gpointer instance,
+ GSignalMatchType mask,
+ guint signal_id,
+ GQuark detail,
+ GClosure *closure,
+ gpointer func,
+ gpointer data,
+ gboolean one_and_only);
+static inline void handler_ref (Handler *handler);
+static inline void handler_unref_R (guint signal_id,
+ gpointer instance,
+ Handler *handler);
+static gint handler_lists_cmp (gconstpointer node1,
+ gconstpointer node2);
+static inline void emission_push (Emission **emission_list_p,
+ Emission *emission);
+static inline void emission_pop (Emission **emission_list_p,
+ Emission *emission);
+static inline Emission* emission_find (Emission *emission_list,
+ guint signal_id,
+ GQuark detail,
+ gpointer instance);
+static gint class_closures_cmp (gconstpointer node1,
+ gconstpointer node2);
+static gint signal_key_cmp (gconstpointer node1,
+ gconstpointer node2);
+static gboolean signal_emit_unlocked_R (SignalNode *node,
+ GQuark detail,
+ gpointer instance,
+ GValue *return_value,
+ const GValue *instance_and_params);
+static const gchar * type_debug_name (GType type);
+
+
+/* --- structures --- */
+typedef struct
+{
+ GSignalAccumulator func;
+ gpointer data;
+} SignalAccumulator;
+typedef struct
+{
+ GHook hook;
+ GQuark detail;
+} SignalHook;
+#define SIGNAL_HOOK(hook) ((SignalHook*) (hook))
+
+struct _SignalNode
+{
+ /* permanent portion */
+ guint signal_id;
+ GType itype;
+ const gchar *name;
+ guint destroyed : 1;
+
+ /* reinitializable portion */
+ guint test_class_offset : 12;
+ guint flags : 8;
+ guint n_params : 8;
+ GType *param_types; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */
+ GType return_type; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */
+ GBSearchArray *class_closure_bsa;
+ SignalAccumulator *accumulator;
+ GSignalCMarshaller c_marshaller;
+ GHookList *emission_hooks;
+};
+#define MAX_TEST_CLASS_OFFSET (4096) /* 2^12, 12 bits for test_class_offset */
+#define TEST_CLASS_MAGIC (1) /* indicates NULL class closure, candidate for NOP optimization */
+
+struct _SignalKey
+{
+ GType itype;
+ GQuark quark;
+ guint signal_id;
+};
+
+struct _Emission
+{
+ Emission *next;
+ gpointer instance;
+ GSignalInvocationHint ihint;
+ EmissionState state;
+ GType chain_type;
+};
+
+struct _HandlerList
+{
+ guint signal_id;
+ Handler *handlers;
+ Handler *tail_before; /* normal signal handlers are appended here */
+ Handler *tail_after; /* CONNECT_AFTER handlers are appended here */
+};
+
+struct _Handler
+{
+ gulong sequential_number;
+ Handler *next;
+ Handler *prev;
+ GQuark detail;
+ guint ref_count;
+ guint block_count : 16;
+#define HANDLER_MAX_BLOCK_COUNT (1 << 16)
+ guint after : 1;
+ GClosure *closure;
+};
+struct _HandlerMatch
+{
+ Handler *handler;
+ HandlerMatch *next;
+ guint signal_id;
+};
+
+typedef struct
+{
+ GType instance_type; /* 0 for default closure */
+ GClosure *closure;
+} ClassClosure;
+
+
+/* --- variables --- */
+static GBSearchArray *g_signal_key_bsa = NULL;
+static const GBSearchConfig g_signal_key_bconfig = {
+ sizeof (SignalKey),
+ signal_key_cmp,
+ G_BSEARCH_ARRAY_ALIGN_POWER2,
+};
+static GBSearchConfig g_signal_hlbsa_bconfig = {
+ sizeof (HandlerList),
+ handler_lists_cmp,
+ 0,
+};
+static GBSearchConfig g_class_closure_bconfig = {
+ sizeof (ClassClosure),
+ class_closures_cmp,
+ 0,
+};
+static GHashTable *g_handler_list_bsa_ht = NULL;
+static Emission *g_recursive_emissions = NULL;
+static Emission *g_restart_emissions = NULL;
+static gulong g_handler_sequential_number = 1;
+G_LOCK_DEFINE_STATIC (g_signal_mutex);
+#define SIGNAL_LOCK() G_LOCK (g_signal_mutex)
+#define SIGNAL_UNLOCK() G_UNLOCK (g_signal_mutex)
+
+
+/* --- signal nodes --- */
+static guint g_n_signal_nodes = 0;
+static SignalNode **g_signal_nodes = NULL;
+
+static inline SignalNode*
+LOOKUP_SIGNAL_NODE (register guint signal_id)
+{
+ if (signal_id < g_n_signal_nodes)
+ return g_signal_nodes[signal_id];
+ else
+ return NULL;
+}
+
+
+/* --- functions --- */
+static inline guint
+signal_id_lookup (GQuark quark,
+ GType itype)
+{
+ GType *ifaces, type = itype;
+ SignalKey key;
+ guint n_ifaces;
+
+ key.quark = quark;
+
+ /* try looking up signals for this type and its ancestors */
+ do
+ {
+ SignalKey *signal_key;
+
+ key.itype = type;
+ signal_key = g_bsearch_array_lookup (g_signal_key_bsa, &g_signal_key_bconfig, &key);
+
+ if (signal_key)
+ return signal_key->signal_id;
+
+ type = g_type_parent (type);
+ }
+ while (type);
+
+ /* no luck, try interfaces it exports */
+ ifaces = g_type_interfaces (itype, &n_ifaces);
+ while (n_ifaces--)
+ {
+ SignalKey *signal_key;
+
+ key.itype = ifaces[n_ifaces];
+ signal_key = g_bsearch_array_lookup (g_signal_key_bsa, &g_signal_key_bconfig, &key);
+
+ if (signal_key)
+ {
+ g_free (ifaces);
+ return signal_key->signal_id;
+ }
+ }
+ g_free (ifaces);
+
+ return 0;
+}
+
+static gint
+class_closures_cmp (gconstpointer node1,
+ gconstpointer node2)
+{
+ const ClassClosure *c1 = node1, *c2 = node2;
+
+ return G_BSEARCH_ARRAY_CMP (c1->instance_type, c2->instance_type);
+}
+
+static gint
+handler_lists_cmp (gconstpointer node1,
+ gconstpointer node2)
+{
+ const HandlerList *hlist1 = node1, *hlist2 = node2;
+
+ return G_BSEARCH_ARRAY_CMP (hlist1->signal_id, hlist2->signal_id);
+}
+
+static inline HandlerList*
+handler_list_ensure (guint signal_id,
+ gpointer instance)
+{
+ GBSearchArray *hlbsa = g_hash_table_lookup (g_handler_list_bsa_ht, instance);
+ HandlerList key;
+
+ key.signal_id = signal_id;
+ key.handlers = NULL;
+ key.tail_before = NULL;
+ key.tail_after = NULL;
+ if (!hlbsa)
+ {
+ hlbsa = g_bsearch_array_create (&g_signal_hlbsa_bconfig);
+ hlbsa = g_bsearch_array_insert (hlbsa, &g_signal_hlbsa_bconfig, &key);
+ g_hash_table_insert (g_handler_list_bsa_ht, instance, hlbsa);
+ }
+ else
+ {
+ GBSearchArray *o = hlbsa;
+
+ hlbsa = g_bsearch_array_insert (o, &g_signal_hlbsa_bconfig, &key);
+ if (hlbsa != o)
+ g_hash_table_insert (g_handler_list_bsa_ht, instance, hlbsa);
+ }
+ return g_bsearch_array_lookup (hlbsa, &g_signal_hlbsa_bconfig, &key);
+}
+
+static inline HandlerList*
+handler_list_lookup (guint signal_id,
+ gpointer instance)
+{
+ GBSearchArray *hlbsa = g_hash_table_lookup (g_handler_list_bsa_ht, instance);
+ HandlerList key;
+
+ key.signal_id = signal_id;
+
+ return hlbsa ? g_bsearch_array_lookup (hlbsa, &g_signal_hlbsa_bconfig, &key) : NULL;
+}
+
+static Handler*
+handler_lookup (gpointer instance,
+ gulong handler_id,
+ guint *signal_id_p)
+{
+ GBSearchArray *hlbsa = g_hash_table_lookup (g_handler_list_bsa_ht, instance);
+
+ if (hlbsa)
+ {
+ guint i;
+
+ for (i = 0; i < hlbsa->n_nodes; i++)
+ {
+ HandlerList *hlist = g_bsearch_array_get_nth (hlbsa, &g_signal_hlbsa_bconfig, i);
+ Handler *handler;
+
+ for (handler = hlist->handlers; handler; handler = handler->next)
+ if (handler->sequential_number == handler_id)
+ {
+ if (signal_id_p)
+ *signal_id_p = hlist->signal_id;
+
+ return handler;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+static inline HandlerMatch*
+handler_match_prepend (HandlerMatch *list,
+ Handler *handler,
+ guint signal_id)
+{
+ HandlerMatch *node;
+
+ node = g_slice_new (HandlerMatch);
+ node->handler = handler;
+ node->next = list;
+ node->signal_id = signal_id;
+ handler_ref (handler);
+
+ return node;
+}
+static inline HandlerMatch*
+handler_match_free1_R (HandlerMatch *node,
+ gpointer instance)
+{
+ HandlerMatch *next = node->next;
+
+ handler_unref_R (node->signal_id, instance, node->handler);
+ g_slice_free (HandlerMatch, node);
+
+ return next;
+}
+
+static HandlerMatch*
+handlers_find (gpointer instance,
+ GSignalMatchType mask,
+ guint signal_id,
+ GQuark detail,
+ GClosure *closure,
+ gpointer func,
+ gpointer data,
+ gboolean one_and_only)
+{
+ HandlerMatch *mlist = NULL;
+
+ if (mask & G_SIGNAL_MATCH_ID)
+ {
+ HandlerList *hlist = handler_list_lookup (signal_id, instance);
+ Handler *handler;
+ SignalNode *node = NULL;
+
+ if (mask & G_SIGNAL_MATCH_FUNC)
+ {
+ node = LOOKUP_SIGNAL_NODE (signal_id);
+ if (!node || !node->c_marshaller)
+ return NULL;
+ }
+
+ mask = ~mask;
+ for (handler = hlist ? hlist->handlers : NULL; handler; handler = handler->next)
+ if (handler->sequential_number &&
+ ((mask & G_SIGNAL_MATCH_DETAIL) || handler->detail == detail) &&
+ ((mask & G_SIGNAL_MATCH_CLOSURE) || handler->closure == closure) &&
+ ((mask & G_SIGNAL_MATCH_DATA) || handler->closure->data == data) &&
+ ((mask & G_SIGNAL_MATCH_UNBLOCKED) || handler->block_count == 0) &&
+ ((mask & G_SIGNAL_MATCH_FUNC) || (handler->closure->marshal == node->c_marshaller &&
+ handler->closure->meta_marshal == 0 &&
+ ((GCClosure*) handler->closure)->callback == func)))
+ {
+ mlist = handler_match_prepend (mlist, handler, signal_id);
+ if (one_and_only)
+ return mlist;
+ }
+ }
+ else
+ {
+ GBSearchArray *hlbsa = g_hash_table_lookup (g_handler_list_bsa_ht, instance);
+
+ mask = ~mask;
+ if (hlbsa)
+ {
+ guint i;
+
+ for (i = 0; i < hlbsa->n_nodes; i++)
+ {
+ HandlerList *hlist = g_bsearch_array_get_nth (hlbsa, &g_signal_hlbsa_bconfig, i);
+ SignalNode *node = NULL;
+ Handler *handler;
+
+ if (!(mask & G_SIGNAL_MATCH_FUNC))
+ {
+ node = LOOKUP_SIGNAL_NODE (hlist->signal_id);
+ if (!node->c_marshaller)
+ continue;
+ }
+
+ for (handler = hlist->handlers; handler; handler = handler->next)
+ if (handler->sequential_number &&
+ ((mask & G_SIGNAL_MATCH_DETAIL) || handler->detail == detail) &&
+ ((mask & G_SIGNAL_MATCH_CLOSURE) || handler->closure == closure) &&
+ ((mask & G_SIGNAL_MATCH_DATA) || handler->closure->data == data) &&
+ ((mask & G_SIGNAL_MATCH_UNBLOCKED) || handler->block_count == 0) &&
+ ((mask & G_SIGNAL_MATCH_FUNC) || (handler->closure->marshal == node->c_marshaller &&
+ handler->closure->meta_marshal == 0 &&
+ ((GCClosure*) handler->closure)->callback == func)))
+ {
+ mlist = handler_match_prepend (mlist, handler, hlist->signal_id);
+ if (one_and_only)
+ return mlist;
+ }
+ }
+ }
+ }
+
+ return mlist;
+}
+
+static inline Handler*
+handler_new (gboolean after)
+{
+ Handler *handler = g_slice_new (Handler);
+#ifndef G_DISABLE_CHECKS
+ if (g_handler_sequential_number < 1)
+ g_error (G_STRLOC ": handler id overflow, %s", REPORT_BUG);
+#endif
+
+ handler->sequential_number = g_handler_sequential_number++;
+ handler->prev = NULL;
+ handler->next = NULL;
+ handler->detail = 0;
+ handler->ref_count = 1;
+ handler->block_count = 0;
+ handler->after = after != FALSE;
+ handler->closure = NULL;
+
+ return handler;
+}
+
+static inline void
+handler_ref (Handler *handler)
+{
+ g_return_if_fail (handler->ref_count > 0);
+
+ g_atomic_int_inc (&handler->ref_count);
+}
+
+static inline void
+handler_unref_R (guint signal_id,
+ gpointer instance,
+ Handler *handler)
+{
+ gboolean is_zero;
+
+ g_return_if_fail (handler->ref_count > 0);
+
+ is_zero = g_atomic_int_dec_and_test (&handler->ref_count);
+
+ if (G_UNLIKELY (is_zero))
+ {
+ HandlerList *hlist = NULL;
+
+ if (handler->next)
+ handler->next->prev = handler->prev;
+ if (handler->prev) /* watch out for g_signal_handlers_destroy()! */
+ handler->prev->next = handler->next;
+ else
+ {
+ hlist = handler_list_lookup (signal_id, instance);
+ hlist->handlers = handler->next;
+ }
+
+ if (instance)
+ {
+ /* check if we are removing the handler pointed to by tail_before */
+ if (!handler->after && (!handler->next || handler->next->after))
+ {
+ if (!hlist)
+ hlist = handler_list_lookup (signal_id, instance);
+ if (hlist)
+ {
+ g_assert (hlist->tail_before == handler); /* paranoid */
+ hlist->tail_before = handler->prev;
+ }
+ }
+
+ /* check if we are removing the handler pointed to by tail_after */
+ if (!handler->next)
+ {
+ if (!hlist)
+ hlist = handler_list_lookup (signal_id, instance);
+ if (hlist)
+ {
+ g_assert (hlist->tail_after == handler); /* paranoid */
+ hlist->tail_after = handler->prev;
+ }
+ }
+ }
+
+ SIGNAL_UNLOCK ();
+ g_closure_unref (handler->closure);
+ SIGNAL_LOCK ();
+ g_slice_free (Handler, handler);
+ }
+}
+
+static void
+handler_insert (guint signal_id,
+ gpointer instance,
+ Handler *handler)
+{
+ HandlerList *hlist;
+
+ g_assert (handler->prev == NULL && handler->next == NULL); /* paranoid */
+
+ hlist = handler_list_ensure (signal_id, instance);
+ if (!hlist->handlers)
+ {
+ hlist->handlers = handler;
+ if (!handler->after)
+ hlist->tail_before = handler;
+ }
+ else if (handler->after)
+ {
+ handler->prev = hlist->tail_after;
+ hlist->tail_after->next = handler;
+ }
+ else
+ {
+ if (hlist->tail_before)
+ {
+ handler->next = hlist->tail_before->next;
+ if (handler->next)
+ handler->next->prev = handler;
+ handler->prev = hlist->tail_before;
+ hlist->tail_before->next = handler;
+ }
+ else /* insert !after handler into a list of only after handlers */
+ {
+ handler->next = hlist->handlers;
+ if (handler->next)
+ handler->next->prev = handler;
+ hlist->handlers = handler;
+ }
+ hlist->tail_before = handler;
+ }
+
+ if (!handler->next)
+ hlist->tail_after = handler;
+}
+
+static inline void
+emission_push (Emission **emission_list_p,
+ Emission *emission)
+{
+ emission->next = *emission_list_p;
+ *emission_list_p = emission;
+}
+
+static inline void
+emission_pop (Emission **emission_list_p,
+ Emission *emission)
+{
+ Emission *node, *last = NULL;
+
+ for (node = *emission_list_p; node; last = node, node = last->next)
+ if (node == emission)
+ {
+ if (last)
+ last->next = node->next;
+ else
+ *emission_list_p = node->next;
+ return;
+ }
+ g_assert_not_reached ();
+}
+
+static inline Emission*
+emission_find (Emission *emission_list,
+ guint signal_id,
+ GQuark detail,
+ gpointer instance)
+{
+ Emission *emission;
+
+ for (emission = emission_list; emission; emission = emission->next)
+ if (emission->instance == instance &&
+ emission->ihint.signal_id == signal_id &&
+ emission->ihint.detail == detail)
+ return emission;
+ return NULL;
+}
+
+static inline Emission*
+emission_find_innermost (gpointer instance)
+{
+ Emission *emission, *s = NULL, *c = NULL;
+
+ for (emission = g_restart_emissions; emission; emission = emission->next)
+ if (emission->instance == instance)
+ {
+ s = emission;
+ break;
+ }
+ for (emission = g_recursive_emissions; emission; emission = emission->next)
+ if (emission->instance == instance)
+ {
+ c = emission;
+ break;
+ }
+ if (!s)
+ return c;
+ else if (!c)
+ return s;
+ else
+ return G_HAVE_GROWING_STACK ? MAX (c, s) : MIN (c, s);
+}
+
+static gint
+signal_key_cmp (gconstpointer node1,
+ gconstpointer node2)
+{
+ const SignalKey *key1 = node1, *key2 = node2;
+
+ if (key1->itype == key2->itype)
+ return G_BSEARCH_ARRAY_CMP (key1->quark, key2->quark);
+ else
+ return G_BSEARCH_ARRAY_CMP (key1->itype, key2->itype);
+}
+
+void
+g_signal_init (void)
+{
+ SIGNAL_LOCK ();
+ if (!g_n_signal_nodes)
+ {
+ /* setup handler list binary searchable array hash table (in german, that'd be one word ;) */
+ g_handler_list_bsa_ht = g_hash_table_new (g_direct_hash, NULL);
+ g_signal_key_bsa = g_bsearch_array_create (&g_signal_key_bconfig);
+
+ /* invalid (0) signal_id */
+ g_n_signal_nodes = 1;
+ g_signal_nodes = g_renew (SignalNode*, g_signal_nodes, g_n_signal_nodes);
+ g_signal_nodes[0] = NULL;
+ }
+ SIGNAL_UNLOCK ();
+}
+
+void
+_g_signals_destroy (GType itype)
+{
+ guint i;
+
+ SIGNAL_LOCK ();
+ for (i = 1; i < g_n_signal_nodes; i++)
+ {
+ SignalNode *node = g_signal_nodes[i];
+
+ if (node->itype == itype)
+ {
+ if (node->destroyed)
+ g_warning (G_STRLOC ": signal \"%s\" of type `%s' already destroyed",
+ node->name,
+ type_debug_name (node->itype));
+ else
+ signal_destroy_R (node);
+ }
+ }
+ SIGNAL_UNLOCK ();
+}
+
+void
+g_signal_stop_emission (gpointer instance,
+ guint signal_id,
+ GQuark detail)
+{
+ SignalNode *node;
+
+ g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
+ g_return_if_fail (signal_id > 0);
+
+ SIGNAL_LOCK ();
+ node = LOOKUP_SIGNAL_NODE (signal_id);
+ if (node && detail && !(node->flags & G_SIGNAL_DETAILED))
+ {
+ g_warning ("%s: signal id `%u' does not support detail (%u)", G_STRLOC, signal_id, detail);
+ SIGNAL_UNLOCK ();
+ return;
+ }
+ if (node && g_type_is_a (G_TYPE_FROM_INSTANCE (instance), node->itype))
+ {
+ Emission *emission_list = node->flags & G_SIGNAL_NO_RECURSE ? g_restart_emissions : g_recursive_emissions;
+ Emission *emission = emission_find (emission_list, signal_id, detail, instance);
+
+ if (emission)
+ {
+ if (emission->state == EMISSION_HOOK)
+ g_warning (G_STRLOC ": emission of signal \"%s\" for instance `%p' cannot be stopped from emission hook",
+ node->name, instance);
+ else if (emission->state == EMISSION_RUN)
+ emission->state = EMISSION_STOP;
+ }
+ else
+ g_warning (G_STRLOC ": no emission of signal \"%s\" to stop for instance `%p'",
+ node->name, instance);
+ }
+ else
+ g_warning ("%s: signal id `%u' is invalid for instance `%p'", G_STRLOC, signal_id, instance);
+ SIGNAL_UNLOCK ();
+}
+
+static void
+signal_finalize_hook (GHookList *hook_list,
+ GHook *hook)
+{
+ GDestroyNotify destroy = hook->destroy;
+
+ if (destroy)
+ {
+ hook->destroy = NULL;
+ SIGNAL_UNLOCK ();
+ destroy (hook->data);
+ SIGNAL_LOCK ();
+ }
+}
+
+gulong
+g_signal_add_emission_hook (guint signal_id,
+ GQuark detail,
+ GSignalEmissionHook hook_func,
+ gpointer hook_data,
+ GDestroyNotify data_destroy)
+{
+ static gulong seq_hook_id = 1;
+ SignalNode *node;
+ GHook *hook;
+ SignalHook *signal_hook;
+
+ g_return_val_if_fail (signal_id > 0, 0);
+ g_return_val_if_fail (hook_func != NULL, 0);
+
+ SIGNAL_LOCK ();
+ node = LOOKUP_SIGNAL_NODE (signal_id);
+ if (!node || node->destroyed)
+ {
+ g_warning ("%s: invalid signal id `%u'", G_STRLOC, signal_id);
+ SIGNAL_UNLOCK ();
+ return 0;
+ }
+ if (node->flags & G_SIGNAL_NO_HOOKS)
+ {
+ g_warning ("%s: signal id `%u' does not support emission hooks (G_SIGNAL_NO_HOOKS flag set)", G_STRLOC, signal_id);
+ SIGNAL_UNLOCK ();
+ return 0;
+ }
+ if (detail && !(node->flags & G_SIGNAL_DETAILED))
+ {
+ g_warning ("%s: signal id `%u' does not support detail (%u)", G_STRLOC, signal_id, detail);
+ SIGNAL_UNLOCK ();
+ return 0;
+ }
+ if (!node->emission_hooks)
+ {
+ node->emission_hooks = g_new (GHookList, 1);
+ g_hook_list_init (node->emission_hooks, sizeof (SignalHook));
+ node->emission_hooks->finalize_hook = signal_finalize_hook;
+ }
+ hook = g_hook_alloc (node->emission_hooks);
+ hook->data = hook_data;
+ hook->func = (gpointer) hook_func;
+ hook->destroy = data_destroy;
+ signal_hook = SIGNAL_HOOK (hook);
+ signal_hook->detail = detail;
+ node->emission_hooks->seq_id = seq_hook_id;
+ g_hook_append (node->emission_hooks, hook);
+ seq_hook_id = node->emission_hooks->seq_id;
+ SIGNAL_UNLOCK ();
+
+ return hook->hook_id;
+}
+
+void
+g_signal_remove_emission_hook (guint signal_id,
+ gulong hook_id)
+{
+ SignalNode *node;
+
+ g_return_if_fail (signal_id > 0);
+ g_return_if_fail (hook_id > 0);
+
+ SIGNAL_LOCK ();
+ node = LOOKUP_SIGNAL_NODE (signal_id);
+ if (!node || node->destroyed)
+ g_warning ("%s: invalid signal id `%u'", G_STRLOC, signal_id);
+ else if (!node->emission_hooks || !g_hook_destroy (node->emission_hooks, hook_id))
+ g_warning ("%s: signal \"%s\" had no hook (%lu) to remove", G_STRLOC, node->name, hook_id);
+ SIGNAL_UNLOCK ();
+}
+
+static inline guint
+signal_parse_name (const gchar *name,
+ GType itype,
+ GQuark *detail_p,
+ gboolean force_quark)
+{
+ const gchar *colon = strchr (name, ':');
+ guint signal_id;
+
+ if (!colon)
+ {
+ signal_id = signal_id_lookup (g_quark_try_string (name), itype);
+ if (signal_id && detail_p)
+ *detail_p = 0;
+ }
+ else if (colon[1] == ':')
+ {
+ gchar buffer[32];
+ guint l = colon - name;
+
+ if (l < 32)
+ {
+ memcpy (buffer, name, l);
+ buffer[l] = 0;
+ signal_id = signal_id_lookup (g_quark_try_string (buffer), itype);
+ }
+ else
+ {
+ gchar *signal = g_new (gchar, l + 1);
+
+ memcpy (signal, name, l);
+ signal[l] = 0;
+ signal_id = signal_id_lookup (g_quark_try_string (signal), itype);
+ g_free (signal);
+ }
+
+ if (signal_id && detail_p)
+ *detail_p = colon[2] ? (force_quark ? g_quark_from_string : g_quark_try_string) (colon + 2) : 0;
+ }
+ else
+ signal_id = 0;
+ return signal_id;
+}
+
+gboolean
+g_signal_parse_name (const gchar *detailed_signal,
+ GType itype,
+ guint *signal_id_p,
+ GQuark *detail_p,
+ gboolean force_detail_quark)
+{
+ SignalNode *node;
+ GQuark detail = 0;
+ guint signal_id;
+
+ g_return_val_if_fail (detailed_signal != NULL, FALSE);
+ g_return_val_if_fail (G_TYPE_IS_INSTANTIATABLE (itype) || G_TYPE_IS_INTERFACE (itype), FALSE);
+
+ SIGNAL_LOCK ();
+ signal_id = signal_parse_name (detailed_signal, itype, &detail, force_detail_quark);
+ SIGNAL_UNLOCK ();
+
+ node = signal_id ? LOOKUP_SIGNAL_NODE (signal_id) : NULL;
+ if (!node || node->destroyed ||
+ (detail && !(node->flags & G_SIGNAL_DETAILED)))
+ return FALSE;
+
+ if (signal_id_p)
+ *signal_id_p = signal_id;
+ if (detail_p)
+ *detail_p = detail;
+
+ return TRUE;
+}
+
+void
+g_signal_stop_emission_by_name (gpointer instance,
+ const gchar *detailed_signal)
+{
+ guint signal_id;
+ GQuark detail = 0;
+ GType itype;
+
+ g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
+ g_return_if_fail (detailed_signal != NULL);
+
+ SIGNAL_LOCK ();
+ itype = G_TYPE_FROM_INSTANCE (instance);
+ signal_id = signal_parse_name (detailed_signal, itype, &detail, TRUE);
+ if (signal_id)
+ {
+ SignalNode *node = LOOKUP_SIGNAL_NODE (signal_id);
+
+ if (detail && !(node->flags & G_SIGNAL_DETAILED))
+ g_warning ("%s: signal `%s' does not support details", G_STRLOC, detailed_signal);
+ else if (!g_type_is_a (itype, node->itype))
+ g_warning ("%s: signal `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance);
+ else
+ {
+ Emission *emission_list = node->flags & G_SIGNAL_NO_RECURSE ? g_restart_emissions : g_recursive_emissions;
+ Emission *emission = emission_find (emission_list, signal_id, detail, instance);
+
+ if (emission)
+ {
+ if (emission->state == EMISSION_HOOK)
+ g_warning (G_STRLOC ": emission of signal \"%s\" for instance `%p' cannot be stopped from emission hook",
+ node->name, instance);
+ else if (emission->state == EMISSION_RUN)
+ emission->state = EMISSION_STOP;
+ }
+ else
+ g_warning (G_STRLOC ": no emission of signal \"%s\" to stop for instance `%p'",
+ node->name, instance);
+ }
+ }
+ else
+ g_warning ("%s: signal `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance);
+ SIGNAL_UNLOCK ();
+}
+
+guint
+g_signal_lookup (const gchar *name,
+ GType itype)
+{
+ guint signal_id;
+ g_return_val_if_fail (name != NULL, 0);
+ g_return_val_if_fail (G_TYPE_IS_INSTANTIATABLE (itype) || G_TYPE_IS_INTERFACE (itype), 0);
+
+ SIGNAL_LOCK ();
+ signal_id = signal_id_lookup (g_quark_try_string (name), itype);
+ SIGNAL_UNLOCK ();
+ if (!signal_id)
+ {
+ /* give elaborate warnings */
+ if (!g_type_name (itype))
+ g_warning (G_STRLOC ": unable to lookup signal \"%s\" for invalid type id `%lu'",
+ name, itype);
+ else if (!G_TYPE_IS_INSTANTIATABLE (itype))
+ g_warning (G_STRLOC ": unable to lookup signal \"%s\" for non instantiatable type `%s'",
+ name, g_type_name (itype));
+ else if (!g_type_class_peek (itype))
+ g_warning (G_STRLOC ": unable to lookup signal \"%s\" of unloaded type `%s'",
+ name, g_type_name (itype));
+ }
+
+ return signal_id;
+}
+
+guint*
+g_signal_list_ids (GType itype,
+ guint *n_ids)
+{
+ SignalKey *keys;
+ GArray *result;
+ guint n_nodes;
+ guint i;
+
+ g_return_val_if_fail (G_TYPE_IS_INSTANTIATABLE (itype) || G_TYPE_IS_INTERFACE (itype), NULL);
+ g_return_val_if_fail (n_ids != NULL, NULL);
+
+ SIGNAL_LOCK ();
+ keys = g_bsearch_array_get_nth (g_signal_key_bsa, &g_signal_key_bconfig, 0);
+ n_nodes = g_bsearch_array_get_n_nodes (g_signal_key_bsa);
+ result = g_array_new (FALSE, FALSE, sizeof (guint));
+
+ for (i = 0; i < n_nodes; i++)
+ if (keys[i].itype == itype)
+ {
+ const gchar *name = g_quark_to_string (keys[i].quark);
+
+ /* Signal names with "_" in them are aliases to the same
+ * name with "-" instead of "_".
+ */
+ if (!strchr (name, '_'))
+ g_array_append_val (result, keys[i].signal_id);
+ }
+ *n_ids = result->len;
+ SIGNAL_UNLOCK ();
+ if (!n_nodes)
+ {
+ /* give elaborate warnings */
+ if (!g_type_name (itype))
+ g_warning (G_STRLOC ": unable to list signals for invalid type id `%lu'",
+ itype);
+ else if (!G_TYPE_IS_INSTANTIATABLE (itype))
+ g_warning (G_STRLOC ": unable to list signals of non instantiatable type `%s'",
+ g_type_name (itype));
+ else if (!g_type_class_peek (itype))
+ g_warning (G_STRLOC ": unable to list signals of unloaded type `%s'",
+ g_type_name (itype));
+ }
+
+ return (guint*) g_array_free (result, FALSE);
+}
+
+G_CONST_RETURN gchar*
+g_signal_name (guint signal_id)
+{
+ SignalNode *node;
+ const gchar *name;
+
+ SIGNAL_LOCK ();
+ node = LOOKUP_SIGNAL_NODE (signal_id);
+ name = node ? node->name : NULL;
+ SIGNAL_UNLOCK ();
+
+ return (char*) name;
+}
+
+void
+g_signal_query (guint signal_id,
+ GSignalQuery *query)
+{
+ SignalNode *node;
+
+ g_return_if_fail (query != NULL);
+
+ SIGNAL_LOCK ();
+ node = LOOKUP_SIGNAL_NODE (signal_id);
+ if (!node || node->destroyed)
+ query->signal_id = 0;
+ else
+ {
+ query->signal_id = node->signal_id;
+ query->signal_name = node->name;
+ query->itype = node->itype;
+ query->signal_flags = node->flags;
+ query->return_type = node->return_type;
+ query->n_params = node->n_params;
+ query->param_types = node->param_types;
+ }
+ SIGNAL_UNLOCK ();
+}
+
+guint
+g_signal_new (const gchar *signal_name,
+ GType itype,
+ GSignalFlags signal_flags,
+ guint class_offset,
+ GSignalAccumulator accumulator,
+ gpointer accu_data,
+ GSignalCMarshaller c_marshaller,
+ GType return_type,
+ guint n_params,
+ ...)
+{
+ va_list args;
+ guint signal_id;
+
+ g_return_val_if_fail (signal_name != NULL, 0);
+
+ va_start (args, n_params);
+
+ signal_id = g_signal_new_valist (signal_name, itype, signal_flags,
+ class_offset ? g_signal_type_cclosure_new (itype, class_offset) : NULL,
+ accumulator, accu_data, c_marshaller,
+ return_type, n_params, args);
+
+ va_end (args);
+
+ /* optimize NOP emissions with NULL class handlers */
+ if (signal_id && G_TYPE_IS_INSTANTIATABLE (itype) && return_type == G_TYPE_NONE &&
+ class_offset && class_offset < MAX_TEST_CLASS_OFFSET)
+ {
+ SignalNode *node;
+
+ SIGNAL_LOCK ();
+ node = LOOKUP_SIGNAL_NODE (signal_id);
+ node->test_class_offset = class_offset;
+ SIGNAL_UNLOCK ();
+ }
+
+ return signal_id;
+}
+
+static inline ClassClosure*
+signal_find_class_closure (SignalNode *node,
+ GType itype)
+{
+ GBSearchArray *bsa = node->class_closure_bsa;
+ ClassClosure *cc;
+
+ if (bsa)
+ {
+ ClassClosure key;
+
+ /* cc->instance_type is 0 for default closure */
+
+ key.instance_type = itype;
+ cc = g_bsearch_array_lookup (bsa, &g_class_closure_bconfig, &key);
+ while (!cc && key.instance_type)
+ {
+ key.instance_type = g_type_parent (key.instance_type);
+ cc = g_bsearch_array_lookup (bsa, &g_class_closure_bconfig, &key);
+ }
+ }
+ else
+ cc = NULL;
+ return cc;
+}
+
+static inline GClosure*
+signal_lookup_closure (SignalNode *node,
+ GTypeInstance *instance)
+{
+ ClassClosure *cc;
+
+ if (node->class_closure_bsa && g_bsearch_array_get_n_nodes (node->class_closure_bsa) == 1)
+ cc = g_bsearch_array_get_nth (node->class_closure_bsa, &g_class_closure_bconfig, 0);
+ else
+ cc = signal_find_class_closure (node, G_TYPE_FROM_INSTANCE (instance));
+ return cc ? cc->closure : NULL;
+}
+
+static void
+signal_add_class_closure (SignalNode *node,
+ GType itype,
+ GClosure *closure)
+{
+ ClassClosure key;
+
+ /* can't optimize NOP emissions with overridden class closures */
+ node->test_class_offset = 0;
+
+ if (!node->class_closure_bsa)
+ node->class_closure_bsa = g_bsearch_array_create (&g_class_closure_bconfig);
+ key.instance_type = itype;
+ key.closure = g_closure_ref (closure);
+ node->class_closure_bsa = g_bsearch_array_insert (node->class_closure_bsa,
+ &g_class_closure_bconfig,
+ &key);
+ g_closure_sink (closure);
+ if (node->c_marshaller && closure && G_CLOSURE_NEEDS_MARSHAL (closure))
+ g_closure_set_marshal (closure, node->c_marshaller);
+}
+
+guint
+g_signal_newv (const gchar *signal_name,
+ GType itype,
+ GSignalFlags signal_flags,
+ GClosure *class_closure,
+ GSignalAccumulator accumulator,
+ gpointer accu_data,
+ GSignalCMarshaller c_marshaller,
+ GType return_type,
+ guint n_params,
+ GType *param_types)
+{
+ gchar *name;
+ guint signal_id, i;
+ SignalNode *node;
+
+ g_return_val_if_fail (signal_name != NULL, 0);
+ g_return_val_if_fail (G_TYPE_IS_INSTANTIATABLE (itype) || G_TYPE_IS_INTERFACE (itype), 0);
+ if (n_params)
+ g_return_val_if_fail (param_types != NULL, 0);
+ g_return_val_if_fail ((return_type & G_SIGNAL_TYPE_STATIC_SCOPE) == 0, 0);
+ if (return_type == (G_TYPE_NONE & ~G_SIGNAL_TYPE_STATIC_SCOPE))
+ g_return_val_if_fail (accumulator == NULL, 0);
+ if (!accumulator)
+ g_return_val_if_fail (accu_data == NULL, 0);
+
+ name = g_strdup (signal_name);
+ g_strdelimit (name, G_STR_DELIMITERS ":^", '_'); /* FIXME do character checks like for types */
+
+ SIGNAL_LOCK ();
+
+ signal_id = signal_id_lookup (g_quark_try_string (name), itype);
+ node = LOOKUP_SIGNAL_NODE (signal_id);
+ if (node && !node->destroyed)
+ {
+ g_warning (G_STRLOC ": signal \"%s\" already exists in the `%s' %s",
+ name,
+ type_debug_name (node->itype),
+ G_TYPE_IS_INTERFACE (node->itype) ? "interface" : "class ancestry");
+ g_free (name);
+ SIGNAL_UNLOCK ();
+ return 0;
+ }
+ if (node && node->itype != itype)
+ {
+ g_warning (G_STRLOC ": signal \"%s\" for type `%s' was previously created for type `%s'",
+ name,
+ type_debug_name (itype),
+ type_debug_name (node->itype));
+ g_free (name);
+ SIGNAL_UNLOCK ();
+ return 0;
+ }
+ for (i = 0; i < n_params; i++)
+ if (!G_TYPE_IS_VALUE (param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE))
+ {
+ g_warning (G_STRLOC ": parameter %d of type `%s' for signal \"%s::%s\" is not a value type",
+ i + 1, type_debug_name (param_types[i]), type_debug_name (itype), name);
+ g_free (name);
+ SIGNAL_UNLOCK ();
+ return 0;
+ }
+ if (return_type != G_TYPE_NONE && !G_TYPE_IS_VALUE (return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE))
+ {
+ g_warning (G_STRLOC ": return value of type `%s' for signal \"%s::%s\" is not a value type",
+ type_debug_name (return_type), type_debug_name (itype), name);
+ g_free (name);
+ SIGNAL_UNLOCK ();
+ return 0;
+ }
+ if (return_type != G_TYPE_NONE &&
+ (signal_flags & (G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_CLEANUP)) == G_SIGNAL_RUN_FIRST)
+ {
+ g_warning (G_STRLOC ": signal \"%s::%s\" has return type `%s' and is only G_SIGNAL_RUN_FIRST",
+ type_debug_name (itype), name, type_debug_name (return_type));
+ g_free (name);
+ SIGNAL_UNLOCK ();
+ return 0;
+ }
+
+ /* setup permanent portion of signal node */
+ if (!node)
+ {
+ SignalKey key;
+
+ signal_id = g_n_signal_nodes++;
+ node = g_new (SignalNode, 1);
+ node->signal_id = signal_id;
+ g_signal_nodes = g_renew (SignalNode*, g_signal_nodes, g_n_signal_nodes);
+ g_signal_nodes[signal_id] = node;
+ node->itype = itype;
+ node->name = name;
+ key.itype = itype;
+ key.quark = g_quark_from_string (node->name);
+ key.signal_id = signal_id;
+ g_signal_key_bsa = g_bsearch_array_insert (g_signal_key_bsa, &g_signal_key_bconfig, &key);
+ g_strdelimit (name, "_", '-');
+ node->name = g_intern_string (name);
+ key.quark = g_quark_from_string (name);
+ g_signal_key_bsa = g_bsearch_array_insert (g_signal_key_bsa, &g_signal_key_bconfig, &key);
+ }
+ node->destroyed = FALSE;
+ node->test_class_offset = 0;
+
+ /* setup reinitializable portion */
+ node->flags = signal_flags & G_SIGNAL_FLAGS_MASK;
+ node->n_params = n_params;
+ node->param_types = g_memdup (param_types, sizeof (GType) * n_params);
+ node->return_type = return_type;
+ node->class_closure_bsa = NULL;
+ if (accumulator)
+ {
+ node->accumulator = g_new (SignalAccumulator, 1);
+ node->accumulator->func = accumulator;
+ node->accumulator->data = accu_data;
+ }
+ else
+ node->accumulator = NULL;
+ node->c_marshaller = c_marshaller;
+ node->emission_hooks = NULL;
+ if (class_closure)
+ signal_add_class_closure (node, 0, class_closure);
+ else if (G_TYPE_IS_INSTANTIATABLE (itype) && return_type == G_TYPE_NONE)
+ {
+ /* optimize NOP emissions */
+ node->test_class_offset = TEST_CLASS_MAGIC;
+ }
+ SIGNAL_UNLOCK ();
+
+ g_free (name);
+
+ return signal_id;
+}
+
+guint
+g_signal_new_valist (const gchar *signal_name,
+ GType itype,
+ GSignalFlags signal_flags,
+ GClosure *class_closure,
+ GSignalAccumulator accumulator,
+ gpointer accu_data,
+ GSignalCMarshaller c_marshaller,
+ GType return_type,
+ guint n_params,
+ va_list args)
+{
+ GType *param_types;
+ guint i;
+ guint signal_id;
+
+ if (n_params > 0)
+ {
+ param_types = g_new (GType, n_params);
+
+ for (i = 0; i < n_params; i++)
+ param_types[i] = va_arg (args, GType);
+ }
+ else
+ param_types = NULL;
+
+ signal_id = g_signal_newv (signal_name, itype, signal_flags,
+ class_closure, accumulator, accu_data, c_marshaller,
+ return_type, n_params, param_types);
+ g_free (param_types);
+
+ return signal_id;
+}
+
+static void
+signal_destroy_R (SignalNode *signal_node)
+{
+ SignalNode node = *signal_node;
+
+ signal_node->destroyed = TRUE;
+
+ /* reentrancy caution, zero out real contents first */
+ signal_node->test_class_offset = 0;
+ signal_node->n_params = 0;
+ signal_node->param_types = NULL;
+ signal_node->return_type = 0;
+ signal_node->class_closure_bsa = NULL;
+ signal_node->accumulator = NULL;
+ signal_node->c_marshaller = NULL;
+ signal_node->emission_hooks = NULL;
+
+#ifdef G_ENABLE_DEBUG
+ /* check current emissions */
+ {
+ Emission *emission;
+
+ for (emission = (node.flags & G_SIGNAL_NO_RECURSE) ? g_restart_emissions : g_recursive_emissions;
+ emission; emission = emission->next)
+ if (emission->ihint.signal_id == node.signal_id)
+ g_critical (G_STRLOC ": signal \"%s\" being destroyed is currently in emission (instance `%p')",
+ node.name, emission->instance);
+ }
+#endif
+
+ /* free contents that need to
+ */
+ SIGNAL_UNLOCK ();
+ g_free (node.param_types);
+ if (node.class_closure_bsa)
+ {
+ guint i;
+
+ for (i = 0; i < node.class_closure_bsa->n_nodes; i++)
+ {
+ ClassClosure *cc = g_bsearch_array_get_nth (node.class_closure_bsa, &g_class_closure_bconfig, i);
+
+ g_closure_unref (cc->closure);
+ }
+ g_bsearch_array_free (node.class_closure_bsa, &g_class_closure_bconfig);
+ }
+ g_free (node.accumulator);
+ if (node.emission_hooks)
+ {
+ g_hook_list_clear (node.emission_hooks);
+ g_free (node.emission_hooks);
+ }
+ SIGNAL_LOCK ();
+}
+
+void
+g_signal_override_class_closure (guint signal_id,
+ GType instance_type,
+ GClosure *class_closure)
+{
+ SignalNode *node;
+
+ g_return_if_fail (signal_id > 0);
+ g_return_if_fail (class_closure != NULL);
+
+ SIGNAL_LOCK ();
+ node = LOOKUP_SIGNAL_NODE (signal_id);
+ if (!g_type_is_a (instance_type, node->itype))
+ g_warning ("%s: type `%s' cannot be overridden for signal id `%u'", G_STRLOC, type_debug_name (instance_type), signal_id);
+ else
+ {
+ ClassClosure *cc = signal_find_class_closure (node, instance_type);
+
+ if (cc && cc->instance_type == instance_type)
+ g_warning ("%s: type `%s' is already overridden for signal id `%u'", G_STRLOC, type_debug_name (instance_type), signal_id);
+ else
+ signal_add_class_closure (node, instance_type, class_closure);
+ }
+ SIGNAL_UNLOCK ();
+}
+
+void
+g_signal_chain_from_overridden (const GValue *instance_and_params,
+ GValue *return_value)
+{
+ GType chain_type = 0, restore_type = 0;
+ Emission *emission = NULL;
+ GClosure *closure = NULL;
+ guint n_params = 0;
+ gpointer instance;
+
+ g_return_if_fail (instance_and_params != NULL);
+ instance = g_value_peek_pointer (instance_and_params);
+ g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
+
+ SIGNAL_LOCK ();
+ emission = emission_find_innermost (instance);
+ if (emission)
+ {
+ SignalNode *node = LOOKUP_SIGNAL_NODE (emission->ihint.signal_id);
+
+ g_assert (node != NULL); /* paranoid */
+
+ /* we should probably do the same parameter checks as g_signal_emit() here.
+ */
+ if (emission->chain_type != G_TYPE_NONE)
+ {
+ ClassClosure *cc = signal_find_class_closure (node, emission->chain_type);
+
+ g_assert (cc != NULL); /* closure currently in call stack */
+
+ n_params = node->n_params;
+ restore_type = cc->instance_type;
+ cc = signal_find_class_closure (node, g_type_parent (cc->instance_type));
+ if (cc && cc->instance_type != restore_type)
+ {
+ closure = cc->closure;
+ chain_type = cc->instance_type;
+ }
+ }
+ else
+ g_warning ("%s: signal id `%u' cannot be chained from current emission stage for instance `%p'", G_STRLOC, node->signal_id, instance);
+ }
+ else
+ g_warning ("%s: no signal is currently being emitted for instance `%p'", G_STRLOC, instance);
+ if (closure)
+ {
+ emission->chain_type = chain_type;
+ SIGNAL_UNLOCK ();
+ g_closure_invoke (closure,
+ return_value,
+ n_params + 1,
+ instance_and_params,
+ &emission->ihint);
+ SIGNAL_LOCK ();
+ emission->chain_type = restore_type;
+ }
+ SIGNAL_UNLOCK ();
+}
+
+GSignalInvocationHint*
+g_signal_get_invocation_hint (gpointer instance)
+{
+ Emission *emission = NULL;
+
+ g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), NULL);
+
+ SIGNAL_LOCK ();
+ emission = emission_find_innermost (instance);
+ SIGNAL_UNLOCK ();
+
+ return emission ? &emission->ihint : NULL;
+}
+
+gulong
+g_signal_connect_closure_by_id (gpointer instance,
+ guint signal_id,
+ GQuark detail,
+ GClosure *closure,
+ gboolean after)
+{
+ SignalNode *node;
+ gulong handler_seq_no = 0;
+
+ g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0);
+ g_return_val_if_fail (signal_id > 0, 0);
+ g_return_val_if_fail (closure != NULL, 0);
+
+ SIGNAL_LOCK ();
+ node = LOOKUP_SIGNAL_NODE (signal_id);
+ if (node)
+ {
+ if (detail && !(node->flags & G_SIGNAL_DETAILED))
+ g_warning ("%s: signal id `%u' does not support detail (%u)", G_STRLOC, signal_id, detail);
+ else if (!g_type_is_a (G_TYPE_FROM_INSTANCE (instance), node->itype))
+ g_warning ("%s: signal id `%u' is invalid for instance `%p'", G_STRLOC, signal_id, instance);
+ else
+ {
+ Handler *handler = handler_new (after);
+
+ handler_seq_no = handler->sequential_number;
+ handler->detail = detail;
+ handler->closure = g_closure_ref (closure);
+ g_closure_sink (closure);
+ handler_insert (signal_id, instance, handler);
+ if (node->c_marshaller && G_CLOSURE_NEEDS_MARSHAL (closure))
+ g_closure_set_marshal (closure, node->c_marshaller);
+ }
+ }
+ else
+ g_warning ("%s: signal id `%u' is invalid for instance `%p'", G_STRLOC, signal_id, instance);
+ SIGNAL_UNLOCK ();
+
+ return handler_seq_no;
+}
+
+gulong
+g_signal_connect_closure (gpointer instance,
+ const gchar *detailed_signal,
+ GClosure *closure,
+ gboolean after)
+{
+ guint signal_id;
+ gulong handler_seq_no = 0;
+ GQuark detail = 0;
+ GType itype;
+
+ g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0);
+ g_return_val_if_fail (detailed_signal != NULL, 0);
+ g_return_val_if_fail (closure != NULL, 0);
+
+ SIGNAL_LOCK ();
+ itype = G_TYPE_FROM_INSTANCE (instance);
+ signal_id = signal_parse_name (detailed_signal, itype, &detail, TRUE);
+ if (signal_id)
+ {
+ SignalNode *node = LOOKUP_SIGNAL_NODE (signal_id);
+
+ if (detail && !(node->flags & G_SIGNAL_DETAILED))
+ g_warning ("%s: signal `%s' does not support details", G_STRLOC, detailed_signal);
+ else if (!g_type_is_a (itype, node->itype))
+ g_warning ("%s: signal `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance);
+ else
+ {
+ Handler *handler = handler_new (after);
+
+ handler_seq_no = handler->sequential_number;
+ handler->detail = detail;
+ handler->closure = g_closure_ref (closure);
+ g_closure_sink (closure);
+ handler_insert (signal_id, instance, handler);
+ if (node->c_marshaller && G_CLOSURE_NEEDS_MARSHAL (handler->closure))
+ g_closure_set_marshal (handler->closure, node->c_marshaller);
+ }
+ }
+ else
+ g_warning ("%s: signal `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance);
+ SIGNAL_UNLOCK ();
+
+ return handler_seq_no;
+}
+
+gulong
+g_signal_connect_data (gpointer instance,
+ const gchar *detailed_signal,
+ GCallback c_handler,
+ gpointer data,
+ GClosureNotify destroy_data,
+ GConnectFlags connect_flags)
+{
+ guint signal_id;
+ gulong handler_seq_no = 0;
+ GQuark detail = 0;
+ GType itype;
+ gboolean swapped, after;
+
+ g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0);
+ g_return_val_if_fail (detailed_signal != NULL, 0);
+ g_return_val_if_fail (c_handler != NULL, 0);
+
+ swapped = (connect_flags & G_CONNECT_SWAPPED) != FALSE;
+ after = (connect_flags & G_CONNECT_AFTER) != FALSE;
+
+ SIGNAL_LOCK ();
+ itype = G_TYPE_FROM_INSTANCE (instance);
+ signal_id = signal_parse_name (detailed_signal, itype, &detail, TRUE);
+ if (signal_id)
+ {
+ SignalNode *node = LOOKUP_SIGNAL_NODE (signal_id);
+
+ if (detail && !(node->flags & G_SIGNAL_DETAILED))
+ g_warning ("%s: signal `%s' does not support details", G_STRLOC, detailed_signal);
+ else if (!g_type_is_a (itype, node->itype))
+ g_warning ("%s: signal `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance);
+ else
+ {
+ Handler *handler = handler_new (after);
+
+ handler_seq_no = handler->sequential_number;
+ handler->detail = detail;
+ handler->closure = g_closure_ref ((swapped ? g_cclosure_new_swap : g_cclosure_new) (c_handler, data, destroy_data));
+ g_closure_sink (handler->closure);
+ handler_insert (signal_id, instance, handler);
+ if (node->c_marshaller && G_CLOSURE_NEEDS_MARSHAL (handler->closure))
+ g_closure_set_marshal (handler->closure, node->c_marshaller);
+ }
+ }
+ else
+ g_warning ("%s: signal `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance);
+ SIGNAL_UNLOCK ();
+
+ return handler_seq_no;
+}
+
+void
+g_signal_handler_block (gpointer instance,
+ gulong handler_id)
+{
+ Handler *handler;
+
+ g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
+ g_return_if_fail (handler_id > 0);
+
+ SIGNAL_LOCK ();
+ handler = handler_lookup (instance, handler_id, NULL);
+ if (handler)
+ {
+#ifndef G_DISABLE_CHECKS
+ if (handler->block_count >= HANDLER_MAX_BLOCK_COUNT - 1)
+ g_error (G_STRLOC ": handler block_count overflow, %s", REPORT_BUG);
+#endif
+ handler->block_count += 1;
+ }
+ else
+ g_warning ("%s: instance `%p' has no handler with id `%lu'", G_STRLOC, instance, handler_id);
+ SIGNAL_UNLOCK ();
+}
+
+void
+g_signal_handler_unblock (gpointer instance,
+ gulong handler_id)
+{
+ Handler *handler;
+
+ g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
+ g_return_if_fail (handler_id > 0);
+
+ SIGNAL_LOCK ();
+ handler = handler_lookup (instance, handler_id, NULL);
+ if (handler)
+ {
+ if (handler->block_count)
+ handler->block_count -= 1;
+ else
+ g_warning (G_STRLOC ": handler `%lu' of instance `%p' is not blocked", handler_id, instance);
+ }
+ else
+ g_warning ("%s: instance `%p' has no handler with id `%lu'", G_STRLOC, instance, handler_id);
+ SIGNAL_UNLOCK ();
+}
+
+void
+g_signal_handler_disconnect (gpointer instance,
+ gulong handler_id)
+{
+ Handler *handler;
+ guint signal_id;
+
+ g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
+ g_return_if_fail (handler_id > 0);
+
+ SIGNAL_LOCK ();
+ handler = handler_lookup (instance, handler_id, &signal_id);
+ if (handler)
+ {
+ handler->sequential_number = 0;
+ handler->block_count = 1;
+ handler_unref_R (signal_id, instance, handler);
+ }
+ else
+ g_warning ("%s: instance `%p' has no handler with id `%lu'", G_STRLOC, instance, handler_id);
+ SIGNAL_UNLOCK ();
+}
+
+gboolean
+g_signal_handler_is_connected (gpointer instance,
+ gulong handler_id)
+{
+ Handler *handler;
+ gboolean connected;
+
+ g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), FALSE);
+
+ SIGNAL_LOCK ();
+ handler = handler_lookup (instance, handler_id, NULL);
+ connected = handler != NULL;
+ SIGNAL_UNLOCK ();
+
+ return connected;
+}
+
+void
+g_signal_handlers_destroy (gpointer instance)
+{
+ GBSearchArray *hlbsa;
+
+ g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
+
+ SIGNAL_LOCK ();
+ hlbsa = g_hash_table_lookup (g_handler_list_bsa_ht, instance);
+ if (hlbsa)
+ {
+ guint i;
+
+ /* reentrancy caution, delete instance trace first */
+ g_hash_table_remove (g_handler_list_bsa_ht, instance);
+
+ for (i = 0; i < hlbsa->n_nodes; i++)
+ {
+ HandlerList *hlist = g_bsearch_array_get_nth (hlbsa, &g_signal_hlbsa_bconfig, i);
+ Handler *handler = hlist->handlers;
+
+ while (handler)
+ {
+ Handler *tmp = handler;
+
+ handler = tmp->next;
+ tmp->block_count = 1;
+ /* cruel unlink, this works because _all_ handlers vanish */
+ tmp->next = NULL;
+ tmp->prev = tmp;
+ if (tmp->sequential_number)
+ {
+ tmp->sequential_number = 0;
+ handler_unref_R (0, NULL, tmp);
+ }
+ }
+ }
+ g_bsearch_array_free (hlbsa, &g_signal_hlbsa_bconfig);
+ }
+ SIGNAL_UNLOCK ();
+}
+
+gulong
+g_signal_handler_find (gpointer instance,
+ GSignalMatchType mask,
+ guint signal_id,
+ GQuark detail,
+ GClosure *closure,
+ gpointer func,
+ gpointer data)
+{
+ gulong handler_seq_no = 0;
+
+ g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0);
+ g_return_val_if_fail ((mask & ~G_SIGNAL_MATCH_MASK) == 0, 0);
+
+ if (mask & G_SIGNAL_MATCH_MASK)
+ {
+ HandlerMatch *mlist;
+
+ SIGNAL_LOCK ();
+ mlist = handlers_find (instance, mask, signal_id, detail, closure, func, data, TRUE);
+ if (mlist)
+ {
+ handler_seq_no = mlist->handler->sequential_number;
+ handler_match_free1_R (mlist, instance);
+ }
+ SIGNAL_UNLOCK ();
+ }
+
+ return handler_seq_no;
+}
+
+static guint
+signal_handlers_foreach_matched_R (gpointer instance,
+ GSignalMatchType mask,
+ guint signal_id,
+ GQuark detail,
+ GClosure *closure,
+ gpointer func,
+ gpointer data,
+ void (*callback) (gpointer instance,
+ gulong handler_seq_no))
+{
+ HandlerMatch *mlist;
+ guint n_handlers = 0;
+
+ mlist = handlers_find (instance, mask, signal_id, detail, closure, func, data, FALSE);
+ while (mlist)
+ {
+ n_handlers++;
+ if (mlist->handler->sequential_number)
+ {
+ SIGNAL_UNLOCK ();
+ callback (instance, mlist->handler->sequential_number);
+ SIGNAL_LOCK ();
+ }
+ mlist = handler_match_free1_R (mlist, instance);
+ }
+
+ return n_handlers;
+}
+
+guint
+g_signal_handlers_block_matched (gpointer instance,
+ GSignalMatchType mask,
+ guint signal_id,
+ GQuark detail,
+ GClosure *closure,
+ gpointer func,
+ gpointer data)
+{
+ guint n_handlers = 0;
+
+ g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0);
+ g_return_val_if_fail ((mask & ~G_SIGNAL_MATCH_MASK) == 0, 0);
+
+ if (mask & (G_SIGNAL_MATCH_CLOSURE | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA))
+ {
+ SIGNAL_LOCK ();
+ n_handlers = signal_handlers_foreach_matched_R (instance, mask, signal_id, detail,
+ closure, func, data,
+ g_signal_handler_block);
+ SIGNAL_UNLOCK ();
+ }
+
+ return n_handlers;
+}
+
+guint
+g_signal_handlers_unblock_matched (gpointer instance,
+ GSignalMatchType mask,
+ guint signal_id,
+ GQuark detail,
+ GClosure *closure,
+ gpointer func,
+ gpointer data)
+{
+ guint n_handlers = 0;
+
+ g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0);
+ g_return_val_if_fail ((mask & ~G_SIGNAL_MATCH_MASK) == 0, 0);
+
+ if (mask & (G_SIGNAL_MATCH_CLOSURE | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA))
+ {
+ SIGNAL_LOCK ();
+ n_handlers = signal_handlers_foreach_matched_R (instance, mask, signal_id, detail,
+ closure, func, data,
+ g_signal_handler_unblock);
+ SIGNAL_UNLOCK ();
+ }
+
+ return n_handlers;
+}
+
+guint
+g_signal_handlers_disconnect_matched (gpointer instance,
+ GSignalMatchType mask,
+ guint signal_id,
+ GQuark detail,
+ GClosure *closure,
+ gpointer func,
+ gpointer data)
+{
+ guint n_handlers = 0;
+
+ g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0);
+ g_return_val_if_fail ((mask & ~G_SIGNAL_MATCH_MASK) == 0, 0);
+
+ if (mask & (G_SIGNAL_MATCH_CLOSURE | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA))
+ {
+ SIGNAL_LOCK ();
+ n_handlers = signal_handlers_foreach_matched_R (instance, mask, signal_id, detail,
+ closure, func, data,
+ g_signal_handler_disconnect);
+ SIGNAL_UNLOCK ();
+ }
+
+ return n_handlers;
+}
+
+gboolean
+g_signal_has_handler_pending (gpointer instance,
+ guint signal_id,
+ GQuark detail,
+ gboolean may_be_blocked)
+{
+ HandlerMatch *mlist;
+ gboolean has_pending;
+
+ g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), FALSE);
+ g_return_val_if_fail (signal_id > 0, FALSE);
+
+ SIGNAL_LOCK ();
+ if (detail)
+ {
+ SignalNode *node = LOOKUP_SIGNAL_NODE (signal_id);
+
+ if (!(node->flags & G_SIGNAL_DETAILED))
+ {
+ g_warning ("%s: signal id `%u' does not support detail (%u)", G_STRLOC, signal_id, detail);
+ SIGNAL_UNLOCK ();
+ return FALSE;
+ }
+ }
+ mlist = handlers_find (instance,
+ (G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DETAIL | (may_be_blocked ? 0 : G_SIGNAL_MATCH_UNBLOCKED)),
+ signal_id, detail, NULL, NULL, NULL, TRUE);
+ if (mlist)
+ {
+ has_pending = TRUE;
+ handler_match_free1_R (mlist, instance);
+ }
+ else
+ has_pending = FALSE;
+ SIGNAL_UNLOCK ();
+
+ return has_pending;
+}
+
+static inline gboolean
+signal_check_skip_emission (SignalNode *node,
+ gpointer instance,
+ GQuark detail)
+{
+ HandlerList *hlist;
+
+ /* are we able to check for NULL class handlers? */
+ if (!node->test_class_offset)
+ return FALSE;
+
+ /* are there emission hooks pending? */
+ if (node->emission_hooks && node->emission_hooks->hooks)
+ return FALSE;
+
+ /* is there a non-NULL class handler? */
+ if (node->test_class_offset != TEST_CLASS_MAGIC)
+ {
+ GTypeClass *class = G_TYPE_INSTANCE_GET_CLASS (instance, G_TYPE_FROM_INSTANCE (instance), GTypeClass);
+
+ if (G_STRUCT_MEMBER (gpointer, class, node->test_class_offset))
+ return FALSE;
+ }
+
+ /* are signals being debugged? */
+#ifdef G_ENABLE_DEBUG
+ IF_DEBUG (SIGNALS, g_trace_instance_signals || g_trap_instance_signals)
+ return FALSE;
+#endif /* G_ENABLE_DEBUG */
+
+ /* is this a no-recurse signal already in emission? */
+ if (node->flags & G_SIGNAL_NO_RECURSE &&
+ emission_find (g_restart_emissions, node->signal_id, detail, instance))
+ return FALSE;
+
+ /* do we have pending handlers? */
+ hlist = handler_list_lookup (node->signal_id, instance);
+ if (hlist && hlist->handlers)
+ return FALSE;
+
+ /* none of the above, no emission required */
+ return TRUE;
+}
+
+void
+g_signal_emitv (const GValue *instance_and_params,
+ guint signal_id,
+ GQuark detail,
+ GValue *return_value)
+{
+ gpointer instance;
+ SignalNode *node;
+#ifdef G_ENABLE_DEBUG
+ const GValue *param_values;
+ guint i;
+#endif
+
+ g_return_if_fail (instance_and_params != NULL);
+ instance = g_value_peek_pointer (instance_and_params);
+ g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
+ g_return_if_fail (signal_id > 0);
+
+#ifdef G_ENABLE_DEBUG
+ param_values = instance_and_params + 1;
+#endif
+
+ SIGNAL_LOCK ();
+ node = LOOKUP_SIGNAL_NODE (signal_id);
+ if (!node || !g_type_is_a (G_TYPE_FROM_INSTANCE (instance), node->itype))
+ {
+ g_warning ("%s: signal id `%u' is invalid for instance `%p'", G_STRLOC, signal_id, instance);
+ SIGNAL_UNLOCK ();
+ return;
+ }
+#ifdef G_ENABLE_DEBUG
+ if (detail && !(node->flags & G_SIGNAL_DETAILED))
+ {
+ g_warning ("%s: signal id `%u' does not support detail (%u)", G_STRLOC, signal_id, detail);
+ SIGNAL_UNLOCK ();
+ return;
+ }
+ for (i = 0; i < node->n_params; i++)
+ if (!G_TYPE_CHECK_VALUE_TYPE (param_values + i, node->param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE))
+ {
+ g_critical ("%s: value for `%s' parameter %u for signal \"%s\" is of type `%s'",
+ G_STRLOC,
+ type_debug_name (node->param_types[i]),
+ i,
+ node->name,
+ G_VALUE_TYPE_NAME (param_values + i));
+ SIGNAL_UNLOCK ();
+ return;
+ }
+ if (node->return_type != G_TYPE_NONE)
+ {
+ if (!return_value)
+ {
+ g_critical ("%s: return value `%s' for signal \"%s\" is (NULL)",
+ G_STRLOC,
+ type_debug_name (node->return_type),
+ node->name);
+ SIGNAL_UNLOCK ();
+ return;
+ }
+ else if (!node->accumulator && !G_TYPE_CHECK_VALUE_TYPE (return_value, node->return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE))
+ {
+ g_critical ("%s: return value `%s' for signal \"%s\" is of type `%s'",
+ G_STRLOC,
+ type_debug_name (node->return_type),
+ node->name,
+ G_VALUE_TYPE_NAME (return_value));
+ SIGNAL_UNLOCK ();
+ return;
+ }
+ }
+ else
+ return_value = NULL;
+#endif /* G_ENABLE_DEBUG */
+
+ /* optimize NOP emissions */
+ if (signal_check_skip_emission (node, instance, detail))
+ {
+ /* nothing to do to emit this signal */
+ SIGNAL_UNLOCK ();
+ /* g_printerr ("omitting emission of \"%s\"\n", node->name); */
+ return;
+ }
+
+ SIGNAL_UNLOCK ();
+ signal_emit_unlocked_R (node, detail, instance, return_value, instance_and_params);
+}
+
+void
+g_signal_emit_valist (gpointer instance,
+ guint signal_id,
+ GQuark detail,
+ va_list var_args)
+{
+ GValue *instance_and_params, stack_values[MAX_STACK_VALUES], *free_me = NULL;
+ GType signal_return_type;
+ GValue *param_values;
+ SignalNode *node;
+ guint i, n_params;
+
+ g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
+ g_return_if_fail (signal_id > 0);
+
+ SIGNAL_LOCK ();
+ node = LOOKUP_SIGNAL_NODE (signal_id);
+ if (!node || !g_type_is_a (G_TYPE_FROM_INSTANCE (instance), node->itype))
+ {
+ g_warning ("%s: signal id `%u' is invalid for instance `%p'", G_STRLOC, signal_id, instance);
+ SIGNAL_UNLOCK ();
+ return;
+ }
+#ifndef G_DISABLE_CHECKS
+ if (detail && !(node->flags & G_SIGNAL_DETAILED))
+ {
+ g_warning ("%s: signal id `%u' does not support detail (%u)", G_STRLOC, signal_id, detail);
+ SIGNAL_UNLOCK ();
+ return;
+ }
+#endif /* !G_DISABLE_CHECKS */
+
+ /* optimize NOP emissions */
+ if (signal_check_skip_emission (node, instance, detail))
+ {
+ /* nothing to do to emit this signal */
+ SIGNAL_UNLOCK ();
+ /* g_printerr ("omitting emission of \"%s\"\n", node->name); */
+ return;
+ }
+
+ n_params = node->n_params;
+ signal_return_type = node->return_type;
+ if (node->n_params < MAX_STACK_VALUES)
+ instance_and_params = stack_values;
+ else
+ {
+ free_me = g_new (GValue, node->n_params + 1);
+ instance_and_params = free_me;
+ }
+ param_values = instance_and_params + 1;
+ for (i = 0; i < node->n_params; i++)
+ {
+ gchar *error;
+ GType ptype = node->param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE;
+ gboolean static_scope = node->param_types[i] & G_SIGNAL_TYPE_STATIC_SCOPE;
+
+ param_values[i].g_type = 0;
+ SIGNAL_UNLOCK ();
+ g_value_init (param_values + i, ptype);
+ G_VALUE_COLLECT (param_values + i,
+ var_args,
+ static_scope ? G_VALUE_NOCOPY_CONTENTS : 0,
+ &error);
+ if (error)
+ {
+ g_warning ("%s: %s", G_STRLOC, error);
+ g_free (error);
+
+ /* we purposely leak the value here, it might not be
+ * in a sane state if an error condition occoured
+ */
+ while (i--)
+ g_value_unset (param_values + i);
+
+ g_free (free_me);
+ return;
+ }
+ SIGNAL_LOCK ();
+ }
+ SIGNAL_UNLOCK ();
+ instance_and_params->g_type = 0;
+ g_value_init (instance_and_params, G_TYPE_FROM_INSTANCE (instance));
+ g_value_set_instance (instance_and_params, instance);
+ if (signal_return_type == G_TYPE_NONE)
+ signal_emit_unlocked_R (node, detail, instance, NULL, instance_and_params);
+ else
+ {
+ GValue return_value = { 0, };
+ gchar *error = NULL;
+ GType rtype = signal_return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE;
+ gboolean static_scope = signal_return_type & G_SIGNAL_TYPE_STATIC_SCOPE;
+
+ g_value_init (&return_value, rtype);
+
+ signal_emit_unlocked_R (node, detail, instance, &return_value, instance_and_params);
+
+ G_VALUE_LCOPY (&return_value,
+ var_args,
+ static_scope ? G_VALUE_NOCOPY_CONTENTS : 0,
+ &error);
+ if (!error)
+ g_value_unset (&return_value);
+ else
+ {
+ g_warning ("%s: %s", G_STRLOC, error);
+ g_free (error);
+
+ /* we purposely leak the value here, it might not be
+ * in a sane state if an error condition occured
+ */
+ }
+ }
+ for (i = 0; i < n_params; i++)
+ g_value_unset (param_values + i);
+ g_value_unset (instance_and_params);
+ if (free_me)
+ g_free (free_me);
+}
+
+void
+g_signal_emit (gpointer instance,
+ guint signal_id,
+ GQuark detail,
+ ...)
+{
+ va_list var_args;
+
+ va_start (var_args, detail);
+ g_signal_emit_valist (instance, signal_id, detail, var_args);
+ va_end (var_args);
+}
+
+void
+g_signal_emit_by_name (gpointer instance,
+ const gchar *detailed_signal,
+ ...)
+{
+ GQuark detail = 0;
+ guint signal_id;
+
+ g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
+ g_return_if_fail (detailed_signal != NULL);
+
+ SIGNAL_LOCK ();
+ signal_id = signal_parse_name (detailed_signal, G_TYPE_FROM_INSTANCE (instance), &detail, TRUE);
+ SIGNAL_UNLOCK ();
+
+ if (signal_id)
+ {
+ va_list var_args;
+
+ va_start (var_args, detailed_signal);
+ g_signal_emit_valist (instance, signal_id, detail, var_args);
+ va_end (var_args);
+ }
+ else
+ g_warning ("%s: signal name `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance);
+}
+
+static inline gboolean
+accumulate (GSignalInvocationHint *ihint,
+ GValue *return_accu,
+ GValue *handler_return,
+ SignalAccumulator *accumulator)
+{
+ gboolean continue_emission;
+
+ if (!accumulator)
+ return TRUE;
+
+ continue_emission = accumulator->func (ihint, return_accu, handler_return, accumulator->data);
+ g_value_reset (handler_return);
+
+ return continue_emission;
+}
+
+static gboolean
+signal_emit_unlocked_R (SignalNode *node,
+ GQuark detail,
+ gpointer instance,
+ GValue *emission_return,
+ const GValue *instance_and_params)
+{
+ SignalAccumulator *accumulator;
+ Emission emission;
+ GClosure *class_closure;
+ HandlerList *hlist;
+ Handler *handler_list = NULL;
+ GValue *return_accu, accu = { 0, };
+ guint signal_id;
+ gulong max_sequential_handler_number;
+ gboolean return_value_altered = FALSE;
+
+#ifdef G_ENABLE_DEBUG
+ IF_DEBUG (SIGNALS, g_trace_instance_signals == instance || g_trap_instance_signals == instance)
+ {
+ g_message ("%s::%s(%u) emitted (instance=%p, signal-node=%p)",
+ g_type_name (G_TYPE_FROM_INSTANCE (instance)),
+ node->name, detail,
+ instance, node);
+ if (g_trap_instance_signals == instance)
+ G_BREAKPOINT ();
+ }
+#endif /* G_ENABLE_DEBUG */
+
+ SIGNAL_LOCK ();
+ signal_id = node->signal_id;
+ if (node->flags & G_SIGNAL_NO_RECURSE)
+ {
+ Emission *node = emission_find (g_restart_emissions, signal_id, detail, instance);
+
+ if (node)
+ {
+ node->state = EMISSION_RESTART;
+ SIGNAL_UNLOCK ();
+ return return_value_altered;
+ }
+ }
+ accumulator = node->accumulator;
+ if (accumulator)
+ {
+ SIGNAL_UNLOCK ();
+ g_value_init (&accu, node->return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE);
+ return_accu = &accu;
+ SIGNAL_LOCK ();
+ }
+ else
+ return_accu = emission_return;
+ emission.instance = instance;
+ emission.ihint.signal_id = node->signal_id;
+ emission.ihint.detail = detail;
+ emission.ihint.run_type = 0;
+ emission.state = 0;
+ emission.chain_type = G_TYPE_NONE;
+ emission_push ((node->flags & G_SIGNAL_NO_RECURSE) ? &g_restart_emissions : &g_recursive_emissions, &emission);
+ class_closure = signal_lookup_closure (node, instance);
+
+ EMIT_RESTART:
+
+ if (handler_list)
+ handler_unref_R (signal_id, instance, handler_list);
+ max_sequential_handler_number = g_handler_sequential_number;
+ hlist = handler_list_lookup (signal_id, instance);
+ handler_list = hlist ? hlist->handlers : NULL;
+ if (handler_list)
+ handler_ref (handler_list);
+
+ emission.ihint.run_type = G_SIGNAL_RUN_FIRST;
+
+ if ((node->flags & G_SIGNAL_RUN_FIRST) && class_closure)
+ {
+ emission.state = EMISSION_RUN;
+
+ emission.chain_type = G_TYPE_FROM_INSTANCE (instance);
+ SIGNAL_UNLOCK ();
+ g_closure_invoke (class_closure,
+ return_accu,
+ node->n_params + 1,
+ instance_and_params,
+ &emission.ihint);
+ if (!accumulate (&emission.ihint, emission_return, &accu, accumulator) &&
+ emission.state == EMISSION_RUN)
+ emission.state = EMISSION_STOP;
+ SIGNAL_LOCK ();
+ emission.chain_type = G_TYPE_NONE;
+ return_value_altered = TRUE;
+
+ if (emission.state == EMISSION_STOP)
+ goto EMIT_CLEANUP;
+ else if (emission.state == EMISSION_RESTART)
+ goto EMIT_RESTART;
+ }
+
+ if (node->emission_hooks)
+ {
+ gboolean need_destroy, was_in_call, may_recurse = TRUE;
+ GHook *hook;
+
+ emission.state = EMISSION_HOOK;
+ hook = g_hook_first_valid (node->emission_hooks, may_recurse);
+ while (hook)
+ {
+ SignalHook *signal_hook = SIGNAL_HOOK (hook);
+
+ if (!signal_hook->detail || signal_hook->detail == detail)
+ {
+ GSignalEmissionHook hook_func = (GSignalEmissionHook) hook->func;
+
+ was_in_call = G_HOOK_IN_CALL (hook);
+ hook->flags |= G_HOOK_FLAG_IN_CALL;
+ SIGNAL_UNLOCK ();
+ need_destroy = !hook_func (&emission.ihint, node->n_params + 1, instance_and_params, hook->data);
+ SIGNAL_LOCK ();
+ if (!was_in_call)
+ hook->flags &= ~G_HOOK_FLAG_IN_CALL;
+ if (need_destroy)
+ g_hook_destroy_link (node->emission_hooks, hook);
+ }
+ hook = g_hook_next_valid (node->emission_hooks, hook, may_recurse);
+ }
+
+ if (emission.state == EMISSION_RESTART)
+ goto EMIT_RESTART;
+ }
+
+ if (handler_list)
+ {
+ Handler *handler = handler_list;
+
+ emission.state = EMISSION_RUN;
+ handler_ref (handler);
+ do
+ {
+ Handler *tmp;
+
+ if (handler->after)
+ {
+ handler_unref_R (signal_id, instance, handler_list);
+ handler_list = handler;
+ break;
+ }
+ else if (!handler->block_count && (!handler->detail || handler->detail == detail) &&
+ handler->sequential_number < max_sequential_handler_number)
+ {
+ SIGNAL_UNLOCK ();
+ g_closure_invoke (handler->closure,
+ return_accu,
+ node->n_params + 1,
+ instance_and_params,
+ &emission.ihint);
+ if (!accumulate (&emission.ihint, emission_return, &accu, accumulator) &&
+ emission.state == EMISSION_RUN)
+ emission.state = EMISSION_STOP;
+ SIGNAL_LOCK ();
+ return_value_altered = TRUE;
+
+ tmp = emission.state == EMISSION_RUN ? handler->next : NULL;
+ }
+ else
+ tmp = handler->next;
+
+ if (tmp)
+ handler_ref (tmp);
+ handler_unref_R (signal_id, instance, handler_list);
+ handler_list = handler;
+ handler = tmp;
+ }
+ while (handler);
+
+ if (emission.state == EMISSION_STOP)
+ goto EMIT_CLEANUP;
+ else if (emission.state == EMISSION_RESTART)
+ goto EMIT_RESTART;
+ }
+
+ emission.ihint.run_type = G_SIGNAL_RUN_LAST;
+
+ if ((node->flags & G_SIGNAL_RUN_LAST) && class_closure)
+ {
+ emission.state = EMISSION_RUN;
+
+ emission.chain_type = G_TYPE_FROM_INSTANCE (instance);
+ SIGNAL_UNLOCK ();
+ g_closure_invoke (class_closure,
+ return_accu,
+ node->n_params + 1,
+ instance_and_params,
+ &emission.ihint);
+ if (!accumulate (&emission.ihint, emission_return, &accu, accumulator) &&
+ emission.state == EMISSION_RUN)
+ emission.state = EMISSION_STOP;
+ SIGNAL_LOCK ();
+ emission.chain_type = G_TYPE_NONE;
+ return_value_altered = TRUE;
+
+ if (emission.state == EMISSION_STOP)
+ goto EMIT_CLEANUP;
+ else if (emission.state == EMISSION_RESTART)
+ goto EMIT_RESTART;
+ }
+
+ if (handler_list)
+ {
+ Handler *handler = handler_list;
+
+ emission.state = EMISSION_RUN;
+ handler_ref (handler);
+ do
+ {
+ Handler *tmp;
+
+ if (handler->after && !handler->block_count && (!handler->detail || handler->detail == detail) &&
+ handler->sequential_number < max_sequential_handler_number)
+ {
+ SIGNAL_UNLOCK ();
+ g_closure_invoke (handler->closure,
+ return_accu,
+ node->n_params + 1,
+ instance_and_params,
+ &emission.ihint);
+ if (!accumulate (&emission.ihint, emission_return, &accu, accumulator) &&
+ emission.state == EMISSION_RUN)
+ emission.state = EMISSION_STOP;
+ SIGNAL_LOCK ();
+ return_value_altered = TRUE;
+
+ tmp = emission.state == EMISSION_RUN ? handler->next : NULL;
+ }
+ else
+ tmp = handler->next;
+
+ if (tmp)
+ handler_ref (tmp);
+ handler_unref_R (signal_id, instance, handler);
+ handler = tmp;
+ }
+ while (handler);
+
+ if (emission.state == EMISSION_STOP)
+ goto EMIT_CLEANUP;
+ else if (emission.state == EMISSION_RESTART)
+ goto EMIT_RESTART;
+ }
+
+ EMIT_CLEANUP:
+
+ emission.ihint.run_type = G_SIGNAL_RUN_CLEANUP;
+
+ if ((node->flags & G_SIGNAL_RUN_CLEANUP) && class_closure)
+ {
+ gboolean need_unset = FALSE;
+
+ emission.state = EMISSION_STOP;
+
+ emission.chain_type = G_TYPE_FROM_INSTANCE (instance);
+ SIGNAL_UNLOCK ();
+ if (node->return_type != G_TYPE_NONE && !accumulator)
+ {
+ g_value_init (&accu, node->return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE);
+ need_unset = TRUE;
+ }
+ g_closure_invoke (class_closure,
+ node->return_type != G_TYPE_NONE ? &accu : NULL,
+ node->n_params + 1,
+ instance_and_params,
+ &emission.ihint);
+ if (need_unset)
+ g_value_unset (&accu);
+ SIGNAL_LOCK ();
+ emission.chain_type = G_TYPE_NONE;
+
+ if (emission.state == EMISSION_RESTART)
+ goto EMIT_RESTART;
+ }
+
+ if (handler_list)
+ handler_unref_R (signal_id, instance, handler_list);
+
+ emission_pop ((node->flags & G_SIGNAL_NO_RECURSE) ? &g_restart_emissions : &g_recursive_emissions, &emission);
+ SIGNAL_UNLOCK ();
+ if (accumulator)
+ g_value_unset (&accu);
+
+ return return_value_altered;
+}
+
+static const gchar*
+type_debug_name (GType type)
+{
+ if (type)
+ {
+ const char *name = g_type_name (type & ~G_SIGNAL_TYPE_STATIC_SCOPE);
+ return name ? name : "<unknown>";
+ }
+ else
+ return "<invalid>";
+}
+
+gboolean
+g_signal_accumulator_true_handled (GSignalInvocationHint *ihint,
+ GValue *return_accu,
+ const GValue *handler_return,
+ gpointer dummy)
+{
+ gboolean continue_emission;
+ gboolean signal_handled;
+
+ signal_handled = g_value_get_boolean (handler_return);
+ g_value_set_boolean (return_accu, signal_handled);
+ continue_emission = !signal_handled;
+
+ return continue_emission;
+}
+
+/* --- compile standard marshallers --- */
+#include "gmarshal.c"
+
+#define __G_SIGNAL_C__
+#include "gobjectaliasdef.c"
diff --git a/trunk/gobject/gsignal.h b/trunk/gobject/gsignal.h
new file mode 100644
index 000000000..61345dcba
--- /dev/null
+++ b/trunk/gobject/gsignal.h
@@ -0,0 +1,270 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2000-2001 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.
+ */
+#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
+#error "Only <glib-object.h> can be included directly."
+#endif
+
+#ifndef __G_SIGNAL_H__
+#define __G_SIGNAL_H__
+
+#include <gobject/gclosure.h>
+#include <gobject/gvalue.h>
+#include <gobject/gparam.h>
+#include <gobject/gmarshal.h>
+
+G_BEGIN_DECLS
+
+/* --- typedefs --- */
+typedef struct _GSignalQuery GSignalQuery;
+typedef struct _GSignalInvocationHint GSignalInvocationHint;
+typedef GClosureMarshal GSignalCMarshaller;
+typedef gboolean (*GSignalEmissionHook) (GSignalInvocationHint *ihint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data);
+typedef gboolean (*GSignalAccumulator) (GSignalInvocationHint *ihint,
+ GValue *return_accu,
+ const GValue *handler_return,
+ gpointer data);
+
+
+/* --- run, match and connect types --- */
+typedef enum
+{
+ G_SIGNAL_RUN_FIRST = 1 << 0,
+ G_SIGNAL_RUN_LAST = 1 << 1,
+ G_SIGNAL_RUN_CLEANUP = 1 << 2,
+ G_SIGNAL_NO_RECURSE = 1 << 3,
+ G_SIGNAL_DETAILED = 1 << 4,
+ G_SIGNAL_ACTION = 1 << 5,
+ G_SIGNAL_NO_HOOKS = 1 << 6
+} GSignalFlags;
+#define G_SIGNAL_FLAGS_MASK 0x7f
+typedef enum
+{
+ G_CONNECT_AFTER = 1 << 0,
+ G_CONNECT_SWAPPED = 1 << 1
+} GConnectFlags;
+typedef enum
+{
+ G_SIGNAL_MATCH_ID = 1 << 0,
+ G_SIGNAL_MATCH_DETAIL = 1 << 1,
+ G_SIGNAL_MATCH_CLOSURE = 1 << 2,
+ G_SIGNAL_MATCH_FUNC = 1 << 3,
+ G_SIGNAL_MATCH_DATA = 1 << 4,
+ G_SIGNAL_MATCH_UNBLOCKED = 1 << 5
+} GSignalMatchType;
+#define G_SIGNAL_MATCH_MASK 0x3f
+#define G_SIGNAL_TYPE_STATIC_SCOPE (G_TYPE_FLAG_RESERVED_ID_BIT)
+
+
+/* --- signal information --- */
+struct _GSignalInvocationHint
+{
+ guint signal_id;
+ GQuark detail;
+ GSignalFlags run_type;
+};
+struct _GSignalQuery
+{
+ guint signal_id;
+ const gchar *signal_name;
+ GType itype;
+ GSignalFlags signal_flags;
+ GType return_type; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */
+ guint n_params;
+ const GType *param_types; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */
+};
+
+
+/* --- signals --- */
+guint g_signal_newv (const gchar *signal_name,
+ GType itype,
+ GSignalFlags signal_flags,
+ GClosure *class_closure,
+ GSignalAccumulator accumulator,
+ gpointer accu_data,
+ GSignalCMarshaller c_marshaller,
+ GType return_type,
+ guint n_params,
+ GType *param_types);
+guint g_signal_new_valist (const gchar *signal_name,
+ GType itype,
+ GSignalFlags signal_flags,
+ GClosure *class_closure,
+ GSignalAccumulator accumulator,
+ gpointer accu_data,
+ GSignalCMarshaller c_marshaller,
+ GType return_type,
+ guint n_params,
+ va_list args);
+guint g_signal_new (const gchar *signal_name,
+ GType itype,
+ GSignalFlags signal_flags,
+ guint class_offset,
+ GSignalAccumulator accumulator,
+ gpointer accu_data,
+ GSignalCMarshaller c_marshaller,
+ GType return_type,
+ guint n_params,
+ ...);
+void g_signal_emitv (const GValue *instance_and_params,
+ guint signal_id,
+ GQuark detail,
+ GValue *return_value);
+void g_signal_emit_valist (gpointer instance,
+ guint signal_id,
+ GQuark detail,
+ va_list var_args);
+void g_signal_emit (gpointer instance,
+ guint signal_id,
+ GQuark detail,
+ ...);
+void g_signal_emit_by_name (gpointer instance,
+ const gchar *detailed_signal,
+ ...);
+guint g_signal_lookup (const gchar *name,
+ GType itype);
+G_CONST_RETURN gchar* g_signal_name (guint signal_id);
+void g_signal_query (guint signal_id,
+ GSignalQuery *query);
+guint* g_signal_list_ids (GType itype,
+ guint *n_ids);
+gboolean g_signal_parse_name (const gchar *detailed_signal,
+ GType itype,
+ guint *signal_id_p,
+ GQuark *detail_p,
+ gboolean force_detail_quark);
+GSignalInvocationHint* g_signal_get_invocation_hint (gpointer instance);
+
+
+/* --- signal emissions --- */
+void g_signal_stop_emission (gpointer instance,
+ guint signal_id,
+ GQuark detail);
+void g_signal_stop_emission_by_name (gpointer instance,
+ const gchar *detailed_signal);
+gulong g_signal_add_emission_hook (guint signal_id,
+ GQuark detail,
+ GSignalEmissionHook hook_func,
+ gpointer hook_data,
+ GDestroyNotify data_destroy);
+void g_signal_remove_emission_hook (guint signal_id,
+ gulong hook_id);
+
+
+/* --- signal handlers --- */
+gboolean g_signal_has_handler_pending (gpointer instance,
+ guint signal_id,
+ GQuark detail,
+ gboolean may_be_blocked);
+gulong g_signal_connect_closure_by_id (gpointer instance,
+ guint signal_id,
+ GQuark detail,
+ GClosure *closure,
+ gboolean after);
+gulong g_signal_connect_closure (gpointer instance,
+ const gchar *detailed_signal,
+ GClosure *closure,
+ gboolean after);
+gulong g_signal_connect_data (gpointer instance,
+ const gchar *detailed_signal,
+ GCallback c_handler,
+ gpointer data,
+ GClosureNotify destroy_data,
+ GConnectFlags connect_flags);
+void g_signal_handler_block (gpointer instance,
+ gulong handler_id);
+void g_signal_handler_unblock (gpointer instance,
+ gulong handler_id);
+void g_signal_handler_disconnect (gpointer instance,
+ gulong handler_id);
+gboolean g_signal_handler_is_connected (gpointer instance,
+ gulong handler_id);
+gulong g_signal_handler_find (gpointer instance,
+ GSignalMatchType mask,
+ guint signal_id,
+ GQuark detail,
+ GClosure *closure,
+ gpointer func,
+ gpointer data);
+guint g_signal_handlers_block_matched (gpointer instance,
+ GSignalMatchType mask,
+ guint signal_id,
+ GQuark detail,
+ GClosure *closure,
+ gpointer func,
+ gpointer data);
+guint g_signal_handlers_unblock_matched (gpointer instance,
+ GSignalMatchType mask,
+ guint signal_id,
+ GQuark detail,
+ GClosure *closure,
+ gpointer func,
+ gpointer data);
+guint g_signal_handlers_disconnect_matched (gpointer instance,
+ GSignalMatchType mask,
+ guint signal_id,
+ GQuark detail,
+ GClosure *closure,
+ gpointer func,
+ gpointer data);
+
+
+/* --- chaining for language bindings --- */
+void g_signal_override_class_closure (guint signal_id,
+ GType instance_type,
+ GClosure *class_closure);
+void g_signal_chain_from_overridden (const GValue *instance_and_params,
+ GValue *return_value);
+
+
+/* --- convenience --- */
+#define g_signal_connect(instance, detailed_signal, c_handler, data) \
+ g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
+#define g_signal_connect_after(instance, detailed_signal, c_handler, data) \
+ g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_AFTER)
+#define g_signal_connect_swapped(instance, detailed_signal, c_handler, data) \
+ g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_SWAPPED)
+#define g_signal_handlers_disconnect_by_func(instance, func, data) \
+ g_signal_handlers_disconnect_matched ((instance), \
+ (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \
+ 0, 0, NULL, (func), (data))
+#define g_signal_handlers_block_by_func(instance, func, data) \
+ g_signal_handlers_block_matched ((instance), \
+ (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \
+ 0, 0, NULL, (func), (data))
+#define g_signal_handlers_unblock_by_func(instance, func, data) \
+ g_signal_handlers_unblock_matched ((instance), \
+ (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \
+ 0, 0, NULL, (func), (data))
+
+
+gboolean g_signal_accumulator_true_handled (GSignalInvocationHint *ihint,
+ GValue *return_accu,
+ const GValue *handler_return,
+ gpointer dummy);
+
+/*< private >*/
+void g_signal_handlers_destroy (gpointer instance);
+void _g_signals_destroy (GType itype);
+
+G_END_DECLS
+
+#endif /* __G_SIGNAL_H__ */
diff --git a/trunk/gobject/gsourceclosure.c b/trunk/gobject/gsourceclosure.c
new file mode 100644
index 000000000..8f43afb72
--- /dev/null
+++ b/trunk/gobject/gsourceclosure.c
@@ -0,0 +1,195 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2001 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 "gsourceclosure.h"
+#include "gboxed.h"
+#include "genums.h"
+#include "gmarshal.h"
+#include "gvalue.h"
+#include "gvaluetypes.h"
+#include "gobjectalias.h"
+
+GType
+g_io_channel_get_type (void)
+{
+ static GType our_type = 0;
+
+ if (our_type == 0)
+ our_type = g_boxed_type_register_static ("GIOChannel",
+ (GBoxedCopyFunc) g_io_channel_ref,
+ (GBoxedFreeFunc) g_io_channel_unref);
+
+ return our_type;
+}
+
+GType
+g_io_condition_get_type (void)
+{
+ static GType etype = 0;
+ if (etype == 0)
+ {
+ static const GFlagsValue values[] = {
+ { G_IO_IN, "G_IO_IN", "in" },
+ { G_IO_OUT, "G_IO_OUT", "out" },
+ { G_IO_PRI, "G_IO_PRI", "pri" },
+ { G_IO_ERR, "G_IO_ERR", "err" },
+ { G_IO_HUP, "G_IO_HUP", "hup" },
+ { G_IO_NVAL, "G_IO_NVAL", "nval" },
+ { 0, NULL, NULL }
+ };
+ etype = g_flags_register_static ("GIOCondition", values);
+ }
+ return etype;
+}
+
+/* We need to hand-write this marshaler, since it doesn't have an
+ * instance object.
+ */
+static void
+source_closure_marshal_BOOLEAN__VOID (GClosure *closure,
+ GValue *return_value,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer invocation_hint,
+ gpointer marshal_data)
+{
+ GSourceFunc callback;
+ GCClosure *cc = (GCClosure*) closure;
+ gboolean v_return;
+
+ g_return_if_fail (return_value != NULL);
+ g_return_if_fail (n_param_values == 0);
+
+ callback = (GSourceFunc) (marshal_data ? marshal_data : cc->callback);
+
+ v_return = callback (closure->data);
+
+ g_value_set_boolean (return_value, v_return);
+}
+
+static gboolean
+io_watch_closure_callback (GIOChannel *channel,
+ GIOCondition condition,
+ gpointer data)
+{
+ GClosure *closure = data;
+
+ GValue params[2] = { { 0, }, { 0, } };
+ GValue result_value = { 0, };
+ gboolean result;
+
+ g_value_init (&result_value, G_TYPE_BOOLEAN);
+ g_value_init (&params[0], G_TYPE_IO_CHANNEL);
+ g_value_set_boxed (&params[0], channel);
+
+ g_value_init (&params[1], G_TYPE_IO_CONDITION);
+ g_value_set_flags (&params[1], condition);
+
+ g_closure_invoke (closure, &result_value, 2, params, NULL);
+
+ result = g_value_get_boolean (&result_value);
+ g_value_unset (&result_value);
+ g_value_unset (&params[0]);
+ g_value_unset (&params[1]);
+
+ return result;
+}
+
+static gboolean
+source_closure_callback (gpointer data)
+{
+ GClosure *closure = data;
+ GValue result_value = { 0, };
+ gboolean result;
+
+ g_value_init (&result_value, G_TYPE_BOOLEAN);
+
+ g_closure_invoke (closure, &result_value, 0, NULL, NULL);
+
+ result = g_value_get_boolean (&result_value);
+ g_value_unset (&result_value);
+
+ return result;
+}
+
+static void
+closure_callback_get (gpointer cb_data,
+ GSource *source,
+ GSourceFunc *func,
+ gpointer *data)
+{
+ GSourceFunc closure_callback = source->source_funcs->closure_callback;
+
+ if (!closure_callback)
+ {
+ if (source->source_funcs == &g_io_watch_funcs)
+ closure_callback = (GSourceFunc)io_watch_closure_callback;
+ else if (source->source_funcs == &g_timeout_funcs ||
+ source->source_funcs == &g_idle_funcs)
+ closure_callback = source_closure_callback;
+ }
+
+ *func = closure_callback;
+ *data = cb_data;
+}
+
+static GSourceCallbackFuncs closure_callback_funcs = {
+ (void (*) (gpointer)) g_closure_ref,
+ (void (*) (gpointer)) g_closure_unref,
+ closure_callback_get
+};
+
+void
+g_source_set_closure (GSource *source,
+ GClosure *closure)
+{
+ g_return_if_fail (source != NULL);
+ g_return_if_fail (closure != NULL);
+
+ if (!source->source_funcs->closure_callback &&
+ source->source_funcs != &g_io_watch_funcs &&
+ source->source_funcs != &g_timeout_funcs &&
+ source->source_funcs != &g_idle_funcs)
+ {
+ g_critical (G_STRLOC "closure can not be set on closure without GSourceFuncs::closure_callback\n");
+ return;
+ }
+
+ g_closure_ref (closure);
+ g_closure_sink (closure);
+ g_source_set_callback_indirect (source, closure, &closure_callback_funcs);
+
+ if (G_CLOSURE_NEEDS_MARSHAL (closure))
+ {
+ GClosureMarshal marshal = (GClosureMarshal)source->source_funcs->closure_marshal;
+ if (!marshal)
+ {
+ if (source->source_funcs == &g_idle_funcs ||
+ source->source_funcs == &g_timeout_funcs)
+ marshal = source_closure_marshal_BOOLEAN__VOID;
+ else if (source->source_funcs == &g_io_watch_funcs)
+ marshal = g_cclosure_marshal_BOOLEAN__FLAGS;
+ }
+ if (marshal)
+ g_closure_set_marshal (closure, marshal);
+ }
+}
+
+#define __G_SOURCECLOSURE_C__
+#include "gobjectaliasdef.c"
diff --git a/trunk/gobject/gsourceclosure.h b/trunk/gobject/gsourceclosure.h
new file mode 100644
index 000000000..e371235a8
--- /dev/null
+++ b/trunk/gobject/gsourceclosure.h
@@ -0,0 +1,41 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2001 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.
+ */
+#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
+#error "Only <glib-object.h> can be included directly."
+#endif
+
+#ifndef __G_SOURCECLOSURE_H__
+#define __G_SOURCECLOSURE_H__
+
+#include <gobject/gclosure.h>
+
+G_BEGIN_DECLS
+
+void g_source_set_closure (GSource *source,
+ GClosure *closure);
+
+GType g_io_channel_get_type (void);
+GType g_io_condition_get_type (void);
+
+#define G_TYPE_IO_CHANNEL (g_io_channel_get_type ())
+#define G_TYPE_IO_CONDITION (g_io_condition_get_type ())
+
+G_END_DECLS
+
+#endif /* __G_SOURCECLOSURE_H__ */
diff --git a/trunk/gobject/gtype.c b/trunk/gobject/gtype.c
new file mode 100644
index 000000000..44620db6c
--- /dev/null
+++ b/trunk/gobject/gtype.c
@@ -0,0 +1,3573 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1998-1999, 2000-2001 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.
+ */
+#include <config.h>
+#include "gtype.h"
+
+/*
+ * MT safe
+ */
+
+#include "gtypeplugin.h"
+#include "gvaluecollector.h"
+#include "gbsearcharray.h"
+#include <string.h>
+
+#include "gobjectalias.h"
+
+/* NOTE: some functions (some internal variants and exported ones)
+ * invalidate data portions of the TypeNodes. if external functions/callbacks
+ * are called, pointers to memory maintained by TypeNodes have to be looked up
+ * again. this affects most of the struct TypeNode fields, e.g. ->children or
+ * CLASSED_NODE_IFACES_ENTRIES() respectively IFACE_NODE_PREREQUISITES() (but
+ * not ->supers[]), as all those memory portions can get realloc()ed during
+ * callback invocation.
+ *
+ * TODO:
+ * - g_type_from_name() should do an ordered array lookup after fetching the
+ * the quark, instead of a second hashtable lookup.
+ *
+ * LOCKING:
+ * lock handling issues when calling static functions are indicated by
+ * uppercase letter postfixes, all static functions have to have
+ * one of the below postfixes:
+ * - _I: [Indifferent about locking]
+ * function doesn't care about locks at all
+ * - _U: [Unlocked invocation]
+ * no read or write lock has to be held across function invocation
+ * (locks may be acquired and released during invocation though)
+ * - _L: [Locked invocation]
+ * a write lock or more than 0 read locks have to be held across
+ * function invocation
+ * - _W: [Write-locked invocation]
+ * a write lock has to be held across function invocation
+ * - _Wm: [Write-locked invocation, mutatable]
+ * like _W, but the write lock might be released and reacquired
+ * during invocation, watch your pointers
+ */
+
+static GStaticRWLock type_rw_lock = G_STATIC_RW_LOCK_INIT;
+#ifdef LOCK_DEBUG
+#define G_READ_LOCK(rw_lock) do { g_printerr (G_STRLOC ": readL++\n"); g_static_rw_lock_reader_lock (rw_lock); } while (0)
+#define G_READ_UNLOCK(rw_lock) do { g_printerr (G_STRLOC ": readL--\n"); g_static_rw_lock_reader_unlock (rw_lock); } while (0)
+#define G_WRITE_LOCK(rw_lock) do { g_printerr (G_STRLOC ": writeL++\n"); g_static_rw_lock_writer_lock (rw_lock); } while (0)
+#define G_WRITE_UNLOCK(rw_lock) do { g_printerr (G_STRLOC ": writeL--\n"); g_static_rw_lock_writer_unlock (rw_lock); } while (0)
+#else
+#define G_READ_LOCK(rw_lock) g_static_rw_lock_reader_lock (rw_lock)
+#define G_READ_UNLOCK(rw_lock) g_static_rw_lock_reader_unlock (rw_lock)
+#define G_WRITE_LOCK(rw_lock) g_static_rw_lock_writer_lock (rw_lock)
+#define G_WRITE_UNLOCK(rw_lock) g_static_rw_lock_writer_unlock (rw_lock)
+#endif
+#define INVALID_RECURSION(func, arg, type_name) G_STMT_START{ \
+ static const gchar _action[] = " invalidly modified type "; \
+ gpointer _arg = (gpointer) (arg); const gchar *_tname = (type_name), *_fname = (func); \
+ if (_arg) \
+ g_error ("%s(%p)%s`%s'", _fname, _arg, _action, _tname); \
+ else \
+ g_error ("%s()%s`%s'", _fname, _action, _tname); \
+}G_STMT_END
+#define g_return_val_if_uninitialized(condition, init_function, return_value) G_STMT_START{ \
+ if (!(condition)) \
+ { \
+ g_log (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, \
+ "%s: initialization assertion failed, use %s() prior to this function", \
+ G_STRLOC, G_STRINGIFY (init_function)); \
+ return (return_value); \
+ } \
+}G_STMT_END
+
+#ifdef G_ENABLE_DEBUG
+#define DEBUG_CODE(debug_type, code_block) G_STMT_START { \
+ if (_g_type_debug_flags & G_TYPE_DEBUG_ ## debug_type) \
+ { code_block; } \
+} G_STMT_END
+#else /* !G_ENABLE_DEBUG */
+#define DEBUG_CODE(debug_type, code_block) /* code_block */
+#endif /* G_ENABLE_DEBUG */
+
+#define TYPE_FUNDAMENTAL_FLAG_MASK (G_TYPE_FLAG_CLASSED | \
+ G_TYPE_FLAG_INSTANTIATABLE | \
+ G_TYPE_FLAG_DERIVABLE | \
+ G_TYPE_FLAG_DEEP_DERIVABLE)
+#define TYPE_FLAG_MASK (G_TYPE_FLAG_ABSTRACT | G_TYPE_FLAG_VALUE_ABSTRACT)
+#define SIZEOF_FUNDAMENTAL_INFO ((gssize) MAX (MAX (sizeof (GTypeFundamentalInfo), \
+ sizeof (gpointer)), \
+ sizeof (glong)))
+
+/* The 2*sizeof(size_t) alignment here is borrowed from
+ * GNU libc, so it should be good most everywhere.
+ * It is more conservative than is needed on some 64-bit
+ * platforms, but ia64 does require a 16-byte alignment.
+ * The SIMD extensions for x86 and ppc32 would want a
+ * larger alignment than this, but we don't need to
+ * do better than malloc.
+ */
+#define STRUCT_ALIGNMENT (2 * sizeof (gsize))
+#define ALIGN_STRUCT(offset) \
+ ((offset + (STRUCT_ALIGNMENT - 1)) & -STRUCT_ALIGNMENT)
+
+
+/* --- typedefs --- */
+typedef struct _TypeNode TypeNode;
+typedef struct _CommonData CommonData;
+typedef struct _IFaceData IFaceData;
+typedef struct _ClassData ClassData;
+typedef struct _InstanceData InstanceData;
+typedef union _TypeData TypeData;
+typedef struct _IFaceEntry IFaceEntry;
+typedef struct _IFaceHolder IFaceHolder;
+
+
+/* --- prototypes --- */
+static inline GTypeFundamentalInfo* type_node_fundamental_info_I (TypeNode *node);
+static void type_add_flags_W (TypeNode *node,
+ GTypeFlags flags);
+static void type_data_make_W (TypeNode *node,
+ const GTypeInfo *info,
+ const GTypeValueTable *value_table);
+static inline void type_data_ref_Wm (TypeNode *node);
+static inline void type_data_unref_Wm (TypeNode *node,
+ gboolean uncached);
+static void type_data_last_unref_Wm (GType type,
+ gboolean uncached);
+static inline gpointer type_get_qdata_L (TypeNode *node,
+ GQuark quark);
+static inline void type_set_qdata_W (TypeNode *node,
+ GQuark quark,
+ gpointer data);
+static IFaceHolder* type_iface_peek_holder_L (TypeNode *iface,
+ GType instance_type);
+static gboolean type_iface_vtable_base_init_Wm (TypeNode *iface,
+ TypeNode *node);
+static void type_iface_vtable_iface_init_Wm (TypeNode *iface,
+ TypeNode *node);
+static gboolean type_node_is_a_L (TypeNode *node,
+ TypeNode *iface_node);
+
+
+/* --- enumeration --- */
+
+/* The InitState enumeration is used to track the progress of initializing
+ * both classes and interface vtables. Keeping the state of initialization
+ * is necessary to handle new interfaces being added while we are initializing
+ * the class or other interfaces.
+ */
+typedef enum
+{
+ UNINITIALIZED,
+ BASE_CLASS_INIT,
+ BASE_IFACE_INIT,
+ CLASS_INIT,
+ IFACE_INIT,
+ INITIALIZED
+} InitState;
+
+/* --- structures --- */
+struct _TypeNode
+{
+ GTypePlugin *plugin;
+ guint n_children : 12;
+ guint n_supers : 8;
+ guint _prot_n_ifaces_prerequisites : 9;
+ guint is_classed : 1;
+ guint is_instantiatable : 1;
+ guint mutatable_check_cache : 1; /* combines some common path checks */
+ GType *children;
+ TypeData * volatile data;
+ GQuark qname;
+ GData *global_gdata;
+ union {
+ IFaceEntry *iface_entries; /* for !iface types */
+ GType *prerequisistes;
+ } _prot;
+ GType supers[1]; /* flexible array */
+};
+#define SIZEOF_BASE_TYPE_NODE() (G_STRUCT_OFFSET (TypeNode, supers))
+#define MAX_N_SUPERS (255)
+#define MAX_N_CHILDREN (4095)
+#define MAX_N_IFACES (511)
+#define MAX_N_PREREQUISITES (MAX_N_IFACES)
+#define NODE_TYPE(node) (node->supers[0])
+#define NODE_PARENT_TYPE(node) (node->supers[1])
+#define NODE_FUNDAMENTAL_TYPE(node) (node->supers[node->n_supers])
+#define NODE_NAME(node) (g_quark_to_string (node->qname))
+#define NODE_IS_IFACE(node) (NODE_FUNDAMENTAL_TYPE (node) == G_TYPE_INTERFACE)
+#define CLASSED_NODE_N_IFACES(node) ((node)->_prot_n_ifaces_prerequisites)
+#define CLASSED_NODE_IFACES_ENTRIES(node) ((node)->_prot.iface_entries)
+#define IFACE_NODE_N_PREREQUISITES(node) ((node)->_prot_n_ifaces_prerequisites)
+#define IFACE_NODE_PREREQUISITES(node) ((node)->_prot.prerequisistes)
+#define iface_node_get_holders_L(node) ((IFaceHolder*) type_get_qdata_L ((node), static_quark_iface_holder))
+#define iface_node_set_holders_W(node, holders) (type_set_qdata_W ((node), static_quark_iface_holder, (holders)))
+#define iface_node_get_dependants_array_L(n) ((GType*) type_get_qdata_L ((n), static_quark_dependants_array))
+#define iface_node_set_dependants_array_W(n,d) (type_set_qdata_W ((n), static_quark_dependants_array, (d)))
+#define TYPE_ID_MASK ((GType) ((1 << G_TYPE_FUNDAMENTAL_SHIFT) - 1))
+
+#define NODE_IS_ANCESTOR(ancestor, node) \
+ ((ancestor)->n_supers <= (node)->n_supers && \
+ (node)->supers[(node)->n_supers - (ancestor)->n_supers] == NODE_TYPE (ancestor))
+
+
+struct _IFaceHolder
+{
+ GType instance_type;
+ GInterfaceInfo *info;
+ GTypePlugin *plugin;
+ IFaceHolder *next;
+};
+struct _IFaceEntry
+{
+ GType iface_type;
+ GTypeInterface *vtable;
+ InitState init_state;
+};
+struct _CommonData
+{
+ guint ref_count;
+ GTypeValueTable *value_table;
+};
+struct _IFaceData
+{
+ CommonData common;
+ guint16 vtable_size;
+ GBaseInitFunc vtable_init_base;
+ GBaseFinalizeFunc vtable_finalize_base;
+ GClassInitFunc dflt_init;
+ GClassFinalizeFunc dflt_finalize;
+ gconstpointer dflt_data;
+ gpointer dflt_vtable;
+};
+struct _ClassData
+{
+ CommonData common;
+ guint16 class_size;
+ guint init_state : 4;
+ GBaseInitFunc class_init_base;
+ GBaseFinalizeFunc class_finalize_base;
+ GClassInitFunc class_init;
+ GClassFinalizeFunc class_finalize;
+ gconstpointer class_data;
+ gpointer class;
+};
+struct _InstanceData
+{
+ CommonData common;
+ guint16 class_size;
+ guint init_state : 4;
+ GBaseInitFunc class_init_base;
+ GBaseFinalizeFunc class_finalize_base;
+ GClassInitFunc class_init;
+ GClassFinalizeFunc class_finalize;
+ gconstpointer class_data;
+ gpointer class;
+ guint16 instance_size;
+ guint16 private_size;
+ guint16 n_preallocs;
+ GInstanceInitFunc instance_init;
+};
+union _TypeData
+{
+ CommonData common;
+ IFaceData iface;
+ ClassData class;
+ InstanceData instance;
+};
+typedef struct {
+ gpointer cache_data;
+ GTypeClassCacheFunc cache_func;
+} ClassCacheFunc;
+typedef struct {
+ gpointer check_data;
+ GTypeInterfaceCheckFunc check_func;
+} IFaceCheckFunc;
+
+
+/* --- variables --- */
+static guint static_n_class_cache_funcs = 0;
+static ClassCacheFunc *static_class_cache_funcs = NULL;
+static guint static_n_iface_check_funcs = 0;
+static IFaceCheckFunc *static_iface_check_funcs = NULL;
+static GQuark static_quark_type_flags = 0;
+static GQuark static_quark_iface_holder = 0;
+static GQuark static_quark_dependants_array = 0;
+GTypeDebugFlags _g_type_debug_flags = 0;
+
+
+/* --- type nodes --- */
+static GHashTable *static_type_nodes_ht = NULL;
+static TypeNode *static_fundamental_type_nodes[(G_TYPE_FUNDAMENTAL_MAX >> G_TYPE_FUNDAMENTAL_SHIFT) + 1] = { NULL, };
+static GType static_fundamental_next = G_TYPE_RESERVED_USER_FIRST;
+
+static inline TypeNode*
+lookup_type_node_I (register GType utype)
+{
+ if (utype > G_TYPE_FUNDAMENTAL_MAX)
+ return (TypeNode*) (utype & ~TYPE_ID_MASK);
+ else
+ return static_fundamental_type_nodes[utype >> G_TYPE_FUNDAMENTAL_SHIFT];
+}
+
+static TypeNode*
+type_node_any_new_W (TypeNode *pnode,
+ GType ftype,
+ const gchar *name,
+ GTypePlugin *plugin,
+ GTypeFundamentalFlags type_flags)
+{
+ guint n_supers;
+ GType type;
+ TypeNode *node;
+ guint i, node_size = 0;
+
+ n_supers = pnode ? pnode->n_supers + 1 : 0;
+
+ if (!pnode)
+ node_size += SIZEOF_FUNDAMENTAL_INFO; /* fundamental type info */
+ node_size += SIZEOF_BASE_TYPE_NODE (); /* TypeNode structure */
+ node_size += (sizeof (GType) * (1 + n_supers + 1)); /* self + ancestors + (0) for ->supers[] */
+ node = g_malloc0 (node_size);
+ if (!pnode) /* offset fundamental types */
+ {
+ node = G_STRUCT_MEMBER_P (node, SIZEOF_FUNDAMENTAL_INFO);
+ static_fundamental_type_nodes[ftype >> G_TYPE_FUNDAMENTAL_SHIFT] = node;
+ type = ftype;
+ }
+ else
+ type = (GType) node;
+
+ g_assert ((type & TYPE_ID_MASK) == 0);
+
+ node->n_supers = n_supers;
+ if (!pnode)
+ {
+ node->supers[0] = type;
+ node->supers[1] = 0;
+
+ node->is_classed = (type_flags & G_TYPE_FLAG_CLASSED) != 0;
+ node->is_instantiatable = (type_flags & G_TYPE_FLAG_INSTANTIATABLE) != 0;
+
+ if (NODE_IS_IFACE (node))
+ {
+ IFACE_NODE_N_PREREQUISITES (node) = 0;
+ IFACE_NODE_PREREQUISITES (node) = NULL;
+ }
+ else
+ {
+ CLASSED_NODE_N_IFACES (node) = 0;
+ CLASSED_NODE_IFACES_ENTRIES (node) = NULL;
+ }
+ }
+ else
+ {
+ node->supers[0] = type;
+ memcpy (node->supers + 1, pnode->supers, sizeof (GType) * (1 + pnode->n_supers + 1));
+
+ node->is_classed = pnode->is_classed;
+ node->is_instantiatable = pnode->is_instantiatable;
+
+ if (NODE_IS_IFACE (node))
+ {
+ IFACE_NODE_N_PREREQUISITES (node) = 0;
+ IFACE_NODE_PREREQUISITES (node) = NULL;
+ }
+ else
+ {
+ guint j;
+
+ CLASSED_NODE_N_IFACES (node) = CLASSED_NODE_N_IFACES (pnode);
+ CLASSED_NODE_IFACES_ENTRIES (node) = g_memdup (CLASSED_NODE_IFACES_ENTRIES (pnode),
+ sizeof (CLASSED_NODE_IFACES_ENTRIES (pnode)[0]) *
+ CLASSED_NODE_N_IFACES (node));
+ for (j = 0; j < CLASSED_NODE_N_IFACES (node); j++)
+ {
+ CLASSED_NODE_IFACES_ENTRIES (node)[j].vtable = NULL;
+ CLASSED_NODE_IFACES_ENTRIES (node)[j].init_state = UNINITIALIZED;
+ }
+ }
+
+ i = pnode->n_children++;
+ pnode->children = g_renew (GType, pnode->children, pnode->n_children);
+ pnode->children[i] = type;
+ }
+
+ node->plugin = plugin;
+ node->n_children = 0;
+ node->children = NULL;
+ node->data = NULL;
+ node->qname = g_quark_from_string (name);
+ node->global_gdata = NULL;
+
+ g_hash_table_insert (static_type_nodes_ht,
+ GUINT_TO_POINTER (node->qname),
+ (gpointer) type);
+ return node;
+}
+
+static inline GTypeFundamentalInfo*
+type_node_fundamental_info_I (TypeNode *node)
+{
+ GType ftype = NODE_FUNDAMENTAL_TYPE (node);
+
+ if (ftype != NODE_TYPE (node))
+ node = lookup_type_node_I (ftype);
+
+ return node ? G_STRUCT_MEMBER_P (node, -SIZEOF_FUNDAMENTAL_INFO) : NULL;
+}
+
+static TypeNode*
+type_node_fundamental_new_W (GType ftype,
+ const gchar *name,
+ GTypeFundamentalFlags type_flags)
+{
+ GTypeFundamentalInfo *finfo;
+ TypeNode *node;
+
+ g_assert ((ftype & TYPE_ID_MASK) == 0);
+ g_assert (ftype <= G_TYPE_FUNDAMENTAL_MAX);
+
+ if (ftype >> G_TYPE_FUNDAMENTAL_SHIFT == static_fundamental_next)
+ static_fundamental_next++;
+
+ type_flags &= TYPE_FUNDAMENTAL_FLAG_MASK;
+
+ node = type_node_any_new_W (NULL, ftype, name, NULL, type_flags);
+
+ finfo = type_node_fundamental_info_I (node);
+ finfo->type_flags = type_flags;
+
+ return node;
+}
+
+static TypeNode*
+type_node_new_W (TypeNode *pnode,
+ const gchar *name,
+ GTypePlugin *plugin)
+
+{
+ g_assert (pnode);
+ g_assert (pnode->n_supers < MAX_N_SUPERS);
+ g_assert (pnode->n_children < MAX_N_CHILDREN);
+
+ return type_node_any_new_W (pnode, NODE_FUNDAMENTAL_TYPE (pnode), name, plugin, 0);
+}
+
+static inline IFaceEntry*
+type_lookup_iface_entry_L (TypeNode *node,
+ TypeNode *iface_node)
+{
+ if (NODE_IS_IFACE (iface_node) && CLASSED_NODE_N_IFACES (node))
+ {
+ IFaceEntry *ifaces = CLASSED_NODE_IFACES_ENTRIES (node) - 1;
+ guint n_ifaces = CLASSED_NODE_N_IFACES (node);
+ GType iface_type = NODE_TYPE (iface_node);
+
+ do
+ {
+ guint i;
+ IFaceEntry *check;
+
+ i = (n_ifaces + 1) >> 1;
+ check = ifaces + i;
+ if (iface_type == check->iface_type)
+ return check;
+ else if (iface_type > check->iface_type)
+ {
+ n_ifaces -= i;
+ ifaces = check;
+ }
+ else /* if (iface_type < check->iface_type) */
+ n_ifaces = i - 1;
+ }
+ while (n_ifaces);
+ }
+
+ return NULL;
+}
+
+static inline gboolean
+type_lookup_prerequisite_L (TypeNode *iface,
+ GType prerequisite_type)
+{
+ if (NODE_IS_IFACE (iface) && IFACE_NODE_N_PREREQUISITES (iface))
+ {
+ GType *prerequisites = IFACE_NODE_PREREQUISITES (iface) - 1;
+ guint n_prerequisites = IFACE_NODE_N_PREREQUISITES (iface);
+
+ do
+ {
+ guint i;
+ GType *check;
+
+ i = (n_prerequisites + 1) >> 1;
+ check = prerequisites + i;
+ if (prerequisite_type == *check)
+ return TRUE;
+ else if (prerequisite_type > *check)
+ {
+ n_prerequisites -= i;
+ prerequisites = check;
+ }
+ else /* if (prerequisite_type < *check) */
+ n_prerequisites = i - 1;
+ }
+ while (n_prerequisites);
+ }
+ return FALSE;
+}
+
+static gchar*
+type_descriptive_name_I (GType type)
+{
+ if (type)
+ {
+ TypeNode *node = lookup_type_node_I (type);
+
+ return node ? NODE_NAME (node) : "<unknown>";
+ }
+ else
+ return "<invalid>";
+}
+
+
+/* --- type consistency checks --- */
+static gboolean
+check_plugin_U (GTypePlugin *plugin,
+ gboolean need_complete_type_info,
+ gboolean need_complete_interface_info,
+ const gchar *type_name)
+{
+ /* G_IS_TYPE_PLUGIN() and G_TYPE_PLUGIN_GET_CLASS() are external calls: _U
+ */
+ if (!plugin)
+ {
+ g_warning ("plugin handle for type `%s' is NULL",
+ type_name);
+ return FALSE;
+ }
+ if (!G_IS_TYPE_PLUGIN (plugin))
+ {
+ g_warning ("plugin pointer (%p) for type `%s' is invalid",
+ plugin, type_name);
+ return FALSE;
+ }
+ if (need_complete_type_info && !G_TYPE_PLUGIN_GET_CLASS (plugin)->complete_type_info)
+ {
+ g_warning ("plugin for type `%s' has no complete_type_info() implementation",
+ type_name);
+ return FALSE;
+ }
+ if (need_complete_interface_info && !G_TYPE_PLUGIN_GET_CLASS (plugin)->complete_interface_info)
+ {
+ g_warning ("plugin for type `%s' has no complete_interface_info() implementation",
+ type_name);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static gboolean
+check_type_name_I (const gchar *type_name)
+{
+ static const gchar extra_chars[] = "-_+";
+ const gchar *p = type_name;
+ gboolean name_valid;
+
+ if (!type_name[0] || !type_name[1] || !type_name[2])
+ {
+ g_warning ("type name `%s' is too short", type_name);
+ return FALSE;
+ }
+ /* check the first letter */
+ name_valid = (p[0] >= 'A' && p[0] <= 'Z') || (p[0] >= 'a' && p[0] <= 'z') || p[0] == '_';
+ for (p = type_name + 1; *p; p++)
+ name_valid &= ((p[0] >= 'A' && p[0] <= 'Z') ||
+ (p[0] >= 'a' && p[0] <= 'z') ||
+ (p[0] >= '0' && p[0] <= '9') ||
+ strchr (extra_chars, p[0]));
+ if (!name_valid)
+ {
+ g_warning ("type name `%s' contains invalid characters", type_name);
+ return FALSE;
+ }
+ if (g_type_from_name (type_name))
+ {
+ g_warning ("cannot register existing type `%s'", type_name);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static gboolean
+check_derivation_I (GType parent_type,
+ const gchar *type_name)
+{
+ TypeNode *pnode;
+ GTypeFundamentalInfo* finfo;
+
+ pnode = lookup_type_node_I (parent_type);
+ if (!pnode)
+ {
+ g_warning ("cannot derive type `%s' from invalid parent type `%s'",
+ type_name,
+ type_descriptive_name_I (parent_type));
+ return FALSE;
+ }
+ finfo = type_node_fundamental_info_I (pnode);
+ /* ensure flat derivability */
+ if (!(finfo->type_flags & G_TYPE_FLAG_DERIVABLE))
+ {
+ g_warning ("cannot derive `%s' from non-derivable parent type `%s'",
+ type_name,
+ NODE_NAME (pnode));
+ return FALSE;
+ }
+ /* ensure deep derivability */
+ if (parent_type != NODE_FUNDAMENTAL_TYPE (pnode) &&
+ !(finfo->type_flags & G_TYPE_FLAG_DEEP_DERIVABLE))
+ {
+ g_warning ("cannot derive `%s' from non-fundamental parent type `%s'",
+ type_name,
+ NODE_NAME (pnode));
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static gboolean
+check_collect_format_I (const gchar *collect_format)
+{
+ const gchar *p = collect_format;
+ gchar valid_format[] = { G_VALUE_COLLECT_INT, G_VALUE_COLLECT_LONG,
+ G_VALUE_COLLECT_INT64, G_VALUE_COLLECT_DOUBLE,
+ G_VALUE_COLLECT_POINTER, 0 };
+
+ while (*p)
+ if (!strchr (valid_format, *p++))
+ return FALSE;
+ return p - collect_format <= G_VALUE_COLLECT_FORMAT_MAX_LENGTH;
+}
+
+static gboolean
+check_value_table_I (const gchar *type_name,
+ const GTypeValueTable *value_table)
+{
+ if (!value_table)
+ return FALSE;
+ else if (value_table->value_init == NULL)
+ {
+ if (value_table->value_free || value_table->value_copy ||
+ value_table->value_peek_pointer ||
+ value_table->collect_format || value_table->collect_value ||
+ value_table->lcopy_format || value_table->lcopy_value)
+ g_warning ("cannot handle uninitializable values of type `%s'",
+ type_name);
+ return FALSE;
+ }
+ else /* value_table->value_init != NULL */
+ {
+ if (!value_table->value_free)
+ {
+ /* +++ optional +++
+ * g_warning ("missing `value_free()' for type `%s'", type_name);
+ * return FALSE;
+ */
+ }
+ if (!value_table->value_copy)
+ {
+ g_warning ("missing `value_copy()' for type `%s'", type_name);
+ return FALSE;
+ }
+ if ((value_table->collect_format || value_table->collect_value) &&
+ (!value_table->collect_format || !value_table->collect_value))
+ {
+ g_warning ("one of `collect_format' and `collect_value()' is unspecified for type `%s'",
+ type_name);
+ return FALSE;
+ }
+ if (value_table->collect_format && !check_collect_format_I (value_table->collect_format))
+ {
+ g_warning ("the `%s' specification for type `%s' is too long or invalid",
+ "collect_format",
+ type_name);
+ return FALSE;
+ }
+ if ((value_table->lcopy_format || value_table->lcopy_value) &&
+ (!value_table->lcopy_format || !value_table->lcopy_value))
+ {
+ g_warning ("one of `lcopy_format' and `lcopy_value()' is unspecified for type `%s'",
+ type_name);
+ return FALSE;
+ }
+ if (value_table->lcopy_format && !check_collect_format_I (value_table->lcopy_format))
+ {
+ g_warning ("the `%s' specification for type `%s' is too long or invalid",
+ "lcopy_format",
+ type_name);
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static gboolean
+check_type_info_I (TypeNode *pnode,
+ GType ftype,
+ const gchar *type_name,
+ const GTypeInfo *info)
+{
+ GTypeFundamentalInfo *finfo = type_node_fundamental_info_I (lookup_type_node_I (ftype));
+ gboolean is_interface = ftype == G_TYPE_INTERFACE;
+
+ g_assert (ftype <= G_TYPE_FUNDAMENTAL_MAX && !(ftype & TYPE_ID_MASK));
+
+ /* check instance members */
+ if (!(finfo->type_flags & G_TYPE_FLAG_INSTANTIATABLE) &&
+ (info->instance_size || info->n_preallocs || info->instance_init))
+ {
+ if (pnode)
+ g_warning ("cannot instantiate `%s', derived from non-instantiatable parent type `%s'",
+ type_name,
+ NODE_NAME (pnode));
+ else
+ g_warning ("cannot instantiate `%s' as non-instantiatable fundamental",
+ type_name);
+ return FALSE;
+ }
+ /* check class & interface members */
+ if (!((finfo->type_flags & G_TYPE_FLAG_CLASSED) || is_interface) &&
+ (info->class_init || info->class_finalize || info->class_data ||
+ info->class_size || info->base_init || info->base_finalize))
+ {
+ if (pnode)
+ g_warning ("cannot create class for `%s', derived from non-classed parent type `%s'",
+ type_name,
+ NODE_NAME (pnode));
+ else
+ g_warning ("cannot create class for `%s' as non-classed fundamental",
+ type_name);
+ return FALSE;
+ }
+ /* check interface size */
+ if (is_interface && info->class_size < sizeof (GTypeInterface))
+ {
+ g_warning ("specified interface size for type `%s' is smaller than `GTypeInterface' size",
+ type_name);
+ return FALSE;
+ }
+ /* check class size */
+ if (finfo->type_flags & G_TYPE_FLAG_CLASSED)
+ {
+ if (info->class_size < sizeof (GTypeClass))
+ {
+ g_warning ("specified class size for type `%s' is smaller than `GTypeClass' size",
+ type_name);
+ return FALSE;
+ }
+ if (pnode && info->class_size < pnode->data->class.class_size)
+ {
+ g_warning ("specified class size for type `%s' is smaller "
+ "than the parent type's `%s' class size",
+ type_name,
+ NODE_NAME (pnode));
+ return FALSE;
+ }
+ }
+ /* check instance size */
+ if (finfo->type_flags & G_TYPE_FLAG_INSTANTIATABLE)
+ {
+ if (info->instance_size < sizeof (GTypeInstance))
+ {
+ g_warning ("specified instance size for type `%s' is smaller than `GTypeInstance' size",
+ type_name);
+ return FALSE;
+ }
+ if (pnode && info->instance_size < pnode->data->instance.instance_size)
+ {
+ g_warning ("specified instance size for type `%s' is smaller "
+ "than the parent type's `%s' instance size",
+ type_name,
+ NODE_NAME (pnode));
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+static TypeNode*
+find_conforming_child_type_L (TypeNode *pnode,
+ TypeNode *iface)
+{
+ TypeNode *node = NULL;
+ guint i;
+
+ if (type_lookup_iface_entry_L (pnode, iface))
+ return pnode;
+
+ for (i = 0; i < pnode->n_children && !node; i++)
+ node = find_conforming_child_type_L (lookup_type_node_I (pnode->children[i]), iface);
+
+ return node;
+}
+
+static gboolean
+check_add_interface_L (GType instance_type,
+ GType iface_type)
+{
+ TypeNode *node = lookup_type_node_I (instance_type);
+ TypeNode *iface = lookup_type_node_I (iface_type);
+ IFaceEntry *entry;
+ TypeNode *tnode;
+ GType *prerequisites;
+ guint i;
+
+
+ if (!node || !node->is_instantiatable)
+ {
+ g_warning ("cannot add interfaces to invalid (non-instantiatable) type `%s'",
+ type_descriptive_name_I (instance_type));
+ return FALSE;
+ }
+ if (!iface || !NODE_IS_IFACE (iface))
+ {
+ g_warning ("cannot add invalid (non-interface) type `%s' to type `%s'",
+ type_descriptive_name_I (iface_type),
+ NODE_NAME (node));
+ return FALSE;
+ }
+ tnode = lookup_type_node_I (NODE_PARENT_TYPE (iface));
+ if (NODE_PARENT_TYPE (tnode) && !type_lookup_iface_entry_L (node, tnode))
+ {
+ /* 2001/7/31:timj: erk, i guess this warning is junk as interface derivation is flat */
+ g_warning ("cannot add sub-interface `%s' to type `%s' which does not conform to super-interface `%s'",
+ NODE_NAME (iface),
+ NODE_NAME (node),
+ NODE_NAME (tnode));
+ return FALSE;
+ }
+ /* allow overriding of interface type introduced for parent type */
+ entry = type_lookup_iface_entry_L (node, iface);
+ if (entry && entry->vtable == NULL && !type_iface_peek_holder_L (iface, NODE_TYPE (node)))
+ {
+ /* ok, we do conform to this interface already, but the interface vtable was not
+ * yet intialized, and we just conform to the interface because it got added to
+ * one of our parents. so we allow overriding of holder info here.
+ */
+ return TRUE;
+ }
+ /* check whether one of our children already conforms (or whether the interface
+ * got added to this node already)
+ */
+ tnode = find_conforming_child_type_L (node, iface); /* tnode is_a node */
+ if (tnode)
+ {
+ g_warning ("cannot add interface type `%s' to type `%s', since type `%s' already conforms to interface",
+ NODE_NAME (iface),
+ NODE_NAME (node),
+ NODE_NAME (tnode));
+ return FALSE;
+ }
+ prerequisites = IFACE_NODE_PREREQUISITES (iface);
+ for (i = 0; i < IFACE_NODE_N_PREREQUISITES (iface); i++)
+ {
+ tnode = lookup_type_node_I (prerequisites[i]);
+ if (!type_node_is_a_L (node, tnode))
+ {
+ g_warning ("cannot add interface type `%s' to type `%s' which does not conform to prerequisite `%s'",
+ NODE_NAME (iface),
+ NODE_NAME (node),
+ NODE_NAME (tnode));
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static gboolean
+check_interface_info_I (TypeNode *iface,
+ GType instance_type,
+ const GInterfaceInfo *info)
+{
+ if ((info->interface_finalize || info->interface_data) && !info->interface_init)
+ {
+ g_warning ("interface type `%s' for type `%s' comes without initializer",
+ NODE_NAME (iface),
+ type_descriptive_name_I (instance_type));
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/* --- type info (type node data) --- */
+static void
+type_data_make_W (TypeNode *node,
+ const GTypeInfo *info,
+ const GTypeValueTable *value_table)
+{
+ TypeData *data;
+ GTypeValueTable *vtable = NULL;
+ guint vtable_size = 0;
+
+ g_assert (node->data == NULL && info != NULL);
+
+ if (!value_table)
+ {
+ TypeNode *pnode = lookup_type_node_I (NODE_PARENT_TYPE (node));
+
+ if (pnode)
+ vtable = pnode->data->common.value_table;
+ else
+ {
+ static const GTypeValueTable zero_vtable = { NULL, };
+
+ value_table = &zero_vtable;
+ }
+ }
+ if (value_table)
+ {
+ /* need to setup vtable_size since we have to allocate it with data in one chunk */
+ vtable_size = sizeof (GTypeValueTable);
+ if (value_table->collect_format)
+ vtable_size += strlen (value_table->collect_format);
+ if (value_table->lcopy_format)
+ vtable_size += strlen (value_table->lcopy_format);
+ vtable_size += 2;
+ }
+
+ if (node->is_instantiatable) /* carefull, is_instantiatable is also is_classed */
+ {
+ data = g_malloc0 (sizeof (InstanceData) + vtable_size);
+ if (vtable_size)
+ vtable = G_STRUCT_MEMBER_P (data, sizeof (InstanceData));
+ data->instance.class_size = info->class_size;
+ data->instance.class_init_base = info->base_init;
+ data->instance.class_finalize_base = info->base_finalize;
+ data->instance.class_init = info->class_init;
+ data->instance.class_finalize = info->class_finalize;
+ data->instance.class_data = info->class_data;
+ data->instance.class = NULL;
+ data->instance.init_state = UNINITIALIZED;
+ data->instance.instance_size = info->instance_size;
+ /* We'll set the final value for data->instance.private size
+ * after the parent class has been initialized
+ */
+ data->instance.private_size = 0;
+#ifdef DISABLE_MEM_POOLS
+ data->instance.n_preallocs = 0;
+#else /* !DISABLE_MEM_POOLS */
+ data->instance.n_preallocs = MIN (info->n_preallocs, 1024);
+#endif /* !DISABLE_MEM_POOLS */
+ data->instance.instance_init = info->instance_init;
+ }
+ else if (node->is_classed) /* only classed */
+ {
+ data = g_malloc0 (sizeof (ClassData) + vtable_size);
+ if (vtable_size)
+ vtable = G_STRUCT_MEMBER_P (data, sizeof (ClassData));
+ data->class.class_size = info->class_size;
+ data->class.class_init_base = info->base_init;
+ data->class.class_finalize_base = info->base_finalize;
+ data->class.class_init = info->class_init;
+ data->class.class_finalize = info->class_finalize;
+ data->class.class_data = info->class_data;
+ data->class.class = NULL;
+ data->class.init_state = UNINITIALIZED;
+ }
+ else if (NODE_IS_IFACE (node))
+ {
+ data = g_malloc0 (sizeof (IFaceData) + vtable_size);
+ if (vtable_size)
+ vtable = G_STRUCT_MEMBER_P (data, sizeof (IFaceData));
+ data->iface.vtable_size = info->class_size;
+ data->iface.vtable_init_base = info->base_init;
+ data->iface.vtable_finalize_base = info->base_finalize;
+ data->iface.dflt_init = info->class_init;
+ data->iface.dflt_finalize = info->class_finalize;
+ data->iface.dflt_data = info->class_data;
+ data->iface.dflt_vtable = NULL;
+ }
+ else
+ {
+ data = g_malloc0 (sizeof (CommonData) + vtable_size);
+ if (vtable_size)
+ vtable = G_STRUCT_MEMBER_P (data, sizeof (CommonData));
+ }
+
+ node->data = data;
+ node->data->common.ref_count = 1;
+
+ if (vtable_size)
+ {
+ gchar *p;
+
+ /* we allocate the vtable and its strings together with the type data, so
+ * children can take over their parent's vtable pointer, and we don't
+ * need to worry freeing it or not when the child data is destroyed
+ */
+ *vtable = *value_table;
+ p = G_STRUCT_MEMBER_P (vtable, sizeof (*vtable));
+ p[0] = 0;
+ vtable->collect_format = p;
+ if (value_table->collect_format)
+ {
+ strcat (p, value_table->collect_format);
+ p += strlen (value_table->collect_format);
+ }
+ p++;
+ p[0] = 0;
+ vtable->lcopy_format = p;
+ if (value_table->lcopy_format)
+ strcat (p, value_table->lcopy_format);
+ }
+ node->data->common.value_table = vtable;
+ node->mutatable_check_cache = (node->data->common.value_table->value_init != NULL &&
+ !((G_TYPE_FLAG_VALUE_ABSTRACT | G_TYPE_FLAG_ABSTRACT) &
+ GPOINTER_TO_UINT (type_get_qdata_L (node, static_quark_type_flags))));
+
+ g_assert (node->data->common.value_table != NULL); /* paranoid */
+}
+
+static inline void
+type_data_ref_Wm (TypeNode *node)
+{
+ if (!node->data)
+ {
+ TypeNode *pnode = lookup_type_node_I (NODE_PARENT_TYPE (node));
+ GTypeInfo tmp_info;
+ GTypeValueTable tmp_value_table;
+
+ g_assert (node->plugin != NULL);
+
+ if (pnode)
+ {
+ type_data_ref_Wm (pnode);
+ if (node->data)
+ INVALID_RECURSION ("g_type_plugin_*", node->plugin, NODE_NAME (node));
+ }
+
+ memset (&tmp_info, 0, sizeof (tmp_info));
+ memset (&tmp_value_table, 0, sizeof (tmp_value_table));
+
+ G_WRITE_UNLOCK (&type_rw_lock);
+ g_type_plugin_use (node->plugin);
+ g_type_plugin_complete_type_info (node->plugin, NODE_TYPE (node), &tmp_info, &tmp_value_table);
+ G_WRITE_LOCK (&type_rw_lock);
+ if (node->data)
+ INVALID_RECURSION ("g_type_plugin_*", node->plugin, NODE_NAME (node));
+
+ check_type_info_I (pnode, NODE_FUNDAMENTAL_TYPE (node), NODE_NAME (node), &tmp_info);
+ type_data_make_W (node, &tmp_info,
+ check_value_table_I (NODE_NAME (node),
+ &tmp_value_table) ? &tmp_value_table : NULL);
+ }
+ else
+ {
+ g_assert (node->data->common.ref_count > 0);
+
+ node->data->common.ref_count += 1;
+ }
+}
+
+static inline void
+type_data_unref_Wm (TypeNode *node,
+ gboolean uncached)
+{
+ g_assert (node->data && node->data->common.ref_count);
+
+ if (node->data->common.ref_count > 1)
+ node->data->common.ref_count -= 1;
+ else
+ {
+ if (!node->plugin)
+ {
+ g_warning ("static type `%s' unreferenced too often",
+ NODE_NAME (node));
+ return;
+ }
+
+ type_data_last_unref_Wm (NODE_TYPE (node), uncached);
+ }
+}
+
+static void
+type_node_add_iface_entry_W (TypeNode *node,
+ GType iface_type,
+ IFaceEntry *parent_entry)
+{
+ IFaceEntry *entries;
+ guint i;
+
+ g_assert (node->is_instantiatable && CLASSED_NODE_N_IFACES (node) < MAX_N_IFACES);
+
+ entries = CLASSED_NODE_IFACES_ENTRIES (node);
+ for (i = 0; i < CLASSED_NODE_N_IFACES (node); i++)
+ if (entries[i].iface_type == iface_type)
+ {
+ /* this can happen in two cases:
+ * - our parent type already conformed to iface_type and node
+ * got it's own holder info. here, our children already have
+ * entries and NULL vtables, since this will only work for
+ * uninitialized classes.
+ * - an interface type is added to an ancestor after it was
+ * added to a child type.
+ */
+ if (!parent_entry)
+ g_assert (entries[i].vtable == NULL && entries[i].init_state == UNINITIALIZED);
+ else
+ {
+ /* sick, interface is added to ancestor *after* child type;
+ * nothing todo, the entry and our children were already setup correctly
+ */
+ }
+ return;
+ }
+ else if (entries[i].iface_type > iface_type)
+ break;
+ CLASSED_NODE_N_IFACES (node) += 1;
+ CLASSED_NODE_IFACES_ENTRIES (node) = g_renew (IFaceEntry,
+ CLASSED_NODE_IFACES_ENTRIES (node),
+ CLASSED_NODE_N_IFACES (node));
+ entries = CLASSED_NODE_IFACES_ENTRIES (node);
+ g_memmove (entries + i + 1, entries + i, sizeof (entries[0]) * (CLASSED_NODE_N_IFACES (node) - i - 1));
+ entries[i].iface_type = iface_type;
+ entries[i].vtable = NULL;
+ entries[i].init_state = UNINITIALIZED;
+
+ if (parent_entry)
+ {
+ if (node->data && node->data->class.init_state >= BASE_IFACE_INIT)
+ {
+ entries[i].init_state = INITIALIZED;
+ entries[i].vtable = parent_entry->vtable;
+ }
+ for (i = 0; i < node->n_children; i++)
+ type_node_add_iface_entry_W (lookup_type_node_I (node->children[i]), iface_type, &entries[i]);
+ }
+}
+
+static void
+type_add_interface_Wm (TypeNode *node,
+ TypeNode *iface,
+ const GInterfaceInfo *info,
+ GTypePlugin *plugin)
+{
+ IFaceHolder *iholder = g_new0 (IFaceHolder, 1);
+ IFaceEntry *entry;
+ guint i;
+
+ g_assert (node->is_instantiatable && NODE_IS_IFACE (iface) && ((info && !plugin) || (!info && plugin)));
+
+ iholder->next = iface_node_get_holders_L (iface);
+ iface_node_set_holders_W (iface, iholder);
+ iholder->instance_type = NODE_TYPE (node);
+ iholder->info = info ? g_memdup (info, sizeof (*info)) : NULL;
+ iholder->plugin = plugin;
+
+ /* create an iface entry for this type */
+ type_node_add_iface_entry_W (node, NODE_TYPE (iface), NULL);
+
+ /* if the class is already (partly) initialized, we may need to base
+ * initalize and/or initialize the new interface.
+ */
+ if (node->data)
+ {
+ InitState class_state = node->data->class.init_state;
+
+ if (class_state >= BASE_IFACE_INIT)
+ type_iface_vtable_base_init_Wm (iface, node);
+
+ if (class_state >= IFACE_INIT)
+ type_iface_vtable_iface_init_Wm (iface, node);
+ }
+
+ /* create iface entries for children of this type */
+ entry = type_lookup_iface_entry_L (node, iface);
+ for (i = 0; i < node->n_children; i++)
+ type_node_add_iface_entry_W (lookup_type_node_I (node->children[i]), NODE_TYPE (iface), entry);
+}
+
+static void
+type_iface_add_prerequisite_W (TypeNode *iface,
+ TypeNode *prerequisite_node)
+{
+ GType prerequisite_type = NODE_TYPE (prerequisite_node);
+ GType *prerequisites, *dependants;
+ guint n_dependants, i;
+
+ g_assert (NODE_IS_IFACE (iface) &&
+ IFACE_NODE_N_PREREQUISITES (iface) < MAX_N_PREREQUISITES &&
+ (prerequisite_node->is_instantiatable || NODE_IS_IFACE (prerequisite_node)));
+
+ prerequisites = IFACE_NODE_PREREQUISITES (iface);
+ for (i = 0; i < IFACE_NODE_N_PREREQUISITES (iface); i++)
+ if (prerequisites[i] == prerequisite_type)
+ return; /* we already have that prerequisiste */
+ else if (prerequisites[i] > prerequisite_type)
+ break;
+ IFACE_NODE_N_PREREQUISITES (iface) += 1;
+ IFACE_NODE_PREREQUISITES (iface) = g_renew (GType,
+ IFACE_NODE_PREREQUISITES (iface),
+ IFACE_NODE_N_PREREQUISITES (iface));
+ prerequisites = IFACE_NODE_PREREQUISITES (iface);
+ g_memmove (prerequisites + i + 1, prerequisites + i,
+ sizeof (prerequisites[0]) * (IFACE_NODE_N_PREREQUISITES (iface) - i - 1));
+ prerequisites[i] = prerequisite_type;
+
+ /* we want to get notified when prerequisites get added to prerequisite_node */
+ if (NODE_IS_IFACE (prerequisite_node))
+ {
+ dependants = iface_node_get_dependants_array_L (prerequisite_node);
+ n_dependants = dependants ? dependants[0] : 0;
+ n_dependants += 1;
+ dependants = g_renew (GType, dependants, n_dependants + 1);
+ dependants[n_dependants] = NODE_TYPE (iface);
+ dependants[0] = n_dependants;
+ iface_node_set_dependants_array_W (prerequisite_node, dependants);
+ }
+
+ /* we need to notify all dependants */
+ dependants = iface_node_get_dependants_array_L (iface);
+ n_dependants = dependants ? dependants[0] : 0;
+ for (i = 1; i <= n_dependants; i++)
+ type_iface_add_prerequisite_W (lookup_type_node_I (dependants[i]), prerequisite_node);
+}
+
+void
+g_type_interface_add_prerequisite (GType interface_type,
+ GType prerequisite_type)
+{
+ TypeNode *iface, *prerequisite_node;
+ IFaceHolder *holders;
+
+ g_return_if_fail (G_TYPE_IS_INTERFACE (interface_type)); /* G_TYPE_IS_INTERFACE() is an external call: _U */
+ g_return_if_fail (!g_type_is_a (interface_type, prerequisite_type));
+ g_return_if_fail (!g_type_is_a (prerequisite_type, interface_type));
+
+ iface = lookup_type_node_I (interface_type);
+ prerequisite_node = lookup_type_node_I (prerequisite_type);
+ if (!iface || !prerequisite_node || !NODE_IS_IFACE (iface))
+ {
+ g_warning ("interface type `%s' or prerequisite type `%s' invalid",
+ type_descriptive_name_I (interface_type),
+ type_descriptive_name_I (prerequisite_type));
+ return;
+ }
+ G_WRITE_LOCK (&type_rw_lock);
+ holders = iface_node_get_holders_L (iface);
+ if (holders)
+ {
+ G_WRITE_UNLOCK (&type_rw_lock);
+ g_warning ("unable to add prerequisite `%s' to interface `%s' which is already in use for `%s'",
+ type_descriptive_name_I (prerequisite_type),
+ type_descriptive_name_I (interface_type),
+ type_descriptive_name_I (holders->instance_type));
+ return;
+ }
+ if (prerequisite_node->is_instantiatable)
+ {
+ guint i;
+
+ /* can have at most one publically installable instantiatable prerequisite */
+ for (i = 0; i < IFACE_NODE_N_PREREQUISITES (iface); i++)
+ {
+ TypeNode *prnode = lookup_type_node_I (IFACE_NODE_PREREQUISITES (iface)[i]);
+
+ if (prnode->is_instantiatable)
+ {
+ G_WRITE_UNLOCK (&type_rw_lock);
+ g_warning ("adding prerequisite `%s' to interface `%s' conflicts with existing prerequisite `%s'",
+ type_descriptive_name_I (prerequisite_type),
+ type_descriptive_name_I (interface_type),
+ type_descriptive_name_I (NODE_TYPE (prnode)));
+ return;
+ }
+ }
+
+ for (i = 0; i < prerequisite_node->n_supers + 1; i++)
+ type_iface_add_prerequisite_W (iface, lookup_type_node_I (prerequisite_node->supers[i]));
+ G_WRITE_UNLOCK (&type_rw_lock);
+ }
+ else if (NODE_IS_IFACE (prerequisite_node))
+ {
+ GType *prerequisites;
+ guint i;
+
+ prerequisites = IFACE_NODE_PREREQUISITES (prerequisite_node);
+ for (i = 0; i < IFACE_NODE_N_PREREQUISITES (prerequisite_node); i++)
+ type_iface_add_prerequisite_W (iface, lookup_type_node_I (prerequisites[i]));
+ type_iface_add_prerequisite_W (iface, prerequisite_node);
+ G_WRITE_UNLOCK (&type_rw_lock);
+ }
+ else
+ {
+ G_WRITE_UNLOCK (&type_rw_lock);
+ g_warning ("prerequisite `%s' for interface `%s' is neither instantiatable nor interface",
+ type_descriptive_name_I (prerequisite_type),
+ type_descriptive_name_I (interface_type));
+ }
+}
+
+GType* /* free result */
+g_type_interface_prerequisites (GType interface_type,
+ guint *n_prerequisites)
+{
+ TypeNode *iface;
+
+ g_return_val_if_fail (G_TYPE_IS_INTERFACE (interface_type), NULL);
+
+ iface = lookup_type_node_I (interface_type);
+ if (iface)
+ {
+ GType *types;
+ TypeNode *inode = NULL;
+ guint i, n = 0;
+
+ G_READ_LOCK (&type_rw_lock);
+ types = g_new0 (GType, IFACE_NODE_N_PREREQUISITES (iface) + 1);
+ for (i = 0; i < IFACE_NODE_N_PREREQUISITES (iface); i++)
+ {
+ GType prerequisite = IFACE_NODE_PREREQUISITES (iface)[i];
+ TypeNode *node = lookup_type_node_I (prerequisite);
+ if (node->is_instantiatable &&
+ (!inode || type_node_is_a_L (node, inode)))
+ inode = node;
+ else
+ types[n++] = NODE_TYPE (node);
+ }
+ if (inode)
+ types[n++] = NODE_TYPE (inode);
+
+ if (n_prerequisites)
+ *n_prerequisites = n;
+ G_READ_UNLOCK (&type_rw_lock);
+
+ return types;
+ }
+ else
+ {
+ if (n_prerequisites)
+ *n_prerequisites = 0;
+
+ return NULL;
+ }
+}
+
+
+static IFaceHolder*
+type_iface_peek_holder_L (TypeNode *iface,
+ GType instance_type)
+{
+ IFaceHolder *iholder;
+
+ g_assert (NODE_IS_IFACE (iface));
+
+ iholder = iface_node_get_holders_L (iface);
+ while (iholder && iholder->instance_type != instance_type)
+ iholder = iholder->next;
+ return iholder;
+}
+
+static IFaceHolder*
+type_iface_retrieve_holder_info_Wm (TypeNode *iface,
+ GType instance_type,
+ gboolean need_info)
+{
+ IFaceHolder *iholder = type_iface_peek_holder_L (iface, instance_type);
+
+ if (iholder && !iholder->info && need_info)
+ {
+ GInterfaceInfo tmp_info;
+
+ g_assert (iholder->plugin != NULL);
+
+ type_data_ref_Wm (iface);
+ if (iholder->info)
+ INVALID_RECURSION ("g_type_plugin_*", iface->plugin, NODE_NAME (iface));
+
+ memset (&tmp_info, 0, sizeof (tmp_info));
+
+ G_WRITE_UNLOCK (&type_rw_lock);
+ g_type_plugin_use (iholder->plugin);
+ g_type_plugin_complete_interface_info (iholder->plugin, instance_type, NODE_TYPE (iface), &tmp_info);
+ G_WRITE_LOCK (&type_rw_lock);
+ if (iholder->info)
+ INVALID_RECURSION ("g_type_plugin_*", iholder->plugin, NODE_NAME (iface));
+
+ check_interface_info_I (iface, instance_type, &tmp_info);
+ iholder->info = g_memdup (&tmp_info, sizeof (tmp_info));
+ }
+
+ return iholder; /* we don't modify write lock upon returning NULL */
+}
+
+static void
+type_iface_blow_holder_info_Wm (TypeNode *iface,
+ GType instance_type)
+{
+ IFaceHolder *iholder = iface_node_get_holders_L (iface);
+
+ g_assert (NODE_IS_IFACE (iface));
+
+ while (iholder->instance_type != instance_type)
+ iholder = iholder->next;
+
+ if (iholder->info && iholder->plugin)
+ {
+ g_free (iholder->info);
+ iholder->info = NULL;
+
+ G_WRITE_UNLOCK (&type_rw_lock);
+ g_type_plugin_unuse (iholder->plugin);
+ G_WRITE_LOCK (&type_rw_lock);
+
+ type_data_unref_Wm (iface, FALSE);
+ }
+}
+
+/* Assumes type's class already exists
+ */
+static inline size_t
+type_total_instance_size_I (TypeNode *node)
+{
+ gsize total_instance_size;
+
+ total_instance_size = node->data->instance.instance_size;
+ if (node->data->instance.private_size != 0)
+ total_instance_size = ALIGN_STRUCT (total_instance_size) + node->data->instance.private_size;
+
+ return total_instance_size;
+}
+
+/* --- type structure creation/destruction --- */
+typedef struct {
+ gpointer instance;
+ gpointer class;
+} InstanceRealClass;
+static gint
+instance_real_class_cmp (gconstpointer p1,
+ gconstpointer p2)
+{
+ const InstanceRealClass *irc1 = p1;
+ const InstanceRealClass *irc2 = p2;
+ guint8 *i1 = irc1->instance;
+ guint8 *i2 = irc2->instance;
+ return G_BSEARCH_ARRAY_CMP (i1, i2);
+}
+G_LOCK_DEFINE_STATIC (instance_real_class);
+static GBSearchArray *instance_real_class_bsa = NULL;
+static GBSearchConfig instance_real_class_bconfig = {
+ sizeof (InstanceRealClass),
+ instance_real_class_cmp,
+ 0,
+};
+static inline void
+instance_real_class_set (gpointer instance,
+ GTypeClass *class)
+{
+ InstanceRealClass key;
+ key.instance = instance;
+ key.class = class;
+ G_LOCK (instance_real_class);
+ if (!instance_real_class_bsa)
+ instance_real_class_bsa = g_bsearch_array_create (&instance_real_class_bconfig);
+ instance_real_class_bsa = g_bsearch_array_replace (instance_real_class_bsa, &instance_real_class_bconfig, &key);
+ G_UNLOCK (instance_real_class);
+}
+static inline void
+instance_real_class_remove (gpointer instance)
+{
+ InstanceRealClass key, *node;
+ guint index;
+ key.instance = instance;
+ G_LOCK (instance_real_class);
+ node = g_bsearch_array_lookup (instance_real_class_bsa, &instance_real_class_bconfig, &key);
+ index = g_bsearch_array_get_index (instance_real_class_bsa, &instance_real_class_bconfig, node);
+ instance_real_class_bsa = g_bsearch_array_remove (instance_real_class_bsa, &instance_real_class_bconfig, index);
+ if (!g_bsearch_array_get_n_nodes (instance_real_class_bsa))
+ {
+ g_bsearch_array_free (instance_real_class_bsa, &instance_real_class_bconfig);
+ instance_real_class_bsa = NULL;
+ }
+ G_UNLOCK (instance_real_class);
+}
+static inline GTypeClass*
+instance_real_class_get (gpointer instance)
+{
+ InstanceRealClass key, *node;
+ GTypeClass *class;
+ key.instance = instance;
+ G_LOCK (instance_real_class);
+ node = instance_real_class_bsa ? g_bsearch_array_lookup (instance_real_class_bsa, &instance_real_class_bconfig, &key) : NULL;
+ class = node ? node->class : NULL;
+ G_UNLOCK (instance_real_class);
+ return class;
+}
+
+GTypeInstance*
+g_type_create_instance (GType type)
+{
+ TypeNode *node;
+ GTypeInstance *instance;
+ GTypeClass *class;
+ guint i, total_size;
+
+ node = lookup_type_node_I (type);
+ if (!node || !node->is_instantiatable)
+ {
+ g_warning ("cannot create new instance of invalid (non-instantiatable) type `%s'",
+ type_descriptive_name_I (type));
+ return NULL;
+ }
+ /* G_TYPE_IS_ABSTRACT() is an external call: _U */
+ if (!node->mutatable_check_cache && G_TYPE_IS_ABSTRACT (type))
+ {
+ g_warning ("cannot create instance of abstract (non-instantiatable) type `%s'",
+ type_descriptive_name_I (type));
+ return NULL;
+ }
+
+ class = g_type_class_ref (type);
+ total_size = type_total_instance_size_I (node);
+
+ instance = g_slice_alloc0 (total_size);
+
+ if (node->data->instance.private_size)
+ instance_real_class_set (instance, class);
+ for (i = node->n_supers; i > 0; i--)
+ {
+ TypeNode *pnode;
+
+ pnode = lookup_type_node_I (node->supers[i]);
+ if (pnode->data->instance.instance_init)
+ {
+ instance->g_class = pnode->data->instance.class;
+ pnode->data->instance.instance_init (instance, class);
+ }
+ }
+ if (node->data->instance.private_size)
+ instance_real_class_remove (instance);
+
+ instance->g_class = class;
+ if (node->data->instance.instance_init)
+ node->data->instance.instance_init (instance, class);
+
+ return instance;
+}
+
+void
+g_type_free_instance (GTypeInstance *instance)
+{
+ TypeNode *node;
+ GTypeClass *class;
+
+ g_return_if_fail (instance != NULL && instance->g_class != NULL);
+
+ class = instance->g_class;
+ node = lookup_type_node_I (class->g_type);
+ if (!node || !node->is_instantiatable || !node->data || node->data->class.class != (gpointer) class)
+ {
+ g_warning ("cannot free instance of invalid (non-instantiatable) type `%s'",
+ type_descriptive_name_I (class->g_type));
+ return;
+ }
+ /* G_TYPE_IS_ABSTRACT() is an external call: _U */
+ if (!node->mutatable_check_cache && G_TYPE_IS_ABSTRACT (NODE_TYPE (node)))
+ {
+ g_warning ("cannot free instance of abstract (non-instantiatable) type `%s'",
+ NODE_NAME (node));
+ return;
+ }
+
+ instance->g_class = NULL;
+#ifdef G_ENABLE_DEBUG
+ memset (instance, 0xaa, type_total_instance_size_I (node));
+#endif
+ g_slice_free1 (type_total_instance_size_I (node), instance);
+
+ g_type_class_unref (class);
+}
+
+static void
+type_iface_ensure_dflt_vtable_Wm (TypeNode *iface)
+{
+ g_assert (iface->data);
+
+ if (!iface->data->iface.dflt_vtable)
+ {
+ GTypeInterface *vtable = g_malloc0 (iface->data->iface.vtable_size);
+ iface->data->iface.dflt_vtable = vtable;
+ vtable->g_type = NODE_TYPE (iface);
+ vtable->g_instance_type = 0;
+ if (iface->data->iface.vtable_init_base ||
+ iface->data->iface.dflt_init)
+ {
+ G_WRITE_UNLOCK (&type_rw_lock);
+ if (iface->data->iface.vtable_init_base)
+ iface->data->iface.vtable_init_base (vtable);
+ if (iface->data->iface.dflt_init)
+ iface->data->iface.dflt_init (vtable, (gpointer) iface->data->iface.dflt_data);
+ G_WRITE_LOCK (&type_rw_lock);
+ }
+ }
+}
+
+
+/* This is called to allocate and do the first part of initializing
+ * the interface vtable; type_iface_vtable_iface_init_Wm() does the remainder.
+ *
+ * A FALSE return indicates that we didn't find an init function for
+ * this type/iface pair, so the vtable from the parent type should
+ * be used. Note that the write lock is not modified upon a FALSE
+ * return.
+ */
+static gboolean
+type_iface_vtable_base_init_Wm (TypeNode *iface,
+ TypeNode *node)
+{
+ IFaceEntry *entry;
+ IFaceHolder *iholder;
+ GTypeInterface *vtable = NULL;
+ TypeNode *pnode;
+
+ /* type_iface_retrieve_holder_info_Wm() doesn't modify write lock for returning NULL */
+ iholder = type_iface_retrieve_holder_info_Wm (iface, NODE_TYPE (node), TRUE);
+ if (!iholder)
+ return FALSE; /* we don't modify write lock upon FALSE */
+
+ type_iface_ensure_dflt_vtable_Wm (iface);
+
+ entry = type_lookup_iface_entry_L (node, iface);
+
+ g_assert (iface->data && entry && entry->vtable == NULL && iholder && iholder->info);
+
+ entry->init_state = IFACE_INIT;
+
+ pnode = lookup_type_node_I (NODE_PARENT_TYPE (node));
+ if (pnode) /* want to copy over parent iface contents */
+ {
+ IFaceEntry *pentry = type_lookup_iface_entry_L (pnode, iface);
+
+ if (pentry)
+ vtable = g_memdup (pentry->vtable, iface->data->iface.vtable_size);
+ }
+ if (!vtable)
+ vtable = g_memdup (iface->data->iface.dflt_vtable, iface->data->iface.vtable_size);
+ entry->vtable = vtable;
+ vtable->g_type = NODE_TYPE (iface);
+ vtable->g_instance_type = NODE_TYPE (node);
+
+ if (iface->data->iface.vtable_init_base)
+ {
+ G_WRITE_UNLOCK (&type_rw_lock);
+ iface->data->iface.vtable_init_base (vtable);
+ G_WRITE_LOCK (&type_rw_lock);
+ }
+ return TRUE; /* initialized the vtable */
+}
+
+/* Finishes what type_iface_vtable_base_init_Wm started by
+ * calling the interface init function.
+ * this function may only be called for types with their
+ * own interface holder info, i.e. types for which
+ * g_type_add_interface*() was called and not children thereof.
+ */
+static void
+type_iface_vtable_iface_init_Wm (TypeNode *iface,
+ TypeNode *node)
+{
+ IFaceEntry *entry = type_lookup_iface_entry_L (node, iface);
+ IFaceHolder *iholder = type_iface_peek_holder_L (iface, NODE_TYPE (node));
+ GTypeInterface *vtable = NULL;
+ guint i;
+
+ /* iholder->info should have been filled in by type_iface_vtable_base_init_Wm() */
+ g_assert (iface->data && entry && iholder && iholder->info);
+ g_assert (entry->init_state == IFACE_INIT); /* assert prior base_init() */
+
+ entry->init_state = INITIALIZED;
+
+ vtable = entry->vtable;
+
+ if (iholder->info->interface_init)
+ {
+ G_WRITE_UNLOCK (&type_rw_lock);
+ if (iholder->info->interface_init)
+ iholder->info->interface_init (vtable, iholder->info->interface_data);
+ G_WRITE_LOCK (&type_rw_lock);
+ }
+
+ for (i = 0; i < static_n_iface_check_funcs; i++)
+ {
+ GTypeInterfaceCheckFunc check_func = static_iface_check_funcs[i].check_func;
+ gpointer check_data = static_iface_check_funcs[i].check_data;
+
+ G_WRITE_UNLOCK (&type_rw_lock);
+ check_func (check_data, (gpointer)vtable);
+ G_WRITE_LOCK (&type_rw_lock);
+ }
+}
+
+static gboolean
+type_iface_vtable_finalize_Wm (TypeNode *iface,
+ TypeNode *node,
+ GTypeInterface *vtable)
+{
+ IFaceEntry *entry = type_lookup_iface_entry_L (node, iface);
+ IFaceHolder *iholder;
+
+ /* type_iface_retrieve_holder_info_Wm() doesn't modify write lock for returning NULL */
+ iholder = type_iface_retrieve_holder_info_Wm (iface, NODE_TYPE (node), FALSE);
+ if (!iholder)
+ return FALSE; /* we don't modify write lock upon FALSE */
+
+ g_assert (entry && entry->vtable == vtable && iholder->info);
+
+ entry->vtable = NULL;
+ entry->init_state = UNINITIALIZED;
+ if (iholder->info->interface_finalize || iface->data->iface.vtable_finalize_base)
+ {
+ G_WRITE_UNLOCK (&type_rw_lock);
+ if (iholder->info->interface_finalize)
+ iholder->info->interface_finalize (vtable, iholder->info->interface_data);
+ if (iface->data->iface.vtable_finalize_base)
+ iface->data->iface.vtable_finalize_base (vtable);
+ G_WRITE_LOCK (&type_rw_lock);
+ }
+ vtable->g_type = 0;
+ vtable->g_instance_type = 0;
+ g_free (vtable);
+
+ type_iface_blow_holder_info_Wm (iface, NODE_TYPE (node));
+
+ return TRUE; /* write lock modified */
+}
+
+static void
+type_class_init_Wm (TypeNode *node,
+ GTypeClass *pclass)
+{
+ GSList *slist, *init_slist = NULL;
+ GTypeClass *class;
+ IFaceEntry *entry;
+ TypeNode *bnode, *pnode;
+ guint i;
+
+ g_assert (node->is_classed && node->data &&
+ node->data->class.class_size &&
+ !node->data->class.class &&
+ node->data->class.init_state == UNINITIALIZED);
+
+ class = g_malloc0 (node->data->class.class_size);
+ node->data->class.class = class;
+ node->data->class.init_state = BASE_CLASS_INIT;
+
+ if (pclass)
+ {
+ TypeNode *pnode = lookup_type_node_I (pclass->g_type);
+
+ memcpy (class, pclass, pnode->data->class.class_size);
+
+ if (node->is_instantiatable)
+ {
+ /* We need to initialize the private_size here rather than in
+ * type_data_make_W() since the class init for the parent
+ * class may have changed pnode->data->instance.private_size.
+ */
+ node->data->instance.private_size = pnode->data->instance.private_size;
+ }
+ }
+ class->g_type = NODE_TYPE (node);
+
+ G_WRITE_UNLOCK (&type_rw_lock);
+
+ /* stack all base class initialization functions, so we
+ * call them in ascending order.
+ */
+ for (bnode = node; bnode; bnode = lookup_type_node_I (NODE_PARENT_TYPE (bnode)))
+ if (bnode->data->class.class_init_base)
+ init_slist = g_slist_prepend (init_slist, (gpointer) bnode->data->class.class_init_base);
+ for (slist = init_slist; slist; slist = slist->next)
+ {
+ GBaseInitFunc class_init_base = (GBaseInitFunc) slist->data;
+
+ class_init_base (class);
+ }
+ g_slist_free (init_slist);
+
+ G_WRITE_LOCK (&type_rw_lock);
+
+ node->data->class.init_state = BASE_IFACE_INIT;
+
+ /* Before we initialize the class, base initialize all interfaces, either
+ * from parent, or through our holder info
+ */
+ pnode = lookup_type_node_I (NODE_PARENT_TYPE (node));
+
+ i = 0;
+ while (i < CLASSED_NODE_N_IFACES (node))
+ {
+ entry = &CLASSED_NODE_IFACES_ENTRIES (node)[i];
+ while (i < CLASSED_NODE_N_IFACES (node) &&
+ entry->init_state == IFACE_INIT)
+ {
+ entry++;
+ i++;
+ }
+
+ if (i == CLASSED_NODE_N_IFACES (node))
+ break;
+
+ if (!type_iface_vtable_base_init_Wm (lookup_type_node_I (entry->iface_type), node))
+ {
+ guint j;
+
+ /* need to get this interface from parent, type_iface_vtable_base_init_Wm()
+ * doesn't modify write lock upon FALSE, so entry is still valid;
+ */
+ g_assert (pnode != NULL);
+
+ for (j = 0; j < CLASSED_NODE_N_IFACES (pnode); j++)
+ {
+ IFaceEntry *pentry = CLASSED_NODE_IFACES_ENTRIES (pnode) + j;
+
+ if (pentry->iface_type == entry->iface_type)
+ {
+ entry->vtable = pentry->vtable;
+ entry->init_state = INITIALIZED;
+ break;
+ }
+ }
+ g_assert (entry->vtable != NULL);
+ }
+
+ /* If the write lock was released, additional interface entries might
+ * have been inserted into CLASSED_NODE_IFACES_ENTRIES (node); they'll
+ * be base-initialized when inserted, so we don't have to worry that
+ * we might miss them. Uninitialized entries can only be moved higher
+ * when new ones are inserted.
+ */
+ i++;
+ }
+
+ node->data->class.init_state = CLASS_INIT;
+
+ G_WRITE_UNLOCK (&type_rw_lock);
+
+ if (node->data->class.class_init)
+ node->data->class.class_init (class, (gpointer) node->data->class.class_data);
+
+ G_WRITE_LOCK (&type_rw_lock);
+
+ node->data->class.init_state = IFACE_INIT;
+
+ /* finish initializing the interfaces through our holder info.
+ * inherited interfaces are already init_state == INITIALIZED, because
+ * they either got setup in the above base_init loop, or during
+ * class_init from within type_add_interface_Wm() for this or
+ * an anchestor type.
+ */
+ i = 0;
+ while (TRUE)
+ {
+ entry = &CLASSED_NODE_IFACES_ENTRIES (node)[i];
+ while (i < CLASSED_NODE_N_IFACES (node) &&
+ entry->init_state == INITIALIZED)
+ {
+ entry++;
+ i++;
+ }
+
+ if (i == CLASSED_NODE_N_IFACES (node))
+ break;
+
+ type_iface_vtable_iface_init_Wm (lookup_type_node_I (entry->iface_type), node);
+
+ /* As in the loop above, additional initialized entries might be inserted
+ * if the write lock is released, but that's harmless because the entries
+ * we need to initialize only move higher in the list.
+ */
+ i++;
+ }
+
+ node->data->class.init_state = INITIALIZED;
+}
+
+static void
+type_data_finalize_class_ifaces_Wm (TypeNode *node)
+{
+ guint i;
+
+ g_assert (node->is_instantiatable && node->data && node->data->class.class && node->data->common.ref_count == 0);
+
+ reiterate:
+ for (i = 0; i < CLASSED_NODE_N_IFACES (node); i++)
+ {
+ IFaceEntry *entry = CLASSED_NODE_IFACES_ENTRIES (node) + i;
+ if (entry->vtable)
+ {
+ if (type_iface_vtable_finalize_Wm (lookup_type_node_I (entry->iface_type), node, entry->vtable))
+ {
+ /* refetch entries, IFACES_ENTRIES might be modified */
+ goto reiterate;
+ }
+ else
+ {
+ /* type_iface_vtable_finalize_Wm() doesn't modify write lock upon FALSE,
+ * iface vtable came from parent
+ */
+ entry->vtable = NULL;
+ entry->init_state = UNINITIALIZED;
+ }
+ }
+ }
+}
+
+static void
+type_data_finalize_class_U (TypeNode *node,
+ ClassData *cdata)
+{
+ GTypeClass *class = cdata->class;
+ TypeNode *bnode;
+
+ g_assert (cdata->class && cdata->common.ref_count == 0);
+
+ if (cdata->class_finalize)
+ cdata->class_finalize (class, (gpointer) cdata->class_data);
+
+ /* call all base class destruction functions in descending order
+ */
+ if (cdata->class_finalize_base)
+ cdata->class_finalize_base (class);
+ for (bnode = lookup_type_node_I (NODE_PARENT_TYPE (node)); bnode; bnode = lookup_type_node_I (NODE_PARENT_TYPE (bnode)))
+ if (bnode->data->class.class_finalize_base)
+ bnode->data->class.class_finalize_base (class);
+
+ g_free (cdata->class);
+}
+
+static void
+type_data_last_unref_Wm (GType type,
+ gboolean uncached)
+{
+ TypeNode *node = lookup_type_node_I (type);
+
+ g_return_if_fail (node != NULL && node->plugin != NULL);
+
+ if (!node->data || node->data->common.ref_count == 0)
+ {
+ g_warning ("cannot drop last reference to unreferenced type `%s'",
+ type_descriptive_name_I (type));
+ return;
+ }
+
+ /* call class cache hooks */
+ if (node->is_classed && node->data && node->data->class.class && static_n_class_cache_funcs && !uncached)
+ {
+ guint i;
+
+ G_WRITE_UNLOCK (&type_rw_lock);
+ G_READ_LOCK (&type_rw_lock);
+ for (i = 0; i < static_n_class_cache_funcs; i++)
+ {
+ GTypeClassCacheFunc cache_func = static_class_cache_funcs[i].cache_func;
+ gpointer cache_data = static_class_cache_funcs[i].cache_data;
+ gboolean need_break;
+
+ G_READ_UNLOCK (&type_rw_lock);
+ need_break = cache_func (cache_data, node->data->class.class);
+ G_READ_LOCK (&type_rw_lock);
+ if (!node->data || node->data->common.ref_count == 0)
+ INVALID_RECURSION ("GType class cache function ", cache_func, NODE_NAME (node));
+ if (need_break)
+ break;
+ }
+ G_READ_UNLOCK (&type_rw_lock);
+ G_WRITE_LOCK (&type_rw_lock);
+ }
+
+ if (node->data->common.ref_count > 1) /* may have been re-referenced meanwhile */
+ node->data->common.ref_count -= 1;
+ else
+ {
+ GType ptype = NODE_PARENT_TYPE (node);
+ TypeData *tdata;
+
+ node->data->common.ref_count = 0;
+
+ if (node->is_instantiatable)
+ {
+ /* destroy node->data->instance.mem_chunk */
+ }
+
+ tdata = node->data;
+ if (node->is_classed && tdata->class.class)
+ {
+ if (CLASSED_NODE_N_IFACES (node))
+ type_data_finalize_class_ifaces_Wm (node);
+ node->mutatable_check_cache = FALSE;
+ node->data = NULL;
+ G_WRITE_UNLOCK (&type_rw_lock);
+ type_data_finalize_class_U (node, &tdata->class);
+ G_WRITE_LOCK (&type_rw_lock);
+ }
+ else if (NODE_IS_IFACE (node) && tdata->iface.dflt_vtable)
+ {
+ node->mutatable_check_cache = FALSE;
+ node->data = NULL;
+ if (tdata->iface.dflt_finalize || tdata->iface.vtable_finalize_base)
+ {
+ G_WRITE_UNLOCK (&type_rw_lock);
+ if (tdata->iface.dflt_finalize)
+ tdata->iface.dflt_finalize (tdata->iface.dflt_vtable, (gpointer) tdata->iface.dflt_data);
+ if (tdata->iface.vtable_finalize_base)
+ tdata->iface.vtable_finalize_base (tdata->iface.dflt_vtable);
+ G_WRITE_LOCK (&type_rw_lock);
+ }
+ g_free (tdata->iface.dflt_vtable);
+ }
+ else
+ {
+ node->mutatable_check_cache = FALSE;
+ node->data = NULL;
+ }
+
+ /* freeing tdata->common.value_table and its contents is taken care of
+ * by allocating it in one chunk with tdata
+ */
+ g_free (tdata);
+
+ G_WRITE_UNLOCK (&type_rw_lock);
+ g_type_plugin_unuse (node->plugin);
+ G_WRITE_LOCK (&type_rw_lock);
+ if (ptype)
+ type_data_unref_Wm (lookup_type_node_I (ptype), FALSE);
+ }
+}
+
+void
+g_type_add_class_cache_func (gpointer cache_data,
+ GTypeClassCacheFunc cache_func)
+{
+ guint i;
+
+ g_return_if_fail (cache_func != NULL);
+
+ G_WRITE_LOCK (&type_rw_lock);
+ i = static_n_class_cache_funcs++;
+ static_class_cache_funcs = g_renew (ClassCacheFunc, static_class_cache_funcs, static_n_class_cache_funcs);
+ static_class_cache_funcs[i].cache_data = cache_data;
+ static_class_cache_funcs[i].cache_func = cache_func;
+ G_WRITE_UNLOCK (&type_rw_lock);
+}
+
+void
+g_type_remove_class_cache_func (gpointer cache_data,
+ GTypeClassCacheFunc cache_func)
+{
+ gboolean found_it = FALSE;
+ guint i;
+
+ g_return_if_fail (cache_func != NULL);
+
+ G_WRITE_LOCK (&type_rw_lock);
+ for (i = 0; i < static_n_class_cache_funcs; i++)
+ if (static_class_cache_funcs[i].cache_data == cache_data &&
+ static_class_cache_funcs[i].cache_func == cache_func)
+ {
+ static_n_class_cache_funcs--;
+ g_memmove (static_class_cache_funcs + i,
+ static_class_cache_funcs + i + 1,
+ sizeof (static_class_cache_funcs[0]) * (static_n_class_cache_funcs - i));
+ static_class_cache_funcs = g_renew (ClassCacheFunc, static_class_cache_funcs, static_n_class_cache_funcs);
+ found_it = TRUE;
+ break;
+ }
+ G_WRITE_UNLOCK (&type_rw_lock);
+
+ if (!found_it)
+ g_warning (G_STRLOC ": cannot remove unregistered class cache func %p with data %p",
+ cache_func, cache_data);
+}
+
+
+void
+g_type_add_interface_check (gpointer check_data,
+ GTypeInterfaceCheckFunc check_func)
+{
+ guint i;
+
+ g_return_if_fail (check_func != NULL);
+
+ G_WRITE_LOCK (&type_rw_lock);
+ i = static_n_iface_check_funcs++;
+ static_iface_check_funcs = g_renew (IFaceCheckFunc, static_iface_check_funcs, static_n_iface_check_funcs);
+ static_iface_check_funcs[i].check_data = check_data;
+ static_iface_check_funcs[i].check_func = check_func;
+ G_WRITE_UNLOCK (&type_rw_lock);
+}
+
+void
+g_type_remove_interface_check (gpointer check_data,
+ GTypeInterfaceCheckFunc check_func)
+{
+ gboolean found_it = FALSE;
+ guint i;
+
+ g_return_if_fail (check_func != NULL);
+
+ G_WRITE_LOCK (&type_rw_lock);
+ for (i = 0; i < static_n_iface_check_funcs; i++)
+ if (static_iface_check_funcs[i].check_data == check_data &&
+ static_iface_check_funcs[i].check_func == check_func)
+ {
+ static_n_iface_check_funcs--;
+ g_memmove (static_iface_check_funcs + i,
+ static_iface_check_funcs + i + 1,
+ sizeof (static_iface_check_funcs[0]) * (static_n_iface_check_funcs - i));
+ static_iface_check_funcs = g_renew (IFaceCheckFunc, static_iface_check_funcs, static_n_iface_check_funcs);
+ found_it = TRUE;
+ break;
+ }
+ G_WRITE_UNLOCK (&type_rw_lock);
+
+ if (!found_it)
+ g_warning (G_STRLOC ": cannot remove unregistered class check func %p with data %p",
+ check_func, check_data);
+}
+
+/* --- type registration --- */
+GType
+g_type_register_fundamental (GType type_id,
+ const gchar *type_name,
+ const GTypeInfo *info,
+ const GTypeFundamentalInfo *finfo,
+ GTypeFlags flags)
+{
+ TypeNode *node;
+
+ g_return_val_if_uninitialized (static_quark_type_flags, g_type_init, 0);
+ g_return_val_if_fail (type_id > 0, 0);
+ g_return_val_if_fail (type_name != NULL, 0);
+ g_return_val_if_fail (info != NULL, 0);
+ g_return_val_if_fail (finfo != NULL, 0);
+
+ if (!check_type_name_I (type_name))
+ return 0;
+ if ((type_id & TYPE_ID_MASK) ||
+ type_id > G_TYPE_FUNDAMENTAL_MAX)
+ {
+ g_warning ("attempt to register fundamental type `%s' with invalid type id (%lu)",
+ type_name,
+ type_id);
+ return 0;
+ }
+ if ((finfo->type_flags & G_TYPE_FLAG_INSTANTIATABLE) &&
+ !(finfo->type_flags & G_TYPE_FLAG_CLASSED))
+ {
+ g_warning ("cannot register instantiatable fundamental type `%s' as non-classed",
+ type_name);
+ return 0;
+ }
+ if (lookup_type_node_I (type_id))
+ {
+ g_warning ("cannot register existing fundamental type `%s' (as `%s')",
+ type_descriptive_name_I (type_id),
+ type_name);
+ return 0;
+ }
+
+ G_WRITE_LOCK (&type_rw_lock);
+ node = type_node_fundamental_new_W (type_id, type_name, finfo->type_flags);
+ type_add_flags_W (node, flags);
+
+ if (check_type_info_I (NULL, NODE_FUNDAMENTAL_TYPE (node), type_name, info))
+ type_data_make_W (node, info,
+ check_value_table_I (type_name, info->value_table) ? info->value_table : NULL);
+ G_WRITE_UNLOCK (&type_rw_lock);
+
+ return NODE_TYPE (node);
+}
+
+GType
+g_type_register_static_simple (GType parent_type,
+ const gchar *type_name,
+ guint class_size,
+ GClassInitFunc class_init,
+ guint instance_size,
+ GInstanceInitFunc instance_init,
+ GTypeFlags flags)
+{
+ GTypeInfo info;
+
+ info.class_size = class_size;
+ info.base_init = NULL;
+ info.base_finalize = NULL;
+ info.class_init = class_init;
+ info.class_finalize = NULL;
+ info.class_data = NULL;
+ info.instance_size = instance_size;
+ info.n_preallocs = 0;
+ info.instance_init = instance_init;
+ info.value_table = NULL;
+
+ return g_type_register_static (parent_type, type_name, &info, flags);
+}
+
+GType
+g_type_register_static (GType parent_type,
+ const gchar *type_name,
+ const GTypeInfo *info,
+ GTypeFlags flags)
+{
+ TypeNode *pnode, *node;
+ GType type = 0;
+
+ g_return_val_if_uninitialized (static_quark_type_flags, g_type_init, 0);
+ g_return_val_if_fail (parent_type > 0, 0);
+ g_return_val_if_fail (type_name != NULL, 0);
+ g_return_val_if_fail (info != NULL, 0);
+
+ if (!check_type_name_I (type_name) ||
+ !check_derivation_I (parent_type, type_name))
+ return 0;
+ if (info->class_finalize)
+ {
+ g_warning ("class finalizer specified for static type `%s'",
+ type_name);
+ return 0;
+ }
+
+ pnode = lookup_type_node_I (parent_type);
+ G_WRITE_LOCK (&type_rw_lock);
+ type_data_ref_Wm (pnode);
+ if (check_type_info_I (pnode, NODE_FUNDAMENTAL_TYPE (pnode), type_name, info))
+ {
+ node = type_node_new_W (pnode, type_name, NULL);
+ type_add_flags_W (node, flags);
+ type = NODE_TYPE (node);
+ type_data_make_W (node, info,
+ check_value_table_I (type_name, info->value_table) ? info->value_table : NULL);
+ }
+ G_WRITE_UNLOCK (&type_rw_lock);
+
+ return type;
+}
+
+GType
+g_type_register_dynamic (GType parent_type,
+ const gchar *type_name,
+ GTypePlugin *plugin,
+ GTypeFlags flags)
+{
+ TypeNode *pnode, *node;
+ GType type;
+
+ g_return_val_if_uninitialized (static_quark_type_flags, g_type_init, 0);
+ g_return_val_if_fail (parent_type > 0, 0);
+ g_return_val_if_fail (type_name != NULL, 0);
+ g_return_val_if_fail (plugin != NULL, 0);
+
+ if (!check_type_name_I (type_name) ||
+ !check_derivation_I (parent_type, type_name) ||
+ !check_plugin_U (plugin, TRUE, FALSE, type_name))
+ return 0;
+
+ G_WRITE_LOCK (&type_rw_lock);
+ pnode = lookup_type_node_I (parent_type);
+ node = type_node_new_W (pnode, type_name, plugin);
+ type_add_flags_W (node, flags);
+ type = NODE_TYPE (node);
+ G_WRITE_UNLOCK (&type_rw_lock);
+
+ return type;
+}
+
+void
+g_type_add_interface_static (GType instance_type,
+ GType interface_type,
+ const GInterfaceInfo *info)
+{
+ /* G_TYPE_IS_INSTANTIATABLE() is an external call: _U */
+ g_return_if_fail (G_TYPE_IS_INSTANTIATABLE (instance_type));
+ g_return_if_fail (g_type_parent (interface_type) == G_TYPE_INTERFACE);
+
+ G_WRITE_LOCK (&type_rw_lock);
+ if (check_add_interface_L (instance_type, interface_type))
+ {
+ TypeNode *node = lookup_type_node_I (instance_type);
+ TypeNode *iface = lookup_type_node_I (interface_type);
+
+ if (check_interface_info_I (iface, NODE_TYPE (node), info))
+ type_add_interface_Wm (node, iface, info, NULL);
+ }
+ G_WRITE_UNLOCK (&type_rw_lock);
+}
+
+void
+g_type_add_interface_dynamic (GType instance_type,
+ GType interface_type,
+ GTypePlugin *plugin)
+{
+ TypeNode *node;
+
+ /* G_TYPE_IS_INSTANTIATABLE() is an external call: _U */
+ g_return_if_fail (G_TYPE_IS_INSTANTIATABLE (instance_type));
+ g_return_if_fail (g_type_parent (interface_type) == G_TYPE_INTERFACE);
+
+ node = lookup_type_node_I (instance_type);
+ if (!check_plugin_U (plugin, FALSE, TRUE, NODE_NAME (node)))
+ return;
+
+ G_WRITE_LOCK (&type_rw_lock);
+ if (check_add_interface_L (instance_type, interface_type))
+ {
+ TypeNode *iface = lookup_type_node_I (interface_type);
+
+ type_add_interface_Wm (node, iface, NULL, plugin);
+ }
+ G_WRITE_UNLOCK (&type_rw_lock);
+}
+
+
+/* --- public API functions --- */
+gpointer
+g_type_class_ref (GType type)
+{
+ TypeNode *node;
+
+ /* optimize for common code path
+ */
+ G_WRITE_LOCK (&type_rw_lock);
+ node = lookup_type_node_I (type);
+ if (node && node->is_classed && node->data &&
+ node->data->class.class && node->data->common.ref_count > 0)
+ {
+ type_data_ref_Wm (node);
+ G_WRITE_UNLOCK (&type_rw_lock);
+
+ return node->data->class.class;
+ }
+
+ if (!node || !node->is_classed ||
+ (node->data && node->data->common.ref_count < 1))
+ {
+ G_WRITE_UNLOCK (&type_rw_lock);
+ g_warning ("cannot retrieve class for invalid (unclassed) type `%s'",
+ type_descriptive_name_I (type));
+ return NULL;
+ }
+
+ type_data_ref_Wm (node);
+
+ if (!node->data->class.class)
+ {
+ GType ptype = NODE_PARENT_TYPE (node);
+ GTypeClass *pclass = NULL;
+
+ if (ptype)
+ {
+ G_WRITE_UNLOCK (&type_rw_lock);
+ pclass = g_type_class_ref (ptype);
+ if (node->data->class.class)
+ INVALID_RECURSION ("g_type_plugin_*", node->plugin, NODE_NAME (node));
+ G_WRITE_LOCK (&type_rw_lock);
+ }
+
+ type_class_init_Wm (node, pclass);
+ }
+ G_WRITE_UNLOCK (&type_rw_lock);
+
+ return node->data->class.class;
+}
+
+void
+g_type_class_unref (gpointer g_class)
+{
+ TypeNode *node;
+ GTypeClass *class = g_class;
+
+ g_return_if_fail (g_class != NULL);
+
+ node = lookup_type_node_I (class->g_type);
+ G_WRITE_LOCK (&type_rw_lock);
+ if (node && node->is_classed && node->data &&
+ node->data->class.class == class && node->data->common.ref_count > 0)
+ type_data_unref_Wm (node, FALSE);
+ else
+ g_warning ("cannot unreference class of invalid (unclassed) type `%s'",
+ type_descriptive_name_I (class->g_type));
+ G_WRITE_UNLOCK (&type_rw_lock);
+}
+
+void
+g_type_class_unref_uncached (gpointer g_class)
+{
+ TypeNode *node;
+ GTypeClass *class = g_class;
+
+ g_return_if_fail (g_class != NULL);
+
+ G_WRITE_LOCK (&type_rw_lock);
+ node = lookup_type_node_I (class->g_type);
+ if (node && node->is_classed && node->data &&
+ node->data->class.class == class && node->data->common.ref_count > 0)
+ type_data_unref_Wm (node, TRUE);
+ else
+ g_warning ("cannot unreference class of invalid (unclassed) type `%s'",
+ type_descriptive_name_I (class->g_type));
+ G_WRITE_UNLOCK (&type_rw_lock);
+}
+
+gpointer
+g_type_class_peek (GType type)
+{
+ TypeNode *node;
+ gpointer class;
+
+ node = lookup_type_node_I (type);
+ G_READ_LOCK (&type_rw_lock);
+ if (node && node->is_classed && node->data && node->data->class.class) /* common.ref_count _may_ be 0 */
+ class = node->data->class.class;
+ else
+ class = NULL;
+ G_READ_UNLOCK (&type_rw_lock);
+
+ return class;
+}
+
+gpointer
+g_type_class_peek_static (GType type)
+{
+ TypeNode *node;
+ gpointer class;
+
+ node = lookup_type_node_I (type);
+ G_READ_LOCK (&type_rw_lock);
+ if (node && node->is_classed && node->data &&
+ /* peek only static types: */ node->plugin == NULL &&
+ node->data->class.class) /* common.ref_count _may_ be 0 */
+ class = node->data->class.class;
+ else
+ class = NULL;
+ G_READ_UNLOCK (&type_rw_lock);
+
+ return class;
+}
+
+gpointer
+g_type_class_peek_parent (gpointer g_class)
+{
+ TypeNode *node;
+ gpointer class = NULL;
+
+ g_return_val_if_fail (g_class != NULL, NULL);
+
+ node = lookup_type_node_I (G_TYPE_FROM_CLASS (g_class));
+ /* We used to acquire a read lock here. That is not necessary, since
+ * parent->data->class.class is constant as long as the derived class
+ * exists.
+ */
+ if (node && node->is_classed && node->data && NODE_PARENT_TYPE (node))
+ {
+ node = lookup_type_node_I (NODE_PARENT_TYPE (node));
+ class = node->data->class.class;
+ }
+ else if (NODE_PARENT_TYPE (node))
+ g_warning (G_STRLOC ": invalid class pointer `%p'", g_class);
+
+ return class;
+}
+
+gpointer
+g_type_interface_peek (gpointer instance_class,
+ GType iface_type)
+{
+ TypeNode *node;
+ TypeNode *iface;
+ gpointer vtable = NULL;
+ GTypeClass *class = instance_class;
+
+ g_return_val_if_fail (instance_class != NULL, NULL);
+
+ node = lookup_type_node_I (class->g_type);
+ iface = lookup_type_node_I (iface_type);
+ if (node && node->is_instantiatable && iface)
+ {
+ IFaceEntry *entry;
+
+ G_READ_LOCK (&type_rw_lock);
+
+ entry = type_lookup_iface_entry_L (node, iface);
+ if (entry && entry->vtable) /* entry is relocatable */
+ vtable = entry->vtable;
+
+ G_READ_UNLOCK (&type_rw_lock);
+ }
+ else
+ g_warning (G_STRLOC ": invalid class pointer `%p'", class);
+
+ return vtable;
+}
+
+gpointer
+g_type_interface_peek_parent (gpointer g_iface)
+{
+ TypeNode *node;
+ TypeNode *iface;
+ gpointer vtable = NULL;
+ GTypeInterface *iface_class = g_iface;
+
+ g_return_val_if_fail (g_iface != NULL, NULL);
+
+ iface = lookup_type_node_I (iface_class->g_type);
+ node = lookup_type_node_I (iface_class->g_instance_type);
+ if (node)
+ node = lookup_type_node_I (NODE_PARENT_TYPE (node));
+ if (node && node->is_instantiatable && iface)
+ {
+ IFaceEntry *entry;
+
+ G_READ_LOCK (&type_rw_lock);
+
+ entry = type_lookup_iface_entry_L (node, iface);
+ if (entry && entry->vtable) /* entry is relocatable */
+ vtable = entry->vtable;
+
+ G_READ_UNLOCK (&type_rw_lock);
+ }
+ else if (node)
+ g_warning (G_STRLOC ": invalid interface pointer `%p'", g_iface);
+
+ return vtable;
+}
+
+gpointer
+g_type_default_interface_ref (GType g_type)
+{
+ TypeNode *node;
+
+ G_WRITE_LOCK (&type_rw_lock);
+
+ node = lookup_type_node_I (g_type);
+ if (!node || !NODE_IS_IFACE (node) ||
+ (node->data && node->data->common.ref_count < 1))
+ {
+ G_WRITE_UNLOCK (&type_rw_lock);
+ g_warning ("cannot retrieve default vtable for invalid or non-interface type '%s'",
+ type_descriptive_name_I (g_type));
+ return NULL;
+ }
+
+ type_data_ref_Wm (node);
+
+ type_iface_ensure_dflt_vtable_Wm (node);
+
+ G_WRITE_UNLOCK (&type_rw_lock);
+
+ return node->data->iface.dflt_vtable;
+}
+
+gpointer
+g_type_default_interface_peek (GType g_type)
+{
+ TypeNode *node;
+ gpointer vtable;
+
+ node = lookup_type_node_I (g_type);
+ G_READ_LOCK (&type_rw_lock);
+ if (node && NODE_IS_IFACE (node) && node->data && node->data->iface.dflt_vtable)
+ vtable = node->data->iface.dflt_vtable;
+ else
+ vtable = NULL;
+ G_READ_UNLOCK (&type_rw_lock);
+
+ return vtable;
+}
+
+void
+g_type_default_interface_unref (gpointer g_iface)
+{
+ TypeNode *node;
+ GTypeInterface *vtable = g_iface;
+
+ g_return_if_fail (g_iface != NULL);
+
+ node = lookup_type_node_I (vtable->g_type);
+ G_WRITE_LOCK (&type_rw_lock);
+ if (node && NODE_IS_IFACE (node) &&
+ node->data->iface.dflt_vtable == g_iface &&
+ node->data->common.ref_count > 0)
+ type_data_unref_Wm (node, FALSE);
+ else
+ g_warning ("cannot unreference invalid interface default vtable for '%s'",
+ type_descriptive_name_I (vtable->g_type));
+ G_WRITE_UNLOCK (&type_rw_lock);
+}
+
+G_CONST_RETURN gchar*
+g_type_name (GType type)
+{
+ TypeNode *node;
+
+ g_return_val_if_uninitialized (static_quark_type_flags, g_type_init, NULL);
+
+ node = lookup_type_node_I (type);
+
+ return node ? NODE_NAME (node) : NULL;
+}
+
+GQuark
+g_type_qname (GType type)
+{
+ TypeNode *node;
+
+ node = lookup_type_node_I (type);
+
+ return node ? node->qname : 0;
+}
+
+GType
+g_type_from_name (const gchar *name)
+{
+ GType type = 0;
+ GQuark quark;
+
+ g_return_val_if_fail (name != NULL, 0);
+
+ quark = g_quark_try_string (name);
+ if (quark)
+ {
+ G_READ_LOCK (&type_rw_lock);
+ type = (GType) g_hash_table_lookup (static_type_nodes_ht, GUINT_TO_POINTER (quark));
+ G_READ_UNLOCK (&type_rw_lock);
+ }
+
+ return type;
+}
+
+GType
+g_type_parent (GType type)
+{
+ TypeNode *node;
+
+ node = lookup_type_node_I (type);
+
+ return node ? NODE_PARENT_TYPE (node) : 0;
+}
+
+guint
+g_type_depth (GType type)
+{
+ TypeNode *node;
+
+ node = lookup_type_node_I (type);
+
+ return node ? node->n_supers + 1 : 0;
+}
+
+GType
+g_type_next_base (GType type,
+ GType base_type)
+{
+ GType atype = 0;
+ TypeNode *node;
+
+ node = lookup_type_node_I (type);
+ if (node)
+ {
+ TypeNode *base_node = lookup_type_node_I (base_type);
+
+ if (base_node && base_node->n_supers < node->n_supers)
+ {
+ guint n = node->n_supers - base_node->n_supers;
+
+ if (node->supers[n] == base_type)
+ atype = node->supers[n - 1];
+ }
+ }
+
+ return atype;
+}
+
+static inline gboolean
+type_node_check_conformities_UorL (TypeNode *node,
+ TypeNode *iface_node,
+ /* support_inheritance */
+ gboolean support_interfaces,
+ gboolean support_prerequisites,
+ gboolean have_lock)
+{
+ gboolean match;
+
+ if (/* support_inheritance && */
+ NODE_IS_ANCESTOR (iface_node, node))
+ return TRUE;
+
+ support_interfaces = support_interfaces && node->is_instantiatable && NODE_IS_IFACE (iface_node);
+ support_prerequisites = support_prerequisites && NODE_IS_IFACE (node);
+ match = FALSE;
+ if (support_interfaces || support_prerequisites)
+ {
+ if (!have_lock)
+ G_READ_LOCK (&type_rw_lock);
+ if (support_interfaces && type_lookup_iface_entry_L (node, iface_node))
+ match = TRUE;
+ else if (support_prerequisites && type_lookup_prerequisite_L (node, NODE_TYPE (iface_node)))
+ match = TRUE;
+ if (!have_lock)
+ G_READ_UNLOCK (&type_rw_lock);
+ }
+ return match;
+}
+
+static gboolean
+type_node_is_a_L (TypeNode *node,
+ TypeNode *iface_node)
+{
+ return type_node_check_conformities_UorL (node, iface_node, TRUE, TRUE, TRUE);
+}
+
+static inline gboolean
+type_node_conforms_to_U (TypeNode *node,
+ TypeNode *iface_node,
+ gboolean support_interfaces,
+ gboolean support_prerequisites)
+{
+ return type_node_check_conformities_UorL (node, iface_node, support_interfaces, support_prerequisites, FALSE);
+}
+
+gboolean
+g_type_is_a (GType type,
+ GType iface_type)
+{
+ TypeNode *node, *iface_node;
+ gboolean is_a;
+
+ node = lookup_type_node_I (type);
+ iface_node = lookup_type_node_I (iface_type);
+ is_a = node && iface_node && type_node_conforms_to_U (node, iface_node, TRUE, TRUE);
+
+ return is_a;
+}
+
+GType* /* free result */
+g_type_children (GType type,
+ guint *n_children)
+{
+ TypeNode *node;
+
+ node = lookup_type_node_I (type);
+ if (node)
+ {
+ GType *children;
+
+ G_READ_LOCK (&type_rw_lock); /* ->children is relocatable */
+ children = g_new (GType, node->n_children + 1);
+ memcpy (children, node->children, sizeof (GType) * node->n_children);
+ children[node->n_children] = 0;
+
+ if (n_children)
+ *n_children = node->n_children;
+ G_READ_UNLOCK (&type_rw_lock);
+
+ return children;
+ }
+ else
+ {
+ if (n_children)
+ *n_children = 0;
+
+ return NULL;
+ }
+}
+
+GType* /* free result */
+g_type_interfaces (GType type,
+ guint *n_interfaces)
+{
+ TypeNode *node;
+
+ node = lookup_type_node_I (type);
+ if (node && node->is_instantiatable)
+ {
+ GType *ifaces;
+ guint i;
+
+ G_READ_LOCK (&type_rw_lock);
+ ifaces = g_new (GType, CLASSED_NODE_N_IFACES (node) + 1);
+ for (i = 0; i < CLASSED_NODE_N_IFACES (node); i++)
+ ifaces[i] = CLASSED_NODE_IFACES_ENTRIES (node)[i].iface_type;
+ ifaces[i] = 0;
+
+ if (n_interfaces)
+ *n_interfaces = CLASSED_NODE_N_IFACES (node);
+ G_READ_UNLOCK (&type_rw_lock);
+
+ return ifaces;
+ }
+ else
+ {
+ if (n_interfaces)
+ *n_interfaces = 0;
+
+ return NULL;
+ }
+}
+
+typedef struct _QData QData;
+struct _GData
+{
+ guint n_qdatas;
+ QData *qdatas;
+};
+struct _QData
+{
+ GQuark quark;
+ gpointer data;
+};
+
+static inline gpointer
+type_get_qdata_L (TypeNode *node,
+ GQuark quark)
+{
+ GData *gdata = node->global_gdata;
+
+ if (quark && gdata && gdata->n_qdatas)
+ {
+ QData *qdatas = gdata->qdatas - 1;
+ guint n_qdatas = gdata->n_qdatas;
+
+ do
+ {
+ guint i;
+ QData *check;
+
+ i = (n_qdatas + 1) / 2;
+ check = qdatas + i;
+ if (quark == check->quark)
+ return check->data;
+ else if (quark > check->quark)
+ {
+ n_qdatas -= i;
+ qdatas = check;
+ }
+ else /* if (quark < check->quark) */
+ n_qdatas = i - 1;
+ }
+ while (n_qdatas);
+ }
+ return NULL;
+}
+
+gpointer
+g_type_get_qdata (GType type,
+ GQuark quark)
+{
+ TypeNode *node;
+ gpointer data;
+
+ node = lookup_type_node_I (type);
+ if (node)
+ {
+ G_READ_LOCK (&type_rw_lock);
+ data = type_get_qdata_L (node, quark);
+ G_READ_UNLOCK (&type_rw_lock);
+ }
+ else
+ {
+ g_return_val_if_fail (node != NULL, NULL);
+ data = NULL;
+ }
+ return data;
+}
+
+static inline void
+type_set_qdata_W (TypeNode *node,
+ GQuark quark,
+ gpointer data)
+{
+ GData *gdata;
+ QData *qdata;
+ guint i;
+
+ /* setup qdata list if necessary */
+ if (!node->global_gdata)
+ node->global_gdata = g_new0 (GData, 1);
+ gdata = node->global_gdata;
+
+ /* try resetting old data */
+ qdata = gdata->qdatas;
+ for (i = 0; i < gdata->n_qdatas; i++)
+ if (qdata[i].quark == quark)
+ {
+ qdata[i].data = data;
+ return;
+ }
+
+ /* add new entry */
+ gdata->n_qdatas++;
+ gdata->qdatas = g_renew (QData, gdata->qdatas, gdata->n_qdatas);
+ qdata = gdata->qdatas;
+ for (i = 0; i < gdata->n_qdatas - 1; i++)
+ if (qdata[i].quark > quark)
+ break;
+ g_memmove (qdata + i + 1, qdata + i, sizeof (qdata[0]) * (gdata->n_qdatas - i - 1));
+ qdata[i].quark = quark;
+ qdata[i].data = data;
+}
+
+void
+g_type_set_qdata (GType type,
+ GQuark quark,
+ gpointer data)
+{
+ TypeNode *node;
+
+ g_return_if_fail (quark != 0);
+
+ node = lookup_type_node_I (type);
+ if (node)
+ {
+ G_WRITE_LOCK (&type_rw_lock);
+ type_set_qdata_W (node, quark, data);
+ G_WRITE_UNLOCK (&type_rw_lock);
+ }
+ else
+ g_return_if_fail (node != NULL);
+}
+
+static void
+type_add_flags_W (TypeNode *node,
+ GTypeFlags flags)
+{
+ guint dflags;
+
+ g_return_if_fail ((flags & ~TYPE_FLAG_MASK) == 0);
+ g_return_if_fail (node != NULL);
+
+ if ((flags & TYPE_FLAG_MASK) && node->is_classed && node->data && node->data->class.class)
+ g_warning ("tagging type `%s' as abstract after class initialization", NODE_NAME (node));
+ dflags = GPOINTER_TO_UINT (type_get_qdata_L (node, static_quark_type_flags));
+ dflags |= flags;
+ type_set_qdata_W (node, static_quark_type_flags, GUINT_TO_POINTER (dflags));
+}
+
+void
+g_type_query (GType type,
+ GTypeQuery *query)
+{
+ TypeNode *node;
+
+ g_return_if_fail (query != NULL);
+
+ /* if node is not static and classed, we won't allow query */
+ query->type = 0;
+ node = lookup_type_node_I (type);
+ if (node && node->is_classed && !node->plugin)
+ {
+ /* type is classed and probably even instantiatable */
+ G_READ_LOCK (&type_rw_lock);
+ if (node->data) /* type is static or referenced */
+ {
+ query->type = NODE_TYPE (node);
+ query->type_name = NODE_NAME (node);
+ query->class_size = node->data->class.class_size;
+ query->instance_size = node->is_instantiatable ? node->data->instance.instance_size : 0;
+ }
+ G_READ_UNLOCK (&type_rw_lock);
+ }
+}
+
+
+/* --- implementation details --- */
+gboolean
+g_type_test_flags (GType type,
+ guint flags)
+{
+ TypeNode *node;
+ gboolean result = FALSE;
+
+ node = lookup_type_node_I (type);
+ if (node)
+ {
+ guint fflags = flags & TYPE_FUNDAMENTAL_FLAG_MASK;
+ guint tflags = flags & TYPE_FLAG_MASK;
+
+ if (fflags)
+ {
+ GTypeFundamentalInfo *finfo = type_node_fundamental_info_I (node);
+
+ fflags = (finfo->type_flags & fflags) == fflags;
+ }
+ else
+ fflags = TRUE;
+
+ if (tflags)
+ {
+ G_READ_LOCK (&type_rw_lock);
+ tflags = (tflags & GPOINTER_TO_UINT (type_get_qdata_L (node, static_quark_type_flags))) == tflags;
+ G_READ_UNLOCK (&type_rw_lock);
+ }
+ else
+ tflags = TRUE;
+
+ result = tflags && fflags;
+ }
+
+ return result;
+}
+
+GTypePlugin*
+g_type_get_plugin (GType type)
+{
+ TypeNode *node;
+
+ node = lookup_type_node_I (type);
+
+ return node ? node->plugin : NULL;
+}
+
+GTypePlugin*
+g_type_interface_get_plugin (GType instance_type,
+ GType interface_type)
+{
+ TypeNode *node;
+ TypeNode *iface;
+
+ g_return_val_if_fail (G_TYPE_IS_INTERFACE (interface_type), NULL); /* G_TYPE_IS_INTERFACE() is an external call: _U */
+
+ node = lookup_type_node_I (instance_type);
+ iface = lookup_type_node_I (interface_type);
+ if (node && iface)
+ {
+ IFaceHolder *iholder;
+ GTypePlugin *plugin;
+
+ G_READ_LOCK (&type_rw_lock);
+
+ iholder = iface_node_get_holders_L (iface);
+ while (iholder && iholder->instance_type != instance_type)
+ iholder = iholder->next;
+ plugin = iholder ? iholder->plugin : NULL;
+
+ G_READ_UNLOCK (&type_rw_lock);
+
+ return plugin;
+ }
+
+ g_return_val_if_fail (node == NULL, NULL);
+ g_return_val_if_fail (iface == NULL, NULL);
+
+ g_warning (G_STRLOC ": attempt to look up plugin for invalid instance/interface type pair.");
+
+ return NULL;
+}
+
+GType
+g_type_fundamental_next (void)
+{
+ GType type;
+
+ G_READ_LOCK (&type_rw_lock);
+ type = static_fundamental_next;
+ G_READ_UNLOCK (&type_rw_lock);
+ type = G_TYPE_MAKE_FUNDAMENTAL (type);
+ return type <= G_TYPE_FUNDAMENTAL_MAX ? type : 0;
+}
+
+GType
+g_type_fundamental (GType type_id)
+{
+ TypeNode *node = lookup_type_node_I (type_id);
+
+ return node ? NODE_FUNDAMENTAL_TYPE (node) : 0;
+}
+
+gboolean
+g_type_check_instance_is_a (GTypeInstance *type_instance,
+ GType iface_type)
+{
+ TypeNode *node, *iface;
+ gboolean check;
+
+ if (!type_instance || !type_instance->g_class)
+ return FALSE;
+
+ node = lookup_type_node_I (type_instance->g_class->g_type);
+ iface = lookup_type_node_I (iface_type);
+ check = node && node->is_instantiatable && iface && type_node_conforms_to_U (node, iface, TRUE, FALSE);
+
+ return check;
+}
+
+gboolean
+g_type_check_class_is_a (GTypeClass *type_class,
+ GType is_a_type)
+{
+ TypeNode *node, *iface;
+ gboolean check;
+
+ if (!type_class)
+ return FALSE;
+
+ node = lookup_type_node_I (type_class->g_type);
+ iface = lookup_type_node_I (is_a_type);
+ check = node && node->is_classed && iface && type_node_conforms_to_U (node, iface, FALSE, FALSE);
+
+ return check;
+}
+
+GTypeInstance*
+g_type_check_instance_cast (GTypeInstance *type_instance,
+ GType iface_type)
+{
+ if (type_instance)
+ {
+ if (type_instance->g_class)
+ {
+ TypeNode *node, *iface;
+ gboolean is_instantiatable, check;
+
+ node = lookup_type_node_I (type_instance->g_class->g_type);
+ is_instantiatable = node && node->is_instantiatable;
+ iface = lookup_type_node_I (iface_type);
+ check = is_instantiatable && iface && type_node_conforms_to_U (node, iface, TRUE, FALSE);
+ if (check)
+ return type_instance;
+
+ if (is_instantiatable)
+ g_warning ("invalid cast from `%s' to `%s'",
+ type_descriptive_name_I (type_instance->g_class->g_type),
+ type_descriptive_name_I (iface_type));
+ else
+ g_warning ("invalid uninstantiatable type `%s' in cast to `%s'",
+ type_descriptive_name_I (type_instance->g_class->g_type),
+ type_descriptive_name_I (iface_type));
+ }
+ else
+ g_warning ("invalid unclassed pointer in cast to `%s'",
+ type_descriptive_name_I (iface_type));
+ }
+
+ return type_instance;
+}
+
+GTypeClass*
+g_type_check_class_cast (GTypeClass *type_class,
+ GType is_a_type)
+{
+ if (type_class)
+ {
+ TypeNode *node, *iface;
+ gboolean is_classed, check;
+
+ node = lookup_type_node_I (type_class->g_type);
+ is_classed = node && node->is_classed;
+ iface = lookup_type_node_I (is_a_type);
+ check = is_classed && iface && type_node_conforms_to_U (node, iface, FALSE, FALSE);
+ if (check)
+ return type_class;
+
+ if (is_classed)
+ g_warning ("invalid class cast from `%s' to `%s'",
+ type_descriptive_name_I (type_class->g_type),
+ type_descriptive_name_I (is_a_type));
+ else
+ g_warning ("invalid unclassed type `%s' in class cast to `%s'",
+ type_descriptive_name_I (type_class->g_type),
+ type_descriptive_name_I (is_a_type));
+ }
+ else
+ g_warning ("invalid class cast from (NULL) pointer to `%s'",
+ type_descriptive_name_I (is_a_type));
+ return type_class;
+}
+
+gboolean
+g_type_check_instance (GTypeInstance *type_instance)
+{
+ /* this function is just here to make the signal system
+ * conveniently elaborated on instance checks
+ */
+ if (type_instance)
+ {
+ if (type_instance->g_class)
+ {
+ TypeNode *node = lookup_type_node_I (type_instance->g_class->g_type);
+
+ if (node && node->is_instantiatable)
+ return TRUE;
+
+ g_warning ("instance of invalid non-instantiatable type `%s'",
+ type_descriptive_name_I (type_instance->g_class->g_type));
+ }
+ else
+ g_warning ("instance with invalid (NULL) class pointer");
+ }
+ else
+ g_warning ("invalid (NULL) pointer instance");
+
+ return FALSE;
+}
+
+static inline gboolean
+type_check_is_value_type_U (GType type)
+{
+ GTypeFlags tflags = G_TYPE_FLAG_VALUE_ABSTRACT;
+ TypeNode *node;
+
+ /* common path speed up */
+ node = lookup_type_node_I (type);
+ if (node && node->mutatable_check_cache)
+ return TRUE;
+
+ G_READ_LOCK (&type_rw_lock);
+ restart_check:
+ if (node)
+ {
+ if (node->data && node->data->common.ref_count > 0 &&
+ node->data->common.value_table->value_init)
+ tflags = GPOINTER_TO_UINT (type_get_qdata_L (node, static_quark_type_flags));
+ else if (NODE_IS_IFACE (node))
+ {
+ guint i;
+
+ for (i = 0; i < IFACE_NODE_N_PREREQUISITES (node); i++)
+ {
+ GType prtype = IFACE_NODE_PREREQUISITES (node)[i];
+ TypeNode *prnode = lookup_type_node_I (prtype);
+
+ if (prnode->is_instantiatable)
+ {
+ type = prtype;
+ node = lookup_type_node_I (type);
+ goto restart_check;
+ }
+ }
+ }
+ }
+ G_READ_UNLOCK (&type_rw_lock);
+
+ return !(tflags & G_TYPE_FLAG_VALUE_ABSTRACT);
+}
+
+gboolean
+g_type_check_is_value_type (GType type)
+{
+ return type_check_is_value_type_U (type);
+}
+
+gboolean
+g_type_check_value (GValue *value)
+{
+ return value && type_check_is_value_type_U (value->g_type);
+}
+
+gboolean
+g_type_check_value_holds (GValue *value,
+ GType type)
+{
+ return value && type_check_is_value_type_U (value->g_type) && g_type_is_a (value->g_type, type);
+}
+
+GTypeValueTable*
+g_type_value_table_peek (GType type)
+{
+ GTypeValueTable *vtable = NULL;
+ TypeNode *node = lookup_type_node_I (type);
+ gboolean has_refed_data, has_table;
+ TypeData *data;
+
+ /* speed up common code path, we're not 100% safe here,
+ * but we should only get called with referenced types anyway
+ */
+ data = node ? node->data : NULL;
+ if (node && node->mutatable_check_cache)
+ return data->common.value_table;
+
+ G_READ_LOCK (&type_rw_lock);
+
+ restart_table_peek:
+ has_refed_data = node && node->data && node->data->common.ref_count;
+ has_table = has_refed_data && node->data->common.value_table->value_init;
+ if (has_refed_data)
+ {
+ if (has_table)
+ vtable = node->data->common.value_table;
+ else if (NODE_IS_IFACE (node))
+ {
+ guint i;
+
+ for (i = 0; i < IFACE_NODE_N_PREREQUISITES (node); i++)
+ {
+ GType prtype = IFACE_NODE_PREREQUISITES (node)[i];
+ TypeNode *prnode = lookup_type_node_I (prtype);
+
+ if (prnode->is_instantiatable)
+ {
+ type = prtype;
+ node = lookup_type_node_I (type);
+ goto restart_table_peek;
+ }
+ }
+ }
+ }
+
+ G_READ_UNLOCK (&type_rw_lock);
+
+ if (vtable)
+ return vtable;
+
+ if (!node)
+ g_warning (G_STRLOC ": type id `%lu' is invalid", type);
+ if (!has_refed_data)
+ g_warning ("can't peek value table for type `%s' which is not currently referenced",
+ type_descriptive_name_I (type));
+
+ return NULL;
+}
+
+G_CONST_RETURN gchar*
+g_type_name_from_instance (GTypeInstance *instance)
+{
+ if (!instance)
+ return "<NULL-instance>";
+ else
+ return g_type_name_from_class (instance->g_class);
+}
+
+G_CONST_RETURN gchar*
+g_type_name_from_class (GTypeClass *g_class)
+{
+ if (!g_class)
+ return "<NULL-class>";
+ else
+ return g_type_name (g_class->g_type);
+}
+
+
+/* --- initialization --- */
+void
+g_type_init_with_debug_flags (GTypeDebugFlags debug_flags)
+{
+ G_LOCK_DEFINE_STATIC (type_init_lock);
+ const gchar *env_string;
+ GTypeInfo info;
+ TypeNode *node;
+ GType type;
+
+ G_LOCK (type_init_lock);
+
+ G_WRITE_LOCK (&type_rw_lock);
+
+ if (static_quark_type_flags)
+ {
+ G_WRITE_UNLOCK (&type_rw_lock);
+ G_UNLOCK (type_init_lock);
+ return;
+ }
+
+ /* setup GObject library wide debugging flags */
+ _g_type_debug_flags = debug_flags & G_TYPE_DEBUG_MASK;
+ env_string = g_getenv ("GOBJECT_DEBUG");
+ if (env_string != NULL)
+ {
+ static GDebugKey debug_keys[] = {
+ { "objects", G_TYPE_DEBUG_OBJECTS },
+ { "signals", G_TYPE_DEBUG_SIGNALS },
+ };
+
+ _g_type_debug_flags |= g_parse_debug_string (env_string,
+ debug_keys,
+ sizeof (debug_keys) / sizeof (debug_keys[0]));
+ env_string = NULL;
+ }
+
+ /* quarks */
+ static_quark_type_flags = g_quark_from_static_string ("-g-type-private--GTypeFlags");
+ static_quark_iface_holder = g_quark_from_static_string ("-g-type-private--IFaceHolder");
+ static_quark_dependants_array = g_quark_from_static_string ("-g-type-private--dependants-array");
+
+ /* type qname hash table */
+ static_type_nodes_ht = g_hash_table_new (g_direct_hash, g_direct_equal);
+
+ /* invalid type G_TYPE_INVALID (0)
+ */
+ static_fundamental_type_nodes[0] = NULL;
+
+ /* void type G_TYPE_NONE
+ */
+ node = type_node_fundamental_new_W (G_TYPE_NONE, g_intern_static_string ("void"), 0);
+ type = NODE_TYPE (node);
+ g_assert (type == G_TYPE_NONE);
+
+ /* interface fundamental type G_TYPE_INTERFACE (!classed)
+ */
+ memset (&info, 0, sizeof (info));
+ node = type_node_fundamental_new_W (G_TYPE_INTERFACE, g_intern_static_string ("GInterface"), G_TYPE_FLAG_DERIVABLE);
+ type = NODE_TYPE (node);
+ type_data_make_W (node, &info, NULL);
+ g_assert (type == G_TYPE_INTERFACE);
+
+ G_WRITE_UNLOCK (&type_rw_lock);
+
+ g_value_c_init ();
+
+ /* G_TYPE_TYPE_PLUGIN
+ */
+ g_type_plugin_get_type ();
+
+ /* G_TYPE_* value types
+ */
+ g_value_types_init ();
+
+ /* G_TYPE_ENUM & G_TYPE_FLAGS
+ */
+ g_enum_types_init ();
+
+ /* G_TYPE_BOXED
+ */
+ g_boxed_type_init ();
+
+ /* G_TYPE_PARAM
+ */
+ g_param_type_init ();
+
+ /* G_TYPE_OBJECT
+ */
+ g_object_type_init ();
+
+ /* G_TYPE_PARAM_* pspec types
+ */
+ g_param_spec_types_init ();
+
+ /* Value Transformations
+ */
+ g_value_transforms_init ();
+
+ /* Signal system
+ */
+ g_signal_init ();
+
+ G_UNLOCK (type_init_lock);
+}
+
+void
+g_type_init (void)
+{
+ g_type_init_with_debug_flags (0);
+}
+
+void
+g_type_class_add_private (gpointer g_class,
+ gsize private_size)
+{
+ GType instance_type = ((GTypeClass *)g_class)->g_type;
+ TypeNode *node = lookup_type_node_I (instance_type);
+ gsize offset;
+
+ if (!node || !node->is_instantiatable || !node->data || node->data->class.class != g_class)
+ {
+ g_warning ("cannot add private field to invalid (non-instantiatable) type '%s'",
+ type_descriptive_name_I (instance_type));
+ return;
+ }
+
+ if (NODE_PARENT_TYPE (node))
+ {
+ TypeNode *pnode = lookup_type_node_I (NODE_PARENT_TYPE (node));
+ if (node->data->instance.private_size != pnode->data->instance.private_size)
+ {
+ g_warning ("g_type_add_private() called multiple times for the same type");
+ return;
+ }
+ }
+
+ G_WRITE_LOCK (&type_rw_lock);
+
+ offset = ALIGN_STRUCT (node->data->instance.private_size);
+ node->data->instance.private_size = offset + private_size;
+
+ G_WRITE_UNLOCK (&type_rw_lock);
+}
+
+gpointer
+g_type_instance_get_private (GTypeInstance *instance,
+ GType private_type)
+{
+ TypeNode *instance_node;
+ TypeNode *private_node;
+ TypeNode *parent_node;
+ GTypeClass *class;
+ gsize offset;
+
+ g_return_val_if_fail (instance != NULL && instance->g_class != NULL, NULL);
+
+ /* while instances are initialized, their class pointers change,
+ * so figure the instances real class first
+ */
+ class = instance_real_class_get (instance);
+ if (!class)
+ class = instance->g_class;
+
+ instance_node = lookup_type_node_I (class->g_type);
+ if (G_UNLIKELY (!instance_node || !instance_node->is_instantiatable))
+ {
+ g_warning ("instance of invalid non-instantiatable type `%s'",
+ type_descriptive_name_I (instance->g_class->g_type));
+ return NULL;
+ }
+
+ private_node = lookup_type_node_I (private_type);
+ if (G_UNLIKELY (!private_node || !NODE_IS_ANCESTOR (private_node, instance_node)))
+ {
+ g_warning ("attempt to retrieve private data for invalid type '%s'",
+ type_descriptive_name_I (private_type));
+ return NULL;
+ }
+
+ /* Note that we don't need a read lock, since instance existing
+ * means that the instance class and all parent classes
+ * exist, so the node->data, node->data->instance.instance_size,
+ * and node->data->instance.private_size are not going to be changed.
+ * for any of the relevant types.
+ */
+
+ offset = ALIGN_STRUCT (instance_node->data->instance.instance_size);
+
+ if (NODE_PARENT_TYPE (private_node))
+ {
+ parent_node = lookup_type_node_I (NODE_PARENT_TYPE (private_node));
+ g_assert (parent_node->data && parent_node->data->common.ref_count);
+
+ if (G_UNLIKELY (private_node->data->instance.private_size == parent_node->data->instance.private_size))
+ {
+ g_warning ("g_type_instance_get_private() requires a prior call to g_type_class_add_private()");
+ return NULL;
+ }
+
+ offset += ALIGN_STRUCT (parent_node->data->instance.private_size);
+ }
+
+ return G_STRUCT_MEMBER_P (instance, offset);
+}
+
+#define __G_TYPE_C__
+#include "gobjectaliasdef.c"
diff --git a/trunk/gobject/gtype.h b/trunk/gobject/gtype.h
new file mode 100644
index 000000000..1586888cc
--- /dev/null
+++ b/trunk/gobject/gtype.h
@@ -0,0 +1,498 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1998-1999, 2000-2001 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.
+ */
+#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
+#error "Only <glib-object.h> can be included directly."
+#endif
+
+#ifndef __G_TYPE_H__
+#define __G_TYPE_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+/* Basic Type Macros
+ */
+#define G_TYPE_FUNDAMENTAL(type) (g_type_fundamental (type))
+#define G_TYPE_FUNDAMENTAL_MAX (255 << G_TYPE_FUNDAMENTAL_SHIFT)
+
+/* Constant fundamental types,
+ * introduced by g_type_init().
+ */
+#define G_TYPE_INVALID G_TYPE_MAKE_FUNDAMENTAL (0)
+#define G_TYPE_NONE G_TYPE_MAKE_FUNDAMENTAL (1)
+#define G_TYPE_INTERFACE G_TYPE_MAKE_FUNDAMENTAL (2)
+#define G_TYPE_CHAR G_TYPE_MAKE_FUNDAMENTAL (3)
+#define G_TYPE_UCHAR G_TYPE_MAKE_FUNDAMENTAL (4)
+#define G_TYPE_BOOLEAN G_TYPE_MAKE_FUNDAMENTAL (5)
+#define G_TYPE_INT G_TYPE_MAKE_FUNDAMENTAL (6)
+#define G_TYPE_UINT G_TYPE_MAKE_FUNDAMENTAL (7)
+#define G_TYPE_LONG G_TYPE_MAKE_FUNDAMENTAL (8)
+#define G_TYPE_ULONG G_TYPE_MAKE_FUNDAMENTAL (9)
+#define G_TYPE_INT64 G_TYPE_MAKE_FUNDAMENTAL (10)
+#define G_TYPE_UINT64 G_TYPE_MAKE_FUNDAMENTAL (11)
+#define G_TYPE_ENUM G_TYPE_MAKE_FUNDAMENTAL (12)
+#define G_TYPE_FLAGS G_TYPE_MAKE_FUNDAMENTAL (13)
+#define G_TYPE_FLOAT G_TYPE_MAKE_FUNDAMENTAL (14)
+#define G_TYPE_DOUBLE G_TYPE_MAKE_FUNDAMENTAL (15)
+#define G_TYPE_STRING G_TYPE_MAKE_FUNDAMENTAL (16)
+#define G_TYPE_POINTER G_TYPE_MAKE_FUNDAMENTAL (17)
+#define G_TYPE_BOXED G_TYPE_MAKE_FUNDAMENTAL (18)
+#define G_TYPE_PARAM G_TYPE_MAKE_FUNDAMENTAL (19)
+#define G_TYPE_OBJECT G_TYPE_MAKE_FUNDAMENTAL (20)
+
+
+/* Reserved fundamental type numbers to create new fundamental
+ * type IDs with G_TYPE_MAKE_FUNDAMENTAL().
+ * Send email to gtk-devel-list@redhat.com for reservations.
+ */
+#define G_TYPE_FUNDAMENTAL_SHIFT (2)
+#define G_TYPE_MAKE_FUNDAMENTAL(x) ((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
+#define G_TYPE_RESERVED_GLIB_FIRST (21)
+#define G_TYPE_RESERVED_GLIB_LAST (31)
+#define G_TYPE_RESERVED_BSE_FIRST (32)
+#define G_TYPE_RESERVED_BSE_LAST (48)
+#define G_TYPE_RESERVED_USER_FIRST (49)
+
+
+/* Type Checking Macros
+ */
+#define G_TYPE_IS_FUNDAMENTAL(type) ((type) <= G_TYPE_FUNDAMENTAL_MAX)
+#define G_TYPE_IS_DERIVED(type) ((type) > G_TYPE_FUNDAMENTAL_MAX)
+#define G_TYPE_IS_INTERFACE(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_INTERFACE)
+#define G_TYPE_IS_CLASSED(type) (g_type_test_flags ((type), G_TYPE_FLAG_CLASSED))
+#define G_TYPE_IS_INSTANTIATABLE(type) (g_type_test_flags ((type), G_TYPE_FLAG_INSTANTIATABLE))
+#define G_TYPE_IS_DERIVABLE(type) (g_type_test_flags ((type), G_TYPE_FLAG_DERIVABLE))
+#define G_TYPE_IS_DEEP_DERIVABLE(type) (g_type_test_flags ((type), G_TYPE_FLAG_DEEP_DERIVABLE))
+#define G_TYPE_IS_ABSTRACT(type) (g_type_test_flags ((type), G_TYPE_FLAG_ABSTRACT))
+#define G_TYPE_IS_VALUE_ABSTRACT(type) (g_type_test_flags ((type), G_TYPE_FLAG_VALUE_ABSTRACT))
+#define G_TYPE_IS_VALUE_TYPE(type) (g_type_check_is_value_type (type))
+#define G_TYPE_HAS_VALUE_TABLE(type) (g_type_value_table_peek (type) != NULL)
+
+
+/* Typedefs
+ */
+#if GLIB_SIZEOF_LONG == GLIB_SIZEOF_SIZE_T
+typedef gulong GType;
+#else /* hm, shouldn't happen? */
+typedef gsize GType;
+#endif
+typedef struct _GValue GValue;
+typedef union _GTypeCValue GTypeCValue;
+typedef struct _GTypePlugin GTypePlugin;
+typedef struct _GTypeClass GTypeClass;
+typedef struct _GTypeInterface GTypeInterface;
+typedef struct _GTypeInstance GTypeInstance;
+typedef struct _GTypeInfo GTypeInfo;
+typedef struct _GTypeFundamentalInfo GTypeFundamentalInfo;
+typedef struct _GInterfaceInfo GInterfaceInfo;
+typedef struct _GTypeValueTable GTypeValueTable;
+typedef struct _GTypeQuery GTypeQuery;
+
+
+/* Basic Type Structures
+ */
+struct _GTypeClass
+{
+ /*< private >*/
+ GType g_type;
+};
+struct _GTypeInstance
+{
+ /*< private >*/
+ GTypeClass *g_class;
+};
+struct _GTypeInterface
+{
+ /*< private >*/
+ GType g_type; /* iface type */
+ GType g_instance_type;
+};
+struct _GTypeQuery
+{
+ GType type;
+ const gchar *type_name;
+ guint class_size;
+ guint instance_size;
+};
+
+
+/* Casts, checks and accessors for structured types
+ * usage of these macros is reserved to type implementations only
+ */
+/*< protected >*/
+#define G_TYPE_CHECK_INSTANCE(instance) (_G_TYPE_CHI ((GTypeInstance*) (instance)))
+#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type) (_G_TYPE_CIC ((instance), (g_type), c_type))
+#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type) (_G_TYPE_CIT ((instance), (g_type)))
+#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type) (_G_TYPE_IGC ((instance), (g_type), c_type))
+#define G_TYPE_INSTANCE_GET_INTERFACE(instance, g_type, c_type) (_G_TYPE_IGI ((instance), (g_type), c_type))
+#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type) (_G_TYPE_CCC ((g_class), (g_type), c_type))
+#define G_TYPE_CHECK_CLASS_TYPE(g_class, g_type) (_G_TYPE_CCT ((g_class), (g_type)))
+#define G_TYPE_CHECK_VALUE(value) (_G_TYPE_CHV ((value)))
+#define G_TYPE_CHECK_VALUE_TYPE(value, g_type) (_G_TYPE_CVH ((value), (g_type)))
+#define G_TYPE_FROM_INSTANCE(instance) (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class))
+#define G_TYPE_FROM_CLASS(g_class) (((GTypeClass*) (g_class))->g_type)
+#define G_TYPE_FROM_INTERFACE(g_iface) (((GTypeInterface*) (g_iface))->g_type)
+
+#define G_TYPE_INSTANCE_GET_PRIVATE(instance, g_type, c_type) ((c_type*) g_type_instance_get_private ((GTypeInstance*) (instance), (g_type)))
+
+
+/* debug flags for g_type_init_with_debug_flags() */
+typedef enum /*< skip >*/
+{
+ G_TYPE_DEBUG_NONE = 0,
+ G_TYPE_DEBUG_OBJECTS = 1 << 0,
+ G_TYPE_DEBUG_SIGNALS = 1 << 1,
+ G_TYPE_DEBUG_MASK = 0x03
+} GTypeDebugFlags;
+
+
+/* --- prototypes --- */
+void g_type_init (void);
+void g_type_init_with_debug_flags (GTypeDebugFlags debug_flags);
+G_CONST_RETURN gchar* g_type_name (GType type);
+GQuark g_type_qname (GType type);
+GType g_type_from_name (const gchar *name);
+GType g_type_parent (GType type);
+guint g_type_depth (GType type);
+GType g_type_next_base (GType leaf_type,
+ GType root_type);
+gboolean g_type_is_a (GType type,
+ GType is_a_type);
+gpointer g_type_class_ref (GType type);
+gpointer g_type_class_peek (GType type);
+gpointer g_type_class_peek_static (GType type);
+void g_type_class_unref (gpointer g_class);
+gpointer g_type_class_peek_parent (gpointer g_class);
+gpointer g_type_interface_peek (gpointer instance_class,
+ GType iface_type);
+gpointer g_type_interface_peek_parent (gpointer g_iface);
+
+gpointer g_type_default_interface_ref (GType g_type);
+gpointer g_type_default_interface_peek (GType g_type);
+void g_type_default_interface_unref (gpointer g_iface);
+
+/* g_free() the returned arrays */
+GType* g_type_children (GType type,
+ guint *n_children);
+GType* g_type_interfaces (GType type,
+ guint *n_interfaces);
+
+/* per-type _static_ data */
+void g_type_set_qdata (GType type,
+ GQuark quark,
+ gpointer data);
+gpointer g_type_get_qdata (GType type,
+ GQuark quark);
+void g_type_query (GType type,
+ GTypeQuery *query);
+
+
+/* --- type registration --- */
+typedef void (*GBaseInitFunc) (gpointer g_class);
+typedef void (*GBaseFinalizeFunc) (gpointer g_class);
+typedef void (*GClassInitFunc) (gpointer g_class,
+ gpointer class_data);
+typedef void (*GClassFinalizeFunc) (gpointer g_class,
+ gpointer class_data);
+typedef void (*GInstanceInitFunc) (GTypeInstance *instance,
+ gpointer g_class);
+typedef void (*GInterfaceInitFunc) (gpointer g_iface,
+ gpointer iface_data);
+typedef void (*GInterfaceFinalizeFunc) (gpointer g_iface,
+ gpointer iface_data);
+typedef gboolean (*GTypeClassCacheFunc) (gpointer cache_data,
+ GTypeClass *g_class);
+typedef void (*GTypeInterfaceCheckFunc) (gpointer check_data,
+ gpointer g_iface);
+typedef enum /*< skip >*/
+{
+ G_TYPE_FLAG_CLASSED = (1 << 0),
+ G_TYPE_FLAG_INSTANTIATABLE = (1 << 1),
+ G_TYPE_FLAG_DERIVABLE = (1 << 2),
+ G_TYPE_FLAG_DEEP_DERIVABLE = (1 << 3)
+} GTypeFundamentalFlags;
+typedef enum /*< skip >*/
+{
+ G_TYPE_FLAG_ABSTRACT = (1 << 4),
+ G_TYPE_FLAG_VALUE_ABSTRACT = (1 << 5)
+} GTypeFlags;
+struct _GTypeInfo
+{
+ /* interface types, classed types, instantiated types */
+ guint16 class_size;
+
+ GBaseInitFunc base_init;
+ GBaseFinalizeFunc base_finalize;
+
+ /* interface types, classed types, instantiated types */
+ GClassInitFunc class_init;
+ GClassFinalizeFunc class_finalize;
+ gconstpointer class_data;
+
+ /* instantiated types */
+ guint16 instance_size;
+ guint16 n_preallocs;
+ GInstanceInitFunc instance_init;
+
+ /* value handling */
+ const GTypeValueTable *value_table;
+};
+struct _GTypeFundamentalInfo
+{
+ GTypeFundamentalFlags type_flags;
+};
+struct _GInterfaceInfo
+{
+ GInterfaceInitFunc interface_init;
+ GInterfaceFinalizeFunc interface_finalize;
+ gpointer interface_data;
+};
+struct _GTypeValueTable
+{
+ void (*value_init) (GValue *value);
+ void (*value_free) (GValue *value);
+ void (*value_copy) (const GValue *src_value,
+ GValue *dest_value);
+ /* varargs functionality (optional) */
+ gpointer (*value_peek_pointer) (const GValue *value);
+ gchar *collect_format;
+ gchar* (*collect_value) (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags);
+ gchar *lcopy_format;
+ gchar* (*lcopy_value) (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags);
+};
+GType g_type_register_static (GType parent_type,
+ const gchar *type_name,
+ const GTypeInfo *info,
+ GTypeFlags flags);
+GType g_type_register_static_simple (GType parent_type,
+ const gchar *type_name,
+ guint class_size,
+ GClassInitFunc class_init,
+ guint instance_size,
+ GInstanceInitFunc instance_init,
+ GTypeFlags flags);
+
+GType g_type_register_dynamic (GType parent_type,
+ const gchar *type_name,
+ GTypePlugin *plugin,
+ GTypeFlags flags);
+GType g_type_register_fundamental (GType type_id,
+ const gchar *type_name,
+ const GTypeInfo *info,
+ const GTypeFundamentalInfo *finfo,
+ GTypeFlags flags);
+void g_type_add_interface_static (GType instance_type,
+ GType interface_type,
+ const GInterfaceInfo *info);
+void g_type_add_interface_dynamic (GType instance_type,
+ GType interface_type,
+ GTypePlugin *plugin);
+void g_type_interface_add_prerequisite (GType interface_type,
+ GType prerequisite_type);
+GType*g_type_interface_prerequisites (GType interface_type,
+ guint *n_prerequisites);
+void g_type_class_add_private (gpointer g_class,
+ gsize private_size);
+gpointer g_type_instance_get_private (GTypeInstance *instance,
+ GType private_type);
+
+
+/* --- GType boilerplate --- */
+/* convenience macros for type implementations, which for a type GtkGadget will:
+ * - prototype: static void gtk_gadget_class_init (GtkGadgetClass *klass);
+ * - prototype: static void gtk_gadget_init (GtkGadget *self);
+ * - define: static gpointer gtk_gadget_parent_class = NULL;
+ * gtk_gadget_parent_class is initialized prior to calling gtk_gadget_class_init()
+ * - implement: GType gtk_gadget_get_type (void) { ... }
+ * - support custom code in gtk_gadget_get_type() after the type is registered.
+ *
+ * macro arguments: TypeName, type_name, TYPE_PARENT, CODE
+ * example: G_DEFINE_TYPE_WITH_CODE (GtkGadget, gtk_gadget, GTK_TYPE_WIDGET,
+ * g_print ("GtkGadget-id: %lu\n", g_define_type_id));
+ */
+#define G_DEFINE_TYPE(TN, t_n, T_P) G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, {})
+#define G_DEFINE_TYPE_WITH_CODE(TN, t_n, T_P, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, 0) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
+#define G_DEFINE_ABSTRACT_TYPE(TN, t_n, T_P) G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT, {})
+#define G_DEFINE_ABSTRACT_TYPE_WITH_CODE(TN, t_n, T_P, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
+#define G_DEFINE_TYPE_EXTENDED(TN, t_n, T_P, _f_, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, _f_) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
+
+/* convenience macro to ease interface addition in the CODE
+ * section of G_DEFINE_TYPE_WITH_CODE() (this macro relies on
+ * the g_define_type_id present within G_DEFINE_TYPE_WITH_CODE()).
+ * usage example:
+ * G_DEFINE_TYPE_WITH_CODE (GtkTreeStore, gtk_tree_store, G_TYPE_OBJECT,
+ * G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL,
+ * gtk_tree_store_tree_model_init));
+ */
+#define G_IMPLEMENT_INTERFACE(TYPE_IFACE, iface_init) { \
+ const GInterfaceInfo g_implement_interface_info = { \
+ (GInterfaceInitFunc) iface_init, NULL, NULL \
+ }; \
+ g_type_add_interface_static (g_define_type_id, TYPE_IFACE, &g_implement_interface_info); \
+}
+
+#define _G_DEFINE_TYPE_EXTENDED_BEGIN(TypeName, type_name, TYPE_PARENT, flags) \
+\
+static void type_name##_init (TypeName *self); \
+static void type_name##_class_init (TypeName##Class *klass); \
+static gpointer type_name##_parent_class = NULL; \
+static void type_name##_class_intern_init (gpointer klass) \
+{ \
+ type_name##_parent_class = g_type_class_peek_parent (klass); \
+ type_name##_class_init ((TypeName##Class*) klass); \
+} \
+\
+GType \
+type_name##_get_type (void) \
+{ \
+ static GType g_define_type_id = 0; \
+ if (G_UNLIKELY (g_define_type_id == 0)) \
+ { \
+ g_define_type_id = \
+ g_type_register_static_simple (TYPE_PARENT, \
+ g_intern_static_string (#TypeName), \
+ sizeof (TypeName##Class), \
+ (GClassInitFunc)type_name##_class_intern_init, \
+ sizeof (TypeName), \
+ (GInstanceInitFunc)type_name##_init, \
+ (GTypeFlags) flags); \
+ { /* custom code follows */
+#define _G_DEFINE_TYPE_EXTENDED_END() \
+ /* following custom code */ \
+ } \
+ } \
+ return g_define_type_id; \
+} /* closes type_name##_get_type() */
+
+
+/* --- protected (for fundamental type implementations) --- */
+GTypePlugin* g_type_get_plugin (GType type);
+GTypePlugin* g_type_interface_get_plugin (GType instance_type,
+ GType interface_type);
+GType g_type_fundamental_next (void);
+GType g_type_fundamental (GType type_id);
+GTypeInstance* g_type_create_instance (GType type);
+void g_type_free_instance (GTypeInstance *instance);
+
+void g_type_add_class_cache_func (gpointer cache_data,
+ GTypeClassCacheFunc cache_func);
+void g_type_remove_class_cache_func (gpointer cache_data,
+ GTypeClassCacheFunc cache_func);
+void g_type_class_unref_uncached (gpointer g_class);
+
+void g_type_add_interface_check (gpointer check_data,
+ GTypeInterfaceCheckFunc check_func);
+void g_type_remove_interface_check (gpointer check_data,
+ GTypeInterfaceCheckFunc check_func);
+
+GTypeValueTable* g_type_value_table_peek (GType type);
+
+
+/*< private >*/
+gboolean g_type_check_instance (GTypeInstance *instance) G_GNUC_PURE;
+GTypeInstance* g_type_check_instance_cast (GTypeInstance *instance,
+ GType iface_type);
+gboolean g_type_check_instance_is_a (GTypeInstance *instance,
+ GType iface_type) G_GNUC_PURE;
+GTypeClass* g_type_check_class_cast (GTypeClass *g_class,
+ GType is_a_type);
+gboolean g_type_check_class_is_a (GTypeClass *g_class,
+ GType is_a_type) G_GNUC_PURE;
+gboolean g_type_check_is_value_type (GType type) G_GNUC_CONST;
+gboolean g_type_check_value (GValue *value) G_GNUC_PURE;
+gboolean g_type_check_value_holds (GValue *value,
+ GType type) G_GNUC_PURE;
+gboolean g_type_test_flags (GType type,
+ guint flags) G_GNUC_CONST;
+
+
+/* --- debugging functions --- */
+G_CONST_RETURN gchar* g_type_name_from_instance (GTypeInstance *instance);
+G_CONST_RETURN gchar* g_type_name_from_class (GTypeClass *g_class);
+
+
+/* --- internal functions --- */
+G_GNUC_INTERNAL void g_value_c_init (void); /* sync with gvalue.c */
+G_GNUC_INTERNAL void g_value_types_init (void); /* sync with gvaluetypes.c */
+G_GNUC_INTERNAL void g_enum_types_init (void); /* sync with genums.c */
+G_GNUC_INTERNAL void g_param_type_init (void); /* sync with gparam.c */
+G_GNUC_INTERNAL void g_boxed_type_init (void); /* sync with gboxed.c */
+G_GNUC_INTERNAL void g_object_type_init (void); /* sync with gobject.c */
+G_GNUC_INTERNAL void g_param_spec_types_init (void); /* sync with gparamspecs.c */
+G_GNUC_INTERNAL void g_value_transforms_init (void); /* sync with gvaluetransform.c */
+G_GNUC_INTERNAL void g_signal_init (void); /* sync with gsignal.c */
+
+
+/* --- implementation bits --- */
+#ifndef G_DISABLE_CAST_CHECKS
+# define _G_TYPE_CIC(ip, gt, ct) \
+ ((ct*) g_type_check_instance_cast ((GTypeInstance*) ip, gt))
+# define _G_TYPE_CCC(cp, gt, ct) \
+ ((ct*) g_type_check_class_cast ((GTypeClass*) cp, gt))
+#else /* G_DISABLE_CAST_CHECKS */
+# define _G_TYPE_CIC(ip, gt, ct) ((ct*) ip)
+# define _G_TYPE_CCC(cp, gt, ct) ((ct*) cp)
+#endif /* G_DISABLE_CAST_CHECKS */
+#define _G_TYPE_CHI(ip) (g_type_check_instance ((GTypeInstance*) ip))
+#define _G_TYPE_CHV(vl) (g_type_check_value ((GValue*) vl))
+#define _G_TYPE_IGC(ip, gt, ct) ((ct*) (((GTypeInstance*) ip)->g_class))
+#define _G_TYPE_IGI(ip, gt, ct) ((ct*) g_type_interface_peek (((GTypeInstance*) ip)->g_class, gt))
+#ifdef __GNUC__
+# define _G_TYPE_CIT(ip, gt) (G_GNUC_EXTENSION ({ \
+ GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
+ if (__inst && __inst->g_class && __inst->g_class->g_type == __t) \
+ __r = TRUE; \
+ else \
+ __r = g_type_check_instance_is_a (__inst, __t); \
+ __r; \
+}))
+# define _G_TYPE_CCT(cp, gt) (G_GNUC_EXTENSION ({ \
+ GTypeClass *__class = (GTypeClass*) cp; GType __t = gt; gboolean __r; \
+ if (__class && __class->g_type == __t) \
+ __r = TRUE; \
+ else \
+ __r = g_type_check_class_is_a (__class, __t); \
+ __r; \
+}))
+# define _G_TYPE_CVH(vl, gt) (G_GNUC_EXTENSION ({ \
+ GValue *__val = (GValue*) vl; GType __t = gt; gboolean __r; \
+ if (__val && __val->g_type == __t) \
+ __r = TRUE; \
+ else \
+ __r = g_type_check_value_holds (__val, __t); \
+ __r; \
+}))
+#else /* !__GNUC__ */
+# define _G_TYPE_CIT(ip, gt) (g_type_check_instance_is_a ((GTypeInstance*) ip, gt))
+# define _G_TYPE_CCT(cp, gt) (g_type_check_class_is_a ((GTypeClass*) cp, gt))
+# define _G_TYPE_CVH(vl, gt) (g_type_check_value_holds ((GValue*) vl, gt))
+#endif /* !__GNUC__ */
+#define G_TYPE_FLAG_RESERVED_ID_BIT ((GType) (1 << 0))
+extern GTypeDebugFlags _g_type_debug_flags;
+
+G_END_DECLS
+
+#endif /* __G_TYPE_H__ */
diff --git a/trunk/gobject/gtypemodule.c b/trunk/gobject/gtypemodule.c
new file mode 100644
index 000000000..47e524752
--- /dev/null
+++ b/trunk/gobject/gtypemodule.c
@@ -0,0 +1,430 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * 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 <stdlib.h>
+
+#include "gtypeplugin.h"
+#include "gtypemodule.h"
+#include "gobjectalias.h"
+
+typedef struct _ModuleTypeInfo ModuleTypeInfo;
+typedef struct _ModuleInterfaceInfo ModuleInterfaceInfo;
+
+struct _ModuleTypeInfo
+{
+ gboolean loaded;
+ GType type;
+ GType parent_type;
+ GTypeInfo info;
+};
+
+struct _ModuleInterfaceInfo
+{
+ gboolean loaded;
+ GType instance_type;
+ GType interface_type;
+ GInterfaceInfo info;
+};
+
+static void g_type_module_use_plugin (GTypePlugin *plugin);
+static void g_type_module_complete_type_info (GTypePlugin *plugin,
+ GType g_type,
+ GTypeInfo *info,
+ GTypeValueTable *value_table);
+static void g_type_module_complete_interface_info (GTypePlugin *plugin,
+ GType instance_type,
+ GType interface_type,
+ GInterfaceInfo *info);
+
+static gpointer parent_class = NULL;
+
+static void
+g_type_module_dispose (GObject *object)
+{
+ GTypeModule *module = G_TYPE_MODULE (object);
+
+ if (module->type_infos || module->interface_infos)
+ {
+ g_warning (G_STRLOC ": unsolicitated invocation of g_object_dispose() on GTypeModule");
+
+ g_object_ref (object);
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+g_type_module_finalize (GObject *object)
+{
+ GTypeModule *module = G_TYPE_MODULE (object);
+
+ g_free (module->name);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+g_type_module_class_init (GTypeModuleClass *class)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+
+ parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (class));
+
+ gobject_class->dispose = g_type_module_dispose;
+ gobject_class->finalize = g_type_module_finalize;
+}
+
+static void
+g_type_module_iface_init (GTypePluginClass *iface)
+{
+ iface->use_plugin = g_type_module_use_plugin;
+ iface->unuse_plugin = (void (*) (GTypePlugin *))g_type_module_unuse;
+ iface->complete_type_info = g_type_module_complete_type_info;
+ iface->complete_interface_info = g_type_module_complete_interface_info;
+}
+
+GType
+g_type_module_get_type (void)
+{
+ static GType type_module_type = 0;
+
+ if (!type_module_type)
+ {
+ static const GTypeInfo type_module_info = {
+ sizeof (GTypeModuleClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) g_type_module_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (GTypeModule),
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ };
+ static const GInterfaceInfo iface_info = {
+ (GInterfaceInitFunc) g_type_module_iface_init,
+ NULL, /* interface_finalize */
+ NULL, /* interface_data */
+ };
+
+ type_module_type = g_type_register_static (G_TYPE_OBJECT, g_intern_static_string ("GTypeModule"), &type_module_info, G_TYPE_FLAG_ABSTRACT);
+
+ g_type_add_interface_static (type_module_type, G_TYPE_TYPE_PLUGIN, &iface_info);
+ }
+
+ return type_module_type;
+}
+
+void
+g_type_module_set_name (GTypeModule *module,
+ const gchar *name)
+{
+ g_return_if_fail (G_IS_TYPE_MODULE (module));
+
+ g_free (module->name);
+ module->name = g_strdup (name);
+}
+
+static ModuleTypeInfo *
+g_type_module_find_type_info (GTypeModule *module,
+ GType type)
+{
+ GSList *tmp_list = module->type_infos;
+ while (tmp_list)
+ {
+ ModuleTypeInfo *type_info = tmp_list->data;
+ if (type_info->type == type)
+ return type_info;
+
+ tmp_list = tmp_list->next;
+ }
+
+ return NULL;
+}
+
+static ModuleInterfaceInfo *
+g_type_module_find_interface_info (GTypeModule *module,
+ GType instance_type,
+ GType interface_type)
+{
+ GSList *tmp_list = module->interface_infos;
+ while (tmp_list)
+ {
+ ModuleInterfaceInfo *interface_info = tmp_list->data;
+ if (interface_info->instance_type == instance_type &&
+ interface_info->interface_type == interface_type)
+ return interface_info;
+
+ tmp_list = tmp_list->next;
+ }
+
+ return NULL;
+}
+
+gboolean
+g_type_module_use (GTypeModule *module)
+{
+ g_return_val_if_fail (G_IS_TYPE_MODULE (module), FALSE);
+
+ module->use_count++;
+ if (module->use_count == 1)
+ {
+ GSList *tmp_list;
+
+ if (!G_TYPE_MODULE_GET_CLASS (module)->load (module))
+ {
+ module->use_count--;
+ return FALSE;
+ }
+
+ tmp_list = module->type_infos;
+ while (tmp_list)
+ {
+ ModuleTypeInfo *type_info = tmp_list->data;
+ if (!type_info->loaded)
+ {
+ g_warning ("plugin '%s' failed to register type '%s'\n",
+ module->name ? module->name : "(unknown)",
+ g_type_name (type_info->type));
+ return FALSE;
+ }
+
+ tmp_list = tmp_list->next;
+ }
+ }
+
+ return TRUE;
+}
+
+void
+g_type_module_unuse (GTypeModule *module)
+{
+ g_return_if_fail (G_IS_TYPE_MODULE (module));
+ g_return_if_fail (module->use_count > 0);
+
+ module->use_count--;
+
+ if (module->use_count == 0)
+ {
+ GSList *tmp_list;
+
+ G_TYPE_MODULE_GET_CLASS (module)->unload (module);
+
+ tmp_list = module->type_infos;
+ while (tmp_list)
+ {
+ ModuleTypeInfo *type_info = tmp_list->data;
+ type_info->loaded = FALSE;
+
+ tmp_list = tmp_list->next;
+ }
+ }
+}
+
+static void
+g_type_module_use_plugin (GTypePlugin *plugin)
+{
+ GTypeModule *module = G_TYPE_MODULE (plugin);
+
+ if (!g_type_module_use (module))
+ {
+ g_warning ("Fatal error - Could not reload previously loaded plugin '%s'\n",
+ module->name ? module->name : "(unknown)");
+ exit (1);
+ }
+}
+
+static void
+g_type_module_complete_type_info (GTypePlugin *plugin,
+ GType g_type,
+ GTypeInfo *info,
+ GTypeValueTable *value_table)
+{
+ GTypeModule *module = G_TYPE_MODULE (plugin);
+ ModuleTypeInfo *module_type_info = g_type_module_find_type_info (module, g_type);
+
+ *info = module_type_info->info;
+
+ if (module_type_info->info.value_table)
+ *value_table = *module_type_info->info.value_table;
+}
+
+static void
+g_type_module_complete_interface_info (GTypePlugin *plugin,
+ GType instance_type,
+ GType interface_type,
+ GInterfaceInfo *info)
+{
+ GTypeModule *module = G_TYPE_MODULE (plugin);
+ ModuleInterfaceInfo *module_interface_info = g_type_module_find_interface_info (module, instance_type, interface_type);
+
+ *info = module_interface_info->info;
+}
+
+GType
+g_type_module_register_type (GTypeModule *module,
+ GType parent_type,
+ const gchar *type_name,
+ const GTypeInfo *type_info,
+ GTypeFlags flags)
+{
+ ModuleTypeInfo *module_type_info = NULL;
+ GType type;
+
+ g_return_val_if_fail (module != NULL, 0);
+ g_return_val_if_fail (type_name != NULL, 0);
+ g_return_val_if_fail (type_info != NULL, 0);
+
+ type = g_type_from_name (type_name);
+ if (type)
+ {
+ GTypePlugin *old_plugin = g_type_get_plugin (type);
+
+ if (old_plugin != G_TYPE_PLUGIN (module))
+ {
+ g_warning ("Two different plugins tried to register '%s'.", type_name);
+ return 0;
+ }
+ }
+
+ if (type)
+ {
+ module_type_info = g_type_module_find_type_info (module, type);
+
+ if (module_type_info->parent_type != parent_type)
+ {
+ const gchar *parent_type_name = g_type_name (parent_type);
+
+ g_warning ("Type '%s' recreated with different parent type.\n"
+ "(was '%s', now '%s')", type_name,
+ g_type_name (module_type_info->parent_type),
+ parent_type_name ? parent_type_name : "(unknown)");
+ return 0;
+ }
+
+ if (module_type_info->info.value_table)
+ g_free ((GTypeValueTable *) module_type_info->info.value_table);
+ }
+ else
+ {
+ module_type_info = g_new (ModuleTypeInfo, 1);
+
+ module_type_info->parent_type = parent_type;
+ module_type_info->type = g_type_register_dynamic (parent_type, type_name, G_TYPE_PLUGIN (module), flags);
+
+ module->type_infos = g_slist_prepend (module->type_infos, module_type_info);
+ }
+
+ module_type_info->loaded = TRUE;
+ module_type_info->info = *type_info;
+ if (type_info->value_table)
+ module_type_info->info.value_table = g_memdup (type_info->value_table,
+ sizeof (GTypeValueTable));
+
+ return module_type_info->type;
+}
+
+void
+g_type_module_add_interface (GTypeModule *module,
+ GType instance_type,
+ GType interface_type,
+ const GInterfaceInfo *interface_info)
+{
+ ModuleInterfaceInfo *module_interface_info = NULL;
+
+ g_return_if_fail (module != NULL);
+ g_return_if_fail (interface_info != NULL);
+
+ if (g_type_is_a (instance_type, interface_type))
+ {
+ GTypePlugin *old_plugin = g_type_interface_get_plugin (instance_type,
+ interface_type);
+
+ if (!old_plugin)
+ {
+ g_warning ("Interface '%s' for '%s' was previously registered statically or for a parent type.",
+ g_type_name (interface_type), g_type_name (instance_type));
+ return;
+ }
+ else if (old_plugin != G_TYPE_PLUGIN (module))
+ {
+ g_warning ("Two different plugins tried to register interface '%s' for '%s'.",
+ g_type_name (interface_type), g_type_name (instance_type));
+ return;
+ }
+
+ module_interface_info = g_type_module_find_interface_info (module, instance_type, interface_type);
+
+ g_assert (module_interface_info);
+ }
+ else
+ {
+ module_interface_info = g_new (ModuleInterfaceInfo, 1);
+
+ module_interface_info->instance_type = instance_type;
+ module_interface_info->interface_type = interface_type;
+
+ g_type_add_interface_dynamic (instance_type, interface_type, G_TYPE_PLUGIN (module));
+
+ module->interface_infos = g_slist_prepend (module->interface_infos, module_interface_info);
+ }
+
+ module_interface_info->loaded = TRUE;
+ module_interface_info->info = *interface_info;
+}
+
+GType
+g_type_module_register_enum (GTypeModule *module,
+ const gchar *name,
+ const GEnumValue *const_static_values)
+{
+ GTypeInfo enum_type_info = { 0, };
+
+ g_return_val_if_fail (G_IS_TYPE_MODULE (module), 0);
+ g_return_val_if_fail (name != NULL, 0);
+ g_return_val_if_fail (const_static_values != NULL, 0);
+
+ g_enum_complete_type_info (G_TYPE_ENUM,
+ &enum_type_info, const_static_values);
+
+ return g_type_module_register_type (G_TYPE_MODULE (module),
+ G_TYPE_ENUM, name, &enum_type_info, 0);
+}
+
+GType
+g_type_module_register_flags (GTypeModule *module,
+ const gchar *name,
+ const GFlagsValue *const_static_values)
+{
+ GTypeInfo flags_type_info = { 0, };
+
+ g_return_val_if_fail (G_IS_TYPE_MODULE (module), 0);
+ g_return_val_if_fail (name != NULL, 0);
+ g_return_val_if_fail (const_static_values != NULL, 0);
+
+ g_flags_complete_type_info (G_TYPE_FLAGS,
+ &flags_type_info, const_static_values);
+
+ return g_type_module_register_type (G_TYPE_MODULE (module),
+ G_TYPE_FLAGS, name, &flags_type_info, 0);
+}
+
+
+#define __G_TYPE_MODULE_C__
+#include "gobjectaliasdef.c"
diff --git a/trunk/gobject/gtypemodule.h b/trunk/gobject/gtypemodule.h
new file mode 100644
index 000000000..a99238976
--- /dev/null
+++ b/trunk/gobject/gtypemodule.h
@@ -0,0 +1,133 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * 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.
+ */
+#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
+#error "Only <glib-object.h> can be included directly."
+#endif
+
+#ifndef __G_TYPE_MODULE_H__
+#define __G_TYPE_MODULE_H__
+
+#include <gobject/gobject.h>
+#include <gobject/genums.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GTypeModule GTypeModule;
+typedef struct _GTypeModuleClass GTypeModuleClass;
+
+#define G_TYPE_TYPE_MODULE (g_type_module_get_type ())
+#define G_TYPE_MODULE(module) (G_TYPE_CHECK_INSTANCE_CAST ((module), G_TYPE_TYPE_MODULE, GTypeModule))
+#define G_TYPE_MODULE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_TYPE_MODULE, GTypeModuleClass))
+#define G_IS_TYPE_MODULE(module) (G_TYPE_CHECK_INSTANCE_TYPE ((module), G_TYPE_TYPE_MODULE))
+#define G_IS_TYPE_MODULE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_TYPE_MODULE))
+#define G_TYPE_MODULE_GET_CLASS(module) (G_TYPE_INSTANCE_GET_CLASS ((module), G_TYPE_TYPE_MODULE, GTypeModuleClass))
+
+struct _GTypeModule
+{
+ GObject parent_instance;
+
+ guint use_count;
+ GSList *type_infos;
+ GSList *interface_infos;
+
+ /*< public >*/
+ gchar *name;
+};
+
+struct _GTypeModuleClass
+{
+ GObjectClass parent_class;
+
+ /*< public >*/
+ gboolean (* load) (GTypeModule *module);
+ void (* unload) (GTypeModule *module);
+
+ /*< private >*/
+ /* Padding for future expansion */
+ void (*reserved1) (void);
+ void (*reserved2) (void);
+ void (*reserved3) (void);
+ void (*reserved4) (void);
+};
+
+#define G_DEFINE_DYNAMIC_TYPE(TN, t_n, T_P) G_DEFINE_DYNAMIC_TYPE_EXTENDED (TN, t_n, T_P, 0, {})
+#define G_DEFINE_DYNAMIC_TYPE_EXTENDED(TypeName, type_name, TYPE_PARENT, flags, CODE) \
+static void type_name##_init (TypeName *self); \
+static void type_name##_class_init (TypeName##Class *klass); \
+static void type_name##_class_finalize (TypeName##Class *klass); \
+static gpointer type_name##_parent_class = NULL; \
+static GType type_name##_type_id = 0; \
+static void type_name##_class_intern_init (gpointer klass) \
+{ \
+ type_name##_parent_class = g_type_class_peek_parent (klass); \
+ type_name##_class_init ((TypeName##Class*) klass); \
+} \
+GType \
+type_name##_get_type (void) \
+{ \
+ return type_name##_type_id; \
+} \
+static void \
+type_name##_register_type (GTypeModule *type_module) \
+{ \
+ const GTypeInfo g_define_type_info = { \
+ sizeof (TypeName##Class), \
+ (GBaseInitFunc) NULL, \
+ (GBaseFinalizeFunc) NULL, \
+ (GClassInitFunc) type_name##_class_intern_init, \
+ (GClassFinalizeFunc) type_name##_class_finalize, \
+ NULL, /* class_data */ \
+ sizeof (TypeName), \
+ 0, /* n_preallocs */ \
+ (GInstanceInitFunc) type_name##_init, \
+ NULL /* value_table */ \
+ }; \
+ type_name##_type_id = g_type_module_register_type (type_module, \
+ TYPE_PARENT, \
+ #TypeName, \
+ &g_define_type_info, \
+ (GTypeFlags) flags); \
+ { CODE ; } \
+}
+
+
+GType g_type_module_get_type (void) G_GNUC_CONST;
+gboolean g_type_module_use (GTypeModule *module);
+void g_type_module_unuse (GTypeModule *module);
+void g_type_module_set_name (GTypeModule *module,
+ const gchar *name);
+GType g_type_module_register_type (GTypeModule *module,
+ GType parent_type,
+ const gchar *type_name,
+ const GTypeInfo *type_info,
+ GTypeFlags flags);
+void g_type_module_add_interface (GTypeModule *module,
+ GType instance_type,
+ GType interface_type,
+ const GInterfaceInfo *interface_info);
+GType g_type_module_register_enum (GTypeModule *module,
+ const gchar *name,
+ const GEnumValue *const_static_values);
+GType g_type_module_register_flags (GTypeModule *module,
+ const gchar *name,
+ const GFlagsValue *const_static_values);
+
+G_END_DECLS
+
+#endif /* __G_TYPE_MODULE_H__ */
diff --git a/trunk/gobject/gtypeplugin.c b/trunk/gobject/gtypeplugin.c
new file mode 100644
index 000000000..2d681bdc5
--- /dev/null
+++ b/trunk/gobject/gtypeplugin.c
@@ -0,0 +1,104 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * 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 "gtypeplugin.h"
+#include "gobjectalias.h"
+
+
+
+/* --- functions --- */
+GType
+g_type_plugin_get_type (void)
+{
+ static GType type_plugin_type = 0;
+
+ if (!type_plugin_type)
+ {
+ static const GTypeInfo type_plugin_info = {
+ sizeof (GTypePluginClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ };
+
+ type_plugin_type = g_type_register_static (G_TYPE_INTERFACE, g_intern_static_string ("GTypePlugin"), &type_plugin_info, 0);
+ }
+
+ return type_plugin_type;
+}
+
+void
+g_type_plugin_use (GTypePlugin *plugin)
+{
+ GTypePluginClass *iface;
+
+ g_return_if_fail (G_IS_TYPE_PLUGIN (plugin));
+
+ iface = G_TYPE_PLUGIN_GET_CLASS (plugin);
+ iface->use_plugin (plugin);
+}
+
+void
+g_type_plugin_unuse (GTypePlugin *plugin)
+{
+ GTypePluginClass *iface;
+
+ g_return_if_fail (G_IS_TYPE_PLUGIN (plugin));
+
+ iface = G_TYPE_PLUGIN_GET_CLASS (plugin);
+ iface->unuse_plugin (plugin);
+}
+
+void
+g_type_plugin_complete_type_info (GTypePlugin *plugin,
+ GType g_type,
+ GTypeInfo *info,
+ GTypeValueTable *value_table)
+{
+ GTypePluginClass *iface;
+
+ g_return_if_fail (G_IS_TYPE_PLUGIN (plugin));
+ g_return_if_fail (info != NULL);
+ g_return_if_fail (value_table != NULL);
+
+ iface = G_TYPE_PLUGIN_GET_CLASS (plugin);
+ iface->complete_type_info (plugin,
+ g_type,
+ info,
+ value_table);
+}
+
+void
+g_type_plugin_complete_interface_info (GTypePlugin *plugin,
+ GType instance_type,
+ GType interface_type,
+ GInterfaceInfo *info)
+{
+ GTypePluginClass *iface;
+
+ g_return_if_fail (G_IS_TYPE_PLUGIN (plugin));
+ g_return_if_fail (info != NULL);
+
+ iface = G_TYPE_PLUGIN_GET_CLASS (plugin);
+ iface->complete_interface_info (plugin,
+ instance_type,
+ interface_type,
+ info);
+}
+
+#define __G_TYPE_PLUGIN_C__
+#include "gobjectaliasdef.c"
diff --git a/trunk/gobject/gtypeplugin.h b/trunk/gobject/gtypeplugin.h
new file mode 100644
index 000000000..a8e9803d6
--- /dev/null
+++ b/trunk/gobject/gtypeplugin.h
@@ -0,0 +1,79 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * 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.
+ */
+#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
+#error "Only <glib-object.h> can be included directly."
+#endif
+
+#ifndef __G_TYPE_PLUGIN_H__
+#define __G_TYPE_PLUGIN_H__
+
+#include <gobject/gtype.h>
+
+G_BEGIN_DECLS
+
+/* --- type macros --- */
+#define G_TYPE_TYPE_PLUGIN (g_type_plugin_get_type ())
+#define G_TYPE_PLUGIN(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), G_TYPE_TYPE_PLUGIN, GTypePlugin))
+#define G_TYPE_PLUGIN_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), G_TYPE_TYPE_PLUGIN, GTypePluginClass))
+#define G_IS_TYPE_PLUGIN(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), G_TYPE_TYPE_PLUGIN))
+#define G_IS_TYPE_PLUGIN_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), G_TYPE_TYPE_PLUGIN))
+#define G_TYPE_PLUGIN_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), G_TYPE_TYPE_PLUGIN, GTypePluginClass))
+
+
+/* --- typedefs & structures --- */
+typedef struct _GTypePluginClass GTypePluginClass;
+typedef void (*GTypePluginUse) (GTypePlugin *plugin);
+typedef void (*GTypePluginUnuse) (GTypePlugin *plugin);
+typedef void (*GTypePluginCompleteTypeInfo) (GTypePlugin *plugin,
+ GType g_type,
+ GTypeInfo *info,
+ GTypeValueTable *value_table);
+typedef void (*GTypePluginCompleteInterfaceInfo) (GTypePlugin *plugin,
+ GType instance_type,
+ GType interface_type,
+ GInterfaceInfo *info);
+struct _GTypePluginClass
+{
+ /*< private >*/
+ GTypeInterface base_iface;
+
+ /*< public >*/
+ GTypePluginUse use_plugin;
+ GTypePluginUnuse unuse_plugin;
+ GTypePluginCompleteTypeInfo complete_type_info;
+ GTypePluginCompleteInterfaceInfo complete_interface_info;
+};
+
+
+/* --- prototypes --- */
+GType g_type_plugin_get_type (void) G_GNUC_CONST;
+void g_type_plugin_use (GTypePlugin *plugin);
+void g_type_plugin_unuse (GTypePlugin *plugin);
+void g_type_plugin_complete_type_info (GTypePlugin *plugin,
+ GType g_type,
+ GTypeInfo *info,
+ GTypeValueTable *value_table);
+void g_type_plugin_complete_interface_info (GTypePlugin *plugin,
+ GType instance_type,
+ GType interface_type,
+ GInterfaceInfo *info);
+
+G_END_DECLS
+
+#endif /* __G_TYPE_PLUGIN_H__ */
diff --git a/trunk/gobject/gvalue.c b/trunk/gobject/gvalue.c
new file mode 100644
index 000000000..75ea260e3
--- /dev/null
+++ b/trunk/gobject/gvalue.c
@@ -0,0 +1,364 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1997-1999, 2000-2001 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.
+ */
+
+/*
+ * FIXME: MT-safety
+ */
+
+#include <string.h>
+
+#include "gvalue.h"
+#include "gvaluecollector.h"
+#include "gbsearcharray.h"
+#include "gobjectalias.h"
+
+
+/* --- typedefs & structures --- */
+typedef struct {
+ GType src_type;
+ GType dest_type;
+ GValueTransform func;
+} TransformEntry;
+
+
+/* --- prototypes --- */
+static gint transform_entries_cmp (gconstpointer bsearch_node1,
+ gconstpointer bsearch_node2);
+
+
+/* --- variables --- */
+static GBSearchArray *transform_array = NULL;
+static GBSearchConfig transform_bconfig = {
+ sizeof (TransformEntry),
+ transform_entries_cmp,
+ 0,
+};
+
+
+/* --- functions --- */
+void
+g_value_c_init (void)
+{
+ transform_array = g_bsearch_array_create (&transform_bconfig);
+}
+
+static inline void /* keep this function in sync with gvaluecollector.h and gboxed.c */
+value_meminit (GValue *value,
+ GType value_type)
+{
+ value->g_type = value_type;
+ memset (value->data, 0, sizeof (value->data));
+}
+
+GValue*
+g_value_init (GValue *value,
+ GType g_type)
+{
+ /* g_return_val_if_fail (G_TYPE_IS_VALUE (g_type), NULL); be more elaborate below */
+ g_return_val_if_fail (value != NULL, NULL);
+ /* g_return_val_if_fail (G_VALUE_TYPE (value) == 0, NULL); be more elaborate below */
+
+ if (G_TYPE_IS_VALUE (g_type) && G_VALUE_TYPE (value) == 0)
+ {
+ GTypeValueTable *value_table = g_type_value_table_peek (g_type);
+
+ /* setup and init */
+ value_meminit (value, g_type);
+ value_table->value_init (value);
+ }
+ else if (G_VALUE_TYPE (value))
+ g_warning ("%s: cannot initialize GValue with type `%s', the value has already been initialized as `%s'",
+ G_STRLOC,
+ g_type_name (g_type),
+ g_type_name (G_VALUE_TYPE (value)));
+ else /* !G_TYPE_IS_VALUE (g_type) */
+ g_warning ("%s: cannot initialize GValue with type `%s', %s",
+ G_STRLOC,
+ g_type_name (g_type),
+ g_type_value_table_peek (g_type) ?
+ "this type is abstract with regards to GValue use, use a more specific (derived) type" :
+ "this type has no GTypeValueTable implementation");
+ return value;
+}
+
+void
+g_value_copy (const GValue *src_value,
+ GValue *dest_value)
+{
+ g_return_if_fail (G_IS_VALUE (src_value));
+ g_return_if_fail (G_IS_VALUE (dest_value));
+ g_return_if_fail (g_value_type_compatible (G_VALUE_TYPE (src_value), G_VALUE_TYPE (dest_value)));
+
+ if (src_value != dest_value)
+ {
+ GType dest_type = G_VALUE_TYPE (dest_value);
+ GTypeValueTable *value_table = g_type_value_table_peek (dest_type);
+
+ /* make sure dest_value's value is free()d */
+ if (value_table->value_free)
+ value_table->value_free (dest_value);
+
+ /* setup and copy */
+ value_meminit (dest_value, dest_type);
+ value_table->value_copy (src_value, dest_value);
+ }
+}
+
+GValue*
+g_value_reset (GValue *value)
+{
+ GTypeValueTable *value_table;
+ GType g_type;
+
+ g_return_val_if_fail (G_IS_VALUE (value), NULL);
+
+ g_type = G_VALUE_TYPE (value);
+ value_table = g_type_value_table_peek (g_type);
+
+ /* make sure value's value is free()d */
+ if (value_table->value_free)
+ value_table->value_free (value);
+
+ /* setup and init */
+ value_meminit (value, g_type);
+ value_table->value_init (value);
+
+ return value;
+}
+
+void
+g_value_unset (GValue *value)
+{
+ GTypeValueTable *value_table;
+
+ g_return_if_fail (G_IS_VALUE (value));
+
+ value_table = g_type_value_table_peek (G_VALUE_TYPE (value));
+
+ if (value_table->value_free)
+ value_table->value_free (value);
+ memset (value, 0, sizeof (*value));
+}
+
+gboolean
+g_value_fits_pointer (const GValue *value)
+{
+ GTypeValueTable *value_table;
+
+ g_return_val_if_fail (G_IS_VALUE (value), FALSE);
+
+ value_table = g_type_value_table_peek (G_VALUE_TYPE (value));
+
+ return value_table->value_peek_pointer != NULL;
+}
+
+gpointer
+g_value_peek_pointer (const GValue *value)
+{
+ GTypeValueTable *value_table;
+
+ g_return_val_if_fail (G_IS_VALUE (value), NULL);
+
+ value_table = g_type_value_table_peek (G_VALUE_TYPE (value));
+ if (!value_table->value_peek_pointer)
+ {
+ g_return_val_if_fail (g_value_fits_pointer (value) == TRUE, NULL);
+ return NULL;
+ }
+
+ return value_table->value_peek_pointer (value);
+}
+
+void
+g_value_set_instance (GValue *value,
+ gpointer instance)
+{
+ GType g_type;
+ GTypeValueTable *value_table;
+ GTypeCValue cvalue;
+ gchar *error_msg;
+
+ g_return_if_fail (G_IS_VALUE (value));
+ if (instance)
+ {
+ g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
+ g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (instance), G_VALUE_TYPE (value)));
+ }
+
+ g_type = G_VALUE_TYPE (value);
+ value_table = g_type_value_table_peek (g_type);
+
+ g_return_if_fail (strcmp (value_table->collect_format, "p") == 0);
+
+ memset (&cvalue, 0, sizeof (cvalue));
+ cvalue.v_pointer = instance;
+
+ /* make sure value's value is free()d */
+ if (value_table->value_free)
+ value_table->value_free (value);
+
+ /* setup and collect */
+ value_meminit (value, g_type);
+ error_msg = value_table->collect_value (value, 1, &cvalue, 0);
+ if (error_msg)
+ {
+ g_warning ("%s: %s", G_STRLOC, error_msg);
+ g_free (error_msg);
+
+ /* we purposely leak the value here, it might not be
+ * in a sane state if an error condition occoured
+ */
+ value_meminit (value, g_type);
+ value_table->value_init (value);
+ }
+}
+
+static GValueTransform
+transform_func_lookup (GType src_type,
+ GType dest_type)
+{
+ TransformEntry entry;
+
+ entry.src_type = src_type;
+ do
+ {
+ entry.dest_type = dest_type;
+ do
+ {
+ TransformEntry *e;
+
+ e = g_bsearch_array_lookup (transform_array, &transform_bconfig, &entry);
+ if (e)
+ {
+ /* need to check that there hasn't been a change in value handling */
+ if (g_type_value_table_peek (entry.dest_type) == g_type_value_table_peek (dest_type) &&
+ g_type_value_table_peek (entry.src_type) == g_type_value_table_peek (src_type))
+ return e->func;
+ }
+ entry.dest_type = g_type_parent (entry.dest_type);
+ }
+ while (entry.dest_type);
+
+ entry.src_type = g_type_parent (entry.src_type);
+ }
+ while (entry.src_type);
+
+ return NULL;
+}
+
+static gint
+transform_entries_cmp (gconstpointer bsearch_node1,
+ gconstpointer bsearch_node2)
+{
+ const TransformEntry *e1 = bsearch_node1;
+ const TransformEntry *e2 = bsearch_node2;
+ gint cmp = G_BSEARCH_ARRAY_CMP (e1->src_type, e2->src_type);
+
+ if (cmp)
+ return cmp;
+ else
+ return G_BSEARCH_ARRAY_CMP (e1->dest_type, e2->dest_type);
+}
+
+void
+g_value_register_transform_func (GType src_type,
+ GType dest_type,
+ GValueTransform transform_func)
+{
+ TransformEntry entry;
+
+ /* these checks won't pass for dynamic types.
+ * g_return_if_fail (G_TYPE_HAS_VALUE_TABLE (src_type));
+ * g_return_if_fail (G_TYPE_HAS_VALUE_TABLE (dest_type));
+ */
+ g_return_if_fail (transform_func != NULL);
+
+ entry.src_type = src_type;
+ entry.dest_type = dest_type;
+
+#if 0 /* let transform function replacement be a valid operation */
+ if (g_bsearch_array_lookup (transform_array, &transform_bconfig, &entry))
+ g_warning ("reregistering value transformation function (%p) for `%s' to `%s'",
+ transform_func,
+ g_type_name (src_type),
+ g_type_name (dest_type));
+#endif
+
+ entry.func = transform_func;
+ transform_array = g_bsearch_array_replace (transform_array, &transform_bconfig, &entry);
+}
+
+gboolean
+g_value_type_transformable (GType src_type,
+ GType dest_type)
+{
+ g_return_val_if_fail (G_TYPE_IS_VALUE (src_type), FALSE);
+ g_return_val_if_fail (G_TYPE_IS_VALUE (dest_type), FALSE);
+
+ return (g_value_type_compatible (src_type, dest_type) ||
+ transform_func_lookup (src_type, dest_type) != NULL);
+}
+
+gboolean
+g_value_type_compatible (GType src_type,
+ GType dest_type)
+{
+ g_return_val_if_fail (G_TYPE_IS_VALUE (src_type), FALSE);
+ g_return_val_if_fail (G_TYPE_IS_VALUE (dest_type), FALSE);
+
+ return (g_type_is_a (src_type, dest_type) &&
+ g_type_value_table_peek (dest_type) == g_type_value_table_peek (src_type));
+}
+
+gboolean
+g_value_transform (const GValue *src_value,
+ GValue *dest_value)
+{
+ GType dest_type;
+
+ g_return_val_if_fail (G_IS_VALUE (src_value), FALSE);
+ g_return_val_if_fail (G_IS_VALUE (dest_value), FALSE);
+
+ dest_type = G_VALUE_TYPE (dest_value);
+ if (g_value_type_compatible (G_VALUE_TYPE (src_value), dest_type))
+ {
+ g_value_copy (src_value, dest_value);
+
+ return TRUE;
+ }
+ else
+ {
+ GValueTransform transform = transform_func_lookup (G_VALUE_TYPE (src_value), dest_type);
+
+ if (transform)
+ {
+ g_value_unset (dest_value);
+
+ /* setup and transform */
+ value_meminit (dest_value, dest_type);
+ transform (src_value, dest_value);
+
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+#define __G_VALUE_C__
+#include "gobjectaliasdef.c"
diff --git a/trunk/gobject/gvalue.h b/trunk/gobject/gvalue.h
new file mode 100644
index 000000000..b93e1e9d9
--- /dev/null
+++ b/trunk/gobject/gvalue.h
@@ -0,0 +1,94 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1997-1999, 2000-2001 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.
+ *
+ * gvalue.h: generic GValue functions
+ */
+#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
+#error "Only <glib-object.h> can be included directly."
+#endif
+
+#ifndef __G_VALUE_H__
+#define __G_VALUE_H__
+
+#include <gobject/gtype.h>
+
+G_BEGIN_DECLS
+
+/* --- type macros --- */
+#define G_TYPE_IS_VALUE(type) (g_type_check_is_value_type (type))
+#define G_IS_VALUE(value) (G_TYPE_CHECK_VALUE (value))
+#define G_VALUE_TYPE(value) (((GValue*) (value))->g_type)
+#define G_VALUE_TYPE_NAME(value) (g_type_name (G_VALUE_TYPE (value)))
+#define G_VALUE_HOLDS(value,type) (G_TYPE_CHECK_VALUE_TYPE ((value), (type)))
+
+
+/* --- typedefs & structures --- */
+typedef void (*GValueTransform) (const GValue *src_value,
+ GValue *dest_value);
+struct _GValue
+{
+ /*< private >*/
+ GType g_type;
+
+ /* public for GTypeValueTable methods */
+ union {
+ gint v_int;
+ guint v_uint;
+ glong v_long;
+ gulong v_ulong;
+ gint64 v_int64;
+ guint64 v_uint64;
+ gfloat v_float;
+ gdouble v_double;
+ gpointer v_pointer;
+ } data[2];
+};
+
+
+/* --- prototypes --- */
+GValue* g_value_init (GValue *value,
+ GType g_type);
+void g_value_copy (const GValue *src_value,
+ GValue *dest_value);
+GValue* g_value_reset (GValue *value);
+void g_value_unset (GValue *value);
+void g_value_set_instance (GValue *value,
+ gpointer instance);
+
+
+/* --- private --- */
+gboolean g_value_fits_pointer (const GValue *value);
+gpointer g_value_peek_pointer (const GValue *value);
+
+
+/* --- implementation details --- */
+gboolean g_value_type_compatible (GType src_type,
+ GType dest_type);
+gboolean g_value_type_transformable (GType src_type,
+ GType dest_type);
+gboolean g_value_transform (const GValue *src_value,
+ GValue *dest_value);
+void g_value_register_transform_func (GType src_type,
+ GType dest_type,
+ GValueTransform transform_func);
+#define G_VALUE_NOCOPY_CONTENTS (1 << 27)
+
+
+G_END_DECLS
+
+#endif /* __G_VALUE_H__ */
diff --git a/trunk/gobject/gvaluearray.c b/trunk/gobject/gvaluearray.c
new file mode 100644
index 000000000..308687b79
--- /dev/null
+++ b/trunk/gobject/gvaluearray.c
@@ -0,0 +1,233 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2001 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.
+ */
+
+/*
+ * MT safe
+ */
+
+#include <config.h>
+
+#include "gvaluearray.h"
+#include "gobjectalias.h"
+#include <string.h>
+#include <stdlib.h> /* qsort() */
+
+#ifdef DISABLE_MEM_POOLS
+# define GROUP_N_VALUES (1) /* power of 2 !! */
+#else
+# define GROUP_N_VALUES (8) /* power of 2 !! */
+#endif
+
+
+/* --- functions --- */
+GValue*
+g_value_array_get_nth (GValueArray *value_array,
+ guint index)
+{
+ g_return_val_if_fail (value_array != NULL, NULL);
+ g_return_val_if_fail (index < value_array->n_values, NULL);
+
+ return value_array->values + index;
+}
+
+static inline void
+value_array_grow (GValueArray *value_array,
+ guint n_values,
+ gboolean zero_init)
+{
+ g_return_if_fail (n_values >= value_array->n_values);
+
+ value_array->n_values = n_values;
+ if (value_array->n_values > value_array->n_prealloced)
+ {
+ guint i = value_array->n_prealloced;
+
+ value_array->n_prealloced = (value_array->n_values + GROUP_N_VALUES - 1) & ~(GROUP_N_VALUES - 1);
+ value_array->values = g_renew (GValue, value_array->values, value_array->n_prealloced);
+ if (!zero_init)
+ i = value_array->n_values;
+ memset (value_array->values + i, 0,
+ (value_array->n_prealloced - i) * sizeof (value_array->values[0]));
+ }
+}
+
+static inline void
+value_array_shrink (GValueArray *value_array)
+{
+#ifdef DISABLE_MEM_POOLS
+ if (value_array->n_prealloced >= value_array->n_values + GROUP_N_VALUES)
+ {
+ value_array->n_prealloced = (value_array->n_values + GROUP_N_VALUES - 1) & ~(GROUP_N_VALUES - 1);
+ value_array->values = g_renew (GValue, value_array->values, value_array->n_prealloced);
+ }
+#endif
+}
+
+GValueArray*
+g_value_array_new (guint n_prealloced)
+{
+ GValueArray *value_array = g_slice_new (GValueArray);
+
+ value_array->n_values = 0;
+ value_array->n_prealloced = 0;
+ value_array->values = NULL;
+ value_array_grow (value_array, n_prealloced, TRUE);
+ value_array->n_values = 0;
+
+ return value_array;
+}
+
+void
+g_value_array_free (GValueArray *value_array)
+{
+ guint i;
+
+ g_return_if_fail (value_array != NULL);
+
+ for (i = 0; i < value_array->n_values; i++)
+ {
+ GValue *value = value_array->values + i;
+
+ if (G_VALUE_TYPE (value) != 0) /* we allow unset values in the array */
+ g_value_unset (value);
+ }
+ g_free (value_array->values);
+ g_slice_free (GValueArray, value_array);
+}
+
+GValueArray*
+g_value_array_copy (const GValueArray *value_array)
+{
+ GValueArray *new_array;
+ guint i;
+
+ g_return_val_if_fail (value_array != NULL, NULL);
+
+ new_array = g_slice_new (GValueArray);
+ new_array->n_values = 0;
+ new_array->values = NULL;
+ new_array->n_prealloced = 0;
+ value_array_grow (new_array, value_array->n_values, TRUE);
+ for (i = 0; i < new_array->n_values; i++)
+ if (G_VALUE_TYPE (value_array->values + i) != 0)
+ {
+ GValue *value = new_array->values + i;
+
+ g_value_init (value, G_VALUE_TYPE (value_array->values + i));
+ g_value_copy (value_array->values + i, value);
+ }
+ return new_array;
+}
+
+GValueArray*
+g_value_array_prepend (GValueArray *value_array,
+ const GValue *value)
+{
+ g_return_val_if_fail (value_array != NULL, NULL);
+
+ return g_value_array_insert (value_array, 0, value);
+}
+
+GValueArray*
+g_value_array_append (GValueArray *value_array,
+ const GValue *value)
+{
+ g_return_val_if_fail (value_array != NULL, NULL);
+
+ return g_value_array_insert (value_array, value_array->n_values, value);
+}
+
+GValueArray*
+g_value_array_insert (GValueArray *value_array,
+ guint index,
+ const GValue *value)
+{
+ guint i;
+
+ g_return_val_if_fail (value_array != NULL, NULL);
+ g_return_val_if_fail (index <= value_array->n_values, value_array);
+
+ /* we support NULL for "value" as a shortcut for an unset value */
+
+ i = value_array->n_values;
+ value_array_grow (value_array, value_array->n_values + 1, FALSE);
+ if (index + 1 < value_array->n_values)
+ g_memmove (value_array->values + index + 1, value_array->values + index,
+ (i - index) * sizeof (value_array->values[0]));
+ memset (value_array->values + index, 0, sizeof (value_array->values[0]));
+ if (value)
+ {
+ g_value_init (value_array->values + index, G_VALUE_TYPE (value));
+ g_value_copy (value, value_array->values + index);
+ }
+ return value_array;
+}
+
+GValueArray*
+g_value_array_remove (GValueArray *value_array,
+ guint index)
+{
+ g_return_val_if_fail (value_array != NULL, NULL);
+ g_return_val_if_fail (index < value_array->n_values, value_array);
+
+ if (G_VALUE_TYPE (value_array->values + index) != 0)
+ g_value_unset (value_array->values + index);
+ value_array->n_values--;
+ if (index < value_array->n_values)
+ g_memmove (value_array->values + index, value_array->values + index + 1,
+ (value_array->n_values - index) * sizeof (value_array->values[0]));
+ value_array_shrink (value_array);
+ if (value_array->n_prealloced > value_array->n_values)
+ memset (value_array->values + value_array->n_values, 0, sizeof (value_array->values[0]));
+
+ return value_array;
+}
+
+GValueArray*
+g_value_array_sort (GValueArray *value_array,
+ GCompareFunc compare_func)
+{
+ g_return_val_if_fail (compare_func != NULL, NULL);
+
+ if (value_array->n_values)
+ qsort (value_array->values,
+ value_array->n_values,
+ sizeof (value_array->values[0]),
+ compare_func);
+ return value_array;
+}
+
+GValueArray*
+g_value_array_sort_with_data (GValueArray *value_array,
+ GCompareDataFunc compare_func,
+ gpointer user_data)
+{
+ g_return_val_if_fail (value_array != NULL, NULL);
+ g_return_val_if_fail (compare_func != NULL, NULL);
+
+ if (value_array->n_values)
+ g_qsort_with_data (value_array->values,
+ value_array->n_values,
+ sizeof (value_array->values[0]),
+ compare_func, user_data);
+ return value_array;
+}
+
+#define __G_VALUE_ARRAY_C__
+#include "gobjectaliasdef.c"
diff --git a/trunk/gobject/gvaluearray.h b/trunk/gobject/gvaluearray.h
new file mode 100644
index 000000000..d6897148f
--- /dev/null
+++ b/trunk/gobject/gvaluearray.h
@@ -0,0 +1,70 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2001 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.
+ *
+ * gvaluearray.h: GLib array type holding GValues
+ */
+#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
+#error "Only <glib-object.h> can be included directly."
+#endif
+
+#ifndef __G_VALUE_ARRAY_H__
+#define __G_VALUE_ARRAY_H__
+
+#include <gobject/gvalue.h>
+
+
+G_BEGIN_DECLS
+
+
+/* --- typedefs & structs --- */
+typedef struct _GValueArray GValueArray;
+struct _GValueArray
+{
+ guint n_values;
+ GValue *values;
+
+ /*< private >*/
+ guint n_prealloced;
+};
+
+
+/* --- prototypes --- */
+GValue* g_value_array_get_nth (GValueArray *value_array,
+ guint index_);
+GValueArray* g_value_array_new (guint n_prealloced);
+void g_value_array_free (GValueArray *value_array);
+GValueArray* g_value_array_copy (const GValueArray *value_array);
+GValueArray* g_value_array_prepend (GValueArray *value_array,
+ const GValue *value);
+GValueArray* g_value_array_append (GValueArray *value_array,
+ const GValue *value);
+GValueArray* g_value_array_insert (GValueArray *value_array,
+ guint index_,
+ const GValue *value);
+GValueArray* g_value_array_remove (GValueArray *value_array,
+ guint index_);
+GValueArray* g_value_array_sort (GValueArray *value_array,
+ GCompareFunc compare_func);
+GValueArray* g_value_array_sort_with_data (GValueArray *value_array,
+ GCompareDataFunc compare_func,
+ gpointer user_data);
+
+
+G_END_DECLS
+
+#endif /* __G_VALUE_ARRAY_H__ */
diff --git a/trunk/gobject/gvaluecollector.h b/trunk/gobject/gvaluecollector.h
new file mode 100644
index 000000000..e9379968a
--- /dev/null
+++ b/trunk/gobject/gvaluecollector.h
@@ -0,0 +1,160 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1998-1999, 2000-2001 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.
+ *
+ * gvaluecollector.h: GValue varargs stubs
+ */
+#ifndef __G_VALUE_COLLECTOR_H__
+#define __G_VALUE_COLLECTOR_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/* we may want to add aggregate types here some day, if requested
+ * by users. the basic C types are covered already, everything
+ * smaller than an int is promoted to an integer and floats are
+ * always promoted to doubles for varargs call constructions.
+ */
+enum /*< skip >*/
+{
+ G_VALUE_COLLECT_INT = 'i',
+ G_VALUE_COLLECT_LONG = 'l',
+ G_VALUE_COLLECT_INT64 = 'q',
+ G_VALUE_COLLECT_DOUBLE = 'd',
+ G_VALUE_COLLECT_POINTER = 'p'
+};
+
+
+/* vararg union holding actuall values collected
+ */
+union _GTypeCValue
+{
+ gint v_int;
+ glong v_long;
+ gint64 v_int64;
+ gdouble v_double;
+ gpointer v_pointer;
+};
+
+
+/* G_VALUE_COLLECT() collects a variable argument value
+ * from a va_list. we have to implement the varargs collection as a
+ * macro, because on some systems va_list variables cannot be passed
+ * by reference.
+ * value is supposed to be initialized according to the value
+ * type to be collected.
+ * var_args is the va_list variable and may be evaluated multiple times.
+ * __error is a gchar** variable that will be modified to hold a g_new()
+ * allocated error messages if something fails.
+ */
+#define G_VALUE_COLLECT(value, var_args, flags, __error) \
+G_STMT_START { \
+ GValue *_value = (value); \
+ guint _flags = (flags); \
+ GType _value_type = G_VALUE_TYPE (_value); \
+ GTypeValueTable *_vtable = g_type_value_table_peek (_value_type); \
+ gchar *_collect_format = _vtable->collect_format; \
+ GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, }; \
+ guint _n_values = 0; \
+ \
+ if (_vtable->value_free) \
+ _vtable->value_free (_value); \
+ _value->g_type = _value_type; /* value_meminit() from gvalue.c */ \
+ memset (_value->data, 0, sizeof (_value->data)); \
+ while (*_collect_format) \
+ { \
+ GTypeCValue *_cvalue = _cvalues + _n_values++; \
+ \
+ switch (*_collect_format++) \
+ { \
+ case G_VALUE_COLLECT_INT: \
+ _cvalue->v_int = va_arg ((var_args), gint); \
+ break; \
+ case G_VALUE_COLLECT_LONG: \
+ _cvalue->v_long = va_arg ((var_args), glong); \
+ break; \
+ case G_VALUE_COLLECT_INT64: \
+ _cvalue->v_int64 = va_arg ((var_args), gint64); \
+ break; \
+ case G_VALUE_COLLECT_DOUBLE: \
+ _cvalue->v_double = va_arg ((var_args), gdouble); \
+ break; \
+ case G_VALUE_COLLECT_POINTER: \
+ _cvalue->v_pointer = va_arg ((var_args), gpointer); \
+ break; \
+ default: \
+ g_assert_not_reached (); \
+ } \
+ } \
+ *(__error) = _vtable->collect_value (_value, \
+ _n_values, \
+ _cvalues, \
+ _flags); \
+} G_STMT_END
+
+
+/* G_VALUE_LCOPY() collects a value's variable argument
+ * locations from a va_list. usage is analogous to G_VALUE_COLLECT().
+ */
+#define G_VALUE_LCOPY(value, var_args, flags, __error) \
+G_STMT_START { \
+ const GValue *_value = (value); \
+ guint _flags = (flags); \
+ GType _value_type = G_VALUE_TYPE (_value); \
+ GTypeValueTable *_vtable = g_type_value_table_peek (_value_type); \
+ gchar *_lcopy_format = _vtable->lcopy_format; \
+ GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, }; \
+ guint _n_values = 0; \
+ \
+ while (*_lcopy_format) \
+ { \
+ GTypeCValue *_cvalue = _cvalues + _n_values++; \
+ \
+ switch (*_lcopy_format++) \
+ { \
+ case G_VALUE_COLLECT_INT: \
+ _cvalue->v_int = va_arg ((var_args), gint); \
+ break; \
+ case G_VALUE_COLLECT_LONG: \
+ _cvalue->v_long = va_arg ((var_args), glong); \
+ break; \
+ case G_VALUE_COLLECT_INT64: \
+ _cvalue->v_int64 = va_arg ((var_args), gint64); \
+ break; \
+ case G_VALUE_COLLECT_DOUBLE: \
+ _cvalue->v_double = va_arg ((var_args), gdouble); \
+ break; \
+ case G_VALUE_COLLECT_POINTER: \
+ _cvalue->v_pointer = va_arg ((var_args), gpointer); \
+ break; \
+ default: \
+ g_assert_not_reached (); \
+ } \
+ } \
+ *(__error) = _vtable->lcopy_value (_value, \
+ _n_values, \
+ _cvalues, \
+ _flags); \
+} G_STMT_END
+
+
+#define G_VALUE_COLLECT_FORMAT_MAX_LENGTH (8)
+
+G_END_DECLS
+
+#endif /* __G_VALUE_COLLECTOR_H__ */
diff --git a/trunk/gobject/gvaluetransform.c b/trunk/gobject/gvaluetransform.c
new file mode 100644
index 000000000..2f296e174
--- /dev/null
+++ b/trunk/gobject/gvaluetransform.c
@@ -0,0 +1,440 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2001 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 <string.h>
+
+#include "gvalue.h"
+#include "genums.h"
+#include "gobjectalias.h"
+
+
+/* same type transforms
+ */
+static void
+value_transform_memcpy_data0 (const GValue *src_value,
+ GValue *dest_value)
+{
+ memcpy (&dest_value->data[0], &src_value->data[0], sizeof (src_value->data[0]));
+}
+#define value_transform_int_int value_transform_memcpy_data0
+#define value_transform_uint_uint value_transform_memcpy_data0
+#define value_transform_long_long value_transform_memcpy_data0
+#define value_transform_ulong_ulong value_transform_memcpy_data0
+#define value_transform_int64_int64 value_transform_memcpy_data0
+#define value_transform_uint64_uint64 value_transform_memcpy_data0
+#define value_transform_float_float value_transform_memcpy_data0
+#define value_transform_double_double value_transform_memcpy_data0
+
+
+/* numeric casts
+ */
+#define DEFINE_CAST(func_name, from_member, ctype, to_member) \
+static void \
+value_transform_##func_name (const GValue *src_value, \
+ GValue *dest_value) \
+{ \
+ ctype c_value = src_value->data[0].from_member; \
+ dest_value->data[0].to_member = c_value; \
+} extern void glib_dummy_decl (void)
+DEFINE_CAST (int_s8, v_int, gint8, v_int);
+DEFINE_CAST (int_u8, v_int, guint8, v_uint);
+DEFINE_CAST (int_uint, v_int, guint, v_uint);
+DEFINE_CAST (int_long, v_int, glong, v_long);
+DEFINE_CAST (int_ulong, v_int, gulong, v_ulong);
+DEFINE_CAST (int_int64, v_int, gint64, v_int64);
+DEFINE_CAST (int_uint64, v_int, guint64, v_uint64);
+DEFINE_CAST (int_float, v_int, gfloat, v_float);
+DEFINE_CAST (int_double, v_int, gdouble, v_double);
+DEFINE_CAST (uint_s8, v_uint, gint8, v_int);
+DEFINE_CAST (uint_u8, v_uint, guint8, v_uint);
+DEFINE_CAST (uint_int, v_uint, gint, v_int);
+DEFINE_CAST (uint_long, v_uint, glong, v_long);
+DEFINE_CAST (uint_ulong, v_uint, gulong, v_ulong);
+DEFINE_CAST (uint_int64, v_uint, gint64, v_int64);
+DEFINE_CAST (uint_uint64, v_uint, guint64, v_uint64);
+DEFINE_CAST (uint_float, v_uint, gfloat, v_float);
+DEFINE_CAST (uint_double, v_uint, gdouble, v_double);
+DEFINE_CAST (long_s8, v_long, gint8, v_int);
+DEFINE_CAST (long_u8, v_long, guint8, v_uint);
+DEFINE_CAST (long_int, v_long, gint, v_int);
+DEFINE_CAST (long_uint, v_long, guint, v_uint);
+DEFINE_CAST (long_ulong, v_long, gulong, v_ulong);
+DEFINE_CAST (long_int64, v_long, gint64, v_int64);
+DEFINE_CAST (long_uint64, v_long, guint64, v_uint64);
+DEFINE_CAST (long_float, v_long, gfloat, v_float);
+DEFINE_CAST (long_double, v_long, gdouble, v_double);
+DEFINE_CAST (ulong_s8, v_ulong, gint8, v_int);
+DEFINE_CAST (ulong_u8, v_ulong, guint8, v_uint);
+DEFINE_CAST (ulong_int, v_ulong, gint, v_int);
+DEFINE_CAST (ulong_uint, v_ulong, guint, v_uint);
+DEFINE_CAST (ulong_int64, v_ulong, gint64, v_int64);
+DEFINE_CAST (ulong_uint64, v_ulong, guint64, v_uint64);
+DEFINE_CAST (ulong_long, v_ulong, glong, v_long);
+DEFINE_CAST (ulong_float, v_ulong, gfloat, v_float);
+DEFINE_CAST (ulong_double, v_ulong, gdouble, v_double);
+DEFINE_CAST (int64_s8, v_int64, gint8, v_int);
+DEFINE_CAST (int64_u8, v_int64, guint8, v_uint);
+DEFINE_CAST (int64_int, v_int64, gint, v_int);
+DEFINE_CAST (int64_uint, v_int64, guint, v_uint);
+DEFINE_CAST (int64_long, v_int64, glong, v_long);
+DEFINE_CAST (int64_uint64, v_int64, guint64, v_uint64);
+DEFINE_CAST (int64_ulong, v_int64, gulong, v_ulong);
+DEFINE_CAST (int64_float, v_int64, gfloat, v_float);
+DEFINE_CAST (int64_double, v_int64, gdouble, v_double);
+DEFINE_CAST (uint64_s8, v_uint64, gint8, v_int);
+DEFINE_CAST (uint64_u8, v_uint64, guint8, v_uint);
+DEFINE_CAST (uint64_int, v_uint64, gint, v_int);
+DEFINE_CAST (uint64_uint, v_uint64, guint, v_uint);
+DEFINE_CAST (uint64_long, v_uint64, glong, v_long);
+DEFINE_CAST (uint64_ulong, v_uint64, gulong, v_ulong);
+DEFINE_CAST (uint64_int64, v_uint64, gint64, v_int64);
+#ifdef _MSC_VER
+/* work around error C2520: conversion from unsigned __int64 to double
+ * not implemented, use signed __int64
+ * If it is supported don't miss to g_value_register_transform_func() below
+ */
+#pragma message ("Check if cast from uint64 to double is supported with msvc 6.0")
+#else
+DEFINE_CAST (uint64_float, v_uint64, gfloat, v_float);
+DEFINE_CAST (uint64_double, v_uint64, gdouble, v_double);
+#endif
+DEFINE_CAST (float_s8, v_float, gint8, v_int);
+DEFINE_CAST (float_u8, v_float, guint8, v_uint);
+DEFINE_CAST (float_int, v_float, gint, v_int);
+DEFINE_CAST (float_uint, v_float, guint, v_uint);
+DEFINE_CAST (float_long, v_float, glong, v_long);
+DEFINE_CAST (float_ulong, v_float, gulong, v_ulong);
+DEFINE_CAST (float_int64, v_float, gint64, v_int64);
+DEFINE_CAST (float_uint64, v_float, guint64, v_uint64);
+DEFINE_CAST (float_double, v_float, gdouble, v_double);
+DEFINE_CAST (double_s8, v_double, gint8, v_int);
+DEFINE_CAST (double_u8, v_double, guint8, v_uint);
+DEFINE_CAST (double_int, v_double, gint, v_int);
+DEFINE_CAST (double_uint, v_double, guint, v_uint);
+DEFINE_CAST (double_long, v_double, glong, v_long);
+DEFINE_CAST (double_ulong, v_double, gulong, v_ulong);
+DEFINE_CAST (double_int64, v_double, gint64, v_int64);
+DEFINE_CAST (double_uint64, v_double, guint64, v_uint64);
+DEFINE_CAST (double_float, v_double, gfloat, v_float);
+
+
+/* boolean assignments
+ */
+#define DEFINE_BOOL_CHECK(func_name, from_member) \
+static void \
+value_transform_##func_name (const GValue *src_value, \
+ GValue *dest_value) \
+{ \
+ dest_value->data[0].v_int = src_value->data[0].from_member != 0; \
+} extern void glib_dummy_decl (void)
+DEFINE_BOOL_CHECK (int_bool, v_int);
+DEFINE_BOOL_CHECK (uint_bool, v_uint);
+DEFINE_BOOL_CHECK (long_bool, v_long);
+DEFINE_BOOL_CHECK (ulong_bool, v_uint);
+DEFINE_BOOL_CHECK (int64_bool, v_int64);
+DEFINE_BOOL_CHECK (uint64_bool, v_uint64);
+
+
+/* string printouts
+ */
+#define DEFINE_SPRINTF(func_name, from_member, format) \
+static void \
+value_transform_##func_name (const GValue *src_value, \
+ GValue *dest_value) \
+{ \
+ dest_value->data[0].v_pointer = g_strdup_printf ((format), \
+ src_value->data[0].from_member); \
+} extern void glib_dummy_decl (void)
+DEFINE_SPRINTF (int_string, v_int, "%d");
+DEFINE_SPRINTF (uint_string, v_uint, "%u");
+DEFINE_SPRINTF (long_string, v_long, "%ld");
+DEFINE_SPRINTF (ulong_string, v_ulong, "%lu");
+DEFINE_SPRINTF (int64_string, v_int64, "%" G_GINT64_FORMAT);
+DEFINE_SPRINTF (uint64_string, v_uint64, "%" G_GUINT64_FORMAT);
+DEFINE_SPRINTF (float_string, v_float, "%f");
+DEFINE_SPRINTF (double_string, v_double, "%f");
+
+
+/* special cases
+ */
+static void
+value_transform_bool_string (const GValue *src_value,
+ GValue *dest_value)
+{
+ dest_value->data[0].v_pointer = g_strdup_printf ("%s",
+ src_value->data[0].v_int ?
+ "TRUE" : "FALSE");
+}
+static void
+value_transform_string_string (const GValue *src_value,
+ GValue *dest_value)
+{
+ dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer);
+}
+static void
+value_transform_enum_string (const GValue *src_value,
+ GValue *dest_value)
+{
+ GEnumClass *class = g_type_class_ref (G_VALUE_TYPE (src_value));
+ GEnumValue *enum_value = g_enum_get_value (class, src_value->data[0].v_long);
+
+ if (enum_value)
+ dest_value->data[0].v_pointer = g_strdup (enum_value->value_name);
+ else
+ dest_value->data[0].v_pointer = g_strdup_printf ("%ld", src_value->data[0].v_long);
+
+ g_type_class_unref (class);
+}
+static void
+value_transform_flags_string (const GValue *src_value,
+ GValue *dest_value)
+{
+ GFlagsClass *class = g_type_class_ref (G_VALUE_TYPE (src_value));
+ GFlagsValue *flags_value = g_flags_get_first_value (class, src_value->data[0].v_ulong);
+
+ if (flags_value)
+ {
+ GString *gstring = g_string_new (NULL);
+ guint v_flags = src_value->data[0].v_ulong;
+
+ do
+ {
+ v_flags &= ~flags_value->value;
+
+ if (gstring->str[0])
+ g_string_append (gstring, " | ");
+ g_string_append (gstring, flags_value->value_name);
+ flags_value = g_flags_get_first_value (class, v_flags);
+ }
+ while (flags_value);
+
+ if (v_flags)
+ dest_value->data[0].v_pointer = g_strdup_printf ("%s | %u",
+ gstring->str,
+ v_flags);
+ else
+ dest_value->data[0].v_pointer = g_strdup (gstring->str);
+ g_string_free (gstring, TRUE);
+ }
+ else
+ dest_value->data[0].v_pointer = g_strdup_printf ("%lu", src_value->data[0].v_ulong);
+
+ g_type_class_unref (class);
+}
+
+
+/* registration
+ */
+void
+g_value_transforms_init (void)
+{
+ /* some transformations are a bit questionable,
+ * we currently skip those
+ */
+#define SKIP____register_transform_func(type1,type2,transform_func) /* skip questionable transforms */ \
+ (void)0
+
+ /* numeric types (plus to string) */
+ g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_CHAR, value_transform_int_int);
+ g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_UCHAR, value_transform_int_u8);
+ g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_BOOLEAN, value_transform_int_bool);
+ g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_INT, value_transform_int_int);
+ g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_UINT, value_transform_int_uint);
+ g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_LONG, value_transform_int_long);
+ g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_ULONG, value_transform_int_ulong);
+ g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_INT64, value_transform_int_int64);
+ g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_UINT64, value_transform_int_uint64);
+ g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_ENUM, value_transform_int_long);
+ g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_FLAGS, value_transform_int_ulong);
+ g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_FLOAT, value_transform_int_float);
+ g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_DOUBLE, value_transform_int_double);
+ g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_STRING, value_transform_int_string);
+ g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_CHAR, value_transform_uint_s8);
+ g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_UCHAR, value_transform_uint_uint);
+ g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_BOOLEAN, value_transform_uint_bool);
+ g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_INT, value_transform_uint_int);
+ g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_UINT, value_transform_uint_uint);
+ g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_LONG, value_transform_uint_long);
+ g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_ULONG, value_transform_uint_ulong);
+ g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_INT64, value_transform_uint_int64);
+ g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_UINT64, value_transform_uint_uint64);
+ g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_ENUM, value_transform_uint_long);
+ g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_FLAGS, value_transform_uint_ulong);
+ g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_FLOAT, value_transform_uint_float);
+ g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_DOUBLE, value_transform_uint_double);
+ g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_STRING, value_transform_uint_string);
+ g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_CHAR, value_transform_int_s8);
+ g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_UCHAR, value_transform_int_u8);
+ g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, value_transform_int_int);
+ g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_INT, value_transform_int_int);
+ g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_UINT, value_transform_int_uint);
+ g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_LONG, value_transform_int_long);
+ g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_ULONG, value_transform_int_ulong);
+ g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_INT64, value_transform_int_int64);
+ g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_UINT64, value_transform_int_uint64);
+ g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_ENUM, value_transform_int_long);
+ g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_FLAGS, value_transform_int_ulong);
+ SKIP____register_transform_func (G_TYPE_BOOLEAN, G_TYPE_FLOAT, value_transform_int_float);
+ SKIP____register_transform_func (G_TYPE_BOOLEAN, G_TYPE_DOUBLE, value_transform_int_double);
+ g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_STRING, value_transform_bool_string);
+ g_value_register_transform_func (G_TYPE_INT, G_TYPE_CHAR, value_transform_int_s8);
+ g_value_register_transform_func (G_TYPE_INT, G_TYPE_UCHAR, value_transform_int_u8);
+ g_value_register_transform_func (G_TYPE_INT, G_TYPE_BOOLEAN, value_transform_int_bool);
+ g_value_register_transform_func (G_TYPE_INT, G_TYPE_INT, value_transform_int_int);
+ g_value_register_transform_func (G_TYPE_INT, G_TYPE_UINT, value_transform_int_uint);
+ g_value_register_transform_func (G_TYPE_INT, G_TYPE_LONG, value_transform_int_long);
+ g_value_register_transform_func (G_TYPE_INT, G_TYPE_ULONG, value_transform_int_ulong);
+ g_value_register_transform_func (G_TYPE_INT, G_TYPE_INT64, value_transform_int_int64);
+ g_value_register_transform_func (G_TYPE_INT, G_TYPE_UINT64, value_transform_int_uint64);
+ g_value_register_transform_func (G_TYPE_INT, G_TYPE_ENUM, value_transform_int_long);
+ g_value_register_transform_func (G_TYPE_INT, G_TYPE_FLAGS, value_transform_int_ulong);
+ g_value_register_transform_func (G_TYPE_INT, G_TYPE_FLOAT, value_transform_int_float);
+ g_value_register_transform_func (G_TYPE_INT, G_TYPE_DOUBLE, value_transform_int_double);
+ g_value_register_transform_func (G_TYPE_INT, G_TYPE_STRING, value_transform_int_string);
+ g_value_register_transform_func (G_TYPE_UINT, G_TYPE_CHAR, value_transform_uint_s8);
+ g_value_register_transform_func (G_TYPE_UINT, G_TYPE_UCHAR, value_transform_uint_u8);
+ g_value_register_transform_func (G_TYPE_UINT, G_TYPE_BOOLEAN, value_transform_uint_bool);
+ g_value_register_transform_func (G_TYPE_UINT, G_TYPE_INT, value_transform_uint_int);
+ g_value_register_transform_func (G_TYPE_UINT, G_TYPE_UINT, value_transform_uint_uint);
+ g_value_register_transform_func (G_TYPE_UINT, G_TYPE_LONG, value_transform_uint_long);
+ g_value_register_transform_func (G_TYPE_UINT, G_TYPE_ULONG, value_transform_uint_ulong);
+ g_value_register_transform_func (G_TYPE_UINT, G_TYPE_INT64, value_transform_uint_int64);
+ g_value_register_transform_func (G_TYPE_UINT, G_TYPE_UINT64, value_transform_uint_uint64);
+ g_value_register_transform_func (G_TYPE_UINT, G_TYPE_ENUM, value_transform_uint_long);
+ g_value_register_transform_func (G_TYPE_UINT, G_TYPE_FLAGS, value_transform_uint_ulong);
+ g_value_register_transform_func (G_TYPE_UINT, G_TYPE_FLOAT, value_transform_uint_float);
+ g_value_register_transform_func (G_TYPE_UINT, G_TYPE_DOUBLE, value_transform_uint_double);
+ g_value_register_transform_func (G_TYPE_UINT, G_TYPE_STRING, value_transform_uint_string);
+ g_value_register_transform_func (G_TYPE_LONG, G_TYPE_CHAR, value_transform_long_s8);
+ g_value_register_transform_func (G_TYPE_LONG, G_TYPE_UCHAR, value_transform_long_u8);
+ g_value_register_transform_func (G_TYPE_LONG, G_TYPE_BOOLEAN, value_transform_long_bool);
+ g_value_register_transform_func (G_TYPE_LONG, G_TYPE_INT, value_transform_long_int);
+ g_value_register_transform_func (G_TYPE_LONG, G_TYPE_UINT, value_transform_long_uint);
+ g_value_register_transform_func (G_TYPE_LONG, G_TYPE_LONG, value_transform_long_long);
+ g_value_register_transform_func (G_TYPE_LONG, G_TYPE_ULONG, value_transform_long_ulong);
+ g_value_register_transform_func (G_TYPE_LONG, G_TYPE_INT64, value_transform_long_int64);
+ g_value_register_transform_func (G_TYPE_LONG, G_TYPE_UINT64, value_transform_long_uint64);
+ g_value_register_transform_func (G_TYPE_LONG, G_TYPE_ENUM, value_transform_long_long);
+ g_value_register_transform_func (G_TYPE_LONG, G_TYPE_FLAGS, value_transform_long_ulong);
+ g_value_register_transform_func (G_TYPE_LONG, G_TYPE_FLOAT, value_transform_long_float);
+ g_value_register_transform_func (G_TYPE_LONG, G_TYPE_DOUBLE, value_transform_long_double);
+ g_value_register_transform_func (G_TYPE_LONG, G_TYPE_STRING, value_transform_long_string);
+ g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_CHAR, value_transform_ulong_s8);
+ g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_UCHAR, value_transform_ulong_u8);
+ g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_BOOLEAN, value_transform_ulong_bool);
+ g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_INT, value_transform_ulong_int);
+ g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_UINT, value_transform_ulong_uint);
+ g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_LONG, value_transform_ulong_long);
+ g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_ULONG, value_transform_ulong_ulong);
+ g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_INT64, value_transform_ulong_int64);
+ g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_UINT64, value_transform_ulong_uint64);
+ g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_ENUM, value_transform_ulong_long);
+ g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_FLAGS, value_transform_ulong_ulong);
+ g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_FLOAT, value_transform_ulong_float);
+ g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_DOUBLE, value_transform_ulong_double);
+ g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_STRING, value_transform_ulong_string);
+ g_value_register_transform_func (G_TYPE_INT64, G_TYPE_CHAR, value_transform_int64_s8);
+ g_value_register_transform_func (G_TYPE_INT64, G_TYPE_UCHAR, value_transform_int64_u8);
+ g_value_register_transform_func (G_TYPE_INT64, G_TYPE_BOOLEAN, value_transform_int64_bool);
+ g_value_register_transform_func (G_TYPE_INT64, G_TYPE_INT, value_transform_int64_int);
+ g_value_register_transform_func (G_TYPE_INT64, G_TYPE_UINT, value_transform_int64_uint);
+ g_value_register_transform_func (G_TYPE_INT64, G_TYPE_LONG, value_transform_int64_long);
+ g_value_register_transform_func (G_TYPE_INT64, G_TYPE_ULONG, value_transform_int64_ulong);
+ g_value_register_transform_func (G_TYPE_INT64, G_TYPE_INT64, value_transform_int64_int64);
+ g_value_register_transform_func (G_TYPE_INT64, G_TYPE_UINT64, value_transform_int64_uint64);
+ g_value_register_transform_func (G_TYPE_INT64, G_TYPE_ENUM, value_transform_int64_long);
+ g_value_register_transform_func (G_TYPE_INT64, G_TYPE_FLAGS, value_transform_int64_ulong);
+ g_value_register_transform_func (G_TYPE_INT64, G_TYPE_FLOAT, value_transform_int64_float);
+ g_value_register_transform_func (G_TYPE_INT64, G_TYPE_DOUBLE, value_transform_int64_double);
+ g_value_register_transform_func (G_TYPE_INT64, G_TYPE_STRING, value_transform_int64_string);
+ g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_CHAR, value_transform_uint64_s8);
+ g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_UCHAR, value_transform_uint64_u8);
+ g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_BOOLEAN, value_transform_uint64_bool);
+ g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_INT, value_transform_uint64_int);
+ g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_UINT, value_transform_uint64_uint);
+ g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_LONG, value_transform_uint64_long);
+ g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_ULONG, value_transform_uint64_ulong);
+ g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_INT64, value_transform_uint64_int64);
+ g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_UINT64, value_transform_uint64_uint64);
+ g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_ENUM, value_transform_uint64_long);
+ g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_FLAGS, value_transform_uint64_ulong);
+#ifndef _MSC_VER
+ /* required casts unsupported with msvc 5.0 */
+ g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_FLOAT, value_transform_uint64_float);
+ g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_DOUBLE, value_transform_uint64_double);
+#endif
+ g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_STRING, value_transform_uint64_string);
+ g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_CHAR, value_transform_long_s8);
+ g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_UCHAR, value_transform_long_u8);
+ SKIP____register_transform_func (G_TYPE_ENUM, G_TYPE_BOOLEAN, value_transform_long_bool);
+ g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_INT, value_transform_long_int);
+ g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_UINT, value_transform_long_uint);
+ g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_LONG, value_transform_long_long);
+ g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_ULONG, value_transform_long_ulong);
+ g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_INT64, value_transform_long_int64);
+ g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_UINT64, value_transform_long_uint64);
+ g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_ENUM, value_transform_long_long);
+ g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_FLAGS, value_transform_long_ulong);
+ SKIP____register_transform_func (G_TYPE_ENUM, G_TYPE_FLOAT, value_transform_long_float);
+ SKIP____register_transform_func (G_TYPE_ENUM, G_TYPE_DOUBLE, value_transform_long_double);
+ g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_STRING, value_transform_enum_string);
+ g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_CHAR, value_transform_ulong_s8);
+ g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_UCHAR, value_transform_ulong_u8);
+ SKIP____register_transform_func (G_TYPE_FLAGS, G_TYPE_BOOLEAN, value_transform_ulong_bool);
+ g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_INT, value_transform_ulong_int);
+ g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_UINT, value_transform_ulong_uint);
+ g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_LONG, value_transform_ulong_long);
+ g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_ULONG, value_transform_ulong_ulong);
+ g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_INT64, value_transform_ulong_int64);
+ g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_UINT64, value_transform_ulong_uint64);
+ SKIP____register_transform_func (G_TYPE_FLAGS, G_TYPE_ENUM, value_transform_ulong_long);
+ g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_FLAGS, value_transform_ulong_ulong);
+ SKIP____register_transform_func (G_TYPE_FLAGS, G_TYPE_FLOAT, value_transform_ulong_float);
+ SKIP____register_transform_func (G_TYPE_FLAGS, G_TYPE_DOUBLE, value_transform_ulong_double);
+ g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_STRING, value_transform_flags_string);
+ g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_CHAR, value_transform_float_s8);
+ g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_UCHAR, value_transform_float_u8);
+ SKIP____register_transform_func (G_TYPE_FLOAT, G_TYPE_BOOLEAN, value_transform_float_bool);
+ g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_INT, value_transform_float_int);
+ g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_UINT, value_transform_float_uint);
+ g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_LONG, value_transform_float_long);
+ g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_ULONG, value_transform_float_ulong);
+ g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_INT64, value_transform_float_int64);
+ g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_UINT64, value_transform_float_uint64);
+ SKIP____register_transform_func (G_TYPE_FLOAT, G_TYPE_ENUM, value_transform_float_long);
+ SKIP____register_transform_func (G_TYPE_FLOAT, G_TYPE_FLAGS, value_transform_float_ulong);
+ g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_FLOAT, value_transform_float_float);
+ g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_DOUBLE, value_transform_float_double);
+ g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_STRING, value_transform_float_string);
+ g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_CHAR, value_transform_double_s8);
+ g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_UCHAR, value_transform_double_u8);
+ SKIP____register_transform_func (G_TYPE_DOUBLE, G_TYPE_BOOLEAN, value_transform_double_bool);
+ g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_INT, value_transform_double_int);
+ g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_UINT, value_transform_double_uint);
+ g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_LONG, value_transform_double_long);
+ g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_ULONG, value_transform_double_ulong);
+ g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_INT64, value_transform_double_int64);
+ g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_UINT64, value_transform_double_uint64);
+ SKIP____register_transform_func (G_TYPE_DOUBLE, G_TYPE_ENUM, value_transform_double_long);
+ SKIP____register_transform_func (G_TYPE_DOUBLE, G_TYPE_FLAGS, value_transform_double_ulong);
+ g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_FLOAT, value_transform_double_float);
+ g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_DOUBLE, value_transform_double_double);
+ g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_STRING, value_transform_double_string);
+ /* string types */
+ g_value_register_transform_func (G_TYPE_STRING, G_TYPE_STRING, value_transform_string_string);
+}
diff --git a/trunk/gobject/gvaluetypes.c b/trunk/gobject/gvaluetypes.c
new file mode 100644
index 000000000..a479a5807
--- /dev/null
+++ b/trunk/gobject/gvaluetypes.c
@@ -0,0 +1,944 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1997-1999, 2000-2001 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.
+ */
+
+/*
+ * MT safe
+ */
+
+#include "gvaluetypes.h"
+
+#include "gvaluecollector.h"
+
+#include "gobject.h"
+#include "gparam.h"
+#include "gboxed.h"
+#include "genums.h"
+
+#include "gobjectalias.h"
+#include <string.h>
+#include <stdlib.h> /* qsort() */
+
+
+/* --- value functions --- */
+static void
+value_init_long0 (GValue *value)
+{
+ value->data[0].v_long = 0;
+}
+
+static void
+value_copy_long0 (const GValue *src_value,
+ GValue *dest_value)
+{
+ dest_value->data[0].v_long = src_value->data[0].v_long;
+}
+
+static gchar*
+value_lcopy_char (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ gint8 *int8_p = collect_values[0].v_pointer;
+
+ if (!int8_p)
+ return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+
+ *int8_p = value->data[0].v_int;
+
+ return NULL;
+}
+
+static gchar*
+value_lcopy_boolean (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ gboolean *bool_p = collect_values[0].v_pointer;
+
+ if (!bool_p)
+ return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+
+ *bool_p = value->data[0].v_int;
+
+ return NULL;
+}
+
+static gchar*
+value_collect_int (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ value->data[0].v_int = collect_values[0].v_int;
+
+ return NULL;
+}
+
+static gchar*
+value_lcopy_int (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ gint *int_p = collect_values[0].v_pointer;
+
+ if (!int_p)
+ return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+
+ *int_p = value->data[0].v_int;
+
+ return NULL;
+}
+
+static gchar*
+value_collect_long (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ value->data[0].v_long = collect_values[0].v_long;
+
+ return NULL;
+}
+
+static gchar*
+value_lcopy_long (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ glong *long_p = collect_values[0].v_pointer;
+
+ if (!long_p)
+ return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+
+ *long_p = value->data[0].v_long;
+
+ return NULL;
+}
+
+static void
+value_init_int64 (GValue *value)
+{
+ value->data[0].v_int64 = 0;
+}
+
+static void
+value_copy_int64 (const GValue *src_value,
+ GValue *dest_value)
+{
+ dest_value->data[0].v_int64 = src_value->data[0].v_int64;
+}
+
+static gchar*
+value_collect_int64 (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ value->data[0].v_int64 = collect_values[0].v_int64;
+
+ return NULL;
+}
+
+static gchar*
+value_lcopy_int64 (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ gint64 *int64_p = collect_values[0].v_pointer;
+
+ if (!int64_p)
+ return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+
+ *int64_p = value->data[0].v_int64;
+
+ return NULL;
+}
+
+static void
+value_init_float (GValue *value)
+{
+ value->data[0].v_float = 0.0;
+}
+
+static void
+value_copy_float (const GValue *src_value,
+ GValue *dest_value)
+{
+ dest_value->data[0].v_float = src_value->data[0].v_float;
+}
+
+static gchar*
+value_collect_float (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ value->data[0].v_float = collect_values[0].v_double;
+
+ return NULL;
+}
+
+static gchar*
+value_lcopy_float (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ gfloat *float_p = collect_values[0].v_pointer;
+
+ if (!float_p)
+ return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+
+ *float_p = value->data[0].v_float;
+
+ return NULL;
+}
+
+static void
+value_init_double (GValue *value)
+{
+ value->data[0].v_double = 0.0;
+}
+
+static void
+value_copy_double (const GValue *src_value,
+ GValue *dest_value)
+{
+ dest_value->data[0].v_double = src_value->data[0].v_double;
+}
+
+static gchar*
+value_collect_double (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ value->data[0].v_double = collect_values[0].v_double;
+
+ return NULL;
+}
+
+static gchar*
+value_lcopy_double (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ gdouble *double_p = collect_values[0].v_pointer;
+
+ if (!double_p)
+ return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+
+ *double_p = value->data[0].v_double;
+
+ return NULL;
+}
+
+static void
+value_init_string (GValue *value)
+{
+ value->data[0].v_pointer = NULL;
+}
+
+static void
+value_free_string (GValue *value)
+{
+ if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
+ g_free (value->data[0].v_pointer);
+}
+
+static void
+value_copy_string (const GValue *src_value,
+ GValue *dest_value)
+{
+ dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer);
+}
+
+static gchar*
+value_collect_string (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ if (!collect_values[0].v_pointer)
+ value->data[0].v_pointer = NULL;
+ else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
+ {
+ value->data[0].v_pointer = collect_values[0].v_pointer;
+ value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
+ }
+ else
+ value->data[0].v_pointer = g_strdup (collect_values[0].v_pointer);
+
+ return NULL;
+}
+
+static gchar*
+value_lcopy_string (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ gchar **string_p = collect_values[0].v_pointer;
+
+ if (!string_p)
+ return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+
+ if (!value->data[0].v_pointer)
+ *string_p = NULL;
+ else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
+ *string_p = value->data[0].v_pointer;
+ else
+ *string_p = g_strdup (value->data[0].v_pointer);
+
+ return NULL;
+}
+
+static void
+value_init_pointer (GValue *value)
+{
+ value->data[0].v_pointer = NULL;
+}
+
+static void
+value_copy_pointer (const GValue *src_value,
+ GValue *dest_value)
+{
+ dest_value->data[0].v_pointer = src_value->data[0].v_pointer;
+}
+
+static gpointer
+value_peek_pointer0 (const GValue *value)
+{
+ return value->data[0].v_pointer;
+}
+
+static gchar*
+value_collect_pointer (GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ value->data[0].v_pointer = collect_values[0].v_pointer;
+
+ return NULL;
+}
+
+static gchar*
+value_lcopy_pointer (const GValue *value,
+ guint n_collect_values,
+ GTypeCValue *collect_values,
+ guint collect_flags)
+{
+ gpointer *pointer_p = collect_values[0].v_pointer;
+
+ if (!pointer_p)
+ return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+
+ *pointer_p = value->data[0].v_pointer;
+
+ return NULL;
+}
+
+
+/* --- type initialization --- */
+void
+g_value_types_init (void)
+{
+ GTypeInfo info = {
+ 0, /* class_size */
+ NULL, /* base_init */
+ NULL, /* base_destroy */
+ NULL, /* class_init */
+ NULL, /* class_destroy */
+ NULL, /* class_data */
+ 0, /* instance_size */
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ NULL, /* value_table */
+ };
+ const GTypeFundamentalInfo finfo = { G_TYPE_FLAG_DERIVABLE, };
+ GType type;
+
+ /* G_TYPE_CHAR / G_TYPE_UCHAR
+ */
+ {
+ static const GTypeValueTable value_table = {
+ value_init_long0, /* value_init */
+ NULL, /* value_free */
+ value_copy_long0, /* value_copy */
+ NULL, /* value_peek_pointer */
+ "i", /* collect_format */
+ value_collect_int, /* collect_value */
+ "p", /* lcopy_format */
+ value_lcopy_char, /* lcopy_value */
+ };
+ info.value_table = &value_table;
+ type = g_type_register_fundamental (G_TYPE_CHAR, g_intern_static_string ("gchar"), &info, &finfo, 0);
+ g_assert (type == G_TYPE_CHAR);
+ type = g_type_register_fundamental (G_TYPE_UCHAR, g_intern_static_string ("guchar"), &info, &finfo, 0);
+ g_assert (type == G_TYPE_UCHAR);
+ }
+
+ /* G_TYPE_BOOLEAN
+ */
+ {
+ static const GTypeValueTable value_table = {
+ value_init_long0, /* value_init */
+ NULL, /* value_free */
+ value_copy_long0, /* value_copy */
+ NULL, /* value_peek_pointer */
+ "i", /* collect_format */
+ value_collect_int, /* collect_value */
+ "p", /* lcopy_format */
+ value_lcopy_boolean, /* lcopy_value */
+ };
+ info.value_table = &value_table;
+ type = g_type_register_fundamental (G_TYPE_BOOLEAN, g_intern_static_string ("gboolean"), &info, &finfo, 0);
+ g_assert (type == G_TYPE_BOOLEAN);
+ }
+
+ /* G_TYPE_INT / G_TYPE_UINT
+ */
+ {
+ static const GTypeValueTable value_table = {
+ value_init_long0, /* value_init */
+ NULL, /* value_free */
+ value_copy_long0, /* value_copy */
+ NULL, /* value_peek_pointer */
+ "i", /* collect_format */
+ value_collect_int, /* collect_value */
+ "p", /* lcopy_format */
+ value_lcopy_int, /* lcopy_value */
+ };
+ info.value_table = &value_table;
+ type = g_type_register_fundamental (G_TYPE_INT, g_intern_static_string ("gint"), &info, &finfo, 0);
+ g_assert (type == G_TYPE_INT);
+ type = g_type_register_fundamental (G_TYPE_UINT, g_intern_static_string ("guint"), &info, &finfo, 0);
+ g_assert (type == G_TYPE_UINT);
+ }
+
+ /* G_TYPE_LONG / G_TYPE_ULONG
+ */
+ {
+ static const GTypeValueTable value_table = {
+ value_init_long0, /* value_init */
+ NULL, /* value_free */
+ value_copy_long0, /* value_copy */
+ NULL, /* value_peek_pointer */
+ "l", /* collect_format */
+ value_collect_long, /* collect_value */
+ "p", /* lcopy_format */
+ value_lcopy_long, /* lcopy_value */
+ };
+ info.value_table = &value_table;
+ type = g_type_register_fundamental (G_TYPE_LONG, g_intern_static_string ("glong"), &info, &finfo, 0);
+ g_assert (type == G_TYPE_LONG);
+ type = g_type_register_fundamental (G_TYPE_ULONG, g_intern_static_string ("gulong"), &info, &finfo, 0);
+ g_assert (type == G_TYPE_ULONG);
+ }
+
+ /* G_TYPE_INT64 / G_TYPE_UINT64
+ */
+ {
+ static const GTypeValueTable value_table = {
+ value_init_int64, /* value_init */
+ NULL, /* value_free */
+ value_copy_int64, /* value_copy */
+ NULL, /* value_peek_pointer */
+ "q", /* collect_format */
+ value_collect_int64, /* collect_value */
+ "p", /* lcopy_format */
+ value_lcopy_int64, /* lcopy_value */
+ };
+ info.value_table = &value_table;
+ type = g_type_register_fundamental (G_TYPE_INT64, g_intern_static_string ("gint64"), &info, &finfo, 0);
+ g_assert (type == G_TYPE_INT64);
+ type = g_type_register_fundamental (G_TYPE_UINT64, g_intern_static_string ("guint64"), &info, &finfo, 0);
+ g_assert (type == G_TYPE_UINT64);
+ }
+
+ /* G_TYPE_FLOAT
+ */
+ {
+ static const GTypeValueTable value_table = {
+ value_init_float, /* value_init */
+ NULL, /* value_free */
+ value_copy_float, /* value_copy */
+ NULL, /* value_peek_pointer */
+ "d", /* collect_format */
+ value_collect_float, /* collect_value */
+ "p", /* lcopy_format */
+ value_lcopy_float, /* lcopy_value */
+ };
+ info.value_table = &value_table;
+ type = g_type_register_fundamental (G_TYPE_FLOAT, g_intern_static_string ("gfloat"), &info, &finfo, 0);
+ g_assert (type == G_TYPE_FLOAT);
+ }
+
+ /* G_TYPE_DOUBLE
+ */
+ {
+ static const GTypeValueTable value_table = {
+ value_init_double, /* value_init */
+ NULL, /* value_free */
+ value_copy_double, /* value_copy */
+ NULL, /* value_peek_pointer */
+ "d", /* collect_format */
+ value_collect_double, /* collect_value */
+ "p", /* lcopy_format */
+ value_lcopy_double, /* lcopy_value */
+ };
+ info.value_table = &value_table;
+ type = g_type_register_fundamental (G_TYPE_DOUBLE, g_intern_static_string ("gdouble"), &info, &finfo, 0);
+ g_assert (type == G_TYPE_DOUBLE);
+ }
+
+ /* G_TYPE_STRING
+ */
+ {
+ static const GTypeValueTable value_table = {
+ value_init_string, /* value_init */
+ value_free_string, /* value_free */
+ value_copy_string, /* value_copy */
+ value_peek_pointer0, /* value_peek_pointer */
+ "p", /* collect_format */
+ value_collect_string, /* collect_value */
+ "p", /* lcopy_format */
+ value_lcopy_string, /* lcopy_value */
+ };
+ info.value_table = &value_table;
+ type = g_type_register_fundamental (G_TYPE_STRING, g_intern_static_string ("gchararray"), &info, &finfo, 0);
+ g_assert (type == G_TYPE_STRING);
+ }
+
+ /* G_TYPE_POINTER
+ */
+ {
+ static const GTypeValueTable value_table = {
+ value_init_pointer, /* value_init */
+ NULL, /* value_free */
+ value_copy_pointer, /* value_copy */
+ value_peek_pointer0, /* value_peek_pointer */
+ "p", /* collect_format */
+ value_collect_pointer, /* collect_value */
+ "p", /* lcopy_format */
+ value_lcopy_pointer, /* lcopy_value */
+ };
+ info.value_table = &value_table;
+ type = g_type_register_fundamental (G_TYPE_POINTER, g_intern_static_string ("gpointer"), &info, &finfo, 0);
+ g_assert (type == G_TYPE_POINTER);
+ }
+}
+
+
+/* --- GValue functions --- */
+void
+g_value_set_char (GValue *value,
+ gchar v_char)
+{
+ g_return_if_fail (G_VALUE_HOLDS_CHAR (value));
+
+ value->data[0].v_int = v_char;
+}
+
+gchar
+g_value_get_char (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_CHAR (value), 0);
+
+ return value->data[0].v_int;
+}
+
+void
+g_value_set_uchar (GValue *value,
+ guchar v_uchar)
+{
+ g_return_if_fail (G_VALUE_HOLDS_UCHAR (value));
+
+ value->data[0].v_uint = v_uchar;
+}
+
+guchar
+g_value_get_uchar (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_UCHAR (value), 0);
+
+ return value->data[0].v_uint;
+}
+
+void
+g_value_set_boolean (GValue *value,
+ gboolean v_boolean)
+{
+ g_return_if_fail (G_VALUE_HOLDS_BOOLEAN (value));
+
+ value->data[0].v_int = v_boolean != FALSE;
+}
+
+gboolean
+g_value_get_boolean (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (value), 0);
+
+ return value->data[0].v_int;
+}
+
+void
+g_value_set_int (GValue *value,
+ gint v_int)
+{
+ g_return_if_fail (G_VALUE_HOLDS_INT (value));
+
+ value->data[0].v_int = v_int;
+}
+
+gint
+g_value_get_int (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_INT (value), 0);
+
+ return value->data[0].v_int;
+}
+
+void
+g_value_set_uint (GValue *value,
+ guint v_uint)
+{
+ g_return_if_fail (G_VALUE_HOLDS_UINT (value));
+
+ value->data[0].v_uint = v_uint;
+}
+
+guint
+g_value_get_uint (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_UINT (value), 0);
+
+ return value->data[0].v_uint;
+}
+
+void
+g_value_set_long (GValue *value,
+ glong v_long)
+{
+ g_return_if_fail (G_VALUE_HOLDS_LONG (value));
+
+ value->data[0].v_long = v_long;
+}
+
+glong
+g_value_get_long (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_LONG (value), 0);
+
+ return value->data[0].v_long;
+}
+
+void
+g_value_set_ulong (GValue *value,
+ gulong v_ulong)
+{
+ g_return_if_fail (G_VALUE_HOLDS_ULONG (value));
+
+ value->data[0].v_ulong = v_ulong;
+}
+
+gulong
+g_value_get_ulong (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_ULONG (value), 0);
+
+ return value->data[0].v_ulong;
+}
+
+void
+g_value_set_int64 (GValue *value,
+ gint64 v_int64)
+{
+ g_return_if_fail (G_VALUE_HOLDS_INT64 (value));
+
+ value->data[0].v_int64 = v_int64;
+}
+
+gint64
+g_value_get_int64 (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_INT64 (value), 0);
+
+ return value->data[0].v_int64;
+}
+
+void
+g_value_set_uint64 (GValue *value,
+ guint64 v_uint64)
+{
+ g_return_if_fail (G_VALUE_HOLDS_UINT64 (value));
+
+ value->data[0].v_uint64 = v_uint64;
+}
+
+guint64
+g_value_get_uint64 (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_UINT64 (value), 0);
+
+ return value->data[0].v_uint64;
+}
+
+void
+g_value_set_float (GValue *value,
+ gfloat v_float)
+{
+ g_return_if_fail (G_VALUE_HOLDS_FLOAT (value));
+
+ value->data[0].v_float = v_float;
+}
+
+gfloat
+g_value_get_float (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_FLOAT (value), 0);
+
+ return value->data[0].v_float;
+}
+
+void
+g_value_set_double (GValue *value,
+ gdouble v_double)
+{
+ g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value));
+
+ value->data[0].v_double = v_double;
+}
+
+gdouble
+g_value_get_double (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_DOUBLE (value), 0);
+
+ return value->data[0].v_double;
+}
+
+void
+g_value_set_string (GValue *value,
+ const gchar *v_string)
+{
+ gchar *new_val;
+
+ g_return_if_fail (G_VALUE_HOLDS_STRING (value));
+
+ new_val = g_strdup (v_string);
+
+ if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)
+ value->data[1].v_uint = 0;
+ else
+ g_free (value->data[0].v_pointer);
+
+ value->data[0].v_pointer = new_val;
+}
+
+void
+g_value_set_static_string (GValue *value,
+ const gchar *v_string)
+{
+ g_return_if_fail (G_VALUE_HOLDS_STRING (value));
+
+ if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
+ g_free (value->data[0].v_pointer);
+ value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
+ value->data[0].v_pointer = (gchar*) v_string;
+}
+
+void
+g_value_set_string_take_ownership (GValue *value,
+ gchar *v_string)
+{
+ g_value_take_string (value, v_string);
+}
+
+void
+g_value_take_string (GValue *value,
+ gchar *v_string)
+{
+ g_return_if_fail (G_VALUE_HOLDS_STRING (value));
+
+ if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)
+ value->data[1].v_uint = 0;
+ else
+ g_free (value->data[0].v_pointer);
+ value->data[0].v_pointer = v_string;
+}
+
+G_CONST_RETURN gchar*
+g_value_get_string (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL);
+
+ return value->data[0].v_pointer;
+}
+
+gchar*
+g_value_dup_string (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL);
+
+ return g_strdup (value->data[0].v_pointer);
+}
+
+void
+g_value_set_pointer (GValue *value,
+ gpointer v_pointer)
+{
+ g_return_if_fail (G_VALUE_HOLDS_POINTER (value));
+
+ value->data[0].v_pointer = v_pointer;
+}
+
+gpointer
+g_value_get_pointer (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_POINTER (value), NULL);
+
+ return value->data[0].v_pointer;
+}
+
+GType
+g_gtype_get_type (void)
+{
+ static const GTypeInfo type_info = { 0, };
+ static GType type;
+ if (!type)
+ type = g_type_register_static (G_TYPE_POINTER, g_intern_static_string ("GType"), &type_info, 0);
+ return type;
+}
+
+void
+g_value_set_gtype (GValue *value,
+ GType v_gtype)
+{
+ g_return_if_fail (G_VALUE_HOLDS_GTYPE (value));
+
+ value->data[0].v_long = v_gtype;
+
+}
+
+GType
+g_value_get_gtype (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_GTYPE (value), 0);
+
+ return value->data[0].v_long;
+}
+
+
+gchar*
+g_strdup_value_contents (const GValue *value)
+{
+ const gchar *src;
+ gchar *contents;
+
+ g_return_val_if_fail (G_IS_VALUE (value), NULL);
+
+ if (G_VALUE_HOLDS_STRING (value))
+ {
+ src = g_value_get_string (value);
+
+ if (!src)
+ contents = g_strdup ("NULL");
+ else
+ {
+ gchar *s = g_strescape (src, NULL);
+
+ contents = g_strdup_printf ("\"%s\"", s);
+ g_free (s);
+ }
+ }
+ else if (g_value_type_transformable (G_VALUE_TYPE (value), G_TYPE_STRING))
+ {
+ GValue tmp_value = { 0, };
+ gchar *s;
+
+ g_value_init (&tmp_value, G_TYPE_STRING);
+ g_value_transform (value, &tmp_value);
+ s = g_strescape (g_value_get_string (&tmp_value), NULL);
+ g_value_unset (&tmp_value);
+ if (G_VALUE_HOLDS_ENUM (value) || G_VALUE_HOLDS_FLAGS (value))
+ contents = g_strdup_printf ("((%s) %s)",
+ g_type_name (G_VALUE_TYPE (value)),
+ s);
+ else
+ contents = g_strdup (s ? s : "NULL");
+ g_free (s);
+ }
+ else if (g_value_fits_pointer (value))
+ {
+ gpointer p = g_value_peek_pointer (value);
+
+ if (!p)
+ contents = g_strdup ("NULL");
+ else if (G_VALUE_HOLDS_OBJECT (value))
+ contents = g_strdup_printf ("((%s*) %p)", G_OBJECT_TYPE_NAME (p), p);
+ else if (G_VALUE_HOLDS_PARAM (value))
+ contents = g_strdup_printf ("((%s*) %p)", G_PARAM_SPEC_TYPE_NAME (p), p);
+ else if (G_VALUE_HOLDS_BOXED (value))
+ contents = g_strdup_printf ("((%s*) %p)", g_type_name (G_VALUE_TYPE (value)), p);
+ else if (G_VALUE_HOLDS_POINTER (value))
+ contents = g_strdup_printf ("((gpointer) %p)", p);
+ else
+ contents = g_strdup ("???");
+ }
+ else
+ contents = g_strdup ("???");
+
+ return contents;
+}
+
+GType
+g_pointer_type_register_static (const gchar *name)
+{
+ static const GTypeInfo type_info = {
+ 0, /* class_size */
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ NULL, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ 0, /* instance_size */
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ NULL /* value_table */
+ };
+ GType type;
+
+ g_return_val_if_fail (name != NULL, 0);
+ g_return_val_if_fail (g_type_from_name (name) == 0, 0);
+
+ type = g_type_register_static (G_TYPE_POINTER, name, &type_info, 0);
+
+ return type;
+}
+
+#define __G_VALUETYPES_C__
+#include "gobjectaliasdef.c"
diff --git a/trunk/gobject/gvaluetypes.h b/trunk/gobject/gvaluetypes.h
new file mode 100644
index 000000000..2931cdaa6
--- /dev/null
+++ b/trunk/gobject/gvaluetypes.h
@@ -0,0 +1,120 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 1997-1999, 2000-2001 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.
+ *
+ * gvaluetypes.h: GLib default values
+ */
+#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
+#error "Only <glib-object.h> can be included directly."
+#endif
+
+#ifndef __G_VALUETYPES_H__
+#define __G_VALUETYPES_H__
+
+#include <gobject/gvalue.h>
+
+G_BEGIN_DECLS
+
+/* --- type macros --- */
+#define G_VALUE_HOLDS_CHAR(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_CHAR))
+#define G_VALUE_HOLDS_UCHAR(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UCHAR))
+#define G_VALUE_HOLDS_BOOLEAN(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_BOOLEAN))
+#define G_VALUE_HOLDS_INT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_INT))
+#define G_VALUE_HOLDS_UINT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UINT))
+#define G_VALUE_HOLDS_LONG(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_LONG))
+#define G_VALUE_HOLDS_ULONG(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_ULONG))
+#define G_VALUE_HOLDS_INT64(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_INT64))
+#define G_VALUE_HOLDS_UINT64(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UINT64))
+#define G_VALUE_HOLDS_FLOAT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_FLOAT))
+#define G_VALUE_HOLDS_DOUBLE(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_DOUBLE))
+#define G_VALUE_HOLDS_STRING(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_STRING))
+#define G_VALUE_HOLDS_POINTER(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_POINTER))
+#define G_TYPE_GTYPE (g_gtype_get_type())
+#define G_VALUE_HOLDS_GTYPE(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_GTYPE))
+
+
+/* --- prototypes --- */
+void g_value_set_char (GValue *value,
+ gchar v_char);
+gchar g_value_get_char (const GValue *value);
+void g_value_set_uchar (GValue *value,
+ guchar v_uchar);
+guchar g_value_get_uchar (const GValue *value);
+void g_value_set_boolean (GValue *value,
+ gboolean v_boolean);
+gboolean g_value_get_boolean (const GValue *value);
+void g_value_set_int (GValue *value,
+ gint v_int);
+gint g_value_get_int (const GValue *value);
+void g_value_set_uint (GValue *value,
+ guint v_uint);
+guint g_value_get_uint (const GValue *value);
+void g_value_set_long (GValue *value,
+ glong v_long);
+glong g_value_get_long (const GValue *value);
+void g_value_set_ulong (GValue *value,
+ gulong v_ulong);
+gulong g_value_get_ulong (const GValue *value);
+void g_value_set_int64 (GValue *value,
+ gint64 v_int64);
+gint64 g_value_get_int64 (const GValue *value);
+void g_value_set_uint64 (GValue *value,
+ guint64 v_uint64);
+guint64 g_value_get_uint64 (const GValue *value);
+void g_value_set_float (GValue *value,
+ gfloat v_float);
+gfloat g_value_get_float (const GValue *value);
+void g_value_set_double (GValue *value,
+ gdouble v_double);
+gdouble g_value_get_double (const GValue *value);
+void g_value_set_string (GValue *value,
+ const gchar *v_string);
+void g_value_set_static_string (GValue *value,
+ const gchar *v_string);
+G_CONST_RETURN gchar* g_value_get_string (const GValue *value);
+gchar* g_value_dup_string (const GValue *value);
+void g_value_set_pointer (GValue *value,
+ gpointer v_pointer);
+gpointer g_value_get_pointer (const GValue *value);
+GType g_gtype_get_type (void);
+void g_value_set_gtype (GValue *value,
+ GType v_gtype);
+GType g_value_get_gtype (const GValue *value);
+
+
+/* Convenience for registering new pointer types */
+GType g_pointer_type_register_static (const gchar *name);
+
+/* debugging aid, describe value contents as string */
+gchar* g_strdup_value_contents (const GValue *value);
+
+
+void g_value_take_string (GValue *value,
+ gchar *v_string);
+#ifndef G_DISABLE_DEPRECATED
+void g_value_set_string_take_ownership (GValue *value,
+ gchar *v_string);
+#endif
+
+
+/* humpf, need a C representable type name for G_TYPE_STRING */
+typedef gchar* gchararray;
+
+
+G_END_DECLS
+
+#endif /* __G_VALUETYPES_H__ */
diff --git a/trunk/gobject/makefile.msc.in b/trunk/gobject/makefile.msc.in
new file mode 100644
index 000000000..d04b33c9a
--- /dev/null
+++ b/trunk/gobject/makefile.msc.in
@@ -0,0 +1,91 @@
+## Makefile for building the gobject dll with Microsoft C
+## Use: nmake -f makefile.msc install
+
+TOP = ..\..
+
+!INCLUDE ..\build\win32\make.msc
+
+################################################################
+
+INCLUDES = -FImsvc_recommended_pragmas.h -I .. -I . -I ..\glib
+DEFINES = -DHAVE_CONFIG_H -DGOBJECT_COMPILATION -DG_LOG_DOMAIN=\"GLib-GObject\" \
+ -DG_ENABLE_DEBUG
+# -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS -DG_DISABLE_CAST_CHECKS
+# -DG_DISABLE_CAST_CHECKS
+
+all : \
+ glib-genmarshal.exe \
+ gmarshal.h \
+ gmarshal.c \
+ gobjectalias.h \
+ gobjectaliasdef.c \
+ gmarshal.strings \
+ gobject-query.exe \
+ libgobject-2.0-@LT_CURRENT_MINUS_AGE@.dll \
+ gobject-@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@s.lib \
+ testgobject.exe
+
+gobject_OBJECTS = \
+ gboxed.obj \
+ gclosure.obj \
+ genums.obj \
+ gobject.obj \
+ gparam.obj \
+ gparamspecs.obj \
+ gsignal.obj \
+ gsourceclosure.obj \
+ gtype.obj \
+ gtypemodule.obj \
+ gtypeplugin.obj \
+ gvalue.obj \
+ gvaluearray.obj \
+ gvaluetypes.obj \
+ gvaluetransform.obj
+
+gobjectalias.h: gobject.symbols
+ perl makegobjectalias.pl < gobject.symbols > gobjectalias.h
+
+gobjectaliasdef.c: gobject.symbols
+ perl makegobjectalias.pl -def < gobject.symbols > gobjectaliasdef.c
+
+gobject.def: gobject.symbols
+ echo EXPORTS > gobject.def
+ cl /EP -DINCLUDE_VARIABLES -DG_OS_WIN32 -DALL_FILES \
+ -DG_GNUC_MALLOC= -DG_GNUC_CONST= -DG_GNUC_NULL_TERMINATED= -DG_GNUC_NORETURN= \
+ -DG_GNUC_PRINTF=;G_GNUC_PRINTF gobject.symbols >> gobject.def
+
+gobject.res : gobject.rc
+ rc -DBUILDNUMBER=0 -r -fo gobject.res gobject.rc
+
+gmarshal.h : gmarshal.list glib-genmarshal.exe
+ echo #ifndef __G_MARSHAL_H__ > xgen-gmh
+ echo #define __G_MARSHAL_H__ >> xgen-gmh
+ glib-genmarshal --nostdinc --prefix=g_cclosure_marshal gmarshal.list --header >> xgen-gmh
+ echo #endif /* __G_MARSHAL_H__ */ >> xgen-gmh
+ copy xgen-gmh gmarshal.h
+
+gmarshal.c: gmarshal.list gmarshal.h glib-genmarshal.exe
+ glib-genmarshal --nostdinc --prefix=g_cclosure_marshal gmarshal.list --body > gmarshal.c
+
+libgobject-2.0-@LT_CURRENT_MINUS_AGE@.dll : $(gobject_OBJECTS) gobject.def gobject.res
+ $(CC) $(CFLAGS) -Fm -LD -Fe$@ $(gobject_OBJECTS) gobject.res \
+ ..\glib\glib-2.0.lib $(LDFLAGS) /implib:gobject-2.0.lib /def:gobject.def || del $@
+
+gobject-@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@s.lib : $(gobject_OBJECTS)
+ lib /out:$@ $(gobject_OBJECTS)
+
+# link glib's static version to avoid installing
+glib-genmarshal.exe : glib-genmarshal.c gmarshal.strings
+ $(CC) -Fe$@ $(CFLAGS) -UGOBJECT_COMPILATION glib-genmarshal.c \
+ ..\glib\glib-@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@s.lib user32.lib advapi32.lib ole32.lib shell32.lib $(INTL_LIBS) $(LIBICONV_LIBS)
+
+gobject-query.exe : gobject-query.c libgobject-2.0-@LT_CURRENT_MINUS_AGE@.dll
+ $(CC) -Fe$@ $(CFLAGS) -UGOBJECT_COMPILATION gobject-query.c \
+ ..\glib\glib-2.0.lib gobject-2.0.lib user32.lib advapi32.lib $(INTL_LIBS) $(LIBICONV_LIBS)
+
+gmarshal.strings : gmarshal.list
+ perl marshal-genstrings.pl > gmarshal.strings
+
+.c.exe :
+ $(CC) $(CFLAGS) -c $<
+ $(CC) $(CFLAGS) -Fe$@ $< gobject-2.0.lib ..\glib\glib-2.0.lib ..\gmodule\gmodule-2.0.lib $(LDFLAGS) user32.lib /subsystem:console
diff --git a/trunk/gobject/makegobjectalias.pl b/trunk/gobject/makegobjectalias.pl
new file mode 100755
index 000000000..9094222b8
--- /dev/null
+++ b/trunk/gobject/makegobjectalias.pl
@@ -0,0 +1,137 @@
+#!/usr/bin/perl -w
+
+my $do_def = 0;
+
+if (($#ARGV >= 0) && ($ARGV[0] eq "-def")) {
+ shift;
+ $do_def = 1;
+}
+
+print <<EOF;
+/* Generated by makegobjectalias.pl */
+
+#ifndef DISABLE_VISIBILITY
+
+#include "glibconfig.h"
+
+#ifdef G_HAVE_GNUC_VISIBILITY
+
+EOF
+
+if ($do_def) {
+ print <<EOF
+#undef IN_FILE
+#define IN_FILE defined
+
+#undef IN_HEADER
+#define IN_HEADER(x) 1
+
+EOF
+}
+else {
+ print <<EOF
+#define IN_FILE(x) 1
+#define IN_HEADER defined
+
+EOF
+}
+
+my $in_comment = 0;
+my $in_skipped_section = 0;
+
+while (<>) {
+
+ # ignore empty lines
+ next if /^\s*$/;
+
+ # skip comments
+ if ($_ =~ /^\s*\/\*/)
+ {
+ $in_comment = 1;
+ }
+
+ if ($in_comment)
+ {
+ if ($_ =~ /\*\/\s$/)
+ {
+ $in_comment = 0;
+ }
+
+ next;
+ }
+
+ # handle ifdefs
+ if ($_ =~ /^\#endif/)
+ {
+ if (!$in_skipped_section)
+ {
+ print $_;
+ }
+
+ $in_skipped_section = 0;
+
+ next;
+ }
+
+ if ($_ =~ /^\#ifdef\s+(INCLUDE_VARIABLES|INCLUDE_INTERNAL_SYMBOLS|ALL_FILES)/)
+ {
+ $in_skipped_section = 1;
+ }
+
+ if ($in_skipped_section)
+ {
+ next;
+ }
+
+ if ($_ =~ /^\#ifn?def\s+G/)
+ {
+ print $_;
+
+ next;
+ }
+
+ if ($_ =~ /^\#if.*(IN_FILE|IN_HEADER)/)
+ {
+ print $_;
+
+ next;
+ }
+
+ chop;
+ my $str = $_;
+ my @words;
+ my $attributes = "";
+
+ @words = split(/ /, $str);
+ $str = shift(@words);
+ chomp($str);
+ my $alias = "IA__".$str;
+
+ # Drop any Win32 specific .def file syntax, but keep attributes
+ foreach $word (@words) {
+ $attributes = "$attributes $word" unless $word eq "PRIVATE";
+ }
+
+ if (!$do_def) {
+ print <<EOF
+extern __typeof ($str) $alias __attribute((visibility("hidden")))$attributes;
+\#define $str $alias
+
+EOF
+ }
+ else {
+ print <<EOF
+\#undef $str
+extern __typeof ($str) $str __attribute((alias("$alias"), visibility("default")));
+
+EOF
+ }
+}
+
+print <<EOF;
+
+#endif /* G_HAVE_GNUC_VISIBILITY */
+#endif /* DISABLE_VISIBILITY */
+EOF
+
+
diff --git a/trunk/gobject/marshal-genstrings.pl b/trunk/gobject/marshal-genstrings.pl
new file mode 100644
index 000000000..93fceb46c
--- /dev/null
+++ b/trunk/gobject/marshal-genstrings.pl
@@ -0,0 +1,9 @@
+#!/usr/bin/perl
+
+open (List, "gmarshal.list");
+
+while (<List>) {
+ next unless /^[A-Z]/;
+ s/^/"g_cclosure_marshal_/; s/:/__/; s/,/_/g; s/$/",/;
+ print;
+}
diff --git a/trunk/gobject/pltcheck.sh b/trunk/gobject/pltcheck.sh
new file mode 100755
index 000000000..19edfac02
--- /dev/null
+++ b/trunk/gobject/pltcheck.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+LANG=C
+
+status=0
+
+if ! which readelf 2>/dev/null >/dev/null; then
+ echo "'readelf' not found; skipping test"
+ exit 0
+fi
+
+for so in .libs/lib*.so; do
+ echo Checking $so for local PLT entries
+ readelf -r $so | grep 'JU\?MP_SLOT' | grep '\<g_type_\|\<g_boxed_\|\<g_value_\|\<g_cclosure_\|\<g_closure_\|\<g_signal\|\<g_enum_\|\<g_flags_\|\<g_io_\|\<g_object_\|\<g_param_' && status=1
+done
+
+exit $status
diff --git a/trunk/gobject/testgobject.c b/trunk/gobject/testgobject.c
new file mode 100644
index 000000000..27237641b
--- /dev/null
+++ b/trunk/gobject/testgobject.c
@@ -0,0 +1,428 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2001 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 <string.h>
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "TestObject"
+#include <glib-object.h>
+
+/* --- TestIface --- */
+#define TEST_TYPE_IFACE (test_iface_get_type ())
+#define TEST_IFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_IFACE, TestIface))
+#define TEST_IS_IFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_IFACE))
+#define TEST_IFACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE, TestIfaceClass))
+typedef struct _TestIface TestIface;
+typedef struct _TestIfaceClass TestIfaceClass;
+struct _TestIfaceClass
+{
+ GTypeInterface base_iface;
+ void (*print_string) (TestIface *tiobj,
+ const gchar *string);
+};
+static void iface_base_init (TestIfaceClass *iface);
+static void iface_base_finalize (TestIfaceClass *iface);
+static void print_foo (TestIface *tiobj,
+ const gchar *string);
+static GType
+test_iface_get_type (void)
+{
+ static GType test_iface_type = 0;
+
+ if (!test_iface_type)
+ {
+ static const GTypeInfo test_iface_info =
+ {
+ sizeof (TestIfaceClass),
+ (GBaseInitFunc) iface_base_init, /* base_init */
+ (GBaseFinalizeFunc) iface_base_finalize, /* base_finalize */
+ };
+
+ test_iface_type = g_type_register_static (G_TYPE_INTERFACE, "TestIface", &test_iface_info, 0);
+ g_type_interface_add_prerequisite (test_iface_type, G_TYPE_OBJECT);
+ }
+
+ return test_iface_type;
+}
+static guint iface_base_init_count = 0;
+static void
+iface_base_init (TestIfaceClass *iface)
+{
+ iface_base_init_count++;
+ if (iface_base_init_count == 1)
+ {
+ /* add signals here */
+ }
+}
+static void
+iface_base_finalize (TestIfaceClass *iface)
+{
+ iface_base_init_count--;
+ if (iface_base_init_count == 0)
+ {
+ /* destroy signals here */
+ }
+}
+static void
+print_foo (TestIface *tiobj,
+ const gchar *string)
+{
+ if (!string)
+ string = "<NULL>";
+ g_print ("Iface-FOO: \"%s\" from %p\n", string, tiobj);
+}
+static void
+test_object_test_iface_init (gpointer giface,
+ gpointer iface_data)
+{
+ TestIfaceClass *iface = giface;
+
+ g_assert (iface_data == GUINT_TO_POINTER (42));
+
+ g_assert (G_TYPE_FROM_INTERFACE (iface) == TEST_TYPE_IFACE);
+
+ /* assert iface_base_init() was already called */
+ g_assert (iface_base_init_count > 0);
+
+ /* initialize stuff */
+ iface->print_string = print_foo;
+}
+static void
+iface_print_string (TestIface *tiobj,
+ const gchar *string)
+{
+ TestIfaceClass *iface;
+
+ g_return_if_fail (TEST_IS_IFACE (tiobj));
+ g_return_if_fail (G_IS_OBJECT (tiobj)); /* ensured through prerequisite */
+
+ iface = TEST_IFACE_GET_CLASS (tiobj);
+ g_object_ref (tiobj);
+ iface->print_string (tiobj, string);
+ g_object_unref (tiobj);
+}
+
+
+/* --- TestObject --- */
+#define TEST_TYPE_OBJECT (test_object_get_type ())
+#define TEST_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), TEST_TYPE_OBJECT, TestObject))
+#define TEST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_TYPE_OBJECT, TestObjectClass))
+#define TEST_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), TEST_TYPE_OBJECT))
+#define TEST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEST_TYPE_OBJECT))
+#define TEST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_OBJECT, TestObjectClass))
+#define TEST_OBJECT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TEST_TYPE_OBJECT, TestObjectPrivate))
+typedef struct _TestObject TestObject;
+typedef struct _TestObjectClass TestObjectClass;
+typedef struct _TestObjectPrivate TestObjectPrivate;
+struct _TestObject
+{
+ GObject parent_instance;
+};
+struct _TestObjectClass
+{
+ GObjectClass parent_class;
+
+ gchar* (*test_signal) (TestObject *tobject,
+ TestIface *iface_object,
+ gpointer tdata);
+};
+struct _TestObjectPrivate
+{
+ int dummy1;
+ gdouble dummy2;
+};
+static void test_object_class_init (TestObjectClass *class);
+static void test_object_init (TestObject *tobject);
+static gboolean test_signal_accumulator (GSignalInvocationHint *ihint,
+ GValue *return_accu,
+ const GValue *handler_return,
+ gpointer data);
+static gchar* test_object_test_signal (TestObject *tobject,
+ TestIface *iface_object,
+ gpointer tdata);
+static GType
+test_object_get_type (void)
+{
+ static GType test_object_type = 0;
+
+ if (!test_object_type)
+ {
+ static const GTypeInfo test_object_info =
+ {
+ sizeof (TestObjectClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) test_object_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (TestObject),
+ 5, /* n_preallocs */
+ (GInstanceInitFunc) test_object_init,
+ };
+ GInterfaceInfo iface_info = { test_object_test_iface_init, NULL, GUINT_TO_POINTER (42) };
+
+ test_object_type = g_type_register_static (G_TYPE_OBJECT, "TestObject", &test_object_info, 0);
+ g_type_add_interface_static (test_object_type, TEST_TYPE_IFACE, &iface_info);
+ }
+
+ return test_object_type;
+}
+static void
+test_object_class_init (TestObjectClass *class)
+{
+ /* GObjectClass *gobject_class = G_OBJECT_CLASS (class); */
+
+ class->test_signal = test_object_test_signal;
+
+ g_signal_new ("test-signal",
+ G_OBJECT_CLASS_TYPE (class),
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_CLEANUP,
+ G_STRUCT_OFFSET (TestObjectClass, test_signal),
+ test_signal_accumulator, NULL,
+ g_cclosure_marshal_STRING__OBJECT_POINTER,
+ G_TYPE_STRING, 2, TEST_TYPE_IFACE, G_TYPE_POINTER);
+
+ g_type_class_add_private (class, sizeof (TestObjectPrivate));
+}
+static void
+test_object_init (TestObject *tobject)
+{
+ TestObjectPrivate *priv;
+
+ priv = TEST_OBJECT_GET_PRIVATE (tobject);
+
+ g_assert (priv);
+ g_assert ((gchar *)priv >= (gchar *)tobject + sizeof (TestObject));
+
+ priv->dummy1 = 54321;
+}
+/* Check to see if private data initialization in the
+ * instance init function works.
+ */
+static void
+test_object_check_private_init (TestObject *tobject)
+{
+ TestObjectPrivate *priv;
+
+ priv = TEST_OBJECT_GET_PRIVATE (tobject);
+
+ g_print ("private data during initialization: %u == %u\n", priv->dummy1, 54321);
+ g_assert (priv->dummy1 == 54321);
+}
+static gboolean
+test_signal_accumulator (GSignalInvocationHint *ihint,
+ GValue *return_accu,
+ const GValue *handler_return,
+ gpointer data)
+{
+ gchar *accu_string = g_value_get_string (return_accu);
+ gchar *new_string = g_value_get_string (handler_return);
+ gchar *result_string;
+
+ if (accu_string)
+ result_string = g_strconcat (accu_string, new_string, NULL);
+ else if (new_string)
+ result_string = g_strdup (new_string);
+ else
+ result_string = NULL;
+
+ g_value_take_string (return_accu, result_string);
+
+ return TRUE;
+}
+static gchar*
+test_object_test_signal (TestObject *tobject,
+ TestIface *iface_object,
+ gpointer tdata)
+{
+ g_message ("::test_signal default_handler called");
+
+ g_return_val_if_fail (TEST_IS_IFACE (iface_object), NULL);
+
+ return g_strdup ("<default_handler>");
+}
+
+
+/* --- TestIface for DerivedObject --- */
+static void
+print_bar (TestIface *tiobj,
+ const gchar *string)
+{
+ TestIfaceClass *parent_iface;
+
+ g_return_if_fail (TEST_IS_IFACE (tiobj));
+
+ if (!string)
+ string = "<NULL>";
+ g_print ("Iface-BAR: \"%s\" from %p\n", string, tiobj);
+
+ g_print ("chaining: ");
+ parent_iface = g_type_interface_peek_parent (TEST_IFACE_GET_CLASS (tiobj));
+ parent_iface->print_string (tiobj, string);
+
+ g_assert (g_type_interface_peek_parent (parent_iface) == NULL);
+}
+
+static void
+derived_object_test_iface_init (gpointer giface,
+ gpointer iface_data)
+{
+ TestIfaceClass *iface = giface;
+
+ g_assert (iface_data == GUINT_TO_POINTER (87));
+
+ g_assert (G_TYPE_FROM_INTERFACE (iface) == TEST_TYPE_IFACE);
+
+ /* assert test_object_test_iface_init() was already called */
+ g_assert (iface->print_string == print_foo);
+
+ /* override stuff */
+ iface->print_string = print_bar;
+}
+
+
+/* --- DerivedObject --- */
+#define DERIVED_TYPE_OBJECT (derived_object_get_type ())
+#define DERIVED_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), DERIVED_TYPE_OBJECT, DerivedObject))
+#define DERIVED_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DERIVED_TYPE_OBJECT, DerivedObjectClass))
+#define DERIVED_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), DERIVED_TYPE_OBJECT))
+#define DERIVED_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DERIVED_TYPE_OBJECT))
+#define DERIVED_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DERIVED_TYPE_OBJECT, DerivedObjectClass))
+#define DERIVED_OBJECT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), DERIVED_TYPE_OBJECT, DerivedObjectPrivate))
+typedef struct _DerivedObject DerivedObject;
+typedef struct _TestObjectClass DerivedObjectClass;
+typedef struct _DerivedObjectPrivate DerivedObjectPrivate;
+struct _DerivedObject
+{
+ TestObject parent_instance;
+ int dummy1;
+ int dummy2;
+};
+struct _DerivedObjectPrivate
+{
+ char dummy;
+};
+static void derived_object_class_init (DerivedObjectClass *class);
+static void derived_object_init (DerivedObject *dobject);
+GType
+derived_object_get_type (void)
+{
+ static GType derived_object_type = 0;
+
+ if (!derived_object_type)
+ {
+ static const GTypeInfo derived_object_info =
+ {
+ sizeof (DerivedObjectClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) derived_object_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (DerivedObject),
+ 5, /* n_preallocs */
+ (GInstanceInitFunc) derived_object_init,
+ };
+ GInterfaceInfo iface_info = { derived_object_test_iface_init, NULL, GUINT_TO_POINTER (87) };
+
+ derived_object_type = g_type_register_static (TEST_TYPE_OBJECT, "DerivedObject", &derived_object_info, 0);
+ g_type_add_interface_static (derived_object_type, TEST_TYPE_IFACE, &iface_info);
+ }
+
+ return derived_object_type;
+}
+static void
+derived_object_class_init (DerivedObjectClass *class)
+{
+ g_type_class_add_private (class, sizeof (DerivedObjectPrivate));
+}
+static void
+derived_object_init (DerivedObject *dobject)
+{
+ TestObjectPrivate *test_priv;
+ DerivedObjectPrivate *derived_priv;
+
+ derived_priv = DERIVED_OBJECT_GET_PRIVATE (dobject);
+
+ g_assert (derived_priv);
+ g_assert ((gchar *)derived_priv >= (gchar *)TEST_OBJECT_GET_PRIVATE (dobject) + sizeof (TestObjectPrivate));
+
+ test_priv = TEST_OBJECT_GET_PRIVATE (dobject);
+
+ g_assert (test_priv);
+ g_assert ((gchar *)test_priv >= (gchar *)dobject + sizeof (TestObject));
+
+}
+
+/* --- main --- */
+int
+main (int argc,
+ char *argv[])
+{
+ GTypeInfo info = { 0, };
+ GTypeFundamentalInfo finfo = { 0, };
+ GType type;
+ TestObject *sigarg;
+ DerivedObject *dobject;
+ TestObjectPrivate *priv;
+ gchar *string = NULL;
+
+ g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) |
+ G_LOG_LEVEL_WARNING |
+ G_LOG_LEVEL_CRITICAL);
+ g_type_init_with_debug_flags (G_TYPE_DEBUG_OBJECTS | G_TYPE_DEBUG_SIGNALS);
+
+ /* test new fundamentals */
+ g_assert (G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_USER_FIRST) == g_type_fundamental_next ());
+ type = g_type_register_fundamental (g_type_fundamental_next (), "FooShadow1", &info, &finfo, 0);
+ g_assert (G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_USER_FIRST + 1) == g_type_fundamental_next ());
+ type = g_type_register_fundamental (g_type_fundamental_next (), "FooShadow2", &info, &finfo, 0);
+ g_assert (G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_USER_FIRST + 2) == g_type_fundamental_next ());
+ g_assert (g_type_from_name ("FooShadow1") == G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_USER_FIRST));
+ g_assert (g_type_from_name ("FooShadow2") == G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_USER_FIRST + 1));
+
+ /* to test past class initialization interface setups, create the class here */
+ g_type_class_ref (TEST_TYPE_OBJECT);
+
+ dobject = g_object_new (DERIVED_TYPE_OBJECT, NULL);
+ test_object_check_private_init (TEST_OBJECT (dobject));
+
+ sigarg = g_object_new (TEST_TYPE_OBJECT, NULL);
+
+ g_print ("MAIN: emit test-signal:\n");
+ g_signal_emit_by_name (dobject, "test-signal", sigarg, NULL, &string);
+ g_message ("signal return: \"%s\"", string);
+ g_assert (strcmp (string, "<default_handler><default_handler>") == 0);
+ g_free (string);
+
+ g_print ("MAIN: call iface print-string on test and derived object:\n");
+ iface_print_string (TEST_IFACE (sigarg), "iface-string-from-test-type");
+ iface_print_string (TEST_IFACE (dobject), "iface-string-from-derived-type");
+
+ priv = TEST_OBJECT_GET_PRIVATE (dobject);
+ g_print ("private data after initialization: %u == %u\n", priv->dummy1, 54321);
+ g_assert (priv->dummy1 == 54321);
+
+ g_object_unref (sigarg);
+ g_object_unref (dobject);
+
+ g_message ("%s done", argv[0]);
+
+ return 0;
+}
diff --git a/trunk/gthread-2.0-uninstalled.pc.in b/trunk/gthread-2.0-uninstalled.pc.in
new file mode 100644
index 000000000..a7285da61
--- /dev/null
+++ b/trunk/gthread-2.0-uninstalled.pc.in
@@ -0,0 +1,6 @@
+Name: GThread Uninstalled
+Description: Thread support for GLib, Not Installed
+Requires: glib-2.0-uninstalled
+Version: @VERSION@
+Libs: ${pc_top_builddir}/${pcfiledir}/gthread/libgthread-2.0.la @G_THREAD_LIBS@
+Cflags: -I${pc_top_builddir}/${pcfiledir}/@srcdir@ @G_THREAD_CFLAGS@
diff --git a/trunk/gthread-2.0.pc.in b/trunk/gthread-2.0.pc.in
new file mode 100644
index 000000000..419df1f60
--- /dev/null
+++ b/trunk/gthread-2.0.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: GThread
+Description: Thread support for GLib
+Requires: glib-2.0
+Version: @VERSION@
+Libs: -L${libdir} -lgthread-2.0 @G_THREAD_LIBS@
+Cflags: @G_THREAD_CFLAGS@
diff --git a/trunk/gthread/ChangeLog b/trunk/gthread/ChangeLog
new file mode 100644
index 000000000..bea97bd1d
--- /dev/null
+++ b/trunk/gthread/ChangeLog
@@ -0,0 +1,646 @@
+2007-06-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.4 ===
+
+2007-06-04 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.3 ===
+
+2007-05-22 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.2 ===
+
+2007-05-03 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.1 ===
+
+2007-03-16 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.0 ===
+
+2007-01-19 Tor Lillqvist <tml@novell.com>
+
+ * Makefile.am (gthread-2.0.lib): Use $(srcdir) for builds outside
+ srcdir.
+
+2007-01-16 Tor Lillqvist <tml@novell.com>
+
+ * gthread-win32.c (g_gettime_win32_impl):
+ GetSystemTimeAsFileTime() returns 100s of nanoseconds since 1601,
+ so offset to Unix epoch (1970) and multiply by 100 to get
+ nanoseconds which is what we want.
+
+2006-12-28 Tor Lillqvist <tml@novell.com>
+
+ * gthread-win32.c (g_thread_impl_init): Correct link to discussion
+ about CRITICAL_SECTIONs vs. mutexes. Thanks to Felix Kater for
+ pointing this out.
+
+2006-08-15 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.12.2 ===
+
+2006-07-22 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.12.1 ===
+
+2006-07-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.12.0 ===
+
+2006-06-20 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.4 ===
+
+2006-06-12 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.3 ===
+
+2006-06-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.2 ===
+
+2006-05-15 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.1 ===
+
+2006-05-03 Tor Lillqvist <tml@novell.com>
+
+ * gthread-win32.c (g_thread_exit_win32_impl): Free with free() and
+ not g_free() what has been allocated with calloc(). (#340530, Jake
+ Goulding)
+
+2006-05-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.0 ===
+
+2006-03-11 Tor Lillqvist <tml@novell.com>
+
+ * gthread-win32.c: #define _WIN32_WINDOWS as 0x0401 to get
+ declaration for IsDebuggerPresent() when using MSVC6. (#333879,
+ Kazuki Iwamoto)
+
+2006-03-07 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.10.1 ===
+
+2006-03-02 Tor Lillqvist <tml@novell.com>
+
+ * gthread-win32.c (G_PRIVATE_MAX): Increase to 100. 16 was rather
+ low.
+ (g_private_new_win32_impl): Can't use g_error() here as
+ g_private_new() is called a few times by GLib internally before
+ the messaging system that g_error() requires is ready. Thanks to
+ Tim Janik for noticing. Just display a MessageBox() and abort()
+ instead.
+
+2006-02-24 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.10.0 ===
+
+2006-02-20 Tor Lillqvist <tml@novell.com>
+
+ * gthread-win32.c (g_thread_exit_win32_impl): Make the
+ implementation of GPrivate behave more closely as in POSIX
+ threads: The value associacted with a GPrivate must be set to NULL
+ before calling the destructor. (The destructor gets the original
+ value as argument.) A destructor might re-associate a non-NULL
+ value with some GPrivate. To deal with this, if after all
+ destructors have been called, there still are some non-NULL
+ values, the process is repeated. (#331367)
+
+2006-02-10 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.6 ===
+
+2006-01-27 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.5 ===
+
+2006-01-18 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.4 ===
+
+2006-01-16 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.3 ===
+
+2006-01-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.2 ===
+
+2005-12-09 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.1 ===
+
+2005-12-02 Matthias Clasen <mclasen@redhat.com>
+
+ * Makefile.am: Remove gthread-solaris.c
+
+2005-11-17 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.0 ===
+
+2005-08-23 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.8.1 ===
+
+2005-08-12 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.8.0 ===
+
+2005-08-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.7 ===
+
+2005-08-03 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.6 ===
+
+2005-08-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.5 ===
+
+2005-07-21 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.4 ===
+
+2005-07-15 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.3 ===
+
+2005-07-09 Tor Lillqvist <tml@novell.com>
+
+ * Makefile.am: Don't use the scripts in build/win32 to compile
+ gthread.rc into a resource object file. (This means we lose the
+ build number increment magic, but I doubt it was that useful
+ anyway.) Instead use windres directly. To pass the normal .o file
+ produced by windres through libtool, which wants .lo files, pass
+ it directly to the linker using a -Wl option.
+
+ * gthread.rc.in: Thus replace BUILDNUMBER with 0.
+
+2005-07-08 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.2 ===
+
+2005-06-30 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.1 ===
+
+2005-06-26 Tor Lillqvist <tml@novell.com>
+
+ * Makefile.am: libtool installs/uninstalls the import library, no
+ need to do it ourselves. Do still install/uninstall the .def file,
+ though.
+
+2005-06-10 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.0 ===
+
+2005-06-09 Matthias Clasen <mclasen@redhat.com>
+
+ * gthread-posix.c (g_thread_create_posix_impl): Allow
+ setstacksize to fail. (#304790, Michael Banck)
+
+2005-01-07 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.6.1 ===
+
+2004-12-16 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.6.0 ===
+
+2004-12-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.7 ===
+
+2004-11-12 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.6 ===
+
+2004-11-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.5 ===
+
+2004-10-27 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.4 ===
+
+2004-09-18 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.3 ===
+
+2004-08-25 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.2 ===
+
+2004-08-01 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.1 ===
+
+Sun Jul 18 18:03:08 2004 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * === Released 2.5.0 ===
+
+2002-11-23 Tor Lillqvist <tml@iki.fi>
+
+ * gthread-win32.c (g_cond_timed_wait_win32_impl): Fix two bugs: 1)
+ If abs_time is NULL, should use infinite time. 2) Check for
+ current time already being past abs_time. (#99294, Christopher
+ R. Palmer, fix by Sebastian Wilhelmi)
+
+Mon Nov 4 14:45:24 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gthread-posix.c gthread-solaris.c: Include <config.h>
+
+2002-03-10 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c (g_thread_create_posix_impl): Do a comparison,
+ not an assignment, stupid! Spotted by Daniel Elstner
+ <daniel.elstner@gmx.net>.
+
+2002-02-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-impl.c: Only compile most of this file, if
+ G_THREADS_ENABLED is set.
+
+ * Fixed typo in G_THREADS_ENABLED.
+
+2002-01-16 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-solaris.c: Use g_free instead of free. Pointed out by
+ Sam O'Connor <sam@panviva.com>.
+
+2001-10-23 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am: (Win32): If we have built the MSVC import library,
+ install it. Install the gcc import library. Also support
+ uninstall.
+
+2001-09-28 Tor Lillqvist <tml@iki.fi>
+
+ * gthread-win32.c: Use an extra level of indirection for GMutex.
+ It is now a pointer either to a pointer to a CRITICAL_SECTION
+ struct, or to a mutex HANDLE. This is needed in case the user
+ defines G_ERRORCHECK_MUTEXES. G_MUTEX_SIZE must correctly reflect
+ the size of *GMutex, but this used to vary depending on whether we
+ at run-time chose to use CRITICAL_SECTIONs or mutexes.
+ (g_mutex_free_win32_cs_impl, g_cond_free_win32_impl): Call
+ DeleteCriticalSection() when done with it.
+
+ * gthread-impl.c (g_thread_init_with_errorcheck_mutexes): Call
+ g_thread_impl_init() before accessing
+ g_thread_functions_for_glib_use_default, as the
+ g_thread_impl_init() function might modify it.
+
+2001-09-26 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.mingw.in: Fix couple of typos.
+
+ * gthread.def: Add g_thread_init_with_errorcheck_mutexes.
+
+2001-09-25 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-impl.c: Corrected the array size (cough, cough). Pointed
+ out by gpablo@intersystems.com.ar. Fixes #61065.
+
+2001-09-25 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am: Use new macros for .def file, and check for
+ MS_LIB_AVAILABLE, new rule to build MS import library.
+
+ * makefile.msc.in: Use same DLL and import library names as
+ libtool.
+
+2001-09-19 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c: Add g_thread_equal_posix_impl and add to the
+ function vector g_thread_functions_for_glib_use_default.
+
+ * gthread-solaris.c, gthread-win32.c: Add NULL as equal function,
+ as on those two platforms you don't need an equal function.
+
+2001-09-19 Tor Lillqvist <tml@iki.fi>
+
+ * gthread.rc.in: Correct InternalName and OriginalFilename to
+ match what we actually produce.
+
+2001-07-20 Hans Breuer <hans@breuer.org>
+
+ * makefile.msc.in : reflect glib move
+
+2001-06-07 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-win32.c: Use g_win32_error_message to beautify error
+ messages.
+
+2001-05-24 Hans Breuer <hans@breuer.org>
+
+ * makefile.msc.in : pthread isn't required anymore
+
+2001-05-22 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-win32.c (g_cond_wait_internal): Also return TRUE for
+ late arrived signals. Thanks to Steven Brooks
+ <umbrook0@cs.umanitoba.ca> for pointing out.
+
+ * gthread-impl.c (g_thread_init): Move the thread implementation
+ initialization to before assigning GThreadFuncs, which now is just
+ struct assigned and not memcpy'ed. Completed check for zero
+ members of GThreadFuncs.
+
+ * makefile.mingw: Don't link to pthread anymore.
+
+ * gthread-win32.c: New file for native thread support for
+ win32. Thanks to Hans Breuer <hans@breuer.org> to got me
+ kickstarted.
+
+ * Makefile.am: Also distribute gthread-win32.c.
+
+Fri May 4 04:14:45 2001 Tim Janik <timj@gtk.org>
+
+ * gthread-posix.c (g_cond_timed_wait_posix_impl): don't g_assert()
+ the user specified time, but g_return_val_if_fail() here.
+
+2001-04-03 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c: Added special case for priorities on
+ FreeBSD. Thanks to David Reid <dreid@jetnet.co.uk> for the info.
+
+ * gthread-impl.c: Made two macros safe with ().
+
+2001-03-10 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am: Use the _LIBADD dependency on libglib only on
+ Win32.
+
+2001-02-21 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am: Use libglib-1.3.la from top_builddir. Invoke
+ libtool with -no-undefined for Win32 and Cygwin.
+
+ * gthread-impl.c (g_thread_init): Win32 code snippet used also on
+ Cygwin.
+
+2001-02-15 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c: Removed the G_THREAD_USE_PID_SURROGATE
+ implementation, which is now in gthread.c.
+
+2001-01-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-impl.c (g_thread_init_with_errorcheck_mutexes): Call
+ g_thread_impl_init(), as g_thread_init won't call it.
+
+ * gthread-impl.c (g_mutex_free_errorcheck_impl): Fixed it for
+ real. Sorry for this mess. It looked like a real obvious fix, so I
+ didn't check. Bad boy. Added some casts to quiet the compiler.
+
+2001-01-29 Havoc Pennington <hp@redhat.com>
+
+ * gthread-impl.c (g_mutex_free_errorcheck_impl): hack this so it
+ compiles, needs fixing for real.
+
+2001-01-29 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-impl.c (g_mutex_free_errorcheck_impl): Add new check to
+ errorcheck mutexes to abort, if a locked mutex is freed.
+
+2001-01-03 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-solaris.c, gthread-posix.c: Made g_thread_min_stack_size
+ static.
+
+2000-11-28 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-impl.c: Revamped errorcheck mutexes and added errorcheck
+ cond_wait() and cond_timed_wait() funtions. This makes he whole
+ thing work. Now we only show the location of the locking/unlocking
+ for -DG_ERRORCHECK_MUTEXES and not the name of the mutex.
+
+2000-11-21 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-impl.c, gthread-posix.c, gthread-solaris.c: Removed
+ g_thread_map_priority function in favour of the
+ g_thread_priority_map array. Initialize the array with
+ PRIORITY_{...}_VALUE, if available and interpolate beetween the
+ bounds if .._NORMAL_.. and .._HIGH_.. are not available.
+
+ * gthread-posix.c: If we should use the PID niceness as a
+ surrogate for thread priorities (G_THREAD_USE_PID_SURROGATE is
+ defined), then disable normal priority handling and use PIDs and
+ setpriority() instead. Depends on the thread to write its PID into
+ the place after the thread id right after thread creation.
+
+2000-11-15 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c: Include <sched.h> if available.
+
+2000-11-02 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-none.c: Add G_MUTEX_SIZE as needed for gthread-impl.c
+
+2000-10-25 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * Makefile.am : Add @GLIB_DEBUG_FLAGS@ to INCLUDES for accessing
+ -DG_ENABLE_DEBUG as needed in gthread-posix.c.
+
+ * gthread-posix.c: Revamped error handling for native thread
+ function calls. Now EPERM errors are ignored for some commands and
+ only a warning message is output once (at first occurrence).
+
+2000-10-15 Raja R Harinath <harinath@cs.umn.edu>
+
+ * Makefile.am (BUILT_EXTRA_DIST): New variable.
+ (dist-hook): Handle $(BUILT_EXTRA_DIST).
+
+2000-09-29 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-impl.c: Added errorcheck mutexes. New exported function
+ g_thread_init_with_errorcheck_mutexes, which is called instead of
+ g_thread_init, when compiled with -DG_ERRORCHECK_MUTEXES. New
+ static functions
+ g_mutex_(new|lock|trylock|unlock|free)_errorcheck_impl to
+ implement errorcheck mutexes.
+
+ * gthread-posix.impl.c, gthread-solaris-impl.c: Define the size of
+ a mutex.
+
+2000-09-21 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.mingw.in: Use pthreads macros from ../build.
+
+2000-09-06 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c, gthread-solaris.c:
+ s/G_MICROSEC/G_USEC_PER_SEC/ and s/G_NANOSEC/G_NSEC_PER_SEC/
+
+2000-09-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c (g_thread_create_posix_impl): Use GError to
+ report errors.
+
+ * gthread-solaris.c (g_thread_create_solaris_impl): Use GError to
+ report errors as well.
+
+2000-05-13 Tor Lillqvist <tml@iki.fi>
+
+ * makefile.mingw.in: New file, with gthread stuff moved from
+ ../makefile.mingw.in.
+
+ * Makefile.am: Add to EXTRA_DIST, add rule to build makefile.mingw.
+
+2000-04-25 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-solaris.c (g_mutex_new_solaris_impl): Changed the scope
+ of the initialized mutex to USYNC_THREAD. Thanks to Soeren
+ Sandmann <sandmann@daimi.au.dk> for pointing that out.
+
+2000-03-20 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c (posix_check_for_error): Forgot a '}' in a macro
+ for DCE-threads. Thanks to Karl Nelson <kenelson@ece.ucdavis.edu>
+ for pointing that out.
+
+2000-03-17 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c: Don't use priorities for threads, when the
+ minimal/maximal priorities couldn't be determined at configure
+ time.
+
+ * gthread-posix.c: Don't check for errors, when setting the scope
+ of a tread to system, as some posix implementations can't do that
+ and we don't want the thing to fail because of that.
+
+2000-02-22 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c, gthread-solaris.c: check for sysconf
+ (_SC_THREAD_STACK_MIN), which returns the minimal stack size for
+ new threads. Patch from Soeren Sandmann <sandmann@daimi.au.dk>.
+
+1999-11-16 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c, gthread-solaris.c: Changed the prototype of
+ thread_create and thread_self to return the system thread into
+ provided memory instead of a return value. This is necessary, as
+ HPUX has a pthread_t, that is bigger than the biggest integral
+ type there. Made some more functions static.
+
+ * gthread-posix.c: Small fixes for DCE threads: Detaching has to
+ be done after thread creation for DCE.
+
+1999-06-21 Tor Lillqvist <tml@iki.fi>
+
+ * gthread-posix.c: Guard pthread_attr_setscope call with test
+ for _POSIX_THREAD_PRIORITY_SCHEDULING, which should be defined
+ in a <pthread.h> that supports that feature.
+
+1999-06-17 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c, gthread-solaris.c: Added the native
+ implementations for the GLib's extended thread support.
+
+ * gthread-nspr.c: Removed for good. NSPR is nothing we would want
+ to build upon.
+
+ * gthread.c: Renamed to gthread-impl.c to avoid confusion with
+ ../gthread.c (Formerly known as the file called gmutex.c)
+
+ * testgthread.c: Removed. The new and much extended tests are in
+ ../tests/thread-test.c.
+
+ * Makefile.am: Changed to reflect the changes above.
+
+1999-03-31 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c: Use the right default arguments for the
+ construction of mutexes and conds for dce threads, these are
+ &pthread_(cond|mutex)attr_default instead of NULL. Hint from
+ D. Emilio Grimaldo Tunon <emilio_tunon@nl.compuware.com>.
+
+1999-03-18 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * Makefile.am (INCLUDES): Added @GTHREAD_COMPILE_IMPL_DEFINES@.
+
+1999-03-12 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c (g_private_get_posix_impl): Fixed typo for DCE
+ implementation.
+
+1999-03-11 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c: Now handle both dce and posix threads. They are
+ sufficently equal. Please do not commit my change to
+ glib-1-2/gthread/gthread-posix.c from 1999-03-03, as the current
+ change will take care of that too.
+
+1999-03-03 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c: Fixed broken mutex_trylock and slightly broken
+ cond_timed_wait functions.
+
+1999-02-15 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * testgthread.c (test_mutexes): Use new signature of
+ g_static_mutex* functions.
+
+1999-02-08 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * gthread-posix.c (g_private_get_posix_impl): Use the
+ HAVE_PTHREAD_GETSPECIFIC_POSIX macro to determine, which signature
+ to use for pthread_getspecific.
+
+Tue Jan 19 20:56:02 1999 Tor Lillqvist <tml@iki.fi>
+
+ * Makefile.am (EXTRA_DIST): Added gthread.def.
+
+Sun Jan 17 10:58:19 1999 Tor Lillqvist <tml@iki.fi>
+
+ * gthread.def: New file.
+
+1999-01-16 1999 Tor Lillqvist <tml@iki.fi>
+
+ * gthread-posix.c: Conditionalize <sys/time.h> inclusion.
+
+1999-01-07 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * testgthread.c: conditionally compile according to the
+ G_THREADS_IMPL_??? macros.
+ (test_private_func): use rand_r instead of rand to make it
+ thread safe.
+
+1998-12-18 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * testgthread.c (new_thread): As a joinable thread seems to be the
+ default on posix, leave the explicit setting out, as it causes
+ problems on some older platforms.
+
+Wed Dec 16 22:21:33 CST 1998 Shawn T. Amundson <amundson@gtk.org>
+
+ * gthread-posix.c: use g_free in mutex_free (from Tim Janik)
+
+Thu Dec 17 03:38:57 1998 Tim Janik <timj@gtk.org>
+
+ * Makefile.am: -DG_LOG_DOMAIN="GThread", we don't need an extern
+ variable for that (noticed by Joel Becker <jlbec@ocala.cs.miami.edu>)
+
+Wed Dec 16 03:16:16 1998 Tim Janik <timj@gtk.org>
+
+ * testgthread.c: s/g_thread_supported/g_thread_supported ()/
+ * gthread.c: s/g_thread_supported/g_threads_got_initialized/
+ (g_thread_init): bail out if G_THREADS_ENABLED is not defined.
+
+1998-12-15 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * Makefile.am (EXTRA_DIST): updated.
+
+ * testgthread.c, gthread-*.c: Changed private to private_key to
+ avoid problems when compiling with under C++.
+
+ * gthread-none.c:
+ s/g_mutex_functions_for_glib_use/g_thread_functions_for_glib_use/
+
+ * ChangeLog: from now on there is an extra ChangeLog for gthread
+
+
diff --git a/trunk/gthread/Makefile.am b/trunk/gthread/Makefile.am
new file mode 100644
index 000000000..af8ea64b8
--- /dev/null
+++ b/trunk/gthread/Makefile.am
@@ -0,0 +1,87 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/glib -I$(top_srcdir)/gthread \
+ -DG_LOG_DOMAIN=\"GThread\" @GTHREAD_COMPILE_IMPL_DEFINES@ \
+ @GLIB_DEBUG_FLAGS@ -DG_DISABLE_DEPRECATED
+
+EXTRA_DIST = \
+ makefile.msc.in \
+ gthread-posix.c \
+ gthread-win32.c \
+ gthread-none.c \
+ gthread.def \
+ gthread.rc.in
+
+BUILT_EXTRA_DIST = \
+ makefile.msc \
+ gthread.rc
+
+libglib = $(top_builddir)/glib/libglib-2.0.la
+
+top_builddir_full=`cd \$(top_builddir); pwd`
+
+lib_LTLIBRARIES = libgthread-2.0.la
+
+if MS_LIB_AVAILABLE
+noinst_DATA = gthread-2.0.lib
+
+install-ms-lib:
+ $(INSTALL) gthread-2.0.lib $(DESTDIR)$(libdir)
+
+uninstall-ms-lib:
+ -rm $(DESTDIR)$(libdir)/gthread-2.0.lib
+else
+install-ms-lib:
+uninstall-ms-lib:
+endif
+
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif
+
+if OS_WIN32
+export_symbols = -export-symbols $(srcdir)/gthread.def
+
+install-def-file:
+ $(INSTALL) $(srcdir)/gthread.def $(DESTDIR)$(libdir)/gthread-2.0.def
+
+uninstall-def-file:
+ -rm $(DESTDIR)$(libdir)/gthread-2.0.def
+else
+install-def-file:
+uninstall-def-file:
+endif
+
+if OS_WIN32
+gthread_win32_res = gthread-win32-res.o
+gthread_win32_res_ldflag = -Wl,$(gthread_win32_res)
+endif
+
+libgthread_2_0_la_SOURCES = gthread-impl.c
+libgthread_2_0_la_LDFLAGS = \
+ $(gthread_win32_res_ldflag) \
+ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \
+ -export-dynamic $(no_undefined) $(export_symbols)
+
+libgthread_2_0_la_LIBADD = $(G_THREAD_LIBS_EXTRA) $(G_THREAD_LIBS_FOR_GTHREAD) $(libglib)
+
+libgthread_2_0_la_DEPENDENCIES = $(gthread_win32_res) $(GTHREAD_DEF)
+
+if OS_WIN32
+gthread-win32-res.o: gthread.rc
+ $(WINDRES) gthread.rc $@
+endif
+
+gthread-2.0.lib: libgthread-2.0.la gthread.def
+ lib -name:libgthread-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:$(srcdir)/gthread.def -out:$@
+
+dist-hook: $(BUILT_EXTRA_DIST)
+ files='$(BUILT_EXTRA_DIST)'; \
+ for f in $$files; do \
+ if test -f $$f; then d=.; else d=$(srcdir); fi; \
+ cp $$d/$$f $(distdir) || exit 1; done
+
+install-data-local: install-ms-lib install-def-file
+
+uninstall-local: uninstall-ms-lib uninstall-def-file
+
diff --git a/trunk/gthread/gthread-impl.c b/trunk/gthread/gthread-impl.c
new file mode 100644
index 000000000..645907739
--- /dev/null
+++ b/trunk/gthread/gthread-impl.c
@@ -0,0 +1,366 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * gthread.c: thread related functions
+ * Copyright 1998 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.
+ */
+
+/*
+ * 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"
+#include "gthreadprivate.h"
+
+#ifdef G_THREADS_ENABLED
+
+static GSystemThread zero_thread; /* This is initialized to all zero */
+static gboolean thread_system_already_initialized = FALSE;
+static gint g_thread_priority_map [G_THREAD_PRIORITY_URGENT + 1];
+
+#include G_THREAD_SOURCE
+
+#ifndef PRIORITY_LOW_VALUE
+# define PRIORITY_LOW_VALUE 0
+#endif
+
+#ifndef PRIORITY_URGENT_VALUE
+# define PRIORITY_URGENT_VALUE 0
+#endif
+
+#ifndef PRIORITY_NORMAL_VALUE
+# define PRIORITY_NORMAL_VALUE \
+ ((PRIORITY_LOW_VALUE * 6 + PRIORITY_URGENT_VALUE * 4) / 10)
+#endif /* PRIORITY_NORMAL_VALUE */
+
+#ifndef PRIORITY_HIGH_VALUE
+# define PRIORITY_HIGH_VALUE \
+ ((PRIORITY_NORMAL_VALUE + PRIORITY_URGENT_VALUE * 2) / 3)
+#endif /* PRIORITY_HIGH_VALUE */
+
+void g_mutex_init (void);
+void g_mem_init (void);
+void g_messages_init (void);
+void g_convert_init (void);
+void g_rand_init (void);
+void g_main_thread_init (void);
+
+typedef struct _GMutexDebugInfo GMutexDebugInfo;
+struct _GMutexDebugInfo
+{
+ gchar *location;
+ GSystemThread owner;
+};
+
+#define G_MUTEX_DEBUG_INFO(mutex) \
+ (((GMutexDebugInfo*)(((char*)mutex)+G_MUTEX_SIZE)))
+
+static GMutex *
+g_mutex_new_errorcheck_impl (void)
+{
+ GMutex *retval = g_thread_functions_for_glib_use_default.mutex_new ();
+ GMutexDebugInfo *info;
+ retval = g_realloc (retval, G_MUTEX_SIZE + sizeof (GMutexDebugInfo));
+
+ info = G_MUTEX_DEBUG_INFO (retval);
+ g_system_thread_assign (info->owner, zero_thread);
+ info->location = "invalid";
+
+ return retval;
+}
+
+static void
+g_mutex_lock_errorcheck_impl (GMutex *mutex,
+ const gulong magic,
+ gchar * const location)
+{
+ GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex);
+ gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown";
+
+ GSystemThread self;
+ g_thread_functions_for_glib_use.thread_self (&self);
+
+ if (g_system_thread_equal (info->owner, self))
+ g_error ("Trying to recursivly lock a mutex at '%s', "
+ "previously locked at '%s'",
+ loc, info->location);
+
+ g_thread_functions_for_glib_use_default.mutex_lock (mutex);
+
+ g_system_thread_assign (info->owner, self);
+ info->location = loc;
+}
+
+static gboolean
+g_mutex_trylock_errorcheck_impl (GMutex *mutex,
+ const gulong magic,
+ gchar * const location)
+{
+ GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex);
+ gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown";
+
+ GSystemThread self;
+ g_thread_functions_for_glib_use.thread_self (&self);
+
+ if (g_system_thread_equal (info->owner, self))
+ g_error ("Trying to recursivly lock a mutex at '%s', "
+ "previously locked at '%s'",
+ loc, info->location);
+
+ if (!g_thread_functions_for_glib_use_default.mutex_trylock (mutex))
+ return FALSE;
+
+ g_system_thread_assign (info->owner, self);
+ info->location = loc;
+
+ return TRUE;
+}
+
+static void
+g_mutex_unlock_errorcheck_impl (GMutex *mutex,
+ const gulong magic,
+ gchar * const location)
+{
+ GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex);
+ gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown";
+
+ GSystemThread self;
+ g_thread_functions_for_glib_use.thread_self (&self);
+
+ if (g_system_thread_equal (info->owner, zero_thread))
+ g_error ("Trying to unlock an unlocked mutex at '%s'", loc);
+
+ if (!g_system_thread_equal (info->owner, self))
+ g_warning ("Trying to unlock a mutex at '%s', "
+ "previously locked by a different thread at '%s'",
+ loc, info->location);
+
+ g_system_thread_assign (info->owner, zero_thread);
+ info->location = NULL;
+
+ g_thread_functions_for_glib_use_default.mutex_unlock (mutex);
+}
+
+static void
+g_mutex_free_errorcheck_impl (GMutex *mutex,
+ const gulong magic,
+ gchar * const location)
+{
+ GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex);
+ gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown";
+
+ if (info && !g_system_thread_equal (info->owner, zero_thread))
+ g_error ("Trying to free a locked mutex at '%s', "
+ "which was previously locked at '%s'",
+ loc, info->location);
+
+ g_thread_functions_for_glib_use_default.mutex_free (mutex);
+}
+
+static void
+g_cond_wait_errorcheck_impl (GCond *cond,
+ GMutex *mutex,
+ const gulong magic,
+ gchar * const location)
+{
+ GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex);
+ gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown";
+
+ GSystemThread self;
+ g_thread_functions_for_glib_use.thread_self (&self);
+
+ if (g_system_thread_equal (info->owner, zero_thread))
+ g_error ("Trying to use an unlocked mutex in g_cond_wait() at '%s'", loc);
+
+ if (!g_system_thread_equal (info->owner, self))
+ g_error ("Trying to use a mutex locked by another thread in "
+ "g_cond_wait() at '%s'", loc);
+
+ g_system_thread_assign (info->owner, zero_thread);
+ loc = info->location;
+
+ g_thread_functions_for_glib_use_default.cond_wait (cond, mutex);
+
+ g_system_thread_assign (info->owner, self);
+ info->location = loc;
+}
+
+
+static gboolean
+g_cond_timed_wait_errorcheck_impl (GCond *cond,
+ GMutex *mutex,
+ GTimeVal *end_time,
+ const gulong magic,
+ gchar * const location)
+{
+ GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex);
+ gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown";
+ gboolean retval;
+
+ GSystemThread self;
+ g_thread_functions_for_glib_use.thread_self (&self);
+
+ if (g_system_thread_equal (info->owner, zero_thread))
+ g_error ("Trying to use an unlocked mutex in g_cond_timed_wait() at '%s'",
+ loc);
+
+ if (!g_system_thread_equal (info->owner, self))
+ g_error ("Trying to use a mutex locked by another thread in "
+ "g_cond_timed_wait() at '%s'", loc);
+
+ g_system_thread_assign (info->owner, zero_thread);
+ loc = info->location;
+
+ retval = g_thread_functions_for_glib_use_default.cond_timed_wait (cond,
+ mutex,
+ end_time);
+
+ g_system_thread_assign (info->owner, self);
+ info->location = loc;
+
+ return retval;
+}
+
+
+/* unshadow function declaration. See gthread.h */
+#undef g_thread_init
+
+void
+g_thread_init_with_errorcheck_mutexes (GThreadFunctions* init)
+{
+ GThreadFunctions errorcheck_functions;
+ if (init)
+ g_error ("Errorcheck mutexes can only be used for native "
+ "thread implementations. Sorry." );
+
+#ifdef HAVE_G_THREAD_IMPL_INIT
+ /* This isn't called in g_thread_init, as it doesn't think to get
+ * the default implementation, so we have to call it on our own.
+ *
+ * We must call this before copying
+ * g_thread_functions_for_glib_use_default as the
+ * implementation-specific init function might modify the contents
+ * of g_thread_functions_for_glib_use_default based on operating
+ * system version, C library version, or whatever. */
+ g_thread_impl_init();
+#endif /* HAVE_G_THREAD_IMPL_INIT */
+
+ errorcheck_functions = g_thread_functions_for_glib_use_default;
+ errorcheck_functions.mutex_new = g_mutex_new_errorcheck_impl;
+ errorcheck_functions.mutex_lock =
+ (void (*)(GMutex *)) g_mutex_lock_errorcheck_impl;
+ errorcheck_functions.mutex_trylock =
+ (gboolean (*)(GMutex *)) g_mutex_trylock_errorcheck_impl;
+ errorcheck_functions.mutex_unlock =
+ (void (*)(GMutex *)) g_mutex_unlock_errorcheck_impl;
+ errorcheck_functions.mutex_free =
+ (void (*)(GMutex *)) g_mutex_free_errorcheck_impl;
+ errorcheck_functions.cond_wait =
+ (void (*)(GCond *, GMutex *)) g_cond_wait_errorcheck_impl;
+ errorcheck_functions.cond_timed_wait =
+ (gboolean (*)(GCond *, GMutex *, GTimeVal *))
+ g_cond_timed_wait_errorcheck_impl;
+
+ g_thread_init (&errorcheck_functions);
+}
+
+void
+g_thread_init (GThreadFunctions* init)
+{
+ gboolean supported;
+
+ if (thread_system_already_initialized)
+ g_error ("GThread system may only be initialized once.");
+
+ thread_system_already_initialized = TRUE;
+
+ if (init == NULL)
+ {
+#ifdef HAVE_G_THREAD_IMPL_INIT
+ /* now do any initialization stuff required by the
+ * implementation, but only if called with a NULL argument, of
+ * course. Otherwise it's up to the user to do so. */
+ g_thread_impl_init();
+#endif /* HAVE_G_THREAD_IMPL_INIT */
+ init = &g_thread_functions_for_glib_use_default;
+ }
+ else
+ g_thread_use_default_impl = FALSE;
+
+ g_thread_functions_for_glib_use = *init;
+ if (g_thread_gettime_impl)
+ g_thread_gettime = g_thread_gettime_impl;
+
+ supported = (init->mutex_new &&
+ init->mutex_lock &&
+ init->mutex_trylock &&
+ init->mutex_unlock &&
+ init->mutex_free &&
+ init->cond_new &&
+ init->cond_signal &&
+ init->cond_broadcast &&
+ init->cond_wait &&
+ init->cond_timed_wait &&
+ init->cond_free &&
+ init->private_new &&
+ init->private_get &&
+ init->private_set &&
+ init->thread_create &&
+ init->thread_yield &&
+ init->thread_join &&
+ init->thread_exit &&
+ init->thread_set_priority &&
+ init->thread_self);
+
+ /* if somebody is calling g_thread_init (), it means that he wants to
+ * have thread support, so check this
+ */
+ if (!supported)
+ {
+ if (g_thread_use_default_impl)
+ g_error ("Threads are not supported on this platform.");
+ else
+ g_error ("The supplied thread function vector is invalid.");
+ }
+
+ g_thread_priority_map [G_THREAD_PRIORITY_LOW] = PRIORITY_LOW_VALUE;
+ g_thread_priority_map [G_THREAD_PRIORITY_NORMAL] = PRIORITY_NORMAL_VALUE;
+ g_thread_priority_map [G_THREAD_PRIORITY_HIGH] = PRIORITY_HIGH_VALUE;
+ g_thread_priority_map [G_THREAD_PRIORITY_URGENT] = PRIORITY_URGENT_VALUE;
+
+ g_thread_init_glib ();
+}
+
+#else /* !G_THREADS_ENABLED */
+
+void
+g_thread_init (GThreadFunctions* init)
+{
+ g_error ("GLib thread support is disabled.");
+}
+
+#endif /* !G_THREADS_ENABLED */
diff --git a/trunk/gthread/gthread-none.c b/trunk/gthread/gthread-none.c
new file mode 100644
index 000000000..6fbeff160
--- /dev/null
+++ b/trunk/gthread/gthread-none.c
@@ -0,0 +1,39 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * gthread.c: fallback thread system implementation
+ * Copyright 1998 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.
+ */
+
+/*
+ * 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
+ */
+
+static GThreadFunctions
+g_thread_functions_for_glib_use_default; /* is NULLified */
+
+static guint64 (*g_thread_gettime_impl) (void) = NULL;
+
+#define G_MUTEX_SIZE 0
diff --git a/trunk/gthread/gthread-posix.c b/trunk/gthread/gthread-posix.c
new file mode 100644
index 000000000..01121bf4c
--- /dev/null
+++ b/trunk/gthread/gthread-posix.c
@@ -0,0 +1,467 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * gthread.c: posix thread system implementation
+ * Copyright 1998 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.
+ */
+
+/*
+ * 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 <pthread.h>
+#include <errno.h>
+#include <stdlib.h>
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_SCHED_H
+#include <sched.h>
+#endif
+
+#define posix_check_err(err, name) G_STMT_START{ \
+ int error = (err); \
+ if (error) \
+ g_error ("file %s: line %d (%s): error '%s' during '%s'", \
+ __FILE__, __LINE__, G_GNUC_PRETTY_FUNCTION, \
+ g_strerror (error), name); \
+ }G_STMT_END
+
+#define posix_check_cmd(cmd) posix_check_err (posix_error (cmd), #cmd)
+
+#ifdef G_ENABLE_DEBUG
+static gboolean posix_check_cmd_prio_warned = FALSE;
+# define posix_check_cmd_prio(cmd) G_STMT_START{ \
+ int err = posix_error (cmd); \
+ if (err == EPERM) \
+ { \
+ if (!posix_check_cmd_prio_warned) \
+ { \
+ posix_check_cmd_prio_warned = TRUE; \
+ g_warning ("Priorities can only be changed " \
+ "(resp. increased) by root."); \
+ } \
+ } \
+ else \
+ posix_check_err (err, #cmd); \
+ }G_STMT_END
+#else /* G_ENABLE_DEBUG */
+# define posix_check_cmd_prio(cmd) G_STMT_START{ \
+ int err = posix_error (cmd); \
+ if (err != EPERM) \
+ posix_check_err (err, #cmd); \
+ }G_STMT_END
+#endif /* G_ENABLE_DEBUG */
+
+#if defined(G_THREADS_IMPL_POSIX)
+# define posix_error(what) (what)
+# define mutexattr_default NULL
+# define condattr_default NULL
+#elif defined(G_THREADS_IMPL_DCE)
+# define posix_error(what) ((what) == -1 ? errno : 0)
+# define pthread_key_create(a, b) pthread_keycreate (a, b)
+# define pthread_attr_init(a) pthread_attr_create (a)
+# define pthread_attr_destroy(a) pthread_attr_delete (a)
+# define pthread_create(a, b, c, d) pthread_create (a, *b, c, d)
+# define mutexattr_default (pthread_mutexattr_default)
+# define condattr_default (pthread_condattr_default)
+#else /* neither G_THREADS_IMPL_POSIX nor G_THREADS_IMPL_DCE are defined */
+# error This should not happen. Contact the GLib team.
+#endif
+
+#if defined (POSIX_MIN_PRIORITY) && defined (POSIX_MAX_PRIORITY)
+# define HAVE_PRIORITIES 1
+static gint priority_normal_value;
+# ifdef __FreeBSD__
+ /* FreeBSD threads use different priority values from the POSIX_
+ * defines so we just set them here. The corresponding macros
+ * PTHREAD_MIN_PRIORITY and PTHREAD_MAX_PRIORITY are implied to be
+ * exported by the docs, but they aren't.
+ */
+# define PRIORITY_LOW_VALUE 0
+# define PRIORITY_URGENT_VALUE 31
+# else /* !__FreeBSD__ */
+# define PRIORITY_LOW_VALUE POSIX_MIN_PRIORITY
+# define PRIORITY_URGENT_VALUE POSIX_MAX_PRIORITY
+# endif /* !__FreeBSD__ */
+# define PRIORITY_NORMAL_VALUE priority_normal_value
+#endif /* POSIX_MIN_PRIORITY && POSIX_MAX_PRIORITY */
+
+static gulong g_thread_min_stack_size = 0;
+
+#define G_MUTEX_SIZE (sizeof (pthread_mutex_t))
+
+#if defined(HAVE_CLOCK_GETTIME) && defined(HAVE_MONOTONIC_CLOCK)
+#define USE_CLOCK_GETTIME 1
+static gint posix_clock = 0;
+#endif
+
+#if defined(_SC_THREAD_STACK_MIN) || defined (HAVE_PRIORITIES) || defined (USE_CLOCK_GETTIME)
+#define HAVE_G_THREAD_IMPL_INIT
+static void
+g_thread_impl_init(void)
+{
+#ifdef _SC_THREAD_STACK_MIN
+ g_thread_min_stack_size = MAX (sysconf (_SC_THREAD_STACK_MIN), 0);
+#endif /* _SC_THREAD_STACK_MIN */
+#ifdef HAVE_PRIORITIES
+# ifdef G_THREADS_IMPL_POSIX
+ {
+ struct sched_param sched;
+ int policy;
+ posix_check_cmd (pthread_getschedparam (pthread_self(), &policy, &sched));
+ priority_normal_value = sched.sched_priority;
+ }
+# else /* G_THREADS_IMPL_DCE */
+ posix_check_cmd (priority_normal_value =
+ pthread_getprio (*(pthread_t*)thread,
+ g_thread_priority_map [priority]));
+# endif
+#endif /* HAVE_PRIORITIES */
+
+#ifdef USE_CLOCK_GETTIME
+ if (sysconf (_SC_MONOTONIC_CLOCK) >= 0)
+ posix_clock = CLOCK_MONOTONIC;
+ else
+ posix_clock = CLOCK_REALTIME;
+#endif
+}
+#endif /* _SC_THREAD_STACK_MIN || HAVE_PRIORITIES */
+
+static GMutex *
+g_mutex_new_posix_impl (void)
+{
+ GMutex *result = (GMutex *) g_new (pthread_mutex_t, 1);
+ posix_check_cmd (pthread_mutex_init ((pthread_mutex_t *) result,
+ mutexattr_default));
+ return result;
+}
+
+static void
+g_mutex_free_posix_impl (GMutex * mutex)
+{
+ posix_check_cmd (pthread_mutex_destroy ((pthread_mutex_t *) mutex));
+ g_free (mutex);
+}
+
+/* NOTE: the functions g_mutex_lock and g_mutex_unlock may not use
+ functions from gmem.c and gmessages.c; */
+
+/* pthread_mutex_lock, pthread_mutex_unlock can be taken directly, as
+ signature and semantic are right, but without error check then!!!!,
+ we might want to change this therefore. */
+
+static gboolean
+g_mutex_trylock_posix_impl (GMutex * mutex)
+{
+ int result;
+
+ result = pthread_mutex_trylock ((pthread_mutex_t *) mutex);
+
+#ifdef G_THREADS_IMPL_POSIX
+ if (result == EBUSY)
+ return FALSE;
+#else /* G_THREADS_IMPL_DCE */
+ if (result == 0)
+ return FALSE;
+#endif
+
+ posix_check_err (posix_error (result), "pthread_mutex_trylock");
+ return TRUE;
+}
+
+static GCond *
+g_cond_new_posix_impl (void)
+{
+ GCond *result = (GCond *) g_new (pthread_cond_t, 1);
+ posix_check_cmd (pthread_cond_init ((pthread_cond_t *) result,
+ condattr_default));
+ return result;
+}
+
+/* pthread_cond_signal, pthread_cond_broadcast and pthread_cond_wait
+ can be taken directly, as signature and semantic are right, but
+ without error check then!!!!, we might want to change this
+ therefore. */
+
+#define G_NSEC_PER_SEC 1000000000
+
+static gboolean
+g_cond_timed_wait_posix_impl (GCond * cond,
+ GMutex * entered_mutex,
+ GTimeVal * abs_time)
+{
+ int result;
+ struct timespec end_time;
+ gboolean timed_out;
+
+ g_return_val_if_fail (cond != NULL, FALSE);
+ g_return_val_if_fail (entered_mutex != NULL, FALSE);
+
+ if (!abs_time)
+ {
+ result = pthread_cond_wait ((pthread_cond_t *)cond,
+ (pthread_mutex_t *) entered_mutex);
+ timed_out = FALSE;
+ }
+ else
+ {
+ end_time.tv_sec = abs_time->tv_sec;
+ end_time.tv_nsec = abs_time->tv_usec * (G_NSEC_PER_SEC / G_USEC_PER_SEC);
+
+ g_return_val_if_fail (end_time.tv_nsec < G_NSEC_PER_SEC, TRUE);
+
+ result = pthread_cond_timedwait ((pthread_cond_t *) cond,
+ (pthread_mutex_t *) entered_mutex,
+ &end_time);
+#ifdef G_THREADS_IMPL_POSIX
+ timed_out = (result == ETIMEDOUT);
+#else /* G_THREADS_IMPL_DCE */
+ timed_out = (result == -1) && (errno == EAGAIN);
+#endif
+ }
+
+ if (!timed_out)
+ posix_check_err (posix_error (result), "pthread_cond_timedwait");
+
+ return !timed_out;
+}
+
+static void
+g_cond_free_posix_impl (GCond * cond)
+{
+ posix_check_cmd (pthread_cond_destroy ((pthread_cond_t *) cond));
+ g_free (cond);
+}
+
+static GPrivate *
+g_private_new_posix_impl (GDestroyNotify destructor)
+{
+ GPrivate *result = (GPrivate *) g_new (pthread_key_t, 1);
+ posix_check_cmd (pthread_key_create ((pthread_key_t *) result, destructor));
+ return result;
+}
+
+/* NOTE: the functions g_private_get and g_private_set may not use
+ functions from gmem.c and gmessages.c */
+
+static void
+g_private_set_posix_impl (GPrivate * private_key, gpointer value)
+{
+ if (!private_key)
+ return;
+ pthread_setspecific (*(pthread_key_t *) private_key, value);
+}
+
+static gpointer
+g_private_get_posix_impl (GPrivate * private_key)
+{
+ if (!private_key)
+ return NULL;
+#ifdef G_THREADS_IMPL_POSIX
+ return pthread_getspecific (*(pthread_key_t *) private_key);
+#else /* G_THREADS_IMPL_DCE */
+ {
+ void* data;
+ posix_check_cmd (pthread_getspecific (*(pthread_key_t *) private_key,
+ &data));
+ return data;
+ }
+#endif
+}
+
+static void
+g_thread_create_posix_impl (GThreadFunc thread_func,
+ gpointer arg,
+ gulong stack_size,
+ gboolean joinable,
+ gboolean bound,
+ GThreadPriority priority,
+ gpointer thread,
+ GError **error)
+{
+ pthread_attr_t attr;
+ gint ret;
+
+ g_return_if_fail (thread_func);
+ g_return_if_fail (priority >= G_THREAD_PRIORITY_LOW);
+ g_return_if_fail (priority <= G_THREAD_PRIORITY_URGENT);
+
+ posix_check_cmd (pthread_attr_init (&attr));
+
+#ifdef HAVE_PTHREAD_ATTR_SETSTACKSIZE
+ if (stack_size)
+ {
+ stack_size = MAX (g_thread_min_stack_size, stack_size);
+ /* No error check here, because some systems can't do it and
+ * we simply don't want threads to fail because of that. */
+ pthread_attr_setstacksize (&attr, stack_size);
+ }
+#endif /* HAVE_PTHREAD_ATTR_SETSTACKSIZE */
+
+#ifdef PTHREAD_SCOPE_SYSTEM
+ if (bound)
+ /* No error check here, because some systems can't do it and we
+ * simply don't want threads to fail because of that. */
+ pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
+#endif /* PTHREAD_SCOPE_SYSTEM */
+
+#ifdef G_THREADS_IMPL_POSIX
+ posix_check_cmd (pthread_attr_setdetachstate (&attr,
+ joinable ? PTHREAD_CREATE_JOINABLE : PTHREAD_CREATE_DETACHED));
+#endif /* G_THREADS_IMPL_POSIX */
+
+#ifdef HAVE_PRIORITIES
+# ifdef G_THREADS_IMPL_POSIX
+ {
+ struct sched_param sched;
+ posix_check_cmd (pthread_attr_getschedparam (&attr, &sched));
+ sched.sched_priority = g_thread_priority_map [priority];
+ posix_check_cmd_prio (pthread_attr_setschedparam (&attr, &sched));
+ }
+# else /* G_THREADS_IMPL_DCE */
+ posix_check_cmd_prio
+ (pthread_attr_setprio (&attr, g_thread_priority_map [priority]));
+# endif /* G_THREADS_IMPL_DCE */
+#endif /* HAVE_PRIORITIES */
+ ret = posix_error (pthread_create (thread, &attr,
+ (void* (*)(void*))thread_func, arg));
+
+ posix_check_cmd (pthread_attr_destroy (&attr));
+
+ if (ret == EAGAIN)
+ {
+ g_set_error (error, G_THREAD_ERROR, G_THREAD_ERROR_AGAIN,
+ "Error creating thread: %s", g_strerror (ret));
+ return;
+ }
+
+ posix_check_err (ret, "pthread_create");
+
+#ifdef G_THREADS_IMPL_DCE
+ if (!joinable)
+ posix_check_cmd (pthread_detach (thread));
+#endif /* G_THREADS_IMPL_DCE */
+}
+
+static void
+g_thread_yield_posix_impl (void)
+{
+ POSIX_YIELD_FUNC;
+}
+
+static void
+g_thread_join_posix_impl (gpointer thread)
+{
+ gpointer ignore;
+ posix_check_cmd (pthread_join (*(pthread_t*)thread, &ignore));
+}
+
+static void
+g_thread_exit_posix_impl (void)
+{
+ pthread_exit (NULL);
+}
+
+static void
+g_thread_set_priority_posix_impl (gpointer thread, GThreadPriority priority)
+{
+ g_return_if_fail (priority >= G_THREAD_PRIORITY_LOW);
+ g_return_if_fail (priority <= G_THREAD_PRIORITY_URGENT);
+#ifdef HAVE_PRIORITIES
+# ifdef G_THREADS_IMPL_POSIX
+ {
+ struct sched_param sched;
+ int policy;
+ posix_check_cmd (pthread_getschedparam (*(pthread_t*)thread, &policy,
+ &sched));
+ sched.sched_priority = g_thread_priority_map [priority];
+ posix_check_cmd_prio (pthread_setschedparam (*(pthread_t*)thread, policy,
+ &sched));
+ }
+# else /* G_THREADS_IMPL_DCE */
+ posix_check_cmd_prio (pthread_setprio (*(pthread_t*)thread,
+ g_thread_priority_map [priority]));
+# endif
+#endif /* HAVE_PRIORITIES */
+}
+
+static void
+g_thread_self_posix_impl (gpointer thread)
+{
+ *(pthread_t*)thread = pthread_self();
+}
+
+static gboolean
+g_thread_equal_posix_impl (gpointer thread1, gpointer thread2)
+{
+ return (pthread_equal (*(pthread_t*)thread1, *(pthread_t*)thread2) != 0);
+}
+
+#ifdef USE_CLOCK_GETTIME
+static guint64
+gettime (void)
+{
+ struct timespec tv;
+
+ clock_gettime (posix_clock, &tv);
+
+ return (guint64) tv.tv_sec * G_NSEC_PER_SEC + tv.tv_nsec;
+}
+static guint64 (*g_thread_gettime_impl)(void) = gettime;
+#else
+static guint64 (*g_thread_gettime_impl)(void) = 0;
+#endif
+
+static GThreadFunctions g_thread_functions_for_glib_use_default =
+{
+ g_mutex_new_posix_impl,
+ (void (*)(GMutex *)) pthread_mutex_lock,
+ g_mutex_trylock_posix_impl,
+ (void (*)(GMutex *)) pthread_mutex_unlock,
+ g_mutex_free_posix_impl,
+ g_cond_new_posix_impl,
+ (void (*)(GCond *)) pthread_cond_signal,
+ (void (*)(GCond *)) pthread_cond_broadcast,
+ (void (*)(GCond *, GMutex *)) pthread_cond_wait,
+ g_cond_timed_wait_posix_impl,
+ g_cond_free_posix_impl,
+ g_private_new_posix_impl,
+ g_private_get_posix_impl,
+ g_private_set_posix_impl,
+ g_thread_create_posix_impl,
+ g_thread_yield_posix_impl,
+ g_thread_join_posix_impl,
+ g_thread_exit_posix_impl,
+ g_thread_set_priority_posix_impl,
+ g_thread_self_posix_impl,
+ g_thread_equal_posix_impl
+};
diff --git a/trunk/gthread/gthread-win32.c b/trunk/gthread/gthread-win32.c
new file mode 100644
index 000000000..657423f44
--- /dev/null
+++ b/trunk/gthread/gthread-win32.c
@@ -0,0 +1,639 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * gthread.c: solaris thread system implementation
+ * Copyright 1998-2001 Sebastian Wilhelmi; University of Karlsruhe
+ * Copyright 2001 Hans Breuer
+ *
+ * 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"
+
+#define STRICT
+#define _WIN32_WINDOWS 0x0401 /* to get IsDebuggerPresent */
+#include <windows.h>
+#undef STRICT
+
+#include <process.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#define win32_check_for_error(what) G_STMT_START{ \
+ if (!(what)) \
+ g_error ("file %s: line %d (%s): error %s during %s", \
+ __FILE__, __LINE__, G_GNUC_PRETTY_FUNCTION, \
+ g_win32_error_message (GetLastError ()), #what); \
+ }G_STMT_END
+
+#define G_MUTEX_SIZE (sizeof (gpointer))
+
+#define PRIORITY_LOW_VALUE THREAD_PRIORITY_BELOW_NORMAL
+#define PRIORITY_NORMAL_VALUE THREAD_PRIORITY_NORMAL
+#define PRIORITY_HIGH_VALUE THREAD_PRIORITY_ABOVE_NORMAL
+#define PRIORITY_URGENT_VALUE THREAD_PRIORITY_HIGHEST
+
+static DWORD g_thread_self_tls;
+static DWORD g_private_tls;
+static DWORD g_cond_event_tls;
+static CRITICAL_SECTION g_thread_global_spinlock;
+
+typedef BOOL (__stdcall *GTryEnterCriticalSectionFunc) (CRITICAL_SECTION *);
+
+static GTryEnterCriticalSectionFunc try_enter_critical_section = NULL;
+
+/* As noted in the docs, GPrivate is a limited resource, here we take
+ * a rather low maximum to save memory, use GStaticPrivate instead. */
+#define G_PRIVATE_MAX 100
+
+static GDestroyNotify g_private_destructors[G_PRIVATE_MAX];
+
+static guint g_private_next = 0;
+
+/* A "forward" declaration of this structure */
+static GThreadFunctions g_thread_functions_for_glib_use_default;
+
+typedef struct _GThreadData GThreadData;
+struct _GThreadData
+{
+ GThreadFunc func;
+ gpointer data;
+ HANDLE thread;
+ gboolean joinable;
+};
+
+struct _GCond
+{
+ GPtrArray *array;
+ CRITICAL_SECTION lock;
+};
+
+static GMutex *
+g_mutex_new_win32_cs_impl (void)
+{
+ CRITICAL_SECTION *cs = g_new (CRITICAL_SECTION, 1);
+ gpointer *retval = g_new (gpointer, 1);
+
+ InitializeCriticalSection (cs);
+ *retval = cs;
+ return (GMutex *) retval;
+}
+
+static void
+g_mutex_free_win32_cs_impl (GMutex *mutex)
+{
+ gpointer *ptr = (gpointer *) mutex;
+ CRITICAL_SECTION *cs = (CRITICAL_SECTION *) *ptr;
+
+ DeleteCriticalSection (cs);
+ g_free (cs);
+ g_free (mutex);
+}
+
+/* NOTE: the functions g_mutex_lock and g_mutex_unlock may not use
+ functions from gmem.c and gmessages.c; */
+
+static void
+g_mutex_lock_win32_cs_impl (GMutex *mutex)
+{
+ EnterCriticalSection (*(CRITICAL_SECTION **)mutex);
+}
+
+static gboolean
+g_mutex_trylock_win32_cs_impl (GMutex * mutex)
+{
+ return try_enter_critical_section (*(CRITICAL_SECTION **)mutex);
+}
+
+static void
+g_mutex_unlock_win32_cs_impl (GMutex *mutex)
+{
+ LeaveCriticalSection (*(CRITICAL_SECTION **)mutex);
+}
+
+static GMutex *
+g_mutex_new_win32_impl (void)
+{
+ HANDLE handle;
+ HANDLE *retval;
+ win32_check_for_error (handle = CreateMutex (NULL, FALSE, NULL));
+ retval = g_new (HANDLE, 1);
+ *retval = handle;
+ return (GMutex *) retval;
+}
+
+static void
+g_mutex_free_win32_impl (GMutex *mutex)
+{
+ win32_check_for_error (CloseHandle (*(HANDLE *) mutex));
+ g_free (mutex);
+}
+
+/* NOTE: the functions g_mutex_lock and g_mutex_unlock may not use
+ functions from gmem.c and gmessages.c; */
+
+static void
+g_mutex_lock_win32_impl (GMutex *mutex)
+{
+ WaitForSingleObject (*(HANDLE *) mutex, INFINITE);
+}
+
+static gboolean
+g_mutex_trylock_win32_impl (GMutex * mutex)
+{
+ DWORD result;
+ win32_check_for_error (WAIT_FAILED !=
+ (result = WaitForSingleObject (*(HANDLE *)mutex, 0)));
+ return result != WAIT_TIMEOUT;
+}
+
+static void
+g_mutex_unlock_win32_impl (GMutex *mutex)
+{
+ ReleaseMutex (*(HANDLE *) mutex);
+}
+
+static GCond *
+g_cond_new_win32_impl (void)
+{
+ GCond *retval = g_new (GCond, 1);
+
+ retval->array = g_ptr_array_new ();
+ InitializeCriticalSection (&retval->lock);
+
+ return retval;
+}
+
+static void
+g_cond_signal_win32_impl (GCond * cond)
+{
+ EnterCriticalSection (&cond->lock);
+
+ if (cond->array->len > 0)
+ {
+ SetEvent (g_ptr_array_index (cond->array, 0));
+ g_ptr_array_remove_index (cond->array, 0);
+ }
+
+ LeaveCriticalSection (&cond->lock);
+}
+
+static void
+g_cond_broadcast_win32_impl (GCond * cond)
+{
+ guint i;
+ EnterCriticalSection (&cond->lock);
+
+ for (i = 0; i < cond->array->len; i++)
+ SetEvent (g_ptr_array_index (cond->array, i));
+
+ g_ptr_array_set_size (cond->array, 0);
+ LeaveCriticalSection (&cond->lock);
+}
+
+static gboolean
+g_cond_wait_internal (GCond *cond,
+ GMutex *entered_mutex,
+ gulong milliseconds)
+{
+ gulong retval;
+ HANDLE event = TlsGetValue (g_cond_event_tls);
+
+ if (!event)
+ {
+ win32_check_for_error (event = CreateEvent (0, FALSE, FALSE, NULL));
+ TlsSetValue (g_cond_event_tls, event);
+ }
+
+ EnterCriticalSection (&cond->lock);
+
+ /* The event must not be signaled. Check this */
+ g_assert (WaitForSingleObject (event, 0) == WAIT_TIMEOUT);
+
+ g_ptr_array_add (cond->array, event);
+ LeaveCriticalSection (&cond->lock);
+
+ g_thread_functions_for_glib_use_default.mutex_unlock (entered_mutex);
+
+ win32_check_for_error (WAIT_FAILED !=
+ (retval = WaitForSingleObject (event, milliseconds)));
+
+ g_thread_functions_for_glib_use_default.mutex_lock (entered_mutex);
+
+ if (retval == WAIT_TIMEOUT)
+ {
+ EnterCriticalSection (&cond->lock);
+ g_ptr_array_remove (cond->array, event);
+
+ /* In the meantime we could have been signaled, so we must again
+ * wait for the signal, this time with no timeout, to reset
+ * it. retval is set again to honour the late arrival of the
+ * signal */
+ win32_check_for_error (WAIT_FAILED !=
+ (retval = WaitForSingleObject (event, 0)));
+
+ LeaveCriticalSection (&cond->lock);
+ }
+
+#ifndef G_DISABLE_ASSERT
+ EnterCriticalSection (&cond->lock);
+
+ /* Now event must not be inside the array, check this */
+ g_assert (g_ptr_array_remove (cond->array, event) == FALSE);
+
+ LeaveCriticalSection (&cond->lock);
+#endif /* !G_DISABLE_ASSERT */
+
+ return retval != WAIT_TIMEOUT;
+}
+
+static void
+g_cond_wait_win32_impl (GCond *cond,
+ GMutex *entered_mutex)
+{
+ g_return_if_fail (cond != NULL);
+ g_return_if_fail (entered_mutex != NULL);
+
+ g_cond_wait_internal (cond, entered_mutex, INFINITE);
+}
+
+static gboolean
+g_cond_timed_wait_win32_impl (GCond *cond,
+ GMutex *entered_mutex,
+ GTimeVal *abs_time)
+{
+ GTimeVal current_time;
+ gulong to_wait;
+
+ g_return_val_if_fail (cond != NULL, FALSE);
+ g_return_val_if_fail (entered_mutex != NULL, FALSE);
+
+ if (!abs_time)
+ to_wait = INFINITE;
+ else
+ {
+ g_get_current_time (&current_time);
+ if (abs_time->tv_sec < current_time.tv_sec ||
+ (abs_time->tv_sec == current_time.tv_sec &&
+ abs_time->tv_usec <= current_time.tv_usec))
+ to_wait = 0;
+ else
+ to_wait = (abs_time->tv_sec - current_time.tv_sec) * 1000 +
+ (abs_time->tv_usec - current_time.tv_usec) / 1000;
+ }
+
+ return g_cond_wait_internal (cond, entered_mutex, to_wait);
+}
+
+static void
+g_cond_free_win32_impl (GCond * cond)
+{
+ DeleteCriticalSection (&cond->lock);
+ g_ptr_array_free (cond->array, TRUE);
+ g_free (cond);
+}
+
+static GPrivate *
+g_private_new_win32_impl (GDestroyNotify destructor)
+{
+ GPrivate *result;
+ EnterCriticalSection (&g_thread_global_spinlock);
+ if (g_private_next >= G_PRIVATE_MAX)
+ {
+ char buf[100];
+ sprintf (buf,
+ "Too many GPrivate allocated. Their number is limited to %d.",
+ G_PRIVATE_MAX);
+ MessageBox (NULL, buf, NULL, MB_ICONERROR|MB_SETFOREGROUND);
+ if (IsDebuggerPresent ())
+ G_BREAKPOINT ();
+ abort ();
+ }
+ g_private_destructors[g_private_next] = destructor;
+ result = GUINT_TO_POINTER (g_private_next);
+ g_private_next++;
+ LeaveCriticalSection (&g_thread_global_spinlock);
+
+ return result;
+}
+
+/* NOTE: the functions g_private_get and g_private_set may not use
+ functions from gmem.c and gmessages.c */
+
+static void
+g_private_set_win32_impl (GPrivate * private_key, gpointer value)
+{
+ gpointer* array = TlsGetValue (g_private_tls);
+ guint index = GPOINTER_TO_UINT (private_key);
+
+ if (index >= G_PRIVATE_MAX)
+ return;
+
+ if (!array)
+ {
+ array = (gpointer*) calloc (G_PRIVATE_MAX, sizeof (gpointer));
+ TlsSetValue (g_private_tls, array);
+ }
+
+ array[index] = value;
+}
+
+static gpointer
+g_private_get_win32_impl (GPrivate * private_key)
+{
+ gpointer* array = TlsGetValue (g_private_tls);
+ guint index = GPOINTER_TO_UINT (private_key);
+
+ if (index >= G_PRIVATE_MAX || !array)
+ return NULL;
+
+ return array[index];
+}
+
+static void
+g_thread_set_priority_win32_impl (gpointer thread, GThreadPriority priority)
+{
+ GThreadData *target = *(GThreadData **)thread;
+
+ g_return_if_fail (priority >= G_THREAD_PRIORITY_LOW);
+ g_return_if_fail (priority <= G_THREAD_PRIORITY_URGENT);
+
+ win32_check_for_error (SetThreadPriority (target->thread,
+ g_thread_priority_map [priority]));
+}
+
+static void
+g_thread_self_win32_impl (gpointer thread)
+{
+ GThreadData *self = TlsGetValue (g_thread_self_tls);
+
+ if (!self)
+ {
+ /* This should only happen for the main thread! */
+ HANDLE handle = GetCurrentThread ();
+ HANDLE process = GetCurrentProcess ();
+ self = g_new (GThreadData, 1);
+ win32_check_for_error (DuplicateHandle (process, handle, process,
+ &self->thread, 0, FALSE,
+ DUPLICATE_SAME_ACCESS));
+ win32_check_for_error (TlsSetValue (g_thread_self_tls, self));
+ self->func = NULL;
+ self->data = NULL;
+ self->joinable = FALSE;
+ }
+
+ *(GThreadData **)thread = self;
+}
+
+static void
+g_thread_exit_win32_impl (void)
+{
+ GThreadData *self = TlsGetValue (g_thread_self_tls);
+ guint i, private_max;
+ gpointer *array = TlsGetValue (g_private_tls);
+ HANDLE event = TlsGetValue (g_cond_event_tls);
+
+ EnterCriticalSection (&g_thread_global_spinlock);
+ private_max = g_private_next;
+ LeaveCriticalSection (&g_thread_global_spinlock);
+
+ if (array)
+ {
+ gboolean some_data_non_null;
+
+ do {
+ some_data_non_null = FALSE;
+ for (i = 0; i < private_max; i++)
+ {
+ GDestroyNotify destructor = g_private_destructors[i];
+ GDestroyNotify data = array[i];
+
+ if (data)
+ some_data_non_null = TRUE;
+
+ array[i] = NULL;
+
+ if (destructor && data)
+ destructor (data);
+ }
+ } while (some_data_non_null);
+
+ free (array);
+
+ win32_check_for_error (TlsSetValue (g_private_tls, NULL));
+ }
+
+ if (self)
+ {
+ if (!self->joinable)
+ {
+ win32_check_for_error (CloseHandle (self->thread));
+ g_free (self);
+ }
+ win32_check_for_error (TlsSetValue (g_thread_self_tls, NULL));
+ }
+
+ if (event)
+ {
+ CloseHandle (event);
+ win32_check_for_error (TlsSetValue (g_cond_event_tls, NULL));
+ }
+
+ _endthreadex (0);
+}
+
+static guint __stdcall
+g_thread_proxy (gpointer data)
+{
+ GThreadData *self = (GThreadData*) data;
+
+ win32_check_for_error (TlsSetValue (g_thread_self_tls, self));
+
+ self->func (self->data);
+
+ g_thread_exit_win32_impl ();
+
+ g_assert_not_reached ();
+
+ return 0;
+}
+
+static void
+g_thread_create_win32_impl (GThreadFunc func,
+ gpointer data,
+ gulong stack_size,
+ gboolean joinable,
+ gboolean bound,
+ GThreadPriority priority,
+ gpointer thread,
+ GError **error)
+{
+ guint ignore;
+ GThreadData *retval;
+
+ g_return_if_fail (func);
+ g_return_if_fail (priority >= G_THREAD_PRIORITY_LOW);
+ g_return_if_fail (priority <= G_THREAD_PRIORITY_URGENT);
+
+ retval = g_new(GThreadData, 1);
+ retval->func = func;
+ retval->data = data;
+
+ retval->joinable = joinable;
+
+ retval->thread = (HANDLE) _beginthreadex (NULL, stack_size, g_thread_proxy,
+ retval, 0, &ignore);
+
+ if (retval->thread == NULL)
+ {
+ gchar *win_error = g_win32_error_message (GetLastError ());
+ g_set_error (error, G_THREAD_ERROR, G_THREAD_ERROR_AGAIN,
+ "Error creating thread: %s", win_error);
+ g_free (retval);
+ g_free (win_error);
+ return;
+ }
+
+ *(GThreadData **)thread = retval;
+
+ g_thread_set_priority_win32_impl (thread, priority);
+}
+
+static void
+g_thread_yield_win32_impl (void)
+{
+ Sleep(0);
+}
+
+static void
+g_thread_join_win32_impl (gpointer thread)
+{
+ GThreadData *target = *(GThreadData **)thread;
+
+ g_return_if_fail (target->joinable);
+
+ win32_check_for_error (WAIT_FAILED !=
+ WaitForSingleObject (target->thread, INFINITE));
+
+ win32_check_for_error (CloseHandle (target->thread));
+ g_free (target);
+}
+
+static guint64
+g_thread_gettime_impl (void)
+{
+ guint64 v;
+
+ /* Returns 100s of nanoseconds since start of 1601 */
+ GetSystemTimeAsFileTime ((FILETIME *)&v);
+
+ /* Offset to Unix epoch */
+ v -= G_GINT64_CONSTANT (116444736000000000);
+ /* Convert to nanoseconds */
+ v *= 100;
+
+ return v;
+}
+
+static GThreadFunctions g_thread_functions_for_glib_use_default =
+{
+ g_mutex_new_win32_impl, /* mutex */
+ g_mutex_lock_win32_impl,
+ g_mutex_trylock_win32_impl,
+ g_mutex_unlock_win32_impl,
+ g_mutex_free_win32_impl,
+ g_cond_new_win32_impl, /* condition */
+ g_cond_signal_win32_impl,
+ g_cond_broadcast_win32_impl,
+ g_cond_wait_win32_impl,
+ g_cond_timed_wait_win32_impl,
+ g_cond_free_win32_impl,
+ g_private_new_win32_impl, /* private thread data */
+ g_private_get_win32_impl,
+ g_private_set_win32_impl,
+ g_thread_create_win32_impl, /* thread */
+ g_thread_yield_win32_impl,
+ g_thread_join_win32_impl,
+ g_thread_exit_win32_impl,
+ g_thread_set_priority_win32_impl,
+ g_thread_self_win32_impl,
+ NULL /* no equal function necessary */
+};
+
+#define HAVE_G_THREAD_IMPL_INIT
+static void
+g_thread_impl_init ()
+{
+ static gboolean beenhere = FALSE;
+ HMODULE kernel32;
+
+ if (beenhere)
+ return;
+
+ beenhere = TRUE;
+
+ win32_check_for_error (TLS_OUT_OF_INDEXES !=
+ (g_thread_self_tls = TlsAlloc ()));
+ win32_check_for_error (TLS_OUT_OF_INDEXES !=
+ (g_private_tls = TlsAlloc ()));
+ win32_check_for_error (TLS_OUT_OF_INDEXES !=
+ (g_cond_event_tls = TlsAlloc ()));
+ InitializeCriticalSection (&g_thread_global_spinlock);
+
+ /* Here we are looking for TryEnterCriticalSection in KERNEL32.DLL,
+ * if it is found, we can use the in general faster critical
+ * sections instead of mutexes. See
+ * http://world.std.com/~jmhart/csmutx.htm for some discussion.
+ */
+ kernel32 = GetModuleHandle ("KERNEL32.DLL");
+ if (kernel32)
+ {
+ try_enter_critical_section = (GTryEnterCriticalSectionFunc)
+ GetProcAddress(kernel32, "TryEnterCriticalSection");
+
+ /* Even if TryEnterCriticalSection is found, it is not
+ * necessarily working..., we have to check it */
+ if (try_enter_critical_section &&
+ try_enter_critical_section (&g_thread_global_spinlock))
+ {
+ LeaveCriticalSection (&g_thread_global_spinlock);
+
+ g_thread_functions_for_glib_use_default.mutex_new =
+ g_mutex_new_win32_cs_impl;
+ g_thread_functions_for_glib_use_default.mutex_lock =
+ g_mutex_lock_win32_cs_impl;
+ g_thread_functions_for_glib_use_default.mutex_trylock =
+ g_mutex_trylock_win32_cs_impl;
+ g_thread_functions_for_glib_use_default.mutex_unlock =
+ g_mutex_unlock_win32_cs_impl;
+ g_thread_functions_for_glib_use_default.mutex_free =
+ g_mutex_free_win32_cs_impl;
+ }
+ }
+}
diff --git a/trunk/gthread/gthread.def b/trunk/gthread/gthread.def
new file mode 100644
index 000000000..200b04346
--- /dev/null
+++ b/trunk/gthread/gthread.def
@@ -0,0 +1,3 @@
+EXPORTS
+ g_thread_init
+ g_thread_init_with_errorcheck_mutexes
diff --git a/trunk/gthread/gthread.rc.in b/trunk/gthread/gthread.rc.in
new file mode 100644
index 000000000..b70f87104
--- /dev/null
+++ b/trunk/gthread/gthread.rc.in
@@ -0,0 +1,30 @@
+#include <winver.h>
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0
+ PRODUCTVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0
+ FILEFLAGSMASK 0
+ FILEFLAGS 0
+ FILEOS VOS__WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE VFT2_UNKNOWN
+ BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "CompanyName", "The GLib developer community"
+ VALUE "FileDescription", "GThread"
+ VALUE "FileVersion", "@GLIB_VERSION@.0"
+ VALUE "InternalName", "libgthread-2.0-@LT_CURRENT_MINUS_AGE@"
+ VALUE "LegalCopyright", "Copyright 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald. Copyright 1998 Sebastian Wilhelmi. Modified by the GLib Team and others 1997-2004."
+ VALUE "OriginalFilename", "libgthread-2.0-@LT_CURRENT_MINUS_AGE@.dll"
+ VALUE "ProductName", "GLib"
+ VALUE "ProductVersion", "@GLIB_VERSION@"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+ END
diff --git a/trunk/gthread/makefile.msc.in b/trunk/gthread/makefile.msc.in
new file mode 100644
index 000000000..226bf9cd8
--- /dev/null
+++ b/trunk/gthread/makefile.msc.in
@@ -0,0 +1,26 @@
+## Makefile for building the gthread dll with Microsoft C
+## Use: nmake -f makefile.msc install
+
+TOP = ..\..
+
+!INCLUDE ..\build\win32\make.msc
+
+################################################################
+
+INCLUDES = -FImsvc_recommended_pragmas.h -I .. -I . -I ..\glib
+DEFINES = -DHAVE_CONFIG_H -DG_LOG_DOMAIN=\"GThread\"
+all : \
+ libgthread-2.0-@LT_CURRENT_MINUS_AGE@.dll
+
+gthread_OBJECTS = \
+ gthread-impl.obj
+
+gthread-impl.obj : gthread-impl.c gthread-win32.c
+ $(CC) -c $(CFLAGS) gthread-impl.c
+
+gthread.res : gthread.rc
+ rc -DBUILDNUMBER=0 -r -fo gthread.res gthread.rc
+
+libgthread-2.0-@LT_CURRENT_MINUS_AGE@.dll : $(gthread_OBJECTS) gthread.def gthread.res
+ $(CC) $(CFLAGS) -LD -Fe$@ $(gthread_OBJECTS) gthread.res \
+ ..\glib\glib-2.0.lib $(DEPCLIBS) user32.lib $(LDFLAGS) /implib:gthread-2.0.lib /def:gthread.def
diff --git a/trunk/m4macros/Makefile.am b/trunk/m4macros/Makefile.am
new file mode 100644
index 000000000..bf2fa8f6a
--- /dev/null
+++ b/trunk/m4macros/Makefile.am
@@ -0,0 +1,7 @@
+
+installed_m4= glib-2.0.m4 glib-gettext.m4
+
+EXTRA_DIST=$(installed_m4)
+
+m4datadir = $(datadir)/aclocal
+m4data_DATA = $(installed_m4)
diff --git a/trunk/m4macros/glib-2.0.m4 b/trunk/m4macros/glib-2.0.m4
new file mode 100644
index 000000000..2a5afd0c0
--- /dev/null
+++ b/trunk/m4macros/glib-2.0.m4
@@ -0,0 +1,208 @@
+# Configure paths for GLIB
+# Owen Taylor 1997-2001
+
+dnl AM_PATH_GLIB_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if gmodule, gobject or
+dnl gthread is specified in MODULES, pass to pkg-config
+dnl
+AC_DEFUN([AM_PATH_GLIB_2_0],
+[dnl
+dnl Get the cflags and libraries from pkg-config
+dnl
+AC_ARG_ENABLE(glibtest, [ --disable-glibtest do not try to compile and run a test GLIB program],
+ , enable_glibtest=yes)
+
+ pkg_config_args=glib-2.0
+ for module in . $4
+ do
+ case "$module" in
+ gmodule)
+ pkg_config_args="$pkg_config_args gmodule-2.0"
+ ;;
+ gmodule-no-export)
+ pkg_config_args="$pkg_config_args gmodule-no-export-2.0"
+ ;;
+ gobject)
+ pkg_config_args="$pkg_config_args gobject-2.0"
+ ;;
+ gthread)
+ pkg_config_args="$pkg_config_args gthread-2.0"
+ ;;
+ esac
+ done
+
+ PKG_PROG_PKG_CONFIG([0.7])
+
+ no_glib=""
+
+ if test "x$PKG_CONFIG" = x ; then
+ no_glib=yes
+ PKG_CONFIG=no
+ fi
+
+ min_glib_version=ifelse([$1], ,2.0.0,$1)
+ AC_MSG_CHECKING(for GLIB - version >= $min_glib_version)
+
+ if test x$PKG_CONFIG != xno ; then
+ ## don't try to run the test against uninstalled libtool libs
+ if $PKG_CONFIG --uninstalled $pkg_config_args; then
+ echo "Will use uninstalled version of GLib found in PKG_CONFIG_PATH"
+ enable_glibtest=no
+ fi
+
+ if $PKG_CONFIG --atleast-version $min_glib_version $pkg_config_args; then
+ :
+ else
+ no_glib=yes
+ fi
+ fi
+
+ if test x"$no_glib" = x ; then
+ GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0`
+ GOBJECT_QUERY=`$PKG_CONFIG --variable=gobject_query glib-2.0`
+ GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
+
+ GLIB_CFLAGS=`$PKG_CONFIG --cflags $pkg_config_args`
+ GLIB_LIBS=`$PKG_CONFIG --libs $pkg_config_args`
+ glib_config_major_version=`$PKG_CONFIG --modversion glib-2.0 | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+ glib_config_minor_version=`$PKG_CONFIG --modversion glib-2.0 | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+ glib_config_micro_version=`$PKG_CONFIG --modversion glib-2.0 | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+ if test "x$enable_glibtest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $GLIB_CFLAGS"
+ LIBS="$GLIB_LIBS $LIBS"
+dnl
+dnl Now check if the installed GLIB is sufficiently new. (Also sanity
+dnl checks the results of pkg-config to some extent)
+dnl
+ rm -f conf.glibtest
+ AC_TRY_RUN([
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+ int major, minor, micro;
+ char *tmp_version;
+
+ system ("touch conf.glibtest");
+
+ /* HP/UX 9 (%@#!) writes to sscanf strings */
+ tmp_version = g_strdup("$min_glib_version");
+ if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+ printf("%s, bad version string\n", "$min_glib_version");
+ exit(1);
+ }
+
+ if ((glib_major_version != $glib_config_major_version) ||
+ (glib_minor_version != $glib_config_minor_version) ||
+ (glib_micro_version != $glib_config_micro_version))
+ {
+ printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n",
+ $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version,
+ glib_major_version, glib_minor_version, glib_micro_version);
+ printf ("*** was found! If pkg-config was correct, then it is best\n");
+ printf ("*** to remove the old version of GLib. You may also be able to fix the error\n");
+ printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+ printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+ printf("*** required on your system.\n");
+ printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
+ printf("*** to point to the correct configuration files\n");
+ }
+ else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
+ (glib_minor_version != GLIB_MINOR_VERSION) ||
+ (glib_micro_version != GLIB_MICRO_VERSION))
+ {
+ printf("*** GLIB header files (version %d.%d.%d) do not match\n",
+ GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
+ printf("*** library (version %d.%d.%d)\n",
+ glib_major_version, glib_minor_version, glib_micro_version);
+ }
+ else
+ {
+ if ((glib_major_version > major) ||
+ ((glib_major_version == major) && (glib_minor_version > minor)) ||
+ ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro)))
+ {
+ return 0;
+ }
+ else
+ {
+ printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n",
+ glib_major_version, glib_minor_version, glib_micro_version);
+ printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n",
+ major, minor, micro);
+ printf("*** GLIB is always available from ftp://ftp.gtk.org.\n");
+ printf("***\n");
+ printf("*** If you have already installed a sufficiently new version, this error\n");
+ printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
+ printf("*** being found. The easiest way to fix this is to remove the old version\n");
+ printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n");
+ printf("*** correct copy of pkg-config. (In this case, you will have to\n");
+ printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+ printf("*** so that the correct libraries are found at run-time))\n");
+ }
+ }
+ return 1;
+}
+],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ if test "x$no_glib" = x ; then
+ AC_MSG_RESULT(yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version))
+ ifelse([$2], , :, [$2])
+ else
+ AC_MSG_RESULT(no)
+ if test "$PKG_CONFIG" = "no" ; then
+ echo "*** A new enough version of pkg-config was not found."
+ echo "*** See http://www.freedesktop.org/software/pkgconfig/"
+ else
+ if test -f conf.glibtest ; then
+ :
+ else
+ echo "*** Could not run GLIB test program, checking why..."
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $GLIB_CFLAGS"
+ LIBS="$LIBS $GLIB_LIBS"
+ AC_TRY_LINK([
+#include <glib.h>
+#include <stdio.h>
+], [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ],
+ [ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding GLIB or finding the wrong"
+ echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ],
+ [ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means GLIB is incorrectly installed."])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ GLIB_CFLAGS=""
+ GLIB_LIBS=""
+ GLIB_GENMARSHAL=""
+ GOBJECT_QUERY=""
+ GLIB_MKENUMS=""
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(GLIB_CFLAGS)
+ AC_SUBST(GLIB_LIBS)
+ AC_SUBST(GLIB_GENMARSHAL)
+ AC_SUBST(GOBJECT_QUERY)
+ AC_SUBST(GLIB_MKENUMS)
+ rm -f conf.glibtest
+])
diff --git a/trunk/m4macros/glib-gettext.m4 b/trunk/m4macros/glib-gettext.m4
new file mode 100644
index 000000000..71041a1e0
--- /dev/null
+++ b/trunk/m4macros/glib-gettext.m4
@@ -0,0 +1,433 @@
+# Copyright (C) 1995-2002 Free Software Foundation, Inc.
+# Copyright (C) 2001-2003,2004 Red Hat, Inc.
+#
+# This file is free software, distributed under the terms of the GNU
+# General Public License. As a special exception to the GNU General
+# Public License, this file may be distributed as part of a program
+# that contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# This file can be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+#
+# Macro to add for using GNU gettext.
+# Ulrich Drepper <drepper@cygnus.com>, 1995, 1996
+#
+# Modified to never use included libintl.
+# Owen Taylor <otaylor@redhat.com>, 12/15/1998
+#
+# Major rework to remove unused code
+# Owen Taylor <otaylor@redhat.com>, 12/11/2002
+#
+# Added better handling of ALL_LINGUAS from GNU gettext version
+# written by Bruno Haible, Owen Taylor <otaylor.redhat.com> 5/30/3002
+#
+# Modified to require ngettext
+# Matthias Clasen <mclasen@redhat.com> 08/06/2004
+#
+# We need this here as well, since someone might use autoconf-2.5x
+# to configure GLib then an older version to configure a package
+# using AM_GLIB_GNU_GETTEXT
+AC_PREREQ(2.53)
+
+dnl
+dnl We go to great lengths to make sure that aclocal won't
+dnl try to pull in the installed version of these macros
+dnl when running aclocal in the glib directory.
+dnl
+m4_copy([AC_DEFUN],[glib_DEFUN])
+m4_copy([AC_REQUIRE],[glib_REQUIRE])
+dnl
+dnl At the end, if we're not within glib, we'll define the public
+dnl definitions in terms of our private definitions.
+dnl
+
+# GLIB_LC_MESSAGES
+#--------------------
+glib_DEFUN([GLIB_LC_MESSAGES],
+ [AC_CHECK_HEADERS([locale.h])
+ if test $ac_cv_header_locale_h = yes; then
+ AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+ [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+ am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+ if test $am_cv_val_LC_MESSAGES = yes; then
+ AC_DEFINE(HAVE_LC_MESSAGES, 1,
+ [Define if your <locale.h> file defines LC_MESSAGES.])
+ fi
+ fi])
+
+# GLIB_PATH_PROG_WITH_TEST
+#----------------------------
+dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+glib_DEFUN([GLIB_PATH_PROG_WITH_TEST],
+[# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+ /*)
+ ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in ifelse([$5], , $PATH, [$5]); do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+ ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+ AC_MSG_RESULT([$]$1)
+else
+ AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
+
+# GLIB_WITH_NLS
+#-----------------
+glib_DEFUN([GLIB_WITH_NLS],
+ dnl NLS is obligatory
+ [AC_REQUIRE([AC_CANONICAL_HOST])dnl
+ USE_NLS=yes
+ AC_SUBST(USE_NLS)
+
+ gt_cv_have_gettext=no
+
+ CATOBJEXT=NONE
+ XGETTEXT=:
+ INTLLIBS=
+
+ AC_CHECK_HEADER(libintl.h,
+ [gt_cv_func_dgettext_libintl="no"
+ libintl_extra_libs=""
+
+ #
+ # First check in libc
+ #
+ AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc,
+ [AC_TRY_LINK([
+#include <libintl.h>
+],
+ [return !ngettext ("","", 1)],
+ gt_cv_func_ngettext_libc=yes,
+ gt_cv_func_ngettext_libc=no)
+ ])
+
+ if test "$gt_cv_func_ngettext_libc" = "yes" ; then
+ AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc,
+ [AC_TRY_LINK([
+#include <libintl.h>
+],
+ [return !dgettext ("","")],
+ gt_cv_func_dgettext_libc=yes,
+ gt_cv_func_dgettext_libc=no)
+ ])
+ fi
+
+ if test "$gt_cv_func_ngettext_libc" = "yes" ; then
+ AC_CHECK_FUNCS(bind_textdomain_codeset)
+ fi
+
+ #
+ # If we don't have everything we want, check in libintl
+ #
+ if test "$gt_cv_func_dgettext_libc" != "yes" \
+ || test "$gt_cv_func_ngettext_libc" != "yes" \
+ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then
+
+ AC_CHECK_LIB(intl, bindtextdomain,
+ [AC_CHECK_LIB(intl, ngettext,
+ [AC_CHECK_LIB(intl, dgettext,
+ gt_cv_func_dgettext_libintl=yes)])])
+
+ if test "$gt_cv_func_dgettext_libintl" != "yes" ; then
+ AC_MSG_CHECKING([if -liconv is needed to use gettext])
+ AC_MSG_RESULT([])
+ AC_CHECK_LIB(intl, ngettext,
+ [AC_CHECK_LIB(intl, dcgettext,
+ [gt_cv_func_dgettext_libintl=yes
+ libintl_extra_libs=-liconv],
+ :,-liconv)],
+ :,-liconv)
+ fi
+
+ #
+ # If we found libintl, then check in it for bind_textdomain_codeset();
+ # we'll prefer libc if neither have bind_textdomain_codeset(),
+ # and both have dgettext and ngettext
+ #
+ if test "$gt_cv_func_dgettext_libintl" = "yes" ; then
+ glib_save_LIBS="$LIBS"
+ LIBS="$LIBS -lintl $libintl_extra_libs"
+ unset ac_cv_func_bind_textdomain_codeset
+ AC_CHECK_FUNCS(bind_textdomain_codeset)
+ LIBS="$glib_save_LIBS"
+
+ if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then
+ gt_cv_func_dgettext_libc=no
+ else
+ if test "$gt_cv_func_dgettext_libc" = "yes" \
+ && test "$gt_cv_func_ngettext_libc" = "yes"; then
+ gt_cv_func_dgettext_libintl=no
+ fi
+ fi
+ fi
+ fi
+
+ if test "$gt_cv_func_dgettext_libc" = "yes" \
+ || test "$gt_cv_func_dgettext_libintl" = "yes"; then
+ gt_cv_have_gettext=yes
+ fi
+
+ if test "$gt_cv_func_dgettext_libintl" = "yes"; then
+ INTLLIBS="-lintl $libintl_extra_libs"
+ fi
+
+ if test "$gt_cv_have_gettext" = "yes"; then
+ AC_DEFINE(HAVE_GETTEXT,1,
+ [Define if the GNU gettext() function is already present or preinstalled.])
+ GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
+ if test "$MSGFMT" != "no"; then
+ glib_save_LIBS="$LIBS"
+ LIBS="$LIBS $INTLLIBS"
+ AC_CHECK_FUNCS(dcgettext)
+ MSGFMT_OPTS=
+ AC_MSG_CHECKING([if msgfmt accepts -c])
+ GLIB_RUN_PROG([msgfmt -c -o /dev/null],[
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: test 1.0\n"
+"PO-Revision-Date: 2007-02-15 12:01+0100\n"
+"Last-Translator: test <foo@bar.xx>\n"
+"Language-Team: C <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])])
+ AC_SUBST(MSGFMT_OPTS)
+ AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+ GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
+ AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
+ return _nl_msg_cat_cntr],
+ [CATOBJEXT=.gmo
+ DATADIRNAME=share],
+ [case $host in
+ *-*-solaris*)
+ dnl On Solaris, if bind_textdomain_codeset is in libc,
+ dnl GNU format message catalog is always supported,
+ dnl since both are added to the libc all together.
+ dnl Hence, we'd like to go with DATADIRNAME=share and
+ dnl and CATOBJEXT=.gmo in this case.
+ AC_CHECK_FUNC(bind_textdomain_codeset,
+ [CATOBJEXT=.gmo
+ DATADIRNAME=share],
+ [CATOBJEXT=.mo
+ DATADIRNAME=lib])
+ ;;
+ *)
+ CATOBJEXT=.mo
+ DATADIRNAME=lib
+ ;;
+ esac])
+ LIBS="$glib_save_LIBS"
+ INSTOBJEXT=.mo
+ else
+ gt_cv_have_gettext=no
+ fi
+ fi
+ ])
+
+ if test "$gt_cv_have_gettext" = "yes" ; then
+ AC_DEFINE(ENABLE_NLS, 1,
+ [always defined to indicate that i18n is enabled])
+ fi
+
+ dnl Test whether we really found GNU xgettext.
+ if test "$XGETTEXT" != ":"; then
+ dnl If it is not GNU xgettext we define it as : so that the
+ dnl Makefiles still can work.
+ if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+ : ;
+ else
+ AC_MSG_RESULT(
+ [found xgettext program is not GNU xgettext; ignore it])
+ XGETTEXT=":"
+ fi
+ fi
+
+ # We need to process the po/ directory.
+ POSUB=po
+
+ AC_OUTPUT_COMMANDS(
+ [case "$CONFIG_FILES" in *po/Makefile.in*)
+ sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
+ esac])
+
+ dnl These rules are solely for the distribution goal. While doing this
+ dnl we only have to keep exactly one list of the available catalogs
+ dnl in configure.in.
+ for lang in $ALL_LINGUAS; do
+ GMOFILES="$GMOFILES $lang.gmo"
+ POFILES="$POFILES $lang.po"
+ done
+
+ dnl Make all variables we use known to autoconf.
+ AC_SUBST(CATALOGS)
+ AC_SUBST(CATOBJEXT)
+ AC_SUBST(DATADIRNAME)
+ AC_SUBST(GMOFILES)
+ AC_SUBST(INSTOBJEXT)
+ AC_SUBST(INTLLIBS)
+ AC_SUBST(PO_IN_DATADIR_TRUE)
+ AC_SUBST(PO_IN_DATADIR_FALSE)
+ AC_SUBST(POFILES)
+ AC_SUBST(POSUB)
+ ])
+
+# AM_GLIB_GNU_GETTEXT
+# -------------------
+# Do checks necessary for use of gettext. If a suitable implementation
+# of gettext is found in either in libintl or in the C library,
+# it will set INTLLIBS to the libraries needed for use of gettext
+# and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable
+# gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST()
+# on various variables needed by the Makefile.in.in installed by
+# glib-gettextize.
+dnl
+glib_DEFUN([GLIB_GNU_GETTEXT],
+ [AC_REQUIRE([AC_PROG_CC])dnl
+ AC_REQUIRE([AC_HEADER_STDC])dnl
+
+ GLIB_LC_MESSAGES
+ GLIB_WITH_NLS
+
+ if test "$gt_cv_have_gettext" = "yes"; then
+ if test "x$ALL_LINGUAS" = "x"; then
+ LINGUAS=
+ else
+ AC_MSG_CHECKING(for catalogs to be installed)
+ NEW_LINGUAS=
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ NEW_LINGUAS="$NEW_LINGUAS $presentlang"
+ fi
+ done
+ LINGUAS=$NEW_LINGUAS
+ AC_MSG_RESULT($LINGUAS)
+ fi
+
+ dnl Construct list of names of catalog files to be constructed.
+ if test -n "$LINGUAS"; then
+ for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+ fi
+ fi
+
+ dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
+ dnl find the mkinstalldirs script in another subdir but ($top_srcdir).
+ dnl Try to locate is.
+ MKINSTALLDIRS=
+ if test -n "$ac_aux_dir"; then
+ MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+ fi
+ if test -z "$MKINSTALLDIRS"; then
+ MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+ fi
+ AC_SUBST(MKINSTALLDIRS)
+
+ dnl Generate list of files to be processed by xgettext which will
+ dnl be included in po/Makefile.
+ test -d po || mkdir po
+ if test "x$srcdir" != "x."; then
+ if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
+ posrcprefix="$srcdir/"
+ else
+ posrcprefix="../$srcdir/"
+ fi
+ else
+ posrcprefix="../"
+ fi
+ rm -f po/POTFILES
+ sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
+ < $srcdir/po/POTFILES.in > po/POTFILES
+ ])
+
+# AM_GLIB_DEFINE_LOCALEDIR(VARIABLE)
+# -------------------------------
+# Define VARIABLE to the location where catalog files will
+# be installed by po/Makefile.
+glib_DEFUN([GLIB_DEFINE_LOCALEDIR],
+[glib_REQUIRE([GLIB_GNU_GETTEXT])dnl
+glib_save_prefix="$prefix"
+glib_save_exec_prefix="$exec_prefix"
+glib_save_datarootdir="$datarootdir"
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+test "x$exec_prefix" = xNONE && exec_prefix=$prefix
+datarootdir=`eval echo "${datarootdir}"`
+if test "x$CATOBJEXT" = "x.mo" ; then
+ localedir=`eval echo "${libdir}/locale"`
+else
+ localedir=`eval echo "${datadir}/locale"`
+fi
+prefix="$glib_save_prefix"
+exec_prefix="$glib_save_exec_prefix"
+datarootdir="$glib_save_datarootdir"
+AC_DEFINE_UNQUOTED($1, "$localedir",
+ [Define the location where the catalogs will be installed])
+])
+
+dnl
+dnl Now the definitions that aclocal will find
+dnl
+ifdef(glib_configure_in,[],[
+AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)])
+AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)])
+])dnl
+
+# GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL])
+#
+# Create a temporary file with TEST-FILE as its contents and pass the
+# file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with
+# 0 and perform ACTION-IF-FAIL for any other exit status.
+AC_DEFUN([GLIB_RUN_PROG],
+[cat >conftest.foo <<_ACEOF
+$2
+_ACEOF
+if AC_RUN_LOG([$1 conftest.foo]); then
+ m4_ifval([$3], [$3], [:])
+m4_ifvaln([$4], [else $4])dnl
+echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD
+sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD
+fi])
+
diff --git a/trunk/makefile.msc b/trunk/makefile.msc
new file mode 100644
index 000000000..bbb24b85b
--- /dev/null
+++ b/trunk/makefile.msc
@@ -0,0 +1,28 @@
+## Makefile for building the GLib dlls with Microsoft C
+## Use: nmake -f makefile.msc
+
+PARTS = glib gmodule gthread gobject tests
+
+all : \
+ config.h \
+ glibconfig.h \
+ sub-all
+
+sub-all:
+ for %d in ($(PARTS)) do nmake -nologo -f makefile.msc sub-one THIS=%d TARGET=all
+
+clean : sub-clean
+
+sub-clean:
+ for %d in ($(PARTS)) do nmake -nologo -f makefile.msc sub-one THIS=%d TARGET=clean
+
+sub-one:
+ @cd $(THIS)
+ @nmake -nologo -f makefile.msc $(TARGET)
+ @cd ..
+
+config.h: config.h.win32
+ copy config.h.win32 config.h
+
+glibconfig.h: glibconfig.h.win32
+ copy glibconfig.h.win32 glibconfig.h
diff --git a/trunk/msvc_recommended_pragmas.h b/trunk/msvc_recommended_pragmas.h
new file mode 100644
index 000000000..ee34eef4d
--- /dev/null
+++ b/trunk/msvc_recommended_pragmas.h
@@ -0,0 +1,28 @@
+#ifndef _MSC_VER
+#pragma error "This header is for Microsoft VC only."
+#endif /* _MSC_VER */
+
+/* Make MSVC more pedantic, this is a recommended pragma list
+ * from _Win32_Programming_ by Rector and Newcomer.
+ */
+#pragma warning(error:4002) /* too many actual parameters for macro */
+#pragma warning(error:4003) /* not enough actual parameters for macro */
+#pragma warning(1:4010) /* single-line comment contains line-continuation character */
+#pragma warning(error:4013) /* 'function' undefined; assuming extern returning int */
+#pragma warning(1:4016) /* no function return type; using int as default */
+#pragma warning(error:4020) /* too many actual parameters */
+#pragma warning(error:4021) /* too few actual parameters */
+#pragma warning(error:4027) /* function declared without formal parameter list */
+#pragma warning(error:4029) /* declared formal parameter list different from definition */
+#pragma warning(error:4033) /* 'function' must return a value */
+#pragma warning(error:4035) /* 'function' : no return value */
+#pragma warning(error:4045) /* array bounds overflow */
+#pragma warning(error:4047) /* different levels of indirection */
+#pragma warning(error:4049) /* terminating line number emission */
+#pragma warning(error:4053) /* An expression of type void was used as an operand */
+#pragma warning(error:4071) /* no function prototype given */
+#pragma warning(disable:4101) /* unreferenced local variable */
+#pragma warning(error:4150)
+
+#pragma warning(disable:4244) /* No possible loss of data warnings */
+#pragma warning(disable:4305) /* No truncation from int to char warnings */
diff --git a/trunk/po/ChangeLog b/trunk/po/ChangeLog
new file mode 100644
index 000000000..7eb96325e
--- /dev/null
+++ b/trunk/po/ChangeLog
@@ -0,0 +1,2948 @@
+2007-06-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.4 ===
+
+2007-06-04 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.3 ===
+
+2007-06-04 Matthias Clasen <mclasen@redhat.com>
+
+ * nb.po: Comment out one translation that breaks the build
+
+2007-06-04 Kjartan Maraas <kmaraas@gnome.org>
+
+ * nb.po: Updated Norwegian bokmål translation.
+
+2007-05-24 Priit Laes <plaes@svn.gnome.org>
+
+ * et.po: Updated Estonian translation by Ivar Smolin <okul@linux.ee>.
+
+2007-05-22 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.2 ===
+
+2007-05-22 Jorge Gonzalez <jorgegonz@svn.gnome.org>
+
+ * es.po: Updated Spanish translation
+
+2007-05-21 Theppitak Karoonboonyanan <thep@linux.thai.net>
+
+ * th.po: Updated Thai translation.
+
+2007-05-19 Ignacio Casal Quinteiro <nacho.resa@gmail.com>
+
+ * gl.po: Updated Galician Translation.
+
+2007-05-17 Matthias Clasen <mclasen@redhat.com>
+
+ * POTFILES.in: Add gregex.c (#436955, Philip Withnall)
+
+2007-05-17 Theppitak Karoonboonyanan <thep@linux.thai.net>
+
+ * th.po: Updated Thai translation.
+
+2007-05-15 David Lodge <dave@cirt.net>
+
+ * en_GB.po: Updated British English translation
+
+2007-05-15 Subhransu Behera <arya_subhransu@yahoo.co.in>
+
+ * or.po: Updated Oriya Translation.
+
+2007-05-06 Kjartan Maraas <kmaraas@gnome.org>
+
+ * nb.po: Updated Norwegian bokmål translation.
+
+2007-05-06 Ihar Hrachyshka <iharh@gnome.org>
+
+ * be@latin.po: Updated Belarusian Latin translation.
+
+2007-05-03 Jorge Gonzalez <jorgegonz@svn.gnome.org>
+
+ * es.po: Updated Spanish translation
+
+2007-05-03 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.1 ===
+
+2007-05-2 Djihed Afifi <djihed@gmail.com>
+
+ * ar.po: Updated Arabic Translation by Djihed Afifi.
+
+2007-04-15 Funda Wang <fundawang@gmail.com>
+
+ * zh_CN.po: Updated Simplified Chinese translation from Yang Zhang.
+
+2007-03-16 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.13.0 ===
+
+2007-03-11 Goran Rakić <grakic@devbase.net>
+
+ * sr.po, sr@Latn.po: Updated Serbian translation.
+
+2007-03-11 Mugurel Tudor <mugurelu@gnome.ro>
+
+ * ro.po: Updated Romanian translation by
+ Mişu Moldovan <dumol@gnome.ro>
+
+2007-03-08 Alexander Shopov <ash@contact.bg>
+
+ * bg.po: Updated Bulgarian translation by
+ Alexander Shopov <ash@contact.bg>
+
+2007-03-06 Jovan Naumovski <jovan@lugola.net>
+
+ * mk.po: Updated Macedonian translation.
+
+2007-03-03 Thierry Randrianiriana <randrianiriana@gmail.com>
+
+ * mg.po: Added Malagasy translation.
+
+2007-03-01 Ihar Hrachyshka <iharh@gnome.org>
+ * be.po: Added new Belarusian Latin translation.
+
+2007-02-27 Abel Cheung <abelcheung@gmail.com>
+
+ * zh_HK.po, zh_TW.po: Updated traditional Chinese translation by
+ Woodman Tuen <wmtuen@gmail.com>.
+
+2007-02-27 Gintautas Miliauskas <gintas@akl.lt>
+
+ * lt.po: Updated Lithuanian translation.
+
+2007-02-22 Gintautas Miliauskas <gintas@akl.lt>
+
+ * lt.po: Updated Lithuanian translation.
+
+2007-02-17 Kjartan Maraas <kmaraas@gnome.org>
+
+ * nb.po: Updated Norwegian bokmål translation.
+
+2007-01-19 Maxim Dziumanenko <dziumanenko@gmail.com>
+
+ * uk.po: Updated Ukrainian translation.
+
+2007-01-10 Alexander Shopov <ash@contact.bg>
+
+ * bg.po: Updated Bulgarian translation by
+ Alexander Shopov <ash@contact.bg>
+
+2007-01-10 Alexander Shopov <ash@contact.bg>
+
+ * bg.po: Updated Bulgarian translation by
+ Alexander Shopov <ash@contact.bg>
+
+2007-01-09 David Lodge <dave@cirt.net>
+
+ * en_GB.po: Updated English (British) translation
+
+2007-01-08 Luca Ferretti <elle.uca@libero.it>
+
+ * it.po: Updated Italian translation.
+
+2007-01-07 Priit Laes <plaes@svn.gnome.org>
+
+ * et.po: Estonian translation update by Ivar Smolin.
+
+2007-01-05 Jakub Friedl <jfriedl@suse.cz>
+
+ * cs.po: Updated Czech translation.
+
+2007-01-05 Yair Hershkovitz <yairhr@gmail.com>
+
+ * he.po: Updated Hebrew translation.
+
+2007-01-04 Hendrik Richter <hendrikr@gnome.org>
+
+ * de.po: Updated German translation.
+
+2007-01-04 Hendrik Richter <hendrikr@gnome.org>
+
+ * de.po: Updated German translation.
+
+2006-12-28 David Lodge <dave@cirt.net>
+
+ * en_GB.po: Updated English (British) translation
+
+2006-12-17 Matthias Clasen <mclasen@redhat.com>
+
+ * Makefile.in.in: Define datarootdir, to silence autoconf 2.60
+
+2006-12-07 Adam Weinberger <adamw@gnome.org>
+
+ * en_CA.po: Updated Canadian English translation.
+
+2006-10-31 Yair Hershkovitz <yairhr@gmail.com>
+
+ * he.po: Updated Hebrew translation.
+
+2006-10-04 Jakub Friedl <jfriedl@suse.cz>
+
+ * cs.po: Updated Czech translation.
+
+2006-09-09 David Lodge
+
+ * en_GB.po: Updated British English translation.
+
+2006-09-05 Pawan Chitrakar <pchitrakar@gmail.com>
+
+ * ne.po: Updated Nepali Translation
+
+2006-09-04 Roozbeh Pournader <roozbeh@farsiweb.info>
+
+ * fa.po: Updated Persian translation by Meelad Zakaria.
+
+2006-09-04 Mugurel Tudor <mugurelu@gnome.ro>
+
+ * ro.po: Updated Romanian translation by
+ Mişu Moldovan <dumol@gnome.ro>
+
+2006-09-03 Lucas Rocha <lucasr@gnome.org>
+
+ * pt_BR.po: Updated Brazilian Portuguese translation
+ by Leonardo Ferreira Fontenelle <leo.fontenelle@gmail.com>
+
+2006-09-02 Åsmund Skjæveland <aasmunds@fys.uio.no>
+
+ * nn.po: Updated Norwegian Nynorsk translation.
+
+2006-08-31 Khandakar Mujahidul Islam <suzan@bengalinux.org>
+
+ * bn.po: Updated Bengali translation
+
+2006-08-30 I. Felix <ifelix25@gmail.com>
+
+ * ta.po: Translation updated.
+
+2006-08-26 Žygimantas Beručka <zygis@gnome.org>
+
+ * lt.po: Updated Lithuanian translation.
+
+2006-08-26 Christophe Merlet <redfox@redfoxcenter.org>
+
+ * fr.po: Updated French translation from
+ Robert-André Mauchin <zebob.m@gmail.com>.
+
+2006-08-26 Gabor Kelemen <kelemeng@gnome.hu>
+
+ * hu.po: Translation updated.
+
+2006-08-24 Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>
+
+ * ca.po: Updated Catalan translation (rebased from 2-12 branch).
+
+2006-08-23 Khandakar Mujahdul Islam <suzan@bengalinux.org>
+
+ * bn.po: Updated Bengali translation
+
+2006-08-20 Funda Wang <fundawang@linux.net.cn>
+
+ * zh_CN.po: Updated Simplified Chinese translation.
+
+2006-08-20 Ani Peter <peter.ani@gmail.com>
+
+ * ml.po: Updated Malayalam translation
+
+2006-08-18 Clytie Siddall <clytie@riverland.net.au>
+
+ * vi.po: Updated Vietnamese translation.
+
+2006-08-18 Duarte Loreto <happyguy_pt@hotmail.com>
+
+ * pt.po: Updated Portuguese translation.
+
+2006-08-17 Alexander Shopov <ash@contact.bg>
+
+ * bg.po: Updated Bulgarian translation by
+ Alexander Shopov <ash@contact.bg>
+
+2006-08-16 Satoru SATOH <ss@gnome.gr.jp>
+
+ * ja.po: Updated Japanese translation.
+
+2006-08-16 Erdal Ronahi <erdal.ronahi@gmail.com>
+
+ * ku.po: Updated Kurdish translation.
+
+2006-08-16 Daniel Nylander <po@danielnylander.se>
+
+ * sv.po: Updated Swedish translation.
+
+2006-08-16 Gabor Kelemen <kelemeng@gnome.hu>
+
+ * hu.po: Translation updated.
+
+2006-08-15 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.12.2 ===
+
+2006-08-16 Artur Flinta <aflinta@cvs.gnome.org>
+
+ * pl.po: Updated Polish translation by GNOME PL Team.
+
+2006-08-16 Artur Flinta <aflinta@cvs.gnome.org>
+
+ * pl.po: Updated Polish translation by GNOME PL Team.
+
+2006-08-15 Hendrik Richter <hendrikr@gnome.org>
+
+ * de.po: Updated German translation.
+
+2006-08-11 Changwoo Ryu <cwryu@debian.org>
+
+ * ko.po: Updated Korean translation.
+
+2006-08-10 Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>
+
+ * ca.po: Updated Catalan translation.
+
+2006-08-10 Guntupalli Karunakar <karunakar@freedomink.org>
+
+ * dz.po: Updated Dzongkha translation by
+ Dzongkhalinux team, DIT
+
+2006-08-09 Ilkka Tuohela <hile@iki.fi>
+
+ * fi.po: Updated Finnish translation.
+
+2006-08-09 Baris Cicek <baris@teamforce.name.tr>
+
+ * tr.po: Updated Turkish Translation from Onur Can Cakmak
+
+2006-08-09 Wouter Bolsterlee <uws+gnome@xs4all.nl>
+
+ * nl.po: Translation updated by Wouter Bolsterlee.
+
+2006-08-08 Inaki Larranaga <dooteo@euskalgnu.org>
+
+ * eu.po: Updated Basque translation.
+
+2006-08-07 Ankit Patel <ankit644@yahoo.com>
+
+ * gu.po: Updated Gujarati Translation.
+
+2006-08-06 Francisco Javier F. Serrador <serrador@openshine.com>
+
+ * es.po: Updated Spanish translation.
+
+2006-08-06 Theppitak Karoonboonyanan <thep@linux.thai.net>
+
+ * th.po: Updated Thai translation.
+
+2006-08-05 Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>
+
+ * zh_HK.po: Updated Traditional Chinese translation(Hong Kong).
+ * zh_TW.po: Updated Traditional Chinese translation(Taiwan).
+
+2006-08-03 Jakub Friedl <jfriedlo@suse.cz>
+
+ * cs.po: Updated Czech translation.
+
+2006-07-31 Maxim Dziumanenko <dziumanenko@gmail.com>
+
+ * uk.po: Updated Ukrainian translation.
+
+2006-07-22 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.12.1 ===
+
+2006-07-22 Yair Hershkovitz <yairhr@gmail.com>
+
+ * he.po: Updated Hebrew translation.
+
+2006-07-21 Duarte Loreto <happyguy_pt@hotmail.com>
+
+ * pt.po: Updated Portuguese translation.
+
+2006-07-21 Christophe Merlet <redfox@redfoxcenter.org>
+
+ * fr.po: Updated French translation from
+ Jonathan Ernst <jonathan@ernstfamily.ch>.
+
+2006-07-21 Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>
+
+ * ca.po: Updated Catalan translation.
+
+2006-07-18 Guntupalli Karunakar <karunakar@freedomink.org>
+
+ * dz.po: Updated Dzongkha translation by
+ Dzongkhalinux team, DIT
+
+2006-07-17 Runa Bhattacharjee <runabh@gmail.com>
+
+ * bn_IN.po:Updated Bengali India Translation.
+
+2006-07-11 Ilkka Tuohela <hile@iki.fi>
+
+ * fi.po: Updated Finnish translation.
+
+2006-07-08 Luca Ferretti <elle.uca@libero.it>
+
+ * it.po: Fixed a typo.
+
+2006-07-07 Ilkka Tuohela <hile@iki.fi>
+
+ * fi.po: Updated Finnish translation.
+
+2006-07-06 Luca Ferretti <elle.uca@libero.it>
+
+ * it.po: Updated Italian translation.
+
+2006-07-05 Inaki Larranaga <dooteo@euskalgnu.org>
+
+ * eu.po: Updated Basque translation.
+
+2006-07-05 Alexander Shopov <ash@contact.bg>
+
+ * bg.po: Updated Bulgarian translation by
+ Alexander Shopov <ash@contact.bg>
+
+2006-07-05 Jovan Naumovski <jovan@lugola.net>
+
+ * mk.po: Updated Macedonian translation.
+
+2006-07-03 Takeshi AIHANA <takeshi.aihana@gmail.com>
+
+ * ja.po: Updated Japanese translation.
+
+2006-07-03 Subhransu Behera <arya_subhransu@yahoo.co.in>
+
+ * or.po: Updated Oriya Translation
+
+2006-07-03 Runa Bhattacharjee <runabh@gmail.com>
+
+ * bn_IN.po: Added Bengali India Translation.
+
+2006-07-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.12.0 ===
+
+2006-06-29 Rhys Jones <rhys@sucs.org>
+
+ * cy.po: Updated Welsh translation.
+
+2006-06-26 Kjartan Maraas <kmaraas@gnome.org>
+
+ * nb.po: Updated Norwegian bokmål translation.
+
+2006-06-25 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Translation updated by Tino Meinen.
+
+2006-06-20 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.4 ===
+
+2006-06-20 Rajesh Ranjan <rajeshkajha@yahoo.com>
+
+ * hi.po: Updated Hindi Translation.
+
+2006-06-19 Hendrik Richter <hendrikr@gnome.org>
+
+ * de.po: Updated German translation.
+
+2006-06-19 Benoît Dejean <benoit@placenet.org>
+
+ * fr.po: Updated French translation.
+
+2006-06-19 Ankit Patel <ankit644@yahoo.com>
+
+ * gu.po: Updated Gujarati Translation.
+
+2006-06-19 Francisco Javier F. Serrador <serrador@openshine.com>
+
+ * es.po: Updated Spanish translation.
+
+2006-06-17 Changwoo Ryu <cwryu@debian.org>
+
+ * ko.po: Updated Korean translation.
+
+2006-06-17 Theppitak Karoonboonyanan <thep@linux.thai.net>
+
+ * th.po: Updated Thai translation.
+
+2006-06-12 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.3 ===
+
+2006-06-06 Ilkka Tuohela <hile@iki.fi>
+
+ * fi.po: Updated Finnish translation.
+
+2006-06-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.2 ===
+
+2006-06-06 Changwoo Ryu <cwryu@debian.org>
+
+ * ko.po: Updated Korean translation.
+
+2006-05-28 Pema Geyleg <pema.geyleg@gmail.com>
+
+ * dz.po: Updated Dzongkha translation.
+
+2006-05-25 Clytie Siddall <clytie@riverland.net.au>
+
+ * vi.po: Updated Vietnamese translation.
+
+2006-05-25 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Translation updated by Tino Meinen.
+
+2006-05-24 Inaki Larranaga <doteo@euskalgnu.org>
+
+ * eu.po: Updated Basque translation.
+
+2006-05-23 Theppitak Karoonboonyanan <thep@linux.thai.net>
+
+ * th.po: Updated Thai translation.
+
+2006-05-21 Alexander Shopov <ash@contact.bg>
+
+ * bg.po: Updated Bulgarian translation
+ by Alexander Shopov <ash@contact.bg>
+
+2006-05-17 Takeshi AIHANA <takeshi.aihana@gmail.com>
+
+ * ja.po: Updated Japanese translation.
+
+2006-05-16 Ignacio Casal Quinteiro <nacho.resa@gmail.com>
+
+ * gl.po: Updated Galician Translation.
+
+2006-05-15 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.1 ===
+
+2006-05-06 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
+
+ * es.po: Updated Spanish translation.
+
+2006-05-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.11.0 ===
+
+2006-05-02 Funda Wang <fundawang@linux.net.cn>
+
+ * zh_CN.po: Updated Simplified Chinese translation.
+
+2006-05-02 Ankit Patel <ankit644@yahoo.com>
+
+ * gu.po: Updated Gujarati Translation.
+
+2006-04-30 Kjartan Maraas <kmaraas@gnome.org>
+
+ * POTFILES.in: Add gbookmarkfile.c
+ * nb.po: Adjust accordingly.
+
+2006-04-30 Kjartan Maraas <kmaraas@gnome.org>
+
+ * nb.po: Updated Norwegian bokmål translation.
+
+2006-04-23 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Translation updated by Tino Meinen.
+
+2006-04-23 Åsmund Skjæveland <aasmunds@fys.uio.no>
+
+ * nn.po: Updated Norwegian Nynorsk translation.
+
+2006-04-21 David Lodge <dave@cirt.net>
+
+ * en_GB.po: Translation updated by David Lodge.
+
+2006-04-21 Ignacio Casal Quinteiro <nacho.resa@gmail.com>
+
+ * gl.po: Updated Galician Translation.
+
+2006-04-21 Rajesh Ranjan <rajeshkajha@yahoo.com>
+
+ * hi.po: Updated Hindi Translation.
+
+2006-04-19 Ankit Patel <ankit644@yahoo.com>
+
+ * gu.po: Updated Gujarati Translation.
+
+2006-04-18 Rajesh Ranjan <rajeshkajha@yahoo.com>
+
+ * hi.po: Updated Hindi Translation.
+
+2006-04-18 Ankit Patel <ankit644@yahoo.com>
+
+ * gu.po: Updated Gujarati Translation.
+
+2006-04-17 Clytie Siddall <clytie@riverland.net.au>
+
+ * vi.po: Updated Vietnamese translation.
+
+2006-04-11 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Translation updated by Tino Meinen.
+
+2006-04-10 Vladimer Sichinava <vlsichinava@gmail.com>
+
+ * ka.po: Updated Georgian translation.
+
+2006-04-07 Ignacio Casal Quinteiro <nacho.resa@gmail.com>
+
+ * gl.po: Updated Galician Translation.
+
+2006-04-07 Priit Laes <amd@store20.com>
+
+ * et.po: Translation updated by Ivar Smolin.
+
+2006-04-02 Alexander Shopov <ash@contact.bg>
+
+ * bg.po: Updated Bulgarian translation by
+ Alexander Shopov <ash@contact.bg>
+
+2006-03-27 Yair Hershkovitz <yairhr@gmail.com>
+
+ * he.po: Updated Hebrew translation.
+
+2006-03-13 Baris Cicek <baris@teamforce.name.tr>
+
+ * tr.po: Updated Turkish Translation
+
+2006-03-13 Mugurel Tudor <mugurelu@gnome.ro>
+
+ * ro.po: Updated Romanian translation by
+ Mişu Moldovan <dumol@gnome.ro>
+
+2006-03-10 Guilherme de S. Pastore <gpastore@gnome.org>
+
+ * pt_BR.po: Updated Brazilian Portuguese translation from Leandro
+ A. F. Pereira <leandro@linuxmag.com.br>.
+
+2006-03-06 Rajesh Ranjan <rranjan@redhat.com>
+
+ * hi.po: Updated Hindi Translation.
+
+2006-03-06 Rajesh Ranjan <rranjan@redhat.com>
+
+ * hi.po: Updated Hindi Translation.
+
+2006-03-06 Rajesh Ranjan <rranjan@redhat.com>
+
+ * hi.po: Updated Hindi Translation.
+
+2006-03-10 Subhransu Behera <sbehera@redhat.com>
+
+ * or.po: Updated Oriya translation
+
+2006-03-07 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.10.1 ===
+
+2006-03-07 Daniel Nylander <po@danielnylander.se>
+
+ * sv.po: Swedish translation updated.
+
+2006-03-03 Gabor Kelemen <kelemeng@gnome.hu>
+
+ * hu.po: Hungarian translation updated.
+
+2006-02-25 Artur Flinta <aflinta@cvs.gnome.org>
+
+ * pl.po: Updated Polish translation by GNOME PL Team.
+
+2006-02-25 Benoît Dejean <benoit@placenet.org>
+
+ * fr.po: Updated French translation.
+
+2006-02-25 Žygimantas Beručka <zygis@gnome.org>
+
+ * lt.po: Updated Lithuanian translation.
+
+2006-02-24 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.10.0 ===
+
+2006-02-23 Clytie Siddall <clytie@riverland.net.au>
+
+ * ka.po: Added Georgian translation by Gia Shervashidze <giasher@telenet.ge>.
+
+2006-02-21 Inaki Larranaga <dooteo@euskalgnu.org>
+
+ * eu.po: Updated Basque translation.
+
+2006-02-20 Kostas Papadimas <pkst@gnome.org>
+
+ * el.po: Updated Greek translation.
+
+2006-02-16 Maxim Dziumanenko <mvd@mylinux.ua>
+
+ * uk.po: Updated Ukrainian translation
+
+2006-02-10 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.6 ===
+
+2006-02-08 Luca Ferretti <elle.uca@libero.it>
+
+ * it.po: Updated Italian translation.
+
+2006-02-07 Lukas Novotny <lukasnov@cvs.gnome.org>
+
+ * cs.po: Updated Czech translation.
+
+2006-02-04 Rhys Jones <rhys@sucs.org>
+
+ * cy.po: Updated Welsh translation.
+
+2006-02-03 Rhys Jones <rhys@sucs.org>
+
+ * cy.po: Updated Welsh translation.
+
+2006-02-01 Leonid Kanter <leon@asplinux.ru>
+
+ * ru.po: Updated Russian translation
+
+2006-01-31 Slobodan D, Sredojevic <slobo@akrep.be>
+
+ * sr.po, sr@Latn.po: Updated Serbian translation
+
+2006-01-30 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: Updated Albanian translation.
+
+2006-01-28 Duarte Loreto <happyguy_pt@hotmail.com>
+
+ * pt.po: Updated Portuguese translation.
+
+2006-01-28 Changwoo Ryu <cwryu@debian.org>
+
+ * ko.po: Updated Korean translation.
+
+2006-01-27 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.5 ===
+
+2006-01-24 Priit Laes <plaes@cvs.gnome.org>
+
+ * et.po: Translation updated by Ivar Smolin.
+
+2006-01-21 Funda Wang <fundawang@linux.net.cn>
+
+ * zh_CN.po: Updated Simplified Chinese translation.
+
+2006-01-18 Ole Laursen <olau@hardworking.dk>
+
+ * da.po: Updated Danish translation.
+
+2006-01-18 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.4 ===
+
+2006-01-16 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.3 ===
+
+2006-01-16 Hendrik Richter <hendi@gnome-de.org>
+
+ * de.po: Updated German translation.
+
+2006-01-16 Hendrik Brandt <heb@gnome-de.org>
+
+ * de.po: Updated translation, Bugfixes, closed Bug #327196
+
+2006-01-12 Priit Laes <plaes@cvs.gnome.org>
+
+ * et.po: Translation updated by Ivar Smolin.
+
+2006-01-09 Alexander Shopov <ash@contact.bg>
+
+ * bg.po: Updated Bulgarian translation by
+ Alexander Shopov <ash@contact.bg>
+
+2005-01-09 Ankit Patel <ankit644@yahoo.com>
+
+ * gu.po: Updated Gujarati Translation.
+
+2006-01-08 Takeshi AIHANA <aihana@gnome.gr.jp>
+
+ * ja.po: Updated Japanese translation.
+
+2006-01-07 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Translation updated by Tino Meinen.
+
+2006-01-07 Clytie Siddall <clytie@riverland.net.au>
+
+ * vi.po: Updated Vietnamese translation.
+
+2006-01-06 Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>
+
+ * ca.po: Updated Catalan translation.
+
+2006-01-07 Theppitak Karoonboonyanan <thep@linux.thai.net>
+
+ * th.po: Updated Thai translation.
+
+2006-01-07 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
+
+ * es.po: Updated Spanish translation.
+
+2006-01-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.2 ===
+
+2006-01-04 Abel Cheung <maddog@linuxhall.org>
+
+ * zh_HK.po: New Chinese (Hong Kong) translation
+ * zh_TW.po: Updated Chinese (Taiwan) translation
+
+2006-01-02 Kjartan Maraas <kmaraas@gnome.org>
+
+ * nb.po: Updated Norwegian bokmål translation.
+ * no.po: Same
+
+2005-12-26 Ilkka Tuohela <hile@iki.fi>
+
+ * fi.po: Updated Finnish translation.
+
+2005-12-25 Adam Weinberger <adamw@gnome.org>
+
+ * en_CA.po: Updated Canadian English translation.
+
+2005-12-19 Christophe Merlet <redfox@redfoxcenter.org>
+
+ * fr.po: Updated French translation.
+
+2005-12-18 Ignacio Casal Quinteiro <nacho.resa@gmail.com>
+
+ * gl.po: Updated Galician Translation.
+
+2005-12-09 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.1 ===
+
+2005-12-01 Christian Rose <menthos@menthos.com>
+
+ * tl.po: Updated Tagalog translation by
+ Eric Pareja <xenos@upm.edu.ph>.
+
+2005-11-17 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.9.0 ===
+
+2005-11-16 Ales Nyakhaychyk <nab@mail.by>
+
+ * be.po: Updated Belarusian translation by Vital Khilko
+
+2005-11-10 Simos Xenitellis <simos@gnome.org>
+
+ * tt.po: Added Tatar translation by Albert Fazlí.
+
+2005-11-02 Miloslav Trmac <mitr@volny.cz>
+
+ * cs.po: Updated Czech translation.
+
+2005-11-01 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Translation updated by Tino Meinen.
+
+2005-10-27 Erdal Ronahi <erdal.ronahi@gmail.com>
+
+ * ku.po: Added Kurdish translation.
+
+2005-10-26 Takeshi AIHANA <aihana@gnome.gr.jp>
+
+ * ja.po: Updated Japanese translation and
+ Fixed typos reported by kano@na.rim.or.jp.
+
+2005-10-25 Funda Wang <fundawang@linux.net.cn>
+
+ * zh_CN.po: Updated Simplified Chinese translation.
+
+2005-10-20 Runa Bhattacharjee <runa@bengalinux.org>
+
+ * bn.po: Updated Bengali(bn) Translation
+ by Mahay Alam Khan <makl10n@yahoo.com>
+
+2005-10-20 Ignacio Casal Quinteiro <nacho.resa@gmail.com>
+
+ * gl.po: Updated Galician Translation.
+
+2005-10-17 Priit Laes <plaes@cvs.gnome.org>
+
+ * et.po: Translation updated by Ivar Smolin.
+
+2005-10-17 Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>
+
+ * zh_TW.po: Updated Traditional Chinese translation.
+
+2005-10-16 Marcel Telka <marcel@telka.sk>
+
+ * sk.po: Updated Slovak translation.
+
+2005-09-30 Adam Weinberger <adamw@gnome.org>
+
+ * en_CA.po: Updated Canadian English translation.
+
+2005-09-26 Martin Willemoes Hansen <mwh@sysrq.dk>
+
+ * da.po: Updated Danish translation.
+
+2005-09-25 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Updated Swedish translation.
+
+2005-09-06 Matthias Clasen <mclasen@redhat.com>
+
+ * Makefile.in.in: Tell xgettext about all the
+ printf-like functions we use.
+
+2005-09-05 Iñaki Larrañaga <dooteo@euskalgnu.org>
+
+ * eu.po: Updated Basque translation.
+
+2005-09-04 Priit Laes <plaes@cvs.gnome.org>
+
+ * et.po: Translation updated by Ivar Smolin.
+
+2005-09-03 Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>
+
+ * zh_TW.po: Updated Traditional Chinese translation.
+
+2005-09-02 Christophe Merlet <redfox@redfoxcenter.org>
+
+ * fr.po: Updated French translation.
+
+2005-09-01 Priit Laes <plaes@cvs.gnome.org>
+
+ * et.po: Translation updated by Ivar Smolin.
+
+2005-09-01 Raphael Higino <raphaelh@cvs.gnome.org>
+
+ * pt_BR.po: Updated Brazilian Portuguese translation.
+
+2005-09-01 Clytie Siddall <clytie@riverland.net.au>
+
+ * vi.po: Updated Vietnamese translation.
+
+2005-08-31 Mugurel Tudor <mugurelu@gnome.ro>
+
+ * ro.po: Updated Romanian translation
+ for Mişu Moldovan <dumol@gnome.ro>
+
+2005-08-30 Mohammad DAMT <mdamt@gnome.org>
+
+ * id.po: Updated Indonesian translation.
+
+2005-08-29 Clytie Siddall <clytie@riverland.net.au>
+
+ * vi.po: Updated Vietnamese translation.
+
+2005-08-28 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
+
+ * es.po: Updated Spanish translation.
+
+2005-08-28 Maxim Dziumanenko <mvd@mylinux.ua>
+
+ * uk.po: Updated Ukrainian translation
+
+2008-08-28 Josep Puigdemont <josep.puigdemont@gmail.com>
+
+ * ca.po: Updated Catalan translation.
+
+2005-08-28 Ankit Patel <ankit644@yahoo.com>
+
+ * gu.po: Updated Gujarati Translation.
+
+2005-08-27 Adam Weinberger <adamw@gnome.org>
+
+ * en_CA.po: Updated Canadian English translation.
+
+2005-08-27 Terance Sola <terance@lyse.net>
+
+ * nb.po: Updated Norwegian bokmål translation.
+ * no.po: Same.
+
+2005-08-27 Clytie Siddall <clytie@riverland.net.au>
+
+ * vi.po: Updated Vietnamese translation.
+
+2005-08-27 Christophe Merlet <redfox@redfoxcenter.org>
+
+ * fr.po: Updated French translation.
+
+2005-08-27 Ankit Patel <ankit644@yahoo.com>
+
+ * gu.po: Updated Gujarati Translation.
+
+2005-08-27 Mugurel Tudor <mugurelu@gnome.ro>
+
+ * ro.po: Updated Romanian translation by
+ Mişu Moldovan <dumol@gnome.ro>
+
+2005-08-27 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
+
+ * es.po: Updated Spanish translation.
+
+2005-08-26 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: Updated Albanian translation.
+
+2005-08-26 Jordi Mallach <jordi@sindominio.net>
+
+ * ca.po: Updated Catalan translation.
+
+2005-08-26 Priit Laes <plaes@cvs.gnome.org>
+
+ * et.po: Translation updated by Ivar Smolin.
+
+=======
+2005-09-01 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Translation updated by Tino Meinen.
+
+2005-09-01 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
+
+ * es.po: Updated Spanish translation.
+
+2005-08-31 Adam Weinberger <adamw@gnome.org>
+
+ * en_CA.po: Updated Canadian English translation.
+
+2005-09-01 Mugurel Tudor <mugurelu@gnome.ro>
+
+ * ro.po: Updated Romanian translation by
+ Mişu Moldovan <dumol@gnome.ro>
+
+2005-08-31 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: Updated Albanian translation.
+
+2005-08-31 Kostas Papadimas <pkst@gnome.org>
+
+ * el.po: Updated the Greek translation>
+
+2005-08-31 Kjartan Maraas <kmaraas@gnome.org>
+
+ * nb.po: Updated Norwegian bokmål translation.
+ * no.po: Same
+
+2005-08-31 Gabor Kelemen <kelemeng@gnome.hu>
+
+ * hu.po: Hungarian translation updated.
+
+2005-08-30 Artur Flinta <aflinta@cvs.gnome.org>
+
+ * pl.po: Updated Polish translation by GNOME PL Team.
+
+2005-08-30 Duarte Loreto <happyguy_pt@hotmail.com>
+
+ * pt.po: Updated Portuguese translation.
+
+2005-08-30 Leonid Kanter <leon@asplinux.ru>
+
+ * ru.po: Updated Russian translation
+
+2005-08-30 Alexander Shopov <ash@contact.bg>
+
+ * bg.po: Updated Bulgarian translation by
+ Alexander Shopov <ash@contact.bg>
+
+2005-08-30 Jordi Mallach <jordi@sindominio.net>
+
+* ca.po: Updated Catalan translation.
+
+2005-08-30 Ankit Patel <ankit644@yahoo.com>
+
+ * gu.po: Updated Gujarati Translation.
+
+2005-08-29 Alessio Frusciante <algol@firenze.linux.it>
+
+ * it.po: Updated Italian translation by
+ Luca Ferretti <elle.uca@infinito.it>.
+
+2005-08-28 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
+
+ * es.po: Updated Spanish translation.
+
+2005-08-27 Christophe Merlet <redfox@redfoxcenter.org>
+
+ * fr.po: Updated French translation.
+
+2005-08-23 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.8.1 ===
+
+2005-08-22 Changwoo Ryu <cwryu@debian.org>
+
+ * ko.po: Updated Korean translation.
+
+2005-08-18 Rhys Jones <rhys@sucs.org>
+
+ * cy.po: Updated Welsh translation.
+
+2005-08-15 Maxim Dziumanenko <mvd@mylinux.com.ua>
+
+ * uk.po: Updated Ukrainian translation
+
+2005-08-15 Jordi Mallach <jordi@sindominio.net>
+
+ * ca.po: Updated Catalan translation.
+
+2005-08-15 Mugurel Tudor <mugurelu@gnome.ro>
+
+ * ro.po: Updated Romanian translation
+ by Mişu Moldovan <dumol@gnome.ro>
+
+2005-08-12 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.8.0 ===
+
+2005-08-12 Kostas Papadimas <pkst@gnome.org>
+
+ * el.po: Updated the Greek translation>
+
+2005-08-08 Sunil Mohan Adapa <sunil@atc.tcs.co.in>
+
+ * te.po: Added Telugu translation done by
+ Vikram Phaneendra <vikramphaneendra@yahoo.co.in>
+ Dandu Prasad <dandu_prasad2000@yahoo.com>
+ Ramana Sai <rmn_sai@yahoo.co.in>
+
+2005-08-05 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.7 ===
+
+2005-08-03 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.6 ===
+
+2005-08-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.5 ===
+
+2005-07-25 Matthias Clasen <mclasen@redhat.com>
+
+ * Makefile.in.in: Call msgfmt with -c to catch
+ format errors.
+
+2005-07-28 Ilkka Tuohela <hile@iki.fi>
+
+ * fi.po: Updated Finnish translation.
+
+2005-07-27 Christian Neumair <chris@gnome-de.org>
+
+ * de.po: Fixed format specifiers. Thanks to Murray Cumming for
+ pointing this out.
+
+2005-07-26 Hendrik Brandt <heb@gnome-de.org>
+
+ * de.po: Updated German translation.
+
+2005-07-26 Artur Flinta <aflinta@cvs.gnome.org>
+
+ * pl.po: Updated Polish translation by GNOME PL Team.
+
+2005-07-25 Ankit Patel <ankit644@yahoo.com>
+
+ * gu.po: Updated Gujarati Translation.
+
+2005-07-24 Baris Cicek <baris@teamforce.name.tr>
+
+ * tr.po: Updated Turkish Translation from Onur Can Cakmak
+
+2005-07-22 Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>
+
+ * zh_TW.po Updated Traditional Chinese translation.
+
+2005-07-22 Duarte Loreto <happyguy_pt@hotmail.com>
+
+ * pt.po: Updated Portuguese translation.
+
+2005-07-21 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.4 ===
+
+2005-07-18 Matthias Clasen <mclasen@redhat.com>
+
+ * de.po: Fix some printf formatting in the German
+ translation. (#310731, Max Horn)
+
+2005-07-18 Funda Wang <fundawang@linux.net.cn>
+
+ * zh_CN.po: Updated Simplified Chinese translation.
+
+2005-07-17 Žygimantas Beručka <zygis@gnome.org>
+
+ * lt.po: Updated Lithuanian translation.
+
+2005-07-16 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: Updated Albanian translation.
+
+2005-07-15 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.3 ===
+
+2005-07-13 Kjartan Maraas <kmaraas@gnome.org>
+
+ * nb.po: Update some
+ * no.po: Update
+
+2005-07-12 Gabor Kelemen <kelemeng@gnome.hu>
+
+ * hu.po: Hungarian translation updated.
+
+2005-07-10 Miloslav Trmac <mitr@volny.cz>
+
+ * cs.po: Updated Czech translation.
+
+2005-07-09 Alexander Shopov <ash@contact.bg>
+
+ * bg.po: Updated Bulgarian translation by
+ Alexander Shopov <ash@contact.bg>
+
+2005-07-09 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Translation updated by Tino Meinen.
+
+2005-07-08 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.2 ===
+
+2005-07-08 Danilo Šegan <danilo@gnome.org>
+
+ * sr.po, sr@Latn.po: Updated Serbian translation.
+
+2005-07-06 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
+
+ * es.po: Updated Spanish translation.
+
+2005-07-03 Adam Weinberger <adamw@gnome.org>
+
+ * en_CA.po: Updated Canadian English translation.
+
+2005-07-02 Takeshi AIHANA <aihana@gnome.gr.jp>
+
+ * ja.po: Updated Japanese translation.
+
+2005-07-02 Priit Laes <plaes@cvs.gnome.org>
+
+ * et.po: Translation updated.
+
+2005-07-01 Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>
+
+ * zh_TW.po: Updated Traditional Chinese translation.
+
+2005-06-30 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.1 ===
+
+2005-06-28 Theppitak Karoonboonyanan <thep@linux.thai.net>
+
+ * th.po: Updated Thai translation.
+
+2005-06-25 Marcel Telka <marcel@telka.sk>
+
+ * sk.po: Updated Slovak translation.
+
+2005-06-24 Matthias Clasen <mclasen@redhat.com>
+
+ * POTFILES.in: Add gmappedfile.c
+
+2005-06-22 Abel Cheung <maddog@linuxhall.org>
+
+ * zh_TW.po: Fix language team reference.
+
+2005-06-21 Priit Laes <plaes@cvs.gnome.org>
+
+ * et.po: Translation updated.
+
+2005-06-17 Adam Weinberger <adamw@gnome.org>
+
+ * en_CA.po: Updated Canadian English translation.
+
+2005-06-16 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Translation updated by Tino Meinen.
+
+2005-06-15 Marcel Telka <marcel@telka.sk>
+
+ * sk.po: Updated Slovak translation.
+
+2005-06-14 Theppitak Karoonboonyanan <thep@linux.thai.net>
+
+ * th.po: Added Thai translation.
+
+2005-06-13 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
+
+ * es.po: Updated Spanish translation.
+
+2005-06-13 Alexander Shopov <ash@contact.bg>
+
+ * bg.po: Updated Bulgarian translation by
+ Alexander Shopov <ash@contact.bg>
+
+2005-06-13 Terance Sola <terance@lyse.net>
+
+ * nb.po: Updated Norwegian translation.
+ * no.po: Same as above.
+
+2005-06-12 Miloslav Trmac <mitr@volny.cz>
+
+ * cs.po: Updated Czech translation.
+
+2005-06-11 Martin Willemoes Hansen <mwh@sysrq.dk>
+
+ * da.po: Updated Danish translation.
+
+2005-06-10 Priit Laes <plaes@cvs.gnome.org>
+
+ * et.po: Translation updated.
+
+2005-06-10 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.7.0 ===
+
+2005-06-08 Martin Willemoes Hansen <mwh@sysrq.dk>
+
+ * da.po: Updated Danish translation.
+
+2005-06-06 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Translation updated by Tino Meinen.
+
+2005-06-05 Ignacio Casal Quinteiro <nacho.resa@gmail.com>
+
+ * gl.po: Updated Galician translation.
+
+2005-05-30 Funda Wang <fundawang@linux.net.cn>
+
+ * zh_CN.po: Updated Simplified Chinese translation.
+
+2005-05-30 Sanlig Badral <badral@openmn.org>
+
+ * mn.po: Updated Mongolian translation.
+
+2005-05-29 Miloslav Trmac <mitr@volny.cz>
+
+ * cs.po: Updated Czech translation.
+
+2005-05-28 Adam Weinberger <adamw@gnome.org>
+
+ * en_CA.po: Updated Canadian English translation.
+
+2005-05-21 Pawan Chitrakar <pawan@nplinux.org>
+
+ * ne.po: Updated Translation
+
+2005-05-15 Pawan Chitrakar <pawan@nplinux.org>
+
+ * ne.po: Updated Translation
+
+2005-05-14 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Translation updated by Tino Meinen.
+
+2005-05-14 Priit Laes <plaes@cvs.gnome.org>
+
+ * et.po: Translation updated by Ivar Smolin.
+
+2005-05-02 Priit Laes <plaes@cvs.gnome.org>
+
+ * et.po: Translation updated by Ivar Smolin.
+
+2005-04-30 Miloslav Trmac <mitr@volny.cz>
+
+ * cs.po: Updated Czech translation.
+
+2005-04-27 Gabor Kelemen <kelemeng@gnome.hu>
+
+ * hu.po: Hungarian translation added.
+
+2005-04-23 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
+
+ * es.po: Updated Spanish translation.
+
+2005-04-18 David Lodge <dave@cirt.net>
+
+ * en_GB.po: Updated British English translation.
+
+2005-04-17 Adam Weinberger <adamw@gnome.org>
+
+ * en_CA.po: Updated Canadian English translation.
+
+2005-04-12 Iaki Larraaga <dooteo@euskalgnu.org>
+
+ * eu.po: Updated Basque translation.
+
+2005-04-12 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: Updated Albanian translation.
+
+2005-04-07 Gareth Owen <gowen72@yahoo.com>
+
+ * en_GB.po: Updated British English translation
+
+2005-03-31 Miloslav Trmac <mitr@volny.cz>
+
+ * cs.po: Updated Czech translation.
+
+2005-03-30 Steve Murphy <murf@e-tools.com>
+
+ * rw.po: Added Kinyarwanda translation.
+
+2005-03-30 Estêvão Samuel Procópio <tevaum@ig.com.br>
+
+ * pt_BR.po: Updated Brazilian Portuguese Translation.
+
+2005-03-15 Adam Weinberger <adamw@gnome.org>
+
+ * en_CA.po: Updated Canadian English translation.
+
+2005-03-13 Roozbeh Pournader <roozbeh@farsiweb.info>
+
+ * fa.po: Updated Persian translation by
+ Hamed Malek <hamed@farsiweb.info>.
+
+2005-03-09 Ahmad Riza H Nst <ari@160c.afraid.org>
+
+ * id.po: Updated Indonesian Translation
+
+2005-03-05 Dan Damian <dand@gnome.ro>
+
+ * ro.po: Updated Romanian translation by
+ Mişu Moldovan <dumol@go.ro>.
+
+2005-02-28 Kostas Papadimas <pkst@gnome.org>
+
+ * el.po: Updated the Greek translation>
+
+2005-02-20 Christophe Merlet <redfox@redfoxcenter.org>
+
+ * fr.po: Updated French translation.
+
+2005-02-16 Adi Attar <aattar@cvs.gnome.org>
+
+ * xh.po: Added Xhosa translation
+
+2005-02-15 Baris Cicek <baris@teamforce.name.tr>
+
+ * tr.po: Updated Turkish Translation by Onur Can Cakmak
+
+2005-02-13 Benoît Dejean <TazForEver@dlfp.org>
+
+ * fr.po: Updated French translation.
+
+2005-02-11 Danilo Šegan <dsegan@gmx.net>
+
+ * sr.po, sr@Latn.po: Updated Serbian translation.
+
+2005-02-09 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
+
+ * es.po: Updated Spanish translation.
+
+2005-02-09 Maxim Dziumanenko <mvd@mylinux.com.ua>
+
+ * uk.po: Updated Ukrainian translation
+
+2005-02-06 Kostas Papadimas <pkst@gnome.org>
+
+ * el.po: Updated Greek translation.
+
+2005-02-01 Raphael Higino <raphaelh@cvs.gnome.org>
+
+ * pt_BR.po: Updated Brazilian Portuguese translation.
+
+2005-01-31 Žygimantas Beručka <uid0@akl.lt>
+
+ * lt.po: Updated Lithuanian translation.
+
+2005-01-30 Alessio Frusciante <algol@firenze.linux.it>
+
+ * it.po: Updated Italian translation by
+ Luca Ferretti <elle.uca@infinito.it>.
+
+2005-01-28 Christian Rose <menthos@menthos.com>
+
+ * tl.po: Added Tagalog translation by
+ Eric Pareja <xenos@upm.edu.ph>.
+
+2005-01-14 Jordi Mallach <jordi@sindominio.net>
+
+ * ca.po: Updated Catalan translation.
+
+2005-01-14 Marcel Telka <marcel@telka.sk>
+
+ * sk.po: Updated Slovak translation.
+
+2005-01-10 Duarte Loreto <happyguy_pt@hotmail.com>
+
+ * pt.po: Updated Portuguese translation.
+
+2005-01-10 Artur Flinta <aflinta@cvs.gnome.org>
+
+ * pl.po: Updated Polish translation by GNOME PL Team.
+
+2005-01-09 Alessio Frusciante <algol@firenze.linux.it>
+
+ * it.po: Updated Italian translation by
+ Luca Ferretti <elle.uca@infinito.it>.
+
+2005-01-07 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.6.1 ===
+
+2005-01-06 Rhys Jones <rhys@sucs.org>
+
+ * cy.po: Updated Welsh translation.
+
+2004-12-18 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Translation updated by Tino Meinen.
+
+2004-12-18 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Updated Swedish translation.
+
+2004-12-18 Hendrik Brandt <heb@gnome-de.org>
+
+ * de.po: Updated German translation.
+
+2004-12-17 Leonid Kanter <leon@asplinux.ru>
+
+ * ru.po: Updated Russian translation
+
+2004-12-17 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: Updated Albanian translation.
+
+2004-12-16 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.6.0 ===
+
+2004-12-13 David Lodge <dave@cirt.net>
+
+ * en_GB.po: Updated British translation.
+
+2004-12-12 Alexander Shopov <ash@contact.bg>
+
+ * bg.po: Updated Bulgarian translation
+
+2004-12-07 Martin Willemoes Hansen <mwh@sysrq.dk>
+
+ * da.po: Updated Danish translation.
+
+2004-12-04 Žygimantas Beručka <uid0@akl.lt>
+
+ * lt.po: Updated Lithuanian translation.
+
+2004-12-04 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
+
+ * es.po: Updated Spanish translation.
+
+2004-12-04 Funda Wang <fundawang@linux.net.cn>
+
+ * zh_CN.po: Updated Simplified Chinese translation.
+
+2004-12-03 Takeshi AIHANA <aihana@gnome.gr.jp>
+
+ * ja.po: Updated Japanese translation.
+
+2004-12-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.7 ===
+
+2004-12-01 Miloslav Trmac <mitr@volny.cz>
+
+ * cs.po: Updated Czech translation.
+
+2004-11-30 Martin Willemoes Hansen <mwh@sysrq.dk>
+
+ * da.po: Updated Danish translation.
+
+2004-11-29 Adam Weinberger <adamw@gnome.org>
+
+ * en_CA.po: Updated Canadian English translation.
+
+2004-11-29 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Translation updated by Tino Meinen.
+
+2004-11-24 Martin Willemoes Hansen <mwh@sysrq.dk>
+
+ * da.po: Updated Danish translation.
+
+2004-11-22 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
+
+ * es.po: Updated Spanish translation.
+
+2004-11-22 Funda Wang <fundawang@linux.net.cn>
+
+ * zh_CN.po: Updated Simplified Chinese translation.
+
+2004-11-21 David Lodge <dave@cirt.net>
+
+ * en_GB.po: Updated British translation.
+
+2004-11-20 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: Updated Albanian translation.
+
+2004-11-18 Adam Weinberger <adamw@gnome.org>
+
+ * en_CA.po: Updated Canadian English translation.
+
+2004-11-18 Miloslav Trmac <mitr@volny.cz>
+
+ * cs.po: Updated Czech translation.
+
+2004-11-17 Matthias Clasen <mclasen@redhat.com>
+
+ * POTFILES.in: Add gkeyfile.c
+
+2004-11-15 Hendrik Richter <hendrik@gnome-de.org>
+
+ * de.po: Updated German translation.
+
+2004-11-12 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.6 ===
+
+2004-11-09 Funda Wang <fundawang@linux.net.cn>
+
+ * zh_CN.po: Updated Simplified Chinese translation.
+
+2004-11-08 Baris Cicek <baris@teamforce.name.tr>
+
+ * tr.po: Updated Turkish Translation by Onur Can Cakmak
+
+2004-11-04 Martin Willemoes Hansen <mwh@sysrq.dk>
+
+ * da.po: Updated Danish translation.
+
+2004-11-03 Takeshi AIHANA <aihana@gnome.gr.jp>
+
+ * ja.po: Updated Japanese translation.
+
+2004-11-02 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.5 ===
+
+2004-10-27 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.4 ===
+
+2004-10-27 Kjartan Maraas <kmaraas@gnome.org>
+
+ * nb.po: Update Norwegian bokmål translation.
+
+2004-10-26 Gora Mohanty <gmohanty@cvs.gnome.org>
+
+ * or.po: Updated Oriya translation.
+
+2004-10-25 Kjartan Maraas <kmaraas@gnome.org>
+
+ * nb.po: Update.
+
+2004-10-19 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: Updated Albanian translation.
+
+2004-10-15 Danilo Šegan <dsegan@gmx.net>
+
+ * sr.po, sr@Latn.po: Updated Serbian translation.
+
+2004-10-04 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Translation updated by Tino Meinen.
+
+2004-10-03 David Lodge <dave@cirt.net>
+
+ * en_GB.po: Updated British English translation.
+
+2004-10-03 Miloslav Trmac <mitr@volny.cz>
+
+ * cs.po: Updated Czech translation.
+
+2004-10-03 Ryoichi INAGAKI <ryo1@bc.wakwak.com>
+
+ * ja.po: Updated Japanese translation.
+
+2004-09-24 Adam Weinberger <adamw@gnome.org>
+
+ * en_CA.po: Updated Canadian English translation.
+
+2004-09-18 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.3 ===
+
+2004-09-06 Åsmund Skjæveland <aasmunds@fys.uio.no>
+
+ * nn.po: Updated Norwegian Nynorsk translation.
+
+2004-09-05 Marius Andreiana <marius galuna.ro>
+
+ * ro.po: updated by Misu Moldovan
+
+2004-08-31 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
+
+ * es.po: Updated Spanih translation.
+
+2004-08-25 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.2 ===
+
+2004-08-24 Pawan Chitrakar <pawan@nplinux.org>
+
+ * ne.po: Update Nepali Translation
+
+2004-08-23 Iñaki Larrañaga <dooteo@euskalgnu.org>
+
+ * eu.po: Updated Basque translation.
+2004-08-16 Christian Rose <menthos@menthos.com>
+
+ * bs.po: Added Bosnian translation by
+ Kenan Hadžiavdić <kenanh@frisurf.no>.
+
+2004-08-13 Tommi Vainikainen <thv@iki.fi>
+
+ * fi.po: Unified some fields in po headers for Finnish team.
+
+2004-08-09 Ankit Patel <ankit@redhat.com>
+
+ * gu.po: Updated Gujarati translation.
+
+2004-08-09 Amanpreet Singh Alam <aalam@redhat.com>
+
+ * pa.po: Updated Panjabi translation.
+
+2004-08-01 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.5.1 ===
+
+2004-07-29 Iñaki Larrañaga <dooteo@euskalgnu.org>
+
+ * eu.po: Updated Basque translation.
+
+2004-07-21 Guntupalli Karunakar <karunakar@freedomink.org>
+
+ * hi.po: Updated Hindi translation.
+
+Sun Jul 18 18:03:08 2004 Soeren Sandmann <sandmann@daimi.au.dk>
+
+ * === Released 2.5.0 ===
+
+2004-06-09 Pawan Chitrakar <pawan@nplinux.org>
+
+ * ne.po: Updated Translation
+
+2004-06-06 Pawan Chitrakar <pawan@nplinux.org>
+
+ * ne.po: Added "ne.po" Nepali translation.
+
+
+2004-05-04 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Updated Norwegian translation.
+
+2004-05-03 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * wa.po: Added Walloon file
+
+2004-05-01 Takeshi AIHANA <aihana@gnome.gr.jp>
+
+ * ja.po: Updated Japanese translation.
+
+2004-04-30 Matthias Clasen <mclasen@redhat.com>
+
+ * === Released 2.4.1 ===
+
+2004-04-30 Telsa Gwynne <hobbit@aloss.ukuu.org.uk>
+
+ * cy.po: Updated Welsh translation from Rhys Jones.
+
+2004-04-30 Yuriy Syrota <rasta@cvs.gnome.org>
+
+ * uk.po: Updated Ukrainian translation.
+
+2004-04-29 Dmitry G. Mastrukov <dmitry@taurussoft.org>
+
+ * ru.po: Updated Russian translation
+ from Russian team <gnome-cyr@gnome.org>.
+
+2004-04-29 Danilo Šegan <dsegan@gmx.net>
+
+ * sr.po, sr@Latn.po, sr@ije.po: Updated Serbian translation.
+
+2004-04-27 Jordi Mallach <jordi@sindominio.net>
+
+ * ca.po: Updated Catalan translation.
+
+2004-04-27 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Translation updated by Tino Meinen.
+
+2004-04-26 Miloslav Trmac <mitr@volny.cz>
+
+ * cs.po: Updated Czech translation.
+
+2004-04-25 Gareth Owen <gowen72@yahoo.com>
+
+ * en_GB.po: Updated British English translation
+
+2004-04-25 Kostas Papadimas <pkst@gnome.org>
+
+ * el.po: Updated Greek translation.
+
+2004-04-25 Sami Pesonen <sampeson@iki.fi>
+
+ * fi.po: Updated Finnish translation.
+
+2004-04-24 Artur Flinta <aflinta@cvs.gnome.org>
+
+ * pl.po: Updated Polish translation by GNOME PL Team.
+
+2004-04-24 Christophe Merlet <redfox@redfoxcenter.org>
+
+ * fr.po: Updated French translation.
+
+2004-04-24 Duarte Loreto <happyguy_pt@hotmail.com>
+
+ * pt.po: Updated Portuguese translation.
+
+2004-04-24 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
+
+ * es.po: Updated Spanih translation.
+
+2004-04-24 Adam Weinberger <adamw@gnome.org>
+
+ * en_CA.po: Updated Canadian English translation.
+
+2004-04-23 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Updated Swedish translation.
+
+2004-04-08 Guntupalli Karunakar <karunakar@freedomink.org>
+
+ * gu.po: Added Gujurati translation by
+ Gujarati Team <magnet@magnet-i.com>.
+
+2004-04-07 Iñaki Larrañaga <dooteo@euskalgnu.org>
+
+ * eu.po: Updated Basque translation.
+
+2004-03-31 Mohammad DAMT <mdamt@bisnisweb.com>
+
+ * id.po: Updated Indonesian translation
+
+2004-03-30 Adam Weinberger <adamw@gnome.org>
+
+ * en_CA.po: Added Canadian English translation.
+
+2004-03-25 Gil Osher <dolfin@rpg.org.il>
+
+ * he.po: Updated Hebrew translation.
+
+2004-03-18 Stanislav Visnovsky <visnovsky@nenya.ms.mff.cuni.cz>
+
+ * sk.po: Updated Slovak translation.
+
+2004-03-16 Gareth Owen <gowen72@yahoo.com>
+
+ * en_GB.po: Added British translation
+
+Tue Mar 16 11:53:29 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.4.0 ===
+
+2004-03-15 Mugurel Tudor <mugurelu@go.ro>
+
+ * ro.po: Updated Romanian translation by
+ Mişu Moldovan <dumol@go.ro>
+
+2004-03-14 Robert Sedak <robert.sedak@sk.htnet.hr>
+
+ * hr.po: Updated Croatian translation.
+
+Tue Mar 9 09:22:02 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.3.6 ===
+
+2004-03-08 Alastair McKinstry <mckinstry@computer.org>
+
+ * ga.po: Updated Irish translation.
+
+2004-03-08 Ales Nyakhaychyk <nab@mail.by>
+
+ * be.po: Updated Belarusian translation.
+
+2004-03-07 Danilo Šegan <dsegan@gmx.net>
+
+ * sr@ije.po: Added Serbian Jekavian translation by Bojan Suzić
+ <bojans@teol.net>.
+
+2004-03-06 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
+
+ * es.po: Updated Spanish translation.
+
+2004-03-04 Guntupalli Karunakar <karunakar@freedomink.org>
+
+ * pa.po: Added Punjabi translation by
+ Amanpreet Singh Alam <amanlinux@netscape.net>.
+
+2004-03-04 Funda Wang <fundawang@linux.net.cn>
+
+ * zh_CN.po: Updated Simplified Chinese translation.
+
+2004-03-03 Pauli Virtanen <pauli.virtanen@hut.fi>
+
+ * fi.po: Updated Finnish translation.
+
+Mon Mar 1 16:49:51 2004 Owen Taylor <otaylor@redhat.com>
+
+ * === Released 2.3.5 ===
+
+2004-03-01 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: Updated Albanian translation.
+
+2004-02-27 Priit Laes <plaes@cvs.gnome.org>
+
+ * et.po: Translation updated by Allan Sims.
+
+2004-02-24 Alastair McKinstry <mckinstry@debian.org>
+
+ * ga.po: Corrections.
+
+2004-02-24 Dafydd Harries <daf@muse.19inch.net>
+
+ * cy.po: Updated Welsh translation by Rhys Jones and myself.
+
+2004-02-23 Kostas Papadimas <pkst@gnome.org>
+
+ * el.po: Updated Greek translation.
+
+2004-02-23 Guntupalli Karunakar <karunakar@freedomink.org>
+
+ * ta.po: Updated Tamil translation by
+ Dinesh Nadarajah <dinesh_list@sbcglobal.net>
+
+2004-02-20 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: Fixed Albanian translation.
+
+2004-02-12 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: Updated Albanian translation.
+
+2004-02-12 Danilo Šegan <dsegan@gmx.net>
+
+ * sr.po, sr@Latn.po: Reviewed by myself.
+
+2004-02-09 Maxim Dziumanenko <mvd@mylinux.com.ua>
+
+ * uk.po: Updated Ukrainian translation
+
+2004-02-05 Robert Sedak <robert.sedak@sk.htnet.hr>
+
+ * hr.po: Updated Croatian translation.
+
+2004-02-05 Mətin Əmirov <metin@karegen.com>
+
+ * az.po: Translation updated.
+
+2004-02-01 Hasbullah Bin Pit <sebol@my-penguin.org>
+
+ * ms.po: Updated Malay translation.
+
+2004-01-31 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: Updated Albanian translation.
+
+2004-01-30 Changwoo Ryu <cwryu@debian.org>
+
+ * ko.po: Updated Korean translation.
+
+2004-01-29 Alessio Frusciante <algol@firenze.linux.it>
+
+ * it.po: Updated Italian translation.
+
+2004-01-28 Miloslav Trmac <mitr@volny.cz>
+
+ * cs.po: Fixed Czech translation.
+
+2004-01-27 Åsmund Skjæveland <aasmunds@fys.uio.no>
+
+ * nn.po: Updated Norwegian Nynorsk translation.
+
+2004-01-16 Alastair McKinstry <mckinstry@computer.org>
+
+ * ga.po: Updated Irish translation.
+
+2004-01-16 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: Updated Albanian translation.
+
+2004-01-13 Alastair McKinstry <mckinstry@computer.org>
+
+ * ga.po: Irish translation.
+
+2004-01-13 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Updated Norwegian translation.
+
+2004-01-07 Sanlig Badral <badral@openmn.org>
+
+ * mn.po; Updated Mongolian translation.
+
+2004-01-06 Christian Neumair <chris@gnome-de.org>
+
+ * de.po: Updated German translation.
+
+2004-01-01 Roozbeh Pournader <roozbeh@sharif.edu>
+
+ * fa.po: Updated Persian translation.
+
+2004-01-01 Åsmund Skjæveland <aasmunds@fys.uio.no>
+
+ * nn.po: Updated Norwegian Nynorsk translation.
+
+2003-12-27 Åsmund Skjæveland <aasmunds@fys.uio.no>
+
+ * nn.po: Updated Norwegian Nynorsk translation.
+
+2003-12-20 Arafat Medini <lumina@silverpen.de>
+
+ * ar.po: Updated Arabic translation.
+
+2003-12-03 Dmitry G. Mastrukov <dmitry@taurussoft.org>
+
+ * ru.po: Updated Russian translation
+ from Russian team <gnome-cyr@gnome.org>.
+
+2003-12-03 Duarte Loreto <happyguy_pt@hotmail.com>
+
+ * pt.po: Updated and revised Portuguese translation.
+
+2003-11-22 Christophe Merlet <redfox@redfoxcenter.org>
+
+ * fr.po: Updated French translation.
+
+2003-11-20 Ole Laursen <olau@hardworking.dk>
+
+ * da.po: Updated Danish translation.
+
+2003-11-19 Åsmund Skjæveland <aasmunds@fys.uio.no>
+
+ * nn.po: Updated Norwegian Nynorsk translation.
+
+2003-11-18 Miloslav Trmac <mitr@volny.cz>
+
+ * cs.po: Updated Czech translation.
+
+2003-11-13 Jordi Mallach <jordi@sindominio.net>
+
+ * ca.po: Updated Catalan translation.
+
+2003-11-10 Pablo Gonzalo del Campo <pablodc@bigfoot.com>
+
+ * es.po: Updated Spanish translation by
+ Francisco Javier F. Serrador <serrador@arrakis.es>.
+
+2003-10-31 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Updated Norwegian translation.
+
+2003-10-28 KAMAGASAKO Masatoshi <emerald@gnome.gr.jp>
+
+ * ja.po: Updated Japanese translation.
+
+2003-10-19 Vincent van Adrighem <adrighem@gnome.org>
+
+ * nl.po: Dutch translation updated by Tino Meinen.
+
+2003-10-08 Artur Flinta <aflinta@cvs.gnome.org>
+
+ * pl.po: Updated Polish translation.
+
+2003-10-04 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Updated Swedish translation.
+
+2003-09-29 Gustavo Maciel Dias Vieira <gdvieira@zaz.com.br>
+
+ * pt_BR.po: Applied revision by Augusta Marques da Silva
+ <augusta.marques@gmx.net>.
+
+2003-09-28 Gediminas Paulauskas <menesis@delfi.lt>
+
+ * lt.po: Added Lithuanian translation by Tomas Kuliavas.
+
+2003-08-20 Richard Allen <ra@ra.is>
+
+ * is.po: Added Icelandic translation.
+
+2003-08-18 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Update Norwegian translation.
+
+2003-08-18 Metin Amiroff <metin@karegen.com>
+
+ * az.po: Updated Azerbaijani translation.
+
+2003-08-16 Danilo Šegan <dsegan@gmx.net>
+
+ * sr.po, sr@Latn.po: Updated Serbian translation.
+
+2003-07-10 Joel Brich <joel.brich@laposte.net>
+
+ * eo.po: Added Esperanto translation
+ from Charles Voelger <cvoelger@dweasel.com>
+
+2003-06-22 Metin Amiroff <metin@karegen.com>
+
+ * az.po: Updated Azerbaijani translation.
+
+2003-06-04 Abel Cheung <maddog@linux.org.hk>
+
+ * ta.po: Fix broken encoding.
+
+2003-05-27 Abel Cheung <maddog@linux.org.hk>
+
+ * zh_TW.po: Updated traditional Chinese translation.
+
+2003-05-19 Arafat Medini <lumina@silverpen.de>
+
+ * ar.po: Added Arabic translation from
+ Arabeyes team <doc@arabeyes.org>
+
+
+2003-05-17 Telsa Gwynne <hobbit@aloss.ukuu.org.uk>
+
+ * cy.po: Added Welsh translation from
+ Dafydd Harries <daf@parnassus.ath.cx>
+
+2003-05-08 Christophe Merlet <redfox@redfoxcenter.org>
+
+ * fr.po: Updated French translation.
+
+2003-05-05 Christian Rose <menthos@menthos.com>
+
+ * sr.po, sr@Latn.po: Added Serbian translation by
+ Danilo Šegan <dsegan@gmx.net>.
+
+2003-03-26 Christian Rose <menthos@menthos.com>
+
+ * yi.po: Added Yiddish translation by
+ Raphael Finkel <raphael@cs.uky.edu>.
+
+2003-02-27 James Henstridge <james@daa.com.au>
+
+ * Makefile.in.in (uninstall): fix uninstall target so that it
+ correctly removes the installed Makefile.in.in if PACKAGE==glib.
+ (update-po): update to use logic more similar to new gettexts,
+ which should pass readonly srcdir distcheck.
+
+2003-02-24 Roozbeh Pournader <roozbeh@sharif.edu>
+
+ * fa.po: Updated Persian translation.
+
+2003-02-21 Metin Amiroff <metin@karegen.com>
+
+ * az.po: some fixes in Azerbaijani translation.
+
+2003-02-11 Fatih Demir <kabalak@gtranslator.org>
+
+ * tr.po: Take over from stable branch.
+
+2003-02-10 Mohammad DAMT <mdamt@bisnisweb.com>
+
+ * id.po: Added Indonesian translation
+
+2003-01-29 Tõivo Leedjärv <toivo@linux.ee>
+
+ * et.po: Fixed a small bug in Estonian translation.
+
+2003-01-22 Paisa Seeluangsawat <paisa@colorado.edu>
+
+ * th.po: Added Thai file
+
+2003-01-22 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * bn.po: Added Bengali file
+
+2003-01-22 Abel Cheung <maddog@linux.org.hk>
+
+ * zh_TW.po: Updated traditional Chinese translation.
+
+2003-01-21 Christian Rose <menthos@menthos.com>
+
+ * mn.po: Added Mongolian translation by
+ Sanlig Badral <badral@chinggis.com>.
+
+2003-01-20 Christian Neumair <chris@gnome-de.org>
+
+ * de.po: Updated German translation.
+
+2003-01-20 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * vi.po: Updated Vietnamese file
+
+2003-01-20 Christian Neumair <chris@gnome-de.org>
+
+ * de.po: Updated German translation.
+
+2003-01-16 Daniel Yacob <locales@geez.org>
+
+ * am.po: Added Amharic translation.
+
+2003-01-15 Dmitry G. Mastrukov <dmitry@taurussoft.org>
+
+ * ru.po: updated Russian translation
+ from Russian team <gnome-cyr@gnome.org>.
+
+2003-01-14 Yanko Kaneti <yaneti@declera.com>
+
+ * bg.po: Updated Bulgarian translation (style) by
+ Alexander Shopov <al_shopov@yahoo.com>.
+
+2003-01-06 Dmitry G. Mastrukov <dmitry@taurussoft.org>
+
+ * ru.po: updated Russian translation
+ from Russian team <gnome-cyr@gnome.org>.
+
+2003-01-05 Pauli Virtanen <pauli.virtanen@hut.fi>
+
+ * fi.po: Updated Finnish translation from Lauri Nurmi.
+
+2003-01-02 Zbigniew Chyla <cyba@gnome.pl>
+
+ * pl.po: Updated Polish translation by
+ GNOME PL Team <translators@gnome.pl>.
+
+2003-01-02 Abel Cheung <maddog@linux.org.hk>
+
+ * zh_TW.po: Updated traditional Chinese translation.
+
+2002-12-28 Vincent van Adrighem <V.vanAdrighem@dirck.mine.nu>
+
+ * nl.po: Dutch translation updated by Tino Meinen.
+
+2002-12-28 Tõivo Leedjärv <toivo@linux.ee>
+
+ * et.po: Added Estonian translation
+ by Allan Sims <allsi@eau.ee>.
+
+2002-12-27 Vincent van Adrighem <V.vanAdrighem@dirck.mine.nu>
+
+ * nl.po: Dutch translation updated by Tino Meinen.
+
+2002-12-19 Jordi Mallach <jordi@sindominio.net>
+
+ * ca.po: Updated Catalan translation.
+
+2002-12-19 Yanko Kaneti <yaneti@declera.com>
+
+ * bg.po: Updated Bulgarian translation (style) by
+ Alexander Shopov <al_shopov@yahoo.com>.
+
+2002-12-18 Artis Trops <hornet@navigator.lv>
+
+ * lv.po: Updated Latvian translation.
+
+2002-12-18 Ole Laursen <olau@hardworking.dk>
+
+ * da.po: Updated Danish translation.
+
+2002-12-18 Stanislav Visnovsky <visnovsky@nenya.ms.mff.cuni.cz>
+
+ * sk.po: Updated Slovak translation.
+
+2002-12-18 Dmitry G. Mastrukov <dmitry@taurussoft.org>
+
+ * ru.po: updated Russian translation
+ * from Russian team <gnome-cyr@gnome.org>.
+
+2002-12-17 German Poo-Caaman~o
+
+ * es.po: Updated Spanish translation
+
+2002-12-16 Tor Lillqvist <tml@iki.fi>
+
+ * fi.po: In the admittedly strangely worded "Channel set flags
+ unsupported" message, "set" is a verb.
+
+2002-12-15 Christian neumair <chris@gnome-de.org>
+
+ * de.po: Updated German translation.
+
+2002-12-15 Christophe Merlet <redfox@redfoxcenter.org>
+
+ * fr.po: Updated French translation.
+
+2002-12-12 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: Updated Albanian translation.
+
+2002-12-12 Yanko Kaneti <yaneti@declera.com>
+
+ * bg.po: Updated Bulgarian translation.
+
+2002-12-11 Pauli Virtanen <pauli.virtanen@hut.fi>
+
+ * fi.po: Added Finnish translation from Lauri Nurmi.
+
+Wed Dec 11 14:06:50 2002 Owen Taylor <otaylor@redhat.com>
+
+ * po/Makefile.in.in: Fix problem from recent commit where
+ non GNU-format message catalogs would be installed in
+ datadir. Remove some leftover setting of PATH=../src:$PATH.
+
+2002-12-11 Gil Osher <dolfin@rpg.org.il>
+
+ * he.po: Added Hebrew translation.
+
+2002-12-09 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Updated Norwegian (bokmal) translation.
+ * nn.po: Updated Norwegian (nynorsk) translation from Gaute
+ Hope <gautikk@c2i.net>
+
+2002-12-09 Artis Trops <hornet@navigator.lv>
+
+ * lv.po: sync with gnome-2-0 branch.
+
+2002-12-05 Takayuki KUSANO <AE5T-KSN@asahi-net.or.jp>
+
+ * ja.po: Updated Japanese translation.
+
+Tue Dec 3 20:40:56 2002 Owen Taylor <otaylor@redhat.com>
+
+ * Makefile.in.in: Use datadir, not $(prefix)/share. (#89339)
+
+2002-12-03 Kostas Papadimas <pkst@gmx.net>
+
+ * el.po: updated Greek translation
+
+2002-12-03 Miloslav Trmac <mitr@volny.cz>
+
+ * cs.po: Merged Czech translation from gnome-2-0.
+
+2002-12-03 Dmitry G. Mastrukov <dmitry@taurussoft.org>
+
+ * ru.po: updated Russian translation
+ * from Russian team <gnome-cyr@gnome.org>.
+
+2002-11-30 Ole Laursen <olau@hardworking.dk>
+
+ * da.po: Updated Danish translation.
+
+2002-11-26 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Updated Swedish translation.
+
+2002-11-25 Vincent van Adrighem <V.vanAdrighem@dirck.mine.nu>
+
+ * nl.po: Massive copy-paste from stable branch.
+
+2002-11-25 Hasbullah Bin Pit <sebol@ikhlas.com>
+
+ * ms.po: Updated Malay Translation.
+
+2002-11-22 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Updated Norwegian (bokmal) translation.
+
+2002-11-22 Dmitry G. Mastrukov <dmitry@taurussoft.org>
+
+ * be.po: Updated Belarusian translation
+ * from Belarusian team <i18n@infonet.by>.
+
+2002-11-13 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: Updated Albanian translation.
+
+2002-11-04 Hasbullah Bin Pit <sebol@ikhlas.com>
+
+ * ms.po: Updated Malay Translation.
+
+2002-11-03 Dmitry G. Mastrukov <dmitry@taurussoft.org>
+
+ * be.po: Added Belarusian translation
+ * from Belarusian team <i18n@infonet.by>.
+
+2002-10-13 Laurent Dhima <laurenti@alblinux.net>
+
+ * sq.po: added albanian translation
+
+2002-10-04 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Updated Norwegian (bokm�) translation.
+
+2002-09-22 Christopher R. Gabriel <cgabriel@cgabriel.org>
+
+ * it.po: added italian translation
+
+2002-08-24 Fatih Demir <kabalak@gtranslator.org>
+
+ * ta.po: Committed.
+
+2002-08-23 Roozbeh Pournader <roozbeh@sharif.edu>
+
+ * fa.po: Updated Persian translation.
+
+2002-08-20 Roozbeh Pournader <roozbeh@sharif.edu>
+
+ * fa.po: Update Persian translation.
+
+2002-08-20 Roozbeh Pournader <roozbeh@sharif.edu>
+
+ * fa.po: Added Persian translation.
+
+2002-08-10 Gustavo Noronha Silva <kov@debian.org>
+
+ * pt_BR: new translation
+
+2002-06-26 Yanko Kaneti <yaneti@declera.com>
+
+ * bg.po (added): Bulgarian translation by
+ Borislav Aleksandrov <B.Aleksandrov@cnsys.bg>.
+
+2002-06-05 Christophe Merlet <christophe@merlet.net>
+
+ * fr.po: Updated French translation.
+
+2002-06-04 Jordi Mallach <jordi@sindominio.net>
+
+ * ca.po: Updated Catalan translation.
+
+Wed May 22 15:24:04 2002 Owen Taylor <otaylor@redhat.com>
+
+ * README.translators: Add from GTK+.
+
+ * *.po: Convert all po files to UTF-8.
+
+2002-05-18 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Updated Swedish translation.
+
+2002-05-16 Duarte Loreto <happyguy_pt@hotmail.com>
+
+ * pt.po: Updated Portuguese translation.
+
+2002-05-12 Christophe Merlet <christophe@merlet.net>
+
+ * fr.po: Updated French translation.
+
+2002-05-10 Naba Kumar <kh_naba@users.sourceforge.net>
+
+ * hi.po: New Hindi translation added.
+
+2002-05-06 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * vi.po: Updated Vietnamese file
+
+2002-04-30 Duarte Loreto <happyguy_pt@hotmail.com>
+
+ * pt.po: Converted Portuguese translation to UTF-8.
+
+2002-04-29 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * vi.po: Added Vietnamese file
+ * az.po,cs.po,ko.po,lv.po,nn.po: fixed syntax errors
+
+2002-04-28 Christophe Merlet <christophe@merlet.net>
+
+ * fr.po: Updated French translation.
+
+2002-04-18 Vincent van Adrighem <V.vanAdrighem@dirck.mine.nu>
+
+ * nl.po: Updated Dutch translation by Ronald Hummelink.
+
+2002-04-07 Stanislav Brabec <utx@penguin.cz>
+
+ * cs.po: Added Czech translation from Petr Pytelka
+ <pyta@lightcomp.cz>.
+
+2002-03-31 Abel Cheung <maddog@linux.org.hk>
+
+ * zh_TW.po: Updated traditional Chinese translation, and removed
+ all positional parameters :(
+
+2002-03-28 Valek Filippov <frob@df.ru>
+
+ * ru.po: Updated russian translation.
+
+2002-03-17 Valek Filippov <frob@df.ru>
+
+ * ru.po: Updated russian translation.
+
+2002-03-17 Wang Jian <lark@linux.net.cn>
+
+ * zh_CN.po: Updated Simplified Chinese translation.
+
+2002-03-16 Christian Meyer <chrisime@gnome.org>
+
+ * de.po: Updated German translation.
+
+2002-03-15 Christophe Merlet <christophe@merlet.net>
+
+ * fr.po: Updated French translation.
+
+2002-03-10 Valek Filippov <frob@df.ru>
+
+ * ru.po: Updated russian translation.
+
+2002-03-06 Germ� Poo-Caamao <gpoo@ubiobio.cl>
+
+ * es.po: Updated spanish translation.
+
+2002-03-04 Duarte Loreto <happyguy_pt@hotmail.com>
+
+ * pt.po: Updated Portuguese translation.
+
+2002-03-03 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Updated Norwegian (bokm�) translation.
+
+2002-03-02 Hasbullah Bin Pit <sebol@ikhlas.com>
+
+ * ms.po: Updated Malay Translation.
+
+2002-03-02 Changwoo Ryu <cwryu@debian.org>
+
+ * ko.po: Updated Korean translation.
+
+2002-03-01 Sven Neumann <sven@gimp.org>
+
+ * de.po: fixed typo in german translation.
+
+2002-02-28 Ole Laursen <olau@hardworking.dk>
+
+ * da.po: Updated Danish translation.
+
+2002-02-28 Zbigniew Chyla <cyba@gnome.pl>
+
+ * pl.po: Updated Polish translation by
+ GNOME PL Team <translators@gnome.pl>.
+
+2002-02-28 Christian Meyer <chrisime@gnome.org>
+
+ * de.po: Updated German translation.
+
+2002-02-27 Stanislav Visnovsky <visnovsky@nenya.ms.mff.cuni.cz>
+
+ * sk.po: Updated Slovak translation.
+
+2002-02-26 Christophe Merlet <christophe@merlet.net>
+
+ * fr.po: Updated French translation and
+ converted to UTF-8.
+
+2002-02-27 Takayuki KUSANO <AE5T-KSN@asahi-net.or.jp>
+
+ * ja.po: Updated Japanese translation.
+
+2002-02-26 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Updated Swedish translation.
+
+2002-02-25 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Fixed Swedish translation.
+
+2002-02-25 Hasbullah Bin Pit <sebol@ikhlas.com>
+
+ * ms.po: Updated Malay Translation.
+
+2002-02-25 Valek Filippov <frob@df.ru>
+
+ * ru.po: Updated russian translation.
+
+2002-02-25 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Updated Swedish translation.
+
+2002-02-23 Ole Laursen <olau@hardworking.dk>
+
+ * da.po: Updated Danish translation.
+
+2002-02-20 Simos Xenitellis <simos@hellug.gr>
+
+ * el.po: Added Greek translation.
+
+2002-02-19 Takayuki KUSANO <AE5T-KSN@asahi-net.or.jp>
+
+ * ja.po: Updated Japanese translation.
+
+2002-02-17 Wang Jian <lark@linux.net.cn>
+
+ * zh_CN.po: Updated Simplified Chinese translation by
+ Wang Jian.
+
+2002-02-12 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Updated Norwegian (bokm�) translation.
+
+2002-02-10 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Updated Norwegian (bokm�) translation.
+
+2002-02-07 Changwoo Ryu <cwryu@debian.org>
+
+ * ko.po: Added Korean translation.
+
+2002-02-07 Abel Cheung <maddog@linux.org.hk>
+
+ * zh_TW.po: Updated traditional Chinese translation.
+
+2002-02-05 Takayuki KUSANO <AE5T-KSN@asahi-net.or.jp>
+
+ * ja.po: Converted to UTF-8.
+
+2002-01-31 jacob berkman <jacob@ximian.com>
+
+ * Makefile.in.in: remove cat-id-tbl.c references (this really
+ fixes this build)
+
+ * Makefile.in.in (DISTFILES): remove stamp-cat-id
+
+ * Makefile.in.in: remove references to po2tbl.sed.in
+
+2002-01-31 Roy-Magne Mo <rmo@sunnmore.net>
+
+ * nn.po: Update Norwegian (nynorsk) translation.
+
+2002-01-29 Zbigniew Chyla <cyba@gnome.pl>
+
+ * pl.po: Updated Polish translation by
+ GNOME PL Team <translators@gnome.pl>.
+
+2002-01-28 Zbigniew Chyla <cyba@gnome.pl>
+
+ * pl.po: Updated Polish translation by
+ GNOME PL Team <translators@gnome.pl>.
+
+2002-01-28 Roy-Magne Mo <rmo@sunnmore.net>
+
+ * nn.po: Updated Norwegian (nynorsk) translation and switched to UTF-8.
+
+2002-01-28 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Updated and converted to UTF-8.
+
+2002-01-27 Dirk-Jan Binnema <djcb@djcbsoftware.nl>
+
+ * nl.po: Updated dutch translation
+
+2002-01-25 Ole Laursen <olau@hardworking.dk>
+
+ * da.po: Updated Danish translation and switched to UTF-8.
+
+2002-01-23 ERDI Gergo <cactus@cactus.rulez.org>
+
+ * Makefile.in.in (POTFILES): Remove inlttool [] tags from
+ POTFILE.in
+
+2002-01-21 Zbigniew Chyla <cyba@gnome.pl>
+
+ * pl.po: Updated Polish translation by
+ GNOME PL Team <translators@gnome.pl>.
+
+2002-01-15 Peteris Krisjanis <peteris.krisjanis@ttc.lv>
+
+ * lv.po: Added Latvian translation.
+
+2002-01-13 Hasbullah Bin Pit <sebol@ikhlas.com>
+
+ * ms.po: Added Malay (Bahasa Melayu) translation.
+
+2002-01-11 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Updated Norwegian (bokm�) translation.
+
+2002-01-09 Takayuki KUSANO <AE5T-KSN@asahi-net.or.jp>
+
+ * ja.po: Remove %m$ notation that can't be used with
+ g_set_error().
+
+2002-01-07 Zbigniew Chyla <cyba@gnome.pl>
+
+ * pl.po: Updated Polish translation by
+ GNOME PL Team <translators@gnome.pl>.
+
+2002-01-04 Stanislav Visnovsky <visnovsky@nenya.ms.mff.cuni.cz>
+
+ * sk.po: Updated Slovak translation.
+
+2001-12-27 Duarte Loreto <happyguy_pt@hotmail.com>
+
+ * pt.po: Added portuguese translation
+
+2001-12-27 Jesus Bravo Alvarez <jba@pobox.com>
+
+ * gl.po: Updated Galician translation from
+ Manuel A. Fernandez Montecelo <manuel@sindominio.net>
+
+2001-12-24 Vasif Ismailogu MD <azerb_linux@hotmail.com>
+
+ * az:po updating Azerbaijani translation file
+
+2001-12-21 Takayuki KUSANO <AE5T-KSN@asahi-net.or.jp>
+
+ * ja.po: Updated Japanese translation.
+
+2001-12-19 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Updated Swedish translation.
+
+2001-12-18 Takayuki KUSANO <AE5T-KSN@asahi-net.or.jp>
+
+ * ja.po: Updated Japanese translation.
+
+2001-12-15 Valek Filippov <frob@df.ru>
+
+ * ru.po: Updated russian translation.
+
+2001-12-15 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Updated Swedish translation.
+
+2001-12-13 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Updated Norwegian (bokm�) translation.
+
+2001-12-11 Stanislav Visnovsky <visnovsky@nenya.ms.mff.cuni.cz>
+
+ * sk.po: Updated Slovak translation.
+
+2001-12-11 Abel Cheung <maddog@linux.org.hk>
+
+ * zh_TW.po: Updated traditional Chinese translation.
+
+2001-12-10 Takayuki KUSANO <AE5T-KSN@asahi-net.or.jp>
+
+ * ja.po: Updated Japanese translation.
+
+2001-12-08 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Updated Swedish translation.
+
+2001-12-04 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Updated Norwegian (bokm�) translation.
+ * POTFILES.in: Added glib/gdir.c.
+
+2001-12-03 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Updated Swedish translation.
+
+2001-11-26 Jesus Bravo Alvarez <jba@pobox.com>
+
+ * gl.po: Added Galician translation from
+ Manuel A. Fern�dez Montecelo <manuel@sindominio.net>
+
+2001-11-23 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
+
+ * nl.po: Added Dutch translation.
+
+2001-11-20 Abel Cheung <maddog@linux.org.hk>
+
+ * zh_TW.po: Updated traditional Chinese translation.
+
+2001-11-15 Takayuki KUSANO <AE5T-KSN@asahi-net.or.jp>
+
+ * ja.po: Added Japanese translation.
+
+2001-11-14 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Updated Norwegian (bokm�) translation.
+
+2001-11-07 Wang Jian <lark@linux.net.cn>
+
+ * zh_CN.po: Updated Simplified Chinese translation by
+ Wang Jian.
+
+2001-11-06 Wang Jian <lark@linux.net.cn>
+
+ * zh_CN.po: Added Simplified Chinese translation by
+ He Qiangqiang <carton@263.net>.
+
+2001-11-01 Marius Andreiana <mandreiana@yahoo.com>
+
+ * ro.po: added
+
+2001-10-28 jacob berkman <jacob@ximian.com>
+
+ * Makefile.in.in: install Makefile.in.in and po2tbl.sed.in for use
+ with glib-gettextize by other packages
+
+2001-10-13 Stanislav Visnovsky <visnovsky@nenya.ms.mff.cuni.cz>
+
+ * sk.po: More updates.
+
+2001-10-13 Valek Filippov <frob@df.ru>
+
+ * ru.po: Added russian translation.
+
+2001-10-12 Stanislav Visnovsky <visnovsky@nenya.ms.mff.cuni.cz>
+
+ * sk.po: Updated Slovak translation.
+
+2001-10-08 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * ca.po: Updated Catalan file
+
+2001-10-05 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * az.po: Updated Azeri file
+ * eu.po: Updated Basque file
+
+2001-09-29 Fatih Demir <kabalak@gtranslator.org>
+
+ * ta.po: Committed updated Tamil translation by Dinesh.
+
+2001-09-28 Stanislav Visnovsky <visnovsky@nenya.ms.mff.cuni.cz>
+
+ * sk.po: Updated Slovak translation.
+
+2001-09-28 Tor Lillqvist <tml@iki.fi>
+
+ * POTFILES.in: Add iochannel.c and giowin32.c.
+
+ * sv.po: Remove a bogus fuzziness indicator.
+
+2001-09-25 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * ca.po: Updated Catalan file
+
+2001-09-24 Stanislav Visnovsky <visnovsky@nenya.ms.mff.cuni.cz>
+
+ * sk.po: Added Slovak translation.
+
+2001-09-23 Fatih Demir <kabalak@gtranslator.org>
+
+ * ta.po: Committed updated Tamil translation by Dinesh.
+
+2001-09-23 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * az.po: Updated Azeri file
+
+2001-09-19 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Updated Norwegian (bokm�) translation.
+
+2001-09-11 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Updated Swedish translation.
+
+2001-09-06 Roy-Magne Mo <rmo@sunnmore.net>
+
+ * nn.po: Updated Norwegian nynorsk translation
+
+2001-09-05 Ross Golder <rossg@golder.org>
+
+ * Makefile.in.in (install-data-yes): Take DESTDIR into account
+
+Wed Sep 5 09:27:34 2001 Owen Taylor <otaylor@redhat.com>
+
+ * Revert last change to Makefile.in.in - no this
+ is not the Makefile.in.in from gettext.
+
+2001-09-05 Ross Golder <ross@golder.org>
+
+ * Makefile.in.in: Updated from more recent gettext to fix
+ problem with DESTDIR.
+
+2001-09-02 Carlos Perell Mar� <carlos@gnome-db.org>
+
+ * es.po: Added Spanish translation by jos�antonio salgueiro
+ <joseantsa@retemail.es>
+
+2001-08-21 Abel Cheung <maddog@linux.org.hk>
+
+ * zh_TW.po: Preliminary traditional Chinese translation.
+
+2001-08-19 Fatih Demir <kabalak@gtranslator.org>
+
+ * ta.po: Added Tamil translation by.
+
+2001-07-29 Christian Meyer <chrisime@gnome.org>
+
+ * de.po: Removed one fuzzy.
+
+2001-07-17 Kjartan Maraas <kmaraas@gnome.org>
+
+ * nn.po: Added Norwegian (nynorsk) translation.
+
+2001-07-06 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Updated Swedish translation.
+
+2001-07-06 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * eu.po: Added Basque file
+
+2001-06-27 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Completed Norwegian translation.
+ * POTFILES.in: Adjusted to fit the move of the .c files.
+
+2001-06-08 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * az.po: Added Azeri file
+
+2001-05-15 Matthias Warkus <mawarkus@gnome.org>
+
+ * de.po: Brought this up to date.
+
+2001-04-30 Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ * ca.po: Added Catalan file
+
+2001-04-05 Christian Rose <menthos@menthos.com>
+
+ * sv.po: And other fixes. Thanks to Gran Uddeborg
+ <goeran@uddeborg.pp.se>.
+
+2001-04-05 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Fixed another message in the Swedish translation. Thanks to
+ Jrgen Tegn� <teg@post.utfors.se>.
+
+2001-04-05 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Fixed Swedish translation, thanks to Veronica Loell
+ <info@nakawe.se> and Martin Norb�k <d95mback@dtek.chalmers.se>.
+
+2001-04-05 Christian Rose <menthos@menthos.com>
+
+ * sv.po: Added Swedish translation.
+
+2001-30-03 Christian Meyer <chrisime@gnome.org>
+
+ * de.po: Updated German translation.
+
+2001-07-03 Christian Meyer <chrisime@gnome.org>
+
+ * de.po: Added German translation.
+
+2001-03-02 Christophe Merlet <christophe@merlet.net>
+
+ * fr.po: Added French translation.
+
+2001-02-19 Valek Filippov <frob@df.ru>
+
+ * ru.po: Added russian translation.
+
+2001-02-08 Fatih Demir <kabalak@kabalak.net>
+
+ * tr.po: Added the Turkish translation by
+ Kemal Yilmaz.
+
+2001-01-18 Kjartan Maraas <kmaraas@gnome.org>
+
+ * no.po: Added Norwegian translation.
+
+
+a
diff --git a/trunk/po/Makefile.in.in b/trunk/po/Makefile.in.in
new file mode 100644
index 000000000..7c26df4c0
--- /dev/null
+++ b/trunk/po/Makefile.in.in
@@ -0,0 +1,271 @@
+# Makefile for program source directory in GNU NLS utilities package.
+# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# This file file be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+# Please note that the actual code is *not* freely available.
+#
+# - Modified by Owen Taylor <otaylor@redhat.com> to use GETTEXT_PACKAGE
+# instead of PACKAGE and to look for po2tbl in ./ not in intl/
+#
+# - Modified by jacob berkman <jacob@ximian.com> to install
+# Makefile.in.in and po2tbl.sed.in for use with glib-gettextize
+
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+datadir = @datadir@
+libdir = @libdir@
+localedir = $(libdir)/locale
+gnulocaledir = $(datadir)/locale
+gettextsrcdir = $(datadir)/glib-2.0/gettext/po
+subdir = po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = $(top_srcdir)/@MKINSTALLDIRS@
+
+CC = @CC@
+GENCAT = @GENCAT@
+GMSGFMT = @GMSGFMT@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+XGETTEXT = @XGETTEXT@
+MSGMERGE = msgmerge
+
+DEFS = @DEFS@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I.. -I$(top_srcdir)/intl
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+SOURCES =
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(GETTEXT_PACKAGE).pot \
+$(POFILES) $(GMOFILES) $(SOURCES)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+INSTOBJEXT = @INSTOBJEXT@
+
+.SUFFIXES:
+.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat
+
+.c.o:
+ $(COMPILE) $<
+
+.po.pox:
+ $(MAKE) $(GETTEXT_PACKAGE).pot
+ $(MSGMERGE) $< $(srcdir)/$(GETTEXT_PACKAGE).pot -o $*.pox
+
+.po.mo:
+ $(MSGFMT) -o $@ $<
+
+.po.gmo:
+ file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \
+ && rm -f $$file && $(GMSGFMT) $(MSGFMT_OPTS) -o $$file $<
+
+.po.cat:
+ sed -f ../intl/po2msg.sed < $< > $*.msg \
+ && rm -f $@ && $(GENCAT) $@ $*.msg
+
+
+all: all-@USE_NLS@
+
+all-yes: $(CATALOGS)
+all-no:
+
+$(srcdir)/$(GETTEXT_PACKAGE).pot: $(POTFILES)
+ $(XGETTEXT) --default-domain=$(GETTEXT_PACKAGE) --directory=$(top_srcdir) \
+ --add-comments --keyword=_ --keyword=N_ \
+ --flag=g_strdup_printf:1:c-format \
+ --flag=g_string_printf:2:c-format \
+ --flag=g_string_append_printf:2:c-format \
+ --flag=g_error_new:3:c-format \
+ --flag=g_set_error:4:c-format \
+ --flag=g_markup_printf_escaped:1:c-format \
+ --flag=g_log:3:c-format \
+ --flag=g_print:1:c-format \
+ --flag=g_printerr:1:c-format \
+ --flag=g_printf:1:c-format \
+ --flag=g_fprintf:2:c-format \
+ --flag=g_sprintf:2:c-format \
+ --flag=g_snprintf:3:c-format \
+ --flag=g_scanner_error:2:c-format \
+ --flag=g_scanner_warn:2:c-format \
+ --files-from=$(srcdir)/POTFILES.in \
+ && test ! -f $(GETTEXT_PACKAGE).po \
+ || ( rm -f $(srcdir)/$(GETTEXT_PACKAGE).pot \
+ && mv $(GETTEXT_PACKAGE).po $(srcdir)/$(GETTEXT_PACKAGE).pot )
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+install-data-no: all
+install-data-yes: all
+ if test -r "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $(DESTDIR)$(datadir); \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(datadir); \
+ fi
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ case "$$cat" in \
+ *.gmo) destdir=$(gnulocaledir);; \
+ *) destdir=$(localedir);; \
+ esac; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ dir=$(DESTDIR)$$destdir/$$lang/LC_MESSAGES; \
+ if test -r "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $$dir; \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \
+ fi; \
+ if test -r $$cat; then \
+ $(INSTALL_DATA) $$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ echo "installing $$cat as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \
+ else \
+ $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \
+ fi; \
+ if test -r $$cat.m; then \
+ $(INSTALL_DATA) $$cat.m $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ echo "installing $$cat.m as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \
+ else \
+ if test -r $(srcdir)/$$cat.m ; then \
+ $(INSTALL_DATA) $(srcdir)/$$cat.m \
+ $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \
+ else \
+ true; \
+ fi; \
+ fi; \
+ done
+ if test "$(PACKAGE)" = "glib"; then \
+ if test -r "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $(DESTDIR)$(gettextsrcdir); \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(gettextsrcdir); \
+ fi; \
+ $(INSTALL_DATA) $(srcdir)/Makefile.in.in \
+ $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \
+ else \
+ : ; \
+ fi
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \
+ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \
+ done
+ if test "$(PACKAGE)" = "glib"; then \
+ rm -f $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \
+ fi
+
+check: all
+
+dvi info tags TAGS ID:
+
+mostlyclean:
+ rm -f core core.* *.pox $(GETTEXT_PACKAGE).po *.old.po cat-id-tbl.tmp
+ rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f $(GMOFILES)
+
+distdir = ../$(GETTEXT_PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: update-po $(DISTFILES)
+ dists="$(DISTFILES)"; \
+ for file in $$dists; do \
+ ln $(srcdir)/$$file $(distdir) 2> /dev/null \
+ || cp -p $(srcdir)/$$file $(distdir); \
+ done
+
+update-po: Makefile
+ $(MAKE) $(GETTEXT_PACKAGE).pot
+ tmpdir=`pwd`; \
+ cd $(srcdir); \
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ echo "$$lang:"; \
+ if $(MSGMERGE) $$lang.po $(GETTEXT_PACKAGE).pot -o $$tmpdir/$$lang.new.po; then \
+ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+ rm -f $$tmpdir/$$lang.new.po; \
+ else \
+ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+ :; \
+ else \
+ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ exit 1; \
+ fi; \
+ fi; \
+ else \
+ echo "msgmerge for $$cat failed!"; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ fi; \
+ done
+
+# POTFILES is created from POTFILES.in by stripping comments, empty lines
+# and Intltool tags (enclosed in square brackets), and appending a full
+# relative path to them
+POTFILES: POTFILES.in
+ ( if test 'x$(srcdir)' != 'x.'; then \
+ posrcprefix='$(top_srcdir)/'; \
+ else \
+ posrcprefix="../"; \
+ fi; \
+ rm -f $@-t $@ \
+ && (sed -e '/^#/d' \
+ -e "s/^\[.*\] +//" \
+ -e '/^[ ]*$$/d' \
+ -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \
+ | sed -e '$$s/\\$$//') > $@-t \
+ && chmod a-w $@-t \
+ && mv $@-t $@ )
+
+Makefile: Makefile.in.in ../config.status POTFILES
+ cd .. \
+ && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \
+ $(SHELL) ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/trunk/po/POTFILES.in b/trunk/po/POTFILES.in
new file mode 100644
index 000000000..20bfc59fb
--- /dev/null
+++ b/trunk/po/POTFILES.in
@@ -0,0 +1,15 @@
+glib/gbookmarkfile.c
+glib/gconvert.c
+glib/gdir.c
+glib/gfileutils.c
+glib/giochannel.c
+glib/giowin32.c
+glib/gmappedfile.c
+glib/gmarkup.c
+glib/gregex.c
+glib/gshell.c
+glib/gspawn-win32.c
+glib/gspawn.c
+glib/gutf8.c
+glib/goption.c
+glib/gkeyfile.c
diff --git a/trunk/po/README.translators b/trunk/po/README.translators
new file mode 100644
index 000000000..984392c58
--- /dev/null
+++ b/trunk/po/README.translators
@@ -0,0 +1,25 @@
+All the .po files are now in UTF-8!
+
+For information on editing UTF-8 files on Unix, see
+<http://www.cl.cam.ac.uk/~mgk25/unicode.html>
+
+If you just want to convert it back to your native encoding to
+edit and then convert again to UTF-8 to commit, please see the
+scripts in gnome-i18n/UTF-8, for example
+
+ export ENCODING_TO=ISO-8859-15
+ utftopo fi.po
+ emacs fi.po
+ potoutf.sh fi.po
+ cvs commit fi.po
+
+Alternatively, you can use the gettext package (>= 0.11) to convert
+your translation to and from your native encoding:
+
+msgconv -t ISO-8859-15 fi.po > fi.native.po
+emacs fi.native.po
+msgconv -t UTF-8 fi.native.po > fi.po
+cvs commit fi.po
+
+If you need help with this, ask, but please don't commit
+non-UTF-8 files here.
diff --git a/trunk/po/am.po b/trunk/po/am.po
new file mode 100644
index 000000000..eccfc76ce
--- /dev/null
+++ b/trunk/po/am.po
@@ -0,0 +1,886 @@
+# Translations into the Amharic Language.
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# This file is distributed under the same license as the glib package.
+# Ge'ez Frontier Foundation <locales@geez.org>, 2002.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2003-01-16 08:39+EDT\n"
+"Last-Translator: Ge'ez Frontier Foundation <locales@geez.org>\n"
+"Language-Team: Amharic <locales@geez.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr ""
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr ""
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr ""
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr ""
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr ""
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr ""
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr ""
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr ""
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s'ን ተቀብሏል"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr ""
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr ""
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr ""
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr ""
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr ""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr ""
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr ""
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr ""
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr ""
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr ""
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr ""
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr ""
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr ""
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr ""
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr ""
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr ""
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr ""
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr ""
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr ""
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr ""
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr ""
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr ""
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr ""
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr ""
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "የማይሰራ የUTF-8 ጽሑፍ"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr ""
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr ""
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr ""
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr ""
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr ""
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr ""
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+msgid "unfinished symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr ""
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr ""
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr ""
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr ""
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr ""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr ""
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr ""
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr ""
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr ""
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr ""
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr ""
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr ""
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr ""
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
+
+#~ msgid "Socket error"
+#~ msgstr "የሶከት ስህተት"
diff --git a/trunk/po/ar.po b/trunk/po/ar.po
new file mode 100644
index 000000000..b78bea44e
--- /dev/null
+++ b/trunk/po/ar.po
@@ -0,0 +1,909 @@
+# translation of glib.glib-2-12.ar.po to Arabic
+# translation of glib.po to
+# Copyright (C) 2001,2002,2003, 2006, 2007 Free Software Foundation, Inc.
+#
+# Isam Bayazidi <bayazidi@arabeyes.org>, 2001,2002.
+# Arafat Medini <lumina@silverpen.de>, 2003.
+# Djihed Afifi <djihed@gmail.com>, 2006, 2007.
+# Khaled Hosny <khaledhosny@eglug.org>, 2006, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.glib-2-12.ar\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-05-02 10:44+0100\n"
+"Last-Translator: Djihed Afifi <djihed@gmail.com>\n"
+"Language-Team: Arabic <doc@arabeyes.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : n>=3 && "
+"n<=10 ? 2 : 3\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "صفة غير متوقّعة '%s' للعنصر '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "الصفة '%s' للعنصر '%s' غير موجودة"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "وسْم غير متوقع '%s'، توقّعت الوسْم '%s'"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "وسْم غير متوقّع '%s' داخل '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "لا يوجد ملف علامة موقع صحيح في أدلّة البيانات"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "توجد بالفعل علامة موقع للمسار '%s'"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "لا توجد علامة موقع للمسار '%s'"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "لم يعرّف نوع MIME في علامة موقع المسار '%s'"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "لم يعرف علم خاص في العلامات للمسار '%s'"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "لم تحدد أي مجموعات في علامة موقع '%s'"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "لم يسجل أي تطبيق بالإسم '%s' علامة موقع لـ '%s'"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "فشل تمديد سطر exec '%s' بالمسار '%s'"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "التحويل من مجموعة المحارف '%s' إلى '%s' غير مدعوم"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "تعذّر فتح المُحوِّل من '%s' الى '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "سلسلة بايتات غير سليمة في دخْل التحويل"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "خطأ أثناء التحويل: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "تتابع محارف جزئي عند نهاية الدخْل"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "تعذّر تحويل fallback '%s' الى مجموعة المحارف '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "المسار '%s' ليس مسارا مطلقا باستخدام المخطط \"file\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "ملف المسار المحلي '%s' قد لا يحتوي على '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "المسار '%s' غير سليم"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "اسم مستضيف المسار '%s' غير سليم"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "المسار '%s' يحتوي على حروف هربت بطريقة غير سليمة "
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "اسم المسار '%s' ليس مسارا كاملا"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "اسم المستضيف غير سليم"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "خطأ أثناء فتح الدليل '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "تعذّر تحديد بايتات %lu لقرائة الملف \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "خطأ عند قراءة الملف '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "فشلت القراءة من الملف '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "فشل فتح الملف '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "فشلت في أخذ صفات الملف '%s': فشل fstat(): %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "فشل فتح الملف '%s': فشل fdopen(): %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "فشل إعادة تسمية الملف '%s' إلى '%s': فشل g_rename(): %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "فشل إنشاء الملف '%s': %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "فشل فتح الملف '%s' للكتابة: فشل fdopen(): %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "فشلت في كتابة الملف '%s': فشل fwrite(): %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "فشلت في غلق الملف '%s': فشل fclose(): %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "لا يمكن حذف الملف الموجود مسبقا '%s': فشل g_unlink(): %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "القالب '%s' غير سليم، لا يجب أن يحتوي على '%s'"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "لا يحتوي القالب '%s' على XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "فشلت قراءة الوصلة الرمزية '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "الوصلات الرمزية غير مدعومة"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "تعذّر فتح المُحوِّل من '%s' الى '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "لا يمكن عمل قراءة خام في g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "بيانات غير مُحوّلة باقية في حاجز القراءة الخلفي"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "تنتهي القناة عند محرف جزئي"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "لا يمكن عمل قراءة خام في g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "فشل فتح الملف '%s': فشل open(): %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "فشل في مقابلة الملف'%s': mmap() فشل: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "خطأ في السطر %d المحرف %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "خطأ في السطر %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr "رُؤي كيان فارغ '&;'، الكيانات السليمة هي:&amp; &quot; &lt; &gt; &apos; "
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"المحرف '%s' غير سليم عند بداية اسم الكيان؛ المحرف & يبدأ كيانا، ان كان علامة "
+"اﻻمبارساند هذه غير موضوعة على انها كيان، تخطاها باعتبارها &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "المحرف '%s' غير موجود داخل اسم أي كيان"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "اسم الكيان '%s' غير معروف"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"اسم الكيان لم ينته بفاصلة منقوطة؛ الأرجح أنك استخدمت علامة امبارساند دون أن "
+"تنوي بدء كيان - تخطا العلامة عن طريق اعتبارها &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"فشل في تحليل '%-.*s'، والتي كان لابد من كتبتها بالأرقام داخل مرجع محرف "
+"(&#234; كمثال) - ربما الرقم كبير جداً"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "مرجع المحرف '%-.*s' لا يقوم بترميز محرف مسموح به"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "مرجع محرف فارغ؛ يجب أن يتضمن رقما مثل &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"مرجع المحرف لم ينته بفاصلة منقوطة؛ الأرجح أنك استخدمت علامة امبارساند دون أن "
+"تنوي بدء كيان - تخطا العلامت عن طريق اعتبارها &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "مرجع كيان غير مكتمل"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "مرجع محرف غير مكتمل"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "نص مرمّز بـ UTF-8 غير سليم"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "يجب أن يبدأ المستند بعنصر (<book> مثلا)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr "'%s' محرف غير سليم بعد المحرف '<'؛ ربما لا يبدأ هذا المحرف اسم عنصر"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr "محرف غريب '%s'، توقعت محرف '>' لإنهاء بداية علامة العنصر '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr "محرف غريب '%s'، توقعت '=' بعد اسم الصفة '%s' للعنصر '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"محرف غريب '%s'، توقعت المحرف '>' أو '/' لإنهاء علامة البداية للعنصر '%s'، أو "
+"بشكل اختياري صفة؛ ربما استخدمت محرفاً غير صالح في اسم صفة"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"محرف غريب '%s'، توقعت علامة اقتباس مفتوحة بعد علامة التساوي عند إعطاء قيمة "
+"من الصفة '%s' للعنصر '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr "'%s' محرف غير صالح بعد الرموز '</'; '%s' ربما لن يبدأ اسم عنصر"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr "'%s' محرف غير صالح بعد اغلاق اسم العنصر '%s'؛ المحرف المسموح به هو '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "العنصر '%s' كان مغلقا، لا عنصر مفتوح حاليا"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "العنصر '%s' كان مغلقا، لكن العنصر المفتوح حاليا هو '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "المستند كان فارغا أو كان يحتوي فقط على مساحات فارغة"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "انتهى المستند بشكل غير متوقع بعد قوس بزاوية '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"انتهى المستند بشكل غير متوقع مع عناصر لا زالت مفتوحة - '%s' كان آخر عنصر "
+"مفتوح"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"انتهى المستند بشكل غير متوقع، توقعت رؤية قوس ذا زاوية لينهي العلامة<%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "انتهى المستند بشكل غير متوقع داخل اسم عنصر"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "انتهى المستند بشكل غير متوقع داخل اسم صفة"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "انتهى المستند بشكل غير متوقع بعد علامة فتح عنصر"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"انتهى المستند بشكل غير متوقع بعد علامة التساوي اثر اسم صفة؛ لا توجد قيمة "
+"للصفة"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "انتهى المستند بشكل غير متوقع وهو داخلَ قيمة صفة"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "انتهى المستند بشكل غير متوقع داخل علامة انهاء للعنصر '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "انتهى المستند بشكل غير متوقع داخل تعليق أو تعليمات معالجة"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "خطأ في السطر %d المحرف %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "مرجع كيان غير مكتمل"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "النص المقتبس لا يبدأ بعلامة اقتباس"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "علامة اقتباس غير مطابقة في سطر الأوامر أو نص منقول من الصدفة"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "انتهى النص بعد المحرف '\\' (النص كان '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "انتهى النص قبل ايجاد المُقتَبَس لـ%c (النص كان '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "كان النص فارغا (أو كان يحتوي على فراغ أبيض)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "فشلت قراءة البيانات من العملية الإبنة"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "فشل عمل أنبوب للاتصال بالعملية الإبنة (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "فشلت القراءة من الأنبوب الإبن (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "فشل التغيير الى الدليل '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "فشل تنفيذ العملية الإبنة (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "اسم برنامج غير صحيح: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "سلسلة غير صالحة في متجه الأحجية عند%d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "سلسلة غير صالحة في البيئة: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "دليل عمل غير سليم: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "فشل تنفيذ البرنامج المساعد (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr "خطأ غير متوقع في g_io_channel_win32_poll() أثناء القراءة من عملية ابنة"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "فشلت قراءة البيانات من العملية الإبنة (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "خطأ غير متوقع في select() أثناء قراءة البيانات من العملية الإبنة (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "خطأ غير متوقع في waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "فشل تشعيب (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "فشل تنفيذ العملية الإبنة \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "فشل اعادة توجيه الخرْج أو الدخْل للعملية الإبنة (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "فشل تشعيب العملية الإبنة (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "خطأ غير معروف أثناء تنفيذ العملية الإبنة \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "فشلت قراءة بيانات كافية من أنبوب child pid (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "محرف خارج حدود UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "تتابع غير سليم في دخْل التحويل"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "محرف خارج حدود UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "الإستخدام:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "خيارات المساعدة:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "اعرض خيارات المساعدة"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "اعرض كل خيارات المساعدة"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "خيارات التطبيق:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "غير قادر على تحليل قيمة العدد الصحيح '%s' ل %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "قيمة الرقم الصحيح '%s' ل %s خارج المجال"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "غير قادر على تحليل القيمة المزدوجة '%s' ل %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "القيمة المزدوجة '%s' ل %s خارج المجال"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "خطأ أثناء تحليل الخيار %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "معامل %s مفقود"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "خيار مجهول %s"
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "لا يمكن إيجاد ملف مفتاح صحيح في دلائل البحث"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "ليس ملفا اعتياديا"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "الملف فارغ"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"ملف المفتاح يحتوي على سطر '%s' والذي ليس زوج قيمة مفاتيح ، مجموعة ، أو تعليق"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "اسم مجموعة غير صحيح: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "لا يبدأ ملف المفتاح بمجموعة"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "اسم مفتاح غير صحيح: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "يحتوي ملف المفتاع على ترميز غير مدعوم '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "لا يحتوي ملف المفتاح على المجموعة '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "لا يحتوي ملف المفتاح على المفتاح '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "يحتوي ملف المفتاح على المفتاح '%s' ذو القيمة '%s' التي ليست UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "ملف المفتاح يحتوي على مفتاح '%s' والذي لديه قيمة لايمكن تفسيرها."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"ملف المفتاح يحتوي على مفتاح '%s'في المجموعة '%s'والتي لديها قيمة لايمكن "
+"تفسيرها."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "لا يحتوي ملف المفتاح على مفتاح '%s' في المجموعة '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "ملف المفتاح يحتوي على محرف الهروب في آخر السطر"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "ملف المفتاح يحتوي على تسلسل هروب غير صالح '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "لا يمكن تفسير القيمة '%s' كعدد."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "قيمة عدد صحيح '%s' خارج المدى"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "لا يمكن تفسير القيمة '%s' كعدد عائم."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "لا يمكن تفسير القيمة '%s' كعدد بولياني."
diff --git a/trunk/po/az.po b/trunk/po/az.po
new file mode 100644
index 000000000..33a14039b
--- /dev/null
+++ b/trunk/po/az.po
@@ -0,0 +1,937 @@
+# translation of glib.HEAD.az.po to Azerbaijani Turkish
+# Copyright (C) 2001, 2004 Free Software Foundation, Inc.
+# KEMAL YILMAZ <kyilmaz@uekae.tubitak.gov.tr>, 2001.
+# Mətin Əmirov <metin@karegen.com>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.HEAD.az\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2004-02-02 12:12+0200\n"
+"Last-Translator: Mətin Əmirov <metin@karegen.com>\n"
+"Language-Team: Azerbaijani Turkish <gnome@azitt.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.0.2\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Tək hərf '%s', xüsusiyyət adı '%s' olan element '%s' dən sonra '=' gözlənilir"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "'%s' simvolik körpüsü oxuna bilmədi: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "`%s' hərf dəstəsindən `%s' hərf dəstəsinə dönüşdürmə dəstəklənmir"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "`%s' dən `%s' ə dönüşdürücü açıla bilmir: %s"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "dönüşdürmə girişində hökmsüz bayt qatarı"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Dönüşdürmə sırasında xəta yarandı: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Girişin sonunda parçalı hərf qatarı"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "fallback '%s' hərf dəstəsi '%s' ə dönüşdürülə bilmir"
+
+#: glib/gconvert.c:1727
+#, fuzzy, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "`%s' URI-si fayl sxemini işlədən mütləq URI deyildir"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Yerli fayl uRI-si `%s' `#' daxil edə bilməz"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "`%s' URI-si səhvdir"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "`%s' URI-sinin qovşaq adı səhv qaçırılmış"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "`%s'in URİ-si səhv qaçırılmış xarakterlər daxil edir"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "`%s'in cığır adı mütləq cığır deyildir"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Hökmsüz qovşaq adı"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Cərgə açma xətası: '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "\"%2$s\" faylını oxumaq üçün %1$lu bayt ayrıla bilmir"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Fayl oxuma xətası: '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Fayldan oxuma iflası '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Fayl açma iflası '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Faylın xüsusiyyətlərini əldə etmə iflası '%s': fstat() iflası: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Fayl açma iflası '%s': fdopen() iflası: %s"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Fayl açma iflası '%s': fdopen() iflası: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Fayl yaratma iflası '%s': %s"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Fayl açma iflası '%s': fdopen() iflası: %s"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Fayl açma iflası '%s': fdopen() iflası: %s"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Fayl açma iflası '%s': fdopen() iflası: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Nümunə '%s' hökmsüzdür, '%s' daxil etməməlidir"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Şablon '%s' XXXXXX ilə qurtarmır"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "'%s' simvolik körpüsü oxuna bilmədi: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Simvolik körpülər dəstəklənmir"
+
+#: glib/giochannel.c:1152
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "`%s' dən `%s' ə dönüşdürücü açıla bilmir: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Can't do a raw read in g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Oxuna buferdə dönüşdürülməmiş verilənlər var"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanal qismi xarakterlə bitir"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Can't do a raw read in g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Fayl açma iflası '%s': fdopen() iflası: %s"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Fayl açma iflası '%s': fdopen() iflası: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "%d. sətir %d. xarakterində xəta: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "%d sətirində xəta : %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Boş element '&;' tapldı; hökmlü elementlər: &amp; &quot; &lt; &qt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Element adının başındakı hərf '%s' hökmlü deyil; & hərf bir elementlə "
+"başlayar; əgər bu ampersand bir element olaraq var sayılmazsa, &amp olaraq "
+"işlədə bilərsiniz"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Xarakter '%s' bir element adının içində hökmlü deyildir"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Element adı '%s' bilinmir"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Element nöqtəli vergül ilə qurtarmır; böyük ehtimalla bir ampersand "
+"işlətdiniz bir element başlanğıcı ola bilməyən hərf üçün ampersandı &amp "
+"olaraq işlədin"
+
+#: glib/gmarkup.c:573
+#, fuzzy, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"'%s' i şərhləndirmə xətası, hərf içində bir rəqəm olmalıdır referens (məs; "
+"&#234) - belki rəqəm çok böyükdür"
+
+#: glib/gmarkup.c:598
+#, fuzzy, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Xarakter referens '%s' icazə verilən xarakteri kodlaya bilmir"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Boş hərf referens; &#454 kimi bir rəqəm daxil etməlidir;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Xarakter referens nöqtəli vergül ilə qurtarmır; böyük ehtimalla ampersand "
+"xarakteri elementə başlamaq üçün işlətmədiniz - ampersand yerinə &amp işlədə "
+"bilərsiniz"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Bitirilməmiş varlıq mə'lumatı"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Bitirilməmiş xarakter mə'lumatı"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Hökmsüz UTF-8 kodlanmış mətn"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Sənəd bir element ilə başlamalıdır (məs. <kitab>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'<' xarakterindən sonra gələn '%s' hökmlü bir xarakter deyil; bir element "
+"adı olmaya bilər"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Tək hərf '%s', Elementın başlanğıç etiketinin sonuna '>' xarakteri "
+"gözlənilir '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Tək hərf '%s', xüsusiyyət adı '%s' olan element '%s' dən sonra '=' gözlənilir"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Tək hərf '%s', '%s' elementin başlanğıç etiketinin sonuna '>' və ya '/' "
+"gözlənilir, və ya bir xüsusiyyət; xüsusiyyət adında hökmsüz bir hərf "
+"işlədilmiş ola bilərsiniz"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Tək hərf '%s',element '%s'in xüsusiyyəti '%s''ə qiymət verilirkən bərabərdir "
+"işarətindən sonra açıq alıntı işarəti gözlənilir"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'</' xarakterlərini təqib edən '%s' hökmlü bir xarakter deyildir; '%s' bir "
+"element adı ilə başlamır dəyəsən"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"Bağlı element '%s' dən sonra gələn '%s' hökmlü bir hərf deyildir; icazə "
+"verilən hərf isə '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element '%s' bağlanıb, heç bir element açıq deyildir"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Element '%s' bağlanıb, fəqət indi açıq element '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Sənəd boşdur və ya təkcə boşluq xarakteri daxil etməkdədir"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Sənəd açıq üçbucaq mötərizə '<'den sonra gözlənilməz bir şəkildə qurtardı"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Sənəd elementləri hələ açıq olaraq gözlənilməz bir şəkildə qurtardı - son "
+"element '%s' açıq idi"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Sənəd gözlənilməz bir şəkildə qurtardı, etiket <%s/> ilə qurtaran qapalı "
+"üçbucaq mötərizə gözlənilir"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Sənəd bir elementin içində gözlənilməz bir şəkildə qurtardı"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Sənəd bir xüsusiyyət adı içində gözlənilməz bir şəkildə qurtardı"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Sənəd bir element-açma etiketi içində gözlənilməz bir şəkildə qurtardı"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Sənəd xüsusiyyət adını təqib edən bərabərdir işarətindən sonra gözlənilməz "
+"bir şəkildə qurtardı: xüsusiyyət qiyməti yoxdur"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+"Sənəd bir xüsusiyyət qiyməti içində ikən gözlənilməz bir şəkildə qurtardı"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Sənəd bağlı etiket '%s' içində gözlənilməz bir şəkildə qurtardı"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Sənəd bir şərh və ya gedişat göstərişi içində ikən gözlənilməz bir şəkildə "
+"qurtarır"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "%d. sətir %d. xarakterində xəta: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Bitirilməmiş varlıq mə'lumatı"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "alıntılı mətn alıntı işarəti ilə başlamır"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Əmr sətirində və ya digər shell-quoted mətndə uyğunsuz alıntı işarəti"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Mətn '\\' xarakterindən həmən sonra qurtardı. (Mətn '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "%c üçün uyğunluq alıntısı tapılmadan mətn qurtardı. (Mətn '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Mətn boş idi (və ya təkcə boşluq daxil edirdi)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Törəmə gedişatdan mə'lumat oxuma iflası"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Törəmə gedişatların xəbərləşməyi üçün pipe yaratma iflası (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Törəmə pipe-dan oxuma iflası (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Qovluq dəyişdirmə iflası '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Törəmə gedişat icra iflası (%s)"
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "Hökmsüz qovşaq adı"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, fuzzy, c-format
+msgid "Invalid string in environment: %s"
+msgstr "dönüşdürmə girişi içində hökmsüz qatar"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr "Cərgə açma xətası: '%s': %s"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Yardımcı proqram icra edilə bilmədi"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"g_io_channel_win32_poll() törəmə gedişatdan mə'lumat oxumada gözlənilməz xəta"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Törəmə gedişatdan mə'lumat oxuma iflası (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "törəmə gedişatdan mə'lumat oxuma select()'də namə'lum xəta (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "waitpid()'də namə'lum xəta (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "fork iflası (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "\"%s\" törəmə gedişat icra iflası (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Törəmə gedişat giriş və ya yekun istiqamətləndirmə xətası (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Törəmə gedişat fork xətası (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "\"%s\" törəmə gedişat işində namə'lum xəta"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Törəmə pid pipe dan kifayət qədər mə'lumat oxuma iflası (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "UTF-8 üçün hərf sərhədinin xaricində"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "dönüşdürmə girişi içində hökmsüz qatar"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "UTF-16 üçün hərf sərhədinin xaricindədir"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr ""
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr ""
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr ""
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr ""
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Dönüşdürmə sırasında xəta yarandı: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr ""
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr ""
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Hökmsüz qovşaq adı"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Hökmsüz qovşaq adı"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, fuzzy, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "`%s'in URİ-si səhv qaçırılmış xarakterlər daxil edir"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Fayl açma iflası '%s': fdopen() iflası: %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "\"%2$s\" faylını oxumaq üçün %1$lu bayt ayrıla bilmir"
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Fayl açma iflası '%s': fdopen() iflası: %s"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "`%s' hərf dəstəsindən `%s' hərf dəstəsinə dönüşdürmə dəstəklənmir"
diff --git a/trunk/po/be.po b/trunk/po/be.po
new file mode 100644
index 000000000..62e2a3f49
--- /dev/null
+++ b/trunk/po/be.po
@@ -0,0 +1,1073 @@
+# Беларускі пераклад glib.HEAD.
+# Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+# Vital Khilko <dojlid@mova.org>, 2002, 2005.
+# Ales Nyakhaychyk <nab@mail.by>, 2004.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2005-11-16 11:21+0200\n"
+"Last-Translator: Vital Khilko <vk@altlinux.ru>\n"
+"Language-Team: Belarusian <i18n@mova.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+# glib/gmarkup.c:1120
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Дзіўны сымбаль \"%s\", чакаўся сымбаль \"=\" пасьля назвы атрыбута \"%s\" "
+"элемэнту \"%s\""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Дапушчальны файл ключу не адшуканы ў каталёгу даньняў"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+# glib/gfileutils.c:745
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Немагчыма прачытаць сымбалічную спасылку \"%s\": %s"
+
+# glib/gconvert.c:390
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Пераўтварэньне з набору знакаў \"%s\" у \"%s\" не падтрымліваецца"
+
+# glib/gconvert.c:394
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Не атрымалася адкрыць пераўтваральнік з \"%s\" у \"%s\""
+
+# glib/gconvert.c:592 glib/gconvert.c:882 glib/giochannel.c:1282
+# glib/giochannel.c:1324 glib/giochannel.c:2163 glib/gutf8.c:875
+# glib/gutf8.c:1320
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Недапушчальная пасьлядоўнасьць байтаў на ўваходзе пераўтварэньня"
+
+# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289
+# glib/giochannel.c:2175
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Памылка ў часе пераўтварэньня: %s"
+
+# glib/gconvert.c:615 glib/gutf8.c:871 glib/gutf8.c:1071 glib/gutf8.c:1212
+# glib/gutf8.c:1316
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Няпоўны сымбаль у канцы ўваходнага радку"
+
+# glib/gconvert.c:788
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Немагчыма пераўтвараць знак \"%s\" у знак са збору \"%s\""
+
+# glib/gconvert.c:1593
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI \"%s\" не зьяўляюцца абсалютным URI выкарыстаньня схемы \"file\""
+
+# glib/gconvert.c:1603
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "URI \"%s\" мясцовага файлу ня можа ўключаць \"#\""
+
+# glib/gconvert.c:1620
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI \"%s\" недапушчальная"
+
+# glib/gconvert.c:1632
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Назва вузлу ў URI \"%s\" недапушчальная"
+
+# glib/gconvert.c:1648
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI \"%s\" утрымлівае недапушчальны кіравальны сымбаль"
+
+# glib/gconvert.c:1719
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Шлях \"%s\" не зьяўляецца абсалютным"
+
+# glib/gconvert.c:1729
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Недапушчальная назва вузла"
+
+# glib/gdir.c:79
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Памылка ў часе адкрыцьця каталёгу \"%s\": %s"
+
+# glib/gfileutils.c:337 glib/gfileutils.c:402
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Не атрымалася разьмеркаваць %lu байтаў для чытаньня файлу \"%s\""
+
+# glib/gfileutils.c:348
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Памылка чытаньня файлу \"%s\": %s"
+
+# glib/gfileutils.c:426
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Збой чытаньня з файлу \"%s\": %s"
+
+# glib/gfileutils.c:465 glib/gfileutils.c:533
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Збой адкрыцьця файлу \"%s\": %s"
+
+# glib/gfileutils.c:479
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Збой атрыманьня атрыбутаў файлу \"%s\": збой fstat(): %s"
+
+# glib/gfileutils.c:505
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Збой адкрыцьця файлу \"%s\": збой fdopen(): %s"
+
+# glib/gfileutils.c:505
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Збой зьмены назвы файлу \"%s\" на '%s': збой g_rename(): %s"
+
+# glib/gfileutils.c:745
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Збой стварэньня файлу \"%s\": %s"
+
+# glib/gfileutils.c:505
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Збой адкрыцьця файла %s' для запісу: збой fdopen(): %s"
+
+# glib/gfileutils.c:505
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Збой запісу файлу '%s': збой fwrite(): %s"
+
+# glib/gfileutils.c:505
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Збой закрыцьця файлу %s': збой fclose(): %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Наяўны файл '%s' не можа быць выдалены: збой g_unlink(): %s"
+
+# glib/gfileutils.c:712
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Шаблён \"%s\" недапушчальны, не павінны ўтрымліваць \"%s\""
+
+# glib/gfileutils.c:724
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Шаблён \"%s\" канчацца не на XXXXXX"
+
+# glib/gfileutils.c:745
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Немагчыма прачытаць сымбалічную спасылку \"%s\": %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Сымбалічныя спасылкі не падтрымліваюцца"
+
+# glib/giochannel.c:1114
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Не атрымалася адкрыць пераўтваральнік з \"%s\" у \"%s\": %s"
+
+# glib/giochannel.c:1460
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"Не магчыма выканаць непасрэднае чытаньне ў функцыі "
+"g_io_channel_read_line_string"
+
+# glib/giochannel.c:1507 glib/giochannel.c:1761 glib/giochannel.c:1847
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "У буфэры чытаньня засталіся непераўтвораныя даньні"
+
+# glib/giochannel.c:1587 glib/giochannel.c:1661
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Канал закрываецца на няпоўным сымбалі"
+
+# glib/giochannel.c:1647
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+"Немагчыма выканаць непасрэднае чытаньне ў функцыі g_io_channel_read_to_end"
+
+# glib/gfileutils.c:505
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Збой адкрыцьця файлу \"%s\": збой open(): %s"
+
+# glib/gfileutils.c:505
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Збой мапаваньня файлу '%s': збой mmap(): %s"
+
+# glib/gmarkup.c:219
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Памылка ў радку %d сымбаль %d: %s"
+
+# glib/gmarkup.c:303
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Памылка ў радку %d: %s"
+
+# glib/gmarkup.c:382
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Пусты запіс \"&;\" адшуканы; дапушчальныя: &amp; &quot; &lt; &gt; &apos;"
+
+# glib/gmarkup.c:392
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Сымбаль \"%s\" ня зьяўляецца дапушчальным напачатку назвы сутнасьці; сымбаль "
+"& пачынае пасьлядоўнасьць; калі гэты сымбаль ня мусіць быць часткай запісу, "
+"тады экрануйце яго запісам &amp;"
+
+# glib/gmarkup.c:428
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Сымбаль \"%s\" недапушчальны ўнутры назвы сутнасьці"
+
+# glib/gmarkup.c:472
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Невядомая назва сутнасьці \"%s\""
+
+# glib/gmarkup.c:482
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Запіс не канчаецца кропкай з коскай; здаецца, што сымбаль & быў выкарыстаны "
+"не для пазначэньня пачатку сутнасьці - экрануйце яго як &amp;"
+
+# glib/gmarkup.c:528
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Збой разбору \"%-.*s\", дзе мусіць быць нумар унутры лучыва да сымбалю "
+"(&#234; напрыклад) - мажліва, нумар завялікі"
+
+# glib/gmarkup.c:553
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Лучыва на сымбаль '%-.*s' не вызначае дазволены сымбаль"
+
+# glib/gmarkup.c:570
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Пустое лучыва да сымбалю: мусіць уключаць нумар, напрыклад &#454;"
+
+# glib/gmarkup.c:580
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Лучыва да сымбалю не канчаецца кропкай з коскай; здаецца, што сымбаль & быў "
+"выкарыстаны ня для пазначэньня пачатка сутнасьці - экрануйце яго як &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Незавершанае лучыва сутнасьці"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Незавершанае лучыва сымбалю"
+
+# glib/gmarkup.c:837 glib/gmarkup.c:865 glib/gmarkup.c:896
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Недапушчальна закадаваны тэкст UTF-8"
+
+# glib/gmarkup.c:932
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Дакумэнт мусіць пачынацца з элемэнту (напрыклад <book>)"
+
+# glib/gmarkup.c:970
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"\"%s\" не зьяўляецца дапушчальным сымбалем, які ідзе за сымбалем \"<\"; гэты "
+"сымбаль ня можа пачынаць назву элемэнту"
+
+# glib/gmarkup.c:1033
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Дзіўны сымбаль \"%s\", чакаецца сымбаль \">\" для закрыцьця тэга элемэнту\"%s"
+"\""
+
+# glib/gmarkup.c:1120
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Дзіўны сымбаль \"%s\", чакаўся сымбаль \"=\" пасьля назвы атрыбута \"%s\" "
+"элемэнту \"%s\""
+
+# glib/gmarkup.c:1161
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Дзіўны сымбаль \"%s\", чакаліся сымбалі \">\" ці \"/\" для закрыцьця "
+"пачатковага тэгу элемэнта \"%s\" ці дадаткова атрыбут; магчыма, быў "
+"выкарыстаны недапушчальны сымбаль у назве атрыбуту"
+
+# glib/gmarkup.c:1244
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Дзіўны сымбаль \"%s\", чакалася падвойная дужка пасьля знаку роўнасьці, калі "
+"надаецца значэньне атрыбуту \"%s\" элемэнту \"%s\""
+
+# glib/gmarkup.c:1384
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"\"%s\" не зьяўляецца дапушчальным сымбалем, які ідзе за сымбалямі \"</\"; \"%"
+"s\" ня можа пачынаць назву элемэнту"
+
+# glib/gmarkup.c:1422
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"\"%s\" ня зьяўляецца дапушчальным сымбалем, які закрывае назву элемэнту \"%s"
+"\"; дапушчальным сымбалем зьяўляецца \">\""
+
+# glib/gmarkup.c:1433
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr ""
+"Элемэнт \"%s\" быў закрыты, аніводны элемэнт у бягучы момант не адкрыты"
+
+# glib/gmarkup.c:1442
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Элемэнт \"%s\" быў закрыты, але ў гэты час адкрыты \"%s\""
+
+# glib/gmarkup.c:1574
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Дакумэнт быў пусты ці утрымліваў толькі прагалы"
+
+# glib/gmarkup.c:1588
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Дакумэнт нечакана скончыўся адразу пасьля вуглавой дужкі \"<\""
+
+# glib/gmarkup.c:1596 glib/gmarkup.c:1640
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Дакумэнт нечакана скончыўся, калі элемэнты былі яшчэ адкрытыя - \"%s\" быў "
+"апошнім адкрытым элемэнтам"
+
+# glib/gmarkup.c:1604
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Дакумэнт нечакана скончыўся, чакаецца вуглавая дужка якая закрывае тэг <%s/>"
+
+# glib/gmarkup.c:1610
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Дакумэнт нечакана скончыўся ўнутры назвы элемэнту"
+
+# glib/gmarkup.c:1615
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Дакумэнт нечакана скончыўся ўнутры назвы атрыбуту"
+
+# glib/gmarkup.c:1620
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Дакумэнт нечакана скончыўся ўнутры элемэнту які адкрывае тэг."
+
+# glib/gmarkup.c:1626
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Дакумэнт нечакана скончыўся пасьля знаку роўнасьці, які ішоў за назвай "
+"атрыбуту: не пазначана значэньне атрыбуту"
+
+# glib/gmarkup.c:1633
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Дакумэнт нечакана скончыўся ўнутры значэньня атрыбуту"
+
+# glib/gmarkup.c:1648
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Дакумэнт нечакана скончыўся ўнутры элемэнту \"%s\" які закрывае тэг"
+
+# glib/gmarkup.c:1654
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Дакумэнт нечакана скончыўся ўнутры камэнтару ці інструкцыі"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+# glib/gmarkup.c:219
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Памылка ў радку %d сымбаль %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Незавершанае лучыва сутнасьці"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+# glib/gshell.c:71
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Тэкст у дужках не пачынаецца з сымбалю дужкі"
+
+# glib/gshell.c:161
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Неадпаведная дужка ў камандным радку ці іншым тэксьце абалонкі"
+
+# glib/gshell.c:529
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Тэкст скончыўся адразу пасьля сымбалю \"\\\". (Тэкст быў \"%s\")"
+
+# glib/gshell.c:536
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "Тэкст скончыўся перад адпаведнай дужкай для %c. (Тэкст быў \"%s\")"
+
+# glib/gshell.c:548
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Тэкст быў пусты (ці утрымліваў толькі прагалы)"
+
+# glib/gspawn-win32.c:214
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Збой чытаньня даньняў з працэсу-нашчадка"
+
+# glib/gspawn-win32.c:981 glib/gspawn.c:1228
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Збой стварэньня канала для абмену з працэсам-нашчадкам (%s)"
+
+# glib/gspawn-win32.c:843 glib/gspawn.c:914
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Збой чытаньня даньняў з каналу нашчадка (%s)"
+
+# glib/gspawn-win32.c:931 glib/gspawn.c:1119
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Збой зьмены каталёга \"%s\" (%s)"
+
+# glib/gspawn-win32.c:940
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Збой выкананьня працэсу-нашчадка (%s)"
+
+# glib/gconvert.c:1729
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Недапушчальная назва праграмы: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Недапушчальны радок у вэктары аргумэнту ў %d: %s"
+
+# glib/gutf8.c:1039 glib/gutf8.c:1048 glib/gutf8.c:1180 glib/gutf8.c:1189
+# glib/gutf8.c:1330 glib/gutf8.c:1426
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Недапушчальны радок у асяродзьдзі: %s"
+
+# glib/gdir.c:79
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Недапушчальны працоўны каталёг: %s"
+
+# glib/gspawn-win32.c:940
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Збой выкананьня праграмы дапамогі (%s)"
+
+# glib/gspawn-win32.c:365
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Непрадбачаная памылка ў функцыі g_io_channel_win32_poll() чытаньня даньняў "
+"з працэсу-нашчадка"
+
+# glib/gspawn.c:161
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Збой чытаньня даньняў з працэсу-нашчадка (%s)"
+
+# glib/gspawn.c:293
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Непрадбачаная памылка у select() чытаньня даньняў з працэсу-нашчадка (%s)"
+
+# glib/gspawn.c:376
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Непрадбачаная памылка ў waitpid() (%s)"
+
+# glib/gspawn.c:979
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Збой разгалінаваньня fork() (%s)"
+
+# glib/gspawn.c:1129
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Збой выкананьня працэсу-нашчадка \"%s\" (%s)"
+
+# glib/gspawn.c:1139
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Збой перанакіраваньня вываду ці ўводу працэсу-нашчадка (%s)"
+
+# glib/gspawn.c:1148
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Збой разгалінаваньня fork() працэсу-нашчадка (%s)"
+
+# glib/gspawn.c:1156
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Невядомая памылка выкананьня працэсу-нашчадка \"%s\""
+
+# glib/gspawn.c:1178
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Збой чытаньня патрэбнае колькасьці даньняў з pid канала нашчадку (%s)"
+
+# glib/gutf8.c:950
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Сымбаль па-за дыяпазонам UTF-8"
+
+# glib/gutf8.c:1039 glib/gutf8.c:1048 glib/gutf8.c:1180 glib/gutf8.c:1189
+# glib/gutf8.c:1330 glib/gutf8.c:1426
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Недапушчальная пасьлядоўнасьць на ўваходзе пераўтварэньня"
+
+# glib/gutf8.c:1341 glib/gutf8.c:1437
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Сымбаль па-за дыяпазонам UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Выкарыстаньне:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[МОЖНАСЬЦЬ...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Можнасьці дапамогі:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Адлюстраваць можнасьці дапамогі"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Адлюстраваць усе можнасьці дапамогі"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Можнасьці дастасаваньня:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Немагчыма разабраць цэлае значэньне '%s' для %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Цэлае значэньне '%s' для %s па-за межамі"
+
+#: glib/goption.c:831
+#, fuzzy, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Немагчыма разабраць цэлае значэньне '%s' для %s"
+
+#: glib/goption.c:839
+#, fuzzy, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Цэлае значэньне '%s' для %s па-за межамі"
+
+# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289
+# glib/giochannel.c:2175
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Памылка ў часе пераўтварэньня: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Нестае аргумэнту для %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Невядомая можнасьць %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Дапушчальны файл ключу не адшуканы ў каталёгу даньняў"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Не зьяўляецца звычайным файлам"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Файл пусты"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Файл ключу ўтрымлівае радок '%s' які не зьяўляецца парай ключ-значэньне, "
+"групай, ці камэнтарам"
+
+# glib/gconvert.c:1729
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Недапушчальная назва праграмы: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Файл ключу не пачынаецца з групы"
+
+# glib/gconvert.c:1729
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Недапушчальная назва праграмы: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Файл ключу ўтрымлівае кадаваньне якое не падтрымліваецца '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Файл ключу не мае групу '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Файл ключу не мае ключ '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Файл ключу утрымлівае ключ '%s' са значэньнем '%s' які не закадаваны UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Файл ключу утрымлівае ключ '%s' які мае значэньне што не можа быць "
+"інтэрпрэтаванае."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Файл ключу утрымлівае ключ '%s' у групе '%s' які мае значэньне што не можа "
+"быць інтэрпрэтаванае."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Файл ключу не мае ключ '%s' у групе '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Файл ключу ўтрымлівае пасьлядоўнасьць завяршэньня ў канцы радку"
+
+# glib/gconvert.c:1648
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Файл ключу утрымлівае недапушчальную пасьлядоўнасьць завяршэньня '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Значэньне '%s' не можа быць інтэрпрэтаванае як лік."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Цэлае значэньне '%s' па-за межамі"
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Значэньне '%s' не можа быць інтэрпрэтаванае як лік."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Значэньне '%s' не можа быць інтэрпрэтаванае як булева."
+
+# glib/gfileutils.c:505
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Не магчыма зьмяніць рэжым файлу: збой fork(): %s"
+
+# glib/gfileutils.c:337 glib/gfileutils.c:402
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Немагчыма зьмяніць рэжым файлу: збой waitpid(): %s"
+
+# glib/gfileutils.c:505
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Не магчыма зьмяніць рэжым файлу: збой chmod(): %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr "Не магчыма зьмяніць рэжым файлу: Нашчадак забіты сыгналам: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr "Не магчыма зьмяніць рэжым файлу: Нашчадак ненармальна завяршыўся "
+
+# glib/giochannel.c:1110
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Пераўтварэньне з набору сымбаляў \"%s\" у \"%s\" не падтрымліваецца"
+
+# glib/giowin32.c:704 glib/giowin32.c:733
+#~ msgid "Incorrect message size"
+#~ msgstr "Памылковы памер паведамленьня"
+
+# glib/giowin32.c:1037 glib/giowin32.c:1090
+#~ msgid "Socket error"
+#~ msgstr "Памылка сокету"
+
+# glib/giowin32.c:1290
+#~ msgid "Channel set flags unsupported"
+#~ msgstr "Набор сьцягоў каналу ня падтрымліваецца"
diff --git a/trunk/po/be@latin.po b/trunk/po/be@latin.po
new file mode 100644
index 000000000..9c6cab0f6
--- /dev/null
+++ b/trunk/po/be@latin.po
@@ -0,0 +1,1049 @@
+# Pierakład glib.HEAD.
+# Copyright (C) 2007 THE glib.HEAD'S COPYRIGHT HOLDER
+# Alaksandar Navicki <zolak@lacinka.org>, 2007. www.lacinka.org
+# www.lacinka.org
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-03-01 12:25+0300\n"
+"Last-Translator: Ihar Hrachyshka <ihar.hrachyshka@gmail.com>\n"
+"Language-Team: Belarusian Latin <i18n@mova.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+# glib/gmarkup.c:1120
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Niečakany atrybut '%s' dla elementu '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Atrybut '%s' elementu '%s' nia znojdzieny"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Niečakany značnik '%s', spadziavalisia značnika '%s'"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Niečakany značnik '%s' unutry '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Niemahčyma znajści pravilnaha fajłu zakładak u katalohach źviestak"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Zakładka dla URI '%s' užo isnuje"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Dla URI '%s' nia znojdziena zakładak"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Nie akreśleny typ MIME ŭ zakładcy dla URI '%s'"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Nie akreślili pryvatnaha ściažka ŭ zakładcy dla URI '%s'"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Nie akreślili hrup u zakładcy dla URI '%s'"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+"Nivodnaja aplikacyja pad nazvaj '%s' nie zarehistravała zakładki dla '%s'"
+
+# glib/gfileutils.c:745
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Prablema z razhortvańniem radka zapusku '%s' z URI '%s'"
+
+# glib/gconvert.c:390
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Kanversija naboru znakaŭ '%s' na '%s' nie padtrymlivajecca"
+
+# glib/gconvert.c:394
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Niemahčyma adčynić kanverter z '%s' na '%s'"
+
+# glib/gconvert.c:592 glib/gconvert.c:882 glib/giochannel.c:1282
+# glib/giochannel.c:1324 glib/giochannel.c:2163 glib/gutf8.c:875
+# glib/gutf8.c:1320
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Niapravilnaja paśladoŭnaść bajtaŭ na ŭvachodzie kanversii"
+
+# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289
+# glib/giochannel.c:2175
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Pamyłka padčas kanversii: %s"
+
+# glib/gconvert.c:615 glib/gutf8.c:871 glib/gutf8.c:1071 glib/gutf8.c:1212
+# glib/gutf8.c:1316
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Niapoŭny znak u kancy ŭvachodnaha radka"
+
+# glib/gconvert.c:788
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Niemahčyma pierakanvertavać surahat znaku '%s' na nabor znakaŭ '%s'"
+
+# glib/gconvert.c:1593
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+"URI '%s' nie źjaŭlajucca absalutnym URI vykarystańnia \"fajłavaj\" schiemy"
+
+# glib/gconvert.c:1603
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "URI '%s' miascovaha fajłu nia moža ŭklučać '#'"
+
+# glib/gconvert.c:1620
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' niapravilny"
+
+# glib/gconvert.c:1632
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Niapravilnaja nazva hostu ŭ URI '%s' "
+
+# glib/gconvert.c:1648
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' utrymlivaje nieadpaviedna cytavanyja znaki"
+
+# glib/gconvert.c:1719
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Ściežka '%s nie źjaŭlajecca absalutnaj"
+
+# glib/gconvert.c:1729
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Niapravilnaja nazva kamputara"
+
+# glib/gdir.c:79
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Pamyłka pry adčynieńni katalohu '%s': %s"
+
+# glib/gfileutils.c:337 glib/gfileutils.c:402
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Nie atrymałasia raźmierkavać %lu bajtaŭ dla adčytańnia fajłu \"%s\""
+
+# glib/gfileutils.c:348
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Pamyłka adčytańnia fajłu '%s': %s"
+
+# glib/gfileutils.c:426
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Pamyłka čytańnia z fajłu '%s': %s"
+
+# glib/gfileutils.c:465 glib/gfileutils.c:533
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Niemahčyma adčynić fajł '%s': %s"
+
+# glib/gfileutils.c:479
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"Niemahčyma atrymać atrybuty fajłu '%s': funkcyja fstat() vyvieła pamyłku: %s"
+
+# glib/gfileutils.c:505
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Niemahčyma adčynić fajł '%s': funkcyja fdopen() vyvieła pamyłku: %s"
+
+# glib/gfileutils.c:505
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Niemahčyma źmianic nazvu fajłu '%s' na '%s': funkcyja g_rename() vyvieła "
+"pamyłku: %s"
+
+# glib/gfileutils.c:745
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Niemahčyma stvaryć fajł '%s': %s"
+
+# glib/gfileutils.c:505
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"Niemahčyma adčynic fajł %s' dla zapisu: funkcyja fdopen() vyvieła pamyłku: %s"
+
+# glib/gfileutils.c:505
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Niemahčyma zapisać fajł '%s': funkcyja fwrite() vyvieła pamyłku: %s"
+
+# glib/gfileutils.c:505
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Niemahčyma začynić fajł %s': funkcyja fclose() vyvieła pamyłku: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+"Niemahčyma vydalić najaŭny fajł '%s': funkcyja g_unlink() vyvieła pamyłku: %s"
+
+# glib/gfileutils.c:712
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Šablon '%s' niapravilny, u im nie pavinna być '%s'"
+
+# glib/gfileutils.c:724
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "U šablonie '%s' niama XXXXXX"
+
+# glib/gfileutils.c:745
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Niemahčyma pračytać symbaličnuju spasyłku '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Symbaličnyja spasyłki nie padtrymlivajucca"
+
+# glib/giochannel.c:1114
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Nielha adčynić kanverter z '%s' na '%s': %s"
+
+# glib/giochannel.c:1460
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"Niemahčyma vykanać niepasrednaje čytańnie ŭ funkcyi "
+"g_io_channel_read_line_string"
+
+# glib/giochannel.c:1507 glib/giochannel.c:1761 glib/giochannel.c:1847
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "U bufery čytańnia zastalisia niepieraŭtvoranyja źviestki"
+
+# glib/giochannel.c:1587 glib/giochannel.c:1661
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Na kancy kanału isnuje paśladoŭnaść, jakaja adpaviadaje častcy znaku"
+
+# glib/giochannel.c:1647
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+"Niemahčyma vykanać niepasrednaje čytańnie ŭ funkcyi g_io_channel_read_to_end"
+
+# glib/gfileutils.c:505
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Niemahčyma adčynić fajł '%s': funkcyja open() vyvieła pamyłku: %s"
+
+# glib/gfileutils.c:505
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Niemahčyma zmapavać fajł '%s': funkcyja mmap() vyvieła: %s"
+
+# glib/gmarkup.c:219
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Pamyłka ŭ %d radku pry znaku %d: %s"
+
+# glib/gmarkup.c:303
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Pamyłka ŭ radku %d: %s"
+
+# glib/gmarkup.c:382
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr "Pusty zapis '&;' adšukany; dapuščalnyja: &amp; &quot; &lt; &gt; &apos;"
+
+# glib/gmarkup.c:392
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Znak '%s' niedapuščalny na pačatku nazvy adzinki; znak & pačynaje adzinku; "
+"kali hety znak nie pavinien pačynać adzinki, zamianicie jaho na znak &amp;"
+
+# glib/gmarkup.c:428
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Znak '%s' niedapuščalny ŭnutry nazvy adzinki"
+
+# glib/gmarkup.c:472
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Nieviadomaja nazva adzinki '%s'"
+
+# glib/gmarkup.c:482
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Zapis nie kančajecca kropkaj z koskaj; zdajecca, vykarystali znak &, jaki "
+"nia mieŭ aznačać pačatku adzinki — zamianicie jaho na &amp;"
+
+# glib/gmarkup.c:528
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Niemahčyma pierapracavać '%-.*s', dzie musić być ličba unutry łučyva da "
+"znaku (naprykład &#234;) — mahčyma, ličba zavialikaja"
+
+# glib/gmarkup.c:553
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Spasyłka na znak '%-.*s' nie źjaŭlajecca zapisam dazvolenaha znaku"
+
+# glib/gmarkup.c:570
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Pustaja spasyłka na znak: u joj pavinien być numar, naprykład &#454;"
+
+# glib/gmarkup.c:580
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Spasyłka na znak nie kančajecca kropkaj z koskaj; mahčyma znak & vykarystany "
+"nie dla paznačeńnia pačatku adzinki — u takim vypadku zamianicie jaho jak "
+"&amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Niezavieršanaja spasyłka na adzinku"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Niezavieršanaja spasyłka na znak"
+
+# glib/gmarkup.c:837 glib/gmarkup.c:865 glib/gmarkup.c:896
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Niapravilna kadavany tekst UTF-8"
+
+# glib/gmarkup.c:932
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dakument musić pačynacca z elementu (naprykład <book>)"
+
+# glib/gmarkup.c:970
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' nie źjaŭlajecca dapuščalnym znakam, paśla znaku '<'; hety znak nia moža "
+"pačynać nazvy adzinki"
+
+# glib/gmarkup.c:1033
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Dziŭny znak '%s', čakaŭsia znak '>' dla zakančeńnia značnika elementu '%s'"
+
+# glib/gmarkup.c:1120
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Dziŭny znak '%s', čakaŭsia znak '=' paśla nazvy atrybutu '%s' elementu '%s'"
+
+# glib/gmarkup.c:1161
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Dziŭny znak '%s', čakali znaku '>' albo '/' dla zakryćcia pačatkovaha "
+"značnika elementu '%s' ci dadatkova atrybutu; mahčyma, byŭ vykarystany "
+"niedapuščalny znak u nazovie atrybutu"
+
+# glib/gmarkup.c:1244
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Dziŭny znak '%s', čakałasia padvojnaja dužka paśla znaku roŭnaści, kali "
+"nadajecca značeńnie atrybutu '%s' elementu '%s'"
+
+# glib/gmarkup.c:1384
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' nie źjaŭlajecca dapuščalnym znakam paśla znakaŭ '</'; '%s' nia moža "
+"pačynać nazovu elementu"
+
+# glib/gmarkup.c:1422
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' nia źjaŭlajecca dapuščalnym znakam zakančeńnia nazvy elementu '%s'; "
+"dapuščalnym znakam źjaŭlajecca '>'"
+
+# glib/gmarkup.c:1433
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element '%s' byŭ začynieny, dziejna niama adčynienych elementaŭ"
+
+# glib/gmarkup.c:1442
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Element '%s' byŭ začynieny, ale dziejna adčynieny '%s'"
+
+# glib/gmarkup.c:1574
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dakument byŭ pusty albo ŭtrymlivaŭ tolki prabieły"
+
+# glib/gmarkup.c:1588
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Adrazu paśla znaku '%s' dakument niečakana skončyŭsia"
+
+# glib/gmarkup.c:1596 glib/gmarkup.c:1640
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dakument niečakana skončyŭsia, kali peŭnyja elementy byli jašče adčynienyja "
+"— '%s' byŭ apošnim adčynienym elementam"
+
+# glib/gmarkup.c:1604
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dakument niečakana skončyŭsia, čakałasia vuhłavaja dužka, jakaja začyniaje "
+"značnik <%s/>"
+
+# glib/gmarkup.c:1610
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dakument niečakana skončyŭsia ŭnutry nazvy elementu"
+
+# glib/gmarkup.c:1615
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dakument niečakana skončyŭsia ŭnutry nazvy atrybutu"
+
+# glib/gmarkup.c:1620
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dakument niečakana skončyŭsia ŭnutry elementu, jaki adkryvaje značnik."
+
+# glib/gmarkup.c:1626
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dakument niečakana skončyŭsia paśla znaku roŭnaści, jaki išoŭ za nazvaj "
+"atrybutu: niama vartaści atrybutu"
+
+# glib/gmarkup.c:1633
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dakument niečakana skončyŭsia ŭnutry vartaści atrybutu"
+
+# glib/gmarkup.c:1648
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Dakument niečakana skončyŭsia ŭnutry značnika zamykańnia elementu '%s'"
+
+# glib/gmarkup.c:1654
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Dakument niečakana skončyŭsia ŭnutry kamentara albo instrukcyi"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+# glib/gmarkup.c:219
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Pamyłka ŭ %d radku pry znaku %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Niezavieršanaja spasyłka na adzinku"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+# glib/gshell.c:71
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Cytavany znak nie pačynajecca znakam dvukośsia"
+
+# glib/gshell.c:161
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"U zahadnym radku albo inšym cytavanym, jak u abałoncy, tekście pajaviŭsia "
+"adzinočny znak cytavańnia"
+
+# glib/gshell.c:529
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Tekst skončyŭsia adrazu paśla znaku '\\'. (Tekst byŭ '%s')"
+
+# glib/gshell.c:536
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Tekst skončyŭsia pierad adpaviednym dvukośsiem dla %c. (Tekst byŭ '%s')"
+
+# glib/gshell.c:548
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Tekst byŭ pusty (albo ŭ im byli tolki prabieły)"
+
+# glib/gspawn-win32.c:214
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Niemahčyma adčytać źviestki pracesu-naščadka"
+
+# glib/gspawn-win32.c:981 glib/gspawn.c:1228
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Nielha stvaryć płyniu dziela kamunikacyi z pracesam-naščadkam (%s)"
+
+# glib/gspawn-win32.c:843 glib/gspawn.c:914
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Niemahčyma adčytać płyniu naščadka (%s)"
+
+# glib/gspawn-win32.c:931 glib/gspawn.c:1119
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Niemahčyma źmianić kataloh na '%s' (%s)"
+
+# glib/gspawn-win32.c:940
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Niemahčyma vykanać praces-naščadka (%s)"
+
+# glib/gconvert.c:1729
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Niapravilnaja nazva prahramy: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Niapravilny paradak u arhumencie %d: %s"
+
+# glib/gutf8.c:1039 glib/gutf8.c:1048 glib/gutf8.c:1180 glib/gutf8.c:1189
+# glib/gutf8.c:1330 glib/gutf8.c:1426
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Niapravilny radok u asiarodździ: %s"
+
+# glib/gdir.c:79
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Niapravilny rabočy kataloh: %s"
+
+# glib/gspawn-win32.c:940
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Niemahčyma ŭklučyć prahramu dapamohi (%s)"
+
+# glib/gspawn-win32.c:365
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Pry adčytvańni źviestak pracesu-naščadka ŭ funkcyi g_io_channel_win32_poll() "
+"adbyłasia nieviadomaja pamyłka"
+
+# glib/gspawn.c:161
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Niemahčyma adčytać źviestki pracesu-naščadka (%s)"
+
+# glib/gspawn.c:293
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Niečakanaja pamyłka ŭ funkcyi select() padčas čytańnia źviestak pracesu-"
+"naščadka (%s)"
+
+# glib/gspawn.c:376
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Niečakanaja pamyłka ŭ waitpid() (%s)"
+
+# glib/gspawn.c:979
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Niemahčyma stvaryć praces (%s)"
+
+# glib/gspawn.c:1129
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Niemahvyma vykanać praces-naščadka \"%s\" (%s)"
+
+# glib/gspawn.c:1139
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Niemahčyma pierakiravać uvachod albo vyjście pracesu-naščadka (%s)"
+
+# glib/gspawn.c:1148
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Niemahčyma stvaryć praces-naščadka (%s)"
+
+# glib/gspawn.c:1156
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Nieviadomaja pamyłka vykanańnia pracesu-naščadka \"%s\""
+
+# glib/gspawn.c:1178
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"Niemahčyma adčytać adpaviednuju kolkaść źviestak ź PID kanału naščadka (%s)"
+
+# glib/gutf8.c:950
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Znak pa-za dyjapazonam UTF-8"
+
+# glib/gutf8.c:1039 glib/gutf8.c:1048 glib/gutf8.c:1180 glib/gutf8.c:1189
+# glib/gutf8.c:1330 glib/gutf8.c:1426
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Niapravilny paradak na ŭvachodzie kanversii"
+
+# glib/gutf8.c:1341 glib/gutf8.c:1437
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Znak pa-za dyjapazonam UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Vykarystańnie:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPCYJA...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Opcyi dapamohi:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Pakažy opcyi dapamohi"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Pakažy ŭsie opcyi dapamohi"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Opcyi aplikacyi:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Niemahčyma pierapracavać ličbavaj vartaści '%s' dla %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Ličbavaja vartaść '%s' dla %s pa-za dapuščalnymi miežami"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Nielha pierapracavać padvojnuju ličbavuju vartaść '%s' dla %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Padvojnaja ličbavaja vartaść '%s' dla %s pa-za dapuščalnymi miežami"
+
+# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289
+# glib/giochannel.c:2175
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Pamyłka padčas pierapracoŭki %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Adsutny parametar dla %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Nieviadomaja opcyja %s"
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Niemahčyma znajści pravilnaha fajłu kluča ŭ katalohach pošuku"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Heta nie zvyčajny fajł"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Fajł pusty"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Fajł kluču ŭtrymlivaje radok '%s', jaki nie źjaŭlajecca paraj kluč-vartaść, "
+"hrupaj, albo kamentarom"
+
+# glib/gconvert.c:1729
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Niapravilnaja nazva hrupy: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Fajł kluča nie pačynajecca ad hrupy"
+
+# glib/gconvert.c:1729
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Niapravilnaja nazva kluča: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Fajł kluča ŭtrymlivaje kadavańnie '%s', jakoje nie absłuhoŭvajecca"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Fajł kluča nie ŭklučaje ŭ siabie hrupy '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Fajł kluča nie ŭklučaje ŭ siabie kluča '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Fajł kluča ŭklučaje ŭ siabie kluč '%s' z vartaściu '%s', nie zapisanaj jak "
+"UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Fajł kluča ŭklučaje ŭ siabie kluč '%s' ź nieinterpretavalnaj vartaściu."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Fajł kluča ŭklučaje ŭ siabie kluč '%s' u hrupie '%s', jaki maje "
+"nieinterpretavalnuju vartaść."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Fajł kluča nia maje kluča '%s' u hrupie '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Fajł kluča maje ŭ sabie cytavany znak na kancy radka"
+
+# glib/gconvert.c:1648
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Fajł kluča maje ŭ sabie niedapuščalny cytavalny łancužok '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Nielha interpretavać '%s' jak ličbavuju vartaść."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Ličbavaja vartaść '%s' pa-za dapuščalnymi miežami"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+"Niemahčyma interpretavać značeńnie '%s' jak ličbavuju vartaść ź "
+"niefiksavanaj koskaj."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Ličbavuju vartaść '%s' niemahčyma interpretavać jak lahičnuju vartaść."
diff --git a/trunk/po/bg.po b/trunk/po/bg.po
new file mode 100644
index 000000000..08a6e7c5b
--- /dev/null
+++ b/trunk/po/bg.po
@@ -0,0 +1,951 @@
+# Bulgarian translation for Glib po-file.
+# Copyright (C) 2002, 2005, 2006, 2007 Free Software Foundation, Inc.
+# Borislav Aleksandrov <B.Aleksandrov@cnsys.bg>, 2002.
+# Alexander Shopov <ash@contact.bg>, 2002, 2005, 2006, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-03-08 08:20+0200\n"
+"Last-Translator: Alexander Shopov <ash@contact.bg>\n"
+"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Неочакван атрибут „%s“ на елемента „%s“"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Атрибутът „%s“ на елемента „%s“ не е открит"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Неочакван етикет „%s“, очакваше се „%s“"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Неочакван етикет „%s“ вътре в „%s“"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Не може да се открие валиден файл с отметки в папките с данни"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Вече съществува отметка за адреса „%s“"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Не е открита отметка за адреса „%s“"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Не е указан типът MIME в отметката към адреса „%s“"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Не е зададен флаг за лични данни за адреса „%s“"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Не са зададени групи в отметката за адреса „%s“"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Никое приложение „%s“ не е регистрирало отметка за „%s“"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Неуспех при разширяването на реда за изпълнение „%s“ с адреса „%s“"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Преобразуването от набора символи „%s“ към „%s“ не се поддържа"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Не може да се отвори конвертор от „%s“ към „%s“"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Грешна байтова последователност на входа за преобразуване"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Грешка по време на преобразуване: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Непълна символна последователност в края на входните данни"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr ""
+"Заместващият символ „%s“ не може да бъде преобразуван към символ от набора „%"
+"s“"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "Адресът „%s“ не е абсолютен при използване на схемата „файл“"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Адресът „%s“ на локален файл не може да включва „#“"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "Адресът „%s“ е неправилен"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Името на хоста в адреса „%s“ е невалидно"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Адресът „%s“ съдържа грешни екраниращи последователности"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Пътят „%s“ не е абсолютен"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Неправилно име на хост"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Грешка при отваряне на папка „%s“: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Неуспех при заделянето на %lu байта за четене на файла „%s“"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Грешка при четене на файл „%s“: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Неуспех при четене от файл „%s“: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Неуспех при отваряне на файл „%s“: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"Неуспех при получаване на атрибутите на файл „%s“: неуспешно изпълнение на "
+"fstat(): %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr ""
+"Неуспех при отваряне на файл „%s“: неуспешно изпълнение на fdopen(): %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Неуспех при преименуване на файл „%s“ на „%s“: неуспешно изпълнение на "
+"g_rename(): %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Неуспех при създаване на файл „%s“: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"Неуспех при отваряне на файл „%s“ за писане: неуспешно изпълнение на fdopen"
+"(): %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Неуспех при запис на файл „%s“: неуспешно изпълнение на fwrite(): %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr ""
+"Неуспех при затваряне на файл „%s“: неуспешно изпълнение на fclose(): %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+"Неуспех при изтриването на съществуващия файл „%s“: неуспешно изпълнение на "
+"g_unlink(): %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Шаблонът „%s“ е неправилен, не трябва да съдържа „%s“"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Шаблонът „%s“ не съдържа XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Неуспех при четене на символната връзка „%s“: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Символни връзки не се поддържат"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Не може да се отвори конвертор от „%s“ към „%s“: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Не може да се чете от g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "В буфера за четене останаха непреобразувани данни"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Каналът прекъсна на непълен символ"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Не може да се чете от g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Неуспех при отваряне на файл „%s“: неуспешно изпълнение на open(): %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr ""
+"Неуспех при отваряне на файл в паметта „%s“: неуспешно изпълнение на mmap(): "
+"%s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Грешка на ред %d, символ %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Грешка на ред %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Намерена е празна заместваща последователност: „&;“. Валидни "
+"последователности са: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Символът „%s“ не е валидно начало на заместваща последователност. Валидно "
+"начало е символът &. Ако той не трябва да започва заместваща "
+"последователност, той може да се екранира така: &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Символът „%s“ не може да се съдържа в заместваща последователност"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Заместващата последователност „%s“ е неизвестна"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Заместващата последователност не завършва с „;“. Най-вероятно сте използвали "
+"амперсанд, без той да е начало на заместваща последователност. Представете "
+"амперсанда чрез &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Грешка при анализ на „%-.*s“, което трябва да е число в указател на символ "
+"(например &#234;). Вероятно числото е твърде голямо"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr ""
+"Указателят на символ „%-.*s“ при декодиране не представя разрешен символ"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Празен указател на символ. Трябва да включва число, например &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Указателят на символ не завършва с „;“. Най-вероятно сте използвали "
+"амперсанд, без той да е начало на заместваща последователност. Представете "
+"амперсанда чрез &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Незавършена заместваща последователност"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Незавършен указател на символ"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Неправилно кодиран текст в UTF-8"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Документът трябва да започва с елемент (напр. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"„%s“ е невалиден символ след „<“. Името на елемент не може да започне с него"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Неподходящ символ „%s“, очаква се отварящия етикет на елемент „%s“ да "
+"завърши с „>“"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Неподходящ символ „%s“, очаква се „=“ след името на атрибут „%s“ на елемент "
+"„%s“"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Неподходящ символ „%s“, очаква се или отварящия етикет на елемента „%s“ да "
+"завърши със символ „>“ или „/“, или евентуално да продължи с атрибут. Най-"
+"вероятно използвате неправилен символ в името на атрибут"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Неподходящ символ „%s“, очаква се символ „\"“ след знака за равенство, "
+"когато се присвоява стойност на атрибута „%s“ на елемент „%s“"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"„%s“ е невалиден символ след символите „</“. Името на елемент не може да "
+"започва с „%s“"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"„%s“ е невалиден символ при завършването на затварящ етикет с име „%s“. "
+"Позволен е символът „>“"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Елементът „%s“ е затворен, няма текущо отворен елемент"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Елементът „%s“ е затворен, но текущо е отворен елемент „%s“"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Документът е празен или съдържа само празни символи"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Документът завършва неочаквано веднага след отваряща счупена скоба - „<“"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Документът завършва неочаквано - има отворени елементи. Последно отворен е „%"
+"s“"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Документът завършва неочаквано, очаква се затваряща счупена скоба да завърши "
+"етикета <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Документът завършва неочаквано в името на елемент"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Документът завършва неочаквано в името на атрибут"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Документът завършва неочаквано в отварящ етикет на елемент "
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Документът завършва неочаквано след знака за равенство следващ името на "
+"атрибута. Атрибутът няма стойност"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Документът завършва неочаквано вътре в стойността на атрибут"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Документът завършва неочаквано в затварящия етикет на елемент „%s“"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Документът завършва неочаквано в коментар или инструкция за обработка"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Грешка на ред %d, символ %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Незавършена заместваща последователност"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Цитиран текст не започва със символ „\"“"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Липсват затварящи кавички в команден ред или друг текст цитиран от обвивката"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Текстът свърши веднага след символа „\\“. (Текстът е „%s“)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Текстът свърши преди откриването на затварящи кавички за %c. (Текстът е „%s“)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Текстът е празен (или съдържа само празни символи)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Неуспех при четене на данни от дъщерен процес"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Неуспех при създаването на канал за комуникация с дъщерен процес (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Неуспех при четене от дъщерен канал (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Неуспех при промяна към папка „%s“ (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Неуспех при изпълнение на дъщерен процес (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Неправилно име на програма: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Невалиден низ във вектора с аргументи на позиция %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Неправилен низ в средата: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Неправилна работна папка: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Неуспех при изпълнение на програмата за помощта (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Неочаквана грешка в g_io_channel_win32_poll() при четене на данни от дъщерен "
+"процес"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Неуспех при четене на данни от дъщерен процес (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Неочаквана грешка в select() при четене на данни от дъщерен процес (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Неочаквана грешка в waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Неуспешно разклоняване (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Неуспех при изпълнение на дъщерен процес „%s“ (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Неуспех при пренасочване на изхода или входа на дъщерен процес (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Неуспех при разклоняване на дъщерен процес (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Неизвестна грешка при изпълнение на дъщерен процес „%s“"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"Неуспех при четенето на достатъчно данни от канала на дъщерен процес с pid (%"
+"s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Символ извън обхвата на UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Неправилна последователност на входа за преобразуване"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Символ извън обхвата на UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Употреба:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[ОПЦИЯ...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Настройки на помощта:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Показване на настройките на помощта"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Показване на всички настройки на помощта"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Настройки на приложението:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Не може да се анализира целочислената стойност „%s“ за %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+"Целочислената стойност „%s“ за %s е извън интервала на допустими стойности"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+"Не може да се анализира стойността с повишена точност double „%s“ за %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+"Стойността с повишена точност - double „%s“ за %s е извън интервала на "
+"допустими стойности"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Грешка при анализа на опцията: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Липсва аргумент за %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Непозната опция %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Не може да се открие валиден ключов файл в папките с данни"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Не е обикновен файл"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Файлът е празен"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Ключовият файл съдържа реда „%s“, който не е нито двойка ключ-стойност, нито "
+"група, нито коментар"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Неправилно име на група: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Ключовият файл не започва с група"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Неправилно име на ключ: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Ключовият файл съдържа неподдържаното кодиране „%s“"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Ключовият файл не съдържа групата „%s“"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Ключовият файл не съдържа ключа „%s“"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Ключовият файл съдържа ключ „%s“ със стойност „%s“, която не е в UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Ключовият файл съдържа ключа „%s“, чиято стойност не може да бъде "
+"анализирана."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Ключовият файл съдържа ключа „%s“ в групата „%s“, чиято стойност не може да "
+"бъде анализирана."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Ключовият файл не съдържа ключа „%s“ в групата „%s“"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Ключовият файл съдържа екранираща последователност в край на ред"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Ключовият файл съдържа грешна екранираща последователност - „%s“"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Стойността „%s“ не може да се интерпретира като число."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Целочислената стойност „%s“ е извън интервала на допустими стойности"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+"Стойността „%s“ не може да се интерпретира като число с плаваща запетая."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Стойността „%s“ не може да се интерпретира като булева."
diff --git a/trunk/po/bn.po b/trunk/po/bn.po
new file mode 100644
index 000000000..b16016ef1
--- /dev/null
+++ b/trunk/po/bn.po
@@ -0,0 +1,936 @@
+# The Bengali translation for glib.
+# Copyright (C) 2002
+# This file is distributed under the same license as the glib package.
+# Taneem Ahmed <taneem@eyetap.org>, 2002.
+# Mahay Alam Khan <makl10n@yahoo.com>, 2005.
+# Samia Niamatullah <mailsamia2001@yahoo.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib 0.1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-31 21:21+0600\n"
+"Last-Translator: Khandakar Mujahidul Islam <suzan@bengalinux.org>\n"
+"Language-Team: Bengali <gnome-translation@bengalinux.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "অপ্রত্যাশিত '%s' বৈশিষ্ট্য '%s' বস্তুর জন্য উল্লিখিত হয়েছে"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "%s' বৈশিষ্ট্য '%s' বস্তুর ক্ষেত্রে পাওয়া যায়নি"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "অপ্রত্যাশিত ট্যাগ '%s', ট্যাগ '%s' প্রত্যাশিত"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "অপ্রত্যাশিত '%s' ট্যাগ '%s'-র মধ্যে"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "data dir'র মধ্যে বৈধ বুকমার্ক ফাইল পাওয়া যায় নি"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "URI '%s'-র জন্য বুকমার্ক বর্তমানে উপস্থিত রয়েছে"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "URI '%s'-র জন্য বুকমার্ক পাওয়া যায় নি"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "URI '%s'-র বুকমার্কের ক্ষেত্রে MIME'র ধরন নির্ধারিত হয় নি"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "URI '%s'-র বুকমার্কের ক্ষেত্রে ব্যক্তিগত ফ্ল্যাগ চিহ্ন দেওয়া হয় নি"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "URI '%s'-র বুকমার্কের ক্ষেত্রে দল নির্ধারণ করা হয় নি"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "'%s' নামক কোনো অ্যাপ্লিকেশনের দ্বারা '%s' বুকমার্ক নিবন্ধিত হয় নি"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "প্রতীকি লিংক '%s' পড়তে ব্যর্থ: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "'%s' থেকে '%s' এ অক্ষর সমূহ পরিবর্তন করা সম্ভব নয়"
+
+# sam: রুপান্তরকারক
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "'%s' থেকে '%s' তে কনভার্টার খোলা যায়নি"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "পরিবর্তন করার জন্য দেয়া বাইট সমুহ সঠিক নয়"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "পরিবর্তন সময়কালীন ভুল: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "প্রদত্ত তথ্যের শেষে আংশিক অক্ষর সমুহ"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "ফলব্যাক '%s' থেকে কোডসেট '%s' এ পরিবর্তন করা যায়নি"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "\"ফাইল\" স্কীম অনুযায়ী URI '%s' একটি পরিপূর্ণ আপেক্ষিক URI নয়"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "স্থানীয় ফাইল ইউআরআই '%s' এর মধ্যে '#' থাকা বৈধ নয়"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "ইউআরআই '%s' গ্রহনযোগ্য নয়"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "ইউআরআই '%s' এর হোস্ট নাম গ্রহনযোগ্য নয়"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "ইউআরআই '%s' এর মধ্যে অগ্রহণীয় এস্কেপ অক্ষর আছে"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "পথনাম '%s' একটি আপেক্ষিক পথ"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "ভুল হোস্ট নাম"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "ডাইরেক্টরি '%s' খুলতে ব্যর্থ: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "%lu বাইট, ফাইল \"%s\" পড়ার জন্য বরাদ্দ করা যায়নি"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "ফাইল \"%s\" পড়ার সময়কালীন ভুল: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "ফাইল \"%s\" থেকে পড়াতে ব্যর্থ: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "ফাইল \"%s\" খুলতে ব্যর্থ: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "ফাইল \"%s\" এর বৈশিষ্ট্য পেতে ব্যর্থ: fstat() ব্যর্থ: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "ফাইল \"%s\" খুলতে ব্যর্থ: fdopen() ব্যর্থ: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "'%s' ফাইলের নাম '%s' তে পরিবর্তন করা যায়নি: g_rename() failed: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "ফাইল \"%s\" সৃষ্টি করতে ব্যর্থ: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "লেখার জন্য ফাইল \"%s\" খুলতে ব্যর্থ: fdopen() ব্যর্থ: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "\"%s\" ফাইলে লিখতে ব্যর্থ: fwrite() ব্যর্থ: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "'%s' ফাইল বন্ধ করতে ব্যর্থ: fclose() ব্যর্থ: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "বিদ্যমান ফাইল '%s' অপসারিত করা যায়নি: g_unlink() ব্যর্থ: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "নমুনা '%s' সঠিক নয়, '%s' থাকা উচিত্‌ নয়"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "'%s' টেমপ্লেটের মধ্যে XXXXXX অন্তর্ভুক্ত নেই"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "প্রতীকি লিংক '%s' পড়তে ব্যর্থ: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "প্রতীকী লিঙ্ক সমর্থিত নয়"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "'%s' থেকে '%s' পরিবর্তন ব্যবস্থা খোলা সম্ভব হয়নি: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "g_io_channel_read_line_string এ সরাসরি পড়া যায়নি"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "পড়ার বাফারে অপরিবর্তিত তথ্য"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "চ্যানেল আংশিক অ"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "g_io_channel_read_to_end এ সরাসরি পড়া যায়নি"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "ফাইল '%s' খুলতে ব্যর্থ: open() ব্যর্থ: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "ফাইল '%s' ম্যাপ করতে ব্যর্থ: mmap() ব্যর্থ: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "লাইন %d ক্যর %d এ ভুল: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "লাইন %d এ ভুল: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr "শূন্য '&;' দেখা গিয়েছে; গ্রহনযোগ্য হচ্ছে: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"কোন বস্তু (entity) এর নামের শুরুতে '%s' অক্ষরটি গ্রহনযোগ্য নয়; & অক্ষরটি একটি বস্তুর "
+"নাম শুরু করে; এই এমপারস্যান্ড যদি কোনো বস্তু না হয়, তাহলে এটাকে &amp হিসাবে লিখুন"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "'%s' অক্ষরটি কোনো বস্তুর মাঝখানে গ্রহনযোগ্য নয়"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "'%s' নামের বস্তুটি অজানা"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"একটি বস্তু (entity) সেমিকোলন দিয়ে শেষ হয়নি; আপনি সম্ভবত এমপারস্যান্ড অক্ষরটি কোন "
+"বস্তু শুরু করার জন্য ব্যবহার করেনি - সেক্ষেত্রে এস্কেপ এমপারস্যান্ড কে লিখুন &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"পার্স করতে অক্ষম '%-.*s', যা অক্ষর তথ্যসূত্র অভ্যন্তরে একটি অংক (উদাহরণ সরূপ; &#234) "
+"- হয়তোবা অংকটি অতি দীর্ঘ"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "অক্ষর তথ্যসূত্র '%-.*s' অনুমতিপ্রাপ্ত অক্ষর এনকোড করেনা"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "শূন্য অক্ষরের রেফারেন্স; &#454 এর মত সংখা থাকতে হবে"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"অক্ষরের রেফারেন্স সেমিকোলন দিয়ে শেষ হয়নি; আপনি সম্ভবত এমপারস্যান্ড অক্ষরটি কোন বস্তু "
+"শুরু করার জন্য ব্যবহার করেনি - সেক্ষেত্রে এস্কেপ এমপারস্যান্ড কে লিখুন &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "অসম্পূর্ণ বস্তুর রেফারেন্স"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "অসম্পূর্ণ অক্ষরের রেফারেন্স"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "অগ্রহনযোগ্য ইউটিএফ-৮ টেক্সট"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "ডকুউমেন্ট একটি এলিমেন্ট দিয়ে শুরু "
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr "'<' অক্ষরটির পরে '%s' গ্রহনযোগ্য নয়; এটি কোন এলিমেন্টের নাম শুরু করতে পারেনা"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"অসামঞ্জস্যকর অক্ষর '%s', এলিমেন্ট '%s' এর ট্যগ শেষ করার জন্য '>' অক্ষরটি আশা করা হয়"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"বেজোড় অক্ষর '%1$s', এলিমেন্ট '%3$s' এর অ্যাট্রিবিউট নাম '%2$s' এর পর একটি '=' "
+"প্রত্যাশিত"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"বেজোড় অক্ষর '%s', এলিমেন্ট '%s' এর প্রথম ট্যাগকে শেষ করতে একটি '>' বা '/' "
+"প্রত্যাশিত, অথবা একটি ঐচ্ছিক অ্যাট্রিবিউট; সম্ভবত আপনি বৈশিষ্ট্য নামে অবৈধ অক্ষর "
+"ব্যবহার করেছেন"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"বেজোড় অক্ষর '%1$s', এলিমেন্ট '%3$s' এর অ্যাট্রিবিউট নাম '%2$s' এর মান দেয়ার সময়, "
+"'=' চিহ্নটির পর একটি খোলা উদ্ধৃতি চিহ্ন আব্যশক"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"অক্ষর '</' কে অনুসরণকারী '%s' একটি বৈধ অক্ষর নয়; '%s' দিয়ে কোনো এলিমেন্টের নাম "
+"শুরু করা বৈধ নয়"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"বন্ধ এলিমেন্ট নাম '%2$s' কে অনুসরণকারী '%1$s' একটি বৈধ অক্ষর নয়; সমর্থিত অক্ষর "
+"হচ্ছে '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "'%s' এলিমেন্টটি বন্ধ ছিল, এখন খোলা এলিমেন্ট নেই"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "'%s' এলিমেন্টটি বন্ধ ছিল, কিন্তু এখন '%s' এলিমেন্টটি খোলা"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "ডকুউমেন্ট শূণ্য ছিল অথবা সুধু ওয়াইটস্পেইস ছিল"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "একটি কোণ বন্ধনী '<' খোলা থাকায় নথী অপ্রত্যাশিতভাবে শেষ হয়েছে"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"উপাদান খোলা অবস্থায় নথী অপ্রত্যাশিতভাবে শেষ হয়েছে - '%s' ছিল শেষ খোলা উপাদান"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"নথী অপ্রত্যাশিতভাবে শেষ হয়েছে, প্রত্যাশিতভাবে দৃষ্ট কারণ একটি কোণ বন্ধনী যার শেষে <%"
+"s/> ট্যাগ রয়েছে"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "একটি এলিমেন্ট নাম অভ্যন্তরে নথী অপ্রত্যাশিতভাবে শেষ হয়েছে"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "একটি বৈশিষ্ট্য নাম অভ্যন্তরে নথী অপ্রত্যাশিতভাবে শেষ হয়েছে"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "একটি এলিমেন্ট-ওপেনিং ট্যাগ অভ্যন্তরে নথী অপ্রত্যাশিতভাবে শেষ হয়েছে"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"বৈশিষ্ট্য নাম অনুসরণকরী সমান চিহ্নের পর নথী অপ্রত্যাশিতভাবে শেষ হয়েছে; কোন বৈশিষ্ট্য "
+"মান নয়"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "একটি বৈশিষ্ট্য মান এর অভ্যন্তরে নথী অপ্রত্যাশিতভাবে শেষ হয়েছে"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "নথী অপ্রত্যাশিতভাবে শেষ হয়েছে উপাদান '%s' এর বন্ধ ট্যাগ এর অভ্যন্তরে"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "নথী অপ্রত্যাশিতভাবে শেষ হয়েছে একটি মন্তব্য বা প্রসেসরত নির্দেশের অভ্যন্তরে"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "লাইন %d ক্যর %d এ ভুল: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "অসম্পূর্ণ বস্তুর রেফারেন্স"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "কোওটেড টেক্সট কোওটেসন মার্ক দিয়ে শুরু হয়নি"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "কমান্ড লাইন অথবা শেল-কোওটেড টেক্সট এর মাঝে কোওটেসন মার্ক মিলেনি "
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "একটি '\\' অক্ষরের ঠিক পরেই টেক্সট শেষ হয়েছে (টেক্সটি ছিল '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "%c এর জন্য মিলানো কোওট পাবার আগে টেক্সট শেষ হয়েছে (টেক্সটি ছিল '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "টেক্সট শূণ্য ছিল (অথবা সুধু ওয়াইটস্পেইস ছিল)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়তে ব্যর্থ"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "চাইল্ড প্রসেস (%s) এর সাথে যোগাযোগ করার জন্য পাইপ সৃষ্টি করতে ব্যর্থ"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "চাইল্ড পাইপ (%s) থেকে পড়তে ব্যর্থ"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "ডাইরেক্টরি '%s' (%s) তে বদলাতে ব্যর্থ"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "চাইল্ড প্রসেস (%s) কার্যকর করতে ব্যর্থ"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "প্রোগ্রামের নাম অবৈধ: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "%d এ আর্গুমেন্ট ভেক্টরে উল্লিখিত পংক্তি বৈধ নয়: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "পরিবেশের মধ্যে উল্লিখিত পংক্তি বৈধ নয়: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "সক্রিয় ডিরেক্টরি বৈধ নয়: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "সাহায্যকারী প্রোগ্রাম চলাতে ব্যর্থ (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"চাইল্ড প্রসেস থেকে তথ্য পড়ার সময় g_io_channel_win32_poll()'এ অপ্রত্যাশিত ত্রুটি"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "চাইল্ড প্রসেস (%s) থেকে তথ্য পড়তে ব্যর্থ"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "চাইল্ড প্রসেস (%s) থেকে তথ্য পড়াকালীন সময় select() এ অনাকাঙ্ক্ষিত ভুল"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "waitpid() (%s) এ অনাকাঙ্ক্ষিত ভুল"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "ফোর্ক (%s) সৃষ্টি করতে ব্যর্থ"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "চাইল্ড প্রসেস \"%s\" (%s) কার্যকর করতে ব্যর্থ"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "চাইল্ড প্রসেস (%s) এর ইনপুট অথবা আউটপুট রিডায়রেক্ট করতে ব্যর্থ"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "চাইল্ড প্রসেস (%s) সৃষ্টি করতে ব্যর্থ"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "চাইল্ড প্রসেস \"%s\" কার্যকর করার সময় অজানা ভুল"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "চাইল্ড পিয়াইডি পাইপ (%s) থেকে যথেস্ট তথ্য পড়তে ব্যর্থ"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "অক্ষর ইউটিএফ-৮ আয়তার বাইরে"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "পরিবর্তন করার জন্য দেয়া তথ্য সঠিক নয়"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "অক্ষর ইউটিএফ-১৬ আয়তার বাইরে"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "ব্যবহার:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[অপশন]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "সহায়ক তথ্যের অপশন:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "সহায়ক তথ্যের অপশন দেখাও"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "সমস্ত সহায়ক তথ্যের অপশন দেখাও"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "অ্যাপলিকেশন অপশন:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "ইন্টিজার মান %s এর জন্য '%s' পার্স করতে পারেনা"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "ইন্টিজার মান %s এর জন্য '%s' সীমার বাহিরে"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "%2$s-র জন্য '%1$s'-র দ্বীগুণ মান পার্স করতে ব্যর্থ"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "%2$s-র জন্য '%1$s'-র দ্বীগুণ মান সীমা বহির্ভূত"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "%s বিকল্প পার্স করতে ব্যর্থ"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "%s এর জন্য প্রেরিত মান নিরুদ্দেশ"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "অজানা অপশন %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "বৈধ কী ফাইল ডাটা dirs পাওয়া যায়নি"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "একটি নিয়মিত ফাইল নহে"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "ফাইল ফাঁকা"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr "কী ফাইল ধারণ করে '%s' লাইন, যা কী-মান এর জোড়া, গ্রুপ বা মন্তব্য নহে"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "প্রোগ্রামের নাম অবৈধ: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "কী ফাইল গ্রুপের সঙ্গে আরম্ভ করে না"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "প্রোগ্রামের নাম অবৈধ: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "কী ফাইল অসমর্থিত এনকোডিং '%s' ধারণ করছে"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "কী ফাইলের গ্রুপ '%s' নেই"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "কী ফাইলের কী '%s' নেই"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "কী ফাইলে '%s' কী এর মান '%s', যা UTF-8 নয়"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "কী ফাইল '%s' কী ধারণ করে যার মান ইন্টারপ্রেট করা যাবেনা।"
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr "কী ফাইল '%2$s' গ্রুপে '%1$s' কী ধারণ করছে যার মান ইন্টারপ্রেট করা যাবেনা।"
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "কী ফাইলের '%2$s' গ্রুপ এ অন্তর্ভুক্ত '%1$s' কী টি নেই"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "কী ফাইল লাইনের শেষে এস্কেপ অক্ষর ধারণ করছে"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "কী ফাইলে অবৈধ এস্কেপ সিকোয়েন্স '%s' আছে"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "মান '%s' কে সংখ্যা হিসেবে ইন্টারপ্রেট করা যায় না।"
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "ইন্টিজার মান '%s' সীমার বাহিরে"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "'%s' মান float সংখ্যা রূপে ব্যাখ্যা করা সম্ভব নয়।"
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "মান '%s' কে বুলিয়ান হিসেবে ইন্টারপ্রেট করা যায় না।"
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "ফাইল মোড পরিবর্তন করা যায়নি: fork() ব্যর্থ: %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "ফাইল মোড পরিবর্তন করা যায়নি: waitpid() ব্যর্থ: %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "ফাইল মোড পরিবর্তন করা যায়নি: chmod() ব্যর্থ: %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr "ফাইল মোড পরিবর্তন করতে পারেনি: সংকেত: %s দ্বারা চাইল্ড সমাপ্তকৃত"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr "ফাইল মোড পরিবর্তন করতে পারেনি: চাইল্ড সমাপ্তকৃত অস্বাভাবিকভাবে"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "ক্যরেকটার সেট `%s' থেকে `%s' পরিবর্তন করার সামর্থ নেই"
+
+#~ msgid "Incorrect message size"
+#~ msgstr "বেঠিক সাইজের তথ্য"
+
+#~ msgid "Socket error"
+#~ msgstr "সকেেট ভুল"
diff --git a/trunk/po/bn_IN.po b/trunk/po/bn_IN.po
new file mode 100644
index 000000000..5dc147d25
--- /dev/null
+++ b/trunk/po/bn_IN.po
@@ -0,0 +1,925 @@
+# The Bengali India translation for glib.
+# Copyright (C) 2002
+# This file is distributed under the same license as the glib package.
+# Taneem Ahmed <taneem@eyetap.org>, 2002.
+# Mahay Alam Khan <makl10n@yahoo.com>, 2005.
+# Samia Niamatullah <mailsamia2001@yahoo.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: bn_IN\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-07-17 15:24+0530\n"
+"Last-Translator: Runa Bhattacharjee <runabh@gmail.com>\n"
+"Language-Team: Bangla (INDIA) <gnome-translation@bengalinux.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "অপ্রত্যাশিত '%s' বৈশিষ্ট্য '%s' বস্তুর জন্য উল্লিখিত হয়েছে"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "'%s' বৈশিষ্ট্য '%s' বস্তুর ক্ষেত্রে পাওয়া যায়নি"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "অপ্রত্যাশিত ট্যাগ '%s', ট্যাগ '%s' প্রত্যাশিত"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "অপ্রত্যাশিত '%s' ট্যাগ '%s'-র মধ্যে"
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "data dir'র মধ্যে বৈধ বুকমার্ক ফাইল পাওয়া যায়নি"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "URI '%s'-র জন্য বুকমার্ক বর্তমানে উপস্থিত রয়েছে"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "URI '%s'-র জন্য বুকমার্ক পাওয়া যায়নি"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "URI '%s'-র বুকমার্কের ক্ষেত্রে MIME'র ধরন নির্ধারিত হয়নি"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "URI '%s'-র বুকমার্কের ক্ষেত্রে ব্যক্তিগত ফ্ল্যাগ চিহ্ন দেওয়া হয়নি"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "URI '%s'-র বুকমার্কের ক্ষেত্রে দল নির্ধারণ করা হয়নি"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "'%s' নামক কোনো অ্যাপ্লিকেশনের দ্বারা '%s' বুকমার্ক নিবন্ধিত হয়নি"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "'%s' সিম্বোলিঙ্ক লিঙ্ক পড়তে ব্যর্থ: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "'%s' অক্ষরমালা থেকে '%s'-এ রূপান্তর করা যাবে না"
+
+# sam: রুপান্তরকারক
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "'%s' থেকে '%s' রূপান্তর ব্যবস্থা খোলা যায়নি"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "রূপান্তর করার জন্য প্রদত্ত ইনপুটের মধ্যে বাইটের অনুক্রম সঠিক নয়"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "রূপান্তর কর্ম সঞ্চালনকালের উত্‌পন্ন সমস্যা: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "প্রদত্ত ইনপুটের অন্তে আংশিক অক্ষর অনুক্রম"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "ফলব্যাক '%s' থেকে '%s' কোড-সেটে পরিবর্তন করা যায়নি"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s'-টি \"file\" স্কিম প্রয়োগকারী সুনিশ্চিত URI নয়"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "স্থানীয় ফাইল URI '%s'-র মধ্যে '#' চিহ্ন অন্তর্ভুক্ত করা যাবে না"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' বৈধ নয়"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "URI '%s'-র হোস্ট-নেম বৈধ নয়"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s'-র মধ্যে অবৈধরূপে এস্কেপ অক্ষর প্রয়োগ করা হয়েছে"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "'%s' পাথটি সুনিশ্চিত নয়"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "হোস্ট-নেম বৈধ নয়"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "'%s' ডিরেক্টরি খুলতে ব্যর্থ: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "%lu বাইট, \"%s\" ফাইল পড়ার জন্য বরাদ্দ করা যায়নি"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "'%s' ফাইল পড়তে সমস্যা: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "'%s' ফাইল থেকে পড়তে ব্যর্থ: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "'%s' ফাইল খুলতে ব্যর্থ: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "'%s' ফাইলের বৈশিষ্ট্য প্রাপ্ত করতে ব্যর্থ: fstat() বিফল: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "'%s' ফাইল খুলতে ব্যর্থ: fdopen() বিফল: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "'%s' ফাইলের নাম '%s'-এ পরিবর্তন করতে ব্যর্থ: g_rename() বিফল: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "'%s' ফাইল নির্মাণ করতে ব্যর্থ: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "লেখার উদ্দেশ্যে '%s' খুলতে ব্যর্থ: fdopen() বিফল: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "'%s' ফাইলে লিখতে ব্যর্থ: fwrite() বিফল: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "'%s' ফাইল বন্ধ করতে ব্যর্থ: fclose() বিফল: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "বিদ্যমান ফাইল '%s' অপসারিত করা যায়নি: g_unlink() ব্যর্থ: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "নমুনা '%s' সঠিক নয়, '%s' থাকা উচিত্‌ নয়"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "'%s' টেমপ্লেটের মধ্যে XXXXXX অন্তর্ভুক্ত নেই"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "'%s' সিম্বোলিঙ্ক লিঙ্ক পড়তে ব্যর্থ: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "সিম্বোলিক লিঙ্ক সমর্থিত হয় না"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "'%s' থেকে '%s' পরিবর্তন ব্যবস্থা খোলা সম্ভব হয়নি: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "g_io_channel_read_line_string'র উপর raw read করা সম্ভব নয়"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "read বাফারের মধ্যে অরূপান্তরিত তথ্য অবশিষ্ট রয়েছে"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "আংশিক অক্ষর দ্বারা চ্যানেলের সমাপ্তি"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "g_io_channel_read_to_end'এ raw read করা যায়নি"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "'%s' খুলতে ব্যর্থ: open() বিফল: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "'%s' ফাইল ম্যাপ করতে ব্যর্থ: mmap() বিফল: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "পংক্তি %d অক্ষর %d'এ ত্রুটি: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "পংক্তি %d'এ ত্রুটি: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"তথ্যবিহীন স্বত্বা '&;' প্রদর্শিত; বৈধ স্বত্বা হল: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"স্বত্বার নামের প্রারম্ভে '%s'-র ব্যবহার বৈধ নয়; & অক্ষর দ্বারা স্বত্বা আরম্ভ করা হয়; "
+"এই অ্যাম্পারসেন্ড চিহ্নটি স্বত্বার ক্ষেত্রে ব্যবহৃত না হলে &amp; রূপে এটিকে এস্কেপ করানো "
+"যাবে"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "স্বতার নামে '%s' অক্ষরের ব্যবহার বৈধ নয়"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "'%s' নামের স্বত্বা অজানা"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"স্বত্বার নাম সেমিকোলোন চিহ্ন দ্বারা সমাপ্ত হয়নি; সম্ভবত আপনি স্বত্বা হিসাবে ব্যবহারের "
+"উদ্দেশ্যে এম্পারসেন্ড চিহ্ন প্রয়োগ করেননি - &amp; রূপে এম্পারসেন্ড এস্কেপ করানো যাবে"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"'%-.*s' পার্স করতে ব্যর্থ, এটি কোনো অক্ষরের রেফারেন্সের মধ্যে একটি সংখ্যা হওয়া উচিত "
+"(উদাহরণস্বরূপ &#234;) - সম্ভবত সংখ্যাটি অত্যাধিক বড়"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "'%-.*s' অক্ষরের রেফারেন্সের মধ্যে অনুমোদিত অক্ষর এনকোড করা হয়নি"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "অক্ষর রেফারেন্স ফাঁকা; &#454;'র অনুরূপ সংখ্যা উপস্থিত আবশ্যক"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"অক্ষরের রেফারেন্স সেমি-কোলন চিহ্ন দ্বারা সমাপ্ত হয়নি; সম্ভবত আপনি স্বত্বা হিসাবে "
+"ব্যবহারের উদ্দেশ্যে এম্পারসেন্ড চিহ্ন প্রয়োগ করেননি - &amp; রূপে এম্পারসেন্ড এস্কেপ "
+"করানো যাবে"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "স্বত্বার রেফারেন্স অসম্পূর্ণ"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "অক্ষরের রেফারেন্স অসম্পূর্ণ"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "অবৈধ UTF-8 এনকোডিং সহ টেক্সট"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "নথি কোনো এলিমেন্ট দ্বারা আরম্ভ হওয়া আবশ্যক (উদাহরণস্বরূপ <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'<' অক্ষরের পরে '%s'-র ব্যবহার বৈধ নয়; এর দ্বারা এলিমেন্টের নাম আরম্ভ করা যাবে না"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"'%s' অক্ষর প্রত্যাশিত নয়, '%s' এলিমেন্টের প্রারম্ভিক ট্যাগ সমাপ্ত করার উদ্দেশ্যে '>' "
+"অক্ষর প্রত্যাশিত"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"'%1$s' অক্ষর প্রত্যাশিত নয়, '%3$s' এলিমেন্টের '%2$s' নামক বৈশিষ্ট্যের নামের পরে "
+"একটি '=' চিহ্ন প্রত্যাশিত"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"'%s' অক্ষর প্রত্যাশিত নয়, '%s' এলিমেন্টের প্রারম্ভিক ট্যাগ সমাপ্ত করার উদ্দেশ্যে '>' "
+"অথবা '/' চিহ্ন অথবা কোনো বৈশিষ্ট্যর উপস্থিতি কাম্য; সম্ভবত কোনো বৈশিষ্ট্যের নামের "
+"মধ্যে অবৈধ অক্ষর ব্যবহৃত হয়েছে"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"'%1$s' অক্ষর অপ্রত্যাশিত, '%3$s' এলিমেন্টের '%2$s' বৈশিষ্ট্যের মান নির্ধারণের "
+"উদ্দেশ্যে সমান চিহ্নের (=) পরে একটি উদ্ধৃতি চিহ্নের প্রারম্ভিক অংশ উপস্থিতি প্রত্যাশিত"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' অক্ষরের ব্যবহার '</'-র পশ্চাত বৈধ নয়; '%s' দ্বারা কোনো এলিমেন্টের নাম আরম্ভ "
+"করা যাবে না"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%2$s' বদ্ধ এলিমেন্টের নামের পশ্চাত '%1$s' অক্ষরের ব্যবহার বৈধ নয়; অনুমোদিত অক্ষর "
+"হল '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "'%s' এলিমেন্ট বদ্ধ অবস্থায়, বর্তমানে কোনো এলিমেন্ট খোলা অবস্থায় নেই"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "'%s' এলিমেন্ট বদ্ধ অবস্থায়, বর্তমানে '%s' এলিমেন্ট খোলা অবস্থায় রয়েছে"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "ডকুমেন্ট সম্ভবত ফাঁকা অথবা শুধুমাত্র শূণ্যস্থান উপস্থিত"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"তেরছা বন্ধনীর প্রারম্ভিক চিহ্নের '<' ঠিক পরে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"খোলা এলিমেন্টসহ ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে - '%s' এলিমেন্ট সর্বশেষ খোলা "
+"হয়েছিল"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"নথি অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে, <%s/> ট্যাগ সমাপ্তির জন্য তেরছা বন্ধনী চিহ্নের "
+"অন্তিম অংশের উপস্থিতি প্রত্যাশিত"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "এলিমেন্টের নামের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "বৈশিষ্ট্যের নামের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "এলিমেন্টের প্রারম্ভিক ট্যাগের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"বৈশিষ্ট্যের নামের পরে উপস্থিত সমান চিহ্নের (=) পরে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত "
+"হয়েছে; বৈশিষ্ট্যের মান অনুপস্থিত"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "বৈশিষ্ট্যের মানের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "'%s' এলিমেন্টের অন্তিম ট্যাগের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"কোনো মন্তব্য অথবা প্রক্রিয়াকরণের নির্দেশের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "পংক্তি %d অক্ষর %d'এ ত্রুটি: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "স্বত্বার রেফারেন্স অসম্পূর্ণ"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "উদ্ধৃতির অংশ উদ্ধিতি চিহ্ন দ্বারা আরম্ভ করা হয়নি"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "কমান্ড-লাইন অথবা শেল'র উদ্ধৃতির মধ্যে অসংগত উদ্ধৃতি চিহ্ন"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "'\\' অক্ষরের পরে টেক্সট সমাপ্ত হয়েছে। (সংশ্লিষ্ট টেক্সট হল '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "%c'র ক্ষেত্রে সুসংগত উদ্ধৃতি চিহ্ন পাওয়া যায়নি। (সংশ্লিষ্ট টেক্সট হল '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "টেক্সট ফাঁকা (অথবা শুধুমাত্র শূণ্যস্থানসহ)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়তে ব্যর্থ"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "চাইল্ড প্রসেসের সাথে যোগাযোগের উদ্দেশ্যে পাইপ নির্মাণে ব্যর্থ (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "চাইল্ড পাইপ থেকে পড়তে ব্যর্থ (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "'%s' ডিরেক্টরিতে পরিবর্তন করতে ব্যর্থ (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "চাইল্ড প্রসেস কার্যকর করতে ব্যর্থ (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "প্রোগ্রামের নাম অবৈধ: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "%d'এ আর্গুমেন্ট ভেক্টর'এ উল্লিখিত পংক্তি বৈধ নয়: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "পরিবেশের মধ্যে উল্লিখিত পংক্তি বৈধ নয়: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "সক্রিয় ডিরেক্টরি বৈধ নয়: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "সহায়ক প্রোগ্রাম চালাতে ব্যর্থ (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"চাইল্ড প্রসেস থেকে তথ্য পড়ার সময় g_io_channel_win32_poll()'এ অপ্রত্যাশিত ত্রুটি"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়তে ব্যর্থ (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়ার সময় select() সংক্রান্ত অপ্রত্যাশিত ত্রুটি (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "waitpid()'এ অপ্রত্যাশিত ত্রুটি (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "fork করতে ব্যর্থ (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "চাইল্ড প্রসেস \"%s\" চালাতে ব্যর্থ (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "চাইল্ড প্রসেসের আউটপুট অথবা ইনপুট রি-ডাইরেক্ট করতে ব্যর্থ (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "চাইল্ড প্রসেস fork করতে ব্যর্থ (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "চাইল্ড প্রসেস \"%s\" কার্যকর করতে অজানা সমস্যা"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "চাইল্ড pid পাইপ থেকে পর্যাপ্ত তথ্য পড়তে ব্যর্থ (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "অক্ষরটি UTF-8'র আয়ত্বের বাইরে"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "রূপান্তর করার উদ্দেশ্যে প্রদত্ত তথ্যের মধ্যে অবৈধ ধারা"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "অক্ষরটি UTF-16'র আয়ত্বের বাইরে"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "ব্যবহারপ্রণালী:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "সহায়তা সংক্রান্ত বিকল্প:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "সহায়তা সংক্রান্ত বিকল্প প্রদর্শন করা হবে"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "সহায়তা সংক্রান্ত সমস্ত বিকল্প প্রদর্শন করা হবে"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "অ্যাপ্লিকেশন সংক্রান্ত বিকল্প:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "%2$s-র জন্য '%1$s'-র পূর্ণসংখ্যা মান পার্স করতে ব্যর্থ"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "%2$s-র জন্য '%1$s'-র পূর্ণসংখ্যা মান সীমা বহির্ভূত"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "%2$s-র জন্য '%1$s'-র দ্বীগুণ মান পার্স করতে ব্যর্থ"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "%2$s-র জন্য '%1$s'-র দ্বীগুণ মান সীমা বহির্ভূত"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "%s বিকল্প পার্স করতে ব্যর্থ"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "%s'র আর্গুমেন্ট অনুপস্থিত"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "অজানা বিকল্প %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "তথ্য ধারণকারী dirs'র মধ্যে বৈধ কি-ফাইল পাওয়া যায়নি"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "সাধারণ ফাইল নয়"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "ফাইল ফাঁকা"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr "কি-ফাইলের মধ্যে '%s' পংক্তিটি রয়েছে, এটি কি-মান জুটি, সংকলন অথবা মন্তব্য নয়"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "প্রোগ্রামের নাম অবৈধ: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "কি-ফাইলের প্রারম্ভে কোনো সংকলন উল্লিখিত নেই"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "প্রোগ্রামের নাম অবৈধ: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "কি-ফাইলের মধ্যে অসমর্থিত এনকোডিং '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "কি-ফাইলের মধ্যে কোনো সংকলন অনুপস্থিত '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "কি-ফাইলের মধ্যে কোনো কি উপস্থিত নেই '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"কি-ফাইলের মধ্যে '%2$s' মান সহ '%1$s' কি উপস্থিত রয়েছে যা UTF-8 বিন্যাসে নেই।"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "কি-ফাইলের মধ্যে '%s' কি উপস্থিত রয়েছে যার মান ব্যাখ্যা করা সম্ভব নয়।"
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"কি-ফাইলের মধ্যে '%2$s' সংকলনে '%1$s' কি উপস্থিত রয়েছে যার মান ব্যাখ্যা করা সম্ভব "
+"নয়।"
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "কি-ফাইলের মধ্যে '%2$s' সংকলনে '%1$s' কি উপস্থিত নেই"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "কি-ফাইলের মধ্যে পংক্তির অবশেষে এস্কেপ অক্ষর উপস্থিত রয়েছে"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "কি-ফাইলের মধ্যে অবৈধ এস্কেপ ধারা উপস্থিত রয়েছে '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "'%s' মান কোনো সংখ্যারূপে ব্যাখ্যা করা সম্ভব নয়।"
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "'%s' পূর্ণসংখ্যা মান সীমা বহির্ভূত"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "'%s' মান float সংখ্যা রূপে ব্যাখ্যা করা সম্ভব নয়।"
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "'%s' মান বুলিয়ান রূপে ব্যাখ্যা করা সম্ভব নয়।"
diff --git a/trunk/po/bs.po b/trunk/po/bs.po
new file mode 100644
index 000000000..0803b8b8c
--- /dev/null
+++ b/trunk/po/bs.po
@@ -0,0 +1,936 @@
+# translation of glib to Bosnian
+# This file is distributed under the same license as the glib package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER, 2004.
+# Kenan Hadžiavdić <kenanh@frisurf.no>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.glib-2-4\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2004-05-17 01:30+0000\n"
+"Last-Translator: Kenan Hadžiavdić <kenanh@frisurf.no>\n"
+"Language-Team: Bosnian <lokal@lugbih.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.0.2\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Čudan znak '%s', očekivan znak '=' nakon osobine '%s' elementa '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Neuspješno čitanje simboličkog linka '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Pretvaranje iz skupa znakova '%s' u '%s' nije podržano"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Nisam mogao pokrenuti pretvaranje iz '%s' u '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Nevažeći niz bajtova u ulaznim podacima za pretvaranje"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Greška tokom pretvaranja: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Djelimičan niz znakova na kraju ulaznih podataka"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Ne mogu pretvoriti '%s' u znakovni skup '%s'"
+
+#: glib/gconvert.c:1727
+#, fuzzy, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' nije apsolutni URI koristeći šemu datoteka"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "URI lokalne datoteke '%s' ne smije sadržavati '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' je nevažeći"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Ime računara URI-ja '%s' je nevažeće"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' sadrži nevažeće escape znakove"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Putanja '%s' nije absolutna putanja"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Nevažeće ime računara"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Greška tokom otvaranja direktorija '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Nisam mogao dodijeliti %lu bajtova za čitanje datoteke \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Greška tokom čitanja datoteke '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Neuspješno čitanje datoteke '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Neuspješno otvaranje datoteke '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Neuspješno preuzimanje osobina datoteke '%s': fstat() neuspješan: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Neuspješno otvaranje datoteke '%s': fdopen() neuspješan: %s"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Neuspješno otvaranje datoteke '%s': fdopen() neuspješan: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Neuspješno pravljenje datoteke '%s': %s"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Neuspješno otvaranje datoteke '%s': fdopen() neuspješan: %s"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Neuspješno otvaranje datoteke '%s': fdopen() neuspješan: %s"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Neuspješno otvaranje datoteke '%s': fdopen() neuspješan: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Nevažeći šablon '%s', ne bi trebao sadržavati '%s'"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Šablon '%s' ne završava sa XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Neuspješno čitanje simboličkog linka '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Simbolički linkovi nisu podržani"
+
+#: glib/giochannel.c:1152
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Nisam mogao pokrenuti pretvaranje iz `%s' u `%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Ne mogu čitati sirovo u g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Preostali nepretvoreni podaci u baferu za čitanje"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanal završava djelimičnim znakom"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Ne mogu čitati sirovo u g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Neuspješno otvaranje datoteke '%s': fdopen() neuspješan: %s"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Neuspješno otvaranje datoteke '%s': fdopen() neuspješan: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Greška u %d. redu, znak %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Greška u %d. redu: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Primijećen prazan entitet '&;'; važeći entiteti su: &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Znak '%s' je nevažeći na početku imena entiteta; znak & započinje entitet; "
+"ako znak & ovdje ne označava početak entiteta, koristite &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Znak '%s' je nevažeći u imenu entiteta"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Nepoznato ime entiteta '%s'"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Znak na kraju entiteta nije tačka-zarez; vjerovatno je korišten znak & bez "
+"namjere započinjanja entiteta - izbjegnite korištenje znaka & upisivanjem "
+"&amp;"
+
+#: glib/gmarkup.c:573
+#, fuzzy, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Neuspješno tumačenje '%s', što je trebalo biti cifra unutar reference znaka "
+"(na primjer: &#234;) - možda je broj prevelik"
+
+#: glib/gmarkup.c:598
+#, fuzzy, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Referenca znaka '%s' ne kodira dopušteni znak"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Prazna referenca znaka; trebala bi sadržavati broj kao npr. &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Referenca znaka se ne završava tačka-zarezom; vjerovatno je korišten znak & "
+"bez namjere započinjanja entiteta - izbjegnite korištenje znaka & "
+"upisivanjem &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Nedovršena referenca entiteta"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Nedovršena referenca znaka"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Neispravno UTF-8 kodirani tekst"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokument mora početi elementom (npr. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' je nevažeći prateći znak nakon znaka '<'; ne može započeti naziv "
+"elementa"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Čudan znak '%s', očekivan znak '>' radi okončanja početne oznake elementa '%"
+"s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr "Čudan znak '%s', očekivan znak '=' nakon osobine '%s' elementa '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Čudan znak '%s', očekivan znak '>' ili '/' radi okončanja početne oznake "
+"elementa '%s' ili eventualno osobine; možda je korišten nevažeći znak u "
+"imenu osobine"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Čudan znak '%s', očekivan navodni znak nakon znaka jednakosti pri davanju "
+"vrijednosti osobini '%s' elementa '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' je nevažeći prateći znak nakon znakova '</'; '%s' ne može započeti "
+"naziv elementa"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' je nevažeći prateći znak nakon zatvaranja elementa '%s'; dopušteni znak "
+"je '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element '%s' je zatvoren, trenutno nema otvorenih elemenata"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Element '%s' je zatvoren ali trenutno je otvoren element '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokument je bio prazan ili je sadržavao samo prazna polja"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Neočekivan kraj dokumenta nakon otvorene zagrade '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Neočekivan kraj dokumenta uz još otvorene elemente - element '%s' je otvoren "
+"posljednji"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Neočekivan kraj dokumenta, očekivano zatvaranje zagrade radi okončanja "
+"oznake <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Neočekivan kraj dokumenta unutar imena elementa"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Neočekivan kraj dokumenta unutar imena osobine"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Neočekivan kraj dokumenta unutar oznake za otvaranje elementa"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Neočekivan kraj dokumenta nakon pratećeg znaka jednakosti iza naziva "
+"osobine; nedostaje vrijednost osobine"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Neočekivan kraj dokumenta unutar vrijednosti atributa"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Neočekivan kraj dokumenta unutar oznake za zatvaranje elementa '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Neočekivan kraj dokumenta unutar komentara ili instrukcije procesiranja"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Greška u %d. redu, znak %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Nedovršena referenca entiteta"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Citat ne počinje navodnim znakom"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Neuparen navodni znak u naredbi ili drugom citatu iz shella"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Tekst se završio nakon znaka '\\'. (Tekst je bio '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "Tekst se završio bez uparenog navodnog znaka %c. (Teskt je bio '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Tekst je bio prazan (ili je sadržavao samo prazna polja)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Neuspješno čitanje podataka iz podređenog procesa"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+"Neuspješno stvaranje cijevi za komuniciranje sa podređenim procesom (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Neuspješno čitanje iz podređene cijevi (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Neuspješan prelazak u direktorij '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Neuspješno pokretanje podređenog procesa (%s)"
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "Nevažeće ime računara"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, fuzzy, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Nevažeći niz u unosu za pretvaranje"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr "Greška tokom otvaranja direktorija '%s': %s"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Neuspješno pokretanje pomoćnog programa"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Neočekivana greška u g_io_channel_win32_poll() tokom čitanja podataka iz "
+"podređenog procesa"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Neuspješno čitanje podataka iz podređenog procesa (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Neočekivana greška u select() tokom čitanja podataka iz podređenog procesa (%"
+"s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Neočekivana greška u waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Neuspješan fork (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Neuspješno izvršavanje podređenog procesa \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Neuspješno preusmjeravanje ulaza ili izlaza podređenog procesa (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Neuspješno pokretanje fork() za podređeni proces (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Nepoznata greška tokom izvršenja podređenog procesa \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Neuspješno čitanje dovoljno podataka iz podređene pid cijevi (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Znak izvan raspona za UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Nevažeći niz u unosu za pretvaranje"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Znak izvan raspona za UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr ""
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr ""
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr ""
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr ""
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Greška tokom pretvaranja: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr ""
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr ""
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Nevažeće ime računara"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Nevažeće ime računara"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, fuzzy, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "URI '%s' sadrži nevažeće escape znakove"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Neuspješno otvaranje datoteke '%s': fdopen() neuspješan: %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Nisam mogao dodijeliti %lu bajtova za čitanje datoteke \"%s\""
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Neuspješno otvaranje datoteke '%s': fdopen() neuspješan: %s"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Pretvaranje iz skupa znakova `%s' u `%s' nije podržano"
diff --git a/trunk/po/ca.po b/trunk/po/ca.po
new file mode 100644
index 000000000..cb7234381
--- /dev/null
+++ b/trunk/po/ca.po
@@ -0,0 +1,983 @@
+# glib translation to Catalan.
+# Copyright © 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# Softcatalà <info@softcatala.org>, 2001.
+# Jordi Mallach <jordi@sindominio.net>, 2002, 2003, 2004, 2005, 2006.
+# Josep Puigdemont <josep.puigdemont@gmail.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib 2.8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-24 13:08+0200\n"
+"Last-Translator: Jordi Mallach <jordi@sindominio.net>\n"
+"Language-Team: Catalan <tradgnome@softcatala.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "No s'esperava l'atribut «%s» de l'element «%s»"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "No s'ha trobat l'atribut «%s» de l'element «%s»"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "No s'esperava l'etiqueta «%s», s'esperava «%s»"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "No s'esperava l'etiqueta «%s» dins «%s»"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+"No s'ha trobat cap fitxer d'adreces d'interès dins dels directoris de dades"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Ja existeix una adreça d'interès per a l'URI «%s»"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "No s'ha trobat cap adreça d'interès per a l'URI «%s»"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "No hi ha cap tipus MIME definit a l'adreça d'interès per a l'URI «%s»"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+"No hi ha cap senyalador privat definit a l'adreça d'interès per a l'URI «%s»"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "No hi ha cap grup establert a l'adreça d'interès per a l'URI «%s»"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+"No hi ha cap aplicació registrada amb el nom «%s» a l'adreça d'interès de «%"
+"s»"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "No s'ha pogut llegir l'enllaç simbòlic «%s»: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "No es permet la conversió del joc del caràcters «%s» a «%s»"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "No s'ha pogut obrir el convertidor de «%s» a «%s»"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "La seqüència de bytes no és vàlida a l'entrada de conversió"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "S'ha produït un error durant la conversió: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Seqüència de caràcters parcial al final de l'entrada"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "No es pot convertir el «fallback» «%s» al joc de codis «%s»"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "L'URI «%s» no és un URI absolut que utilitzi l'esquema «file»"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Pot ser que l'URI del fitxer local «%s» no inclogui cap «#»"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "L'URI «%s» no és vàlid"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "El nom de l'ordinador central de l'URI «%s» no és vàlid"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "L'URI «%s» conté caràcters d'escapada invàlids"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "El nom de camí «%s» no és un camí absolut"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Nom de l'ordinador central invàlid"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "S'ha produït un error en obrir el directori «%s»: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "No s'ha pogut assignar %lu bytes per a llegir el fitxer «%s»"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "S'ha produït un error en llegir el fitxer «%s»: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "No s'ha pogut llegir del fitxer «%s»: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "No s'ha pogut obrir el fitxer «%s»: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"No s'ha pogut obtenir els atributs del fitxer «%s»: fstat() ha fallat: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "No s'ha pogut obrir el fitxer «%s»: fdopen() ha fallat: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"No s'ha pogut canviar el nom del fitxer «%s» a «%s»: g_rename() ha fallat: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "No s'ha pogut crear el fitxer «%s»: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"No s'ha pogut obrir el fitxer «%s» per a escriptura: fdopen() ha fallat: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "No s'ha pogut escriure el fitxer «%s»: fwrite() ha fallat: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "No s'ha pogut tancar el fitxer «%s»: fclose() ha fallat: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+"No s'ha pogut suprimir el fitxer existent «%s»: g_unlink() ha fallat: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "La plantilla «%s» no és vàlida, no pot contenir cap «%s»"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "La plantilla «%s» no conté XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "No s'ha pogut llegir l'enllaç simbòlic «%s»: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "No es pot treballar amb enllaços simbòlics"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "No s'ha pogut obrir el convertidor de «%s» a «%s»: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "No es pot fer una lectura bàsica a g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "A la memòria intermèdia de lectura hi ha dades sobrants no convertides"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "El canal acaba en un caràcter parcial"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "No es pot fer una lectura bàsica a g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "No s'ha pogut obrir el fitxer «%s»: open() ha fallat: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "No s'ha pogut mapejar el fitxer «%s»: mmap() ha fallat: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "S'ha produït un error a la línia %d caràcter %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "S'ha produït un error a la línia %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"S'ha vist una entitat buida '&;'; les entitats vàlides són: &amp; &quot; "
+"&lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"El caràcter «%s» no és vàlid a l'inici d'un nom d'entitat; les entitats "
+"comencen amb el caràcter &. Si amb aquest signe no es vol indicar una "
+"entitat, substituïu-lo per &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "El caràcter «%s» no és vàlid dins d'un nom d'entitat"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "No es coneix el nom de l'entitat «%s»"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"L'entitat no acabava amb un punt i coma; segurament heu utilitzat un "
+"caràcter «&» sense intenció d'iniciar una entitat. Substituïu el caràcter "
+"«&» per &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"No s'ha pogut analitzar «%-.*s», hi hauria d'haver hagut un dígit dins un "
+"caràcter de referència (per exemple &#234;) - potser el dígit és massa llarg"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "El caràcter de referència «%-.*s» no codifica un caràcter permès"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+"El caràcter de referència és buit; hauria d'incloure un dígit com ara &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"La referència del caràcter no acabava amb un punt i coma; segurament heu "
+"utilitzat un caràcter «&» sense intenció d'iniciar una entitat. Substituïu "
+"el caràcter «&» per &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Referència a una entitat no acabada"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Referència a un caràcter no acabada"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "El text codificat UTF-8 no és vàlid"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "El document ha de començar amb un element (p.ex. <llibre>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"«%s» no és un caràcter vàlid després d'un caràcter «<»; no pot començar un "
+"nom d'element"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"S'ha trobat un caràcter estrany «%s», s'esperava un «>» per acabar "
+"l'etiqueta d'inici de l'element «%s»"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"S'ha trobat un caràcter estrany «%s», s'esperava un «=» després del nom "
+"d'atribut «%s» de l'element «%s»"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"S'ha trobat un caràcter estrany («%s»), s'esperava un caràcter «>» o «/» per "
+"finalitzar l'etiqueta d'inici de l'element «%s», o opcionalment un atribut; "
+"potser heu usat un caràcter no vàlid en un nom d'atribut"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"S'ha trobat un caràcter estrany («%s»), s'esperaven unes cometes d'obertura "
+"després del signe «igual que» en donar valor a l'atribut «%s» de l'element «%"
+"s»"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"«%s» no és un caràcter vàlid quan segueix els caracters «</»; un nom "
+"d'element no pot començar per «%s»"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"«%s» no és un caràcter vàlid quan segueix el nom d'element proper «%s»; el "
+"caràcter permès és «>»"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "L'element «%s» era tancat. Actualment no hi ha cap element obert"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "L'element «%s» era tancat, però l'element obert actualment és «%s»"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "El document era buit o només contenia espais en blanc"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"El document ha acabat de manera inesperada immediatament després d'un "
+"parèntesi d'angle obert «<»"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"El document ha acabat de manera inesperada amb elements encara oberts. «%s» "
+"era el darrer element obert"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"El document ha acabat de manera inesperada, s'esperava trobar un parèntesi "
+"d'angle tancat acabant l'etiqueta <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "El document ha acabat de manera inesperada enmig d'un nom d'element"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "El document ha acabat de manera inesperada enmig d'un nom d'atribut"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+"El document ha acabat de manera inesperada enmig d'una etiqueta d'obertura "
+"d'un element"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"El document ha acabat de manera inesperada després d'un signe d'«igual» que "
+"segueix un nom d'atribut; no hi ha cap valor d'atribut"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "El document ha acabat de manera inesperada enmig d'un valor d'atribut"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"El document ha acabat de manera inesperada dins l'etiqueta de tancament de "
+"l'element «%s»"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"El document ha acabat de manera inesperada enmig d'un comentari o una "
+"instrucció de processament"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "S'ha produït un error a la línia %d caràcter %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Referència a una entitat no acabada"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "El text citat no comença amb cometes"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"S'han trobat unes cometes desaparellades en una línia d'ordres o en un altre "
+"text entre cometes"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "El text acabava just després d'un caràcter «\\». (El text era «%s»)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"El text ha acabat abans de trobar les cometes corresponents per %c. (El text "
+"era «%s»)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "El text era buit (o només contenia espais en blanc)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "No s'ha pogut llegir dades del procés fill"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "No s'ha pogut crear el conducte per comunicar amb el procés fill (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "No s'ha pogut llegir des del conducte fill (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "No s'ha pogut canviar al directori «%s» (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "No s'ha pogut executar el procés fill (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "El nom del programa no és vàlid: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "La cadena del vectors d'argument no és vàlida a %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Cadena invàlida a l'entorn: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "El directori de treball no és vàlid: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "No s'ha pogut executar el programa d'ajuda (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"S'ha produït un error inesperat a g_io_chanel_win32_poll() en llegir dades "
+"d'un procés fill"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "No s'ha pogut llegir dades des del procés fill (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"S'ha produït un error inesperat a select() en llegir dades des d'un procés "
+"fill (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "S'ha produït un error inesperat en waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "No s'ha pogut bifurcar-se (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "No s'ha pogut executar el procés fill «%s» (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "No s'ha pogut redirigir la sortida o l'entrada del procés fill (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "No s'ha pogut bifurcar el procés fill (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "S'ha produït un error desconegut en executar el procés fill «%s»"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"No s'ha pogut llegir prou dades del conducte de l'identificador del procés "
+"fill (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "El caràcter és fora de rang per a UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Seqüència invàlida a l'entrada de la conversió"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "El caràcter és fora de rang per a UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Forma d'ús:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPCIÓ...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Opcions d'ajuda:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Mostra les opcions d'ajuda"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Mostra totes les opcions d'ajuda"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Opcions de l'aplicació:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "No es pot analitzar el valor enter «%s» per a %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "El valor enter «%s» per a %s és fora del rang"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "No es pot analitzar el valor doble «%s» per a %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "El valor doble «%s» per a %s és fora del rang"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "S'ha produït un error en analitzar l'opció %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Manca un argument per a %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "L'opció %s és desconeguda"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "No s'ha pogut trobar un fitxer de claus als directoris de dades"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "No és un fitxer regular"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "El fitxer és buit"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"El fitxer de claus conté la línia «%s» que no és una parella clau-valor, "
+"grup o comentari"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "El nom del programa no és vàlid: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "El fitxer de claus no comença amb un grup"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "El nom del programa no és vàlid: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "El fitxer de claus conté la codificació no implementada «%s»"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "El fitxer de claus no té el grup «%s»"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "El fitxer de claus no té la clau «%s»"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "El fitxer de claus conté la clau «%s» amb valor «%s» que no és UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"El fitxer de claus conté la clau «%s» que té un valor que no es pot "
+"interpretar."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"El fitxer de claus conté la clau «%s» al grup «%s», que té un valor que no "
+"es pot interpretar."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "El fitxer de claus no conté una clau «%s» al grup «%s»"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "El fitxer de claus conté un caràcter d'escapada al final de línia"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "El fitxer de claus conté el caràcter d'escapada invàlid «%s»"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "El valor «%s» no es pot interpretar com a un nombre."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "El valor enter «%s» és fora del rang"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "El valor «%s» no es pot interpretar com a un nombre en coma flotant."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "El valor «%s» no es pot interpretar com un booleà."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "No s'ha pogut canviar el mode del fitxer fork() ha fallat: %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "No s'ha pogut canviar el mode del fitxer: waitpid() ha fallat: %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "No s'ha pogut canviar el mode del fitxer: chmod() ha fallat: %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr ""
+#~ "No s'ha pogut canviar el mode del fitxer: el fill ha estat finalitzat pel "
+#~ "senyal: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr ""
+#~ "No s'ha pogut canviar el mode del fitxer: el fill ha finalitzat "
+#~ "anormalment"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "No se es pot fer la conversió del joc de caràcters «%s» a «%s»"
+
+#~ msgid "Incorrect message size"
+#~ msgstr "Mida incorrecta del missatge"
+
+#~ msgid "Socket error"
+#~ msgstr "Error de sòcol"
+
+#~ msgid "Channel set flags unsupported"
+#~ msgstr "No es permet l'ús dels indicadors de definició del canal"
diff --git a/trunk/po/cs.po b/trunk/po/cs.po
new file mode 100644
index 000000000..655b6c591
--- /dev/null
+++ b/trunk/po/cs.po
@@ -0,0 +1,932 @@
+# translation of cs.po to Czech
+# glib Czech translation.
+# Copyright (C) 2002, 2006, 2007 Free Software Foundation, Inc.
+# Copyright (C) 2004, 2005 glib'S COPYRIGHT HOLDER
+# Copyright (C) 2004, 2005 Miloslav Trmac <mitr@volny.cz>
+# Copyright (C) 2006 Lukas Novotny <lukasnov@cvs.gnome.org>
+#
+#
+# Petr Pytelka <pyta@lightcomp.cz>, 2002.
+# Miloslav Trmac <mitr@volny.cz>, 2002, 2004, 2005.
+# Lukas Novotny <lukasnov@cvs.gnome.org>, 2006.
+# Jakub Friedl <jfriedl@suse.cz>, 2006, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: cs\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-01-05 13:34+0100\n"
+"Last-Translator: Jakub Friedl <jfriedl@suse.cz>\n"
+"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Neočekávaný atribut '%s' elementu '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Atribut '%s' elementu '%s' nenalezen"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Neočekávaný tag '%s', byl očekáván tag '%s'"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Neočekávaný tag '%s' v '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "V datových adresářích nebyl nalezen platný soubor záložek"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Záložka pro URI '%s' již existuje"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Nebyla nalezena záložka pro URI '%s'"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "V záložce pro URI '%s' není definován žádný MIME typ"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "V záložce pro URI '%s' není definován žádný soukromý příznak"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Žádné skupiny nenastaveny v záložce pro URI '%s'"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Žádná aplikace se jménem '%s' nezaregistrovala záložku pro '%s'"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Nelze expandovat exec řádek '%s' pomocí URI '%s'"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Převod ze znakové sady '%s' do '%s' není podporován"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Nemohu otevřít převaděč z '%s' do '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Neplatná posloupnost bajtů na vstupu převodu"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Chyba při převodu: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Částečná sekvence znaků na konci vstupu"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Nemohu převést ukončení '%s' do znakové sady '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' není absolutní URI používající schéma \"file\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "URI '%s' místního souboru nesmí obsahovat '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' je neplatné"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Jméno počítače v URI '%s' je neplatné"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' obsahuje nesprávně escapované znaky"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "'%s' není absolutní cesta"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Neplatné jméno počítače"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Chyba při otevírání adresáře '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Nemohu se alokovat %lu bytů pro přečtení souboru \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Chyba čtení souboru '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Chyba při čtení ze souboru '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Nemohu otevřít soubor '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Nemohu získat atributy souboru '%s': fstat() selhalo: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Nemohu otevřít soubor '%s': fdopen() selhalo: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Nemohu přejmenovat soubor '%s' na '%s': g_rename() selhalo: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Nemohu vytvořit soubor '%s': %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Nemohu otevřít soubor '%s' pro zápis: fdopen() selhalo: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Nemohu zapisovat do souboru '%s': fwrite() selhalo: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Nemohu zavřít soubor '%s': fclose() selhalo: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Existující soubor '%s' nelze odstranit: g_unlink() selhalo: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Šablona '%s' je neplatná, neměla by obsahovat '%s'"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Šablona '%s' neobsahuje XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Nemohu přečíst symbolický odkaz '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Symbolické odkazy nejsou podporovány"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Nemohu otevřít převodník z '%s' do '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Nemohu přímo číst v g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Zbyla nepřevedená data ve vstupní vyrovnávací paměti"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanál ukončen částí znaku"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Nemohu přímo číst v g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Nemohu otevřít soubor '%s': open() selhalo: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Nemohu otevřít soubor '%s': mmap() selhalo: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Chyba na řádku %d znak %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Chyba na řádku %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Nalezena prázdná entita '&;', platné entity jsou: &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Znak '%s' není platný na začátku názvu entity; počátečním znakem entity je "
+"&; v případě, že nemá být entitou, je zapotřebí ho napsat jako &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Znak '%s' je v názvu entity neplatný"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Název entity '%s' není znám"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entita nekončí středníkem; pravděpodobně jste použili znak & bez úmyslu "
+"začít entitu - zapište ampersand jako &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Nemohu zpracovat '%-.*s', což by mělo být číslo v odkazu na znak (například "
+"&#234) - číslo je možná příliš velké"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Odkaz na znak '%-.*s' nekóduje povolený znak"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+"Prázdný odkaz na znak. Odkaz by měl obsahovat číslice, například &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Odkaz na znak nekončí středníkem; pravděpodobně jste použili znak & bez "
+"úmyslu začít entitu - zapište ampersand jako &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Neukončený odkaz na entitu"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Neukončený odkaz na znak"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Neplatný text v kódování UTF-8"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokument musí začínat elementem (například: <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr "'%s' není platný znak po znaku '<'; nesmí s ním začínat název elementu"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Divný znak '%s', byl očekáván znak '>' pro ukončení počátečního tagu "
+"elementu '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Divný znak '%s', po názvu atributu '%s' elementu '%s' bylo očekáváno '=' "
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Divný znak '%s', bylo očekáváno '>' nebo '/' pro ukončení počátečního tagu "
+"elementu '%s' nebo případně atribut; pravděpodobně jste použili neplatný "
+"znak v názvu atributu"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Divný znak '%s', po znaku rovnítka při udávání hodnoty atributu '%s' "
+"elementu '%s' byly očekávány uvozovky"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' není platný znak po znacích '</'; znakem '%s' nesmí začínat název "
+"elementu"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' není povolený znak po ukončovacím názvu elementu '%s'; povoleným znakem "
+"je '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element '%s' byl uzavřen, žádný element není momentálně otevřen"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Byl uzavřen element '%s', ale aktuálně je otevřen element '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokument je prázdný nebo obsahuje pouze mezery"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Dokument neočekávaně skončil hned po otevírací značce '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokument neočekávaně skončil, elementy jsou stále otevřeny - poslední "
+"otevřený element byl '%s'"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokument neočekávaně skončil, byla očekávána uzavírací závorka tagu <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokument neočekávaně skončil uvnitř názvu elementu"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokument neočekávaně skončil uvnitř názvu atributu"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokument neočekávaně skončil v tagu otevírajícím element."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokument neočekávaně skončil po znaku přiřazení následujícím za názvem "
+"atributu; chybí hodnota atributu"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokument neočekávaně skončil uvnitř hodnoty atributu"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Dokument neočekávaně skončil uvnitř uzavíracího tagu pro element '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Dokument neočekávaně skončil uvnitř komentáře nebo instrukce pro zpracování"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Chyba na řádku %d znak %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Neukončený odkaz na entitu"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Text v uvozovkách nezačíná uvozovkami"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Nenalezena uzavírací uvozovka v příkazovém řádku nebo jiném textu quotovaném "
+"jako shellem"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Text skončil právě za znakem '\\'. (Text byl '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Text skončil před nalezením odpovídajících uvozovek znakem %c. (Text byl '%"
+"s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Text je prázdný (nebo obsahuje pouze mezery)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Nemohu číst data z procesu potomka"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Nemohu vytvořit rouru pro komunikaci s procesem potomka (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Nemohu číst z roury potomka (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Nemohu přejít do adresáře '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Nemohu spustit proces potomka (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Neplatný název programu: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Neplatný řetězec v poli argumentů v %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Neplatný řetězec v prostředí: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Neplatný aktuální adresář: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Nemohu spustit pomocný program (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Neočekávaná chyba v g_io_channel_win32_poll() při čtení dat z procesu potomka"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Nemohu číst data z procesu potomka (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Neočekávaná chyba v select() při čtení dat z procesu potomka (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Neočekávaná chyba v waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Nemohu fork (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Nemohu spustit proces potomka \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Nemohu přesměrovat vstup nebo výstup procesu potomka (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Nemohu fork proces potomka (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Neznámá chyba při běhu procesu potomka \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Nemohu přečíst dostatek dat z roury pid potomka (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Znak je mimo rozsah UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Neplatná posloupnost na vstupu převodu"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Znak je mimo rozsah UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Použití:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[PŘEPÍNAČ...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Přepínače nápovědy:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Zobrazit přepínače nápovědy"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Zobrazit všechny přepínače nápovědy"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Přepínače aplikace:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Nemohu zpracovat celočíselnou hodnotu '%s' pro %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Celočíselná hodnota '%s' pro %s mimo rozsah"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Nelze zpracovat celočíselnou (double) hodnotu '%s' pro %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Celočíselná (double) hodnota '%s' pro %s mimo rozsah"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Chyba volby %s při syntaktické analýze"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Chybí parametr %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Neznámý přepínač %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "V datových adresářích nelze najít platný soubor klíče"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Není obyčejný soubor"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Soubor je prázdný"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Soubor klíče obsahuje '%s', což není dvojice klíč-hodnota, skupina ani "
+"komentář"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Neplatné jméno skupiny: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Soubor klíče nezačíná skupinou"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Neplatné jméno klíče: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Soubor klíče obsahuje nepodporované kódování '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Soubor klíče nemá skupinu '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Soubor klíče nemá klíč '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Soubor klíče obsahuje klíč '%s' s hodnotou '%s', která není v UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Soubor klíče obsahuje klíč '%s', který má hodnotu, kterou nelze "
+"interpretovat."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Soubor klíče obsahuje klíč '%s' ve skupině '%s', který má hodnotu, kterou "
+"nelze interpretovat."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Soubor klíče nemá klíč '%s' ve skupině '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Soubor klíče obsahuje znak escape na konci řádku"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Soubor klíče obsahuje neplatnou escape sekvenci '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Hodnotu '%s' nelze interpretovat jako číslo."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Celočíselná hodnota '%s' mimo rozsah"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Hodnotu '%s' nelze interpretovat jako reálné (float) číslo."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Hodnotu '%s' nelze interpretovat jako booleovskou hodnotu."
diff --git a/trunk/po/cy.po b/trunk/po/cy.po
new file mode 100644
index 000000000..d34a01974
--- /dev/null
+++ b/trunk/po/cy.po
@@ -0,0 +1,950 @@
+# glib yn Gymraeg.
+# This file is distributed under the same license as the libgnome package.
+# Kyfieithu (http://www.kyfieithu.co.uk), 2003.
+# Dafydd Harries <daf@parnassus.ath.cx>, 2003 2004.
+# Rhys Jones <rhys@sucs.org>, 2003-2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-06-29 19:38+0100\n"
+"Last-Translator: Rhys Jones <rhys@sucs.org>\n"
+"Language-Team: Welsh <gnome-cy@pengwyn.linux.org.uk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Priodwedd annisgwyl '%s' i'r elfen '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Priodwedd '%s' o elfen '%s' heb ei chanfod"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Tag annisgwyl '%s'; disgwyliwyd y tag '%s'"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Tag annisgwyl '%s' o fewn '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Ni ddarganfuwyd ffeil llyfrnodau ddilys yn y cyfeiriaduron data"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Llyfrnod ar gyfer yr URI '%s' yn bodoli eisoes"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Dim llyfrnod wedi ei ganfod ar gyfer yr URI '%s'"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Dim math MIME wedi'i ddiffinio yn y llyfrnod ar gyfer yr URI '%s'"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Dim baner breifat wedi'i diffinio yn y llyfrnod ar gyfer yr URI '%s'"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Dim grwpiau wedi'u gosod yn y llyfrnod ar gyfer yr URI '%s'"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Does dim un rhaglen o'r enw '%s' wedi cofrestru llyfrnod ar gyfer '%s'"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Methwyd darllen y cyswllt symbolaidd '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Ni chynhelir trawsnewidiad o set nodau '%s' i '%s'"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Methwyd agor trawsnewidydd rhwng '%s' a '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Dilyniant beit annilys ym mewnbwn trawsnewid"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Gwall wrth drawsnewid: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Dilyniant nod rhannol ar ddiwedd y mewnbwn"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Methu trawsnewid '%s' wrth gefn i'r set godau '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "Nid yw'r LAU '%s' yn LAU absoliwt yn y cynllun \"file\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Ni chaniateir i'r LAU ffeil lleol '%s' gynnwys '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "Mae'r LAU '%s' yn annilys"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Mae'r enw gwesteiwr yn y LAU '%s' yn annilys"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Mae'r LAU '%s' yn cynnwys nodau wedi eu dianc mewn modd annilys"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Nid yw'r llwybr '%s' yn llwybr gosodedig"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Enw gwesteiwr annilys"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Gwall y cyfeiriadur '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Methwyd canfod %lu beit er mwyn darllen y ffeil \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Gwall wrth ddarllen ffeil '%s': %s "
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Methwyd darllen o'r ffeil '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Methwyd agor y ffeil '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Methwyd darllen agweddau ffeil '%s': methiant fstat(): %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Methwyd agor y ffeil '%s': methiant yn fdopen(): %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Methwyd ail-enwi'r ffeil'%s' i '%s': methodd g_rename(): %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Methwyd creu'r ffeil '%s': %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Methu agor y ffeil '%s' er mwyn ysgrifennu iddi: methodd fdopen(): %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Methwyd ysgrifennu i'r ffeil '%s': methodd fwrite(): %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Methwyd cau'r ffeil '%s': methodd fclose(): %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Methu tynnu'r ffeil '%s' oedd eisoes yn bodoli: methodd g_unlink(): %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Mae'r patrymlun '%s' yn annilys: ni ddylai gynnwys '%s'"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Nid yw'r patrymlun '%s' yn cynnwys XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Methwyd darllen y cyswllt symbolaidd '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Ni chynhelir cysylltion symbolaidd"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Methwyd agor trawsnewidydd o '%s' i '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Methu gwneud darlleniad crau yn g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Data dros ben heb ei drawsnewid yn y byffer ddarllen"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Mae'r sianel yn gorffen a nod rhannol"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Methu gwneud darlleniad crai yn g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Methwyd agor y ffeil '%s': methodd open(): %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Methwyd mapio'r ffeil '%s': methodd mmap(): %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Gwall ar linell %d golofn %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Gwall ar linell %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Gwelwyd endid gwag '&;'; mae &amp; &quot; &lt; &gt; a &apos; yn endidau dilys"
+
+# c-format
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Mae'r nod '%s' yn annilys ar ddechrau endid; mae'r nod & yn dechrau endid; "
+"os nad yw'r & yma i fod yn endid, defnyddiwch &amp; yn ei le"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Nid yw'r nod '%s' yn ddilys o fewn enw endid"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Mae'r enw endid '%s' yn anhysbys"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Ni orffennwyd yr endid gyda hanner-colon - mwy na thebyg y defnyddiwyd "
+"ampersand heb fwriadu dechrau endid - dylid defnyddio &amp; yn lle"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Methwyd adnabod '%-.*s', a ddylai fod yn ddigid o fewn cyfeiriant nod "
+"(&#234; er enghraifft) - hwyrach fod y digid yn rhy fawr"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Nid yw'r cyfeiriant nod '%-.*s' yn amgodio nod a ganiateir"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Cyfeiriant nod gwag; dylai gynnwys digid megis &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Ni orffennwyd cyfeiriant nod gyda hanner-colon - mwy na thebyg y defnyddiwyd "
+"ampersand heb fwriadu dechrau endid - dylid defnyddio &amp; yn lle"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Cyfeiriant endid heb ei orffen"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Cyfeiriant nod heb ei orffen"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Testun annilys wedi ei amgodio fel UTF-8"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Rhaid i'r ddogfen ddechrau gydag elfen (e.e. <llyfr>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"Nid yw '%s' yn nod dilys yn dilyn '<'; nid yw'n gallu dechrau enw elfen"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr "Nod od '%s', disgwyliwyd '>' er mwyn gorffen tag dechrau'r elfen '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Nod od '%s', disgwyliwyd '=' ar ôl yr enw priodoledd '%s' o'r elfen '%s'"
+
+# c-format
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Nod od '%s', disgwyliwyd '>' neu '/' er mwyn gorffen tag dechrau'r elfen '%"
+"s', neu briodoledd ddewisol; efallai defnyddiwyd nod annilys mewn enw "
+"priodoledd"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Nod od '%s', disgwyliwyd dyfynnod agored ar ôl y '=' wrth roi gwerth i'r "
+"priodoledd '%s' o'r elfen '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"Nid yw '%s' yn nod ddilys yn dilyn y nodau '</'; nid yw '%s' yn gallu "
+"dechrau enw elfen."
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"Nid yw '%s' yn nod ddilys yn dilyn y nodau '</'; nid yw '%s' yn gallu "
+"dechrau enw elfen."
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Cafodd yr elfen '%s' ei gau, nid oes elfen ar agor ar hyn o bryd"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"Cafodd yr elfen '%s' ei gau, ond yr elfen sydd ar agor ar hyn o bryd yw '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Roedd y ddogfen yn wag neu'n cynnwys gofod yn unig"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Gorffennodd y ddogfen yn annisgwyl ar ôl '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Gorffennodd y ddogfen yn annisgwyl tra roedd elfennau ar agor - '%s' oedd yr "
+"elfen ddiwethaf a agorwyd"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Gorffennodd y ddogfen yn annisgwyl, disgwyliwyd ongl-fraced caeedig i "
+"ddiweddu'r tag <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Gorffennodd y ddogfen yn annisgwyl y tu fewn i enw elfen"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Gorffennodd y ddogfen yn annisgwyl y tu fewn i enw priodoledd"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Gorffennodd y ddogfen yn annisgwyl y tu fewn i dag agor elfen"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Gorffennodd y ddogfen yn annisgwyl ar ôl yr hafalnod yn dilyn enw "
+"priodoledd; dim gwerth priodoledd"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Gorffennodd y ddogfen yn annisgwyl y tu fewn i werth priodoledd"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Gorffennodd y ddogfen yn annisgwyl y tu fewn i dag cau'r elfen '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Gorffennodd y ddogfen yn annisgwyl y tu fewn i sylw neu gyfarwyddiad brosesu"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Gwall ar linell %d golofn %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Cyfeiriant endid heb ei orffen"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Nid yw'r testun dyfynedig yn dechrau gyda dyfynnod"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Dyfynnod heb ei gydweddu mewn llinell orchymyn neu destun arall wedi ei "
+"gragen-ddyfynnu"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Gorffennodd y testun ar ôl '\\'. ('%s' oedd y testun.)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Gorffennodd y testun cyn y darganfuwyd dyfynnod i gydweddu %c. ('%s' oedd y "
+"testun.)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Roedd y testun yn wag, neu'n cynnwys gofodnodau'n unig"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Methwyd darllen data o broses plentyn"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Methwyd creu pibell er mwyn cyfathrebu â phroses plentyn (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Methwyd darllen o bibell plentyn (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Methwyd newid i'r cyfeiriadur '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Methwyd gweithredu proses plentyn (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Enw rhaglen annilys: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Arg ar goll yn y fector argiau yn %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Llinyn annilys yn yr amgylchedd: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Cyfeiriadur gweithio annilys: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Methwyd gweithredu proses cymorth (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Gwall annisgwyl yn g_io_channel_win32_poll() wrth ddarllen data o broses "
+"plentyn"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Methwyd darllen data o broses plentyn (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Gwall annisgwyl yn select() wrth ddarllen o broses plentyn (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Gwall annisgwyl yn waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Methwyd fforcio (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Methwyd gweithredu proses plentyn \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Methwyd ailgyrchu mewnbwn neu allbwn proses blentyn (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Methwyd fforcio proses plentyn (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Gwall anhysbys wrth weithredu proses blentyn \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Methwyd darllen digon o ddata o bibell plentyn (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Nod y tu allan i ystod ddilys UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Dilyniant annilys ym mewnbwn trawsnewidiad"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Nod y tu allan i ystod ddilys UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Defnydd:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPSIWN...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Cymorth Opsiynau:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Dangos opsiynau cymorth"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Dangos bob opsiwn cymorth"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Opsiynau Rhaglen:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Methu gramadegu'r gwerth cyfanrif '%s' ar gyfer %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Mae'r gwerth cyfanrif '%s' ar gyfer %s y tu allan i'r cwmpas"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Methu gramadegu'r gwerth dwbl '%s' ar gyfer %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Mae'r gwerth dwbl '%s' ar gyfer %s y tu allan i'r cwmpas"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Gwall wrth ramadegu opsiwn %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Arg ar goll ar gyfer %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Opsiwn anhysbys %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Ni ddarganfuwyd ffeil allwedd ddilys yn y cyfeiriaduron data"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Ddim yn ffeil cyffredin"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Ffeil yn wag"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Ffeil allwedd yn cynnwys y llinell '%s' sydd ddim yn bâr allwedd-gwerth, "
+"na'n grŵp, na'n sylw"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Enw rhaglen annilys: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Nid yw'r ffeil allwedd yn dechrau gyda grŵp"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Enw rhaglen annilys: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Ffeil allwedd yn cynnwys yr amgodiad '%s', na gynhelir"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Nid oes gan y ffeil allwedd y grŵp '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Ffeil allwedd heb fod yn cynnwys yr allwedd '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Ffeil allwedd yn cynnwys yr allwedd '%s' gyda'r gwerth '%s' nad yw'n UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Ffeil allwedd yn cynnwys yr allwedd '%s' sydd â gwerth na ellir ei ddirnad."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Ffeil allwedd yn cynnwys yr allwedd '%s' yng ngrŵp '%s' sydd â gwerth na "
+"ellir ei ddirnad."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Ffeil allwedd heb fod ganddi'r allwedd '%s' yn y grŵp '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Ffeil allwedd yn cynnwys nod dianc ar ddiwedd llinell"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Ffeil allwedd yn cynnwys '%s', sy'n ddilyniant dianc annilys"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Ni ellir darllen y gwerth '%s' fel rhif."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Gwerth cyfanrif '%s' y tu allan i'r ystod"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Ni ellir darllen y gwerth '%s' fel rhif arnawf."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Ni ellir darllen '%s' fel gwerth Boole."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Methu newid modd ffeil: methodd fork(): %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Methu newid modd ffeil: methodd waitpid(): %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Methu newid modd ffeil: methodd chmod(): %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr "Methu newid modd ffeil: Plentyn wedi'i derfynu gan signal: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr "Methu newid modd ffeil: Plentyn wedi'i derfynu'n anarferol"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Ni chynhelir trawsnewid o'r set nodau `%s' i `%s'"
+
+#~ msgid "Incorrect message size"
+#~ msgstr "Maint neges anghywir"
+
+#~ msgid "Socket error"
+#~ msgstr "Gwall soced"
diff --git a/trunk/po/da.po b/trunk/po/da.po
new file mode 100644
index 000000000..044fdf7f1
--- /dev/null
+++ b/trunk/po/da.po
@@ -0,0 +1,968 @@
+# Danish translation of glib.
+# Copyright (C) 2001, 02, 03 Free Software Foundation, Inc.
+# This file is distributed under the same license as the glib package.
+# Keld Simonsen <keld@dkuug.dk>, 2001.
+# Kjartan Maraas <kmaraas@gnome.org>, 2001.
+# Ole Laursen <olau@hardworking.dk>, 2002 - 2003.
+# Martin Willemoes Hansen <mwh@sysrq.dk>, 2004 - 2005
+#
+# Konventioner:
+#
+# attribute -> egenskab
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-01-18 18:41+0100\n"
+"Last-Translator: Martin Willemoes Hansen <mwh@sysrq.dk>\n"
+"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Mærkeligt tegn \"%s\", forventede et '=' efter egenskabsnavn \"%s\" for "
+"elementet \"%s\""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Gyldig nøglefil blev ikke fundet i datakatalogerne"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Kunne ikke læse den symbolske henvisning \"%s\": %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Konvertering fra tegnsæt \"%s\" til \"%s\" er ikke understøttet"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Kunne ikke konvertere fra \"%s\" til \"%s\""
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Ugyldig bytesekvens i konverteringsinddata"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Fejl under konvertering: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Delvis tegnsekvens ved slutningen af inddata"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Kan ikke konvertere tilbagefaldet \"%s\" til tegnsæt \"%s\""
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI'en \"%s\" er ikke en absolut URI, ved brug af \"fil\"-metoden"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Den lokale fil-URI \"%s\" må ikke indeholde en '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI'en \"%s\" er ugyldig"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Værtsnavnet for URI'en \"%s\" er ugyldig"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI'en \"%s\" indeholder ugyldigt beskyttede tegn"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Stinavnet \"%s\" er ikke en absolut sti"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Ugyldigt værtsnavn"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Fejl ved åbning af mappen \"%s\": %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Kunne ikke allokere %lu byte til at læse filen \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Fejl ved læsning af filen \"%s\": %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Kunne ikke læse fra filen \"%s\": %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Kunne ikke åbne filen \"%s\": %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Kunne ikke læse egenskaber for filen \"%s\": fstat() mislykkedes: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Kunne ikke åbne filen \"%s\": fdopen() mislykkedes: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Kunne ikke omdøbe filen \"%s\" til \"%s\": g_rename() mislykkedes: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Fejl under oprettelse af filen \"%s\": %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Kunne ikke åbne filen \"%s\" til skrivning: fdopen() mislykkedes: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Kunne ikke skrive filen \"%s\": fwrite() mislykkedes: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Kunne ikke lukke filen \"%s\": fclose() mislykkedes: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+"Den eksisterende fil \"%s\" kunne ikke fjernes: g_unlink() mislykkedes: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Skabelonen \"%s\" er ugyldig, må ikke indeholde en \"%s\""
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Skabelonen \"%s\" slutter ikke med XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Kunne ikke læse den symbolske henvisning \"%s\": %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Symbolske henvisninger er ikke understøttet"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Kunne ikke åbne konverterer fra \"%s\" til \"%s\": %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Kan ikke foretage en rå læsning i g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Resterende ukonverterede data i læsemellemlager"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanal afslutter med et ufuldendt tegn"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Kan ikke foretage en rå læsning i g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Kunne ikke åbne filen \"%s\": open() mislykkedes: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Kunne ikke kortlægge filen \"%s\": mmap() mislykkedes: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Fejl på linje %d tegn %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Fejl på linje %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Tom entitet \"&;\" fundet; gyldige entiteter er: &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Tegnet \"%s\" er ikke gyldigt ved starten af et entitetnavn; &-tegnet "
+"starter en entitet; hvis dette og-tegn ikke er beregnet på at være en "
+"entitet, så undgå dette ved at bruge &amp; i stedet"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Tegnet \"%s\" er ikke gyldigt inde i et entitetsnavn"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Entitetsnavnet \"%s\" er ikke kendt"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entiteten sluttede ikke med et semikolon; du har sandsynligvis brugt et og-"
+"tegn uden at det var beregnet på at starte en entitet - dette undgås ved at "
+"bruge &amp; i stedet"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Fejl ved fortolkning af \"%-.*s\" som skulle have været et ciffer i en "
+"tegnreference (&#234; for eksempel) - måske er cifret for stort"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Tegnreferencen \"%-.*s\" koder ikke et tilladt tegn"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Tom tegnreference; skulle indeholde et tal såsom &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Tegnreferencen sluttede ikke med et semikolon; du har sandsynligvis brugt et "
+"og-tegn uden at det var beregnet på at starte en entitet - undgå dette ved "
+"at bruge &amp; i stedet"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Ufærdig entitetsreference"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Ufærdig tegnreference"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Ugyldig UTF-8-kodet tekst"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokumentet skal begynde med et element (f.eks <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"\"%s\" er ikke et gyldigt tegn efter et '<'-tegn; det kan ikke være "
+"begyndelsen på et elementnavn"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Mærkeligt tegn \"%s\", forventede et '>'-tegn for at afslutte "
+"begyndelsesmærket til elementet \"%s\""
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Mærkeligt tegn \"%s\", forventede et '=' efter egenskabsnavn \"%s\" for "
+"elementet \"%s\""
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Mærkeligt tegn \"%s\", forventede tegnet '>' eller '/' for at afslutte "
+"begyndelsesmærket til elementet \"%s\" eller alternativt en egenskab; måske "
+"brugte du et ugyldigt tegn i egenskabsnavnet"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Mærkeligt tegn \"%s\", forventede et åbningsanførselstegn efter "
+"lighedstegnet når værdien for egenskaben \"%s\" for elementet \"%s\" angives"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"\"%s\" er ikke et gyldigt tegn efter tegnene '</'; \"%s\" er måske ikke "
+"begyndelsen på et elementnavn"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"\"%s\" er ikke et gyldigt tegn efter det lukkende elementnavn \"%s\"; "
+"tilladt tegn er '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element \"%s\" blev lukket, ingen åbne elementer nu"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Element \"%s\" blev lukket, men aktivt åbent element er \"%s\""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokumentet var tomt eller indeholdt kun blanke tegn"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Dokumentet sluttede uventet lige efter en åben vinkelparantes '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokumentet sluttede uventet med åbne elementer - \"%s\" var sidste åbne "
+"element"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokumentet sluttede uventet, forventede at se en vinkelparantes for at "
+"afslutte det sidste mærke <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokumentet sluttede uventet inden i et elementnavn"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokumentet sluttede uventet inden i et egenskabsnavn"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokumentet sluttede uventet inden i et element-åbnende mærke"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokumentet sluttede uventet efter lighedstegnet efter et egenskabsnavn; "
+"ingen egenskabsværdi"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokumentet sluttede uventet inden i en egenskabsværdi"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Dokumentet sluttede uventet inden i lukningsmærket for elementet \"%s\""
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Dokumentet sluttede uventet inden i en kommentar eller behandlingsinstruktion"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Fejl på linje %d tegn %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Ufærdig entitetsreference"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Anført tekst begynder ikke med anførselstegn"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Uafbalanceret anførselstegn i kommandolinje eller anden skal-anført tekst"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Tekst sluttede lige efter et '\\' tegn (teksten var \"%s\")"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Tekst sluttede før tilsvarende anførselstegn blev fundet for %c (teksten var "
+"\"%s\")"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Tekst var tom (eller indeholdt kun blanke tegn)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Fejl under læsning af data fra underprocess"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Fejl under oprettelse af kommunikationskanal til underproces (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Fejl under læsning fra barnedatakanal (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Fejl ved skift til mappen \"%s\" (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Fejl under kørsel af underprocess (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Ugyldigt programnavn: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Ugyldig streng i argumentvektor på %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Ugyldig streng i miljø: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Ugyldigt arbejdskatalog: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Fejl under kørsel af hjælpeprogram (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Uventet fejl i g_io_channel_win32_poll() under læsning af data fra en "
+"underprocess"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Fejl ved læsning af data fra underprocess (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Uventet fejl i select() ved læsning af data fra underprocess (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Uventet fejl i waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Fejl under fraspaltning af proces (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Fejl under kørsel af underprocessen \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Fejl under omdirigering af uddata eller inddata for underprocess (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Fejl ved fraspaltning af underprocess (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Ukendt fejl under kørsel af underprocessen \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"Kunne ikke læse tilstrækkelig mængde data fra underprocessens pid-kanal (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Tegn uden for gyldigt interval for UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Ugyldig sekvens i konverteringsinddata"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Tegn uden for gyldigt interval for UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Brug:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[FLAG...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Flag for hjælp:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Vis flag for hjælp"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Vis alle flag for hjælp"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Flag for programmet:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Kan ikke fortolke heltalsværdien \"%s\" for %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Heltalsværdien \"%s\" for %s er ikke i gyldigt interval"
+
+#: glib/goption.c:831
+#, fuzzy, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Kan ikke fortolke heltalsværdien \"%s\" for %s"
+
+#: glib/goption.c:839
+#, fuzzy, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Heltalsværdien \"%s\" for %s er ikke i gyldigt interval"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Kunne ikke fortolke tilvalg %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Mangler argument for %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Ukendt flag %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Gyldig nøglefil blev ikke fundet i datakatalogerne"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Ikke en almindelig fil"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Filen er tom"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Nøglefilen indeholder linjen \"%s\" hvilken ikke er et nøgle-værdi-par, en "
+"gruppe eller en kommentar"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Ugyldigt programnavn: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Nøglefilen starter ikke med en gruppe"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Ugyldigt programnavn: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Nøglefilen indeholder kodningen \"%s\" der ikke er understøttet"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Nøglefilen indeholder ikke gruppen \"%s\""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Nøglefilen indeholder ikke nøglen \"%s\""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Nøglefilen indeholder nøglen \"%s\" med værdien \"%s\" der ikke er UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Nøglefilen indeholder nøglen \"%s\" som har en værdi der ikke kan fortolkes."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Nøglefilen indeholder nøglen \"%s\" i gruppen \"%s\" som har en værdi der "
+"ikke kan fortolkes."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Nøglefilen har ikke nøglen \"%s\" i gruppen \"%s\""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Nøglefilen indeholder beskyttede tegn for enden af linjen"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Nøglefilen indeholder en ugyldig undvigesekvens \"%s\""
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Værdien \"%s\" kan ikke fortolkes som et nummer."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Heltalsværdien \"%s\" er ikke i gyldigt interval"
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Værdien \"%s\" kan ikke fortolkes som et nummer."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Værdien \"%s\" kan ikke fortolkes som en sandhedsværdi."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Kunne ikke ændre fil-tilstand: fork() mislykkedes: %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Kunne ikke ændre fil-tilstand: waitpid() mislykkedes: %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Kunne ikke ændre fil-tilstand: chmod() mislykkedes: %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr "Kunne ikke ændre fil-tilstand: Barn afsluttede med signal: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr "Kunne ikke ændre fil-tilstand: Barn afsluttede ikke normalt"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Konvertering fra tegnsæt \"%s\" til \"%s\" er ikke understøttet"
+
+#~ msgid "Incorrect message size"
+#~ msgstr "Forkert beskedsstørrelse"
+
+#~ msgid "Socket error"
+#~ msgstr "Sokkelfejl"
+
+#~ msgid "Channel set flags unsupported"
+#~ msgstr "Kanalsætningsflag ikke understøttet"
diff --git a/trunk/po/de.po b/trunk/po/de.po
new file mode 100644
index 000000000..b13104a6c
--- /dev/null
+++ b/trunk/po/de.po
@@ -0,0 +1,966 @@
+# German glib translation.
+# Copyright (C) 2001-2004 Free Software Foundation, Inc.
+# Christian Meyer <chrisime@gnome.org>, 2001, 2002.
+# Christian Neumair <chris@gnome-de.org>, 2002-2004.
+# Hendrik Richter <hendrikr@gnome.org>, 2004, 2005, 2006 2007.
+# Hendrik Brandt <heb@gnome-de.org>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-01-04 15:33+0100\n"
+"Last-Translator: Hendrik Richter <hendrikr@gnome.org>\n"
+"Language-Team: German <gnome-de@gnome.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Unerwartetes Attribut »%s« des Elements »%s«"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Attribut »%s« des Elements »%s« konnte nicht gefunden werden"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Unerwarteter Tag »%s«; Tag »%s« wird erwartet"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Unerwarteter Tag »%s« innerhalb von »%s«"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+"Es wurde keine gültige Lesezeichendatei in den Datenverzeichnissen gefunden"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Es existiert bereits ein Lesezeichen für den URI »%s«"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Es konnte kein Lesezeichen für den URI »%s« gefunden werden."
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Es ist kein MIME-Type im Lesezeichen für den URI »%s« definiert."
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+"Es konnte keine »privat«-Markierung für das Lesezeichen für die URI »%"
+"s«gefunden werden."
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+"Es wurden keine Gruppen für das Lesezeichen für die URI »%s« festgelegt."
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+"Es wurde keine Anwendung namens »%s« gefunden, die ein Lesezeichen für »%"
+"s«registriert hat."
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Die Befehlzeile »%s« konnte nicht mit der URI »%s« verknüpft werden."
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Umwandlung von Zeichensatz »%s« in »%s« wird nicht unterstützt"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Konverter von »%s« in »%s« konnte nicht geöffnet werden"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Ungültige Bytefolge in Konvertierungseingabe"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Fehler bei der Umwandlung: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Bruchstückhafte Zeichenfolge am Eingabeende"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Notnagel »%s« kann nicht in Kodierung »%s« umgewandelt werden"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "Der URI »%s« ist kein absoluter URI, der das »file«-Schema verwendet"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Der lokale URI »%s« darf kein »#« enthalten"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "Der URI »%s« ist ungültig"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Der Rechnername der URI »%s« ist ungültig"
+
+# CHECK
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Der URI »%s« enthält ungültige Escape-Zeichen"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Der Pfadname »%s« ist kein absoluter Pfad"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Ungültiger Rechnername"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Fehler beim Öffnen des Verzeichnisses »%s«: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "%lu byte konnten nicht alloziiert werden, um Datei »%s« zu lesen"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Fehler beim Lesen der Datei »%s«: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Es konnte nicht aus der Datei »%s« gelesen werden: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Datei »%s« konnte nicht geöffnet werden: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"Attribute der Datei »%s« konnten nicht ermittelt werden: fstat() "
+"fehlgeschlagen: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Datei »%s« konnte nicht geöffnet werden: fdopen() fehlgeschlagen: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Datei »%s« konnte nicht in »%s« umbenannt werden: g_rename() ist "
+"fehlgeschlagen: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Datei »%s« konnte nicht angelegt werden: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"Datei »%s« konnte nicht im Schreibmodus geöffnet werden: fdopen() ist "
+"fehlgeschlagen: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr ""
+"Datei »%s« konnte nicht geschrieben werden: fwrite() ist fehlgeschlagen: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr ""
+"Datei »%s« konnte nicht geschlossen werden: fclose() ist fehlgeschlagen: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+"Die vorhandene Datei »%s« konnte nicht entfernt werden: g_unlink() ist "
+"fehlgeschlagen: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Vorlage »%s« ungültig, sollte kein »%s« enthalten"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Vorlage »%s« enthält nicht XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Die symbolische Verknüpfung »%s« konnte nicht gelesen werden: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Symbolische Verknüpfungen nicht unterstützt"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Konverter von »%s« in »%s« konnte nicht geöffnet werden: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Raw-read in g_io_channel_read_line_string nicht möglich"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Nicht konvertierte Daten befinden sich noch im Lesepuffer "
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanal endet mit einem Teilzeichen"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Raw-read in g_io_channel_read_to_end nicht möglich"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Datei »%s« konnte nicht geöffnet werden: open() ist fehlgeschlagen: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Datei »%s« konnte nicht gemappt werden: mmap() ist fehlgeschlagen: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Fehler in Zeile %d, Zeichen %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Fehler in Zeile %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Leere Entität »&;« gefunden; gültige Entitäten sind &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Zeichen »%s« ist am Anfang eines Entitätsnamens ungültig; eine Entität "
+"beginnt mit dem Zeichen &; wenn das Et keine Entität sein soll, es als &amp; "
+"umschreiben"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Zeichen »%s« ist in einem Entitätsnamen ungültig"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Entitätsname »%s« ist unbekannt"
+
+# CHECK
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entität endete nicht mit einem Semikolon; wahrscheinlich haben Sie ein Et "
+"benutzt, ohne eine Entity beginnen zu wollen - umschreiben Sie das Et als "
+"&amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"»%-.*s«, was eine Zahl in einer Zeichenreferenz (wie &#234;) sein sollte, "
+"konnte nicht analysiert werden - vielleicht ist die Zahl zu groß"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Zeichenreferenz »%-.*s« kodiert kein zulässiges Zeichen"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Leere Zeichenangabe; sollte eine Zahl wie z.B. &#454; enthalten"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Zeichenangabe endete nicht mit einem Semikolon; wahrscheinlich haben Sie ein "
+"Et-Zeichen benutzt, ohne eine Entität beginnen zu wollen - umschreiben Sie "
+"das Et als &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Unvollendete Entitätsreferenz"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Unvollendete Zeichenreferenz"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Ungültiger UTF-8-kodierter Text"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokument muss mit einem Element beginnen (e.g. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"»%s« ist kein gültiges Zeichen nach einem »<«-Zeichen; es darf keinen "
+"Elementnamen beginnen"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Seltsames Zeichen »%s«, »>« erwartet um Start-Tag des Elements »%s« "
+"abzuschließen"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Seltsames Zeichen »%s«, »=« erwartet nach Attributname »%s« des Elements »%s«"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Seltsames Zeichen »%s«, es wurde entweder ein Attribut oder aber »>« oder "
+"»/« erwartet, um das Start-Tag des Elements »%s« abzuschließen; vielleicht "
+"haben Sie ein ungültiges Zeichen in einem Attributnamen benutzt"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Seltsames Zeichen »%s«; bei der Wertangabe für das Attribut »%s« des "
+"Elemente »%s« wurde ein Anführungszeichen nach dem Gleichheitszeichen "
+"erwartet"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"»%s« ist kein gültiges Zeichen, wenn es auf die Zeichen »</« folgt; »%s« "
+"darf keinen Elementnamen beginnen"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"»%s« ist kein gültiges Zeichen, wenn es auf den schließenden Elementnamen »%"
+"s« folgt; das erlaubte Zeichen ist »>«"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element »%s« wurde geschlossen, kein Element ist derzeit offen"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"Element »%s« wurde geschlossen, aber das derzeit offene Element ist »%s«"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokument ist leer oder enthält nur Leerraum"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Dokument endete unerwartet nach einer offenen spitzen Klammer »<«"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokument endete unerwartet mit noch offenen Elementen - »%s« war das letzte "
+"offene Element"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokument endete unerwartet, es wurde eine spitze Klammer »>«, die das Tag <%"
+"s/> schließt, erwartet"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokument endete unerwartet innerhalb eines Elementnamens"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokument endete unerwartet innerhalb eines Attributnamens"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokument endete unerwartet innerhalb eines Element-öffnenden Tags."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokument endete unerwartet nach dem Gleichheitszeichen, das einem "
+"Attributnamen folgt; kein Attributwert"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokument endete unerwartet innerhalb eines Attributwertes"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Dokument endete unerwartet innerhalb eines schließenden Tags für das Element "
+"»%s«"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Dokument endete unerwartet innerhalb eines Kommentars oder "
+"Verarbeitungsanweisung"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Fehler in Zeile %d, Zeichen %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Unvollendete Entitätsreferenz"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Zitierter Text beginnt nicht mit einem Anführungszeichen"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Unbalanciertes Anführungszeichen in Befehlszeile oder anderem Text in "
+"Shellquotes"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Text endete nach einem »\\«-Zeichen. (Der Text war »%s«)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Text endete, bevor ein passendes Anführungszeichen für %c gefunden wurde. "
+"(Der Text war »%s«)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Text war leer (oder enthielt nur Leerraum)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Daten konnten nicht vom Kindprozess gelesen werden"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+"Weiterleitung für Kommunikation mit Kindprozess (%s) konnte nicht erzeugt "
+"werden"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Lesen aus Weiterleitung zum Kind (%s) fehlgeschlagen"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "In Verzeichnis »%s« (%s) konnte nicht gewechselt werden"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Kindprozess konnte nicht ausgeführt werden (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Ungültiger Programmname: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Ungültige Zeichenkette im Argumentsvektor bei %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Ungültige Zeichenkette in der Umgebung: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Ungültiges Arbeitsverzeichnis: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Hilfsprogramm (%s) konnte nicht ausgeführt werden"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Unerwarteter Fehler in g_io_channel_win32_poll() beim Lesen aus dem "
+"Kindprozess"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Daten vom Kindprozess konnten nicht gelesen werden (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Unerwarteter Fehler in select() beim Lesen von Daten eines Kindprozesses (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Unerwarteter Fehler in waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Abspalten fehlgeschlagen (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Kindprozess »%s« konnte nicht ausgeführt werden (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+"Umleiten der Ausgabe oder Eingabe des Kindprozesses (%s) fehlgeschlagen"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Abspalten des Kindprozesses fehlgeschlagen (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Unbekannter Fehler beim Ausführen des Kindprozesses »%s«"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"Es konnten nicht genug Daten von Kind-Programmkennungsweiterleitung (%s) "
+"gelesen werden"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Zeichen außerhalb des Bereiches für UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Ungültige Folge in Umwandlungseingabe"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Zeichen außerhalb des Bereiches für UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Aufruf:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Hilfeoptionen"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Hilfeoptionen anzeigen"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Alle Hilfeoptionen anzeigen"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Anwendungsoptionen"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "»%s« konnte nicht als ganzzahliger Wert für %s interpretiert werden."
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Ganzzahliger Wert »%s« für %s ist außerhalb des Bereiches."
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "»%s« konnte nicht als »double«-Wert für %s interpretiert werden."
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "»double«-Wert »%s« für %s ist außerhalb des Bereiches."
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Fehler beim Analysieren der Option: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Für %s wird ein Argument benötigt"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Unbekannte Option %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+"Es wurde keine gültige Schlüsselwertedatei in den Datenverzeichnissen "
+"gefunden"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Keine reguläre Datei"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Datei ist leer"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Die Schlüsselwertedatei enthält die Zeile »%s«, welche kein zulässiges "
+"Schlüssel-Wert-Paar, keine Gruppe und kein Kommentar ist."
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Ungültiger Gruppenname: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Die Schlüsselwertedatei beginnt nicht mit einer Gruppe"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Ungültiger Schlüsselname: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Die Schlüsselwertedatei enthält die nicht unterstützte Kodierung »%s«"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Die Schlüsselwertedatei enthält nicht die Gruppe »%s«"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Die Schlüsselwertedatei enthält nicht den Schlüssel »%s«"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Die Schlüsselwertedatei enthält den Schlüssel »%s« mit dem Wert »%s«, der "
+"nicht in UTF-8 kodiert ist"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Die Schlüsselwertedatei enthält den Schlüssel »%s« mit einem Wert der nicht "
+"interpretiert werden konnte."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Die Schlüsselwertedatei enthält den Schlüssel »%s« in der Gruppe »%s« mit "
+"einem Wert der nicht interpretiert werden konnte."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Die Schlüsselwertedatei hat keinen Schlüssel »%s« in der Gruppe »%s«"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Die Schlüsselwertedatei enthält ein Escape-Zeichen am Zeilenende"
+
+# CHECK
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Die Schlüsselwertedatei enthält das ungültige Escape-Zeichen »%s«"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Der Wert »%s« konnte nicht als Zahl interpretiert werden."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Ganzzahliger Wert »%s« ist außerhalb des Wertebereiches."
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Der Wert »%s« konnte nicht als Gleitkommazahl interpretiert werden."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
+"Der Wert »%s« konnte nicht als boolescher Ausdruck interpretiert werden."
diff --git a/trunk/po/dz.po b/trunk/po/dz.po
new file mode 100644
index 000000000..089b260f4
--- /dev/null
+++ b/trunk/po/dz.po
@@ -0,0 +1,944 @@
+# Dzongkha translation of glib
+# Copyright @ 2006, Free software foundation, Inc.
+# Mindu Dorji.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.HEAD.dz\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-09 10:23+0530\n"
+"Last-Translator: Mindu Dorji\n"
+"Language-Team: DZONGKHA <pgeyleg@dit.gov.bt>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Dzongkha\n"
+"X-Poedit-Country: BHUTAN\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2;plural=(n!=1);\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "རེ་བ་མེད་པའི་ཁྱད་ཆོས་ '%s'ཆ་ཤས་'%s'གི་དོན་ལུ།"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "ཁྱད་ཆོས་'%s'འཚོལ་མ་ཐོབ་ ཆ་ཤས་'%sགི"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "རེ་བ་མེད་པའི་ངོ་རྟགས་ '%s'། རེ་བ་བསྐྱེད་མི་ངོ་རྟགས་'%s'།"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "རེ་བ་མེད་པའི་ངོ་རྟགས་ '%s' ངོ་རྟགས། '%s'ནང་ན།"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "གནད་སྡུད་སྣོད་ཐོ་ཚུ་ནང་ ནུས་ཅན་དེབ་རྟགས་ཡིག་སྣོད་ འཚོལ་མ་ཐོབ།"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "ཡུ་ཨར་ཨའི་'%s'གི་དོན་ལུ་ དེབ་རྟགས་ཅིག་ཧེ་མ་ལས་རང་འདུག"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "ཡུ་ཨར་ཨའི་'%s'གི་དོན་ལུ་དེབ་རྟགས་མ་ཐོབ།"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "ཡུ་ཨར་ཨའི་'%s'གི་དོན་ལུ་དེབ་རྟགས་ནང་ མ་ཡིམ་གྱི་དབྱེ་བ་ངེས་འཛིན་མ་འབད་བས། "
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "ཡུ་ཨར་ཨའི་'%s'གི་དོན་ལུ་དེབ་རྟགས་ནང་ སྒེར་གྱི་ཟུར་རྟགས་ངེས་འཛིན་མ་འབད་བས།"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "ཡུ་ཨར་ཨའི་'%sགི་དོན་ལུ་ དེབ་རྟགས་ནང་ སྡེ་ཚན་གཞི་སྒྲིག་མ་འབད་བས།"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "མིང་'%sའབད་མི་གློག་རིམ་གྱིས་ '%s དོན་ལུ་ དེབ་རྟགས་ཅིག་ཐོ་འགོད་མ་འབད་བས། "
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ ’%s’:%s ལྷག་མ་ཚུགས།"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "ཡིག་འབྲུའི་ཆ་ཚན་ ‘%s’ ལས་ ‘%s’ ལུ་གཞི་བསྒྱུར་འབད་ནི་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "‘%s’ ལས་ '%s' ལུ་ སྒྱུར་བྱེད་ཁ་ཕྱེ་མ་ཚུགས།"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "གཞི་བསྒྱུར་གྱི་ཨིན་པུཊི་ནང་ བའིཊི་གི་འབྱུང་རིམ་ ནུས་མེད་ཨིན་པས།"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "ཨིན་པུཊི་མཇུག་ལུ་ ཡི་གུའི་འབྱུང་རིམ་ཆ་ཤས།"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "གློ་བུར་རྒྱབ་ཐག ’%s’ ལས་ ཀོཌི་སེཊི་ ’%s’ ལུ་ གཞི་བསྒྱུར་འབད་མི་ཚུགས། "
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+"ཡུ་ཨར་ཨའི་ ’%s’ འབད་མི་དེ་ \"file\" འཆར་ལས་ལག་ལེན་འཐབ་པའི་ ཡུ་ཨར་ཨའི་ཡང་དག་ཅིག་མེན།"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "ཉེ་གནས་་ཀྱི་ཡིག་སྣོད་ ཡུ་ཨར་ཨའི་ ’%s’ འབད་མི་དེ་ནང་ '#' ཅིག་མེདཔ་འོང༌།"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "ཡུ་ཨར་ཨའི་ ’%s’ ནུས་མེད་ཨིན་པས།"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "ཡུ་ཨར་ཨའི་ ’%s’ གི་ ཧོསཊི་ནེམ་དེ་ ནུས་མེད་ཨིན་པས།"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "ཡུ་ཨར་ཨའི་ ’%s’ གི་ནང་ན་ ནུས་མེད་ཐོག་ལས་ཐར་མི་ ཡིག་འབྲུ་་ཚུ་འདུག"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "འགྲུལ་ལམ་གྱི་མིང་ ’%s’ འབད་མི་དེ་ འགྲུལ་ལམ་ཡང་དག་ཅིག་མེན།"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "ནུས་མེད་ཀྱི་ ཧོསཊི་ནེམ།"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "སྣོད་ཐོ་ '%s':%s ཁ་ཕྱེ་ནི་ལུ་འཛོལ་བ།"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "བཱཡིཊི་ %lu བསྐལ་སྤྲོད་འབད་མ་ཚུགས་ \"%s\" ལྷག་ནི་ལུ།"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "ཡིག་སྣོད་ ’%s’: %s ནང་ལས་ ལྷག་མ་ཚུགས།"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "ཡིག་སྣོད་ ’%s’: %s ཁ་ཕྱེ་མ་ཚུགས།"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "ཡིག་སྣོད་ '%s': fstat() གི་ཁྱད་ཆོས་ཚུ་ ལེན་མ་ཚུགས་ :%sམ་བཏུབ།"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "ཡིག་སྣོད་ ’%s’:fdopen() ཁ་ཕྱེ་མ་ཚུགས། %s་མ་བཏུབ།"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "ཡིག་སྣོད་ ’%s’ལས་'%s' ལུ་ བསྐྱར་མིང་བཏགས་མ་ཚུགས། g_rename() གིས་ %s ལུ་མ་བཏུབ།"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "ཡིག་སྣོད་ ’%s’:%s གསར་བསྐྲུན་འབད་མ་ཚུགས།"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "ཡིག་སྣོད་’%s’ འབྲི་ནིའི་དོན་ལུ་ ཁ་ཕྱེ་མ་ཚུགས་: fdopen() མ་བཏུབ་:%s།"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "ཡིག་སྣོད་ ’%s’འབྲི་མ་ཚུགས་: fwrite() མ་བཏུབ་:%s།"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "ཡིག་སྣོད་ ’%s’ཁ་བསྡམས་མ་ཚུགས་: fclose() མ་བཏུབ་:%s།"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "ཡོད་བཞིན་པའི་ཡིག་སྣོད་'%s' དེ་ རྩ་བསྐྲད་གཏང་མ་ཚུགས་: g_unlink() མ་བཏུབ་:%s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "ཊེམ་པེ་ལེཊི་ '%s' དེ་ནུས་མེད་ཨིན། དེ་ནང་ '%s' འབད་མི་ བཞག་ནི་མི་འོང༌།"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "ཊེམ་པེལེཊི་ ’%s’ འབད་མི་དེ་ནང་ XXXXXX མིན་འདུག།"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ ’%s’:%s ལྷག་མ་ཚུགས།"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "‘%s’ ལས་ ‘%s’:%s ལུ་སྒྱུར་བྱེད་ཁ་ཕྱེ་མ་ཚུགས།"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "ཇི་ཨའི་ ཨོ་ རྒྱུ་ལམ་ ལྷག་ གྱལ་རིམ་ ཡིག་རྒྱུན་ཚུ་ནང་ རགས་ལྷག་མི་བཏུབ།"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "ལྷག་ནིའི་གནད་ཁོངས་ནང་ གཞི་བསྒྱུར་མ་འབད་བའི་གནད་སྡུད་ ལྷག་ལུས་འདུག"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "ཡིག་འབྲུ་ནང་ཆ་ཤས་ནང་ལུ་ རྒྱུ་ལམ་རྩ་འགྲོལ་འགྱོཝ་ཨིན།"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "ཇི་ཨའི ཨོ་ རྒྱ་ལམ་ མཇུག་ ཚུན་ ལྷག་ནི་ཚུ་ནང་ རགས་ལྷག་མི་བཏུབ།"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "ཡིག་སྣོད་ ’%s’ ཁ་ཕྱེ་མ་ཚུགས་: open()མ་བཏུབ་:%s།"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "ཡིག་སྣོད་’%s’ གི་ས་ཁྲ་འབྲི་མ་ཚུགས་: mmap() མ་བཏུབ་:%s།"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "གྱལ་རིམ་%d ཡིག་འབྲུ་ %d:%s ལུ་འཛོལ་བ།"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "གྱལ་རིམ་ %d་: %s ལུ་འཛོལ་བ།"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"ངོ་བོ་སྟོང་པ་ ’&;’ མཐོང་ཅི། ནུས་ཅན་ངོ་བོ་ཚུ་: &amp; &quot; &lt; &gt; &apos; ཚུ་ཨིན།"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"ངོ་བོའི་མིང་ འགོ་བཙུགས་སར ཡིག་འབྲུ་་ ’%s’ ནུས་མེད་ཨིན་པས། ཡིག་འབྲུ་ & འདི་གིས་ངོ་བོ་ཅིག་ འགོ་"
+"བཙུགསཔ་ཨིན། གལ་སྲིད་ དང་རྟགས་འདི་ ངོ་བོ་མིནམ་ཅིག་དགོ་པཅིན་ &amp; བཟུམ་ཅིག་སྦེ་ གྲོས་ཐར་འབད།"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "ཡིག་འབྲུ་ ’%s དེ་ ངོ་བོའི་མིང་ཅིག་གི་ ནང་འཁོད་ལུ་ ནུས་མེད་ཨིན། "
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "ངོ་བོའི་མིང་ '%s' ཧ་མ་གོ"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"ངོ་བོ་འདི་ སེ་མི་ཀོ་ལཱོན་ ; གིས་འབད་ མཇུག་མ་བསྡུ་བས། ཁྱོད་ཀྱིས་ངོ་བོ་ཅིག་ འགོ་མ་བཙུགས་པར་ དང་རྟགས་"
+"ཡིག་འབྲུ་ཅིག་ ལག་ལེན་འཐབ་འཐབ་བཟུམ་ཅིག་འདུག དང་རྟགས་་ &amp; བཟུམ་ཅིག་སྦེ་ གྲོས་ཐར་འབད།"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"'%-.*s'ལུ་ མིང་དཔྱད་འབད་མ་ཚུགས། འདི་ཡིག་འབྲུ་གཞི་བསྟུན་ (དཔེར་ན་ (&#234; ) ཅིག་ནང་གི་ ཨང་"
+"ཡིག་ཅིག་འོང་དགོཔ་ཨིན་ - ཨང་ཡིག་དེ་ སྦོམ་དྲགསཔ་འོང་ནི་མས།"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "ཡིག་འབྲུ་གཞི་བསྟུན་ '%-.*s' དེ་གིས་ གནང་བ་ཅན་གྱི་ཡིག་འབྲུ་ཅིག་ལུ་ ཨིན་ཀོཌི་མི་འབད་བས།"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "ཡིག་འབྲུ་སྟོང་པའི་འབྲེལ་བ་འདི་ནང་ &#454; བཟུམ་མའི་ ཨང་ཡིག་ཅིག་འོང་དགོ"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"ཡིག་འབྲུ་གཞི་བསྟུན་དེ་ སེ་མི་ཀོ་ལཱོན་ ; གྱིས་ མཇུག་མ་བསྡུ་བས། ཁྱོད་ཀྱིས་ ངོ་བོ་ཅིག་ འགོ་བཙུགས་ནིའི་རེ་འདུན་"
+"མེད་པར་ དང་རྟགས་ ཡིག་འབྲུ་ ལག་ལེན་འཐབ་འཐབ་འོང་ནི་མས། དང་རྟགས་དེ་ &amp; བཟུམ་སྦེ་ གྲོས་ཐར་"
+"འབད།"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "མཇུག་མ་བསྡུ་བའི་ ངོ་བོའི་གཞི་བསྟུན།"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "མཇུག་མ་བསྡུ་བའི་ ཡིག་འབྲུའི་གཞི་བསྟུན།"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "ནུས་མེད་ཡུ་ཊི་ཨེཕ་-༨ ཀྱི ཨིན་ཀོ་དེཌི་ཚིག་ཡིག"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "ཡིག་ཆ་དེ་ (དཔེར་ན་ <book>) བཟུམ་མའི་ཆ་ཤས་ཅིག་གིས་ འགོ་བཙུགས་དགོ"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"ཡིག་འབྲུ་ ’%s’ དེ་ ཡིག་འབྲུ་’<’ ཅིག་གི་རྗེས་སུ་འོངམ་ད་ ནུས་པ་ཡོད་པའི་ཡིག་འབྲུ་ཅིག་མིན། འདི་གིས་ཆ་ཤས་"
+"ཀྱི་མིང་ཅིག་ འགོ་མི་བཙུགསཔ་འོང༌།"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"’%s’ དེ་རྐྱང་ཡིག་ཨིན་པས། ཆ་ཤས་ཀྱི་ འགོ་བཙུགས་ངོ་རྟགས་ %s’ དེ་མཇུག་བསྡུ་ནི་ལུ་ ཡིག་འབྲུ་ ’>’ ཅིག་ "
+"ཨིན་པའི་རེ་བ་ཡོད།"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"’%s’ དེ་རྐྱང་ཡིག་ཨིན་པས། ’=’ ཅིག་ཡོད་པའི་ རེ་བ་ཡོད་ ཁྱད་ཆོས་ཀྱི་མིང་ ’%s’ ཆ་ཤས་ ’%s’ གི་རྗེས་"
+"སུ།"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"’%s’ དེ་རྐྱང་ཡིག་ཨིན་པས། ཆ་ཤས་ ’%s’ གི་འགོ་བཙུགས་ངོ་རྟགས་ མཇུག་བསྡུ་ནི་ལུ་ ཡིག་འབྲུ་ ’>’ ཡང་ན་ "
+"’/’ གི་རེ་བ་ཡོད།"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"’%s’ དེ་རྐྱང་ཡིག་ཨིན་པས། ཁྱད་ཆོས་’%s’ གི་ ཆ་ཤས’%s’ གི་དོན་ལུ་ བེ་ལུ་བྱིནམ་ད་ མཉམ་རྟགས་ཀྱི་ཤུལ་"
+"ལུ་ འགོ་བཙུགས་འདྲེན་རྟགས་ཅིག་ ཚུད་ཡོད་པའི་རེ་བ་ཡོད།"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"’%s’ དེ་ ཡིག་འབྲུ་ནུས་ཅན་ཅིག་མེན་ ཡིག་འབྲུ་ ’</’; ’%s’ ཚུ་གི་རྗེས་ཤུལ་ལུ་འོངམ་ ཆ་ཤས་ཀྱི་མིང་ཅིག་ "
+"འགོ་མི་བཙུགསཔ་འོང༌།"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"’%s’ དེ་ ཡིག་འབྲུ་ནུས་ཅན་ཅིག་མེན། ཁ་བསྡམ་ནིའི་ཆ་ཤས་མིང་ ’%s’; གི་རྟིང་བདའ་འོངམ་ད་ ཆོག་པའི་ཡིག་"
+"འབྲུ་དེ་ ’>’ ཨིན།"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "ཆ་ཤས་ ’%s’ དེ་ ཁ་བསྡམས་ཏེ་ཡོདཔ་ལས་ ད་ལྟོ་ཆ་ཤས་གཅིག་ཡང་ ཁ་ཕྱེ་ཕྱེཝ་མིན་འདུག"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "ཆ་ཤས་ ’%s’ དེ་ ཁ་བསྡམས་ནུག དེ་འབདཝ་ད་ ད་ལྟོ་ཁ་ཕྱེ་སྟེ་ཡོད་མི་ཆ་ཤས་དེ་ ’%s’ ཨིན།"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "ཡིག་ཆ་དེ་སྟོང་པའམ་ ཡང་ཅིན་ ནང་ན་ས་སྟོང་དཀརཔོ་མ་གཏོགས་ མེདཔ་འོང་ནི་མས།"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "ཡིག་ཆ་དེ་ ཟུར་ཁུག་གུག་ཤད་ ’<’ ཅིག་གི་ཤུལ་ལས་ རེ་བ་མེད་པར་ རྫོགས་སོ་ཡི།"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"ཡིག་ཆ་དེ་ རེ་བ་མེད་པར་རྫོགས་སོ་རུང་ ཆ་ཤས་དེ་ ཁ་ཕྱེ་སྟེ་རང་འདུག མཐའ་མཇུག་ཁ་ཕྱེ་མི་ ཆ་ཤས་དེ་ -’%"
+"s’ ཨིན་པས།"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"ཡིག་ཆ་དེ་ རེ་བ་མེད་པར་རྫོགས་སོ་ནུག ངོ་རྟགས་ <%s/> མཇུག་བསྡུ་བའི་ ཁ་བསྡམ་ཟུར་ཁུག་གུག་ཤད་ཅིག་ "
+"མཐོང་བའི་རེ་བ་ཡོད།"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "ཡིག་ཆ་དེ་ ཆ་ཤས་ཅིག་གི་ མིང་གི་ནང་ན་ རེ་བ་མེད་པར་རྫོགས་སོ་ནུག"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "ཡིག་ཆ་དེ་ ཁྱད་ཆོས་ཀྱི་མིང་ཅིག་གི་ནང་ན་ རེ་བ་མེད་པར་རྫོགས་སོ་ནུག"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "ཡིག་ཆ་དེ་ ཆ་ཤས་ཁ་ཕྱེ་ནིའི་ ངོ་རྟགས་ཅིག་གི་ནང་ན་ རེ་བ་མེད་པར་ རྫོགས་སོ་ནུག"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"ཡིག་ཆ་དེ་ ཁྱད་ཆོས་ཀྱི་མིང་ཅིག་གི་ཤུལ་ལས་ མཉམ་རྟགས་ཀྱི་རྗེས་སུ་ རེ་བ་མེད་པར་ རྫོགས་སོ་ནུག ཁྱད་ཆོས་ཀྱི་བེ་"
+"ལུ་མིན་འདུག"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "ཡིག་ཆ་དེ་ ཁྱད་ཆོས་ཀྱི་ བེ་ལུ་ཅིག་གི་ནང་ན་སྡོད་པའི་སྐབས་ལུ་ རེ་བ་མེད་པར་ རྫོགས་སོ་ནུག"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "ཡིག་ཆ་དེ་ ཆ་ཤས་ ’%s’ གི་དོན་ལུ་ ཁ་བསྡམ་ངོ་རྟགས་ནང་ན་ རེ་བ་མེད་པར་ རྫོགས་སོ་ནུག"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "ཡིག་ཆ་དེ་ བསམ་བཀོད་ ཡང་ན་ ལས་སྦྱོར་བཀོད་རྒྱ་ཅིག་གི་ནང་ན་ རེ་བ་མེད་པར་ རྫོགས་སོ་ནུག"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "གྱལ་རིམ་%d ཡིག་འབྲུ་ %d:%s ལུ་འཛོལ་བ།"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "མཇུག་མ་བསྡུ་བའི་ ངོ་བོའི་གཞི་བསྟུན།"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "ལུང་འདྲེན་ཚིག་ཡིག་ཚུ་ འདྲེན་རྟགས་ཀྱི་ཐོག་ལས་ འགོ་མི་བཙུགས།"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"བཀོད་ལམ་ནང་ ཡང་ན་ གཞན་ ཤལ་གྱི་འདྲེན་རྟགས་ནང་བཙུགས་པའི་ཚིག་ཡིག་ཚུ་ནང་ མི་མཐུན་པའི་འདྲེན་རྟགས་"
+"འདུག"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr ""
+"ཚིག་ཡིག་དེ་ ཡིག་འབྲུ་ ’\\’ ཅིག་གི་ རྟིང་བདའ་སྟེ་རང་ རྫོགས་སོ་ནུག (ཚིག་ཡིག་དེ་ ’%s’ ཨིན་པས།)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"འདྲེན་རྟགས་དང་ མ་མཐུན་པའི་ཧེ་མར་ རྫོགས་སོང་མི་ ཚིག་ཡིག་དེ་ %c ཨིན་མས། (ཚིག་ཡིག་དེ་ ’%s’ ཨིན་པས)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "ཚིག་ཡིག་དེ་ སྟོང་པའམ་ (ཡང་ཅིན་ ནང་ན་ས་སྟོང་དཀརཔོ་རྐྱངམ་ཅིག་ འོང་ནི་མས།)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "ཆ་ལག་ལས་སྦྱོར་ནང་ལས་ གནད་སྡུད་ལྷག་མ་ཚུགས། "
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+"ཆ་ལག་ལས་སྦྱོར་ (%s) དང་གཅིག་ཁར་ རྒྱུད་འབྲེལ་འཐབ་ནིའི་དོན་ལུ་ རྒྱུད་དུང་གསར་བསྐྲུན་འབད་མ་ཚུགས།"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "ཆ་ལག་རྒྱུད་དུང་ (%s) ནང་ལས་ ལྷག་མ་ཚུགས།"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "སྣོད་ཐོ་’%s’ (%s)ལུ་ བསྒྱུར་བཅོས་འབད་མ་ཚུགས། "
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "ཆ་ལག་ལས་སྦྱོར་ (%s) དེ་ ལག་ལེན་འཐབ་མ་ཚུགས།"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "ནུས་མེད་ལསརིམ་མིང་:%s།"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "%d: %s ལུ་ སྒྲུབ་རྟགས་ཝེཀ་ཊོར་ནང་ ནུས་མེད་ཡིག་རྒྱུན།"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "མཐའ་འཁོར་:%sནང་ལུ་ ནུས་མེད་ཡིག་རྒྱུན།"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "ནུས་མེད་ལཱ་གཡོག་སྣོད་ཐོ་:%s།"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "ལས་རོགས་པའི་ལས་རིམ་ (%s) ལག་ལེན་འཐབ་མ་ཚུགས།"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"ཆ་ལག་ལས་སྦྱོར་ནང་ལས་ གནད་སྡུད་ལྷག་ནི་ལུ་ རེ་བ་མེད་པའི་འཛོལ་བ་ g_io_channel_win32_poll() "
+"ཚུ་འདུག"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "ཆ་ལག་ལས་སྦྱོར་ (%s) ནང་ལས་ གནད་སྡུད་ལྷག་མ་ཚུགས།"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"སེལ་འཐུ་() ནང་ལུ་ རེ་བ་མེད་པའི་འཛོལ་བ་བྱུང་སྟེ་ ཆ་ལག་ལས་སྦྱོར་ (%s) ནང་ལས་ གནད་སྡུད་ལྷག་དོ།"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "ཝེཊི་པིཌི་ () (%s) ནང་ལུ་ རེ་བ་མེད་པའི་འཛོལ་བ། "
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "(%s) ལུ་ ཁ་སྤེལ་མ་ཚུགས།"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "ཆ་ལག་ལས་སྦྱོར་ \"%s\" (%s) ལག་ལེན་འཐབ་མ་ཚུགས།"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "ཆ་ལག་ལས་སྦྱོར་ (%s) གི་ ཨའུཊི་པུཊི་ ཡང་ཅིན་ ཨིན་པུཊི་ ལོག་གཏང་མ་ཚུགས།"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "ཆ་ལག་ལས་སྦྱོར་ (%s) ཁ་སྤེལ་མ་ཚུགས།"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "མ་ཤེས་པའི་འཛོལ་བ་ཅིག་གིས ཆ་ལག་ལས་སྦྱོར་ \"%s\" ལག་ལེན་འཐབ་དོ།"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "ཆ་ལག་ པིཨའི་ཌི་ རྒྱུད་དུང་ (%s) ནང་ལས་ གནད་སྡུད་ལངམ་ ལྷག་མ་ཚུགས།"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "ཡིག་འབྲུ་ ཡུ་ཊི་ཨེཕ་ - ༨ ཀྱི་ ཁྱབ་ཚད་ཀྱི་ཕྱི་ཁར་ཨིན་མས།"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "བསྒྱུར་བཅོས་ཀྱི་ ཨིན་པུཊི་ནང་ལུ་ ནུས་མེད་འབྱུང་རིམ་འདུག"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "ཡིག་འབྲུ་ ཡུ་ཊི་ཨེཕ་- ༡༦ གི་ ཁྱབ་ཚད་ཀྱི་ཕྱི་ཁར་ཨིན་མས།"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "ལག་ལེན:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[ གདམ་ཁ... ] "
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "གྲོགས་རམ་གདམ་ཁ་ཚུ།"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "གྲོགས་རམ་གདམ་ཁ་ཚུ་སྟོན།"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "གྲོགས་རམ་གདམ་ཁ་ཚུ་ ཆ་མཉམ་སྟོན།"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "གློག་རིམ་གྱི་གདམ་ཁ།"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "ཧྲིལ་ཨང་བེ་ལུ་ ’%s’དེ་%s གི་དོན་ལུ་ མིང་དཔྱད་འབད་མི་ཚུགས།"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "%s གི་དོན་ལུ་ ཧྲིལ་ཨང་བེ་ལུ་ ’%s’ དེ་ ཁྱབ་ཚད་ཀྱི་ཕྱི་ཁར་ཨིན་པས།"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "བེ་ལུ་གཉིས་བལྟབ་%s'མིང་དཔྱད་འབད་མི་ཚུགས། %sགི་དོན་ལུ།"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "བེ་ལུ་གཉིས་བལྟབ་'%s' དེ་%s གི་དོན་ལུ་ ཁྱབ་ཚད་ཀྱི་ཕྱི་ཁར་ཨིན་པས།"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "གདམ་ཁ་%s མིང་དཔྱད་འབད་ནི་ལུ་འཛོལ་བ།"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "%s གི་དོན་ལུ་ སྒྲུབ་རྟགས་བརླག་སྟོར་ཞུགས་ནུག"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "ཤེས་མ་ཚུགས་པའི་གདམ་ཁ་ %s།"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "གནད་སྡུད་སྣོད་ཐོ་ཚུ་ནང་ ནུས་ཅན་ལྡེ་མིག་ཡིག་སྣོད་ འཚོལ་མ་ཐོབ།"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "དུས་རྒྱུན་གྱི་ཡིག་སྣོད་ཅིག་མེན་པས།"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "ཡིག་སྣོད་སྟོངམ་ཨིན་པས།"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ལྡེ་མིག་-བེ་ལུ་དང་ སྡེ་ཚན་ བསམ་བཀོད་མེན་པའི་ གྱལ་རིམ་'%s' ཡོད། "
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "ནུས་མེད་ལསརིམ་མིང་:%s།"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "ལྡེ་མིག་ཡིག་སྣོད་དེ་ སྡེ་ཚན་ཅིག་གི་ཐོག་ལས་ འགོ་མི་བཙུགས།"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "ནུས་མེད་ལསརིམ་མིང་:%s།"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ རྒྱབ་སྐྱོར་མེད་པའི་ ཨིན་ཀོ་ཌིང་'%s'ཡོད།"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ སྡེ་ཚན་ '%s' མིན་འདུག།"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ ལྡེ་མིག་'%s'མིན་འདུག"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ཡུ་ཊི་ཨེཕ་-༨ མེད་པའི་ ལྡེ་མིག་'%s' བེ་ལུ་'%s' དང་བཅསཔ་སྦེ་འདུག"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ཁ་བསྒྱུར་འབད་མ་ཚུགས་པའི་ བེ་ལུ་ཡོད་མི་ ལྡེ་མིག་ '%s'འདུག"
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ཁ་བསྒྱུར་འབད་མ་ཚུགས་པའི་ ལྡེ་མིག་'%s'སྡེ་ཚན་'%s' ནང་འདུག།"
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "ལྡེ་མིག་ཡིག་སྣོད་དེ་ལུ་ ལྡེ་མིག་'%s' སྡེ་ཚན་'%s' ནང་མིན་འདུག"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ གྱལ་རིམ་མཇུག་ལུ་ གྲོས་ཐར་འབད་མི་ཡིག་འབྲུ་འདུག"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ནུས་མེད་གྲོས་ཐར་འབྱུང་རིམ་ '%s' འདུག"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "བེ་ལུ་'%s'དེ་ ཨང་གྲངས་ཅིག་སྦེ་ ཁ་བསྒྱུར་འབད་མི་ཚུགས།"
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "ཧྲིལ་ཨང་བེ་ལུ་ ’%s’ དེ་ ཁྱབ་ཚད་ཀྱི་ཕྱི་ཁར་ཨིན་པས།"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "བེ་ལུ་'%s'དེ་ འཕུར་ལྡིང་ཨང་གྲངས་ཅིག་སྦེ་ ཁ་བསྒྱུར་འབད་མི་ཚུགས།"
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "བེ་ལུ་'%s'དེ་ བུ་ལིན་ཅིག་སྦེ་ ཁ་བསྒྱུར་འབད་མི་ཚུགས།"
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "ཡིག་སྣོད་ཐབས་ལམ་ བསྒྱུར་བཅོས་འབད་མ་ཚུགས་: fork() གིས་ %s ལུ་མ་བཏུབ།"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "ཡིག་སྣོད་ཐབས་ལམ་ བསྒྱུར་བཅོས་འབད་མ་ཚུགས་: waitpid() གིས་%s ལུ་མ་བཏུབ།"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "ཡིག་སྣོད་ཐབས་བསྒྱུར་བཅོས་འབདམ་ཚུགས་: chmod() མ་བཏུབ་:%s།"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr ""
+#~ "ཡིག་སྣོད་ཐབས་ལམ་ བསྒྱུར་བཅོས་འབད་མ་ཚུགས་: ཆ་ལག་དེ་ བརྡ་རྟགས་: %s གིས་ རྩ་གྲོལ་བཏང་ནུག"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr "ཡིག་སྣོད་ཐབས་ལམ་ བསྒྱུར་བཅོས་འབད་མ་ཚུགས་: ཆ་ལག་དེ་ ཚུལ་མིན་ཐོག་ལས་ རྩ་གྲོལ་སོང་ནུག"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "ཡོག་འབྲུའི་ཆ་ཚན་ ‘%s’ ལས་ ‘%s’ ལུ་ གཞི་བསྒྱུར་འབད་ནི་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག"
diff --git a/trunk/po/el.po b/trunk/po/el.po
new file mode 100644
index 000000000..8f8820046
--- /dev/null
+++ b/trunk/po/el.po
@@ -0,0 +1,977 @@
+# translation of el.po to Greek
+# Greek translation of glib.
+# Copyright (C) 2002, 2004, 2006 Free Software Foundation, Inc.
+#
+# simos: 25 messages, initial translation
+# kostas: 03Dec2002, updated translation for Gnome 2.1x
+#
+# kostas: 90 messages, 06Nov2002, completed translation.
+# Simos Xenitellis <simos@hellug.gr>, 2002.
+# Kostas Papadimas <pkst@gmx.net>, 2002.
+# Kostas Papadimas <pkst@gnome.org>, 2004, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: el\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-02-20 12:47+0200\n"
+"Last-Translator: Kostas Papadimas <pkst@gnome.org>\n"
+"Language-Team: Greek <team@gnome.gr>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.1\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Περίεργος χαρακτήρας '%s', αναμενόταν ένα '=' μετά το όνομα γνωρίσματος '%"
+"s' του στοιχείου '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Δεν μπορεί να βρεθεί έγκυρο key file στους καταλόγους δεδομένων"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+# gconf/gconf-internals.c:2416
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Αποτυχία ανάγνωσης συμβολικού δεσμού '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Η μετατροπή από την ομάδα χαρακτήρων %s' σε '%s' δεν υποστηρίζεται"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Δεν ήταν δυνατό το άνοιγμα μετατροπέα από '%s' σε %s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Μή έγκυρη σειρά στην είσοδο μετατροπής"
+
+# gconf/gconftool.c:1181
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Σφάλμα κατά τη μετατροπή: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Ημιτελής σειρά χαρακτήρα στο τέλος της εισόδου"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Αδυναμία μετατροπής fallback '%s' σε codeset '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+"Το URI '%s' δεν είναι ένα απόλυτο URI με την χρήση του σχήματος αρχείου"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Το URI τοπικού αρχείου '%s' μπορεί να μην περιέχει ένα '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "Το URI '%s' δεν είναι έγκυρο"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Το όνομα συστήματος του URI '%s' δεν είναι έγκυρο"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Το URI '%s' περιέχει χαρακτήρες μή έγκυρα escaped "
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Η όνομα διαδρομής '%s' δεν είναι μια απόλυτη διαδρομή"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Ακατάλληλο όνομα συστήματος"
+
+#
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Σφάλμα ανοίγματος καταλόγου '%s': %s"
+
+#
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Αδύνατη η διάθεση %lu bytes στην ανάγνωση αρχείου \"%s\""
+
+#
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Σφάλμα ανάγνωσης αρχείου '%s': %s"
+
+# gconf/gconf-internals.c:2416
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Αποτυχία ανάγνωσης από το αρχείο '%s': %s"
+
+# gconf/gconf-internals.c:2416
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Αποτυχία ανοίγματος αρχείου `%s': %s"
+
+# gconf/gconfd.c:1701
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Αποτυχία λήψης ιδιοτήτων του αρχείου '%s': fstat() απέτυχε: %s"
+
+# gconf/gconf-internals.c:2416
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Αδυναμία ανοίγματος αρχείου '%s': fdopen() απέτυχε: %s"
+
+# gconf/gconf-internals.c:2416
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Αδυναμία μετονομασίας αρχείου%s' σε '%s': g_rename() failed: %s"
+
+# gconf/gconf-internals.c:2416
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Αποτυχία δημιουργίας αρχείου '%s': %s"
+
+# gconf/gconf-internals.c:2416
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Αδυναμία ανοίγματος αρχείου '%s' για εγγραφή: fdopen() απέτυχε: %s"
+
+# gconf/gconf-internals.c:2416
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Αδυναμία εγγραφής αρχείου '%s': fwrite() failed: %s"
+
+# gconf/gconf-internals.c:2416
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Αδυναμία κλεισίματος αρχείου '%s': fclose() απέτυχε: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+"Δεν είναι δυνατή η απομάκρυνση του υπάρχοντος αρχείου '%s': g_unlink() "
+"απέτυχε: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Το πρότυπο '%s' δεν είναι έγκυρο, θα πρέπει να περιέχει ένα '%s'"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Το πρότυπο '%s' δεν τελειώνει με XXXXXX"
+
+# gconf/gconf-internals.c:2416
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Αποτυχία ανάγνωσης συμβολικού δεσμού '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Οι συμβολικοί δεσμοί δεν υποστηρίζονται"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Δεν ήταν δυνατό το άνοιγμα μετατροπέα από `%s' σε `%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Δεν είναι δυνατή η raw ανάγνωση σε g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Εναπομείναντα δεδομένα που δεν έχουν μετατραπεί στο read buffer"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Το κανάλι τερματίζει σε ημιτελή χαρακτήρα"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Δεν είναι δυνατή η raw ανάγνωση σε g_io_channel_read_to_end"
+
+# gconf/gconf-internals.c:2416
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Αδυναμία ανοίγματος αρχείου '%s': open() απέτυχε: %s"
+
+# gconf/gconf-internals.c:2416
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Αδυναμία χαρτογράφησης αρχείου '%s': mmap() απέτυχε: %s"
+
+# gconf/gconfd.c:1676
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Σφάλμα στη γραμμή %d χαρακτήρας %d: %s"
+
+#
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Σφάλμα στη γραμμή %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Κενή καταχώρηση '&;' , έγκυρες οντότητες είναι: &amp; &quot; &lt; &gt; "
+"&apos; "
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Ο χαρακτήρας '%s' δεν είναι έγκυρος στην αρχή ονόματος οντότητας, ο "
+"χαρακτήρας & ξεκινά μια οντότητα, αν αυτό το συμπλεκτικό σύμβολο σεν "
+"υποτίθεται να είναι οντότητα, escape it as &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Ο χαρακτήρας '%s' δεν είναι έγκυρος μέσα σε όνομα ύπαρξης."
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Το όνομα οντότητας '%s' δεν είναι γνωστή"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Η οντότητα δεν τελειώνει με άνω τελεία; πιθανόν να χρησιμοποιήσατε έναν "
+"συμπλεκτικό χαρακτήρα χωρίς να θέλατε να ξεκινήσετε μια οντότητα - διαφυγή "
+"συμπλεκτικού χαρακτήρα ώς &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Αποτυχία ανάλυσης του '%-.*s', που θα έπρεπε να υπήρχε ένα ψηφίο μέσα "
+"στην αναφορά χαρακτήρα (&#234; για παράδειγμα) - ίσως το ψηφίο να είναι πολύ "
+"μεγάλο"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Η αναφορά χαρακτήρα'%-.*s' δεν κωδικοποιεί έναν επιτρεπόμενο χαρακτήρα"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Κενή αναφορά χαρακτήρα; πρέπει να περιέχει ένα ψηφίο όπως &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Η αναφορά χαρακτήρα δεν τελειώνει με άνω τελεία; πιθανόν να χρησιμοποιήσατε "
+"έναν συμπλεκτικό χαρακτήρα χωρίς να θέλατε να ξεκινήσετε μια οντότητα - "
+"διαφυγή συμπλεκτικού χαρακτήρα ώς &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Ημιτελής αναφορά οντότητας"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Ημιτελής αναφορά χαρακτήρα"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Μή έγκυρα κωδικοποιημένο κείμενο UTF-8 "
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Το έγγραφο πρέπει να ξεκινάει με στοιχείο (π.χ. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"Το '%s' δεν είναι έγκυρος χαρακτήρας όταν ακολουθείται από ένα χαρακτήρα "
+"'<' ."
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Περίεργος χαρακτήρας '%s', αναμενόταν ένας χαρακτήρας '>' στο τέλος της "
+"ετικέτας έναρξης του στοιχείου '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Περίεργος χαρακτήρας '%s', αναμενόταν ένα '=' μετά το όνομα γνωρίσματος '%"
+"s' του στοιχείου '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Περίεργος χαρακτήρας '%s', αναμενόταν ένας χαρακτήρας '>' ή '/' στο τέλος "
+"της ετικέτας έναρξης του στοιχείου '%s'. ή ένα γνώρισμα, πιθανόν να "
+"χρησιμοποιήσατε ένα μή έγκυρο χαρακτήρα σε ένα όνομα γνωρίσματος"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Περίεργος χαρακτήρας '%s', αναμενόταν ένα ανοικτό εισαγωγικό μετα το "
+"σημείο ίσον κατά την απόδοση τιμής για το γνώρισμα '%s' του στοιχείου '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"Το '%s' δεν είναι έγκυρος χαρακτήρας ακολουθούμενος από χαρακτήρες </'; '%"
+"s' μπορεί να μην αρχίζει όνομα στοιχείου"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"Το '%s' δεν είναι ένας έγκυρος χαρακτήρας ακολουθούμενος από το όνομα "
+"στοιχείου κλεισίματος '%s'; ο επιτρεπόμενος χαρακτήρας είναι '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Το στοιχείο '%s' έκλεισε, κανένα στοιχείο δεν είναι ανοικτό"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Το στοιχείο '%s' έκλεισε, αλλά το τρέχον ανοικτό στοιχείο είναι '%s' "
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Το έγγραφο ήταν κενό (ή περιέχει μόνο λευκό κενό)"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Το έγγραφο τερματίστηκε απρόσμενα αμέσως μετά από μια ανοικτή γωνιακή "
+"παρένθεση '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Το έγγραφο τερματίστηκε απρόσμενα με στοιχεία ακόμα ανοικτά - '%s' ήταν το "
+"τελευταίο στοιχείο που ανοίχθηκε"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Το έγγραφο τερματίστηκε απρόσμενα, αναμενόταν μια παρένθεση κλεισίματος στο "
+"τέλος του tag <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Το έγγραφο τερματίστηκε απρόσμενα μέσα σε όνομα στοιχείου"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Το έγγραφο τερματίστηκε απρόσμενα μέσα σε όνομα γνωρίσματος"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Το έγγραφο τερματίστηκε απρόσμενα μέσα σε tag ανοίγματος στοιχείου."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Το έγγραφο τερματίστηκε απρόσμενα λόγω του ότι μετά του σημείου ίσον "
+"ακολουθεί ένα όνομα γνωρίσματος; δεν υπάρχει τιμή γνωρίσματος"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Το έγγραφο τερματίστηκε απρόσμενα μέσα σε τιμή γνωρίσματος"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Το έγγραφο τερματίστηκε απρόσμενα μέσα σε tag κλεισίματος για στοιχείο '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Το έγγραφο τερματίστηκε απρόσμενα μέσα σε σχόλιο ή εντολή σε διεργασία"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+# gconf/gconfd.c:1676
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Σφάλμα στη γραμμή %d χαρακτήρας %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Ημιτελής αναφορά οντότητας"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+# gconf/gconf-internals.c:1577
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Το παρατιθέμενο αλφαριθμητικό δεν αρχίζει με εισαγωγικό σημείο"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Αταίριαστο ερωτηματικό στη γραμμή εντολών ή άλλο κείμενο που παρατίθεται από "
+"κέλυφος"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr ""
+"Το κείμενο τερματίστηκε αμέσως μετά από χαρακτήρα '\\' (Το κείμενο ήταν '%"
+"s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Το κείμενο τερματίστηκε πριν να βρεθεί ταιριαστή παράθεση για %c. (Το "
+"κείμενο ήταν '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Το κείμενο ήταν κενό (ή περιέχει μόνο λευκό κενό)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Αποτυχία ανάγνωσης δεδομένων από θυγατρική διεργασία"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+"Αποτυχία δημιουργίας σωλήνωσης για την επικοινωνία με θυγατρική διεργασία (%"
+"s)"
+
+# gconf/gconftool.c:881
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Αποτυχία ανάγνωσης από θυγατρική σωλήνωση (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Αποτυχία αλλαγής καταλόγου '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Αποτυχία εκτέλεσης θυγατρικής διεργασίας (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Ακατάλληλο όνομα προγράμματος: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Μη έγκυρο όρισμα για %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Μή έγκυρη σειρά στο περιβάλλον: %s"
+
+#
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Μη έγκυρος κατάλογος εργασίας: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Αποτυχία εκτέλεσης βοηθητικού προγράμματος(%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Απρόσμενο σφάλμα στο g_io_channel_win32_poll() ανάγνωση δεδομένων από μια "
+"θυγατρική διεργασία"
+
+# gconf/gconf-internals.c:2416
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Αποτυχία ανάγνωσης δεδομένων από θυγατρική διεργασία (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Απρόσμενο σφάλμα στο select() ανάγνωσης δεδομένων από θυγατρική διεργασία (%"
+"s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Μη αναμενόμενο σφάλμα στη waitpid() (%s)"
+
+# gconf/gconf-internals.c:2416
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Αποτυχία δικράνωσης (%s)"
+
+# gconf/gconf-internals.c:2416
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Αποτυχία εκτέλεσης θυγατρικής διεργασίας \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+"Αποτυχία προώθησης αποτελέσματος ή εισόδου της θυγατρικής διεργασίας (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Αποτυχία δικράνωσης θυγατρικής διεργασίάς (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Άγνωστο σφάλμα κατά την εκτέλεση της θυγατρικής διεργασίας \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Αποτυχία ανάγνωσης επαρκών δεδομένων από θυγατρική σωλήνωση pid (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Ο χαρακτήρας είναι έξω από την εμβέλεια για UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Μή έγκυρη σειρά στην είσοδο μεταροπής"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Ο χαρακτήρας είναι έξω από την εμβέλεια για UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Χρήση:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[ΕΠΙΛΟΓΗ...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Επιλογές βοήθειας:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Εμφάνιση επιλογών βοήθειας"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Εμφάνιση όλων των επιλογών βοήθειας"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Επιλογές εφαρμογής:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Αδυναμία ανάλυσης integer value '%s' για %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Integer value '%s' για %s είναι εκτός εύρους"
+
+#: glib/goption.c:831
+#, fuzzy, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Αδυναμία ανάλυσης integer value '%s' για %s"
+
+#: glib/goption.c:839
+#, fuzzy, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Integer value '%s' για %s είναι εκτός εύρους"
+
+# gconf/gconftool.c:1181
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Σφάλμα επιλογής ανάλυσης %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Λείπει όρισμα για %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Άγνωστη επιλογή %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Δεν μπορεί να βρεθεί έγκυρο key file στους καταλόγους δεδομένων"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Δεν είναι κανονικό αρχείο"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Το αρχείο είναι κενό"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Το Key file περιέχει την γραμμή '%s' που δεν είναι key-value pair, group, ή "
+"comment"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Ακατάλληλο όνομα προγράμματος: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Το Key file δεν ξεκινάει με μια ομάδα"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Ακατάλληλο όνομα προγράμματος: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Το Key file περιέχει μη υποστηριζόμενη κωδικοποίηση '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Το Key file δεν έχει ομάδα '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Το Key file δεν έχει κλειδί'%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Το Key file περιέχει ένα κλειδί '%s' με τιμή '%s' που δεν είναι UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "Το Key file περιέχει key '%s' που η τιμή του δεν μπορεί να ερμηνευθεί."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Το Key file περιέχει key '%s' στην ομάδα '%s' που η τιμή του δεν μπορεί να "
+"ερμηνευθεί."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Το Key file δεν έχει key '%s' στην ομάδα '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Το Key file περιέχει escape character στο τέλος της γραμμής"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "To Key file περιέχει χαρακτήρες μή έγκυρα escaped '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Η τιμή '%s' δεν μπορεί να ερμηνευθεί ως ένας αριθμός."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Integer value '%s' είναι εκτός εύρους"
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Η τιμή '%s' δεν μπορεί να ερμηνευθεί ως ένας αριθμός."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Η τιμή '%s' δεν μπορεί να ερμηνευθεί ως boolean."
diff --git a/trunk/po/en_CA.po b/trunk/po/en_CA.po
new file mode 100644
index 000000000..e727056bf
--- /dev/null
+++ b/trunk/po/en_CA.po
@@ -0,0 +1,920 @@
+# English/Canada translation of glib.
+# Copyright (C) 2004-2005 Adam Weinberger <adamw@gnome.org>
+# This file is distributed under the same licence as the glib package.
+# Adam Weinberger <adamw@gnome.org>, 2004, 2005.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2005-08-27 16:20-0400\n"
+"Last-Translator: Adam Weinberger <adamw@gnome.org>\n"
+"Language-Team: Canadian English <adamw@gnome.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Unexpected attribute '%s' for element '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Attribute '%s' of element '%s' not found"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Unexpected tag '%s'; tag '%s' expected"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Unexpected tag '%s' inside '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "No valid bookmark file found in data dirs"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "A bookmark for URI '%s' already exists"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "No bookmark found for URI '%s'"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "No MIME type defined in the bookmark for URI '%s'"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "No private flag has been defined in bookmark for URI '%s'"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "No groups set in bookmark for URI '%s'"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "No application with name '%s' registered a bookmark for '%s'"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Failed to read the symbolic link '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Conversion from character set '%s' to '%s' is not supported"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Could not open converter from '%s' to '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Invalid byte sequence in conversion input"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Error during conversion: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Partial character sequence at end of input"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Cannot convert fallback '%s' to codeset '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "The URI '%s' is not an absolute URI using the \"file\" scheme"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "The local file URI '%s' may not include a '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "The URI '%s' is invalid"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "The hostname of the URI '%s' is invalid"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "The URI '%s' contains invalidly escaped characters"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "The pathname '%s' is not an absolute path"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Invalid hostname"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Error opening directory '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Could not allocate %lu bytes to read file \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Error reading file '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Failed to read from file '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Failed to open file '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Failed to get attributes of file '%s': fstat() failed: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Failed to open file '%s': fdopen() failed: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Failed to create file '%s': %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Failed to open file '%s' for writing: fdopen() failed: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Failed to write file '%s': fwrite() failed: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Failed to close file '%s': fclose() failed: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Existing file '%s' could not be removed: g_unlink() failed: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Template '%s' invalid, should not contain a '%s'"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Template '%s' does not contain XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Failed to read the symbolic link '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Symbolic links not supported"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Could not open converter from '%s' to '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Cannot do a raw read in g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Leftover unconverted data in read buffer"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Channel terminates in a partial character"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Cannot do a raw read in g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Failed to open file '%s': open() failed: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Failed to map file '%s': mmap() failed: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Error on line %d char %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Error on line %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Character '%s' is not valid at the start of an entity name; the & character "
+"begins an entity; if this ampersand is not supposed to be an entity, escape "
+"it as &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Character '%s' is not valid inside an entity name"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Entity name '%s' is not known"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Character reference '%-.*s' does not encode a permitted character"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Empty character reference; should include a digit such as &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Unfinished entity reference"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Unfinished character reference"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Invalid UTF-8 encoded text"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Document must begin with an element (e.g. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"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"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element '%s' was closed, no element is currently open"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Element '%s' was closed, but the currently open element is '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Document was empty or contained only whitespace"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Document ended unexpectedly just after an open angle bracket '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Document ended unexpectedly inside an element name"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Document ended unexpectedly inside an attribute name"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Document ended unexpectedly inside an element-opening tag."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Document ended unexpectedly while inside an attribute value"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Document ended unexpectedly inside the close tag for element '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Document ended unexpectedly inside a comment or processing instruction"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Error on line %d char %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Unfinished entity reference"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Quoted text does not begin with a quotation mark"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Unmatched quotation mark in command line or other shell-quoted text"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Text ended just after a '\\' character. (The text was '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "Text ended before matching quote was found for %c. (The text was '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Text was empty (or contained only whitespace)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Failed to read data from child process"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Failed to create pipe for communicating with child process (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Failed to read from child pipe (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Failed to change to directory '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Failed to execute child process (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Invalid program name: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Invalid string in argument vector at %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Invalid string in environment: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Invalid working directory: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Failed to execute helper program (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Failed to read data from child process (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Unexpected error in select() reading data from a child process (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Unexpected error in waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Failed to fork (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Failed to execute child process \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Failed to redirect output or input of child process (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Failed to fork child process (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Unknown error executing child process \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Failed to read enough data from child pid pipe (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Character out of range for UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Invalid sequence in conversion input"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Character out of range for UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Usage:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Help Options:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Show help options"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Show all help options"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Application Options:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Cannot parse integer value '%s' for %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Integer value '%s' for %s out of range"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Cannot parse double value '%s' for %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Double value '%s' for %s out of range"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Error parsing option %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Missing argument for %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Unknown option %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Valid key file could not be found in data dirs"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Not a regular file"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "File is empty"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Invalid program name: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Key file does not start with a group"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Invalid program name: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Key file contains unsupported encoding '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Key file does not have group '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Key file does not have key '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Key file contains key '%s' with value '%s' which is not UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "Key file contains key '%s' which has value that cannot be interpreted."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Key file does not have key '%s' in group '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Key file contains escape character at end of line"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Key file contains invalid escape sequence '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Value '%s' cannot be interpreted as a number."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Integer value '%s' out of range"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Value '%s' cannot be interpreted as a float number."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Value '%s' cannot be interpreted as a boolean."
diff --git a/trunk/po/en_GB.po b/trunk/po/en_GB.po
new file mode 100644
index 000000000..bce72a32e
--- /dev/null
+++ b/trunk/po/en_GB.po
@@ -0,0 +1,937 @@
+# English (British) translation.
+# Copyright (C) 2004 THE GLIB'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the GLIB package.
+# Gareth Owen <gowen72@yahoo.com> 2004
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GLIB\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-05-15 22:08-0000\n"
+"Last-Translator: David Lodge <dave@cirt.net>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Unexpected attribute '%s' for element '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Attribute '%s' of element '%s' not found"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Unexpected tag '%s', tag '%s' expected"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Unexpected tag '%s' inside '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "No valid bookmark file found in data dirs"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "A bookmark for URI '%s' already exists"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "No bookmark found for URI '%s'"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "No MIME type defined in the bookmark for URI '%s'"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "No private flag has been defined in bookmark for URI '%s'"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "No groups set in bookmark for URI '%s'"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "No application with name '%s' registered a bookmark for '%s'"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Failed to expand exec line '%s' with URI '%s'"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Conversion from character set '%s' to '%s' is not supported"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Could not open converter from '%s' to '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Invalid byte sequence in conversion input"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Error during conversion: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Partial character sequence at end of input"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Cannot convert fallback '%s' to codeset '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "The URI '%s' is not an absolute URI using the \"file\" scheme"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "The local file URI '%s' may not include a '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "The URI '%s' is invalid"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "The hostname of the URI '%s' is invalid"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "The URI '%s' contains invalidly escaped characters"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "The pathname '%s' is not an absolute path"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Invalid hostname"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Error opening directory '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Could not allocate %lu bytes to read file \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Error reading file '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Failed to read from file '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Failed to open file '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Failed to get attributes of file '%s': fstat() failed: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Failed to open file '%s': fdopen() failed: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Failed to create file '%s': %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Failed to open file '%s' for writing: fdopen() failed: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Failed to write file '%s': fwrite() failed: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Failed to close file '%s': fclose() failed: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Existing file '%s' could not be removed: g_unlink() failed: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Template '%s' invalid, should not contain a '%s'"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Template '%s' doesn't contain XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Failed to read the symbolic link '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Symbolic links not supported"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Could not open converter from '%s' to '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Can't do a raw read in g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Left over unconverted data in read buffer"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Channel terminates in a partial character"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Can't do a raw read in g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Failed to open file '%s': open() failed: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Failed to map file '%s': mmap() failed: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Error on line %d char %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Error on line %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"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 &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Character '%s' is not valid inside an entity name"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Entity name '%s' is not known"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Character reference '%-.*s' does not encode a permitted character"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Empty character reference; should include a digit such as &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Unfinished entity reference"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Unfinished character reference"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Invalid UTF-8 encoded text"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Document must begin with an element (e.g. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"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"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element '%s' was closed, no element is currently open"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Element '%s' was closed, but the currently open element is '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Document was empty or contained only whitespace"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Document ended unexpectedly just after an open angle bracket '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Document ended unexpectedly inside an element name"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Document ended unexpectedly inside an attribute name"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Document ended unexpectedly inside an element-opening tag."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Document ended unexpectedly while inside an attribute value"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Document ended unexpectedly inside the close tag for element '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Document ended unexpectedly inside a comment or processing instruction"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Error on line %d char %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Unfinished entity reference"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Quoted text doesn't begin with a quotation mark"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Unmatched quotation mark in command line or other shell-quoted text"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Text ended just after a '\\' character. (The text was '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "Text ended before matching quote was found for %c. (The text was '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Text was empty (or contained only whitespace)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Failed to read data from child process"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Failed to create pipe for communicating with child process (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Failed to read from child pipe (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Failed to change to directory '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Failed to execute child process (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Invalid program name: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Invalid string in argument vector at %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Invalid string in environment: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Invalid working directory: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Failed to execute helper program (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Failed to read data from child process (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Unexpected error in select() reading data from a child process (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Unexpected error in waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Failed to fork (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Failed to execute child process \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Failed to redirect output or input of child process (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Failed to fork child process (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Unknown error executing child process \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Failed to read enough data from child pid pipe (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Character out of range for UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Invalid sequence in conversion input"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Character out of range for UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Usage:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Help Options:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Show help options"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Show all help options"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Application Options:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Cannot parse integer value '%s' for %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Integer value '%s' for %s out of range"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Cannot parse double value '%s' for %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Double value '%s' for %s out of range"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Error parsing option %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Missing argument for %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Unknown option %s"
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Valid key file could not be found in search dirs"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Not a regular file"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "File is empty"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Invalid group name: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Key file does not start with a group"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Invalid key name: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Key file contains unsupported encoding '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Key file does not have group '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Key file does not have key '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Key file contains key '%s' with value '%s' which is not UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "Key file contains key '%s' which has value that cannot be interpreted."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Key file does not have key '%s' in group '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Key file contains escape character at end of line"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Key file contains invalid escape sequence '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Value '%s' cannot be interpreted as a number."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Integer value '%s' out of range"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Value '%s' cannot be interpreted as a float number."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Value '%s' cannot be interpreted as a boolean."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Could not change file mode: fork() failed: %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Could not change file mode: waitpid() failed: %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Could not change file mode: chmod() failed: %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr "Could not change file mode: Child terminated by signal: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr "Could not change file mode: Child terminated abnormally"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Conversion from character set `%s' to `%s' is not supported"
diff --git a/trunk/po/eo.po b/trunk/po/eo.po
new file mode 100644
index 000000000..9e2f8a57e
--- /dev/null
+++ b/trunk/po/eo.po
@@ -0,0 +1,931 @@
+# Esperanto translation of glib.
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This file is distributed under the same license as the glib package.
+# Charles Voelger <cvoelger@dweasel.com>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib 2.3.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2003-07-01 15:10-0500\n"
+"Last-Translator: Charles Voelger <cvoelger@dweasel.com>\n"
+"Language-Team: Esperanto <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Malbona signo '%s', unu '>' signo estas atendita post atributnomo '%s' "
+"deelemento '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Malsukcesis krei dosieron '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Konverto de signaro '%s' el '%s' ne estas subtenata"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Ne eblas malfermi konvertilon de '%s' to '%s': %s"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Nevalida bitokosekvenco en konverta enigo"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Eraro dum konverto: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Parta signosekvenco je enigofino"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Ne povas konverti fallback '%s' al kodaro '%s'"
+
+#: glib/gconvert.c:1727
+#, fuzzy, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "La URI '%s' ne estas absolutan URI uzanta la dosiermodelo"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "La loka dosiera URI '%s' eble ne enhavas '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "La URI '%s' estas nevalida"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "La komputilnomo de la URI '%s' ne estas valida"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "La URI '%s' enhavas nevalidajn eskapajn signojn"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "La padnomo '%s' ne estas absolutan padon"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Nevalida komputilnomo"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Eraro dum malfermado de dosierujo '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Ne eblis akiri %lu bitokojn por lego de dosiero \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Eraro dum legado de dosiero '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Malsukcesis legi de dosieron '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Malsukcesis malfermi dosieron '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Malsukcesis ricevi atributojn de dosiero '%s': fstat() malsukcesis: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Malsukcesis krei dosieron '%s': %s"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Ŝablono '%s' ne estas valida, ĝi devus ne enhavi '%s'"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Ŝablono '%s' ne finiĝas je XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, fuzzy, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Malsukcesis krei dosieron '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr ""
+
+#: glib/giochannel.c:1152
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Ne eblis malfermi konvertilon de '%s al '%s: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Ne povas fari krudan legon en g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Kroma nekonvertinta datumo en legbufro"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanalo finas kun parta signo"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Ne povas fari krudan legon en g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Eraro ĉe linio %d signo %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Eraro ĉe linio %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr "Malplena ero '&;'; validaj eroj estas : &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Signo '%s' ne estas valida en la komenco de eronomo; la & signo komencas unu "
+"ero;se la kaj-signo ne estas ero, eskapu ĝin kiel &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Signo '%s' ne estas valida en unu eronomo"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Eronomo '%s' ne estas konata"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Ero ne finis kun punktokomo; vi eble uzis kaj-signo sen voli komenci eron."
+"Eskapu kaj-signon kiel &amp;"
+
+#: glib/gmarkup.c:573
+#, fuzzy, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Analizo de '%s' malsuksesis. Une cifero devus esti en la signoreferenco "
+"(&#234; ekzemple)- eble la cifero estas tro granda"
+
+#: glib/gmarkup.c:598
+#, fuzzy, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Signorefrenco '%s' ne faras kodigu permesatan signon"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Malplena signa referenco; devus enhavi ciferon kiel &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Signa referenco ne finis kun punktokomo; vi verŝajne uzas kaj-signon sen "
+"volikomenci eron - eskapu kaj-signon kiel &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Nefinita erorefrenco"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Nefinita signorefrenco"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Nevalida UTF-8 kodiginta teksto"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokumento devas komenci kun elemento (ekz. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' ne estas valida signo post la signo '<'; ĝi ne eblas "
+"komcencielementnomon"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Malbona signo '%s', unu '>' signo estas atendita por fini la "
+"komencetikedonde elemento '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Malbona signo '%s', unu '>' signo estas atendita post atributnomo '%s' "
+"deelemento '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Malbona signo '%s', unu '>' aŭ '/' signo estas atendita por fini "
+"lakomencetikedon de elemento '%s' aŭ unu atributo; eble vi uzas nevalidan "
+"signon enunu atributnomo"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Malbona signo '%s', malferma citilo estas atendita post la egalsigno "
+"kiamdonita valoro por atributo '%s' de elemento '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' ne estas valida signo post la signoj '</'; '%s' ne eblas "
+"komcencielementnomon"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' ne estas valida signo post la ferma elementnomo '%s'; la valida signo "
+"estas'>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Elemento '%s' estis fermita, neniu elemento estas malfermita"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"Elemento '%s' estis fermita, sed la momente malfermita elemento estas '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokumento estis malpena aŭ enhavis nur blankspaco"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Dokumento neatendite finis post malfermi-angulkrampon '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokumento neatendite finis kun elementoj ankoraŭ malfermi - '%s' estis la "
+"lasta elemento malfermita"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokumento neatendite finis, atendis vidi etikedon finiĝanta je fermi-"
+"angulkrampo <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokumento neatendite finis en elementa nomo"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokumento neatendite finis en atributa nomo"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokumento neatendite finis en elemento-malfermanta etikedo."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokumento neatendite finis post le egalsigno sekvita de atributnomo; ne "
+"atributvaloro"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokumento neatendite finis dum en atributvaloro"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Dokumento neatendite finis en la fermetikedo por elemento '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Dokumento neatendite finis en komento aŭ komputanta instrukcio"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Eraro ĉe linio %d signo %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Nefinita erorefrenco"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Citita teksto ne komencas je citilo"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Konvenita citilo en komandlinio aŭ alia programeto"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Teksto finis post '\\' signon. (La teksto estis '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "Teksto finis antaŭ konvenan citilon por %c. (La teksto estis '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Teksto estis malplena (aŭ enhavis nur blankspacon)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Malsukesis legi datumon de procezido"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Malsukcesis krei dukton por komunikado kun procezido (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Malsukcesis legi de duktido (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Malsukcesis ŝanĝi al dosierujo '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Malsukcesis lanĉi procezidon (%s)"
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "Nevalida komputilnomo"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, fuzzy, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Nevalida sekvenco en konverta enigo"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr "Eraro dum malfermado de dosierujo '%s': %s"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Malsukcesis lanĉi helpant-programon"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Neatendita eraro dum g_io_channel_win32_poll() legado de datumo de procezido"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Malsukcesis legi datumon de procezido (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Neatendita eraro en select() dum datumlegado de procezido (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Neatendita eraro en waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Malsukcesis branĉiĝi (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Malsukcesis lanĉi procezidon \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Malsukcesis alidirekti enigon aŭ eligon de procezido (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Malsukcesis branĉiĝi procezidon (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Nekonata eraro dum la lanĉando de la procezido \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Malsukcesis legi sufiĉe datumon de ida pid-dukto (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Signo ne estas en la UTF-8 intervalo"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Nevalida sekvenco en konverta enigo"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Signo ne estas en la UTF-16 intervalo"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr ""
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr ""
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr ""
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr ""
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Eraro dum konverto: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr ""
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr ""
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Nevalida komputilnomo"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Nevalida komputilnomo"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, fuzzy, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "La URI '%s' enhavas nevalidajn eskapajn signojn"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Ne eblis akiri %lu bitokojn por lego de dosiero \"%s\""
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Konverto de signaro '%s' al '%s' ne estas subtenata"
diff --git a/trunk/po/es.po b/trunk/po/es.po
new file mode 100644
index 000000000..cb6032d94
--- /dev/null
+++ b/trunk/po/es.po
@@ -0,0 +1,958 @@
+# Spanish translation of glib.
+# Copyright (C) 2001, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+#
+# José Antonio Salgueiro <joseantsa@eresmas.net>, 2001.
+# Germán Poo Caamaño <gpoo@ubiobio.cl>, 2002.
+# Francisco Javier F. Serrador <serrador@cvs.gnome.org>, 2004, 2005, 2006.
+# Jorge González <jorgegonz@svn.gnome.org>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.HEAD.es\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-05-22 19:32+0200\n"
+"Last-Translator: Jorge González <jorgegonz@svn.gnome.org>\n"
+"Language-Team: Spanish <traductores@es.gnome.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Atributo inesperado «%s» para el elemento «%s»"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "El atributo «%s» del elemento «%s» no se ha encontrado"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Etiqueta «%s» inesperada, se esperaba la etiqueta «%s»"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Etiqueta «%s» inesperada dentro de «%s»"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+"No se pudo encontrar ningún archivo de marcadores válido en los directorios "
+"de datos"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Ya existe un marcador para el URI «%s»"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "No se encontró un marcador para el URI «%s»"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Ningún tipo MIME definido en el marcador para la URI «%s»"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "No se ha definido ningún flag privado en el marcador para el URI «%s»"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "No se ha establecido ningún grupo en el marcador para el URI «%s»"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Ninguna aplicación con nombre «%s» registró un marcador para «%s»"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Falló la expansión de la la linea ejecutable «%s» con el URI «%s»"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr ""
+"La conversión desde el conjunto de caracteres «%s» a «%s» no está soportada"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "No se pudo abrir el conversor de «%s» a «%s»"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Hay una secuencia de bytes no válida en la entrada de conversión"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Falló durante la conversión: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Hay una secuencia parcial de caracteres en el final de la entrada"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "No se puede convertir el fallback «%s» al conjunto de códigos «%s»"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "El URI «%s» no es una URI absoluta utilizando el esquema «file»"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "El archivo local en la URI «%s» no debe incluir un «#»"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "El URI «%s» es inválida"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "El nombre del host de la URI «%s» es inválido"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "El URI «%s» contiene caracteres de escape inválidos"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "El nombre de la ruta «%s» no es una ruta absoluta"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "El nombre del host es inválido"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Falló al abrir el directorio «%s»: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "No se pueden asignar %lu bytes para leer el archivo «%s»"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Falló al leer el archivo «%s»: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Falló al leer del archivo «%s»: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Falló al abrir el archivo «%s»: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Falló al obtener los atributos del archivo «%s»: fstat() falló: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Falló al abrir el archivo «%s»: fdopen() falló: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Falló al renombrar el archivo «%s» a «%s»: g_rename() falló: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Falló al crear el archivo «%s»: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Falló al abrir el archivo «%s» para escritura: fdopen() falló: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Falló al escribir el archivo «%s»: fwrite() falló: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Falló al cerrar el archivo «%s»: fclose() falló: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "El archivo existente «%s» no se pudo eliminar: g_unlink() falló: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "La plantilla «%s» es inválida, no debería contener un «%s»"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "La plantilla «%s» no contiene XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Falló al leer el enlace simbólico «%s»: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Enlaces simbólicos no soportados"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "No se pudo abrir el conversor de «%s» a «%s»: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"No se puede hacer una lectura en bruto (raw) en g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Se han dejado datos no convertidos en el búfer de lectura"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "El canal termina en un carácter parcial"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+"No se puede hacer una lectura en bruto (raw) en g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Falló al abrir el archivo «%s»: open() falló: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Falló al mapear el archivo «%s»: mmap() falló: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Error en la línea %d, carácter %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Error en la línea %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"La entidad '&;' está vacía; las entidades válidas son: &amp; &quot; &lt; "
+"&gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"El carácter «%s» no es válido al inicio del nombre de una entidad; el "
+"carácter «&» inicia una entidad; si el signo et ('&') no debiera ser una "
+"entidad, escápela como &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "El carácter «%s» no es válido dentro del nombre de una entidad"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "El nombre de la entidad «%s» es desconocido"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"La entidad no termina con un punto y coma; probablemente utilizó el carácter "
+"\"&\" sin la intención de indicar una entidad, escape el signo \"&\" como "
+"&amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Falló al analizar «%-.*s», el cual debería tener un dígito dentro de un "
+"carácter de referencia( por ejemplo &#234;) - tal vez el dígito es demasiado "
+"grande"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "El carácter de referencia «%-.*s» no codifica un carácter permitido"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+"El carácter de referencia está vacío; debería incluir un dígito tal como "
+"&#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"El carácter de referencia no termina con punto y coma; probablemente utilizó "
+"un carácter «&» sin pretender iniciar una entidad, escape el carácter \"&\" "
+"como &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Referencia de entidad sin terminar"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Referencia de carácter sin terminar"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Texto codificado como UTF-8 inválido"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "El documento debe comenzar con un elemento (por ejemplo: <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"«%s» no es un carácter válido a continuación del carácter '<'; no debe "
+"iniciar un nombre de elemento"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Carácter «%s» impropio, se esperaba un carácter '>' para terminar la "
+"etiqueta de inicio del elemento «%s»"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Carácter «%s» impropio, se esperaba el carácter '=' después del nombre de "
+"atributo «%s» del elemento «%s»"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Carácter «%s» impropio, se esperaba un carácter '>' o '/' para finalizar la "
+"etiqueta de inicio del elemento «%s» u opcionalmente un atributo; tal vez "
+"utilizó un carácter que no es válido en un nombre de atributo"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Carácter «%s» impropio, se esperaba una marca de apertura de comillas "
+"después del signo igual al darle valor al atributo «%s» del elemento «%s»"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"«%s» no es un carácter válido a continuación de los caracteres '</'; «%s» "
+"no debe iniciar un nombre de elemento"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"«%s» no es un carácter válido a continuación del nombre del elemento de "
+"cierre «%s»; el carácter permitido es '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "El elemento «%s» fue cerrado, no existe ningún elemento abierto"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"El elemento «%s» fue cerrado, pero el elemento que está abierto actualmente "
+"es «%s»"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "El documento estaba vacío o sólo contenía espacios en blanco"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "El documento termina inesperadamente justo después de un '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"El documento termina inesperadamente con elementos todavía abiertos - «%s» "
+"fue el último elemento abierto"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"El documento termina inesperadamente, se esperaba un carácter '>' "
+"finalizando la etiqueta <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "El documento termina inesperadamente dentro de un nombre de elemento"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "El documento termina inesperadamente dentro de un nombre de atributo"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+"El documento termina inesperadamente dentro de una etiqueta de apertura de "
+"elemento."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"El documento termina inesperadamente después de los signos igual que siguen "
+"al nombre de atributo; sin valor de atributo"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "El documento termina inesperadamente dentro del valor de un atributo"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"El documento termina inesperadamente dentro de la etiqueta de cierre del "
+"elemento «%s»"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"El documento termina inesperadamente dentro de un comentario o instrucción "
+"de proceso"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr "objeto corrupto"
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr "error interno u objeto corrupto"
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr "sin memoria"
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+"el patrón contiene elementos no soportados para una coincidencia parcial"
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr "error interno"
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr "se alcanzó el límite de recursividad"
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr "error desconocido"
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr "Error al coincidir con la expresión regular %s: %s"
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr "La biblioteca PCRE está compilada sin soporte para UTF8"
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+"La biblioteca PCRE está compilada sin soporte para las propiedades de UTF8"
+
+#: glib/gregex.c:928
+#, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Error al compilar la expresión regular %s en el carácter %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr "Error al optimizar la expresión regular %s: %s"
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr "se esperaba un dígito hexadecimal o «}»"
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr "se esperaba un dígito hexadecimal"
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr "falta «<» en la referencia simbólica"
+
+#: glib/gregex.c:1834
+msgid "unfinished symbolic reference"
+msgstr "referencia de símbolo sin terminar"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr "referencia simbólica de longitud cero"
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr "se esperaba un dígito"
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr "referencia simbólica ilegal"
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr "secuencia de escape desconocida"
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr "Error al analizar el texto de reemplazo «%s» en el carácter %lu: %s"
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "El texto entrecomillado no empieza por un signo de comilla"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Falta una comilla en la línea de comandos o en otro texto con comillas tipo "
+"shell"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr ""
+"El texto termina justo después de un carácter '\\'. (El texto era «%s»)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"El texto terminó antes de que se encontrase la comilla correspondiente con %"
+"c. (El texto era «%s»)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "El texto está vacío (o sólo contiene espacios en blanco)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Falló al leer los datos desde un proceso hijo"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+"Falló en la creación de un conducto (pipe) para comunicarse con el proceso "
+"hijo (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Falló al leer desde el conducto hijo (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Falló al cambiar al directorio «%s» (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Falló al ejecutar el proceso hijo (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Nombre de programa inválido: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Cadena inválida en el vector del argumento en %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Cadena inválida en el entorno: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Directorio de trabajo inválido: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Falló al ejecutar el programa auxiliar (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Falló inesperado en g_io_channel_win32_poll() al leer datos desde un proceso "
+"hijo"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Falló en la lectura de datos desde el proceso hijo (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Falló inesperado en select() leyendo datos desde el proceso hijo (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Falló inesperado en waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Falló al bifurcar (fork) (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Falló al ejecutar el proceso hijo «%s» (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Falló al redirigir la salida o la entrada del proceso hijo (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Falló al bifurcar el proceso hijo (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Falló desconocido al ejecutar el proceso hijo «%s»"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Falló al leer suficientes datos desde el conducto del pid hijo (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "El carácter se sale del rango para UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Secuencia inválida en la entrada de conversión"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "El carácter se sale del rango para UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Uso:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPCIÓN…]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Opciones de ayuda:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Mostrar opciones de ayuda"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Muestra todas las opciones de ayuda"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Opciones de la aplicación:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "No se puede analizar el valor entero «%s» para %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "El valor entero «%s» para %s está fuera de rango"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "No se puede analizar el valor doble «%s» para %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "El valor doble «%s» para %s está fuera de rango"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Error al analizar la opción: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Falta un argumento para %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Opción desconocida %s"
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+"No se pudo encontrar la clave de archivo válida en los directorios de "
+"búsqueda"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "No es un archivo regular"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "El archivo está vacío"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"El archivo de claves contiene la línea «%s» que no es un par valor-clave, "
+"grupo o comentario"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Nombre de grupo no válido: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "El archivo de claves no empieza por un grupo"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Nombre de clave no válida: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "El archivo de clavess contiene una codificación «%s» no soportada"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "El archivo de claves no tiene el grupo «%s»"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "El archivo de claves no tiene la clave «%s»"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"El archivo de claves contiene la clave «%s» con el valor «%s» el cual no es "
+"UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"El archivo de claves contiene la clave «%s» que tiene un valor que no puede "
+"interpretarse."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"El archivo de claves contiene la clave «%s» en el grupo «%s» que tiene un "
+"valor que no puede interpretarse."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "El archivo de claves no tiene la clave «%s» en el grupo «%s»"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+"El archivo de claves contiene un carácter de escape al final de la línea"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "El archivo de claves contiene la secuencia de escape inválida «%s»"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "El valor «%s» no puede interpretarse como un número."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "El valor entero «%s» está fuera de rango"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "El valor «%s» no puede interpretarse como un número de coma flotante."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "El valor «%s» no puede interpretarse como un booleano."
diff --git a/trunk/po/et.po b/trunk/po/et.po
new file mode 100644
index 000000000..6339c54ea
--- /dev/null
+++ b/trunk/po/et.po
@@ -0,0 +1,925 @@
+# Glib'i eesti tõlge.
+# Estonian translation of Glib.
+#
+# Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc.
+# Copyright (C) 2007 The GNOME Project.
+# This file is distributed under the same license as the Glib package.
+#
+# Allan Sims <allsi@eau.ee>, 2002.
+# Ivar Smolin <okul@linux.ee>, 2005-2007.
+# Priit Laes <amd@store20.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Glib HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-05-24 00:35+0300\n"
+"Last-Translator: Ivar Smolin <okul@linux.ee>\n"
+"Language-Team: Estonian <gnome-et@linux.ee>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Ootamatu atribuut '%s' elemendile '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Elemendil '%2$s' ei leitud atribuuti '%1$s'"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Ootamatu silt '%s', oodati silti '%s'"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "'%2$s' on ootamatu silt '%1$s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Andmekataloogidest ei leitud korrektset järjehoidjafaili"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "URI-le '%s' on juba järjehoidja olemas"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "URI-le '%s' ei leitud järjehoidjat"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "URI '%s' järjehoidjas pole MIME tüüpe määratud"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "URI '%s' järjehoidjas pole privaatlippu kirjeldatud"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "URI '%s' järjehoidjas pole gruppe määratud"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Rakendus nimega '%s' pole '%s' kohta järjehoidjat registreerinud"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Tõrge rea '%s' käivitamisel koos URI-ga '%s'"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Teisendamine koodistikust '%s' koodistikku '%s' ei ole toetatud"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Konverterit '%s'-st '%s'-ks pole võimalik avada"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Vigane baidijada sisendi teisendamisel"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Viga teisendamisel: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Osaline märgijada sisendi lõpus"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Taandresiimi '%s' pole võimalik teisendada kooditabelisse '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' ei ole failiskeemi (\"file\") jaoks absoluutne URI"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Kohaliku faili URI '%s' ei või sisaldada märki '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' on vigane"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "URI '%s' hostinimi on vigane"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' sisaldab vigaseid paomärke"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Rajanimi '%s' ei ole absoluutne rada"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Vigane hostinimi"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Viga kataloogi '%s' avamisel: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Ei saa eraldada %lu faili \"%s\" lugemiseks"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Viga failist '%s' lugemisel: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Tõrge failist '%s' lugemisel: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Tõrge faili '%s' avamisel: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Tõrge faili '%s' atribuutide saamisel: fstat() nurjus: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Tõrge faili '%s' avamisel: fdopen() nurjus: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Tõrge faili '%s' ümbernimetamisel nimega '%s': g_rename() nurjus: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Tõrge faili '%s' loomisel: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Tõrge faili '%s' avamisel kirjutamiseks: fdopen() nurjus: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Tõrge faili '%s' kirjutamisel: fwrite() nurjus: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Tõrge faili '%s' sulgemisel: fclose() nurjus: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Olemasolevat faili '%s' pole võimalik eemaldada: g_unlink() nurjus: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Mall '%s' vigane, see ei tohiks sisaldada '%s'"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Mall '%s' ei sisalda XXXXXX-i"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Tõrge nimeviite '%s' lugemisel: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Nimeviited ei ole toetatud"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Konverterit '%s'-st '%s'-ks pole võimalik avada: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Ei saa teostada toorest lugemise g_io_channel_read_line_string'i sees"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Lugemispuhvrisse jäi teisendamata andmeid"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanali katkestus poole märgi pealt"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Ei saa teostada toorest lugemise g_io_channel_read_to_end'i sees"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Tõrge faili '%s' avamisel: open() nurjus: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Tõrge faili '%s' avamisel: mmap() nurjus: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Viga real %d märgil %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Viga real %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Avastati tühi olem '&'; lubatud olemid on: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Märk '%s' ei ole olemi nime alguses lubatud. Märk & alustab olemit, kui see "
+"ampersand pole mõeldud olemiks, märgi see kui &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Märk '%s' ei ole olemi nimes lubatud"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Olemi nimi '%s' on tuntmatu"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Olem ei lõppenud semikooloniga; kõige tõenäolisemalt ei kavatsenud sa "
+"ampersandi kasutades olemit alustada - märgi see kui &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Viga '%-.*s' parsimisel. See võiks olla märgiviites olev number (näiteks "
+"&#234;) - võibolla on number liiga suur"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Märgiviide '%-.*s' ei teisendu lubatud märgiks"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Tühi märgiviide, see peaks sisaldama numbrit, näiteks &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Märgiviide ei lõpe semikooloniga. Enamasti kasutatakse ampersand märki ilma "
+"kavatsuseta olemit alustada - märgi see kui &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Lõpetamata viide olemile"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Lõpetamata viide märgile"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Vigaselt kodeeritud UTF-8 tekst"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokument peab algama elemendiga (nt: <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"Märk '%s' ei ole märgi '<' järel lubatud, see võib mitte olla elemendi nimi"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Veider märk '%s', oodatakse '>' märki, et lõpetada elemendi '%s' algussilti"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Veider märk '%s', oodatakse '=' märki peale elemendi '%s' tunnust nimega '%"
+"s' "
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Veider märk '%s', oodatakse märke '>' või '/', mis tähitaksid elemendi '%s' "
+"sildi algust või lõppu, ühe võimalusena ka atribuuti. Võib-olla kasutad sa "
+"atribuudi nimes vigast märki?"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Veider märk '%s', oodatakse võrdusmärgi järel tulevat jutumärki, mis aitaks "
+"atribuudile '%s' väärtust seada (element '%s')"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"Märk '%s' ei ole märkide '</' järel lubatud, '%s' võib mitte olla elemendi "
+"nimi"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"Märk '%s' ei ole lubatud märk elemendi '%s' nime sulgemise järel, lubatud "
+"märk on '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element '%s' on suletud, avatud elemente ei ole"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Element '%s' on suletud, kuid praegu avatud element on '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokument on tühi või sisaldab ainult tühja ruumi"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Dokument lõppes ootamatult ilma avatud nurksulgu '<' sulgemata"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokument lõppes ootamatult ilma, et avatud elemente sulgemata - '%s' oli "
+"viimane avatud element"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokument lõppes ootamatult, sildi <%s/> lõpetamiseks loodetakse näha "
+"nurksulgu"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokument lõppes ootamatult elemendi nime sees"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokument lõppes ootamatult atribuudi nime sees"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokument lõppes ootamatult elemendi avamise sildi sees"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokument lõppes ootamatult peale atribuudi nime järel olevat võrdusmärki, "
+"atribuudu väärtus on puudu"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokument lõppes ootamatult keset attribuudi väärtust"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Dokument lõppes ootamatult elementi '%s' sulgemissildi sees"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Dokument lõppes ootamatult kommentaaride või töötlemis juhiste sees"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr "rikutud objekt"
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr "sisemine viga või rikutud objekt"
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr "mälu lõppes"
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr "sisemine viga"
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr "tundmatu viga"
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr "PCRE teek on kompileeritud ilma UTF8 toeta"
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr "PCRE teek on kompileeritud ilma UTF8 omaduste toeta"
+
+#: glib/gregex.c:928
+#, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Viga regulaaravaldise %s kompileerimisel %d. märgi juures: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr "Viga regulaaravaldise %s optimeerimisel: %s"
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr "oodati kuueteistkümnendsüsteemi numbrit või '}' märki"
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr "oodati kuueteistkümnendsüsteemi numbrit"
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+msgid "unfinished symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr "tundmatu paojada"
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Tsiteeritav tekst ei alga jutumärgiga"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Vastavuseta jutumärk käsureal või kestprogrammi tsiteeritud tekstis"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Tekst lõppes pärast '\\' märki. (Tekst on '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "Tekst lõppes enne kui leiti vastav jutumärk %c jaoks. (Tekst oli '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Tekst puudus (või sisaldas ainult tühja ruumi)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Tõrge andmete lugemisel alamprotsessilt"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Tõrge toru loomisel alamprotsessiga suhtlemiseks (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Tõrge alamprotsessi torust lugemisel (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Tõrge kataloogi '%s' muutmisel (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Tõrge alamprotsessi käivitamisel (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Vigane programmi nimi: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Vigane string argumendivektoris %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Vigane string keskkonnamuutujates: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Vigane töökataloog: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Tõrge abiprogrammi käivitamisel (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Ootamatu viga, kui g_io_channel_win32_poll() funktsioon luges "
+"lapsprotsessilt andmeid"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Tõrge andmete lugemisel alamprotsessilt (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Ootamatu funktsiooni select() viga andmete lugemisel alamprotsessilt (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Ootamatu viga funktsioonis waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Viga poolitamisel funktsiooniga fork() (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Tõrge alamprotsessi \"%s\" käivitamisel (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Tõrge alamprotsessi sisendi või väljundi ümbersuunamisel (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Tõrge alamprotsessi poolitamisel funktsiooniga fork() (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Tundmatu viga alamprotsessi \"%s\" käivitamisel"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Tõrge piisavate andmete lugemisel lapsprotsessi torust (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Märk on väljaspool UTF-8 ulatust"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Vigane jada sisendi teisendamisel"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Märk on väljaspool UTF-16 ulatust"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Kasutamine:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[VÕTI...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Abiteabe võtmed:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Abiteabe võtmete näitamine"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Kõikide abiteabe võtmete näitamine"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Rakenduse võtmed:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Täisarvulist väärtust '%s' pole võimalik %s jaoks parsida"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Täisarv '%s' %s jaoks on väljaspool lubatud piire"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Arvväärtust '%s' pole võimalik %s jaoks parsida"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Arv '%s' %s jaoks on väljaspool lubatud piire"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Viga võtme parsimisel: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Puuduv argument %s'i jaoks"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Tundmatu võti %s"
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Sobivat võtmefaili pole võimalik otsingukataloogidest leida"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Pole tavaline fail"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Fail on tühi"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Võtmefail sisaldab rida '%s', mis ei ole võti-väärtus paar, grupp ega ka "
+"kommentaar"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Vigane grupi nimi: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Võtmefail ei alga grupiga"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Vigane võtme nimi: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Võtmefail sisaldab toetamata kodeeringut '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Võtmefail ei sisalda gruppi '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Võtmefail ei sisalda võtit '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Võtmefail sisaldab võtit '%s', mille väärtus '%s' pole UTF-8 kodeeringus"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "Võtmefail sisaldab võtit '%s', mille väärtus pole võimalik kasutada."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Võtmefail sisaldab võtit '%s' grupis '%s' aga selle väärtust pole võimalik "
+"kasutada"
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Võtmefail ei sisalda võtit '%s' grupis '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Võtmefail sisaldab rea lõpus paomärki"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Võtmefail sisaldab vigast paojada '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Väärtust '%s' pole võimalik numbrilise väärtusena kasutada."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Täisarvu väärtus '%s' on väljaspool lubatud piire"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Väärtust '%s' pole võimalik ujukomalise väärtusena kasutada."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Väärtust '%s' pole võimalik tõeväärtusena kasutada."
diff --git a/trunk/po/eu.po b/trunk/po/eu.po
new file mode 100644
index 000000000..481ee3033
--- /dev/null
+++ b/trunk/po/eu.po
@@ -0,0 +1,948 @@
+# translation of glib.po to Basque
+# Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+# Joseba Bidaurrazaga van Dierdonck <jepibi-san@ej-gv.es>, 2001.
+# Hizkuntza Politikarako Sailburuordetza <hizpol@ej-gv.es>, 2004.
+# Iñaki Larrañaga Murgoitio <dooteo@euskalgnu.org>, 2004, 2005, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: eu\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-08 09:50+0000\n"
+"Last-Translator: Iñaki Larrañaga Murgoitio <dooteo@euskalgnu.org>\n"
+"Language-Team: Basque <itzulpena@euskalgnu.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "'%2$s' elementuaren ustegabeko '%1$s'atributua"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "'%2$s' elementuaren '%1$s' atributua ez da aurkitu"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Ustegabeko '%s' etiketa, '%s' espero zen"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "'%2$s' barruan ustegabeko '%1$s' etiketa"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+"Ezin izan da balioko laster-marken fitxategia aurkitu datuen direktorioan"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "'%s' URIaren laster-marka badago lehenedik ere"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Ez da '%s' URIaren laster-markarik aurkitu"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Ez dago '%s' URIaren laster-markan MIME-motarik definituta"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "'%s' URIaren laster-markan ez dago bandera pribaturik definituta"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "'%s' URIaren laster-markan ez dago talderik ezarrita"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "'%s' izeneko aplikaziorik ez du erregistratu laster-markarik '%s'(e)n"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Ezin izan da '%s' esteka sinbolikorik irakurri: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "'%s' karaktere-multzoa '%s' bihurtzea ez da onartzen"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Ezin izan da '%s'(e)tik %s(e)rako bihurtzailea ireki"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Byten sekuentzia baliogabea bihurketa-sarreran"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Errorea bihurtzean: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Karaktere-sekuentzia partziala sarreraren amaieran"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Ezin da '%s' atzerapena '%s' kode-multzo bihurtu"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "'%s' URIa ez da \"fitxategi\"-eskema erabiltzen duen URI absolutua "
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Baliteke '%s' URI fitxategi lokalak '#' ez edukitzea"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "'%s' URI baliogabea da"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "'%s' URIaren ostalari-izena baliogabea da"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "'%s' URIak ihes-karaktere baliogabeak ditu"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "'%s' bide-izena ez da bide-izen absolutua"
+
+#
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Ostalari-izen baliogabea"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Errorea '%s' direktorioa irekitzean: %s "
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Ezin izan dira %lu byte esleitu \"%s\" fitxategia irakurtzeko"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Errorea '%s' fitxategia irakurtzean: %s "
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Ezin izan da '%s' fitxategitik irakurri: %s "
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Ezin izan da '%s' fitxategia ireki: %s "
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"Ezin izan dira '%s' fitxategiko atributuak lortu: fstat()-(e)k huts egin du: "
+"%s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Ezin izan da '%s' fitxategia ireki: fdopen()-(e)k huts egin du: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Ezin izan da '%s' fitxategia '%s' gisa berrizendatu: g_rename()k huts egin "
+"du: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Ezin izan da '%s' fitxategia sortu: %s "
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"Ezin izan da '%s' fitxategia idazteko ireki: fdopen()-(e)k huts egin du: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Ezin izan da '%s' fitxategia idatzi: fwrite()-k huts egin du: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Ezin izan da '%s' fitxategia itxi: fclose()-k huts egin du: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "'%s' fitxategia ezin izan da kendu: g_unlik()ek huts egin du: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "'%s' txantiloia baliogabea da, ez luke '%s' eduki behar"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "'%s' txantiloiak ez dauka: XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Ezin izan da '%s' esteka sinbolikorik irakurri: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Esteka sinbolikoak ez dira onartzen"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Ezin izan da `%s'(e)tik `%s'(e)rako bihurtzailea ireki: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Ezin dira datu gordinak irakurri g_io_channel_read_line_string-en"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Irakurketa-bufferrean geratu diren bihurtu gabeko datuak"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanala karaktere partzial batean bukatzen da"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Ezin dira datu gordinak irakurri g_io_channel_read_to_end-etik"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Ezin izan da '%s' fitxategia ireki: open()-ek huts egin du: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Ezin izan da '%s' fitxategi-mapa ireki: mmap()-ek huts egin du: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Errorea %d lerroko %d karakterean: %s "
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Errorea %d lerroan: %s "
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"'&;' entitatea hutsik dago; baliozko entitateak hauek dira: &amp; &quot; "
+"&lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"'%s' karakterea ezin da jarri entitate-izenen hasieran; & karaktereak "
+"entitate bat hasten du; & ikurrak entitatea izan behar ez badu, izenda "
+"ezazu &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "'%s' karakterea ezin da erabili entitate-izenen barruan"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "'%s' entitate-izena ezezaguna da"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entitatea ez da puntu eta komaz bukatzen; normalean & ikurra erabiltzen da "
+"entitatea hasteko asmorik gabe; izendatu & karakterea &amp; gisa;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Ezin izan da '%-.*s' analizatu, digitu bat izan behar zuen karaktere-"
+"erreferentzia baten barruan (&#234; adibidez); agian digitua handiegia da"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr ""
+"'%-.*s' karaktere-erreferentziak ez du baimendutako karaktere bat kodetzen"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+"Karaktere-erreferentzia hutsa, digitu bat eduki beharko luke; adibidez &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Karaktere-erreferentzia ez da puntu eta komaz bukatzen; ziurrenik & ikurra "
+"erabiliko zenuen entitatea hasteko asmorik gabe. Izendatu & karakterea &amp; "
+"gisa;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Amaitu gabeko entitate-erreferentzia"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Amaitu gabeko karaktere-erreferentzia"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "UTF-8 gisa kodetutako testu baliogabea"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokumentuak elementu batez hasi behar du (adibidez, <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' ez da karaktere balioduna '<' karakterearen atzetik; baliteke elementu "
+"baten izena ez hastea"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"'%s' karaktere bitxia, '>' karakterea espero zen '%s' elementuaren hasiera-"
+"etiketa amaitzeko"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"'%s' karaktere bitxia, '=' espero zen '$2%s' elementuaren '$1%s' "
+"atributuaren ondoren"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"'%s' karaktere bitxia, '>' edo '/' karakterea espero zen '%s' elementuaren "
+"hasiera-etiketa bukatzeko, edo bestela atributu bat. Agian karaktere "
+"baliogabea erabili duzu atributu-izen batean"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"'%s' karaktere bitxia, komatxo irekia espero zen berdin ikurraren ondoren "
+"'$2%s' elementuaren '$1%s' atributuari balioa ematean"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' ez da karaktere balioduna '</'; karaktereen atzetik; baliteke '%s'e(k) "
+"elementu baten izena ez hastea"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' karaktere baliogabea da '%s' itxiera-elementuaren izenaren atzetik; "
+"baimendutako karakterea '>' da"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "'%s' elementua itxi egin da, unean ez dago elementurik irekita"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "'%s' elementua itxi egin da, baina unean '%s' elementua dago irekita"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokumentua hutsik dago edo zuriuneak bakarrik ditu"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Dokumentua ustekabean itxi da angelu-parentesi ireki baten ondoren '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokumentua ustekabean amaitu da oraindik irekita zeuden elementuekin. '%s' "
+"irekitako azken elementua da"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokumentua ustekabean amaitu da, angelu-parentesi itxia ikustea espero nuen "
+"<%s/> etiketa amaitzen"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokumentua ustekabean amaitu da elementu-izen baten barruan"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokumentua ustekabean amaitu da atributu-izen baten barruan"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+"Dokumentua ustekabean amaitu da elementua irekitzeko etiketa baten barruan."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokumentua ustekabean amaitu da atributu-izen baten ondorengo berdin "
+"ikurraren atzetik; ez dago atributu-baliorik"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokumentua ustekabean amaitu da atributu-balio baten barruan"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Dokumentua ustekabean amaitu da '%s' elementuaren itxiera-etiketaren barruan"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Dokumentua ustekabean amaitu da iruzkin baten barruan edo prozesatzen ari "
+"zen instrukzio baten barruan"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Errorea %d lerroko %d karakterean: %s "
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Amaitu gabeko entitate-erreferentzia"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Komatxo arteko testua ez da komatxoekin hasten"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Bat ez datozen komatxoak daude komando-lerroan edo shell-ak aipatutako beste "
+"testu batean"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Testua '\\' karakterearen atzetik amaitu da (testua '%s' zen)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Testua %c(r)en komatxoak aurkitu baino lehen amaitu da (testua '%s' zen)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Testua hutsik dago (edo zuriuneak bakarrik ditu)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Ezin izan da daturik irakurri prozesu umetik"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Ezin izan da kanalizazioa sortu prozesu umearekin komunikatzeko (%s) "
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Ezin izan da kanalizazio umetik irakurri (%s) "
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Ezin izan da `%s' direktoriora aldatu (%s) "
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Ezin izan da prozesu umea exekutatu (%s) "
+
+#
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Programaren izen baliogabea: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Kate baliogabea %d(e)ko bektorearen argumentuan: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Kate baliogabea ingurunean: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Laneko direktorio baliogabea: %s "
+
+#
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Ezin izan da laguntza-programa exekutatu (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Ustekabeko errorea gertatu da g_io_channel_win32_poll()-en prozesu umetik "
+"datuak irakurtzean"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Ezin izan da daturik irakurri prozesu umetik (%s) "
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Ustekabeko errorea select()-en, datuak prozesu umetik irakurtzen (%s) "
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Ustekabeko errorea waitpid()-en (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Ezin da sardetu (%s) "
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Ezin izan da \"%s\" prozesu umea exekutatu (%s) "
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Ezin izan da prozesu umearen irteera edo sarrera birbideratu (%s) "
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Ezin izan da prozesu umea sardetu (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Errore ezezaguna \"%s\" prozesu umea exekutatzean"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Ezin izan da nahikoa datu irakurri pid kanalizazio umetik (%s) "
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Karakterea honako barrutitik kanpo UTF-8 formaturako"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Sekuentzia baliogabea bihurketa-sarreran"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Karakterea honako barrutitik kanpo UTF-16 formaturako"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Erabilera:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[AUKERA...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Laguntzako aukerak:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Erakutsi laguntzako aukerak"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Erakutsi laguntzako aukera guztiak"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Aplikazio-aukerak:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Ezin da '%2$s'(r)en '%1$s' osoko balioa analizatu"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "%2$s(r)en '%1$s' osoko balioa barrutitik kanpo"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Ezin da '%2$s'(r)en '%1$s' balio bikoitza analizatu"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "%2$s(r)en '%1$s' balio bikoitza barrutitik kanpo"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Errorea %s aukera analizatzean"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "%s(e)ko argumentua falta da"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "%s aukera ezezaguna"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Ezin izan da balioko gakoa datuen direktorioan aurkitu"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Ez da fitxategi arrunta"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Fitxategia hutsik dago"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Gako-fitxategiak '%s' lerroa du, gako-balioa bikotea, taldea edo iruzkinik "
+"ez daukalarik"
+
+#
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Programaren izen baliogabea: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Gako-fitxategiak ez da talde batekin hasten"
+
+#
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Programaren izen baliogabea: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Gako-fitxategiak onartzen ez den '%s' kodeketa du"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Gako-fitxategiak ez dauka '%s' taldea"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Gako-fitxategiak ez dauka '%s' gakoa"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Gako-fitxategiak '%s' gakoa dauka (%s balioduna) baina ez da UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Gako-fitxategiak '%s' gakoa dauka, baina dagokion balioa ezin da "
+"interpretatu."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Gako-fitxategiak '%s' gakoa dauka ('%s taldean), baina dagokion balioa ezin "
+"da interpretatu."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Gako-fitxategiak ez dauka '%s' gakoa ('%s' taldean)"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Gako-fitxategiak ihes-karakterea dauka lerro amaieran"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Gako-fitxategiak '%s' ihes-sekuentzia baliogabea dauka"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "'%s' balioa ezin da zenbaki gisa interpretatu"
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "'%s' osoko balioa barrutitik kanpo"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "'%s' balioa ezin da zenbaki mugikor gisa interpretatu."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "'%s' balioa ezin da bolear gisa interpretatu"
diff --git a/trunk/po/fa.po b/trunk/po/fa.po
new file mode 100644
index 000000000..68015764e
--- /dev/null
+++ b/trunk/po/fa.po
@@ -0,0 +1,943 @@
+# Translation of glib to Persian.
+# Copyright (C) 2002, 2004, 2005, 2006 Sharif FarsiWeb, Inc.
+# Roozbeh Pournader <roozbeh@farsiweb.info>, 2002, 2004, 2006.
+# Hamed Malek <hamed@farsiweb.info>, 2005.
+# Meelad Zakaria <meelad@farsiweb.info>, 2006
+msgid ""
+msgstr ""
+"Project-Id-Version: glib HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-09-04 18:36+0330\n"
+"Last-Translator: Roozbeh Pournader <roozbeh@farsiweb.info>\n"
+"Language-Team: Persian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "مشخصهٔ غیرمنتظرهٔ «%s» برای عنصر «%s»"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "مشخصهٔ «%s» برای عنصر «%s» پیدا نشد"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "برچسب غیرمنتظرهٔ «%s»، برچسب «%s» انتظار می‌رفت"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "برچسب غیرمنتظرهٔ «%s» داخل «%s»"
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "پروندهٔ چوب‌الف معتبری در شاخه‌های داده پیدا نمی‌شود"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "چوب‌الفی برای نشانی «‎%s» از قبل موجود است"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "چوب‌الفی برای نشانی «‎%s» پیدا نشد"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "هیچ نوع MIME در چوب‌الف برای نشانی «‎%s» تعریف نشده است"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "پرچم خصوصی‌ای برای چوب‌الف برای نشانی «%s» تعریف نشده است"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "گروهی در چوب‌الف برای نشانی «‎%s» تعیین نشده است"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "برنامه‌ای با نام «%s» چوب‌الفی برای «‎%s» ثبت نکرده است"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "خواندن پیوند نمادی «‎%s» شکست خورد: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "تبدیل از مجموعه‌نویسهٔ «%s» به «%s» پشتیبانی نمی‌شود"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "نمی‌توان مبدل «%s» به «%s» را باز کرد"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "دنبالهٔ بایتی نامعتبر در ورودی تبدیل"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "خطا در حین تبدیل: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "دنباله نویسهٔ ناتمام در انتهای ورودی"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "نمی‌توان عقب‌نشینی «%s» را به مجموعه کد «%s» تبدیل کرد"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "نشانی «‎%s» یک نشانی اینترنتی مطلق با شِمای «پرونده» نیست"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "نشانی پروندهٔ محلی «‎%s» نمی‌تواند «#» داشته باشد"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "نشانی اینترنتی «%s» نامعتبر است"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "نام میزبان نشانی اینترنتی «‎%s» نامعتبر است"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "نشانی اینترنتی «‎%s» نویسه‌های گریختهٔ نامعتبر دارد"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "نام مسیر «‎%s» یک مسیر مطلق نیست"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "نام میزبان نامعتبر"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "خطا در باز کردن شاخهٔ «‎%s»‏: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "نمی‌توان %Ilu بایت برای خواندن پروندهٔ «‎%s» تخصیص داد"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "خواندن از پروندهٔ «‎%s» شکست خورد: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "باز کردن پروندهٔ «‎%s» شکست خورد: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "گرفتن مشخصه‌های پروندهٔ «‎%s» شکست خورد: fstat()‎ شکست خورد: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "باز کردن پروندهٔ «‎%s» شکست خورد: fdopen()‎ شکست خورد: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "تغییر دادن نام پروندهٔ «‎%s» به «‎%s» شکست خورد: g_rename()‎ شکست خورد: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "ایجاد پروندهٔ «‎%s» شکست خورد: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "باز کردن پروندهٔ «‎%s» برای نوشتن شکست خورد: fdopen()‎ شکست خورد: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "نوشتن پروندهٔ «‎%s» شکست خورد: fdwrite()‎ شکست خورد: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "بستن پروندهٔ «‎%s» شکست خورد: fclose()‎ شکست خورد: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "نمی‌توان پروندهٔ موجود «‎%s» را جذف کرد: g_unlink() شکست خورد: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "قالب «%s» نامعتبر است، نباید «%s» داشته باشد"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "قالب «%s» حاوی XXXXXX نیست"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "خواندن پیوند نمادی «‎%s» شکست خورد: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "پیوندهای نمادی پشتیبانی نمی‌شوند"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "نمی‌توان مبدل «%s» به «%s» را باز کرد: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "نمی‌توان در g_io_channel_read_line_string خوانش خام انجام داد"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "دادهٔ تبدیل‌نشده در میان‌گیر خواندن باقی مانده است"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "کانال با یک نویسهٔ ناتمام پایان می‌یابد"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "نمی‌توان در g_io_channel_read_to_end خوانش خام انجام داد"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "باز کردن پروندهٔ «‎%s» شکست خورد: open()‎ شکست خورد: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "تهیهٔ نقشه از پروندهٔ «‎%s» شکست خورد: mmap()‎ شکست خورد: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "خطا در سطر %Id نویسهٔ %Id:‏ %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "خطا در سطر %Id:‏ %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"نهاد خالی «‎&;‎» مشاهده شد؛ نهادهای معتبر عبارتند از: ‎&amp; &quot; &lt; &gt; "
+"&apos;‎"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"نویسهٔ «%s» در ابتدای نام نهادها مجاز نیست؛ نویسهٔ & نهاد را آغاز می‌کند؛ اگر "
+"این علامت & قرار نیست نهاد شود، به‌جای آن از ‎&amp;‎ استفاده کنید"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "نویسهٔ «%s» داخل نام نهادها مجاز نیست"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "نام نهاد «%s» شناخته نیست"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"نهاد با یک نقطه‌ویرگول لاتین تمام نشده است؛ به احتمال زیاد بدون این که "
+"بخواهید نهادی را آغاز کنید از نویسهٔ & استفاده کرده‌اید - برای نوشتن علامت & "
+"از ‎&amp;‎ استفاده کنید"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"تجزیهٔ «‎%-.*s»، که باید رقمی داخل یک ارجاع نویسه‌ای (مثل ‎&#234;‎) می‌بود شکست "
+"خورد - شاید رقم خیلی بزرگ است"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "ارجاع نویسه‌ای «‎%-.*s» به نویسهٔ مجاز اشاره نمی‌کند"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "ارجاع نویسه‌ای خالی؛ باید یک رقم داشته باشد، مثل ‎&#454;‎"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"ارجاع نویسه‌ای با نقطه‌ویرگول تمام نشده است؛ به احتمال زیاد بدون این که "
+"بخواهید نهادی را آغاز کنید از نویسهٔ & استفاده کرده‌اید - برای نوشتن علامت & "
+"از ‎&amp;‎ استفاده کنید"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "ارجاع نهادی ناتمام"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "ارجاع نویسه‌ای ناتمام"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "متن کدگذاری‌شدهٔ UTF-8 نامعتبر"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "نوشتار باید با یک عنصر (مثلاً <book>) شروع شود"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"‏«%s» پس از یک نویسهٔ '‎<‎' نویسهٔ مجازی نیست؛ نمی‌شود ابتدای نام یک عنصر باشد"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"نویسهٔ غیرعادی «%s»، برای پایان دادن به برچسب شروع عنصر «%s» انتظار یک نویسهٔ "
+"«‎>‎» می‌رفت"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"نویسهٔ غیرعادی «%s»، بعد از نام مشخصهٔ «%s» عنصر «%s» انتظار یک نویسهٔ «=» می‌رفت"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"نویسهٔ غیرعادی «%s»، برای پایان دادن به برچسب شروع عنصر «%s»، همین‌طور یک "
+"مشخصه، انتظار یک نویسهٔ «‎>‎» یا «/» می‌رفت؛ شاید از یک نویسهٔ نامعتبر در نام "
+"مشخصه‌ای استفاده کرده باشید"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"نویسهٔ غیرعادی «%s»، هنگام مقدار دادن به مشخصهٔ «%s» از عنصر «%s» پس از علامت "
+"تساوی انتظار یک علامت نقل قول باز می‌رفت"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"‏«%s» بعد از نویسه‌های «‎</‎» نویسهٔ معتبری نیست؛ «%s» نمی‌تواند ابتدای نام عناصر "
+"قرار بگیرد"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr "‏«%s» نویسهٔ معتبری برای بستن نام عنصر «%s» نیست؛ نویسهٔ مجاز «‎>» است"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "عنصر «%s» بسته بود، در حال حاضر هیچ عنصری باز نیست"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "عنصر «%s» بسته بود، ولی عنصری که در حال حاضر باز است «%s» است"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "نوشتار خالی است یا فقط فاصلهٔ خالی دارد"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "نوشتار به‌طور غیرمنتظره‌ای درست بعد از یک علامت کوچکتر '‎<‎' پایان یافت"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"نوشتار وقتی که هنوز عناصری باز بودند به‌طور غیرمنتظره‌ای پایان یافت ‐ آخرین "
+"عنصر باز شده «%s» بود"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"نوشتار به‌طور غیرمنتظره‌ای پایان یافت، یک علامت بزرگتر برای بستن برچسب ‎<%s/>‎ "
+"انتظار می‌رفت"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل نام یک عنصر به‌پایان رسید"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل نام یک مشخصه به‌پایان رسید"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل یک برچسب عنصربازکن پایان یافت."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"نوشتار به‌طور غیرمنتظره‌ای بعد از علامت تساوی‌ای که پس از نام مشخصه‌ای آمده بود "
+"تمام شد؛ بدون مقدار برای مشخصه"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل مقدار یک مشخصه به‌پایان رسید"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل برچسب بستن عنصر «%s» پایان یافت"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"نوشتار به‌طور غیرمنتظره‌ای داخل یک توضیح یا دستورالعمل پردازشی پایان یافت"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "خطا در سطر %Id نویسهٔ %Id:‏ %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "ارجاع نهادی ناتمام"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "متن نقل شده با علامت نقل قول شروع نمی‌شود"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "علامت نقل قول تکی در سطر دستور یا متون داخل پوستهٔ دیگر"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "متن دقیقاً پس از یک نویسهٔ «\\» پایان یافت. (متن عبارت بود از «%s»)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"متن پیش از آن که علامت نقل قول متناظر برای %c پیدا شود پایان یافت. (متن "
+"عبارت بود از «%s»)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "متن خالی بود (یا فقط فاصلهٔ خالی داشت)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "خواندن داده‌ها از فراروند فرزند شکست خورد"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "ایجاد لوله برای ارتباط با فراروند فرزند شکست خورد (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "خواندن از لولهٔ فرزند شکست خورد (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "تغییر به شاخهٔ «%s» شکست خورد (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "اجرای فراروند فرزند شکست خورد (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "نام برنامهٔ نامعتبر: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "رشتهٔ نامعتبر در بردار آرگومان درآیهٔ %Id: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "رشتهٔ نامعتبر در محیط: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "شاخهٔ کاری نامعتبر‏: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "اجرای برنامهٔ راهنما (‎%s) شکست خورد"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"خطای غیرمنتظره در g_io_channel_win32_poll()‎ هنگام خواندن داده‌ها از یک "
+"فراروند فرزند"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "خواندن داده‌ها از فراروند فرزند شکست خورد (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"خطای غیرمنتظره در select()‎ هنگام خواندن داده‌ها از یک فراروند فرزند (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "خطای غیرمنتظره در waitpid()‎ ‏(%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "انشعاب شکست خورد (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "اجرای فراروند فرزند «%s» شکست خورد (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "تغییر مسیر خروجی یا ورودی فراروند فرزند شکست خورد (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "انشعاب فراروند فرزند شکست خورد (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "خطای ناشناخته هنگام اجرای فراروند فرزند «%s»"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "خواندن دادهٔ کافی از لولهٔ pid فرزند شکست خورد (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "نویسهٔ خارج از محدوده برای UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "دنبالهٔ نامعتبر در ورودی تبدیل"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "نویسهٔ خارج از محدوده برای UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "روش استفاده:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[گزینه...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "گزینه‌های راهنما:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "نمایش گزینه‌های راهنما"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "نمایش همهٔ گزینه‌های راهنما"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "گزینه‌های برنامه:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "نمی‌توان مقدار صحیح «%s» برای %s را تجزیه کرد"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "مقدار صحیح «%s» خارج از محدودهٔ %s است"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "نمی‌توان مقدار صحیح با دقت مضاعف «%s» برای %s را تجزیه کرد"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "مقدار صحیح با دقت مضاعف «%s» خارج از محدودهٔ %s است"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "خطا در تجزیهٔ گزینهٔ %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "‏%s یک آرگومان کم دارد"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "گزینهٔ نامعلوم %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "پروندهٔ کلید معتبر در شاخه‌های داده یافت نمی‌شود"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "پرونده متعارف نیست"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "پرونده خالی است"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr "پرونده کلید حاوی خط «%s» است که جفت کلید‐مقدار، گروه یا توضیح نیست"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "نام برنامهٔ نامعتبر: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "پروندهٔ کلید با یک گروه آغاز نمی‌شود"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "نام برنامهٔ نامعتبر: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "پروندهٔ کلید حاوی کدگذاری پشتیبانی نشدهٔ «%s» است"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "پروندهٔ کلید گروه «%s» را ندارد"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "پروندهٔ کلید، کلید «%s» را ندارد"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "پروندهٔ کلید حاوی کلید «%s» با مقدار «%s» است که UTF-8 نیست"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "پروندهٔ کلید حاوی کلید «%s» است که مقداری دارد که قابل تفسیر نیست."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"پروندهٔ کلید حاوی کلید «%s» در گروه «%s» است که مقداری دارد که قابل تفسیر نیست"
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "پروندهٔ کلید، کلید «%s» در گروه «%s» را ندارد"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "پرونده کلید شامل نویسهٔ گریز در انتهای خط است"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "پروندهٔ کلید حاوی دنبالهٔ گریز نامعتبر «%s» است"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "مقدار «%s» را نمی‌توان به عدد تفسیر کرد"
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "مقدار صحیح «%s» خارج از محدوده است"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "مقدار «%s» را نمی‌توان به عدد اعشاری تفسیر کرد"
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "مقدار «%s» را نمی‌توان به مقدار بولی تفسیر کرد"
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "باز کردن پروندهٔ «%s» شکست خورد: fdopen()‎ شکست خورد: %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "نمی‌توان %Ilu بایت برای خواندن پروندهٔ «%s» تخصیص داد"
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "باز کردن پروندهٔ «%s» شکست خورد: fdopen()‎ شکست خورد: %s"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "تبدیل از مجموعه‌نویسهٔ «%s» به «%s» پشتیبانی نمی‌شود"
+
+#~ msgid "Incorrect message size"
+#~ msgstr "اندازهٔ پیغام نادرست است"
+
+#~ msgid "Socket error"
+#~ msgstr "خطای سوکت"
+
+#~ msgid "Channel set flags unsupported"
+#~ msgstr "نشان‌های تنظیم‌شده توسط کانال، پشتیبانی نمی‌شوند"
diff --git a/trunk/po/fi.po b/trunk/po/fi.po
new file mode 100644
index 000000000..a8a68619a
--- /dev/null
+++ b/trunk/po/fi.po
@@ -0,0 +1,976 @@
+# Finnish messages for glib.
+# Copyright © 2002 Free Software Foundation, Inc.
+# Lauri Nurmi <lanurmi@iki.fi>, 2002-2004,
+# Sami Pesonen <sampeson@iki.fi>, 2004-2005.
+# Ilkka Tuohela <hile@iki.fi>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-09 15:58+0300\n"
+"Last-Translator: Ilkka Tuohela <hile@iki.fi>\n"
+"Language-Team: Finnish <gnome-fi-laatu@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Odottamaton ominaisuus \"%s\" elementille \"%s\""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Ominaisuutta \"%s\" elementille \"%s\" ei löydy"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Odottamaton merkintä \"%s\", odotettiin merkintää \"%s\""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Odottamaton merkintä \"%s\" kohdassa \"%s\""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Kelvollista kirjanmerkkitiedostoa ei löytynyt datahakemistoista"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "URI:lle \"%s\" on jo olemassa kirjanmerkki"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "URI:lle \"%s\" ei löydy kirjanmerkkiä"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "URI:n \"%s\" kirjanmerkissä ei ole määritelty MIME-tyyppiä"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "URI:n \"%s\" kirjanmerkissä ei ole määritelty yksityisyyslippua"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "URI:n \"%s\" kirjanmerkissä ei ole asetettu ryhmiä"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+"Sovellus nimeltä \"%s\" ei rekisteröinyt kirjanmerkkiä kohteelle \"%s\""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Symbolisen linkin \"%s\" lukeminen epäonnistui: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Muunnos merkistöstä \"%s\" merkistöön \"%s\" ei ole tuettu"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Muunninta merkistöstä \"%s\" merkistöön \"%s\" ei voitu avata"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Virheellinen tavusarja muunnettavassa syötteessä"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Virhe muunnoksen aikana: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Osittainen tavusarja syötteen lopussa"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Koodausmerkkijonoa \"%s\" ei voi muuntaa merkistöön \"%s\""
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI \"%s\" ei ole absoluuttinen URI \"file\"-muodossa"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Paikallinen tiedosto-URI \"%s\" ei saa sisältää merkkiä \"#\""
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI \"%s\" on virheellinen"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "URI:n \"%s\" isäntänimi on virheellinen"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI \"%s\" sisältää virheellisesti suojattuja merkkejä"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Polku \"%s\" ei ole absoluuttinen"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Virheellinen isäntänimi"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Virhe hakemiston \"%s\" avaamisessa: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Ei voitu varata %lu tavua muistia tiedoston \"%s\" lukemiseksi"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Virhe tiedoston \"%s\" lukemisessa: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Lukeminen tiedostosta \"%s\" epäonnistui: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Tiedoston \"%s\" avaaminen epäonnistui: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"Tiedoston \"%s\" ominaisuuksien lukeminen epäonnistui: fstat() epäonnistui: %"
+"s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Tiedoston \"%s\" avaaminen epäonnistui: fdopen() epäonnistui: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Tiedoston \"%s\" uudelleen nimeäminen nimelle \"%s\" epäonnistui: g_rename() "
+"epäonnistui: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Tiedoston \"%s\" luominen epäonnistui: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"Tiedoston \"%s\" avaaminen kirjoitettavaksi epäonnistui: fdopen() "
+"epäonnistui: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Tiedoston \"%s\" kirjoittaminen epäonnistui: fwrite() epäonnistui: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Tiedoston \"%s\" sulkeminen epäonnistui: fclose() epäonnistui: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+"Olemassaolevan tiedoston \"%s\" poisto epäonnistui: g_unlink epäonnistui: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Malli \"%s\" on virheellinen, se ei saa sisältää merkkijonoa \"%s\""
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Malli \"%s\" ei sisällä merkkijonoa XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Symbolisen linkin \"%s\" lukeminen epäonnistui: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Symbolisia linkkejä ei tueta"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Muunninta merkistöstä \"%s\" merkistöön \"%s\" ei voitu avata: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"Funktiossa g_io_channel_read_line_string ei voi suorittaa raakalukemista"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Jäljelle jäänyt muuntamaton data lukupuskurissa"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanava päättyy osittaiseen merkkiin"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Funktiossa g_io_channel_read_to_end ei voi suorittaa raakalukemista"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Tiedoston \"%s\" avaaminen epäonnistui: open() epäonnistui: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Tiedoston \"%s\" mappaaminen epäonnistui: mmap() epäonnistui: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Virhe rivillä %d, kohdassa %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Virhe rivillä %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Havaittu tyhjä entiteetti \"&;\"; kelvolliset ovat: &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Merkki \"%s\" ei ole kelvollinen entiteetin nimen alussa; &-merkki aloittaa "
+"entiteetin. Jos tämän &-merkin ei ole tarkoitus olla entiteetti, käytä "
+"merkintää &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Merkki \"%s\" ei ole kelvollinen entiteetin nimessä"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Entiteetin nimi \"%s\" on tuntematon"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entiteetti ei päättynyt puolipisteeseen; todennäköisesti käytit &-merkkiä "
+"aikomatta aloittaa entiteettiä - käytä merkintää &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Merkkijonon \"%-.*s\" piti olla luku merkkiviitteen sisällä (esim. &#234;), "
+"mutta sen jäsentäminen epäonnistui - ehkä luku on liian suuri"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Merkkiviite \"%-.*s\" ei ole sallitun merkin koodaus"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Tyhjä merkkiviite; viitteen tulee sisältää luku, esim &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Merkkiviite ei päättynyt puolipisteeseen; todennäköisesti käytit &-merkkiä "
+"aikomatta aloittaa entiteettiä - käytä merkintää &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Päättämätön entiteettiviite"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Päättämätön merkkiviite"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Virheellinen UTF-8-merkistöinen teksti"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Asiakirjan on alettava elementillä (esim. <kirja>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"\"%s\" ei ole kelvollinen merkki \"<\"-merkin jälkeen; se ei voi aloittaa "
+"elementin nimeä"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Pariton merkki \"%s\", odotettiin \">\"-merkkiä päättämään elementin \"%s\" "
+"alkulippu"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Pariton merkki \"%1$s\", odotettiin \"=\"-merkkiä elementin \"%3$s\" "
+"ominaisuuden \"%2$s\" jälkeen"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Pariton merkki \"%s\", odotettiin merkkiä \">\" tai \"/\" päättämään "
+"elementin \"%s\" aloituslippu, tai mahdollista ominaisuutta; käytit ehkä "
+"ominaisuuden nimessä siihen kelpaamatonta merkkiä"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Pariton merkki \"%1$s\", odotettiin avaavaa lainausmerkkiä yhtäsuuruusmerkin "
+"jälkeen annettaessa elementin \"%3$s\" ominaisuuden \"%2$s\" arvoa"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"\"%s\" ei ole kelvollinen merkki merkkien \"</\" jälkeen; \"%s\" ei voi olla "
+"elementin nimen alussa"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"\"%s\" ei ole kelvollinen merkki sulkuelementin \"%s\" jälkeen; sallittu "
+"merkki on \">\""
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Elementti \"%s\" on suljettu, ei avoimia elementtejä"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"Elementti \"%s\" on suljettu, mutta tällä hetkellä on avoinna elementti \"%s"
+"\""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Asiakirja oli tyhjä tai sisälsi vain tyhjiä merkkejä"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Asiakirja loppui odottamattomasti heti avoimen kulmasulkeen \"<\" jälkeen"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Asiakirja loppui odottamattomasti elementtien ollessa sulkematta - \"%s\" "
+"oli viimeinen avattu elementti"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Asiakirja loppui odottamattomasti, odotettiin lipun <%s/> sulkevaa "
+"kulmasuljetta"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Asiakirja loppui odottamattomasti elementin nimen kohdalla"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Asiakirja loppui odottamattomasti ominaisuuden nimen kohdalla"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Asiakirja loppui odottamattomasti elementin avauslipun kohdalla"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Asiakirja loppui odottamattomasti ominaisuuden nimen jälkeisen "
+"yhtäsuuruusmerkin jälkeen; ominaisuudella ei ole arvoa"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Asiakirja loppui odottamattomasti ominaisuuden arvon kohdalla"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Asiakirja loppui odottamattomasti elementin \"%s\" sulkulipun kohdalla"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Asiakirja loppui odottamattomasti kommentin tai käsittelykomennon kohdalla"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Virhe rivillä %d, kohdassa %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Päättämätön entiteettiviite"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Lainattu teksti ei ala lainausmerkillä"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Pariton lainausmerkki komentorivillä tai muussa kuorisuojatussa tekstissä"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Teksti loppui aivan merkin \"\\\" jälkeen. (Teksti oli \"%s\")"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Teksti loppui ennen kuin löytyi merkkiä %c vastaava lainausmerkki. (Teksti "
+"oli \"%s\")"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Teksti oli tyhjä (tai sisälsi vain tyhjiä merkkejä)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Datan lukeminen lapsiprosessilta epäonnistui"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+"Putken luominen lapsiprosessin kanssa viestintää varten epäonnistui (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Lukeminen lapsiprosessin putkesta epäonnistui (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Hakemistoon \"%s\" siirtyminen epäonnistui (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Lapsiprosessin käynnistys epäonnistui (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Virheellinen ohjelman nimi: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Virheellinen merkkijono argumenttivektorin kohdassa %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Virheellinen merkkijono ympäristössä: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Virhe työhakemisto: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Apuohjelman suoritus epäonnistui (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Odottamaton virhe funktiossa g_io_channel_win32_poll() luettaessa dataa "
+"lapsiprosessilta"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Datan lukeminen lapsiprosessilta epäonnistui (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Odottamaton virhe funktiossa select() lapsiprosessilta dataa luettaessa (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Odottamaton virhe funktiossa waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Haarauttaminen epäonnistui (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Lapsiprosessin \"%s\" käynnistäminen epäonnistui (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Lapsiprosessin tulosteen tai syötteen uudelleenohjaus epäonnistui (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Lapsiprosessin haarauttaminen epäonnistui (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Tuntematon virhe käynnistettäessä lapsiprosessia \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Lapsiprosessin pid-putkesta ei voitu lukea riittävästi dataa (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Merkki on sallitun UTF-8-välin ulkopuolella"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Virheellinen sarja muunnettavassa syötteessä"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Merkki on sallitun UTF-16-välin ulkopuolella"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Käyttö:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[VALITSIN...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Ohjevalitsimet:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Näytä ohjevalitsimet"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Näytä kaikki ohjevalitsimet"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Sovelluksen valitsimet:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Kokonaislukua \"%s\" ei voida tulkita kohteelle %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Kokonaisluku \"%s\" kohteelle %s on ylittää sallitun alueen"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Kokonaislukua \"%s\" ei voida tulkita kohteelle %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Double-arvo \"%s\" kohteelle %s ylittää sallitun alueen"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Virhe käsiteltäessä valitsinta %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Puuttuva argumentti kohteelle %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Tuntematon optio %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Kelvollista avaintiedostoa ei löytynyt datahakemistoista"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Ei tavallinen tiedosto"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Tiedosto on tyhjä"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Avaintiedosto sisältää rivin \"%s\", joka ei ole avain-arvopari, ryhmä tai "
+"kommentti"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Virheellinen ohjelman nimi: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Avaintiedosto ei ala ryhmällä"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Virheellinen ohjelman nimi: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Avaintiedosto sisältää epäkelvon koodauksen \"%s\""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Avaintiedostossa ei ole ryhmää \"%s\""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Avaintiedostossa ei ole avainta \"%s\""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Avaintiedosto sisältää avaimen \"%s\" arvolla \"%s\", joka ei ole UTF-8 "
+"merkkijono"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "Avaintiedosto sisältää avaimen \"%s\", jonka arvoa ei voida tulkita."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Avaintiedosto sisältää avaimen \"%s\", jonka arvoa ei voida tulkita, "
+"ryhmässä \"%s\"."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "AVaintiedostossa ei ole avainta \"%s\" ryhmässä \"%s\""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Avaintiedosto sisältää escape-jonon rivin lopussa"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Avaintiedostossa on virheellinen escape-jono \"%s\""
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Arvoa \"%s\" ei voida tulkita numeroksi."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Kokonaisluku \"%s\" on sallitun alueen ulkopuolella"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Arvoa \"%s\" ei voida tulkita liukuluvuksi."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Arvoa \"%s\" ei voida turkita totuusarvoksi."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr ""
+#~ "Tiedoston oikeuksien muuttaminen epäonnistui: fork() epäonnistui: %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr ""
+#~ "Tiedoston oikeuksien muuttaminen epäonnistui: waitpid() epäonnistui: %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr ""
+#~ "Tiedoston oikeuksien muuttaminen epäonnistui: chmod() epäonnistui: %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr ""
+#~ "Tiedoston oikeuksien muuttaminen epäonnistui: lapsiprosessi keskeytettiin "
+#~ "signaaliin: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr ""
+#~ "Tiedoston oikeuksien muuttaminen epäonnistui: lapsiprosessi keskeytti "
+#~ "odottamatta."
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Muunnos merkistöstä \"%s\" merkistöön \"%s\" ei ole tuettu"
+
+#~ msgid "Incorrect message size"
+#~ msgstr "Virheellinen viestin koko"
+
+#~ msgid "Socket error"
+#~ msgstr "Pistokevirhe"
+
+#~ msgid "Channel set flags unsupported"
+#~ msgstr "Kanavalipun asetusta ei ole tuettu"
diff --git a/trunk/po/fr.po b/trunk/po/fr.po
new file mode 100644
index 000000000..47dfdf817
--- /dev/null
+++ b/trunk/po/fr.po
@@ -0,0 +1,977 @@
+# French translation of glib.
+# Copyright (C) 2001-2006 Free Software Foundation, Inc.
+# This file is distributed under the same license as the glib package.
+#
+# maintainer: Christophe Merlet (RedFox) <redfox@redfoxcenter.org>, 2001-2006.
+# Benoît Dejean <TazForEver@dlfp.org>, 2005.
+# Jonathan Ernst <jonathan@ernstfamily.ch>, 2006.
+# Robert-André Mauchin <zebob.m@gmail.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib 2.12.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-26 16:53+0200\n"
+"Last-Translator: Robert-André Mauchin <zebob.m@gmail.com>\n"
+"Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Attribut « %s » inattendu pour l'élément « %s »"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "L'attribut « %s » de l'élément « %s » est introuvable"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Balise « %s » inattendue. La balise « %s » était attendue"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Balise « %s » inattendue à l'intérieur de « %s »"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+"Impossible de trouver un fichier de signets valide dans les répertoires de "
+"données"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Un signet pour l'URI « %s » existe déjà"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Aucun signet trouvé pour l'URI « %s »"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Aucun type MIME défini dans le signet pour l'URI « %s »"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Aucun indicateur privé n'est défini dans le signet pour l'URI « %s »"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Aucun groupe n'est défini dans le signet pour l'URI « %s »"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Aucune application nommée « %s » n'a enregistré un signet pour « %s »"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "La lecture du lien symbolique « %s » a échoué : %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr ""
+"La conversion du jeu de caractères « %s » vers « %s » n'est pas supportée"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Impossible d'ouvrir le convertisseur de « %s » vers « %s »"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Séquence d'octets non valide en entrée du convertisseur"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Erreur lors de la conversion : %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Séquence partielle de caractères à la fin de l'entrée"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Impossible de convertir le fallback « %s » vers le jeu de codes « %s »"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+"L'URI « %s » n'est pas une URI absolue utilisant le schéma de « fichier »"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "L'URI de fichier local « %s » ne peut pas inclure de caractère « # »"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "L'URI « %s » n'est pas valide"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Le nom d'hôte de l'URI « %s » n'est pas valide"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "L'URI « %s » contient des caractères d'échappements non valides"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Le chemin « %s » n'est pas un chemin absolu"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Nom d'hôte non valide"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Erreur à l'ouverture du répertoire « %s » : %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Impossible d'allouer %lu octets pour lire le fichier « %s »"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Erreur de lecture du fichier « %s » : %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "La lecture depuis le fichier « %s » a échoué : %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "L'ouverture du fichier « %s » a échoué : %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"L'obtention des attributs du fichier « %s » a échoué : fstat() a échoué : %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "L'ouverture du fichier « %s » a échoué : fdopen() a échoué : %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Le renommage du fichier « %s » vers « %s » a échoué : g_rename() a échoué : %"
+"s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "La création du fichier « %s » a échoué : %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"L'ouverture du fichier « %s » en écriture a échoué : fdopen() a échoué : %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr ""
+"L'ouverture du fichier « %s » en écriture a échoué : fwrite() a échoué : %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "La fermeture du fichier « %s » a échoué : fclose() a échoué : %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+"Le fichier existant « %s » ne peut pas être supprimé : g_unlink() a échoué : "
+"%s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr ""
+"Le modèle « %s » n'est pas valide, il ne devrait pas contenir de « %s »"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Le modèle « %s » ne contient pas XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "La lecture du lien symbolique « %s » a échoué : %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Liens symboliques non pris en charge"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Impossible d'ouvrir le convertisseur de « %s » vers « %s » : %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"Impossible de faire une lecture brute dans g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Laisse de coté des données non converties dans le tampon de lecture"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "La canal se termine avec un caractère partiel"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Impossible de faire une lecture brut dans g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "L'ouverture du fichier « %s » a échoué : open() a échoué : %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Le mappage du fichier « %s » a échoué : mmap() a échoué : %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Erreur à la ligne %d caractère %d : %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Erreur à la ligne %d : %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Entité vide « &; » vue : les entités valides sont : &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Le caractère « %s » n'est pas valide au début d'un nom d'entité ; le "
+"caractère & commence une entité ; si l'esperluette n'est pas supposée être "
+"une entité, échappez-le comme &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Le caractère « %s » n'est pas valide à l'intérieur d'un nom d'entité"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Le nom d'entité « %s » n'est pas connu"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"L'entité ne se termine pas avec un point-virgule ; vous avez probablement "
+"utilisé une esperluette sans l'avoir marquée comme entité - échappez "
+"l'esperluette comme &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"L'analyse a échoué. « %-.*s » devrait être un nombre à l'intérieur de la "
+"référence de caractère (&#234; par exemple) - peut-être que le nombre est "
+"trop grand"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "La référence de caractère « %-.*s » n'encode pas un caractère autorisé"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Référence de caractère vide ; devrait inclure un nombre comme &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"La référence de caractère ne se termine pas avec un point-virgule ; vous "
+"avez vraisemblablement utilisé une esperluette sans intention de commencer "
+"une entité - échappez l'esperluette comme &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Référence d'entité non terminée"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Référence de caractère non terminée"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Texte codé en UTF-8 non valide"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Le document doit commencer avec un élément (par ex. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"« %s » n'est pas un caractère valide suivant le caractère « < » ; il ne "
+"semble pas commencer un nom d'élément"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Caractère bizarre « %s », un caractère « > » est requis pour terminer la "
+"balise de début de l'élément « %s »"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Caractère bizarre « %s », un caractère « = » est requis après le nom de "
+"l'attribut « %s » de l'élément « %s »"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Caractère bizarre « %s », un caractère « > » ou « / » est requis pour "
+"terminer la balise de début de l'élément « %s », ou optionnellement un "
+"attribut ; peut-être que vous utilisez un caractère non valide dans un nom "
+"d'attribut"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Caractère bizarre « %s », un guillemet d'ouverture après le signe égal est "
+"requis quand on donne une valeur pour l'attribut « %s » de l'élément « %s »"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"« %s » n'est pas un caractère valide suivant les caractères « </ » ; « %s » "
+"ne peut pas commencer un nom d'élément"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"« %s » n'est pas un caractère valide suivant le nom l'élément de fermeture "
+"« %s » ; le caractère autorisé est « > »"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "L'élément « %s » a été fermé, aucun élément est actuellement ouvert"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"L'élément « %s » a été fermé, mais l'élément actuellement ouvert est « %s »"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Le document était vide ou ne contenait que des espaces"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Le document s'est terminé de manière inattendue juste après un « < »"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Le document s'est terminé de manière inattendue avec des éléments encore "
+"ouverts - « %s » était le dernier élément ouvert"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Le document s'est terminé de manière inattendue, un caractère de fermeture "
+"pour la balise <%s/> est requis"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr ""
+"Le document s'est terminé de manière inattendue à l'intérieur d'un nom "
+"d'élément"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr ""
+"Le document s'est terminé de manière inattendue à l'intérieur d'un nom "
+"d'attribut"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+"Le document s'est terminé de manière inattendue à l'intérieur d'une balise "
+"d'ouverture d'élément."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Le document s'est terminé de manière inattendue après le signe égal suivant "
+"un nom d'attribut ; aucune valeur d'attribut"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+"Le document s'est terminé de manière inattendue alors qu'il était à "
+"l'intérieur d'une valeur d'attribut"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Le document s'est terminé de manière inattendue à l'intérieur de la balise "
+"de fermeture pour l'élément « %s »"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Le document s'est terminé de manière inattendue à l'intérieur d'un "
+"commentaire ou d'une instruction de traitement"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Erreur à la ligne %d caractère %d : %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Référence d'entité non terminée"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Le texte cité ne commence pas avec un caractère de citation"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Caractère de citation sans correspondance dans la ligne de commande ou un "
+"autre texte shell rapporté"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr ""
+"Le texte s'est terminé juste après un caractère « \\ ». (Le texte était « %"
+"s »)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Le texte s'est terminé avant qu'un caractère de citation soit trouvé pour %"
+"c. (Le texte était « %s »)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Le texte était vide (ou ne contenait que des espaces)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "La lecture des données depuis le processus fils a échoué"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+"La création du tube de communication avec le processus fils a échoué (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "La lecture depuis un tube fils a échoué (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Le changement de répertoire « %s » a échoué (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "L'exécution du processus fils a échoué (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Nom du programme invalide : %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Chaîne invalide dans le vecteur argument à %d : %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Chaîne invalide dans l'environnement : %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Répertoire de travail invalide : %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "L'exécution du programme d'aide a échoué (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Erreur inattendue dans g_io_channel_win32_poll() lors de la lecture des "
+"données depuis un processus fils"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "La lecture des données depuis le processus fils a échoué (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Erreur inattendue dans select() à la lecture des données depuis un processus "
+"fils (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Erreur inattendue dans waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Le fork a échoué (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "L'exécution du processus fils « %s » a échoué (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+"La redirection de la sortie ou de l'entrée du processus fils a échoué (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Le fork du processus fils a échoué (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Erreur inconnue à l'exécution du processus fils « %s »"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"Impossible de lire suffisamment de données depuis le tube du processus fils "
+"de pid (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Caractère hors des limites UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Séquence non valide dans l'entrée du convertisseur"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Caractère hors des limites UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Usage :"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Options de l'aide :"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Afficher les options de l'aide"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Afficher toutes les options de l'aide"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Options de l'application :"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Impossible d'analyser la valeur entière « %s » pour %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "La valeur entière « %s » pour %s est hors des limites"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Impossible d'analyser la valeur double « %s » pour %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "La valeur double « %s » pour %s est hors des limites"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Erreur lors de l'analyse de l'option %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Argument manquant pour %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Option inconnue %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+"Impossible de trouver un fichier de clés valide dans les répertoires de "
+"données"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Pas un fichier régulier"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Le fichier est vide"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Le fichier de clés contient la ligne « %s » qui n'est ni une paire clé-"
+"valeur, ni un groupe, ni un commentaire"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Nom du programme invalide : %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Le fichier de clés ne débute pas par un groupe"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Nom du programme invalide : %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+"Le fichier de clés contient un codage de caractères non pris en charge « %s »"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Le fichier de clés n'a pas de groupe « %s »"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Le fichier de clés n'a pas de clé « %s »"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Le fichier de clés contient la clé « %s » avec la valeur « %s » qui n'est "
+"pas de l'UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Le fichier de clés contient la clé « %s » avec une valeur impossible à "
+"interpréter."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Le fichier de clés contient la clé « %s » dans le groupe « %s » qui a une "
+"valeur impossible à interpréter."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Le fichier de clés ne contient pas de clé « %s » dans le groupe « %s »"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Le fichier de clés contient un caractère d'échappement en fin de ligne"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr ""
+"Le fichier de clés contient une séquence d'échappement non valide « %s »"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "La valeur « %s » ne peut pas être interprétée comme un nombre."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "La valeur entière « %s » est hors plage"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+"La valeur « %s » ne peut pas être interprétée comme un nombre à virgule "
+"flottante."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "La valeur « %s » ne peut pas être interprétée comme un booléen."
diff --git a/trunk/po/ga.po b/trunk/po/ga.po
new file mode 100644
index 000000000..891a7673e
--- /dev/null
+++ b/trunk/po/ga.po
@@ -0,0 +1,894 @@
+# Irish translation of glib strings
+# Copyright (C) 2002-2004 Free Software Foundation, Inc.
+# This file is distributed under the GPL.
+# Alastair McKinstry, <mckinstry@debian.org>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib HEAD \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2004-03-08 21:28+0000\n"
+"Last-Translator: Alastair McKinstry <mckinstry@debian.org>\n"
+"Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Teip ag cruthaigh comhad '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr ""
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr ""
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr ""
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Teip ar tiontaithe: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr ""
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr ""
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr ""
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "Is neambhailí an URI '%s'"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Is meamhbháilí an h-óstainm do URI '%s'"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr ""
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr ""
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Óstainm neamhbhailí"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Teip ag oscailt féilire '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr ""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Earraidh ag leámh comhad '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Teip ag leámh as comhad '%s: : %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Teip ag oscailt comhad '%s;: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Teip af oscailt comhad '%s': teipadh fdopen(): %s"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Teip af oscailt comhad '%s': teipadh fdopen(): %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Teip ag cruthaigh comhad '%s': %s"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Teip af oscailt comhad '%s': teipadh fdopen(): %s"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Teip af oscailt comhad '%s': teipadh fdopen(): %s"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Teip af oscailt comhad '%s': teipadh fdopen(): %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr ""
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr ""
+
+#: glib/gfileutils.c:1839
+#, fuzzy, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Teip ag cruthaigh comhad '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr ""
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr ""
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr ""
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr ""
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Teip af oscailt comhad '%s': teipadh fdopen(): %s"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Teip af oscailt comhad '%s': teipadh fdopen(): %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Earraidh ar líne %d char %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Earraidh ar líne %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr ""
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr ""
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr ""
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr ""
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr ""
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr ""
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr ""
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr ""
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr ""
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr ""
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr ""
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Earraidh ar líne %d char %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+msgid "unfinished symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr ""
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr ""
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr ""
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr ""
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Teip ag leámh as píopa páiste (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "Óstainm neamhbhailí"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr "Teip ag oscailt féilire '%s': %s"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Teipadh ar 'fork' (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Teipadh ar 'fork' (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr ""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr ""
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr ""
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr ""
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr ""
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr ""
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr ""
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Teip ar tiontaithe: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr ""
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr ""
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Óstainm neamhbhailí"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Óstainm neamhbhailí"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Teip af oscailt comhad '%s': teipadh fdopen(): %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Teip af oscailt comhad '%s': teipadh fdopen(): %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Teip af oscailt comhad '%s': teipadh fdopen(): %s"
diff --git a/trunk/po/gl.po b/trunk/po/gl.po
new file mode 100644
index 000000000..fcec399c1
--- /dev/null
+++ b/trunk/po/gl.po
@@ -0,0 +1,943 @@
+# translation of gl.po to Galego
+# translation of glib.glib-2-6.po to
+# Galician translation of GLib
+# Copyright (C) 2001, 2005, 2006, 2007 Free Software Foundation, Inc.
+#
+# Manuel A. Fernández Montecelo <manuel@sindominio.net>, 2001, 2005.
+# Ignacio Casal Quinteiro <nacho.resa@gmail.com>, 2005, 2006.
+# Ignacio Casal Quinteiro <icq@cvs.gnome.org>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: gl\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-05-19 17:21+0200\n"
+"Last-Translator: Ignacio Casal Quinteiro <icq@cvs.gnome.org>\n"
+"Language-Team: Galego <proxecto@trasno.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Atributo '%s' inesperado para o elemento '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "O atributo '%s' do elemento '%s' non se atopou"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Etiqueta '%s' inesperada, esperábase a etiqueta '%s'"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Etiqueta '%s' inesperada dentro de '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+"Non se puido atopar un ficheiro de marcadores válido nos directorios de datos"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Xa existe un marcador para a URI '%s'"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Non se atopou un marcador para a URI '%s'"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Ningún tipo MIME definido no marcador para a URI '%s'"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Non se definiu ningún flag privador no marcador para a URI '%s'"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Non se estableceu ningún grupo no marcador para a URI '%s'"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Ningunha aplicación con nome '%s' rexistrou un marcador para '%s'"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Fallo ao expandir a liña executable '%s' co URI '%s'"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Non está soportada a conversión do conxunto de caracteres '%s' a '%s'"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Non se puido abrir o conversor desde '%s' a '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Secuencia de bytes non válida na entrada da conversión"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Erro durante a conversión: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Secuencia parcial de caracter ao final da entrada"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Non se pode converter o por defecto (fallback) '%s' ao código '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "O URI '%s' non é un URI absoluto usando o esquema de ficheiro \"file\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "O URI de ficheiro local '%s' non pode incluir un '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "O URI '%s' non é válido"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "O nome do servidor no URI '%s' é inválido"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "A URI '%s' contén caracteres de escape non válidos"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "O nome de ruta '%s' non é unha ruta absoluta"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Nome de servidor inválido"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Erro abrindo o directorio '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Non se puideron asignar %lu bytes para ler o ficheiro \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Erro lendo o ficheiro '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Fallo ao ler desde o ficheiro '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Fallo ao abrir o ficheiro '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Fallo ao obter os atributos do ficheiro '%s': fstat() fallou: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Fallo ao abrir o ficheiro '%s': fdopen() fallou: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Fallou ao renomear o ficheiro '%s' a '%s': g_rename() fallou: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Fallo ao crear o ficheiro '%s': %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Fallo ao abrir o ficheiro '%s' para escribir: fdopen() fallou: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Fallo ao abrir o ficheiro '%s': fwrite() fallou: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Fallo ao abrir o ficheiro '%s': fclose() fallou: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "O arquivo existente '%s' non se puido eliminar: g_unlink() fallou: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "O modelo '%s' non é válido, non debería conter '%s'"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "O modelo '%s' non contén XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Fallo ao ler o enlace simbólico '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Enlaces simbólicos non soportados"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Non se puido abrir o conversor de '%s' a '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"Non se pode facer unha lectura crúa (raw) en g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Sobran datos non convertidos no buffer de lectura"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "A canle remata nun caracter parcial"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Non se pode facer unha lectura crúa (raw) en g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Fallo ao abrir o ficheiro '%s': open() fallou: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Fallo ao mapear o ficheiro '%s': mmap() fallou: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Erro na liña %d caracter %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Erro na liña %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Vista unha entidade baleira '&;'; entidades válidas son: &amp; &quot; &lt; "
+"&gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"O caracter '%s' non é válido ao comezo do nome dunha entidade, o caracter & "
+"comeza unha entidade; se se supón que non queres poñer unha entidade pon o & "
+"como &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "O caracter '%s' non é válido no nome dunha entidade"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Non se coñece o nome de entidade '%s'"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"A entidade non remata cun punto e coma, o máis seguro é que usase un "
+"caracter & sen intención de comezar unha entidade, se é así póñao como &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Fallo ao interpretar '%-.*s', que debería ser un díxito dentro dunha "
+"referencia de caracter (pex. &#234;) - quizais o díxito é longo de máis"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "A referencia de caracter '%-.*s' non codifica un caracter permitido"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+"Referencia de caracter baleira; debería incluír un díxito tal como &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"A referencia de caracter '%s' non remataba con punto e coma, o máis seguro é "
+"que usase un caracter & sen intención de comezar unha entidade - pon o & "
+"como &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Referencia a entidade sen rematar"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Referencia a carácter sen rematar"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Texto codificado en UTF-8 non válido"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "O documento debe comezar cun elemento (pex. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' non é un caracter válido seguindo ao caracter '<'; non pode estar ao "
+"comezo dun nome de elemento"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Caracter sobrante '%s', agardábase un caracter '>' para pechar a etiqueta de "
+"comezo do elemento '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Caracter sobrante '%s', agardábase un '=' despois do nome do atributo '%s' "
+"do elemento '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Caracter sobrante '%s', agardábase '>' ou '/' para pechar a etiqueta de "
+"comezo do elemento '%s', ou opcionalmente un atributo; quizais usou un "
+"caracter non válido no nome dun atributo"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Caracter sobrante '%s', agardábase un caracter '\"' despois do signo igual "
+"para dar un valor ao atributo '%s' do elemento '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' non é un caracter válido seguindo aos caracteres '</'; '%s' non pode "
+"comezar o nome dun elemento"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' non é un caracter válido para pechar o elemento de nome '%s'; o "
+"caracter permitido é '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Pechouse o elemento '%s', actualmente non hai ningún elemento aberto"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"Pechouse o elemento '%s', sen embargo o elemento aberto actualmente é '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "O documento estaba baleiro ou contiña namais espacios en branco"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "O documento rematou inesperadamente despois dun símbolo '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"O documento rematou inesperadamente con elementos ainda abertos - '%s' era o "
+"último elemento aberto"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"O documento rematou inesperadamente, agardábase ver un símbolo '>' pechando "
+"a etiqueta <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "O documento rematou inesperadamente dentro dun nome de elemento"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "O documento rematou inesperadamente dentro dun nome de atributo"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+"O documento rematou inesperadamente dentro dunha etiqueta de comezo de "
+"elemento"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"O documento rematou inesperadamente despois do signo igual seguindo a un "
+"nome de atributo; non hai valor para o atributo"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+"O documento rematou inesperadamente estando dentro dun valor de atributo"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"O documento rematou inesperadamente dentro da etiqueta que pechaba o "
+"elemento '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"O documento rematou inesperadamente dentro dun comentario ou instrucción de "
+"procesamento"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr "obxecto corrupto"
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr "erro interno ou obxecto corrupto"
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr "o patrón contén elementos non soportados para coincidencia parcial"
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr "erro interno"
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr "erro descoñecido"
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr "Erro tentando coincidir a expresión regular %s: %s"
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr "A biblioteca PCRE está compilada sen soporte UTF8"
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr "A biblioteca está compilada sen soporte de propiedades UTF8"
+
+#: glib/gregex.c:928
+#, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Erro ao compilar a expresión regular %s no carácter %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr "Erro ao optimizar a expresión regular %s: %s"
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr "esperábase un díxito hexadecimal ou '}'"
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr "esperábase un díxito hexadecimal"
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr "falta '<' na referencia simbólica"
+
+#: glib/gregex.c:1834
+msgid "unfinished symbolic reference"
+msgstr "referencia simbólica sen rematar"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr "referencia simbólica de lonxidude cero"
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr "esperábase un díxito"
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr "referencia simbólica ilegal"
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr "secuencia de espazo descoñecida"
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "O texto en forma citada non comenza cunha marca de cita"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Marca de cita non pechada en liña de comandos ou outro texto en forma de "
+"cita nunha shell"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "O texto rematou despois dun caracter '\\'. (O texto era '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"O texto rematou antes de atopar a comiña final para %c. (O texto era '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "O texto estaba baleiro (ou contiña espacios en branco namais)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Fallo ao ler datos de proceso fillo"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Fallo ao crear unha tubería para comunicarse con proceso fillo (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Fallo ao ler desde tubería filla (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Fallo ao cambiar ao directorio '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Fallo ao executar proceso fillo (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Nome de programa inválido: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Cadea inválida no vector do argumento en %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Cadea inválida no entorno: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Directorio de traballo inválido: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Fallou ao executar o programa auxiliar (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Erro non agardado en g_io_channel_win32_poll() lendo datos desde un proceso "
+"fillo"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Fallo ao ler datos de proceso fillo (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Erro non agargado en select() lendo datos dun proceso fillo (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Erro non agardado en waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Fallo ao bifurcar (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Fallo ao executar proceso fillo \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Fallo ao redirixir a saída ou entrada do proceso fillo (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Fallo ao bifurcar proceso fillo (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Erro descoñecido executando o proceso fillo \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"Fallo de lectura de suficientes datos desde a tubería filla con PID (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Caracter fóra de rango para UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Secuencia non válida na entrada da conversión"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Caracter fóra de rango para UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Uso:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPCIÓN...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Opcións de axuda:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Mostrar opcións de axuda"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Mostrar todas as opcións de axuda"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Opcións da aplicación:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Non se pode interpretar o valor enteiro '%s' para %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "O valor enteiro '%s' para %s está fora de rango"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Non se pode analizar o valor enteiro '%s' para %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "O valor enteiro '%s' para %s está fora de rango"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Erro analizando a opción %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Argumento perdido por %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Opción %s descoñecida"
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Non se pode atopar a chave do ficheiro válida nos directorios de busca"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Non é un arquivo regular"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "O ficheiro está vacío"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"O arquivo chave contén a liña '%s' que non é un par valor-chave, grupo, ou "
+"comentario"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Nome de grupo inválido: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "O ficheiro chave non empeza cun grupo"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Nome de clave inválido: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "O ficheiro chave contén unha codificación non soportada '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "O arquivo chave non ten un grupo '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "O arquivo chave non ten a chave '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"O arquivo chave contén a chave '%s' co valor '%s' o cal non está en UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"O arquivo chave contén a chave '%s' que ten un valor que non pode ser "
+"interpretado."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"O arquivo chave contén a chave '%s' no grupo '%s' que ten un valor que non "
+"pode ser interpretado."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "O arquivo chave non ten a chave '%s' no grupo '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "O arquivo chave contén un carácter de escape ao final da liña"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "O arquivo chave contén a secuencia de escape inválida '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "O valor '%s' non pode interpretarse como un número."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "O valor enteiro '%s' está fora de rango"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "O valor '%s' non pode interpretarse como un número flotante."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "O valor '%s' non pode interpretarse como un booleano."
diff --git a/trunk/po/gu.po b/trunk/po/gu.po
new file mode 100644
index 000000000..a3073c72e
--- /dev/null
+++ b/trunk/po/gu.po
@@ -0,0 +1,911 @@
+# translation of glib.HEAD.gu.po to Gujarati
+# Ankit Patel <ankit644@yahoo.com>, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.HEAD.gu\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-07 10:11+0530\n"
+"Last-Translator: Ankit Patel <ankit644@yahoo.com>\n"
+"Language-Team: Gujarati <indianoss-gujarati@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "ઘટક '%s' માટે અનિચ્છનીય લક્ષણ '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "ઘટક '%s' નું લક્ષણ '%s' મળ્યું નહિં"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "અનિચ્છનીય ટેગ '%s', ટેગ '%s' ઈચ્છિત"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "અનિચ્છનીય ટેગ '%s' એ '%s' માં"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "માહિતી ડિરેક્ટરીઓ માટે કોઈ માન્ય બુકમાર્ક ફાઈલ મળી નહિં"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "URI '%s' માટેની બુકમાર્ક પહેલાથી જ હાજર છે"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "URI '%s' માટે કોઈ બુકમાર્ક મળી નહિં"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "URI '%s' માટે બુકમાર્કમાં કોઈ MIME પ્રકાર વ્યાખ્યાયિત નથી"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "URI '%s' માટે બુકમાર્કમાં કોઈ ખાનગી ફ્લેગ વ્યાખ્યાયિત થયેલ નથી"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "URI '%s' માટે બુકમાર્કમાં કોઈ જૂથો સુયોજિત નથી"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "'%s' નામવાળા કોઈ કાર્યક્રમે '%s' માટે બુકમાર્ક રજીસ્ટર કરી નથી"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "'%s' સાંકેતિક કડી વાંચવામાં નિષ્ફળતા: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "'%s' અક્ષર સમૂહમાંથી '%s' માં રુપાંતરણ માટે આધાર નથી"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "'%s' માંથી '%s' માટેનો પરીવર્તક ખોલી શકતો નથી"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "રુપાંતર ઈનપુટની બાઇડ શ્રેણી અપ્રમાણીત છે"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "રુપાંતર વખતે ભૂલ: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "ઈનપુટ ના છેડા પર અપૂર્ણ અક્ષર શ્રેણી છે"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "ફૈલબેક '%s' ને '%s' કોડના સમૂહમાં પરીવર્તિત કરી શકાતું નથી "
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' કે જે \"ફાઈલ\" યોજના વાપરે છે તે ચોક્કસ URI નથી"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "સ્થાનીય ફાઈલ URI '%s' માં કદાય '#' સમાવિષ્ટ નથી"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "'%s' URI અયોગ્ય છે"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "'%s' URIનું યજમાનનુ નામ અયોગ્ય છે"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "'%s' URI અયોગ્ય બહાર નીકળવાના અક્ષરો ધરાવે છે "
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "'%s' પથ નામ એ ચોક્કસ પથ નથી"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "અયોગ્ય યજમાન નામ"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "'%s' ડિરેક્ટરી ખોલતા ભૂલ: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "%lu બાઈટ \"%s\" ફાઈલ વાંચવા માટે આપવામાં આવતા નથી"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "'%s' ફાઈલ વાંચતી વખતની ભૂલ: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "'%s' ફાઈલમાંથી વાંચવામા નિષ્ફળતા: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "'%s' ફાઈલ ખોલવામાં નિષ્ફળતા : %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "'%s' ફાઈલની લાક્ષણિકતા મેળવતી વખતે નિષ્ફળતા: fstate() નિષ્ફળ: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "'%s' ફાઈલ ખોલવામાં નિષ્ફળતા: fdopen() નિષ્ફળ: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "ફાઈલ '%s' નું નામ '%s' માં બદલવામાં નિષ્ફળ: g_rename() નિષ્ફળ: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "'%s' ફાઈલ બનાવવામાં નિષ્ફળતા : %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "ફાઈલ '%s' ને લખવા માટે ખોલવામાં નિષ્ફળ: fdopen() નિષ્ફળ: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "ફાઈલ '%s' પર લખવામાં નિષ્ફળ: fwrite() નિષ્ફળ: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "ફાઈલ '%s' બંધ કરવામાં નિષ્ફળ: fclose() નિષ્ફળ: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "વર્તમાન ફાઈલ '%s' દૂર કરી શકાઈ નહિં: g_unlink() નિષ્ફળ: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr " '%s' ટેમ્પલેટ અયોગ્ય છે, તે '%s' ધરાવતું નથી"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "ટેમ્પલેટ '%s' એ XXXXXX સમાવતું નથી"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "'%s' સાંકેતિક કડી વાંચવામાં નિષ્ફળતા: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "સાંકેતિક કડી આધાર આપતી નથી"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "'%s' માંથી '%s' માટેનું રુપાંતરક ખોલી શકાયું નહિં: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "g_10_channe_lread_line_string માં આડી હરોળ માં વાંચી શકાતું નથી"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr ""
+"વાંચવા માટેના બફર(થોડા સમય માટેનું સંગ્રહસ્થાન) માં ઢાંકેલી ન હોય તે માહિતી છોડી દીધેલ છે"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "માધ્યમ અપુર્ણ અક્ષરથી અંત પામે છે"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "g_io_channel_read_to_end માં આડી હરોળ વાંચી શકાતી નથી"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "ફાઈલ '%s' ખોલવામાં નિષ્ફળ: open() નિષ્ફળ: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "ફાઈલ '%s' નો નકશો કરવામાં નિષ્ફળ: mmap() નિષ્ફળ: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "%d લીટી પર %d અક્ષરમાં ભૂલ: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "%d લીટી પર ભૂલ: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr "'&;' વસ્તુ ખાલી દેખાય છે: યોગ્ય વસ્તુઓ છે:&amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"વસ્તુ નામ શરુ થાય ત્યાં %s' અક્ષર યોગ્ય નથી: & અક્ષર વસ્તુની શરુઆત કરે છે; જો તે એમપરસંડ "
+"વસ્તુ ને આધાર ન આપે તો તે &amp; તરીકે દર્શાવો"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr " વસ્તુ નામની અંદર '%s' અક્ષર યોગ્ય નથી"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "'%s' વસ્તુ નામ જાણીતુ નથી"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"વસ્તુ નો સેમીકોલન સાથે અંત થતો નથી; ઘણી વખતે એમપરસંડ(&) અક્ષર ચિન્હ વગર તમે વસ્તુ વાપરી "
+"શકો છો- એમપરસંડ &amp; તરીકે લો"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"'%-.*s' નું પદચ્છેદન કરવામાં નિષ્ફળ, કે જે અક્ષર સંદર્ભમાં અંક હોવો જોઈએ (&#234; ઉદાહરણ "
+"તરીકે) - કદાચ અંક ખૂબ લાંબો હોય"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "અક્ષર સંદર્ભ '%-.*s' પરવાનગી આપેલ અક્ષરને એનકોડ કરતો નથી"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "ખાલી અક્ષર સંદર્ભ; સંખ્યા જેવી કે &#454; ને સમાવતી હોવી જોઇએ "
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"અક્ષર સંદર્ભ અર્ધવિરામ થી અંત થતો નથી; તમે વસ્તુ શરુ કરવા એમપરસંડ અક્ષર ને વાપરો એમપરસંડ "
+"ને &amp; તરીકે લો"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "અપુર્ણ વસ્તુ સંદર્ભ "
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "અપુર્ણ અક્ષર સંદર્ભ "
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "અયોગ્ય યુટીએફ-૮ સંગ્રહ-પધ્ધતિવાળુ લખાણ"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "દસ્તાવેજ કોઈ વસ્તુ સાથે શરુ થાય તે જરુરી છે(ઉદાહરણ <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr "'%s' એ '<' અક્ષર પછી આવતો યોગ્ય અક્ષર નથી; તે કોઈ વસ્તુના નામથી શરુ થતુ નથી"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr "અસંગત અક્ષર '%s', વસ્તુ '%s' ની શરુઆત ટેગ ને સમાપ્ત કરવા '>' અક્ષર ની આશા છે"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr "અસંગત અક્ષર '%s', '%s' વસ્તુના '%s' લાક્ષણિકતા નામ પછી '=' જરુરી છે"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"અસંગત અક્ષર '%s': '%s' વસ્તુના અંતમાં '>' અથવા '/' અથવા પરીમાણનો વિકલ્પ જરુરી છે; તમે "
+"કદાય અયોગ્ય અક્ષર લાક્ષણિકતાના નામો વાપર્યો છે"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"અસંગત અક્ષર '%s, '%s' વસ્તુ માટે '%s' લાક્ષણિકતાના મુલ્ય આપતી વખતે બરાબરની નિશાની "
+"પછી શરુ થતો અવતરણ ચિહ્ન જરુરી છે"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr "'%s' એ '<' અક્ષર પછીનો યોગ્ય અક્ષર નથી ; '%s' ક્દાચ વસ્તુ નામ સાથે શરુ થતુ નથી"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr "'%s' એ '%s' વસ્તુનામ પછીનો બંધ કરવાનો યોગ્ય અક્ષર નથી; '>' એ યોગ્ય અક્ષર છે. "
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "'%s' વસ્તુ બંધ હતી, અત્યારે એક પણ વસ્તુ ખુલ્લી નથી"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "'%s' વસ્તુ બંધ હતી, પણ અત્યારે '%s'એ ખુલ્લી વસ્તુ છે"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "દસ્તાવેજ ખાલી છે અથવા ફક્ત ખાલી જ્ગ્યા ધરાવે છે"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "'<' ચિન્હ વાપરતા પછી દસ્તાવેજનો અણધારી રીતે અંત આવે છે"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr "વસ્તુ ખુલ્લી હોવા છતાં દસ્તાવેજનો અણધારી રીતે અંત આવે છે- છેલ્લે ખોલેલ વસ્તુ '%s' છે"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"દસ્તાવેજનો અણધારી રીતે અંત થાય છે, તે અંતિમ ટેગ <%s/> માં કૌંસને બંધ કરતુ ખૂણાનુ ચિન્હ "
+"જોવા માગે છે"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "વસ્તુ નામની અંદર દસ્તાવેજનો અણધારી રીતે અંત થાય છે"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "લાક્ષણિકતાના નામની અંદર દસ્તાવેજનો અણધારી રીતે અંત થાય છે"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "વસ્તુની શરુઆતની ટેગમા દસ્તાવેજનો અણધારી રીતે અંત થાય છે"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"લાક્ષણિકતા નામ પછીની બરાબરની નિશાની પછી દસ્તાવેજ નો અણધારી રીતે અંત થાય છે. "
+"લાક્ષણિકતાના મુલ્ય નથી"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "લાક્ષણિકતા મુલ્ય અંદર હોવા છતાં દસ્તાવેજ નો અણધારી રીતે અંત થાય છે"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "'%s' વસ્તુના બંદ ટેગની અંદર દસ્તાવેજનો અણધારી રીતે અંત થાય છે"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "ટિપ્પણી અથવા પ્રક્રિયા સુચનાની અંદર અણધારી રીતે દસ્તાવેજનો અંત થાય છે"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "%d લીટી પર %d અક્ષરમાં ભૂલ: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "અપુર્ણ વસ્તુ સંદર્ભ "
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "અવતરણ ચિહ્નવાળુ વાક્ય અવતરણ ચિહ્નથી શરુ થતુ નથી"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "આદેશ વાક્યમાં અથવા બીજા શેલ ચિહ્નિત બંધબેસતા ન હોય તેવા અવતરણ ચિહ્ન"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "લખાણનો '\\' અક્ષર પછી તરત જ અંત આવે છે (લખાણનો '%s' હતુ)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "%c માટે અવતરણ ચિહ્ન મળે તે પહેલા લખાણનો અંત થાય છે(લખાણ '%s' હતુ)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "વાક્ય ખાલી છે (અથવા તેમાં ફક્ત ખાલી જગ્યા છે)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "બાળ-પ્રક્રિયા માંથી માહિતી વાંચવા માં નિષ્ફળ છે"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr " (%s) બાળપ્રક્રિયા સાથે સંપર્ક માટે પાઈપ બનાવવામાં નિષ્ફળ"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "બાળ પાઈપ (%s)માંથી વાંચવામાં નિષ્ફળ"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "'%s' ડિરેક્ટરી બદલવામાં નિષ્ફળ(%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr " (%s) બાળપ્રક્રિયા ચલાવવામાં નિષ્ફળ"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "અયોગ્ય કાર્યક્રમ નામ: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "દલીલ વેક્ટરમાં %d આગળ અયોગ્ય શબ્દમાળા: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "પર્યાવરણમાં અયોગ્ય શબ્દમાળા: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "અયોગ્ય કામ આપતી ડિરેક્ટરી: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "મદદગાર કાર્યક્રમ (%s) ચલાવવામાં નિષ્ફળ"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"બાળ-પ્રક્રિયામાંથી માહિતી વાંચતી વખતે g_io_channel_win32_poll() માં આવતી અણધારી ભૂલ"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "(%s) બાળપ્રક્રિયામાંથી માહિતી વાંચવામાં નિષ્ફળ"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "(%s)બાળપ્રક્રિયામાંથી માહિતી વાંચતી વખતે select() માં આવતી અણધારી ભૂલ"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "(%s) waitpid() માં અાવતી અણાધારી ભૂલ"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "(%s) બાળપ્રક્રિયા બનાવવામાં નિષ્ફળ"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "\"%s\"બાળપ્રક્રિયા ચલાવવામાં નિષ્ફળ (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "બાળપ્રક્રિયા (%s)ના ઈનપુટ અથવા આઉટપુટને ફરીથી દિશા આપવામાં નિષ્ફળ"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "બાળપ્રક્રિયા (%s)ની બાળપ્રક્રિયા બનાવવામાં નિષ્ફળ"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "\"%s\" બાળપ્રક્રિયા ચલાવતી વખતની અજ્ઞાત ભૂલ"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "(%s)બાળ pid પાઈપમાંથી જરુરી માહિતી વાંચવામાં નિષ્ફળ"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "અક્ષર UTF-૮ ની સીમાની બહાર"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "પરીવર્તિત ઈનપુટની અંદર અયોગ્ય શ્રેણી"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "UTF-૧૬ ની સીમાની બહાર નો અક્ષર"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "વપરાશ:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "મદદ વિકલ્પો:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "મદદ વિકલ્પો બતાવો"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "બધા મદદ વિકલ્પો બતાવો"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "કાર્યક્રમ વિકલ્પો:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "પૂર્ણાંક કિંમત '%s' ને %s માટે પદચ્છેદન કરી શકતા નથી"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "પૂર્ણાંક કિંમત '%s' એ %s માટે મર્યાદા બહાર છે"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "બમણી કિંમત '%s' ને %s માટે પદચ્છેદિત કરી શકતા નથી"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "બમણી કિંમત '%s' જે %s માટે છે તે વિસ્તારની બહાર છે"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "ભૂલ પદચ્છેદન વિકલ્પ %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "%s માટેની દલીલ ગુમ થયેલ છે"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "અજ્ઞાત વિકલ્પ %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "માહિતી ડિરેક્ટરીઓમાં માન્ય કી ફાઈલ શોધી શકાઈ નહિં"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "નિયમિત ફાઈલ નથી"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "ફાઈલ ખાલી છે"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr "કી ફાઈલ વાક્ય '%s' સમાવે છે કે જે કી-કિંમત જોડ, જૂથ, અથવા ટિપ્પણી નથી"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "અયોગ્ય કાર્યક્રમ નામ: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "કી ફાઈલ જૂથ સાથે શરૂ થતી નથી"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "અયોગ્ય કાર્યક્રમ નામ: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "કી ફાઈલ બિનઆધારભૂત અક્ષર સંગ્રહપદ્ધતિ '%s' સમાવે છે"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "કી ફાઈલ પાસે જૂથ '%s' નથી"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "કી ફાઈલ પાસે કી '%s' નથી"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "કી ફાઈલ '%s' કીને કિંમત '%s' સાથે સમાવે છે કે જે UTF-8 નથી"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "કી ફાઈલ '%s' કી સમાવે છે કે જેની પાસે કિંમત છે જે ઈન્ટરપ્રીટ કરી શકાતી નથી."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"કી ફાઈલ '%s' કી જૂથ '%s' માં સમાવે છે કે જેની પાસે કિંમત છે કે જે ઈન્ટરપ્રીટ કરી શકાતી "
+"નથી."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "કી ફાઈલ પાસે કી '%s' એ જૂથ '%s' માં નથી"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "કી ફાઈલ એસ્કેપ અક્ષર વાક્યના અંતે સમાવે છે"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "કી ફાઈલ અયોગ્ય એસ્કેપ ક્રમ '%s' સમાવે છે"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "કિંમત '%s' નંબર તરીકે ઈન્ટરપ્રીટ કરી શકાતું નથી."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "પૂર્ણાંક કિંમત '%s' એ મર્યાદાની બહાર છે"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "કિંમત '%s' એ અપૂર્ણાંક સંખ્યા તરીકે ઈન્ટરપ્રીટ કરી શકાતું નથી."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "કિંમત '%s' બુલિયન તરીકે ઈન્ટરપ્રીટ કરી શકાતું નથી."
diff --git a/trunk/po/he.po b/trunk/po/he.po
new file mode 100644
index 000000000..b61ff9bae
--- /dev/null
+++ b/trunk/po/he.po
@@ -0,0 +1,945 @@
+# translation of glib.HEAD.he.po to Hebrew
+# translation of glib.HEAD.po to Hebrew
+# translation of glib.HEAD.po to
+# translation of glib.HEAD.po to
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) 2006 THE PACKAGE'S COPYRIGHT HOLDER.
+# Meir Kriheli <meirkr@mksoft.co.il>, 2002.
+# Gil 'Dolfin' Osher <dolfin@rpg.org.il>, 2002.
+# Gil Osher <dolfin@rpg.org.il>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.HEAD.he\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-04-27 18:48+0300\n"
+"Last-Translator: Yair Hershkovitz <yairhr@gmail.com>\n"
+"Language-Team: Hebrew <he@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Unexpected attribute '%s' for element '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Attribute '%s' of element '%s' not found"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Unexpected tag '%s', tag '%s' expected"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Unexpected tag '%s' inside '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "No valid bookmark file found in data dirs"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "A bookmark for URI '%s' already exists"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "No bookmark found for URI '%s'"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "No MIME type defined in the bookmark for URI '%s'"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "No private flag has been defined in bookmark for URI '%s'"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "No groups set in bookmark for URI '%s'"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "No application with name '%s' registered a bookmark for '%s'"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Failed to expand exec line '%s' with URI '%s'"
+
+# *** This file should not be translated to hebrew, please only copy the english text ***
+# *** Old hebrew ranslation is commented for backup sake ***
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Conversion from character set '%s' to '%s' is not supported"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Could not open converter from '%s' to '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Invalid byte sequence in conversion input"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Error during conversion: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Partial character sequence at end of input"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Cannot convert fallback '%s' to codeset '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "The URI '%s' is not an absolute URI using the \"file\" scheme"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "The local file URI '%s' may not include a '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "The URI '%s' is invalid"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "The hostname of the URI '%s' is invalid"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "The URI '%s' contains invalidly escaped characters"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "The pathname '%s' is not an absolute path"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Invalid hostname"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Error opening directory '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Could not allocate %lu bytes to read file \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Error reading file '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Failed to read from file '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Failed to open file '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Failed to get attributes of file '%s': fstat() failed: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Failed to open file '%s': fdopen() failed: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Failed to create file '%s': %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Failed to open file '%s' for writing: fdopen() failed: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Failed to write file '%s': fwrite() failed: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Failed to close file '%s': fclose() failed: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Existing file '%s' could not be removed: g_unlink() failed: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Template '%s' invalid, should not contain a '%s'"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Template '%s' doesn't contain XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Failed to read the symbolic link '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Symbolic links not supported"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Could not open converter from '%s' to '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Can't do a raw read in g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Left over unconverted data in read buffer"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Channel terminates in a partial character"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Can't do a raw read in g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Failed to open file '%s': open() failed: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Failed to map file '%s': mmap() failed: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Error on line %d char %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Error on line %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"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 &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Character '%s' is not valid inside an entity name"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Entity name '%s' is not known"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Character reference '%-.*s' does not encode a permitted character"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Empty character reference; should include a digit such as &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Unfinished entity reference"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Unfinished character reference"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Invalid UTF-8 encoded text"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Document must begin with an element (e.g. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"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"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element '%s' was closed, no element is currently open"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Element '%s' was closed, but the currently open element is '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Document was empty or contained only whitespace"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Document ended unexpectedly just after an open angle bracket '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Document ended unexpectedly inside an element name"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Document ended unexpectedly inside an attribute name"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Document ended unexpectedly inside an element-opening tag."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Document ended unexpectedly while inside an attribute value"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Document ended unexpectedly inside the close tag for element '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Document ended unexpectedly inside a comment or processing instruction"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Error on line %d char %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Unfinished entity reference"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Quoted text doesn't begin with a quotation mark"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Unmatched quotation mark in command line or other shell-quoted text"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Text ended just after a '\\' character. (The text was '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "Text ended before matching quote was found for %c. (The text was '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Text was empty (or contained only whitespace)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Failed to read data from child process"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Failed to create pipe for communicating with child process (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Failed to read from child pipe (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Failed to change to directory '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Failed to execute child process (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Invalid program name: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Invalid string in argument vector at %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Invalid string in environment: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Invalid working directory: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Failed to execute helper program (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Failed to read data from child process (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Unexpected error in select() reading data from a child process (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Unexpected error in waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Failed to fork (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Failed to execute child process \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Failed to redirect output or input of child process (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Failed to fork child process (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Unknown error executing child process \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Failed to read enough data from child pid pipe (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Character out of range for UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Invalid sequence in conversion input"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Character out of range for UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Usage:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Help Options:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Show help options"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Show all help options"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Application Options:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Cannot parse integer value '%s' for %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Integer value '%s' for %s out of range"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Cannot parse double value '%s' for %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Double value '%s' for %s out of range"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Error parsing option %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Missing·argument·for·%s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Unknown option %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Valid key file could not be found in data dirs"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Not a regular file"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "File is empty"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Invalid group name: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Key file does not start with a group"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Invalid key name: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Key file contains unsupported encoding '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Key file does not have group '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Key file does not have key '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Key file contains key '%s' with value '%s' which is not UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "Key file contains key '%s' which has value that cannot be interpreted."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Key file does not have key '%s' in group '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Key file contains escape character at end of line"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Key file contains invalid escape sequence '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Value '%s' cannot be interpreted as a number."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Integer value '%s' out of range"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Value '%s' cannot be interpreted as a float number."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Value '%s' cannot be interpreted as a boolean."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Could not change file mode: fork() failed: %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Could not change file mode: waitpid() failed: %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Could not change file mode: chmod() failed: %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr "Could not change file mode: Child terminated by signal: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr "Could not change file mode: Child terminated abnormally"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Conversion from character set `%s' to `%s' is not supported"
diff --git a/trunk/po/hi.po b/trunk/po/hi.po
new file mode 100644
index 000000000..03ef926ee
--- /dev/null
+++ b/trunk/po/hi.po
@@ -0,0 +1,914 @@
+# translation of glib.HEAD.hi.po to Hindi
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Ravishankar Shrivastava <raviratlami@yahoo.com>, 2004.
+# Rajesh Ranjan <rranjan@redhat.com>, 2005, 2006.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.HEAD.hi\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-06-20 14:14+0530\n"
+"Last-Translator: Rajesh Ranjan <rranjan@redhat.com>\n"
+"Language-Team: Hindi <fedora-trans-hi@redhat.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "'%s' अप्रत्याशित गुण '%s' तत्व के लिये"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "'%s' तत्व '%s' का गुण नहीं मिला"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "'%s' अप्रत्याशित टैग, '%s' टैग प्रत्याशित"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "अप्रत्याशित टैग '%s' '%s' के अंदर"
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "कोई वैध पुस्तकचिह्न आंकड़ा निर्देशिका में नहीं मिला"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "URI '%s' के लिये पुस्तकचिह्न पहले से मौजूद है"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "URI '%s' के लिये कोई पुस्तकचिह्न नहीं मिला"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "कोई MIME प्रकार URI '%s' के लिये पुस्तकचिह्न में परिभाषित नहीं है"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "URI '%s' के लिये पुस्तकचिह्न में कोई निजी फ्लैग परिभाषित नहीं है"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "URI '%s' के लिये पुस्तकचिह्न में कोई समूह सेट नहीं है"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "'%s' के नाम से कोई अनुप्रयोग ने '%s' के लिये पुस्तकचिह्न पंजीकृत नहीं है"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "सिंबालिक लिंक '%s' से थीम पढ़ने में असफल %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "अक्षर समूह '%s' से '%s' में परिवर्तन समर्थित नहीं है"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "'%s' से '%s' परिवर्तक नहीं खोला जा सका"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "परिवर्तन इनपुट में अवैध बाइट अनुक्रम"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "परिवर्तन के दौरान त्रुटि: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "इनपुट के अंत में आंशिक अक्षर अनुक्रम"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "फालबैक '%s' को कोड सेट '%s' में परिवर्तित नहीं कर सका"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "\"file\" योजना का उपयोग करने वाली URI '%s' एक निरपेक्ष यूआरआई नहीं है"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "स्थानीय फ़ाइल यूआरआई '%s' में एक '#' सम्मिलित नहीं है"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "यूआरआई '%s' अवैध है"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "यूआरआई '%s' का होस्टनाम अवैध है"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "यूआरआई '%s' में अवैध एस्केप्ड अक्षर सम्मिलित हैं"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "पथनाम '%s' एक निरपेक्ष पथ नहीं है"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "अवैध होस्ट-नाम"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "डिरेक्ट्री '%s' को खोलने में त्रुटि: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr " %lu बाइट आवंटित नहीं किया जा सकता फ़ाइल \"%s\" को पढ़ने हेतु"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "'%s' फ़ाइल को पढ़ने में त्रुटि: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "फ़ाइल '%s' से पढ़ने में असफल: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "'%s' फाइल खोलने में असफल :%s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "फ़ाइल '%s' की विशेषता ज्ञात करने में असफल: fstat() असफल: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "फ़ाइल '%s': fdopen() खोलने में असफल: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "फाइल '%s' को '%s' में नाम बदलने में विफल: g_rename() विफल: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "फ़ाइल '%s' बनाने में असफल: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "फाइल '%s' को लिखने के लिये खोलने में विफल: fdopen() विफल: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "'%s' फाइल को लिखने में विफल: fwrite() विफल: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "'%s' फाइल बंद करने में विफल: fclose() विफल: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "'%s' मौजूदा फाइल हटाया नहीं जा सकता: g_unlink() विफल: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "टैम्पलेट '%s' अवैध है, इसमें '%s' शामिल नहीं है"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "टैम्पलेट '%s' में XXXXXX समाहित नहीं है"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "सिंबालिक लिंक '%s' से थीम पढ़ने में असफल %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "सिंबालिक लिंक समर्थित नहीं है"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "'%s' से '%s' परिवर्तक नहीं खोला जा सका: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "यहाँ एक रॉ रीड नहीं कर सकता g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "रीड बफ़र में शेष है अपरिवर्तित बचा हुआ डेटा"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "आंशिक अक्षर में चैनल समाप्त होता है"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "यहाँ एक रॉ रीड नहीं कर सकता - g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "फ़ाइल '%s' खोलने में असफल: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "'%s' फाइल चित्रित करने में विफल: mmap() विफल: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "पंक्ति %d अक्षर %d पर त्रुटि: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "पंक्ति %d: पर त्रुटि %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr "खाली एंटिटी '&;' देखा; वैध एंटिटी हैं: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"एक एंटिटी के प्रारंभ में अक्षर '%s' वैध नहीं है, तथा & अक्षर एक एंटिटी को प्रारंभ करता है; "
+"यदि यह एम्परसेंड एक एंटिटी नहीं है, तो इसे ऐसे एस्केप करें &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr " अक्षर '%s' एक एंटिटी नाम के भीतर वैध नहीं है"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "एंटिटी नाम '%s' ज्ञात नहीं है"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"एंटिटी अर्धविराम पर समाप्त नहीं होता, बहुत संभव है कि आपने एम्परसेन्ड अक्षर का प्रयोग "
+"किया है और एक एंटिटी प्रारंभ नहीं करना चाहते- एम्परसेंड को ऐसे एस्केप करें: &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"'%-.*s' के विश्लेषण करने में असफल, जो कि अक्षर संदर्भ के भीतर एक अंक होना चाहिए (उदाहरण "
+"के लिए, &#234) - शायद अंक काफी बड़ा है"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "संप्रतीक संदर्भ '%-.*s' एक अनुमति प्राप्त संप्रतीक को एनकोड नहीं करता"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "रिक्त अक्षर संदर्भ, अंक जैसे &#454 सम्मिलित अवश्य होने चाहिएँ;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"अक्षर संदर्भ अर्धविराम चिन्ह के साथ समाप्त नहीं होता है; बहुत संभव है कि आपने एक एम्परसेंड "
+"अक्षर का उपयोग किया है पर एक एंटिटी को प्रारंभ करना नहीं चाहते - एम्परसेंड को एस्केप करें "
+"ऐसे &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "अपूर्ण एंटिटी संदर्भ"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "अपूर्ण अक्षर संदर्भ"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "अवैध यूटीएफ़-8 एनकोडेड पाठ"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "दस्तावेज़ एक अवयव के नाम से प्रारंभ होना चाहिए (उदाहरण के लिए- <पुस्तक>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr "< के पश्चात आया '%s' एक वैध वर्ण नहीं है; यह अवयव नाम से प्रारंभ नहीं होता"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"विषम अक्षर '%s', एलिमेंट '%s' के प्रारंभ टैक को समाप्त करने हेतु प्रत्याशित था '>' अक्षर"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr "विषम अक्षर '%s', प्रत्याशित है एक '=' लक्षण नाम '%s' अवयव '%s' के पश्चात्"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"'%s' विसम संप्रतीक, एक '>' या '/' संप्रतीक को '%s' तत्व के आरंभ टैग को खत्म करना "
+"प्रत्याशित, या विकल्पतः एक गुण; शायद आपने गुण नाम में एक अमान्य संप्रतीक का प्रयोग किया है"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"पुराना अक्षर '%s', जब विशेषता '%s', अवयव '%s' का मान दिया जाता है तो बराबर चिह्न "
+"के बाद एक खुला कोट चिह्न वांछित है"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' एक वैध अक्षर नहीं है अक्षर '</' के बाद; '%s' एक अवयव नाम से प्रारंभ नहीं होता"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr "'%s' एक वैध अक्षर नहीं है क्लोज़ अवयव नाम '%s' के बाद; स्वीकार्य अक्षर है '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "अवयव '%s' बन्द था, कोई अवयव वर्तमान में खुला नहीं है"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "दस्तावेज '%s' बन्द था, परन्तु वर्तमान खुला अवयव है '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "दस्तावेज़ खाली था या उसमें सिर्फ श्वेत रिक्ति ही था"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से एक खुला एंगल ब्रेकेट '<' के पश्चात ही हो गया"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"दस्तावेज़ का अंत अप्रत्याशित रूप से अवयवों के खुला होने पर भी हो गया - '%s' अंतिम खुला हुआ "
+"अवयव था"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"दस्तावेज़ का अंत अप्रत्याशित रूप से हो गया, वांछित था देखना एक क्लोज़ एंगल ब्रेकेट टैग को बन्द "
+"करता हुआ <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से अवयव नाम के भीतर हो गया"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से विशेषता नाम के भीतर हो गया"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से अवयव-खोलने के टैग के भीतर हो गया."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"दस्तावेज़ का अंत अप्रत्याशित रूप से बराबर के चिह्न के बाद एक विशेषता नाम के पश्चात् हो गया; "
+"कोई विशेषता मूल्य नहीं"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से विशेषता मान के भीतर हो गया"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से अवयव '%s' हेतु बन्द टैग के भीतर हो गया"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से टिप्पणी या प्रक्रिया निर्देश के भीतर हो गया"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "पंक्ति %d अक्षर %d पर त्रुटि: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "अपूर्ण एंटिटी संदर्भ"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "कोटेड पाठ कोटेशन चिह्न के साथ प्रारंभ नहीं होता"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "कमांड पंक्ति में मेल नहीं खाते कोटेशन चिह्न या अन्य शैल-कोटेड पाठ"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "पाठ का अंत सिर्फ '\\' अक्षर के बाद हो गया. (पाठ था '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr " %c हेतु मैचिंग कोट से पहले पाठ अंत पाया. (पाठ था '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "पाठ खाली था (या उसमें सिर्फ श्वेत रिक्ति ही था)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "शिशु प्रक्रिया से डेटा पढ़ने में असफल"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "शिशु प्रक्रिया (%s) से संचारण हेतु पाइप बनाने में असफल"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "चाइल्ड पाइप (%s) से पढ़ने में असफल"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "डिरेक्ट्री '%s' (%s) पर बदलने में असफल"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "शिशु प्रक्रिया (%s) कार्यान्वित करने में असफल"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "अवैध प्रोग्राम नाम: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "%d पर तर्क सदिश में अवैध स्ट्रिंग: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "वातावरण में अवैध स्ट्रिंग: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "अवैध कार्यशील निर्देशिका: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "हेल्पर प्रोग्राम (%s) कार्यान्वित करने में असफल"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr "एक शिशु प्रक्रिया से डेटा पढ़ने में g_io_channel_win32_poll() में अप्रत्याशित त्रुटि"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "शिशु प्रक्रिया (%s) से डेटा पढ़ने में असफल"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "एक चाइल्ड प्रक्रिया (%s) से चुनें() पढ़ने का डेटा में अप्रत्याशित त्रुटि हुई"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "waitpid() (%s) में अप्रत्याशित त्रुटि"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "(%s) फॉर्क करने में असफल"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "शिशु प्रक्रिया \"%s\" (%s) कार्यान्वित करने में असफल"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "आउटपुट या शिशु प्रक्रिया (%s) के इनपुट को अनुप्रेषित करने में असफल"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "शिशु प्रक्रिया (%s) फॉर्क करने में असफल"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "शिशु प्रक्रिया \"%s\" कार्यान्वित करने में अज्ञात त्रुटि"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "शिशु पीआईडी पाइप (%s) से पर्याप्त डेटा पढ़ने में असफल"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "यूटीएफ-8 हेतु अक्षर सीमा से बाहर"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "परिवर्तन इनपुट में अवैध अनुक्रम"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "यूटीएफ-16 हेतु अक्षर सीमा से बाहर"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "प्रयोग:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[विकल्प...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "सहायता विकल्प:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "सहायता विकल्प दिखायें"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "सभी सहायता विकल्प दिखायें"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "अनुप्रयोग विकल्प:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "पूर्णांक मान '%s' को %s के लिये विश्लेषण नहीं कर सकता"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "पूर्णांक मान '%s' %s के लिये रेंज के बाहर है"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "'%s' दोहरे मान का विश्लेषण %s के लिये नहीं कर सकता है"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "'%s' दोहरा मान %s के लिये परिसर से बाहर है"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "%s विकल्प विश्लेषण में त्रुटि"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "%s के लिये गुम तर्क"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "अनजान विकल्प %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "आंकड़ा निर्देशिका में मान्य कुंजी फाइल नहीं पायी गयी"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "एक सामान्य फाइल नहीं"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "फ़ाइल खाली है"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"कुंजी फाइल में '%s' पंक्ति समाहित है जो कि एक कुंजी मान जोड़ा, समूह, या टिप्पणी नहीं है"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "अवैध प्रोग्राम नाम: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "कुंजी फाइल एक समूह के साथ शुरू नहीं होता"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "अवैध प्रोग्राम नाम: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "कुंजी फाइल में असमर्थित एनकोडिंग '%s' समाहित है"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "कुंजी फाइल में '%s' समूह नहीं है"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "कुंजी फाइल में '%s' कुंजी नहीं है"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "कुंजी फाइल में '%s' कुंजी समाहित है '%s' मान के साथ जो UTF-8 नहीं है"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "कुंजी फाइल में '%s' कुंजी है जिसके मान का विश्लेषण नहीं किया जा सकता."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr "कुंजी फाइल में '%s' कुंजी है '%s' समूह में जिसके मान का विश्लेषण नहीं किया जा सकता."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "कुंजी फाइल में '%s' कुंजी नहीं है '%s' समूह में"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "कुंजी फाइल में पंक्ति के अंत में एस्केप संप्रतीक रहता है"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "कुंजी फाइल में '%s' अमान्य श्रृंखला समाहित है"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "मान्य '%s' को एक संख्या की तरह नहीं विश्लेषित किया जा सकता."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "पूर्णांक मान '%s' रेंज के बाहर है"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "मान '%s' को एक फ्लोट संख्या की तरह नहीं विश्लेषित किया जा सकता."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "मान '%s' को बुलियन के तौर पर विश्लेषित नहीं किया जा सकता."
diff --git a/trunk/po/hr.po b/trunk/po/hr.po
new file mode 100644
index 000000000..11898145b
--- /dev/null
+++ b/trunk/po/hr.po
@@ -0,0 +1,932 @@
+# Translation of glib to Croatiann
+# Copyright (C) Croatiann team
+# Translators: Denis Lackovic <delacko@fly.srk.fer.hr>,Robert Sedak <robert.sedak@sk.tel.hr>,
+msgid ""
+msgstr ""
+"Project-Id-Version: glib 0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2004-03-13 13:03+CET\n"
+"Last-Translator: auto\n"
+"Language-Team: Croatian <lokalizacija@linux.hr>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: TransDict server\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Neparan znak '%s', očekuje se '=' poslije imena atributa '%s' elementa '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Nisam uspio pročitati simboličku vezu '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Pretvaranje iz znakovnog skupa '%s' u '%s' nije podržana"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Ne mogu otvoriti konverter iz '%s' u '%s': %s"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Neispravna sekvenca bajtova u izlazu konverzije"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Greška prilikom konverzije: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Djelomična znakovna sekvenca pri kraju izlaza"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Ne mogu prevesti '%s' u znakovni skup '%s'"
+
+#: glib/gconvert.c:1727
+#, fuzzy, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' nije apsolutni URI"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "URI lokalne datoteke '%s' ne smije uključivati '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' nije ispravan"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Ime računala URI-ja '%s' je neispravno"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' sadrži neispravne escape znakove"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Putanja '%s' nije apsolutna putanja"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Neispravno ime računala"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Greška pri otvaranju mape '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Ne mogu alocirati %lu bajtova za čitanje datoteke \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Greška pri čitanju datoteke '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Greška pri čitanju iz datoteke '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Greška pri otvaranju datoteke '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Greška pri dohvatu atributa datoteke '%s': fstat() nije uspio: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Greška pri otvaranju datoteke '%s': fdopen() nije uspio: %s"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Greška pri otvaranju datoteke '%s': fdopen() nije uspio: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Greška pri stvaranju datoteke '%s': %s"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Greška pri otvaranju datoteke '%s': fdopen() nije uspio: %s"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Greška pri otvaranju datoteke '%s': fdopen() nije uspio: %s"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Greška pri otvaranju datoteke '%s': fdopen() nije uspio: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Predložak '%s' nije ispravan, ne smije sadržavati'%s'"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Predložak '%s' ne završava sa XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Nisam uspio pročitati simboličku vezu '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Nisu podržane simboličke veze"
+
+#: glib/giochannel.c:1152
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Ne mogu otvoriti konverter iz `%s' u `%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Ne mogu izvršiti raw čitanje u g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Postoji ostatak nepretvorenih podataka u međuspremniku za čitanje"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanal završava sa djelomičnim znakom"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Ne mogu izvršiti raw čitanje u g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Greška pri otvaranju datoteke '%s': fdopen() nije uspio: %s"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Greška pri otvaranju datoteke '%s': fdopen() nije uspio: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Greška na retku %d znak %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Greška na retku %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Prazan entitet '&;' ; ispravni entiteti su: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Znak '%s' nije dozvoljen na početku imena entiteta; znak & počinje entitet; "
+"ako ovaj & nije entitet onda ga označite sa &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Znak '%s' nije dozvoljen unutar imena entiteta"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Ime entiteta '%s' nije poznato"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entitet nije zavšio sa točka-zarezom; vjerojatno ste koristili ampersand "
+"znak bez namjere da započnete entitet - escapirajte ampersand sa &amp;"
+
+#: glib/gmarkup.c:573
+#, fuzzy, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Nisam uspio parsirati '%s', koji bi trebao biti broj unutar "
+"znakovnereference (npr. &#234;) - možda je broj prevelik"
+
+#: glib/gmarkup.c:598
+#, fuzzy, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Znakovna referenca '%s' se ne kodira kao dozvoljeni znak"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Prazna znakovna referenca; treba uključivati broj kao &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Znakovna referenca nije završila sa točka-zarezom; vjerojatno ste koristitli "
+"ampersand znakbez namjere da počnete entitet - escapirajte ampersand kao "
+"&amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Nezavršena referenca entiteta"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Nezavršena znakovna referenca"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Neispravno šifrirani UTF-8 tekst"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokument mora početi sa elementom(npr. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' nije dozvoljeni znak koji smije slijediti nakon '<' znaka; ne smije "
+"započeti ime elementa"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Neparan znak '%s', očekuje se da '>' znak završi početni tag elementa'%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Neparan znak '%s', očekuje se '=' poslije imena atributa '%s' elementa '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Čudan znak '%s', očekuje se da znak '>' ili '/' završe početak taga elementa "
+"'%s', ili opcionalno atributa; možda ste koristili neispravan znaku imenu "
+"atributa"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Čudan znak '%s', očekuje se otvoreni navodnik nakon znaka jednakostikada se "
+"daje vrijednost atributa '%s' elementa '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' nije znak koji smije slijediti '</'; '%s' ne smije započetiime elementa"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' nije ispravan znak koji može slijediti nakon imena završnog elementa '%"
+"s'; dozvoljeni znak je '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element '%s' je zatvoren, trenutno nema otvorenog elementa"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Element '%s' je zatvoren, ali trenutno otvoreni element je '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokument je bio prazan ili je sadržavao samo znakove prazne znakove"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Dokument je završio neočekivano nakon otvaranja zagrade '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokument je završio neočekivano sa još uvijek otvorenim elementima- '%s' je "
+"bio zadnjiotvoreni element"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokument je završio neočekivano, očekivalo se da zatvorena šiljata "
+"zagradazavrši tag<%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokument je završio neočekivano unutar imena elementa"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokument je završio neočekivano unutar imena atributa"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokument je završio neočekivano unutar taga koji započinje element"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokument je završio neočekivano nakon što je znak jednakosti slijedioime "
+"atributa; nema vrijednosti atributa"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokument je završio neočekivano unutar vrijednosti atributa"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Dokument je završio neočekivano unutar taga koji završava za element '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Dokument je završio neočekivano unutar komentara ili izvršavanja instrukcije"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Greška na retku %d znak %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Nezavršena referenca entiteta"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Tekst pod navodnicima ne počinje sa navodnikom"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Navodnik nije uparen u naredbenoj liniji"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Tekst je završio nakon '\\' znaka (Tekst je bio '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Tekst je završio prije nego što je nađen završni navodnik %c. (Tekst je bio "
+"'%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Tekst je bio prazan (ili je sadržavao samo prazne znakove)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Nisam uspio čitati podatke od procesa djeteta"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Ne mogu stvoriti cjevovod za komuniciranje sa procesom djetetom(%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Nisam uspio čitati iz cjevovoda djeteta (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Nisam mogao promijeniti putanju u mapu '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Nisam mogao izvesti proces dijete (%s)"
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "Neispravno ime računala"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, fuzzy, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Neispravna sekvenca u pretvaranju ulaza"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr "Greška pri otvaranju mape '%s': %s"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Nisam uspio izvršiti pomoćni program"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Neočekivana greška u g_io_channel_win32_poll() čitajući podatke "
+"procesadjeteta"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Neuspjeh u čitanju podataka od procesa djeteta(%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Neočekivana greška u select() čitanju podataka procesa djeteta (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Neočekivana greška u waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Pokretanje nije uspio (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Neuspjeh u izvršavanju procesa djeteta \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Nisam uspio preusmjeriti izlaz ili ulaz procesa djeteta (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Nisam uspio pokrenuti proces dijete (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Nepoznata greška u izvršavanju procesa djeteta \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Neuspjeh u čitanju dovoljno podataka iz cjevovoda procesa djeteta (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Znak je izvan raspona za UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Neispravna sekvenca u pretvaranju ulaza"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Znak je izvan raspona za UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr ""
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr ""
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr ""
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr ""
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Greška prilikom konverzije: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr ""
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr ""
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Neispravno ime računala"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Neispravno ime računala"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, fuzzy, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "URI '%s' sadrži neispravne escape znakove"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Greška pri otvaranju datoteke '%s': fdopen() nije uspio: %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Ne mogu alocirati %lu bajtova za čitanje datoteke \"%s\""
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Greška pri otvaranju datoteke '%s': fdopen() nije uspio: %s"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Konverzija iz znakovnog skupa %s' u `%s' nije podržana"
diff --git a/trunk/po/hu.po b/trunk/po/hu.po
new file mode 100644
index 000000000..eeb9d7dd7
--- /dev/null
+++ b/trunk/po/hu.po
@@ -0,0 +1,961 @@
+# translation of glib.glib-2-6.po to Hungarian
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) 2005, 2006, Free Software Foundation, Inc.
+#
+# Szabolcs Varga <shirokuma@shirokuma.hu>, 2005.
+# Gabor Kelemen <kelemeng@gnome.hu>, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-26 13:25+0200\n"
+"Last-Translator: Gabor Kelemen <kelemeng@gnome.hu>\n"
+"Language-Team: Hungarian <gnome@gnome.hu>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Váratlan attribútum (\"%s\") a(z) \"%s\" elemhez"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "A(z) \"$2%s\" elem \"$1%s\" attribútuma nem található"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Váratlan címke: \"%s\" a várt \"%s\" helyett"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Váratlan címke: \"%s\" a következőn belül: \"%s\""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Az adatkönyvtárakban nem található érvényes könyvjelzőfájl"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Már létezik könyvjelző a következő URI címhez: \"%s\""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Nem található könyvjelző a következő URI címhez: \"%s\""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Nincs MIME típus meghatározva a következő URI könyvjelzőjéhez: \"%s\""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Nincs magán jelző meghatározva a következő URI könyvjelzőjéhez: \"%s\""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Nincsenek csoportok beállítva a következő URI könyvjelzőjéhez: \"%s\""
+
+# FIXME: hol jön ez elő?
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+"Nincs \"%s\" nevű alkalmazás regisztrálva a következő könyvjelzőjéhez: \"%s\""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Nem sikerült kiolvasni a(z) \"%s\" szimbolikus linket: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr ""
+"A(z) \"%s\" és \"%s\" karakterkészletek közötti átalakítás nem támogatott"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr ""
+"A(z) \"%s\" karakterkészletről \"%s\" karakterkészletre átalakító nem "
+"nyitható meg"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Érvénytelen bájtsorrend az átalakítás bemenetében"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Hiba az átalakítás során: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Részleges karaktersorozat a bemenet végén"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Nem alakítható át a tartalék \"%s\" a(z) \"%s\" kódkészletre"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "A(z) \"%s\" URI nem abszolút, a \"file\" sémát használó URI"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "A(z) \"%s\" helyi fájl URI nem tartalmazhat \"#\" karaktert"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "A(z) \"%s\" URI érvénytelen"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "A(z) \"%s\" gépneve érvénytelen"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr ""
+"A(z) \"%s\" URI érvénytelen escape-szekvencia formában megadott karaktereket "
+"tartalmaz"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "A(z) \"%s\" elérési út neve nem abszolút útvonal"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Érvénytelen gépnév"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Hiba a(z) \"%s\" könyvtár megnyitásakor: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Nem sikerült %lu bájtot lefoglalni a(z) \"%s\" fájl olvasásához"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Hiba a(z) \"%s\" fájl olvasása közben: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Nem sikerült olvasni a(z) \"%s\" fájlból: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Nem sikerült megnyitni a(z) \"%s\" fájlt: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"Nem sikerült lekérni a(z) \"%s\" fájl attribútumait. Az fstat() sikertelen: %"
+"s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Nem sikerült megnyitni a(z) \"%s\" fájlt. Az fopen() sikertelen: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Nem sikerült átnevezni a(z) \"%s\" fájlt erre: \"%s\". A g_rename() "
+"sikertelen: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Nem sikerült létrehozni a(z) \"%s\" fájlt: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"Nem sikerült írásra megnyitni a(z) \"%s\" fájlt: Az fdopen() sikertelen: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Nem sikerült írni a(z) \"%s\" fájlt: az fwrite() sikertelen: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Nem sikerült lezárni a(z) \"%s\" fájlt: az fclose() sikertelen: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "A létező \"%s\" fájl nem távolítható el: a g_unlink() sikertelen: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "A(z) \"%s\" sablon érvénytelen, \"%s\" nem lehet benne"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "A(z) \"%s\" sablon nem tartalmaz XXXXXX karaktersorozatot"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Nem sikerült kiolvasni a(z) \"%s\" szimbolikus linket: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "A szimbolikus linkek használata nem támogatott"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Az átalakító a(z) \"%s\" elemről \"%s\" elemre nem nyitható meg: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"Nem lehet nyers (raw) olvasást végezni a g_io_channel_read_line_string-ben"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Át nem alakított adatok maradtak az olvasási pufferben"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "A csatorna töredék karakterrel ér véget"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Nem lehet nyers (raw) olvasást végezni a g_io_channel_read_to_end-ben"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Nem sikerült megnyitni a(z) \"%s\" fájlt: az open() sikertelen: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Nem sikerült leképezni a(z) \"%s\" fájlt: Az mmap() sikertelen: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Hiba a(z) %d. sor %d. karakterénél: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Hiba a(z) %d. sorban: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Üres \"&;\" entitás; az érvényes entitások: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"A(z) \"%s\" karakter nem érvényes az entitások nevének elején; az entitások "
+"nevét az & karakter kezdi. Ha ez az & karakter nem lehet entitás, akkor "
+"&amp; módon kell írni."
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "A(z) \"%s\" karakter nem érvényes egy entitás nevén belül"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "A(z) \"%s\" entitásnév ismeretlen"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Az entitás neve nem pontosvesszővel ért véget; valószínűleg egy &-jelet "
+"használt anélkül, hogy entitást akart volna kezdeni - írja &amp; formában."
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Nem sikerült feldolgozni ezt: \"%-.*s\". Valószínűleg számjegy lett volna "
+"egy karakterhivatkozáson (mint az &#234) belül - lehet, hogy túl nagy a "
+"számjegy"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "A(z) \"%-.*s\" karakterhivatkozás nem engedélyezett karaktert kódol"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+"Üres karakterhivatkozás; számjegyet is kell tartalmaznia, például így: &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"A karakterhivatkozás nem pontosvesszővel ért véget; valószínűleg egy &-jelet "
+"használt anélkül, hogy entitást akart volna kezdeni - írja &amp; formában."
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Befejezetlen entitáshivatkozás"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Befejezetlen karakterhivatkozás"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Érvénytelen UTF-8 kódolású szöveg"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "A dokumentumnak egy elemmel kell kezdődnie (pl. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"\"%s\" nem érvényes karakter a \"<\" karakter után; elem neve nem kezdődhet "
+"vele"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Furcsa karakter (\"%s\") - \">\" karakternek kellett volna jönnie, hogy "
+"lezárja a(z) \"%s\" elem kezdő címkéjét"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Furcsa karakter (\"%s\") - \"=\" karakternek kellett volna jönnie a(z) \"%s"
+"\" elem \"%s\" attribútumneve után"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Furcsa karakter (\"%s\") - \">\" vagy \"/\" karakternek kellett volna jönnie "
+"a(z) \"%s\" elem kezdő címkéje után, esetleg egy attribútumnak; lehet, hogy "
+"érvénytelen karaktert használt az attribútum nevében"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Furcsa karakter (\"%s\") - egy nyitó idézőjelnek kellene jönnie az "
+"egyenlőségjel után, ha értéket ad a(z) \"%s\" attribútumnak \"%s\" elemben"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"\"%s\" nem érvényes karakter a \"</\" karakterek után; \"%s\" karakterrel "
+"nem kezdődhet egy elem neve"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"\"%s\" nem érvényes karakter a \"%s\" lezáró elemnév után; az engedélyezett "
+"karakter egyedül a \">\"."
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "A(z) \"%s\" elem le lett lezárva, jelenleg egy elem sincs nyitva"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"A(z) \"%s\" elem le lett lezárva, de a jelenleg nyitott elem a(z) \"%s\""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "A dokumentum üres volt, vagy csak üreshely karaktereket tartalmazott"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"A dokumentum váratlanul véget ért egy nyitott hegyes zárójel (\"<\") után"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"A dokumentum váratlanul véget ért, pedig még nyitva vannak elemek - \"%s\" "
+"az utoljára megnyitott elem"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"A dokumentum váratlanul véget ért; a(z) <%s/> elemet lezáró hegyes "
+"zárójelnek kellett volna következnie"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "A dokumentum váratlanul véget ért egy elemnéven belül"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "A dokumentum váratlanul véget ért egy attribútumnéven belül"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "A dokumentum váratlanul véget ért egy elemnyitó címkén belül"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"A dokumentum váratlanul véget ért egy az attribútumnevet követő "
+"egyenlőségjel után; az attribútum értéke nem lett megadva"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "A dokumentum váratlanul véget ért egy attribútumértéken belül"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"A dokumentum váratlanul véget ért a(z) \"%s\" elem lezáró címkéjén belül"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"A dokumentum váratlanul véget ért egy megjegyzésen vagy feldolgozási "
+"utasításon belül"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Hiba a(z) %d. sor %d. karakterénél: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Befejezetlen entitáshivatkozás"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Az idézett szöveg nem idézőjellel kezdődik"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Pár nélküli idézőjel a parancssorban vagy más, parancsértelmezőből idézett "
+"szövegben"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "A szöveg egy \"\\\" karakter után véget ért. (A szöveg: \"%s\")"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"A szöveg véget ért, mielőtt %c idézőjelpárja meglett volna. (A szöveg: \"%s"
+"\")"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr ""
+"A szöveg üres volt (vagy legfeljebb üreshely-karaktereket tartalmazott)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Nem sikerült adatokat kiolvasni a gyermekfolyamatból"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+"Nem sikerült csővezetéket készíteni a gyermekfolyamattal (%s) való "
+"kommunikációhoz"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Nem sikerült olvasni a gyermek csővezetékből (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Nem sikerült átváltani a(z) \"%s\" könyvtárra (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Nem sikerült végrehajtani a gyermekfolyamatot (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Érvénytelen programnév: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Érvénytelen karaktersorozat a paraméterben a következő helyen: %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Érvénytelen karaktersorozat a környezetben: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Érvénytelen munkakönyvtár: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Nem sikerült végrehajtani a segítő programot (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Váratlan hiba, miközben a g_io_channel_win32_poll() adatokat olvasott egy "
+"gyermekfolyamatból"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Nem sikerült adatokat olvasni a gyermekfolyamatból (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Váratlan hiba, miközben a select() adatokat próbált olvasni egy "
+"gyermekfolyamatból (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Váratlan hiba a waitpid()-ben (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Nem sikerült folyamatot indítani (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Nem sikerült a gyermekfolyamat (\"%s\") végrehajtása (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Nem sikerült a gyermekfolyamat ki- vagy bemenetének átirányítása (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Nem sikerült a gyermekfolyamat elindítása (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Ismeretlen hiba a gyermekfolyamat (\"%s\") végrehajtása közben"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Nem sikerült elég adatot kiolvasni a gyermek pid csővezetékből (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "A karakter az UTF-8 tartományon kívülre esik"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Érvénytelen szekvencia az átalakítási bemenetben"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "A karakter az UTF-16 tartományon kívülre esik"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Használat:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPCIÓ...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Súgólehetőségek:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Súgólehetőségek megjelenítése"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Minden súgólehetőség megjelenítése"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Alkalmazás kapcsolói:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Nem dolgozható fel a(z) \"%s\" egész érték a következőhöz: %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "A(z) \"%s\" egész érték a tartományon kívülre esik a következőhöz: %s"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+"Nem dolgozható fel a(z) \"%s\" duplahosszúságú érték a következőhöz: %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+"A(z) \"%s\" duplahosszúságú érték a tartományon kívülre esik a következőhöz: "
+"%s"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Hiba a kapcsoló feldolgozása során: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Hiányzó paraméter a következőhöz: %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Ismeretlen opció: %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Az adatkönyvtárakban nem található érvényes kulcsfájl"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Nem szabályos fájl"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "A fájl üres"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"A kulcsfájl tartalmazza a(z) \"%s\" sort, amelyik nem egy kulcs-érték pár, "
+"csoport, vagy megjegyzés"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Érvénytelen programnév: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "A kulcsfájl nem csoporttal kezdődik"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Érvénytelen programnév: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "A kulcsfájl a nem támogatott \"%s\" kódolást tartalmazza"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "A kulcsfájlból hiányzik a(z) \"%s\" csoport"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "A kulcsfájlban nincs \"%s\" kulcs"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"A kulcsfájl tartalmazza a(z) \"%s\" kulcsot \"%s\" értékkel, amelyik azonban "
+"nem UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"A kulcsfájl tartalmazza a(z) \"%s\" kulcsot, amelynek az értéke nem "
+"értelmezhető."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"A kulcsfájl tartalmazza a(z) \"%s\" kulcsot a(z) \"%s\" csoportban, amelynek "
+"értéke nem értelmezhető."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+"A kulcsfájl nem tartalmazza a(z) \"%s\" kulcsot a(z) \"%s\" csoportban."
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+"A kulcsfájl escape-szekvenciával megadott karaktert tartalmaz a sor végén"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "A kulcsfájl érvénytelen escape-szekvenciát tartalmaz (\"%s\")"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "A(z) \"%s\" érték nem értelmezhető számként."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "A(z) \"%s\" egész érték a tartományon kívülre esik"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "A(z) \"%s\" érték nem értelmezhető lebegőpontos számként."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "A(z) \"%s\" érték nem értelmezhető logikai értékként."
diff --git a/trunk/po/hy.po b/trunk/po/hy.po
new file mode 100644
index 000000000..73971cfa7
--- /dev/null
+++ b/trunk/po/hy.po
@@ -0,0 +1,883 @@
+# glib.po armenian translation
+# Copyright (C) 2006 GNOME FOUNDATION
+# This file is distributed under the same license as the glib package.
+# Norayr Chilingaryan <norik@freenet.am>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-03-03 16:24+0000\n"
+"Last-Translator: Norayr Chilingaryan <norik@freenet.am>\n"
+"Language-Team: Armenian <norik@freenet.am>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 16bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Չի հաջողվել կարդալ '%s' սիմվոլիկ հղումը՝ %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr ""
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr ""
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr ""
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr ""
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr ""
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr ""
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr ""
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr ""
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr ""
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr ""
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr ""
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr ""
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "'%s' պանակը բացելու սխալ՝ %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Չի հաջովում հատկացնել %lu բայթ \"%s\" ֆայլը կարդալու համար"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "'%s' ֆայլը կարդալու սխալ՝ %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Չի հաջողվում կարդալ '%s' ֆայլից՝ %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Չի հաջողվել բացել '%s' ֆայլը՝ %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Չի հաջողվել բացել '%s' ֆայլը՝ fdopen() խափանվեց՝ %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Չի հաջողվել վերանվանել '%s' ֆայլը որպես '%s'՝ g_rename() խափանվեց՝ %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Չի հաջողվել ստեղծել ֆայլ '%s'՝ %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Չի հաջողվել բացել '%s' ֆայլը գրելու համար՝ fdopen() խափանվել է՝ %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Չի հաողվել գրել '%s' ֆայլ՝ fwrite() խափանվեց՝ %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Չի հաջովել փակել '%s' ֆայլը՝ fclose() խափանվեց՝ %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "'%s' ֆայլը չի կարող վերացվել՝ g_unlink() խափանվեց՝ %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr ""
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr ""
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Չի հաջողվել կարդալ '%s' սիմվոլիկ հղումը՝ %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Սիմվոլիկ հղումները չեն ապահովվում"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr ""
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr ""
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr ""
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Չի հաջողվել բացել '%s' ֆայլը՝ open() խափանվեց՝ %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr ""
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Սխալ %d տողի %d տառում՝ %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Սխալ %d տողում՝ %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr ""
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr ""
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr ""
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr ""
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr ""
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Սխալ UTF-8 կոդավորված տեքստ"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Փաստաթուղթը պետք է սկսվի որևէ էլէմենտով (օրինակ <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr ""
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr ""
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr ""
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr ""
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Սխալ %d տողի %d տառում՝ %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+msgid "unfinished symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr ""
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr ""
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr ""
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr ""
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr ""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr ""
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr ""
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Կիրառում՝"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+#, fuzzy
+msgid "Help Options:"
+msgstr "Ցուցադրել Ձեռնարկի հատկությունները"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Ցուցադրել Ձեռնարկի հատկությունները"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr ""
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr ""
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr ""
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr ""
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Ֆայլը դատարկ է"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr ""
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr ""
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
diff --git a/trunk/po/id.po b/trunk/po/id.po
new file mode 100644
index 000000000..7837db783
--- /dev/null
+++ b/trunk/po/id.po
@@ -0,0 +1,970 @@
+# Indonesia translation of glib.
+# Copyright (C) 2005 THE glib's COPYRIGHT HOLDER
+# This file is distributed under the same license as the glib package.
+# Mohammad DAMT <mdamt@bisnisweb.com>, 2005.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2005-08-30 22:41+0300\n"
+"Last-Translator: Mohammad DAMT <mdamt@bisnisweb.com>\n"
+"Language-Team: Indonesia <sukarelawan@gnome.linux.or.id>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Ada karakter aneh '%s'. Seharusnya ada karakter '=' setelah nama atribut '%"
+"s' pada elemen '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "File kunci yang benar tidak ditemukan pada direktori data"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Gagal saat membaca link simbolik '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Konversi dari gugus karakter '%s' ke '%s' tidak dapat dilakukan"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Tidak dapat membuka pengubah dari '%s' ke '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Rangkaian byte dalam input konversi tidak benar"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Error saat melakukan konversi: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Rangkaian karakter sebagian pada akhir input"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Tidak dapat mengkonversi, kembalikan '%s' ke gugus kode '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' bukanlah URI absolut dengan menggunakan skema \"file\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "URI File lokal '%s' tidak boleh ada karakter '#' di dalamnya"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' tidak benar"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Nama host pada URI '%s' tidak benar"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' berisi karakter escape yang salah"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Nama path '%s' bukan path absolut"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Nama host salah"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Error saat membuka direktori '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Tidak dapat mengalokasikan %lu byte untuk membaca file '%s'"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Error saat membaca file '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Gagal saat membaca file '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Gagal saat membuka file '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"Gagal saat mengambil atribut file '%s': Fungsi fstat() mengalami kegagalan: %"
+"s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Gagal saat membuka file '%s': fungsi fdopen() mengalami kegagalan: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Gagal untuk mengubah nama file '%s' menjadi '%s': g_rename() gagal: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Gagal saat membuat file '%s': %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Gagal untuk membuka file '%s' untuk menulis: fdopen() gagal: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Gagal untuk menulis file '%s': fwrite() gagal: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Gagal untuk menutup file '%s': fclose() gagal: '%s'"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "File '%s' tidak dapat dibuang: g_unlink() gagal: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Template '%s' salah, seharusnya tidak boleh berisi '%s'"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Template '%s' tidak boleh diakhiri dengan XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Gagal saat membaca link simbolik '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Link simbolik tidak didukung oleh sistem"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Tidak dapat membuka konverter dari '%s' menjadi '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"Tidak dapat melakukan proses baca raw pada fungsi "
+"g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Ada data tersisa yang belum dikonversi pada buffer read"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Chanel terputus pada karakter sebagian"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+"Tidak dapat melakukan proses baca raw pada fungsi g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Gagal saat membuka file '%s': fungsi open() mengalami kegagalan: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr ""
+"Gagal saat memetakan berkas '%s': fungsi mmap() mengalami kegagalan: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Error pada baris %d huruf ke %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Error pada baris ke %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Ada entitas '&;' yang kosong; Entitas yang benar antara lain adalah: &amp; "
+"&quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Karakter '%s' tidak benar apabila ada pada awal nama entitas; Karakter & "
+"yang boleh ada pada awal entitas; Bila ampersand ini dianggap bukan sebuah "
+"entitas, Beri kode escape dan tulis sebagai &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Karakter '%s' tidak boleh digunakan pada nama entitas"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Nama entitas '%s' tidak diketahui"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entitas tidak diakhiri dengan titik koma. Mungkin Anda menggunakan karakter "
+"ampersand tanpa bermaksud menjadikannya sebagai entitas - silakan pakai "
+"&amp; saja"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Gagal saat mengurai '%-.*s'. yang seharusnya sebuah digit dalam referensi "
+"karakter (misalnya &#234;) - mungkin digitnya terlalu besar"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr ""
+"Referensi karakter '%-.*s' tidak mengencodekan karakter yang diperbolehkan"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Refensi karakter kosong. Seharusnya berisi digit, mislanya &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Referensi karakter tidak diakhiri dengan titik koma; Mungkin Anda sedang "
+"menggunakan karakter ampersand tanpa bermaksud menjadikannya sebagai "
+"entitas. Silakan gunakan &amp; saja"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Referensi entitas yang tidak sempurna"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Refersi karakter yang tidak sempurna"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Teks UTF-8 tidak benar"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokumen harus dimulai dengan elemen (misalnya <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' bukanlah karakter yang benar bila diikuti dengan karakter '<'. Ini "
+"tidak boleh menjadi nama elemen"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Ada karakter aneh '%s'. Seharusnya ada '>' untuk mengakhiri tag awal pada "
+"elemen '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Ada karakter aneh '%s'. Seharusnya ada karakter '=' setelah nama atribut '%"
+"s' pada elemen '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Ada karakter aneh '%s'. Seharusnya ada '>' atau '/' untuk mengakhiri tag "
+"padaelemen '%s', atau bisa juga ada atribut lain. Mungkin Anda menggunakan "
+"karakter yang tidak diperbolehkan pada nama atribut."
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Ada karakter aneh '%s'. Seharusnya ada tanda kutip buka setelah tanda sama "
+"dengan saat memberikan nilai atribut '%s' pada elemen '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' bukan karakter yang benar bila diikuti dengan karakter '</'. Karena itu "
+"'%s' tidak boleh dijadikan awal nama elemen"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' bukan karakter yang benar bila diikuti elemen penutup '%s'. Karakter "
+"yang diperbolehkan adalah '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Elemen '%s' sudah ditutup, tidak ada elemen yang masih terbuka"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Elemen '%s' sudah ditutup, tapi elemen yang masih terbuka adalah '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokumen kosong atau berisi whitespace saja"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Dokumen terpotong tidak sempurna sesaat setelah membuka kurung siku '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokumen terpotong tidak sempurna dengan elemen yang masih terbuka - '%s' "
+"adalah elemen terakhir yang dibuka"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokumen terpotong tidak sempurna, seharusnya ada kurung siku penutup untuk "
+"mengakhiri tag <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokumen terpotong tidak sempurna pada dalam nama elemen"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokumen terpotong tidak sempurna di dalam nama atribut"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokumen terpotong tidak sempurna di dalam tag pembukaan elemen."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokumen terpotong tidak sempurna setelah tanda sama dengan mengikuti nama "
+"atribut. Tidak ada nilai atribut yang diperoleh"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokumen tidak sempura saat ada dalam nilai atribut"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Dokumen terpotong tidak sempurna di dalam tag penutup elemen '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Dokumen terpotong tidak sempurna di dalam keterangan atau instruksi "
+"pemrosesan"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Error pada baris %d huruf ke %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Referensi entitas yang tidak sempurna"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Teks yang dikutip tidak dimulai dengan tanda kutip"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Tanda kutip kurang satu pada perintah atau pada teks yang dikutip dari shell "
+"lain"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr ""
+"Teks berakhir saat setelah karakter '\\' dijumpai. (Teksnya adalah '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Teks berakhir sebelum tanda kutip pasangannya ditemukan untuk %c. (Tesknya "
+"adalah '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Teksnya kosong (atau hanya berisi whitespace)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Gagal untuk membaca data dari proses child"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+"Gagal saat membuat pipe untuk sarana komunikasi dengan proses child (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Gagal saat membaca dari pipe child (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Gagal saat mengganti direktori ke '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Gagal saat menjalankan proses child (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Nama program salah: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "String tidak benar pada vektor argumen pada %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "String tidak benar pada variabel lingkungan: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Direktori aktif salah: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Gagal saat menjalankan program bantuan (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Ada error pada g_io_channel_win32_poll() saat membaca dari proses child"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Gagal saat membaca data dari proses child (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Ada error pada fungsi select() saat membaca data dari proses child (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Ada error pada fungsi waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Gagal saat fork (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Gagal saat menjalankan proses child '%s' (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Gagal mengarahkan output atau input pada proses child (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Gagal saat fork proses child (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Ada error yang tidak diketahui saat menjalankan proses child '%s'"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Gagal saat membaca data yang dibutuhkan dai pipe pid child (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Karakter di luar jangkauan UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Rangkaian input konversi salah"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Karakter di luar jangkauan UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Gunakan:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[PILIHAN...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Pilihan Bantuan:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Tampilkan pilihan bantuan"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Tampilkan seluruh pilihan bantuan"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Pilihan Aplikasi:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Tidak dapat menguraikan nilai integer '%s' untuk %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Nilai integer '%s' untuk %s di luar jangkauan"
+
+#: glib/goption.c:831
+#, fuzzy, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Tidak dapat menguraikan nilai integer '%s' untuk %s"
+
+#: glib/goption.c:839
+#, fuzzy, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Nilai integer '%s' untuk %s di luar jangkauan"
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Error saat melakukan konversi: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Argumen untuk %s tidak lengkap"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Pilihan tidak diketahui %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "File kunci yang benar tidak ditemukan pada direktori data"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Bukan sebuah file biasa"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Filenya kosong"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"File kunci berisi baris '%s' yang bukan pasangan nilai kunci, kelompok atau "
+"komentar"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Nama program salah: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "File kunci tidak mulai dengan sebuah kelompok"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Nama program salah: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "File kunci mengadung encoding yang tidak didukung '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "File kunci tidak memiliki kelompok '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "File kunci tidak memiliki kunci '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "File kunci mengandung kunci '%s' dengan nilai '%s' yang bukan UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"File kunci mengandung kunci '%s' yang memiliki nilai yang tidak dapat "
+"diterjemahkan."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"File kunci mengandung kunci '%s' dalam kelompok '%s' yang memiliki nilai "
+"yang tidak dapat diterjemahkan."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "File kunci tidak memiliki kunci '%s' pada kelompok '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "File kunci mengandung karakter escape pada akhir baris"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "File kunci berisi '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Nilai '%s' tidak dapat diterjemahkan sebagai sebuah nomor."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Nilai integer '%s' di luar jangkauan"
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Nilai '%s' tidak dapat diterjemahkan sebagai sebuah nomor."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Nilai '%s' tidak dapat diterjemahkan sebagai suatu nilai boolean."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Gagal untuk merubah moda berkas: fclose() gagal: '%s'"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Gagal untuk merubah moda berkas: waitpid() gagal: %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Gagal untuk merubah moda berkas: chmod() gagal: '%s'"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr ""
+#~ "Moda berkas tidak dapat diubah: Proses anak dimatikan melalui sinyal: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr ""
+#~ "Moda berkas tidak dapat diubah: Proses anak dimatikan secara tidak normal"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Konversi karakter dari '%s' menjadi '%s' belum dapat dilakukan"
+
+#~ msgid "Incorrect message size"
+#~ msgstr "Ukuran pesan salah"
+
+#~ msgid "Socket error"
+#~ msgstr "Error socket"
diff --git a/trunk/po/is.po b/trunk/po/is.po
new file mode 100644
index 000000000..8cdb1d799
--- /dev/null
+++ b/trunk/po/is.po
@@ -0,0 +1,924 @@
+# Icelandic translation of glib
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This file is distributed under the same license as the glib package.
+# Richard Allen <ra@ra.is>, 2003
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib 2.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2003-08-18 18:05+0000\n"
+"Last-Translator: Richard Allen <ra@ra.is>\n"
+"Language-Team: is <is@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Undarlegt tákn '%s', átti von á '=' eftir heiti eiginleika '%s' af mengi '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "gat ekki lesið tákntengið '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Umbreyting úr stafasettinu '%s' í '%s' er ekki stutt"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Gat ekki opnað umbreyti úr '%s' í '%s': %s"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Ógild bætaruna í ílagi umbreytingar"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Villa við umbreytingu: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Ókláruð stafaruna í enda ílags"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Gat ekki umbreytt '%s' í stafatöflu '%s'"
+
+#: glib/gconvert.c:1727
+#, fuzzy, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' er ekki fullt URI sem notar 'file' skemuna"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Skráar-URI '%s' má ekki innihalda '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' er ógilt"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Vélarheitið í URI '%s' er ógilt"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' inniheldur ógild sértákn"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Slóðin '%s' er ekki full slóð"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Ógilt vélarheiti"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Villa við að opna möppuna '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Gat ekki frátekið %lu bæti til að lesa skrána \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Villa við lestur skráarinnar '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Gat ekki lesið úr skránni '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Gat ekki opnað skrána '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "gat ekki lesið eiginleika skráarinnar '%s': fstat() brást: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "gat ekki búið til skrána '%s': %s"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Sniðmátið '%s' er ógilt og ætti ekki að innihalda '%s'"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Sniðmátið '%s' endar ekki á XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "gat ekki lesið tákntengið '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Tákntengi eru ekki studd"
+
+#: glib/giochannel.c:1152
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Gat ekki opnað umbreyti úr `%s' í `%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Gat ekki lesið í g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Það eru eftir óumbreytt gögn í lesminninu"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Rásin endar á hluta úr tákni"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Gat ekki lesið í g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Villa á línu %d tákn %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Villa á línu %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Tómt viðfang '&;' fannst; gild viðföng eru: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Táknið '%s' er ógilt í upphafi heiti viðfanga; & táknið byrjar viðfang; ef "
+"Þetta og-merki á ekki að vera byrjun viðfangs ættir þú að rita það sem &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Táknið '%s' er ekki gilt í heitum viðfanga"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Viðfangið '%s' er óþekkt"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Viðfangið endar ekki á semikommu; líklega notaðir þú og-merkið án þess að "
+"ætla að byrja viðfang. Ritaðu það sem &amp;"
+
+#: glib/gmarkup.c:573
+#, fuzzy, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Gat ekki þáttað '%s' sem ætti að vera tölustafur innan í tilvísun í tákn "
+"(til dæmis &#234;). Ef til vill er talan of stór"
+
+#: glib/gmarkup.c:598
+#, fuzzy, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Tákntilvísunin '%s' vísar ekki í leyfilegt tákn"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Tóm tákntilvísun; hún ætti að innihalda tölur eins og &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Viðfangið endar ekki á semikommu; líklega notaðir þú og-merkið án þess að "
+"ætla að byrja viðfang. Ritaðu það sem &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Hálfkláruð viðfangatilvísun"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Hálfkláruð tákntilvísun"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Ógildur UTF-8 þýddur texti"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Skjalið verður að byrja á viðfangi (t.d. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' er ekki gilt tákn strax á eftir '<' tákninu; það má ekki byrja á heiti "
+"viðfangs"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr "Undarlegt tákn '%s', átti von á '>' tákninu til að enda viðfangið '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Undarlegt tákn '%s', átti von á '=' eftir heiti eiginleika '%s' af mengi '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Undarlegt tákn '%s', átti von á '>' eða '/' tákni rtil þess að enda upphafs "
+"viðfangi '%s', eða eiginleika; Þú notaðir ef til vill ógilt tákn í heiti "
+"eiginleika"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Undarlegt tákn '%s', átti von á tilvísunarmerki eftir samasem merkinu þegar "
+"gildi er gefið með eiginleikanum '%s' af menginu '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' er ekki gilt tákn strax á eftir '</'; '%s' má ekki vera fyrsta tákn í "
+"heiti mengis"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' er ekki gilt tákn strax á eftir lokun mengis '%s'. Leyfilegt tákn er '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Mengið '%s' var lokað og engin önnur mengi eru opin"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Mengið '%s' var lokað en mengið sem nú er opið er '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Skjalið var tómt eða innihélt einungis orðabil"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Skjalið endar óvænt rétt eftir opið minna en merki '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Skjalið endar óvænt með mengi sem enn eru opin. '%s' var mengið sem síðast "
+"var opnað"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Skjalið endar óvænt. Átti von á að sjá stærraen merki sem lokar taginu <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Skjalið endar óvænt inn í heiti mengis"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Skjalið endar óvænt inn í heiti eiginleika"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Skjalið endar óvænt inn í tagi sem opnar mengi."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Skjalið endar óvænt eftir samasem merkið sem fylgir heiti eiginleika og það "
+"er ekkert gildi"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Skjalið endar óvænt inn í gildi eiginleika"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Skjalið endar óvænt inni í lokunartagi fyrir mengið '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Skjalið endar óvænt inni í athugasemd eða í miðri skipun"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Villa á línu %d tákn %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Hálfkláruð viðfangatilvísun"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Tilvísunin byrjar ekki á spurningarmerki"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Tilvísunarmerki stemma ekki í skipanalínunni eða öðrum texta"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Textinn endaði eftir '\\' tákn. (Textinn var '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "Textinn endaði áður en samstaða við %c fannst. (Textinn var '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Textinn var tómur (eða innihélt eingöngu orðabil)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Gat ekki lesið gögn frá undirferli"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Gat ekki búið til pípu til samskipta við undirferli (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Gat ekki lesið úr undirferlispípu (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Gat ekki farið í möppuna '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Gat ekki keyrt undirferli (%s)"
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "Ógilt vélarheiti"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, fuzzy, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Ógild runa í ílagi umbreytingar"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr "Villa við að opna möppuna '%s': %s"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Gat ekki keyrt hjálparforrit"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr "Óvænt villa í g_io_channel_win32_poll() við lestur úr undirferli"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Gat ekki lesið gögn frá undirferli (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Óvæn villa í select() við lestur gagna frá undirferli (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Óvæn villa í waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Gat ekki ræst (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Gat ekki ræst undirferli \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Gat ekki sent frálag eða ílag underferlis annað (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Gat ekki ræst undirferli (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Óþekkt villa við keyrslu undirferlis \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Gat ekki lesið nægjanleg gögn úr pípunni til undirferlisins (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Táknið er utan UTF-8 sviðsins"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Ógild runa í ílagi umbreytingar"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Táknið er utan UTF-16 sviðsins"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr ""
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr ""
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr ""
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr ""
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Villa við umbreytingu: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr ""
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr ""
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Ógilt vélarheiti"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Ógilt vélarheiti"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, fuzzy, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "URI '%s' inniheldur ógild sértákn"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Gat ekki frátekið %lu bæti til að lesa skrána \"%s\""
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Umbreyting úr stafatöflunni `%s' í `%s' er ekki stutt"
diff --git a/trunk/po/it.po b/trunk/po/it.po
new file mode 100644
index 000000000..71869618f
--- /dev/null
+++ b/trunk/po/it.po
@@ -0,0 +1,973 @@
+# Italian translation for GLIB
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# Christopher R. Gabriel <cgabriel@pluto.linux.it> , 2002
+# Luca Ferretti <elle.uca@libero.it>, 2004-2006
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib 2.12.x\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-01-08 11:19+0100\n"
+"Last-Translator: Luca Ferretti <elle.uca@libero.it>\n"
+"Language-Team: Italian <tp@lists.linux.it>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Attributo \"%s\" inatteso per l'elemento \"%s\""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Attributo \"%s\" dell'elemento \"%s\" non trovato"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Tag \"%s\" inatteso; atteso il tag \"%s\""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Tag \"%s\" inatteso all'interno di \"%s\""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+"Non è stato trovato alcun file di segnalibri valido nelle directory dei dati"
+
+# usate le «» perché forse questa compare nella UI
+#
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Esiste già un segnalibro per l'URI «%s»"
+
+# vedi sopra per «»
+#
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Non è stato trovato alcun segnalibro per l'URI «%s»"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Nessuna definizione di tipo MIME nel segnalibro per l'URI \"%s\""
+
+# o private è il nome della flag (che quindi diventa opzione)?
+# cercare nel codice... -Luca
+#
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+"Non è stata definita alcuna flag privata nel segnalibro per l'URI \"%s\""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Nessun gruppo impostato nel segnalibro per l'URI \"%s\""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Nessuna applicazione di nome «%s» ha registrato un segnalibro per «%s»"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Espansione della riga exec \"%s\" con l'URI \"%s\" fallita"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr ""
+"La conversione del set di caratteri da \"%s\" a \"%s\" non è supportata"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Impossibile aprire il convertitore da \"%s\" a \"%s\""
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Sequenza di byte non valida nell'ingresso per la conversione"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Errore durante la conversione: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Sequenza di caratteri parziale al termine dei dati in ingresso"
+
+# il primo %s è una 'fallback string' come recita il commento nel codice
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Impossibile convertire \"%s\" nel set di caratteri \"%s\""
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "L'URI \"%s\" non è un URI assoluto che utilizza lo schema \"file\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "L'URI per il file locale \"%s\" non può includere un '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "L'URI \"%s\" non è valido"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Il nome dell'host nell'URI \"%s\" non è valido"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "L'URI \"%s\" contiene sequenze di escape non valide"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Il nome di percorso \"%s\" non è un percorso assoluto"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Nome host non valido"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Errore nell'aprire la directory \"%s\": %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Impossibile allocare %lu bytes per leggere il file \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Errore nel leggere il file \"%s\": %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Lettura dal file \"%s\" fallita: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Apertura del file \"%s\" fallita: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Lettura degli attributi del file \"%s\" fallita: fstat() fallita: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Apertura del file \"%s\" fallita: fdopen() fallita: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Cambio di nome del file \"%s\" in \"%s\" fallito: g_rename() fallita: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Creazione del file \"%s\" fallita: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Apertura del file \"%s\" in scrittura fallita: fdopen() fallita: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Scrittura del file \"%s\" fallita: fwrite() fallita: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Chiusura del file \"%s\" fallita: fclose() fallita: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+"Il file \"%s\" non può essere rimosso pur esistendo: g_unlink() fallita: %s"
+
+# Il secondo %s è qualcosa tipo
+#
+# char c[2];
+# c[1] = dir_separator;
+# c[2] = '\0';
+#
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Il modello \"%s\" non è valido, non dovrebbe contenere un \"%s\""
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Il modello \"%s\" non contiene XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Lettura del collegamento simbolico \"%s\" fallita: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Collegamenti simbolici non supportati"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Impossibile aprire il convertitore da \"%s\" a \"%s\": %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Impossibile leggere i dati grezzi in g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Sono rimasti dei dati non convertiti nel buffer di lettura"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Il canale termina in un carattere parziale"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Impossibile eseguire una lettura grezza in g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Apertura del file \"%s\" fallita: open() fallita: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Mappatura del file \"%s\" fallita: mmap() fallita: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Errore alla riga %d carattere %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Errore alla riga %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Rilevata entità vuota '&;' (sono entità valide &amp; &quot; &lt; &gt; &apos;)"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Il carattere '%s' non è valido all'inizio di un nome di entità: il carattere "
+"'&' dà inizio ad un'entità; se questo simbolo \"e commerciale\" non vuole "
+"essere l'inizio di una entità, ricorrere a &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Il carattere '%s' non è valido all'interno di un nome di entità"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Il nome di entità '%s' è sconosciuto"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"L'entità non termina con un punto e virgola; probabilmente è stata "
+"utilizzata una \"e commerciale\" senza l'intento di iniziare una entità. In "
+"tal caso ricorrere a \"&amp;\""
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Analisi di '%-.*s' fallita: dovrebbe presentare una numero all'interno di un "
+"riferimento a carattere (es. &#234;) - probabilmente il numero è troppo "
+"grande"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr ""
+"Il riferimento a carattere \"%-.*s\" non codifica un carattere permesso"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+"Riferimento a carattere vuoto; dovrebbe includere un numero, come &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Il riferimento a carattere non termina con un punto e virgola; probabilmente "
+"si è utilizzato un carattere \"e commerciale\" senza l'intenzione di "
+"iniziare una nuova entità. In tal caso ricorrere a \"&amp;\""
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Riferimento a entità non terminato"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Riferimento a carattere non terminato"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Testo in codifica UTF-8 non valido"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Il documento deve iniziare con un elemento (es. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' non è un carattere valido dopo il carattere '<'; non può iniziare con "
+"il nome di un elemento"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Trovato carattere '%s', atteso invece un carattere '>' per terminare il tag "
+"di inizio dell'elemento \"%s\""
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Trovato carattere '%s', atteso invece un carattere '=' dopo il nome "
+"dell'attributo \"%s\" dell'elemento \"%s\""
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Trovato carattere '%s', atteso invece il carattere '>' oppure '/' per "
+"terminare il tag di partenza dell'elemento \"%s\", oppure opzionalmente un "
+"attributo. Probabilmente è stato usato un carattere non valido nel nome di "
+"un attributo"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Trovato carattere '%s', atteso invece un simbolo di quoting aperto dopo il "
+"segno di uguale per attribuire un valore all'attributo \"%s\" dell'elemento "
+"\"%s\""
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' non è un carattere valido dopo i caratteri '</'; '%s' non può dare "
+"inizio ad un nome di elemento"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' non è un carattere valido per seguire la chiusura del nome "
+"dell'elemento \"%s\"; il carattere permesso è '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "È stato chiuso l'elemento \"%s\", nessun elemento correntemente aperto"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"È stato chiuso l'elemento \"%s\", ma l'elemento correntemente aperto è \"%s\""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Il documento era vuoto oppure conteneva unicamente spazi"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Il documento è terminato in modo inatteso subito dopo una parentesi angolare "
+"d'apertura '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Il documento è terminato in modo inatteso con elementi ancora aperti - \"%s"
+"\" era l'ultimo elemento aperto"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Il documento è terminato in modo inatteso, mancando la parentesi angolare di "
+"chiusura per il tag <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr ""
+"Il documento è terminato in modo inatteso all'interno di un nome di elemento"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr ""
+"Il documento è terminato in modo inatteso all'interno di un nome di attributo"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+"Il documento è terminato in modo inatteso all'interno di un tag di apertura "
+"elemento."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Il documento è terminato in modo inatteso dopo il segno di uguale che segue "
+"un nome di attributo; l'attributo non ha un valore"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+"Il documento è terminato in modo inatteso all'interno di un valore di "
+"attributo"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Il documento è terminato inaspettatamente all'interno del tag di chiusura "
+"per l'elemento \"%s\""
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Il documento è terminato in modo inatteso all'interno di un commento o "
+"istruzione di processo"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Errore alla riga %d carattere %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Riferimento a entità non terminato"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Il testo citato non inizia con un carattere di quoting"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Carattere di quoting non accoppitato nella riga di comando o nel testo con "
+"quoting di shell"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Il testo è finito subito dopo un carattere '\\' (il testo era \"%s\")."
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Il testo è finito prima di trovare il carattere di quoting corrispondente "
+"per %c (il testo era \"%s\")."
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Il testo era vuoto (oppure conteneva unicamente spazi bianchi)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Lettura di dati dal processo figlio fallita"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+"Creazione della pipe per comunicare con il processo figlio (%s) fallita"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Lettura dalla pipe figlia (%s) fallita"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Cambio della directory in \"%s\" (%s) fallita"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Esecuzione del processo figlio (%s) fallita"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Nome programma non valido: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Stringa non valida nel vettore di argomenti a %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Stringa non valida nell'ambiente: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Directory di lavoro non valida: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Esecuzione del programma helper (%s) fallita"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Errore inatteso in g_io_channel_win32_poll() nel leggere i dati da un "
+"processo figlio"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Lettura dei dati dal processo figlio (%s) fallita"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Errore inatteso in select() nel leggere i dati da un processo figlio (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Errore inatteso in waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Esecuzione di fork (%s) fallita"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Esecuzione del processo figlio \"%s\" (%s) fallita"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Redirezione dell'output o input del processo figlio (%s) fallita"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Esecuzione del fork per processo figlio (%s) fallita"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Errore sconosciuto nell'eseguire il processo figlio \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"Lettura di una quantità di dati sufficiente dalla pipe del processo figlio (%"
+"s) fallita"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Carattere fuori dell'intervallo per UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Sequenza non valida in ingresso per la conversione"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Carattere fuori dell'intervallo per UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Uso:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPZIONE...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Opzioni di aiuto:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Mostra le opzioni di aiuto"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Mostra tutte le opzioni di aiuto"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Opzioni dell'applicazione:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Impossibile analizzare il valore intero \"%s\" per %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Il valore intero \"%s\" per %s è fuori dell'intervallo"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Impossibile analizzare il valore double \"%s\" per %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Il valore double \"%s\" per %s è fuori dell'intervallo"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Errore nell'analizzare l'opzione %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Argomento mancante per %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Opzione %s sconoscuta"
+
+# key files sono, per glib, file di impostazioni in stile Windows INI
+#
+# Ad esempio i file .themes per i temi del desktop e delle icone.
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Impossibile trovare un file chiavi valido nelle directory dei dati"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Non è un file normale"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Il file è vuoto"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Il file chiavi contiene la riga «%s» che non è una coppia chiave-valore, un "
+"gruppo o un commento valido"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Nome gruppo non valido: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Il file chiavi non inizia con un gruppo"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Nome chiave non valido: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Il file chiavi contiene la codifica non supportata \"%s\""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Il file chiavi non presenta il gruppo \"%s\""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Il file chiavi non presenta la chiave \"%s\""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Il file chiavi contiene la chiave \"%s\" con il valore \"%s\" che non è UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Il file chiavi contiene la chiave \"%s\" il cui valore non può essere "
+"interpretato."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Il file chiavi contiene la chiave \"%s\" nel gruppo \"%s\" il cui valore non "
+"può essere interpretato."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Il file chiavi non presenta alcuna chiave \"%s\" nel gruppo \"%s\""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Il file chiavi contiene un carattere di escape alla fine della riga"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Il file chiavi contiene la sequenza di escape non valida \"%s\""
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Impossibile interpretare il valore \"%s\" come un numero."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Il valore intero \"%s\" è fuori dall'intervallo"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Impossibile interpretare il valore \"%s\" come un numero float."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Impossibile interpretare il valore \"%s\" come un booleano."
diff --git a/trunk/po/ja.po b/trunk/po/ja.po
new file mode 100644
index 000000000..6aea65862
--- /dev/null
+++ b/trunk/po/ja.po
@@ -0,0 +1,927 @@
+# Japanese translation of glib.
+# Copyright (C) 2001-2006 Free Software Foundation, Inc.
+# Takayuki KUSANO <AE5T-KSN@asahi-net.or.jp>, 2001-2002.
+# KAMAGASAKO Masatoshi <emerald@gnome.gr.jp>, 2003.
+# Takeshi AIHANA <aihana@gnome.gr.jp>, 2004-2006.
+# Ryoichi INAGAKI <ryo1@bc.wakwak.com>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-16 23:05+0900\n"
+"Last-Translator: Satoru SATOH <ss@gnome.gr.jp>\n"
+"Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "想定外の属性 '%s' (要素 '%s') です"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "属性 '%s' (要素 '%s') がありません"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "想定外のタグ '%s' です (想定していたタグは '%s')"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "想定外のタグ '%s' ('%s' 内) です"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "データ・ディレクトリの中に適切なブックマーク・ファイルがありません。"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "URI が '%s' であるブックマークは既に存在します"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "URI '%s' のブックマークが見つかりませんでした"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "URI '%s' のブックマークの中で MIME 型が定義されていません"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+"URI '%s' のブックマークの中でプライベートではないフラグが定義されています"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "URI '%s' のブックマークの中にグループがありません"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "アプリケーション '%s' は '%s' のブックマークを登録していません"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "シンボリック・リンク '%s' の読み込みが失敗: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "文字セット '%s' から '%s' への変換はサポートしていません"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "'%s' から '%s' へのコンバータを開けませんでした"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "変換する入力に無効なバイトの並びがあります"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "変換中にエラー: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "入力の最後に不完全な文字シーケンスがあります"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "フォールバック '%s' を文字セット '%s' に変換できません"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' は \"file\" スキームの絶対 URI ではありません"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "ローカル・ファイルの URI '%s' は '#' は含みません"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' は正しくありません"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "URI のホスト名 '%s' がおかしいです"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' に無効なエスケープ文字が含まれています"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "パス名 '%s' が絶対パスではありません"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "無効なホスト名です"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "ディレクトリ '%s' を開く時にエラー: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "%lu バイトを確保できませんでした (ファイル \"%s\" の読み込みに必要)"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "ファイル '%s' の読み出し中にエラー: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "ファイル '%s' を読めません: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "ファイル '%s' を開けません: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "ファイル '%s' の属性の取得できません: fstat() が失敗: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "ファイル '%s' を開けません: fdopen() が失敗: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"'%s' から '%s' へのファイル名の変更に失敗しました: g_rename() が失敗: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "ファイル '%s' の生成に失敗しました: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "ファイル '%s' を書き込みモードで開けませんでした: fdopen() が失敗: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "ファイル '%s' への書き込みに失敗しました: fwrite() が失敗: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "ファイル '%s' を閉じれません: fclose() が失敗: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "既存のファイル '%s' を削除できませんでした: g_unlink() が失敗: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "テンプレート '%s' が正しくありません ('%s' を含めないこと)"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "テンプレート '%s' に XXXXXX が含まれていません"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "シンボリック・リンク '%s' の読み込みが失敗: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "シンボリック・リンクはサポートしていません"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "'%s' から '%s' へ変換するコンバータを開けませんでした: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "g_io_channel_read_line_string では raw モードで読めません"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "変換されていないデータが読みこみバッファに残っています"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "チャンネルが不完全な文字で終わっています"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "g_io_channel_read_to_end では raw モードで読めません"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "ファイル '%s' を開けません: open() が失敗: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "ファイル '%s' のマップに失敗しました: mmap() が失敗: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "行 %d の %d 文字目でエラー: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "%d 行目でエラー: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"空のエンティティ '&;' があります; 正しいエンティティは: &amp; &quot; &lt; "
+"&gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"文字 '%s' はエンティティ名の最初には使えません。文字 & はエンティティの開始を"
+"表わします。もしアンパサンドがエンティティでなければ、&amp; のようにエスケー"
+"プしてください"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "文字 '%s' はエンティティ名として使えません"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "エンティティ名 '%s' というのは不明です"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"エンティティがセミコロンで終わってません。エンティティでもないのにアンパサン"
+"ドを使ったのではないでしょうか。アンパサンドは &amp; のようにエスケープしてく"
+"ださい"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"'%-.*s' をパースできません。文字参照には数字が含まれなくてはなりません (例: "
+"&#234;) おそらく数字が大きすぎます"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "文字参照 '%-.*s' が使用可能な文字をエンコードしていません"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "空の文字参照です。&#454; のように数字がなくてはなりません"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"文字参照がセミコロンで終わっていません。エンティティのつもりもないのにアンパ"
+"サンド文字を使っているのかもしれません。アンパサンドは &amp; とエスケープして"
+"ください"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "中途半端な実体参照です"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "中途半端な文字参照です"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "UTF-8 として正しくないテキストです"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "ドキュメントはエレメントで始まってなくてはなりません (例 <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' は文字 '<' に続く文字としては正しくありません。おそらくエレメント名の開"
+"始になっていません"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"おかしな文字 '%s' があります。エレメント '%s' の開始タグの最後は文字 '>' でな"
+"くてはなりません"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"おかしな文字 '%s' です。属性名'%s' (エレメント '%s') の後には '=' が必要です"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"おかしな文字 '%s' です。エレメント '%s' の開始タグの末尾は '>' または '/' で"
+"なくてはなりません。あるいは属性になります。おかしな文字を属性名に使ったのか"
+"もしれません"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"おかしな文字 '%s' です。属性 '%s' (エレメント '%s') の値を設定するには等号記"
+"号の後は引用記号で始まってなくてはなりません"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' は '</' に続く文字としては正しくありません。'%s' ではエレメント名は始"
+"まってません"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' は閉じエレメント名 '%s' に続く文字としては正しくありあません。'>' のみが"
+"使用できます"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "エレメント '%s' は閉じています。エレメントは何も開かれてません"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "エレメント '%s' が閉ました。しかし現在開いているエレメントは '%s' です"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "ドキュメントが空か、空白だけが含まれています"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "ドキュメントが開きカギカッコ '<' の直後で突然終わっています"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"ドキュメントが突然終わっています。エレメントが開きっぱなしです。最後に開いた"
+"エレメントは '%s' です。"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"ドキュメントが突然終わっています。閉じカギカッコでタグ <%s/> が終わっていませ"
+"ん"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "エレメント名の途中でドキュメントが突然終わっています"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "属性名の途中でドキュメントが突然終わっています"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "エレメントの開始タグの途中でドキュメントが突然終わっています"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"属性名の後の等号記号の後でドキュメントが突然終わっています: 属性値がありませ"
+"ん"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "ドキュメントが属性値の途中で突然終わっています"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "ドキュメントがエレメント '%s' の閉じタグの途中で突然終わっています"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"ドキュメントがコメントあるいはプロセシング指示子の途中で突然終わっています"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "行 %d の %d 文字目でエラー: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "中途半端な実体参照です"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "引用テキストが引用記号で始まっていません"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"コマンドライン、あるいはシェルの引用テキストにおいて引用記号の対応が取れてい"
+"ません"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "テキストが文字 '\\' の直後に終わっています (テキストは '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "テキストが %c に対応する引用記号の前に終わっています (テキストは '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "テキストが空です (あるいは空白のみ)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "子プロセスからデータを読み出せません"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "子プロセスとの通信用のパイプを作成できません (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "子パイプから読み出せません (%s) "
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "ディレクトリ '%s' へ移動できません (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "子プロセスを起動できません (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "プログラム名が無効です: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "%d の引数ベクタに不正な文字列があります: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "環境変数に不正な文字列があります: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "作業ディレクトリが不正です: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "ヘルパー・プログラム (%s) の起動が失敗しました"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"g_io_channel_win32_poll() が子プロセスからデータを読み出す際に想定外のエラー"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "子プロセスからデータを読めません (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "子プロセスからデータを読み出す際に select() で想定外のエラー (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "waitpid() で想定外のエラー (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "fork 失敗 (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "子プロセスを起動できません \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "子プロセスの出力、または入力をリダイレクトできません (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "子プロセスを fork できません (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "子プロセスの実行時に不明なエラー \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "子 pid パイプから十分なデータを読めません (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "UTF-8 の範囲外の文字です"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "変換する入力で無効なシーケンスがあります"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "UTF-16 の範囲外の文字です"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "用法:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[オプション...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "ヘルプのオプション:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "ヘルプのオプションを表示する"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "ヘルプのオプションを全て表示する"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "アプリケーションのオプション:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "%2$s の整数値 '%1$s' を解析できません"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "%2$s の整数値 '%1$s' は範囲外の値です"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "%2$s の実数値 '%1$s' を解析できません"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "%2$s の実数値 '%1$s' は範囲外の値です"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "オプション %s の解析中にエラー"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "%s の引数がありません"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "%s は不明なオプションです"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "データ・ディレクトリには妥当なキー・ファイルがありませんでした"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "通常のファイルではありません"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "ファイルが空です"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"キー・ファイルの行 '%s' がキー/値のペア、グループ、またはコメントではありませ"
+"ん"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "プログラム名が無効です: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "キー・ファイルがグループで始まっていません"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "プログラム名が無効です: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "キー・ファイルにサポートしてないエンコーディング '%s' があります"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "キー・ファイルにグループ '%s' がありません"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "キー・ファイルにキー '%s' がありません"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "キー・ファイルのキー '%s' の値 '%s' が UTF-8 ではありません"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "キー・ファイルのキー '%s' の値を解釈できませんでした"
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"キー・ファイルのグループ '%2$s' にあるキー '%1$s' の値を解釈できませんでした"
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "キー・ファイルにはグループ '%2$s' のキー '%1$s' がありません"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "キー・ファイルの行末にエスケープ文字が含まれています"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "キー・ファイルに無効なエスケープ・シーケンス '%s' が含まれています"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "値 '%s' を数値として解釈できません"
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "整数値 '%s' は範囲外の値です"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "値 '%s' を実数値として解釈できません"
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "値 '%s' を論理値として解釈できません"
diff --git a/trunk/po/ka.po b/trunk/po/ka.po
new file mode 100644
index 000000000..cb2d61cbf
--- /dev/null
+++ b/trunk/po/ka.po
@@ -0,0 +1,932 @@
+# Georgian translation for GLIB.
+# Copyright © 2006 Ubuntu Georgian Translators.
+# This file is distributed under the same license as the GLIB package.
+# Gia Shervashidze <giasher@telenet.ge>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib 2.9.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-04-10 04:12+0200\n"
+"Last-Translator: Gia Shervashidze <giasher@telenet.ge>\n"
+"Language-Team: Georgian <ka@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"ზედმეტი სიმბოლო \"%s\", მოსალოდნელია \"=\"ატრიბუტის სახელის \"%s\" შემდეგ "
+"ელემენტისთვის \"%s\""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "მონაცემთა დასტებში მართებული საკვანძო ფაილი ვერ მოიძებნა"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "კოდური გვერდის \"%s\" გარდაქმნა \"%s\" კოდირებაში არაა რეალიზებული"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "ვერ ხერხდება \"%s\" - \"%s\" გარდამქმნელის გახსნა"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "შეტანილ ტექსტში ბაიტების მიმდევრობა მცდარია"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "გარდაქმნის შეცდომა: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "არასრული სიმბოლო შეტანის ტექსტის ბოლოს"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "ვერ ხერხდება \"%s\" სიმბოლოს გარდაქმნა კოდირებაში \"%s\""
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+"URI \"%s\" არ გახლავთ აბსოლუტური იდენტიფიკატორი \"file\" სქემის გამოყენებისას"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr ""
+"ლოკალური ფაილის URI იდენტიფიკატორი \"%s\" არ შეიძლება შეიცავდეს სიმბოლოს \"#"
+"\""
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI იდენტიფიკატორი \"%s\" მცდარია"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "URI იდენტიფიკატორის \"%s\" მასპინძლის სახელი მცდარია"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI იდენტიფიკატორი \"%s\" შეიცავ მცდარ საკონტროლო სიმბოლოებს"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "გეზი \"%s\" აბსოლუტური არ გახლავთ"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "მასპინძლის მცდარი სახელი"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "შეცდომ \"%s\" დასტის გახსნისას: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "ვერ ხერხდება %lu ბაიტის გამოყოფა \"%s\" ფაილის წასაკითხად"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "ფაილიდან \"%s\" წაკითხვის შეცდომა: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "ფაილის \"%s\" გახსნის შეცდომა: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "ფაილის \"%s\" ატრიბუტების წაკითხვის შეცდომა: ფუნქცია - fstat(): %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "ფაილის \"%s\" გახსნის შეცდომა: ფუნქცია - fdopen(): %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "ვერ მოხერხდა '%s' ფაილის გადარქმევა - '%s': g_rename() ვერ შედგა: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "ვერ ვქმნი '%s' ფაილს: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "ვერ ვხსნი '%s' ფაილს ჩასაწერად: fdopen() ვერ შედგა: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "ვერ ვწერ '%s' ფაილს: fwrite() ვერ შედგა: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "ვერ ვხურავ '%s' ფაილს: fclose() ვერ შედგა: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "არსებული '%s' ფაილი ვერ ამოიშლება: g_unlink() ვერ შედგა: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "თარგი '%s' მცდარია და '%s'-ს არ უნდა შეიცავდეს"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr " '%s' არ მთავრდება კონტექსტით XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "ვერ ხერხდება გარდამქმნელის გახსნა '%s' - '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "უშუალოდ წაკითხვა ფუნქციაში g_io_channel_read_line_string ვერ ხერხდება"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "გარდაუქმნელი მონაცემები წაკითხვის ბუფერში დარჩა"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "არხი არასრული სიმბოლოთი იხურება"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "უშუალოდ წაკითხვა ფუნქციაში g_io_channel_read_to_end ვერ ხერხდება"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "ვერ მოხერხდა '%s' ფაილის გახსნა: open() ვერ შედგა: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "ვერ მოხერხდა '%s' ფაილის განთავსება: mmap() ვერ შედგა: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "შეცდომა სტრიქონში %d სიმბოლო %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "შეცდომა სტრიქონში %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"ცარიელი ერთეული \"&;\"; შესაძლო ერთეულებია: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"სიმბოლო \"%s\" დაუშვებელია ერთეულის დასაწყისში; ერთეულიიწყება \"&\" "
+"სიმბოლოთი; თუ ეს სიმბოლო სიმბოლო ერთეულის ნაწილი უნდა იყოს გამოსახეთ იგი, "
+"როგორც &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "სიმბოლო \"%s\" ერთეულის სახელში დაუშვებელია"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "ერთეულის სახელი \"%s\" უცნობია"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"ერთეული არ მთავრდება წერტილ-მძიმით; როგორც ჩანს, სახელის დასაწყისში "
+"გამოყენებულია სიმბოლო \"&\". გამოსახეთ იგი, როგორც &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"ვერ მუშავდება სტრიქონი '%-.*s', რომელშიც უნდა იყოს სიმბოლოს ნომერი "
+"(მაგალითად, &#234;): შესაძლოა რიცხვი მეტისმეტად დიდია"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "სიმბოლოს ნომერი '%-.*s' დაუშვებელია"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+"სიმბოლოს დამოწმება ცარიელია; იგი ნომერს უნდა შეიცავდეს, მაგალითად, &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"სიმბოლოს ნომერი არ მთავრდება წერტილ-მძიმით; როგორც ჩანს, სახელის დასაწყისში "
+"გამოყენებულია სიმბოლო \"&\". გამოსახეთ იგი, როგორც &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "ერთეულის დამოწმება არაა დასრულებული"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "სიმბოლოს დამოწმება არაა დასრულებული"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "ტექსტის მცდარი UTF-8 კოდირება"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "დოკუმენტი უნდა დაიწყოს ელემეტით (მაგალითად <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"სიმბოლო \"%s\" დაუშვებელია \"<\" სიმბოლოს შემდეგ; ამ სიმბოლოთი ელემენტის "
+"სახელის დაწყება არ შეიძლება"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"ზედმეტი სიმბოლო \"%s\", მოსალოდნელია \">\" სიმბოლო ელემენტის \"%s\" ჭდის "
+"დასახურად"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"ზედმეტი სიმბოლო \"%s\", მოსალოდნელია \"=\"ატრიბუტის სახელის \"%s\" შემდეგ "
+"ელემენტისთვის \"%s\""
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"ზედმეტი სიმბოლო \"%s\", მოსალოდნელია \">\" ან \"/\" ელემენტის \"%s\" "
+"გამხსნელი ჭდის დასახურად ან დამატებითი ატრიბუტი; ასევე, შესაძლოა მცდარი "
+"სიმბოლო ატრიბუტის სახელში"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"ზედმეტი სიმბოლო \"%s\", მოსალოდნელია გახსნილი ბრჭყალები ტოლობის ნიშნის "
+"შემდეგ ატრიბუტისთვის \"%s\" მნიშვნელობის მისანიჭებლად ელემენტისთვის \"%s\""
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"სიმბოლო \"%s\" დაუშვებელია \"</\" შემდეგ; სიმბოლო \"%s\" არ შეიძლება იყოს "
+"ელემენტის სახელის დასაწყისში"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"სიმბოლო \"%s\" დაუშვებელია ელემენტის \"%s\" დახურვის ჭდის შემდეგ; დასაშვები "
+"სიმბოლოა \">\""
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "ელემენტი \"%s\" დაიხურა, არცერთი ელემენტი არაა გახსნილი"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "ელემენტი \"%s\" დაიხურა, მაგრამ გახსნილია ელემენტი \"%s\""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "დოკუმენტი ცარიელია ან მხოლოდ ხარეებს შეიცავს"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "დოკუმენტი დასრულდა უშუალოდ კუთხოვანი ფრჩხილის \"<\" შემდეგ"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"დოკუმენტი მოულოდნელად დასრულდა გახსნილი ელემენტებით - \"%s\" ბოლო გახსნილი "
+"ელემენტია"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"დოკუმენტი მოულოდნელად დასრულდა, მოსალოდნელია ჩამკეტი კუთხოვანი ფრჩხილი <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "დოკუმენტი მოულოდნელად დასრულდა ელემენტის სახელის შიგნით"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "დოკუმენტი მოულოდნელად დასრულდა ატრიბუტის სახელის შიგნით"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "დოკუმენტი მოულოდნელად დასრულდა ელემენტის გამხსნელი ჭდის შიგნით."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"დოკუმენტი მოულოდნელად დასრულდა ატრიბუტის სახელის შემდგომი ტოლობის ნიშნის "
+"შემდეგ; ატრიბუტის მნიშვნელობა არ მითითებულა"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "დოკუმენტი მოულოდნელად დასრულდა ატრიბუტის მნიშვნელობის შიგნით"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "დოკუმენტი მოულოდნელად დასრულდა ელემენტის \"%s\" ჩამკეტი ჭდის შიგნით"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"დოკუმენტი მოულოდნელად დასრულდა კომენტარის ან დამუშავების ინსტრუქციის შიგნით"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "შეცდომა სტრიქონში %d სიმბოლო %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "ერთეულის დამოწმება არაა დასრულებული"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "ციტირებული ტექსტი ბრჭყალებით არ იწყება"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "უმართებლო ბრჭყალი ბრძანებაში ან სხვა ტექსტურ გარსში"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "ტექსტი დასრულდა უშუალოდ \"\\\" სიმბოლოს შემდეგ. (ტექსტი - \"%s\")"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "ტექსტი დასრულდა %c შესაბამისი ბრჭყალის წინ. (ტექსტი - \"%s\")"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "ტექსტი ცარიელი იყო (ან მხოლოდ ხარეებს შეიცავდა)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "მონაცემთა წაკითხვა ქვეპროცესიდან ვერ მოხერხდა"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "არხის შექმნა ქვეპროცესთან დასაკავშირებლად ვერ მოხერხდა (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "მონაცემთა წაკითხვა ქვეპროცესის არხიდან ვერ მოხერხდა (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "დასტის შექმნა ვერ მოხერხდა \"%s\" (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "ქვეპროცესის გამოყენება ვერ მოხერხდა (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "პროგრამის მცდარი სახელი: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "მცდარი სტრიქონი არგუმენტის ვექტორში - %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "მცდარი სტრიქონი გარემოში: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "უმართებლო სამუშაო დასტა: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "დახმარების პროგრამის (%s) გამოყენება ვერ მოხერხდა"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"მოულოდნელი შეცდომა ფუნქციაში g_io_channel_win32_poll() ქვეპროცესიდან "
+"მონაცემთა წაკითხვისას"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "მონაცემთა წაკითხვა ქვეპროცესიდან ვერ მოხერხდა (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"მოულოდნელი შეცდომა ფუნქციაში select() ქვეპროცესიდან მონაცემთა წაკითხვისას (%"
+"s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "მოულოდნელი შეცდომა ფუნქციაში waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "განტოტების შეცდომა (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "ქვეპროცესის გამოყენება ვერ მოხერხდა \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+"ქვეპროცესში შეტანის ან მიღების გადამისამართება გამოყენება ვერ მოხერხდა (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "ქვეპროცესის განტოტების შეცდომა (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "ქვეპროცესის უცნობი შეცდომა \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "ქვეპროცესის არხიდან საკმარის მონაცემთა წაკითხვა ვერ მოხერხდა (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "სიმბოლო UTF-8 რანგს გარეთაა"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "შეტანის ტექსტის გარდაქმნის მცდარი მიმდევრობა"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "სიმბოლო UTF-16 რანგს გარეთაა"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "გამოყენება:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[ოპცია...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "დახმარების პარამეტრები:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "დახმარების პარამეტრების ჩვენება"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "დახმარების ყველა პარამეტრის ჩვენება"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "პროგრამის პარამეტრები:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "ვერ ვახერხებ მნიშვნელობის წაკითხვას '%s' ელემენტისთვის %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "მთელი მნიშვნელობა '%s' ელემენტისთვის %s რანგს გარეთაა"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "ვერ ვახერხებ მთელ მნიშვნელობის '%s' წაკითხვას %s ელემენტისთვის"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "მთელი მნიშვნელობა '%s' ელემენტისთვის %s რანგს გარეთაა"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "გარდაქმნის პარამეტრის შეცდომა: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "მცდარი არგუმენტი - %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "უცნობი პარამეტრი %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "მონაცემთა დასტებში მართებული საკვანძო ფაილი ვერ მოიძებნა"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "ფაილი ჩვეულებრივი არაა"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "ფაილი ცარიელია"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"საკვანძო ფაილი '%s' შეიცავს სტრიქონს, რომელიც არ წარმოადგენს კოდურ წყვილს, "
+"ჯგუფს ან კომენტარს"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "პროგრამის მცდარი სახელი: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "საკვანძო ფაილი ჯგუფით არ იწყება"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "პროგრამის მცდარი სახელი: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "საკვანძო ფაილი შეიცავს არარეალიზებულ კოდირებას '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "საკვანძო ფაილი არ შეიცავს ჯგუფებს '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "საკვანძო ფაილი არ შეიცავს კოდს '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"საკვანძო ფაილი შეიცავს კოდს '%s', რომლის მნიშვნელობაც '%s' არაა UTF-8 "
+"კოდირებაში"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "საკვანძო ფაილი შეიცავს კოდს '%s', რომლის მნიშვნელობაც ვერ იშიფრება."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"საკვანძო ფაილი შეიცავს კოდს '%s' ჯგუფში '%s', რომლის მნიშვნელობაც ვერ "
+"იშიფრება."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "საკვანძო ფაილი არ შეიცავს კოდს '%s' ჯგუფში '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "საკვანძო ფაილი სტრიქონის ბოლოს შეიცავს escape სიმბოლოს"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "საკვანძო ფაილი შეიცავს მცდარ escape მიმდევრობას '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "მნიშვნელობა '%s' ვერ აღიქმება როგორც რიცხვი."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "მთელი მნიშვნელობა '%s' რანგს გარეთაა"
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "მნიშვნელობა '%s' ვერ აღიქმება როგორც რიცხვი."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "მნიშვნელობა '%s' ვერ აღიქმება როგორც ლოგიკური ოპერატორი."
diff --git a/trunk/po/ko.po b/trunk/po/ko.po
new file mode 100644
index 000000000..a22eb7f7e
--- /dev/null
+++ b/trunk/po/ko.po
@@ -0,0 +1,927 @@
+# glib
+# Young-Ho Cha <ganadist@chollian.net>, 2002
+# Changwoo Ryu <cwryu@debian.org>, 2002, 2004-2006
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib 2.11.4\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-11 22:41+0900\n"
+"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
+"Language-Team: GNOME Korea <gnome-kr-hackers@lists.kldp.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "예상치 못하게 '%2$s' 엘리먼트에 '%1$s' 애트리뷰트가 있습니다"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "'%2$s' 엘리먼트에 '%1$s' 애트리뷰트가 없습니다"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "예상치 못하게 '%s' 태그가 있습니다. '%s' 태그가 있어야 합니다"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "예상치 못하게 '%2$s' 안에 '%1$s' 태그가 있습니다"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "데이터 디렉토리에 올바른 북마크 파일이 없습니다"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "'%s' URL에 대한 북마크가 이미 있습니다"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "'%s' URL에 대한 북마크가 없습니다"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "'%s' URL에 대한 북마크에 MIME 타입이 없습니다"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "'%s' URL에 대한 북마크에 개인 플래그가 없습니다"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "'%s' URL에 대한 북마크에 그룹이 설정되어 있지 않습니다"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "이름이 '%s'인 어떤 프로그램도 '%s'에 대한 북마크를 등록하지 않았습니다"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "심볼릭 링크 '%s' 읽기 실패: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "문자셋 '%s'에서 '%s'(으)로 변환은 지원되지 않습니다"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "'%s'에서 '%s'(으)로 변환하는 변환기를 열 수 없습니다"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "변환 입력에서 잘못된 바이트 순서"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "변환중 오류: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "입력의 끝에서 부분적인 문자 순서"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "코드셋 '%2$s'에서 대체하는 '%1$s'(으)로 변환 못함"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s'은(는) \"file\" 스키마를 사용하는 절대 경로 URI가 아닙니다"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "로컬 파일 URI '%s'에는 '#'이 들어갈 수 없습니다"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s'이(가) 잘못되었습니다"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "URI '%s'의 호스트 이름이 잘못되었습니다"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s'은(는) 잘못된 이스케이프 문자가 들어 있습니다"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "경로이름 '%s'은(는) 절대 경로가 아닙니다"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "잘못된 호스트 이름"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "디렉토리 '%s' 여는 중 오류 : %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "파일 \"%2$s\"을(를) 읽은 %1$lu 바이트를 할당할 수 없습니다"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "파일 '%s'을(를) 읽는 중 오류: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "파일 '%s'에서 읽기 실패 : %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "파일 '%s' 열기 실패 : %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "파일 '%s'의 속성을 가져오기 실패 : fstat() 실패: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "파일 '%s' 열기 실패: fdopen() 실패: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "파일 '%s'의 이름을 '%s'(으)로 바꾸는 데 실패: g_rename() 실패: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "파일 '%s' 만들기 실패: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "파일 '%s' 쓰기 용도로 열기 실패: fdopen() 실패: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "파일 '%s' 쓰기 실패: fwrite() 실패: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "파일 '%s' 닫기 실패: fclose() 실패: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "기존의 '%s' 파일을 지울 수 없습니다: g_unlink() 실패: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "템플리트 '%s'이(가) 잘못되었습니다, '%s'이(가) 들어 있으면 안 됩니다"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "템플리트 '%s'에 XXXXXX가 없습니다"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "심볼릭 링크 '%s' 읽기 실패: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "심볼릭 링크를 지원하지 않습니다"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "`%s'에서 `%s'(으)로 변환하는 변환기를 열 수 없음: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "g_io_channel_read_line_string으로 raw 일기를 할 수 없습니다"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "읽기 버퍼에서 변환되지 않은 데이터를 남겨둠"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "일부 문자에서 채널 끝냄"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "g_io_channel_read_to_endi로 raw 읽기를 할 수 없습니다"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "파일 '%s' 열기 실패: dopen() 실패: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "파일 '%s' 매핑 실패: mmap() 실패: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "%d째 줄 %d 문자에서 오류: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "%d째 줄에서 오류: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"비어있는 엔티티 '&;'를 찾았습니다; 올바른 엔티티는 : &amp; &quot; &lt; &gt; "
+"&apos; 입니다"
+
+# FIXME: "escape"라는 동사를 번역?
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"'%s' 문자는 엔티티 이름의 시작에 쓸 수 없는 문자입니다. 엔티티는 & 문자로 시"
+"작합니다. 이 & 기호가 엔티티에 사용되는 것이 아닌 경우에는, &amp; 라고 쓰십"
+"시오"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "문자 '%s'은(는) 엔티티 이름에서 올바르지 않습니다"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "엔티티 이름 '%s'이(가) 알려져 있지 않습니다"
+
+# FIXME: "escape"라는 동사를 번역?
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"엔티티가 세미콜론으로 끝나지 않습니다; 대부분의 경우 엔티티 시작에 사용하려"
+"고 하지 않은 곳에서 & 기호를 사용한 경우일 것입니다 - 이런 경우 &amp; 라고쓰"
+"십시오"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"'%-.*s'의 구문 해석에 실패했습니다. 문자 참조에는 숫자를 써야 합니다 (예를 "
+"들어 &#234;) - 숫자가 너무 클 수도 있습니다"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "문자 참조 '%-*s'에 대응되는 문자는 허용되지 않습니다"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "문자 참조가 비어 있습니다; &#454;처럼 숫자를 써야 합니다"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"문자 참조가 세미콜론으로 끝나지 않습니다; 대부분의 경우 엔티티 시작에 사용하"
+"려고 하지 않은 곳에서 & 기호를 사용한 경우일 것입니다 - 이런 경우 &amp; 라고"
+"쓰십시오"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "엔티티 참조가 미완성입니다"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "문자 참조가 미완성입니다"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "잘못된 UTF-8 인코딩된 텍스트"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "문서는 엘리먼트로 시작하여야 합니다 (예 <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s'은(는) '<' 문자 다음에 쓸 수 없습니다; 이 문자로는 엘리먼트 이름을 시작"
+"할 수 없습니다"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"이상한 문자 '%s'. 엘리먼트 '%s'의 시작태그를 끝내는 '>'가 나타나야 합니다"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"이상한 문자 '%1$s'. 엘리먼트 '%3$s'의 애트리뷰트 이름 '%2$s' 다음에 '='이 나"
+"타나야 합니다"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"이상한 문자 '%s'. 엘리먼트 '%s'의 시작 태그를 끝내는 '>' 혹은 '/'가 나타나거"
+"나, 애트리뷰트가 나와야 합니다; 아마도 애트리뷰트 이름에 잘못된 문자를 쓴 경"
+"우일 것입니다"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"이상한 문자 '%1$s'. 엘리먼트 '%3$s'의 애트리뷰트 '%2$s'의 값을 부여할 때 = "
+"기호 다음에 따옴표가 나타나야 합니다"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s'은(는) '</' 다음에 쓸 수 있는 문자가 아닙니다; '%s'은(는) 엘리먼트 이름"
+"을 시작할 수 없습니다"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s'은(는) 엘리먼트 '%s'을(를) 닫은 다음에 쓸 수 있는 문자가 아닙니다; '>' 문"
+"자를 쓸 수 있습니다"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "'%s' 엘리먼트는 닫혔고, 현재 아무 엘리먼트도 열려 있지 않습니다"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "'%s' 엘리먼트는 닫혔고, 현재 열려 있는 엘리먼트는 '%s'입니다"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "문서가 비어있거나 공백문자만 들어 있습니다"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "'<' 바로 다음에 문서가 갑작스럽게 끝났습니다"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"엘리먼트가 열려 있는 상태로 문서가 갑작스럽게 끝났습니다 - 마지막에 열려 있"
+"던 엘리먼트는 '%s'입니다"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"문서가 갑작스럽게 끝났습니다. <%s/> 태그를 끝내는 > 기호가 나타나야 합니다"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "엘리먼트 이름에서 문서가 갑작스럽게 끝났습니다"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "에트리뷰트 이름에서 문서가 갑작스럽게 끝났습니다"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "엘리먼트의 열기 태그 안에서 문서가 갑작스럽게 끝났습니다."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"애트리뷰트 이름 다음의 = 기호 다음에서 문서가 갑작스럽게 끝났습니다; 애트리뷰"
+"트 값이 없습니다"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "애트리뷰트 값 안에서 문서가 갑작스럽게 끝났습니다"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "엘리먼트 '%s'의 닫기 태그 안에서 문서가 갑작스럽게 끝났습니다"
+
+# FIXME: processing instruction?
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "주석문 혹은 처리 안내자 태그 안에서 문서가 갑작스럽게 끝났습니다"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "%d째 줄 %d 문자에서 오류: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "엔티티 참조가 미완성입니다"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+# g_shell_unquote()에 쓰임. shell의 quoted text를 raw string으로 바꾸는 기능
+# FIXME: "quoted"라는 말을 어떻게 해야 할 것인가?
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "따옴표된 텍스트가 따옴표로 시작하지 않습니다"
+
+# FIXME: 위 참조, "quoted"
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "명령행에서 따옴표가 맞지 않거나 쉘따옴표된 텍스트가 또 있습니다"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "텍스트가 '\\' 문자 다음에 끝났습니다. (텍스트는 '%s'입니다)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"텍스트가 %c에 대응되는 따옴표가 나타나기 전에 끝났습니다. (텍스트는 '%s'입니"
+"다)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "텍스트가 비어 있음 (또는 공백만 들어 있음)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "자식 프로세스에서 데이터 읽기 실패"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "자식 프로세스와 통신을 위한 파이프를 만드는 중 실패 (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "자식 파이프로 부터 읽기 실패 (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "디렉토리 '%s'(으)로 바꾸기 실패 (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "자식 프로세스 실행 실패 (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "잘못된 프로그램 이름: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "인자에서 잘못된 문자열, %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "환경에서 잘못된 문자열: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "잘못된 현재 디렉토리: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "도움 프로그램 실행 실패 (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"자식 프로세스에서 데이터를 읽는중 g_io_channel_win32_poll()에서 기대되지않은 "
+"오류"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "자식 프로세스 에서 데이터를 읽기 실패 (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"자식 프로세스 에서 데이터를 읽는 중 select()에서 예상되지 않은 오류 (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "waitpid()에서 예상되지 않은 오류 (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "포크 실패(%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "자식 프로세스 \"%s\"을(를) 실행하기 실패 (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "자식 프로세스 (%s)의 입력 또는 출력의 리다이렉트 실패"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "자식 프로세스 (%s)를 생성 실패"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "자식 프로세스 \"%s\"을(를) 실행하는 중 알 수 없는 오류"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "자식 pid 파이프에서 필요한 데이타를 읽는 데 실패했습니다 (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "UTF-8 범위 밖의 문자"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "변환 입력에서 잘못된 순서"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "UTF-16 범위 밖의 문자"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "사용법:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[옵션...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "도움말 옵션:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "도움말 옵션을 봅니다"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "모든 도움말 옵션을 봅니다"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "프로그램 옵션:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "%2$s에 대한 정수 값 '%1$s'을(를) 분석할 수 없습니다"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "%2$s에 대한 정수 값 '%1$s'이(가) 범위를 벗어났습니다"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "%2$s에 대한 배정도 실수 값 '%1$s'을(를) 분석할 수 없습니다"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "%2$s에 대한 배정도 실수 값 '%1$s'이(가) 범위를 벗어났습니다"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "옵션 읽는 중에 오류: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "%s에 대한 인자가 빠졌습니다"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "알 수 없는 옵션 %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "데이터 디렉토리에 올바른 키 파일이 없습니다"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "일반 파일이 아닙니다"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "파일이 비었습니다"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"키 파일에 들어 있는 '%s' 줄은 키-값 쌍도 아니고, 그룹도 아니고, 주석도 아닙니"
+"다"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "잘못된 프로그램 이름: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "키 파일이 그룹으로 시작하지 않습니다"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "잘못된 프로그램 이름: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "키 파일에 지원하지 않는 '%s' 인코딩이 들어 있습니다"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "키 파일에 '%s' 그룹이 없습니다"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "키 파일에 '%s' 키가 없습니다"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "키 파일에 있는 '%s' 키와 '%s' 값은 UTF-8이 아닙니다"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "키 파일에 있는 '%s' 키의 값을 해석할 수 없습니다."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr "키 파일에 있는 '%2$s' 그룹의 '%1$s' 키의 값을 해석할 수 없습니다."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "키 파일에 있는 '%2$s' 그룹의 '%1$s' 키가 없습니다"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "키 파일의 줄 끝에 이스케이프 문자가 있습니다"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "키 파일에 잘못된 이스케이프 시퀀스 '%s'이(가) 들어 있습니다"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "값 '%s'을(를) 숫자로 해석할 수 없습니다."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "정수 값 '%s'이(가) 범위를 벗어났습니다"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "값 '%s'을(를) 단정도 실수로 해석할 수 없습니다."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "값 '%s'을(를) 불리언 값으로 해석할 수 없습니다."
diff --git a/trunk/po/ku.po b/trunk/po/ku.po
new file mode 100644
index 000000000..93330c4fe
--- /dev/null
+++ b/trunk/po/ku.po
@@ -0,0 +1,883 @@
+# translation of glib.glib-2-8.po to Kurdish
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Erdal Ronahi <erdal.ronahi@gmail.com, pckurd@hotmail.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.glib-2-8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-04-20 17:33+0000\n"
+"Last-Translator: Erdal Ronahi <erdal.ronahi@gmail.com>\n"
+"Language-Team: Kurdish <gnu-ku-wergerandin@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Vekirina dosiya '%s' serneket: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr ""
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr ""
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr ""
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr ""
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr ""
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr ""
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr ""
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' ne derbasdar e"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr ""
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr ""
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr ""
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Navê hostê nederbasdar e"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr ""
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr ""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Di xwendina dosyeya '%s' de çewtî: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr ""
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Vekirina dosiya '%s' serneket: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr ""
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr ""
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr ""
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr ""
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr ""
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr ""
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr ""
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr ""
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr ""
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr ""
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Di rêza %d tîpa %d de çewtî: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Di rêza %d de çewtî: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr ""
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr ""
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr ""
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr ""
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr ""
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr ""
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr ""
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr ""
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr ""
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr ""
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr ""
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Di rêza %d tîpa %d de çewtî: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+msgid "unfinished symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr ""
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr ""
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr ""
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr ""
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Navê bernameyê nederbasdar e: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr ""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr ""
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr ""
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Bikaranîn:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr ""
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr ""
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr ""
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Vebijêrkên Sepanê:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr ""
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Vebijêrka nenas %s"
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Dosya vala ye"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Navê bernameyê nederbasdar e: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Navê bernameyê nederbasdar e: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
diff --git a/trunk/po/lt.po b/trunk/po/lt.po
new file mode 100644
index 000000000..be0cac9fc
--- /dev/null
+++ b/trunk/po/lt.po
@@ -0,0 +1,943 @@
+# translation of lt.po to Lithuanian
+# Lithuanian translation of Glib library.
+# Copyright (C) 2003-2005, 2007 Free Software Foundation, Inc.
+#
+# Tomas Kuliavas <tokul@users.sourceforge.net>, 2003-2004.
+# Žygimantas Beručka <zygis@gnome.org>, 2004-2006.
+# Mantas Kriaučiūnas <mantas@akl.lt>, 2006-2007.
+# Gintautas Miliauskas <gintas@akl.lt>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: lt\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-02-22 01:56+0200\n"
+"Last-Translator: Gintautas Miliauskas <gintas@akl.lt>\n"
+"Language-Team: Lithuanian <gnome-lt@lists.akl.lt>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%"
+"100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Netikėtas požymis „%s“ elementui „%s“"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Elemento „%2$s“ požymis „%1$s“ nerastas"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Netikėta žymė „%s“, tikėtasi žymės „%s“"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Netikėta žymė „%s“ viduje „%s“"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Duomenų aplankuose nerasta tinkamo žymelių failo"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "URI „%s“ žymelė jau egzistuoja"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Žymelė URI „%s“ nerasta"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "URI „%s“ žymelėje neapibrėžtas MIME tipas"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "URI „%s“ žymelėje neapibrėžta privati vėliavėlė"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "URI „%s“ žymelėje nenurodyta jokia grupė"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Nėra programos pavadinimu „%s“ registravusios „%s“ žymelę"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Nepavyko išskleisti vykdomosios eilutės „%s“ su URI „%s“"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Keitimas iš koduotės „%s“ į koduotę „%s“ nepalaikomas"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Nepavyko atverti keitiklio iš „%s“ į „%s“"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Klaidinga baitų seka keitimo įvedime"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Klaida keitimo metu: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Nepilna simbolio seka įvedimo pabaigoje"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Negalima keisti atgalinio varianto „%s“ į koduotę „%s“"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "Adresas „%s“ nėra absoliutus adresas naudojantis „file“ schemą"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Vietinio failo adresas „%s“ negali turėti simbolio „#“"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "Adresas „%s“ yra klaidingas"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Kompiuterio vardas „%s“ adrese yra klaidingas"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Adrese „%s“ yra klaidingai perkoduoti symboliai"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Kelias „%s“ nėra absoliutus"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Klaidingas kompiuterio vardas"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Klaida atidarant aplanką „%s“: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Nepavyko paskirti %lu baitų reikalingų perskaityti failą „%s“"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Klaida skaitant failą „%s“: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Nepavyko perskaityti failo „%s“: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Nepavyko atverti failo „%s“: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Nepavyko gauti failo „%s“ požymių: fstat() klaida: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Nepavyko atverti failo „%s“: fdopen() klaida: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Nepavyko pervadinti failo „%s“ į „%s“: g_rename() klaida: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Nepavyko sukurti failo „%s“: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Nepavyko atverti failo „%s“ rašymui: fdopen() klaida: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Nepavyko įrašyti failo „%s“: fwrite() klaida: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Nepavyko užverti failo „%s“: fclose() klaida: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Nepavyko pašalinti egzistuojančio failo „%s“: g_unlink() failed: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Šablonas „%s“ klaidingas, jame negali būti „%s“"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Šablone „%s“ nėra XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Nepavyko perskaityti simbolinės nuorodos „%s“: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Simbolinės nuorodos nepalaikomos"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Nepavyko atverti keitiklio iš „%s“ į „%s“: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Negalima vykdyti tiesioginio skaitymo iš g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Nepakeistų duomenų likučiai skaitymo buferyje"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanalas pasibaigia nepilnu simboliu"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Negalima vykdyti tiesioginio skaitymo iš g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Nepavyko atverti failo „%s“: open() klaida: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Nepavyko rasti failo „%s“: mmap() klaida: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Eilutės %d simbolio %d klaida: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Klaida eilutėje %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Aptiktas tuščias elementas '&;'; galimi elementai yra: &amp; &quot; &lt; "
+"&gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Simbolis „%s“ nepriimtinas elemento vardo pradžioje; & simbolis pradeda "
+"elemento įvedimą; jei šis ampersendas nėra elemento pradžia, apeikite jį su "
+"&amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Simbolis „%s“ nepriimtinas elemento varde"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Nežinomas elemento vardas „%s“"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Elementas nepasibaigė kabliataškiu; greičiausiai Jūs panaudojote ampersendo "
+"simbolį nepradėdami elemento įvedimo - apeikite ampersendą įvesdami &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Nepavyko apdoroti „%-.*s“, kuris galėjo turėti skaičius simbolio aprašyme "
+"(pvz. &#234;) - gal skaičius per didelis"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Simbolio aprašymas „%-.*s“ neatitinka leistinus simbolius"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Tuščias simbolio aprašymas; ten turėtų būti skaičiai, pvz. &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Simbolio aprašymas nepasibaigė kabliataškiu; greičiausiai Jūs panaudojote "
+"ampersendo simbolį nepradėdami elemento įvedimo - apeikite ampersendą "
+"įvesdami &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Nebaigtas elemento aprašymas"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Nebaigtas simbolio aprašymas"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Klaidingai koduotas UTF-8 tekstas"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokumentas turėtų prasidėti elementu (pvz. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"„%s“ negali būti rašomas po „<“ simbolio; jis nepradeda jokio elemento vardo"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Neįprastas simbolis „%s“, tikėtasi sulaukti „>“ simbolio, užbaigiančio "
+"pradinį elementą „%s“"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Neįprastas simbolis „%1$s“, tikėtasi sulaukti „=“ po elemento „%3$s“ požymio "
+"vardo „%2$s“"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Neįprastas simbolis „%s“, tikėtasi sulaukti „>“ arba „/“ simbolių, "
+"užbaigiančių elementą „%s“, arba papildomo požymio; gal Jūs panaudojote "
+"netinkama simbolį požymio varde"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Neįprastas simbolis „%1$s“, po lygybės tikėtasi sulaukti atidarančio "
+"citavimo simbolio pradedant „%3$s“ elemento „%2$s“ požymio reikšmę"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"„%s“ negali būti rašomas po simbolių „</“; „%s“ negali būti kokio nors "
+"elemento vardu"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"„%s“ negali būti rašomas po uždarančio elemento vardo „%s“; leistinas "
+"simbolis yra „>“"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr ""
+"Elemento „%s“ uždarymo simbolis sutiktas anksčiau už elemento atidarymo "
+"simbolį"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"Sutiktas elemento „%s“ uždarymo simbolis, tačiau šiuo metu atidarytas kitas "
+"elementas „%s“"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokumentas tuščias arba susideda tik iš tarpų"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Dokumentas netikėtai pasibaigė tuoj po atidarančių skliaustų '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokumentas netikėtai pasibaigė neuždarius dalies elementų - „%s“ yra "
+"paskutinis atviras elementas"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokumentas netikėtai pasibaigė, nesulaukta uždarančių skliaustų simbolio <%s/"
+">"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokumentas netikėtai pasibaigė elemento varde"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokumentas netikėtai pasibaigė požymio varde"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokumentas netikėtai pasibaigė elemento atvėrimo žyme."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokumentas netikėtai pasibaigė lygybės simboliu einančio po požymio vardo; "
+"nerasta požymio reikšmė"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokumentas netikėtai pasibaigė požymio verte"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Dokumentas netikėtai pasibaigė elemento „%s“ uždarančiame simbolyje"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Dokumentas netikėtai pasibaigė komentaruose arba apdorojimo instrukcijose"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Eilutės %d simbolio %d klaida: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Nebaigtas elemento aprašymas"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Cituojamas tekstas neprasideda citavimo ženklu"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Nesutampantis citavimo simbolis komandinėje eilutėje arba kitame terpės "
+"cituotame tekste"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Tekstas pasibaigė tuoj po „\\“ simbolio. (Tekste buvo įrašyta „%s“)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Tekstas pasibaigė nesulaukus %c atitinkančio citatos ženklo. (Tekste buvo "
+"įrašyta „%s“)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Tekstas buvo tuščias arba turėjo vien tik tarpo simbolius)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Nepavyko gauti duomenų iš antrinio proceso"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+"Nepavyko sukurti konvejerio skirto keistis duomenimis su antriniu procesu (%"
+"s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Nepavyko perskaityti duomenų iš antrinio konvejerio (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Nepavyko pakeisti į aplanką „%s“ (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Nepavyko paleisti antrinio proceso (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Netinkamas programos pavadinimas: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Netinkama seka argumento vektoriuje, pozicijoje %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Netinka seka aplinkoje: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Netinkamas darbinis aplankas: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Nepavyko paleisti pagalbinės programos (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Netikėta klaida tarp g_io_channel_win32_poll() funkcijos duomenų skaitymo iš "
+"antrinio proceso metu"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Nepavyko gauti duomenis iš antrinio proceso (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Netikėta klaida tarp select() funkcijos duomenų gavimo iš antrinio proceso (%"
+"s) metu"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Netikėta klaida iš waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Nepavyko atskirti (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Nepavyko paleisti antrinio proceso „%s“ (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Nepavyko perimti antrinio proceso (%s) išvedimo arba įvedimo"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Nepavyko atskirti antrinio proceso (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Nežinoma klaida vykdant antrinį procesą „%s“"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"Nepavyko perskaityti reikiamo duomenų kiekio iš antrinio pid konvejerio (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Simbolis neatitinka UTF-8 simbolių diapazono"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Klaidinga seka keitimo įvestyje"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Simbolis neatitinka UTF-16 simbolių diapazono"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Naudojimas:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[PARINKTIS...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Pagalbos parinktys:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Rodyti pagalbos parinktis"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Rodyti visas pagalbos parinktis"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Programos parinktys:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Nepavyko apdoroti sveikosios reikšmės „%s“, reikalingos %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Sveikoji reikšmė „%s“, reikalinga %s, viršija ribas"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Nepavyko apdoroti dvigubos reikšmės „%s“, reikalingos %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Dviguboji reikšmė „%s“, reikalinga %s, viršija ribas"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Klaida apdorojant parinktį %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "%s trūksta argumento"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Nežinoma parinktis %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Duomenų aplankuose nepavyko rasti tinkamo raktų failo"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Nėra paprastas failas"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Failas yra tuščias"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Raktų faile yra eilutė „%s“, kuri nėra raktas-reikšmė pora, grupė ar "
+"komentaras"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Netinkamas grupės pavadinimas: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Raktų failas neprasideda grupe"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Netinkamas rakto pavadinimas: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Raktų faile yra nepalaikoma koduotė „%s“"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Raktų failas neturi grupės „%s“"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Raktų failas neturi rakto „%s“"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Raktų faile yra raktas „%s“ su reikšme „%s“, kuri nėra UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Raktų faile yra raktas „%s“, kuriame yra reikšmė, kurios negalima suprasti."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Raktų faile yra raktas „%s“ grupėje „%s“, kuriame yra reikšmė, kurios "
+"negalima suprasti."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Raktų faile nėra rakto „%s“ grupėje „%s“"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Raktų faile, eilutės pabaigoje yra pabėgimo simbolis"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Raktų faile yra klaidinga pabėgimo eilutė „%s“"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Reikšmės „%s“ negalima interpretuoti kaip skaičiaus."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Sveikoji reikšmė „%s“ viršija ribas"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+"Reikšmės „%s“ negalima interpretuoti kaip slankiojo kablelio skaičiaus."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Reikšmės „%s“ negalima interpretuoti kaip loginės."
diff --git a/trunk/po/lv.po b/trunk/po/lv.po
new file mode 100644
index 000000000..7b8a53924
--- /dev/null
+++ b/trunk/po/lv.po
@@ -0,0 +1,940 @@
+# glib for Latvian.
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# Artis Trops <hornet@navigator.lv>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2002-12-19 01:04+0200\n"
+"Last-Translator: Artis Trops <hornet@navigator.lv>\n"
+"Language-Team: Latvian <ll10nt@os.lv>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Savāda rakstzīme '%s', gaidīju '=' aiz atribūta nosaukuma '%s' elementam '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Neizdevās izveidot failu '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Konversija no rakstzīmju kopas '%s' uz '%s' nav atbalstīta"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Nevarēju atvērt konvertātoru no '%s' uz '%s': %s"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Nepareiza baitu secība konversijas ievadē"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Kļūda konversējot: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Daļēja simbolu secība ievades beigās"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Nevar pārveidot atkritienu '%s' uz rakstzīmju kopu '%s'"
+
+#: glib/gconvert.c:1727
+#, fuzzy, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' nav absolūtais URI, lietojot failu shēmu"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Lokālā faila URI '%s' nedrīkst saturēt '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' ir nepareizs"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Hostdatora nosaukuma URI '%s' ir nepareizs"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' satur nepareizi izvairīgas rakstzīmes"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Ceļvārds '%s' nav absolutais ceļš"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Nepareizs hostdatora nosaukums"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Kļūda atverot direktoriju '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Nevarēju atrast %lu baitus, lai nolasītu failu \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Kļūda nolasot failu '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Nespēju nolasīt no faila '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Nevarēju atvērt failu '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Nevarēju dabūt faila '%s' atribūtus: fstat() neizdevās: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Neizdevās izveidot failu '%s': %s"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Veidne '%s' nepareizs, nedrīkstētu saturēt '%s'"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Veidne '%s' nebeidzas ar XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, fuzzy, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Neizdevās izveidot failu '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr ""
+
+#: glib/giochannel.c:1152
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Nevarēju atvērt konvertātoru no `%s' uz '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Nevaru izpildīt jēllasīšanu iekš g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Pāpalikušie nepārveidotie dati nolasīšanas buferī"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanāls pārtrūkst daļējā rakstzīmē"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Nevaru izpildīt jēllasīšanu iekš g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Kļūda rindā %d rakstzīme %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Kļūda rindā %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Pamanīta tukša entītija '&;'; derīgas entītijas ir: &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Rakstzīme '%s' nav derīga entītijas nosaukuma sākumā; rakstzīme & sāk "
+"entītiju; ja šī zīme netiek atbalstīta, lai būtu entītija, aizvieto to ar "
+"&amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Rakstzīme '%s' nav derīga entītijas nosaukumā"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Entītijas nosaukums \"%s\" nav zināms"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entītija nebeidzās ar semikolu; visdrīzāk jūs lietojāt & zīmi bez nodoma "
+"sākt entītiju - aizvieto & zīmes ar &amp;"
+
+#: glib/gmarkup.c:573
+#, fuzzy, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Nevarēju parsēt '%s', kur vajadzētu būt ciparam iekš rakstzīmes atsauces "
+"(&#234; piemēram) - iespējams, ka cipars ir pārāk liels"
+
+#: glib/gmarkup.c:598
+#, fuzzy, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Rakstzīmes atsauce '%s' nešifrē atļautu rakstzīmi"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Tukša rakstzīmes atsauce; būtu jāiekļauj cipars, kā &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Rakstzīmes atsauce nebeidzās ar semikolu; visdrīzāk jūs lietojāt & zīmi bez "
+"nodoma sākt entītiju - aizvieto & zīmes ar &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Nepabeigta entītijas atsauce"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Nepabeigta rakstzīmes atsauce"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Nepareizi kodēts UTF-8 teksts"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokumentam jāsākās ar elementu (piem., <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' nav atļauta rakstzīme, sekojoša aiz rakstzīmes '<'; tā nedrīkst iesākt "
+"elementa vārdu."
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Savāda rakstzīme '%s', gaidīju '>' rakstzīmi, kas nobeigtu sākuma tagu "
+"elementam '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Savāda rakstzīme '%s', gaidīju '=' aiz atribūta nosaukuma '%s' elementam '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Savāda rakstzīme '%s', gaidīju '>' vai '/' rakstzīmi, kas nobeigtu sākuma "
+"tagu elementam '%s' vai fakultatīvi atribūtu; iespējams, jūs lietojāt "
+"nepareizu rakstzīmi atribūta nosaukumā"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Savāda rakstzīme '%s', gaidīju atvērtās pēdiņas pēc vienādības zīmes, "
+"nosakot vērtību atribūtam '%s' no elementa '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' nav derīga rakstzīme, sekojot rakstzīmēm '</'; '%s' nevar sākt elementa "
+"nosaukumu"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' nav derīga rakstzīme, sekojot aizverošā eementa nosaukumam '%s'; "
+"atļautā rakstzīme ir '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Elements '%s' tika aizvērts, neviens elements pašlaik nav atvērts"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Elements '%s' tika aizvērts, bet pašlaik atvērtais elements ir '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokuments bija tukšs vai saturēja tikai tukšu atstarpi"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Dokuments negaidīti izbeidzās tieši pēc atvērtās stūra iekavas '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokuments negaidīti izbeidzās ar joprojām atvērtiem elementiem - '%s' bija "
+"pēdējais atvērtais elements"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokuments negaidīti izbeidzās, cerēju ieraudzīt aizverošo stūra iekavu, "
+"beidzoties ar tagu <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokuments negaidīti izbeidzās iekšā elementa nosaukumā"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokuments negaidīti izbeidzās iekšā atribūta nosaukumā"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokuments negaidīti izbeidzās elementa-atverošajā tagā."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokuments negaidīti izbeidzās aiz vienādības zīmes, sekojot atribūta "
+"nosaukumam; nav atribūta vētības"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokuments negaidīti izbeidzās kamēr iekšā atribūta vērtībā"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Dokuments negaidīti izbeidzās iekšā elementa '%s' aizverošajā tagā"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Dokuments negaidīti izbeidzās iekšā komentārā vai apstrādes instrukcijā"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Kļūda rindā %d rakstzīme %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Nepabeigta entītijas atsauce"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Citētais teksts nesākas ar jautājuma zīmi"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Neatbilstoša jautājuma zīme komandrindā vai citā čaulas-citētā tekstā"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Teksts beidzās tieši pēc '\\' rakstzīmes. (Teksts bija '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Teksts beidzās pirms atbilstošais citāts tika atrasts priekš %c. (Teksts "
+"bija '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Teksts bija tukšs (vai saturēja tikai tukšumus)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Nevarēju nolasīt datus no bērnprocesa"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Nevarēju izveidot programkanālu komunikācijai ar bērnprocesu (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Nevarēju nolasīt no bērna programkanāla (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Nevarēju pāriet uz direktoriju '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Nevarēju izpildīt bērnprocesu (%s)"
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "Nepareizs hostdatora nosaukums"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, fuzzy, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Nepareiza secība konversijas ievadē "
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr "Kļūda atverot direktoriju '%s': %s"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Nevarēju izpildīt palīga programmu"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Negaidīta kļūda iekš g_io_channel_win32_poll(), lasot datus no bērnprocesa"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Nevarēju nolasīt datus no bērnprocesa (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Negaidīta kļūda iekš select(), lasot datus no bērnprocesa (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Negaidīta kļūda waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Neizdevās sadalīt (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Nevarēju izpildīt bērnprocesu \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Nevarēju novadīt bērnprocesa (%s) izvadi vai ievadi"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Nevarēju sazarot bērnprocesu (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Nezināma kļūda, izpildot bērnprocesu \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"Nevarēju nolasīt pietiekami daudz datus no bērna pid programkanāla (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Rakstzīme nav UTF-8 laukā"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Nepareiza secība konversijas ievadē "
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Rakstzīme nav UTF-16 laukā"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr ""
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr ""
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr ""
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr ""
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Kļūda konversējot: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr ""
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr ""
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Nepareizs hostdatora nosaukums"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Nepareizs hostdatora nosaukums"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, fuzzy, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "URI '%s' satur nepareizi izvairīgas rakstzīmes"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Nevarēju atrast %lu baitus, lai nolasītu failu \"%s\""
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Konvertācija no rakstzīmju kopas '%s' uz '%s' nav atbalstīta"
+
+#~ msgid "Incorrect message size"
+#~ msgstr "Nepareizs ziņas izmērs"
+
+#~ msgid "Socket error"
+#~ msgstr "Kontakta kļūda"
diff --git a/trunk/po/mg.po b/trunk/po/mg.po
new file mode 100644
index 000000000..acc84cacc
--- /dev/null
+++ b/trunk/po/mg.po
@@ -0,0 +1,947 @@
+# MALAGASY TRANSLATION OF GLIB.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Thierry Randrianiriana <randrianiriana@gmail.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: GLIB VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-03-03 19:00+0300\n"
+"Last-Translator: Fanomezana Rajaonarisoa <fano@isvtec.com>\n"
+"Language-Team: MALAGASY <i18n-malagasy-gnome@gna.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Marika manokana '%s' ho an'ny '%s' tsy nampoizina"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Tsy hita ny marika manokana '%s' ho an'ny '%s'"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Tsy nampoizina ny taf '%s', nantenaina ny tag '%s'"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Misy tag '%s' tsy nampoizina anatin'ny '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Tsy misy raki-drohy mitombina anatin'ny lahatahiry misy ny data"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Efa misy rohy ny URI '%s'"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Tsy nahitana rohy ny URI '%s'"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Tsy misy karazana MIME voafaritra ho an'ny rohin'ny URI '%s'"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Tsy misy saina manokana voafaritra ho an'ny rohin'ny URI '%s'"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Tsy misy vondrona voafaritra ho an'ny rohin'ny URI '%s'"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+"Tsy misy rindranasa mitondra ny anarana '%s' nanambara rohy ho an'ny '%s'"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Tsy voavaky ny rohy misolotena '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Tsy raisina an-tànana ny famadihan'amboara-marika '%s' ho '%s'"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Tsy voasokatra ny mpanova rakitra '%s' ho '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Tsy mitombina filaharan'ny byte amin'ny zavatra ovaina"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Nisy olana teo am-panovana: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Tsy feno ny filaharan'ny marika amin'ny faran'ny zavatra ovaina"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Ny fallback '%s' tsy voaova ho amboaram-pango '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "Tsy URI feno mampiasa ny drafitra \"rakitra\" ny URI '%s'"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Tsy azo asiana '#' ny URI '%s' an'ilay rakitra an-toerana "
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "Tsy mitombina ny URI '%s'"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Tsy mitombina ny anaram-mpampiantranon'ny URI '%s'"
+
+#: glib/gconvert.c:1782
+#, fuzzy, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Misy marika nalana tamin'ny fomba tsy mety ny URI '%s'"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Tsy sori-dàlana feno ny anaran-tsori-dàlana '%s'"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Anaram-pampiantrano diso"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Nisy olana teo am-panokafana ny lahatahiry '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Tsy nahatokana %lu byte hamakiana ny rakitra \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Ny nahavaky ny mpiatin'ny rakitra '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Tsy voasokatran y rakitra '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Tsy azo ny marika manokan'ny rakitra '%s': tsy nahomby ny fstat(): %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Tsy voasokatra ny rakitra '%s': tsy nahomby ny fdopen(): %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Tsy voaova ny anaran'ny rakitra '%s' mba ho '%s': tsy nahomby ny g_rename(): "
+"%s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Tsy voaforona ny rakitra '%s': %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"Tsy voasotra mba hanoratana ny rakitra '%s': tsy nahomby ny fdopen(): %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Tsy voasoratra ny rakitra '%s': tsy nahomby ny fwrite(): %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Tsy voahidy ny rakitra '%s': tsy nahomby ny fclose(): %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Tsy mety fafàna ny rakitra '%s' misy: tsy nahomby ny g_unlink(): %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Tsy mitombina ny lasitra '%s'; tsy tokony hisy '%s'"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Tsy misy XXXXXX ny lasitra '%s'"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Tsy voavaky ny rohy misolotena '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Tsy raisina an-tànana ny rohy misolotena"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Tsy voasokatra ny mpanova rakitra '%s' ho '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"Tsy afaka manao famakiana fototra amin'ny g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Misy ambina data tsy voaova ao anatin'ny buffern'ny famakiana"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Marika tsy feno no mamarana ilay canal"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Tsy afaka manao famakiana fototra amin'ny g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Tsy voasokatra ny rakitra '%s': tsy nahomby ny open(): %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Tsy voamap ny rakitra '%s': tsy nahomby ny mmap(): %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Misy tsy fetezana amin'ny andalana %d marika %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Misy tsy fetezana amin'ny andalana %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Nahita ary '&;' foana; ireto no fidirana ekena: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Tsy mety atao fiantomboham-pidirana ny marika '%s'; ny & no manomboka ny "
+"anaran'ny ary. Raha toa ka tsy raisin'ny ary iray an-tànana io marika io "
+"(&), dia ataovy &amp; mba ialana izany"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Tsy mety atao amin'ny anaran'ary ny marika '%s'"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Tsy fantatra ny anaran'ary '%s'"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Tsy nifarana tamin'ny teboka amam-paingo ilay ary. Mety tsy nihevitra "
+"hampiasa esperluette hanombohana ary angamba ianao - esperluette fialana toy "
+"ny &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Tsy voazarazara ny '%-.*s' izay tokony ho isa anaty fiantsoana marika "
+"(&#234, ohatra). Mety lehibe loatra angamba ilay isa."
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Tsy manafango marika azo ampiasaina ny fiantsoana marika '%-.*s'"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Fiantsoana marika foana; tokony hisy isa toy ny &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Tsy niafara tamin'ny teboka amam-paingo ilay fiantsoana marika. Mety tsy "
+"nihevitra hampiasa esperluette hanombohana ary angamba ianao - esperluette "
+"fialana toy ny &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Fiantsoana ary tsy vita"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Fiantsoana marika tsy vita"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Lahabolana voafango UTF-8 tsy mitombina"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr ""
+"Tsy maintsy manomboka amina singantaharo ilay tahirin-kevitra (oh. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"Tsy mety atao aorian'ny marika '<' ny marika '%s'. Tsy mety anombohana "
+"anaran-tsingataharo io"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Marika '%s' hafahafa; nanantena marika '>' hamarana ny tag manomboka ny "
+"singantaharo '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Marika '%s' hafahafa; nanantena '=' aorian'ny anaran'ny marika manokana '%s' "
+"amin'ny singantaharo '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Marika hafahafa '%s'; nanantena marika '>' na '/' hamarana ny tag manomboka "
+"ny singantaharo '%s', na koa marika manokana iray. Mety nampiasa marika tsy "
+"ekena amin'ny anarana marika manokana angamba ianao."
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Marika '%s' hafahafa; nanantena farango manokatra aorian'ny mira rehefa "
+"manome ny sanda ny marika manokana '%s' amin'ny singantaharo '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"Tsy mety atao aorian'ny marika '</' ny marika '%s'. Tsy mety anombohana "
+"anaran-tsingantaharo ny '%s'."
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' dia tsy mety atao aorian'ny anaran'ny singantaharo mamarana ny marika '%"
+"s'. '>' no marika mety atao eo"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Nofaranana ny singantaharo '%s'; tsy misy singantaharo misokatra izao"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"Nofaranana ny singantaharo '%s', fa '%s' no singantaharo misokatra izao"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Foana na tsy misy afa-tsy elanelana ilay tahirin-kevitra"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Nifarana tampoka taoriana fonon-teny kitso loha '<' ilay tahirin-kevitra"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Nifarana tampoka ilay tahirin-kevitra nefa misy singantaharo mbola "
+"misokatra; '%s' no singantaharo farany nisokatra"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Nifarana tampoka ilay singantaharo; nanantena fonon-teny kitso loha mamarana "
+"ny tag <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Nifarana tampoka tanaty anaran-tsingataharo ilay tahirin-kevitra"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Nifarana tampoka tanaty anarana marika manokana ilay tahirin-kevitra"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+"Nifarana tampoka tanaty tag manomboka singantaharo ilay tahirin-kevitra."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Nifarana tampoka taorian'ny mira manaraka anarana marika manokana ilay "
+"tahirin-kevitra; tsy misy sanda-marika manokana"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+"Nifarana tampoka ilay tahirin-kevitra raha mbola tanaty sanda-marika manokana"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Nifarana tampoka tanatin'ny tag mamarana ny singantaharo '%s' ilay tahirin-"
+"kevitra"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Nifarana tampoka tanaty teny fanampiny na torolàlana fikirakirana ilay "
+"tahirin-kevitra"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Misy tsy fetezana amin'ny andalana %d marika %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Fiantsoana ary tsy vita"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Tsy manomboka amin'ny farango ny teny nalaina"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Tsy mifamaly ny farango anaty lazam-baiko na lahabolana hafa tonon'ny akora"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr ""
+"Nifarana taorian'ny marika '\\' ilay lahabolana. ('%s' ilay lahabolana)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Nifarana talohan'ny nahitana ny ilan'ny farango ho an'ny %c ilay lahabolana. "
+"('%s' ilay lahabolana)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Foana ilay lahabolana (na tsy misy afa-tsy elanelana)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Tsy voavaky ny datan'ny fizotra zanaka"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Tsy voaforona ny fantsona ifandraisana amin'ny fizotra zanaka (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Tsy voavaky ny mpiatin'ny fantson'ny zanaka (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Tsy nahomby ny fanovana lahatahiry ho '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Tsy nahavita nanatanteraka ny fizotra zanaka (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Anaran-drindranasa diso: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Tsy mitombina ny laha-dazan'ny mpitondra tondriky amin'ny %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Tsy mitombina ny laha-daza anatin'ny tontolo: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Lahatahiry fiasana tsy mitombina: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Tsy nahavita nandefa ny rindranasa mpanampy (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Nisy olana tsy nampoizina tanatin'ny g_io_channel_win32_poll() raha namaky "
+"ny datan'ny fizotra zanaka"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Tsy voavaky ny datan'ny fizotra zanaka (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Nisy olana tsy nampoizina tanatin'ny select() raha namaky ny datan'ny "
+"fizotra zanaka (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Nisy olana tsy nampoizina tanatin'ny waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Tsy nahavita nanasaka (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Tsy nahavita nandefa ny fizotra zanaka \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+"Tsy nahavita namily lalana ny fivoahana na fidiran'ny fizotra zanaka (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Tsy nahavita nanasaka ny fizotra zanaka (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr ""
+"Nisy olana tsy fantatra teo am-panatanterahana ny fizotra zanaka \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Tsy nahavaky data ampy tanatin'ny fantsona zanaka pid (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Mihoatra ny fetran'ny UTF-8 ilay marika"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Tsy mitombina ny filaharana amin'ny fidiran'ny fanovana"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Mihoatra ny fetran'ny UTF-16 ilay marika"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Fampiasa:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[SAFIDY...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Safidy momba ny toro-làlana:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Asehoy ny safidy momba ny toro-làlana"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Asehoy ny safidy rehetra momba ny toro-làlana"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Safidy momba ny rindranasa:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Tsy afaka mizarazara ny sanda feno '%s' ho an'ny %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Mihoatra ny fetra ny sanda feno '%s' ho an'ny '%s'"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Tsy afaka mizarazara sanda roa '%s' ho an'ny '%s'"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Mihoatra ny fetra ny sanda roa '%s' ho an'ny '%s'"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Nisy olana teo am-pizarazarana ny safidy %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Tondrikin'ny %s tsy eo"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Safidy %s tsy fantatra"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+"Tsy hita anatin'ny lahatahiry misy ny data ny rakitra misy ny famaha marina"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Rakitra tsy mahazatra"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Foana ilay rakitra"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Misy andalana '%s' izay tsy roroa famaha-sanda, vondrona, na teny fanampiny "
+"ilay raki-pamaha"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Anaram-bondrona diso: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Tsy manomboka amina vondrona ilay raki-pamaha"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Anaram-pamaha diso: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Misy fango '%s' tsy raisina an-tànana ilay raki-pamaha"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Tsy manana vondrona '%s' ilay raki-pamaha"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Tsy manana famaha '%s' ilay raki-pamaha"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Misy famaha '%s' manana sanda '%s' izay tsy UTF-8 anatin'ilay raki-pamaha "
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Misy famaha '%s' manana sanda tsy mety avadika mba ho azo anatin'ilay raki-"
+"pamaha."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Misy famaha '%s' anatin'ny vondrona '%s' manana sanda izay tsy mety avadika "
+"mba ho azo ilay raki-pamaha."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Tsy manana famaha '%s' anatin'ny vondrona '%s' ilay raki-pamaha"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Misy marika fialana amin'ny faran'ny andalan'ilay raki-pamaha"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Misy fisesisesim-pialana '%s' tsy mitombina anatin'ilay raki-pamaha"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Tsy mety avadika ho isa mba ho azo ny sanda '%s'."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Mihoatra ny fetra ny sanda feno '%s'"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Tsy mety avadika ho isa float mba ho azo ny sanda '%s'."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Tsy mety avadika ho boleanina mba ho azo ny sanda '%s'."
diff --git a/trunk/po/mk.po b/trunk/po/mk.po
new file mode 100644
index 000000000..dc7871e84
--- /dev/null
+++ b/trunk/po/mk.po
@@ -0,0 +1,944 @@
+# translation of glib.glib-2-12.po to Macedonian
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER.
+#
+# Ivan Stojmirov <stojmir@linux.net.mk>, 2002.
+# Arangel Angov <ufo@linux.net.mk>, 2004, 2005, 2006.
+# Арангел Ангов <ufo@linux.net.mk>, 2005.
+# Jovan Naumovski <jovan@lugola.net>, 2006.
+# Arangel Angov <arangel@linux.net.mk>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.glib-2-12\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-03-06 10:41+0100\n"
+"Last-Translator: Arangel Angov <arangel@linux.net.mk>\n"
+"Language-Team: Macedonian <ossm-members@hedona.on.net.mk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Неочекуван атрибут '%s' за елементот '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Атрибутот '%s' на елементот '%s' не е пронајден"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Неочекувана етикета '%s', се очекуваше '%s'"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Неочекувана етикета '%s' во '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+"Не е пронајдена валидна датотека за обележувач во дирекориумите со податоци"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Обележувач за URI '%s' веќе постои"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Не е пронајден обележувач за URI '%s'"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Не е дефиниран MIME тип во обележувачот за URI '%s'"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Не е дефинирано приватно знаме за обележувачот за URI '%s'"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Не се поставени групи во обележувачот за URI '%s'"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Нема апликација со име '%s' која регистрирала обележувач за '%s'"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Не успеав да ја проширам линијата за извршување '%s' со URI '%s'"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Конвертирањето од %s' во '%s' не е поддржано"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Не можам да го отворам конверторот од '%s' до '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Невалидна секвенца на бајти во влезот на конвертирањето"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Грешка при конвертирање: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Парцијална секвенца на карактер на крајот од влезот"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Не можам да го конвертирам '%s' во енкодингот '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "'%s' не е апсолутна адреса која што ја користи шемата на датотеката"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Локалното URI '%s' може да не користи '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "'%s' е невалиден URI"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Името на хостот на URI %s е невалидно"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "'%s' содржи невалидни посебни карактери"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Патеката '%s' не е апсолутна патека"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Невалидно име на хост"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Грешка при отворање на директориумот '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Не можам да алоцирам %lu бајти за да ја прочитам датотеката \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Грешка при читањето на датотеката '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Не успеав да прочитам од датотеката '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Не успеав да ја отворам датотеката '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"Не успеав да ги добијам атрибутите на датотеката '%s': fstat() failed: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Не успеав да ја отворам датотеката '%s': fdopen() failed: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Не успеав да ја реименувам датотеката '%s' во '%s': g_rename() не успеа: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Не успеав да ја креирам датотеката '%s': %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"Не успеав да ја отворам датотеката '%s' за запишување: fdopen() не успеа: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Не успеав да запишам во датотеката '%s': fwrite() не успеа: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Не успеав да ја затворам датотeката '%s': fclose() не успеа: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+"Постоечката датотека '%s' не може да биде отстранета: g_unlink()·не успеа "
+"за: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Мострата '%s' е невалидна, не треба да содржи '%s'"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Мострата '%s' не содржи со XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Не успеав да ја прочитам симболичката врска '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Симболичките врски не се поддржани"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Не можам да го отворам конверторот од '%s' до '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Не можам да направам грубо читање во g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Преостанати неконвертирани податоци во баферот за читање"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Каналот се терминира во парцијален карактер"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Неможам да читам во g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Не успеав да ја отворам датотеката '%s': open() не успеа: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Не успеав да ја означам датотеката '%s': mmap() не успеа: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Грешка на линија %d char %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Грешка на линија %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Празен ентитет '&;' видени; валидни ентитети се: &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Карактерот '%s' претставува невалиден почеток на име на ентитет, карактерот "
+"& го започнува ентитетот;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Карактерот '%s' не е валиден внатре во името на ентитетот"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Името на ентитетот '%s' е познато"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Ентитетот не заврши со полуколоната; најверојатно сте користеле симбол без "
+"намера да започнете ентитет - избегнете го симболот со &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Не успеав да парасирам '%-.*s', кое што требаше да биде параметар за "
+"внатрешен дигитален карактер (на пример, &#234) - најверојатно бројот е "
+"преголем"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Параметарот на карактерот '%-.*s' не енкодира забранет карактер"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Параметар за празен карактер; треба да содржи бројка како што е &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Референцата за карактерите не заврши со полуколона; најверојатно сте "
+"користеле симбол без намера да започнете ентитет - одбегнете го симболот со "
+"&amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Недовршен параметар за ентитет"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Недовршен параметар за карактер"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Невалиден UTF-8 енкодиран текст"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Документите мора да започнуваат со елемент (пр. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' не е валиден карактер по '<' карактер; не може да започне име на елемент"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Чуден карактер '%s', очекував '>' карактер да го заврши почетниот таг на "
+"елементот '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Чуден карактер '%s', очекував '=' по името на атрибутот '%s' од елементот '%"
+"s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Чуден карактер '%s', очекував '>' или '/' за да го затворам почетниот таг на "
+"елементот '%s'; можеби сте користеле невалиден карактер во името на атрибутот"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Чуден карактер '%s', се очекува отворен забележан цитат по еднаквите знаци "
+"кога се даваат вредности за атрибутот '%s'· од елементот '%s'·"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' не е валиден карактер, по карактерите </';·'%s'·не може да започне име "
+"на елемент"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s'·не е валиден карактер што би можел да доје по името на елементот '%s', "
+"дозволениот карактер е '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Елементот '%s' е затворен. Во моментов не е отворен ниеден елемент"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Елементот '%s' е затворен, но тековно отворениот елемент е '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Документот е празен или содржи само празни места"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Документот заврши неочекувано веднаш по заградата за отворениот агол '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Документот заврши неочекувано со сеуште отворени елементи - '%s' беше "
+"последниот отворен елемент"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Документот заврши неочекувано, очекував да видам го видам аголот на "
+"заградата за затворање на тагот <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Документот заврши неочекувано внатре во иметп на елементот"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Документот заврши неочекувано внатре во името на атрибутот"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Документот заврши неочекувано внатре во тагот за отворање на елементи."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr "Нема вредност за атрибутот"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+"Документот заврши неочекувано додека беше внатре во вредноста на атрибутот"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Документот заврши неочекувано внатре во тагот за затворање на елементи '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Документот заврши неочекувано внатре во коментар или инструкција за "
+"процесирање"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Грешка на линија %d char %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Недовршен параметар за ентитет"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Цитираниот текст не започнува со знакот за цитирање"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Несовпаѓачки знак за цитирање на командната линија или друг текст цитиран во "
+"школка"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Текстот заврши веднаш по '\\' карактер. (Текстот беше '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Текстот заврши пред да биде пронајден совпаѓачки цитат за %c. (Текстот беше "
+"'%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Текстот беше празен (или содржеше само празни места)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Не успеав да ги прочитам податоците од подпроцесот"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Не успеав да креирам цевка за комуникација со другите подпроцеси (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Не успеав да прочитам од под-цевката (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Не успеав да го променам директориумот'%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Не успеав да го извршам подпроцесот (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Невалидно име на програма: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Невалиден стринг во аргументот за векторот кај %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Невалиден стринг во околината: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Невалиден работен директориум: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Не успеав да ја извршам програмата за помош (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Неочекувана грешка во g_io_channel_win32_poll() при читање на податоциод "
+"подпроцесот"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Не успеав да ги прочитам податоците од подпроцесите (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Неочекувана грешка во select() при читањето на податоци од подпроцесот (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Неочекувана грешка во waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Не успеав да форкувам (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Не успеав да го извршам подпроцесот \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Не успеав да го пренасочам излезот или влезот на подпроцесот (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Не успеав да го форкувам подпроцесот (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Непозната грешка при извршувањето на подпроцесот \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Не успеав да прочитам доволно податоци од pid подцевката (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Карактерот е надвор од опсегот за UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Невалидна секвенца во излезот од конвертирањето"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Карактерот е надвор од опсег за UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Употреба:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[ОПЦИЈА...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Опции за помош:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Покажи ги сите опции за помош"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Покажи ги сите опции за помош"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Опции на апликацијата:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Не можам да парсирам вредност за целобројната вредност '%s' за %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Вредноста на целиот број '%s' за %s е надвор од опсегот"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Не можам да ја анализирам целобројната вредност '%s' за %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Вредноста на целиот број '%s' за %s е надвор од опсегот"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Грешка при парсирањето на опцијата %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Недостига аргумент за %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Непозната опција '%s'·"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+"Валидната клучна датотека неможе да биде пронајдена во директориумите со "
+"податоци"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Не е обична датотека"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Датотеката е празна"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Клучната датотека содржи линија '%s'· која што не е пар на клучна вредност, "
+"група или коментар"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Невалидно име на група: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Клучната датотека не започнува со група"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Невалидно име на клуч: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Клучната датотека содржи неподдржан енкодинг '%s'·"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Клучната датотека не ја содржи групата '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Клучната датотека не го содржи клучот '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Клучната датотека го содржи клучот '%s' со вредноста '%s' која што не е UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Клучната датотека го содржи клучот '%s' чија што вредност неможе да биде "
+"препознаена."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Клучната датотека го содржи клучот '%s' во групата '%s' која што има "
+"вредност која што неможе да биде препознаена."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Клучната датотека не содржи клуч во '%s' во групата '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Клучната датотека содржи специјални карактери на крајот на линијата"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Клучната датотека содржи невалидни посебни карактери '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Вредноста '%s' неможе да биде препознаена како број."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Целобројната вредност '%s' е надвор од опсегот"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Вредноста '%s' неможе да биде препознаена како рационален број."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Вредноста '%s' не може да биде препознаена како boolean."
diff --git a/trunk/po/ml.po b/trunk/po/ml.po
new file mode 100644
index 000000000..ec7af2e33
--- /dev/null
+++ b/trunk/po/ml.po
@@ -0,0 +1,913 @@
+# translation of glib.HEAD.ml.po to Malayalam
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# FSF-India <locale@gnu.org.in>, 2003.
+# Ani Peter <apeter@redhat.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.HEAD.ml\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-20 08:08+0530\n"
+"Last-Translator: Ani Peter <apeter@redhat.com>\n"
+"Language-Team: Malayalam\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "'%s' എലമെന്‍റിന് അപ്രതീക്ഷിതമായ സവിശേഷത '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "എലമെന്‍റ് '%s'-ന്‍റെ സവിശേഷതയായ '%s' കണ്ടുകിട്ടിയില്ല"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "അപ്രതീക്ഷിതമായ ടാഗ് '%s', ടാഗ് '%s' പ്രതീക്ഷിച്ചിരുന്നു"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "'%s'-ന്‍റെ ഉളളില്‍ അപ്രതീക്ഷിതമായ ടാഗ് '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "ഡേറ്റാ ഡയറക്ടറികളില്‍ സാധുതയുളള ബുക്ക് മാര്‍ക്ക് കണ്ടുകിട്ടിയില്ല"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "URI '%s'-നുളള ബുക്ക് മാര്‍ക്ക് നിലവിലുണ്ട് "
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "URI '%s'-നുളള ബുക്ക് മാര്‍ക്ക് ലഭ്യമല്ല"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "URI '%s'-നുളള ബുക്ക് മാര്‍ക്കില്‍ MIME തരം വ്യക്തമാക്കിയിട്ടില്ല"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "URI '%s'-നുളള ബുക്ക് മാര്‍ക്കില്‍ സ്വകാര്യ ഫ്ളാഗ് വ്യക്തമാക്കിയിട്ടില്ല"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "URI '%s'-നുളള ബുക്ക് മാര്‍ക്കില്‍ ഗ്രൂപ്പുകളൊന്നും ക്രമീകരിച്ചിട്ടില്ല"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "'%s' എന്ന് പേരുളള ഒരു പ്രയോഗവും '%s'-നുളള ബുക്ക് മാര്‍ക്കില്‍ രജിസ്ടര്‍ ചെയ്തിട്ടില്ല"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "സിബോളിക്ക് ലിങ്ക് '%s' വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "അക്ഷരക്കൂട്ടം'%s'ല് നിന്നും '%s'ലേക്കുളള മാറ്റം പിന്തുണയ്ക്കുന്നില്ല"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "'%s'-ല്‍ നിന്നും '%s'-ലേക്ക് വേര്‍തിരിക്കുന്ന സംവിധാനം ലഭ്യമായില്ല"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "മാറ്റം വരുത്തുന്ന ഇന്‍പുട്ടില്‍ തെറ്റായ ബൈറ്റ് ക്രമം"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "മാറ്റം വരുത്തുന്നതില്‍ പരാജയം : %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "ഇന്‍പുട്ടിന്‍റെ അവസാനം ഭാഗികമായ അക്ഷര ക്രമം"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "ഫോള്‍സെറ്റ് '%s'-ല്‍ നിന്നും കോഡ്സെറ്റ് '%s'-ലേക്ക് മാറ്റുവാന്‍ സാധ്യമല്ല"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI %s \"file\" സ്കീം ഉപയോഗിക്കുന്ന പൂര്‍ണ്ണമായ ഒരു URI അല്ല"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "ലോക്കല്‍ ഫയല്‍ URI %s-ല്‍ '#' ഉല്‍പ്പെടുത്താന്‍ പാടില്ല"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' അസാധുവാണ്"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "URI '%s'-ന്‍റെ ഹോസ്റ്റ് നാമം അസാധുവാണ്"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s'-ല്‍ അസാധുവായ എസ്കേപ്ഡ് അക്ഷരങ്ങള്‍ ഉണ്ട്"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "'%s' പാഥ് നാമം പൂര്‍ണ്ണമായ ഒരു പാഥ് അല്ല"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "സാധുതയില്ലാത്ത ഹോസ്റ്റ് നാമം"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "ഡയറക്ടറി '%s' തുറക്കുന്നതില്‍ പിശക്: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "%lu ബൈറ്റ്സ് ഫയല്‍ \"%s\" വായിക്കുന്നതിനായി നീക്ക് വയ്ക്കുവാന്‍ സാധ്യമല്ല"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "%s വായിക്കുന്നതില്‍‌ പരാജയം : %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "ഫയല്‍ '%s'-ല്‍ നിന്നും വായിക്കുന്നതില്‍ പരാജയം: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "%s തുറക്കുന്നതില്‍‌ പരാജയം : %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "%s-ന്‍റെ വിശേഷതകള്‍ കണ്ടെത്തുന്നതില്‍ പരാജയം: fstat() പരാജയപ്പെട്ടു: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "'%s' തുറക്കുന്നതില്‍ പരാജയം: fdopen() പരാജയപ്പെട്ടു: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"ഫയല്‍ '%s'-ന്‍റെ പേര് '%s' ആയി മാറ്റുന്നതില്‍ പരാജയപ്പെട്ടു: g_rename() പരാജയപ്പെട്ടു: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "ഫയല്‍ '%s' സൃഷ്ടിക്കുന്നതില്‍ പരാജയം: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "എഴുതുന്നതിനായി '%s' തുറക്കുവാന്‍ പരാജയപ്പെട്ടു: fdopen() പരാജയപ്പെട്ടു: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "ഫയല്‍ '%s' എഴുതുവാന്‍ പരാജയപ്പെട്ടു: fwrite() പരാജയപ്പെട്ടു: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "ഫയല്‍ '%s' അടയ്ക്കുന്നതില്‍ പരാജയപ്പെട്ടു: fclose() പരാജയപ്പെട്ടു: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "നിലവിലുളള ഫയല്‍ '%s' നീക്കം ചെയ്യുവാന്‍ സാധ്യമല്ല: g_unlink() പരാജയപ്പെട്ടു: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "ടെംപ്ളേറ്റ് \"%s\" അസാധുവാണ്,ഇതില്‍ \"%s\" ഉണ്ടാകുവാന്‍ പാടില്ല"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "ടെംപ്ളേറ്റ് \"%s\"-ല്‍ XXXXXX ലഭ്യമല്ല"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "സിബോളിക്ക് ലിങ്ക് '%s' വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "സിബോളിക്ക് ലിങ്ക് പിന്തുണയ്ക്കുന്നില്ല"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "'%s'-ല്‍ നിന്നും '%s'-ലേക്ക് വേര്‍തിരിക്കുന്ന സംവിധാനം ലഭ്യമായില്ല: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "g_io_channel_read_line_string-ല്‍ റോ വായന സാധ്യമല്ല"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "റീഡ് ബഫറില്‍ ബാക്കിയുളള വേര്‍തിരിക്കാത്ത ഡേറ്റാ"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "ചാനല്‍ അവസാനിക്കുന്നത് ഭാഗികമായ അക്ഷരത്തില്‍ ആണ്"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "g_io_channel_read_to_end-ല്‍ റോ വായന സാധ്യമല്ല"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "ഫയല്‍ '%s' തുറക്കുന്നതില്‍ പരാജയപ്പെട്ടു: open() പരാജയപ്പെട്ടു: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "ഫയല്‍ '%s' മാപ്പ് ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു: mmap() പരാജയപ്പെട്ടു: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "വരി %d-ല്‍ അക്ഷരം %d-ല്‍ പിശക്: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "വരി %d-ല്‍ പിശക്: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"‌ശൂന്യമായ എന്‍റിന്‍റി '&;' കണ്ടു; അനുവദനീയമായവ ഇവയാണ്: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"%sല് ഒരു എന്‍റിന്‍റി തു‌ടങ്ങാവുന്നതല്ല. & എന്ന അക്ഷരം ഒരു എന്‍റിന്‍റിയുടെ തുടക്കം കുറിക്കുന്നു. & ഒരു "
+"എന്‍റിന്‍റിഅല്ലെങ്കില്‍ &amp; എന്ന് പ്രത്യേകം സൂചിപ്പിക്കുക"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "'%s' എന്ന അക്ഷരത്തിന് എന്‍റിന്‍റിയുടെ പേരിനുള്ളില്‍ സാധുതയില്ല"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "എന്‍റിന്‍റി നാമം '%s' അപരിചിതമാണ്"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"എന്‍റിന്‍റി ഒരു അര്ദ്ധവിരാമത്തില് അവസാനിക്കുന്നില്ല. & എന്ന അക്ഷരം അറിയാതെ ഉള്‍ക്കൊളളാന്‍ "
+"ഇടയായോ? & ഒരു എന്‍റിന്‍റി അല്ലെങ്കില്‍ &amp; എന്ന് പ്രത്യേകം സൂചിപ്പിക്കുക"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"'%-.*s' പാഴ്സ് ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു, ഇത് അക്ഷര റഫറന്‍സിനുളളില്‍ ഒരു അക്കം ആയിരിക്കണമാരുന്നു "
+"(&#234; ഉദാഹരണത്തിന്) - ഒരു പക്ഷേ അക്കം വളരെ വലുതാവാം"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr ""
+"അക്ഷരത്തിന്‍റെ സൂചനയായ '%-.*s' ഒരു അനുവദനീയമായ രഹസ്യ അക്ഷരത്തിലേക്കല്ല വേര്‍തിരിക്കുന്നത്"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "ശൂന്യമായ അക്ഷര സൂചനാ; &#454 പോലുളള അക്കം ഉല്‍പ്പെടുത്തേണ്ടതാണ്;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"അക്ഷരസൂചകം ഒരു അര്ദ്ധവിരാമത്തില് അവസാനിക്കുന്നില്ല. & എന്ന അക്ഷരം അറിയാതെ ഉള്‍ക്കൊളളാന്‍ "
+"ഇടയായോ? & ഒരു സത്ത അല്ലെങ്കില് &amp; എന്ന് പ്രത്യേകം സൂചിപ്പിക്കുക"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "പൂര്‍ണ്ണമാകാത്ത എന്‍റിന്‍റി സൂചനാ"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "പൂര്‍ണ്ണമാകാത്ത അക്ഷര സൂചനാ"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "സാധുതയില്ലാത്ത UTF-8 രഹസ്യ വാചകം"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "രേഖ തുടങ്ങേണ്ടത് ഒരു എലമെന്‍റിലാണ് (ഉദാ <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'<' അക്ഷരത്തിന് പിന്നിലുളള '%s' ഒരു അസാധുവായ അക്ഷരമാണ്; ഇത് ഒരു എലമെന്‍റ് പേര് തുടങ്ങില്ല"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"ഓഡ് അക്ഷരം '%s', എലമെന്‍റ് '%s' ആരംഭിക്കുന്ന ടാഗ് അവസാനിക്കേണ്ടത് '>' അക്ഷരത്തിലാവും എന്ന് "
+"പ്രതീക്ഷിക്കുന്നു"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"ഓഡ് അക്ഷരം '%s', എലമെന്‍റ് '%s'-ന്‍റെ സവിശേഷത നാമം '%s'-ന് ശേഷം ഒരു '=' പ്രതീക്ഷിക്കുന്നു"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'</' അക്ഷരങ്ങള്‍ക്ക് ശേഷം ഉളള '%s', അസാധുവായ അക്ഷരമാണ്; '%s' ഒരു എലമെന്‍റ് നാമം തുടങ്ങുന്നില്ല"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"എലമെന്‍റ് നാമം '%s'-ന് ശേഷം ഉളള '%s', ഒരു അസാധുവായ അക്ഷരമാണ്; '>' അക്ഷരമാണ് അനുവദിക്കുന്നത്"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "എലമെന്‍റ് '%s' അടച്ചിരിക്കുന്നു, ഒരു എലമെന്‍റുകളും നിലവില്‍ തുറന്നിട്ടില്ല"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "എലമെന്‍റ് '%s' അടച്ചിരിക്കുന്നു, പക്ഷേ നിലവില്‍ ലഭ്യമായ എലമെന്‍റ് '%s' ആണ്"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "രേഖ ശൂന്യമാണ് അല്ലെങ്കില്‍ അതില്‍ വയിറ്റ് സ്പെയിസ് മാത്രമേ ഉള്ളൂ"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "ഒരു '<' ബ്രാക്കറ്റിന് ശേഷം രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചിരിക്കുന്നു "
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"എലമെന്‍റുകള്‍ തുറന്നു കിടക്കുന്പോള്‍ തന്നെ രേഖ അപ്രതീക്ഷമായ അടഞ്ഞിരിക്കുന്നു - ഒടുവില്‍ തുറന്ന എലമെന്‍റ് "
+"'%s' ആണ്"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"തന്നെ രേഖ അപ്രതീക്ഷമായ അടഞ്ഞിരിക്കുന്നു, ടാഗ് <%s/>-ന് അവസാനമായി ഒരു ക്ളോസ് ആങ്കില്‍ ബ്രാക്കറ്റ് "
+"പ്രതീക്ഷിക്കുന്നു"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "ഒരു എലമെന്‍റിന്‍റെ നാമത്തിനുളളില്‍ രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചു"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "ഒരു സവിശേഷത നാമത്തിനുളളില്‍ രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചു"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "ഒരു എലമെന്‍റ്-ഓപ്പണിങ് ടാഗിനുളളില്‍ രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചു"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "ഒരു സവിശേഷത നാമത്തിനുളളില്‍ വച്ച് രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചു"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "എലമെന്‍റ് '%s'-ന്‍റെ ക്ളോസ് ടാഗിനുള്ളില്‍ രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചു"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"ഒരു അഭിപ്രായം അല്ലെങ്കില്‍ ഒരു പ്രക്രിയ നടത്തുന്ന നിര്‍ദ്ദേശത്തിനുള്ളില്‍ രേഖ അപ്രതീക്ഷിതമായി "
+"അവസാനിച്ചു"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "വരി %d-ല്‍ അക്ഷരം %d-ല്‍ പിശക്: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "പൂര്‍ണ്ണമാകാത്ത എന്‍റിന്‍റി സൂചനാ"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr ""
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "'\\' അക്ഷരത്തിന് ശേഷം ഉടന്‍ തന്നെ വാചകം അവസാനിച്ചു. ('%s' ആയിരുന്നു വാചകം)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "വാചകം ശൂന്യമായിരുന്നു (അല്ലെങ്കില്‍ ഇതില്‍ വയിറ്റ് സ്പെയിസ് മാത്രമേ ഉളളൂ)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "ചൈള്‍ഡ് പ്രക്രിയയില്‍ നിന്നും വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "ചൈള്‍ഡ് പ്രക്രിയയുമായി ബന്ധപ്പെടുന്നതിനുളള പൈപ്പ് ഉണ്ടാക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "ചൈള്‍ഡ് പൈപ്പില്‍ നിന്നും വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "ഡയറക്ടറി '%s'-ലേക്ക് മാറ്റുന്നതില്‍ പരാജയപ്പെട്ടു (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "ചൈള്‍ഡ് പ്രക്രിയ പ്രവര്‍ത്തിപ്പിക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "അസാധുവായ പ്രോഗ്രാം നാമം: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "%d-ല്‍ ആര്‍ഗ്യുമെന്‍റ് വെക്റ്ററില്‍ അസാധുവായ സ്ട്രിങ്: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "എന്‍വിറോണ്‍മെന്‍റില്‍ അസാധുവായ സ്ട്രിങ്: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "പ്രവര്‍ത്തിക്കുന്ന ഡയറക്ടറി അസാധുവാണ്: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "സഹായത്തിനുളള പ്രോഗ്രാം പ്രവര്‍ത്തിപ്പിക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"ചൈള്‍ഡ് പ്രക്രിയയില്‍ നിന്നും ഡേറ്റാ വായിക്കുന്പോള്‍ g_io_channel_win32_poll()-ല്‍ "
+"അപ്രതീക്ഷിതമായ പിശക് "
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "ചൈള്‍ഡ് പ്രക്രിയയില്‍ നിന്നും വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"ചൈള്‍ഡ് പ്രക്രിയയില്‍ (%s) നിന്നും ഡേറ്റാ വായിക്കുന്പോള്‍ select()-ല്‍ അപ്രതീക്ഷിതമായ പിശക് "
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "waitpid()-ല്‍ അപ്രതീക്ഷിതമായ പിശക് (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "fork ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "ചൈള്‍ഡ് പ്രക്രിയ \"%s\" (%s) പ്രവര്‍ത്തിപ്പിക്കുന്നതില്‍ പരാജയപ്പെട്ടു "
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "ചൈള്‍ഡ് പ്രക്രിയയുടെ ഔട്ട് പുട്ട് അല്ലെങ്കില്‍ ഇന്‍പുട്ട് തിരിച്ച് വിടുന്നതില്‍ പരാജയപ്പെട്ടു (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "ചൈള്‍ഡ് പ്രക്രിയ fork ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "ചൈള്‍ഡ് പ്രക്രിയ \"%s\" പ്രവര്‍ത്തിപ്പിക്കുന്നതില്‍ അപ്രതീക്ഷിതമായ പിശക്"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "ചൈള്‍ഡ് pid പൈപ്പിന്‍ നിന്നും ആവശ്യത്തിനുളള ഡേറ്റാ വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "UTF-8 പരിധിയില്‍ നിന്നും പുറത്താണ് അക്ഷരം"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "ഇന്‍പുട്ട് വേര്‍തിരിക്കുന്നതില്‍ അസാധുവായ ക്രമം"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "UTF-16 പരിധിയില്‍ നിന്നും പുറത്താണ് അക്ഷരം"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "ഉപയോഗിക്കേണ്ട വിധം:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "സഹായ ഉപാധികള്‍:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "സഹായ ഉപാധികള്‍ കാണിക്കുക"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "എല്ലാ സഹായ ഉപാധികളും കാണിക്കുക"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "പ്രയോഗത്തിനുളള ഉപാധികള്‍:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "%s-ന് വേണ്ടി ഇന്‍റിജര്‍ മൂല്ല്യം '%s' പാഴ്സ് ചെയ്യുവാന്‍ സാധ്യമല്ല"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "%s-ന് വേണ്ടിയുളള ഇന്‍റിജര്‍ മൂല്ല്യം '%s' പരിധിയ്ക്ക് പുറത്താണ്"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "%s-ന് വേണ്ടി ഡബിള്‍ മൂല്ല്യം '%s' പാഴ്സ് ചെയ്യുവാന്‍ സാധ്യമല്ല"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "%s-ന് വേണ്ടിയുളള ഡബിള്‍ മൂല്ല്യം '%s' പരിധിയ്ക്ക് പുറത്താണ്"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "%s ഉപാധി പാഴ്സ് ചെയ്യുന്നതില്‍ പിശക്"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "%s-നുളള ആര്‍ഗ്യുമെന്‍റ് ലഭ്യമല്ല"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "അപരിചിതമായ ഉപാധി %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "ഡേറ്റാ ഡയറക്ടറികളില്‍ സാധുതയുളള കീ ഫയല്‍ ലഭ്യമല്ല"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "ഒരു സാധാരണ ഫയല്‍ അല്ല"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "ഫയല്‍ ശൂന്യമാണ്"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "അസാധുവായ പ്രോഗ്രാം നാമം: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "കീ ഫയല്‍ ആരംഭിക്കുന്നത് ഒരു ഗ്രൂപ്പിലല്ല"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "അസാധുവായ പ്രോഗ്രാം നാമം: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "പിന്തുണയ്ക്കാത്ത രഹസ്യ ഭാഷ '%s' കീ ഫയല്‍ പിന്തുണയ്ക്കുന്നു"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "കീ ഫയലിന് '%s' എന്ന ഗ്രൂപ്പില്ല"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "കീ ഫയലിന് '%s' എന്ന കീയില്ല"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "UTF-8 അല്ലാത്ത '%s' മൂല്ല്യമുളള കീ '%s' കീ ഫയലിലുണ്ട്"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "തിരിച്ചറിയുവാന്‍ കഴിയാത്ത മൂല്ല്യമുളള കീ '%s' കീ ഫയലിലുണ്ട്"
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr "തിരിച്ചറിയുവാന്‍ കഴിയാത്ത മൂല്ല്യമുളള കീ '%s', '%s' എന്ന ഗ്രൂപ്പില്‍ കീ ഫയലിലുണ്ട്."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "ഗ്രൂപ്പ് '%s'-ല്‍ കീ ഫയലിന് കീ '%s' ലഭ്യമല്ല"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "കീ ഫയലിന്‍റെ വരിയുടെ അവസാനം എസ്കെയിപ്പ് അക്ഷരം ലഭ്യമാണ്"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "കീ ഫയലില്‍ അസാധുവായ എസ്കെയിപ്പ് സീക്വന്‍സ് '%s' ലഭ്യമാണ്"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "മൂല്ല്യം '%s' ഒരു അക്കമായി കണക്കാക്കുവാന്‍ സാധ്യമല്ല."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "ഇന്‍റിജര്‍ മൂല്ല്യം '%s' പരിധിയ്ക്ക് പുറത്ത്"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "മൂല്ല്യം '%s' ഒരു ഫ്ളോട്ട് അക്കമായി കണക്കാക്കുവാന്‍ സാധ്യമല്ല."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "മൂല്ല്യം '%s' ഒരു ബൂളിയനായി കണക്കാക്കുവാന്‍ സാധ്യമല്ല."
diff --git a/trunk/po/mn.po b/trunk/po/mn.po
new file mode 100644
index 000000000..761f23275
--- /dev/null
+++ b/trunk/po/mn.po
@@ -0,0 +1,964 @@
+# translation of glib.HEAD.po to Mongolian
+# translation of glib.HEAD.mn.po to Mongolian
+# translation of glib.HEAD.po to mongolian
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Sanlig Badral <badral@chinggis.com>, 2003.
+# Sanlig Badral <Badral@openmn.org>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2005-05-30 01:07-0800\n"
+"Last-Translator: Бадрал <badral@openmn.org>\n"
+"Language-Team: Mongolian <openmn-translation@lists.sf.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.0.2\n"
+"Plural-Forms: 2\n"
+"X-Poedit-Language: Mongolian\n"
+"X-Poedit-Country: MONGOLIA\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Сонин тэмдэгт »%s«, »%s« элементийн »%s« аттрибутын нэрийн дараа »=« "
+"хүлээгдэж байна"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Өгөгдлийн лавлахаас хүчинтэй утга олдсонгүй"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "»%s« символик холбоос уншигдсангүй: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Тэмдэгт олонлог »%s« ээс »%s« рүү хөрвүүлэх дэмжигдээгүй байна"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "»%s« ээс »%s« рүү хөрвүүлэгч нээгдсэнгүй"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Хөрвүүлэлтийн оролтод хүчингүй байт дараалал байна"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Хөрвүүлж байхад алдаа: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Оролтын төгсгөлд хагас тэмдэгтийн дараалал"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "»%s« ухарч »%s« кодчилол руу хөрвөхгүй байна"
+
+# CHECK
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI »%s« нь файл схемд хэрэглэгддэг үнэмлэхүй хаяг биш"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Дотоод URI »%s« нь »#« -г агуулж болохгүй"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "»%s« URI хүчингүй"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "URI »%s« -н хостын нэр хүчингүй"
+
+# CHECK
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "»%s« URI хүчингүй Escape-тэмдэгт агуулж байна"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "»%s« замын нэр үнэмлэхүй зам биш"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Хүчингүй хостын нэр"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "»%s« лавлахыг нээхэд алдаа: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "%lu байтуудыг »%s« файлыг уншихдаа байрлуулж чадсангүй"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "»%s« файлаас уншиж болохгүй байна: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "»%s« файл нээгдэхгүй байна: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "»%s« файлын аттрибут тодорхойлогдсонгүй: fstat() нурлаа: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "»%s« файл үүсгэгдсэнгүй: %s"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "»%s« хэв хүчингүй, »%s« -г агуулах хэрэггүй"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "»%s« хэв XXXXXX -р төгсөхгүй байна"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "»%s« символик холбоос уншигдсангүй: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Символик холбоос дэмжигдээгүй"
+
+#: glib/giochannel.c:1152
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "»%s« -ээс »%s« рүү хөрвүүлэгч нээгдсэнгүй: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Raw-read in g_io_channel_read_line_string боломжгүй"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Унших буфэрт хөрвүүлээгүй файл байна"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Суваг тал тэмдэгтээр төгслөө"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Raw-read in g_io_channel_read_to_end боломжгүй"
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "%d мөрөнд %d тэмдэгт алдаатай байна: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "%d мөрөнд алдаа: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Хоосон абт »&;« олдлоо; хүчинтэй абтууд &amp; &quot; &lt; &gt; &apos; юм. "
+"(абт=аский биш тэмдэгт)"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Абтын нэрийн эхлэлийн »%s« тэмдэгт хүчингүй; Абт & тэмдэгтээр эхэлдэг; "
+"Хэрвээ энэ амперсаныг абт бишээр авах хэрэгтэй бол &amp; гэж бичнэ үү"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "»%s« тэмдэгт абтын нэрэнд хүчингүй"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Абтын нэр »%s« тодорхойгүй"
+
+# CHECK
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Абт цэг таслалаар төгсөөгүй байна; Та магад амперсандыг абтын эхлэл бусаар "
+"хэрэглэхийг хүссэн байх - Та &amp; гэж бичнэ үү"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"»%-.*s« тэмдэгтийн дотор тоо байх ёстой (&#234; шиг) , задлан ялгалд "
+"танигдсангүй - магадгүй хэтэрхий том тоо байна уу"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "»%-.*s« тэмдэгт холбоос зөвшөөрөгдөөгүй тэмдэгтээр кодлогдсон байна"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Хоосон тэмдэгтийн холбоос; &#454; гэх мэт тоо агуулах ёстой"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Тэмдэгт холбоос цэг таслалаар төгсөөгүй байна; Та магад амперсандыг абтын "
+"эхлэл бусаар хэрэглэхийг хүссэн байх - Та &amp; гэж бичнэ үү"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Төгсгөлгүй абт холбоос"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Төгсгөлгүй тэмдэгт холбоос"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Хүчингүй UTF-8-р кодлогдсон текст"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Баримт ямар нэгэн элементээр эхлэх ёстой (Ж.нь <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"»%s« нь »<«-тэмдэгтийн арын хүчингүй тэмдэгт; Энэ нь элементийн нэрээр эхэлж "
+"болохгүй."
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Сонин тэмдэгт »%s«, »%s« элементийн эхлэлийн тагийг хаахад »>« тэмдэгт дутуу "
+"байна"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Сонин тэмдэгт »%s«, »%s« элементийн »%s« аттрибутын нэрийн дараа »=« "
+"хүлээгдэж байна"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Сонин тэмдэгт »%s«, »%s« элементийн эхлэлийн тагийг хаахын тулд аттрибутын "
+"нэр эсвэл харин »>« эсвэл »/« тэмдэгт хүлээгдэж байна; Магадгүй та "
+"аттрибутын нэрэндээ хүчингүй тэмдэгт хэрэглэжээ"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Сонин тэмдэгт »%s«; »%s« элементийн »%s« аттрибутын хувьд өгсөн утга "
+"тэнцүүгийн тэмдэгийн дараах хашилтыг хүлээж байна"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"»%s« хүчингүй тэмдэгт, хэрвээ энэ нь »</« тэмдэгтийн ард орвол; »%s« "
+"ньэлементийн нэрээр эхэлж болохгүй"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"»%s« хүчингүй тэмдэгт, хэрвээ энэ нь хааж буй »%s« элементийн нэрийн ард "
+"байгаа бол; »>« тэмдэгт хүчинтэй"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "»%s« элемент хаагдсан, Одоогоор ямарч элемент нээлттэй бус байна"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "»%s« элемент хаагдсан, харин одоогоор »%s« элемент нээлттэй байна"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Баримт хоосон эсвэл зүгээр цагаан зай агуулж байна"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Баримт нээлттэй өнцөгтэй хаалт »<« -н дараа гэнэт төгсөв"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Баримт нээлттэй элементүүдтэйгээр гэнэтийн байдлаар төгсөв - »%s« сүүлчийн "
+"нээлттэй элемент нь"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Баримт гэнэтийн байдлаар төгсөв, таг <%s/> -г хаах өнцөгтэй хаалт "
+"»>«хүлээгдэж байна"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Баримт нэгэн элементийн нэрийн дотор гэнэтийн байдлаар төгсөв"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Баримт нэгэн аттрибут нэрийн дотор гэнэтийн байдлаар төгсөв"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+"Баримт нээгдэж буй тагийн нэгэн элементийн нэрийн дотор гэнэтийн байдлаар "
+"төгсөв."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Баримт аттрибут нэрийн дараах тэнцүүгийн тэмдэгийн дараа гэнэтийн байдлаар "
+"төгсөв; аттрибутын утга алга"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Баримт нэгэн аттрибутын утгын дотор гэнэтийн байдлаар төгсөв"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Баримт гэнэтийн байдлаар нэгэн хаагдаж буй »%s« элементийн тагийн дотор "
+"төгсөв"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Баримт тайлбар эсвэл заавар боловсруулалтын дотор гэнэтийн байдлаар төгсөв"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "%d мөрөнд %d тэмдэгт алдаатай байна: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Төгсгөлгүй абт холбоос"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Хашилтан доторхи текст хашилтаар эхлэхгүй"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Тушаалын мөр дэх эсвэл өөр shell-quoted текст доторхи хашилтын тоо "
+"балансжаагүй байна"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Текст »\\«-тэмдэгтийн дараа төгслөө. (Текст »%s« байсан)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "Текст %c -н тохирох хашилт олдохоос өмнө төгслөө. (Текст »%s« байсан)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Текст хоосон байв (эсвэл зөвхөн цагаан зай агуулсан)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Өгөгдөл хүү процессоор уншигдсангүй"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Хүү процесстой (%s) холбогдох шугам үүсгэж чадсангүй"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Хүү процессын (%s) шугамаас унших бүтэлгүйтлээ"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "»%s« (%s) лавлах солигдсонгүй"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Хүү процесс ажилласангүй (%s)"
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "Хүчингүй хостын нэр"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, fuzzy, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Хөрвүүлэлтийн оролтод хүчингүй дараалал"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr "»%s« лавлахыг нээхэд алдаа: %s"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Тусламж программ ажиллахгүй байна"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Хүү процессоос өгөгдөл уншиж байхад g_io_channel_win32_poll() дотор "
+"санамсаргүй алдаа гарлаа"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Хүү процессын (%s) өгөгдөл уншигдсаж чадсангүй"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Хүү процессоос (%s) өгөгдөл уншиж байхад select() дотор санамсаргүй алдаа "
+"гарлаа"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Санамсаргүй алдаа waitpid() дотор (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Салаалалт нурлаа (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Хүү процесс »%s« -г ажиллуулах нурлаа (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Хүү процессийн (%s) гаралт эсвэл оролтыг солих нурлаа"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Хүү процессын (%s) салаалалт нурлаа"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "»%s« хүү процессыг ажиллуулж байхад тодорхойгүй алдаа"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"Хүү процессын процессын дугаарын шугамаас (%s) хангалттай өгөгдөл уншиж "
+"чадсангүй"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "UTF-8 хязгаараас гаднах тэмдэгт"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Хөрвүүлэлтийн оролтод хүчингүй дараалал"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "UTF-16 хязгаараас гаднах тэмдэгт"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Хэрэглээ:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Тусламж:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Тусламж харуулах"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Бүх тусламж харуулах"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Програм:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, fuzzy, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "'%s' бүхэл тоог --%s -н хувьд шинжлэх боломжгүй"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "'%s' бүхэл %s -н хувьд хязгаараас хальжээ"
+
+#: glib/goption.c:831
+#, fuzzy, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "'%s' бүхэл тоог --%s -н хувьд шинжлэх боломжгүй"
+
+#: glib/goption.c:839
+#, fuzzy, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "'%s' бүхэл %s -н хувьд хязгаараас хальжээ"
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Хөрвүүлж байхад алдаа: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Тодорхойгүй утга %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Өгөгдлийн лавлахаас хүчинтэй утга олдсонгүй"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Тохиромжгүй файл"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Файл хоосон"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Түлхүүр файл түлхүүр утга, бүлэг, эсвэл тайлбаргүй '%s' мөр агуулж байна."
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Хүчингүй хостын нэр"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Түлхүүр файл бүлэг утгаар эхлэх боломжгүй"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Хүчингүй хостын нэр"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Түлхүүр файлд дэмжигдээгүй кодчилол '%s' байна"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Түлхүүр файлд '%s' бүлэг алга"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Түлхүүр файлд '%s' түлхүүр алга"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Түлхүүр файлд '%s' мөр '%s' гэсэн UTF-8 бус утгатай байна"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "Түлхүүр файлд илэрхийлэх боломжгүй '%s' утга байна."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Түлхүүр файлын '%2$s' бүлэгт '%1$s' гэсэн илэрхийлэх боломжгүй утга байна."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Түлхүүр файлын '%2$s' бүлэгт '%1$s' түлхүүр алга"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Түлхүүр файлын мөрийн төгсгөлд ESC тэмдэгт байна"
+
+# CHECK
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Түлхүүр файлд »%s« хүчингүй escape-тэмдэгт байна"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "'%s' утга бүхэл тоогоор илэрхийлэгдэх боломжгүй."
+
+#: glib/gkeyfile.c:3593
+#, fuzzy, c-format
+msgid "Integer value '%s' out of range"
+msgstr "'%s' бүхэл %s -н хувьд хязгаараас хальжээ"
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "'%s' утга бүхэл тоогоор илэрхийлэгдэх боломжгүй."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "'%s' утга бүүл утгаар дүрслэгдэх боломжгүй ."
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "%lu байтуудыг »%s« файлыг уншихдаа байрлуулж чадсангүй"
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "»%s« тэмдэгтээс »%s« рүү хөрвүүлэх дэмжигдээгүй байна"
+
+#~ msgid "Incorrect message size"
+#~ msgstr "Буруу мэдээний хэмжээ"
+
+#~ msgid "Socket error"
+#~ msgstr "Сокет алдаа"
diff --git a/trunk/po/ms.po b/trunk/po/ms.po
new file mode 100644
index 000000000..101f3204d
--- /dev/null
+++ b/trunk/po/ms.po
@@ -0,0 +1,931 @@
+# glib Bahasa Melayu (ms)
+# Jika takut risiko, Jangan bicara tentang Perjuangan
+# Hasbullah Bin Pit (sebol) <sebol@ikhlas.com>, 2002-2004
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2004-02-03 02:11+0730\n"
+"Last-Translator: Hasbullah Bin Pit <sebol@my-penguin.org>\n"
+"Language-Team: Projek Gabai <gabai-penyumbang@lists.sourceforge.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Aksara ganjil '%s', dijangkakan '=' selepas nama atribut '%s' unsur '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Gagal membaca pautan simbolik '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Penukaran set aksara daripada '%s' ke '%s' tidak disokong"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "tak dapat membuka penukar daripada '%s' kepada '%s': %s"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Turutan byte tidak sah pada penukaran iput"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Ralat semasa penukaran: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Sebahagian turutan aksara berada di penghujung input"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Tak dapat tukar unduran '%s' ke set kod '%s'"
+
+#: glib/gconvert.c:1727
+#, fuzzy, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' adalah bukan URI mutlak menggunakan skema fail"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "URI Fail local '%s' mungkin tidak disertakan dengan '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' adalah tidak sah"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Namahos URI '%s' tidak sah"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' mengandungi aksara escaped yang tidak sah"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Nama laluan '%s' adalah bukan laluan mutlak"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Namahos tidak sah"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Ralat membuka direktori %s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Tak dapat memperuntukkan %lu byte untuk membaca fail \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Ralat membaca fail '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Gagal membaca fail '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Gagal membuka fail '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Gagal mendapatkan atribut fail '%s': fstat() gagal: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Gagal membuka fail '%s': fdopen() gagal: %s"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Gagal membuka fail '%s': fdopen() gagal: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Gagal mencipta fail %s': %s"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Gagal membuka fail '%s': fdopen() gagal: %s"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Gagal membuka fail '%s': fdopen() gagal: %s"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Gagal membuka fail '%s': fdopen() gagal: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Templet '%s' tidak sah, sepatutnya tidak mengandungi '%s'"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Templet '%s' tidak berakhir dengan XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Gagal membaca pautan simbolik '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Pautan simbolik tidak disokong"
+
+#: glib/giochannel.c:1152
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Tak dapat membuka penukar daripada `%s' kepada `%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Tak dapat membuat bacaan rawak pada g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Data tak boleh ditukar Leftover pada penimbal bacaan"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Saluran terhenti pada sebahagian aksara"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Tak dapat membuat bacaan rawak pada g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Gagal membuka fail '%s': fdopen() gagal: %s"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Gagal membuka fail '%s': fdopen() gagal: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Ralat pada baris %d aksara %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Ralat pada baris %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Entiti kosong '&;' kelihatan; entiti sah ialah : &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Aksara '%s' adalah tidak sah pada permulaan nama entiti; aksara '&' "
+"memulakan entiti; jika & tidak disokong untuk dijadikan entiti, escapekan "
+"sebagai &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Aksara '%s' adalah tidak sah di dalam nama entiti"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Nama entiti '%s' tidak diketahui"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entiti tidak berakhir dengan titik bertindih; mungkin anda gunakan aksara "
+"'&' tanpa menyedari untuk memulakan entiti - escape & sebagai &amp;"
+
+#: glib/gmarkup.c:573
+#, fuzzy, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"gagal menghantar '%s', yang sepatutnya satu digit didalam satu rujukan "
+"aksara (&#234; sebagai contoh) - mungkin digit terlalu besar"
+
+#: glib/gmarkup.c:598
+#, fuzzy, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Rujukan aksara '%s' tidak mengenkodkan aksara yang diizini"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Rujukan aksara kosong; sepatutnya disertakan digit seperti &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Rujukan aksara tidak berakhir dengan semicolon; agaknya anda menggunakan "
+"aksara '&' tanpa niat untuk memulakan entiti - escapekan & sebagai &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Rujukan entiti tidak tamat"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Rujukan aksara tidak tamat"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Teks terenkod UTF-8 tidak sah"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokumen mesti dimulakan dengan unsur (e.g. <buku>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' adalah bukan aksara sah diikuti sengan aksara '<'; ia tidak sepatutnya "
+"bermula dengan nama unsur"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Aksara ganjil '%s', dijangkakan aksara '>' untuk mengakhiri tag permulaan "
+"unsur '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Aksara ganjil '%s', dijangkakan '=' selepas nama atribut '%s' unsur '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Aksara ganjil '%s', menjangka aksara '>' atau '/' untuk mengakhiri tag "
+"permulaan unsur '%s', atau atribut; meungkin anda gunakan aksara tidak sah "
+"pada nama atribut"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Aksara ganjil '%s', menjangka tanda petikan membuka selepas tanda = bila "
+"memberi nilai atribut untuk '%s' unsur '%s' "
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' adalah bukan aksara sah diikuti aksara '</'; '%s' tak boleh memulakan "
+"nama unsur"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' adalah bukan aksara sah diikuti dengan nama unsur penutup '%s'; aksara "
+"yang diizinkan ialah '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Unsur '%s' telah ditutup, tiada unsur yang dibuka"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Unsur '%s' telah ditutup, tetapi unsur yang dibuka adalah '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokumen kosong atau hanya menandungi ruangputih"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Dokumen berakhir tanpa diduga sebaik selepas membuka '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokumen berakhir tanpa diduga dengan unsur yang masih dibuka - '%s' adalah "
+"unsur dibuka"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr "Dokumen berakhir tanpa diduga, menjangkai tag <%s/> pada hujungnya"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokumen berakhir tanpa diduga di dalam nama unsur"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokumen berakhir tanpa diduga di dalam nama atribut"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokumen berakhir tanpa diduga di dalam tag element-opening"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokumen berakhir tanpa diduga selepas tanda '=' diikuti dengan nama atribut; "
+"tiana nilai atribut"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokumen berakhir tanpa diduga semasa di dalam nilai atribut"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Dokumen berakhir tanpa diduga di dalam tag tertutup untuk unsur '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Dokumen berakhir tanpa diduga di dalam komen atau memproses arahan"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Ralat pada baris %d aksara %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Rujukan entiti tidak tamat"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Teks dipetik tidak bermula dengan tanda petikan"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Tanda petikan tidak sepadan pada arahan baris atau teks shell-quoted lain"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Teks berakhir selepas aksara '\\'. (Teks terdahulu ialah '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "Teks berakhir sebelum quot sepadan dijumpai untuk %c (Teks ialah '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Teks telah kosong (atau mengandungi hanya ruangputih)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Gagal membaca data daripada proses anak"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Gagal mencipta paip untuk berkomunikasi dengan proses anak (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Gagal membaca daripada paip anak (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Gagal menukar direktori '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Gagal melaksanakan proses anak (%s)"
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "Namahos tidak sah"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, fuzzy, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Turutan tidak sah semasa penukaran input"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr "Ralat membuka direktori %s': %s"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Gagal melaksanakan program pembantu"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Ralat tidak diduga bila g_io_channel_win32_poll()membaca data daripada "
+"proses anak"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Gagal membaca data daripada proses anak (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Ralat tanpa diduga bila select() membaca data daripada proses anak (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Ralat tanpa diduga pada waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Gagal untuk sepit (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Gagal melaksanakan proses anak \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Gagal melencongkan output atau input proses anak (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Gagal menyepit proses anak (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Ralat misteri ketika melaksanakan proses anak \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Gagal membaca data yang cukup daripada paip pid anaki(%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Aksara di luar julat UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Turutan tidak sah semasa penukaran input"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Aksara di luar julat UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr ""
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr ""
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr ""
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr ""
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Ralat semasa penukaran: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr ""
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr ""
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Namahos tidak sah"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Namahos tidak sah"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, fuzzy, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "URI '%s' mengandungi aksara escaped yang tidak sah"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Gagal membuka fail '%s': fdopen() gagal: %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Tak dapat memperuntukkan %lu byte untuk membaca fail \"%s\""
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Gagal membuka fail '%s': fdopen() gagal: %s"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Penukaran set aksara daripada '%s' kepada '%s' tidak disokong"
diff --git a/trunk/po/nb.po b/trunk/po/nb.po
new file mode 100644
index 000000000..06d68b9b3
--- /dev/null
+++ b/trunk/po/nb.po
@@ -0,0 +1,930 @@
+# translation of nb.po to Norwegian Bokmal
+# Norwegian (bokmål) translation of glib.
+# Copyright (C) 2001-2003, 2005 Free Software Foundation, Inc.
+# Kjartan Maraas <kmaraas@gnome.org>, 2001-2007.
+# Terance Edward Sola <terance@lyse.net>, 2005.
+# Kjartan Maraas <kmaraas@gnome.org>, 2007.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib 2.13.x\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-06-04 12:53+0200\n"
+"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
+"Language-Team: Norwegian bokmal <i18n-nb@lister.ping.uio.no>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Uventet attributt «%s» for element «%s»"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Attributt «%s» i element «%s» ble ikke funnet"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Uventet tagg «%s», tagg «%s» forventet"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Uventet tagg «%s» i «%s»"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Ingen gyldig bokmerkefil ble funnet i datakatalogene"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Et bokmerke eksisterer allerede for URI «%s»"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Ingen bokmerker funnet for URI «%s»"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Ingen MIME-type definert i bokmerke for URI «%s»"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Ingen private flagg er definert i bokmerke for URI «%s»"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Ingen grupper satt i bokmerke for URI «%s»"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Ingen program med navn «%s» har registrert et bokmerke for «%s»"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Feil under utvidelse av exec-linje «%s» med URI «%s»"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Konvertering fra tegnsett «%s» til «%s» er ikke støttet"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Kunne ikke åpne program for å konvertere fra «%s» til «%s»"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Ugyldig bytesekvens i inndata for konvertering"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Feil under konvertering: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Ufullstendig tegnsekvens ved slutten på inndata"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Kan ikke konvertere \"fallback\" «%s» til tegnsett «%s»"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI «%s» er ikke en absolutt URI som bruker skjema for filer"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Lokal fil-URI «%s» kan ikke inneholde en «#»"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI «%s» er ugyldig"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Vertsnavnet for URI «%s» er ugyldig"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Vertsnavnet for URI «%s» inneholder ugyldige escape-tegn"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Stinavnet «%s» er ikke en absolutt sti"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Ugyldig vertsnavn"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Feil under åpning av katalog «%s»: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Kunne ikke allokere %lu bytes til lest fil «%s»"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Feil under lesing av fil «%s»: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Feil under lesing fra fil «%s»: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Feil under åpning av fil «%s»: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Feil ved uthenting av attributter for fil «%s»: fstat() feilet: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Feil under åpning av fil «%s»: fdopen() feilet: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Feil under endring av navn på filen «%s» til «%s»: g_rename() feilet: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Feil under oppretting av fil «%s»: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Feil under åpning av filen «%s» for skriving: fdopen() feilet: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Kunne ikke skrive fil «%s»: fwrite() feilet: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Kunne ikke lukke fil «%s»: fclose() feilet: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Eksisterende fil «%s» kunne ikke bli fjernet: g_unlink() feilet: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Mal «%s» er ugyldig, må ikke inneholde «%s»"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Mal «%s» inneholder ikke XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Feil under lesing av symbolsk lenke «%s»: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Symbolske lenker er ikke støttet"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Kunne ikke åpne konverterer fra «%s» til «%s»: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Kan ikke utføre rå avlesing i g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Overflødig ikke-konvertert data i innlesingsbuffer"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanalen terminerer i et oppdelt tegn"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Kan ikke utføre rå avlesing i g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Kunne ikke åpne fil «%s»: open() feilet: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Kunne ikke lese fil «%s» inn i minnet: mmap() feilet: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Feil på linje %d tegn %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Feil på linje %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Tom entitet «&;» funnet; gyldige entiteter er: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Tegn «%s» er ikke gyldig ved starten på navnet til en entitet; &-tegnet "
+"starter en entitet; hvis dette og-tegnet ikke er ment å være en entitet, "
+"unngå dette ved å bruke &amp; i stedet"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Tegn «%s» er ikke gyldig inne i et entitetsnavn"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Entitetsnavn «%s» er ikke kjent"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entiteten sluttet ikke med et semikolon; du har sannsynligvis brukt et og-"
+"tegn uten at det var ment å starte en entitet - ungå ved å bruke &amp; i "
+"stedet"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Feil under lesing av «%-.*s», som skulle vært et tall inne i en "
+"tegnreferanse (&#234; for eksempel) - tallet er muligens for stort"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Tegnreferanse «%-.*s» koder ikke et tillatt tegn"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Tom tegnreferanse; skulle inkludert et tall slik som &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Tegnreferansen sluttet ikke med et semikolon; du har sannsynligvis brukt et "
+"og-tegn uten at det var ment å starte en entitet - unngå ved å bruke &amp; i "
+"stedet"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Uferdig referanse til entitet"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Uferdig referanse til tegn"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Ugyldig UTF-8 kodet tekst"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokumentet må starte med et element (f.eks <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"«%s» er ikke et gyldig tegn etter en «<» tegn; det kan ikke være begynnelsen "
+"på et elementnavn"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Rart tegn «%s», forventet et «>» tegn for å avslutte start-taggen til "
+"elementet «%s»"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Rart tegn «%s», forventet et «=» etter attributtnavn «%s» for element «%s»"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Rart tegn «%s», forventet «>» eller «/» tegn for å avslutte start-taggen til "
+"element «%s», eller alternativt en attributt; kanskje du brukte et ugyldig "
+"tegn i attributtnavnet"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Rart tegn «%s», ventet et åpent sitattegn etter likhetstegnet når verdi for "
+"attributt «%s» for element «%s» oppgis"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"«%s» er ikke et gyldig tegn etter tegnene «</»; «%s» er kanskje ikke "
+"begynnelsen på et elementnavn"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"«%s» er ikke et gyldig tegn etter element for lukking med navn «%s»; tillatt "
+"tegn er «>»"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element «%s» ble lukket, ingen åpne elementer nå"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Element «%s» ble lukket, men aktivt åpent element er «%s»"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokumentet var tomt eller inneholdt kun blanke tegn"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Dokumentet sluttet uventet rett etter en åpen vinkelparantes «<»"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokumentet sluttet uventet med åpne elementer - «%s» var siste åpne element"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokumentet sluttet uventet, forventet å se en vinkelparantes for å slutte av "
+"den siste taggen <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokumentet sluttet uventet inni et elementnavn"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokumentet sluttet uventet inni et attributtnavn"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokumentet sluttet uventet inni en tagg for åpning av element."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokumentet sluttet uventet etter likhetstegnet som følger et attributtnavn; "
+"ingen attributtverdi"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokumentet sluttet uventet inni en attributtverdi"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Dokumentet sluttet uventet inni tagg for lukking av element «%s»"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Dokumentet sluttet uventet inni en kommentar eller prosesseringsinstruksjon"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr "korrupt objekt"
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr "intern feil eller korrupt objekt"
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr "ikke mer minne"
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr "grense for liste av funksjonskall nådd"
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr "mønsteret inneholder oppføringer som ikke støttes for delvise treff"
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr "intern feil"
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr "bakoverreferanser som betingelser er ikke støttet for delvise treff"
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr "rekursjonsgrense nådd"
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr "grense for tomme understrenger nådd"
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr "ugyldig kombinasjon av flagg for nye linjer"
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr "ukjent feil"
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr "Feil under treff på regulært uttrykk %s: %s"
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr "PCRE-biblioteket er kompilert uten støtte for UTF8"
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr "PCRE-biblioteket er kompilert uten støtte for UTF8-egenskaper"
+
+# msgid "Error while compiling regular expression %s at char %d: %s"
+# msgstr "Feil under sammensetting av regulært utrykk ved tegn %d: %s"
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Feil under optimering av reguært utrykk %s: %s"
+
+# msgid "Error while compiling regular expression %s at char %d: %s"
+# msgstr "Feil under sammensetting av regulært utrykk ved tegn %d: %s"
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr "Feil under optimering av reguært utrykk %s: %s"
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr "heksadesimalt nummer eller «}» forventet"
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr "heksadesimalt tall forventet"
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr "mangler «<» i symbolsk referanse"
+
+#: glib/gregex.c:1834
+msgid "unfinished symbolic reference"
+msgstr "uferdig symbolsk referanse"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr "symbolsk referanse med null lengde"
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr "tall forventet"
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr "ugyldig symbolsk referanse"
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr "feilplassert siste «\\\\»"
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr "ukjent escapesekvens"
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr "Feil under tolking av erstatningstekst «%s» ved tegn %lu: %s"
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Sitert tekst begynner ikke med sitattegn"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Ubalansert sitattegn i kommandolinje eller annen skall-sitert tekst"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Tekst sluttet rett etter et «\\» tegn. (Teksten var «%s»)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Teksten sluttet før likt sitattegn ble funnet for %c. (Teksten var «%s»)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Teksten var tom (eller inneholdt kun blanke tegn)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Feil under lesing av data fra underprosess"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Feil under oppretting av rør for kommunikasjon med underprosess (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Feil under lesing fra \"child pipe\" (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Feil ved skifte til katalog «%s» (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Feil under kjøring av underprosess (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Ugyldig programnavn: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Ugyldig streng i argumentvektor på %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Ugyldig streng i miljø: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Ugyldig arbeidsmappe: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Feil under kjøring av hjelpeprogram (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Uventet feil i g_io_channel_win32_poll() under lesing av data fra en "
+"underprosess"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Feil under lesing av data fra underprosess (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Uventet feil i select() ved lesing av data fra underprosess (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Uventet feil i waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Feil under kjøring av fork (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Feil under kjøring av underprosess «%s» (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Feil under omdirigering av utdata eller inndata for underprosess (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Feil under kjøring av fork() for underprosess (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Ukjent feil under kjøring av underprosess «%s»"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Klarte ikke å lese nok data fra underprosessens pid-rør (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Tegn utenfor gyldig område for UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Ugyldig sekvens i inndata for konvertering"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Tegn utenfor gyldig område for UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Bruk:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[FLAGG...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Flagg for hjelp:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Vis flagg for hjelp"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Vis alle flagg for hjelp"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Flagg for applikasjonen"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Kan ikke lese heltallsverdi «%s» for %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Heltallsverdi «%s» for %s er utenfor gyldig område"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Kan ikke lese verdi for double «%s» for %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Double-verdi «%s» for %s er utenfor gyldig område"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Feil under tolking av flagg %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Mangler argument for %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Ukjent flagg %s"
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Gyldig nøkkelfil ble ikke funnet i søkemapper"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Ikke en vanlig fil"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Filen er tom"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Nøkkelfil inneholder linjen «%s» som ikke er et par med nøkkelverdier, "
+"gruppe eller kommentar"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Ugyldig navn på gruppe: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Nøkkelfil starter ikke med en gruppe"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Ugyldig navn på nøkkel: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Nøkkelfil inneholder ustøttet tegnkoding «%s»"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Nøkkelfil har ikke gruppe «%s»"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Nøkkelfil har ikke nøkkelen «%s»"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Nøkkelfilen inneholder nøkkelen «%s» med verdi «%s» som ikke er UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Nøkkelfilen inneholder nøkkelen «%s» som har en verdi som ikke kan bli tolket"
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Nøkkelfilen inneholder nøkkelen «%s» i gruppen «%s» som har en verdi som "
+"ikke kan bli tolket."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Nøkkelfilen har ikke nøkkelen i «%s» i gruppen «%s»"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Nøkkelfilen inneholder skiftetegn ved linjeslutt"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Nøkkelfil inneholder ugyldig skiftesekvens «%s»"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Vedien «%s» kan ikke bli tolket som et tall."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Heltallsverdi «%s» er utenfor gyldig område"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Verdi «%s» kan ikke tolkes som et flyttall."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Verdi «%s» kan ikke tolkes som en bolsk verdi."
diff --git a/trunk/po/ne.po b/trunk/po/ne.po
new file mode 100644
index 000000000..d05aa365b
--- /dev/null
+++ b/trunk/po/ne.po
@@ -0,0 +1,917 @@
+# translation of glib.HEAD.ne.po to Nepali
+# This file is distributed under the same license as the glib package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Jyotshna Shrestha <shresthajyo@hotmail.com>, 2005.
+# Ganesh Ghimire <gghimire@gmail.com>, 2005.
+# Shiva Pokharel <pokharelshiva@hotmail.com>, 2005.
+# Kapil Timilsina <lipak21@gmail.com>, 2005.
+# Jaydeep Bhusal <zaydeep@hotmail.com>, 2005.
+# Shyam Krishna Bal <shyamkrishna_bal@yahoo.com>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.glib-2-10.ne\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-04-27 00:00+0545\n"
+"Last-Translator: Shyam Krishna Bal <shyamkrishna_bal@yahoo.com>\n"
+"Language-Team: Nepali <info@mpp.org.np>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10.2\n"
+"Plural-Forms: nplurals=2;plural=(n!=1)\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "विजोड क्यारेक्टर '%s' ले,'%s' तत्वको गुण नाम '%s' पछि अपेक्षा गरिएको एउटा '=' "
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "वैध कुञ्जी फाइल डेटा डाइरेक्टरीहरूमा फेला परेन"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "सांकेतिक सम्बन्ध '%s' पढ्न असफल: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "क्यारेक्टर सेट '%s' बाट '%s' मा रूपान्तरण समर्थित छैन"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "'%s' बाट '%s'मा रूपान्तरणकर्ता खोल्न सकेन"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "रूपान्तरण आगतमा अवैध बाइट अनुक्रम"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "रूपान्तरण अवधिमा त्रुटि: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "आगतको अन्त्यमा आंशिक क्यारेक्टर"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "फलब्याक '%s' बाट कोड सेट'%s' मा रूपान्तरण गर्न सक्दैन"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' \"file\" योजना प्रयोग गर्ने एउटा निश्चित URI होइन"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "स्थानीय फाइल URI '%s' मा एउटा '#' समावेश नहुनसक्छ"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' अवैध छ "
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "URI '%s' को होस्टनाम अवैध छ"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' मा अवैध रूपमा निस्किएका क्यारेक्टरहरू देखिन्छन्"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "बाटोनाम '%s' निश्चित मार्ग होइन"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "अवैध होस्टनाम "
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "डाइरेक्टरी '%s' खोल्दा त्रुटि: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "फाइल \"%2$s\" पढ्न %1$lu बाईट्स बाँडफाँड गर्न सकिएन"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "'%s' फाइल पढ्दा त्रुटि : %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "'%s' फाइलबाट पढ्न असफल : %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "'%s'फाइल खोल्न असफल : %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "'%s' फाइलको विशेषता पाउन असफल: fstat() असफल भयो: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "'%s' फाइल खोल्न असफल : fdopen() खोल्न असफल : %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "फाइल '%s लाई '%s' मा पुन: नामकरण गर्न असफल:g_rename() असफल: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "'%s' फाइल सिर्जना गर्न असफल: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "लेख्नका लागि '%s' फाइल खोल्न असफल : fdopen() असफल : %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "'%s' फाइल लेख्न असफल : fलेख्न() असफल : %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "'%s' फाइल बन्द गर्न असफल : fबन्द गर्न() असफल : %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "अवस्थित फाइल '%s' हटाउन सकिएन:g_unlink() असफल: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "'%s ' टेम्प्लेट अवैध, एउटा '%s' सम्मिलित हुनु हुँदैन"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "'%s' टेम्प्लेट XXXXXX संगसमाप्त हुँदैन"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "सांकेतिक सम्बन्ध '%s' पढ्न असफल: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "`%s' बाट `%s' मा रूपान्तरणकर्ता खोल्न सकेन : %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "g_io_channel_read_line_string मा परीक्षण पढाई गर्न सक्दैन"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "पढ्ने बफरमा छाडेको अरूपान्तरित डेटा "
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "आंशिक-क्यारेक्टरमा माध्यम टुङ्गिन्छ"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "g_io_channel_read_to_end मा परीक्षण पढाई गर्न सक्दैन"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "'%s' फाइल खोल्न असफल : खोल्न() असफल : %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "'%s' फाइल नक्सा असफल : m नक्सा() असफल : %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "लाइन %d क्यारेक्टर %d मा त्रुटि: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "लाइन %d मा त्रुटि: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"खाली अस्तित्व '&;' देखियो; वैध अस्तित्वहरू निम्न हुन : &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"अस्तित्व नामको सुरुमा क्यारेक्टर '%s' वैध हुँदैन ; & क्यारेक्टरले एउटा अस्तित्वा सुरु गर्दछ ; "
+"यदि यो एम्परस्यान्ड भएमा एउटा अस्तित्वको रूपमा मानिँदैन,यसलाई &amp; को रूपमा परित्याग "
+"गर्नुहोस्"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "अस्तित्व नाम भित्रको क्यारेक्टर '%s' वैध छैन"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "अस्तित्व नाम '%s' ज्ञात होइन"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"अस्तित्व अर्धविराममा सकिएन; तपाईँले धेरैजसो ऐम्परसेण्ड क्यारेक्टरबाट एउटा अस्तित्व सुरु गर्नको "
+"लागि प्रयास नगरिकन सुरु गर्नुभयो - &amp; को रूपमा ऐम्परसेंन्ड निकास गर्नुहोस्"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"'%-*s' पद वर्णन गर्न सकिएन, जुन एउटा क्यारेक्टर सन्दर्भ (उदाहरणका लागि; &#234) हुनु "
+"पर्थ्यो - संभवत अङ्क ज्यादै ठूलो छ"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "क्यारेक्टर सन्दर्भ '%-.*s' ले स्वीकृत क्यारेक्टरको सङ्केतन गर्दैन "
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "खाली क्यारेक्टर सन्दर्भ, &#454 जस्तो अङ्क समाहित हुनुपर्छ"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"क्यारेक्टर सन्दर्भ अर्धविराममा सकिएन;तपाईँले धेरैजसो ऐम्परसेण्ड क्यारेक्टरबाट एउटा अस्तित्व सुरु "
+"गर्नका लागि प्रयास नगरिकन सुरु गर्नुभयो - &amp; को रूपमा ऐम्परसेंन्ड निकास गर्नुहोस्"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "अधुरो अस्तित्व सन्दर्भ"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "अधुरो क्यारेक्टर सन्दर्भ"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "अवैध UTF-8 सङ्केतन गरिएको पाठ"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "कागजात एउटा तत्व बाट सुरु हुनैपर्छ (जस्तै: <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"एउटा '<' क्यारेक्टर पछ्याउन '%s' वैधानिक क्यारेक्टर होइन; यस्ले एउटा तत्व नाम प्रारम्भ "
+"नगर्न सक्छ"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"बिजोड क्यारेक्टर '%s', एउटा अपेक्षा गरिएको क्यारेक्टर '>', '%s' को सुरु ट्याग अन्त्य "
+"गर्नलाइ"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr "विजोड क्यारेक्टर '%s' ले,'%s' तत्वको गुण नाम '%s' पछि अपेक्षा गरिएको एउटा '=' "
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"बिजोड क्यारेक्टर '%s', तत्व '%s' को सुरु ट्याग अन्त्य गर्नलाई अपेक्षा गरिएको एउटा '>' वा "
+"'/' क्यारेक्टर, वा वैकल्पिक रूपमा एउटा विशेषता ,सायद तपाईँले एउटा विशेषता नाममा अवैध "
+"क्यारेक्टर प्रयोग गर्नुभयो"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"बिजोड क्यारेक्टर '%s',तत्व '%s' को '%s' विशेषताका लागि मान दिइएको बेला बराबर चिन्ह "
+"पछि खुला उद्धरण चिन्हको अपेक्षा गरेको हुन्छ।"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' एउटा वैध क्यारेक्टर होइन निम्न क्यारेक्टरहरू '</'; '%s' एउटा तत्व नाम प्रारम्भ नगर्न "
+"सक्छन"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"बन्द तत्व नाम '%s' को पछि लाग्ने '%s' मान्य क्यारेक्टर होइन; अनुमति पाएको क्यारेक्टर '>' "
+"हो।"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "तत्व '%s' बन्द थियो, हाल कुनै तत्व खुलेको छैन"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "तत्व '%s' बन्द थियो, तर हाल खुला तत्व '%s' हो"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "कागजात खाली छ वा सेतो खाली स्थान मात्र राखिएको छ"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "एउटा खुल्ला कोण कोष्ठ पछि '<' कागजात अनपेक्षित रूपले समाप्त भयो।"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr "'%s' खोलिएको अन्तिम तत्व संगकागजात अप्रत्याशित रूपले समाप्त भयो।"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"कागजपत्र अप्रत्याशित रूपले समाप्त भयो, ट्याग <%s/> को अन्तमा बन्द कोण कोष्ठको अपेक्षा "
+"गर्दछ।"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "तत्व नाम भित्र कागजात अपेक्षित रूपले समाप्त भयो।"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "विशेषता नाम भित्र कागजात अपेक्षित रूपले समाप्त भयो।"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "तत्व-खुल्ला ट्याग भित्र कागजात अपेक्षित रूपले समाप्त भयो।"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"बिशेषता नाम पछ्याउन बराबर चिन्ह पछि कागजातपत्र अप्रत्याशित रूपले समाप्त भयो; गुण मान "
+"होइन"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "गुण मान भित्र भएको बेला कागजपत्र अप्रत्याशित रूपले समाप्त भयो"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "तत्व '%s' का लागि बन्द ट्याग भित्र कागजात अनपेक्षित रूपले समाप्त भयो।"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "एउटा टिप्पणी वा प्रक्रिया निर्देशन भित्र कागजपत्र अप्रत्याशित रूपले समाप्त भयो"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "लाइन %d क्यारेक्टर %d मा त्रुटि: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "अधुरो अस्तित्व सन्दर्भ"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "उद्धरण गरिएको पाठ उद्धरण चिन्ह बाट सुरु हुँदैन"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "आदेश रेखामा वा अरू कवच-उद्धरण गरिएको पाठमा नमिलेको उद्धरण चिन्ह"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "पाठ चाँही '\\' क्यारेक्टर पछि मात्र समाप्त भयो। (पाठ '%s' थियो)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "%c का लागि मिल्ने उद्धरण फेला पर्नु अगाडि पाठ समाप्त भयो। (पाठ '%s' थियो)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "पाठ खाली थियो (वा सेतो खाली स्थान मात्र समावेश थियो)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "शाखा प्रक्रियाबाट डेटा पढ्न असफल भयो"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "शाखा प्रक्रिया (%s)सँग कुराकानीका लागि पाइप सिर्जना गर्न असफल"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "शाखा प्रक्रिया (%s)बाट पढ्न असफल"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "डाइरेक्टरी '%s' (%s) मा परिवर्तन गर्न असफल"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "शाखा प्रक्रिया (%s) कार्यान्वयन गर्न असफल"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "अवैध कार्यक्रम नाम : %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr " अार्गुमेन्ट भेक्टरको %d मा अवैध स्ट्रीङ: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "वातावरणमा अवैध स्ट्रीङ: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "अवैध कार्य डाइरेक्टरी : %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "मद्दत गर्ने कार्यक्रम कार्यान्वयन गर्न असफल (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr "शाखा प्रक्रियाबाट डेटा पढ्दा g_io_channel_win32_poll() अनपेक्षित त्रुटि"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "शाखा प्रक्रिया (%s) बाट डेटा पढ्न असफल"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "शाखा प्रक्रिया (%s) बाट डेटा पढ्दा () चयनमा अनपेक्षित त्रुटि"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "waitpid() (%s) मा अनपेक्षित त्रुटि"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "(%s) फोर्क गर्न असफल"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "शाखा प्रक्रिया \"%s\" (%s) कार्यान्वयन गर्न असफल"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "शाखा प्रक्रिया (%s) को निर्गत वा आगत पुन:निर्देशिन गर्न असफल"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "शाखा प्रक्रिया (%s) फोर्क गर्न असफल"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "शाखा प्रक्रिया \"%s\" कार्यान्वयन गर्दा अज्ञात त्रुटि"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "शाखा पिड पाईप (%s) बाट प्रशस्त डेटाहरू पढ्न असफल"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "UTF-8 का लागि क्यारेक्टर दायरा भन्दा बाहिर छ"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "रूपान्तरण आगतमा अवैध अनुक्रम"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "UTF-16 का लागि क्यारेक्टर दायरा भन्दा बाहिर छ"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "प्रयोग:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "मद्दत विकल्पहरू:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "मद्दत विकल्पहरू देखाउनुहोस्"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "सबै मद्दत विकल्पहरू देखाउनुहोस्"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "अनुप्रयोग विकल्पहरू:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "%s का लागि इन्टेजर मान %s को पद वर्णन गर्न सक्दैन"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "इन्टेजर मान '%s' %s का लागि दायरा भन्दा बाहिर छ"
+
+#: glib/goption.c:831
+#, fuzzy, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "%s का लागि इन्टेजर मान %s को पद वर्णन गर्न सक्दैन"
+
+#: glib/goption.c:839
+#, fuzzy, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "इन्टेजर मान '%s' %s का लागि दायरा भन्दा बाहिर छ"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "पद वर्णन विकल्पमा त्रुटि %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "%s का छुटेको तर्क"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "अज्ञात विकल्प %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "वैध कुञ्जी फाइल डेटा डाइरेक्टरीहरूमा फेला परेन"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "नियमित फाइल होइन"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "फाइल खाली छ"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr "कुञ्जी फाइलमा पङ्गति '%s' समावेश छ जुन कुञ्जी-मान जोडि, समूह, वा टिप्पणी होइन।"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "अवैध कार्यक्रम नाम : %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "कुञ्जी फाइल एउटा समूहबाट सुरु हुँदैन"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "अवैध कार्यक्रम नाम : %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "कुञ्जी फाइलमा समर्थन प्राप्त नभएको सङ्केतन '%s' समावेश छ।"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "कुञ्जी फाइलसंगसमूह '%s' छैन"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "कुञ्जी फाइलसंगकुञ्जी '%s' हुँदैन"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "कुञ्जी फाइलमा मान '%s'सँगै कुञ्जी '%s' समावेश छ जुन UTF-8 होइन"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "कुञ्जी फाइलमा कुञ्जी '%s' समावेश छ जसको मानलाई व्याख्या गर्न सकिँदैन।"
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"कुञ्जी फाइलमा समूह '%s' मा कुञ्जी '%s' समावेश छ जसको मानलाई व्याख्या गर्न सकिँदैन।"
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "कुञ्जी फाइलमा समूह '%s' मा कुञ्जी '%s' हुँदैन"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "कुञ्जी फाइलमा पङ्गतिको अन्त्यमा निकास क्यारेक्टर समावेश छ।"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "कुञ्जी फाइलमा अवैध निकास अनुक्रम '%s' समावेस छ।"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "मान '%s' लाई सङ्ख्याको रूपमा व्याख्या गर्न सकिँदैन"
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "इन्टेजर मान '%s' क्षेत्र भन्दा बाहिर छ"
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "मान '%s' लाई सङ्ख्याको रूपमा व्याख्या गर्न सकिँदैन"
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "मान '%s' एउटा बुलिएनको रूपमा व्याख्या गर्न सकिँदैन।"
diff --git a/trunk/po/nl.po b/trunk/po/nl.po
new file mode 100644
index 000000000..0aa7f03f5
--- /dev/null
+++ b/trunk/po/nl.po
@@ -0,0 +1,962 @@
+# GLIB -- Dutch Translation
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>, 2001.
+# Tino Meinen <a.t.meinen@chello.nl>, 2002, 2003, 2004, 2005, 2006
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib (HEAD)\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-09 00:29+0200 \n"
+"Last-Translator: Tino Meinen <a.t.meinen@chello.nl>\n"
+"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Onverwacht attribuut '%s' voor element '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Attribuut '%s' van element '%s' niet gevonden"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Onverwachte tag '%s', tag '%s' verwacht"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Onverwachte tag '%s' binenn '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Er is geen geldig bladwijzerbestand gevonden in de data-mappen"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Een bladwijzer voor URI '%s' bestaat al"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Geen bladwijzer gevonden voor URI '%s'"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Geen MIME-type gedefinieerd in de bladwijzer voor URI '%s'"
+
+# BUG engels: defined in bookmark -> in the bookmark
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Er is geen privé-vlag gedefineerd in de bladwijzer voor URI '%s'"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Geen groepen ingesteld in de bladwijzer voor URI '%s'"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+"Er is geen toepassing genaamd '%s' die een bladwijzer geregistreerd heeft "
+"voor '%s'"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Lezen van symbolische link '%s' is mislukt: %s"
+
+# is niet mogelijk/wordt niet ondersteund
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Het omzetten van tekenset '%s' naar '%s' is niet mogelijk"
+
+# conversieprogramma/omzet-programma/omzetter
+# kon converteerder van %s naar %s niet openen
+# Openen van converteerder van '%s' naar '%s' mislukt
+# Openen van het programma voor het omzetten van s naar s is mislukt
+# (tekenreeks komt verderop nog een keer voor)
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr ""
+"Kon het conversieprogramma voor omzetten van '%s' naar '%s' niet openen"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Ongeldige bytereeks in conversie-invoer"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Fout tijdens omzetten: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Onvolledige tekenreeks aan het eind van de invoer"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Kan vanaf codeverzameling '%s' niet terugvallen op '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+"De URI '%s' is geen absolute URI die gebruik maakt van het schema \"bestand\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "De lokale bestands-URI '%s' mag het teken '#' niet bevatten"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "De URI '%s' is ongeldig"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "De hostnaam van de URI '%s' is ongeldig"
+
+# controle-tekens/ontsnappingstekens
+# betere vertaling?
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "De URI '%s' bevat tekens met een foutief controleteken"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Het pad '%s' is geen absoluut pad"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Ongeldige hostnaam"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Fout bij het openen van map '%s': %s"
+
+# Allocatie van %lu bytes om bestand "%s" te lezen is mislukt<
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Kon geen %lu byte geheugenruimte reserveren om bestand \"%s\" te lezen"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Fout bij het lezen van bestand '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Lezen uit bestand '%s' is mislukt: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Openen van bestand '%s' is mislukt: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Opvragen gegevens van bestand '%s' is mislukt: fstat() is mislukt: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Openen van bestand '%s' is mislukt: fdopen() is mislukt: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Hernoemen van bestand '%s' naar '%s' is mislukt: g_rename() is mislukt: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Aanmaken van bestand '%s' is mislukt: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"Openen van bestand '%s' voor schrijven is mislukt: fdopen() is mislukt: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Schrijven van bestand '%s' is mislukt: fwrite() is mislukt: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Sluiten van bestand '%s' is mislukt: fclose() is mislukt: %s"
+
+# bestaand bestand is een beetje dubbelop
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Bestand '%s' kon niet worden verwijderd: g_unlink() is mislukt: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Sjabloon '%s' is ongeldig, het zou geen '%s' moeten bevatten"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Sjabloon '%s' bevat geen XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Lezen van symbolische link '%s' is mislukt: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Symbolische links zijn niet mogelijk"
+
+# Openen van converteerder van '%s' naar '%s' mislukt: %s
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr ""
+"Kon conversieprogramma voor omzetten van '%s' naar '%s' niet openen: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"Een kale ('raw') leesoperatie is niet mogelijk in "
+"g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Restant aan ongeconverteerde data in de leesbuffer"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanaal eindigt in een gedeeltelijk teken"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+"Een kale ('raw') leesoperatie is niet mogelijk in g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Openen van bestand '%s' is mislukt: open() is mislukt: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Openen van bestand '%s' is mislukt: mmap() is mislukt: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Fout in regel %d teken %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Fout in regel %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Lege entiteit '&;' gevonden; geldige entiteiten zijn: &amp; &quot; &lt; "
+"&gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Teken '%s' is niet geldig aan het begin van een entiteitnaam; het &-teken "
+"begint een entiteit; indien dat niet de bedoeling is, gebruik dan &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Teken '%s' is niet geldig in een entiteitnaam"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Entiteitnaam '%s' is niet bekend"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"De entiteit eindigde niet op een puntkomma; waarschijnlijk heeft u een "
+"ampersand-teken gebruikt zonder daarmee een entiteit te willen beginnen - "
+"gebruik in plaats daarvan &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Verwerken van '%-.*s' is mislukt, hetgeen een getal in een tekenreferentie "
+"zou moeten zijn (bijvoorbeeld &#234;) - misschien is het getal te groot"
+
+# niet geoorloofd/toegestaan/ongeoorloofd
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Tekenreferentie '%-.*s' staat niet voor een geoorloofd teken"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Lege tekenreferentie; ze zou een getal moeten bevatten, zoals &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Tekenreferentie eindigt niet op een puntkomma; waarschijnlijk heeft u een "
+"ampersand-teken gebruikt zonder daarmee een entiteit te willen beginnen - "
+"gebruik in plaats daarvan &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Onbeëindigde entiteitreferentie"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Onbeëindigde tekenreferentie"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Ongeldige UTF-8-geëncodeerde tekst"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Document moet beginnen met een element (bijv. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' is geen geldig teken na een '<'-teken; het mag niet beginnen met een "
+"elementnaam"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Onverwacht teken '%s', er werd een '>'-teken verwacht om het start-tag van "
+"het element '%s' af te sluiten"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Onverwacht teken '%s', er werd een '=' verwacht na de attribuutnaam '%s' van "
+"element '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Onverwacht teken '%s', er werd een '>'- of een '/'-teken verwacht om het "
+"start-tag van element '%s' af te sluiten, of eventueel een attribuut; "
+"misschien heeft u ongeldige tekens gebruikt in een attribuutnaam"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Onverwacht teken '%s', er werd een '\"'-teken verwacht na het '='-teken bij "
+"de attribuutwaarde van '%s' in element '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' is geen geldig teken na '</'; '%s' mag niet beginnen met een elementnaam"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' is geen geldig teken na de elementnaam '%s' in het afluitings-tag; het "
+"toegestane teken is '>' "
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element '%s' is gesloten, er is nu geen enkel element open"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Element '%s' werd gesloten, maar op dit moment is element '%s' open"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Het document was leeg of bevatte slechts lege ruimte"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Het document eindigde onverwacht na een openings-haakje: '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Het document eindigde onverwacht met niet-afgesloten elementen - '%s' is het "
+"laatstgeopende element"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Het document eindigde onverwacht, er werd een afsluitings-haakje:'>' "
+"verwacht voor de tag <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Het document eindigde onverwacht in een elementnaam"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Het document eindigde onverwacht in een attribuutnaam"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Het document eindigde onverwacht in een element-openings-tag."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Het document eindigde onverwacht na een '='-teken dat op een attribuutnaam "
+"volgde; geen attribuutwaarde"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Het document eindigde onverwacht in een attribuutwaarde"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Het document eindigde onverwacht in een een afsluitings-tag voor element '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Het document eindigde onverwacht in commentaar of een bewerkingsinstructie"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Fout in regel %d teken %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Onbeëindigde entiteitreferentie"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Aangehaalde tekst begint niet met een '\"'-teken"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Ongebalanceerd '\"'-teken in opdrachtregel of andere shell-aangehaalde tekst"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Tekst eindigde na een '\\'-teken (de tekst was '%s')."
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"De tekst eindigde voordat een afsluitend aanhalingsteken was gevonden voor %"
+"c (de tekst was '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "De tekst was leeg (of bevatte slechts lege ruimte)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Lezen van data van dochterproces is mislukt"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+"Aanmaken van pijplijn voor het communiceren met dochterproces is mislukt (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Lezen van pijplijn naar dochter (%s) is mislukt"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Wijzigen naar map '%s' is mislukt (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Uitvoeren van dochterproces is mislukt (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Ongeldige programmanaam: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Ongeldige tekenreeks in argumentvector bij %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Ongeldige tekenreeks in omgeving: %s"
+
+# werkmap/huidige map
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Ongeldige werkmap: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Uitvoeren van het hulpprogramma (%s) is mislukt"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Onverwachte fout in g_io_channel_win32_poll() bij het lezen van data van een "
+"dochterproces"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Lezen van data van dochterproces is mislukt (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Onverwachte fout in select() bij het lezen van data van een dochterproces (%"
+"s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Onverwachte fout in waitpid() (%s)"
+
+# fork is een functienaam, mag niet met hoofdletter beginnen
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "fork is mislukt (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Uitvoeren van dochterproces \"%s\" is mislukt (%s)"
+
+# was eerst: herleiden
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+"Doorsluizen van invoer of uitvoer van een dochterproces is mislukt (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Het forken van een dochterproces is mislukt (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Onbekende fout bij het uitvoeren van dochterproces \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Lezen van voldoende data van pijplijn dochter-pid is mislukt (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Teken valt buiten van bereik van UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Ongeldige reeks in conversie-invoer"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Teken valt buiten bereik van UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Gebruik:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTIE...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Hulpopties:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Hulpopties tonen"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Alle hulpopties tonen"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Toepassing opties:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Kan de hele getalswaarde '%s' voor %s niet verwerken"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Hele getalswaarde '%s' voor %s valt buiten bereik"
+
+# integer-double
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Kan de dubbele getalswaarde (double) '%s' voor %s niet verwerken"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Dubbele getalswaarde (double) '%s' voor %s valt buiten bereik"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Fout bij verwerken optie %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Ontbrekend argument voor %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Onbekende optie %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Er kon geen geldig sleutelbestand worden gevonden in de datamappen"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Geen regulier bestand"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Bestand is leeg"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Sleutelbestand bevat regel '%s' wat geen sleutelwaarde-paar, groep of "
+"opmerking is."
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Ongeldige programmanaam: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Sleutelbestand start niet met een groep"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Ongeldige programmanaam: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Sleutelbestand bevat niet-ondersteunde tekenset '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Sleutelbestand bevat geen groep '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Sleutelbestand bevat geen sleutel '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Sleutelbestand bevat sleutel '%s' met waarde '%s' wat geen UTF-8 is"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Sleutelbestand bevat sleutel '%s' die een waarde heeft die niet kan worden "
+"geïnterpreteerd."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Sleutelbestand bevat sleutel '%s' in groep '%s' die een waarde heeft die "
+"niet kan worden geïnterpreteerd."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Sleutelbestand bevat geen sleutel '%s' in groep '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Sleutelbestand bevat een ontsnappingsteken aan het einde van een regel"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Sleutelbestand bevat ongeldige ontsnappingstekens '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Waarde '%s' kan niet geïnterpreteerd worden als een getal."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Hele getalswaarde '%s' valt buiten bereik"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Waarde '%s' kan niet geïnterpreteerd worden als een float."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Waarde '%s' kan niet geïnterpreteerd worden als een booleese."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Kon bestandsmodus niet wijzigen: fork() is mislukt: %s"
diff --git a/trunk/po/nn.po b/trunk/po/nn.po
new file mode 100644
index 000000000..09f5a5969
--- /dev/null
+++ b/trunk/po/nn.po
@@ -0,0 +1,927 @@
+# translation of nn.po to Norwegian Nynorsk
+# Norwegian (Nynorsk) translation of glib
+# Copyright (C) Free Software Foundation, 2002.
+#
+# Roy-Magne Mo <rmo@sunnmore.net>, 2002.
+# Åsmund Skjæveland <aasmunds@fys.uio.no>, 2003, 2004, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: nn\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-09-02 14:30+0200\n"
+"Last-Translator: Åsmund Skjæveland <aasmunds@fys.uio.no>\n"
+"Language-Team: Norwegian Nynorsk <i18n-nn@lister.ping.uio.no>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Uventa attributt «%s» til elementet «%s»"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Attributt «%s» til elementet «%s» ikkje funne"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Uventa merke «%s», venta merket «%s»"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Uventa merke «%s» inni «%s»"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Klarte ikkje å finna gyldig bokmerkefil i datamappene"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Eit bokmerke for adressa «%s» finst frå før"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Klarte ikkje å finna noko bokmerke for adressa «%s»"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Det er ikkje definert nokon MIME-type i bokmerket for adressa «%s»"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Privat-flagg er ikkje definert i bokmerket for adressa «%s»"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Det er ikkje laga nokon grupper i bokmerket for adressa «%s»"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+"Det er ikkje nokon program som heiter «%s» som har registrert bokmerke for «%"
+"s»"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Klarte ikkje å lesa den symolske lenkja «%s»: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "<Konvertering frå teiknsettet «%s» til «%s» er ikkje støtta"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Kunne ikkje opna konverterar frå «%s» til «%s»"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Ugyldig bytesekvens i inndata for konvertering"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Feil under konvertering: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Delvis teiknsekvens på slutten av inndata"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Kan ikkje konvertera tilbakefall «%s» til kodesett «%s»"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI-en «%s» er ikkje ein absolutt URI som brukar «file»-skjemaet"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Den lokale fil-URIen «%s» kan ikkje innehalda ein «#»"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URIen «%s» er ugyldig"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Vertsnamnet i URIen «%s» er ugyldig"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URIen «%s» inneheld feil koda teikn"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Filstien «%s» er ikkje ein absolutt sti"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Ugyldig vertsnamn"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Feil ved opning av katalog «%s»: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Klarte ikkje allokera %lu byte for å lesa «%s»"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Feil ved lesing av fil «%s»: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Klarte ikkje å lesa frå fila «%s»: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Klarte ikkje å opna fila «%s»: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Klarte ikkje å få tak i eigenskapar for fila «%s»: fstat() feila: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Kunne ikkje opna fila «%s»: fdopen() feila: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Klarte ikkje å endra namnet på fila «%s» til «%s»: g_rename() feila: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Klarte ikkje å oppretta fila «%s»: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Klarte ikkje å opna fila «%s» for skriving: fdopen() feila: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Klarte ikkje å skriva til fila «%s»: fwrite() feila: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Klarte ikkje å lukka fila «%s»: fclose() feila: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Klarte ikkje å fjerna den eksisterande fila «%s»: g_unlink() feila: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Malen «%s» er ugyldig, kan ikkje ikkje innehalda ein «%s»"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Malfila «%s» inneheld ikkje XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Klarte ikkje å lesa den symolske lenkja «%s»: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Symbolske lenkjer er ikkje støtta"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Klarte ikkje å opna konverterar frå «%s» til «%s»: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Klarar ikkje å gjera ei rå lesing i g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Ukonvertert data til overs i lesebufferet"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanalen avsluttar på eit delvis teikn"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Kan ikkje lesa rått i g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Klarte ikkje å opna fila «%s»: open() feila: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Klarte ikkje å kopiera fila «%s» til minnet: mmap() feila: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Feil på linje %d teikn %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Feil på linje %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr "Fann tom entitet «&;»; gyldige entitetar er: &amp; &quot; &lt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Teiknet «%s» er ikkje gyldig på byrjinga av eit entitetsnamn; &-teiknet "
+"opnar ein entitet; om dette et-teiknet ikkje er meint å vere ein entitet, "
+"skriv den som &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Teiknet «%s» er ikkje gyldig inne i eit entitetsnamn"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Entitetsnamnet «%s» er ikkje kjent"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entiteten slutta ikkje med eit semikolon. Du brukte truleg eit et-teikn utan "
+"å meina å opna ein entitet. Skriv et-teikn som «&amp;»."
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Klarte ikkje å tolka «%-.*s», som burde vera eit teikn i ein teiknreferanse "
+"(&#234;, til dømes) – kan henda talet er for stort"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Teiknreferansen «%-.*s» kodar ikkje kan ikkje kodast eit lovleg teikn"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Tom teiknreferanse, bør innehalda eit nummer slik som &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Teiknreferansen slutta ikkje med eit semikolon; sannsynlegvis brukte du eit "
+"et-teikn utan å villa starte ein entitet – skriv et-teikn som &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Referansen til entiteten er uferdig"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Referansen til teiknet er uferdig"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Ugyldig UTF-8-koda tekst"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokumentet må byrja med eit element (t.d. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"«%s» er ikkje eit gyldig teikn etter ein «<»-teikn. Det kan ikkje vera det "
+"fyrste teiknet i eit elementnamn"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Merkeleg teikn «%s», venta eit «>»-teikn for å avslutta startmerket av "
+"elementet «%s»"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Merkeleg teikn «%s», venta ein «=» etter attributtnamnet «%s» av elementet «%"
+"s»"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Merkeleg teikn «%s», venta anten eit «>»-teikn eller «/»-teikn for å "
+"avslutta startmerket av elementet «%s», eller ein valfri attributt. Kan "
+"henda du brukte eit ugyldig teikn i attributtnamnet"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Merkeleg teikn «%s», venta eit ope siteringsmerke etter likskapsteiknet for "
+"å gje ein verdi for attributten «%s» av elementet «%s»"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"«%s» er ikkje eit gyldig teikn etter teikna «<» eller «/». «%s» kan ikkje "
+"starta eit elementnamn"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"«%s» er ikkje eit gyldig teikn etter avsluttande merket «%s»; det tillatne "
+"teiknet er «>»"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Elementet «%s» vart lukka. Det er ingen opne element no"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Elementet «%s» vart avslutta, men det opne elementet er «%s»"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokumentet var tomt eller innheldt kun tomme teikn"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Dokument avslutta uventa rett etter ei open vinkelhake «<»"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokumentet slutta uventa med element framleis opne. «%s» var det siste "
+"elementet som vart opna"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokumentet slutta uventa, venta å sjå at ei vinkelhake lukka det avsluttande "
+"merket <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokumentet tok uventa slutt inni eit elementnamn"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokumentet tok uventa slutt inni eit attributtnamn"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+"Dokumentet vart uventa avslutta inne i eit merke som opnar eit element."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokumentet slutta uventa etter likskapsteiknet etter attributtnamnet; ingen "
+"attributtverdi"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokumentet avslutta uventa medan det var inne i ein attributtverdi"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Dokumentet avslutta uventa i eit lukkemerke for elementet «%s»"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Dokumentet avslutta uventa inne i ein merknad eller prosseseringsinstruksjon"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Feil på linje %d teikn %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Referansen til entiteten er uferdig"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Sitert tekst startar ikkje med eit siteringsmerke"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Upara siteringsmerke i kommandolinje eller anna skal-sitert tekst"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Teksten tok slutt rett etter eit «\\»-teikn (Teksten var «%s»)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Teksten tok slutt før avsluttande sitatteikn vart funne for %c. (Teksten var "
+"«%s»)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Teksten var tom (eller inneheldt kun tomme teikn)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Klarte ikkje å lesa data frå barneprosess"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Klarte ikkje å oppretta røyr for å kommunisera med barneprosess (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Klarte ikkje å lesa frå røyr frå barn (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Klarte ikkje å skifta til katalogen «%s» (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Klarte ikkje å utføra barneprosess (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Ugyldig programnamn: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Ugyldig streng i argumentvektor plass %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Ugyldig streng i miljø: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Ugyldig arbeidskatalog: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Klarte ikkje å køyra hjelpeprogram (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Uventa feil i g_io_channel_win32_poll() ved lesing av data frå barneprosess"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Klarte ikkje å lesa data frå barneprosess (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Uventa feil i select() ved lesing av data frå barneprosess (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Uventa feil i waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Kunne ikkje starta barneprosess (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Klarte ikkje å utføra barnprosess «%s» (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Klarte ikkje å redirigera utdata eller inndata frå barneprosess (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Kunne ikkje starta barneprosess (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Ukjend feil ved køyring av barneprosess «%s»"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Klarte ikkje å lesa nok data frå pid-røyr frå barn (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Teikn ikkje gyldig for UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Ugyldig sekvens i inndata-konvertering"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Teikn ikkje gyldig for UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Bruk:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[VAL...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Hjelpeval:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Vis hjelpeval"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Vis alle hjelpevala"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Programval:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Kan ikkje tolka heiltalsverdien «%s» til %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Heiltalsverdien «%s» til «%s» utanfor gyldig område"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Kan ikkje tolka flyttalsverdien «%s» til «--%s»"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Flyttalsverdien «%s» til «%s» utanfor gyldig område"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Feil under tolking av val %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Argument manglar for %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Ukjend val «%s»"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Klarte ikkje å finna gyldig nøkkelfil i datamappene"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Ikkje ei vanleg fil"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Fila er tom"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Nøkkelfila inneheld linja «%s» som ikkje er eit nøkkel-verdi-par, ei gruppe "
+"eller ein kommentar"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Ugyldig programnamn: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Nøkkelfila startar ikkje med ei gruppe"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Ugyldig programnamn: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Nøkkelfila inneheld den ikkje støtta kodinga «%s»"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Nøkkelfila manglar gruppa «%s»"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Nøkkelfila manglar nøkkelen «%s»"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Nøkkelfila har nøkkelen «%s» med verdien «%s», som ikkje er UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "Nøkkelfila har nøkkelen «%s» med ein verdi som ikkje kan tolkast."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Nøkkelfila har feil i nøkkelen «%s» i gruppa «%s». Verdien kan ikkje tolkast."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Nøkkelfila har ikkje nøkkelen «%s» i gruppa «%s»"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Nøkkelfila inneheld escape-teikn på slutten av linja"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Nøkkelfila inneheld ugyldig escape-sekvens «%s»"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Verdien «%s» kan ikkje tolkast som eit tal."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Heiltalsverdien «%s» er utanfor gyldig område"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Verdien «%s» kan ikkje tolkast som eit flyttal."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Verdien «%s» kan ikkje tolkast som ein boolsk verdi."
diff --git a/trunk/po/oc.po b/trunk/po/oc.po
new file mode 100644
index 000000000..bf1813b2b
--- /dev/null
+++ b/trunk/po/oc.po
@@ -0,0 +1,777 @@
+# Occitan translation of glib.
+# Copyright (C) 2001-2006 Free Software Foundation, Inc.
+# This file is distributed under the same license as the glib package.
+#
+# Yannig MARCHEGAY (yannig@marchegay.org) - 2006-2007
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib 2.12.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-05-03 00:50-0400\n"
+"PO-Revision-Date: 2007-05-13 14:51+0200\n"
+"Last-Translator: Yannig MARCHEGAY <yannig@marchegay.org>\n"
+"Language-Team: Occitan (post 1500) <ubuntu-l10n-oci@lists.ubuntu.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr ""
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr ""
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr ""
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:949
+#: glib/gutf8.c:1398
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr ""
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr ""
+
+#: glib/gconvert.c:663 glib/gutf8.c:945 glib/gutf8.c:1149 glib/gutf8.c:1290
+#: glib/gutf8.c:1394
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr ""
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr ""
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr ""
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr ""
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr ""
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr ""
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr ""
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Nom d'òste invalid"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr ""
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr ""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Error de lectura del fichièr '%s' : %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr ""
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Impossible de dubrir le fichièr '%s' : %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Impossible de crear lo fichièr '%s' : %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr ""
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr ""
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr ""
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr ""
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr ""
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr ""
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr ""
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr ""
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr ""
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr ""
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr ""
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr ""
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr ""
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr ""
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr ""
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr ""
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr ""
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr ""
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr ""
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr ""
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr ""
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr ""
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr ""
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr ""
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr ""
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr ""
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr ""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+
+#: glib/gutf8.c:1023
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr ""
+
+#: glib/gutf8.c:1117 glib/gutf8.c:1126 glib/gutf8.c:1258 glib/gutf8.c:1267
+#: glib/gutf8.c:1408 glib/gutf8.c:1504
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr ""
+
+#: glib/gutf8.c:1419 glib/gutf8.c:1515
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Sintaxi :"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPCION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Opcions de l'ajuda :"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Mostrar las opcions de l'ajuda"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Mostrar totas las opcions de l'ajuda"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Opcions de l'aplicacion :"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr ""
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1712
+#, c-format
+msgid "Unknown option %s"
+msgstr "Opcion %s desconeguda"
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Lo fichièr es void"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr ""
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr ""
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2454
+#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2639 glib/gkeyfile.c:2774
+#: glib/gkeyfile.c:2927 glib/gkeyfile.c:3107 glib/gkeyfile.c:3164
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1865
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2077 glib/gkeyfile.c:2286
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2469 glib/gkeyfile.c:2654 glib/gkeyfile.c:3175
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3414
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3436
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3578
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3592
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3625
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3649
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
+
diff --git a/trunk/po/or.po b/trunk/po/or.po
new file mode 100644
index 000000000..c4e3804c4
--- /dev/null
+++ b/trunk/po/or.po
@@ -0,0 +1,918 @@
+# translation of glib.HEAD.or.po to Oriya
+# translation of or.po to
+# Oriya translation of glib.glib-2-4.or.pot.
+# Copyright (C) 2004, 2006, 2007, Free Software Foundation, Inc.
+# This file is distributed under the same license as the glib.glib-2-4 package.
+# $Id: or.po,v 1.37 2006/08/16 00:43:58 matthiasc Exp $
+#
+# Subhransu Behera <arya_subhransu@yahoo.co.in>, 2004, 2006, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.HEAD.or\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-05-15 12:46+0530\n"
+"Last-Translator: Subhransu Behera <arya_subhransu@yahoo.co.in>\n"
+"Language-Team: Oriya <oriya-group@lists.sarovar.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"\n"
+"\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "'%s' ର ଗୁଣ '%s' ଉପାଦାନ ପାଇଁ ଅପ୍ରତ୍ଯାଶିତ ଅଟେ"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "'%s' ଗୁଣକୁ '%s' ଉପାଦାନ ପାଇଁ ଖୋଜି ପାରିଲା ନାହିଁ"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "ଅପ୍ରତ୍ଯାଶିିତ '%s' ସୂଚକ, '%s' ସୂଚକକୁ ଆଶା କରାଯାଉଥିଲା"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "ଅପ୍ରତ୍ଯାଶିିତ '%s' ସୂଚକଟି '%s' ମଧ୍ଯରେ ଅଛି"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "ତଥ୍ଯ ଡିରେକ୍ଟୋରି ମାନଙ୍କରେ କୌଣସି ବୈଧ ଚିହ୍ନିତ ସ୍ଥାନ ମିଳିଲା ନାହିଁ"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "'%s' ୟୁ.ଆର.ଆଇ. ପାଇଁ ଗୋଟିଏ ବୁକ୍ ମାର୍କ ପୂର୍ବରୁ ଅବସ୍ଥିତ ଅଛି"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "'%s' ୟୁ.ଆର.ଆଇ. ପାଇଁ କୌଣସି ବୁକ୍ ମାର୍କ ମିଳିଲା ନାହିଁ"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "'%s' ୟୁ.ଆର.ଆଇ. ପାଇଁ ବୁକ୍ ମାର୍କରେ କୌଣସି MIME ପ୍ରକାରକୁ ବ୍ଯାଖ୍ଯା କରାଯାଇ ନାହିଁ"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "'%s' ୟୁ.ଆର.ଆଇ. ପାଇଁ ବୁକ୍ ମାର୍କରେ କୌଣସି ଗୁପ୍ତ ଚିହ୍ନକକୁ ବ୍ଯାଖ୍ଯା କରାଯାଇ ନାହିଁ"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "'%s' ୟୁ.ଆର.ଆଇ. ପାଇଁ ବୁକ୍ ମାର୍କରେ କୈଣସି ସମୂହକୁ ସେଟ କରାଯାଇ ନାହିଁ"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "'%s' ନାମରେ ନାମିତ କୌଣସି ପ୍ରୟୋଗ '%s' ପାଇଁ ଗୋଟିଏ ବୁକ୍ ମାର୍କକୁ ପଞ୍ଜିକ୍ରୁତ କରିନାହିଁ"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "'%s' ୟୁ.ଆର.ଆଇ. ସହିତ '%s' ନିଷ୍ପାଦନ ଧାଡିକୁ ବର୍ଦ୍ଧନ କରିବାରେ ବିଫଳ"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "ଅକ୍ଷର ସେଟ୍ '%s'କୁ '%s'େର ରୂପାନ୍ତରିତ କରିବା ଅସହାୟକ"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "'%s'ରୁ '%s'ର ରୁପାନ୍ତରକ ଖୋଲି ହେଲା ନାହିଁ"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "ରୁପାନ୍ତରଣ ନିବେଶେର ଅବୈଧ ବାଇଟ୍ ଅନୁକ୍ରମ"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "ରୁପାନ୍ତରଣରେ ତ୍ରୁଟି: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "ନିବେଶର ସମାପ୍ତିରେ ଆଶିଂକ ଅକ୍ଷର ଅନୁକ୍ରମ"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "'%s' ସହାୟକକୁ ସଂକେତ '%s' ସେଟ୍ ରେ ରୁପାନ୍ତରିତ କରିହେଲା ନାହିଁ"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "'%s' ୟୁ.ଆର୍.ଆଇ. \"ଫାଇଲ\" ଯୋଜନାକୁ ବ୍ଯବହାର କରୁଥିବା ଗୋଟିଏ ସମ୍ପୂର୍ଣ୍ଣ ୟୁ.ଆର୍.ଆଇ. ନୁହେଁ"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "'%s' ସ୍ଥାନୀୟ ଫାଇଲ ୟୁ.ଆର୍.ଆଇ. '#' ଚିହ୍ନକୁ ସମ୍ମିଳିତ କରିପାରିବ ନାହିଁ"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "'%s' ୟୁ.ଆର୍.ଆଇ. ଅବୈଧ ଅଟେ"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "'%s' ୟୁ.ଆର୍.ଆଇ.ର ଆଧାର ନାମ ଅବୈଧ ଅଟେ"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "'%s' ୟୁ.ଆର୍.ଆଇ.ରେ ଅବୈଧ ଏସ୍କେପ୍ ଅକ୍ଷର ରହିଛି"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "'%s' ପଥ ନାମ ଏକ ସମ୍ପୂର୍ଣ୍ଣ ପଥ ନୁହେଁ"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "ଅବୈଧ ଆଧାର ନାମ"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "%s' ଡିରେକ୍ଟୋରି ଖୋଲିବାରେ ତ୍ରୁଟି: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "\"%2$s\" ଫାଇଲ ପଢିବା ପାଇଁ %1$lu ବାଇଟ୍ ବାଣ୍ଟିହେଲା ନାହିଁ"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "'%s' ଫାଇଲ ପଢିବାରେ ତ୍ରୁଟି: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "'%s' ଫାଇଲ ପଢିବାରେ ଅସଫଳ: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "'%s' ଫାଇଲର ଗୁଣ ପାଇବାରେ ଅସଫଳ: fstat() ଅସଫଳ: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: fdopen() ଅସଫଳ: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "'%s' ଫାଇଲ ରୁ '%s' ନାମ ବଦଳାଇ ବାରେ ଅସଫଳ: g_rename() ଅସଫଳ: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "'%s' ଫାଇଲ ସ୍ରୁଷ୍ଟି କରିବାରେ ଅସଫଳ: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "'%s' ଫାଇଲ କୁ େଲଖନ ପାଇଁ ଖୋଲିବାରେ ଅସଫଳ: fdopen() ଅସଫଳ: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: fwrite() ଅସଫଳ: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "'%s' ଫାଇଲ କୁ ବନ୍ଦ କରିବା ରେ ଅସଫଳ: fclose() ଅସଫଳ: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "ଅବସ୍ଥିତ '%s' ଫାଇଲ କାଢି ହେଲା ନାହଁି: g_unlink ଅସଫଳ %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "'%s' ନମୁନା ଟି ଅବୈଧ ଅଟେ, '%s' ଧାରଣ କରିବା ଉଚିତ ନୁହେଁ"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "'%s' ନମୁନା ଟି XXXXXXକୁ ଧାରଣ କରିନାହିଁ"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "'%s' ପ୍ରତିକାତ୍ମକ ସଂୟୋଗ ପଢିବାରେ ଅସଫଳ: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "ପ୍ରତିକାତ୍ମକ ସଂୟୋଗ ଅସହାୟକ"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "%s' ରୁ '%s' ର ରୁପାନ୍ତରକ ଖୋଲି ପାରିଲା ନାହିଁ: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "g_io_channel_read_line_string ରେ ଅଂସସାଧିତ ପଠନ କରିହେଲା ନାହିଁ"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "ପଠନ ବଫରରେ ଅରୂପାନ୍ତରିତ ତଥ୍ଯ ବଳକା ଅଛି"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "ଆଂଶିକ ଅକ୍ଷର ରେ ଚାନେଲର ସମାପ୍ତି"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "g_io_channel_read_to_end େର ଅଂସସାଧିତ ପଠନ କରିହେଲା ନାହିଁ"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: open() ଅସଫଳ: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "'%s' ଫାଇଲ କୁ ମ୍ଯାପ୍ କରିବାରେ ଅସଫଳ: mmap() ଅସଫଳ: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "%d ଧାଡ଼ିର %d ଅକ୍ଷରରେ ତ୍ରୁଟି: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "%d ଧାଡ଼ିରେ ତ୍ରୁଟି: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr "ଖାଲି ବସ୍ତୁ '&;' ଦେଖା ଗଲା; ବୈଧ ବସ୍ତୁଗୁଡ଼ିକ ହେଲା: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"ଗୋଟିଏ ବସ୍ତୁର ନାମର ଆରମ୍ଭ ରେ '%s' ଅକ୍ଷର ବୈଧ ନୁହେଁ; ଅକ୍ଷର & ଗୋଟିଏ ବସ୍ତୁକୁ ଆରମ୍ଭ କରେ; ଯଦି ଏହି "
+"ଆମ୍ପର୍ସେଣ୍ଡ୍ ଗୋଟିଏ ବସ୍ତୁ ନୁହେଁ, ଏହାକୁ &amp; ଭାବରେ ଏସ୍କେପ୍ କରନ୍ତୁ;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "ବସ୍ତୁ ନାମ ମଦ୍ଧ୍ଯ ରେ '%s' ଅକ୍ଷର ବୈଧ ନୁହେଁ"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "'%s' ବସ୍ତୁ ନାମ ଜଣା ନାହିଁ"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"ବସ୍ତୁଟି ସେମିକୋଲନରେ ଶେଷ ହେଲା ନାହିଁ; ସମ୍ଭବତଃ ଆପଣ ଗୋଟିଏ ବସ୍ତୁ ଆରମ୍ଭ କରିବାକୁ ନ ଚାହିଁ, ଏକ "
+"ଆମ୍ପର୍ସେଣ୍ଡ୍ ଅକ୍ଷର ବ୍ଯବହାର କରିଛନ୍ତି - ତାହାକୁ &amp; ଭାବରେ ଏସ୍କେପ୍ କରନ୍ତୁ"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"'%-.*s' କୁ ବିଶ୍ଳେଷଣ କରିବାରେ ଅସଫଳ, ଯାହାକି ଗୋଟିଏ ଅକ୍ଷର ରେଫରେନ୍ସ ମଦ୍ଧ୍ଯରେ ଏକ ଅଙ୍କ ହେବା ଉଚିତ "
+"ଥିଲା(ଉଦାହରଣ ସ୍ବରୂପେ &#୨୩୪;) - ବୋଧହୁଏ ଅଙ୍କଟି ବହୁତ ବଡ଼ ଅଟେ"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "'%-.*s' ଅକ୍ଷର ରେଫରେନ୍ସ ଟି ଗୋଟିଏ ଅନୁମତ ଅକ୍ଷରକୁ ସଙ୍କେତ କରୁ ନାହିଁ"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "ଖାଲି ଅକ୍ଷର ରେଫରେନ୍ସ; ଗୋଟିଏ ଅଙ୍କକୁ ଅନୁର୍ଭୁକ୍ତ କରିବା ଉଚିତ, ଯେପରିକି &#୪୫୪;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"ଅକ୍ଷର ରେଫରେନ୍ସ ସେମିକୋଲନରେ ସମାପ୍ତ ହେଉ ନାହିଁ; ସମ୍ଭବତଃ ଆପଣ ଗୋଟିଏ ବସ୍ତୁ ଆରମ୍ଭ କରିବାକୁ ନ ଚାହିଁ, "
+"ଏକ ଆମ୍ପର୍ସେଣ୍ଡ୍ ଅକ୍ଷର ବ୍ଯବହାର କରିଛନ୍ତି - ତାହାକୁ &amp; ଭାବରେ ଏସ୍କେପ୍ କରନ୍ତୁ"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "ଅସମାପ୍ତ ବସ୍ତୁ ରେଫରେନ୍ସ"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "ଅସମାପ୍ତ ଅକ୍ଷର ରେଫରେନ୍ସ"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "ଅବୈଧ ଇଉ.ଟି.ଏଫ.-୮ ସାଙ୍କେତିକ ପାଠ୍ଯ"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "ଦଲିଲ ଗୋଟିଏ ଉପାଦାନରେ ଆରମ୍ଭ ହେବା ଉଚିତ (ଉଦାହରଣ ସ୍ବରୂପ <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'<' ଅକ୍ଷର ପଛରେ ଆସୁଥିବା '%s' ଅକ୍ଷର ବୈଧ ନୁହେଁ; ଏହା ଗୋଟିଏ ବସ୍ତୁର ନାମକୁ ଆରମ୍ଭ କରିପାରିବ ନାହିଁ"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"ବିଚିତ୍ର ଅକ୍ଷର '%s', '%s' ଉପାଦାନର ପ୍ରାରମ୍ଭ ସୂଚକକୁ ସମାପ୍ତ କରିବା ପାଇଁ '>' ଅକ୍ଷର ପ୍ରତ୍ଯାଶିତ ଥିଲା"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"ବିଚିତ୍ର ଅକ୍ଷର '%1$s', '%3$s' ଉପାଦାନର ଗୋଟିଏ ଗୁଣର ନାମ '%2$s' ପରେ '=' ପ୍ରତ୍ଯାଶିତ ଥିଲା"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"ବିଚିତ୍ର ଅକ୍ଷର '%s', '%s' ଉପାଦାନର ପ୍ରାରମ୍ଭ ସୂଚକକୁ ସମାପ୍ତ କରିବା ପାଇଁ '>' ବା '/' ଅକ୍ଷର "
+"ପ୍ରତ୍ଯାଶିତ ଥିଲା, ଅଥବା ଇଚ୍ଛାଧୀନ ଭାବରେ ଗୋଟିଏ ଗୁଣ; ବୋଧହୁଏ ଆପଣ ଗୋଟିଏ ଗୁଣର ନାମରେ ଏକ ଅବୈଧ "
+"ଅକ୍ଷର ବ୍ଯବହାର କରିଛନ୍ତି"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"ବିଚିତ୍ର ଅକ୍ଷର '%1$s', ସମାନ ଚିହ୍ନ ପରେ '%3$s' ଉପାଦାନର '%2$s' ଗୁଣର ମୂଲ୍ଯ ଦେବା ପାଇଁ ଗୋଟିଏ "
+"ଖୋଲା ଉଦ୍ଧ୍ରୁତି ଚିହ୍ନ ପ୍ରତ୍ଯାଶିତ ଥିଲା"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'</' ଅକ୍ଷରଗୁଡ଼ିକ ପଛରେ ଆସୁଥିବା '%s' ଅକ୍ଷର ବୈଧ ନୁହେଁ; '%s' ଗୋଟିଏ ଉପାଦାନର ନାମର ଆରମ୍ଭ "
+"କରିପାରିବ ନାହିଁ"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"ବନ୍ଦ ଉପାଦାନ ନାମ '%2$s' ପଛରେ ଆସୁଥିବା '%1$s' ଅକ୍ଷର ବୈଧ ନୁହେଁ; ଅନୁମତ ଅକ୍ଷର ହେଲା '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "ଉପାଦାନ '%s' ବନ୍ଦ କରାଯାଇଥିଲା, ବର୍ତ୍ତମାନ କୌଣସି ଉପାଦାନ ଖୋଲା ନାହିଁ"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "ଉପାଦାନ '%s' ବନ୍ଦ କରାଯାଇଥିଲା, କିନ୍ତୁ ବର୍ତ୍ତମାନ '%s' ଉପାଦାନଟି ଖୋଲା ଅଛି"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "ଦଲିଲ ଖାଲି ଥିଲା ବା କେବଳ ଖାଲି ଯାଗା ଧାରଣ କରିଥିଲା"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "ଦଲିଲଟି ଗୋଟିଏ କୌଣିକ ବନ୍ଧନୀ '<'ର ଠିକ ପରେ ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"ଉପାଦାନଗୁଡ଼ିକ ଖୋଲା ଥାଇ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା'%s' ଉପାଦାନ ସର୍ବଶେଷ ଖୋଲା "
+"ଥିଲା"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା, <%s/> ସୂଚକ ସମାପ୍ତ କରିବା ପାଇଁ ଗୋଟିଏ ବନ୍ଦ କୌଣିକ "
+"ବନ୍ଧନୀ ପ୍ରତ୍ଯାଶିତ ଥିଲା"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "ଉପାଦାନର ନାମ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "ଗୁଣର ନାମ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "ଉପାଦାନ ଆରମ୍ଭର ସୂଚକ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"ଗୁଣର ନାମ ପଛରେ ଆସୁଥିବା ସମାନ ଚିହ୍ନ ପରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା; ଗୁଣର କିଛି "
+"ମୂଲ୍ଯ ନାହିଁ"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "ଗୁଣର ମୂଲ୍ଯ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "'%s' ଉପାଦାନର ବନ୍ଦ ସୂଚକ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "ଟିପ୍ପଣୀ ବା ସଂସାଧନ ସାଧନ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "%d ଧାଡ଼ିର %d ଅକ୍ଷରରେ ତ୍ରୁଟି: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "ଅସମାପ୍ତ ବସ୍ତୁ ରେଫରେନ୍ସ"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "ଉଦ୍ଧ୍ରୁତ ପାଠ୍ଯ ଉଦ୍ଧ୍ରୁତ ଚିହ୍ନରେ ଆରମ୍ଭ ହୋଇ ନାହିଁ"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "ପାଠ୍ଯ ନିର୍ଦ୍ଦେଶ ବା ଅନ୍ଯ ଆବରଣ-ଉଦ୍ଧ୍ରୁତ ପାଠ୍ଯରେ ଅମେଳ ଉଦ୍ଧ୍ରୁତି ଚିହ୍ନ"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "ଗୋଟିଏ '\\' ଅକ୍ଷରର ଠିକ ପରେ ପାଠ୍ଯ ସମାପ୍ତ ହୋଇ ଗଲା (ପାଠ୍ଯଟି ଥିଲା: '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"%c ପାଇଁ ମେଳ ହେଉ ଥିବା ଉଦ୍ଧ୍ରୁତି ଚିହ୍ନ ମିଳିବା ପୂର୍ବରୁ ପାଠ୍ଯ ସମାପ୍ତ ହୋଇ ଗଲା. (ପାଠ୍ଯଟି ଥିଲା: '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "ପାଠ୍ଯ ଖାଲି ଥିଲା (ବା କେବଳ ଖାଲି ଯାଗା ଧାରଣ କରିଥିଲା)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାରୁ ତଥ୍ଯ ପଢ଼ିବାରେ ଅସଫଳ"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟା ସହିତ ସଂଯୋଗ ପାଇଁ ପାଇପ୍ ସୃଷ୍ଟି କରିବାରେ ଅସଫଳ (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "ନିର୍ଭରକ ପାଇପ୍ ରୁ ତଥ୍ଯ ପଢି଼ବାରେ ଅସଫଳ (%s)"
+
+# Gora: "change to directory" means "go to directory" here
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "'%s' ଡିରେକ୍ଟୋରିକୁ ଯିବାରେ ଅସଫଳ (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାକୁ ନିଷ୍ପାଦନ କରିବାରେ ଅସଫଳ (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "ଅବୈଧ ପ୍ରୋଗ୍ରାମ ନାମ: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "ସଦିଶ ସ୍ବତନ୍ତ୍ରଚର %d ରେ ବାକ୍ଯଖଣ୍ଡ %s ଟି ଅବୈଧ ଅଟେ"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "ଏହି ପରିୂବେଶ ରେ ବାକ୍ଯଖଣ୍ଡ:%s ଅବୈଧ ଅଟେ"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "ଚଳନ୍ତି ଡିରେକ୍ଟୋରି: %s ଟି ଅବୈଧ ଅଟେ"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "ସାହାଯ୍ଯ କାରିକା (%s) କୁ ନିଷ୍ପାଦନ କରିବାରେ ଅସଫଳ"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାରୁ ତଥ୍ଯ ପଢି଼ବାରେ g_io_channel_win32_poll()ରେ ଅପ୍ରତ୍ଯାଶିତ ତ୍ରୁଟି"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାରୁ ତଥ୍ଯ ପଢି଼ବାରେ ଅସଫଳ (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାରୁ ତଥ୍ଯ ପଢି଼ବାରେ select()ରେ ଅପ୍ରତ୍ଯାଶିତ ତ୍ରୁଟି (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "waitpid()ରେ ଅପ୍ରତ୍ଯାଶିତ ତ୍ରୁଟି (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "ଶାଖା ସୃଷ୍ଟି କରିବାରେ ଅସଫଳ (%s"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟା \"%s\" ନିଷ୍ପାଦନ କରିବାରେ ଅସଫଳ (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାର ନିର୍ଗମ ବା ନିବେଶର ପୁନଃନିର୍ଦ୍ଦେଶନ କରିବାରେ ଅସଫଳ (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାକୁ ଶାଖାଯୁକ୍ତ କରିବାରେ ଅସଫଳ (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାକୁ ନିଷ୍ପାଦନ କରିବାରେ ଅଜଣା ତ୍ରୁଟି \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "ନିର୍ଭରକ ପି.ଆଇ.ଡି. ପାଇପ୍ ରୁ ପର୍ଯ୍ଯାପ୍ତ ତଥ୍ଯ ପଢି଼ବାରେ ଅସଫଳ (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "ଇ.ଉ.ଟିଏଫ୍.-୮ ପାଇଁ ଅକ୍ଷରଟି ପରିସର ବାହାରେ"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "ରୁପାନ୍ତରଣ ନିବେଶେର ଅବୈଧ ଅନୁକ୍ରମ"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "ଇ.ଉ.ଟିଏଫ୍.-୧୬ ପାଇଁ ଅକ୍ଷରଟି ପରିସର ବାହାରେ"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "ବ୍ଯବହାର:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[ପସନ୍ଦ...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "ସାହାଯ୍ଯ ପସନ୍ଦ"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "ସାହାଯ୍ଯ ପସନ୍ଦ ଦେଖାନ୍ତୁ"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "ସବୁ ସାହାଯ୍ଯ ପସନ୍ଦ ଦେଖାନ୍ତୁ"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "ପ୍ରୟୋଗ ପସନ୍ଦ"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "%s ପାଇଁ ପୂର୍ଣ ସଂଖ୍ଯା ମୂଲ୍ଯ '%s' କୁ ବିଶ୍ଲେଷିଣ କରିହେଲା ନାହିଁ"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "%s ପାଇଁ ପୂର୍ଣ ସଂଖ୍ଯା '%s' ର ମୂଲ୍ଯ ପରିସର ବାହାରେ"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "'%s' ଦ୍ବ୍ଯର୍ଥକ ମୂଲ୍ଯକୁ %s ପାଇଁ ବିଶ୍ଳେଷିତ କରିପାରିଲା ନାହିଁ"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "'%s' ଦ୍ବ୍ଯର୍ଥକ ମୂଲ୍ଯଟି %s ପାଇଁ ପରିସରର ବହିର୍ଭୂତ।"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "ରୁପାନ୍ତରଣ ର ବିକଲ୍ପ ରେ ତ୍ରୁଟି: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "%s ପାଇଁ ସ୍ବତନ୍ତ୍ରଚର ଟି ହଜି ଯାଇଛି"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "ଅଜଣା ପସନ୍ଦ %s"
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "ଅନୁସନ୍ଧାନ ଡିରେକ୍ଟୋରି ମାନଙ୍କରେ ବୈଧ ଚାବି ଫାଇଲ ମିଳିଲା ନାହିଁ"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "ଏହା ଏକ ନିୟମିତ ଫାଇଲ ନୁହେଁ"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "ଫାଇଲ ଟି ଖାଲି ଅଛି"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr "ମୁଖ୍ଯ ଫାଇଲ '%s' କୁ ଧାରଣ କରିଛି ଯାହାକି ଗୋଟିଏ ମୁଖ୍ଯ-ଗୁଣ ର ଯୋଡି, ସମୂହ, କିମ୍ବା ବାକ୍ଯ ନୁହେଁ"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "ଅବୈଧ ସମୂହ ନାମ: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "ମୂଖ୍ଯ ଫାଇଲ କୌଣସି ସମୂହ ସହ ଆରମ୍ଭ ହୁଏ ନାହିଁ"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "ଅବୈଧ ଚାବି ନାମ: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "ମୂଖ୍ଯ ଫାଇଲ ଟି ଗୋଟିଏ ଅସହାୟକ ସଂକେତ '%s' ଧାରଣ କରିଛି"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "ମୂଖ୍ଯ ଫାଇଲ େର '%s' ନାମ ଥିବା କୌଣସି ସମୂହ ନାହିଁ"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "ମୂଖ୍ଯ ଫାଇଲ େର '%s' ନାମ ଥିବା କୌଣସି ଚାବିକାଠି ନାହିଁ"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "ମୂଖ୍ଯ ଫାଇଲ ଧାରଣ କରିଥିବା '%s' ଚାବିକାଠି ର ମୂଲ୍ଯ '%s' ଅଟେ, ଯାହାକି ଇଉ-ଟି-ଏଫ୍-୮ ନୁହେଁ"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "ମୂଖ୍ଯ ଫାଇଲ ଧାରଣ କରିଥିବା '%s' ଚାବିକାଠି ର ମୂଲ୍ଯ ନିରୂପଣ କରିହେବ ନାହିଁ"
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"ମୂଖ୍ଯ ଫାଇଲ ଧାରଣ କରିଥିବା '%s' ଚାବିକାଠି ଗୋଟିଏ '%s' ସମୂହ ସହିତ ଏଛି ଯାହାର ମୂଲ୍ଯ ନିରୂପଣ କରିହେବ ନାହିଁ"
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "ମୂଖ୍ଯ ଫାଇଲ େର '%s' ନାମ ଥିବା କୌଣସି ଚାବିକାଠି '%s' ସମୂହ ରେ ନାହିଁ "
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "ମୂଖ୍ଯ ଫାଇଲ ଟି ଲାଇନ୍ ର ସମାପ୍ତି ରେ ଏସ୍କେପ୍ ଅକ୍ଷର ଧାରଣ କରିଛି"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "ମୂଖ୍ଯ ଫାଇଲ '%s' ଅବୈଧ ଏସ୍କେପ୍ ଅକ୍ଷର ଧାରଣ କରିଛି"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "'%s' ର ମୂଲ୍ଯ ଗୋଟିଏ ସଂଖ୍ଯା ଭାବରେ ନିରୂପଣ କରିହେବ ନାହିଁ"
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "ପୂର୍ଣ ମୂଲ୍ଯ '%s' ପରିସର ର ବାହାରେ ଅଛି"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "'%s' ମୂଲ୍ଯକୁ ଗୋଟିଏ ଭାସମାନ ସଂଖ୍ଯା ଭାବରେ ବ୍ଯାଖ୍ଯା କରିହେବ ନାହିଁ"
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "'%s' ର ମୂଲ୍ଯ ଗୋଟିଏ ବୁଲିଆନ୍ ଭାବରେ ନିରୂପଣ କରିହେବ ନାହିଁ"
diff --git a/trunk/po/pa.po b/trunk/po/pa.po
new file mode 100644
index 000000000..0b81c2d59
--- /dev/null
+++ b/trunk/po/pa.po
@@ -0,0 +1,910 @@
+# translation of glib.HEAD.po to Punjabi
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+#
+# Amanpreet Singh Alam <amanliunx@netscapet.net>, 2004.
+# Amanpreet Singh Alam <aalam@redhat.com>, 2004.
+# Amanpreet Singh Alam <amanpreetalam@yahoo.com>, 2005.
+# A S Alam <apbrar@gmail.com>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-03-11 11:52+0530\n"
+"Last-Translator: A S Alam <apbrar@gmail.com>\n"
+"Language-Team: Punjabi <fedora-trans-pa@redhat.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "ਅਨਿਸ਼ਚਿਤ ਅੱਖਰ %s ਹੈ, ਇਕਾਈ %s ਦੇ ਇਸ ਵਿਸ਼ੇਸਤਾ ਨਾਂ %s ਮਗਰੋਂ = ਲੋੜੀਦਾ ਸੀ"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "ਡਾਟਾ ਡਾਇਰੈਕਟਰੀਆਂ ਵਿੱਚ ਠੀਕ ਕੁੰਜੀ ਫਾਇਲ ਨਹੀਂ ਖੋਜੀ ਜਾ ਸਕੀ"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "ਚਿੰਨ੍ਹ ਸਬੰਧ '%s' ਖੋਲਣ ਵਿੱਚ ਗਲਤੀ: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "ਕਰੈਕਟਰ ਸਮੂਹ %s ਤੋਂ %s ਵਿੱਚ ਬਦਲਣ ਇਸ ਵੇਲੇ ਸੰਭਵ ਨਹੀਂ"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "'%s' ਤੋੱ '%s' ਵਿੱਚ ਬਦਲਣ ਵਾਲਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "ਬਦਲਣ ਲਈ ਦਿੱਤੀ ਸਤਰ ਵਿੱਚ ਬਾਇਟ ਦਾ ਸਰੂਪ ਠੀਕ ਨਹੀਂ ਹੈ"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "ਤਬਦੀਲੀ ਦੌਰਾਨ ਗਲਤੀ %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "ਸਤਰ ਦੇ ਅਖੀਰ ਤੇ ਅੱਖਰਾਂ ਦਾ ਸਰੂਪ ਅਧੂਰਾ ਹੈ"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "ਕੋਡ ਸਮੂਹ %s ਤੋਂ %s ਵਿੱਚ ਤਬਦੀਲੀ ਸੰਭਵ ਨਹੀਂ"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' \"file\" ਸਕੀਮ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਸਲ URI ਨਹੀਂ ਹੈ"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "ਲੋਕਲ ਫਾਇਲ URI %s ਵਿੱਚ ਇਹ ਨਿਸ਼ਾਨ # ਨਹੀਂ ਹੈ"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' ਜਾਇਜ਼ ਨਹੀਂ ਹੈ"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "URI '%s' ਦੇ ਮੇਜ਼ਬਾਨ ਦਾ ਨਾਂ ਜਾਇਜ਼ ਨਹੀਂ ਹੈ"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' ਕੋਲ ਗਲਤ ਅੱਖਰ ਹਨ"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "ਮਾਰਗ-ਨਾਂ %s ਇਕ ਅਸਲੀ (absolute) ਮਾਰਗ ਨਹੀਂ ਹੈ"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "ਗਲਤ ਮੇਜ਼ਬਾਨ ਨਾਂ"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "ਡਾਇਰੈਕਟਰੀ '%s' ਖੋਲ੍ਹਣ ਲਈ ਗਲਤੀ: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "ਫਾਇਲ \"%2$s\" ਖੋਲ੍ਹਣ ਲਈ %1$lu ਬਾਈਟ ਨਹੀਂ ਦਿੱਤੇ ਜਾ ਸਕੇ"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "'%s' ਫਾਇਲ ਪੜ੍ਹਨ 'ਚ ਗਲਤੀ: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "ਫਾਇਲ '%s' ਤੋਂ ਪੜ੍ਹਨ 'ਚ ਅਸਫ਼ਲ: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "'%s' ਫਾਇਲ ਖੋਲ੍ਹ 'ਚ ਗਲਤੀ %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "ਫਾਇਲ '%s' ਦੀਆਂ ਵਿਸ਼ੇਸਤਾ ਖੋਲ੍ਹਣ 'ਚ ਅਸਫ਼ਲ: fstat() ਅਸਫ਼ਲ: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "ਫਾਇਲ '%s' ਖੋਲ੍ਹਣ ਵਿੱਚ ਅਸਫਲ: fdopen() ਅਸਫਲ: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "ਫਾਇਲ '%s' ਦਾ ਨਾਂ '%s' ਬਦਲਣ 'ਚ ਅਸਫ਼ਲ: g_rename() ਫੇਲ੍ਹ: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "ਫਾਇਲ %s' ਬਣਾਉਣ ਵਿੱਚ ਗਲਤੀ: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "ਫਾਇਲ '%s' ਨੂੰ ਲਿਖਣ ਲਈ ਖੋਲਣ 'ਚ ਅਸਫ਼ਲ: fdopen() ਫੇਲ੍ਹ: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "ਫਾਇਲ '%s' ਨੂੰ ਲਿਖਣ ਲਈ ਅਸਫ਼ਲ: fwrite() ਫੇਲ੍ਹ: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "ਫਾਇਲ '%s' ਨੂੰ ਬੰਦ ਕਰਨ 'ਚ ਅਸਫ਼ਲ: fdopen() ਫੇਲ੍ਹ: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "ਮੌਜੂਦਾ ਫਾਇਲ '%s' ਨੂੰ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: g_unlink() ਫੇਲ੍ਹ: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "ਨਮੂਨਾ %s ਸਹੀ ਨਹੀਂ ਹੈ, ਇਸ ਕੋਲ %s ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "ਨਮੂਨਾ '%s' XXXXXX ਨਾਲ ਖਤਮ ਨਹੀਂ ਹੁੰਦਾ"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "ਚਿੰਨ੍ਹ ਸਬੰਧ '%s' ਖੋਲਣ ਵਿੱਚ ਗਲਤੀ: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "ਚਿੰਨ੍ਹ ਸਬੰਧ ਸਹਾਇਤਾ ਪ੍ਰਾਪਤ ਨਹੀਂ ਹਨ"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "'%s' ਤੋਂ '%s' ਬਦਲਣ ਵਾਲਾ ਖੋਲਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "g_io_channel_read_line_string ਖੁੱਲ ਨਹੀਂ ਰਿਹਾ ਹੈ"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "ਕੁਝ ਅਣ-ਬਦਲਿਆ ਡਾਟਾ ਬਫਰ ਵਿੱਚ ਪਿਆ ਹੈ"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "ਇਕ ਅੱਧ ਪਚਦੇ ਅੱਖਰ 'ਤੇ ਚੈਨਲ ਬੰਦ ਹੋ ਗਿਆ"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "g_io_channel_read_to_end ਵਿੱਚ ਕੱਚਾ ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "ਫਾਇਲ '%s': ਖੋਲ੍ਹਣ ਵਿੱਚ ਫੇਲ੍ਹ: fdopen() ਫੇਲ੍ਹ: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "ਫਾਇਲ '%s' ਮਿਲਾਉਣ ਵਿੱਚ ਫੇਲ: mmap() ਫੇਲ ਹੋਇਆ: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "ਸਤਰ %d ਅੱਖਰ %d 'ਤੇ ਗਲਤੀ: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "ਸਤਰ %d ਉੱਤੇ ਗਲਤੀ: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr "ਖਾਲੀ ਇਕਾਈ '&;' ਵੇਖੋ; ਜਾਇਜ ਇਕਾਈਆਂ ਹਨ : &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"ਇਹ %s ਅੱਖਰ ਕੋਈ ਇਕਾਈ ਸੁਰੂ ਕਰਨ ਲਈ ਗਲਤ ਹੈ & ਅੱਖਰ ਇਕਾਈ ਆਰੰਭ ਕਰਦਾ ਹੈ; ਜੇਕਰ ਇਹ ਐਪਰਸੈਡ ਇਕਾਈ "
+"ਬਣਨਯੋਗ ਨਹੀਂ ਤਾਂ ਇਸ ਨੂੰ ਇੰਝ &amp; ਛੱਡ ਦਿਓ"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "'%s' ਅੱਖਰ ਇਕਾਈ ਦੇ ਨਾਂ ਲਈ ਜਾਇਜ਼ ਨਹੀਂ ਹੈ"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "ਇਕਾਈ ਨਾਂ '%s' ਪਤਾ ਨਹੀਂ ਹੈ"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"ਇਕਾਈ ਸੈਮੀਕਾਲਨ ਨਾਲ ਖਤਮ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੋ ਸਕਦਾ ਕਿ ਤੁਸੀ ਇੱਕ ਐਪਰਸੈਨਡ ਅੱਖਰ ਬਿਨਾਂ ਇਕਾਈ ਆਰੰਭ "
+"ਕੀਤੇ ਹੀ ਵਰਤ ਰਹੇ ਹੋ, ਐਪਰਸੈਨਡ ਇਸਤਰਾਂ &amp; ਛੱਡੋ"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+" '%-.*s' ਪਾਰਸ ਕਰਨ ਵਿੱਚ ਅਸਫਲ, ਜੋ ਕਿ ਅੱਖਰ ਵਿੱਚ ਨੰਬਰ ਹੋਣ ਚਾਹੀਦਾ ਹੈ ਵੇਖੋ (&#234; ਉਦਾਹਰਨ "
+"ਲਈ) - ਅੱਖਰ ਬਹੁਤ ਲੰਮਾ ਹੋ ਗਿਆ ਹੈ"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "ਅੱਖਰ ਦਾ ਹਵਾਲਾ '%-.*s' ਇਕ ਚੁਣੇ ਅੱਖਰ ਨੂੰ ਇਨਕੋਡ ਨਹੀਂ ਕਰ ਸਕਦਾ"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "ਖਾਲੀ ਅੱਖਰ ਦਾ ਹਵਾਲਾ, ਕੋਈ ਨੰਬਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ ਜਿਵੇਂ ਕਿ &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"ਅੱਖਰੀ ਹਵਾਲਾ ਸੈਮੀਕਾਲਨ ਨਾਲ ਖਤਮ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੋ ਕਿ ਤੁਸੀ ਇੱਕ ਐਪਰਸੈਨਡ ਅੱਖਰ ਬਿਨਾਂ ਇਕਾਈ ਆਰੰਭ "
+"ਕੀਤੇ ਹੀ ਵਰਤ ਰਹੇ ਹੋ, ਐਪਰਸੈਨਡ ਇੰਝ &amp; ਛੱਡੋ"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "ਅਧੂਰਾ ਇਕਾਈ ਹਵਾਲਾ"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "ਅਧੂਰਾ ਅੱਖਰੀ ਹਵਾਲਾ"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "ਗਲਤ UTF-8 ਇੰਕੋਡ ਅੱਖਰ"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "ਦਸਤਾਵੇਜ਼ ਇਕ ਇਕਾਈ (ਜਿਵੇ ਕਿ. <book>) ਨਾਲ ਆਰੰਭ ਹੋਣਾ ਜਰੂਰੀ ਹੈ"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"ਇਹ '%s' ਜਾਇਜ ਅੱਖਰ ਨਹੀਂ ਹੈ ਜੋ ਕਿ '<' ਅੱਖਰ ਤੋਂ ਮਗਰ ਹੈ, ਇਹ ਕਿਸੇ ਇਕਾਈ ਦੇ ਨਾਂ ਨਾਲ ਆਰੰਭ ਨਹੀਂ "
+"ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"ਅਨਿਸ਼ਚਿਤਅੱਖਰ '%s', ਇਹ '>' ਅੱਖਰ ਦੀ ਉਮੀਦ ਸੀ ਤਾਂ ਕਿ ਇਕਾਈ '%s' ਦੇ ਸ਼ੁਰੂ ਟੈਗ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾ "
+"ਸਕੇ"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr "ਅਨਿਸ਼ਚਿਤ ਅੱਖਰ %s ਹੈ, ਇਕਾਈ %s ਦੇ ਇਸ ਵਿਸ਼ੇਸਤਾ ਨਾਂ %s ਮਗਰੋਂ = ਲੋੜੀਦਾ ਸੀ"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"ਅਨਿਸ਼ਚਿਤ ਅੱਖਰ '%s' ਹੈ, ਇਕ ਅੱਖਰ '>'ਜਾਂ '/' ਨਿਸ਼ਚਿਤ ਅੱਖਰ ਹੈ ਤਾਂ ਕਿ ਹਿੱਸੇ ਦੇ ਸ਼ੁਰੂ ਕੀਤੇ ਟੈਗ ਨੂੰ "
+"ਖਤਮ ਕੀਤੀ ਜਾ ਸਕੇ '%s', ਜਾਂ ਚੁਣਿਆ ਪ੍ਰਤੀਕ, ਜਿਸ ਲ਼ਈ ਤੁਸੀ ਗਲਤ ਨਾਂ ਭਰਿਆ ਹੈ"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"ਅਨਿਸ਼ਚਿਤ ਅੱਖਰ '%s', ਬਰਾਬਰ ਦੇ ਨਿਸ਼ਾਨ ਮਗਰੋ ਇਕ ਖੁੱਲਾ ਹਵਾਲਾ ਨਿਸ਼ਾਨ ਜਰੂਰੀ ਹੈ, ਜਦੋਂ ਕਿ ਤੁਸੀ ਇੱਕ "
+"ਇਕਾਈ '%s' ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ '%s' ਲਈ ਮੁੱਲ ਦੇ ਰਹੇ ਹੋ"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"ਇਸ '</' ਅੱਖਰ ਮਗਰੋਂ ਇਹ %s' ਅੱਖਰ ਜਾਇਜ ਨਹੀਂ ਹੈ, '%s' ਇਕ ਇਕਾਈ ਦੇ ਨਾਂ ਨਾਲ ਆਰੰਭ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr "ਇਹ '%s' ਅੱਖਰ ਬੰਦ ਭਾਗ ਦੇ ਨਾਂ ਮਗਰੋਂ ਜਾਇਜ ਨਹੀਂ ਹੈ '%s'; ਸਿਰਫ '>' ਅੱਖਰ ਹੀ ਮਨਜ਼ੂਰ ਹੈ"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "ਇਹ ਇਕਾਈ '%s' ਬੰਦ ਸੀ, ਕੋਈ ਇਕਾਈ ਖੁੱਲੀ ਨਹੀਂ ਹੈ"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "ਇਹ ਇਕਾਈ '%s' ਬੰਦ ਸੀ, ਪਰ '%s' ਇਕਾਈ ਖੁੱਲਾ ਹੈ"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "ਦਸਤਾਵੇਜ਼ ਖਾਲੀ ਹੈ ਜਾਂ ਕੇਵਲ ਖਾਲੀ ਥਾਂ ਹੀ ਰੱਖਦਾ ਹੈ"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "ਦਸਤਾਵੇਜ਼ ਬੇਉਮੀਦ ਬੰਦ ਹੋ ਗਿਆ ਹੈ, ਇਕ ਖੁਂਲੀ ਬਰੈਕਟ '<' ਪਾਉਣ ਮਗਰੋਂ"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr "ਦਸਤਾਵੇਜ਼ ਬੇਉਮੀਦ ਬੰਦ ਹੋ ਗਿਆ ਹੈ, ਜਦੋਂ ਕਿ-ਇਹ '%s' ਆਖਰੀ ਖੁੱਲਾ ਭਾਗ ਹੈ"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"ਦਸਤਾਵੇਜ਼ ਬੇਉਮੀਦ ਬੰਦ ਹੋ ਗਿਆ ਹੈ, ਇਕ ਬੰਦ ਬਰੈਕਟ <%s/> ਜੋ ਕਿ ਪੱਟੀ ਨੂੰ ਬੰਦ ਕਰਦੀ ਹੈ, ਦੀ ਉਮੀਦ ਸੀ"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "ਇਕ ਹਿੱਸੇ ਦੇ ਨਾਂ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਬੇਉਮੀਦ ਬੰਦ ਹੋ ਗਿਆ ਹੈ"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "ਇਕ ਗੁਣ ਦੇ ਨਾਂ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਬੇਉਮੀਦ ਬੰਦ ਹੋ ਗਿਆ ਹੈ"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "ਇਕ ਹਿੱਸੇ ਦੀ ਖੁੱਲੀ ਪੱਟੀ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਬੇਉਮੀਦ ਬੰਦ ਹੋ ਗਿਆ ਹੈ"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"ਇਕ ਗੁਣ ਦੇ ਨਾਂ ਤੋ ਪਹਿਲਾਂ ਬਰਾਬਰ ਦੇ ਨਿਸ਼ਾਨ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਬੇਉਮੀਦ ਬੰਦ ਹੋ ਗਿਆ ਹੈ, ਗੁਣ ਦਾ ਕੋਈ ਮੁੱਲ "
+"ਨਹੀਂ ਹੈ"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "ਇਕ ਗੁਣ ਦੇ ਮੁੱਲ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਬੇਉਮੀਦ ਬੰਦ ਹੋ ਗਿਆ ਹੈ"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "ਇਕ ਹਿੱਸੇ '%s' ਦੀ ਪੱਟੀ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਬੇਉਮੀਦ ਬੰਦ ਹੋ ਗਿਆ ਹੈ"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "ਇਕ ਟਿੱਪਣੀ ਜਾਂ ਹਦਾਇਤ ਚਲਾਉਣ ਦੌਰਾਨ ਦਸਤਾਵੇਜ਼ ਬੇਉਮੀਦ ਬੰਦ ਹੋ ਗਿਆ ਹੈ"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "ਸਤਰ %d ਅੱਖਰ %d 'ਤੇ ਗਲਤੀ: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "ਅਧੂਰਾ ਇਕਾਈ ਹਵਾਲਾ"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "ਹਵਾਲਾ ਅੱਖਰ ਇਕ ਹਵਾਲਾ ਨਿਸ਼ਾਨ ਨਾਲ ਆਰੰਭ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "ਕਮਾਂਡ ਸਤਰ ਜਾਂ ਸੈਲ ਅੱਖਰ ਵਿੱਚ ਬੇਮੇਲ ਹਵਾਲਾ ਨਿਸ਼ਾਨ ਹੈ"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "ਇੱਕ '\\' ਅੱਖਰ ਮਗਰੋਂ ਅੱਖਰ ਖਤਮ ਹੋਣੇ ਹਨ (ਅੱਖਰ ਸੀ '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "%c ਲਈ ਹਵਾਲਾ ਲੱਭਣ ਤੋਂ ਪਹਿਲਾਂ ਅੱਖਰ ਖਤਮ. (ਅੱਖਰ ਸੀ '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "ਅੱਖਰੀ ਪਾਠ ਖਾਲੀ ਸੀ (ਜਾਂ ਸਾਫ ਥਾਂ ਹੀ ਹੈ)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "ਅਗਲੀ ਕਿਰਿਆਵਾਂ ਤੋ ਡਾਟਾ ਵੇਖਣ ਵਿੱਚ ਅਸਫਲ ਹੈ"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "ਅਧੀਨ ਕਿਰਿਆ (%s) ਨਾਲ ਸੰਚਾਰ ਲਈ ਪਾਇਪ ਬਣਾਉਣ ਵਿੱਚ ਅਸਫਲ ਹੈ"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "ਅਧੀਨ ਕਿਰਿਆ (%s) ਤੋਂ ਡਾਟਾ ਖੋਲਣ ਵਿੱਚ ਅਸਫਲ ਹੈ"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "ਡਾਇਰੈਕਟਰੀ '%s' ਬਦਲਣ ਵਿੱਚ ਅਸਫਲ (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "ਅਗਲੀ ਕਿਰਿਆ (%s) ਚਾਲੂ ਕਰਨ ਵਿੱਚ ਅਸਫਲ"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "ਗਲਤ ਪ੍ਰੋਗਰਾਮ ਨਾਂ: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "%d ਉੱਤੇ ਮੁੱਲ ਵੈਕਟਰ ਵਿੱਚ ਗਲਤ ਸਤਰ: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "ਵਾਤਾਵਰਨ ਵਿੱਚ ਗਲਤ ਸਤਰ: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "ਗਲਤ ਮੌਜੂਦਾ ਡਾਇਰੈਕਟਰੀ: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "ਸਹਾਇਤਾ ਕਾਰਜ (%s) ਸ਼ੁਰੂ ਕਰਨ 'ਚ ਅਸਫ਼ਲ"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr "ਅਗਲੀ ਕਿਰਿਆ ਤੋਂ ਡਾਟਾ ਪੜ੍ਹਨ ਦੌਰਾਨ g_io_channel_win32_poll() ਵਿੱਚ ਅਚਾਨਕ ਗਲਤੀ"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "ਅਧੀਨ ਕਿਰਿਆ (%s) ਤੋ ਡਾਟਾ ਖੋਲ੍ਹਣ 'ਚ ਅਸਫ਼ਲ"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "ਅਧੀਨ ਕਿਰਿਆ (%s) ਤੋਂ ਡਾਟਾ ਖੋਲਣ ਲਈ select() ਵਿੱਚ ਅਚਾਨਕ ਗਲਤੀ"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "waitpid() (%s) ਵਿੱਚ ਅਚਾਨਕ ਗਲਤੀ"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "ਵੰਡਣ (ਫੋਰਕ) (%s) ਲਈ ਅਸਫ਼ਲ"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "ਅਧੀਨ ਕਿਰਿਆ \"%s\" ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਹੈ (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "ਅਧੀਨ ਕਿਰਿਆ (%s) ਦੀ ਆਉਟਪੁੱਟ ਜਾਂ ਇੰਪੁੱਟ ਦੀ ਦਿਸ਼ਾ ਬਦਲਣ 'ਚ ਫੇਲ੍ਹ"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "ਅਧੀਨ ਕਿਰਿਆ (%s) ਨੂੰ ਵੰਡਣ 'ਚ ਅਸਫ਼ਲ"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "ਅਧੀਨ ਕਿਰਿਆ \"%s\" ਨੂੰ ਚਾਲੂ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਹੈ"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "ਅਧੀਨ ਕਿਰਿਆ ਪਾਇਪ (%s) ਤੋਂ ਚਾਹੀਦਾ ਡਾਟਾ ਖੋਲਣ ਵਿੱਚ ਅਸਫਲ ਹੈ"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "UTF-8 ਲਈ ਅੱਖਰ ਨਿਸ਼ਚਿਤ ਸੀਮਾ ਤੋਂ ਬਾਹਰ"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "ਬਦਲਾਉ ਇੰਪੁੱਟ ਵਿੱਚ ਤਰਤੀਬ ਜਾਇਜ ਨਹੀਂ ਹੈ"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "UTF-16 ਲਈ ਅੱਖਰ ਨਿਸ਼ਚਿਤ ਸੀਮਾ ਤੋਂ ਬਾਹਰ"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "ਵਰਤੋਂ:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[ਚੋਣ...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "ਸਹਾਇਤਾ ਚੋਣ:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "ਸਹਾਇਤਾ ਚੋਣ ਵੇਖਾਓ"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "ਸਭ ਸਹਾਇਤਾ ਚੋਣਾਂ ਵੇਖਾਓ"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "ਕਾਰਜ ਚੋਣ:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "ਪੂਰਨ ਅੰਕ ਮੁੱਲ %s' ਨੂੰ %s ਲਈ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "ਪੂਰਨ ਅੰਕ '%s' %s ਲਈ ਸੀਮਾ ਤੋਂ ਬਾਹਰ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: glib/goption.c:831
+#, fuzzy, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "ਪੂਰਨ ਅੰਕ ਮੁੱਲ %s' ਨੂੰ %s ਲਈ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"
+
+#: glib/goption.c:839
+#, fuzzy, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "ਪੂਰਨ ਅੰਕ '%s' %s ਲਈ ਸੀਮਾ ਤੋਂ ਬਾਹਰ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "ਚੋਣ %s ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "%s ਲਈ ਮੁੱਲ ਗੁੰਮ ਹੈ"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "ਅਣਜਾਣ ਚੋਣ %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "ਡਾਟਾ ਡਾਇਰੈਕਟਰੀਆਂ ਵਿੱਚ ਠੀਕ ਕੁੰਜੀ ਫਾਇਲ ਨਹੀਂ ਖੋਜੀ ਜਾ ਸਕੀ"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "ਇੱਕ ਨਿਯਮਤ ਫਾਇਲ ਨਹੀਂ"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "ਫਾਇਲ ਖਾਲੀ ਹੈ"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr "ਕੁੰਜੀ ਫਾਇਲ ਸਤਰ '%s' ਰੱਖਦੀ ਹੈ, ਜੋ ਕਿ ਕੁੰਜੀ-ਮੁੱਲ ਜੋੜਾ, ਗਰੁੱਪ ਜਾਂ ਟਿੱਪਣੀ ਨਹੀਂ ਹੈ"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "ਗਲਤ ਪ੍ਰੋਗਰਾਮ ਨਾਂ: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "ਕੁੰਜੀ ਫਾਇਲ ਸਮੂਹ ਨਾਲ ਸ਼ੁਰੂ ਨਹੀਂ ਹੋ ਸਕਦੀ ਹੈ"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "ਗਲਤ ਪ੍ਰੋਗਰਾਮ ਨਾਂ: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "ਕੁੰਜੀ ਫਾਇਲ ਨਾ-ਸਹਾਇਕ ਇੰਕੋਡਿਗ '%s' ਰੱਖਦੀ ਹੈ"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "ਕੁੰਜੀ ਫਾਇਲ ਦਾ ਸਮੂਹ '%s' ਨਹੀਂ ਹੈ"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ '%s' ਕੁੰਜੀ ਨਹੀਂ ਹੈ"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ ਕੁੰਜੀ '%s' ਦਾ ਮੁੱਲ '%s' ਹੈ, ਜੋ ਕਿ UTF-8 ਨਹੀਂ ਹੈ"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ '%s' ਕੁੰਜੀ ਹੈ, ਜਿਸ ਤੇ ਕਾਰਵਾਈ ਨਹੀਂ ਹੋ ਸਕਦੀ ਹੈ"
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ ਕੁੰਜੀ '%s' ਗਰੁੱਪ '%s' ਵਿੱਚ ਹੈ, ਜਿਸ ਦੇ ਮੁੱਲ ਨੂੰ ਇੰਟਰਪਰੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।"
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "ਕੁੰਜੀ ਫਾਇਲ ਕੁੰਜੀ '%s' ਗਰੁੱਪ '%s' ਵਿੱਚ ਨਹੀਂ ਹੈ"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ ਸਤਰ ਦੇ ਅੰਤ ਵਿੱਚ ਇਸਕੇਪ ਅੱਖਰ ਹੈ"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ ਗਲਤ ਇਸਕੇਪ ਕ੍ਰਮ '%s' ਹੈ"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "ਮੁੱਲ '%s' ਨੂੰ ਇੱਕ ਅੰਕ ਦੇ ਤੌਰ 'ਤੇ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ ਹੈ।"
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "ਪੂਰਨ ਅੰਕ '%s' ਸੀਮਾ ਤੋਂ ਬਾਹਰ ਹੈ"
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "ਮੁੱਲ '%s' ਨੂੰ ਇੱਕ ਅੰਕ ਦੇ ਤੌਰ 'ਤੇ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ ਹੈ।"
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "ਮੁੱਲ '%s' ਨੂੰ ਬੂਲੀਅਨ ਵਾਂਗ ਇੰਟਰਪਰੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।"
diff --git a/trunk/po/pl.po b/trunk/po/pl.po
new file mode 100644
index 000000000..6e2f5d037
--- /dev/null
+++ b/trunk/po/pl.po
@@ -0,0 +1,964 @@
+# translation of glib.HEAD.pl.po to Polish
+# Artur Flinta <aflinta@at.kernel.pl>, 2006.
+# Copyright (C) 2001-2006 Free Software Foundation, Inc.
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+# Aktualną wersję tego pliku możesz odnaleźć w repozytorium cvs.gnomepl.org
+# (:pserver:anonymous@cvs.gnomepl.org:/gnomepl, puste hasło)
+# Jeśli masz jakiekolwiek uwagi odnoszące się do tłumaczenia lub chcesz
+# pomóc w jego rozwijaniu i pielęgnowaniu, napisz do nas na adres:
+# translators@gnomepl.org
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.HEAD.pl\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-14 15:10+0200\n"
+"Last-Translator: Artur Flinta <aflinta@at.kernel.pl>\n"
+"Language-Team: Polish <translators@gnomepl.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%"
+"100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Niespodziewany atrybut \"%s\" dla elementu \"%s\""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Nie odnaleziono atrybutu \"%s\" dla elementu \"%s\""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Nieoczekiwany znacznik \"%s\", oczekiwano znacznika \"%s\""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Nieoczekiwany znacznik \"%s\" wewnątrz \"%s\""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Nie można odnaleźć poprawnego pliku zakładek w katalogach danych"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Zakładka dla URI \"%s\" już istnieje"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Nie znaleziono zakładki dla URI \"%s\""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Nie zdefiniowano typu MIME w zakładce dla URI \"%s\""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Nie zdefiniowano prywatnej flag w zakładce dla URI \"%s\""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Nie ustawiono grup w zakładce dla URI \"%s\""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Żadna aplikacja o nazwie \"%s\" nie zarejestrowała zakładki dla \"%s\""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Niepowodzenie podczas odczytu dowiązania symbolicznego \"%s\": %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr ""
+"Konwersja z zestawu znaków \"%s\" na zestaw \"%s\" nie jest obsługiwana"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Nie można otworzyć konwertera z \"%s\" na \"%s\""
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Niepoprawna sekwencja bajtów na wejściu konwersji"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Błąd podczas konwersji: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Na końcu wejścia występuje sekwencja odpowiadająca części znaku"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr ""
+"Nie można przekonwertować napisu zastępczego \"%s\" na zestaw znaków \"%s\""
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+"URI \"%s\" nie jest bezwzględnym URI, używającym schematu \"plikowego\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "URI lokalnego pliku \"%s\" nie może zawierać znaku \"#\""
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI \"%s\" jest niepoprawny"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Nazwa komputera w URI \"%s\" jest niepoprawna"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI \"%s\" zawiera niewłaściwie zacytowane znaki"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Ścieżka \"%s\" nie jest ścieżką bezwzględną"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Niepoprawna nazwa komputera"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Wystąpił błąd przy otwieraniu katalogu \"%s\": %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Nie można przydzielić %lu bajtów do odczytu pliku \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Wystąpił błąd przy odczycie pliku \"%s\": %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Nie można odczytać z pliku \"%s\": %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Nie można otworzyć pliku \"%s\": %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"Nie można uzyskać atrybutów pliku \"%s\": funkcja fstat() zwróciła błąd: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Nie można otworzyć pliku \"%s\": funkcja fdopen() zwróciła błąd: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Nie można zmienić nazwy pliku \"%s\" na \"%s\": funkcja g_rename() zwróciła "
+"błąd: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Nie można utworzyć pliku \"%s\": %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"Nie można otworzyć pliku \"%s\" do zapisu: funkcja fdopen() zwróciła błąd: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Nie można zapisać pliku \"%s\": funkcja fwrite() zwróciła błąd: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Nie można zamknąć pliku \"%s\": funkcja fclose() zwróciła błąd: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+"Nie można usunąć istniejącego pliku \"%s\": funkcja g_unlink() zwróciła "
+"błąd: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Szablon \"%s\" jest niepoprawny, nie powinien on zawierać \"%s\""
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Szablon \"%s\" nie zawiera XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Niepowodzenie podczas odczytu dowiązania symbolicznego \"%s\": %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Dowiązania symboliczne nie są obsługiwane"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Nie można otworzyć konwertera z \"%s\" na \"%s\": %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Nie można wykonać surowego odczytu w g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "W buforze odczytu pozostały nieprzekonwertowane dane"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Na końcu kanału występuje sekwencja odpowiadająca części znaku"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Nie można wykonać surowego odczytu w g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Nie można otworzyć pliku \"%s\": funkcja open() zwróciła błąd: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Nie można zmapować pliku \"%s\": funkcja mmap() zwróciła błąd: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Błąd w wierszu %d przy znaku %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Błąd w wierszu %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Napotkano pustą jednostkę \"&;\"; poprawnymi jednostkami są: &amp; &quot; "
+"&lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Znak \"%s\" nie jest dopuszczalny na początku nazwy jednostki; znak & "
+"rozpoczyna jednostkę; jeśli znak ten nie powinien rozpoczynać jednostki, "
+"należy go zapisać jako &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Znak \"%s\" nie jest dopuszczalny wewnątrz nazwy jednostki"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Nazwa jednostki \"%s\" nie jest znana"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Jednostka nie jest zakończona średnikiem; najprawdopodobniej został użyty "
+"znak &, który nie miał oznaczać jednostki - należy go zapisać jako &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Nie można przetworzyć \"%-.*s\", w miejscu którego powinna wystąpić liczba, "
+"będąca częścią odniesienia do znaku (np. &#234;) - być może liczba jest zbyt "
+"duża"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Odniesienie do znaku \"%-.*s\" nie jest zapisem dozwolonego znaku"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Puste odniesienie do znaku; powinno ono zawierać cyfry, np. &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Odniesienie do znaku nie jest zakończone średnikiem; najprawdopodobniej "
+"został użyty znak &, który nie miał oznaczać jednostki - należy go zapisać "
+"jako &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Niezakończone odniesienie do jednostki"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Niezakończone odniesienie do znaku"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Tekst nie jest poprawnym łańcuchem UTF-8"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokument musi rozpoczynać się jakimś elementem (np. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"Znak \"%s\" nie powinien występować po znaku \"<\"; nie może on rozpoczynać "
+"nazwy elementu"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Niespodziewany znak \"%s\"; oczekiwano znaku \">\", kończącego początkowy "
+"znacznik elementu \"%s\""
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Niespodziewany znak \"%s\"; po nazwie atrybutu \"%s\" elementu \"%s\" "
+"oczekiwano znaku \"=\""
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Niespodziewany znak \"%s\"; oczekiwano znaku \">\" lub \"/\", kończącego "
+"znacznik początkowy elementu \"%s\" lub opcjonalnie atrybutu; być może w "
+"nazwie atrybutu został użyty niepoprawny znak"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Niespodziewany znak \"%s\"; oczekiwano otwierającego znaku cudzysłowu po "
+"znaku równości przy podawaniu wartości atrybutu \"%s\" elementu \"%s\""
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"Znak \"%s\" nie jest znakiem, który może pojawić się po sekwencji \"</\"; \"%"
+"s\" nie może rozpoczynać nazwy elementu"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"Znak \"%s\" nie jest znakiem, który może wystąpić po domykającej nazwie "
+"elementu \"%s\"; dopuszczalnym znakiem jest \">\""
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr ""
+"Element \"%s\" został zamknięty, lecz brak aktualnie otwartego elementu"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"Element \"%s\" został zamknięty, lecz aktualnie otwartym elementem jest \"%s"
+"\""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokument jest pusty lub zawiera tylko separatory"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Zaraz po znaku \"%s\" nastąpił nieoczekiwany koniec dokumentu"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Nastąpił nieoczekiwany koniec dokumentu, gdy pewne elementy są wciąż otwarte "
+"- \"%s\" był ostatnim otwartym elementem"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Nastąpił nieoczekiwany koniec dokumentu; oczekiwano znaku \">\", kończącego "
+"znacznik <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Nastąpił nieoczekiwany koniec dokumentu wewnątrz nazwy elementu"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Nastąpił nieoczekiwany koniec dokumentu wewnątrz nazwy atrybutu"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+"Nastąpił nieoczekiwany koniec dokumentu wewnątrz znacznika otwierającego "
+"element."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Nastąpił nieoczekiwany koniec dokumentu po znaku równości występującym po "
+"nazwie atrybutu; brak wartości atrybutu"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Nastąpił nieoczekiwany koniec dokumentu wewnątrz wartości atrybutu"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Nastąpił nieoczekiwany koniec dokumentu wewnątrz znacznika domykającego "
+"elementu \"%s\""
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Nastąpił nieoczekiwany koniec dokumentu wewnątrz komentarza lub instrukcji "
+"przetwarzania"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Błąd w wierszu %d przy znaku %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Niezakończone odniesienie do jednostki"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Cytowany znak nie rozpoczyna się znakiem cytowania"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"W wierszu poleceń lub innym napisie cytowanym jak w powłoce wystąpił "
+"niesparowany znak cytowania"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr ""
+"Tekst zakończył się bezpośrednio po znaku \"\\\" (wartością tekstu było \"%s"
+"\")."
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Tekst zakończył się przed odnalezieniem domykającego znaku cytowania dla %c "
+"(tekstem jest \"%s\")"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Tekst jest pusty (lub zawiera tylko separatory)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Nie można odczytać danych z procesu potomnego"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Nie można utworzyć potoku do komunikacji z procesem potomnym (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Nie można odczytać danych z potoku łączącego z procesem potomnym (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Nie można zmienić katalogu na \"%s\" (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Nie można wykonać procesu potomnego (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Niepoprawna nazwa programu: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Niepoprawna sekwencja argumencie w %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Niepoprawna sekwencja w otoczeniu: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Niepoprawny katalog roboczy: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Nie można uruchomić programu pomocniczego (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Przy odczycie danych z procesu potomnego w g_io_channel_win32_poll() "
+"wystąpił nieznany błąd"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Nie można odczytać danych z procesu potomnego (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Nieoczekiwany błąd w funkcji select() przy odczytywaniu danych z procesu "
+"potomnego (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Nieoczekiwany błąd w funkcji waitpit() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Nie można utworzyć procesu (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Nie można wykonać procesu potomnego \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Nie można przekierować wejścia lub wyjścia procesu potomnego (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Nie można utworzyć procesu potomnego (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Przy wykonywaniu procesu potomnego \"%s\" wystąpił nieznany błąd"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"Nie można odczytać odpowiedniej liczby danych z potoku do odczytu PID-u od "
+"procesu potomnego (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Znak jest poza zakresem dopuszczalnym dla UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Niepoprawna sekwencja na wejściu konwersji"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Znak jest poza zakresem dopuszczalnym dla UTF-8"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Użycie:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPCJA...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Opcje pomocy:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Wyświetlenie opcji pomocy"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Wyświetlenie wszystkich opcji pomocy"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Opcje aplikacji:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Nie można przetworzyć wartości liczbowej \"%s\" dla %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Wartość liczbowa \"%s\" dla %s jest z poza dopuszczalnego zakresu"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Nie można przetworzyć podwójnej wartości liczbowej \"%s\" dla %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+"Podwójna wartość liczbowa \"%s\" dla %s jest z poza dopuszczalnego zakresu"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Błąd podczas przetwarzania opcji %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Brakujący parametr dla %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Nieznana opcja %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Nie można odnaleźć poprawnego pliku klucza w katalogach danych"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "To nie jest zwykły plik"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Plik jest pusty"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Plik klucza zawiera linię \"%s\", która nie jest parą klucz-wartość, grupą "
+"lub komentarzem"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Niepoprawna nazwa programu: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Plik klucza nie rozpoczyna się od grupy"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Niepoprawna nazwa programu: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Plik klucza zawiera nieobsługiwane kodowanie \"%s\""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Plik klucza nie zawiera grupy \"%s\""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Plik klucza nie zawiera klucza \"%s\""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Plik klucza zawiera klucz \"%s\" o wartości \"%s\", która nie jest zapisana "
+"w UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Plik klucza zawiera klucz \"%s\", który ma wartość niemożliwą do "
+"zinterpretowania."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Plik klucza zawiera klucz \"%s\" w grupie \"%s\", który ma wartość "
+"niemożliwą do zinterpretowania."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Plik klucza nie zawiera klucza \"%s\" w grupie \"%s\""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Plik klucza zawiera znak sterujący na końcu linii"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Plik klucza zawiera niepoprawną sekwencję sterującą \"%s\""
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Nie można zinterpretować \"%s\" jako wartości liczbowej."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Wartość liczbowa \"%s\" jest z poza dopuszczalnego zakresu"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Nie można zinterpretować \"%s\" jako wartości zmiennoprzecinkowej."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Nie można zinterpretować \"%s\" jako wartości logicznej."
diff --git a/trunk/po/po2tbl.sed.in b/trunk/po/po2tbl.sed.in
new file mode 100644
index 000000000..b3bcca4d7
--- /dev/null
+++ b/trunk/po/po2tbl.sed.in
@@ -0,0 +1,102 @@
+# po2tbl.sed - Convert Uniforum style .po file to lookup table for catgets
+# Copyright (C) 1995 Free Software Foundation, Inc.
+# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+#
+# 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.
+#
+1 {
+ i\
+/* Automatically generated by po2tbl.sed from @PACKAGE NAME@.pot. */\
+\
+#if HAVE_CONFIG_H\
+# include <config.h>\
+#endif\
+\
+#include "libgettext.h"\
+\
+const struct _msg_ent _msg_tbl[] = {
+ h
+ s/.*/0/
+ x
+}
+#
+# Write msgid entries in C array form.
+#
+/^msgid/ {
+ s/msgid[ ]*\(".*"\)/ {\1/
+ tb
+# Append the next line
+ :b
+ N
+# Look whether second part is continuation line.
+ s/\(.*\)"\(\n\)"\(.*"\)/\1\2\3/
+# Yes, then branch.
+ ta
+# Because we assume that the input file correctly formed the line
+# just read cannot be again be a msgid line. So it's safe to ignore
+# it.
+ s/\(.*\)\n.*/\1/
+ bc
+# We found a continuation line. But before printing insert '\'.
+ :a
+ s/\(.*\)\(\n.*\)/\1\\\2/
+ P
+# We cannot use D here.
+ s/.*\n\(.*\)/\1/
+# Some buggy seds do not clear the `successful substitution since last ``t'''
+# flag on `N', so we do a `t' here to clear it.
+ tb
+# Not reached
+ :c
+ x
+# The following nice solution is by
+# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de>
+ td
+# Increment a decimal number in pattern space.
+# First hide trailing `9' digits.
+ :d
+ s/9\(_*\)$/_\1/
+ td
+# Assure at least one digit is available.
+ s/^\(_*\)$/0\1/
+# Increment the last digit.
+ s/8\(_*\)$/9\1/
+ s/7\(_*\)$/8\1/
+ s/6\(_*\)$/7\1/
+ s/5\(_*\)$/6\1/
+ s/4\(_*\)$/5\1/
+ s/3\(_*\)$/4\1/
+ s/2\(_*\)$/3\1/
+ s/1\(_*\)$/2\1/
+ s/0\(_*\)$/1\1/
+# Convert the hidden `9' digits to `0's.
+ s/_/0/g
+ x
+ G
+ s/\(.*\)\n\([0-9]*\)/\1, \2},/
+ s/\(.*\)"$/\1/
+ p
+}
+#
+# Last line.
+#
+$ {
+ i\
+};\
+
+ g
+ s/0*\(.*\)/int _msg_tbl_length = \1;/p
+}
+d
diff --git a/trunk/po/pt.po b/trunk/po/pt.po
new file mode 100644
index 000000000..ece477696
--- /dev/null
+++ b/trunk/po/pt.po
@@ -0,0 +1,966 @@
+# glib's Portuguese Translation
+# Copyright © 2001, 2002, 2003, 2004, 2005, 2006 glib
+# Distributed under the same licence as the glib package
+# Duarte Loreto <happyguy_pt@hotmail.com>, 2001, 2002, 2003, 2004, 2005, 2006
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 2.16\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-18 02:45+0000\n"
+"Last-Translator: Duarte Loreto <happyguy_pt@hotmail.com>\n"
+"Language-Team: Portuguese <gnome_pt@yahoogroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Atributo '%s' inesperado para o elemento '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Atributo '%s' do elemento '%s' não foi encontrado"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Etiqueta '%s' inesperada, esperada a etiqueta '%s'"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Etiqueta '%s' inesperada dentro de '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+"Não foi encontrado nenhum ficheiro de marcador válido nos directórios de "
+"dados"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Já existe um marcador para o URI '%s'"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Não foi encontrado nenhum marcador para o URI '%s'"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Nenhum tipo MIME definido no marcador para o URI '%s'"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Nenhum sinal privado definido no marcador para o URI '%s'"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Nenhum grupo definido no marcador para o URI '%s'"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Nenhuma aplicação denominada '%s' registou um marcador para '%s'"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Falha ao ler o atalho '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Conversão do conjunto de caracteres '%s' para '%s' não é suportada"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Incapaz de abrir conversor de '%s' para '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Sequência de bytes inválida na origem da conversão"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Erro durante a conversão: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Sequência de caracteres parcial no final da origem"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Incapaz de converter recurso '%s' para conjunto de caracteres '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "O URI '%s' não é um URI absoluto que utiliza o esquema \"file\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "O URI de ficheiro local '%s' não deverá incluir um '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "O URI '%s' é inválido"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "O nome de máquina do URI '%s' é inválido"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "O URI '%s' contém caracteres incorrectamente mascarados"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "O nome de caminho '%s' não é um caminho absoluto"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Nome de máquina inválido"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Erro ao abrir o directório '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Incapaz de alocar %lu bytes para ler o ficheiro \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Erro ao ler o ficheiro '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Falha ao ler do ficheiro '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Falha ao abrir o ficheiro '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Falha ao obter atributos do ficheiro '%s': falha no fstat(): %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Falha ao abrir o ficheiro '%s': falha no fdopen(): %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Falha ao renomear o ficheiro '%s' para '%s': falha no g_rename(): %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Falha ao criar o ficheiro '%s': %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Falha ao abrir o ficheiro '%s' para escrita: falha no fdopen(): %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Falha ao escrever o ficheiro '%s': falha no fwrite(): %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Falha ao fechar o ficheiro '%s': falha no fclose(): %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Incapaz de remover o ficheiro '%s' existente: falha no g_unlink(): %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Modelo '%s' inválido, não deveria conter um '%s'"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Modelo '%s' não contém XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Falha ao ler o atalho '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Atalhos não são suportados"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Incapaz de abrir conversor de '%s' para '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"Incapaz de efectuar uma leitura em bruto sobre g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Dados residuais não convertidos no buffer de leitura"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Canal termina num caracter parcial"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+"Incapaz de efectuar uma leitura em bruto sobre g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Falha ao abrir o ficheiro '%s': falha no open(): %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Falha ao mapear o ficheiro '%s': falha no mmap(): %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Erro na linha %d caracter %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Erro na linha %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Detectada entidade vazia '&;'; entidades válidas são: &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Caracter '%s' não é válido no início do nome de uma entidade; o caracter & "
+"inicia uma entidade; se este 'i comercial' não é suposto ser uma entidade, "
+"mascare-o como &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Caracter '%s' não é válido dentro do nome de uma entidade"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Nome de entidade '%s' desconhecido"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entidade não termina com um ponto e vírgula; provavelmente foi utilizado um "
+"caracter 'i comercial' sem intenção de iniciar uma entidade - mascare-o como "
+"&amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Falha ao parsear '%-.*s', que deveria ser um dígito dentro de uma referência "
+"de caracter (&#234; por exemplo) - talvez o dígito seja demasiado grande"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Referência de caracter '%-.*s' não codifica um caracter permitido"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Referência de caracter vazia; deverá incluir um dígito tal como &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Referência de caracter não termina com um ponto e vírgula; provavelmente foi "
+"utilizado um caracter 'i comercial' sem intenção de iniciar uma entidade - "
+"mascare-o como &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Referência de entidade por terminar"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Referência de caracter por terminar"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Texto codificado UTF-8 inválido"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Documento tem de começar com um elemento (ex. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' não é um caracter válido após um caracter '<'; não pode iniciar um nome "
+"de elemento"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Caracter estranho '%s', era esperado um caracter '>' para terminar a "
+"etiqueta inicial do elemento '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Caracter estranho '%s', era esperado um '=' após o nome do atributo '%s' do "
+"elemento '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Caracter estranho '%s', era esperado um caracter '>' ou '/' para terminar a "
+"etiqueta inicial do elemento '%s', ou opcionalmente um atributo; talvez "
+"tenha sido utilizado um caracter inválido no nome de um atributo"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Caracter estranho '%s', era esperada uma abertura de aspa após o sinal de "
+"igual ao atribuir valor ao atributo '%s' do elemento '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' não é um caracter válido após os caracteres '</'; '%s' não pode iniciar "
+"o nome de um elemento"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' não é um caracter válido após o nome do elemento de fecho '%s'; o "
+"caracter permitido é '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Elemento '%s' foi fechado, nenhum elemento está actualmente aberto"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Elemento '%s' foi fechado, mas o elemento actualmente aberto é '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Documento estava vazio ou apenas continha espaços"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Documento terminou inesperadamente logo após um caracter menor que '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Documento terminou inesperadamente com elementos ainda abertos - '%s' foi o "
+"último elemento aberto"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Documento terminou inesperadamente, era esperado um maior que '>' para "
+"terminar a etiqueta <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Documento terminou inesperadamente dentro do nome de um elemento"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Documento terminou inesperadamente dentro do nome de um atributo"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+"Documento terminou inesperadamente dentro da etiqueta de abertura de um "
+"elemento."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Documento terminou inesperadamente após o sinal de igual posterior a um nome "
+"de atributo; nenhum valor de atributo"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Documento terminou inesperadamente dentro do valor de um atributo"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Documento terminou inesperadamente dentro da etiqueta de fecho do elemento '%"
+"s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Documento terminou inesperadamente dentro de um comentário ou instrução de "
+"processamento"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Erro na linha %d caracter %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Referência de entidade por terminar"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Texto citado não é iniciado com um caracter de aspa"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Aspa sem par na linha de comando ou outro texto de consola citado"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Texto terminou após um caracter '\\'. (O texto era '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Texto terminou antes de ser encontrada a aspa equivalente para %c. (O texto "
+"era '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Texto estava vazio (ou apenas continha espaços)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Falha ao ler dados de processo filho"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Falha ao criar canal para comunicar com processo filho (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Falha ao ler de canal filho (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Falha ao ir para directório '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Falha ao executar processo filho (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Nome de aplicação inválido: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Expressão inválida no vector de argumentos na posição %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Expressão inválida no ambiente: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Directório de trabalho inválido: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Falha ao executar aplicação auxiliar (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Erro inesperado no g_io_channel_win32_poll() ao ler dados de um processo "
+"filho"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Falha ao ler dados de processo filho (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Erro inesperado no select() ao ler dados de processo filho (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Erro inesperado em waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Falha ao efectuar fork (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Falha ao executar o processo filho \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Falha ao redireccionar saída ou entrada de processo filho (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Falha ao efectuar fork de processo filho (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Erro desconhecido ao executar processo filho \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Incapaz de ler dados suficientes de canal pid do filho (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Caracter fora do limite para UTF-8 "
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Sequência inválida na conversão da entrada"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Caracter fora do limite para UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Utilização:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPÇÃO...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Opções de Ajuda:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Apresentar as opções de ajuda"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Apresentar todas as opções de ajuda"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Opções da Aplicação:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Incapaz de parsear o valor inteiro '%s' para %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Valor inteiro '%s' para %s para lá do limite permitido"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Incapaz de parsear o valor double '%s' para %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Valor double '%s' para %s para lá do limite permitido"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Erro ao parsear a opção %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Argumento em falta para %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Opção %s desconhecida"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+"Incapaz de encontrar um ficheiro de chave válido nos directórios de dados"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Não é um ficheiro comum"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Ficheiro está vazio"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"O ficheiro de chave contém a linha '%s' que não é um par chave-valor, grupo "
+"ou comentário"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Nome de aplicação inválido: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Ficheiro de chave não começa com um grupo"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Nome de aplicação inválido: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Ficheiro de chave contém uma codificação não suportada '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Ficheiro de chave não possui um grupo '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Ficheiro de chave não contém a chave '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Ficheiro de chave contém a chave '%s' com o valor '%s' que não é UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "Ficheiro de chave contém a chave '%s' cujo valor não é interpretável."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Ficheiro de chave contém a chave '%s' no grupo '%s' cujo valor não é "
+"interpretável."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Ficheiro de chave não possui a chave '%s' no grupo '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Ficheiro de chave contém caracteres escapados no final da linha"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr ""
+"Ficheiro de chave contém uma sequência de caracteres escapados inválida '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Incapaz de interpretar o valor '%s' como um numérico."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Valor inteiro '%s' para além do limite permitido"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+"Incapaz de interpretar o valor '%s' como um número de vírgula flutuante."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Incapaz de interpretar o valor '%s' como uma boleana."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Incapaz de alterar o modo do ficheiro: falha no fork(): %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Incapaz de alterar o modo do ficheiro: falha no waitpid(): %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Incapaz de alterar o modo do ficheiro: falha no chmod(): %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr ""
+#~ "Incapaz de alterar o modo do ficheiro: Filho terminado pelo sinal: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr "Incapaz de alterar o modo do ficheiro: Filho terminou anormalmente"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Conversão do conjunto de caracteres `%s' para `%s' não é suportada"
+
+#~ msgid "Incorrect message size"
+#~ msgstr "Tamanho de mensagem incorrecto"
+
+#~ msgid "Socket error"
+#~ msgstr "Erro de socket"
+
+#~ msgid "Channel set flags unsupported"
+#~ msgstr "Canal definiu parâmetros não suportados"
diff --git a/trunk/po/pt_BR.po b/trunk/po/pt_BR.po
new file mode 100644
index 000000000..27f39ba21
--- /dev/null
+++ b/trunk/po/pt_BR.po
@@ -0,0 +1,960 @@
+# Brazilian Portuguese translation of glib.
+# Copyright (C) 2001-2005 Free Software Foundation, Inc.
+# This file is distributed under the same license as the glib package.
+# Gustavo Noronha Silva <kov@debian.org>, 2001-2005
+# Leonardo Ferreira Fontenelle <leo.fontenelle@gmail.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-09-04 00:53-0300\n"
+"Last-Translator: Leonardo Ferreira Fontenelle <leo.fontenelle@gmail.com>\n"
+"Language-Team: Brazilian Portuguese <gnome-l10n-br@listas.cipsga.org.br>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Atributo '%s' inesperado para elemento '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Não foi encontrado atributo '%s' do elemento '%s'"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Tag '%s' inesperada; tag '%s' esperada"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Tag '%s' inesperada dentro de '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+"Não foi encontrado arquivo de marcadores válido nos diretórios de dados"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Já existe um marcador para o URI '%s'"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Não foi encontrado marcador para o URI '%s'"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Não foi definido tipo MIME no marcador para o URI '%s'"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Não foi definido sinal de particular no marcador para o URI '%s'"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Não há grupos definidos no marcador para o URI '%s'"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Nenhuma aplicação chamada '%s' registrou um marcador para '%s'"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Falha ao ler vínculo simbólico '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Conversão do conjunto de caracteres '%s' para '%s' não é suportada"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Não foi possível abrir conversor de '%s' para '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Sequência de bytes inválida na entrada de conversão"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Erro durante a conversão: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Sequência de caracteres parcial no final da entrada"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr ""
+"Não foi possível converter a seqüência '%s' para conjunto caracteres '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "O URI '%s' não é um URI absoluto que utilize o esquema \"file\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "O URI de arquivo local '%s' não pode incluir um '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "O URI '%s' é inválido"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "O nome de servidor do URI '%s' é inválido"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "O URI '%s' contém caracteres com escape inválido"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "O nome de caminho '%s' não é um caminho absoluto"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Nome de servidor inválido"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Erro ao abrir o diretório '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Não foi possível alocar %lu bytes para ler arquivo \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Erro ao ler arquivo '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Falha ao ler do arquivo '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Falha ao abrir arquivo '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Falha ao obter atributos do arquivo '%s': fstat() falhou: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Falha ao abrir arquivo '%s': fdopen() falhou: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Falha ao renomear arquivo '%s' para '%s': g_rename() falhou: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Falha ao criar arquivo '%s': %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Falha ao abrir arquivo '%s' para escrita: fdopen() falhou: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Falha ao escrever no arquivo '%s': fwrite() falhou: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Falha ao fechar arquivo '%s': fclose() falhou: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "O arquivo '%s' não pôde ser removido: g_unlink() falhou: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Modelo '%s' inválido, não deveria conter um '%s'"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Modelo '%s' não contém XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Falha ao ler vínculo simbólico '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Vínculos simbólicos não são suportados"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Não foi possível abrir conversor de `%s' para `%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"Não foi possível fazer uma leitura em bruto em g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Dados residuais não convertidos no buffer de leitura"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Canal termina num caractere parcial"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+"Não foi possível fazer uma leitura em bruto de g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Falha ao abrir arquivo '%s': open() falhou: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Falha ao mapear arquivo '%s': mmap() falhou: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Erro na linha %d car %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Erro na linha %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Entidade '&;' vazia vista; as entidades válidas são: &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Caractere '%s' não é válido no início do nome da entidade; o caractere & "
+"inicia uma entidade; se este 'e' comercial não é suposto ser uma entidade, "
+"escape-o como &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Caractere '%s' não é válido dentro de um nome de entidade"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Nome de entidade '%s' não é conhecido"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entidade não termina com um ponto e vírgula; provavelmente você utilizou um "
+"'e' comercial sem desejar iniciar uma entidade - mascare-o com &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Falha ao analisar '%-.*s', que deveria ter sido um dígito dentro de uma "
+"referência de caractere (&#234; por exemplo) - talvez o dígito seja grande "
+"demais"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Referência de caractere '%-.*s' não codifica um caractere permitido"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+"Referência de caractere vazia; deveria incluir um dígito tal como &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Referência de caractere não terminou com um ponto e vírgula; provavelmente "
+"utilizou um caracter 'e' comercial sem desejar iniciar uma entidade - "
+"mascare-o com &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Referência de entidade inacabada"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Referência de caractere inacabada"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Texto codificado em UTF-8 inválido"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Documento tem de começar com um elemento (ex. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' não é um caractere válido após um caractere '<'; não poderá começar um "
+"nome de elemento"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Caractere estranho '%s', esperava-se um caractere '>' para terminar a tag "
+"inicial do elemento '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Caractere estranho '%s', esperava-se um '=' após o nome do atributo '%s' do "
+"elemento '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Caractere estranho '%s', esperava-se um caractere '>' ou '/' para terminar a "
+"tag inicial do elemento '%s', ou opcionalmente um atributo; talvez tenha "
+"utilizado um caractere inválido no nome de atributo"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Caractere estranho '%s', esperava-se uma aspa aberta após o sinal de igual "
+"ao atribuir o valor ao atributo '%s' do elemento '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' não é um caractere válido após os caracteres '</'; '%s' não poderá "
+"começar o nome de um elemento"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' não é um caractere válido após o nome do elemento de fecho '%s'; o "
+"caractere permitido é '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Elemento '%s' foi fechado, nenhum elemento está atualmente aberto"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Elemento '%s' foi fechado, mas o elemento atualmente aberto é '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Documento estava vazio ou apenas continha espaços"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Documento terminou inesperadamente logo após um menor que '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Documento terminou inesperadamente com elementos ainda abertos - '%s' foi o "
+"último elemento aberto"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Documento terminou inesperadamente, esperava-se ver um maior que '>' a "
+"terminar a tag <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Documento terminou inesperadamente dentro de um nome de elemento"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Documento terminou inesperadamente dentro de um nome de atributo"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+"Documento terminou inesperadamente dentro de uma tag de abertura de elemento."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Documento terminou inesperadamente após o sinal de igual que se seguiu a um "
+"nome de atributo; nenhum valor de atributo"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Documento terminou inesperadamente dentro de um valor de atributo"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Documento terminou inesperadamente dentro da tag de fechamento do elemento '%"
+"s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Documento terminou inesperadamente dentro de um comentário ou instrução de "
+"processamento"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Erro na linha %d car %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Referência de entidade inacabada"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Texto citado não começa com uma aspa"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Aspa sem par na linha de comando ou outro texto de consola citado"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Texto terminou logo após um caractere '\\'. (O texto era '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Texto terminou antes da aspa equivalente ter sido encontrada para %c. (texto "
+"era '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Texto estava vazio (ou apenas continha espaços)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Falha ao ler dados de processo filho"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Falha ao criar canal para comunicar com com processo filho (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Falha ao ler de canal filho (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Falha ao ir para diretório '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Falha ao executar processo filho (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Nome de programa inválido: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "String inválida no vetor de argumentos em %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "String inválida no ambiente: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Diretório de trabalho inválido: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Falha ao executar programa auxiliar (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Erro inesperado no g_io_channel_win32_poll() ao ler dados de um processo "
+"filho"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Falha ao ler dados de processo filho (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Erro inesperado no select() ao ler dados de processo filho (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Erro inesperado em waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Falha no fork (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Falha ao executar processo filho \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Falha ao redireccionar saida ou entrada do processo filho (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Falha no fork de processo filho (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Erro desconhecido ao executar processo filho \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Falha ao ler dados suficientes de canal pid do filho (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Caractere fora do limite para UTF-8 "
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Sequência inválida na conversão da entrada"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Caractere fora do limite para UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Uso:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPÇÕES...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Opções de Ajuda:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Exibir opções de ajuda"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Exibir todas as opções de ajuda"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Opções de Aplicação:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Não foi possível analisar o valor inteiro '%s' para %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Valor inteiro '%s' para %s fora dos limites"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+"Não foi possível analisar o ponto flutuante com dupla precisão '%s' para %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Ponto flutuante com dupla precisão '%s' para %s fora dos limites"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Erro ao ler a opção %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Falta argumento para %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Opção %s desconhecida"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+"Um arquivo de chave válido não pôde ser encontrado nos diretórios de dados"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Não é um arquivo comum"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Arquivo vazio"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Arquivo de chave contém a linha '%s' que não é um par chave-valor, grupo ou "
+"comentário"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Nome de programa inválido: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Arquivo de chave não começa com um grupo"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Nome de programa inválido: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Arquivo de chave contém codificação '%s' não suportada"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Arquivo de chave não tem grupo '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Arquivo de chave não tem chave '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Arquivo de chave contém chave '%s' com valor '%s' que não é UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Arquivo de chave contém chave '%s' que tem valor que não pode ser "
+"interpretado."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Arquivo de chave contém chave '%s' no grupo '%s' que tem valor que não pode "
+"ser interpretado."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Arquivo de chave não tem chave '%s' no grupo '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Arquivo de chave contém caractere de escape no fim da linha"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Arquivo de chave contém seqüência de escape '%s' inválida"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "O valor '%s' não pode ser interpretado como um número."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Valor inteiro '%s' fora dos limites"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "O valor '%s' não pode ser interpretado como ponto flutuante."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "O valor '%s' não pode ser interpretado como um booleano."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Falha ao alterar o modo do arquivo: fork() falhou: %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Falha ao alterar o modo do arquivo: waitpid() falhou: %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Falha ao alterar o modo do arquivo: chmod() falhou: %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr ""
+#~ "Falha ao alterar o modo do arquivo: O filho foi finalizado com o sinal: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr ""
+#~ "Falha ao alterar o modo do arquivo: O filho foi finalizado de modo anormal"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Conversão do conjunto de caracteres `%s' para `%s' não suportado"
diff --git a/trunk/po/ro.po b/trunk/po/ro.po
new file mode 100644
index 000000000..ad43a6653
--- /dev/null
+++ b/trunk/po/ro.po
@@ -0,0 +1,936 @@
+# Romanian translation for glib
+# Copyright (C) 2001 - 2007 Free Software Foundation, Inc.
+# Marius Andreiana <mandreiana@yahoo.com>, 2001.
+# Mişu Moldovan <dumol@gnome.ro>, 2004 - 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-03-10 23:47+0200\n"
+"Last-Translator: Mişu Moldovan <dumol@gnome.ro>\n"
+"Language-Team: Română <gnomero-list@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Nu se aştepta un atribut „%s” pentru elementul „%s”"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Atributul „%s” al elementului „%s” nu a putut fi găsit"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "S-a primit eticheta „%s”, se aştepta eticheta „%s”"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Nu se aştepta eticheta „%s” în „%s”"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Nu s-a găsit un fişier valid cu favorite în directoarele de date"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Un favorit pentru URI-ul „%s” există deja"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Nu s-a găsit nici un favorit pentru URI-ul „%s”"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Nu există un tip MIME definit în favoritul URI-ului „%s”"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Nu există un indicator privat definit în favoritul URI-ului „%s”"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Nu există grupuri definite în favoritul URI-ului „%s”"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+"Nu există o aplicaţie cu numele „%s” înregistrată în favoritul pentru „%s”"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Nu s-a putut expanda linia de comandă „%s” cu URI-ul %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Conversia de la setul de caractere „%s” la „%s” nu este suportată"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Nu s-a putut iniţia conversia de la „%s” la „%s”"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Secvenţă de octeţi invalidă în intrarea conversiei"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Eroare în timpul conversiei: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Secvenţă parţială de caractere la sfârşitul intrării"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Nu se poate converti rezerva „%s” la setul de caractere „%s”"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI-ul „%s” nu este un URI absolut folosind schema „fişier”"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "URI-ul fişierului local „%s” nu poate include un „#”"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI-ul „%s” este invalid"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Gazda URI-ului „%s” este invalidă"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI-ul „%s” conţine caractere „escaped” invalide"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Calea „%s” nu este o cale absolută"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Nume gazdă invalid"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Eroare la deschiderea directorului „%s”: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Nu s-au putut aloca %lu octeţi pentru citirea fişierului „%s”"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Eroare la citirea fişierului „%s”: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Nu s-a putut citi din fişierul „%s”: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Nu s-a putut deschide fişierul „%s”: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Nu s-au putut obţine atributele fişierului „%s”: fstat() a eşuat: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Nu s-a putut deschide fişierul „%s”: fdopen() a eşuat: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Nu s-a putut redenumi fişierul „%s” în „%s”: g_rename() a eşuat: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Nu s-a putut crea fişierul „%s”: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"Nu s-a putut deschide fişierul „%s” pentru scriere, fdopen() a eşuat: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Nu s-a putut scrie fişierul „%s”: fwrite() a eşuat: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Nu s-a putut închide fişierul „%s”: fclose() a eşuat: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Fişierul existent „%s” nu a putut fi şters: g_unlink() a eşuat: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Şablonul „%s” este invalid, n-ar trebui să conţină un „%s”"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Şablonul „%s” nu conţine XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Nu s-a putut citi legătura simbolică „%s”: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Legăturile simbolice nu sunt suportate"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Nu s-a putut iniţia conversia de la „%s” la „%s”: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Nu s-au putut citi datele brute din g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Date neconvertite rămase în memoria tampon pentru citire"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Canalul se termină cu un caracter parţial"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Nu s-au putut citi datele brute din g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Nu s-a putut deschide fişierul „%s”: open() a eşuat: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Nu s-a putut mapa fişierul „%s”: mmap() a eşuat: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Eroare în linia %d, caracterul %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Eroare în linia %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"S-a depistat o entitate nulă „&;”. Entităţile valide sunt: &amp; &quot; &lt; "
+"&gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Caracterul „%s” nu este valid la începutul numelui unei entităţi. Caracterul "
+"„&” e cel ce începe o entitate. Dacă acest ampersand nu ar trebui să fie "
+"într-o entitate, utilizaţi &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Caracterul „%s” nu este valid în cadrul unui nume de entitate"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Numele entităţii „%s” nu este cunoscut"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entitatea nu s-a terminat cu punct şi virgulă. Probabil că aţi folosit un "
+"caracter ampersand fără intenţia de a începe o entitate. Utilizaţi &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Nu s-a putut procesa „%-.*s”, care ar fi trebui să fie o cifră într-un "
+"caracter referinţă (de exemplu &#234;). Poate cifra este prea mare"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Referinţa caracterului „%-.*s” nu codează un caracter permis"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Referinţă caracter goală. Ar trebui să includă o cifră precum &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Referinţa caracter nu s-a terminat cu punct şi virgulă. Probabil aţi folosit "
+"un caracter ampersand fără intenţia de a începe o entitate. Utilizaţi &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Referinţă neterminată la o entitate"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Referinţă caracter neterminată"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Text codat UTF-8 invalid"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Documentul trebuie să înceapă cu un element (de ex. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"„%s” nu este un caracter valid după caracterul „<”. Nu poate începe cu "
+"numele unui element"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Caracter neobişnuit „%s”, se aştepta un „>” pentru a termina eticheta de "
+"început a elementului „%s”"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Caracter neobişnuit „%s”, se aştepta un „=” după numele atributului „%s” al "
+"elementului „%s”"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Caracter neobişnuit „%s”, se aştepta un „>” sau „/” pentru a termina "
+"eticheta de început a elementului „%s” sau opţional un atribut. Poate aţi "
+"utilizat un caracter invalid în numele atributului"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Caracter neobişnuit „%s”, se aşteptau ghilimele de deschidere după semnul "
+"egal pentru a da valoarea atributului „%s” al elementului „%s”"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"„%s” nu este un caracter valid după caracterele „</”. „%s” nu poate începe "
+"un nume de element"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"„%s” nu este un caracter valid după numele elementului de închidere „%s”. "
+"Caracterul permis este „>”"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Elementul „%s” a fost închis, nici un element nu este curent deschis"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Elementul „%s” a fost închis, dar elementul deschis curent este „%s”"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Documentul era gol sau conţinea doar spaţiu gol"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Documentul s-a terminat în mod neaşteptat imediat după un caracter „<”"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Documentul s-a terminat în mod neaşteptat cu unele elemente încă deschise. „%"
+"s” a fost ultimul element deschis"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Documentul s-a terminat în mod neaşteptat, se aştepta un caracter „>” care "
+"să încheie eticheta <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr ""
+"Documentul s-a terminat în mod neaşteptat în cadrul numelui unui element"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr ""
+"Documentul s-a terminat în mod neaşteptat în cadrul numele unui atribut"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+"Documentul s-a terminat în mod neaşteptat în cadul unei etichete ce "
+"deschidea un element"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Documentul s-a terminat în mod neaşteptat după semnul egal ce urma unui nume "
+"atribut. Nici o valoare pentru atribut"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+"Documentul s-a terminat în mod neaşteptat în cadrul valorii unui atribut"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Documentul s-a terminat în mod neaşteptat în cadrul etichetei de închidere a "
+"elementului „%s”"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Documentul s-a terminat în mod neaşteptat în cadrul unui comentariu sau a "
+"unei instrucţiuni de procesare"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Eroare în linia %d, caracterul %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Referinţă neterminată la o entitate"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Textul citat nu începe cu un semn de citare"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Semn de citare nepereche în linia de comandă sau text „shell-quoted”"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Textul s-a terminal imediat după un caracter „\\” (textul era „%s”)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Textul s-a terminal înainte de semnul de citare pereche pentru %c (textul "
+"era „%s”)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Textul era gol (sau conţinea doar spaţiu gol)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Nu s-au putut citi datele de la procesul copil"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+"Nu s-a putut crea conectorul „pipe” pentru comunicarea cu procesul copil (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Nu s-au putut citi datele din conectorul „pipe” copil (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Nu s-a putut schimba directorul curent în directorul „%s” (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Nu s-a putut executa procesul copil (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Nume invalid de program: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Secvenţă invalidă în vectorul argumentului la %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Secvenţă invalidă în variabilele de mediu: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Director curent invalid: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Nu s-a putut pornit programul asociat (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Eroare neaşteptată în g_io_channel_win32_poll() la citirea datelor de la "
+"procesul copil"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Nu s-au putut citi datele din procesul copil (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Eroare neaşteptată în select() la citirea datelor din procesul copil (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Eroare neaşteptată în waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Nu s-a putut clona procesul (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Nu s-a putut executa procesul „%s” (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Nu s-a putut redirecta ieşirea sau intrarea procesului copil (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Nu s-a putut clona procesul copil (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Eroare necunoscută la lansarea în execuţie a procesului copil „%s”"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Nu s-au putut citi date suficiente de la procesul copil (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Caracter în afara limitelor standardului UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Secvenţă invalidă în intrarea conversiei"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Caracter în afara limitelor standardului UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Utilizare:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPŢIUNE...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Opţiuni ajutor:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Arată opţiunile de ajutor"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Arată toate opţiunile de ajutor"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Opţiuni aplicaţie:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Nu se poate prelucra valoarea întregului „%s” pentru %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Valoarea întregului „%s” pentru %s este în afara limitelor"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Nu se poate prelucra valoarea dublă „%s” pentru %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Valoarea dublă „%s” pentru %s este în afara limitelor"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Eroare la prelucrarea opţiunii %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Argument lipsă pentru %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Opţiune necunoscută %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Nu s-a găsit un fişier cheie în directoarele de date"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Nu este un fişier obişnuit"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Fişierul este gol"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Fişierul-cheie conţine linia „%s” care nu este o pereche cheie-valoare, un "
+"grup sau un comentariu"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Nume invalid de grup: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Fişierul cheie nu începe cu un grup"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Nume invalid de cheie: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Fişierul cheie are o codare nesuportată de tip „%s”"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Fişierul cheie nu are grupul „%s”"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Fişierul cheie nu are cheie „%s”"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Fişierul cheie conţine cheia „%s” cu valoarea „%s” care nu este UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "Fişierul cheie conţine cheia „%s” care are o valoare neinterpretabilă."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Fişierul cheie conţine cheia „%s” în grupul „%s” care are o valoare ce nu "
+"poate fi interpretată"
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Fişierul cheie nu are cheia „%s” în grupul „%s”"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Fişieul cheie conţine caractere „escape” la sfârşit de linie"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "URI-ul „%s” conţine secvenţe „escaped” invalide"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Valoarea „%s” nu poate fi interpretată ca un număr."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Valoarea întregului „%s” este în afara limitelor"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Valoarea „%s” nu poate fi interpretată ca un număr flotant."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Valoarea „%s” nu poate fi interpretată ca o valoare booleană."
diff --git a/trunk/po/ru.po b/trunk/po/ru.po
new file mode 100644
index 000000000..cce4eeef7
--- /dev/null
+++ b/trunk/po/ru.po
@@ -0,0 +1,956 @@
+# translation of glib.HEAD.po to Russian
+# Copyright (C) 1998-2002, 2004, 2006 Free Software Foundation, Inc.
+#
+# Valek Filippov <frob@df.ru>, 2001-2002.
+# Dmitry G. Mastrukov <dmitry@taurussoft.org>, 2002-2003.
+# Leonid Kanter <leon@asplinux.ru>, 2004, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-02-01 18:37+0200\n"
+"Last-Translator: Leonid Kanter <leon@asplinux.ru>\n"
+"Language-Team: Russian <gnome-cyr@gnome.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Встретился лишний символ \"%s\", ожидался символ \"=\" после имени атрибута "
+"\"%s\" элемента \"%s\""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Не удается найти действительный файл ключа в каталогах данных"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Произошёл сбой при чтении символической ссылки \"%s\": %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Преобразование из набора символов \"%s\" в \"%s\" не поддерживается"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Не удалось открыть преобразователь из \"%s\" в \"%s\""
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr ""
+"Недопустимая последовательность байтов для преобразования содержится во "
+"входной строке"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Произошла ошибка при преобразовании: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Неполный символ содержится в конце входной строки"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr ""
+"Невозможно корректно преобразовать символ \"%s\" в символ из набора \"%s\""
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+"URI \"%s\" не является абсолютным идентификатором при использовании схемы "
+"\"file\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr ""
+"Идентификатор URI локального файла \"%s\" не может включать символ \"#\""
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "Идентификатор URI \"%s\" недопустим"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Имя узла недопустимо в идентификаторе URI \"%s\""
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Идентификатор URI \"%s\" содержит недопустимо экранированный символ"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Путь \"%s\" не является абсолютным"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Имя узла недопустимо"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Произошла ошибка при открытии каталога \"%s\": %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Не удалось распределить %lu байтов для прочтения файла \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Произошла ошибка при чтении файла \"%s\": %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Сбой при чтении из файла \"%s\": %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Сбой при открытии файла \"%s\": %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Сбой при получении аттрибутов файла \"%s\": сбой в функции fstat(): %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Сбой при открытии файла \"%s\": сбой в функции fdopen(): %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Не удается переименовать файл '%s' в '%s': сбой функции g_rename(): %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Произошёл сбой при создании файла \"%s\": %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Не удается открыть файл \"%s\" для записи: сбой в функции fdopen(): %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Не удается записать файл \"%s\": сбой в функции fwrite(): %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Не удается закрыть файл \"%s\": сбой в функции fclose(): %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Существующий файл '%s' не может быть удалён: сбой g_unlink(): %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Шаблон \"%s\" недопустим: он не должен содержать \"%s\""
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Шаблон \"%s\" не заканчивается на XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Произошёл сбой при чтении символической ссылки \"%s\": %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Символические ссылки не поддерживаются"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Не удалось открыть преобразователь из \"%s\" в \"%s\": %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"Невозможно выполнить непосредственное чтение в функции "
+"g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Непреобразованные данные остались в буфере чтения "
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Канал закрывается на неполном символе"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+"Невозможно выполнить непосредственное чтение в функции "
+"g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Не удалось открыть файл \"%s\": сбой в функции fdopen(): %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Не удается отразить файл \"%s\": сбой в функции mmap(): %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Ошибка в строке %d на символе %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Ошибка в строке %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Обнаружена пустая сущность \"&;\"; допустимыми сущностями являются: &amp; "
+"&quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Символ \"%s\" недопустим в начале имени сущности; символ \"&\" начинает "
+"последовательность; если этот символ не должен быть частью сущности, то "
+"экранируйте его сущностью &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Символ \"%s\" недопустим внутри названия сущности"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Наименование сущности \"%s\" неизвестно"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Сущность не заканчивается точкой с запятой; похоже, что символ & был "
+"использован не для обозначения начала сущности - экранируйте его как &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Сбой при разборе строки '%-.*s', где должно быть число внутри ссылки на "
+"символ (&#234; например): возможно, номер слишком велик"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Ссылка на символ '%-.*s' не определяет допустимый символ"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Ссылка на символ пуста; она должна включать номер, например &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Ссылка на символ не окончивается на точку с запятой; похоже, символ \"&\" "
+"был использован не для обозначения начала сущности - экранируйте его как "
+"&amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Ссылка на сущность не закончена"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Ссылка на символ не закончена"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Текст закодирован как UTF-8 недопустимым образом"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Документ должен начинаться с элемента (например <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"Символ \"%s\" является недопустим символом, следующим за символом \"<\"; "
+"этот символ не может начинать имя элемента"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Встретился лишний символ \"%s\", ожидался символ \">\" для закрытия "
+"начального тэга элемента \"%s\""
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Встретился лишний символ \"%s\", ожидался символ \"=\" после имени атрибута "
+"\"%s\" элемента \"%s\""
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Встретлся лишний символ \"%s\", ожидались символы \">\" или \"/\" для "
+"закрытия начального тэга элемента \"%s\" или дополнительный атрибут; "
+"возможно, был использован недопустимый символ в имени атрибута"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Встретился лишний символ \"%s\", ожидалась открывающая двойная кавычка после "
+"знака равенства при присваивании значения атрибуту \"%s\" элемента \"%s\""
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"Символ \"%s\" является недопустимым символом при следовании за символами \"</"
+"\"; символ \"%s\" не может начинать имя элемента"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"Символ \"%s\" является недопустимым символом при закрытии имени элемента \"%s"
+"\"; допутимым символом является \">\""
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr ""
+"Элемент \"%s\" был закрыт, ни один элемент в настоящий момент не открыт"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"Элемент \"%s\" был закрыт, но открытым в настоящий момент является элемент "
+"\"%s\""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Документ был пуст или содержал только пробелы"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Документ непредвиденно окончился сразу же после открывающей угловой скобки "
+"\"<\""
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Документ непредвиденно окончился, когда элементы были ещё открыты - \"%s\" "
+"был последним открытым элементом"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Документ непредвиденно окончился, ожидается закрывающая тэг угловая скобка <%"
+"s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Документ непредвиденно окончился внутри имени элемента"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Документ непредвиденно окончился внутри имени атрибута"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Документ непредвиденно окончился внутри открывающего элемент тэга"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Документ непредвиденно окончился после знака равенства, следующего за именем "
+"атрибута; значение атрибута не указано"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Документ непредвиденно окончился внутри значения атрибута"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Документ непредвиденно окончился внутри закрывающего элемент тэга \"%s\""
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Документ непредвиденно окончился внутри комментария или инструкции обработки"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Ошибка в строке %d на символе %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Ссылка на сущность не закончена"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Текст в кавычках не начинается с символа кавычки"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Обнаружена несоответствующая кавычка в командной строке или ином тексте "
+"оболочки"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Текст закончился сразу после символа \"\\\". (Текст был \"%s\")"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Текст закончился перед соответствующей кавычкой для %c. (Текст был \"%s\")"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Текст был пуст (или содержал только пробелы)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Сбой при чтении данных из процесса-потомка"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Сбой при создании канала для сообщения с процессом-потомком (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Сбой при чтении данных из канала потомка (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Сбой при смене каталога \"%s\" (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Сбой при выполнении процесса-потомка (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Неверное имя программы: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Неверная строка в векторе аргумента в %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Неверная строка в окружении: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Неверный рабочий каталог: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Сбой при выполнении вспомогательной программы (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Произошла непредвиденная ошибка в функции g_io_channel_win32_poll() при "
+"чтении данных из процесса-потомка"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Сбой при чтении данных из процесса-потомка (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Произошла непредвиденная ошибка в функции select() при чтении данных из "
+"процесса-потомка (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Произошла непредвиденная ошибка в функции waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Сбой при ответвлении (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Сбой при выполнении процесса-потомка \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Сбой при перенаправлении вывода или ввода процесса-потомка (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Сбой при ответвлении процесса-потомка (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Произошла неизвестная ошибка при выполнении процесса-потомка \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"Сбой при чтении нужного количества данных из канала процесса-потомка (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Символ находится вне диапазона для UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr ""
+"Недопустимая последовательность для преобразования обнаружена во входной "
+"строке"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Символ находится вне диапазона для UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Использование:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Параметры справки:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Показать параметры справки"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Показать все параметры справки"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Применимые параметры:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Не удается разобрать целое значение '%s' для %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Целое значение '%s' для %s выходит за пределы"
+
+#: glib/goption.c:831
+#, fuzzy, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Не удается разобрать целое значение '%s' для %s"
+
+#: glib/goption.c:839
+#, fuzzy, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Целое значение '%s' для %s выходит за пределы"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Ошибка разбора параметра %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Отсутствует аргумент для %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Неизвестный параметр %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Не удается найти действительный файл ключа в каталогах данных"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Не является обычным файлом"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Файл пуст"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Файл ключа содержит строку '%s', которая не является ключом - парой величин, "
+"группой или комментарием"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Неверное имя программы: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Файл ключа не начинается с группы"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Неверное имя программы: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Файл ключа содержит неподдерживаемую кодировку '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Файл ключей не имеет группы '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Файл ключа не содержит ключ '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Файл ключа содержит ключ '%s', значение которого '%s' не в кодировке UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Файл ключа содержит ключ '%s', значение которого не может быть "
+"интерпретировано."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Файл ключа содержит ключ '%s' в группе '%s', значение которого не может быть "
+"интерпретировано."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Файл ключа не имеет ключа '%s' в группе '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Файл ключа содержит символ escape в конце файла"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Файл ключа содержит неверную escape-последовательность '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Значение '%s' не может быть интерпретировано как числовое."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Целое значение '%s' выходит за пределы"
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Значение '%s' не может быть интерпретировано как числовое."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Значение '%s' не может быть интерпретировано как булево."
diff --git a/trunk/po/rw.po b/trunk/po/rw.po
new file mode 100644
index 000000000..3c99dcc41
--- /dev/null
+++ b/trunk/po/rw.po
@@ -0,0 +1,936 @@
+# translation of glib to Kinyarwanda.
+# Copyright (C) 2005 Free Software Foundation, Inc.
+# This file is distributed under the same license as the glib package.
+# Steve Murphy <murf@e-tools.com>, 2005
+# Steve performed initial rough translation from compendium built from translations provided by the following translators:
+# Philibert Ndandali <ndandali@yahoo.fr>, 2005.
+# Viateur MUGENZI <muvia1@yahoo.fr>, 2005.
+# Noëlla Mupole <s24211045@tuks.co.za>, 2005.
+# Carole Karema <karemacarole@hotmail.com>, 2005.
+# JEAN BAPTISTE NGENDAHAYO <ngenda_denis@yahoo.co.uk>, 2005.
+# Augustin KIBERWA <akiberwa@yahoo.co.uk>, 2005.
+# Donatien NSENGIYUMVA <ndonatienuk@yahoo.co.uk>, 2005..
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib 2.12\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2005-03-28 19:34-0700\n"
+"Last-Translator: Steve Murphy <murf@e-tools.com>\n"
+"Language-Team: Kinyarwanda <translation-team-rw@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Inyuguti Ikitezwe: a Nyuma Ikiranga Izina: Bya Ikigize:"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Urufunguzo IDOSIYE OYA Byabonetse in Ibyatanzwe"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Kuri Gusoma Ihuza"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, fuzzy, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Bivuye Inyuguti Gushyiraho Kuri ni OYA"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "OYA Gufungura Bivuye Kuri"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, fuzzy, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Bayite in Ihindurangero Iyinjiza"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, fuzzy, c-format
+msgid "Error during conversion: %s"
+msgstr "Ihindurangero"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, fuzzy, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Inyuguti ku Impera Bya Iyinjiza"
+
+#: glib/gconvert.c:913
+#, fuzzy, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "GUHINDURA Kuri"
+
+#: glib/gconvert.c:1727
+#, fuzzy, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "ni OYA ikoresha IDOSIYE Igishusho"
+
+#: glib/gconvert.c:1737
+#, fuzzy, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "IDOSIYE Gicurasi OYA Gushyiramo a"
+
+#: glib/gconvert.c:1754
+#, fuzzy, c-format
+msgid "The URI '%s' is invalid"
+msgstr "ni Sibyo"
+
+#: glib/gconvert.c:1766
+#, fuzzy, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Izina ry'inturo: Bya ni Sibyo"
+
+#: glib/gconvert.c:1782
+#, fuzzy, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Kirimo Inyuguti"
+
+#: glib/gconvert.c:1877
+#, fuzzy, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "ni OYA Inzira"
+
+#: glib/gconvert.c:1887
+#, fuzzy, c-format
+msgid "Invalid hostname"
+msgstr "Izina ry'inturo:"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, fuzzy, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Gufungura %s%S bushyinguro"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, fuzzy, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "OYA Bayite Kuri Gusoma IDOSIYE"
+
+# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text
+#: glib/gfileutils.c:572
+#, fuzzy, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Ikosa mu gusoma idosiye"
+
+#: glib/gfileutils.c:654
+#, fuzzy, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Kuri Gusoma Bivuye IDOSIYE"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, fuzzy, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Kuri Gufungura IDOSIYE"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, fuzzy, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Kuri Kubona Ibiranga Bya IDOSIYE Byanze"
+
+#: glib/gfileutils.c:756
+#, fuzzy, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Kuri Gufungura IDOSIYE Byanze"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Kuri Guhindura izina IDOSIYE Kuri Byanze"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, fuzzy, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Kuri Kurema IDOSIYE"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Kuri Gufungura IDOSIYE kugirango Byanze"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Kuri IDOSIYE Byanze"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Kuri Gufunga IDOSIYE Byanze"
+
+#: glib/gfileutils.c:1107
+#, fuzzy, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "IDOSIYE OYA Cyavanyweho Byanze"
+
+#: glib/gfileutils.c:1351
+#, fuzzy, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Sibyo OYA a"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Impera Na:"
+
+#: glib/gfileutils.c:1839
+#, fuzzy, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Kuri Gusoma Ihuza"
+
+#: glib/gfileutils.c:1860
+#, fuzzy, c-format
+msgid "Symbolic links not supported"
+msgstr "amahuza OYA"
+
+#: glib/giochannel.c:1152
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "OYA Gufungura Bivuye Kuri"
+
+#: glib/giochannel.c:1497
+#, fuzzy, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "a Gusoma in"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, fuzzy, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Ibyatanzwe in Gusoma"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, fuzzy, c-format
+msgid "Channel terminates in a partial character"
+msgstr "in a Bituzuye Inyuguti"
+
+#: glib/giochannel.c:1687
+#, fuzzy, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "a Gusoma in"
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Kuri Gufungura IDOSIYE Byanze"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Kuri Gufungura IDOSIYE Byanze"
+
+#: glib/gmarkup.c:226
+#, fuzzy, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "ku Umurongo INYUGUTI"
+
+#: glib/gmarkup.c:324
+#, fuzzy, c-format
+msgid "Error on line %d: %s"
+msgstr "ku Umurongo"
+
+#: glib/gmarkup.c:428
+#, fuzzy
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr "Byemewe"
+
+#: glib/gmarkup.c:438
+#, fuzzy, c-format
+msgid ""
+"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 &amp;"
+msgstr "ni OYA Byemewe ku Gutangira Bya Izina: Inyuguti NIBA iyi Kuri Nka"
+
+#: glib/gmarkup.c:472
+#, fuzzy, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "ni OYA Byemewe Mo Imbere Izina:"
+
+#: glib/gmarkup.c:509
+#, fuzzy, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Izina: ni OYA"
+
+#: glib/gmarkup.c:520
+#, fuzzy
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr "OYA Impera Na: a Akabago n'Akitso Inyuguti Kuri Gutangira Nka"
+
+#: glib/gmarkup.c:573
+#, fuzzy, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr "Kuri a Mo Imbere a Inyuguti Indango kugirango Urugero ni Binini"
+
+#: glib/gmarkup.c:598
+#, fuzzy, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Indango OYA a Inyuguti"
+
+#: glib/gmarkup.c:613
+#, fuzzy
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Inyuguti Indango Gushyiramo a Nka"
+
+#: glib/gmarkup.c:623
+#, fuzzy
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr "Indango OYA Impera Na: a Akabago n'Akitso Inyuguti Kuri Gutangira Nka"
+
+#: glib/gmarkup.c:709
+#, fuzzy
+msgid "Unfinished entity reference"
+msgstr "Indango"
+
+#: glib/gmarkup.c:715
+#, fuzzy
+msgid "Unfinished character reference"
+msgstr "Inyuguti Indango"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+#, fuzzy
+msgid "Invalid UTF-8 encoded text"
+msgstr "8 Umwandiko"
+
+#: glib/gmarkup.c:1058
+#, fuzzy
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "g."
+
+#: glib/gmarkup.c:1098
+#, fuzzy, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr "'%s'ni OYA a Byemewe Inyuguti a Inyuguti Gicurasi OYA Ikigize: Izina:"
+
+#: glib/gmarkup.c:1162
+#, fuzzy, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Inyuguti Ikitezwe: a Inyuguti Kuri Impera Gutangira Itagi: Bya Ikigize:"
+
+#: glib/gmarkup.c:1251
+#, fuzzy, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr "Inyuguti Ikitezwe: a Nyuma Ikiranga Izina: Bya Ikigize:"
+
+#: glib/gmarkup.c:1293
+#, fuzzy, c-format
+msgid ""
+"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"
+msgstr ""
+"Inyuguti Ikitezwe: a Cyangwa Inyuguti Kuri Impera Gutangira Itagi: Bya "
+"Ikigize: Cyangwa Ikiranga Sibyo Inyuguti in Ikiranga Izina:"
+
+#: glib/gmarkup.c:1382
+#, fuzzy, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Inyuguti Ikitezwe: Gufungura Gushyiraho akugarizo Ikimenyetso Nyuma "
+"IKIMENYETSO Ryari: Agaciro kugirango Ikiranga Bya Ikigize:"
+
+#: glib/gmarkup.c:1527
+#, fuzzy, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr "'%s'ni OYA a Byemewe Inyuguti Inyuguti Gicurasi OYA Ikigize: Izina:"
+
+#: glib/gmarkup.c:1567
+#, fuzzy, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr "'%s'ni OYA a Byemewe Inyuguti Gufunga Ikigize: Izina: Inyuguti ni"
+
+#: glib/gmarkup.c:1578
+#, fuzzy, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Oya Ikigize: ni Gufungura"
+
+#: glib/gmarkup.c:1587
+#, fuzzy, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Gufungura Ikigize: ni"
+
+#: glib/gmarkup.c:1753
+#, fuzzy
+msgid "Document was empty or contained only whitespace"
+msgstr "ubusa Cyangwa"
+
+#: glib/gmarkup.c:1767
+#, fuzzy
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Nyuma Gufungura Imfuruka"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, fuzzy, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr "Na: Ibintu Gufungura Iheruka Ikigize:"
+
+#: glib/gmarkup.c:1783
+#, fuzzy, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr "Ikitezwe: Kuri a Gufunga Imfuruka Itagi:"
+
+#: glib/gmarkup.c:1789
+#, fuzzy
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Mo Imbere Ikigize: Izina:"
+
+#: glib/gmarkup.c:1794
+#, fuzzy
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Mo Imbere Ikiranga Izina:"
+
+#: glib/gmarkup.c:1799
+#, fuzzy
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Mo Imbere Ikigize: Gufungura%S Itagi:"
+
+#: glib/gmarkup.c:1805
+#, fuzzy
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr "Nyuma IKIMENYETSO Ikiranga Izina: Oya Ikiranga Agaciro"
+
+#: glib/gmarkup.c:1812
+#, fuzzy
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Mo Imbere Ikiranga Agaciro"
+
+#: glib/gmarkup.c:1827
+#, fuzzy, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Mo Imbere Gufunga Itagi: kugirango Ikigize:"
+
+#: glib/gmarkup.c:1833
+#, fuzzy
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Mo Imbere a Icyo wongeraho Cyangwa Inonosora"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "ku Umurongo INYUGUTI"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Indango"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, fuzzy, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Umwandiko Na: a Gusubiramo ibyavuzwe Ikimenyetso"
+
+#: glib/gshell.c:160
+#, fuzzy, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Gusubiramo ibyavuzwe Ikimenyetso in Komandi: Umurongo Cyangwa Ikindi "
+"Igikonoshwa Umwandiko"
+
+#: glib/gshell.c:538
+#, fuzzy, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Nyuma a Inyuguti Umwandiko"
+
+#: glib/gshell.c:545
+#, fuzzy, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "Mbere Gushyiraho akugarizo Byabonetse kugirango Umwandiko"
+
+#: glib/gshell.c:557
+#, fuzzy, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "ubusa Cyangwa"
+
+#: glib/gspawn-win32.c:272
+#, fuzzy, c-format
+msgid "Failed to read data from child process"
+msgstr "Kuri Gusoma Ibyatanzwe Bivuye"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, fuzzy, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Kuri Kurema kugirango Na:"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, fuzzy, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Kuri Gusoma Bivuye"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, fuzzy, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Kuri Guhindura>> Kuri bushyinguro"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, fuzzy, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Kuri Gukora"
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "Izina ry'inturo:"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, fuzzy, c-format
+msgid "Invalid string in environment: %s"
+msgstr "in Ihindurangero Iyinjiza"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr "Gufungura %s%S bushyinguro"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Kuri Gukora Porogaramu"
+
+#: glib/gspawn-win32.c:938
+#, fuzzy, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr "Ikosa in Ibyatanzwe Bivuye a"
+
+#: glib/gspawn.c:175
+#, fuzzy, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Kuri Gusoma Ibyatanzwe Bivuye"
+
+#: glib/gspawn.c:307
+#, fuzzy, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Ikosa in Guhitamo Ibyatanzwe Bivuye a"
+
+#: glib/gspawn.c:390
+#, fuzzy, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Ikosa in"
+
+#: glib/gspawn.c:1124
+#, fuzzy, c-format
+msgid "Failed to fork (%s)"
+msgstr "Kuri"
+
+#: glib/gspawn.c:1274
+#, fuzzy, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Kuri Gukora"
+
+#: glib/gspawn.c:1284
+#, fuzzy, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Kuri Ibisohoka Cyangwa Iyinjiza Bya"
+
+#: glib/gspawn.c:1293
+#, fuzzy, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Kuri"
+
+#: glib/gspawn.c:1301
+#, fuzzy, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Ikosa Gukora: %s%s"
+
+#: glib/gspawn.c:1323
+#, fuzzy, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Kuri Gusoma Ibyatanzwe Bivuye"
+
+#: glib/gutf8.c:1024
+#, fuzzy, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Inyuma Bya Urutonde kugirango 8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, fuzzy, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "in Ihindurangero Iyinjiza"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, fuzzy, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Inyuma Bya Urutonde kugirango"
+
+# crashrep/source\all\crashrep.lng:%MSG_CMDLINE_USAGE%.text
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Ikoresha:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr ""
+
+#: glib/goption.c:677
+#, fuzzy
+msgid "Show help options"
+msgstr "Ifashayobora Amahitamo"
+
+#: glib/goption.c:683
+#, fuzzy
+msgid "Show all help options"
+msgstr "Byose Ifashayobora Amahitamo"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr ""
+
+#: glib/goption.c:796 glib/goption.c:866
+#, fuzzy, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Umubare wuzuye Agaciro kugirango"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, fuzzy, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Agaciro kugirango Inyuma Bya Urutonde"
+
+#: glib/goption.c:831
+#, fuzzy, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Umubare wuzuye Agaciro kugirango"
+
+#: glib/goption.c:839
+#, fuzzy, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Agaciro kugirango Inyuma Bya Urutonde"
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Ihindurangero"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, fuzzy, c-format
+msgid "Unknown option %s"
+msgstr "Ihitamo ritazwi:"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Urufunguzo IDOSIYE OYA Byabonetse in Ibyatanzwe"
+
+#: glib/gkeyfile.c:376
+#, fuzzy, c-format
+msgid "Not a regular file"
+msgstr "a Ibisanzwe IDOSIYE"
+
+#: glib/gkeyfile.c:384
+#, fuzzy, c-format
+msgid "File is empty"
+msgstr "Idosiye ni ubusa"
+
+#: glib/gkeyfile.c:746
+#, fuzzy, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"IDOSIYE Kirimo Umurongo ni OYA a Urufunguzo Agaciro Itsinda Cyangwa Icyo "
+"wongeraho"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Izina ry'inturo:"
+
+#: glib/gkeyfile.c:828
+#, fuzzy, c-format
+msgid "Key file does not start with a group"
+msgstr "IDOSIYE OYA Gutangira Na: a Itsinda"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Izina ry'inturo:"
+
+#: glib/gkeyfile.c:881
+#, fuzzy, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "IDOSIYE Kirimo Imisobekere:"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, fuzzy, c-format
+msgid "Key file does not have group '%s'"
+msgstr "IDOSIYE OYA Itsinda"
+
+#: glib/gkeyfile.c:1265
+#, fuzzy, c-format
+msgid "Key file does not have key '%s'"
+msgstr "IDOSIYE OYA Urufunguzo"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, fuzzy, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "IDOSIYE Kirimo Urufunguzo Na: Agaciro ni OYA 8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, fuzzy, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "IDOSIYE Kirimo Urufunguzo Agaciro"
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, fuzzy, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr "IDOSIYE Kirimo Urufunguzo in Itsinda Agaciro"
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, fuzzy, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "IDOSIYE OYA Urufunguzo in Itsinda"
+
+#: glib/gkeyfile.c:3415
+#, fuzzy, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "IDOSIYE Kirimo Inyuguti ku Impera Bya Umurongo"
+
+#: glib/gkeyfile.c:3437
+#, fuzzy, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "IDOSIYE Kirimo Sibyo"
+
+#: glib/gkeyfile.c:3579
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Nka a Umubare"
+
+#: glib/gkeyfile.c:3593
+#, fuzzy, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Agaciro kugirango Inyuma Bya Urutonde"
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Nka a Umubare"
+
+#: glib/gkeyfile.c:3650
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Nka a Icyungo"
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Kuri Gufunga IDOSIYE Byanze"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Kuri IDOSIYE Byanze"
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Kuri Gufunga IDOSIYE Byanze"
+
+#, fuzzy
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Bivuye Inyuguti Gushyiraho Kuri ni OYA"
diff --git a/trunk/po/sk.po b/trunk/po/sk.po
new file mode 100644
index 000000000..6f370a015
--- /dev/null
+++ b/trunk/po/sk.po
@@ -0,0 +1,944 @@
+# translation of glib.HEAD.po to Slovak
+# translation of sk.po to Slovak
+# glib Slovak translation.
+# Copyright (C) 2001, 2002, 2004, 2005 Free Software Foundation, Inc.
+# Stanislav Visnovsky <visnovsky@nenya.ms.mff.cuni.cz>, 2001,2002.
+# Stanislav Visnovsky <visnovsky@kde.org>, 2004.
+# Marcel Telka <marcel@telka.sk>, 2005.
+#
+# $Id: sk.po,v 1.75 2006/08/16 00:44:14 matthiasc Exp $
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2005-10-16 19:30+0200\n"
+"Last-Translator: Marcel Telka <marcel@telka.sk>\n"
+"Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Prebytočný znak '%s'. Bol očakávaný znak '=' za menom atribútu '%s' elementu "
+"'%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Nepodarilo sa nájsť platný súbor kľúčov v dátových adresároch"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Nepodarilo sa prečítať symbolický odkaz '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Prevod zo znakovej sady '%s' do '%s' nie je podporovaný"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Nepodarilo sa otvoriť program na prevod z '%s' do '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Neplatná sekvencia bajtov na vstupe prevodu"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Chyba počas prevodu: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Čiastočná sekvencia znakov na konci vstupu"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Nepodarilo sa previesť náhradné `%s' do kódovej stránky `%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' nie je absolútne URI, používajúce schému \"file\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "URI lokálneho súboru '%s' nesmie obsahovať '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' je neplatné"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "URI hostiteľa '%s' je neplatné."
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' obsahuje neplatne zadané znaky"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Cesta '%s' nie je absolútna"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Neplatné meno hostiteľa"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Chyba pri otváraní priečinku'%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Nepodarilo sa alokovať %lu bajtov pre načítanie súboru \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Chyba pri čítaní súboru '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Nepodarilo sa čítanie súboru '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Nepodarilo sa otvoriť súbor '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Nepodarilo sa získať atribúty súboru '%s': fstat() zlyhala: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Nepodarilo sa otvoriť súbor '%s': fdopen() zlyhala: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Nepodarilo sa premenovať súbor '%s' na '%s': funkcia g_rename() zlyhala: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Nepodarilo sa vytvoriť súbor '%s': %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"Nepodarilo sa otvoriť súbor '%s' pre zápis: funkcia fdopen() zlyhala: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Nepodarilo sa zapísať súbor '%s': funkcia fwrite() zlyhala: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Nepodarilo sa zatvoriť súbor '%s': funkcia fclose() zlyhala: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+"Existujúci súbor '%s' nemohol byť odstránený: funkcia g_unlink() zlyhala: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Šablóna '%s' je neplatná, nesmie obsahovať '%s'"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Šablóna '%s' nekončí XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Nepodarilo sa prečítať symbolický odkaz '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Symbolické odkazy nepodporované"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Nepodarilo sa otvoriť program na prevod z '%s' do '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Nepodarilo sa 'raw' čítanie v g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Zanechané neprevedené dáta vo vstupnom bufferi"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanál končí čiastočným znakom"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Nepodarilo sa 'raw' čítanie v g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Nepodarilo sa otvoriť súbor '%s': open() zlyhala: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Nepodarilo sa namapovať súbor '%s': mmap() zlyhala: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Chyba na riadku %d znak %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Chyba na riadku %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Nájdená prázdna entita '&;', platné entity sú: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Znak '%s' nie je platný na začiatku mena entity. Znak & začína entitu. Ak tu "
+"ale nemá predstavovať entitu, musíte ho zapísať ako &amp;."
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Znak '%s' nie je platný v mene entity"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Meno entity '%s' nie je známe"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entita nekončí bodkočiarkou. Asi ste použili znak & bez toho, aby ste ho "
+"zapísali ako &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Nepodarilo sa spracovať '%-.*s', čo by mala byť číslica v odkaze na znak "
+"(napríklad &#234;) - možno je číslica príliš veľká"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Odkaz na znak '%-.*s' nie je kódom povoleného znaku"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+"Prázdny odkaz na znak. Odkaz by mal obsahovať číslice, napríklad &#434;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Odkaz na znak neskončil bodkočiarkou. Asi ste použili & a nezadali ste ho "
+"ako &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Neukončený odkaz na entitu"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Neukončený odkaz na znak"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Neplatný text v kódovaní UTF-8"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokument musí začínať elementom (napr. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr "'%s' nie je platný znak za znakom '<', nesmie začínať meno elementu"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Prebytočný znak '%s'. Bol očakávaný znak '>', aby skončil začiatočnú značku "
+"elementu '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Prebytočný znak '%s'. Bol očakávaný znak '=' za menom atribútu '%s' elementu "
+"'%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Prebytočný znak '%s'. Bol očakávaný znak '>' alebo '/', aby ukončil "
+"začiatočnú značku elementu '%s' alebo nepovinne atribút. Možno ste použili "
+"neplatný znak v mene atribútu"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Prebytočný znak '%s'. Boli očakávané úvodzovky po '=' pri zadávaní hodnoty "
+"atribútu '%s' v elemente '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' nie je platný znak po znakoch '</'. '%s' nesmie začínať meno elementu"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' nie je platný znak po koncovom mene elementu '%s'. Povolený znak je '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element '%s' bol ukončený, momentálne nie je otvorený žiadny element"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Element '%s' bol ukončený, ale momentálne otvorený element je '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokument je prázdny alebo obsahuje iba medzery"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Dokument neočakávane skončil hneď po začiatočnom znaku '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokument neočakávane skončil s otvorenými elementami - '%s' bol posledný "
+"otvorený element."
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokument neočakávane skončil, očakával sa znak '>' pre ukončenie značky <%s>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokument neočakávane skončil v mene elementu"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokument neočakávane skončil v mene atribútu"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokument neočakávane skončil v začiatočnej značke elementu."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokument neočakávane skončil po '=' za menom atribútu, chýba hodnota atribútu"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokument neočakávane skončil v hodnote atribútu"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Dokument neočakávane skončil v koncovej značke pre element '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Dokument neočakávane skončil v komentári alebo inštrukcii pre spracovanie"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Chyba na riadku %d znak %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Neukončený odkaz na entitu"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Text v úvodzovkách nezačína úvodzovkami"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Prebytočné úvodzovky v príkazovom riadku alebo v inom texte shellu"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Text skončil hneď po znaku '\\'. (Text bol '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Text skončil pred nájdením zodpovedajúcej úvodzovky pre %c. (Text bol '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Text bol prázdny (alebo obsahoval iba medzery)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Nepodarilo sa čítať dáta z procesu potomka"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Nepodarilo sa vytvoriť rúru pre komunikáciu s procesom potomka (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Nepodarilo sa čítať z rúry potomka (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Nepodarilo sa zmeniť priečinok na '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Nepodarilo sa spustiť proces potomka (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Neplatný názov programu: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Neplatný reťazec vo vektore parametra na %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Neplatný reťazec v prostredá: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Neplatný pracovný priečinok: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Nepodarilo sa spustiť pomocný program (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Neočakávaná chyba v g_io_channel_win32_poll() pri čítaní dát z procesu "
+"potomka"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Nepodarilo sa čítať dáta z procesu potomka (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Neočakávaná chyba v select() pri čítaní dát z procesu potomka (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Neočakávaná chyba vo waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Nepodarilo sa zavolať fork (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Nepodarilo sa spustiť proces potomka \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Nepodarilo sa presmerovať vstup alebo výstup procesu potomka (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Nepodarilo sa spustiť proces potomka (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Neznáma chyba počas behu procesu potomka \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Nepodarilo sa prečítať dostatok dát z rúry potomka (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Znak mimo rozsah UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Neplatná sekvencia na vstupe prevodu"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Znak mimo rozsah UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Použitie:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[VOĽBA...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Voľby pomocníka:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Zobraziť voľby pomocníka"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Zobraziť všetky voľby pomocníka"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Voľby aplikácie:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Nepodarilo sa spracovať celočíselnú hodnotu '%s' pre %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Celočíselná hodnota '%s' pre %s je mimo rozsah"
+
+#: glib/goption.c:831
+#, fuzzy, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Nepodarilo sa spracovať celočíselnú hodnotu '%s' pre %s"
+
+#: glib/goption.c:839
+#, fuzzy, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Celočíselná hodnota '%s' pre %s je mimo rozsah"
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Chyba počas prevodu: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Chýbajúci parameter pre %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Neznáma voľby %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Nepodarilo sa nájsť platný súbor kľúčov v dátových adresároch"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Nie je obyčajný súbor"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Súbor je prázdny"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Súbor kľúčov obsahuje riadok '%s', ktorý nie je pár kľúč-hodnota, skupinou, "
+"ani komentárom"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Neplatný názov programu: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Súbor kľúčov nezačína skupinou"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Neplatný názov programu: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Súbor kľúčov obsahuje nepodporované kódovane '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Súbor kľúčov nemá skupinu '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Súbor kľúčov nemá kľúč '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Súbor kľúčov obsahuje kľúč '%s' s hodnotou '%s', ktorá nie je UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Súbor kľúčov obsahuje kľúč '%s', ktorý má hodnotu, ktorá nemohla byť "
+"interpretovaná."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Súbor kľúčov obsahuje kľúč '%s', v skupine '%s', ktorý má hodnotu, ktorá "
+"nemohla byť interpretovaná."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Súbor kľúčov nemá kľúč '%s' v skupine '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Súbor kľúčov obsahuje znak escape na konci riadku"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Súbor kľúčov obsahuje neplatne zadanú sekvenciu '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Hodnota '%s' nemohla byť interpretovaná ako číslo."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Celočíselná hodnota '%s' je mimo rozsah"
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Hodnota '%s' nemohla byť interpretovaná ako číslo."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Hodnota '%s' nemohla byť interpretovaná ako boolovská."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Nepodarilo sa zmeniť režim súboru: funkcia fork() zlyhala: %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Nepodarilo sa zmeniť režim súboru: funkcia waitpid() zlyhala: %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Nepodarilo sa zmeniť režim súboru: funkcia chmod() zlyhala: %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr ""
+#~ "Nepodarilo sa zmeniť režim súboru: Potomok bol ukončený signálom: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr "Nepodarilo sa zmeniť režim súboru: Potomok bol ukončený nenormálne"
diff --git a/trunk/po/sl.po b/trunk/po/sl.po
new file mode 100644
index 000000000..935b2b125
--- /dev/null
+++ b/trunk/po/sl.po
@@ -0,0 +1,941 @@
+# Slovenian translation file for glib.
+# Copyright (C) 2000 Free Software Foundation, Inc.
+# Andraz Tori <andraz.tori1@guest.arnes.si> 2000
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2001-02-16 12:30+0200\n"
+"Last-Translator: Andraz Tori <andraz.tori1@guest.arnes.si>\n"
+"Language-Team: Slovenian <sl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Čuden znak '%s'. Po imenu atributa '%s' (elementa '%s') je pričakovan znak "
+"'='"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Nisem uspel ustvariti datoteke '%s' %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Pretvorba iz nabora znakov '%s' v '%s' ni podprta"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Nisem mogel odpreti pretvornika iz '%s' v '%s': %s"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Neveljavna sekvenca bajtov na vhodu pretvorbe"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Napaka med pretvorbo: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Delna (nedokončana) sekvenca znakov na koncu vhoda"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Ne morem pretvoriti '%s' v nabor znakov '%s'"
+
+#: glib/gconvert.c:1727
+#, fuzzy, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' pri uporabi sheme datotek ni absoluten"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Krajevna datoteka URI '%s' ne sme vsebovati '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' je neveljaven"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Ime gostitelja URIja '%s' ni veljavno"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' vsebuje neveljavne ubežne znake"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Pot '%s' ni absolutna pot"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Neveljavno ime gostitelja"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Napaka ob odpiranju imenika '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Nisem mogel rezervirati %lu bajtov za branje datoteke \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Napaka ob branju datoteke '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Nisem uspel brati iz datoteke '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Nisem uspel odpreti datoteke '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Nisem uspel dobiti atributov datoteke '%s': fstat() ni uspel: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Nisem uspel odpreti datoteke '%s': fdopen() ni uspel: %s"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Nisem uspel odpreti datoteke '%s': fdopen() ni uspel: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Nisem uspel ustvariti datoteke '%s' %s"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Nisem uspel odpreti datoteke '%s': fdopen() ni uspel: %s"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Nisem uspel odpreti datoteke '%s': fdopen() ni uspel: %s"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Nisem uspel odpreti datoteke '%s': fdopen() ni uspel: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Šablona '%s' je neveljavna, ne bi smela vsebovati '%s'"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Šablona '%s' se ne konča z XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, fuzzy, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Nisem uspel ustvariti datoteke '%s' %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr ""
+
+#: glib/giochannel.c:1152
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Nisem mogel odpreti pretvornika iz `%s' v `%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Ne morem narediti surovega branja v g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Preostanek nepretvorjenih podatkov v bralnem medpomnilniku"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanal se je ustavil v delnem znaku"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Ne morem narediti surovega branja v g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Nisem uspel odpreti datoteke '%s': fdopen() ni uspel: %s"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Nisem uspel odpreti datoteke '%s': fdopen() ni uspel: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Napaka v vrstici %d, znak %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Napaka v vrstici %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Viden prazna entiteta '&;'; veljavne entitete so: &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Znak '%s' ni veljaven na začetku imena entitete; znak & začne entiteto; če "
+"ta znak ni mišljen kot entiteta ga napišite kot &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Znak '%s' ni veljaven znotraj imena entitete"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Ime entitete '%s' ni poznano"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entiteta se ni končala s podpičjem; verjetno ste uporabili znak '&' "
+"breznamena, da bi začeli entiteto - znak '&' napišite kot '&amp;'"
+
+#: glib/gmarkup.c:573
+#, fuzzy, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Nisem uspel razčleniti '%s', ki bi morala biti številka znotraj reference "
+"znaka (na primer &#234;) - mogoče je številka prevelika"
+
+#: glib/gmarkup.c:598
+#, fuzzy, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Referenca znaka '%s' ne predstavlja dovoljenega znaka"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Prazna referenca znaka; vsebovati bi morala številko kot &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Referenca znaka se ni končala s podpičjem; verjetno ste uporabili znak '&' "
+"brez namen, da bi začeli entiteto - znak '&' napišite kot '&amp;'"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Nedokončano nanašanje na entiteto"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Nedokončano nanašanje na znak"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Napačno kodirano besedilo UTF-8"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokument se mora začeti z elementom (na primer <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' ni veljaven znak, kadar sledi znaku '<'; morda se ne začne z imenom "
+"elementa"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr "Čuden znak '%s', pričakovan znak '>', da zaključi oznako elementa '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Čuden znak '%s'. Po imenu atributa '%s' (elementa '%s') je pričakovan znak "
+"'='"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Čuden znak '%s'. Pričakovan znak '>' ali '/', ki bi zaključil oznako "
+"elementa '%s' ali atribut; morda ste uporabili neveljaven znak v imenu "
+"atributa'"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Čuden znak '%s'. Za enačajem je pričakovan narekovaj znotraj katerega je "
+"podana vrednost za atribut '%s' elementa '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' ni veljaven znak za znakoma '</'; ime elementa se ne sme začeti z '%s'"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"Znak '%s' ni veljaven kadar sledi zaprtju imena elementa '%s'; dovoljen znak "
+"je '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element '%s' je bil zaprt, trenutno ni odprtega elementa"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Element '%s' je bil zaprt, a trenutno odprt element je '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokument je bil prazen ali pa je vseboval le presledke"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Dokument nepričakovano končan takoj za odprtjem z '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokument nepričakovano končan s še odprtimi elementi - '%s' je bil zadnji "
+"odprt element"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokument nepričakovano končan, pričakovan je bil zaključni zaklepaj oznake <%"
+"s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokument nepričakovano končan sredi imena elementa"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokument nepričakovano končan sredi imena atributa"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokument nepričakovano končan sredi oznake za odprtje elementa."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokumen nepričakovano končan po enečaju, ki je sledil imenu atributa; ni "
+"vrednosti atributa"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokument nepričakovano končan sredi vrednosti atributa"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Dokument nepričakovano končan sredi oznake zaprtja elementa '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Dokument nepričakovano končan sredi komentarja ali ukaza"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Napaka v vrstici %d, znak %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Nedokončano nanašanje na entiteto"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Citirano besedilo se ne začne z narekovajem"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "V ukazni vrstici ali v citiranem besedilu manjka končni narekovaj"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Besedilo končano takoj po znaku '\\'. (Besedilo je bilo '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Besedilo končano preden je bil najden zaključni narekovaj za %c. (besedilo "
+"je bilo '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Besedilo je bilo prazno (ali vsebovalo le presledke)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Nisem uspel prebrati podatkov iz procesa otroka"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Nisem uspel ustvariti cevi za komunikacijo s procesom otroka (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Nisem uspel brati iz cevi otroka (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Nisem uspel spremeniti imenika v '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Nisem uspel izvesti procesa otroka (%s)"
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "Neveljavno ime gostitelja"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, fuzzy, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Neveljavna sekvenca na vhodu pretvorbe"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr "Napaka ob odpiranju imenika '%s': %s"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Nisem uspel izvesti pomožnega programa "
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Nepričakovana napaka v g_io_channel_win32_poll() med branjem podatkov "
+"procesa otroka"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Nisem uspel prebrati podatkov iz procesa otroka (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Nepričakovana napaka v select() med branjem podatkov procesa otroka (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Nepričakovana napaka v waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Nisem se uspel razvejiti (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Nisem uspel izvesti procesa otroka \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Nisem uspel preusmeriti vhoda ali izhoda procesa otroka (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Nisem uspel razvejiti procesa otroka (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Neznana napaka med izvajanjem procesa otroka \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Nisem uspel prebrati dovolj podatkov iz cevi otroka (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Znak izven intervala za UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Neveljavna sekvenca na vhodu pretvorbe"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Znak izven intervala za UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr ""
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr ""
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr ""
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr ""
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Napaka med pretvorbo: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr ""
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr ""
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Neveljavno ime gostitelja"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Neveljavno ime gostitelja"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, fuzzy, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "URI '%s' vsebuje neveljavne ubežne znake"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Nisem uspel odpreti datoteke '%s': fdopen() ni uspel: %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Nisem mogel rezervirati %lu bajtov za branje datoteke \"%s\""
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Nisem uspel odpreti datoteke '%s': fdopen() ni uspel: %s"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Pretvorba iz nabora znakov `%s' v `%s' ni podprta"
+
+#~ msgid "Incorrect message size"
+#~ msgstr "Neveljavna velikost sporočila"
+
+#~ msgid "Socket error"
+#~ msgstr "Napaka vtiča"
+
+#~ msgid "Channel set flags unsupported"
+#~ msgstr "Nastavitev zastavic kanala ni podprta"
diff --git a/trunk/po/sq.po b/trunk/po/sq.po
new file mode 100644
index 000000000..f312ba460
--- /dev/null
+++ b/trunk/po/sq.po
@@ -0,0 +1,937 @@
+# Përkthimi i mesazheve të glib në shqip
+# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+#
+# Laurent Dhima <laurenti@alblinux.net>, 2003, 2004, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: glib HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-01-30 10:58+0100\n"
+"Last-Translator: Laurent Dhima <laurenti@alblinux.net>\n"
+"Language-Team: Albanian <gnome-albanian-perkthyesit@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"U gjet simboli '%s', përkundrazi pritej një '=' mbas emrit të atributit '%s' "
+"të elementit '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Nuk u gjet asnjë file i vlefshëm kyçi tek directory e të dhënave"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "I pamundur leximi i lidhjes simbolike '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Konvertimi nga familja e simboleve '%s' në '%s' nuk suportohet"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "E pamundur hapja e konvertuesit nga '%s' në '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Sekuencë byte e pavlefshme tek të dhënat për konvertim"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Gabim gjatë konvertimit: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Sekuencë simbolesh e pjesëshme në fund të të dhënave në hyrje"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "I pamundur konvertimi i '%s' në familjen e simboleve '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' nuk është një URI absolute duke përdorur skemën e \"file\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "URI për file lokal '%s' mund të mos përdorë një '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' është e pasaktë"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Emri i host të URI '%s' është i pasaktë"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' përmban simbole escape të pavlefshëm"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Pozicioni me emër '%s' nuk është një pozicion absolut"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Emër host i pasaktë"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Gabim gjatë hapjes së directory '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "I pamundur grumbullimi i %lu bytes për të lexuar file \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Gabim gjatë leximit të file '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "I pamundur leximi nga file '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "E pamundur hapja e file '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "E pamundur marrja e pronësive të file '%s': fstat() dështoi: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Dështoi hapja e file '%s': fdopen() dështoi: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Ndryshimi i emrit të file nga '%s' në '%s' dështoi: g_rename() dështoi: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Dështoi krijimi i file '%s': %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Hapja e file '%s' për shkrim dështoi: fdopen() dështoi: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Shkrimi i file '%s' dështoi: fwrite() dështoi: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Mbyllja e file '%s' dështoi: fclose() dështoi: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "E pamundur heqja e file ekzistues '%s': g_unlink() dështoi: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Shabllon '%s' i pavlefshëm, nuk mund të përmbajë një '%s'"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Shablloni '%s' nuk mbaron me XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "I pamundur leximi i lidhjes simbolike '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Lidhjet simbolike nuk suportohen"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Nuk arrij të hap konvertuesin nga '%s' në '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"I pamundur leximi i të dhënave të papërpunuara tek "
+"g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Kanë tepruar të dhëna të pakonvertuara tek buffer i leximit"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanali përfundon me një simbol të pjesëshëm"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+"I pamundur leximi i të dhënave të papërpunuara tek g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "E pamundur hapja e file '%s': open() dështoi: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "I pamundur mapimi i file '%s': mmap() dështoi: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Gabim tek rreshti %d simboli %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Gabim tek rreshti %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"U gjet një entitet bosh '&;'; entitetet e vlefshme janë: &amp; &quot; &lt; "
+"&gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Simboli '%s' nuk vlen si fillues i emrit të një entiteti; simboli & fillon "
+"një entitet; nëse ky simbol nuk do të jetë fillimi i një entiteti, përdore "
+"si &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Simboli '%s' nuk është i vlefshëm brenda emrit të një entiteti"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Emri entitetit '%s' nuk njihet"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entiteti nuk përfundon me pikëpresje; ndoshta keni përdorur një 'e' "
+"komerciale pa dashur të nisni një entity - zëvendësojeni me &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"I pamundur analizimi i '%-.*s', duhet të ishte një numër brenda riferimeve "
+"të një simboli (p.sh. &#234;) - ndoshta numri është tepër i madh"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Riferimi '%-.*s' i simbolit nuk kodifikon një simbol të lejuar"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Simbol bosh, duhet të përmbajë një vlerë numerike, si &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Simboli nuk mbaron me pikëpresje; ndoshta keni përdorur një simbol ampersand "
+"& pa pasur ndërmend fillimin e një entiteti të ri - përdorni &amp; "
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Riferim entiteti i papërfunduar"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Referim i papërfunduar i simbolit"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Tekst i kodifikuar UTF-8 i pavlefshëm"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokumenti duhet të fillojë me një element (p.sh. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' nuk është një simbol i vlefshëm mbas simbolit '<', nuk mund të fillojë "
+"me emrin e një elementi"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"U gjet simboli '%s', në pritje të një simboli '>' për të përfunduar tag-un e "
+"fillimit të elementit '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"U gjet simboli '%s', përkundrazi pritej një '=' mbas emrit të atributit '%s' "
+"të elementit '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"U gjet simboli '%s', përkundrazi pritet një simbol '>' ose '/' për të "
+"përfunduar tag-un e nisjes së elementit '%s', ose me dëshirë një atribut; ka "
+"shumë mundësi të keni përdorur një simbol të pavlefshëm tek emri i një "
+"atributi"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"U gjet simboli '%s', pritet simboli i kuotës së hapur mbas shenjës së "
+"barazimit për t'i caktuar një vlerë atributit '%s' të elementit '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' nuk është një simbol i vlefshëm mbrapa simboleve '</'; '%s' nuk mund të "
+"nisë emrin e një elementi"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' nuk është një simbol i vlefshëm për të vazhduar mbylljen e emrit të "
+"elementit '%s'; simboli i lejuar është '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Elementi '%s' është mbyllur, asnjë element aktualisht është i hapur"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"Elementi '%s' është mbyllur, por elementi aktualisht i hapur është '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokumenti ishte bosh apo përmbante vetëm hapësira të bardha"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Dokumenti u mbyll papritur, menjëherë pas hapjes së kllapës këndore '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokumenti u mbyll papritur me elementë akoma të hapur - '%s' ishte elementi "
+"i fundit i hapur"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr "Dokumenti u mbyll papritur, pritet simboli i mbylljes për tag-un <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokumenti përfundoi papritur në brendësi të emrit të një elementi"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokumenti u mbyll papritur në brendësi të emrit të një atributi"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokumenti u mbyll papritur brënda një tag-u hapës të elementit"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokumenti u mbyll papritur mbas shenjës së barazimit që vjen mbas emrit të "
+"një atributi; atributi nuk ka vlerë"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokumenti u mbyll papritur në brendësi të vlerës së një atributi"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Dokumenti u mbyll papritur në brendësi të tag-ut mbyllës të elementit '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Dokumenti u mbyll papritur në brendësi të një komenti apo instruksioni "
+"proçesi"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Gabim tek rreshti %d simboli %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Riferim entiteti i papërfunduar"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Teksti i kuotuar nuk fillon me shenjën e kuotimit"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Nuk u gjet simboli i kuotimit tek rreshti i komandës apo tek teksti i "
+"kuotuar nga shell"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Teksti përfundoi menjëherë pas një simboli '\\'. (Teksti ishte '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Teksti përfundoi përpara se të gjente tekstin e kërkuar për %c. (Teksti "
+"ishte '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Teksti është bosh (ose përmban vetëm hapsira të bardha)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "I pamundur leximi i të dhënave nga proçesi bir"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "I pamundur krijimi i pipe për të komunikuar me proçesin bir (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "I pamundur leximi nga pipe bijë (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "I pamundur ndryshimi i directory në '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "I pamundur ekzekutimi i proçesit bir (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Emër i pasaktë programi: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Vlerë e pasaktë në vektorin e argumentit tek %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Vlerë e pavlefshme në ambient: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Directory e pavlefshme pune: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "I pamundur ekzekutimi i programit ndihmues (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Gabim i papritur në g_io_channel_win32_poll() gjatë leximit të të dhënave "
+"nga një proçes bir"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "I pamundur leximi i të dhënave nga proçesi bir (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Difekt i papritur në select() gjatë leximit të të dhënave nga një proçes bir "
+"(%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Gabim i papritur në waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "E pamundur kryerja e fork (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "I pamundur zbatimi i proçesit bir \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+"I pamundur ridrejtimi i të dhënave në hyrje apo dalje të proçesit bir (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "E pamundur kryerja e fork për proçesin bir (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Gabim i panjohur gjatë ekzekutimit të proçesit bir \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"I pamundur leximi i një sasie të dhënash të mjaftueshme nga pid pipe bir (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Simboli nuk ekziston në UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Sekuencë e pavlefshme në hyrje për konvertimin"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Simboli nuk ekziston në UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Përdorimi:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPCIONI...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Opcionet e ndihmës:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Shfaq opcionet e ndihmës"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Shfaq të gjithë opcionet e ndihmës"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Opcionet e programit:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "I pamundur analizimi i vlerës së plotë '%s' për %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Vlera integruese '%s' për %s është jashtë kufirit"
+
+#: glib/goption.c:831
+#, fuzzy, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "I pamundur analizimi i vlerës së plotë '%s' për %s"
+
+#: glib/goption.c:839
+#, fuzzy, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Vlera integruese '%s' për %s është jashtë kufirit"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Gabim gjatë analizimit të opsionit %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Mungojnë argumentë për %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Opcion i panjohur %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Nuk u gjet asnjë file i vlefshëm kyçi tek directory e të dhënave"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Nuk është një file i rregullt"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "File është bosh"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Kyçi përmban rreshtin '%s' që nuk është një vlerë çift, grup apo koment kyçi"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Emër i pasaktë programi: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "File i kyçit nuk fillon me një grup"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Emër i pasaktë programi: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "File i kyçit përmban kodifikimin e pasuportuar '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "File i kyçit nuk ka grupin '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "File i kyçit nuk përmban kyçin '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "File i kyçit përmban kyçin '%s' me vlerë '%s' që nuk është në UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "File i kyçit përmban kyçin '%s' që ka një vlerë të painterpretueshme."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"File i kyçit përmban kyçin '%s' në grupin '%s' që ka një vlerë të "
+"painterpretueshme."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "File i kyçit nuk ka kyçin '%s' në grupin '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "File i kyçit përmban simbolin escape në fund të rreshtit"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "File i kyçit përmban sekuencën e pavlefshme escape '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Vlera '%s' nuk mund të interpretohet si një numër."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Vlera integruese '%s' është jashtë kufirit"
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Vlera '%s' nuk mund të interpretohet si një numër."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Vlera '%s' nuk mund të interpretohet si një boolean."
diff --git a/trunk/po/sr.po b/trunk/po/sr.po
new file mode 100644
index 000000000..9c7271785
--- /dev/null
+++ b/trunk/po/sr.po
@@ -0,0 +1,958 @@
+# Serbian translation of glib
+# Courtesy of Prevod.org team (http://prevod.org/) -- 2003, 2004, 2005, 2006.
+#
+# This file is distributed under the same license as the glib package.
+#
+# Maintainer: Данило Шеган <dsegan@gmx.net>
+# Reviewed on 2004-02-01 by: Данило Шеган <danilo@gnome.org>
+# Reviewed on 2005-07-08 by: Данило Шеган <danilo@gnome.org>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 2.8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-01-31 23:39+0100\n"
+"Last-Translator: Слободан Д. Средојевић <slobo@akrep.be>\n"
+"Language-Team: Serbian (sr) <gnom@prevod.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Неочекивано својство „%s“ елемента „%s“"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Својство „%s“ елемента „%s“ није пронађено"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Неочекивана ознака „%s“, очекивано је „%s“"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Неочекивана ознака „%s“ унутар „%s“"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+"Не могу да нађем исправну датотеку са обележивачима међу фасциклама са "
+"подацима"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Обележивач ка „%s“ већ постоји"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Није пронађен обележивач ка „%s“"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "У обележивачу ка „%s“ није одређен МИМЕ тип"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "У обележивачу ка „%s“ није одређена приватна заставица"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "У обележивачу ка „%s“ нису одређене групе"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, fuzzy, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Нема програма „%s“, а који је регистровао обележивач ка „%s“"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Не могу да проширим комадну линију „%s“ са везом ка „%s“"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Претварање из скупа знакова „%s“ у „%s“ није подржано"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Не могу да покренем претварање из „%s“ у „%s“"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Неисправан низ бајтова у улазу који претварам"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Грешка при претварању: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Непотпун низ знакова на крају улаза"
+
+# ово претпостављам да се односи на делимичан УТФ8 запис
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Не може претворити резерву „%s“ у запис „%s“"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "Адреса „%s“ није апсолутна адреса помоћу „file“ шеме"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Адреса локалне датотеке „%s“ не сме садржати „#“"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "Адреса „%s“ је неисправна"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Име домаћина из адресе „%s“ је неисправно"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Адреса „%s“ садржи неисправно назначене знаке"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Путања „%s“ није апсолутна путања"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Неисправно име домаћина"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Грешка при отварању директоријума „%s“: %s"
+
+# bug: plural-forms
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Не могу да обезбедим %lu бајтова за читање датотеке „%s“"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Грешка при читању датотеке „%s“: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Не могу да прочитам из датотеке „%s“: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Не могу да отворим датотеку „%s“: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Не могу да сазнам особине датотеке „%s“: неуспешан fstat(): %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Не могу да отворим датотеку „%s“: неуспешан fdopen(): %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Не могу да преименујем датотеку „%s“ у „%s“: неуспешан g_rename(): %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Не могу да направим датотеку „%s“: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Не могу да отворим датотеку „%s“ ради уписа: неуспешан fdopen(): %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Не могу да упишем датотеку „%s“: неуспешан fwrite(): %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Не могу да затворим датотеку „%s“: неуспешан fclose(): %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Постојећа датотека „%s“ се не може уклонити: неуспешан g_unlink(): %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Неисправан шаблон „%s“, не сме садржати „%s“"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Шаблон „%s“ не садржи XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Не могу да прочитам симболичку везу „%s“: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Симболичке везе нису подржане"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Не могу да покренем претварање из „%s“ у „%s“: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Не могу да читам без обраде у g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Преостали непретворени подаци у баферу за читање"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Канал се завршава делимичним знаком"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Не могу да читам без обраде у g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Не могу да отворим датотеку „%s“: неуспешан open(): %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Не могу да мапирам датотеку „%s“: неуспешан mmap(): %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Грешка у %d. реду, %d. знак: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Грешка у %d. реду: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Уочен празан ентитет „&;“; прихватљиви ентитети су &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Име ентитета не може почети знаком „%s“ ; знак & започиње ентитет; ако овај "
+"знак не означава ентитет, истакните га помоћу &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Знак „%s“ није дозвољен у имену ентитета"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Ентитет „%s“ није познат"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Ентитет се не завршава тачка-запетом; највероватније сте користили амперсанд "
+"без намере да започнете ентитет — назначите амперсанд са &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Нисам успео да рашчланим „%-.*s“, што је требало да представља цифру унутар "
+"знаковне референце (на пример &#234;) — можда је цифра превелика"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Знаковна референца „%-.*s“ не представља дозвољени знак"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Празна знаковна референца; мора да садржи цифру као на пример &#747;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Знаковна референца се не завршава тачка-запетом; највероватније сте "
+"користили амперсанд без намере да започнете ентитет — назначите амперсанд са "
+"&amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Недовршена референца ентитета"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Недовршена знаковна референца"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Неисправан текст у УТФ-8 запису"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Документ мора почети елементом (нпр. <књига>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"„%s“ не представља исправан знак након знака „<“; име елемента не може њиме "
+"почети"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Чудан знак „%s“, а очекивао сам „>“ знак ради окончања почетне ознаке "
+"елемента „%s“"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Чудан знак „%s“, очекивао сам „=“ после имена атрибута „%s“ елемента „%s“"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Чудан знак „%s“, очекивао сам или „>“ или „/“ ради окончања почетне ознаке "
+"елемента „%s“, или можда атрибут; можда сте користили неисправан знак у "
+"имену атрибута"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Чудан знак „%s“, очекивао сам почетни наводник након знака једнакости при "
+"додели вредности атрибута „%s“ елемента „%s“"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"„%s“ није исправан знак након низа „</“; „%s“ не може започети име елемента"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"„%s“ није исправан знак након имена затвореног елемента „%s“; дозвољени знак "
+"је „>“"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Елемент „%s“ је затворен, нема тренутно отворених елемената"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Елемент „%s“ је затворен, а тренутно отворен елемент је „%s“"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Документ је празан или садржи само белине"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Документ завршен неочекивано непосредно након отворене косоугле заграде „<“"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Документ завршен неочекивано са отвореним елементима — „%s“ је последње "
+"отворен елемент"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Документ завршен неочекивано, очекивао сам да наиђем на затворену косоуглу "
+"заграду која затвара ознаку <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Документ завршен неочекивано усред имена елемента"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Документ завршен неочекивано усред имена атрибута"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Документ завршен неочекивано усред почетне ознаке елемента."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Документ завршен неочекивано након знака једнакости после имена атрибута; "
+"вредност атрибута није наведена"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Документ завршен неочекивано усред вредности атрибута"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Документ завршен неочекивано усред завршне ознаке елемента „%s“"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Документ завршен неочекивано усред примедбе или упута за обраду"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Грешка у %d. реду, %d. знак: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Недовршена референца ентитета"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Навод не почиње наводником"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Неупарен наводник у наредби или другом цитату из љуске"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Садржај завршен непосредно након „\\“ знака. (Ради се о тексту „%s“)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Садржај завршен пре наиласка на одговарајући наводник за %c. (Ради се о "
+"тексту „%s“)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Садржај празан (или садржи само белине)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Неуспело читање података из потпроцеса"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Неуспело стварање цевке за везу са потпроцесом (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Неуспело читање из подређене цевке (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Неуспело приступање директоријуму „%s“ (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Неуспело извршавање потпроцеса (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Неисправно име програма: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Неисправна ниска — члан вектора у %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Неисправна ниска у окружењу: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Неисправна радна фасцикла: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Неуспело извршавање помоћног програма (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Неочекивана грешка док су у g_io_channel_win32_poll() читани подаци из "
+"потпроцеса"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Неуспело читање података од потпроцеса (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Неочекивана грешка у select() при читању података из потпроцеса (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Неочекивана грешка у waitpid() (%s)"
+
+# за сада овако, можда гранање, умножавање? виљушкање ;-)
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Неуспео fork() (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Неуспело извршавање потпроцеса „%s“ (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Неуспело преусмеравање улаза или излаза потпроцеса (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Неуспео fork() потпроцеса (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Непозната грешка при извршавању потпроцеса „%s“"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Није успео да прочита довољно података из цевке ка потпроцесу (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Знак ван опсега за УТФ-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Неисправан низ у уносу за претварање"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Знак ван опсега за УТФ-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Употреба:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[ОПЦИЈА...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Помоћне опције:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Прикажи опције за помоћ"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Прикажи све опције за помоћ"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Опције програма:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Не могу да рашланим целобројну вредност „%s“ за %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Целобројна вредност „%s“ за %s је изван опсега"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Не могу да рашланим реалну вредност двоструке тачности „%s“ за %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Реална вредност двоструке тачности „%s“ за %s је изван опсега"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Грешка при рашчлањивању могућности %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Недостаје аргумент за %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Непозната опција %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Не могу да нађем исправну датотеку са кључевима међу подацима"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Није обична датотека"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Датотека је празна"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Датотека са кључевима садржи ред „%s“ што не чини пар кључ-вредност, групу "
+"или примедбу"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Неисправно име групе: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Датотека са кључевима не почиње групом"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Неисправно име кључа: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Датотека са кључевима садржи неподржано кодирање „%s“"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Датотека са кључевима нема групу „%s“"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Датотека са кључевима нема кључ „%s“"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Датотека са кључевима садржи кључ „%s“ вредности „%s“ што није УТФ-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "Датотека са кључевима садржи кључ „%s“ неразумљиве вредности."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Датотека са кључевима садржи кључ „%s“ у групи „%s“ неразумљиве вредности."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Датотека са кључевима не садржи кључ „%s“ у групи „%s“"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Датотека са кључевима садржи знак истицања на крају реда"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Датотека са кључевима садржи недозвољен низ истицања „%s“"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Вредност „%s“ се не може сматрати бројем."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Целобројна вредност „%s“ је изван опсега"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Вредност „%s“ се не може сматрати реалним бројем једноструке тачности."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Вредност „%s“ се не може сматрати истинитосном."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Не могу да променим овлашћења датотеке: неуспешан fork(): %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Не могу да променим овлашћења датотеке: неуспешан waitpid(): %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Не могу да променим овлашћења датотеке: неуспешан chmod(): %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr ""
+#~ "Не могу да променим овлашћења датотеке: потпроцес окончан сигналом: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr "Не могу да променим овлашћења датотеке: потпроцес силом окончан"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Није подржано претварање из скупа знакова „%s“ у скуп „%s“"
+
+#~ msgid "Incorrect message size"
+#~ msgstr "Неисправна величина поруке"
+
+#~ msgid "Socket error"
+#~ msgstr "Мрежна грешка"
+
+#~ msgid "Channel set flags unsupported"
+#~ msgstr "Неподржана подешавања канала"
diff --git a/trunk/po/sr@Latn.po b/trunk/po/sr@Latn.po
new file mode 100644
index 000000000..b9b7564bd
--- /dev/null
+++ b/trunk/po/sr@Latn.po
@@ -0,0 +1,958 @@
+# Serbian translation of glib
+# Courtesy of Prevod.org team (http://prevod.org/) -- 2003, 2004, 2005, 2006.
+#
+# This file is distributed under the same license as the glib package.
+#
+# Maintainer: Danilo Šegan <dsegan@gmx.net>
+# Reviewed on 2004-02-01 by: Danilo Šegan <danilo@gnome.org>
+# Reviewed on 2005-07-08 by: Danilo Šegan <danilo@gnome.org>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 2.8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-01-31 23:39+0100\n"
+"Last-Translator: Slobodan D. Sredojević <slobo@akrep.be>\n"
+"Language-Team: Serbian (sr) <gnom@prevod.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Neočekivano svojstvo „%s“ elementa „%s“"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Svojstvo „%s“ elementa „%s“ nije pronađeno"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Neočekivana oznaka „%s“, očekivano je „%s“"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Neočekivana oznaka „%s“ unutar „%s“"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+"Ne mogu da nađem ispravnu datoteku sa obeleživačima među fasciklama sa "
+"podacima"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Obeleživač ka „%s“ već postoji"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Nije pronađen obeleživač ka „%s“"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "U obeleživaču ka „%s“ nije određen MIME tip"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "U obeleživaču ka „%s“ nije određena privatna zastavica"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "U obeleživaču ka „%s“ nisu određene grupe"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, fuzzy, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Nema programa „%s“, a koji je registrovao obeleživač ka „%s“"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Ne mogu da proširim komadnu liniju „%s“ sa vezom ka „%s“"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Pretvaranje iz skupa znakova „%s“ u „%s“ nije podržano"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Ne mogu da pokrenem pretvaranje iz „%s“ u „%s“"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Neispravan niz bajtova u ulazu koji pretvaram"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Greška pri pretvaranju: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Nepotpun niz znakova na kraju ulaza"
+
+# ovo pretpostavljam da se odnosi na delimičan UTF8 zapis
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Ne može pretvoriti rezervu „%s“ u zapis „%s“"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "Adresa „%s“ nije apsolutna adresa pomoću „file“ šeme"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Adresa lokalne datoteke „%s“ ne sme sadržati „#“"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "Adresa „%s“ je neispravna"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Ime domaćina iz adrese „%s“ je neispravno"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Adresa „%s“ sadrži neispravno naznačene znake"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Putanja „%s“ nije apsolutna putanja"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Neispravno ime domaćina"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Greška pri otvaranju direktorijuma „%s“: %s"
+
+# bug: plural-forms
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Ne mogu da obezbedim %lu bajtova za čitanje datoteke „%s“"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Greška pri čitanju datoteke „%s“: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Ne mogu da pročitam iz datoteke „%s“: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Ne mogu da otvorim datoteku „%s“: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Ne mogu da saznam osobine datoteke „%s“: neuspešan fstat(): %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Ne mogu da otvorim datoteku „%s“: neuspešan fdopen(): %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Ne mogu da preimenujem datoteku „%s“ u „%s“: neuspešan g_rename(): %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Ne mogu da napravim datoteku „%s“: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Ne mogu da otvorim datoteku „%s“ radi upisa: neuspešan fdopen(): %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Ne mogu da upišem datoteku „%s“: neuspešan fwrite(): %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Ne mogu da zatvorim datoteku „%s“: neuspešan fclose(): %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Postojeća datoteka „%s“ se ne može ukloniti: neuspešan g_unlink(): %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Neispravan šablon „%s“, ne sme sadržati „%s“"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Šablon „%s“ ne sadrži XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Ne mogu da pročitam simboličku vezu „%s“: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Simboličke veze nisu podržane"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Ne mogu da pokrenem pretvaranje iz „%s“ u „%s“: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Ne mogu da čitam bez obrade u g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Preostali nepretvoreni podaci u baferu za čitanje"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanal se završava delimičnim znakom"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Ne mogu da čitam bez obrade u g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Ne mogu da otvorim datoteku „%s“: neuspešan open(): %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Ne mogu da mapiram datoteku „%s“: neuspešan mmap(): %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Greška u %d. redu, %d. znak: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Greška u %d. redu: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Uočen prazan entitet „&;“; prihvatljivi entiteti su &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Ime entiteta ne može početi znakom „%s“ ; znak & započinje entitet; ako ovaj "
+"znak ne označava entitet, istaknite ga pomoću &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Znak „%s“ nije dozvoljen u imenu entiteta"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Entitet „%s“ nije poznat"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entitet se ne završava tačka-zapetom; najverovatnije ste koristili ampersand "
+"bez namere da započnete entitet — naznačite ampersand sa &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Nisam uspeo da raščlanim „%-.*s“, što je trebalo da predstavlja cifru unutar "
+"znakovne reference (na primer &#234;) — možda je cifra prevelika"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Znakovna referenca „%-.*s“ ne predstavlja dozvoljeni znak"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Prazna znakovna referenca; mora da sadrži cifru kao na primer &#747;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Znakovna referenca se ne završava tačka-zapetom; najverovatnije ste "
+"koristili ampersand bez namere da započnete entitet — naznačite ampersand sa "
+"&amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Nedovršena referenca entiteta"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Nedovršena znakovna referenca"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Neispravan tekst u UTF-8 zapisu"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokument mora početi elementom (npr. <knjiga>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"„%s“ ne predstavlja ispravan znak nakon znaka „<“; ime elementa ne može "
+"njime početi"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Čudan znak „%s“, a očekivao sam „>“ znak radi okončanja početne oznake "
+"elementa „%s“"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Čudan znak „%s“, očekivao sam „=“ posle imena atributa „%s“ elementa „%s“"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Čudan znak „%s“, očekivao sam ili „>“ ili „/“ radi okončanja početne oznake "
+"elementa „%s“, ili možda atribut; možda ste koristili neispravan znak u "
+"imenu atributa"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Čudan znak „%s“, očekivao sam početni navodnik nakon znaka jednakosti pri "
+"dodeli vrednosti atributa „%s“ elementa „%s“"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"„%s“ nije ispravan znak nakon niza „</“; „%s“ ne može započeti ime elementa"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"„%s“ nije ispravan znak nakon imena zatvorenog elementa „%s“; dozvoljeni "
+"znak je „>“"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Element „%s“ je zatvoren, nema trenutno otvorenih elemenata"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Element „%s“ je zatvoren, a trenutno otvoren element je „%s“"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokument je prazan ili sadrži samo beline"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Dokument završen neočekivano neposredno nakon otvorene kosougle zagrade „<“"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokument završen neočekivano sa otvorenim elementima — „%s“ je poslednje "
+"otvoren element"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokument završen neočekivano, očekivao sam da naiđem na zatvorenu kosouglu "
+"zagradu koja zatvara oznaku <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokument završen neočekivano usred imena elementa"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokument završen neočekivano usred imena atributa"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokument završen neočekivano usred početne oznake elementa."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokument završen neočekivano nakon znaka jednakosti posle imena atributa; "
+"vrednost atributa nije navedena"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokument završen neočekivano usred vrednosti atributa"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Dokument završen neočekivano usred završne oznake elementa „%s“"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Dokument završen neočekivano usred primedbe ili uputa za obradu"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Greška u %d. redu, %d. znak: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Nedovršena referenca entiteta"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Navod ne počinje navodnikom"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Neuparen navodnik u naredbi ili drugom citatu iz ljuske"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Sadržaj završen neposredno nakon „\\“ znaka. (Radi se o tekstu „%s“)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Sadržaj završen pre nailaska na odgovarajući navodnik za %c. (Radi se o "
+"tekstu „%s“)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Sadržaj prazan (ili sadrži samo beline)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Neuspelo čitanje podataka iz potprocesa"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Neuspelo stvaranje cevke za vezu sa potprocesom (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Neuspelo čitanje iz podređene cevke (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Neuspelo pristupanje direktorijumu „%s“ (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Neuspelo izvršavanje potprocesa (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Neispravno ime programa: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Neispravna niska — član vektora u %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Neispravna niska u okruženju: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Neispravna radna fascikla: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Neuspelo izvršavanje pomoćnog programa (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Neočekivana greška dok su u g_io_channel_win32_poll() čitani podaci iz "
+"potprocesa"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Neuspelo čitanje podataka od potprocesa (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Neočekivana greška u select() pri čitanju podataka iz potprocesa (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Neočekivana greška u waitpid() (%s)"
+
+# za sada ovako, možda grananje, umnožavanje? viljuškanje ;-)
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Neuspeo fork() (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Neuspelo izvršavanje potprocesa „%s“ (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Neuspelo preusmeravanje ulaza ili izlaza potprocesa (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Neuspeo fork() potprocesa (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Nepoznata greška pri izvršavanju potprocesa „%s“"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Nije uspeo da pročita dovoljno podataka iz cevke ka potprocesu (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Znak van opsega za UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Neispravan niz u unosu za pretvaranje"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Znak van opsega za UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Upotreba:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPCIJA...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Pomoćne opcije:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Prikaži opcije za pomoć"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Prikaži sve opcije za pomoć"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Opcije programa:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Ne mogu da rašlanim celobrojnu vrednost „%s“ za %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Celobrojna vrednost „%s“ za %s je izvan opsega"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Ne mogu da rašlanim realnu vrednost dvostruke tačnosti „%s“ za %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Realna vrednost dvostruke tačnosti „%s“ za %s je izvan opsega"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Greška pri raščlanjivanju mogućnosti %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Nedostaje argument za %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Nepoznata opcija %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Ne mogu da nađem ispravnu datoteku sa ključevima među podacima"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Nije obična datoteka"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Datoteka je prazna"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Datoteka sa ključevima sadrži red „%s“ što ne čini par ključ-vrednost, grupu "
+"ili primedbu"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Neispravno ime grupe: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Datoteka sa ključevima ne počinje grupom"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Neispravno ime ključa: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Datoteka sa ključevima sadrži nepodržano kodiranje „%s“"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Datoteka sa ključevima nema grupu „%s“"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Datoteka sa ključevima nema ključ „%s“"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Datoteka sa ključevima sadrži ključ „%s“ vrednosti „%s“ što nije UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "Datoteka sa ključevima sadrži ključ „%s“ nerazumljive vrednosti."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Datoteka sa ključevima sadrži ključ „%s“ u grupi „%s“ nerazumljive vrednosti."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Datoteka sa ključevima ne sadrži ključ „%s“ u grupi „%s“"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Datoteka sa ključevima sadrži znak isticanja na kraju reda"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Datoteka sa ključevima sadrži nedozvoljen niz isticanja „%s“"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Vrednost „%s“ se ne može smatrati brojem."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Celobrojna vrednost „%s“ je izvan opsega"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Vrednost „%s“ se ne može smatrati realnim brojem jednostruke tačnosti."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Vrednost „%s“ se ne može smatrati istinitosnom."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Ne mogu da promenim ovlašćenja datoteke: neuspešan fork(): %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Ne mogu da promenim ovlašćenja datoteke: neuspešan waitpid(): %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Ne mogu da promenim ovlašćenja datoteke: neuspešan chmod(): %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr ""
+#~ "Ne mogu da promenim ovlašćenja datoteke: potproces okončan signalom: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr "Ne mogu da promenim ovlašćenja datoteke: potproces silom okončan"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Nije podržano pretvaranje iz skupa znakova „%s“ u skup „%s“"
+
+#~ msgid "Incorrect message size"
+#~ msgstr "Neispravna veličina poruke"
+
+#~ msgid "Socket error"
+#~ msgstr "Mrežna greška"
+
+#~ msgid "Channel set flags unsupported"
+#~ msgstr "Nepodržana podešavanja kanala"
diff --git a/trunk/po/sr@ije.po b/trunk/po/sr@ije.po
new file mode 100644
index 000000000..81230a2e4
--- /dev/null
+++ b/trunk/po/sr@ije.po
@@ -0,0 +1,945 @@
+# Serbian translation of glib
+# Courtesy of Prevod.org team (http://prevod.org/) -- 2003, 2004.
+#
+# This file is distributed under the same license as the glib package.
+#
+# Maintainer: Данило Шеган <dsegan@gmx.net>
+# Reviewed on 2004-02-01 by: Данило Шеган
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 2.4\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2004-04-29 01:11+0200\n"
+"Last-Translator: Bojan Suzic <bojans@teol.net>\n"
+"Language-Team: Serbian (sr) <serbiagnome-lista@nongnu.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Чудан знак „%s“, очекивао сам „=“ после особине „%s“ елемента „%s“"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Не могу да прочитам симболичку везу „%s“: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Претварање из скупа знакова „%s“ у „%s“ није подржано"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Не могу да покренем претварање из „%s“ у „%s“"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Неисправан низ бајтова у улазу који претварам"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Грешка при претварању: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Непотпун низ знакова на крају улаза"
+
+# ово претпостављам да се односи на делимичан УТФ8 запис
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Не може претворити резерву „%s“ у запис „%s“"
+
+# bug: "file" should be in quotes, if it's about "file:///"
+#: glib/gconvert.c:1727
+#, fuzzy, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "Адреса „%s“ није апсолутна адреса помоћу „file“ шеме"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Адреса локалне датотеке „%s“ не смије садржати „#“"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "Адреса „%s“ је неисправна"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Име домаћина из адресе „%s“ је неисправно"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Адреса „%s“ садржи неисправно назначене знаке"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Путања „%s“ није апсолутна путања"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Неисправно име домаћина"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Грешка при отварању директоријума „%s“: %s"
+
+# bug: plural-forms
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Не могу да обезбједим %lu бајтова за читање датотеке „%s“"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Грешка при читању датотеке „%s“: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Не могу да прочитам из датотеке „%s“: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Не могу да отворим датотеку „%s“: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Не могу да сазнам особине датотеке „%s“: неуспјешан fstat(): %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Не могу да направим датотеку „%s“: %s"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Неисправан шаблон „%s“, не смије садржати „%s“"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Шаблон „%s“ се не завршава са XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Не могу да прочитам симболичку везу „%s“: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Симболичке везе нису подржане"
+
+#: glib/giochannel.c:1152
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Не могу да покренем претварање из „%s“ у „%s“: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Не могу да читам без обраде у g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Преостали непретворени подаци у међуспремнику за читање"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Канал се завршава дјелимичним знаком"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Не могу да читам без обраде у g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Грешка у %d. реду, %d. знак: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Грешка у %d. реду: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Уочен празан ентитет „&;“; прихватљиви ентитети су &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Име ентитета не може почети знаком „%s“ ; знак & започиње ентитет; ако овај "
+"знак не означава ентитет, истакните га помоћу &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Знак „%s“ није дозвољен у имену ентитета"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Ентитет „%s“ није познат"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Ентитет се не завршава тачка-запетом; највјероватније сте користили "
+"амперсанд без намере да започнете ентитет — назначите амперсанд као &amp;"
+
+#: glib/gmarkup.c:573
+#, fuzzy, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Нисам успио да рашчланим „%s“, што је требало да представља цифру унутар "
+"позива знака (на пример &#234;) — можда је цифра превелика"
+
+#: glib/gmarkup.c:598
+#, fuzzy, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Позив знака „%s“ не стоји за дозвољени знак"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Празан позив знака; морао би садржати цифру као на примјер &#747;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Позив знака се не завршава тачка-запетом; највјероватније сте користили "
+"амперсанд без намере да започнете ентитет — назначите амперсанд као &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Недовршена ознака ентитета"
+
+# позив уместо ознака?
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Недовршен позив знака"
+
+# ознака знака??? неееее
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Неисправан текст у УТФ-8 запису"
+
+# може и ћирилица: „Уникод ТрансФормација 8“
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Документ мора почети елементом (нпр. <књига>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"„%s“ не представља исправан знак након знака „<“; име елемента не може њиме "
+"почети"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Чудан знак „%s“, а очекивао сам „>“ знак ради окончања почетне ознаке "
+"елемента „%s“"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr "Чудан знак „%s“, очекивао сам „=“ после особине „%s“ елемента „%s“"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Чудан знак „%s“, очекивао сам или „>“ или „/“ ради окончања почетне ознаке "
+"елемента „%s“, или могућу особину; можда сте користили неисправан знак у "
+"имену особине"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Чудан знак „%s“, очекивао сам почетни наводник након знака једнакости при "
+"додјели вриједности особини „%s“ елемента „%s“"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"„%s“ није исправан знак након низа „</“; „%s“ не може започети име елемента"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"„%s“ није исправан знак након имена затвореног елемента „%s“; дозвољени знак "
+"је „>“"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Елемент „%s“ је затворен, нема тренутно отворених елемената"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Елемент „%s“ је затворен, а тренутно отворен елемент је „%s“"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Документ је празан или садржи само бјелине"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Документ завршен неочекивано непосредно након отворене косоугле заграде „<“"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Документ завршен неочекивано са отвореним елементима — „%s“ је последње "
+"отворен елемент"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Документ завршен неочекивано, очекивао сам да наиђем на затворену косоуглу "
+"заграду која затвара ознаку <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Документ завршен неочекивано усред имена елемента"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Документ завршен неочекивано усред имена особине"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Документ завршен неочекивано усред почетне ознаке елемента."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Документ завршен неочекивано након знака једнакости после имена особине; "
+"вриједност особине није наведена"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Документ завршен неочекивано усред вриједности особине"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Документ завршен неочекивано усред завршне ознаке елемента „%s“"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Документ завршен неочекивано усред примедбе или упута за обраду"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Грешка у %d. реду, %d. знак: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Недовршена ознака ентитета"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Навод не почиње наводником"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Неупарен наводник у наредби или другом цитату из љуске"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Садржај завршен непосредно након „\\“ знака. (Ради се о тексту „%s“)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Садржај завршен прије наиласка на одговарајући наводник за %c. (Ради се о "
+"тексту „%s“)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Садржај празан (или садржи само бјелине)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Неуспјело читање података из подређеног процеса"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Неуспјело стварање цјевке за везу са подређеним процесом (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Неуспјело читање из подређене цјевке (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Неуспјело приступање директоријуму „%s“ (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Неуспјело извршавање подређеног процеса (%s)"
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "Неисправно име домаћина"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, fuzzy, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Неисправан низ у уносу за претварање"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr "Грешка при отварању директоријума „%s“: %s"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Неуспјело извршавање помоћног програма"
+
+# Овај превод није психолошке природе :)
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Неочекивана грешка док су у g_io_channel_win32_poll() читани подаци од "
+"подређеног процеса"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Неуспјело читање података од подређеног процеса (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Неочекивана грешка у select() при читању података од подређеног процеса (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Неочекивана грешка у waitpid() (%s)"
+
+# за сада овако, можда гранање, умножавање? виљушкање ;-)
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Неуспио fork() (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Неуспјело извршавање подређеног процеса „%s“ (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Неуспјело преусмјеравање улаза или излаза подређеног процеса (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Неуспио fork() подређеног процеса (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Непозната грешка при извршавању подређеног процеса „%s“"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"Није успио да прочита довољно података из цјевке ка подређеном процесу (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Знак ван опсега за УТФ-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Неисправан низ у уносу за претварање"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Знак ван опсега за УТФ-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr ""
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr ""
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr ""
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr ""
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Грешка при претварању: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr ""
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr ""
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Неисправно име домаћина"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Неисправно име домаћина"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, fuzzy, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Адреса „%s“ садржи неисправно назначене знаке"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s"
+
+# bug: plural-forms
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Не могу да обезбједим %lu бајтова за читање датотеке „%s“"
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Није подржано претварање из скупа знакова „%s“ у скуп „%s“"
diff --git a/trunk/po/sv.po b/trunk/po/sv.po
new file mode 100644
index 000000000..04e6ee852
--- /dev/null
+++ b/trunk/po/sv.po
@@ -0,0 +1,987 @@
+# Swedish messages for glib.
+# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# Daniel Nylander <po@danielnylander.se>, 2006.
+# Christian Rose <menthos@menthos.com>, 2001, 2002, 2003, 2004, 2005.
+#
+# $Id: sv.po,v 1.87 2006/08/16 05:20:33 dnylande Exp $
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-15 21:54+0100\n"
+"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Oväntat attribut \"%s\" för elementet \"%s\""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Attributet \"%s\" för elementet \"%s\" hittades inte"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Oväntad tagg \"%s\"\", taggen \"%s\" förväntades"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Oväntad tagg \"%s\" inom \"%s\""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Ingen giltig bokmärkesfil hittades i datakataloger"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Ett bokmärke för uri \"%s\" finns redan"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Inget bokmärke hittades för uri \"%s\""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Ingen Mime-typ definierad i bokmärket för uri \"%s\""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Ingen privat flagga har definierats i bokmärket för uri \"%s\""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Inga grupper inställda i bokmärket för uri \"%s\""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Inget program med namnet \"%s\" registrerade ett bokmärke för \"%s\""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Misslyckades med att läsa den symboliska länken \"%s\": %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Konvertering från teckentabellen \"%s\" till \"%s\" stöds inte"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Kunde inte öppna konverteraren från \"%s\" till \"%s\""
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Ogiltig bytesekvens i konverteringsindata"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Fel vid konvertering: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Ofullständig teckensekvens vid slutet av indata"
+
+# fallback syftar på en sträng
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Kan inte konvertera reservsträngen \"%s\" till kodningen \"%s\""
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI:n \"%s\" är ingen absolut URI som använder \"file\"-schemat"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Lokala fil-URI:n \"%s\" får inte innehålla en \"#\""
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI:n \"%s\" är ogiltig"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Värdnamnet i URI:n \"%s\" är ogiltigt"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI:n \"%s\" innehåller ogiltigt kodade tecken"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Sökvägen \"%s\" är ingen absolut sökväg"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Ogiltigt värdnamn"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Fel vid öppning av katalogen \"%s\": %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Kunde inte allokera %lu byte för att läsa filen \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Fel vid läsning av filen \"%s\": %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Misslyckades med att läsa från filen \"%s\": %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Misslyckades med att öppna filen \"%s\": %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"Misslyckades med att få tag på attributen på filen \"%s\": fstat() "
+"misslyckades: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Misslyckades med att öppna filen \"%s\": fdopen() misslyckades: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Misslyckades med att byta namn på filen \"%s\" till \"%s\": g_rename() "
+"misslyckades: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Misslyckades med att skapa filen \"%s\": %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"Misslyckades med att öppna filen \"%s\" för skrivning: fdopen() "
+"misslyckades: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Misslyckades med att skriva filen \"%s\": fwrite() misslyckades: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Misslyckades med att stänga filen \"%s\": fclose() misslyckades: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+"Befintliga filen \"%s\" kunde inte tas bort: g_unlink() misslyckades: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Mallen \"%s\" är ogiltig, den får inte innehålla ett \"%s\""
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Mallen \"%s\" innehåller inte XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Misslyckades med att läsa den symboliska länken \"%s\": %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Symboliska länkar stöds inte"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Kunde inte öppna konverteraren från \"%s\" till \"%s\": %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Kan inte göra en rå läsning i g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Överbliven okonverterad data i läsbufferten"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanalen slutar med ett ofullständigt tecken"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Kan inte göra en rå läsning i g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Misslyckades med att öppna filen \"%s\": open() misslyckades: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Misslyckades med att mappa filen \"%s\": mmap() misslyckades: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Fel på rad %d kolumn %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Fel på rad %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Tom entitet \"&;\" hittades, giltiga entiteter är: &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Tecknet \"%s\" är inte giltigt i början på ett entitetsnamn; tecknet & "
+"inleder en entitet. Om detta &-tecken inte ska vara en entitet måste du "
+"skriva om det som &amp;."
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Tecknet \"%s\" är inte giltigt inuti ett entitetsnamn"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Entitetsnamnet \"%s\" är okänt"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Entiteten slutade inte med ett semikolon. Troligtvis använde du ett &-tecken "
+"utan att avse att starta en entitet. Skriv om &-tecknet som &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Misslyckades med att tolka \"%-.*s\", som skulle ha varit ett tal inuti en "
+"teckenreferens (&#234; till exempel). Talet är kanske för stort"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Teckenreferensen \"%-.*s\" kodar inte ett tillåtet tecken"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Tom teckenreferens, måste innehålla ett tal som exempelvis &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Teckenreferensen slutade inte med ett semikolon. Troligtvis använde du ett &-"
+"tecken utan att avse att starta en entitet. Skriv om &-tecknet som &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Oavslutad entitetsreferens"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Oavslutad teckenreferens"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Ogiltigt UTF-8-kodad text"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Dokumentet måste börja med ett element (exempelvis <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"\"%s\" är inte ett giltigt tecken efter ett \"<\"-tecken. Det får inte "
+"inleda ett elementnamn"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Konstigt tecken \"%s\", ett \">\"-tecken förväntades för att avsluta "
+"starttaggen för elementet \"%s\""
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Konstigt tecken \"%s\", ett \"=\" förväntades efter attributnamnet \"%s\" "
+"till elementet \"%s\""
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Konstigt tecken \"%s\", ett \">\"- eller \"/\"-tecken förväntades för att "
+"avsluta starttaggen för elementet \"%s\", eller möjligtvis ett attribut. Du "
+"kanske använde ett ogiltigt tecken i ett attributnamn"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Konstigt tecken \"%s\", ett startcitationstecken förväntades efter "
+"likhetstecknet när värdet av attributet \"%s\" till elementet \"%s\" "
+"tilldelades"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"\"%s\" är inte ett giltigt tecken efter tecknen \"</\". \"%s\" får inte "
+"inleda ett elementnamn"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"\"%s\" är inte ett giltigt tecken efter stängelementnamnet \"%s\". Det "
+"tillåtna tecknet är \">\""
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Elementet \"%s\" stängdes, inget element är öppet för tillfället"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"Elementet \"%s\" stängdes, men det element som är öppet för tillfället är \"%"
+"s\""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Dokumentet var tomt eller innehöll endast tomrum"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Dokumentet tog oväntat slut efter ett öppningsklammer \"<\""
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Dokumentet tog oväntat slut då element fortfarande var öppna. \"%s\" var det "
+"senast öppnade elementet"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Dokumentet tog oväntat slut, en stängningsklammer föräntades för att avsluta "
+"taggen <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Dokumentet tog oväntat slut inuti ett elementnamn"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Dokumentet tog oväntat slut inuti ett attributnamn"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Dokumentet tog oväntat slut inuti en elementöppnande tagg."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Dokumentet tog oväntat slut efter likhetstecknet som följde ett "
+"attributnamn. Inget attributvärde"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Dokumentet tog oväntat slut inuti ett attributvärde"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Dokumentet tog oväntat slut inuti stängningstaggen för elementet \"%s\""
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Dokumentet tog oväntat slut inuti en kommentar eller behandlingsinstruktion"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Fel på rad %d kolumn %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Oavslutad entitetsreferens"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Citerad text börjar inte med citationstecken"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Ensamt citationstecken på kommandoraden eller annan skalciterad text"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Texten slutade efter ett \"\\\"-tecken (texten var \"%s\")."
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Texten slutade innan matchande citationstecken hittades för %c (texten var "
+"\"%s\")."
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Texten var tom (eller innehöll bara tomrum)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Misslyckades med att läsa data från barnprocessen"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Misslyckades med att skapa rör för kommunikation med barnprocess (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Misslyckades med att läsa från rör till barn (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Misslyckades med att byta till katalogen \"%s\" (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Misslyckades med att köra barnprocess (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Ogiltigt programnamn: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Ogiltig sträng i argumentvektorn vid %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Ogiltig sträng i miljön: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Ogiltig arbetskatalog: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Misslyckades med att köra hjälparprogram (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Oväntat fel i g_io_channel_win32_poll() vid inläsning av data från en "
+"barnprocess"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Misslyckades med att läsa data från barnprocess (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Oväntat fel i select() vid läsning av data från en barnprocess (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Oväntat fel i waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Misslyckades med att grena (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Misslyckades med att köra barnprocessen \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+"Misslyckades med att dirigera om utdata eller indata från barnprocess (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Misslyckades med att skapa barnprocess (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Okänt fel vid körning av barnprocessen \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"Misslyckades med att läsa tillräckligt med data från röret till barnets pid "
+"(%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Tecknet är utanför intervallet för UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Ogiltig sekvens i konverteringsindata"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Tecknet är utanför intervallet för UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Användning:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[FLAGGA...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Hjälpflaggor:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Visa hjälpflaggor"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Visa alla hjälpflaggor"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Programflaggor:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Kan inte tolka heltalsvärdet \"%s\" för %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Heltalsvärdet \"%s\" för %s är utanför intervallet"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Kan inte tolka dubbelvärdet \"%s\" för %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Dubbelvärdet \"%s\" för %s är utanför intervallet"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Fel vid tolkning av flaggan %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Argument saknas för %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Okänd flagga %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Giltig nyckelfil kunde inte hittas i datakataloger"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Inte en vanlig fil"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Filen är tom"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Nyckelfilen innehåller raden \"%s\" som inte är ett nyckel-värde-par, grupp "
+"eller kommentar"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Ogiltigt programnamn: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Nyckelfilen börjar inte med en grupp"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Ogiltigt programnamn: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Nyckelfilen innehåller kodningen \"%s\" som inte stöds"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Nyckelfilen har inte gruppen \"%s\""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Nyckelfilen har inte nyckeln \"%s\""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Nyckelfilen innehåller nyckeln \"%s\" med värdet \"%s\" som inte är UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Nyckelfilen innehåller nyckeln \"%s\" som har värde som inte kan tolkas."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Nyckelfilen innehåller nyckeln \"%s\" i gruppen \"%s\" som har värde som "
+"inte kan tolkas."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Nyckelfilen har inte nyckeln \"%s\" i gruppen \"%s\""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Nyckelfilen innehåller kontrolltecken i slutet på en rad"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Nyckelfilen innehåller ogiltiga kontrollsekvensen \"%s\""
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Värdet \"%s\" kan inte tolkas som ett tal."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Heltalsvärdet \"%s\" är utanför intervallet"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Värdet \"%s\" kan inte tolkas som ett flyttal."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Värdet \"%s\" kan inte tolkas som ett booleskt värde."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Kunde inte byta filläge: fork() misslyckades: %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Kunde inte byta filläge: waitpid() misslyckades %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Kunde inte byta filläge: chmod() misslyckades: %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr "Kunde inte byta filläge: Barnet avslutades med signal: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr "Kunde inte byta filläge: Barnet avslutades onormalt"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Konvertering från teckentabellen \"%s\" till \"%s\" stöds inte"
+
+#~ msgid "Could not open converter from `%s' to `%s': %s"
+#~ msgstr "Kunde inte öppna konverteraren från \"%s\" till \"%s\": %s"
+
+#~ msgid ""
+#~ "Failed to parse '%s', which should have been a digit inside a character "
+#~ "reference (&#234; for example) - perhaps the digit is too large"
+#~ msgstr ""
+#~ "Misslyckades med att tolka \"%s\", som skulle ha varit ett tal inuti en "
+#~ "teckenreferens (&#234; till exempel). Talet är kanske för stort"
+
+#~ msgid "Character reference '%s' does not encode a permitted character"
+#~ msgstr "Teckenreferensen \"%s\" kodar inte ett tillåtet tecken"
+
+#~ msgid "Incorrect message size"
+#~ msgstr "Felaktig meddelandestorlek"
+
+#~ msgid "Socket error"
+#~ msgstr "Uttagsfel"
+
+#~ msgid "Channel set flags unsupported"
+#~ msgstr "Kanalinställningsflaggor stöds inte"
+
+#~ msgid ""
+#~ "The hostname of the URI `%s' is contains invalidly escaped characters"
+#~ msgstr "Värdnamnet för URI:n \"%s\" innehåller felaktigt inbäddade tecken"
diff --git a/trunk/po/ta.po b/trunk/po/ta.po
new file mode 100644
index 000000000..ad7f3f22e
--- /dev/null
+++ b/trunk/po/ta.po
@@ -0,0 +1,926 @@
+# translation of glib.glib-2-12.ta.po to Tamil
+# translation of glib.HEAD.ta.po to Tamil
+# Tamil translation of GLib.
+# Copyright (C) 2001, 2006 Free Software Foundation, Inc.
+# Dinesh Nadarajah <n_dinesh@yahoo.com>, 2001.
+# Felix <ifelix25@gmail.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib.glib-2-12.ta\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-30 16:06+0530\n"
+"Last-Translator: Felix <ifelix25@gmail.com>\n"
+"Language-Team: Tamil <ta@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"\n"
+"\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Unexpected attribute '%s' for element '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "மதிப்பு '%s' க்கு '%s' உறுப்பு எதுவும் இல்லை"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "எதிர்பாராத ஒட்டு'%s', ஒட்டு '%s' எதிர்பார்க்கப்பட்டது"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "'%s' க்குள் எதிர்பாராத ஒட்டு '%s' உள்ளது"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "தரவு அடைவுகளில் சரியான புத்தகக்குறி கோப்பு எதுவும் இல்லை"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "URI '%s' க்கு ஏற்கனவே புத்தகக்குறி உள்ளது"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "URIக்கு புத்தகக்குறி எதுவும் இல்லை '%s'"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "URI '%s'க்கு MIME வகை எதுவும் புத்தகக்குறியில் குறிப்பிடப்படவில்லை"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "URI '%s'க்கு புத்தகக்குறியில் தனிபட்ட கொடி எதுவும் குறிப்பிடப்படவில்லை"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "URI '%s'க்கான புத்தகக்குறியில் குழுக்கள் எதுவும் அமைக்கப்படவில்லை"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "'%s' பெயரிலுள்ள பயன்பாடு '%s'க்கு ஒரு புத்தகக்குறியை பதிவு செய்தது"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "'%s' என்பதன்-குறுக்கம் இணைப்பை வாசிக்க முடியவில்லை: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "வரியுரு வகை `%s' இலிருந்து `%s' க்கு மாற்றுவதற்கு ஆதரவளிப்பு கிடையாது"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "'%s' லிருந்து '%s'க்கு மாற்றியை திறக்க முடியவில்லை"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "நிலை மாற்றியின் உள்ளீடுக்கு தவறான பைட் வரிசைமுறை"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "மாற்றும் போது பிழை: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "உள்ளீடின் முடிவில் பூர்த்தியாகாத வரியுரு வரிசைமுறை"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "பின்னடைப்பு '%s', '%s' குறிக் கணமிற்கு மாற்ற முடியவில்லை"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' \"கோப்பு\"திட்டத்தை பயன்படுத்தும் முழுமையான URI அல்ல"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "உள்ளமைக் கோப்பு வலை முகவரி `%s' இல் ஓர் `#' இல்லாமல் இருக்கலாம்"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "`%s' செல்லுபடியாகாத வலை முகவரி"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "`%s' வலை முகவரியின் விருந்தோம்புப்-பெயர் செல்லுபடியாகாதது"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "வலை முகவரி `%s' இல் செல்லுபடியாகாத 'விடுபடு' வரியுருகள்"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "'%s' பாதைப்-பெயர் ஓர் தனிப் பாதை அல்ல"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "பிழையான விருந்தோம்புப்-பெயர்"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "'%s' அடைவு திறக்கும்போது பிழை: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "%lu பைட்டுகளை \"%s\" கோப்பு வாசிப்பதற்கு ஒதுக்கிவைக்க முடியவில்லை"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "'%s' கோப்பு வாசிக்கும் போது பிழை: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "'%s' கோப்பிலிருந்து வாசிக்க முடியவில்லை: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "'%s' கோப்பு திறக்க முடியவில்லை: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "'%s' கோப்பின் பண்புகளை பெறமுடியவில்லை: fstat() செயலிழந்தது: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "'%s' கோப்பை திறக்க முடியவில்லை: fdopen() செயலிழந்தது: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "'%s'கோப்பினை '%s'க்கு மறுபெயரிட முடியவில்லை: g_rename() செயலிழந்தது: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "'%s' கோப்பை படைக்க முடியவில்லை: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "'%s' கோப்பினை திறக்க முடியவில்லை: fdopen() செயலிழந்தது: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "'%s' கோப்பினை எழுத முடியவில்லை: fwrite() செயலிழந்தது: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "'%s'கோப்பினை மூட முடியவில்லை: fclose() செயலிழந்தது: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "இருக்கும் கோப்பு '%s' ஐ நீக்க முடியாது: g_unlink() செயலிழந்தது: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "'%s' படிம அச்சு செல்லுபடியாகாதது; அதனில் '%s' இருக்கக் கூடாது"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "'%s' படிம அச்சு XXXXXX கொண்டு முடிவதில்லை"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "'%s' என்பதன்-குறுக்கம் இணைப்பை வாசிக்க முடியவில்லை: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "என்பதன்-குறுக்கம் இணைப்புகளுக்கு ஆதரவு கிடையாது"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "'%s' லிருந்து'%s'க்கு மாற்றியை திறக்க முடியவில்லை: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "g_io_channel_read_line_string இல் மூலமாக வாசிக்க முடியாது"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "வாசிப்புத் தாங்ககத்தில் மாற்றப்படாத மீதித் தரவுகள்"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "வாய்க்கால் பாதி வரியுருவில் முடிவடைகிறது"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "g_io_channel_read_to_end இல் மூலமாக வாசிக்க முடியாது"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "'%s' கோப்பினை திறக்க முடியவில்லை: open() செயலிழந்தது: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "'%s' கோப்பினை ஒப்பிட முடியவில்லை: mmap() செயலிழந்தது: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "%d வரியில் %d வரியுருவில் பிழை: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "%d வரியில் பிழை: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"வெற்றா பிரதிநிதி '&;' கண்டது; சரியான பிரதிநிதிகள்: &amp; &quot; &lt; &qt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"'%s' வரியுரு பிரதிநிதியின் தொடக்கத்தில் வரக்கூடாது; & வரியுரு பிரதிநிதியைத் "
+"தொடங்கும்; இந்த & ஓர் பிரதிநிதியாக இருக்கக்கூடாது என்றால்; அதை &amp ஆக விடுவி;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "'%s' வரியுரு பிரதிநிதியின் பெயரில் பிழையானது"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "பிரதிநிதியின் பெயர் '%s' தெரியாதது"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"பிரதிநிதி ';' உடன் முடிவடையவில்லை; நீங்கள் பிரதிநிதி ஒன்றை தொடங்க யோசிக்காமல் '&' "
+"பயன்படுத்தி இருக்கலாம் - '&'சை &amp ஆக விடுவி;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"'%-.*s'ஐ கூறிட முடியவில்லை,அதன் ஒரு எழுத்துக்குள் ஒரு தசமத்தை கொண்டிருக்க வேண்டும் "
+"குறிப்பு (&#234; எடுத்துக்காட்டாக) - எனினும் தசமம் மிக பெரியதாக உள்ளது"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "எழுத்து குறிப்பு '%-.*s' ஒரு அனுமதிக்கப்பட்ட எழுத்தினை குறிமுறையாக்கவில்லை"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "வேற்றான வரியுரு குறிப்பு; &#454 ஆகிய இலக்கங்கள் சேர்ந்திருக் வேண்டும்;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "முடிவடையாத உள்ளீட்பு மேற்கோள்"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "முடிவடையாத வரியுரு மேற்கோள்"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "பிழையான UTF-8 குறியீடு செய்யப்பட்ட உரை"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "ஆவணம் ஓர் உறுப்புடன் (உதாரணம்: <book>) தொடங்க வேண்டும்"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'<' வரியுருவை தொடர்ந்து '%s' வர முடியாது; அதைப் பயன்படுத்தி ஓர் உறுப்படியின் பெயரைத் "
+"தொடங்க முடியாது"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"ஒற்றை வரியுரு '%s', '%s' உறுப்படி தொடங்கல் ஒட்டை ஓர் '>' வரியுரு முடிவு செய்யும் "
+"என்று எதிர்பார்த்தது"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"'%s' ஓர் ஒற்றை வரியுரு, பண்பின் பெயர் '%s' பின் ('%s' உறுப்பின்) எதிர்பார்த்தது ஓர் '=' "
+"வரியுரு"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"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"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "'%s' உறுப்பு மூடப்பட்டுல்லது, தற்பொது ஒரு உறுப்பும் திறந்து இல்லை"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "'%s' உறுப்பு மூடப்பட்டுல்லது, அனால் தற்பொது திறந்திறுக்கும் உறுப்பு '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "வெற்றான ஆவணம் அல்லது ஆவணத்தில் இறுப்பது அனைத்தும் வெண்வெளி"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "'<' பிறகு ஆவணம் திடீரென முடிவடைந்தது"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"உறுப்புகள் திறந்திறுக்கும்போது ஆவணம் திடீரென முடிவடைந்தது - கடைசியாகத் திறக்கப்பட்ட "
+"உறுப்பு '%s'"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"ஆவணம் திடீரென முடிவடைந்தது, அடையாள ஒட்டு <%s/> முடிவில் ஓர் '}' இருக்கும் என "
+"எதிர்பார்த்தது"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "உறுப்பு பெயர் உள்ளே ஆவணம் திடீரென முடிவடைந்தது"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "பண்பு பெயர் உள்ளே ஆவணம் திடீரென முடிவடைந்தது"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "உறுப்பு-தொடங்களின் அடையாள ஒட்டு உள்ளே ஆவணம் திடீரென முடிவடைந்தது"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "பண்பு பெயர் உள்ளிறுக்கும் போது ஆவணம் திடீரென முடிவடைந்தது"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "'%s' என்னும் மூடு-அடையாள ஒட்டு உள்ளே ஆவணம் திடீரென முடிவடைந்தது"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "ஆவணம் திடீரென குறிப்புரையுல் அல்லது செயலாக்கம் ஆணையுல் முடிவடைந்தது"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "%d வரியில் %d வரியுருவில் பிழை: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "முடிவடையாத உள்ளீட்பு மேற்கோள்"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "மேற்களித்த உரை ஓர் \" -உடன் தொடங்கவில்லை"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "`கட்டளை வடியில் அல்லது வேறு மேற்களித்த உரையில் பொருத்தமற்ற \" "
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "'\\' வரியுருக்கு பின்பு உரை முடிவடைந்தது. (கடைசி உரை: '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"%c க்கு பொருத்தமான மேற்கோள் கண்டுபிடிப்பதட்கு முன் உரை முடிவடைந்தது. (உரை: '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "உரை வெற்றா இருந்தது (அல்லது வெண்வெளி மட்டுமே)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "சேய் செயலில் இருந்து தரவு வாசிக்க முடியவில்லை"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "(%s) சேய்-செயலிடன் தொடர்பு கொல்ல கழாய்த்-தொடரைப் படைக்க முடியவில்லை"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "(%s) சேய் கழாய்த் தொடரில் இருந்து வாசிக்க முடியவில்லை"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "'%s' (%s) அடைவுக்கு போக முடியவில்லை"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "(%s) சேய்-செயலை இயக்க முடியவில்லை"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "தவறான நிரல் பெயர்: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "%dல் மதிப்பரு வெக்டாரில் தவறான சரம்: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "சூழலில் தவறான சரம்: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "தவறான பணி செய்யும் அடைவு: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "உதவியாளர் நிலையை இயக்க முடியவில்லை (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "(%s) சேய்-செயலில் இருந்து தரவு வாசிக்க முடியவில்லை"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "(%s) சேய்-செயலில் இருந்து தரவு வாசிக்கும் போது, select()'டில் எதிர்பாராத பிழை"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "(%s) waitpid()'டில் எதிர்பாராத பிழை"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "(%s) தொடங்க முடியவில்லை"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "\"%s\" (%s) சேய்-செயலை இயக்க முடியவில்லை"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "சேய் (%s) செயலகத்தின் வெளியீடலை அல்லது உள்ளடலை திசை-மாற்றும்போது பிழை"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "சேய் (%s) செயலகத்தை தொடங்க முடியவில்லை"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "சேய் செயல் \"%s\" இயக்கும்போது தெரியாத பிழை"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Failed to read enough data from child pid pipe (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "UTF-8 க்கு வரியுரு வீச்சு எல்லைக்கு வெளியே"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "உரையாடல் உள்ளீட்டில் தவறான வரிசை"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "UTF-16 க்கு வரியுரு வீச்சு எல்லைக்கு வெளியே"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "ஓபயன்பாடு:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "உதவி விருப்பங்கள்:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "உதவி விருப்பங்களை காட்டு"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "அனைத்து உதவி விருப்பங்களை காட்டு"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "பயன்பாடு விருப்பங்கள்:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "'%s' க்கு %sன் இயல் எண் மதிப்பினை கூறிட முடியாது"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "'%s' க்கு %sன் இயல் எண் மதிப்பு வரையறையை தாண்டியுள்ளது"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "இரட்டை மதிப்பு '%s' ஐ %sக்கு கூறிட முடியாது"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "இரட்டை மதிப்பு '%s' %sக்கு வரையறையை தாண்டியுள்ளது"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "கூறிடும் போது பிழை: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr " %sக்கான விடுபட்ட மதிப்புரு"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "தெரியாத விருப்பம் %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "தரவு அடைவுகளில் சரியான விசை கோப்பினை காண முடியவில்லை"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "ஒரு முறையான கோப்பில்லை"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "கோப்பு வெற்றாக உள்ளது"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"விசை கோப்பு வரி '%s' கொண்டுள்ளது இது விசை-மதிப்பு சோடியை, குழு, அல்லது குறிப்பு அல்ல"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "தவறான நிரல் பெயர்: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "விசை கோப்பு ஒரு குழுவாக ஆரம்பமாகாது"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "தவறான நிரல் பெயர்: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "விசை கோப்பு துணையில்லாத குறிமுறையை கொண்டுள்ளது '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "விசை கோப்பு குழுவினை கொண்டிருக்கவில்லை '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr " '%s' விசையை விசை கோப்பு கொண்டிருக்கவில்லை"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr " '%s'மதிப்பினை உடைய '%s'விசை விசை கோப்பு கொண்டுள்ளது, இது UTF-8 அல்ல"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "%s'விசையை விசை கோப்பு கொண்டுள்ளது அது கொண்டுள்ள மதிப்பினை மாற்ற முடியாது."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"'%s'குழுவில் %s'விசையை விசை கோப்பு கொண்டுள்ளது அது கொண்டுள்ள மதிப்பினை மாற்ற "
+"முடியாது."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "'%s' குழுவில் '%s' விசையை விசை கோப்பு கொண்டிருக்கவில்லை"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "கடைசி வரியில் விசை கோப்பு விடுபடு எழுத்தினை கொண்டுள்ளது"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "விசை கோப்பு தவறான விடுபடு வரிசையை கொண்டுள்ளது '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "மதிப்பு '%s' ஒரு எண்ணாக செயல்பட முடியாது."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "இயல் எண் மதிப்பு '%s' வரையறையை தாண்டியுள்ளது"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "மதிப்பு '%s' தசம எண்ணாக செயல்பட முடியாது."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "மதிப்பு '%s' பூலியனாக செயல்பட முடியாது."
diff --git a/trunk/po/te.po b/trunk/po/te.po
new file mode 100644
index 000000000..adb8cdcb8
--- /dev/null
+++ b/trunk/po/te.po
@@ -0,0 +1,922 @@
+# Telugu translation of glib
+# Copyright (C) 2005 Free Software Foundation, Andhra Pradesh.
+# This file is distributed under the same license as the GLIB package.
+#
+# విక్రం ఫణీంద్ర <vikramphaneendra@yahoo.co.in>, 2005
+# దండు ప్రసాద్ <dandu_prasad2000@yahoo.com>, 2005
+# రమణ సాయి <rmn_sai@yahoo.co.in>, 2005
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GLIB\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2004-12-13 20:16+0100\n"
+"Last-Translator: రమణ సాయి <rmn_sai@yahoo.com>\n"
+"Language-Team: Free Software Foundation, Andhra Pradesh <fsfap@gnu.org.in>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "బేసి అక్షరము '%s', ఊహించిన '=' తర్వాత '%s' ఆపాదించు నామం '%s' మూలకం "
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr " సరియైన మీటదస్త్రం దత్తాంశవివరణలో లభించలేదు "
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr " '%s' చిహ్న పూరితజోడి చదువుటలో విఫలమయినావు : %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "అక్షరమాలలొ కల '%s' నుండి '%s' కు పరివర్తించడానికి సహకరించదు"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "'%s' నుండి '%s' కు పరివర్తించడం సాధ్యం కాదు "
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "ఎగుబడి బైట్ క్రమంను పరివర్తించుట నిస్సారమగును"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "పరివర్తనం నందు దోషం కలదు: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "చివరి ఎగుబడి నందు పాక్షికముగా అక్షర క్రమము కలదు."
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "ఫాల్ బ్యాక్ '%s' ను '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "\"దస్త్రం\" యోచనను ఉపయోగించిన యుఆర్ఐ '%s' సంపూర్ణమైన యుఆర్ఐ కాదు"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "స్థానిక యుఆర్ఐ '%s' '#' ను కలుపుకొనియండలెదు "
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr " '%s' యుఆర్ఐ నిస్సారము"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "ఆతిథ్య నామం యొక్క యుఆర్ఐ '%s' నిస్సారము"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "యుఆర్ఐ '%s' నిస్సారమైన ఎస్కేప్ అక్షరాలు కలిగియున్నాయి."
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr " '%s' త్రోవ నామం సరిఐనది కాదు."
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "నిస్సారమైన ఆతిథ్య నామము"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr " వివరణ తెరచుటలో దోషం '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "%lu బైట్లని దస్త్రం \"%s\" చదువుటకు ఇవ్వలేము"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "దస్త్రం '%s': %s చదువుటలో దోషం"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr " దస్త్రం '%s': %s నుండి చదువుటలో విఫలమైనారు"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr " దస్త్రం '%s': %s తెరుచుటలో విఫలమైనారు"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "దస్త్ర ఆపాదనలు విఫలమగును '%s': ఎఫ్ స్టాట్() విఫలమైనది: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "దస్త్రం '%s' తెరుచుటలో విఫలమైనారు: ఎఫ్ డిఓపన్() విఫలమైనది: %s"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "దస్త్రం '%s' తెరుచుటలో విఫలమైనారు: ఎఫ్ డిఓపన్() విఫలమైనది: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr " '%s' దస్త్రమును సృష్టించుటలో విఫలమయినావు. :%s"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "దస్త్రం '%s' తెరుచుటలో విఫలమైనారు: ఎఫ్ డిఓపన్() విఫలమైనది: %s"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "దస్త్రం '%s' తెరుచుటలో విఫలమైనారు: ఎఫ్ డిఓపన్() విఫలమైనది: %s"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "దస్త్రం '%s' తెరుచుటలో విఫలమైనారు: ఎఫ్ డిఓపన్() విఫలమైనది: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr " '%s' మాదిరి, '%s' కలిగియుండలెదు. "
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr " '%s' మాదిరి XXXXXX అంతం అవలేదు. "
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr " '%s' చిహ్న పూరితజోడి చదువుటలో విఫలమయినావు : %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "చిహ్న పూరితజోడి సహకరించలెదు. "
+
+#: glib/giochannel.c:1152
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr " తెరచుటలో `%s' నుండి `%s' సాధ్యం కాదు : %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr " జి_ఐఓ_ఛానెల్_రీడ్_లైన్_స్ర్టింగ్ ముడి చదువు సాధ్యపడదు "
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr " మిగిలిన దత్తాంశమును రీడ్ బఫర్ లో పరివర్తించలెము "
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr " పూర్తికాని అక్షరాన్ని ప్రసార మార్గం ముగించును. "
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "జి_ఐఓ_ఛానెల్_రీడ్_లైన్_ఎండ్ ముడి చదువు సాధ్యపడదు"
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "దస్త్రం '%s' తెరుచుటలో విఫలమైనారు: ఎఫ్ డిఓపన్() విఫలమైనది: %s"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "దస్త్రం '%s' తెరుచుటలో విఫలమైనారు: ఎఫ్ డిఓపన్() విఫలమైనది: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr " %d క్యార్ %d వరుసలో దోషం కలదు : %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "%d వరుసలో దోషం కలదు : %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr " ఖాశి వ్యష్టి '&;' చూడబడినది; వర్తించు వ్యష్టిలు: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+" వ్యష్టినామముతో ప్రారంభమగు అక్షరము '%s' నిస్సారము; వ్యష్టి & అక్షరముతో ప్రారంభమగును;వ్యష్టి "
+"ప్రారంబమగును; ఒక వేశ ఆంపర్సండ్ ఊహించిన విధంగా వ్యష్టి కాకపోతే , ఎస్కేప్it as &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr " వ్యష్టినామంలో అక్షరము '%s' నిస్సారము "
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr " '%s' వ్యష్టి నామం తెలియదు "
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+" వ్యష్టి సెమికోలన్ తో పూర్తవలేదు; దాదాపుగా యాంపర్ సెండ్ ఉపయెగించవలెను అక్షరము దాదాపుగా -' ఎస్కేప్ "
+"యంపర్ సెండ్ యాజ్ &యాంప్;' తో ప్రారంభమవలేదు. "
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"అక్షరములో అంకె కలిగియున్నందువలన '%-.*s', పార్సింగ్ విఫలమైనది.దాదాపుగా అంక్య భారీగా ఉన్నది -నివేదన "
+"(ఉదాహరణకు : &#234; )"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "అక్షర నివేదన '%-.*s' అనుమతించబడిన అక్షరము ఎన్ కోడ్ అవ్వదు."
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr " ఖాళీ అక్షర నివేదన తప్పనిసరిగా &#454 ఈ సంఖ్యను కలుపుకొనవలెను"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"అక్షర నివేదన సెమికోలన్ తో ముగియలేదు; దాదాపుగా యిది ఉపయెగించండి యాంపర్ సెండ్ అక్షరం తో ప్రారంభమవరాదు - "
+"ఎస్సేప్ యాంపర్ సెండ్ యాజ్ &యాంప్ "
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr " పూర్తికాని వ్యష్టినివెదన "
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr " అక్షర నివేదన పూర్తికాలేదు "
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "నిస్సారమైన యుటిఎఫ్-8 ఎన్ కోడెడ్ పాఠం"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "పత్రం తప్పనిసరిగా ఒక మూలకంతో ప్రారంభమవలెను (ఉదా. <బుక్>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+" '<' తో ప్రారంభమగు '%s' అనునది సరరిఐన అక్షరం కాదు ; యిది మూలక నామంతో ప్రారంభమవలేదు. "
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr "బేసి అక్షరము '%s', ఊహించిన '>' అక్షరము చివరి ప్రారంభ బొందు మూతకం '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr "బేసి అక్షరము '%s', ఊహించిన '=' తర్వాత '%s' ఆపాదించు నామం '%s' మూలకం "
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"'%s' ఊహించిన బేసి అక్షరము '>' లేక '/' చివరి ర్రంభ బొందు అక్షరము మాలకం %sలేక ఇచ్చాపూర్వక "
+"ఆపాదన; దాదాపుగా ఆపాదన నామంలో అనర్హమైన అక్షరం ఉపమెగించినావు"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"బేసి అక్షరము '%s', ఊహించిన తెరచిన క్వోట్ చిహ్నం తరాత ఇచ్చిన ఆపాదన విలువ '%s' మూతకము '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr " '</' వెంటనే ప్రారంభమగు '%s' నిసారమైన అక్షరము ; '%s' తో మూలకనామం ప్రారంభమవరాదు "
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr " '%s' మూలకం మూయబడినది, ప్రస్ధుతం ఏ మూలకము తెరచియుండలెదు "
+
+# ../glib/gmarkup.c:1588
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "'%s' మూలకం మూయబడినది, కాని ప్రస్ధుతం తెరువ బడిన మూలకం '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr " పత్రం ఖాలిగా ఉన్నది లేక ఒక వైట్ స్పేస్ కలిగి యున్నది. "
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "పత్రం చివర కోణ కుండలీకరణము'<' వెంటనె అనవసరముగా ముగింపు అయినది"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"మూలకములు ఇంకను తెరచియున్న పత్రం ఊహించని విధంగా అంతమైనది- '%s' చివరిది మూలకము తెరచబడినది"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"పత్రం ఊహించని విధంగా అంతమైనది,మూసిన కోణకుండశికరణం అంతము చూచుటకు ఊహించబడినది బొందు <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr " పత్రం చివర ఊహించని మూలకనామం కలదు "
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "పత్రం చివర ఊహించని ఆపాదననామం కలదు"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "పత్రం చివర ఊహించని తెరచిన బొందు కలదు."
+
+#: glib/gmarkup.c:1805
+#, fuzzy
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+" '=' చిహ్నము తర్వాత క్రింద కనబరిచిన ఆపాదన పాఠం చివర ఊహించకుండా ఉన్నది. నామం; ఆపాదన విలువ లేదు."
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr " లోపల ఆపాదన విలువ ఉన్నపుడు పాఠం ఊహించకుండా ముగింపు అయినది "
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr " '%s'మూలకము యోక్క మూసిన బొందు ఊహించకుండా పాఠం ముగింపు అయినది "
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr " లోపల వ్యాఖ్య క్రమగతి ఆదేశం ఉండగా ఊహించకుండా పాఠం ముగింపు అయినది "
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr " %d క్యార్ %d వరుసలో దోషం కలదు : %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr " పూర్తికాని వ్యష్టినివెదన "
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "కోటెడ్ పాఠం కొటేషన్ చిహ్నంతో ప్రారంభవరాదు"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr " కమాండ్ లైన్ లేద షల్_కోటెడ్ పాఠం లో సామ్యంలేని కొటేషన్ చిహ్నం కలదు "
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "పాఠం '\\' అక్షరము వెంటనె ముగింపు అయినది. (ఈ పాఠము '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "సామ్యమైన కొటేషన్ చిహ్నం %c లభించకముందె పాఠం ముగింపు అయినది . (ఈ పాఠము'%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "పాఠం ఏమి లేదు (లేక ఒక వైట్ స్పేస్ కలదు)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr " శిశు కార్యం నుండి చదువుటలో విఫలమయినావు "
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr " (%s) శిశు కార్యం తో తెలియచేయుటకు పైప్ ను సృష్టించుటలో విఫలమైనావు "
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr " శిశు పైప్ నుండి చదువుటలో విఫలమయినావు(%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr " '%s' (%s) వివరణ మార్చుటలో విఫలమయినావు "
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "(%s) శిశు కార్యం నిర్వర్తించుటలో విఫలమయినావు "
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "నిస్సారమైన ఆతిథ్య నామము"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, fuzzy, c-format
+msgid "Invalid string in environment: %s"
+msgstr "పరివర్తన ఎగుబడి వరుస నిస్సారము "
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr " వివరణ తెరచుటలో దోషం '%s': %s"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr " సహాయ కార్యక్రమం నిర్వర్తించుటలో విఫలమయినావు "
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr " శిశు కార్యం నుండి జి_ఐఓ_ఛానెల్_విన్౩౨32_పోల్() పాఠం ను చదువుటలో ఊహించని దోషం కలదు"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "(%s) శిశు కార్యం నుండి వివరము చదువుటలో విఫలమయినావు "
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr " శిశు కార్యం (%s) నుండి పాఠం చదువుటలో సెలెక్ట్() లో ఊహించని దోషం కలదు. "
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "వెయిట్ పిడ్() లో ఊహించని దోషం కలదు(%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "(%s) ఫోర్క్ విఫలమయినది "
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr " \"%s\" శిశుకార్యం నిర్వర్తించుటలో విఫలమయినావు (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "ఎగుబడికి రిడైరెక్ట్ చేయుటలో విఫలమైనది లేక శిశు కార్యం యొక్క దిగుబడి (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr " (%s) శిశుకార్యం యెక్క ఫోర్క్ విఫలమయినది "
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr " \"%s\" శిశుకార్యం నిర్వర్తించుటలో తెలియని ధోషం కలదు "
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "శిశు పిడ్ పైప్ (%s) నుండి సరిపడునంత చదువుటలో విఫలమైనావు. "
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "అక్షరము యుటిఫ్-8 శ్రేణియందు లేదు "
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "పరివర్తన ఎగుబడి వరుస నిస్సారము "
+
+# ../glib/gutf8.c:1382 ../glib/gutf8.c:1478
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "అక్షరము UTF-16 శ్రేణియందు లేదు"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "వినిమయం:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[ఇచ్చాపూర్వరకం...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "సహాయ ఇచ్ఛాపూర్వకాలు:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "సహాయ ఇచ్ఛాపూర్వకాలను చూపించుట"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "సహాయ ఇచ్ఛాపూర్వకాలన్నింటని చూపించుట"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "కార్యక్షేత్ర ఇచ్ఛాపూర్వకాలు :"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, fuzzy, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "పూర్ణాంకం విలువ '%s' పార్స్ చేయలేదు --%s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr " పూర్ణాంకం విలువ '%s' లో విస్రృతి లో లేని %s "
+
+#: glib/goption.c:831
+#, fuzzy, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "పూర్ణాంకం విలువ '%s' పార్స్ చేయలేదు --%s"
+
+#: glib/goption.c:839
+#, fuzzy, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr " పూర్ణాంకం విలువ '%s' లో విస్రృతి లో లేని %s "
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "పరివర్తనం నందు దోషం కలదు: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "తెలియని ఇచ్ఛాపూర్వకము %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr " సరియైన మీటదస్త్రం దత్తాంశవివరణలో లభించలేదు "
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "క్రమబద్దమైన దస్త్రం కాదు"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr " కాళీ దస్త్రం "
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr "ఏదైతే మీట-విలువలు , గ్రూప్ ,లేక వ్యాఖ్య కాదో అది మీట దస్త్రంలో లైన్ '%s' కలిగియున్నది"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "నిస్సారమైన ఆతిథ్య నామము"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr " మీట దస్త్రం సముదాయంతో ప్రారంభమవలెదు. "
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "నిస్సారమైన ఆతిథ్య నామము"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr " మీట దస్త్రం కలిగియున్న సంకేతరచన '%s' సహకరించదు "
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr " మీట దస్త్రం సముదాయం '%s' ను కలిగియుండలేదు "
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "మీట దస్త్రం '%s' తాళంను కలిగియుండలేదు. "
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "'%s' మీట దస్త్రం యొక్క మీటను కలిగియున్నది,దాని విలువ '%s' యుటిఫ్-8 "
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "'%s' మీట దస్త్రం యొక్క మీట ను కలిగియున్నది,దాని విలువను చదువుటకు సాధ్యపడదు."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"'%s' మీట దస్త్రం యొక్క మీట ను గ్రూప్ '%s' లో కలిగియున్నది,దాని విలువను చదువుటకు సాధ్యపడదు."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "'%s' మీట దస్త్రం యొక్క మీట ను గ్రూప్ '%s' లో కలిగియుండలేదు "
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr " మీట దస్త్రం గీత చివర ఎస్పేప్ అక్షరము కలదు"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr " '%s' మీట దస్త్రం నిస్సారమైన ఎస్పేప్ వరుస కలదు "
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "'%s' విలువను సంఖ్య గా చదువుటకు సాధ్యపడదు."
+
+#: glib/gkeyfile.c:3593
+#, fuzzy, c-format
+msgid "Integer value '%s' out of range"
+msgstr " పూర్ణాంకం విలువ '%s' లో విస్రృతి లో లేని %s "
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "'%s' విలువను సంఖ్య గా చదువుటకు సాధ్యపడదు."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "%s' విలువను బులియన్ గా చదువుటకు సాధ్యపడదు."
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "దస్త్రం '%s' తెరుచుటలో విఫలమైనారు: ఎఫ్ డిఓపన్() విఫలమైనది: %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "%lu బైట్లని దస్త్రం \"%s\" చదువుటకు ఇవ్వలేము"
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "దస్త్రం '%s' తెరుచుటలో విఫలమైనారు: ఎఫ్ డిఓపన్() విఫలమైనది: %s"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr " అక్షరమాలో`%s' నుండి `%s' కు పరివర్తన చెందడం సాధ్యం కాదు "
diff --git a/trunk/po/th.po b/trunk/po/th.po
new file mode 100644
index 000000000..2c44cc1ed
--- /dev/null
+++ b/trunk/po/th.po
@@ -0,0 +1,915 @@
+# Thai translation of glib.
+# Copyright (C) 2005-2006 Free Software Foundation, Inc.
+# This file is distributed under the same license as the glib package.
+# Theppitak Karoonboonyanan <thep@linux.thai.net>, 2005-2006.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib 2.7.1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-05-21 18:31+0700\n"
+"Last-Translator: Theppitak Karoonboonyanan <thep@linux.thai.net>\n"
+"Language-Team: Thai <l10n@opentle.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "พบแอตทริบิวต์ '%s' ที่ไม่ต้องการ สำหรับอิลิเมนต์ '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "ไม่พบแอตทริบิวต์ '%s' สำหรับอิลิเมนต์ '%s'"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "พบแท็ก '%s' ที่ไม่ต้องการ ขณะที่ต้องการแท็ก '%s'"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "พบแท็ก '%s' ที่ไม่ต้องการภายใน '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "ไม่พบแฟ้มที่คั่นหน้าที่ใช้การได้ในไดเรกทอรีข้อมูล"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "มีที่คั่นหน้าสำหรับ URI '%s' อยู่ก่อนแล้ว"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "ไม่พบที่คั่นหน้าสำหรับ URI '%s'"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "ไม่ได้กำหนดชนิด MIME ไว้ในที่คั่นหน้าสำหรับ URI '%s'"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "ไม่ได้กำหนดแฟล็กส่วนตัวไว้ในที่คั่นหน้าสำหรับ URI '%s'"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "ไม่ได้กำหนดกลุ่มไว้ในที่คั่นหน้าสำหรับ URI '%s'"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "ไม่มีโปรแกรมประยุกต์ชื่อ '%s' ที่ลงทะเบียนที่คั่นหน้าสำหรับ '%s' ไว้"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "กระจายบรรทัดคำสั่ง '%s' ด้วย URI '%s' ไม่สำเร็จ"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "ไม่สนับสนุนการแปลงรหัสอักขระจาก '%s' ไปเป็น '%s'"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "ไม่สามารถเปิดตัวแปลงรหัสอักขระจาก '%s' ไปเป็น '%s' ได้"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "มีลำดับไบต์ที่ไม่ถูกต้องในข้อมูลที่ป้อนให้ตัวแปลงรหัส"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "เกิดข้อผิดพลาดระหว่างแปลงรหัส: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "มีลำดับไบต์ไม่เต็มอักขระอยู่ที่ท้ายข้อมูลเข้า"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "ไม่สามารถแปลงสตริงซ่อมเสริม '%s' ให้เป็นรหัส '%s' ได้"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI '%s' ไม่ใช่ URI สัมบูรณ์ที่ใช้ scheme \"file\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "URI ของแฟ้มท้องถิ่น '%s' ต้องไม่มี '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' ใช้ไม่ได้"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "ชื่อโฮสต์ของ URI '%s' ใช้ไม่ได้"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' มีอักขระหลีกที่ไม่ถูกต้อง"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "ชื่อพาธ '%s' ไม่ใช่พาธเต็ม"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "ชื่อโฮสต์ผิดรูปแบบ"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "เกิดข้อผิดพลาดขณะเปิดไดเรกทอรี '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "ไม่สามารถจองหน่วยความจำ %lu ไบต์เพื่ออ่านแฟ้ม \"%s\" ได้"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "เกิดข้อผิดพลาดขณะอ่านแฟ้ม '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "อ่านข้อมูลจากแฟ้ม '%s' ไม่สำเร็จ: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "เปิดแฟ้ม '%s' ไม่สำเร็จ: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "อ่านแอตทริบิวต์ของแฟ้ม '%s' ไม่สำเร็จ: fstat() ล้มเหลว: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "เปิดแฟ้ม '%s' ไม่สำเร็จ: fdopen() ล้มเหลว: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "เปลี่ยนชื่อแฟ้ม '%s' ไปเป็น '%s' ไม่สำเร็จ: g_rename() ล้มเหลว: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "สร้างแฟ้ม '%s' ไม่สำเร็จ: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "เปิดแฟ้ม '%s' เพื่อเขียนไม่สำเร็จ: fdopen() ล้มเหลว: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "เขียนแฟ้ม '%s' ไม่สำเร็จ: fwrite() ล้มเหลว: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "ปิดแฟ้ม '%s' ไม่สำเร็จ: fclose() ล้มเหลว: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "ไม่สามารถลบแฟ้ม '%s' ที่มีอยู่ได้: g_unlink() ล้มเหลว: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "แม่แบบ '%s' ใช้ไม่ได้ ไม่ควรมี '%s'"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "แม่แบบ '%s' ไม่มี XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "อ่านลิงก์สัญลักษณ์ '%s' ไม่สำเร็จ: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "ไม่สนับสนุนลิงก์สัญลักษณ์"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "ไม่สามารถเปิดตัวแปลงรหัสอักขระจาก '%s' ไปเป็น '%s' ได้: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "ไม่สามารถอ่านข้อมูลแบบดิบใน g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "มีข้อมูลตกค้างไม่ได้แปลงอยู่ในบัฟเฟอร์สำหรับอ่าน"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "แชนเนลจบด้วยข้อมูลไม่เต็มอักขระ"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "ไม่สามารถอ่านข้อมูลแบบดิบใน g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "เปิดแฟ้ม '%s' ไม่สำเร็จ: open() ล้มเหลว: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "แม็ปแฟ้ม '%s' ไม่สำเร็จ: mmap() ล้มเหลว: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "มีข้อผิดพลาดที่บรรทัด %d อักขระที่ %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "มีข้อผิดพลาดที่บรรทัด %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr "พบเอนทิตี '&;' ซึ่งไม่ถูกต้อง ค่าที่ใช้ได้คือ: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"อักขระ '%s' ไม่สามารถใช้ขึ้นต้นชื่อเอนทิตีได้ อักขระ & ใช้เริ่มเอนทิตี ถ้าเครื่องหมาย ampersand "
+"นี้ไม่ได้เจตนาให้เป็นเอนทิตี ต้องหลีกโดยแทนด้วย &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "อักขระ '%s' ใช้ในชื่อเอนทิตีไม่ได้"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "ไม่รู้จักเอนทิตีชื่อ '%s'"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"เอนทิตีไม่ได้ปิดด้วยอัฒภาค เป็นไปได้สูงที่คุณอาจใช้ ampersand โดยไม่ได้จงใจให้เริ่มเอนทิตี ถ้าใช่ "
+"ก็จงหลีก ampersand โดยแทนด้วย &amp; เสีย"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"ไม่สามารถแจง '%-.*s' ซึ่งควรจะเป็นตัวเลขภายในตัวอ้างอิงอักขระ (เช่น &#234;) "
+"เป็นไปได้ว่าตัวเลขอาจจะมากเกินไป"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "ตัวอ้างอิงอักขระ '%-.*s' ไม่ได้เข้ารหัสอักขระที่เป็นไปได้"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "ตัวอ้างอิงอักขระว่างเปล่า ควรจะมีตัวเลข เช่น &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"ตัวอ้างอิงอักขระไม่ได้ปิดด้วยอัฒภาค เป็นไปได้สูงที่คุณอาจใช้ ampersand โดยไม่ได้จงใจให้เริ่มเอนทิตี "
+"ถ้าใช่ ก็จงหลีก ampersand โดยแทนด้วย &amp; เสีย"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "ตัวอ้างอิงเอนทิตีไม่สมบูรณ์"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "ตัวอ้างอิงอักขระไม่สมบูรณ์"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "ข้อความลงรหัส UTF-8 ไม่ถูกต้อง"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "เอกสารต้องเริ่มด้วยอิลิเมนต์ (เช่น <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr "'%s' ไม่ใช่อักขระที่ใช้ตามหลัง '<' ได้ จึงไม่สามารถใช้ขึ้นต้นชื่ออิลิเมนต์ได้"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr "พบอักขระแปลกปลอม '%s' ในขณะที่มองหาอักขระ '>' ที่จะมาปิดแท็กตั้งต้นอิลิเมนต์ '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"พบอักขระแปลกปลอม '%s' ในขณะที่กำลังมองหา '=' หลังชื่อแอตทริบิวต์ '%s' ของอิลิเมนต์ '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"พบอักขระแปลกปลอม '%s' ในขณะที่กำลังมองหา '>' หรือ '/' ที่จะมาปิดแท็กตั้งต้นของอิลิเมนต์ '%"
+"s' หรือไม่ก็เป็นแอตทริบิวต์ เป็นไปได้ว่าคุณกำลังใช้อักขระที่ใช้ไม่ได้ในชื่อแอตทริบิวต์"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"พบอักขระแปลกปลอม '%s' ในขณะที่กำลังมองหาอัญประกาศเปิดหลัง '=' "
+"ในการกำหนดค่าให้กับแอตทริบิวต์ '%s' ของอิลิเมนต์ '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr "'%s' ไม่ใช่อักขระที่ตามหลัง '</' ได้ '%s' ไม่สามารถใช้ขึ้นต้นชื่ออิลิเมนต์ได้"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr "'%s' ไม่ใช่อักขระที่ใช้ตามหลังชื่ออิลิเมนต์ '%s' ในแท็กปิดได้ อักขระเดียวที่อนุญาตคือ '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "พบการปิดอิลิเมนต์ '%s' แต่ไม่มีอิลิเมนต์ใดเปิดอยู่"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "พบการปิดอิลิเมนต์ '%s' แต่อิลิเมนต์ที่เปิดอยู่คือ '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "เอกสารว่างเปล่า หรือมีแต่อักขระช่องว่าง"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "เอกสารจบแบบผิดปกติหลังจากวงเล็บแหลม '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr "เอกสารจบแบบผิดปกติ โดยยังมีอิลิเมนต์เปิดอยู่ - '%s' คืออิลิเมนต์ที่เปิดล่าสุด"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr "เอกสารจบแบบผิดปกติ ในขณะที่กำลังมองหาวงเล็บแหลมที่จะมาปิดแท็ก <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "เอกสารจบแบบผิดปกติระหว่างกลางชื่ออิลิเมนต์"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "เอกสารจบแบบผิดปกติระหว่างกลางชื่อแอตทริบิวต์"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "เอกสารจบแบบผิดปกติระหว่างกลางแท็กเปิดอิลิเมนต์"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr "เอกสารจบแบบผิดปกติหลังจากเครื่องหมาย '=' หลังชื่อแอตทริบิวต์ โดยไม่มีค่าของแอตทริบิวต์"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "เอกสารจบแบบผิดปกติระหว่างกลางค่าแอตทริบิวต์"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "เอกสารจบแบบผิดปกติระหว่างกลางแท็กปิดสำหรับอิลิเมนต์ '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "เอกสารจบแบบผิดปกติระหว่างกลางหมายเหตุหรือคำสั่งประมวลผล"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr "ออบเจกต์เสียหาย"
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr "ข้อผิดพลาดภายในหรือออบเจกต์เสียหาย"
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr "หน่วยความจำเต็ม"
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr "เกินขอบเขตการถอยคืน"
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr "แพตเทิร์นมีรายการที่ไม่รองรับในการจับคู่ทีละส่วน"
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr "ข้อผิดพลาดภายใน"
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr "ไม่รองรับการใช้การอ้างอิงย้อนกลับเป็นเงื่อนไขในการจับคู่ทีละส่วน"
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr "เกินขอบเขตการเรียกตัวเอง"
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr "เกินขอบเขตพื้นที่ทำงานสำหรับสตริงย่อยเปล่า"
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr "ชุดของแฟล็กการขึ้นบรรทัดใหม่มีค่าไม่เข้ากัน"
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr "ข้อผิดพลาดไม่ทราบสาเหตุ"
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr "เกิดข้อผิดพลาดขณะจับคู่นิพจน์เรกกิวลาร์ %s: %s"
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr "ไลบรารี PCRE ถูกคอมไพล์มาแบบไม่สนับสนุน UTF8"
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr "ไลบรารี PCRE ถูกคอมไพล์มาแบบไม่สนับสนุนคุณสมบัติ UTF8"
+
+#: glib/gregex.c:928
+#, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "เกิดข้อผิดพลาดขณะแจงนิพจน์เรกกิวลาร์ %s ที่อักขระที่ %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr "เกิดข้อผิดพลาดขณะออปติไมซ์นิพจน์เรกกิวลาร์ %s: %s"
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr "ต้องการเลขฐานสิบหกหรือ '}'"
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr "ต้องการเลขฐานสิบหก"
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr "ไม่มี '<' ในตัวอ้างอิงสัญลักษณ์"
+
+#: glib/gregex.c:1834
+msgid "unfinished symbolic reference"
+msgstr "ตัวอ้างอิงสัญลักษณ์ไม่สมบูรณ์"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr "ตัวอ้างอิงสัญลักษณ์มีความยาวเป็นศูนย์"
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr "ต้องการตัวเลข"
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr "ตัวอ้างอิงสัญลักษณ์ไม่ถูกต้อง"
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr "'\\' ปราศจากข้อมูลอยู่ที่ท้ายสตริง"
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr "ลำดับอักขระหลีกไม่รู้จัก"
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr "เกิดข้อผิดพลาดขณะแจงข้อความสำหรับแทนที่ \"%s\" ที่อักขระที่ %lu: %s"
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "ข้อความคำพูดไม่ได้ขึ้นต้นด้วยอัญประกาศ"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "พบอัญประกาศไม่เข้าคู่ในบรรทัดคำสั่งหรือข้อความคำพูดของเชลล์"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "ข้อความจบทันทีหลังอักขระ '\\' (ข้อความที่ว่าคือ '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "ข้อความจบเสียก่อนจะพบอัญประกาศที่เข้าคู่กับ %c (ข้อความที่ว่าคือ '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "ข้อความว่างเปล่า (หรือมีแต่อักขระช่องว่าง)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "อ่านข้อมูลจากโพรเซสลูกไม่สำเร็จ"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "สร้างไปป์เพื่อสื่อสารกับโพรเซสลูกไม่สำเร็จ (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "อ่านข้อมูลจากไปป์จากโพรเซสลูกไม่สำเร็จ (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "เข้าไปที่ไดเรกทอรี '%s' ไม่สำเร็จ (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "ดำเนินงานโพรเซสลูกไม่สำเร็จ (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "ชื่อโปรแกรมผิดรูปแบบ: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "สตริงผิดรูปแบบในเวกเตอร์ของอาร์กิวเมนต์ที่ตำแหน่ง %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "สตริงผิดรูปแบบในตัวแปรสภาพแวดล้อม: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "ไดเรกทอรีใช้งานมีรูปแบบไม่ถูกต้อง: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "ดำเนินงานโปรแกรมช่วยไม่สำเร็จ (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"เกิดข้อผิดพลาดไม่คาดหมายใน g_io_channel_win32_poll() ระหว่างอ่านข้อมูลจากโพรเซสลูก"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "อ่านข้อมูลจากโพรเซสลูกไม่สำเร็จ (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "เกิดข้อผิดพลาดไม่คาดหมายใน select() ระหว่างอ่านข้อมูลจากโพรเซสลูก (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "เกิดข้อผิดพลาดไม่คาดหมายใน waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "fork ไม่สำเร็จ (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "ดำเนินงานโพรเซสลูก \"%s\" ไม่สำเร็จ (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "เปลี่ยนทิศทางข้อมูลเข้าหรือออกจากโพรเซสลูกไม่สำเร็จ (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "fork โพรเซสลูกไม่สำเร็จ (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "เกิดข้อผิดพลาดไม่ทราบสาเหตุขณะดำเนินงานโพรเซสลูก \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "อ่านข้อมูลจากไปป์จากโพรเซสลูกได้ไม่เพียงพอ (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "อักขระอยู่นอกช่วงของ UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "มีลำดับข้อมูลที่ไม่ถูกต้องในข้อมูลที่ป้อนให้ตัวแปลงรหัส"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "อักขระอยู่นอกช่วงของ UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "วิธีใช้:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "ตัวเลือกแสดงวิธีใช้:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "แสดงวิธีใช้ตัวเลือกต่างๆ"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "แสดงวิธีใช้ตัวเลือกต่างๆ ทั้งหมด"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "ตัวเลือกของโปรแกรม:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "ไม่สามารถแจงค่าจำนวนเต็ม '%s' สำหรับ %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "ค่าจำนวนเต็ม '%s' สำหรับ %s ออกนอกช่วงที่กำหนด"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "ไม่สามารถแจงค่า double '%s' สำหรับ %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "ค่า double '%s' สำหรับ %s ออกนอกช่วงที่กำหนด"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "เกิดข้อผิดพลาดระหว่างแจงตัวเลือก: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "ขาดอาร์กิวเมนต์สำหรับ %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "ไม่รู้จักตัวเลือก %s"
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "ไม่พบแฟ้มคีย์ที่ใช้การได้ในไดเรกทอรีแหล่งค้นหา"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "ไม่ใช่แฟ้มปกติ"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "แฟ้มว่างเปล่า"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr "แฟ้มคีย์มีบรรทัด '%s' ซึ่งไม่ใช่รูปแบบคู่คีย์-ค่า, กลุ่ม, หรือหมายเหตุ ที่ถูกต้อง"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "ชื่อกลุ่มผิดรูปแบบ: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "แฟ้มคีย์ไม่ได้ขึ้นต้นด้วยกลุ่ม"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "ชื่อคีย์ผิดรูปแบบ: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "แฟ้มคีย์มีเนื้อหาเป็นรหัสอักขระ '%s' ซึ่งไม่สนับสนุน"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "แฟ้มคีย์ไม่มีกลุ่ม '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "แฟ้มคีย์ไม่มีคีย์ '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "แฟ้มคีย์มีคีย์ '%s' ซึ่งมีค่า '%s' ซึ่งไม่ใช่รูปแบบ UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "แฟ้มคีย์มีคีย์ '%s' ซึ่งมีค่าที่ไม่สามารถตีความได้"
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr "แฟ้มคีย์มีคีย์ '%s' ในกลุ่ม '%s' ซึ่งมีค่าที่ไม่สามารถตีความได้"
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "แฟ้มคีย์ไม่มีคีย์ '%s' ในกลุ่ม '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "แฟ้มคีย์มีอักขระหลีกที่ท้ายบรรทัด"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "แฟ้มคีย์มีลำดับหลีก '%s' ที่ไม่ถูกต้อง"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "ค่า '%s' ไม่สามารถตีความเป็นตัวเลขได้"
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "ค่าจำนวนเต็ม '%s' ออกนอกช่วง"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "ค่า '%s' ไม่สามารถตีความเป็นตัวเลข float ได้"
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "ค่า '%s' ไม่สามารถตีความเป็นบูลีนได้"
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "ไม่สามารถเปลี่ยนโหมดของแฟ้มได้: fork() ล้มเหลว: %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "ไม่สามารถเปลี่ยนโหมดของแฟ้มได้: waitpid() ล้มเหลว: %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "ไม่สามารถเปลี่ยนโหมดของแฟ้มได้: chmod() ล้มเหลว: %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr "ไม่สามารถเปลี่ยนโหมดของแฟ้มได้: โพรเซสลูกจบโดยสัญญาณ: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr "ไม่สามารถเปลี่ยนโหมดของแฟ้มได้: โพรเซสลูกจบแบบผิดปกติ"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "ไม่สนับสนุนการแปลงรหัสอักขระจาก '%s' ไปเป็น '%s'"
diff --git a/trunk/po/tl.po b/trunk/po/tl.po
new file mode 100644
index 000000000..5b5cc22c0
--- /dev/null
+++ b/trunk/po/tl.po
@@ -0,0 +1,979 @@
+# Tagalog translation of glib.
+# Copyright (C) 2005
+# This file is distributed under the same license as the glib package.
+# Eric Pareja <xenos@upm.edu.ph>, 2005.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2005-12-01 17:31+0800\n"
+"Last-Translator: Eric Pareja <xenos@upm.edu.ph>\n"
+"Language-Team: Tagalog <debian-tl@banwa.upm.edu.ph>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Kakaibang karakter '%s', inasahan na '=' matapos ng pangalang attribute '%s' "
+"ng elementong '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Walang mahanap na talaksang susi sa mga dir ng datos"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Sawi ang pagbasa ng symbolic link '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Pagsalin mula sa character set '%s' patungong '%s' ay hindi suportado"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Hindi mabuksan ang converter mula '%s' tungong '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Hindi tanggap na byte sequence sa conversion input"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Error habang nagco-convert: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Hindi kumpletong karakter sequence sa dulo ng input"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Hindi maka-balik '%s' sa codeset '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "Ang URI '%s' ay hindi absolute URI na gamit ang paraang \"file\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Ang lokal na talaksang URI '%s' ay hindi maaaring maglaman ng '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "Ang URI '%s' ay hindi tanggap"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Ang hostname ng URI '%s' ay hindi tanggap"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Ang URI '%s' ay may hindi tanggap na escaped karakter"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Ang pathname '%s' ay hindi absolute path"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Hindi tanggap na hostname"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Error sa pagbukas ng directory '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Hindi makapag-tabi ng %lu byte upang basahin ang talaksang \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Error sa pagbasa ng talaksang '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Sawi ang pagbabasa ng talaksang '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Sawi ang pagbukas ng talaksang '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"Sawi ang pagkuha ng mga attribute ng talaksang '%s': sawi ang fstat(): %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Sawi ang pagbukas ng talaksang '%s': sawi ang fdopen(): %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"Bigo ang papalit ng pangalan ng talaksang '%s' sa '%s': bigo ang g_rename(): "
+"%s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Sawi ang paglikha ng talaksang '%s': %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr ""
+"Bigo ang pagbukas ng talaksang '%s' para sa pagsusulat: bigo ang fdopen(): %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Bigo sa pagsusulat ng talaksang '%s': bigo ang fwrite(): %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Bigo ang pagsara ng talaksang '%s': bigo ang fclose(): %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Hindi matanggal ang talaksang '%s': bigo ang g_unlink(): %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Hindi tanggap ang template '%s', wala dapat na '%s'"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Hindi XXXXXX ang dulo ng template '%s'"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Sawi ang pagbasa ng symbolic link '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Hindi suportado ang mga symbolic link"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Hindi mabuksan ang converter mula '%s' patungong '%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "Hindi mabasa ng hilaw ang g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "May natirang hindi na-convert na datos sa read buffer"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Nagwakas sa partial karakter ang channel"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "Hindi makapagbasa ng hilaw sa g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Bigo ang pagbukas ng talaksang '%s': bigo ang open(): %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr ""
+"Bigo ang pagreserba ng memory para sa talaksang '%s': bigo ang mmap(): %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Error sa linya %d char %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Error sa linya %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Walang laman na entity '&' ay nakita; tanggap na mga entity ay: &amp; &quot; "
+"&lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Hindi tanggap ang karakter '%s' sa umpisa ng pangalan ng entity; ang & "
+"karakter ang nag-uumpisa ng entity; kung ang ampersand ay hindi dapat maging "
+"entity, itaglay ito bilang &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Hindi tanggap ang karakter '%s' sa loob ng pangalan ng entity"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Pangalan ng entity '%s' ay hindi kilala"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Hindi nagtapos ang entity sa puntukoma; malamang ay gumamit kayo ng "
+"ampersand karakter na hindi sinasadyang mag-umpisa ng entity - itaglay ang "
+"ampersand ng &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Sawi sa pag-parse ng '%-.*s', na dapat ay numero sa loob ng reference sa "
+"karakter (halimbawa ay &#234;) - maaaring ang numero ay sobra ang laki"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr ""
+"Reference sa karakter '%-.*s' ay hindi nag-encode ng tanggap na karakter"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+"Walang laman na reference sa karakter; dapat may kasamang numero tulad ng "
+"&#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Ang reference sa karakter ay hindi nagtapos sa puntukoma; malamang ay "
+"gumamit kayo ng ampersand na karakter na hindi sinadyang mag-umpisa ng "
+"entity - itaglay ang ampersand bilang &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Hindi tapos na reference sa entity"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Hindi tapos na reference sa karakter"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Hindi tanggap na tekstong encoded ng UTF-8"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Kailangang mag-umpisa ang dokumento ng elemento (hal. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' ay hindi tanggap na karakter matapos ng '<' na karakter; hindi ito "
+"maaaring mag-umpisa ng pangalang elemento"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Kakaibang karakter '%s', inasahan na '>' karakter ang pambungad ng pambukas "
+"na tag ng elementong '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Kakaibang karakter '%s', inasahan na '=' matapos ng pangalang attribute '%s' "
+"ng elementong '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Kakaibang karakter '%s', inasahan na '>' o '/' na karakter ang pambungad ng "
+"pangbukas na tag ng elementong '%s' o attribute; maaaring gumamit kayo ng "
+"hindi tanggap na karakter sa pangalang attribute"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Kakaibang karakter '%s', inasahan na pambukas na quote mark matapos ng "
+"equals sign kapag nagbigay ng halaga para sa attribute '%s' ng elementong '%"
+"s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"Hindi tanggap na karakter ang '%s' matapos ng mga karakter na '</'; Ang '%s' "
+"ay hindi maaaring umpisa ng pangalang elemento"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"Hindi tanggap na karakter ang '%s' matapos ang pangsara ng pangalang "
+"elemento '%s'; ang tinatanggap na karakter ay '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Sinarhan ang elementong '%s', walang bukas na elemento."
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"Sinarhan ang elementong '%s', ngunit ang kasalukuyang elementong bukas ay '%"
+"s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Walang laman ang dokumento o naglalaman lamang ito ng puwang"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Nagwakas ng hindi inaasahan ang dokumento matapos lamang ng pangbukas na "
+"angle bracket '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Nagwakas ng hindi inaasahan ang dokumento na may mga bukas na elemento - '%"
+"s' ay ang huling elementong binuksan"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Nagwakas ng hindi inaasahan ang dokumento, inasahan na makita ang angle "
+"bracket na pang-sara ng tag <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr ""
+"Nagwakas ng hindi inaasahan ang dokumento sa loob ng pangalan ng elemento"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr ""
+"Nagwakas ng hindi inaasahan ang dokumento sa loob ng pangalan ng attribute"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+"Nagwakas ng hindi inaasahan ang dokumento sa loob ng pagbukas na tag ng "
+"elemento."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Nagwakas ng hindi inaasahan ang dokumento matapos ang equal sign na sumunod "
+"sa pangalan ng attribute; walang halaga ang attribute"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+"Nagwakas ng hindi inaasahan ang dokumento habang nasa loob ng halagang "
+"attribute"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Nagwakas ang dokumento ng hindi inaasahan sa loob ng tag ng pagsara para sa "
+"elementong '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Nagwakas ang dokumento ng hindi inaasahan sa loob ng komento o utos ng "
+"pagproseso"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Error sa linya %d char %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Hindi tapos na reference sa entity"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Ang binanggit na teksto ay hindi nag-umpisa sa quotation mark"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Walang kapares na quotation mark sa command line o ibang shell na teksto."
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Nagwakas ang teksto matapos ng karakter na '\\'. (Ang teksto ay '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Nagwakas ang teksto bago nakahanap ng kapares na quote para sa %c. (Ang "
+"teksto ay '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Ang teksto ay walang laman (o naglaman lamang ng puwang)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Sawi sa pagbasa ng datos mula sa prosesong anak"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Sawi sa paglikha ng pipe para makausap ang prosesong anak (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Sawi sa pagbasa mula sa child pipe (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Sawi sa paglipat sa directory '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Sawi sa pagtakbo ng prosesong anak (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Imbalidong pangalan ng programa: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Imbalidong string sa argument vector sa %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Imbalidong string sa kapaligiran: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Imbalidong working directory: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Bigo sa pagtakbo ng programang katulong (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Hindi inaasahang error sa g_io_channel_win32_poll() sa pagbasa ng datos mula "
+"sa prosesong anak"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Sawi sa pagbasa ng datos mula sa prosesong anak (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Hindi inaasahang error sa select() habang nagbabasa ng datos mula sa "
+"prosesong anak (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Hindi inaasahang error sa waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Sawi sa pag-fork (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Sawi sa pagtakbo ng prosesong anak \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Sawi sa pag-redirect ng output o input ng prosesong anak (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Sawi sa pag-fork ng prosesong anak (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Hindi kilalang error sa pagpatakbo ng prosesong anak \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Sawi sa pagbasa ng akmang datos mula sa child pid pipe (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Character wala sa sakop ng UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Hindi tanggap na sequence sa conversion input"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Character wala sa sakop ng UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Pag-gamit:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Option ng Tulong:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Ipakita ang option ng tulong"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Ipakita ang option ng tulong"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Option ng Aplikasyon:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Hindi mai-parse ang halagang integer '%s' para sa %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Halagang integer '%s' para sa %s ay wala sa sakop"
+
+#: glib/goption.c:831
+#, fuzzy, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Hindi mai-parse ang halagang integer '%s' para sa %s"
+
+#: glib/goption.c:839
+#, fuzzy, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Halagang integer '%s' para sa %s ay wala sa sakop"
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Error habang nagco-convert: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Kulang na argumento para sa %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Hindi kilalang option %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Walang mahanap na talaksang susi sa mga dir ng datos"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Hindi karaniwang talaksan"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Walang laman ang talaksan"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Ang talaksang susi ay naglalaman ng linyang '%s' na hindi pares na susi-"
+"halaga, grupo, o komento"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Imbalidong pangalan ng programa: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Ang talaksang susi ay hindi naguumpisa sa isang grupo"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Imbalidong pangalan ng programa: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Ang talaksang susi ay naglalaman ng hindi suportadong encoding '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Ang talaksang susi ay walang grupong '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Ang talaksang susi ay walang susing '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Ang talaksang susi ay naglalaman ng susing '%s' na may halagang '%s' na "
+"hindi UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Ang talaksang susi ay naglalaman ng susing '%s' na may halagang hindi mabasa."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Ang talaksang susi ay naglalaman ng susing '%s' sa grupong '%s' na may "
+"halaga na hindi mabasa."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Ang talaksang susi ay walang susing '%s' sa grupong '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Ang talaksang susi ay may escape karakter sa dulo ng linya"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Ang talaksang susi ay may hindi tanggap na escape sequence '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Ang halagang '%s' ay hindi mabasa bilang numero."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Halagang integer '%s' ay wala sa sakop"
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Ang halagang '%s' ay hindi mabasa bilang numero."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Ang halagang '%s' ay hindi mabasa bilang boolean."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Hindi mapalitan ang modo ng talaksan: bigo ang fork(): %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Hindi mapalitan ang modo ng talaksan: bigo ang waitpid(): %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Hindi mapalitan ang modo ng talaksan: bigo ang chmod(): %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr ""
+#~ "Hindi mapalitan ang modo ng talaksan: Hininto ang anak ng hudyat: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr ""
+#~ "Hindi mapalitan ang modo ng talaksan: Hininto ng hindi pangkaraniwan ang "
+#~ "anay"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Paglipat mula karakter set `%s' tungong `%s' ay hindi suportado"
diff --git a/trunk/po/tr.po b/trunk/po/tr.po
new file mode 100644
index 000000000..658b8db9e
--- /dev/null
+++ b/trunk/po/tr.po
@@ -0,0 +1,953 @@
+# Turkish translation of Glib.
+# Copyright (C) 2001-2003, 2005 Free Software Foundation, Inc.
+# KEMAL YILMAZ <kyilmaz@uekae.tubitak.gov.tr>, 2001.
+# Arman Aksoy <armish@linux-sevenler.de>, 2003.
+# Baris Cicek <baris@teamforce.name.tr>, 2005.
+# Onur Can ÇAKMAK <onur.cakmak@gmail.com>, 2004, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2006-08-08 17:47+0200\n"
+"Last-Translator: Onur Can Çakmak <onur.cakmak@gmail.com>\n"
+"Language-Team: Turkish <gnome-turk@gnome.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10.1\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "'%2$s' elemanında beklenmeyen '%1$s' özniteliği"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "'%2$s' elemanının '%1$s' özelliği bulunamadı"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Beklenmeyen im '%s', '%s' bekleniyordu"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr " '%2$s' imi içinde beklenmeyen im '%1$s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Veri dizinlerinde geçerli bir yerimi dosyası bulunamadı"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "URI '%s' için bir yerimi zaten var"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "URI '%s' için bir yerimi bulunamadı"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "URI '%s' için yeriminde hiç bir MIME tipi belirtilmedi"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "URI '%s' için yeriminde özel bayrağı tanımlanmadı"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "URI '%s' için yeriminde grup tanımlanmadı"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "'%s' adında hiçbir uygulama '%s' için yerimi kaydetmedi"
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "'%s' sembolik bağını okuma başarısız: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "`%s' karakter kümesinden `%s' karakter kümesine dönüşüm desteklenmiyor"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "'%s'--'%s' dönüştürücüsü açılamıyor"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Dönüşüm girdisinde geçersiz bayt dizisi"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Dönüşüm sırasında hata oluştu: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Girdinin sonunda parçalı karakter dizisi"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr ""
+"Geridönüş karakter kümesi '%s', '%s' karakter kümesine dönüştürülemiyor"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "\"dosya\" şemasını kullanan URI '%s' kesin bir URI değil"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "'%s' URI yerel dosyası '#' içeremez"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' hatalı"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "URI makine adı '%s' geçersiz"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' geçersiz çıkış karakteri içeriyor"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "'%s' yol adı, kesin bir yol değil"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Geçersiz makine adı"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "'%s' dizini açılamadı: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "%lu bayt \"%s\" dosyasını okumak için ayrılamadı"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "'%s' dosyası okunurken hata: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "'%s' dosyasından okuma başarısız: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "'%s' dosyasını açma başarısız: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"'%s' dosyasının özniteliklerini alma başarısız: fstat() başarısızlığı: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "'%s' dosyasını açma başarısız: fdopen() başarısızlığı: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr ""
+"'%s' dosyasının adı '%s' olarak değiştirilirken hata: g_rename() "
+"başarısızlığı: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "'%s' dosyasını oluşturma başarısız: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "'%s' dosyası yazmak için açılamadı: fdopen() başarısızlığı: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "'%s' dosyasına yazılamadı: fwrite() başarısızlığı: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "'%s' dosyası kapatılamadı: fclose() başarısızlığı: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Varolan dosya '%s' silinemedi: g_unlink() başarısızlığı: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Şablon '%s' geçersiz, '%s' içermemeli"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Şablon '%s' XXXXXX içermiyor"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "'%s' sembolik bağını okuma başarısız: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Sembolik bağlar desteklenmiyor"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "`%s'-`%s' dönüştürücüsü açılamıyor: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "g_io_channel_read_line_string içinde okuma yapılamıyor"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Okuma tampon belleğinde kalıntı çevrilmemiş veri"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kanal kısmi bir karakterde sonlanıyor"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "g_io_channel_read_to_end içinde okuma başarısız"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "'%s' dosyası açılamadı: open() başarısızlığı: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "'%s' için eşlem oluşturulamadı: mmap() başarısızlığı: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Satır %d karakter %d hata içeriyor: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Satır %d hata içeriyor: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Boş özvarlık '&;' görüldü; geçerli öğeler: &amp; &quot; &lt; &qt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Özvarlık isminin başındaki karakter '%s' geçerli değil; & karakteri bir "
+"özvarlığı başlatır; eger bu & işareti bir özvarlık değilse, &amp; olarak "
+"kullanabilirsiniz"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Karakter '%s' bir özvarlık isminin içinde geçerli değildir"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Özvarlık ismi '%s' bilinmiyor"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Özvarlık noktalı virgül ile bitmiyor; büyük ihtimalle bir özvarlık başlatmak "
+"istemeksizin & karakteri kullandınız - & işaretini &amp; olarak "
+"kullanabilirsiniz"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Karakter referansı içinde bir rakam olması gereken '%-.*s' ayrıştırılamadı, "
+"(örneğin; &#234;) - rakam çok büyük olabilir"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Karakter referansı '%-.*s' izin verilen karakteri kodlamıyor"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Boş karakter referansı; &#454; gibi bir rakam içermelidir"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Karakter referansı noktalı virgül ile bitmemiş; büyük ihtimalle bir özvarlık "
+"başlatmak istemeksizin & karakteri kullandınız - & işaretini &amp; olarak "
+"kullanabilirsiniz"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Tamamlanmamış özvarlık referansı"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Tamamlanmamış karakter referansı"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Geçersiz UTF-8 kodlanmış metin"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Belge bir öğe ile başlamalı (örneğin <kitap>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'<' karakterinden sonra gelen '%s' geçerli bir karakter değil; bir öğe adı "
+"başlatmamalı"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Tuhaf karakter '%s', '%s' öğesinin başlangıç etiketinin sonunda '>' "
+"karakteri bekleniyor"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Tuhaf karakter '%1$s', '%3$s' öğesinin '%2$s' özniteliğinin sonunda '=' "
+"karakteri bekleniyor"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Tuhaf karakter: '%s', '%s' öğesinin başlangıç etiketinin sonunda '>', '/' "
+"veya bir öznitelik bekleniyor; öznitelik isminde geçersiz bir karakter "
+"kullanmış olabilirsiniz"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Tuhaf karakter: '%s', '%s' özniteliğini '%s' öğesinde değiştirmek için "
+"eşittir işaretinden sonra tırnak işareti bekleniyor"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'</' karakterlerini takip eden '%s' geçerli bir karakter değildir; öğe ismi "
+"'%s' ile başlamamalı"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s', kapalı öğe ismi '%s' ardından gelebilcek bir karakter değil; izin "
+"verilen karakter ise '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "'%s' öğesi kapatılmış, hiç bir öğe açık değil"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "'%s' öğesi kapatılmış, fakat şu an açık öğe '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Belge boş veya sadece boşluk karakteri içeriyor"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Belge açık açı parantezi '<' işaretinden hemen sonra beklenmedik bir şekilde "
+"bitti"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Belge öğeleri hala açıkken beklenmedik bir şekilde bitti - son açılan öğe: '%"
+"s'"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Belge beklenmedik bir şekilde bitti, etiketi bitiren kapalı açı parantezi "
+"ile biten <%s/> beklendi"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Belge bir öğe isminin içinde beklenmedik bir şekilde bitti"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Belge bir öznitelik ismi içinde beklenmedik bir şekilde bitti"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Belge bir öğe-açma etiketi içinde beklenmedik bir şekilde bitti."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Belge öznitelik adını takip eden eşittir isaretinden sonra beklenmedik bir "
+"şekilde bitti; öznitelik degeri yok"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Belge bir öznitelik değeri içinde iken beklenmedik bir şekilde bitti"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Belge, '%s' öğesinin kapama etiketi içinde beklenmedik bir şekilde bitti"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Belge bir yorum veya işlem talimatı içindeyken beklenmedik bir şekilde bitti"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Satır %d karakter %d hata içeriyor: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Tamamlanmamış özvarlık referansı"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Alıntılı metin tırnak işareti ile başlamıyor"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Komut satırında veya diğer kabuk alıntısı metinde eşlenmemiş tırnak işareti"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Metin '\\' karakterinden hemen sonra bitti. (Metin: '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "%c için eşleşen tırnak işareti bulunmadan metin bitti. (Metin: '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Metin boştu (veya sadece boşluk içeriyordu)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Alt süreçten bilgi okuma başarısızlığı"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Alt süreçle haberleşme için boru yaratılamadı (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Alt süreç borusundan okuma başarısızlığı (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "'%s' dizinine değiştirme başarısızlığı (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Alt süreç yürütme başarısızlığı (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Geçersiz program adı: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "%d konumunda parametre vektörü içinde geçersiz dizgi: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Çevre içinde geçersiz dizgi: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Geçersiz çalışma dizini: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Yardımcı program (%s) çalıştırılamadı"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Alt süreçten bilgi okurken g_io_channel_win32_poll() işleminde beklenmeyen "
+"hata"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Alt süreçten bilgi okuma başarısızlığı (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "Alt süreçten bilgi okurken select()'te beklenmeyen hata oluştu (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "waitpid()'de beklenmeyen hata (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Çatallama başarısızlığı (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "\"%s\" alt süreç çalıştırılırken hata oluştu (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Alt sürecin girdisi veya çıktısı yönlendirilemedi (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Alt süreç çatallanamadı (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Alt süreç \"%s\" çalıştırılırken bilinmeyen hata oluştu"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Alt süreç borusundan yeterli bilgi okunamadı (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "UTF-8 için karakter sınırlarının dışında"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Dönüşüm girdisi içinde geçersiz dizi"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "UTF-16 için karakter sınırlarının dışında"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Kullanım:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[SEÇENEK...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Yardım Seçenekleri:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Yardım seçeneklerini göster"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Tüm yardım seçeneklerini göster"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Uygulama Seçenekleri:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "%2$s için tamsayı değeri '%1$s' ayrıştırılamıyor"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "%2$s için tamsayı değeri '%1$s' aralık dışında"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "'%2$s' için double değeri '%1$s' ayrıştırılamıyor"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "%2$s için double değeri '%1$s' aralık dışında"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "%s seçeneği işlenirken hata"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "%s için parametre eksik"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Bilinmeyen seçenek %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Veri dizinlerinde geçerli anahtar dosyası bulunamadı"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Normal dosya değil"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Dosya boş"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Anahtar dosyası anahtar-değer çifti, grup veya yorum olmayan '%s' satırını "
+"içeriyor"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Geçersiz program adı: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Anahtar dosyası bir grupla başlamıyor"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Geçersiz program adı: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Anahtar dosya geçersiz kodlama '%s' içeriyor"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Anahtar dosyasında '%s' grubu yok"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Anahtar dosyasında '%s' anahtarı yok"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "Anahtar dosyası UTF-8 olmayan '%s' anahtarını '%s' değeriyle içeriyor"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "Anahtar dosyası değeri yorumlanamayan '%s' değerini içeriyor."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Anahtar dosyası, yorumlanamayan '%2$s' grubundaki '%1$s' anahtarını içeriyor."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Anahtar dosyası '%2$s' grubunda '%1$s' anahtarı içermiyor"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Anahtar dosyası satır sonunda çıkış karakteri içeriyor"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "URI '%s' geçersiz çıkış dizisi içeriyor"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "'%s' değeri bir sayı olarak yorumlanamıyor."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Tamsayı değeri '%s' aralık dışında"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "'%s' değeri bir kayar noktalı sayı olarak yorumlanamıyor."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "'%s' değeri bool değer olarak yorumlanamıyor."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Dosya kipi değiştilemedi: fork() başarısızlığı: %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Dosya kipi değiştilemedi: waitpid() başarısızlığı: %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Dosya kipi değiştilemedi: chmod() başarısızlığı: %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr "Dosya kipi değiştirilemedi: Alt süreç %s sinyaliyle kapatıldı"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr "Dosya kipi değiştirilemedi: Alt süreç beklenmedik şekilde kapandı"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr ""
+#~ "`%s' karakter kümesinden `%s' karakter kümesine dönüşüm desteklenmiyor"
diff --git a/trunk/po/tt.po b/trunk/po/tt.po
new file mode 100644
index 000000000..4c8012b8a
--- /dev/null
+++ b/trunk/po/tt.po
@@ -0,0 +1,895 @@
+# Tatarish translation
+# Albert Fazlí <tatarish.l10n@gmail.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgnome\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2005-11-09 13:19+0300\n"
+"Last-Translator: Albert Fazlí <tatarish.l10n@gmail.com>\n"
+"Language-Team: Tatarish <tatarish.l10n@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "'%s' biremennän uqıp bulmadı: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "'%s' -› '%s' digän bilge äyländerü totılmí"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "'%s' -› '%s' äyländergeçen açıp bulmadı"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr ""
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Äyländergändä xata çıqtı: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr ""
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr ""
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "'%s' digän cirle birem URI'sında '#' bilgese bula almí"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "'%s' digän URI yaraqsız"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "'%s' digän URI'nıñ host adı yaraqsız"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr ""
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "'%s' digän yul töptän tügel"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Host adı yaraqsız"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "'%s' törgägen açıp bulmadı: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr ""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "'%s' biremen uqığanda xata: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "'%s' biremennän uqıp bulmadı: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "'%s' biremen açıp bulmadı: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "'%s' birem üzençälegen belep bulmadı: fstat() uzmadı: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "'%s' biremen açıp bulmadı: fdopen() uzmadı: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "'%s' birem adın '%s' itep üzgärtep bulmadı: g_rename() uzmadı: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "'%s' biremen yasap bulmadı: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Yazu öçen '%s' biremen açıp bulmadı: fdopen() uzmadı: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "'%s' biremen yazıp bulmadı: fwrite() uzmadı: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "'%s' biremen yabıp bulmadı: fclose() uzmadı: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Barlıqtağı '%s' biremen beterep bulmadı: g_unlink() uzmadı: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "'%s' ürçetmäse yaraqsız, eçendä '%s' bula almí"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "'%s' ürçetmäneñ azağında XXXXXX tügel"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr ""
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr ""
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "'%s' -› '%s' äyländergeçen açıp bulmadı: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr ""
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr ""
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "'%s' biremen açıp bulmadı: open() uzmadı: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr ""
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "%d. yulnıñ %d. bilgedä xata: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "%d. yulda xata: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr ""
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr ""
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr ""
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr ""
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr ""
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Yazmanıñ UTF-8 bilgelämäse yaraqsız"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr ""
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr ""
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "İstälek eçtälege yä buş, yä buşlıq bilgelärennän genä tora"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr ""
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr ""
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "%d. yulnıñ %d. bilgedä xata: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+msgid "unfinished symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr ""
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr ""
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr ""
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr ""
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Yazılım adı yaraqsız: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Tirä-yaqta yaraqsız yazma bar: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Eş törgäge yaraqsız: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Yärdämçe yazılım eşlätep bulmadı (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr ""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "UTF-8 çigennän çıqqan bilge"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr ""
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "UTF-16 çigennän çıqqan bilge"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Totılu:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[KÖYLÄMÄ...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Yärdäm Köylämäse:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Yärdäm köylämäsen kürsätü"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Yärdäm köylämäsen kürsätü"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Yazılım Köylämäläre:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "%2$s öçen '%1$s' digän tulısan bäyäse çiktän uzdı"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, fuzzy, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "%2$s öçen '%1$s' digän tulısan bäyäse çiktän uzdı"
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Äyländergändä xata çıqtı: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "%s öçen köylämä birelmäde"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Bilgesez %s atlı köylämä"
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Ğädäti birem tügel"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Birem buş ikän"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Yazılım adı yaraqsız: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Açqıç bireme törkem belän başlanmí"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Yazılım adı yaraqsız: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Açqıç biremendä '%s' digän totılmağan bilgelämä"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Açqıç biremendä '%s' törkeme yuq"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Açqıç biremendä '%s' açqıçı yuq"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Açqıç biremendäge '%2$s' törkemendä '%1$s' açqıçı yuq"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "'%s' digän bäyäsen san itep tanıp bulmí."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "'%s' digän tulısan bäyäse çiktän çıqtı"
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "'%s' digän bäyäsen san itep tanıp bulmí."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "'%s' digän bäyäsen yuqbar itep tanıp bulmí."
+
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Birem ısulın üzgärtep bulmadı: fork() uzmadı: %s"
+
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Birem ısulın üzgärtep bulmadı: waitpid() uzmadı: %s"
+
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Birem ısulın üzgärtep bulmadı: chmod() uzmadı: %s"
+
+#~ msgid "Could not change file mode: Child terminated by signal: %s"
+#~ msgstr "Birem ısulın üzgärtep bulmadı: Balanı ımlaw özderde: %s"
+
+#~ msgid "Could not change file mode: Child terminated abnormally"
+#~ msgstr "Birem ısulın üzgärtep bulmadı: Balanı özü tieşleçä bulmadı"
diff --git a/trunk/po/uk.po b/trunk/po/uk.po
new file mode 100644
index 000000000..ca9fbda80
--- /dev/null
+++ b/trunk/po/uk.po
@@ -0,0 +1,934 @@
+# Ukrainian translation of GLIB library.
+# Copyright (C) 2001-2004 Free Software Foundation, Inc.
+# Yuri Syrota <rasta@cvs.gnome.org>, 2001, 2004.
+# Maxim Dziumanenko <dziumanenko@gmail.com>, 2004-2007
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-01-19 11:56+0300\n"
+"Last-Translator: Maxim Dziumanenko <dziumanenko@gmail.com>\n"
+"Language-Team: Ukrainian <uk@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Неочікуваний атрибут \"%s\" для елемента \"%s\""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Атрибут \"%s\" для елемента \"%s\" не існує"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Неочікуваний тег \"%s\", очікувався тег \"%s\""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Неочікуваний тег '%s' у '%s'"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Не вдається знайти правильний файл закладок у каталогах даних"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Файл закладок для URI '%s' вже існує"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Не знайдено закладки для URI '%s'"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Не визначено тип MIME у закладці для URI '%s'"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Не вказано приватну ознаку у закладці для URI '%s'"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Не встановлено групи у закладці для URI '%s'"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Не зареєстровано програму з назвою '%s' для закладки '%s'"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Помилка розкривання рядка виконання \"%s\" для URI %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Перетворення з набору символів \"%s\" у \"%s\" не підтримується"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Не вдається відкрити модуль перетворення з \"%s\" у \"%s\""
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Неправильна послідовність байтів у перетворюваних вхідних даних"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Помилка під час перетворення: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Незавершена символьна послідовність на кінці вводу"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Неможливо коректно перетворити символ \"%s\" у символ з набору \"%s\""
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+"Ідентифікатор URI \"%s\" не є абсолютним ідентифікатором при використанні "
+"схеми \"file\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Ідентифікатор URI \"%s\" локального файла не може містити символ \"#\""
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI \"%s\" - неправильний"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Неправильна назва вузла в URI \"%s\""
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Ідентифікатор URI \"%s\" містить неправильно екранований символ"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Шлях \"%s\" не є абсолютним"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Неправильна назва вузла"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Помилка відкривання каталогу \"%s\": %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Не вдається виділити %lu байтів для зчитування файла \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Помилка зчитування файлу \"%s\": %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Помилка зчитування з файлу \"%s\": %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Помилка відкривання файлу \"%s\": %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Помилка отримання атрибутів файлу \"%s\": помилка fstat(): %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Помилка відкривання файлу \"%s\": помилка fdopen(): %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Помилка перейменування файлу \"%s\" на \"%s\": помилка g_rename(): %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Помилка створення файлу \"%s\": %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Помилка відкривання файлу \"%s\" для запису: помилка fdopen(): %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Помилка запису у файл \"%s\": помилка fwrite(): %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Помилка закривання файлу \"%s\": помилка fclose(): %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Не вдається видалити існуючий файл \"%s\": помилка g_unlink(): %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Шаблон \"%s\" неправильний, бо не може містити \"%s\""
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Шаблон \"%s\" не містить XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Помилка читання символічного посилання \"%s\": %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Символічні посилання не підтримуються"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Не вдається відкрити модуль перетворення з \"%s\" у \"%s\": %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"Не вдається виконати безпосереднє зчитування у функції "
+"g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "В буфері зчитування лишились не перетворені дані"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Канал завершується на неповному символі"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+"Не можна виконувати безпосереднє зчитування у функції "
+"g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Помилка відкривання файлу \"%s\": помилка open(): %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Помилка створення карти файлу \"%s\": помилка mmap(): %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Помилка в рядку %d на символі %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Помилка в рядку %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Виявлено порожній предикат \"&;\"; допустимими предикатами є: &amp; &quot; "
+"&lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Предикат не може починатись з символу \"%s\", він починається з символу \"&"
+"\"; якщо цей символ вживається не для позначення початку предикату, то "
+"повинен екрануватись як символ &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Символ \"%s\" не допускається в назві предикату"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Назва предикату \"%s\" невідома"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Предикат не закінчується крапкою з комою; очевидно, що символ & було "
+"використано не для позначення початку предикату – екрануйте його як &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Помилка аналізу '%-.*s', де має бути число у символьному посиланні "
+"(наприклад, &#234), можливо, число надто велике"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Посилання на символ \"%-.*s\" не визначає дозволений символ"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Порожнє посилання на символ, воно має включати число, наприклад &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Посилання на символ не закінчується крапкою з комою, схоже символ \"&\" було "
+"використано не для позначення початку предикату – екрануйте його як &amp;."
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Незавершене посилання на предикат"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Незавершене посилання на символ"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Неправильно кодований текст UTF-8"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Документ має починатися з елемента (наприклад, <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"Символ \"%s\" не дозволяється вживати після символу \"<\", він не може "
+"починати назву елемента"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Зайвий символ \"%s\", очікувався символ \">\" для закриття початкового тегу "
+"елементу \"%s\""
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Зайвий символ \"%s\", очікувався символ \"=\" після назви ознаки \"%s\" "
+"елемента \"%s\""
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Зайвий символ \"%s\", очікувались символи \">\" чи \"/\", для закриття "
+"початкового тегу елементу \"%s\", чи додаткова ознака; можливо, було "
+"використано неприпустимий символ в назві ознаки"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Зайвий символ \"%s\", очікувались відкриваючі лапки після знаку рівності на "
+"присвоєнні значення ознаці \"%s\" елементу \"%s\""
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"Символ \"%s\" неприпустимий після символів \"</\"; символ \"%s\" не може "
+"починати назву елементу"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"Символ \"%s\" неприпустимий на закритті назви елемента \"%s\"; припустимим "
+"символом є \">\""
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Було закрито не відкритий елемент \"%s\""
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Було закрито елемент \"%s\", але зараз відрито елемент \"%s\""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Документ порожній чи містить лише пропуски"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Документ раптово закінчився відразу після початкової кутової дужки \"<\""
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Документ раптово закінчився, коли деякі елементи ще були відкритими – \"%s\" "
+"був останнім відкритим елементом"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Документ раптово закінчився, очікувалась кінцева кутова дужка для закриття "
+"тегу <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Документ раптово закінчився посеред назви елемента"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Документ раптово закінчився посеред назви ознаки"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Документ раптово закінчився у середині тегу, що відкривав елемент"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Документ раптово закінчився після знака рівності, що йшов за назвою ознаки; "
+"значення ознаки не вказано"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Документ раптово закінчився посеред значення ознаки"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Документ раптово закінчився у середині тегу, що закривав елемент \"%s\""
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "Документ раптово закінчився у середині коментарю чи інструкції обробки"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Помилка в рядку %d на символі %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Незавершене посилання на предикат"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Текст в лапках не починається з лапок"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "Невідповідні лапки у командному рядку чи іншому тексті оболонки"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Текст закінчився перед символом \"\\\". (Текст був таким: \"%s\")"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Текст закінчився перед відповідними лапками для %c. (Текст був таким: \"%s\")"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Текст порожній (чи містить лише пропуски)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Помилка зчитування даних з дочірнього процесу"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Помилка створення каналу для обміну з дочірнім процесом (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Помилка зчитування з дочірнього каналу (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Помилка переходу в каталог \"%s\" (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Помилка виконання дочірнього процесу (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Неправильна назва програми: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Неправильний рядок у векторі аргументів %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Неправильний рядок у оточенні: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Неправильний робочий каталог: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Не вдається виконати допоміжну програму (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Неочікувана помилка в зчитуванні даних з дочірнього процесу через "
+"g_io_channel_win32_poll() "
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Помилка зчитування даних з дочірнього процесу (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Неочікувана помилка під час очікування на зміну стану файлового дескриптора "
+"дочірнього процесу (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Неочікувана помилка у waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Помилка створення процесу (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Помилка виконання дочірнього процесу \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Помилка перенаправлення виводу чи вводу дочірнього процесу (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Помилка запуску дочірнього процесу (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Невідома помилка виконання дочірнього процесу \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Не вдається зчитати достатню кількість даних з дочірнього каналу (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Символ не входить в набір UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Неправильна послідовність у перетворюваному вводі"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Символ не входить в набір UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Використання:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[ПАРАМЕТР...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Параметри довідки:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Показати параметри довідки"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Показати усі параметри довідки"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Параметри програми:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Не вдається розібрати числове ціле значення '%s' для %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Числове ціле значення '%s' для %s поза межами діапазону"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Не вдається розібрати числове значення подвійної точності '%s' для %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Числове значення подвійної точності '%s' для %s поза межами діапазону"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Помилка розбору параметра %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Відсутній аргумент %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Невідомий параметр %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Не вдається знайти правильний ключовий файл у каталогах даних"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Не є звичайним файлом"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Файл порожній"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Ключовий файл містить рядок '%s, який не є парою ключ-значення, групою або "
+"коментарем"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Неправильна назва групи: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Ключовий файл не починається з групи"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Неправильна назва ключа: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Ключовий фал містить кодування, що не підтримується '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Ключовий файл не містить групи '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Ключовий файл не містить ключ '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Ключовий файл містить ключ '%s' зі значенням '%s', кодування якого не UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Ключовий файл містить ключ '%s', що має значення, яке не вдається розібрати."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Ключовий файл містить '%s' у групі '%s', що має значення, яке неможливо "
+"розібрати."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Ключовий файл не містить ключ '%s' у групі '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Ключовий файл містить escape-символ наприкінці рядка"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Ключовий файл містить неправильну escape-послідовність '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Не вдається розібрати значення '%s' як число."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Числове ціле значення '%s' поза межами діапазону"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Значення '%s' не вдається перетворити у число з рухомою комою."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Не вдається розібрати значення '%s' як логічне значення."
diff --git a/trunk/po/vi.po b/trunk/po/vi.po
new file mode 100644
index 000000000..e9aacde8f
--- /dev/null
+++ b/trunk/po/vi.po
@@ -0,0 +1,935 @@
+# Vietnamese translation for GLib.
+# Copyright © 2007 Gnome i18n Project for Vietnamese.
+# T.M.Thanh <tmthanh@yahoo.com>, 2002.
+# Clytie Siddall <clytie@riverland.net.au>, 2005-2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib GNOME TRUNK\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-05-29 22:57+0930\n"
+"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
+"Language-Team: Vietnamese <gnomevi-list@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: LocFactoryEditor 1.6.3b1\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "Thuộc tính bất ngờ « %s » cho yếu tố « %s »"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "Không tìm thấy thuộc tính « %s » của yếu tố « %s »"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "Thẻ bất ngờ « %s », còn ngờ thẻ « %s »"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "Thẻ bất ngờ « %s » bên trong « %s »"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "Không tìm thấy tập tin đánh dấu hợp lệ nằm trong các thư mục dữ liệu"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "Một đánh dấu cho URI « %s » đã có"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "Không tìm thấy tập tin đánh dấu cho URI « %s »"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "Chưa xác định kiểu MIME trong đánh dấu cho URI « %s »"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "Chưa xác định cờ riêng trong đánh dấu cho URI « %s »"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "Chưa đặt nhóm trong đánh dấu cho URI « %s »"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "Không có ứng dụng tên « %s » đã đăng ký một đánh dấu cho « %s »"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Lỗi mở rộng dòng thực hiện « %s » bằng URI « %s »"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Không hỗ trợ khả năng chuyển đổi từ bộ ký tự « %s » sang « %s »"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Không thể mở bộ chuyển đổi từ « %s » sang « %s »"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Gặp dây byte không hợp lệ trong dữ liệu nhập chuyển đổi"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Gặp lỗi khi chuyển đổi: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Dây ký tự riêng phần ở cuối dữ liệu nhập"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Không thể chuyển đổi đồ dữ trữ « %s » thành bộ mã « %s »"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr ""
+"URI « %s » không phải là một URI tuyệt đối sử dụng lược đồ « file » (tập tin)"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Không cho phép URI tập tin cục bộ « %s » chứa dấu thăng « # »"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI « %s » không phải là hợp lệ"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Tên máy của URI « %s » không phải là hợp lệ"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI « %s » chứa một số ký tự đã thoát một cách không hợp lệ"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Tên đường dẫn « %s » không phải là một đường dẫn tuyệt đối"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Tên máy không hợp lệ"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Gặp lỗi khi mở thư mục « %s »: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Không thẻ cấp phát %lu byte để đọc tập tin « %s »"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Gặp lỗi khi đọc tập tin « %s »: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Lỗi đọc từ tập tin « %s »: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Lỗi mở tập tin « %s »: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "Lỗi lấy các thuộc tính của tập tin « %s »: lỗi « fstat() »: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Lỗi mở tập tin « %s »: lỗi « fdopen() »: %s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Lỗi thay đổi tên tập tin « %s » thành « %s »: lỗi « g_rename() »: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Lỗi tạo tập tin « %s »: %s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Lỗi mở tập tin « %s »: lỗi « fdopen() »: %s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Lỗi ghi tập tin « %s »: lỗi « fdopen() »: %s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Lỗi đóng tập tin « %s »: lỗi « fclose() »: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "Không thể gỡ bỏ tập tin tồn tại « %s »: lỗi « g_unlink() »: %s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Biểu mẫu « %s » không hợp lệ, không nên chứa « %s »"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Biểu mẫu « %s » không chứa XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Lỗi đọc liên kết tượng trưng « %s »: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Không hỗ trợ khả năng sử dụng liên kết tượng trưng"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Không thể mở bộ chuyển đổi từ « %s » sang « %s »: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"Không thể thực hiện tiến trình đọc thô trong « g_io_channel_read_line_string "
+"»"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Có dữ liệu chưa được chuyển đổi còn lại nằm trong bộ đệm đọc"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Kênh tận hết trong ký tự riêng phần"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+"Không thể thực hiện tiến trình đọc thô trong « g_io_channel_read_to_end »"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Lỗi mở tập tin « %s »: lỗi « fdopen() »: %s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Lỗi ánh xạ tập tin « %s »: lỗi « mmap() »: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Lỗi trên dòng %d ký tự %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Lỗi trên dòng %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Thấy thực thể rỗng « &; »; những thực thể hợp lệ là: &amp; &quot; &lt; &gt; "
+"&apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Ký tự « %s » không phải là hợp lệ ở đầu của tên thực thể; ký tự « & » khởi "
+"đầu một thực thể; nếu dấu và này không nên là một thực thể, hãy thoát nó như "
+"là « &amp; »"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Ký tự « %s » không phải là hợp lệ bên trong tên thực thể"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Không biết tên thực thể « %s »"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Thực thể không có dấu chấm phẩy cuối cùng; dường như bạn đã dùng dấu và mà "
+"không định bắt đầu một thực thể — hãy thoát dấu và như là « &amp; »"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Lỗi phân tách « %-.*s », nó nên là một chữ số bên trong một tham chiếu ký tự "
+"(v.d. « &#234 ») — có lẽ chư số quá lớn."
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Tham chiếu ký tự « %-.*s » không mã hóa một ký tự được phép."
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Tham chiếu ký tự trống; nên chứa chữ số như là « &#454; »."
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Tham chiếu ký tự không có dấu chấm phẩy cuối cùng; dường như bạn đã dùng một "
+"dấu và mà không định bắt đầu một thực thể — hãy thoát dấu và như là « &amp; »"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Tham chiếu thực thể chưa hoàn thành"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Tham chiếu ký tự chưa hoàn thành"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Đoạn chữ mã UTF-8 không hợp lệ"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Tài liệu phải bắt đầu bằng một yếu tố (v.d. <book> [quyển sách])"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"« %s » không phải là một ký tự hợp lệ đi theo một dấu ngoặc nhọn mở « < » ; "
+"không cho phép nó bắt đầu một tên yếu tố"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Ký tự lẻ « %s », còn ngờ một dấu ngoặc nhọn đóng « > » để kết thúc thẻ khởi "
+"đầu của yếu tố « %s »"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Ký tự lẻ « %s », còn ngờ một dấu bằng « = » nằm sau tên thuộc tính « %s » "
+"của yếu tố « %s »"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Ký tự lẻ « %s », còn ngờ một dấu ngoặc nhọn đóng « > » hay dấu xuyệc « / » "
+"để kết thúc thẻ khởi đầu của yếu tố « %s », hay tùy ý một thuộc tính; có lẽ "
+"bạn đã dùng một ký tự không hợp lệ trong một tên thuộc tính."
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Ký tự lẻ « %s », còn ngờ một dấu nháy kép mở nằm sau dấu bằng khi đưa giá "
+"trị cho thuộc tính « %s » của yếu tố « %s »"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"« %s » không phải là một ký tự hợp lệ nằm theo các ký tự « </ » ; không cho "
+"phép « %s » bắt đầu một tên yếu tố"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"« %s » không phải là một ký tự hợp lệ nằm theo tên yếu tố đóng « %s »; ký "
+"tự được phép là « > »."
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Yếu tố « %s » đã được đóng, không có yếu tố mở hiện thời"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "Yếu tố « %s » đã được đóng, nhưng yếu tố mở hiện thời là « %s »"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Tài liệu rỗng hay chứa chỉ khoảng trắng"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "Tài liệu đã kết thúc bất ngờ ngay sau một dấu ngoặc nhọn mở « < »"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Tài liệu đã kết thúc bất ngờ với các yếu tố vẫn còn mở — « %s » là yếu tố đã "
+"mở cuối cùng"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Tài liệu kết thúc bất ngờ, khi ngờ thấy dấu ngoặc nhọn đóng kết thúc thẻ « <%"
+"s/> »"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Tài liệu đã kết thúc bất ngờ bên trong một tên yếu tố"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Tài liệu đã kết thúc bất ngờ bên trong một tên thuộc tính"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Tài liệu đã kết thúc bất ngờ bên trong một thẻ mở yếu tố"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Tài liệu đã kết thúc bất ngờ sau dấu bằng nằm sau một tên thuộc tính; không "
+"có giá trị thuộc tính"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+"Tài liệu đã kết thúc bất ngờ trong khi nằm trong một giá trị thuộc tính"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "Tài liệu đã kết thúc bất ngờ bên trong thẻ đóng cho yếu tố « %s »"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Tài liệu đã kết thúc bất ngờ bên trong một chú thích hay hướng dẫn xử lý"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr "đối tượng bị hỏng"
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr "lỗi nội bộ hay đối tượng bị hỏng"
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr "hết bộ nhớ"
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr "không thể rút lùi nữa"
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr "mẫu chứa mục không được hỗ trợ khi khớp bộ phận"
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr "lỗi nội bộ"
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr "khi khớp bộ phận, không hỗ trợ rút lui làm điều kiện"
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr "không thể đề qui nữa"
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr "vùng làm việc không thể chứa chuỗi con rỗng nữa"
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr "kết hợp cờ dòng mới một cách không hợp lệ"
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr "lỗi lạ"
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr "Gặp lỗi trong khi khớp biểu thức chính quy %s: %s"
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr "Thư viện PCRE đã biên dịch không có khả năng hỗ trợ UTF-8"
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr "Thư viện PCRE đã biên dịch không có khả năng hỗ trợ tài sản UTF-8"
+
+#: glib/gregex.c:928
+#, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Gặp lỗi trong khi biên dịch biểu thức chính quy %s ở ký tự %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr "Gặp lỗi trong khi tối hưu hoá biểu thức chính quy %s: %s"
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr "đợi chữ số thập lục hay dấu ngoặc móc đóng « } »"
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr "đợi chữ số thập lục"
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr "thiếu dấu ngoặc nhọn mở « < » trong tham chiếu tượng trưng"
+
+#: glib/gregex.c:1834
+msgid "unfinished symbolic reference"
+msgstr "tham chiếu tượng trưng chưa hoàn thành"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr "tham chiếu tượng trưng có độ dài số không"
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr "đợi chữ số"
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr "tham chiếu tượng trưng không cho phép"
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr "dấu xuyệc ngược kết thúc rải rác « \\ »"
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr "dãy thoạt lạ"
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr "Gặp lỗi trong khi phân tách văn bản thay thế « %s » ở ký tự %lu: %s"
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Đoạn chữ trích dẫn không bắt đầu bằng một dấu trích dẫn"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Dấu ngoặc kép không ăn khớp nằm trên dòng lệnh hay trong đoạn khác đã trích "
+"dẫn trong trình bao"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Đoạn chữ đã kết thúc ngay sau dấu xuyệc ngược « \\ » (đoạn là « %s »)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Đoạn chữ đã kết thúc trước khi tìm dấu ngoặc kép khớp với « %c » (đoạn là « %"
+"s »)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Đoạn chữ rỗng (hay chưa chỉ khoảng trắng)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Lỗi đọc dữ liệu từ tiến trình con"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "Lỗi tạo ống dẫn để liên lạc với tiến trình con (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Lỗi đọc từ ống dẫn con (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Lỗi chuyển đổi sang thư mục « %s » (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Lỗi thực hiện tiến trình con (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "Tên chương trình không hợp lệ: %s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "Gặp chuỗi không hợp lệ nằm trong véc-tơ đối số tại %d: %s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Gặp chuỗi không hợp lệ nằm trong môi trường: %s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "Thư mục làm việc không hợp lệ: %s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Lỗi thực hiện chương trình bổ trợ (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Gặp lỗi bất ngờ nằm trong « g_io_channel_win32_poll() » khi đọc dữ liệu từ "
+"tiến trình con"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Lỗi đọc dữ liệu từ tiến trình con (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Gặp lỗi bất ngờ nằm trong « select() » khi đọc dữ liệu từ tiến trình con (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Gặp lỗi bất ngờ nằm trong « waitpid() » (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Lỗi tạo tiến trình con (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Lỗi thực hiện tiến trình con « %s » (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "Lỗi chuyển hướng kết nhập hay kết xuất của tiến trình con (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Lỗi tạo tiến trình con (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Gặp lỗi không rõ khi thực hiện tiến trình con « %s »"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "Lỗi đọc đủ dữ liệu từ ống dẫn PID con (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Ký tự ở ngoại phạm vi UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Dãy không hợp lệ nằm trong dữ liệu nhập việc chuyển đổi"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Ký tự ở ngoại phạm vi UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Cách sử dụng:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[TÙY_CHỌN...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Tùy chọn trợ giúp:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Hiển thị các tùy chọn trợ giúp"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Hiển thị mọi tùy chọn trợ giúp"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Tùy chọn ứng dụng:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Không thể phân tách giá trị số nguyên « %s » cho %s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Giá trị số nguyên « %s » cho %s ở ngoại phạm vi"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Không thể phân tách giá trị đôi « %s » cho %s"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Giá trị đôi « %s » cho %s ở ngoại phạm vi"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "Gặp lỗi khi phân tách tùy chọn %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "Thiếu đối số cho %s"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Không biết tùy chọn %s"
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "Không tìm thấy tập tin khoá hợp lệ nằm trong thư mục tìm kiếm"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Không phải là một tập tin chuẩn"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Tập tin rỗng"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Tập tin khóa chứa dòng « %s » mà không phải là một cặp giá trị khóa, nhóm, "
+"hay chú thích"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "Tên nhóm không hợp lệ: %s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Tập tin khóa không bắt đầu với nhóm"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "Tên khoá không hợp lệ: %s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Tập tin khóa chứa bảng mã không được hỗ trợ « %s »"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Tập tin khóa không có nhóm « %s »"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Tập tin khóa không có khóa « %s »"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Tập tin khóa chứa khóa « %s » với giá trị « %s » mà không phải là UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Tập tin khóa chứa khóa « %s » mà có giá trị không có khả năng giải dịch."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Tập tin khóa chứa khóa « %s » trong nhóm « %s » mà có giá trị không có khả "
+"năng giải dịch."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Tập tin khóa không có khóa « %s » trong nhóm « %s »"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Tập tin khóa chứa ký tự thoát tại kết thúc của dòng"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "Tập tin khóa chứa dãy thoát không hợp lệ « %s »"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Không thể giải dịch giá trị « %s » dạng con số."
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Giá trị số nguyên « %s » ở ngoại phạm vi"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Không thể giải dịch giá trị « %s » dạng con số nổi."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Không thể giải dịch giá trị « %s » dạng bun (đúng/sai)."
diff --git a/trunk/po/wa.po b/trunk/po/wa.po
new file mode 100644
index 000000000..d18dedf08
--- /dev/null
+++ b/trunk/po/wa.po
@@ -0,0 +1,912 @@
+# Translation into the walloon language.
+#
+# Si vos voloz donner on côp di spale pol ratournaedje di Gnome (ou des
+# ôtes libes programes) sicrijhoz-mu a l' adresse emile
+# <srtxg@chanae.alphanet.ch>; nos avans co bråmint di l' ovraedje a fé.
+#
+# Copyright (C) 2001 Free Software Foundation, Inc.
+# Pablo Saratxaga <pablo@walon.org>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2004-05-03 14:40+0200\n"
+"Last-Translator: Pablo Saratxaga <pablo@walon.org>\n"
+"Language-Team: Walloon <linux-wa@walon.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Dji n' a savou lére li loyén simbolike «%s»: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "Li cviersaedje di l' ecôdaede «%s» viè «%s» n' est nén sopoirté"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Dji n' a savou drovi l' cvierseu di «%s» viè «%s»"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Secwince d' octets nén valide e l' intrêye do cviersaedje"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Åk n' a nén stî tot cviersant: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr ""
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr ""
+
+#: glib/gconvert.c:1727
+#, fuzzy, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "Li tchmin «%s» n' est nén on tchmin absolou"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr ""
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr ""
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr ""
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr ""
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Li tchmin «%s» n' est nén on tchmin absolou"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "No d' lodjoe nén valide"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Åk n' a nén stî tot drovant l' ridant «%s»: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Dji n' a savou alouwer %lu octets po lére li fitchî «%s»"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Dji n' a nén savou lére li fitchî «%s»: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Dji n' a savou drovi li fitchî «%s»: %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"Dji n' a nén savou aveur les atributs do fitchî «%s»: fstat() a fwait "
+"berwete: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Dji n' a savou askepyî l' fitchî «%s»: %s"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "Li patron «%s» n' est nén valide, i n' doet nén aveur on «%s»"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "Li patron «%s» èn finixh nén avou XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Dji n' a savou lére li loyén simbolike «%s»: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Loyéns simbolikes nén sopoirtés"
+
+#: glib/giochannel.c:1152
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Dji n' a savou drovi l' cvierseu di «%s» viè «%s»: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr ""
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr ""
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Aroke el roye %d caractere %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Aroke el roye %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Vude intité «&;» di trovêye; les intités valides sont: &amp; &quot; &lt; "
+"&gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Li caractere «%s» n' est nén valide å cmince do no d' ene intité; le "
+"caractere & cmince ene intité; si ç' caractere ampersande doet esse håyné té "
+"ké, adon el fåt scrire come « &amp; »"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Li caractere «%s» n' est nén valide dins on no d' intité"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Li no d' intité «%s» n' est nén cnoxhou"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"L' intité èn finixh nén avou on pont-coma; probåblumint k' vos avoz eployî "
+"on caractere ampersande sins vleur sicrire ene intité, dins ç' cas el fåt "
+"scrire insi: « &map; »"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr ""
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr ""
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr ""
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr ""
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Tecse ecôdé en UTF-8 nén valide"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Li documint doet cmincî avou èn elemint (eg: <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr ""
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Li documint esteut vude ou avou seulmint des blancs"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr ""
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr ""
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr ""
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr ""
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Aroke el roye %d caractere %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+msgid "unfinished symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr ""
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr ""
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Li tecse esteut vude (ou avou seulmint des blancs)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Dji n' a savou lére do process efant"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Dji n' a savou lére del buze efant (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Dji n' a savou candjî viè l' ridant «%s» (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Dji n' a savou enonder l' process efant (%s)"
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "No d' lodjoe nén valide"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, fuzzy, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Secwince nén valide e l' intrêye do cviersaedje"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr "Åk n' a nén stî tot drovant l' ridant «%s»: %s"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Dji n' a savou enonder l' aidant programe"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Dji n' a savou fé on fork() (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Dji n' a savou enonder l' process efant «%s» (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Dji n' a savou fé on fork do process efant (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Aroke nén cnoxhowe tot-z enondant l' processus efant «%s»"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Caractere foû fortchete po l' ecôdaedje UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Secwince nén valide e l' intrêye do cviersaedje"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Caractere foû fortchete po l' ecôdaedje UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr ""
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr ""
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr ""
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr ""
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Åk n' a nén stî tot cviersant: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr ""
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr ""
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "No d' lodjoe nén valide"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "No d' lodjoe nén valide"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Dji n' a savou alouwer %lu octets po lére li fitchî «%s»"
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "Li cviersaedje di l' ecôdaede «%s» viè «%s» n' est nén sopoirté"
diff --git a/trunk/po/xh.po b/trunk/po/xh.po
new file mode 100644
index 000000000..3da7a6ec8
--- /dev/null
+++ b/trunk/po/xh.po
@@ -0,0 +1,971 @@
+# Xhosa translation of glib
+# Copyright (C) 2005 Canonical Ltd.
+# This file is distributed under the same license as the glib package.
+# Translation by Canonical Ltd <translations@canonical.com> with thanks to
+# Translation World CC in South Africa, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2005-02-08 12:31+0200\n"
+"Last-Translator: Canonical Ltd <translations@canonical.com>\n"
+"Language-Team: Xhosa <xh-translate@ubuntu.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"Uphawu olutenxileyo '%s', lulindele '=' emva kwegama lophawu '%s' "
+"lwesiqalelo '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, fuzzy, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+"Iqhosha elisebenzayo lefayili alifumanekanga kwidata yoovimba beefayili"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "Akuphumelelanga ukufunda ikhonkco elingumfuziselo '%s': %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr ""
+"Uguqulo ukusuka kwingqokelela yeempawu '%s' ukuya kwi '%s' ayixhaswanga"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "Akukwazekanga ukuvula isiguquli ukusuka ku '%s' ukuya ku '%s'"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "Ulandelelwano olungasebenziyo lwe-byte kungeniso-lwazi yenguqulo"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "Impazamo ngelixa lenguqulo: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "Inxalenye yophawu lolandelelwano ekupheleni kongeniso-lwazi"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "Akukwazeki ukuguqula i-fallback '%s' kwiseti yekhowudi '%s'"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "I-URI '%s' asiyiyo i-URI ngokupheleleyo esebenzisa indlela ye \"file\""
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "I-URI yefayili yendawo '%s' kunokwenzeka ingaquki i-'#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "Ayisebenzi i-'%s' yeURI"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Igama lomququzeleli weURI '%s' alisebenzi"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "I-URI '%s' iqulethe iimpawu ezisindileyo ezingasebenziyo"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "Igama lendlela yothungelwano '%s' akuyiyo kuphela indlela"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "Igama lomququzeleli elingasebenziyo"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "Impazamo yokuvula uvimba weefayili '%s': %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "Akwazekanga ukwaba %lu ii-byte ukufunda ifayili \"%s\""
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "Impazamo yokufunda ifayili '%s': %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "Akuphumelelekanga ukufunda ifayili '%s': %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "Akuphumelelekanga ukuvula ifayili '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr ""
+"Akuphumelelekanga ukufumana iimpawu zefayili '%s': fstat() "
+"akuphumelelekanga: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "Akuphumelelekanga ukudala ifayili '%s': %s"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "I-Template '%s' ayisebenzi, kufuneka ingaqulathi i '%s'"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "I-Template '%s' ayipheli ngo XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "Akuphumelelanga ukufunda ikhonkco elingumfuziselo '%s': %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "Ikhonkco elingumfuziselo alixhaswanga"
+
+#: glib/giochannel.c:1152
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "Akukwazekanga ukuvula isiguquli ukusuka ku `%s' ukuya ku `%s': %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr ""
+"Akukwazeki ukwenza ukufunda okungalungiswanga kwi "
+"g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "Intsalela yedata engaguqulwanga kwisigcini sethutyana sokufunda"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "Isiqhagamshelanisi siphelela inxalenye yophawu"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr ""
+"Akukwazeki ukwenza ukufunda okungalungiswanga kwi g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "Impazamo emgceni %d uphawu %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "Impazamo emgceni %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"Into ezimeleyo eze '&;' ebonwayo; izinto ezizimeleyo ezisebenzayo: &amp; "
+"&quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"Uphawu '%s' alusebenzi ekuqaleni kwegama lento ezimeleyo; u-& uphawu uqala "
+"into ezimeleyo; ukuba le ampersand ayifanelanga ukuba yinto ezimeleyo, "
+"yiphephise njenge &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "Uphawu '%s' alusebenzi ngaphakathi kwegama lento ezimeleyo"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "Igama lento ezimeleyo '%s' alaziwa"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"Into ezimeleyo ayiphelelanga ngechaphaza-msila; mhlawumbi usebenzise uphawu "
+"lwe- ampersand ungazimiselanga ukuqala into ezimeleyo - phepha i- ampersand "
+"njenge &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"Akuphumelelanga ukwahlula ngezijungqe '%-.*s', obekufanele ukuba ngumvo "
+"ngaphakathi kophawu lokuthumela (&#234; umzekelo) - mhlawumbi umvo mkhulu "
+"kakhulu"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "Uphawu lokuthumela '%-.*s' alulunxulumanisi uphawu olunemvume"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "Uphawu lokuthumela oluze; kufuneka luquke umvo ofana nalo &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"Uphawu lokuthumela aluphelelanga ngechaphaza-msila; mhlawumbi usebenzise "
+"uphawu lwe- ampersand ungenanjongo yokuqala into ezimeleyo - phepha i- "
+"ampersand njenge &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "Into ezimeleyo yokuthumela engagqitywanga"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "Uphawu lokuthumela olungagqitywanga"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "Umbhalo onxulumanisayo ongasebenziyo we- UTF-8"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "Uxwebhu kufuneka luqale ngesiqalelo (umzkl. <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' asilophawu elisebenzayo elilandela u '<' uphawu; linokungaqali igama "
+"lesiqalelo"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"Uphawu olutenxileyo '%s', lulindele '>' uphawu lokuphelisa ilebhile "
+"yokuqalisa isiqalelo '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"Uphawu olutenxileyo '%s', lulindele '=' emva kwegama lophawu '%s' "
+"lwesiqalelo '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"Uphawu olutenxileyo '%s', lulindele '>' okanye '/' uphawu lokuphelisa "
+"ilebhile yokuqala isiqalelo '%s', okanye ngokhetho lophawu; mhlawumbi "
+"usebenzise uphawu olungasebenziyo kwigama lophawu"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"Uphawu olutenxileyo '%s', lulindele uphawu locaphulo oluvulekileyo emva "
+"kweempawu zokulingana xa kunikwa ixabiso lophawu '%s' lwesiqalelo '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' asilophawu olusebenzayo ukulandela iimpawu '</'; '%s' linokungaqali "
+"igama lesiqalelo"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' asilophawu olusebenzayo ukulandela igama lesiqalelo elikufuphi '%s'; "
+"uphawu oluvunyelweyo lolu '>'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "Isiqalelo '%s' besivaliwe, akukho siqalelo sivuliweyo njengangoku"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr ""
+"Isiqalelo '%s' besivaliwe, kodwa isiqalelo esivuliweyo njengangoku sesi '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "Uxwebhu beluze okanye luqulathe isikhewu esimhlophe kuphela"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr ""
+"Uxwebhu luphele ngesiquphe kanye emva kwesibiyeli sedolo elivulekileyo '<'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"Uxwebhu luphele ngesiquphe xeshikweni iziqalelo bezisavulile - '%s' "
+"isiqalelo sokugqibela besivuliwe"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"Uxwebhu luphele ngesiquphe, kulindelwe ukubona isibiyeli sedolo elivaliweyo "
+"esiphelisa ilebhile <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "Uxwebhu luphele ngesiquphe ngaphakathi kwegama lesiqalelo"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "Uxwebhu luphele ngesiquphe ngaphakathi kwegama lophawu"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "Uxwebhu luphele ngesiquphe ngaphakathi kwelebhile evula isiqalelo."
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"Uxwebhu luphele ngesiquphe emva kokuba uphawu lokulingana lulandele igama "
+"lophawu; kungekho xabiso lophawu"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "Uxwebhu luphele ngesiquphe xeshikweni lungaphakathi kwexabiso lophawu"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"Uxwebhu luphele ngesiquphe ngaphakathi kwelebhile evaliweyo yesiqalelo '%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"Uxwebhu luphele ngesiquphe ngaphaikathi komyalelo wezimvo okanye inkqubo"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "Impazamo emgceni %d uphawu %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "Into ezimeleyo yokuthumela engagqitywanga"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "Umbhalo ocatshuliweyo awuqali ngophawu locaphulo"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr ""
+"Uphawu locaphulo olungangqinelaniyo kumgca womyalelo okanye omnye umbhalo "
+"ocatshuliweyo"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "Umbhalo uphele nje emva kophawu '\\'. (Umbhalo ubu '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"Umbhalo uphele phambi kokuba ucaphulo olungqinelanayo lufunyanwe malunga %c. "
+"(Umbhalo ubu '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "Umbhalo ubuze (okanye uqulethe isithuba esimhlophe kuphela)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "Akuphumelelekanga ukufunda idata kwinkqubo yomntwana"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr ""
+"Akuphumelelekanga ukudala uthungelwano lokunxibelelana nenkqubo yomntwana (%"
+"s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "Akuphumelelekanga ukufunda kuthungelwano lomntwana (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "Akuphumelelekanga ukuguqukela kuvimba weefayili '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "Akuphumelelekanga ukuphumeza inkqubo yomntwana (%s)"
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "Igama lomququzeleli elingasebenziyo"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, fuzzy, c-format
+msgid "Invalid string in environment: %s"
+msgstr "Ulandelelwano olungasebenziyo kwinguqulo yongeniso-lwazi"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr "Impazamo yokuvula uvimba weefayili '%s': %s"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "Akuphumelelekanga ukuphumeza inkqubo yomncedi"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"Impazamo engalindelekanga kwi g_io_channel_win32_poll() yokufunda idata "
+"kwinkqubo yomntwana"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "Akuphumelelekanga ukufunda idata kwinkqubo yomntwana (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr ""
+"Impazamo engalindelekanga select() lokufunda idata kwinkqubo yomntwana (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "Impazamo engalindelekanga kwi-waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "Akuphumelelekanga ukudala inkqubo entsha (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "Akuphumelelekanga ukuphumeza inkqubo yomntwana \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr ""
+"Akuphumelelekanga ukuyalela kwakhona ungeniso nophumezo lolwazi kwinkqubo "
+"yomntwana (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "Akuphumelelekanga ukudala inkqubo entsha yomntwana (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "Impazamo engaziwayo yokuphumeza inkqubo yomntwana \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr ""
+"Akuphumelelekanga ukufunda ngokwaneleyo idata evela kuthungelwano nomntwana "
+"(%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "Uphawu lungaphandle kwesigaba se-UTF-8"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "Ulandelelwano olungasebenziyo kwinguqulo yongeniso-lwazi"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "Uphawu lungaphandle kwesigaba se-UTF-16"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "Ukusetyenziswa:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[OPTION...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "Uncedo lokunokukhethwa:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "Bonisa amancedo anokukhethwa"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "Bonisa onke amancedo anokukhethwa"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "Iindlela zokusebenza ezinokukhethwa:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, fuzzy, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "Akukwazeki ukwahlula ngezijungqe ixabiso lanani elimbaxa '%s' for --%s"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "Ixabiso lenani elimbaxa '%s' le %s lingaphaya kwesigaba"
+
+#: glib/goption.c:831
+#, fuzzy, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "Akukwazeki ukwahlula ngezijungqe ixabiso lanani elimbaxa '%s' for --%s"
+
+#: glib/goption.c:839
+#, fuzzy, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "Ixabiso lenani elimbaxa '%s' le %s lingaphaya kwesigaba"
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "Impazamo ngelixa lenguqulo: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "Ukhetho olungaziwayo %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+"Iqhosha elisebenzayo lefayili alifumanekanga kwidata yoovimba beefayili"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "Asiyofayili esebenza rhoqo"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "Ifayili ize"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+"Ifayili engundoqo iqulethe umgca '%s' ongesiso isibini sexabiso okanye "
+"isindululo"
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "Igama lomququzeleli elingasebenziyo"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "Ifayili engundoqo ayiqali ngeqela"
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "Igama lomququzeleli elingasebenziyo"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "Ifayili engundoqo iqulethe unxulumano olungaxhaswanga '%s'"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "Ifayili engundoqo ayinalo iqela '%s'"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "Ifayili engundoqo ayinalo iqhosha '%s'"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+"Ifayili engundoqo iqulethe iqhosa '%s' elinexabiso '%s' elingeyiyo UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+"Ifayili engundoqo iqulethe iqhosha '%s' elinexabiso elingekhe lichazwe."
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+"Ifayili engundoqo iqulethe iqhosha '%s' kwiqela '%s' elinexabiso elingekhe "
+"lichazwe."
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "Ifayili engundoqo ayinalo iqhosha '%s' eqeleni '%s'"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "Ifayili engundoqo iqulethe uphawu lokuphepha ekupheleni komgca"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr ""
+"Ifayili engundoqo iqulethe ulandelelwano olungasebenziyo lokuphepha '%s'"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "Ixabiso '%s' alinakho ukuchazwa njengenani."
+
+#: glib/gkeyfile.c:3593
+#, fuzzy, c-format
+msgid "Integer value '%s' out of range"
+msgstr "Ixabiso lenani elimbaxa '%s' le %s lingaphaya kwesigaba"
+
+#: glib/gkeyfile.c:3626
+#, fuzzy, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "Ixabiso '%s' alinakho ukuchazwa njengenani."
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "Ixabiso '%s' alinakho ukuchazwa njenge-boolean."
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr ""
+#~ "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "Akwazekanga ukwaba %lu ii-byte ukufunda ifayili \"%s\""
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr ""
+#~ "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr ""
+#~ "Inguqulo ukusuka kwingqokelela yeempawu `%s' ukuya ku `%s' ayixhaswanga"
diff --git a/trunk/po/yi.po b/trunk/po/yi.po
new file mode 100644
index 000000000..431c628e2
--- /dev/null
+++ b/trunk/po/yi.po
@@ -0,0 +1,944 @@
+# Yiddish version
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# Raphael Finkel <raphael@cs.uky.edu>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2003-03-19\n"
+"Last-Translator: Raphael Finkel <raphael@cs.uky.edu>\n"
+"Language-Team: Yiddish <raphael@cs.uky.edu>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, fuzzy, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr ""
+"מאָדנע שריפֿטצײכן '%s'; דערװאַרט אַ '=' שריפֿטצײכן נאָך אַטריבוט־נאָמען %s פֿונעם "
+"עלעמענט '%s'"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr ""
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr ""
+
+#: glib/gbookmarkfile.c:3404
+#, fuzzy, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "ניט געקענט שאַפֿן טעקע %s: %s"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "פֿאַרװאַנדלונג פֿון קאָדירונג %s צו %s ניט געשטיצט"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "ניט געקענט עפֿענען פֿאַרװאַנדלער פֿון %s צו %s: %s"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "אומלעקסיק אַכטעלע־סעײַװענץ אין פֿאַרװאַנדלונג אַרױסשרײַב"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "האַלבע כאַראַקטער־סעקװענץ צום סוף פֿון אַרײַנשרײַב"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "ניט געקענט פֿאַרװאַנדלען גרונטבאַטרעף %s צו קאָדירונג %s"
+
+#: glib/gconvert.c:1727
+#, fuzzy, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "דער URI %s איז ניט אַבסאָלוט לױט דער טעקע־סכעמע"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "דער לאָקאַלער טעקע־URI %s טאָר ניט כּולל זײַן אַ '#'"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "דער URI %s איז אומלעקסיק"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "דער מאַשין־נאָמען פֿונעם URI %s איז אומלעקסיק"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "דער URI %s איז כּולל אומלעקסיקע פּליטה־כאַראַקטערס"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "די פּאַפּקע־רשימה %s איז ניט אַבסאָלוט"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "אומלעקסיקער מאַשין־נאָמען"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "דורכפֿאַל אין עפֿענען פּאַפּקע %s: %s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "ניט געקענט אױסטײלן %lu אַכטעלעך צו לײענען טעקע %s"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "דורכפֿאַל אין לײענען טעקע %s: %s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "ניט געקענט לײענען טעקע %s: %s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "ניט געקענט עפֿענען טעקע '%s': %s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "ניט געקענט באַקומען אַטריבוטן פֿון טעקע %s: fstat() איז דורכגעפֿאַלן: %s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s"
+
+#: glib/gfileutils.c:890
+#, fuzzy, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "ניט געקענט שאַפֿן טעקע %s: %s"
+
+#: glib/gfileutils.c:945
+#, fuzzy, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s"
+
+#: glib/gfileutils.c:970
+#, fuzzy, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s"
+
+#: glib/gfileutils.c:989
+#, fuzzy, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr ""
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "מוסטער %s אומלעקסיק, טאָר ניט כּולל זײַן %s"
+
+#: glib/gfileutils.c:1364
+#, fuzzy, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "מוסטער %s ענדיקט זיך ניט מיט XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, fuzzy, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "ניט געקענט שאַפֿן טעקע %s: %s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr ""
+
+#: glib/giochannel.c:1152
+#, fuzzy, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "ניט געקענט עפֿענען פֿאַרװאַנדלער פֿון %s צו %s: %s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "ניט געקענט מאַכן אַ רױ־לײען אין g_io_channel_read_line_string"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "איבעריקע ניט־פֿאַרװאַנדלטע דאַטן אין לײען־באַהאַלטאָרט"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "קאַנאַל ענדיקט זיך מיט אַ האַלבן שריפֿטצײכן"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "ניט געקענט מאַכן אַ רױ־לײען אין g_io_channel_read_to_end"
+
+#: glib/gmappedfile.c:116
+#, fuzzy, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s"
+
+#: glib/gmappedfile.c:193
+#, fuzzy, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "דורכפֿאַל אױף שורה %d פּאָזיציע %d: %s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "דורכפֿאַל אױף שורה %d: %s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr ""
+"לײדיקער אײנס '&;' געזען; לעקסיקע אײנסן זײַנען: &amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"שריפֿטצײכן %s איז ניט לעקסיק צום אָנהײב פֿון אַן אײנסנאָמען; דער & שריפֿטצײכן הײבט "
+"אַן אײנס אָן; אױב מיט דעם דאָזיקן & מײנט מען ניט קײן אײנס, נאָרמאַליר אים װי &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "שריפֿטצײכן %s איז אומלעקסיק אין מיטן פֿון אַן אײנסנאָמען"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "אײנסנאָמען %s איז ניט באַקאַנט"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"אײנס האָט זיך ניט געענדיקט מיט קײן \";\". מסתּמא האָט מען געשריבן אַן & "
+"שריפֿטצײכן אָן דער כּװנה אָנצוהײבן אַן אײנס. נאָרמאַליר & װי &amp;"
+
+#: glib/gmarkup.c:573
+#, fuzzy, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr ""
+"דורכפֿאַל אין אַנאַליזירן '%s', װאָס זאָל האָבן אַ ציפֿער אין דער שריפֿטצײכן־רעפֿערענץ "
+"(למשל &#234;); אפֿשר איז דער ציפֿער צו גרױס"
+
+#: glib/gmarkup.c:598
+#, fuzzy, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "שריפֿטצײכן־רעפֿערענץ '%s' קאָדירט ניט קײן דערלאָזטן שריפֿטצײכן"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "נוליקע שריפֿטצײכן־רעפֿערענץ; מוז כּולל זײַן אַ ציפֿער, װי &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"שריפֿטצײכן־רעפֿערענץ האָט זיך ניט געענדיקט מיט קײן \";\". מסתּמא האָט מען געשריבן "
+"אַן & שריפֿטצײכן אָן דער כּװנה אָנצוהײבן אַן אײנס. נאָרמאַליר & װי &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "ניט־געענדיקט אײנס־רעפֿערענץ"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "ניט־געענדיקט שריפֿטצײכן־רעפֿערענץ"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "אומלעקסיק UTF־8 קאָדירטער טעקסט"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "דאָקומענט מוז אָנהײבן מיט אַן עלעמענט (װי למשל <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr ""
+"'%s' איך ניט קײן לעקסיקער שריפֿטצײכן נאָך אַ '‪<‬' שריפֿטצײכן;עס טאָר ניט אָנהײבן "
+"קײן אײנסנאָמען"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr ""
+"מאָדנע שריפֿטצײכן '%s'; דערװאַרט אַ '‪>‬' שריפֿטצײכן צו ענדיקן דעם אָנהײב־הענטל "
+"פֿונעם עלעמענט '%s'"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr ""
+"מאָדנע שריפֿטצײכן '%s'; דערװאַרט אַ '=' שריפֿטצײכן נאָך אַטריבוט־נאָמען %s פֿונעם "
+"עלעמענט '%s'"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"מאָדנע שריפֿטצײכן '%s'; דערװאַרט אַ '‪>‬' אָדער '/' שריפֿטצײכן צו ענדיקן דעם "
+"אָנהײב־הענטל פֿונעם עלעמענט '%s'; אפֿשר האָט מען געלײגט אַן אומלעקסיקן שריפֿטצײכן "
+"אין אַן אַטריבוט־נאָמען"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"מאָדנע שריפֿטצײכן '%s'; דערװאַרט אַ '\"' נאָך דעם '=' צו באַשטעטיקן דעם באַטרעף פֿון "
+"אַטריבוט '%s' פֿונעם עלעמענט '%s'"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr ""
+"'%s' איז ניט קײן לעקסיקער שריפֿטצײכן נאָך די שריפֿטצײכנס '‪</‬'; '%s' טאָר ניט "
+"אָנהײבן קײן עלעמענט־נאָמען"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr ""
+"'%s' איז ניט קײן לעקסיקער שריפֿטצײכן נאָך דעם שלאָס־עלעמענט נאָמען '%s'; מען מוז "
+"שטעלן '‪>‬'"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "עלעמענט '%s' איז פֿאַרמאַכט; קײן עלעמענט איז דערװײַל אָפֿן"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "עלעמענט '%s' איז פֿאַרמאַכט; דער איצטיקער אָפֿענער עלעמענט איז '%s'"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "דאָקומענט איז פּוסט אָדער איז כּולל בלױז לײדיק אָרט"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט נאָך אַן עפֿן־צײכן '‪<‬'"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr ""
+"דאָקומענט ענדיקט זיך אומגעריכטערהײט מיט אָפֿענע עלעמענטן; '%s' איז געװען דער "
+"לעצט־געעפֿנטער עלעמענט"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr ""
+"דאָקומענט ענדיקט זיך אומגעריכטערהײט; דערװאַרט אַ שלאָס־צײכן '‪>‬' צו ענדיקן דעם "
+"הענטל ‪<%s/>‬"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַן עלעמענט־נאָמען"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַן אַטריבוט־נאָמען"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַן עלעמענט־עפֿן הענטל"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr ""
+"דאָקומענט ענדיקט זיך אומגעריכטערהײט נאָך דעם '=' שריפֿטצײכן נאָך אַן "
+"אַטריבוט־נאָמען אָן קײן אַטריבוט־באַטרעף"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַן אַטריבוט־באַטרעף"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr ""
+"דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון דעם שלאָס־הענטל פֿון עלעמענט "
+"'%s'"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr ""
+"דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַ קאָמענטאַר אָדער אַ "
+"באַאַרבעטן־באַפֿעל"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "דורכפֿאַל אױף שורה %d פּאָזיציע %d: %s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "ניט־געענדיקט אײנס־רעפֿערענץ"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "ציטירטער טעקסט הײבט ניט אָן מיט קײן גענדזן־פֿיסל"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "גענדזן־פֿיסל אָן אַ זיװג אין באַפֿעל־שורה אָדער אַנדער ציטירטן טעקסט"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr ""
+"טעקסט האָט זיך געענדיקט באַלד נאָך אַ '\\' שריפֿטצײכן. (דער טעקסט איז געװען '%s')"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr ""
+"טעקסט האָט זיך געענדיקט אײדער אַ זיװג צו דעם גענדזן־פֿיסל ‪%c‬. (דער טעקסט איז "
+"געװען '%s')"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "טעקסט איז געװען פּוסט (אָדער איז כּולל בלױס לײדיק אָרט)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "ניט געקענט לײענען דאַטן פֿון קינדפּראָצעס"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "דורכפֿאַל אין שאַפֿן רער צוליב קאָמוניקירן מיט קינדפּראָצעס (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "דורכפֿאַל אין לײענע פֿון אַ ינדרער (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "דורכפֿאַל אין זיך קערן צו פּאַפּקע '%s' (%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "דורכפֿאַל אין באַאַרבעטן קינדפּראָצעס (%s)"
+
+#: glib/gspawn-win32.c:428
+#, fuzzy, c-format
+msgid "Invalid program name: %s"
+msgstr "אומלעקסיקער מאַשין־נאָמען"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr ""
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, fuzzy, c-format
+msgid "Invalid string in environment: %s"
+msgstr "אומלעקסיקער סעקװענץ אין פֿאַרװאַנדל־אַרײַנשרײַב"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, fuzzy, c-format
+msgid "Invalid working directory: %s"
+msgstr "דורכפֿאַל אין עפֿענען פּאַפּקע %s: %s"
+
+#: glib/gspawn-win32.c:738
+#, fuzzy, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "דורכפֿאַל אין באַאַרבעטן הילף־פּראָגראַם"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr ""
+"אומדערװאַרטער דורכפֿאַל אין g_io_channel_win32_poll() בשעת לײענען דאַטן פֿון אַ "
+"קינדפּראָצעס"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "דורכפֿאַל אין לײענען דאַטן פֿון אַ קינדפּראָצעס (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "אומדערװאַרטער דורכפֿאַל אין select() לײענען דאַטן פֿון אַ קינדפּראָצעס (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "אומדערװאַרטער דורכפֿאַל אין waitpid() (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "דורכפֿאַל אין קלאָנירן (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "דורכפֿאַל אין באַאַרבעטן קינדפּראָצעס \"%s\" (%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "דורכפֿאַל אין װידערצילן אַרױסשרײַב אָדער אַרײַנשרײַב פֿון קינדפּראָצעס (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "דורכפֿאַל אין קלאָנירן קינדפּראָצעס (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "אומבאַקאַנטער דורכפֿאַל אין באַאַרבעטן קינדפּראָצעס \"%s\""
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "דורכפֿאַל אין לײענען גענוג דאַטן פֿון קינד pid-רער (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "שריפֿטצײכן ניט אין דער UTF־8 גאַמע"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "אומלעקסיקער סעקװענץ אין פֿאַרװאַנדל־אַרײַנשרײַב"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "שריפֿטצײכן ניט אין דער UTF־16 גאַמע"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr ""
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr ""
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr ""
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr ""
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr ""
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr ""
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr ""
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr ""
+
+#: glib/goption.c:1176
+#, fuzzy, c-format
+msgid "Error parsing option %s"
+msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr ""
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr ""
+
+#: glib/gkeyfile.c:341
+#, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr ""
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr ""
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr ""
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr ""
+
+#: glib/gkeyfile.c:806
+#, fuzzy, c-format
+msgid "Invalid group name: %s"
+msgstr "אומלעקסיקער מאַשין־נאָמען"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr ""
+
+#: glib/gkeyfile.c:854
+#, fuzzy, c-format
+msgid "Invalid key name: %s"
+msgstr "אומלעקסיקער מאַשין־נאָמען"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr ""
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr ""
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr ""
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr ""
+
+#: glib/gkeyfile.c:3437
+#, fuzzy, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "דער URI %s איז כּולל אומלעקסיקע פּליטה־כאַראַקטערס"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr ""
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr ""
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr ""
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr ""
+
+#, fuzzy
+#~ msgid "Could not change file mode: fork() failed: %s"
+#~ msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: waitpid() failed: %s"
+#~ msgstr "ניט געקענט אױסטײלן %lu אַכטעלעך צו לײענען טעקע %s"
+
+#, fuzzy
+#~ msgid "Could not change file mode: chmod() failed: %s"
+#~ msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s"
+
+#~ msgid "Conversion from character set `%s' to `%s' is not supported"
+#~ msgstr "פֿאַרװאַנדלען פֿון שריפֿטצײכן־געזעמל %s צו %s איז ניט געשטיצט"
+
+#~ msgid "Incorrect message size"
+#~ msgstr "ניט־ריכטיקע אָנזאָגגרײס"
+
+#~ msgid "Socket error"
+#~ msgstr "סאָקעט־דורכפֿאַל"
diff --git a/trunk/po/zh_CN.po b/trunk/po/zh_CN.po
new file mode 100644
index 000000000..d06393372
--- /dev/null
+++ b/trunk/po/zh_CN.po
@@ -0,0 +1,891 @@
+# glib simplified chinese translation
+# Copyright (C) YERA Free Software Foundation, Inc.
+# He Qiangqiang <carton@263.net>, 2001.
+# Funda Wang <fundawang@linux.net.cn>, 2004, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-04-15 10:46+0700\n"
+"Last-Translator: Yang Zhang <zyangmath@gmail.com>\n"
+"Language-Team: zh_CN <i18n-translation@lists.linux.net.cn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "元素“%2$s”的意外属性“%1$s”"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "元素“%2$s”的属性“%1$s”未找到"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "意外标签“%s”,需要标签“%s”"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "“%2$s”的意外标签“%1$s”"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "无法在数据目录中找到有效的书签文件"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "URI“%s”的书签已经存在"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "未找到 URI“%s”的书签"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "URI“%s”的书签未定义 MIME 类型"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "URI“%s”的书签未定义私有标志"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "URI“%s”的书签未设定组"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "没有名为“%s”的应用程序为“%s”注册书签"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "用 URI ’%2$s‘展开 exec 行‘%1$s’失败"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "不支持从字符集“%s”到“%s”的转换"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "无法打开从“%s”到“%s”的转换器"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "转换输入中出现无效字符序列"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "转换过程中出错:%s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "输入末尾出现未尽字符序列"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "无法转换后备字符集“%s”到字符集“%s”"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI“%s”不是“file”格式的绝对 URI"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "本地文件 URI“%s”不能包含“#”"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI“%s”无效"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "URI中的主机名“%s”无效"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI“%s”中包含无效的转义字符"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "路径名“%s”不是绝对路径"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "无效的主机名"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "打开目录“%s”时发生错误:%s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "无法分配 %lu 字节以读取文件“%s”"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "读取文件“%s”出错:%s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "读取文件“%s”失败:%s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "打开文件“%s”失败:%s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "获得文件“%s”的属性失败:fstat() 失败:%s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "打开文件“%s”失败:fdopen() 失败:%s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "将文件“%s”重命名为“%s”失败:g_rename() 失败:%s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "创建文件“%s”失败:%s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "打开文件“%s”写入失败:fdopen() 失败:%s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "写入文件“%s”失败:fwrite() 失败:%s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "关闭文件“%s”失败:fclose() 失败:%s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "无法删除已有文件“%s”:g_unlink() 失败:%s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "模板“%s”无效,不应该包含“%s”"
+
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "模板“%s”的不包含 XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "读取符号链接“%s”失败:%s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "不支持符号链接"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "无法打开从“%s”到“%s”的转换器:%s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "g_io_channel_read_line_string 函数无法进行原始读取"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "在读缓冲里留有未转换数据"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "通道终止于未尽字符"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "g_io_channel_read_to_end 函数无法进行原始读取"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "打开文件“%s”失败:open() 失败:%s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "映射文件“%s”失败:mmap() 失败:%s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "第%d行第%d个字符出错:%s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "第%d行出错:%s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr "发现空的实体“&;”。有效的实体为:&amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"字符“%s”出现在实体名的开头无效。实体都以 & 字符 开头,如果这个 & 不是一个实体"
+"的开头,把它变为 &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "字符“%s”在实体名中无效"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "未知的实体名“%s”"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"实体没有以分号结束。很可能您使用了 & 字符而又不是一个实体 - 将这个 & 变为 "
+"&amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr "分析“%-.*s”失败。它应该是字符引用中的数字(如&#234;) - 可能该数字太大了"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "字符引用“%-.*s”不是编码一个被允许的字符"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "空的字符引用;应该包括数字,如 &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"字符引用没有以分号结束。很可能您使用了 & 字符而又不是一个实体 - 将这个 & 变"
+"为 &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "未完成的实体引用"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "未完成的字符引用"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "无效的 UTF-8 编码文本"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "文档必须以一个元素开始(例如 <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr "“%s”出现在字符“<”后是无效字符;它不能作为元素名的开头"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr "字符“%s”无效,应该以字符“>”来结束元素“%s”的起始标记"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr "字符“%s”无效,在属性名“%s”(元素“%s”)的后应该是字符“=”"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"字符“%s”无效,应该以“>”或“/”结束元素“%s”的起始标记,或紧跟该元素的属性;可能"
+"您在属性名中使用了无效字符"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr "字符“%s”无效,在给属性“%s”(元素“%s”)赋值时,在等号后应该是引号"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr "“%s”出现在字符“</”后无效;“%s”不能作为元素名的开头"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr "“%s”出现在结束的元素名“%s”后无效;允许的字符是“>”"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "元素“%s”已经结束,没有未结束的元素"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "元素“%s”已经结束,当前未结束的元素是“%s”"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "文档为空或仅含空白字符"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "文档在一个打开的尖括号“<”后意外结束"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr "文档在还存在未结束元素时意外结束 - 最后的未结束元素是“%s”"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr "文档意外结束,应该以右尖括号“>”来结束标记 <%s/>"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "文档在元素名中意外结束"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "文档在属性名中意外结束"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "文档在元素起始标记中意外结束"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr "文档在跟在属性名后的等号后意外结束;没有属性值"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "文档在属性值中意外结束"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "文档在元素“%s”结束标记中意外结束"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "文档在注释或处理指令中意外结束"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "第%d行第%d个字符出错:%s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "未完成的实体引用"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "引用的文本没有以引号开头"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "命令行或其他shell引用文本中出现不匹配的引号"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "文本在一个“\\”字符后结束。(文本为“%s”)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "文本在找到与 %c 匹配的引号之前结束。(文本为“%s”)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "空文本(或仅含空白字符)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "从子进程中读取数据失败"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "创建与子进程通讯的管道失败(%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "从子管道中读取失败(%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "更改到目录“%s”失败(%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "执行子进程失败(%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "无效的程序名:%s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "%d 处的参数中有无效的字符串:%s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "环境中有无效的字符串:%s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "无效的工作目录:%s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "执行助手程序(%s)失败"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr "g_io_channel_win32_poll() 从子进程中读取数据时出现异常错误"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "从子进程中读取数据失败(%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "select() 在从子进程中读取数据时出现异常错误 (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "waitpid() 出现异常错误 (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "fork 失败(%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "执行子进程“%s”失败(%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "重定向子进程(%s)的输入或输出失败"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "fork 子进程失败 (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "执行子进程“%s”时出现未知错误"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "从子进程管道中读取足够的数据失败(%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "字符超出 UTF-8 范围"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "转换输入中出现无效序列"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "字符超出 UTF-16 范围"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "用法:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[选项...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "帮助选项:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "显示帮助选项"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "显示全部帮助选项"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "应用程序选项:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "无法处理 %2$s 所用的整数值“%1$s”"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "%2$s 所用的整数值“%1$s”超出范围"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "无法处理 %2$s 所用的双精度值“%1$s”"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "%2$s 所用的双精度值“%1$s”超出范围"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "分析选项出错:%s"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "缺少 %s 的参数"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "未知选项 %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "无法在数据目录中找到有效的键文件"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "不是普通文件"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "文件为空"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr "键文件中的行“%s”不是键-值对、组或注释"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "无效的组名:%s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "键文件不以组开始"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "无效的键名:%s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "键文件包含不支持的编码“%s”"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "键文件没有组“%s”"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "键文件没有键“%s”"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "键文件包含“%s”,其值“%s”不是 UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "键文件包含键“%s”,其值无法解释。"
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr "键文件在“%2$s”中包含“%1$s”,其值无法解释。"
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "键文件的组“%2$s”中不包含键“%1$s”"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "键文件在行尾含有转义字符"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "键文件中包含无效的转义序列“%s”"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "无法将值“%s”解释为数值。"
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "整数值“%s”超出范围"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "无法将值“%s”解释为浮点数。"
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "无法将值“%s”解释为布尔值。"
diff --git a/trunk/po/zh_HK.po b/trunk/po/zh_HK.po
new file mode 100644
index 000000000..277a9fb33
--- /dev/null
+++ b/trunk/po/zh_HK.po
@@ -0,0 +1,896 @@
+# Chinese (Hong Kong) translation for glib 2.x
+# Copyright (C) 2001, 02, 03, 05, 07 Free Software Foundation, Inc.
+# XML glossary from http://xml.ascc.net/zh/big5/gloss.html
+# Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>, 2005.
+# Abel Cheung <abel@oaka.org>, 2001-2003, 2005.
+# Woodman Tuen <wmtuen@gmail.com>, 2005-07.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib 2.12.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-02-28 02:10+0800\n"
+"Last-Translator: Woodman Tuen <wmtuen@gmail.com>\n"
+"Language-Team: Chinese (Hong Kong) <community@linuxhall.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "元素‘%2$s’中的不明屬性‘%1$s’"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "找不到元素‘%2$s’的屬性‘%1$s’"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "不明的標籤‘%s’,應為標籤‘%s’"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "‘%2$s’中有不明的標籤‘%1$s’"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "在資料目錄中找不到有效的書籤檔案"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "URI‘%s’的書籤已經存在"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "找不到 URI‘%s’的書籤"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "URI‘%s’的書籤中沒有定義 MIME 類型"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "URI‘%s’的書籤中沒有定義 private flag"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "URI‘%s’的書籤中並沒有設定羣組"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "沒有一個名為‘%s’的應用程式註冊一個書籤給‘%s’"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "以 URI‘%2$s’ 展開 exec 行‘%1$s’失敗"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "不支援將字符集‘%s’轉換成‘%s’"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "無法將‘%s’轉換至‘%s’"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "轉換輸入資料時遇到不正確的位元組組合"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "轉換時發生錯誤:%s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "輸入資料結束時字符仍未完整"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "無法將後備字串‘%s’的字符集轉換成‘%s’"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI‘%s’不是使用“file”格式的絕對 URI"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "本機檔案的 URI‘%s’不應含有‘#’"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI‘%s’無效"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "URI‘%s’中的主機名稱無效"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI‘%s’含有「不正確跳出」的字符"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "路徑名稱‘%s’不是絕對路徑"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "主機名稱無效"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "開啟目錄‘%s’時發生錯誤:%s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "無法配置 %lu 位元來讀取檔案“%s”"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "讀取檔案‘%s’時發生錯誤:%s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "讀取檔案‘%s’失敗:%s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "開啟檔案‘%s’失敗:%s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "獲取檔案‘%s’的屬性失敗:fstat() 失敗:%s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "開啟檔案‘%s’失敗:fdopen() 失敗:%s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "檔案名稱由‘%s’改為‘%s’失敗:g_rename() 失敗:%s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "建立檔案‘%s’失敗:%s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "開啟檔案‘%s’作寫入失敗:fdopen() 失敗:%s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "寫入檔案‘%s’失敗:fwrite() 失敗:%s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "關閉檔案‘%s’失敗:fclose() 失敗:%s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "現存檔案‘%s’無法移除:g_unlink() 失敗:%s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "樣式‘%s’無效,不應含有‘%s’"
+
+# (Abel) this is file template for mktemp/mkstemp
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "檔案樣式‘%s’沒有包含 XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "讀取符號連結‘%s’失敗:%s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "不支援符號連結"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "無法開啟將‘%s’轉換至‘%s’的轉換器:%s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "在 g_io_channel_read_line_string 中無法讀取原始資料"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "用來讀取資料的緩衝區中仍有未轉換的資料"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "在字符未完整之前,輸入管道已經結束"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "g_io_channel_read_to_end 中無法讀取原始資料"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "開啟檔案‘%s’失敗:open() 失敗:%s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "對應檔案‘%s’失敗:mmap() 失敗:%s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "第 %d 行第 %d 個字發生錯誤:%s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "第 %d 行發生錯誤:%s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr "出現空白的實體‘&;’;可用的實體為:&amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"實體名稱不應以‘%s’開始,應該使用 & 字符;如果這個 & 字符不是作為實體使用,請"
+"將 & 轉換為 &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "實體名稱中不應含有字符‘%s’"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "實體名稱‘%s’意義不明"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"實體的結束部分不是分號;很可能你想使用 & 字符但未將它變為實體 ─ 請將 & 轉換"
+"為 &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr "無法解析‘%-.*s’,字符參引內應該含有數字(例如 &#234;)─ 可能是數字太大"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "字符參引‘%-.*s’無法表示任何能接受的字符"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "字符參引是空白的;它應該包括數字,像 &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"字符參引的結束部分不是分號;很可能你想使用 & 字符但未將它變為實體 ─ 請將 & 轉"
+"換為 &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "未完成的實體參引"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "未完成的字符參引"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "無效的 UTF-8 編碼文字"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "文件開始必須為一元素(例如 <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr "‘<’字符後的‘%s’不是有效的字符;這樣不可能是元素名稱的開始部份"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr "字符‘%s’不尋常,元素‘%s’的開始標籤應該以‘>’字符結束"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr "不尋常的字符‘%s’,屬性名稱‘%s’(屬於元素‘%s’)後應該是‘=’字符"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"不尋常的字符‘%s’,元素‘%s’的開始標籤應該以‘>’或‘/’字符終結,也可以是屬性;或"
+"許你在屬性名稱中使用了無效的字符"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"不尋常的字符‘%s’,當指定屬性‘%s’的值(屬於元素‘%s’)時,等號後應該出現開引號"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr "‘</’字符後的‘%s’不是有效的字符;‘%s’不可能是元素名稱的開始部份"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr "字符‘%s’是無效的(位置在關閉元素‘%s’末端);允許的字符為「>」"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "元素‘%s’已關閉,沒有開啟中的元素"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "元素‘%s’已關閉,但開啟中的元素是‘%s’"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "文件完全空白或只含有空白字符"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "文件在尖角括號‘<’後突然終止"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr "在仍然有開啟中的元素時,文件突然結束 ─‘%s’是最後一個開啟的元素"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr "文件突然結束,本來應該出現用來關閉標籤 <%s/> 的尖角括號"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "在元素的名稱內,文件突然結束"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "在屬性名稱內,文件突然結束"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "在元素的開啟標籤內,文件突然結束"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr "在屬性名稱的等號後,文件突然結束;沒有屬性值"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "在屬性值內,文件突然結束"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "在元素‘%s’的關閉標籤內,文件突然結束"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "在註解或處理指示內,文件突然結束"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "第 %d 行第 %d 個字發生錯誤:%s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "未完成的實體參引"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "應該用引號括起來的文字不是以括號為開始"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "指令列或其它標為指令的字串內有不對稱的引號"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "文字在‘\\’字符後就終止了。(文字為‘%s’)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "字串完結前仍沒有對應於 %c 的引號(字串為‘%s’)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "文字是空白的(或只含有空白字符)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "無法從副進程讀取資料"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "無法建立管道來和副進程溝通 (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "無法從管道讀取資料 (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "無法進入目錄‘%s’(%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "無法執行副進程 (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "程式名稱無效:%s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "第 %d 個引數中含無效的字串:%s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "環境變數中的字串無效:%s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "無效的工作目錄:%s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "無法執行協助程式 (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr "當 g_io_channel_win32_poll() 從副進程讀取資料時發生無法預計的錯誤"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "無法從副進程讀取資料 (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "當 select() 從副進程讀取資料時發生無法預計的錯誤 (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "waitpid() 發生無法預計的錯誤 (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "無法衍生進程 (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "無法執行副進程“%s”(%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "無法將副進程的輸出或輸入重新導向 (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "無法衍生副進程 (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "執行副進程“%s”時發生不明的錯誤"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "無法從 child pid pipe 讀取足夠的資料 (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "字符不在 UTF-8 範圍之內"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "轉換輸入資料時出現無效的字符次序"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "字符不在 UTF-16 範圍之內"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "用法:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[選項...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "說明選項:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "顯示說明的選項"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "顯示所有的說明選項"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "應用程式選項:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "無法給 %2$s 解析整數值‘%1$s’"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "%2$s 的整數值‘%1$s’超出範圍"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "無法給 %2$s 解析雙精度浮點數‘%1$s’"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "%2$s 的雙精度浮點數‘%1$s’超出範圍"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "解析 %s 選項時發生錯誤"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "缺少 %s 的參數"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "未知的選項 %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "在資料目錄中找不到有效的設定鍵檔案"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "不是普通檔案"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "檔案是空白的"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr "設定鍵檔案中‘%s’行並非設定鍵值配對、羣組或註解"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "無效的羣組名稱:%s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "設定鍵檔案並非以羣組開頭"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "無效的設定鍵名稱:%s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "設定鍵檔案包含不支援的編碼‘%s’"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "設定鍵檔案沒有羣組‘%s’"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "設定鍵檔案沒有設定鍵‘%s’"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "設定鍵檔案包含的設定鍵‘%s’(數值為‘%s’)並非 UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "設定鍵檔案包含的設定鍵‘%s’的數值無法解譯。"
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr "設定鍵檔案包含的羣組‘%2$s’中設定鍵‘%1$s’數值無法解譯"
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "設定鍵檔案的羣組‘%2$s’中沒有設定鍵‘%1$s’"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "設定鍵檔案在行尾包含跳出字符"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "設定鍵檔案含有不正確的「跳出字符」‘%s’"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "數值‘%s’不能被解譯為數字。"
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "整數值‘%s’超出範圍"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "數值‘%s’不能被解譯為浮點數。"
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "數值‘%s’不能被解譯為邏輯值。"
diff --git a/trunk/po/zh_TW.po b/trunk/po/zh_TW.po
new file mode 100644
index 000000000..621ce83ab
--- /dev/null
+++ b/trunk/po/zh_TW.po
@@ -0,0 +1,896 @@
+# Chinese (Taiwan) translation for glib 2.x
+# Copyright (C) 2001, 02, 03, 05, 07 Free Software Foundation, Inc.
+# XML glossary from http://xml.ascc.net/zh/big5/gloss.html
+# Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>, 2005.
+# Abel Cheung <abel@oaka.org>, 2001-2003, 2005.
+# Woodman Tuen <wmtuen@gmail.com>, 2005-07.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: glib 2.12.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-06 00:23-0400\n"
+"PO-Revision-Date: 2007-02-27 09:08+0800\n"
+"Last-Translator: Woodman Tuen <wmtuen@gmail.com>\n"
+"Language-Team: Chinese (Taiwan) <community@linuxhall.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: glib/gbookmarkfile.c:705 glib/gbookmarkfile.c:782 glib/gbookmarkfile.c:861
+#: glib/gbookmarkfile.c:908
+#, c-format
+msgid "Unexpected attribute '%s' for element '%s'"
+msgstr "元素‘%2$s’中的不明屬性‘%1$s’"
+
+#: glib/gbookmarkfile.c:716 glib/gbookmarkfile.c:793 glib/gbookmarkfile.c:803
+#: glib/gbookmarkfile.c:919
+#, c-format
+msgid "Attribute '%s' of element '%s' not found"
+msgstr "找不到元素‘%2$s’的屬性‘%1$s’"
+
+#: glib/gbookmarkfile.c:1092 glib/gbookmarkfile.c:1157
+#: glib/gbookmarkfile.c:1221 glib/gbookmarkfile.c:1231
+#, c-format
+msgid "Unexpected tag '%s', tag '%s' expected"
+msgstr "不明的標籤‘%s’,應為標籤‘%s’"
+
+#: glib/gbookmarkfile.c:1117 glib/gbookmarkfile.c:1131
+#: glib/gbookmarkfile.c:1199 glib/gbookmarkfile.c:1251
+#, c-format
+msgid "Unexpected tag '%s' inside '%s'"
+msgstr "‘%2$s’中有不明的標籤‘%1$s’"
+
+#: glib/gbookmarkfile.c:1781
+#, c-format
+msgid "No valid bookmark file found in data dirs"
+msgstr "在資料目錄中找不到有效的書籤檔案"
+
+#: glib/gbookmarkfile.c:1982
+#, c-format
+msgid "A bookmark for URI '%s' already exists"
+msgstr "URI‘%s’的書籤已經存在"
+
+#: glib/gbookmarkfile.c:2028 glib/gbookmarkfile.c:2185
+#: glib/gbookmarkfile.c:2270 glib/gbookmarkfile.c:2350
+#: glib/gbookmarkfile.c:2435 glib/gbookmarkfile.c:2518
+#: glib/gbookmarkfile.c:2596 glib/gbookmarkfile.c:2675
+#: glib/gbookmarkfile.c:2717 glib/gbookmarkfile.c:2814
+#: glib/gbookmarkfile.c:2940 glib/gbookmarkfile.c:3130
+#: glib/gbookmarkfile.c:3206 glib/gbookmarkfile.c:3371
+#: glib/gbookmarkfile.c:3460 glib/gbookmarkfile.c:3550
+#: glib/gbookmarkfile.c:3677
+#, c-format
+msgid "No bookmark found for URI '%s'"
+msgstr "找不到 URI‘%s’的書籤"
+
+#: glib/gbookmarkfile.c:2359
+#, c-format
+msgid "No MIME type defined in the bookmark for URI '%s'"
+msgstr "URI‘%s’的書籤中沒有定義 MIME 類型"
+
+#: glib/gbookmarkfile.c:2444
+#, c-format
+msgid "No private flag has been defined in bookmark for URI '%s'"
+msgstr "URI‘%s’的書籤中沒有定義 private flag"
+
+#: glib/gbookmarkfile.c:2823
+#, c-format
+msgid "No groups set in bookmark for URI '%s'"
+msgstr "URI‘%s’的書籤中並沒有設定群組"
+
+#: glib/gbookmarkfile.c:3224 glib/gbookmarkfile.c:3381
+#, c-format
+msgid "No application with name '%s' registered a bookmark for '%s'"
+msgstr "沒有一個名為‘%s’的應用程式註冊一個書籤給‘%s’"
+
+#: glib/gbookmarkfile.c:3404
+#, c-format
+msgid "Failed to expand exec line '%s' with URI '%s'"
+msgstr "以 URI‘%2$s’ 展開 exec 行‘%1$s’失敗"
+
+#: glib/gconvert.c:424 glib/gconvert.c:502 glib/giochannel.c:1148
+#, c-format
+msgid "Conversion from character set '%s' to '%s' is not supported"
+msgstr "不支援將字元集‘%s’轉換成‘%s’"
+
+#: glib/gconvert.c:428 glib/gconvert.c:506
+#, c-format
+msgid "Could not open converter from '%s' to '%s'"
+msgstr "無法將‘%s’轉換至‘%s’"
+
+#: glib/gconvert.c:622 glib/gconvert.c:1011 glib/giochannel.c:1320
+#: glib/giochannel.c:1362 glib/giochannel.c:2204 glib/gutf8.c:950
+#: glib/gutf8.c:1399
+#, c-format
+msgid "Invalid byte sequence in conversion input"
+msgstr "轉換輸入資料時遇到不正確的位元組組合"
+
+#: glib/gconvert.c:628 glib/gconvert.c:938 glib/giochannel.c:1327
+#: glib/giochannel.c:2216
+#, c-format
+msgid "Error during conversion: %s"
+msgstr "轉換時發生錯誤:%s"
+
+#: glib/gconvert.c:663 glib/gutf8.c:946 glib/gutf8.c:1150 glib/gutf8.c:1291
+#: glib/gutf8.c:1395
+#, c-format
+msgid "Partial character sequence at end of input"
+msgstr "輸入資料結束時字元仍未完整"
+
+#: glib/gconvert.c:913
+#, c-format
+msgid "Cannot convert fallback '%s' to codeset '%s'"
+msgstr "無法將後備字串‘%s’的字元集轉換成‘%s’"
+
+#: glib/gconvert.c:1727
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the \"file\" scheme"
+msgstr "URI‘%s’不是使用“file”格式的絕對 URI"
+
+#: glib/gconvert.c:1737
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "本機檔案的 URI‘%s’不應含有‘#’"
+
+#: glib/gconvert.c:1754
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI‘%s’無效"
+
+#: glib/gconvert.c:1766
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "URI‘%s’中的主機名稱無效"
+
+#: glib/gconvert.c:1782
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI‘%s’含有「不正確跳出」的字元"
+
+#: glib/gconvert.c:1877
+#, c-format
+msgid "The pathname '%s' is not an absolute path"
+msgstr "路徑名稱‘%s’不是絕對路徑"
+
+#: glib/gconvert.c:1887
+#, c-format
+msgid "Invalid hostname"
+msgstr "主機名稱無效"
+
+#: glib/gdir.c:104 glib/gdir.c:124
+#, c-format
+msgid "Error opening directory '%s': %s"
+msgstr "開啟目錄‘%s’時發生錯誤:%s"
+
+#: glib/gfileutils.c:557 glib/gfileutils.c:630
+#, c-format
+msgid "Could not allocate %lu bytes to read file \"%s\""
+msgstr "無法配置 %lu 位元來讀取檔案“%s”"
+
+#: glib/gfileutils.c:572
+#, c-format
+msgid "Error reading file '%s': %s"
+msgstr "讀取檔案‘%s’時發生錯誤:%s"
+
+#: glib/gfileutils.c:654
+#, c-format
+msgid "Failed to read from file '%s': %s"
+msgstr "讀取檔案‘%s’失敗:%s"
+
+#: glib/gfileutils.c:705 glib/gfileutils.c:792
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr "開啟檔案‘%s’失敗:%s"
+
+#: glib/gfileutils.c:722 glib/gmappedfile.c:133
+#, c-format
+msgid "Failed to get attributes of file '%s': fstat() failed: %s"
+msgstr "獲取檔案‘%s’的屬性失敗:fstat() 失敗:%s"
+
+#: glib/gfileutils.c:756
+#, c-format
+msgid "Failed to open file '%s': fdopen() failed: %s"
+msgstr "開啟檔案‘%s’失敗:fdopen() 失敗:%s"
+
+#: glib/gfileutils.c:890
+#, c-format
+msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
+msgstr "檔案名稱由‘%s’改為‘%s’失敗:g_rename() 失敗:%s"
+
+#: glib/gfileutils.c:931 glib/gfileutils.c:1389
+#, c-format
+msgid "Failed to create file '%s': %s"
+msgstr "建立檔案‘%s’失敗:%s"
+
+#: glib/gfileutils.c:945
+#, c-format
+msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
+msgstr "開啟檔案‘%s’作寫入失敗:fdopen() 失敗:%s"
+
+#: glib/gfileutils.c:970
+#, c-format
+msgid "Failed to write file '%s': fwrite() failed: %s"
+msgstr "寫入檔案‘%s’失敗:fwrite() 失敗:%s"
+
+#: glib/gfileutils.c:989
+#, c-format
+msgid "Failed to close file '%s': fclose() failed: %s"
+msgstr "關閉檔案‘%s’失敗:fclose() 失敗:%s"
+
+#: glib/gfileutils.c:1107
+#, c-format
+msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
+msgstr "現存檔案‘%s’無法移除:g_unlink() 失敗:%s"
+
+#: glib/gfileutils.c:1351
+#, c-format
+msgid "Template '%s' invalid, should not contain a '%s'"
+msgstr "樣式‘%s’無效,不應含有‘%s’"
+
+# (Abel) this is file template for mktemp/mkstemp
+#: glib/gfileutils.c:1364
+#, c-format
+msgid "Template '%s' doesn't contain XXXXXX"
+msgstr "檔案樣式‘%s’沒有包含 XXXXXX"
+
+#: glib/gfileutils.c:1839
+#, c-format
+msgid "Failed to read the symbolic link '%s': %s"
+msgstr "讀取符號連結‘%s’失敗:%s"
+
+#: glib/gfileutils.c:1860
+#, c-format
+msgid "Symbolic links not supported"
+msgstr "不支援符號連結"
+
+#: glib/giochannel.c:1152
+#, c-format
+msgid "Could not open converter from '%s' to '%s': %s"
+msgstr "無法開啟將‘%s’轉換至‘%s’的轉換器:%s"
+
+#: glib/giochannel.c:1497
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_line_string"
+msgstr "在 g_io_channel_read_line_string 中無法讀取原始資料"
+
+#: glib/giochannel.c:1544 glib/giochannel.c:1801 glib/giochannel.c:1887
+#, c-format
+msgid "Leftover unconverted data in read buffer"
+msgstr "用來讀取資料的緩衝區中仍有未轉換的資料"
+
+#: glib/giochannel.c:1624 glib/giochannel.c:1701
+#, c-format
+msgid "Channel terminates in a partial character"
+msgstr "在字元未完整之前,輸入管道已經結束"
+
+#: glib/giochannel.c:1687
+#, c-format
+msgid "Can't do a raw read in g_io_channel_read_to_end"
+msgstr "g_io_channel_read_to_end 中無法讀取原始資料"
+
+#: glib/gmappedfile.c:116
+#, c-format
+msgid "Failed to open file '%s': open() failed: %s"
+msgstr "開啟檔案‘%s’失敗:open() 失敗:%s"
+
+#: glib/gmappedfile.c:193
+#, c-format
+msgid "Failed to map file '%s': mmap() failed: %s"
+msgstr "對應檔案‘%s’失敗:mmap() 失敗:%s"
+
+#: glib/gmarkup.c:226
+#, c-format
+msgid "Error on line %d char %d: %s"
+msgstr "第 %d 行第 %d 個字發生錯誤:%s"
+
+#: glib/gmarkup.c:324
+#, c-format
+msgid "Error on line %d: %s"
+msgstr "第 %d 行發生錯誤:%s"
+
+#: glib/gmarkup.c:428
+msgid ""
+"Empty entity '&;' seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
+msgstr "出現空白的實體‘&;’;可用的實體為:&amp; &quot; &lt; &gt; &apos;"
+
+#: glib/gmarkup.c:438
+#, c-format
+msgid ""
+"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 &amp;"
+msgstr ""
+"實體名稱不應以‘%s’開始,應該使用 & 字元;如果這個 & 字元不是作為實體使用,請"
+"將 & 轉換為 &amp;"
+
+#: glib/gmarkup.c:472
+#, c-format
+msgid "Character '%s' is not valid inside an entity name"
+msgstr "實體名稱中不應含有字元‘%s’"
+
+#: glib/gmarkup.c:509
+#, c-format
+msgid "Entity name '%s' is not known"
+msgstr "實體名稱‘%s’意義不明"
+
+#: glib/gmarkup.c:520
+msgid ""
+"Entity did not end with a semicolon; most likely you used an ampersand "
+"character without intending to start an entity - escape ampersand as &amp;"
+msgstr ""
+"實體的結束部分不是分號;很可能您想使用 & 字元但未將它變為實體 ─ 請將 & 轉換"
+"為 &amp;"
+
+#: glib/gmarkup.c:573
+#, c-format
+msgid ""
+"Failed to parse '%-.*s', which should have been a digit inside a character "
+"reference (&#234; for example) - perhaps the digit is too large"
+msgstr "無法解析‘%-.*s’,字元參引內應該含有數字(例如 &#234;)─ 可能是數字太大"
+
+#: glib/gmarkup.c:598
+#, c-format
+msgid "Character reference '%-.*s' does not encode a permitted character"
+msgstr "字元參引‘%-.*s’無法表示任何能接受的字元"
+
+#: glib/gmarkup.c:613
+msgid "Empty character reference; should include a digit such as &#454;"
+msgstr "字元參引是空白的;它應該包括數字,像 &#454;"
+
+#: glib/gmarkup.c:623
+msgid ""
+"Character reference did not end with a semicolon; most likely you used an "
+"ampersand character without intending to start an entity - escape ampersand "
+"as &amp;"
+msgstr ""
+"字元參引的結束部分不是分號;很可能您想使用 & 字元但未將它變為實體 ─ 請將 & 轉"
+"換為 &amp;"
+
+#: glib/gmarkup.c:709
+msgid "Unfinished entity reference"
+msgstr "未完成的實體參引"
+
+#: glib/gmarkup.c:715
+msgid "Unfinished character reference"
+msgstr "未完成的字元參引"
+
+#: glib/gmarkup.c:958 glib/gmarkup.c:986 glib/gmarkup.c:1022
+msgid "Invalid UTF-8 encoded text"
+msgstr "無效的 UTF-8 編碼文字"
+
+#: glib/gmarkup.c:1058
+msgid "Document must begin with an element (e.g. <book>)"
+msgstr "文件開始必須為一元素(例如 <book>)"
+
+#: glib/gmarkup.c:1098
+#, c-format
+msgid ""
+"'%s' is not a valid character following a '<' character; it may not begin an "
+"element name"
+msgstr "‘<’字元後的‘%s’不是有效的字元;這樣不可能是元素名稱的開始部份"
+
+#: glib/gmarkup.c:1162
+#, c-format
+msgid ""
+"Odd character '%s', expected a '>' character to end the start tag of element "
+"'%s'"
+msgstr "字元‘%s’不尋常,元素‘%s’的開始標籤應該以‘>’字元結束"
+
+#: glib/gmarkup.c:1251
+#, c-format
+msgid ""
+"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'"
+msgstr "不尋常的字元‘%s’,屬性名稱‘%s’(屬於元素‘%s’)後應該是‘=’字元"
+
+#: glib/gmarkup.c:1293
+#, c-format
+msgid ""
+"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"
+msgstr ""
+"不尋常的字元‘%s’,元素‘%s’的開始標籤應該以‘>’或‘/’字元終結,也可以是屬性;或"
+"許您在屬性名稱中使用了無效的字元"
+
+#: glib/gmarkup.c:1382
+#, c-format
+msgid ""
+"Odd character '%s', expected an open quote mark after the equals sign when "
+"giving value for attribute '%s' of element '%s'"
+msgstr ""
+"不尋常的字元‘%s’,當指定屬性‘%s’的值(屬於元素‘%s’)時,等號後應該出現開引號"
+
+#: glib/gmarkup.c:1527
+#, c-format
+msgid ""
+"'%s' is not a valid character following the characters '</'; '%s' may not "
+"begin an element name"
+msgstr "‘</’字元後的‘%s’不是有效的字元;‘%s’不可能是元素名稱的開始部份"
+
+#: glib/gmarkup.c:1567
+#, c-format
+msgid ""
+"'%s' is not a valid character following the close element name '%s'; the "
+"allowed character is '>'"
+msgstr "字元‘%s’是無效的(位置在關閉元素‘%s’末端);允許的字元為「>」"
+
+#: glib/gmarkup.c:1578
+#, c-format
+msgid "Element '%s' was closed, no element is currently open"
+msgstr "元素‘%s’已關閉,沒有開啟中的元素"
+
+#: glib/gmarkup.c:1587
+#, c-format
+msgid "Element '%s' was closed, but the currently open element is '%s'"
+msgstr "元素‘%s’已關閉,但開啟中的元素是‘%s’"
+
+#: glib/gmarkup.c:1753
+msgid "Document was empty or contained only whitespace"
+msgstr "文件完全空白或只含有空白字元"
+
+#: glib/gmarkup.c:1767
+msgid "Document ended unexpectedly just after an open angle bracket '<'"
+msgstr "文件在尖角括號‘<’後突然終止"
+
+#: glib/gmarkup.c:1775 glib/gmarkup.c:1819
+#, c-format
+msgid ""
+"Document ended unexpectedly with elements still open - '%s' was the last "
+"element opened"
+msgstr "在仍然有開啟中的元素時,文件突然結束 ─‘%s’是最後一個開啟的元素"
+
+#: glib/gmarkup.c:1783
+#, c-format
+msgid ""
+"Document ended unexpectedly, expected to see a close angle bracket ending "
+"the tag <%s/>"
+msgstr "文件突然結束,本來應該出現用來關閉標籤 <%s/> 的尖角括號"
+
+#: glib/gmarkup.c:1789
+msgid "Document ended unexpectedly inside an element name"
+msgstr "在元素的名稱內,文件突然結束"
+
+#: glib/gmarkup.c:1794
+msgid "Document ended unexpectedly inside an attribute name"
+msgstr "在屬性名稱內,文件突然結束"
+
+#: glib/gmarkup.c:1799
+msgid "Document ended unexpectedly inside an element-opening tag."
+msgstr "在元素的開啟標籤內,文件突然結束"
+
+#: glib/gmarkup.c:1805
+msgid ""
+"Document ended unexpectedly after the equals sign following an attribute "
+"name; no attribute value"
+msgstr "在屬性名稱的等號後,文件突然結束;沒有屬性值"
+
+#: glib/gmarkup.c:1812
+msgid "Document ended unexpectedly while inside an attribute value"
+msgstr "在屬性值內,文件突然結束"
+
+#: glib/gmarkup.c:1827
+#, c-format
+msgid "Document ended unexpectedly inside the close tag for element '%s'"
+msgstr "在元素‘%s’的關閉標籤內,文件突然結束"
+
+#: glib/gmarkup.c:1833
+msgid "Document ended unexpectedly inside a comment or processing instruction"
+msgstr "在註解或處理指示內,文件突然結束"
+
+#: glib/gregex.c:126
+msgid "corrupted object"
+msgstr ""
+
+#: glib/gregex.c:128
+msgid "internal error or corrupted object"
+msgstr ""
+
+#: glib/gregex.c:130
+msgid "out of memory"
+msgstr ""
+
+#: glib/gregex.c:135
+msgid "backtracking limit reached"
+msgstr ""
+
+#: glib/gregex.c:147 glib/gregex.c:155
+msgid "the pattern contains items not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:149
+msgid "internal error"
+msgstr ""
+
+#: glib/gregex.c:157
+msgid "back references as conditions are not supported for partial matching"
+msgstr ""
+
+#: glib/gregex.c:166
+msgid "recursion limit reached"
+msgstr ""
+
+#: glib/gregex.c:168
+msgid "workspace limit for empty substrings reached"
+msgstr ""
+
+#: glib/gregex.c:170
+msgid "invalid combination of newline flags"
+msgstr ""
+
+#: glib/gregex.c:174
+msgid "unknown error"
+msgstr ""
+
+#: glib/gregex.c:315 glib/gregex.c:1343
+#, c-format
+msgid "Error while matching regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:874
+msgid "PCRE library is compiled without UTF8 support"
+msgstr ""
+
+#: glib/gregex.c:883
+msgid "PCRE library is compiled without UTF8 properties support"
+msgstr ""
+
+#: glib/gregex.c:928
+#, fuzzy, c-format
+msgid "Error while compiling regular expression %s at char %d: %s"
+msgstr "第 %d 行第 %d 個字發生錯誤:%s"
+
+#: glib/gregex.c:950
+#, c-format
+msgid "Error while optimizing regular expression %s: %s"
+msgstr ""
+
+#: glib/gregex.c:1769
+msgid "hexadecimal digit or '}' expected"
+msgstr ""
+
+#: glib/gregex.c:1785
+msgid "hexadecimal digit expected"
+msgstr ""
+
+#: glib/gregex.c:1825
+msgid "missing '<' in symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1834
+#, fuzzy
+msgid "unfinished symbolic reference"
+msgstr "未完成的實體參引"
+
+#: glib/gregex.c:1841
+msgid "zero-length symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1852
+msgid "digit expected"
+msgstr ""
+
+#: glib/gregex.c:1870
+msgid "illegal symbolic reference"
+msgstr ""
+
+#: glib/gregex.c:1932
+msgid "stray final '\\'"
+msgstr ""
+
+#: glib/gregex.c:1936
+msgid "unknown escape sequence"
+msgstr ""
+
+#: glib/gregex.c:1946
+#, c-format
+msgid "Error while parsing replacement text \"%s\" at char %lu: %s"
+msgstr ""
+
+#: glib/gshell.c:70
+#, c-format
+msgid "Quoted text doesn't begin with a quotation mark"
+msgstr "應該用引號括起來的文字不是以括號為開始"
+
+#: glib/gshell.c:160
+#, c-format
+msgid "Unmatched quotation mark in command line or other shell-quoted text"
+msgstr "指令列或其它標為指令的字串內有不對稱的引號"
+
+#: glib/gshell.c:538
+#, c-format
+msgid "Text ended just after a '\\' character. (The text was '%s')"
+msgstr "文字在‘\\’字元後就終止了。(文字為‘%s’)"
+
+#: glib/gshell.c:545
+#, c-format
+msgid "Text ended before matching quote was found for %c. (The text was '%s')"
+msgstr "字串完結前仍沒有對應於 %c 的引號(字串為‘%s’)"
+
+#: glib/gshell.c:557
+#, c-format
+msgid "Text was empty (or contained only whitespace)"
+msgstr "文字是空白的(或只含有空白字元)"
+
+#: glib/gspawn-win32.c:272
+#, c-format
+msgid "Failed to read data from child process"
+msgstr "無法從副進程讀取資料"
+
+#: glib/gspawn-win32.c:287 glib/gspawn.c:1395
+#, c-format
+msgid "Failed to create pipe for communicating with child process (%s)"
+msgstr "無法建立管道來和副進程溝通 (%s)"
+
+#: glib/gspawn-win32.c:325 glib/gspawn.c:1059
+#, c-format
+msgid "Failed to read from child pipe (%s)"
+msgstr "無法從管道讀取資料 (%s)"
+
+#: glib/gspawn-win32.c:351 glib/gspawn.c:1264
+#, c-format
+msgid "Failed to change to directory '%s' (%s)"
+msgstr "無法進入目錄‘%s’(%s)"
+
+#: glib/gspawn-win32.c:357 glib/gspawn-win32.c:481
+#, c-format
+msgid "Failed to execute child process (%s)"
+msgstr "無法執行副進程 (%s)"
+
+#: glib/gspawn-win32.c:428
+#, c-format
+msgid "Invalid program name: %s"
+msgstr "程式名稱無效:%s"
+
+#: glib/gspawn-win32.c:438 glib/gspawn-win32.c:678 glib/gspawn-win32.c:1218
+#, c-format
+msgid "Invalid string in argument vector at %d: %s"
+msgstr "第 %d 個引數中含無效的字串:%s"
+
+#: glib/gspawn-win32.c:449 glib/gspawn-win32.c:692 glib/gspawn-win32.c:1251
+#, c-format
+msgid "Invalid string in environment: %s"
+msgstr "環境變數中的字串無效:%s"
+
+#: glib/gspawn-win32.c:674 glib/gspawn-win32.c:1199
+#, c-format
+msgid "Invalid working directory: %s"
+msgstr "無效的工作目錄:%s"
+
+#: glib/gspawn-win32.c:738
+#, c-format
+msgid "Failed to execute helper program (%s)"
+msgstr "無法執行協助程式 (%s)"
+
+#: glib/gspawn-win32.c:938
+#, c-format
+msgid ""
+"Unexpected error in g_io_channel_win32_poll() reading data from a child "
+"process"
+msgstr "當 g_io_channel_win32_poll() 從副進程讀取資料時發生無法預計的錯誤"
+
+#: glib/gspawn.c:175
+#, c-format
+msgid "Failed to read data from child process (%s)"
+msgstr "無法從副進程讀取資料 (%s)"
+
+#: glib/gspawn.c:307
+#, c-format
+msgid "Unexpected error in select() reading data from a child process (%s)"
+msgstr "當 select() 從副進程讀取資料時發生無法預計的錯誤 (%s)"
+
+#: glib/gspawn.c:390
+#, c-format
+msgid "Unexpected error in waitpid() (%s)"
+msgstr "waitpid() 發生無法預計的錯誤 (%s)"
+
+#: glib/gspawn.c:1124
+#, c-format
+msgid "Failed to fork (%s)"
+msgstr "無法衍生進程 (%s)"
+
+#: glib/gspawn.c:1274
+#, c-format
+msgid "Failed to execute child process \"%s\" (%s)"
+msgstr "無法執行副進程“%s”(%s)"
+
+#: glib/gspawn.c:1284
+#, c-format
+msgid "Failed to redirect output or input of child process (%s)"
+msgstr "無法將副進程的輸出或輸入重新導向 (%s)"
+
+#: glib/gspawn.c:1293
+#, c-format
+msgid "Failed to fork child process (%s)"
+msgstr "無法衍生副進程 (%s)"
+
+#: glib/gspawn.c:1301
+#, c-format
+msgid "Unknown error executing child process \"%s\""
+msgstr "執行副進程“%s”時發生不明的錯誤"
+
+#: glib/gspawn.c:1323
+#, c-format
+msgid "Failed to read enough data from child pid pipe (%s)"
+msgstr "無法從 child pid pipe 讀取足夠的資料 (%s)"
+
+#: glib/gutf8.c:1024
+#, c-format
+msgid "Character out of range for UTF-8"
+msgstr "字元不在 UTF-8 範圍之內"
+
+#: glib/gutf8.c:1118 glib/gutf8.c:1127 glib/gutf8.c:1259 glib/gutf8.c:1268
+#: glib/gutf8.c:1409 glib/gutf8.c:1505
+#, c-format
+msgid "Invalid sequence in conversion input"
+msgstr "轉換輸入資料時出現無效的字元次序"
+
+#: glib/gutf8.c:1420 glib/gutf8.c:1516
+#, c-format
+msgid "Character out of range for UTF-16"
+msgstr "字元不在 UTF-16 範圍之內"
+
+#: glib/goption.c:572
+msgid "Usage:"
+msgstr "用法:"
+
+#: glib/goption.c:572
+msgid "[OPTION...]"
+msgstr "[選項...]"
+
+#: glib/goption.c:676
+msgid "Help Options:"
+msgstr "說明選項:"
+
+#: glib/goption.c:677
+msgid "Show help options"
+msgstr "顯示說明的選項"
+
+#: glib/goption.c:683
+msgid "Show all help options"
+msgstr "顯示所有的說明選項"
+
+#: glib/goption.c:735
+msgid "Application Options:"
+msgstr "應用程式選項:"
+
+#: glib/goption.c:796 glib/goption.c:866
+#, c-format
+msgid "Cannot parse integer value '%s' for %s"
+msgstr "無法給 %2$s 解析整數值‘%1$s’"
+
+#: glib/goption.c:806 glib/goption.c:874
+#, c-format
+msgid "Integer value '%s' for %s out of range"
+msgstr "%2$s 的整數值‘%1$s’超出範圍"
+
+#: glib/goption.c:831
+#, c-format
+msgid "Cannot parse double value '%s' for %s"
+msgstr "無法給 %2$s 解析雙精度浮點數‘%1$s’"
+
+#: glib/goption.c:839
+#, c-format
+msgid "Double value '%s' for %s out of range"
+msgstr "%2$s 的雙精度浮點數‘%1$s’超出範圍"
+
+#: glib/goption.c:1176
+#, c-format
+msgid "Error parsing option %s"
+msgstr "解析 %s 選項時發生錯誤"
+
+#: glib/goption.c:1207 glib/goption.c:1318
+#, c-format
+msgid "Missing argument for %s"
+msgstr "缺少 %s 的參數"
+
+#: glib/goption.c:1713
+#, c-format
+msgid "Unknown option %s"
+msgstr "未知的選項 %s"
+
+#: glib/gkeyfile.c:341
+#, fuzzy, c-format
+msgid "Valid key file could not be found in search dirs"
+msgstr "在資料目錄中找不到有效的設定鍵檔案"
+
+#: glib/gkeyfile.c:376
+#, c-format
+msgid "Not a regular file"
+msgstr "不是普通檔案"
+
+#: glib/gkeyfile.c:384
+#, c-format
+msgid "File is empty"
+msgstr "檔案是空白的"
+
+#: glib/gkeyfile.c:746
+#, c-format
+msgid ""
+"Key file contains line '%s' which is not a key-value pair, group, or comment"
+msgstr "設定鍵檔案中‘%s’行並非設定鍵值配對、群組或註解"
+
+#: glib/gkeyfile.c:806
+#, c-format
+msgid "Invalid group name: %s"
+msgstr "無效的群組名稱:%s"
+
+#: glib/gkeyfile.c:828
+#, c-format
+msgid "Key file does not start with a group"
+msgstr "設定鍵檔案並非以群組開頭"
+
+#: glib/gkeyfile.c:854
+#, c-format
+msgid "Invalid key name: %s"
+msgstr "無效的設定鍵名稱:%s"
+
+#: glib/gkeyfile.c:881
+#, c-format
+msgid "Key file contains unsupported encoding '%s'"
+msgstr "設定鍵檔案包含不支援的編碼‘%s’"
+
+#: glib/gkeyfile.c:1094 glib/gkeyfile.c:1253 glib/gkeyfile.c:2455
+#: glib/gkeyfile.c:2521 glib/gkeyfile.c:2640 glib/gkeyfile.c:2775
+#: glib/gkeyfile.c:2928 glib/gkeyfile.c:3108 glib/gkeyfile.c:3165
+#, c-format
+msgid "Key file does not have group '%s'"
+msgstr "設定鍵檔案沒有群組‘%s’"
+
+#: glib/gkeyfile.c:1265
+#, c-format
+msgid "Key file does not have key '%s'"
+msgstr "設定鍵檔案沒有設定鍵‘%s’"
+
+#: glib/gkeyfile.c:1367 glib/gkeyfile.c:1477
+#, c-format
+msgid "Key file contains key '%s' with value '%s' which is not UTF-8"
+msgstr "設定鍵檔案包含的設定鍵‘%s’(數值為‘%s’)並非 UTF-8"
+
+#: glib/gkeyfile.c:1387 glib/gkeyfile.c:1497 glib/gkeyfile.c:1866
+#, c-format
+msgid "Key file contains key '%s' which has value that cannot be interpreted."
+msgstr "設定鍵檔案包含的設定鍵‘%s’的數值無法解譯。"
+
+#: glib/gkeyfile.c:2078 glib/gkeyfile.c:2287
+#, c-format
+msgid ""
+"Key file contains key '%s' in group '%s' which has value that cannot be "
+"interpreted."
+msgstr "設定鍵檔案包含的群組‘%2$s’中設定鍵‘%1$s’數值無法解譯"
+
+#: glib/gkeyfile.c:2470 glib/gkeyfile.c:2655 glib/gkeyfile.c:3176
+#, c-format
+msgid "Key file does not have key '%s' in group '%s'"
+msgstr "設定鍵檔案的群組‘%2$s’中沒有設定鍵‘%1$s’"
+
+#: glib/gkeyfile.c:3415
+#, c-format
+msgid "Key file contains escape character at end of line"
+msgstr "設定鍵檔案在行尾包含跳出字元"
+
+#: glib/gkeyfile.c:3437
+#, c-format
+msgid "Key file contains invalid escape sequence '%s'"
+msgstr "設定鍵檔案含有不正確的「跳出字元」‘%s’"
+
+#: glib/gkeyfile.c:3579
+#, c-format
+msgid "Value '%s' cannot be interpreted as a number."
+msgstr "數值‘%s’不能被解譯為數字。"
+
+#: glib/gkeyfile.c:3593
+#, c-format
+msgid "Integer value '%s' out of range"
+msgstr "整數值‘%s’超出範圍"
+
+#: glib/gkeyfile.c:3626
+#, c-format
+msgid "Value '%s' cannot be interpreted as a float number."
+msgstr "數值‘%s’不能被解譯為浮點數。"
+
+#: glib/gkeyfile.c:3650
+#, c-format
+msgid "Value '%s' cannot be interpreted as a boolean."
+msgstr "數值‘%s’不能被解譯為邏輯值。"
diff --git a/trunk/sanity_check b/trunk/sanity_check
new file mode 100755
index 000000000..5f6e66e20
--- /dev/null
+++ b/trunk/sanity_check
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+VERSION=$1
+
+if [ ! -f glib-$VERSION.tar.gz ]; then
+ echo "ERROR: glib-$VERSION.tar.gz does not exist..."
+ exit 1
+fi
+
+echo ""
+
+echo "Checking glib-$VERSION.tar.gz..."
+tar xfz glib-$VERSION.tar.gz
+
+
+for file in INSTALL NEWS README
+do
+ echo -n "$file... "
+ if [ "x`grep $VERSION glib-$VERSION/$file | wc -l | awk -F' ' '{print $1}'`" = "x0" ]; then
+ echo "failed."
+ #exit 1
+ else
+ echo "ok"
+ fi
+done
+
+echo -n "INSTALL..."
+if [ "x`grep $VERSION glib-$VERSION/INSTALL | wc -l | awk -F' ' '{print $1}'`" = "x2" ]; then
+ echo "ok"
+else
+ echo "failed."
+ exit 1
+fi
+
+echo ""
+echo "Number of lines in created documentation files:"
+
+wc -l glib-$VERSION/docs/reference/*/html/*.html | grep total
+
+rm -rf glib-$VERSION
diff --git a/trunk/tests/Makefile.am b/trunk/tests/Makefile.am
new file mode 100644
index 000000000..f4ab9b398
--- /dev/null
+++ b/trunk/tests/Makefile.am
@@ -0,0 +1,228 @@
+SUBDIRS=gobject refcount
+
+if ENABLE_REGEX
+enable_regex = -DENABLE_REGEX
+else
+enable_regex =
+endif
+
+INCLUDES = -g -I$(top_srcdir) -I$(top_srcdir)/glib -I$(top_srcdir)/gmodule $(GLIB_DEBUG_FLAGS) $(enable_regex)
+
+EFENCE=
+
+libglib = $(top_builddir)/glib/libglib-2.0.la
+libgthread = $(top_builddir)/gthread/libgthread-2.0.la
+libgmodule = $(top_builddir)/gmodule/libgmodule-2.0.la
+libgobject = $(top_builddir)/gobject/libgobject-2.0.la
+
+libadd_libgmodule = $(libgmodule)
+libadd_libglib = $(libglib)
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+
+module_test_exp = module-test.exp
+
+module-test.exp: module-test.o
+ dlltool --output-exp module-test.exp module-test.o
+
+spawn_test_win32_gui = spawn-test-win32-gui
+
+spawn_test_win32_gui_LDFLAGS = -mwindows
+
+endif
+
+EXTRA_DIST = \
+ $(test_scripts) \
+ makefile.msc.in \
+ casefold.txt \
+ casemap.txt \
+ gen-casefold-txt.pl \
+ gen-casemap-txt.pl \
+ iochannel-test-infile \
+ utf8.txt \
+ timeloop-basic.c
+
+BUILT_EXTRA_DIST = \
+ makefile.msc
+
+if HAVE_CXX
+CXX_TEST = cxx-test
+cxx_test_LDADD = $(progs_ldadd)
+cxx_test_SOURCES = cxx-test.C
+else
+CXX_TEST =
+endif
+
+if ENABLE_TIMELOOP
+timeloop = timeloop timeloop-closure
+endif
+noinst_PROGRAMS = testglib testgdate testgdateparser unicode-normalize unicode-collate $(timeloop) errorcheck-mutex-test
+testglib_LDADD = $(libglib)
+patterntest_LDADD = $(libglib)
+testgdate_LDADD = $(libglib)
+testgdateparser_LDADD = $(libglib)
+unicode_normalize_LDADD = $(libglib)
+errorcheck_mutex_test_LDADD = $(libglib) $(libgthread) $(G_THREAD_LIBS)
+if ENABLE_TIMELOOP
+timeloop_LDADD = $(libglib)
+timeloop_closure_LDADD = $(libglib) $(libgobject)
+endif
+
+test_programs = \
+ atomic-test \
+ array-test \
+ base64-test \
+ bit-test \
+ $(CXX_TEST) \
+ child-test \
+ completion-test \
+ convert-test \
+ date-test \
+ dirname-test \
+ file-test \
+ env-test \
+ gio-test \
+ hash-test \
+ iochannel-test \
+ keyfile-test \
+ list-test \
+ mainloop-test \
+ mapping-test \
+ markup-escape-test \
+ module-test \
+ node-test \
+ option-test \
+ patterntest \
+ printf-test \
+ queue-test \
+ asyncqueue-test \
+ qsort-test \
+ rand-test \
+ relation-test \
+ sequence-test \
+ shell-test \
+ slist-test \
+ slice-test \
+ slice-color \
+ spawn-test \
+ $(spawn_test_win32_gui) \
+ strfunc-test \
+ string-test \
+ strtod-test \
+ strtoll-test \
+ thread-test \
+ threadpool-test \
+ tree-test \
+ type-test \
+ unicode-caseconv \
+ unicode-encoding \
+ utf8-validate \
+ utf8-pointer \
+ uri-test \
+ regex-test
+
+test_scripts = run-markup-tests.sh run-collate-tests.sh run-bookmark-test.sh
+
+test_script_support_programs = markup-test unicode-collate bookmarkfile-test
+
+check_PROGRAMS = $(test_programs) $(test_script_support_programs)
+
+TESTS = $(test_programs) $(test_scripts)
+TESTS_ENVIRONMENT = srcdir=$(srcdir) \
+ LIBCHARSET_ALIAS_DIR=$(top_builddir)/glib/libcharset \
+ MALLOC_CHECK_=2 \
+ MALLOC_PERTURB_=$$(($${RANDOM:-256} % 256))
+
+progs_ldadd = $(EFENCE) $(libglib) $(EFENCE)
+thread_ldadd = $(libgthread) $(G_THREAD_LIBS) $(progs_ldadd)
+module_ldadd = $(libgmodule) $(G_MODULE_LIBS) $(progs_ldadd)
+
+atomic_test_LDADD = $(progs_ldadd)
+array_test_LDADD = $(progs_ldadd)
+base64_test_LDADD = $(progs_ldadd)
+bit_test_LDADD = $(progs_ldadd)
+bookmarkfile_test_LDADD = $(progs_ldadd)
+child_test_LDADD = $(thread_ldadd)
+completion_test_LDADD = $(progs_ldadd)
+convert_test_LDADD = $(progs_ldadd)
+date_test_LDADD = $(progs_ldadd)
+dirname_test_LDADD = $(progs_ldadd)
+file_test_LDADD = $(progs_ldadd)
+env_test_LDADD = $(progs_ldadd)
+gio_test_LDADD = $(progs_ldadd)
+hash_test_LDADD = $(progs_ldadd)
+iochannel_test_LDADD = $(progs_ldadd)
+keyfile_test_LDADD = $(progs_ldadd)
+list_test_LDADD = $(progs_ldadd)
+mainloop_test_LDADD = $(thread_ldadd)
+markup_test_LDADD = $(progs_ldadd)
+mapping_test_LDADD = $(progs_ldadd)
+markup_escape_test_LDADD = $(progs_ldadd)
+module_test_LDADD = $(module_ldadd) $(module_test_exp)
+module_test_LDFLAGS = $(G_MODULE_LDFLAGS)
+node_test_LDADD = $(progs_ldadd)
+option_test_LDADD = $(progs_ldadd)
+printf_test_LDADD = $(progs_ldadd)
+queue_test_LDADD = $(progs_ldadd)
+asyncqueue_test_LDADD = $(thread_ldadd)
+qsort_test_LDADD = $(progs_ldadd)
+rand_test_LDADD = $(progs_ldadd)
+relation_test_LDADD = $(progs_ldadd)
+sequence_test_LDADD = $(progs_ldadd)
+shell_test_LDADD = $(progs_ldadd)
+slist_test_LDADD = $(progs_ldadd)
+slice_test_SOURCES = slice-test.c memchunks.c
+slice_test_LDADD = $(thread_ldadd)
+slice_color_SOURCES = slice-color.c memchunks.c
+slice_color_LDADD = $(thread_ldadd)
+spawn_test_LDADD = $(progs_ldadd)
+strfunc_test_LDADD = $(progs_ldadd)
+string_test_LDADD = $(progs_ldadd)
+strtod_test_LDADD = $(progs_ldadd) -lm
+strtoll_test_LDADD = $(progs_ldadd) -lm
+thread_test_LDADD = $(thread_ldadd)
+threadpool_test_LDADD = $(thread_ldadd)
+tree_test_LDADD = $(progs_ldadd)
+type_test_LDADD = $(progs_ldadd)
+unicode_encoding_LDADD = $(progs_ldadd)
+unicode_caseconv_LDADD = $(progs_ldadd)
+unicode_collate_LDADD = $(progs_ldadd)
+utf8_validate_LDADD = $(progs_ldadd)
+utf8_pointer_LDADD = $(progs_ldadd)
+uri_test_LDADD = $(progs_ldadd)
+regex_test_LDADD = $(progs_ldadd)
+
+lib_LTLIBRARIES = libmoduletestplugin_a.la libmoduletestplugin_b.la
+
+# Prevent those libs from being installed
+install-libLTLIBRARIES:
+ :
+
+libmoduletestplugin_a_la_SOURCES = libmoduletestplugin_a.c
+libmoduletestplugin_a_la_LDFLAGS = $(G_MODULE_LDFLAGS) -avoid-version -module $(no_undefined) -rpath $(libdir)
+libmoduletestplugin_a_la_LIBADD = $(G_MODULE_LIBS) $(libadd_libgmodule) $(libadd_libglib)
+
+libmoduletestplugin_b_la_SOURCES = libmoduletestplugin_b.c
+libmoduletestplugin_b_la_LDFLAGS = $(G_MODULE_LDFLAGS) -avoid-version -module $(no_undefined) -rpath $(libdir)
+libmoduletestplugin_b_la_LIBADD = $(G_MODULE_LIBS) $(libadd_libgmodule) $(libadd_libglib)
+
+dist-hook: $(BUILT_EXTRA_DIST)
+ files='$(BUILT_EXTRA_DIST)'; \
+ for f in $$files; do \
+ if test -f $$f; then d=.; else d=$(srcdir); fi; \
+ cp $$d/$$f $(distdir) || exit 1; done
+ mkdir $(distdir)/markups; \
+ for f in $(srcdir)/markups/* ; do \
+ cp $$f $(distdir)/markups; done
+ mkdir $(distdir)/collate; \
+ for f in $(srcdir)/collate/* ; do \
+ if test -f $$f; then cp $$f $(distdir)/collate; fi; done
+ mkdir $(distdir)/bookmarks; \
+ for f in $(srcdir)/bookmarks/* ; do \
+ cp $$f $(distdir)/bookmarks; done
+
+DISTCLEANFILES = iochannel-test-outfile \
+ file-test-get-contents \
+ maptest \
+ mapchild \
+ collate.out
diff --git a/trunk/tests/array-test.c b/trunk/tests/array-test.c
new file mode 100644
index 000000000..3777667dc
--- /dev/null
+++ b/trunk/tests/array-test.c
@@ -0,0 +1,105 @@
+/* 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <stdio.h>
+#include <string.h>
+#include "glib.h"
+
+static void
+sum_up (gpointer data,
+ gpointer user_data)
+{
+ gint *sum = (gint *)user_data;
+
+ *sum += GPOINTER_TO_INT (data);
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ gint i;
+ GArray *garray;
+ GPtrArray *gparray;
+ GByteArray *gbarray;
+ gint sum = 0;
+
+ /* array tests */
+ 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++)
+ g_assert (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++)
+ g_assert (g_array_index (garray, gint, i) == (100 - i - 1));
+
+ g_array_free (garray, TRUE);
+
+ /* 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_foreach (gparray, sum_up, &sum);
+ g_assert (sum == 49995000);
+
+ g_ptr_array_free (gparray, TRUE);
+
+ /* 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);
+
+ return 0;
+}
+
diff --git a/trunk/tests/asyncqueue-test.c b/trunk/tests/asyncqueue-test.c
new file mode 100644
index 000000000..da65d7531
--- /dev/null
+++ b/trunk/tests/asyncqueue-test.c
@@ -0,0 +1,194 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <time.h>
+#include <stdlib.h>
+
+#include <glib.h>
+
+#define DEBUG_MSG(args)
+/* #define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n"); */
+#define PRINT_MSG(args)
+/* #define PRINT_MSG(args) g_print args ; g_print ("\n"); */
+
+#define MAX_THREADS 50
+#define MAX_SORTS 5 /* only applies if
+ ASYC_QUEUE_DO_SORT is set to 1 */
+#define MAX_TIME 20 /* seconds */
+#define MIN_TIME 5 /* seconds */
+
+#define SORT_QUEUE_AFTER 1
+#define SORT_QUEUE_ON_PUSH 1 /* if this is done, the
+ SORT_QUEUE_AFTER is ignored */
+#define QUIT_WHEN_DONE 1
+
+
+#if SORT_QUEUE_ON_PUSH == 1
+# undef SORT_QUEUE_AFTER
+# define SORT_QUEUE_AFTER 0
+#endif
+
+
+static GMainLoop *main_loop = NULL;
+static GThreadPool *thread_pool = NULL;
+static GAsyncQueue *async_queue = NULL;
+
+
+static gint
+sort_compare (gconstpointer p1, gconstpointer p2, gpointer user_data)
+{
+ gint32 id1;
+ gint32 id2;
+
+ id1 = GPOINTER_TO_INT (p1);
+ id2 = GPOINTER_TO_INT (p2);
+
+ DEBUG_MSG (("comparing #1:%d and #2:%d, returning %d",
+ id1, id2, (id1 > id2 ? +1 : id1 == id2 ? 0 : -1)));
+
+ return (id1 > id2 ? +1 : id1 == id2 ? 0 : -1);
+}
+
+static gboolean
+sort_queue (gpointer user_data)
+{
+ static gint sorts = 0;
+ static gpointer last_p = NULL;
+ gpointer p;
+ gboolean can_quit = FALSE;
+ gint sort_multiplier;
+ gint len;
+ gint i;
+
+ sort_multiplier = GPOINTER_TO_INT (user_data);
+
+ if (SORT_QUEUE_AFTER) {
+ PRINT_MSG (("sorting async queue..."));
+ g_async_queue_sort (async_queue, sort_compare, NULL);
+
+ sorts++;
+
+ if (sorts >= sort_multiplier) {
+ can_quit = TRUE;
+ }
+
+ g_async_queue_sort (async_queue, sort_compare, NULL);
+ len = g_async_queue_length (async_queue);
+
+ PRINT_MSG (("sorted queue (for %d/%d times, size:%d)...", sorts, MAX_SORTS, len));
+ } else {
+ can_quit = TRUE;
+ len = g_async_queue_length (async_queue);
+ DEBUG_MSG (("printing queue (size:%d)...", len));
+ }
+
+ for (i = 0, last_p = NULL; i < len; i++) {
+ p = g_async_queue_pop (async_queue);
+ DEBUG_MSG (("item %d ---> %d", i, GPOINTER_TO_INT (p)));
+
+ if (last_p) {
+ g_assert (GPOINTER_TO_INT (last_p) <= GPOINTER_TO_INT (p));
+ }
+
+ last_p = p;
+ }
+
+ if (can_quit && QUIT_WHEN_DONE) {
+ g_main_loop_quit (main_loop);
+ }
+
+ return !can_quit;
+}
+
+static void
+enter_thread (gpointer data, gpointer user_data)
+{
+ gint len;
+ gint id;
+ gulong ms;
+
+ id = GPOINTER_TO_INT (data);
+
+ ms = g_random_int_range (MIN_TIME * 1000, MAX_TIME * 1000);
+ DEBUG_MSG (("entered thread with id:%d, adding to queue in:%ld ms", id, ms));
+
+ g_usleep (ms * 1000);
+
+ if (SORT_QUEUE_ON_PUSH) {
+ g_async_queue_push_sorted (async_queue, GINT_TO_POINTER (id), sort_compare, NULL);
+ } else {
+ g_async_queue_push (async_queue, GINT_TO_POINTER (id));
+ }
+
+ len = g_async_queue_length (async_queue);
+
+ DEBUG_MSG (("thread id:%d added to async queue (size:%d)",
+ id, len));
+}
+
+int
+main (int argc, char *argv[])
+{
+#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE)
+ gint i;
+ gint max_threads = MAX_THREADS;
+ gint max_unused_threads = MAX_THREADS;
+ gint sort_multiplier = MAX_SORTS;
+ gint sort_interval;
+ gchar *msg;
+
+ g_thread_init (NULL);
+
+ PRINT_MSG (("creating async queue..."));
+ async_queue = g_async_queue_new ();
+
+ g_return_val_if_fail (async_queue != NULL, EXIT_FAILURE);
+
+ PRINT_MSG (("creating thread pool with max threads:%d, max unused threads:%d...",
+ max_threads, max_unused_threads));
+ thread_pool = g_thread_pool_new (enter_thread,
+ async_queue,
+ max_threads,
+ FALSE,
+ NULL);
+
+ g_return_val_if_fail (thread_pool != NULL, EXIT_FAILURE);
+
+ g_thread_pool_set_max_unused_threads (max_unused_threads);
+
+ PRINT_MSG (("creating threads..."));
+ for (i = 1; i <= max_threads; i++) {
+ GError *error = NULL;
+
+ g_thread_pool_push (thread_pool, GINT_TO_POINTER (i), &error);
+
+ g_assert (error == NULL);
+ }
+
+ if (!SORT_QUEUE_AFTER) {
+ sort_multiplier = 1;
+ }
+
+ sort_interval = ((MAX_TIME / sort_multiplier) + 2) * 1000;
+ g_timeout_add (sort_interval, sort_queue, GINT_TO_POINTER (sort_multiplier));
+
+ if (SORT_QUEUE_ON_PUSH) {
+ msg = "sorting when pushing into the queue, checking queue is sorted";
+ } else {
+ msg = "sorting";
+ }
+
+ PRINT_MSG (("%s %d %s %d ms",
+ msg,
+ sort_multiplier,
+ sort_multiplier == 1 ? "time in" : "times, once every",
+ sort_interval));
+
+ DEBUG_MSG (("entering main event loop"));
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (main_loop);
+#endif
+
+ return EXIT_SUCCESS;
+}
diff --git a/trunk/tests/atomic-test.c b/trunk/tests/atomic-test.c
new file mode 100644
index 000000000..c2a67e4ea
--- /dev/null
+++ b/trunk/tests/atomic-test.c
@@ -0,0 +1,63 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <glib.h>
+
+/* Obviously we can't test that the operations are atomic, but we can
+ * at least test, that they do, what they ought to do */
+
+int
+main (int argc,
+ char *argv[])
+{
+ gint i;
+ gint atomic = -5;
+ gpointer atomic_pointer = NULL;
+ gpointer biggest_pointer = (gpointer)((gsize)atomic_pointer - 1);
+
+ for (i = 0; i < 15; i++)
+ g_atomic_int_inc (&atomic);
+ g_assert (atomic == 10);
+ for (i = 0; i < 9; i++)
+ g_assert (!g_atomic_int_dec_and_test (&atomic));
+ g_assert (g_atomic_int_dec_and_test (&atomic));
+ g_assert (atomic == 0);
+
+ g_assert (g_atomic_int_exchange_and_add (&atomic, 5) == 0);
+ g_assert (atomic == 5);
+
+ g_assert (g_atomic_int_exchange_and_add (&atomic, -10) == 5);
+ g_assert (atomic == -5);
+
+ g_atomic_int_add (&atomic, 20);
+ g_assert (atomic == 15);
+
+ g_atomic_int_add (&atomic, -35);
+ g_assert (atomic == -20);
+
+ g_assert (atomic == g_atomic_int_get (&atomic));
+
+ g_assert (g_atomic_int_compare_and_exchange (&atomic, -20, 20));
+ g_assert (atomic == 20);
+
+ g_assert (!g_atomic_int_compare_and_exchange (&atomic, 42, 12));
+ g_assert (atomic == 20);
+
+ g_assert (g_atomic_int_compare_and_exchange (&atomic, 20, G_MAXINT));
+ g_assert (atomic == G_MAXINT);
+
+ g_assert (g_atomic_int_compare_and_exchange (&atomic, G_MAXINT, G_MININT));
+ g_assert (atomic == G_MININT);
+
+ g_assert (g_atomic_pointer_compare_and_exchange (&atomic_pointer,
+ NULL, biggest_pointer));
+ g_assert (atomic_pointer == biggest_pointer);
+
+ g_assert (atomic_pointer == g_atomic_pointer_get (&atomic_pointer));
+
+ g_assert (g_atomic_pointer_compare_and_exchange (&atomic_pointer,
+ biggest_pointer, NULL));
+ g_assert (atomic_pointer == NULL);
+
+ return 0;
+}
diff --git a/trunk/tests/base64-test.c b/trunk/tests/base64-test.c
new file mode 100644
index 000000000..4cb703693
--- /dev/null
+++ b/trunk/tests/base64-test.c
@@ -0,0 +1,131 @@
+#include "config.h"
+
+#include <glib.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+
+#define DATA_SIZE 1024
+#define BLOCK_SIZE 32
+#define NUM_BLOCKS 32
+static guchar data[DATA_SIZE];
+
+static void
+test_incremental (gboolean line_break,
+ gint length)
+{
+ char *p;
+ gsize len, decoded_len, max, input_len, block_size;
+ int state, save;
+ guint decoder_save;
+ char *text;
+ guchar *data2;
+
+ data2 = g_malloc (length);
+ text = g_malloc (length * 2);
+
+ len = 0;
+ state = 0;
+ save = 0;
+ input_len = 0;
+ while (input_len < length)
+ {
+ block_size = MIN (BLOCK_SIZE, length - input_len);
+ len += g_base64_encode_step (data + input_len, block_size,
+ line_break, text + len, &state, &save);
+ input_len += block_size;
+ }
+ len += g_base64_encode_close (line_break, text + len, &state, &save);
+
+ if (line_break)
+ max = length * 4 / 3 + length * 4 / (3 * 72) + 7;
+ else
+ max = length * 4 / 3 + 6;
+ if (len > max)
+ {
+ g_print ("Too long encoded length: got %d, expected max %d\n",
+ len, max);
+ exit (1);
+ }
+
+ decoded_len = 0;
+ state = 0;
+ decoder_save = 0;
+ p = text;
+ while (len > 0)
+ {
+ int chunk_len = MIN (BLOCK_SIZE, len);
+ decoded_len += g_base64_decode_step (p,
+ chunk_len,
+ data2 + decoded_len,
+ &state, &decoder_save);
+ p += chunk_len;
+ len -= chunk_len;
+ }
+
+ if (decoded_len != length)
+ {
+ g_print ("Wrong decoded length: got %d, expected %d\n",
+ decoded_len, length);
+ exit (1);
+ }
+
+ if (memcmp (data, data2, length) != 0)
+ {
+ g_print ("Wrong decoded base64 data\n");
+ exit (1);
+ }
+
+ g_free (text);
+ g_free (data2);
+}
+
+static void
+test_full (void)
+{
+ char *text;
+ guchar *data2;
+ gsize len;
+
+ text = g_base64_encode (data, DATA_SIZE);
+ data2 = g_base64_decode (text, &len);
+ g_free (text);
+
+ if (len != DATA_SIZE)
+ {
+ g_print ("Wrong decoded length: got %d, expected %d\n",
+ len, DATA_SIZE);
+ exit (1);
+ }
+
+ if (memcmp (data, data2, DATA_SIZE) != 0)
+ {
+ g_print ("Wrong decoded base64 data\n");
+ exit (1);
+ }
+
+ g_free (data2);
+}
+
+int
+main (int argc, char *argv[])
+{
+ int i;
+ for (i = 0; i < DATA_SIZE; i++)
+ data[i] = (guchar)i;
+
+ test_full ();
+
+ test_incremental (FALSE, DATA_SIZE);
+ test_incremental (TRUE, DATA_SIZE);
+
+ test_incremental (FALSE, DATA_SIZE - 1);
+ test_incremental (TRUE, DATA_SIZE - 1);
+
+ test_incremental (FALSE, DATA_SIZE - 2);
+ test_incremental (TRUE, DATA_SIZE - 2);
+
+ return 0;
+}
diff --git a/trunk/tests/bit-test.c b/trunk/tests/bit-test.c
new file mode 100644
index 000000000..230c85246
--- /dev/null
+++ b/trunk/tests/bit-test.c
@@ -0,0 +1,145 @@
+#include <glib.h>
+
+#if defined(__GNUC__) && (__GNUC__ >= 4)
+# define TEST_BUILTINS 1
+#else
+# define TEST_BUILTINS 0
+#endif
+
+#if TEST_BUILTINS
+static gint
+builtin_bit_nth_lsf1 (gulong mask, gint nth_bit)
+{
+ if (nth_bit >= 0)
+ {
+ if (G_LIKELY (nth_bit < GLIB_SIZEOF_LONG * 8 - 1))
+ mask &= -(1UL<<(nth_bit+1));
+ else
+ mask = 0;
+ }
+ return __builtin_ffsl(mask) - 1;
+}
+
+static gint
+builtin_bit_nth_lsf2 (gulong mask, gint nth_bit)
+{
+ if (nth_bit >= 0)
+ {
+ if (G_LIKELY (nth_bit < GLIB_SIZEOF_LONG * 8 - 1))
+ mask &= -(1UL<<(nth_bit+1));
+ else
+ mask = 0;
+ }
+ return mask ? __builtin_ctzl(mask) : -1;
+}
+
+static gint
+builtin_bit_nth_msf (gulong mask, gint nth_bit)
+{
+ if (nth_bit >= 0 && nth_bit < GLIB_SIZEOF_LONG * 8)
+ mask &= (1UL<<nth_bit)-1;
+ return mask ? GLIB_SIZEOF_LONG * 8 - 1 - __builtin_clzl(mask) : -1;
+}
+
+
+static guint
+builtin_bit_storage (gulong number)
+{
+ return number ? GLIB_SIZEOF_LONG * 8 - __builtin_clzl(number) : 1;
+}
+#endif
+
+
+static gint
+naive_bit_nth_lsf (gulong mask, gint nth_bit)
+{
+ if (G_UNLIKELY (nth_bit < -1))
+ nth_bit = -1;
+ while (nth_bit < ((GLIB_SIZEOF_LONG * 8) - 1))
+ {
+ nth_bit++;
+ if (mask & (1UL << nth_bit))
+ return nth_bit;
+ }
+ return -1;
+}
+
+static gint
+naive_bit_nth_msf (gulong mask, gint nth_bit)
+{
+ if (nth_bit < 0 || G_UNLIKELY (nth_bit > GLIB_SIZEOF_LONG * 8))
+ nth_bit = GLIB_SIZEOF_LONG * 8;
+ while (nth_bit > 0)
+ {
+ nth_bit--;
+ if (mask & (1UL << nth_bit))
+ return nth_bit;
+ }
+ return -1;
+}
+
+static guint
+naive_bit_storage (gulong number)
+{
+ register guint n_bits = 0;
+
+ do
+ {
+ n_bits++;
+ number >>= 1;
+ }
+ while (number);
+ return n_bits;
+}
+
+
+
+#define TEST(f1, f2, i) \
+ if (f1 (i) != f2 (i)) { \
+ g_error (G_STRINGIFY (f1) " (%lu) = %d; " \
+ G_STRINGIFY (f2) " (%lu) = %d; ", \
+ i, f1 (i), \
+ i, f2 (i)); \
+ return 1; \
+ }
+#define TEST2(f1, f2, i, n) \
+ if (f1 (i, n) != f2 (i, n)) { \
+ g_error (G_STRINGIFY (f1) " (%lu, %d) = %d; " \
+ G_STRINGIFY (f2) " (%lu, %d) = %d; ", \
+ i, n, f1 (i, n), \
+ i, n, f2 (i, n)); \
+ return 1; \
+ }
+
+int
+main (void)
+{
+ gulong i;
+ gint nth_bit;
+
+ /* we loop like this: 0, -1, 1, -2, 2, -3, 3, ... */
+ for (i = 0; (glong)i < 1500 ; i = -(i+((glong)i>=0))) {
+
+#if TEST_BUILTINS
+ TEST (naive_bit_storage, builtin_bit_storage, i);
+#endif
+ TEST (naive_bit_storage, g_bit_storage, i);
+
+ for (nth_bit = -3; nth_bit <= 2 + GLIB_SIZEOF_LONG * 8; nth_bit++) {
+
+#if TEST_BUILTINS
+ TEST2 (naive_bit_nth_lsf, builtin_bit_nth_lsf1, i, nth_bit);
+ TEST2 (naive_bit_nth_lsf, builtin_bit_nth_lsf2, i, nth_bit);
+#endif
+ TEST2 (naive_bit_nth_lsf, g_bit_nth_lsf, i, nth_bit);
+
+#if TEST_BUILTINS
+ TEST2 (naive_bit_nth_msf, builtin_bit_nth_msf, i, nth_bit);
+#endif
+ TEST2 (naive_bit_nth_msf, g_bit_nth_msf, i, nth_bit);
+
+ }
+ }
+
+ return 0;
+}
diff --git a/trunk/tests/bookmarkfile-test.c b/trunk/tests/bookmarkfile-test.c
new file mode 100644
index 000000000..06019ca1f
--- /dev/null
+++ b/trunk/tests/bookmarkfile-test.c
@@ -0,0 +1,247 @@
+#undef G_DISABLE_ASSERT
+
+#include <glib.h>
+#include <time.h>
+#include <locale.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define TEST_URI_0 "file:///abc/defgh/ijklmnopqrstuvwxyz"
+#define TEST_URI_1 "file:///test/uri/1"
+#define TEST_URI_2 "file:///test/uri/2"
+
+#define TEST_MIME "text/plain"
+
+#define TEST_APP_NAME "bookmarkfile-test"
+#define TEST_APP_EXEC "bookmarkfile-test %f"
+
+static void
+test_assert_empty_error (GError **error)
+{
+ if (*error != NULL)
+ {
+ g_warning ("Unexpected error (d: %s, c: %d): %s\n",
+ g_quark_to_string ((*error)->domain),
+ (*error)->code,
+ (*error)->message);
+ g_error_free (*error);
+
+ g_assert_not_reached ();
+ }
+}
+
+static void
+test_assert_not_empty_error (GError **error,
+ GQuark domain,
+ gint code)
+{
+ if (*error == NULL)
+ {
+ g_warning ("Unexpected success (%s domain expected)\n",
+ g_quark_to_string (domain));
+
+ g_assert_not_reached ();
+ }
+
+ if ((*error)->domain != domain)
+ {
+ g_warning ("Unexpected domain %s (%s domain expected)\n",
+ g_quark_to_string ((*error)->domain),
+ g_quark_to_string (domain));
+
+ g_assert_not_reached ();
+ }
+
+ if ((*error)->code != code)
+ {
+ g_warning ("Unexpected code %d (%d code expected)\n",
+ (*error)->code,
+ code);
+
+ g_assert_not_reached ();
+ }
+
+ g_error_free (*error);
+ *error = NULL;
+}
+
+static void
+test_assert_str_equal (const gchar *str,
+ const gchar *cmp)
+{
+ if (strcmp (str, cmp) != 0)
+ {
+ g_warning ("Unexpected string '%s' ('%s' expected)\n", str, cmp);
+
+ g_assert_not_reached ();
+ }
+}
+
+static gboolean
+test_load (GBookmarkFile *bookmark,
+ const gchar *filename)
+{
+ GError *error = NULL;
+ gboolean res;
+
+ res = g_bookmark_file_load_from_file (bookmark, filename, &error);
+ if (error)
+ {
+ g_print ("Load error: %s\n", error->message);
+ g_error_free (error);
+ }
+
+ return res;
+}
+
+static gboolean
+test_query (GBookmarkFile *bookmark)
+{
+ gint size;
+ gchar **uris;
+ gsize uris_len, i;
+ gboolean res = TRUE;
+
+ size = g_bookmark_file_get_size (bookmark);
+ uris = g_bookmark_file_get_uris (bookmark, &uris_len);
+
+ if (uris_len != size)
+ {
+ g_print ("URI/size mismatch: URI count is %d (should be %d)\n", uris_len, size);
+
+ res = FALSE;
+ }
+
+ for (i = 0; i < uris_len; i++)
+ if (!g_bookmark_file_has_item (bookmark, uris[i]))
+ {
+ g_print ("URI/bookmark mismatch: bookmark for '%s' does not exist\n", uris[i]);
+
+ res = FALSE;
+ }
+
+ g_strfreev (uris);
+
+ return res;
+}
+
+static gboolean
+test_modify (GBookmarkFile *bookmark)
+{
+ gchar *text;
+ guint count;
+ time_t stamp;
+ GError *error = NULL;
+
+ g_print ("\t=> check global title/description...");
+ g_bookmark_file_set_title (bookmark, NULL, "a file");
+ g_bookmark_file_set_description (bookmark, NULL, "a bookmark file");
+
+ text = g_bookmark_file_get_title (bookmark, NULL, &error);
+ test_assert_empty_error (&error);
+ test_assert_str_equal (text, "a file");
+ g_free (text);
+
+ text = g_bookmark_file_get_description (bookmark, NULL, &error);
+ test_assert_empty_error (&error);
+ test_assert_str_equal (text, "a bookmark file");
+ g_free (text);
+ g_print ("ok\n");
+
+ g_print ("\t=> check bookmark title/description...");
+ g_bookmark_file_set_title (bookmark, TEST_URI_0, "a title");
+ g_bookmark_file_set_description (bookmark, TEST_URI_0, "a description");
+
+ text = g_bookmark_file_get_title (bookmark, TEST_URI_0, &error);
+ test_assert_empty_error (&error);
+ test_assert_str_equal (text, "a title");
+ g_free (text);
+ g_print ("ok\n");
+
+ g_print ("\t=> check non existing bookmark...");
+ g_bookmark_file_get_description (bookmark, TEST_URI_1, &error);
+ test_assert_not_empty_error (&error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND);
+ g_print ("ok\n");
+
+ g_print ("\t=> check application...");
+ g_bookmark_file_set_mime_type (bookmark, TEST_URI_0, TEST_MIME);
+ g_bookmark_file_add_application (bookmark, TEST_URI_0,
+ TEST_APP_NAME,
+ TEST_APP_EXEC);
+ g_assert (g_bookmark_file_has_application (bookmark, TEST_URI_0, TEST_APP_NAME, NULL) == TRUE);
+ g_bookmark_file_get_app_info (bookmark, TEST_URI_0, TEST_APP_NAME,
+ &text,
+ &count,
+ &stamp,
+ &error);
+ test_assert_empty_error (&error);
+ g_assert (count == 1);
+ g_assert (stamp == g_bookmark_file_get_modified (bookmark, TEST_URI_0, NULL));
+ g_free (text);
+
+ g_bookmark_file_get_app_info (bookmark, TEST_URI_0, "fail",
+ &text,
+ &count,
+ &stamp,
+ &error);
+ test_assert_not_empty_error (&error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED);
+ g_print ("ok\n");
+
+ g_print ("\t=> check groups...");
+ g_bookmark_file_add_group (bookmark, TEST_URI_1, "Test");
+ g_assert (g_bookmark_file_has_group (bookmark, TEST_URI_1, "Test", NULL) == TRUE);
+ g_assert (g_bookmark_file_has_group (bookmark, TEST_URI_1, "Fail", NULL) == FALSE);
+ g_print ("ok\n");
+
+ g_print ("\t=> check remove...");
+ g_assert (g_bookmark_file_remove_item (bookmark, TEST_URI_1, &error) == TRUE);
+ test_assert_empty_error (&error);
+ g_assert (g_bookmark_file_remove_item (bookmark, TEST_URI_1, &error) == FALSE);
+ test_assert_not_empty_error (&error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND);
+ g_print ("ok\n");
+
+ return TRUE;
+}
+
+static gint
+test_file (const gchar *filename)
+{
+ GBookmarkFile *bookmark_file;
+ gboolean success;
+
+ g_return_val_if_fail (filename != NULL, 1);
+
+ g_print ("checking GBookmarkFile...\n");
+
+ bookmark_file = g_bookmark_file_new ();
+ g_assert (bookmark_file != NULL);
+
+ success = test_load (bookmark_file, filename);
+
+ if (success)
+ {
+ success = test_query (bookmark_file);
+ success = test_modify (bookmark_file);
+ }
+
+ g_bookmark_file_free (bookmark_file);
+
+ g_print ("ok\n");
+
+ return (success == TRUE ? 0 : 1);
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ if (argc > 1)
+ return test_file (argv[1]);
+ else
+ {
+ fprintf (stderr, "Usage: bookmarkfile-test <bookmarkfile>\n");
+
+ return 1;
+ }
+}
diff --git a/trunk/tests/bookmarks/fail-01.xbel b/trunk/tests/bookmarks/fail-01.xbel
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-01.xbel
diff --git a/trunk/tests/bookmarks/fail-02.xbel b/trunk/tests/bookmarks/fail-02.xbel
new file mode 100644
index 000000000..39f0094b3
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-02.xbel
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?>
+<fail/>
diff --git a/trunk/tests/bookmarks/fail-03.xbel b/trunk/tests/bookmarks/fail-03.xbel
new file mode 100644
index 000000000..563dd5408
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-03.xbel
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark>
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/postscript"/>
+ <bookmark:applications>
+ <bookmark:application name="populate-recent" exec="populate-recent --info %u" timestamp="1128121528" count="1"/>
+ </bookmark:applications>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/fail-04.xbel b/trunk/tests/bookmarks/fail-04.xbel
new file mode 100644
index 000000000..86f1e9012
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-04.xbel
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+ PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" fail="attr">
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/postscript"/>
+ <bookmark:applications>
+ <bookmark:application name="populate-recent" exec="populate-recent --info %u" timestamp="1128121528" count="1"/>
+ </bookmark:applications>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/fail-05.xbel b/trunk/tests/bookmarks/fail-05.xbel
new file mode 100644
index 000000000..355f172de
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-05.xbel
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+ PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file & containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/postscript"/>
+ <bookmark:applications>
+ <bookmark:application name="populate-recent" exec="populate-recent --info %u" timestamp="1128121528" count="1"/>
+ </bookmark:applications>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/fail-06.xbel b/trunk/tests/bookmarks/fail-06.xbel
new file mode 100644
index 000000000..d1e288bd0
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-06.xbel
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+ PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/postscript"/>
+ <bookmark:applications>
+ <bookmark:application name="populate-recent" exec="populate-recent --info %u" timestamp="1128121528" count="1"/>
+ </bookmark:applications>
+ </metadata>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/fail-07.xbel b/trunk/tests/bookmarks/fail-07.xbel
new file mode 100644
index 000000000..8e24c64cb
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-07.xbel
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+ PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+ <info>
+ <metadata>
+ <mime:mime-type type="application/postscript"/>
+ <bookmark:applications>
+ <bookmark:application name="populate-recent" exec="populate-recent --info %u" timestamp="1128121528" count="1"/>
+ </bookmark:applications>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/fail-08.xbel b/trunk/tests/bookmarks/fail-08.xbel
new file mode 100644
index 000000000..d26f75276
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-08.xbel
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+ PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <bookmark:fail/>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/fail-09.xbel b/trunk/tests/bookmarks/fail-09.xbel
new file mode 100644
index 000000000..5e1ce649a
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-09.xbel
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+ PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <bookmark:applications>
+ <bookmark:application/>
+ </bookmark:applications>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/fail-10.xbel b/trunk/tests/bookmarks/fail-10.xbel
new file mode 100644
index 000000000..f4eef12c6
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-10.xbel
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+ PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/postscript"/>
+ <bookmark:applications>
+ <bookmark:application exec="populate-recent --info %u" timestamp="1128121528" count="1"/>
+ </bookmark:applications>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/fail-11.xbel b/trunk/tests/bookmarks/fail-11.xbel
new file mode 100644
index 000000000..520693be0
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-11.xbel
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+ PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+ <title>&</title>
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/postscript"/>
+ <bookmark:applications>
+ <bookmark:application name="populate-recent" exec="populate-recent --info %u" timestamp="1128121528" count="1"/>
+ </bookmark:applications>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/fail-12.xbel b/trunk/tests/bookmarks/fail-12.xbel
new file mode 100644
index 000000000..9ba280e89
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-12.xbel
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+ PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/postscript"/>
+ <bookmark:applications>
+ <bookmark:application name="populate-recent" exec="populate-recent --info %u" timestamp="1128121528" count="1"/>
+ </bookmark:applications>
+ <bookmark:icon type="image/png"/>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/fail-13.xbel b/trunk/tests/bookmarks/fail-13.xbel
new file mode 100644
index 000000000..cdd1affcb
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-13.xbel
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+ PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/postscript"/>
+ <bookmark:applications>
+ <bookmark:application name="populate-recent" exec="populate-recent --info %u" timestamp="1128121528" count="1"/>
+ </bookmark:applications>
+ <fail/>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/fail-14.xbel b/trunk/tests/bookmarks/fail-14.xbel
new file mode 100644
index 000000000..2161632f0
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-14.xbel
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+ PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/postscript"/>
+ <bookmark:applications>
+ <bookmark:application name="populate-recent" exec="populate-recent --info %u" timestamp="1128121528" count="1"/>
+ </bookmark:applications>
+ <bookmark:groups>
+ <fail>Test</fail>
+ </bookmark:groups>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/fail-15.xbel b/trunk/tests/bookmarks/fail-15.xbel
new file mode 100644
index 000000000..9a2ac1299
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-15.xbel
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+ PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/postscript"/>
+ <bookmark:applications>
+ <bookmark:application name="populate-recent" exec="populate-recent --info %u" timestamp="1128121528" count="1"/>
+ </bookmark:applications>
+ <bookmark:groups>
+ <bookmark:group>Test</bookmark:group>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/fail-16.xbel b/trunk/tests/bookmarks/fail-16.xbel
new file mode 100644
index 000000000..18f55b321
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-16.xbel
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+ PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/postscript"/>
+ <bookmark:applications>
+ <bookmark:application name="populate-recent" exec="populate-recent --info %u" timestamp="1128121528" count="1"/>
+ </bookmark:applications>
+ <bookmark:groups>
+ <bookmark:group>Test</group>
+ </bookmark:groups>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/fail-17.xbel b/trunk/tests/bookmarks/fail-17.xbel
new file mode 100644
index 000000000..9ad97bd60
--- /dev/null
+++ b/trunk/tests/bookmarks/fail-17.xbel
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+ PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/postscript"/>
+ <bookmark:applications>
+ <bookmark:application name="populate-recent" exec="populate-recent --info %u" timestamp="1128121528" count="1"/>
+ </bookmark:applications>
+ </metadata>
+ <invalid/>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/valid-01.xbel b/trunk/tests/bookmarks/valid-01.xbel
new file mode 100644
index 000000000..6ab98ba35
--- /dev/null
+++ b/trunk/tests/bookmarks/valid-01.xbel
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+ PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+ "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/postscript"/>
+ <bookmark:applications>
+ <bookmark:application name="populate-recent" exec="populate-recent --info %u" timestamp="1128121528" count="1"/>
+ </bookmark:applications>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/bookmarks/valid-02.xbel b/trunk/tests/bookmarks/valid-02.xbel
new file mode 100644
index 000000000..85a84a077
--- /dev/null
+++ b/trunk/tests/bookmarks/valid-02.xbel
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xbel version="1.0">
+ <title>Singleton</title>
+ <desc>A file containing a single bookmark element</desc>
+ <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime-type type="application/postscript"/>
+ <applications>
+ <application name="populate-recent" exec="populate-recent --info %u" timestamp="1128121528" count="1"/>
+ </applications>
+ </metadata>
+ </info>
+ </bookmark>
+</xbel>
diff --git a/trunk/tests/casefold.txt b/trunk/tests/casefold.txt
new file mode 100644
index 000000000..2e225aecf
--- /dev/null
+++ b/trunk/tests/casefold.txt
@@ -0,0 +1,1019 @@
+# Test cases generated from Unicode 5.0 data
+# by gen-casefold-test.pl. Do not edit.
+#
+# Some special hand crafted tests
+#
+AaBbCc@@ aabbcc@@
+#
+# Now the automatic tests
+#
+A a
+B b
+C c
+D d
+E e
+F f
+G g
+H h
+I i
+J j
+K k
+L l
+M m
+N n
+O o
+P p
+Q q
+R r
+S s
+T t
+U u
+V v
+W w
+X x
+Y y
+Z z
+µ μ
+À à
+Á á
+Â â
+Ã ã
+Ä ä
+Å å
+Æ æ
+Ç ç
+È è
+É é
+Ê ê
+Ë ë
+Ì ì
+Í í
+Î î
+Ï ï
+Ð ð
+Ñ ñ
+Ò ò
+Ó ó
+Ô ô
+Õ õ
+Ö ö
+Ø ø
+Ù ù
+Ú ú
+Û û
+Ü ü
+Ý ý
+Þ þ
+ß ss
+Ā ā
+Ă ă
+Ą ą
+Ć ć
+Ĉ ĉ
+Ċ ċ
+Č č
+Ď ď
+Đ đ
+Ē ē
+Ĕ ĕ
+Ė ė
+Ę ę
+Ě ě
+Ĝ ĝ
+Ğ ğ
+Ġ ġ
+Ģ ģ
+Ĥ ĥ
+Ħ ħ
+Ĩ ĩ
+Ī ī
+Ĭ ĭ
+Į į
+İ i̇
+IJ ij
+Ĵ ĵ
+Ķ ķ
+Ĺ ĺ
+Ļ ļ
+Ľ ľ
+Ŀ ŀ
+Ł ł
+Ń ń
+Ņ ņ
+Ň ň
+ʼn ʼn
+Ŋ ŋ
+Ō ō
+Ŏ ŏ
+Ő ő
+Œ œ
+Ŕ ŕ
+Ŗ ŗ
+Ř ř
+Ś ś
+Ŝ ŝ
+Ş ş
+Š š
+Ţ ţ
+Ť ť
+Ŧ ŧ
+Ũ ũ
+Ū ū
+Ŭ ŭ
+Ů ů
+Ű ű
+Ų ų
+Ŵ ŵ
+Ŷ ŷ
+Ÿ ÿ
+Ź ź
+Ż ż
+Ž ž
+ſ s
+Ɓ ɓ
+Ƃ ƃ
+Ƅ ƅ
+Ɔ ɔ
+Ƈ ƈ
+Ɖ ɖ
+Ɗ ɗ
+Ƌ ƌ
+Ǝ ǝ
+Ə ə
+Ɛ ɛ
+Ƒ ƒ
+Ɠ ɠ
+Ɣ ɣ
+Ɩ ɩ
+Ɨ ɨ
+Ƙ ƙ
+Ɯ ɯ
+Ɲ ɲ
+Ɵ ɵ
+Ơ ơ
+Ƣ ƣ
+Ƥ ƥ
+Ʀ ʀ
+Ƨ ƨ
+Ʃ ʃ
+Ƭ ƭ
+Ʈ ʈ
+Ư ư
+Ʊ ʊ
+Ʋ ʋ
+Ƴ ƴ
+Ƶ ƶ
+Ʒ ʒ
+Ƹ ƹ
+Ƽ ƽ
+DŽ dž
+Dž dž
+LJ lj
+Lj lj
+NJ nj
+Nj nj
+Ǎ ǎ
+Ǐ ǐ
+Ǒ ǒ
+Ǔ ǔ
+Ǖ ǖ
+Ǘ ǘ
+Ǚ ǚ
+Ǜ ǜ
+Ǟ ǟ
+Ǡ ǡ
+Ǣ ǣ
+Ǥ ǥ
+Ǧ ǧ
+Ǩ ǩ
+Ǫ ǫ
+Ǭ ǭ
+Ǯ ǯ
+ǰ ǰ
+DZ dz
+Dz dz
+Ǵ ǵ
+Ƕ ƕ
+Ƿ ƿ
+Ǹ ǹ
+Ǻ ǻ
+Ǽ ǽ
+Ǿ ǿ
+Ȁ ȁ
+Ȃ ȃ
+Ȅ ȅ
+Ȇ ȇ
+Ȉ ȉ
+Ȋ ȋ
+Ȍ ȍ
+Ȏ ȏ
+Ȑ ȑ
+Ȓ ȓ
+Ȕ ȕ
+Ȗ ȗ
+Ș ș
+Ț ț
+Ȝ ȝ
+Ȟ ȟ
+Ƞ ƞ
+Ȣ ȣ
+Ȥ ȥ
+Ȧ ȧ
+Ȩ ȩ
+Ȫ ȫ
+Ȭ ȭ
+Ȯ ȯ
+Ȱ ȱ
+Ȳ ȳ
+Ⱥ ⱥ
+Ȼ ȼ
+Ƚ ƚ
+Ⱦ ⱦ
+Ɂ ɂ
+Ƀ ƀ
+Ʉ ʉ
+Ʌ ʌ
+Ɇ ɇ
+Ɉ ɉ
+Ɋ ɋ
+Ɍ ɍ
+Ɏ ɏ
+ͅ ι
+Ά ά
+Έ έ
+Ή ή
+Ί ί
+Ό ό
+Ύ ύ
+Ώ ώ
+ΐ ΐ
+Α α
+Β β
+Γ γ
+Δ δ
+Ε ε
+Ζ ζ
+Η η
+Θ θ
+Ι ι
+Κ κ
+Λ λ
+Μ μ
+Ν ν
+Ξ ξ
+Ο ο
+Π π
+Ρ ρ
+Σ σ
+Τ τ
+Υ υ
+Φ φ
+Χ χ
+Ψ ψ
+Ω ω
+Ϊ ϊ
+Ϋ ϋ
+ΰ ΰ
+ς σ
+ϐ β
+ϑ θ
+ϕ φ
+ϖ π
+Ϙ ϙ
+Ϛ ϛ
+Ϝ ϝ
+Ϟ ϟ
+Ϡ ϡ
+Ϣ ϣ
+Ϥ ϥ
+Ϧ ϧ
+Ϩ ϩ
+Ϫ ϫ
+Ϭ ϭ
+Ϯ ϯ
+ϰ κ
+ϱ ρ
+ϴ θ
+ϵ ε
+Ϸ ϸ
+Ϲ ϲ
+Ϻ ϻ
+Ͻ ͻ
+Ͼ ͼ
+Ͽ ͽ
+Ѐ ѐ
+Ё ё
+Ђ ђ
+Ѓ ѓ
+Є є
+Ѕ ѕ
+І і
+Ї ї
+Ј ј
+Љ љ
+Њ њ
+Ћ ћ
+Ќ ќ
+Ѝ ѝ
+Ў ў
+Џ џ
+А а
+Б б
+В в
+Г г
+Д д
+Е е
+Ж ж
+З з
+И и
+Й й
+К к
+Л л
+М м
+Н н
+О о
+П п
+Р р
+С с
+Т т
+У у
+Ф ф
+Х х
+Ц ц
+Ч ч
+Ш ш
+Щ щ
+Ъ ъ
+Ы ы
+Ь ь
+Э э
+Ю ю
+Я я
+Ѡ ѡ
+Ѣ ѣ
+Ѥ ѥ
+Ѧ ѧ
+Ѩ ѩ
+Ѫ ѫ
+Ѭ ѭ
+Ѯ ѯ
+Ѱ ѱ
+Ѳ ѳ
+Ѵ ѵ
+Ѷ ѷ
+Ѹ ѹ
+Ѻ ѻ
+Ѽ ѽ
+Ѿ ѿ
+Ҁ ҁ
+Ҋ ҋ
+Ҍ ҍ
+Ҏ ҏ
+Ґ ґ
+Ғ ғ
+Ҕ ҕ
+Җ җ
+Ҙ ҙ
+Қ қ
+Ҝ ҝ
+Ҟ ҟ
+Ҡ ҡ
+Ң ң
+Ҥ ҥ
+Ҧ ҧ
+Ҩ ҩ
+Ҫ ҫ
+Ҭ ҭ
+Ү ү
+Ұ ұ
+Ҳ ҳ
+Ҵ ҵ
+Ҷ ҷ
+Ҹ ҹ
+Һ һ
+Ҽ ҽ
+Ҿ ҿ
+Ӏ ӏ
+Ӂ ӂ
+Ӄ ӄ
+Ӆ ӆ
+Ӈ ӈ
+Ӊ ӊ
+Ӌ ӌ
+Ӎ ӎ
+Ӑ ӑ
+Ӓ ӓ
+Ӕ ӕ
+Ӗ ӗ
+Ә ә
+Ӛ ӛ
+Ӝ ӝ
+Ӟ ӟ
+Ӡ ӡ
+Ӣ ӣ
+Ӥ ӥ
+Ӧ ӧ
+Ө ө
+Ӫ ӫ
+Ӭ ӭ
+Ӯ ӯ
+Ӱ ӱ
+Ӳ ӳ
+Ӵ ӵ
+Ӷ ӷ
+Ӹ ӹ
+Ӻ ӻ
+Ӽ ӽ
+Ӿ ӿ
+Ԁ ԁ
+Ԃ ԃ
+Ԅ ԅ
+Ԇ ԇ
+Ԉ ԉ
+Ԋ ԋ
+Ԍ ԍ
+Ԏ ԏ
+Ԑ ԑ
+Ԓ ԓ
+Ա ա
+Բ բ
+Գ գ
+Դ դ
+Ե ե
+Զ զ
+Է է
+Ը ը
+Թ թ
+Ժ ժ
+Ի ի
+Լ լ
+Խ խ
+Ծ ծ
+Կ կ
+Հ հ
+Ձ ձ
+Ղ ղ
+Ճ ճ
+Մ մ
+Յ յ
+Ն ն
+Շ շ
+Ո ո
+Չ չ
+Պ պ
+Ջ ջ
+Ռ ռ
+Ս ս
+Վ վ
+Տ տ
+Ր ր
+Ց ց
+Ւ ւ
+Փ փ
+Ք ք
+Օ օ
+Ֆ ֆ
+և եւ
+Ⴀ ⴀ
+Ⴁ ⴁ
+Ⴂ ⴂ
+Ⴃ ⴃ
+Ⴄ ⴄ
+Ⴅ ⴅ
+Ⴆ ⴆ
+Ⴇ ⴇ
+Ⴈ ⴈ
+Ⴉ ⴉ
+Ⴊ ⴊ
+Ⴋ ⴋ
+Ⴌ ⴌ
+Ⴍ ⴍ
+Ⴎ ⴎ
+Ⴏ ⴏ
+Ⴐ ⴐ
+Ⴑ ⴑ
+Ⴒ ⴒ
+Ⴓ ⴓ
+Ⴔ ⴔ
+Ⴕ ⴕ
+Ⴖ ⴖ
+Ⴗ ⴗ
+Ⴘ ⴘ
+Ⴙ ⴙ
+Ⴚ ⴚ
+Ⴛ ⴛ
+Ⴜ ⴜ
+Ⴝ ⴝ
+Ⴞ ⴞ
+Ⴟ ⴟ
+Ⴠ ⴠ
+Ⴡ ⴡ
+Ⴢ ⴢ
+Ⴣ ⴣ
+Ⴤ ⴤ
+Ⴥ ⴥ
+Ḁ ḁ
+Ḃ ḃ
+Ḅ ḅ
+Ḇ ḇ
+Ḉ ḉ
+Ḋ ḋ
+Ḍ ḍ
+Ḏ ḏ
+Ḑ ḑ
+Ḓ ḓ
+Ḕ ḕ
+Ḗ ḗ
+Ḙ ḙ
+Ḛ ḛ
+Ḝ ḝ
+Ḟ ḟ
+Ḡ ḡ
+Ḣ ḣ
+Ḥ ḥ
+Ḧ ḧ
+Ḩ ḩ
+Ḫ ḫ
+Ḭ ḭ
+Ḯ ḯ
+Ḱ ḱ
+Ḳ ḳ
+Ḵ ḵ
+Ḷ ḷ
+Ḹ ḹ
+Ḻ ḻ
+Ḽ ḽ
+Ḿ ḿ
+Ṁ ṁ
+Ṃ ṃ
+Ṅ ṅ
+Ṇ ṇ
+Ṉ ṉ
+Ṋ ṋ
+Ṍ ṍ
+Ṏ ṏ
+Ṑ ṑ
+Ṓ ṓ
+Ṕ ṕ
+Ṗ ṗ
+Ṙ ṙ
+Ṛ ṛ
+Ṝ ṝ
+Ṟ ṟ
+Ṡ ṡ
+Ṣ ṣ
+Ṥ ṥ
+Ṧ ṧ
+Ṩ ṩ
+Ṫ ṫ
+Ṭ ṭ
+Ṯ ṯ
+Ṱ ṱ
+Ṳ ṳ
+Ṵ ṵ
+Ṷ ṷ
+Ṹ ṹ
+Ṻ ṻ
+Ṽ ṽ
+Ṿ ṿ
+Ẁ ẁ
+Ẃ ẃ
+Ẅ ẅ
+Ẇ ẇ
+Ẉ ẉ
+Ẋ ẋ
+Ẍ ẍ
+Ẏ ẏ
+Ẑ ẑ
+Ẓ ẓ
+Ẕ ẕ
+ẖ ẖ
+ẗ ẗ
+ẘ ẘ
+ẙ ẙ
+ẚ aʾ
+ẛ ṡ
+Ạ ạ
+Ả ả
+Ấ ấ
+Ầ ầ
+Ẩ ẩ
+Ẫ ẫ
+Ậ ậ
+Ắ ắ
+Ằ ằ
+Ẳ ẳ
+Ẵ ẵ
+Ặ ặ
+Ẹ ẹ
+Ẻ ẻ
+Ẽ ẽ
+Ế ế
+Ề ề
+Ể ể
+Ễ ễ
+Ệ ệ
+Ỉ ỉ
+Ị ị
+Ọ ọ
+Ỏ ỏ
+Ố ố
+Ồ ồ
+Ổ ổ
+Ỗ ỗ
+Ộ ộ
+Ớ ớ
+Ờ ờ
+Ở ở
+Ỡ ỡ
+Ợ ợ
+Ụ ụ
+Ủ ủ
+Ứ ứ
+Ừ ừ
+Ử ử
+Ữ ữ
+Ự ự
+Ỳ ỳ
+Ỵ ỵ
+Ỷ ỷ
+Ỹ ỹ
+Ἀ ἀ
+Ἁ ἁ
+Ἂ ἂ
+Ἃ ἃ
+Ἄ ἄ
+Ἅ ἅ
+Ἆ ἆ
+Ἇ ἇ
+Ἐ ἐ
+Ἑ ἑ
+Ἒ ἒ
+Ἓ ἓ
+Ἔ ἔ
+Ἕ ἕ
+Ἠ ἠ
+Ἡ ἡ
+Ἢ ἢ
+Ἣ ἣ
+Ἤ ἤ
+Ἥ ἥ
+Ἦ ἦ
+Ἧ ἧ
+Ἰ ἰ
+Ἱ ἱ
+Ἲ ἲ
+Ἳ ἳ
+Ἴ ἴ
+Ἵ ἵ
+Ἶ ἶ
+Ἷ ἷ
+Ὀ ὀ
+Ὁ ὁ
+Ὂ ὂ
+Ὃ ὃ
+Ὄ ὄ
+Ὅ ὅ
+ὐ ὐ
+ὒ ὒ
+ὔ ὔ
+ὖ ὖ
+Ὑ ὑ
+Ὓ ὓ
+Ὕ ὕ
+Ὗ ὗ
+Ὠ ὠ
+Ὡ ὡ
+Ὢ ὢ
+Ὣ ὣ
+Ὤ ὤ
+Ὥ ὥ
+Ὦ ὦ
+Ὧ ὧ
+ᾀ ἀι
+ᾁ ἁι
+ᾂ ἂι
+ᾃ ἃι
+ᾄ ἄι
+ᾅ ἅι
+ᾆ ἆι
+ᾇ ἇι
+ᾈ ἀι
+ᾉ ἁι
+ᾊ ἂι
+ᾋ ἃι
+ᾌ ἄι
+ᾍ ἅι
+ᾎ ἆι
+ᾏ ἇι
+ᾐ ἠι
+ᾑ ἡι
+ᾒ ἢι
+ᾓ ἣι
+ᾔ ἤι
+ᾕ ἥι
+ᾖ ἦι
+ᾗ ἧι
+ᾘ ἠι
+ᾙ ἡι
+ᾚ ἢι
+ᾛ ἣι
+ᾜ ἤι
+ᾝ ἥι
+ᾞ ἦι
+ᾟ ἧι
+ᾠ ὠι
+ᾡ ὡι
+ᾢ ὢι
+ᾣ ὣι
+ᾤ ὤι
+ᾥ ὥι
+ᾦ ὦι
+ᾧ ὧι
+ᾨ ὠι
+ᾩ ὡι
+ᾪ ὢι
+ᾫ ὣι
+ᾬ ὤι
+ᾭ ὥι
+ᾮ ὦι
+ᾯ ὧι
+ᾲ ὰι
+ᾳ αι
+ᾴ άι
+ᾶ ᾶ
+ᾷ ᾶι
+Ᾰ ᾰ
+Ᾱ ᾱ
+Ὰ ὰ
+Ά ά
+ᾼ αι
+ι ι
+ῂ ὴι
+ῃ ηι
+ῄ ήι
+ῆ ῆ
+ῇ ῆι
+Ὲ ὲ
+Έ έ
+Ὴ ὴ
+Ή ή
+ῌ ηι
+ῒ ῒ
+ΐ ΐ
+ῖ ῖ
+ῗ ῗ
+Ῐ ῐ
+Ῑ ῑ
+Ὶ ὶ
+Ί ί
+ῢ ῢ
+ΰ ΰ
+ῤ ῤ
+ῦ ῦ
+ῧ ῧ
+Ῠ ῠ
+Ῡ ῡ
+Ὺ ὺ
+Ύ ύ
+Ῥ ῥ
+ῲ ὼι
+ῳ ωι
+ῴ ώι
+ῶ ῶ
+ῷ ῶι
+Ὸ ὸ
+Ό ό
+Ὼ ὼ
+Ώ ώ
+ῼ ωι
+Ω ω
+K k
+Å å
+Ⅎ ⅎ
+Ⅰ ⅰ
+Ⅱ ⅱ
+Ⅲ ⅲ
+Ⅳ ⅳ
+Ⅴ ⅴ
+Ⅵ ⅵ
+Ⅶ ⅶ
+Ⅷ ⅷ
+Ⅸ ⅸ
+Ⅹ ⅹ
+Ⅺ ⅺ
+Ⅻ ⅻ
+Ⅼ ⅼ
+Ⅽ ⅽ
+Ⅾ ⅾ
+Ⅿ ⅿ
+Ↄ ↄ
+Ⓐ ⓐ
+Ⓑ ⓑ
+Ⓒ ⓒ
+Ⓓ ⓓ
+Ⓔ ⓔ
+Ⓕ ⓕ
+Ⓖ ⓖ
+Ⓗ ⓗ
+Ⓘ ⓘ
+Ⓙ ⓙ
+Ⓚ ⓚ
+Ⓛ ⓛ
+Ⓜ ⓜ
+Ⓝ ⓝ
+Ⓞ ⓞ
+Ⓟ ⓟ
+Ⓠ ⓠ
+Ⓡ ⓡ
+Ⓢ ⓢ
+Ⓣ ⓣ
+Ⓤ ⓤ
+Ⓥ ⓥ
+Ⓦ ⓦ
+Ⓧ ⓧ
+Ⓨ ⓨ
+Ⓩ ⓩ
+Ⰰ ⰰ
+Ⰱ ⰱ
+Ⰲ ⰲ
+Ⰳ ⰳ
+Ⰴ ⰴ
+Ⰵ ⰵ
+Ⰶ ⰶ
+Ⰷ ⰷ
+Ⰸ ⰸ
+Ⰹ ⰹ
+Ⰺ ⰺ
+Ⰻ ⰻ
+Ⰼ ⰼ
+Ⰽ ⰽ
+Ⰾ ⰾ
+Ⰿ ⰿ
+Ⱀ ⱀ
+Ⱁ ⱁ
+Ⱂ ⱂ
+Ⱃ ⱃ
+Ⱄ ⱄ
+Ⱅ ⱅ
+Ⱆ ⱆ
+Ⱇ ⱇ
+Ⱈ ⱈ
+Ⱉ ⱉ
+Ⱊ ⱊ
+Ⱋ ⱋ
+Ⱌ ⱌ
+Ⱍ ⱍ
+Ⱎ ⱎ
+Ⱏ ⱏ
+Ⱐ ⱐ
+Ⱑ ⱑ
+Ⱒ ⱒ
+Ⱓ ⱓ
+Ⱔ ⱔ
+Ⱕ ⱕ
+Ⱖ ⱖ
+Ⱗ ⱗ
+Ⱘ ⱘ
+Ⱙ ⱙ
+Ⱚ ⱚ
+Ⱛ ⱛ
+Ⱜ ⱜ
+Ⱝ ⱝ
+Ⱞ ⱞ
+Ⱡ ⱡ
+Ɫ ɫ
+Ᵽ ᵽ
+Ɽ ɽ
+Ⱨ ⱨ
+Ⱪ ⱪ
+Ⱬ ⱬ
+Ⱶ ⱶ
+Ⲁ ⲁ
+Ⲃ ⲃ
+Ⲅ ⲅ
+Ⲇ ⲇ
+Ⲉ ⲉ
+Ⲋ ⲋ
+Ⲍ ⲍ
+Ⲏ ⲏ
+Ⲑ ⲑ
+Ⲓ ⲓ
+Ⲕ ⲕ
+Ⲗ ⲗ
+Ⲙ ⲙ
+Ⲛ ⲛ
+Ⲝ ⲝ
+Ⲟ ⲟ
+Ⲡ ⲡ
+Ⲣ ⲣ
+Ⲥ ⲥ
+Ⲧ ⲧ
+Ⲩ ⲩ
+Ⲫ ⲫ
+Ⲭ ⲭ
+Ⲯ ⲯ
+Ⲱ ⲱ
+Ⲳ ⲳ
+Ⲵ ⲵ
+Ⲷ ⲷ
+Ⲹ ⲹ
+Ⲻ ⲻ
+Ⲽ ⲽ
+Ⲿ ⲿ
+Ⳁ ⳁ
+Ⳃ ⳃ
+Ⳅ ⳅ
+Ⳇ ⳇ
+Ⳉ ⳉ
+Ⳋ ⳋ
+Ⳍ ⳍ
+Ⳏ ⳏ
+Ⳑ ⳑ
+Ⳓ ⳓ
+Ⳕ ⳕ
+Ⳗ ⳗ
+Ⳙ ⳙ
+Ⳛ ⳛ
+Ⳝ ⳝ
+Ⳟ ⳟ
+Ⳡ ⳡ
+Ⳣ ⳣ
+ff ff
+fi fi
+fl fl
+ffi ffi
+ffl ffl
+ſt st
+st st
+ﬓ մն
+ﬔ մե
+ﬕ մի
+ﬖ վն
+ﬗ մխ
+A a
+B b
+C c
+D d
+E e
+F f
+G g
+H h
+I i
+J j
+K k
+L l
+M m
+N n
+O o
+P p
+Q q
+R r
+S s
+T t
+U u
+V v
+W w
+X x
+Y y
+Z z
+𐐀 𐐨
+𐐁 𐐩
+𐐂 𐐪
+𐐃 𐐫
+𐐄 𐐬
+𐐅 𐐭
+𐐆 𐐮
+𐐇 𐐯
+𐐈 𐐰
+𐐉 𐐱
+𐐊 𐐲
+𐐋 𐐳
+𐐌 𐐴
+𐐍 𐐵
+𐐎 𐐶
+𐐏 𐐷
+𐐐 𐐸
+𐐑 𐐹
+𐐒 𐐺
+𐐓 𐐻
+𐐔 𐐼
+𐐕 𐐽
+𐐖 𐐾
+𐐗 𐐿
+𐐘 𐑀
+𐐙 𐑁
+𐐚 𐑂
+𐐛 𐑃
+𐐜 𐑄
+𐐝 𐑅
+𐐞 𐑆
+𐐟 𐑇
+𐐠 𐑈
+𐐡 𐑉
+𐐢 𐑊
+𐐣 𐑋
+𐐤 𐑌
+𐐥 𐑍
+𐐦 𐑎
+𐐧 𐑏
diff --git a/trunk/tests/casemap.txt b/trunk/tests/casemap.txt
new file mode 100644
index 000000000..49aa0ff08
--- /dev/null
+++ b/trunk/tests/casemap.txt
@@ -0,0 +1,3031 @@
+# Test cases generated from Unicode 5.0 data
+# by gen-case-tests.pl. Do not edit.
+#
+# Some special hand crafted tests
+#
+tr_TR i i İ İ # i => LATIN CAPITAL LETTER I WITH DOT ABOVE
+tr_TR I ı I I # I => LATIN SMALL LETTER DOTLESS I
+tr_TR İ i İ İ # I => LATIN SMALL LETTER DOTLESS I
+tr_TR.UTF-8 i i İ İ # i => LATIN CAPITAL LETTER I WITH DOT ABOVE
+tr_TR.UTF-8 I ı I I # I => LATIN SMALL LETTER DOTLESS I
+tr_TR.UTF-8 İ i İ İ # I => LATIN SMALL LETTER DOTLESS I
+# Test reordering of YPOGEGRAMMENI across other accents
+ ᾁ ᾁ ᾉ ἉΙ
+ ᾁ ᾁ ᾉ ἉΙ
+# Handling of final and nonfinal sigma
+ ΜΆΙΟΣ μάιος Μάιος ΜΆΙΟΣ
+ ΜΆΙΟΣ μάιος Μάιος ΜΆΙΟΣ
+ ΣΙΓΜΑ σιγμα Σιγμα ΣΙΓΜΑ
+# Lithuanian rule of i followed by letter with dot. Not at all sure
+# about the titlecase part here
+lt_LT iė iė Ie IE
+lt_LT iė iė Ie IE
+lt_LT Ì i̇̀ Ì Ì # LATIN CAPITAL LETTER I WITH GRAVE
+lt_LT Í i̇́ Í Í # LATIN CAPITAL LETTER I WITH ACUTE
+lt_LT Ĩ i̇̃ Ĩ Ĩ # LATIN CAPITAL LETTER I WITH TILDE
+lt_LT Í i̇́ Í Í # LATIN CAPITAL LETTER I (with acute accent)
+lt_LT Ì i̇̀ Ì Ì # LATIN CAPITAL LETTER I (with grave accent)
+lt_LT Ĩ i̇̃ Ĩ Ĩ # LATIN CAPITAL LETTER I (with tilde above)
+lt_LT Į́ į̇́ Į́ Į́ # LATIN CAPITAL LETTER I (with ogonek and acute accent)
+lt_LT J́ j̇́ J́ J́ # LATIN CAPITAL LETTER J (with acute accent)
+lt_LT Į́ į̇́ Į́ Į́ # LATIN CAPITAL LETTER I WITH OGONEK (with acute accent)
+lt_LT.UTF-8 iė iė Ie IE
+lt_LT.UTF-8 iė iė Ie IE
+lt_LT.UTF-8 Ì i̇̀ Ì Ì # LATIN CAPITAL LETTER I WITH GRAVE
+lt_LT.UTF-8 Í i̇́ Í Í # LATIN CAPITAL LETTER I WITH ACUTE
+lt_LT.UTF-8 Ĩ i̇̃ Ĩ Ĩ # LATIN CAPITAL LETTER I WITH TILDE
+lt_LT.UTF-8 Í i̇́ Í Í # LATIN CAPITAL LETTER I (with acute accent)
+lt_LT.UTF-8 Ì i̇̀ Ì Ì # LATIN CAPITAL LETTER I (with grave accent)
+lt_LT.UTF-8 Ĩ i̇̃ Ĩ Ĩ # LATIN CAPITAL LETTER I (with tilde above)
+lt_LT.UTF-8 Į́ į̇́ Į́ Į́ # LATIN CAPITAL LETTER I (with ogonek and acute accent)
+lt_LT.UTF-8 J́ j̇́ J́ J́ # LATIN CAPITAL LETTER J (with acute accent)
+lt_LT.UTF-8 Į́ į̇́ Į́ Į́ # LATIN CAPITAL LETTER I WITH OGONEK (with acute accent)
+# Special case not at initial position
+ affl affl Affl AFFL # FB04
+#
+# Now the automatic tests
+#
+ A a A # 41
+ B b B # 42
+ C c C # 43
+ D d D # 44
+ E e E # 45
+ F f F # 46
+ G g G # 47
+ H h H # 48
+ I i I # 49
+ J j J # 4A
+ K k K # 4B
+ L l L # 4C
+ M m M # 4D
+ N n N # 4E
+ O o O # 4F
+ P p P # 50
+ Q q Q # 51
+ R r R # 52
+ S s S # 53
+ T t T # 54
+ U u U # 55
+ V v V # 56
+ W w W # 57
+ X x X # 58
+ Y y Y # 59
+ Z z Z # 5A
+ a a A A # 61
+ b b B B # 62
+ c c C C # 63
+ d d D D # 64
+ e e E E # 65
+ f f F F # 66
+ g g G G # 67
+ h h H H # 68
+ i i I I # 69
+ j j J J # 6A
+ k k K K # 6B
+ l l L L # 6C
+ m m M M # 6D
+ n n N N # 6E
+ o o O O # 6F
+ p p P P # 70
+ q q Q Q # 71
+ r r R R # 72
+ s s S S # 73
+ t t T T # 74
+ u u U U # 75
+ v v V V # 76
+ w w W W # 77
+ x x X X # 78
+ y y Y Y # 79
+ z z Z Z # 7A
+ ª ª # AA
+ µ µ Μ Μ # B5
+ º º # BA
+ À à À # C0
+ Á á Á # C1
+ Â â Â # C2
+ Ã ã Ã # C3
+ Ä ä Ä # C4
+ Å å Å # C5
+ Æ æ Æ # C6
+ Ç ç Ç # C7
+ È è È # C8
+ É é É # C9
+ Ê ê Ê # CA
+ Ë ë Ë # CB
+ Ì ì Ì # CC
+ Í í Í # CD
+ Î î Î # CE
+ Ï ï Ï # CF
+ Ð ð Ð # D0
+ Ñ ñ Ñ # D1
+ Ò ò Ò # D2
+ Ó ó Ó # D3
+ Ô ô Ô # D4
+ Õ õ Õ # D5
+ Ö ö Ö # D6
+ Ø ø Ø # D8
+ Ù ù Ù # D9
+ Ú ú Ú # DA
+ Û û Û # DB
+ Ü ü Ü # DC
+ Ý ý Ý # DD
+ Þ þ Þ # DE
+ ß ß Ss SS # DF
+ à à À À # E0
+ á á Á Á # E1
+ â â Â Â # E2
+ ã ã Ã Ã # E3
+ ä ä Ä Ä # E4
+ å å Å Å # E5
+ æ æ Æ Æ # E6
+ ç ç Ç Ç # E7
+ è è È È # E8
+ é é É É # E9
+ ê ê Ê Ê # EA
+ ë ë Ë Ë # EB
+ ì ì Ì Ì # EC
+ í í Í Í # ED
+ î î Î Î # EE
+ ï ï Ï Ï # EF
+ ð ð Ð Ð # F0
+ ñ ñ Ñ Ñ # F1
+ ò ò Ò Ò # F2
+ ó ó Ó Ó # F3
+ ô ô Ô Ô # F4
+ õ õ Õ Õ # F5
+ ö ö Ö Ö # F6
+ ø ø Ø Ø # F8
+ ù ù Ù Ù # F9
+ ú ú Ú Ú # FA
+ û û Û Û # FB
+ ü ü Ü Ü # FC
+ ý ý Ý Ý # FD
+ þ þ Þ Þ # FE
+ ÿ ÿ Ÿ Ÿ # FF
+ Ā ā Ā # 100
+ ā ā Ā Ā # 101
+ Ă ă Ă # 102
+ ă ă Ă Ă # 103
+ Ą ą Ą # 104
+ ą ą Ą Ą # 105
+ Ć ć Ć # 106
+ ć ć Ć Ć # 107
+ Ĉ ĉ Ĉ # 108
+ ĉ ĉ Ĉ Ĉ # 109
+ Ċ ċ Ċ # 10A
+ ċ ċ Ċ Ċ # 10B
+ Č č Č # 10C
+ č č Č Č # 10D
+ Ď ď Ď # 10E
+ ď ď Ď Ď # 10F
+ Đ đ Đ # 110
+ đ đ Đ Đ # 111
+ Ē ē Ē # 112
+ ē ē Ē Ē # 113
+ Ĕ ĕ Ĕ # 114
+ ĕ ĕ Ĕ Ĕ # 115
+ Ė ė Ė # 116
+ ė ė Ė Ė # 117
+ Ę ę Ę # 118
+ ę ę Ę Ę # 119
+ Ě ě Ě # 11A
+ ě ě Ě Ě # 11B
+ Ĝ ĝ Ĝ # 11C
+ ĝ ĝ Ĝ Ĝ # 11D
+ Ğ ğ Ğ # 11E
+ ğ ğ Ğ Ğ # 11F
+ Ġ ġ Ġ # 120
+ ġ ġ Ġ Ġ # 121
+ Ģ ģ Ģ # 122
+ ģ ģ Ģ Ģ # 123
+ Ĥ ĥ Ĥ # 124
+ ĥ ĥ Ĥ Ĥ # 125
+ Ħ ħ Ħ # 126
+ ħ ħ Ħ Ħ # 127
+ Ĩ ĩ Ĩ # 128
+ ĩ ĩ Ĩ Ĩ # 129
+ Ī ī Ī # 12A
+ ī ī Ī Ī # 12B
+ Ĭ ĭ Ĭ # 12C
+ ĭ ĭ Ĭ Ĭ # 12D
+ Į į Į # 12E
+ į į Į Į # 12F
+ İ i̇ İ İ # 130
+ ı ı I I # 131
+ IJ ij IJ # 132
+ ij ij IJ IJ # 133
+ Ĵ ĵ Ĵ # 134
+ ĵ ĵ Ĵ Ĵ # 135
+ Ķ ķ Ķ # 136
+ ķ ķ Ķ Ķ # 137
+ ĸ ĸ # 138
+ Ĺ ĺ Ĺ # 139
+ ĺ ĺ Ĺ Ĺ # 13A
+ Ļ ļ Ļ # 13B
+ ļ ļ Ļ Ļ # 13C
+ Ľ ľ Ľ # 13D
+ ľ ľ Ľ Ľ # 13E
+ Ŀ ŀ Ŀ # 13F
+ ŀ ŀ Ŀ Ŀ # 140
+ Ł ł Ł # 141
+ ł ł Ł Ł # 142
+ Ń ń Ń # 143
+ ń ń Ń Ń # 144
+ Ņ ņ Ņ # 145
+ ņ ņ Ņ Ņ # 146
+ Ň ň Ň # 147
+ ň ň Ň Ň # 148
+ ʼn ʼn ʼN ʼN # 149
+ Ŋ ŋ Ŋ # 14A
+ ŋ ŋ Ŋ Ŋ # 14B
+ Ō ō Ō # 14C
+ ō ō Ō Ō # 14D
+ Ŏ ŏ Ŏ # 14E
+ ŏ ŏ Ŏ Ŏ # 14F
+ Ő ő Ő # 150
+ ő ő Ő Ő # 151
+ Œ œ Œ # 152
+ œ œ Œ Œ # 153
+ Ŕ ŕ Ŕ # 154
+ ŕ ŕ Ŕ Ŕ # 155
+ Ŗ ŗ Ŗ # 156
+ ŗ ŗ Ŗ Ŗ # 157
+ Ř ř Ř # 158
+ ř ř Ř Ř # 159
+ Ś ś Ś # 15A
+ ś ś Ś Ś # 15B
+ Ŝ ŝ Ŝ # 15C
+ ŝ ŝ Ŝ Ŝ # 15D
+ Ş ş Ş # 15E
+ ş ş Ş Ş # 15F
+ Š š Š # 160
+ š š Š Š # 161
+ Ţ ţ Ţ # 162
+ ţ ţ Ţ Ţ # 163
+ Ť ť Ť # 164
+ ť ť Ť Ť # 165
+ Ŧ ŧ Ŧ # 166
+ ŧ ŧ Ŧ Ŧ # 167
+ Ũ ũ Ũ # 168
+ ũ ũ Ũ Ũ # 169
+ Ū ū Ū # 16A
+ ū ū Ū Ū # 16B
+ Ŭ ŭ Ŭ # 16C
+ ŭ ŭ Ŭ Ŭ # 16D
+ Ů ů Ů # 16E
+ ů ů Ů Ů # 16F
+ Ű ű Ű # 170
+ ű ű Ű Ű # 171
+ Ų ų Ų # 172
+ ų ų Ų Ų # 173
+ Ŵ ŵ Ŵ # 174
+ ŵ ŵ Ŵ Ŵ # 175
+ Ŷ ŷ Ŷ # 176
+ ŷ ŷ Ŷ Ŷ # 177
+ Ÿ ÿ Ÿ # 178
+ Ź ź Ź # 179
+ ź ź Ź Ź # 17A
+ Ż ż Ż # 17B
+ ż ż Ż Ż # 17C
+ Ž ž Ž # 17D
+ ž ž Ž Ž # 17E
+ ſ ſ S S # 17F
+ ƀ ƀ Ƀ Ƀ # 180
+ Ɓ ɓ Ɓ # 181
+ Ƃ ƃ Ƃ # 182
+ ƃ ƃ Ƃ Ƃ # 183
+ Ƅ ƅ Ƅ # 184
+ ƅ ƅ Ƅ Ƅ # 185
+ Ɔ ɔ Ɔ # 186
+ Ƈ ƈ Ƈ # 187
+ ƈ ƈ Ƈ Ƈ # 188
+ Ɖ ɖ Ɖ # 189
+ Ɗ ɗ Ɗ # 18A
+ Ƌ ƌ Ƌ # 18B
+ ƌ ƌ Ƌ Ƌ # 18C
+ ƍ ƍ # 18D
+ Ǝ ǝ Ǝ # 18E
+ Ə ə Ə # 18F
+ Ɛ ɛ Ɛ # 190
+ Ƒ ƒ Ƒ # 191
+ ƒ ƒ Ƒ Ƒ # 192
+ Ɠ ɠ Ɠ # 193
+ Ɣ ɣ Ɣ # 194
+ ƕ ƕ Ƕ Ƕ # 195
+ Ɩ ɩ Ɩ # 196
+ Ɨ ɨ Ɨ # 197
+ Ƙ ƙ Ƙ # 198
+ ƙ ƙ Ƙ Ƙ # 199
+ ƚ ƚ Ƚ Ƚ # 19A
+ ƛ ƛ # 19B
+ Ɯ ɯ Ɯ # 19C
+ Ɲ ɲ Ɲ # 19D
+ ƞ ƞ Ƞ Ƞ # 19E
+ Ɵ ɵ Ɵ # 19F
+ Ơ ơ Ơ # 1A0
+ ơ ơ Ơ Ơ # 1A1
+ Ƣ ƣ Ƣ # 1A2
+ ƣ ƣ Ƣ Ƣ # 1A3
+ Ƥ ƥ Ƥ # 1A4
+ ƥ ƥ Ƥ Ƥ # 1A5
+ Ʀ ʀ Ʀ # 1A6
+ Ƨ ƨ Ƨ # 1A7
+ ƨ ƨ Ƨ Ƨ # 1A8
+ Ʃ ʃ Ʃ # 1A9
+ ƪ ƪ # 1AA
+ ƫ ƫ # 1AB
+ Ƭ ƭ Ƭ # 1AC
+ ƭ ƭ Ƭ Ƭ # 1AD
+ Ʈ ʈ Ʈ # 1AE
+ Ư ư Ư # 1AF
+ ư ư Ư Ư # 1B0
+ Ʊ ʊ Ʊ # 1B1
+ Ʋ ʋ Ʋ # 1B2
+ Ƴ ƴ Ƴ # 1B3
+ ƴ ƴ Ƴ Ƴ # 1B4
+ Ƶ ƶ Ƶ # 1B5
+ ƶ ƶ Ƶ Ƶ # 1B6
+ Ʒ ʒ Ʒ # 1B7
+ Ƹ ƹ Ƹ # 1B8
+ ƹ ƹ Ƹ Ƹ # 1B9
+ ƺ ƺ # 1BA
+ Ƽ ƽ Ƽ # 1BC
+ ƽ ƽ Ƽ Ƽ # 1BD
+ ƾ ƾ # 1BE
+ ƿ ƿ Ƿ Ƿ # 1BF
+ DŽ dž Dž DŽ # 1C4
+ Dž dž dž DŽ # 1C5
+ dž dž Dž DŽ # 1C6
+ LJ lj Lj LJ # 1C7
+ Lj lj lj LJ # 1C8
+ lj lj Lj LJ # 1C9
+ NJ nj Nj NJ # 1CA
+ Nj nj nj NJ # 1CB
+ nj nj Nj NJ # 1CC
+ Ǎ ǎ Ǎ # 1CD
+ ǎ ǎ Ǎ Ǎ # 1CE
+ Ǐ ǐ Ǐ # 1CF
+ ǐ ǐ Ǐ Ǐ # 1D0
+ Ǒ ǒ Ǒ # 1D1
+ ǒ ǒ Ǒ Ǒ # 1D2
+ Ǔ ǔ Ǔ # 1D3
+ ǔ ǔ Ǔ Ǔ # 1D4
+ Ǖ ǖ Ǖ # 1D5
+ ǖ ǖ Ǖ Ǖ # 1D6
+ Ǘ ǘ Ǘ # 1D7
+ ǘ ǘ Ǘ Ǘ # 1D8
+ Ǚ ǚ Ǚ # 1D9
+ ǚ ǚ Ǚ Ǚ # 1DA
+ Ǜ ǜ Ǜ # 1DB
+ ǜ ǜ Ǜ Ǜ # 1DC
+ ǝ ǝ Ǝ Ǝ # 1DD
+ Ǟ ǟ Ǟ # 1DE
+ ǟ ǟ Ǟ Ǟ # 1DF
+ Ǡ ǡ Ǡ # 1E0
+ ǡ ǡ Ǡ Ǡ # 1E1
+ Ǣ ǣ Ǣ # 1E2
+ ǣ ǣ Ǣ Ǣ # 1E3
+ Ǥ ǥ Ǥ # 1E4
+ ǥ ǥ Ǥ Ǥ # 1E5
+ Ǧ ǧ Ǧ # 1E6
+ ǧ ǧ Ǧ Ǧ # 1E7
+ Ǩ ǩ Ǩ # 1E8
+ ǩ ǩ Ǩ Ǩ # 1E9
+ Ǫ ǫ Ǫ # 1EA
+ ǫ ǫ Ǫ Ǫ # 1EB
+ Ǭ ǭ Ǭ # 1EC
+ ǭ ǭ Ǭ Ǭ # 1ED
+ Ǯ ǯ Ǯ # 1EE
+ ǯ ǯ Ǯ Ǯ # 1EF
+ ǰ ǰ J̌ J̌ # 1F0
+ DZ dz Dz DZ # 1F1
+ Dz dz dz DZ # 1F2
+ dz dz Dz DZ # 1F3
+ Ǵ ǵ Ǵ # 1F4
+ ǵ ǵ Ǵ Ǵ # 1F5
+ Ƕ ƕ Ƕ # 1F6
+ Ƿ ƿ Ƿ # 1F7
+ Ǹ ǹ Ǹ # 1F8
+ ǹ ǹ Ǹ Ǹ # 1F9
+ Ǻ ǻ Ǻ # 1FA
+ ǻ ǻ Ǻ Ǻ # 1FB
+ Ǽ ǽ Ǽ # 1FC
+ ǽ ǽ Ǽ Ǽ # 1FD
+ Ǿ ǿ Ǿ # 1FE
+ ǿ ǿ Ǿ Ǿ # 1FF
+ Ȁ ȁ Ȁ # 200
+ ȁ ȁ Ȁ Ȁ # 201
+ Ȃ ȃ Ȃ # 202
+ ȃ ȃ Ȃ Ȃ # 203
+ Ȅ ȅ Ȅ # 204
+ ȅ ȅ Ȅ Ȅ # 205
+ Ȇ ȇ Ȇ # 206
+ ȇ ȇ Ȇ Ȇ # 207
+ Ȉ ȉ Ȉ # 208
+ ȉ ȉ Ȉ Ȉ # 209
+ Ȋ ȋ Ȋ # 20A
+ ȋ ȋ Ȋ Ȋ # 20B
+ Ȍ ȍ Ȍ # 20C
+ ȍ ȍ Ȍ Ȍ # 20D
+ Ȏ ȏ Ȏ # 20E
+ ȏ ȏ Ȏ Ȏ # 20F
+ Ȑ ȑ Ȑ # 210
+ ȑ ȑ Ȑ Ȑ # 211
+ Ȓ ȓ Ȓ # 212
+ ȓ ȓ Ȓ Ȓ # 213
+ Ȕ ȕ Ȕ # 214
+ ȕ ȕ Ȕ Ȕ # 215
+ Ȗ ȗ Ȗ # 216
+ ȗ ȗ Ȗ Ȗ # 217
+ Ș ș Ș # 218
+ ș ș Ș Ș # 219
+ Ț ț Ț # 21A
+ ț ț Ț Ț # 21B
+ Ȝ ȝ Ȝ # 21C
+ ȝ ȝ Ȝ Ȝ # 21D
+ Ȟ ȟ Ȟ # 21E
+ ȟ ȟ Ȟ Ȟ # 21F
+ Ƞ ƞ Ƞ # 220
+ ȡ ȡ # 221
+ Ȣ ȣ Ȣ # 222
+ ȣ ȣ Ȣ Ȣ # 223
+ Ȥ ȥ Ȥ # 224
+ ȥ ȥ Ȥ Ȥ # 225
+ Ȧ ȧ Ȧ # 226
+ ȧ ȧ Ȧ Ȧ # 227
+ Ȩ ȩ Ȩ # 228
+ ȩ ȩ Ȩ Ȩ # 229
+ Ȫ ȫ Ȫ # 22A
+ ȫ ȫ Ȫ Ȫ # 22B
+ Ȭ ȭ Ȭ # 22C
+ ȭ ȭ Ȭ Ȭ # 22D
+ Ȯ ȯ Ȯ # 22E
+ ȯ ȯ Ȯ Ȯ # 22F
+ Ȱ ȱ Ȱ # 230
+ ȱ ȱ Ȱ Ȱ # 231
+ Ȳ ȳ Ȳ # 232
+ ȳ ȳ Ȳ Ȳ # 233
+ ȴ ȴ # 234
+ ȵ ȵ # 235
+ ȶ ȶ # 236
+ ȷ ȷ # 237
+ ȸ ȸ # 238
+ ȹ ȹ # 239
+ Ⱥ ⱥ Ⱥ # 23A
+ Ȼ ȼ Ȼ # 23B
+ ȼ ȼ Ȼ Ȼ # 23C
+ Ƚ ƚ Ƚ # 23D
+ Ⱦ ⱦ Ⱦ # 23E
+ ȿ ȿ # 23F
+ ɀ ɀ # 240
+ Ɂ ɂ Ɂ # 241
+ ɂ ɂ Ɂ Ɂ # 242
+ Ƀ ƀ Ƀ # 243
+ Ʉ ʉ Ʉ # 244
+ Ʌ ʌ Ʌ # 245
+ Ɇ ɇ Ɇ # 246
+ ɇ ɇ Ɇ Ɇ # 247
+ Ɉ ɉ Ɉ # 248
+ ɉ ɉ Ɉ Ɉ # 249
+ Ɋ ɋ Ɋ # 24A
+ ɋ ɋ Ɋ Ɋ # 24B
+ Ɍ ɍ Ɍ # 24C
+ ɍ ɍ Ɍ Ɍ # 24D
+ Ɏ ɏ Ɏ # 24E
+ ɏ ɏ Ɏ Ɏ # 24F
+ ɐ ɐ # 250
+ ɑ ɑ # 251
+ ɒ ɒ # 252
+ ɓ ɓ Ɓ Ɓ # 253
+ ɔ ɔ Ɔ Ɔ # 254
+ ɕ ɕ # 255
+ ɖ ɖ Ɖ Ɖ # 256
+ ɗ ɗ Ɗ Ɗ # 257
+ ɘ ɘ # 258
+ ə ə Ə Ə # 259
+ ɚ ɚ # 25A
+ ɛ ɛ Ɛ Ɛ # 25B
+ ɜ ɜ # 25C
+ ɝ ɝ # 25D
+ ɞ ɞ # 25E
+ ɟ ɟ # 25F
+ ɠ ɠ Ɠ Ɠ # 260
+ ɡ ɡ # 261
+ ɢ ɢ # 262
+ ɣ ɣ Ɣ Ɣ # 263
+ ɤ ɤ # 264
+ ɥ ɥ # 265
+ ɦ ɦ # 266
+ ɧ ɧ # 267
+ ɨ ɨ Ɨ Ɨ # 268
+ ɩ ɩ Ɩ Ɩ # 269
+ ɪ ɪ # 26A
+ ɫ ɫ Ɫ Ɫ # 26B
+ ɬ ɬ # 26C
+ ɭ ɭ # 26D
+ ɮ ɮ # 26E
+ ɯ ɯ Ɯ Ɯ # 26F
+ ɰ ɰ # 270
+ ɱ ɱ # 271
+ ɲ ɲ Ɲ Ɲ # 272
+ ɳ ɳ # 273
+ ɴ ɴ # 274
+ ɵ ɵ Ɵ Ɵ # 275
+ ɶ ɶ # 276
+ ɷ ɷ # 277
+ ɸ ɸ # 278
+ ɹ ɹ # 279
+ ɺ ɺ # 27A
+ ɻ ɻ # 27B
+ ɼ ɼ # 27C
+ ɽ ɽ Ɽ Ɽ # 27D
+ ɾ ɾ # 27E
+ ɿ ɿ # 27F
+ ʀ ʀ Ʀ Ʀ # 280
+ ʁ ʁ # 281
+ ʂ ʂ # 282
+ ʃ ʃ Ʃ Ʃ # 283
+ ʄ ʄ # 284
+ ʅ ʅ # 285
+ ʆ ʆ # 286
+ ʇ ʇ # 287
+ ʈ ʈ Ʈ Ʈ # 288
+ ʉ ʉ Ʉ Ʉ # 289
+ ʊ ʊ Ʊ Ʊ # 28A
+ ʋ ʋ Ʋ Ʋ # 28B
+ ʌ ʌ Ʌ Ʌ # 28C
+ ʍ ʍ # 28D
+ ʎ ʎ # 28E
+ ʏ ʏ # 28F
+ ʐ ʐ # 290
+ ʑ ʑ # 291
+ ʒ ʒ Ʒ Ʒ # 292
+ ʓ ʓ # 293
+ ʕ ʕ # 295
+ ʖ ʖ # 296
+ ʗ ʗ # 297
+ ʘ ʘ # 298
+ ʙ ʙ # 299
+ ʚ ʚ # 29A
+ ʛ ʛ # 29B
+ ʜ ʜ # 29C
+ ʝ ʝ # 29D
+ ʞ ʞ # 29E
+ ʟ ʟ # 29F
+ ʠ ʠ # 2A0
+ ʡ ʡ # 2A1
+ ʢ ʢ # 2A2
+ ʣ ʣ # 2A3
+ ʤ ʤ # 2A4
+ ʥ ʥ # 2A5
+ ʦ ʦ # 2A6
+ ʧ ʧ # 2A7
+ ʨ ʨ # 2A8
+ ʩ ʩ # 2A9
+ ʪ ʪ # 2AA
+ ʫ ʫ # 2AB
+ ʬ ʬ # 2AC
+ ʭ ʭ # 2AD
+ ʮ ʮ # 2AE
+ ʯ ʯ # 2AF
+ ͻ ͻ Ͻ Ͻ # 37B
+ ͼ ͼ Ͼ Ͼ # 37C
+ ͽ ͽ Ͽ Ͽ # 37D
+ Ά ά Ά # 386
+ Έ έ Έ # 388
+ Ή ή Ή # 389
+ Ί ί Ί # 38A
+ Ό ό Ό # 38C
+ Ύ ύ Ύ # 38E
+ Ώ ώ Ώ # 38F
+ ΐ ΐ Ϊ́ Ϊ́ # 390
+ Α α Α # 391
+ Β β Β # 392
+ Γ γ Γ # 393
+ Δ δ Δ # 394
+ Ε ε Ε # 395
+ Ζ ζ Ζ # 396
+ Η η Η # 397
+ Θ θ Θ # 398
+ Ι ι Ι # 399
+ Κ κ Κ # 39A
+ Λ λ Λ # 39B
+ Μ μ Μ # 39C
+ Ν ν Ν # 39D
+ Ξ ξ Ξ # 39E
+ Ο ο Ο # 39F
+ Π π Π # 3A0
+ Ρ ρ Ρ # 3A1
+ Τ τ Τ # 3A4
+ Υ υ Υ # 3A5
+ Φ φ Φ # 3A6
+ Χ χ Χ # 3A7
+ Ψ ψ Ψ # 3A8
+ Ω ω Ω # 3A9
+ Ϊ ϊ Ϊ # 3AA
+ Ϋ ϋ Ϋ # 3AB
+ ά ά Ά Ά # 3AC
+ έ έ Έ Έ # 3AD
+ ή ή Ή Ή # 3AE
+ ί ί Ί Ί # 3AF
+ ΰ ΰ Ϋ́ Ϋ́ # 3B0
+ α α Α Α # 3B1
+ β β Β Β # 3B2
+ γ γ Γ Γ # 3B3
+ δ δ Δ Δ # 3B4
+ ε ε Ε Ε # 3B5
+ ζ ζ Ζ Ζ # 3B6
+ η η Η Η # 3B7
+ θ θ Θ Θ # 3B8
+ ι ι Ι Ι # 3B9
+ κ κ Κ Κ # 3BA
+ λ λ Λ Λ # 3BB
+ μ μ Μ Μ # 3BC
+ ν ν Ν Ν # 3BD
+ ξ ξ Ξ Ξ # 3BE
+ ο ο Ο Ο # 3BF
+ π π Π Π # 3C0
+ ρ ρ Ρ Ρ # 3C1
+ ς ς Σ Σ # 3C2
+ σ σ Σ Σ # 3C3
+ τ τ Τ Τ # 3C4
+ υ υ Υ Υ # 3C5
+ φ φ Φ Φ # 3C6
+ χ χ Χ Χ # 3C7
+ ψ ψ Ψ Ψ # 3C8
+ ω ω Ω Ω # 3C9
+ ϊ ϊ Ϊ Ϊ # 3CA
+ ϋ ϋ Ϋ Ϋ # 3CB
+ ό ό Ό Ό # 3CC
+ ύ ύ Ύ Ύ # 3CD
+ ώ ώ Ώ Ώ # 3CE
+ ϐ ϐ Β Β # 3D0
+ ϑ ϑ Θ Θ # 3D1
+ ϒ ϒ # 3D2
+ ϓ ϓ # 3D3
+ ϔ ϔ # 3D4
+ ϕ ϕ Φ Φ # 3D5
+ ϖ ϖ Π Π # 3D6
+ ϗ ϗ # 3D7
+ Ϙ ϙ Ϙ # 3D8
+ ϙ ϙ Ϙ Ϙ # 3D9
+ Ϛ ϛ Ϛ # 3DA
+ ϛ ϛ Ϛ Ϛ # 3DB
+ Ϝ ϝ Ϝ # 3DC
+ ϝ ϝ Ϝ Ϝ # 3DD
+ Ϟ ϟ Ϟ # 3DE
+ ϟ ϟ Ϟ Ϟ # 3DF
+ Ϡ ϡ Ϡ # 3E0
+ ϡ ϡ Ϡ Ϡ # 3E1
+ Ϣ ϣ Ϣ # 3E2
+ ϣ ϣ Ϣ Ϣ # 3E3
+ Ϥ ϥ Ϥ # 3E4
+ ϥ ϥ Ϥ Ϥ # 3E5
+ Ϧ ϧ Ϧ # 3E6
+ ϧ ϧ Ϧ Ϧ # 3E7
+ Ϩ ϩ Ϩ # 3E8
+ ϩ ϩ Ϩ Ϩ # 3E9
+ Ϫ ϫ Ϫ # 3EA
+ ϫ ϫ Ϫ Ϫ # 3EB
+ Ϭ ϭ Ϭ # 3EC
+ ϭ ϭ Ϭ Ϭ # 3ED
+ Ϯ ϯ Ϯ # 3EE
+ ϯ ϯ Ϯ Ϯ # 3EF
+ ϰ ϰ Κ Κ # 3F0
+ ϱ ϱ Ρ Ρ # 3F1
+ ϲ ϲ Ϲ Ϲ # 3F2
+ ϳ ϳ # 3F3
+ ϴ θ ϴ # 3F4
+ ϵ ϵ Ε Ε # 3F5
+ Ϸ ϸ Ϸ # 3F7
+ ϸ ϸ Ϸ Ϸ # 3F8
+ Ϲ ϲ Ϲ # 3F9
+ Ϻ ϻ Ϻ # 3FA
+ ϻ ϻ Ϻ Ϻ # 3FB
+ ϼ ϼ # 3FC
+ Ͻ ͻ Ͻ # 3FD
+ Ͼ ͼ Ͼ # 3FE
+ Ͽ ͽ Ͽ # 3FF
+ Ѐ ѐ Ѐ # 400
+ Ё ё Ё # 401
+ Ђ ђ Ђ # 402
+ Ѓ ѓ Ѓ # 403
+ Є є Є # 404
+ Ѕ ѕ Ѕ # 405
+ І і І # 406
+ Ї ї Ї # 407
+ Ј ј Ј # 408
+ Љ љ Љ # 409
+ Њ њ Њ # 40A
+ Ћ ћ Ћ # 40B
+ Ќ ќ Ќ # 40C
+ Ѝ ѝ Ѝ # 40D
+ Ў ў Ў # 40E
+ Џ џ Џ # 40F
+ А а А # 410
+ Б б Б # 411
+ В в В # 412
+ Г г Г # 413
+ Д д Д # 414
+ Е е Е # 415
+ Ж ж Ж # 416
+ З з З # 417
+ И и И # 418
+ Й й Й # 419
+ К к К # 41A
+ Л л Л # 41B
+ М м М # 41C
+ Н н Н # 41D
+ О о О # 41E
+ П п П # 41F
+ Р р Р # 420
+ С с С # 421
+ Т т Т # 422
+ У у У # 423
+ Ф ф Ф # 424
+ Х х Х # 425
+ Ц ц Ц # 426
+ Ч ч Ч # 427
+ Ш ш Ш # 428
+ Щ щ Щ # 429
+ Ъ ъ Ъ # 42A
+ Ы ы Ы # 42B
+ Ь ь Ь # 42C
+ Э э Э # 42D
+ Ю ю Ю # 42E
+ Я я Я # 42F
+ а а А А # 430
+ б б Б Б # 431
+ в в В В # 432
+ г г Г Г # 433
+ д д Д Д # 434
+ е е Е Е # 435
+ ж ж Ж Ж # 436
+ з з З З # 437
+ и и И И # 438
+ й й Й Й # 439
+ к к К К # 43A
+ л л Л Л # 43B
+ м м М М # 43C
+ н н Н Н # 43D
+ о о О О # 43E
+ п п П П # 43F
+ р р Р Р # 440
+ с с С С # 441
+ т т Т Т # 442
+ у у У У # 443
+ ф ф Ф Ф # 444
+ х х Х Х # 445
+ ц ц Ц Ц # 446
+ ч ч Ч Ч # 447
+ ш ш Ш Ш # 448
+ щ щ Щ Щ # 449
+ ъ ъ Ъ Ъ # 44A
+ ы ы Ы Ы # 44B
+ ь ь Ь Ь # 44C
+ э э Э Э # 44D
+ ю ю Ю Ю # 44E
+ я я Я Я # 44F
+ ѐ ѐ Ѐ Ѐ # 450
+ ё ё Ё Ё # 451
+ ђ ђ Ђ Ђ # 452
+ ѓ ѓ Ѓ Ѓ # 453
+ є є Є Є # 454
+ ѕ ѕ Ѕ Ѕ # 455
+ і і І І # 456
+ ї ї Ї Ї # 457
+ ј ј Ј Ј # 458
+ љ љ Љ Љ # 459
+ њ њ Њ Њ # 45A
+ ћ ћ Ћ Ћ # 45B
+ ќ ќ Ќ Ќ # 45C
+ ѝ ѝ Ѝ Ѝ # 45D
+ ў ў Ў Ў # 45E
+ џ џ Џ Џ # 45F
+ Ѡ ѡ Ѡ # 460
+ ѡ ѡ Ѡ Ѡ # 461
+ Ѣ ѣ Ѣ # 462
+ ѣ ѣ Ѣ Ѣ # 463
+ Ѥ ѥ Ѥ # 464
+ ѥ ѥ Ѥ Ѥ # 465
+ Ѧ ѧ Ѧ # 466
+ ѧ ѧ Ѧ Ѧ # 467
+ Ѩ ѩ Ѩ # 468
+ ѩ ѩ Ѩ Ѩ # 469
+ Ѫ ѫ Ѫ # 46A
+ ѫ ѫ Ѫ Ѫ # 46B
+ Ѭ ѭ Ѭ # 46C
+ ѭ ѭ Ѭ Ѭ # 46D
+ Ѯ ѯ Ѯ # 46E
+ ѯ ѯ Ѯ Ѯ # 46F
+ Ѱ ѱ Ѱ # 470
+ ѱ ѱ Ѱ Ѱ # 471
+ Ѳ ѳ Ѳ # 472
+ ѳ ѳ Ѳ Ѳ # 473
+ Ѵ ѵ Ѵ # 474
+ ѵ ѵ Ѵ Ѵ # 475
+ Ѷ ѷ Ѷ # 476
+ ѷ ѷ Ѷ Ѷ # 477
+ Ѹ ѹ Ѹ # 478
+ ѹ ѹ Ѹ Ѹ # 479
+ Ѻ ѻ Ѻ # 47A
+ ѻ ѻ Ѻ Ѻ # 47B
+ Ѽ ѽ Ѽ # 47C
+ ѽ ѽ Ѽ Ѽ # 47D
+ Ѿ ѿ Ѿ # 47E
+ ѿ ѿ Ѿ Ѿ # 47F
+ Ҁ ҁ Ҁ # 480
+ ҁ ҁ Ҁ Ҁ # 481
+ Ҋ ҋ Ҋ # 48A
+ ҋ ҋ Ҋ Ҋ # 48B
+ Ҍ ҍ Ҍ # 48C
+ ҍ ҍ Ҍ Ҍ # 48D
+ Ҏ ҏ Ҏ # 48E
+ ҏ ҏ Ҏ Ҏ # 48F
+ Ґ ґ Ґ # 490
+ ґ ґ Ґ Ґ # 491
+ Ғ ғ Ғ # 492
+ ғ ғ Ғ Ғ # 493
+ Ҕ ҕ Ҕ # 494
+ ҕ ҕ Ҕ Ҕ # 495
+ Җ җ Җ # 496
+ җ җ Җ Җ # 497
+ Ҙ ҙ Ҙ # 498
+ ҙ ҙ Ҙ Ҙ # 499
+ Қ қ Қ # 49A
+ қ қ Қ Қ # 49B
+ Ҝ ҝ Ҝ # 49C
+ ҝ ҝ Ҝ Ҝ # 49D
+ Ҟ ҟ Ҟ # 49E
+ ҟ ҟ Ҟ Ҟ # 49F
+ Ҡ ҡ Ҡ # 4A0
+ ҡ ҡ Ҡ Ҡ # 4A1
+ Ң ң Ң # 4A2
+ ң ң Ң Ң # 4A3
+ Ҥ ҥ Ҥ # 4A4
+ ҥ ҥ Ҥ Ҥ # 4A5
+ Ҧ ҧ Ҧ # 4A6
+ ҧ ҧ Ҧ Ҧ # 4A7
+ Ҩ ҩ Ҩ # 4A8
+ ҩ ҩ Ҩ Ҩ # 4A9
+ Ҫ ҫ Ҫ # 4AA
+ ҫ ҫ Ҫ Ҫ # 4AB
+ Ҭ ҭ Ҭ # 4AC
+ ҭ ҭ Ҭ Ҭ # 4AD
+ Ү ү Ү # 4AE
+ ү ү Ү Ү # 4AF
+ Ұ ұ Ұ # 4B0
+ ұ ұ Ұ Ұ # 4B1
+ Ҳ ҳ Ҳ # 4B2
+ ҳ ҳ Ҳ Ҳ # 4B3
+ Ҵ ҵ Ҵ # 4B4
+ ҵ ҵ Ҵ Ҵ # 4B5
+ Ҷ ҷ Ҷ # 4B6
+ ҷ ҷ Ҷ Ҷ # 4B7
+ Ҹ ҹ Ҹ # 4B8
+ ҹ ҹ Ҹ Ҹ # 4B9
+ Һ һ Һ # 4BA
+ һ һ Һ Һ # 4BB
+ Ҽ ҽ Ҽ # 4BC
+ ҽ ҽ Ҽ Ҽ # 4BD
+ Ҿ ҿ Ҿ # 4BE
+ ҿ ҿ Ҿ Ҿ # 4BF
+ Ӏ ӏ Ӏ # 4C0
+ Ӂ ӂ Ӂ # 4C1
+ ӂ ӂ Ӂ Ӂ # 4C2
+ Ӄ ӄ Ӄ # 4C3
+ ӄ ӄ Ӄ Ӄ # 4C4
+ Ӆ ӆ Ӆ # 4C5
+ ӆ ӆ Ӆ Ӆ # 4C6
+ Ӈ ӈ Ӈ # 4C7
+ ӈ ӈ Ӈ Ӈ # 4C8
+ Ӊ ӊ Ӊ # 4C9
+ ӊ ӊ Ӊ Ӊ # 4CA
+ Ӌ ӌ Ӌ # 4CB
+ ӌ ӌ Ӌ Ӌ # 4CC
+ Ӎ ӎ Ӎ # 4CD
+ ӎ ӎ Ӎ Ӎ # 4CE
+ ӏ ӏ Ӏ Ӏ # 4CF
+ Ӑ ӑ Ӑ # 4D0
+ ӑ ӑ Ӑ Ӑ # 4D1
+ Ӓ ӓ Ӓ # 4D2
+ ӓ ӓ Ӓ Ӓ # 4D3
+ Ӕ ӕ Ӕ # 4D4
+ ӕ ӕ Ӕ Ӕ # 4D5
+ Ӗ ӗ Ӗ # 4D6
+ ӗ ӗ Ӗ Ӗ # 4D7
+ Ә ә Ә # 4D8
+ ә ә Ә Ә # 4D9
+ Ӛ ӛ Ӛ # 4DA
+ ӛ ӛ Ӛ Ӛ # 4DB
+ Ӝ ӝ Ӝ # 4DC
+ ӝ ӝ Ӝ Ӝ # 4DD
+ Ӟ ӟ Ӟ # 4DE
+ ӟ ӟ Ӟ Ӟ # 4DF
+ Ӡ ӡ Ӡ # 4E0
+ ӡ ӡ Ӡ Ӡ # 4E1
+ Ӣ ӣ Ӣ # 4E2
+ ӣ ӣ Ӣ Ӣ # 4E3
+ Ӥ ӥ Ӥ # 4E4
+ ӥ ӥ Ӥ Ӥ # 4E5
+ Ӧ ӧ Ӧ # 4E6
+ ӧ ӧ Ӧ Ӧ # 4E7
+ Ө ө Ө # 4E8
+ ө ө Ө Ө # 4E9
+ Ӫ ӫ Ӫ # 4EA
+ ӫ ӫ Ӫ Ӫ # 4EB
+ Ӭ ӭ Ӭ # 4EC
+ ӭ ӭ Ӭ Ӭ # 4ED
+ Ӯ ӯ Ӯ # 4EE
+ ӯ ӯ Ӯ Ӯ # 4EF
+ Ӱ ӱ Ӱ # 4F0
+ ӱ ӱ Ӱ Ӱ # 4F1
+ Ӳ ӳ Ӳ # 4F2
+ ӳ ӳ Ӳ Ӳ # 4F3
+ Ӵ ӵ Ӵ # 4F4
+ ӵ ӵ Ӵ Ӵ # 4F5
+ Ӷ ӷ Ӷ # 4F6
+ ӷ ӷ Ӷ Ӷ # 4F7
+ Ӹ ӹ Ӹ # 4F8
+ ӹ ӹ Ӹ Ӹ # 4F9
+ Ӻ ӻ Ӻ # 4FA
+ ӻ ӻ Ӻ Ӻ # 4FB
+ Ӽ ӽ Ӽ # 4FC
+ ӽ ӽ Ӽ Ӽ # 4FD
+ Ӿ ӿ Ӿ # 4FE
+ ӿ ӿ Ӿ Ӿ # 4FF
+ Ԁ ԁ Ԁ # 500
+ ԁ ԁ Ԁ Ԁ # 501
+ Ԃ ԃ Ԃ # 502
+ ԃ ԃ Ԃ Ԃ # 503
+ Ԅ ԅ Ԅ # 504
+ ԅ ԅ Ԅ Ԅ # 505
+ Ԇ ԇ Ԇ # 506
+ ԇ ԇ Ԇ Ԇ # 507
+ Ԉ ԉ Ԉ # 508
+ ԉ ԉ Ԉ Ԉ # 509
+ Ԋ ԋ Ԋ # 50A
+ ԋ ԋ Ԋ Ԋ # 50B
+ Ԍ ԍ Ԍ # 50C
+ ԍ ԍ Ԍ Ԍ # 50D
+ Ԏ ԏ Ԏ # 50E
+ ԏ ԏ Ԏ Ԏ # 50F
+ Ԑ ԑ Ԑ # 510
+ ԑ ԑ Ԑ Ԑ # 511
+ Ԓ ԓ Ԓ # 512
+ ԓ ԓ Ԓ Ԓ # 513
+ Ա ա Ա # 531
+ Բ բ Բ # 532
+ Գ գ Գ # 533
+ Դ դ Դ # 534
+ Ե ե Ե # 535
+ Զ զ Զ # 536
+ Է է Է # 537
+ Ը ը Ը # 538
+ Թ թ Թ # 539
+ Ժ ժ Ժ # 53A
+ Ի ի Ի # 53B
+ Լ լ Լ # 53C
+ Խ խ Խ # 53D
+ Ծ ծ Ծ # 53E
+ Կ կ Կ # 53F
+ Հ հ Հ # 540
+ Ձ ձ Ձ # 541
+ Ղ ղ Ղ # 542
+ Ճ ճ Ճ # 543
+ Մ մ Մ # 544
+ Յ յ Յ # 545
+ Ն ն Ն # 546
+ Շ շ Շ # 547
+ Ո ո Ո # 548
+ Չ չ Չ # 549
+ Պ պ Պ # 54A
+ Ջ ջ Ջ # 54B
+ Ռ ռ Ռ # 54C
+ Ս ս Ս # 54D
+ Վ վ Վ # 54E
+ Տ տ Տ # 54F
+ Ր ր Ր # 550
+ Ց ց Ց # 551
+ Ւ ւ Ւ # 552
+ Փ փ Փ # 553
+ Ք ք Ք # 554
+ Օ օ Օ # 555
+ Ֆ ֆ Ֆ # 556
+ ա ա Ա Ա # 561
+ բ բ Բ Բ # 562
+ գ գ Գ Գ # 563
+ դ դ Դ Դ # 564
+ ե ե Ե Ե # 565
+ զ զ Զ Զ # 566
+ է է Է Է # 567
+ ը ը Ը Ը # 568
+ թ թ Թ Թ # 569
+ ժ ժ Ժ Ժ # 56A
+ ի ի Ի Ի # 56B
+ լ լ Լ Լ # 56C
+ խ խ Խ Խ # 56D
+ ծ ծ Ծ Ծ # 56E
+ կ կ Կ Կ # 56F
+ հ հ Հ Հ # 570
+ ձ ձ Ձ Ձ # 571
+ ղ ղ Ղ Ղ # 572
+ ճ ճ Ճ Ճ # 573
+ մ մ Մ Մ # 574
+ յ յ Յ Յ # 575
+ ն ն Ն Ն # 576
+ շ շ Շ Շ # 577
+ ո ո Ո Ո # 578
+ չ չ Չ Չ # 579
+ պ պ Պ Պ # 57A
+ ջ ջ Ջ Ջ # 57B
+ ռ ռ Ռ Ռ # 57C
+ ս ս Ս Ս # 57D
+ վ վ Վ Վ # 57E
+ տ տ Տ Տ # 57F
+ ր ր Ր Ր # 580
+ ց ց Ց Ց # 581
+ ւ ւ Ւ Ւ # 582
+ փ փ Փ Փ # 583
+ ք ք Ք Ք # 584
+ օ օ Օ Օ # 585
+ ֆ ֆ Ֆ Ֆ # 586
+ և և Եւ ԵՒ # 587
+ Ⴀ ⴀ Ⴀ # 10A0
+ Ⴁ ⴁ Ⴁ # 10A1
+ Ⴂ ⴂ Ⴂ # 10A2
+ Ⴃ ⴃ Ⴃ # 10A3
+ Ⴄ ⴄ Ⴄ # 10A4
+ Ⴅ ⴅ Ⴅ # 10A5
+ Ⴆ ⴆ Ⴆ # 10A6
+ Ⴇ ⴇ Ⴇ # 10A7
+ Ⴈ ⴈ Ⴈ # 10A8
+ Ⴉ ⴉ Ⴉ # 10A9
+ Ⴊ ⴊ Ⴊ # 10AA
+ Ⴋ ⴋ Ⴋ # 10AB
+ Ⴌ ⴌ Ⴌ # 10AC
+ Ⴍ ⴍ Ⴍ # 10AD
+ Ⴎ ⴎ Ⴎ # 10AE
+ Ⴏ ⴏ Ⴏ # 10AF
+ Ⴐ ⴐ Ⴐ # 10B0
+ Ⴑ ⴑ Ⴑ # 10B1
+ Ⴒ ⴒ Ⴒ # 10B2
+ Ⴓ ⴓ Ⴓ # 10B3
+ Ⴔ ⴔ Ⴔ # 10B4
+ Ⴕ ⴕ Ⴕ # 10B5
+ Ⴖ ⴖ Ⴖ # 10B6
+ Ⴗ ⴗ Ⴗ # 10B7
+ Ⴘ ⴘ Ⴘ # 10B8
+ Ⴙ ⴙ Ⴙ # 10B9
+ Ⴚ ⴚ Ⴚ # 10BA
+ Ⴛ ⴛ Ⴛ # 10BB
+ Ⴜ ⴜ Ⴜ # 10BC
+ Ⴝ ⴝ Ⴝ # 10BD
+ Ⴞ ⴞ Ⴞ # 10BE
+ Ⴟ ⴟ Ⴟ # 10BF
+ Ⴠ ⴠ Ⴠ # 10C0
+ Ⴡ ⴡ Ⴡ # 10C1
+ Ⴢ ⴢ Ⴢ # 10C2
+ Ⴣ ⴣ Ⴣ # 10C3
+ Ⴤ ⴤ Ⴤ # 10C4
+ Ⴥ ⴥ Ⴥ # 10C5
+ ᴀ ᴀ # 1D00
+ ᴁ ᴁ # 1D01
+ ᴂ ᴂ # 1D02
+ ᴃ ᴃ # 1D03
+ ᴄ ᴄ # 1D04
+ ᴅ ᴅ # 1D05
+ ᴆ ᴆ # 1D06
+ ᴇ ᴇ # 1D07
+ ᴈ ᴈ # 1D08
+ ᴉ ᴉ # 1D09
+ ᴊ ᴊ # 1D0A
+ ᴋ ᴋ # 1D0B
+ ᴌ ᴌ # 1D0C
+ ᴍ ᴍ # 1D0D
+ ᴎ ᴎ # 1D0E
+ ᴏ ᴏ # 1D0F
+ ᴐ ᴐ # 1D10
+ ᴑ ᴑ # 1D11
+ ᴒ ᴒ # 1D12
+ ᴓ ᴓ # 1D13
+ ᴔ ᴔ # 1D14
+ ᴕ ᴕ # 1D15
+ ᴖ ᴖ # 1D16
+ ᴗ ᴗ # 1D17
+ ᴘ ᴘ # 1D18
+ ᴙ ᴙ # 1D19
+ ᴚ ᴚ # 1D1A
+ ᴛ ᴛ # 1D1B
+ ᴜ ᴜ # 1D1C
+ ᴝ ᴝ # 1D1D
+ ᴞ ᴞ # 1D1E
+ ᴟ ᴟ # 1D1F
+ ᴠ ᴠ # 1D20
+ ᴡ ᴡ # 1D21
+ ᴢ ᴢ # 1D22
+ ᴣ ᴣ # 1D23
+ ᴤ ᴤ # 1D24
+ ᴥ ᴥ # 1D25
+ ᴦ ᴦ # 1D26
+ ᴧ ᴧ # 1D27
+ ᴨ ᴨ # 1D28
+ ᴩ ᴩ # 1D29
+ ᴪ ᴪ # 1D2A
+ ᴫ ᴫ # 1D2B
+ ᵢ ᵢ # 1D62
+ ᵣ ᵣ # 1D63
+ ᵤ ᵤ # 1D64
+ ᵥ ᵥ # 1D65
+ ᵦ ᵦ # 1D66
+ ᵧ ᵧ # 1D67
+ ᵨ ᵨ # 1D68
+ ᵩ ᵩ # 1D69
+ ᵪ ᵪ # 1D6A
+ ᵫ ᵫ # 1D6B
+ ᵬ ᵬ # 1D6C
+ ᵭ ᵭ # 1D6D
+ ᵮ ᵮ # 1D6E
+ ᵯ ᵯ # 1D6F
+ ᵰ ᵰ # 1D70
+ ᵱ ᵱ # 1D71
+ ᵲ ᵲ # 1D72
+ ᵳ ᵳ # 1D73
+ ᵴ ᵴ # 1D74
+ ᵵ ᵵ # 1D75
+ ᵶ ᵶ # 1D76
+ ᵷ ᵷ # 1D77
+ ᵹ ᵹ # 1D79
+ ᵺ ᵺ # 1D7A
+ ᵻ ᵻ # 1D7B
+ ᵼ ᵼ # 1D7C
+ ᵽ ᵽ Ᵽ Ᵽ # 1D7D
+ ᵾ ᵾ # 1D7E
+ ᵿ ᵿ # 1D7F
+ ᶀ ᶀ # 1D80
+ ᶁ ᶁ # 1D81
+ ᶂ ᶂ # 1D82
+ ᶃ ᶃ # 1D83
+ ᶄ ᶄ # 1D84
+ ᶅ ᶅ # 1D85
+ ᶆ ᶆ # 1D86
+ ᶇ ᶇ # 1D87
+ ᶈ ᶈ # 1D88
+ ᶉ ᶉ # 1D89
+ ᶊ ᶊ # 1D8A
+ ᶋ ᶋ # 1D8B
+ ᶌ ᶌ # 1D8C
+ ᶍ ᶍ # 1D8D
+ ᶎ ᶎ # 1D8E
+ ᶏ ᶏ # 1D8F
+ ᶐ ᶐ # 1D90
+ ᶑ ᶑ # 1D91
+ ᶒ ᶒ # 1D92
+ ᶓ ᶓ # 1D93
+ ᶔ ᶔ # 1D94
+ ᶕ ᶕ # 1D95
+ ᶖ ᶖ # 1D96
+ ᶗ ᶗ # 1D97
+ ᶘ ᶘ # 1D98
+ ᶙ ᶙ # 1D99
+ ᶚ ᶚ # 1D9A
+ Ḁ ḁ Ḁ # 1E00
+ ḁ ḁ Ḁ Ḁ # 1E01
+ Ḃ ḃ Ḃ # 1E02
+ ḃ ḃ Ḃ Ḃ # 1E03
+ Ḅ ḅ Ḅ # 1E04
+ ḅ ḅ Ḅ Ḅ # 1E05
+ Ḇ ḇ Ḇ # 1E06
+ ḇ ḇ Ḇ Ḇ # 1E07
+ Ḉ ḉ Ḉ # 1E08
+ ḉ ḉ Ḉ Ḉ # 1E09
+ Ḋ ḋ Ḋ # 1E0A
+ ḋ ḋ Ḋ Ḋ # 1E0B
+ Ḍ ḍ Ḍ # 1E0C
+ ḍ ḍ Ḍ Ḍ # 1E0D
+ Ḏ ḏ Ḏ # 1E0E
+ ḏ ḏ Ḏ Ḏ # 1E0F
+ Ḑ ḑ Ḑ # 1E10
+ ḑ ḑ Ḑ Ḑ # 1E11
+ Ḓ ḓ Ḓ # 1E12
+ ḓ ḓ Ḓ Ḓ # 1E13
+ Ḕ ḕ Ḕ # 1E14
+ ḕ ḕ Ḕ Ḕ # 1E15
+ Ḗ ḗ Ḗ # 1E16
+ ḗ ḗ Ḗ Ḗ # 1E17
+ Ḙ ḙ Ḙ # 1E18
+ ḙ ḙ Ḙ Ḙ # 1E19
+ Ḛ ḛ Ḛ # 1E1A
+ ḛ ḛ Ḛ Ḛ # 1E1B
+ Ḝ ḝ Ḝ # 1E1C
+ ḝ ḝ Ḝ Ḝ # 1E1D
+ Ḟ ḟ Ḟ # 1E1E
+ ḟ ḟ Ḟ Ḟ # 1E1F
+ Ḡ ḡ Ḡ # 1E20
+ ḡ ḡ Ḡ Ḡ # 1E21
+ Ḣ ḣ Ḣ # 1E22
+ ḣ ḣ Ḣ Ḣ # 1E23
+ Ḥ ḥ Ḥ # 1E24
+ ḥ ḥ Ḥ Ḥ # 1E25
+ Ḧ ḧ Ḧ # 1E26
+ ḧ ḧ Ḧ Ḧ # 1E27
+ Ḩ ḩ Ḩ # 1E28
+ ḩ ḩ Ḩ Ḩ # 1E29
+ Ḫ ḫ Ḫ # 1E2A
+ ḫ ḫ Ḫ Ḫ # 1E2B
+ Ḭ ḭ Ḭ # 1E2C
+ ḭ ḭ Ḭ Ḭ # 1E2D
+ Ḯ ḯ Ḯ # 1E2E
+ ḯ ḯ Ḯ Ḯ # 1E2F
+ Ḱ ḱ Ḱ # 1E30
+ ḱ ḱ Ḱ Ḱ # 1E31
+ Ḳ ḳ Ḳ # 1E32
+ ḳ ḳ Ḳ Ḳ # 1E33
+ Ḵ ḵ Ḵ # 1E34
+ ḵ ḵ Ḵ Ḵ # 1E35
+ Ḷ ḷ Ḷ # 1E36
+ ḷ ḷ Ḷ Ḷ # 1E37
+ Ḹ ḹ Ḹ # 1E38
+ ḹ ḹ Ḹ Ḹ # 1E39
+ Ḻ ḻ Ḻ # 1E3A
+ ḻ ḻ Ḻ Ḻ # 1E3B
+ Ḽ ḽ Ḽ # 1E3C
+ ḽ ḽ Ḽ Ḽ # 1E3D
+ Ḿ ḿ Ḿ # 1E3E
+ ḿ ḿ Ḿ Ḿ # 1E3F
+ Ṁ ṁ Ṁ # 1E40
+ ṁ ṁ Ṁ Ṁ # 1E41
+ Ṃ ṃ Ṃ # 1E42
+ ṃ ṃ Ṃ Ṃ # 1E43
+ Ṅ ṅ Ṅ # 1E44
+ ṅ ṅ Ṅ Ṅ # 1E45
+ Ṇ ṇ Ṇ # 1E46
+ ṇ ṇ Ṇ Ṇ # 1E47
+ Ṉ ṉ Ṉ # 1E48
+ ṉ ṉ Ṉ Ṉ # 1E49
+ Ṋ ṋ Ṋ # 1E4A
+ ṋ ṋ Ṋ Ṋ # 1E4B
+ Ṍ ṍ Ṍ # 1E4C
+ ṍ ṍ Ṍ Ṍ # 1E4D
+ Ṏ ṏ Ṏ # 1E4E
+ ṏ ṏ Ṏ Ṏ # 1E4F
+ Ṑ ṑ Ṑ # 1E50
+ ṑ ṑ Ṑ Ṑ # 1E51
+ Ṓ ṓ Ṓ # 1E52
+ ṓ ṓ Ṓ Ṓ # 1E53
+ Ṕ ṕ Ṕ # 1E54
+ ṕ ṕ Ṕ Ṕ # 1E55
+ Ṗ ṗ Ṗ # 1E56
+ ṗ ṗ Ṗ Ṗ # 1E57
+ Ṙ ṙ Ṙ # 1E58
+ ṙ ṙ Ṙ Ṙ # 1E59
+ Ṛ ṛ Ṛ # 1E5A
+ ṛ ṛ Ṛ Ṛ # 1E5B
+ Ṝ ṝ Ṝ # 1E5C
+ ṝ ṝ Ṝ Ṝ # 1E5D
+ Ṟ ṟ Ṟ # 1E5E
+ ṟ ṟ Ṟ Ṟ # 1E5F
+ Ṡ ṡ Ṡ # 1E60
+ ṡ ṡ Ṡ Ṡ # 1E61
+ Ṣ ṣ Ṣ # 1E62
+ ṣ ṣ Ṣ Ṣ # 1E63
+ Ṥ ṥ Ṥ # 1E64
+ ṥ ṥ Ṥ Ṥ # 1E65
+ Ṧ ṧ Ṧ # 1E66
+ ṧ ṧ Ṧ Ṧ # 1E67
+ Ṩ ṩ Ṩ # 1E68
+ ṩ ṩ Ṩ Ṩ # 1E69
+ Ṫ ṫ Ṫ # 1E6A
+ ṫ ṫ Ṫ Ṫ # 1E6B
+ Ṭ ṭ Ṭ # 1E6C
+ ṭ ṭ Ṭ Ṭ # 1E6D
+ Ṯ ṯ Ṯ # 1E6E
+ ṯ ṯ Ṯ Ṯ # 1E6F
+ Ṱ ṱ Ṱ # 1E70
+ ṱ ṱ Ṱ Ṱ # 1E71
+ Ṳ ṳ Ṳ # 1E72
+ ṳ ṳ Ṳ Ṳ # 1E73
+ Ṵ ṵ Ṵ # 1E74
+ ṵ ṵ Ṵ Ṵ # 1E75
+ Ṷ ṷ Ṷ # 1E76
+ ṷ ṷ Ṷ Ṷ # 1E77
+ Ṹ ṹ Ṹ # 1E78
+ ṹ ṹ Ṹ Ṹ # 1E79
+ Ṻ ṻ Ṻ # 1E7A
+ ṻ ṻ Ṻ Ṻ # 1E7B
+ Ṽ ṽ Ṽ # 1E7C
+ ṽ ṽ Ṽ Ṽ # 1E7D
+ Ṿ ṿ Ṿ # 1E7E
+ ṿ ṿ Ṿ Ṿ # 1E7F
+ Ẁ ẁ Ẁ # 1E80
+ ẁ ẁ Ẁ Ẁ # 1E81
+ Ẃ ẃ Ẃ # 1E82
+ ẃ ẃ Ẃ Ẃ # 1E83
+ Ẅ ẅ Ẅ # 1E84
+ ẅ ẅ Ẅ Ẅ # 1E85
+ Ẇ ẇ Ẇ # 1E86
+ ẇ ẇ Ẇ Ẇ # 1E87
+ Ẉ ẉ Ẉ # 1E88
+ ẉ ẉ Ẉ Ẉ # 1E89
+ Ẋ ẋ Ẋ # 1E8A
+ ẋ ẋ Ẋ Ẋ # 1E8B
+ Ẍ ẍ Ẍ # 1E8C
+ ẍ ẍ Ẍ Ẍ # 1E8D
+ Ẏ ẏ Ẏ # 1E8E
+ ẏ ẏ Ẏ Ẏ # 1E8F
+ Ẑ ẑ Ẑ # 1E90
+ ẑ ẑ Ẑ Ẑ # 1E91
+ Ẓ ẓ Ẓ # 1E92
+ ẓ ẓ Ẓ Ẓ # 1E93
+ Ẕ ẕ Ẕ # 1E94
+ ẕ ẕ Ẕ Ẕ # 1E95
+ ẖ ẖ H̱ H̱ # 1E96
+ ẗ ẗ T̈ T̈ # 1E97
+ ẘ ẘ W̊ W̊ # 1E98
+ ẙ ẙ Y̊ Y̊ # 1E99
+ ẚ ẚ Aʾ Aʾ # 1E9A
+ ẛ ẛ Ṡ Ṡ # 1E9B
+ Ạ ạ Ạ # 1EA0
+ ạ ạ Ạ Ạ # 1EA1
+ Ả ả Ả # 1EA2
+ ả ả Ả Ả # 1EA3
+ Ấ ấ Ấ # 1EA4
+ ấ ấ Ấ Ấ # 1EA5
+ Ầ ầ Ầ # 1EA6
+ ầ ầ Ầ Ầ # 1EA7
+ Ẩ ẩ Ẩ # 1EA8
+ ẩ ẩ Ẩ Ẩ # 1EA9
+ Ẫ ẫ Ẫ # 1EAA
+ ẫ ẫ Ẫ Ẫ # 1EAB
+ Ậ ậ Ậ # 1EAC
+ ậ ậ Ậ Ậ # 1EAD
+ Ắ ắ Ắ # 1EAE
+ ắ ắ Ắ Ắ # 1EAF
+ Ằ ằ Ằ # 1EB0
+ ằ ằ Ằ Ằ # 1EB1
+ Ẳ ẳ Ẳ # 1EB2
+ ẳ ẳ Ẳ Ẳ # 1EB3
+ Ẵ ẵ Ẵ # 1EB4
+ ẵ ẵ Ẵ Ẵ # 1EB5
+ Ặ ặ Ặ # 1EB6
+ ặ ặ Ặ Ặ # 1EB7
+ Ẹ ẹ Ẹ # 1EB8
+ ẹ ẹ Ẹ Ẹ # 1EB9
+ Ẻ ẻ Ẻ # 1EBA
+ ẻ ẻ Ẻ Ẻ # 1EBB
+ Ẽ ẽ Ẽ # 1EBC
+ ẽ ẽ Ẽ Ẽ # 1EBD
+ Ế ế Ế # 1EBE
+ ế ế Ế Ế # 1EBF
+ Ề ề Ề # 1EC0
+ ề ề Ề Ề # 1EC1
+ Ể ể Ể # 1EC2
+ ể ể Ể Ể # 1EC3
+ Ễ ễ Ễ # 1EC4
+ ễ ễ Ễ Ễ # 1EC5
+ Ệ ệ Ệ # 1EC6
+ ệ ệ Ệ Ệ # 1EC7
+ Ỉ ỉ Ỉ # 1EC8
+ ỉ ỉ Ỉ Ỉ # 1EC9
+ Ị ị Ị # 1ECA
+ ị ị Ị Ị # 1ECB
+ Ọ ọ Ọ # 1ECC
+ ọ ọ Ọ Ọ # 1ECD
+ Ỏ ỏ Ỏ # 1ECE
+ ỏ ỏ Ỏ Ỏ # 1ECF
+ Ố ố Ố # 1ED0
+ ố ố Ố Ố # 1ED1
+ Ồ ồ Ồ # 1ED2
+ ồ ồ Ồ Ồ # 1ED3
+ Ổ ổ Ổ # 1ED4
+ ổ ổ Ổ Ổ # 1ED5
+ Ỗ ỗ Ỗ # 1ED6
+ ỗ ỗ Ỗ Ỗ # 1ED7
+ Ộ ộ Ộ # 1ED8
+ ộ ộ Ộ Ộ # 1ED9
+ Ớ ớ Ớ # 1EDA
+ ớ ớ Ớ Ớ # 1EDB
+ Ờ ờ Ờ # 1EDC
+ ờ ờ Ờ Ờ # 1EDD
+ Ở ở Ở # 1EDE
+ ở ở Ở Ở # 1EDF
+ Ỡ ỡ Ỡ # 1EE0
+ ỡ ỡ Ỡ Ỡ # 1EE1
+ Ợ ợ Ợ # 1EE2
+ ợ ợ Ợ Ợ # 1EE3
+ Ụ ụ Ụ # 1EE4
+ ụ ụ Ụ Ụ # 1EE5
+ Ủ ủ Ủ # 1EE6
+ ủ ủ Ủ Ủ # 1EE7
+ Ứ ứ Ứ # 1EE8
+ ứ ứ Ứ Ứ # 1EE9
+ Ừ ừ Ừ # 1EEA
+ ừ ừ Ừ Ừ # 1EEB
+ Ử ử Ử # 1EEC
+ ử ử Ử Ử # 1EED
+ Ữ ữ Ữ # 1EEE
+ ữ ữ Ữ Ữ # 1EEF
+ Ự ự Ự # 1EF0
+ ự ự Ự Ự # 1EF1
+ Ỳ ỳ Ỳ # 1EF2
+ ỳ ỳ Ỳ Ỳ # 1EF3
+ Ỵ ỵ Ỵ # 1EF4
+ ỵ ỵ Ỵ Ỵ # 1EF5
+ Ỷ ỷ Ỷ # 1EF6
+ ỷ ỷ Ỷ Ỷ # 1EF7
+ Ỹ ỹ Ỹ # 1EF8
+ ỹ ỹ Ỹ Ỹ # 1EF9
+ ἀ ἀ Ἀ Ἀ # 1F00
+ ἁ ἁ Ἁ Ἁ # 1F01
+ ἂ ἂ Ἂ Ἂ # 1F02
+ ἃ ἃ Ἃ Ἃ # 1F03
+ ἄ ἄ Ἄ Ἄ # 1F04
+ ἅ ἅ Ἅ Ἅ # 1F05
+ ἆ ἆ Ἆ Ἆ # 1F06
+ ἇ ἇ Ἇ Ἇ # 1F07
+ Ἀ ἀ Ἀ # 1F08
+ Ἁ ἁ Ἁ # 1F09
+ Ἂ ἂ Ἂ # 1F0A
+ Ἃ ἃ Ἃ # 1F0B
+ Ἄ ἄ Ἄ # 1F0C
+ Ἅ ἅ Ἅ # 1F0D
+ Ἆ ἆ Ἆ # 1F0E
+ Ἇ ἇ Ἇ # 1F0F
+ ἐ ἐ Ἐ Ἐ # 1F10
+ ἑ ἑ Ἑ Ἑ # 1F11
+ ἒ ἒ Ἒ Ἒ # 1F12
+ ἓ ἓ Ἓ Ἓ # 1F13
+ ἔ ἔ Ἔ Ἔ # 1F14
+ ἕ ἕ Ἕ Ἕ # 1F15
+ Ἐ ἐ Ἐ # 1F18
+ Ἑ ἑ Ἑ # 1F19
+ Ἒ ἒ Ἒ # 1F1A
+ Ἓ ἓ Ἓ # 1F1B
+ Ἔ ἔ Ἔ # 1F1C
+ Ἕ ἕ Ἕ # 1F1D
+ ἠ ἠ Ἠ Ἠ # 1F20
+ ἡ ἡ Ἡ Ἡ # 1F21
+ ἢ ἢ Ἢ Ἢ # 1F22
+ ἣ ἣ Ἣ Ἣ # 1F23
+ ἤ ἤ Ἤ Ἤ # 1F24
+ ἥ ἥ Ἥ Ἥ # 1F25
+ ἦ ἦ Ἦ Ἦ # 1F26
+ ἧ ἧ Ἧ Ἧ # 1F27
+ Ἠ ἠ Ἠ # 1F28
+ Ἡ ἡ Ἡ # 1F29
+ Ἢ ἢ Ἢ # 1F2A
+ Ἣ ἣ Ἣ # 1F2B
+ Ἤ ἤ Ἤ # 1F2C
+ Ἥ ἥ Ἥ # 1F2D
+ Ἦ ἦ Ἦ # 1F2E
+ Ἧ ἧ Ἧ # 1F2F
+ ἰ ἰ Ἰ Ἰ # 1F30
+ ἱ ἱ Ἱ Ἱ # 1F31
+ ἲ ἲ Ἲ Ἲ # 1F32
+ ἳ ἳ Ἳ Ἳ # 1F33
+ ἴ ἴ Ἴ Ἴ # 1F34
+ ἵ ἵ Ἵ Ἵ # 1F35
+ ἶ ἶ Ἶ Ἶ # 1F36
+ ἷ ἷ Ἷ Ἷ # 1F37
+ Ἰ ἰ Ἰ # 1F38
+ Ἱ ἱ Ἱ # 1F39
+ Ἲ ἲ Ἲ # 1F3A
+ Ἳ ἳ Ἳ # 1F3B
+ Ἴ ἴ Ἴ # 1F3C
+ Ἵ ἵ Ἵ # 1F3D
+ Ἶ ἶ Ἶ # 1F3E
+ Ἷ ἷ Ἷ # 1F3F
+ ὀ ὀ Ὀ Ὀ # 1F40
+ ὁ ὁ Ὁ Ὁ # 1F41
+ ὂ ὂ Ὂ Ὂ # 1F42
+ ὃ ὃ Ὃ Ὃ # 1F43
+ ὄ ὄ Ὄ Ὄ # 1F44
+ ὅ ὅ Ὅ Ὅ # 1F45
+ Ὀ ὀ Ὀ # 1F48
+ Ὁ ὁ Ὁ # 1F49
+ Ὂ ὂ Ὂ # 1F4A
+ Ὃ ὃ Ὃ # 1F4B
+ Ὄ ὄ Ὄ # 1F4C
+ Ὅ ὅ Ὅ # 1F4D
+ ὐ ὐ Υ̓ Υ̓ # 1F50
+ ὑ ὑ Ὑ Ὑ # 1F51
+ ὒ ὒ Υ̓̀ Υ̓̀ # 1F52
+ ὓ ὓ Ὓ Ὓ # 1F53
+ ὔ ὔ Υ̓́ Υ̓́ # 1F54
+ ὕ ὕ Ὕ Ὕ # 1F55
+ ὖ ὖ Υ̓͂ Υ̓͂ # 1F56
+ ὗ ὗ Ὗ Ὗ # 1F57
+ Ὑ ὑ Ὑ # 1F59
+ Ὓ ὓ Ὓ # 1F5B
+ Ὕ ὕ Ὕ # 1F5D
+ Ὗ ὗ Ὗ # 1F5F
+ ὠ ὠ Ὠ Ὠ # 1F60
+ ὡ ὡ Ὡ Ὡ # 1F61
+ ὢ ὢ Ὢ Ὢ # 1F62
+ ὣ ὣ Ὣ Ὣ # 1F63
+ ὤ ὤ Ὤ Ὤ # 1F64
+ ὥ ὥ Ὥ Ὥ # 1F65
+ ὦ ὦ Ὦ Ὦ # 1F66
+ ὧ ὧ Ὧ Ὧ # 1F67
+ Ὠ ὠ Ὠ # 1F68
+ Ὡ ὡ Ὡ # 1F69
+ Ὢ ὢ Ὢ # 1F6A
+ Ὣ ὣ Ὣ # 1F6B
+ Ὤ ὤ Ὤ # 1F6C
+ Ὥ ὥ Ὥ # 1F6D
+ Ὦ ὦ Ὦ # 1F6E
+ Ὧ ὧ Ὧ # 1F6F
+ ὰ ὰ Ὰ Ὰ # 1F70
+ ά ά Ά Ά # 1F71
+ ὲ ὲ Ὲ Ὲ # 1F72
+ έ έ Έ Έ # 1F73
+ ὴ ὴ Ὴ Ὴ # 1F74
+ ή ή Ή Ή # 1F75
+ ὶ ὶ Ὶ Ὶ # 1F76
+ ί ί Ί Ί # 1F77
+ ὸ ὸ Ὸ Ὸ # 1F78
+ ό ό Ό Ό # 1F79
+ ὺ ὺ Ὺ Ὺ # 1F7A
+ ύ ύ Ύ Ύ # 1F7B
+ ὼ ὼ Ὼ Ὼ # 1F7C
+ ώ ώ Ώ Ώ # 1F7D
+ ᾀ ᾀ ᾈ ἈΙ # 1F80
+ ᾁ ᾁ ᾉ ἉΙ # 1F81
+ ᾂ ᾂ ᾊ ἊΙ # 1F82
+ ᾃ ᾃ ᾋ ἋΙ # 1F83
+ ᾄ ᾄ ᾌ ἌΙ # 1F84
+ ᾅ ᾅ ᾍ ἍΙ # 1F85
+ ᾆ ᾆ ᾎ ἎΙ # 1F86
+ ᾇ ᾇ ᾏ ἏΙ # 1F87
+ ᾈ ᾀ ᾈ ἈΙ # 1F88
+ ᾉ ᾁ ᾉ ἉΙ # 1F89
+ ᾊ ᾂ ᾊ ἊΙ # 1F8A
+ ᾋ ᾃ ᾋ ἋΙ # 1F8B
+ ᾌ ᾄ ᾌ ἌΙ # 1F8C
+ ᾍ ᾅ ᾍ ἍΙ # 1F8D
+ ᾎ ᾆ ᾎ ἎΙ # 1F8E
+ ᾏ ᾇ ᾏ ἏΙ # 1F8F
+ ᾐ ᾐ ᾘ ἨΙ # 1F90
+ ᾑ ᾑ ᾙ ἩΙ # 1F91
+ ᾒ ᾒ ᾚ ἪΙ # 1F92
+ ᾓ ᾓ ᾛ ἫΙ # 1F93
+ ᾔ ᾔ ᾜ ἬΙ # 1F94
+ ᾕ ᾕ ᾝ ἭΙ # 1F95
+ ᾖ ᾖ ᾞ ἮΙ # 1F96
+ ᾗ ᾗ ᾟ ἯΙ # 1F97
+ ᾘ ᾐ ᾘ ἨΙ # 1F98
+ ᾙ ᾑ ᾙ ἩΙ # 1F99
+ ᾚ ᾒ ᾚ ἪΙ # 1F9A
+ ᾛ ᾓ ᾛ ἫΙ # 1F9B
+ ᾜ ᾔ ᾜ ἬΙ # 1F9C
+ ᾝ ᾕ ᾝ ἭΙ # 1F9D
+ ᾞ ᾖ ᾞ ἮΙ # 1F9E
+ ᾟ ᾗ ᾟ ἯΙ # 1F9F
+ ᾠ ᾠ ᾨ ὨΙ # 1FA0
+ ᾡ ᾡ ᾩ ὩΙ # 1FA1
+ ᾢ ᾢ ᾪ ὪΙ # 1FA2
+ ᾣ ᾣ ᾫ ὫΙ # 1FA3
+ ᾤ ᾤ ᾬ ὬΙ # 1FA4
+ ᾥ ᾥ ᾭ ὭΙ # 1FA5
+ ᾦ ᾦ ᾮ ὮΙ # 1FA6
+ ᾧ ᾧ ᾯ ὯΙ # 1FA7
+ ᾨ ᾠ ᾨ ὨΙ # 1FA8
+ ᾩ ᾡ ᾩ ὩΙ # 1FA9
+ ᾪ ᾢ ᾪ ὪΙ # 1FAA
+ ᾫ ᾣ ᾫ ὫΙ # 1FAB
+ ᾬ ᾤ ᾬ ὬΙ # 1FAC
+ ᾭ ᾥ ᾭ ὭΙ # 1FAD
+ ᾮ ᾦ ᾮ ὮΙ # 1FAE
+ ᾯ ᾧ ᾯ ὯΙ # 1FAF
+ ᾰ ᾰ Ᾰ Ᾰ # 1FB0
+ ᾱ ᾱ Ᾱ Ᾱ # 1FB1
+ ᾲ ᾲ Ὰͅ ᾺΙ # 1FB2
+ ᾳ ᾳ ᾼ ΑΙ # 1FB3
+ ᾴ ᾴ Άͅ ΆΙ # 1FB4
+ ᾶ ᾶ Α͂ Α͂ # 1FB6
+ ᾷ ᾷ ᾼ͂ Α͂Ι # 1FB7
+ Ᾰ ᾰ Ᾰ # 1FB8
+ Ᾱ ᾱ Ᾱ # 1FB9
+ Ὰ ὰ Ὰ # 1FBA
+ Ά ά Ά # 1FBB
+ ᾼ ᾳ ᾼ ΑΙ # 1FBC
+ ι ι Ι Ι # 1FBE
+ ῂ ῂ Ὴͅ ῊΙ # 1FC2
+ ῃ ῃ ῌ ΗΙ # 1FC3
+ ῄ ῄ Ήͅ ΉΙ # 1FC4
+ ῆ ῆ Η͂ Η͂ # 1FC6
+ ῇ ῇ ῌ͂ Η͂Ι # 1FC7
+ Ὲ ὲ Ὲ # 1FC8
+ Έ έ Έ # 1FC9
+ Ὴ ὴ Ὴ # 1FCA
+ Ή ή Ή # 1FCB
+ ῌ ῃ ῌ ΗΙ # 1FCC
+ ῐ ῐ Ῐ Ῐ # 1FD0
+ ῑ ῑ Ῑ Ῑ # 1FD1
+ ῒ ῒ Ϊ̀ Ϊ̀ # 1FD2
+ ΐ ΐ Ϊ́ Ϊ́ # 1FD3
+ ῖ ῖ Ι͂ Ι͂ # 1FD6
+ ῗ ῗ Ϊ͂ Ϊ͂ # 1FD7
+ Ῐ ῐ Ῐ # 1FD8
+ Ῑ ῑ Ῑ # 1FD9
+ Ὶ ὶ Ὶ # 1FDA
+ Ί ί Ί # 1FDB
+ ῠ ῠ Ῠ Ῠ # 1FE0
+ ῡ ῡ Ῡ Ῡ # 1FE1
+ ῢ ῢ Ϋ̀ Ϋ̀ # 1FE2
+ ΰ ΰ Ϋ́ Ϋ́ # 1FE3
+ ῤ ῤ Ρ̓ Ρ̓ # 1FE4
+ ῥ ῥ Ῥ Ῥ # 1FE5
+ ῦ ῦ Υ͂ Υ͂ # 1FE6
+ ῧ ῧ Ϋ͂ Ϋ͂ # 1FE7
+ Ῠ ῠ Ῠ # 1FE8
+ Ῡ ῡ Ῡ # 1FE9
+ Ὺ ὺ Ὺ # 1FEA
+ Ύ ύ Ύ # 1FEB
+ Ῥ ῥ Ῥ # 1FEC
+ ῲ ῲ Ὼͅ ῺΙ # 1FF2
+ ῳ ῳ ῼ ΩΙ # 1FF3
+ ῴ ῴ Ώͅ ΏΙ # 1FF4
+ ῶ ῶ Ω͂ Ω͂ # 1FF6
+ ῷ ῷ ῼ͂ Ω͂Ι # 1FF7
+ Ὸ ὸ Ὸ # 1FF8
+ Ό ό Ό # 1FF9
+ Ὼ ὼ Ὼ # 1FFA
+ Ώ ώ Ώ # 1FFB
+ ῼ ῳ ῼ ΩΙ # 1FFC
+ ⁱ ⁱ # 2071
+ ⁿ ⁿ # 207F
+ ℂ ℂ # 2102
+ ℇ ℇ # 2107
+ ℊ ℊ # 210A
+ ℋ ℋ # 210B
+ ℌ ℌ # 210C
+ ℍ ℍ # 210D
+ ℎ ℎ # 210E
+ ℏ ℏ # 210F
+ ℐ ℐ # 2110
+ ℑ ℑ # 2111
+ ℒ ℒ # 2112
+ ℓ ℓ # 2113
+ ℕ ℕ # 2115
+ ℙ ℙ # 2119
+ ℚ ℚ # 211A
+ ℛ ℛ # 211B
+ ℜ ℜ # 211C
+ ℝ ℝ # 211D
+ ℤ ℤ # 2124
+ Ω ω Ω # 2126
+ ℨ ℨ # 2128
+ K k K # 212A
+ Å å Å # 212B
+ ℬ ℬ # 212C
+ ℭ ℭ # 212D
+ ℯ ℯ # 212F
+ ℰ ℰ # 2130
+ ℱ ℱ # 2131
+ Ⅎ ⅎ Ⅎ # 2132
+ ℳ ℳ # 2133
+ ℴ ℴ # 2134
+ ℹ ℹ # 2139
+ ℼ ℼ # 213C
+ ℽ ℽ # 213D
+ ℾ ℾ # 213E
+ ℿ ℿ # 213F
+ ⅅ ⅅ # 2145
+ ⅆ ⅆ # 2146
+ ⅇ ⅇ # 2147
+ ⅈ ⅈ # 2148
+ ⅉ ⅉ # 2149
+ ⅎ ⅎ Ⅎ Ⅎ # 214E
+ Ↄ ↄ Ↄ # 2183
+ ↄ ↄ Ↄ Ↄ # 2184
+ Ⰰ ⰰ Ⰰ # 2C00
+ Ⰱ ⰱ Ⰱ # 2C01
+ Ⰲ ⰲ Ⰲ # 2C02
+ Ⰳ ⰳ Ⰳ # 2C03
+ Ⰴ ⰴ Ⰴ # 2C04
+ Ⰵ ⰵ Ⰵ # 2C05
+ Ⰶ ⰶ Ⰶ # 2C06
+ Ⰷ ⰷ Ⰷ # 2C07
+ Ⰸ ⰸ Ⰸ # 2C08
+ Ⰹ ⰹ Ⰹ # 2C09
+ Ⰺ ⰺ Ⰺ # 2C0A
+ Ⰻ ⰻ Ⰻ # 2C0B
+ Ⰼ ⰼ Ⰼ # 2C0C
+ Ⰽ ⰽ Ⰽ # 2C0D
+ Ⰾ ⰾ Ⰾ # 2C0E
+ Ⰿ ⰿ Ⰿ # 2C0F
+ Ⱀ ⱀ Ⱀ # 2C10
+ Ⱁ ⱁ Ⱁ # 2C11
+ Ⱂ ⱂ Ⱂ # 2C12
+ Ⱃ ⱃ Ⱃ # 2C13
+ Ⱄ ⱄ Ⱄ # 2C14
+ Ⱅ ⱅ Ⱅ # 2C15
+ Ⱆ ⱆ Ⱆ # 2C16
+ Ⱇ ⱇ Ⱇ # 2C17
+ Ⱈ ⱈ Ⱈ # 2C18
+ Ⱉ ⱉ Ⱉ # 2C19
+ Ⱊ ⱊ Ⱊ # 2C1A
+ Ⱋ ⱋ Ⱋ # 2C1B
+ Ⱌ ⱌ Ⱌ # 2C1C
+ Ⱍ ⱍ Ⱍ # 2C1D
+ Ⱎ ⱎ Ⱎ # 2C1E
+ Ⱏ ⱏ Ⱏ # 2C1F
+ Ⱐ ⱐ Ⱐ # 2C20
+ Ⱑ ⱑ Ⱑ # 2C21
+ Ⱒ ⱒ Ⱒ # 2C22
+ Ⱓ ⱓ Ⱓ # 2C23
+ Ⱔ ⱔ Ⱔ # 2C24
+ Ⱕ ⱕ Ⱕ # 2C25
+ Ⱖ ⱖ Ⱖ # 2C26
+ Ⱗ ⱗ Ⱗ # 2C27
+ Ⱘ ⱘ Ⱘ # 2C28
+ Ⱙ ⱙ Ⱙ # 2C29
+ Ⱚ ⱚ Ⱚ # 2C2A
+ Ⱛ ⱛ Ⱛ # 2C2B
+ Ⱜ ⱜ Ⱜ # 2C2C
+ Ⱝ ⱝ Ⱝ # 2C2D
+ Ⱞ ⱞ Ⱞ # 2C2E
+ ⰰ ⰰ Ⰰ Ⰰ # 2C30
+ ⰱ ⰱ Ⰱ Ⰱ # 2C31
+ ⰲ ⰲ Ⰲ Ⰲ # 2C32
+ ⰳ ⰳ Ⰳ Ⰳ # 2C33
+ ⰴ ⰴ Ⰴ Ⰴ # 2C34
+ ⰵ ⰵ Ⰵ Ⰵ # 2C35
+ ⰶ ⰶ Ⰶ Ⰶ # 2C36
+ ⰷ ⰷ Ⰷ Ⰷ # 2C37
+ ⰸ ⰸ Ⰸ Ⰸ # 2C38
+ ⰹ ⰹ Ⰹ Ⰹ # 2C39
+ ⰺ ⰺ Ⰺ Ⰺ # 2C3A
+ ⰻ ⰻ Ⰻ Ⰻ # 2C3B
+ ⰼ ⰼ Ⰼ Ⰼ # 2C3C
+ ⰽ ⰽ Ⰽ Ⰽ # 2C3D
+ ⰾ ⰾ Ⰾ Ⰾ # 2C3E
+ ⰿ ⰿ Ⰿ Ⰿ # 2C3F
+ ⱀ ⱀ Ⱀ Ⱀ # 2C40
+ ⱁ ⱁ Ⱁ Ⱁ # 2C41
+ ⱂ ⱂ Ⱂ Ⱂ # 2C42
+ ⱃ ⱃ Ⱃ Ⱃ # 2C43
+ ⱄ ⱄ Ⱄ Ⱄ # 2C44
+ ⱅ ⱅ Ⱅ Ⱅ # 2C45
+ ⱆ ⱆ Ⱆ Ⱆ # 2C46
+ ⱇ ⱇ Ⱇ Ⱇ # 2C47
+ ⱈ ⱈ Ⱈ Ⱈ # 2C48
+ ⱉ ⱉ Ⱉ Ⱉ # 2C49
+ ⱊ ⱊ Ⱊ Ⱊ # 2C4A
+ ⱋ ⱋ Ⱋ Ⱋ # 2C4B
+ ⱌ ⱌ Ⱌ Ⱌ # 2C4C
+ ⱍ ⱍ Ⱍ Ⱍ # 2C4D
+ ⱎ ⱎ Ⱎ Ⱎ # 2C4E
+ ⱏ ⱏ Ⱏ Ⱏ # 2C4F
+ ⱐ ⱐ Ⱐ Ⱐ # 2C50
+ ⱑ ⱑ Ⱑ Ⱑ # 2C51
+ ⱒ ⱒ Ⱒ Ⱒ # 2C52
+ ⱓ ⱓ Ⱓ Ⱓ # 2C53
+ ⱔ ⱔ Ⱔ Ⱔ # 2C54
+ ⱕ ⱕ Ⱕ Ⱕ # 2C55
+ ⱖ ⱖ Ⱖ Ⱖ # 2C56
+ ⱗ ⱗ Ⱗ Ⱗ # 2C57
+ ⱘ ⱘ Ⱘ Ⱘ # 2C58
+ ⱙ ⱙ Ⱙ Ⱙ # 2C59
+ ⱚ ⱚ Ⱚ Ⱚ # 2C5A
+ ⱛ ⱛ Ⱛ Ⱛ # 2C5B
+ ⱜ ⱜ Ⱜ Ⱜ # 2C5C
+ ⱝ ⱝ Ⱝ Ⱝ # 2C5D
+ ⱞ ⱞ Ⱞ Ⱞ # 2C5E
+ Ⱡ ⱡ Ⱡ # 2C60
+ ⱡ ⱡ Ⱡ Ⱡ # 2C61
+ Ɫ ɫ Ɫ # 2C62
+ Ᵽ ᵽ Ᵽ # 2C63
+ Ɽ ɽ Ɽ # 2C64
+ ⱥ ⱥ Ⱥ Ⱥ # 2C65
+ ⱦ ⱦ Ⱦ Ⱦ # 2C66
+ Ⱨ ⱨ Ⱨ # 2C67
+ ⱨ ⱨ Ⱨ Ⱨ # 2C68
+ Ⱪ ⱪ Ⱪ # 2C69
+ ⱪ ⱪ Ⱪ Ⱪ # 2C6A
+ Ⱬ ⱬ Ⱬ # 2C6B
+ ⱬ ⱬ Ⱬ Ⱬ # 2C6C
+ ⱴ ⱴ # 2C74
+ Ⱶ ⱶ Ⱶ # 2C75
+ ⱶ ⱶ Ⱶ Ⱶ # 2C76
+ ⱷ ⱷ # 2C77
+ Ⲁ ⲁ Ⲁ # 2C80
+ ⲁ ⲁ Ⲁ Ⲁ # 2C81
+ Ⲃ ⲃ Ⲃ # 2C82
+ ⲃ ⲃ Ⲃ Ⲃ # 2C83
+ Ⲅ ⲅ Ⲅ # 2C84
+ ⲅ ⲅ Ⲅ Ⲅ # 2C85
+ Ⲇ ⲇ Ⲇ # 2C86
+ ⲇ ⲇ Ⲇ Ⲇ # 2C87
+ Ⲉ ⲉ Ⲉ # 2C88
+ ⲉ ⲉ Ⲉ Ⲉ # 2C89
+ Ⲋ ⲋ Ⲋ # 2C8A
+ ⲋ ⲋ Ⲋ Ⲋ # 2C8B
+ Ⲍ ⲍ Ⲍ # 2C8C
+ ⲍ ⲍ Ⲍ Ⲍ # 2C8D
+ Ⲏ ⲏ Ⲏ # 2C8E
+ ⲏ ⲏ Ⲏ Ⲏ # 2C8F
+ Ⲑ ⲑ Ⲑ # 2C90
+ ⲑ ⲑ Ⲑ Ⲑ # 2C91
+ Ⲓ ⲓ Ⲓ # 2C92
+ ⲓ ⲓ Ⲓ Ⲓ # 2C93
+ Ⲕ ⲕ Ⲕ # 2C94
+ ⲕ ⲕ Ⲕ Ⲕ # 2C95
+ Ⲗ ⲗ Ⲗ # 2C96
+ ⲗ ⲗ Ⲗ Ⲗ # 2C97
+ Ⲙ ⲙ Ⲙ # 2C98
+ ⲙ ⲙ Ⲙ Ⲙ # 2C99
+ Ⲛ ⲛ Ⲛ # 2C9A
+ ⲛ ⲛ Ⲛ Ⲛ # 2C9B
+ Ⲝ ⲝ Ⲝ # 2C9C
+ ⲝ ⲝ Ⲝ Ⲝ # 2C9D
+ Ⲟ ⲟ Ⲟ # 2C9E
+ ⲟ ⲟ Ⲟ Ⲟ # 2C9F
+ Ⲡ ⲡ Ⲡ # 2CA0
+ ⲡ ⲡ Ⲡ Ⲡ # 2CA1
+ Ⲣ ⲣ Ⲣ # 2CA2
+ ⲣ ⲣ Ⲣ Ⲣ # 2CA3
+ Ⲥ ⲥ Ⲥ # 2CA4
+ ⲥ ⲥ Ⲥ Ⲥ # 2CA5
+ Ⲧ ⲧ Ⲧ # 2CA6
+ ⲧ ⲧ Ⲧ Ⲧ # 2CA7
+ Ⲩ ⲩ Ⲩ # 2CA8
+ ⲩ ⲩ Ⲩ Ⲩ # 2CA9
+ Ⲫ ⲫ Ⲫ # 2CAA
+ ⲫ ⲫ Ⲫ Ⲫ # 2CAB
+ Ⲭ ⲭ Ⲭ # 2CAC
+ ⲭ ⲭ Ⲭ Ⲭ # 2CAD
+ Ⲯ ⲯ Ⲯ # 2CAE
+ ⲯ ⲯ Ⲯ Ⲯ # 2CAF
+ Ⲱ ⲱ Ⲱ # 2CB0
+ ⲱ ⲱ Ⲱ Ⲱ # 2CB1
+ Ⲳ ⲳ Ⲳ # 2CB2
+ ⲳ ⲳ Ⲳ Ⲳ # 2CB3
+ Ⲵ ⲵ Ⲵ # 2CB4
+ ⲵ ⲵ Ⲵ Ⲵ # 2CB5
+ Ⲷ ⲷ Ⲷ # 2CB6
+ ⲷ ⲷ Ⲷ Ⲷ # 2CB7
+ Ⲹ ⲹ Ⲹ # 2CB8
+ ⲹ ⲹ Ⲹ Ⲹ # 2CB9
+ Ⲻ ⲻ Ⲻ # 2CBA
+ ⲻ ⲻ Ⲻ Ⲻ # 2CBB
+ Ⲽ ⲽ Ⲽ # 2CBC
+ ⲽ ⲽ Ⲽ Ⲽ # 2CBD
+ Ⲿ ⲿ Ⲿ # 2CBE
+ ⲿ ⲿ Ⲿ Ⲿ # 2CBF
+ Ⳁ ⳁ Ⳁ # 2CC0
+ ⳁ ⳁ Ⳁ Ⳁ # 2CC1
+ Ⳃ ⳃ Ⳃ # 2CC2
+ ⳃ ⳃ Ⳃ Ⳃ # 2CC3
+ Ⳅ ⳅ Ⳅ # 2CC4
+ ⳅ ⳅ Ⳅ Ⳅ # 2CC5
+ Ⳇ ⳇ Ⳇ # 2CC6
+ ⳇ ⳇ Ⳇ Ⳇ # 2CC7
+ Ⳉ ⳉ Ⳉ # 2CC8
+ ⳉ ⳉ Ⳉ Ⳉ # 2CC9
+ Ⳋ ⳋ Ⳋ # 2CCA
+ ⳋ ⳋ Ⳋ Ⳋ # 2CCB
+ Ⳍ ⳍ Ⳍ # 2CCC
+ ⳍ ⳍ Ⳍ Ⳍ # 2CCD
+ Ⳏ ⳏ Ⳏ # 2CCE
+ ⳏ ⳏ Ⳏ Ⳏ # 2CCF
+ Ⳑ ⳑ Ⳑ # 2CD0
+ ⳑ ⳑ Ⳑ Ⳑ # 2CD1
+ Ⳓ ⳓ Ⳓ # 2CD2
+ ⳓ ⳓ Ⳓ Ⳓ # 2CD3
+ Ⳕ ⳕ Ⳕ # 2CD4
+ ⳕ ⳕ Ⳕ Ⳕ # 2CD5
+ Ⳗ ⳗ Ⳗ # 2CD6
+ ⳗ ⳗ Ⳗ Ⳗ # 2CD7
+ Ⳙ ⳙ Ⳙ # 2CD8
+ ⳙ ⳙ Ⳙ Ⳙ # 2CD9
+ Ⳛ ⳛ Ⳛ # 2CDA
+ ⳛ ⳛ Ⳛ Ⳛ # 2CDB
+ Ⳝ ⳝ Ⳝ # 2CDC
+ ⳝ ⳝ Ⳝ Ⳝ # 2CDD
+ Ⳟ ⳟ Ⳟ # 2CDE
+ ⳟ ⳟ Ⳟ Ⳟ # 2CDF
+ Ⳡ ⳡ Ⳡ # 2CE0
+ ⳡ ⳡ Ⳡ Ⳡ # 2CE1
+ Ⳣ ⳣ Ⳣ # 2CE2
+ ⳣ ⳣ Ⳣ Ⳣ # 2CE3
+ ⳤ ⳤ # 2CE4
+ ⴀ ⴀ Ⴀ Ⴀ # 2D00
+ ⴁ ⴁ Ⴁ Ⴁ # 2D01
+ ⴂ ⴂ Ⴂ Ⴂ # 2D02
+ ⴃ ⴃ Ⴃ Ⴃ # 2D03
+ ⴄ ⴄ Ⴄ Ⴄ # 2D04
+ ⴅ ⴅ Ⴅ Ⴅ # 2D05
+ ⴆ ⴆ Ⴆ Ⴆ # 2D06
+ ⴇ ⴇ Ⴇ Ⴇ # 2D07
+ ⴈ ⴈ Ⴈ Ⴈ # 2D08
+ ⴉ ⴉ Ⴉ Ⴉ # 2D09
+ ⴊ ⴊ Ⴊ Ⴊ # 2D0A
+ ⴋ ⴋ Ⴋ Ⴋ # 2D0B
+ ⴌ ⴌ Ⴌ Ⴌ # 2D0C
+ ⴍ ⴍ Ⴍ Ⴍ # 2D0D
+ ⴎ ⴎ Ⴎ Ⴎ # 2D0E
+ ⴏ ⴏ Ⴏ Ⴏ # 2D0F
+ ⴐ ⴐ Ⴐ Ⴐ # 2D10
+ ⴑ ⴑ Ⴑ Ⴑ # 2D11
+ ⴒ ⴒ Ⴒ Ⴒ # 2D12
+ ⴓ ⴓ Ⴓ Ⴓ # 2D13
+ ⴔ ⴔ Ⴔ Ⴔ # 2D14
+ ⴕ ⴕ Ⴕ Ⴕ # 2D15
+ ⴖ ⴖ Ⴖ Ⴖ # 2D16
+ ⴗ ⴗ Ⴗ Ⴗ # 2D17
+ ⴘ ⴘ Ⴘ Ⴘ # 2D18
+ ⴙ ⴙ Ⴙ Ⴙ # 2D19
+ ⴚ ⴚ Ⴚ Ⴚ # 2D1A
+ ⴛ ⴛ Ⴛ Ⴛ # 2D1B
+ ⴜ ⴜ Ⴜ Ⴜ # 2D1C
+ ⴝ ⴝ Ⴝ Ⴝ # 2D1D
+ ⴞ ⴞ Ⴞ Ⴞ # 2D1E
+ ⴟ ⴟ Ⴟ Ⴟ # 2D1F
+ ⴠ ⴠ Ⴠ Ⴠ # 2D20
+ ⴡ ⴡ Ⴡ Ⴡ # 2D21
+ ⴢ ⴢ Ⴢ Ⴢ # 2D22
+ ⴣ ⴣ Ⴣ Ⴣ # 2D23
+ ⴤ ⴤ Ⴤ Ⴤ # 2D24
+ ⴥ ⴥ Ⴥ Ⴥ # 2D25
+ ff ff Ff FF # FB00
+ fi fi Fi FI # FB01
+ fl fl Fl FL # FB02
+ ffi ffi Ffi FFI # FB03
+ ffl ffl Ffl FFL # FB04
+ ſt ſt St ST # FB05
+ st st St ST # FB06
+ ﬓ ﬓ Մն ՄՆ # FB13
+ ﬔ ﬔ Մե ՄԵ # FB14
+ ﬕ ﬕ Մի ՄԻ # FB15
+ ﬖ ﬖ Վն ՎՆ # FB16
+ ﬗ ﬗ Մխ ՄԽ # FB17
+ A a A # FF21
+ B b B # FF22
+ C c C # FF23
+ D d D # FF24
+ E e E # FF25
+ F f F # FF26
+ G g G # FF27
+ H h H # FF28
+ I i I # FF29
+ J j J # FF2A
+ K k K # FF2B
+ L l L # FF2C
+ M m M # FF2D
+ N n N # FF2E
+ O o O # FF2F
+ P p P # FF30
+ Q q Q # FF31
+ R r R # FF32
+ S s S # FF33
+ T t T # FF34
+ U u U # FF35
+ V v V # FF36
+ W w W # FF37
+ X x X # FF38
+ Y y Y # FF39
+ Z z Z # FF3A
+ a a A A # FF41
+ b b B B # FF42
+ c c C C # FF43
+ d d D D # FF44
+ e e E E # FF45
+ f f F F # FF46
+ g g G G # FF47
+ h h H H # FF48
+ i i I I # FF49
+ j j J J # FF4A
+ k k K K # FF4B
+ l l L L # FF4C
+ m m M M # FF4D
+ n n N N # FF4E
+ o o O O # FF4F
+ p p P P # FF50
+ q q Q Q # FF51
+ r r R R # FF52
+ s s S S # FF53
+ t t T T # FF54
+ u u U U # FF55
+ v v V V # FF56
+ w w W W # FF57
+ x x X X # FF58
+ y y Y Y # FF59
+ z z Z Z # FF5A
+ 𐐀 𐐨 𐐀 # 10400
+ 𐐁 𐐩 𐐁 # 10401
+ 𐐂 𐐪 𐐂 # 10402
+ 𐐃 𐐫 𐐃 # 10403
+ 𐐄 𐐬 𐐄 # 10404
+ 𐐅 𐐭 𐐅 # 10405
+ 𐐆 𐐮 𐐆 # 10406
+ 𐐇 𐐯 𐐇 # 10407
+ 𐐈 𐐰 𐐈 # 10408
+ 𐐉 𐐱 𐐉 # 10409
+ 𐐊 𐐲 𐐊 # 1040A
+ 𐐋 𐐳 𐐋 # 1040B
+ 𐐌 𐐴 𐐌 # 1040C
+ 𐐍 𐐵 𐐍 # 1040D
+ 𐐎 𐐶 𐐎 # 1040E
+ 𐐏 𐐷 𐐏 # 1040F
+ 𐐐 𐐸 𐐐 # 10410
+ 𐐑 𐐹 𐐑 # 10411
+ 𐐒 𐐺 𐐒 # 10412
+ 𐐓 𐐻 𐐓 # 10413
+ 𐐔 𐐼 𐐔 # 10414
+ 𐐕 𐐽 𐐕 # 10415
+ 𐐖 𐐾 𐐖 # 10416
+ 𐐗 𐐿 𐐗 # 10417
+ 𐐘 𐑀 𐐘 # 10418
+ 𐐙 𐑁 𐐙 # 10419
+ 𐐚 𐑂 𐐚 # 1041A
+ 𐐛 𐑃 𐐛 # 1041B
+ 𐐜 𐑄 𐐜 # 1041C
+ 𐐝 𐑅 𐐝 # 1041D
+ 𐐞 𐑆 𐐞 # 1041E
+ 𐐟 𐑇 𐐟 # 1041F
+ 𐐠 𐑈 𐐠 # 10420
+ 𐐡 𐑉 𐐡 # 10421
+ 𐐢 𐑊 𐐢 # 10422
+ 𐐣 𐑋 𐐣 # 10423
+ 𐐤 𐑌 𐐤 # 10424
+ 𐐥 𐑍 𐐥 # 10425
+ 𐐦 𐑎 𐐦 # 10426
+ 𐐧 𐑏 𐐧 # 10427
+ 𐐨 𐐨 𐐀 𐐀 # 10428
+ 𐐩 𐐩 𐐁 𐐁 # 10429
+ 𐐪 𐐪 𐐂 𐐂 # 1042A
+ 𐐫 𐐫 𐐃 𐐃 # 1042B
+ 𐐬 𐐬 𐐄 𐐄 # 1042C
+ 𐐭 𐐭 𐐅 𐐅 # 1042D
+ 𐐮 𐐮 𐐆 𐐆 # 1042E
+ 𐐯 𐐯 𐐇 𐐇 # 1042F
+ 𐐰 𐐰 𐐈 𐐈 # 10430
+ 𐐱 𐐱 𐐉 𐐉 # 10431
+ 𐐲 𐐲 𐐊 𐐊 # 10432
+ 𐐳 𐐳 𐐋 𐐋 # 10433
+ 𐐴 𐐴 𐐌 𐐌 # 10434
+ 𐐵 𐐵 𐐍 𐐍 # 10435
+ 𐐶 𐐶 𐐎 𐐎 # 10436
+ 𐐷 𐐷 𐐏 𐐏 # 10437
+ 𐐸 𐐸 𐐐 𐐐 # 10438
+ 𐐹 𐐹 𐐑 𐐑 # 10439
+ 𐐺 𐐺 𐐒 𐐒 # 1043A
+ 𐐻 𐐻 𐐓 𐐓 # 1043B
+ 𐐼 𐐼 𐐔 𐐔 # 1043C
+ 𐐽 𐐽 𐐕 𐐕 # 1043D
+ 𐐾 𐐾 𐐖 𐐖 # 1043E
+ 𐐿 𐐿 𐐗 𐐗 # 1043F
+ 𐑀 𐑀 𐐘 𐐘 # 10440
+ 𐑁 𐑁 𐐙 𐐙 # 10441
+ 𐑂 𐑂 𐐚 𐐚 # 10442
+ 𐑃 𐑃 𐐛 𐐛 # 10443
+ 𐑄 𐑄 𐐜 𐐜 # 10444
+ 𐑅 𐑅 𐐝 𐐝 # 10445
+ 𐑆 𐑆 𐐞 𐐞 # 10446
+ 𐑇 𐑇 𐐟 𐐟 # 10447
+ 𐑈 𐑈 𐐠 𐐠 # 10448
+ 𐑉 𐑉 𐐡 𐐡 # 10449
+ 𐑊 𐑊 𐐢 𐐢 # 1044A
+ 𐑋 𐑋 𐐣 𐐣 # 1044B
+ 𐑌 𐑌 𐐤 𐐤 # 1044C
+ 𐑍 𐑍 𐐥 𐐥 # 1044D
+ 𐑎 𐑎 𐐦 𐐦 # 1044E
+ 𐑏 𐑏 𐐧 𐐧 # 1044F
+ 𝐀 𝐀 # 1D400
+ 𝐁 𝐁 # 1D401
+ 𝐂 𝐂 # 1D402
+ 𝐃 𝐃 # 1D403
+ 𝐄 𝐄 # 1D404
+ 𝐅 𝐅 # 1D405
+ 𝐆 𝐆 # 1D406
+ 𝐇 𝐇 # 1D407
+ 𝐈 𝐈 # 1D408
+ 𝐉 𝐉 # 1D409
+ 𝐊 𝐊 # 1D40A
+ 𝐋 𝐋 # 1D40B
+ 𝐌 𝐌 # 1D40C
+ 𝐍 𝐍 # 1D40D
+ 𝐎 𝐎 # 1D40E
+ 𝐏 𝐏 # 1D40F
+ 𝐐 𝐐 # 1D410
+ 𝐑 𝐑 # 1D411
+ 𝐒 𝐒 # 1D412
+ 𝐓 𝐓 # 1D413
+ 𝐔 𝐔 # 1D414
+ 𝐕 𝐕 # 1D415
+ 𝐖 𝐖 # 1D416
+ 𝐗 𝐗 # 1D417
+ 𝐘 𝐘 # 1D418
+ 𝐙 𝐙 # 1D419
+ 𝐚 𝐚 # 1D41A
+ 𝐛 𝐛 # 1D41B
+ 𝐜 𝐜 # 1D41C
+ 𝐝 𝐝 # 1D41D
+ 𝐞 𝐞 # 1D41E
+ 𝐟 𝐟 # 1D41F
+ 𝐠 𝐠 # 1D420
+ 𝐡 𝐡 # 1D421
+ 𝐢 𝐢 # 1D422
+ 𝐣 𝐣 # 1D423
+ 𝐤 𝐤 # 1D424
+ 𝐥 𝐥 # 1D425
+ 𝐦 𝐦 # 1D426
+ 𝐧 𝐧 # 1D427
+ 𝐨 𝐨 # 1D428
+ 𝐩 𝐩 # 1D429
+ 𝐪 𝐪 # 1D42A
+ 𝐫 𝐫 # 1D42B
+ 𝐬 𝐬 # 1D42C
+ 𝐭 𝐭 # 1D42D
+ 𝐮 𝐮 # 1D42E
+ 𝐯 𝐯 # 1D42F
+ 𝐰 𝐰 # 1D430
+ 𝐱 𝐱 # 1D431
+ 𝐲 𝐲 # 1D432
+ 𝐳 𝐳 # 1D433
+ 𝐴 𝐴 # 1D434
+ 𝐵 𝐵 # 1D435
+ 𝐶 𝐶 # 1D436
+ 𝐷 𝐷 # 1D437
+ 𝐸 𝐸 # 1D438
+ 𝐹 𝐹 # 1D439
+ 𝐺 𝐺 # 1D43A
+ 𝐻 𝐻 # 1D43B
+ 𝐼 𝐼 # 1D43C
+ 𝐽 𝐽 # 1D43D
+ 𝐾 𝐾 # 1D43E
+ 𝐿 𝐿 # 1D43F
+ 𝑀 𝑀 # 1D440
+ 𝑁 𝑁 # 1D441
+ 𝑂 𝑂 # 1D442
+ 𝑃 𝑃 # 1D443
+ 𝑄 𝑄 # 1D444
+ 𝑅 𝑅 # 1D445
+ 𝑆 𝑆 # 1D446
+ 𝑇 𝑇 # 1D447
+ 𝑈 𝑈 # 1D448
+ 𝑉 𝑉 # 1D449
+ 𝑊 𝑊 # 1D44A
+ 𝑋 𝑋 # 1D44B
+ 𝑌 𝑌 # 1D44C
+ 𝑍 𝑍 # 1D44D
+ 𝑎 𝑎 # 1D44E
+ 𝑏 𝑏 # 1D44F
+ 𝑐 𝑐 # 1D450
+ 𝑑 𝑑 # 1D451
+ 𝑒 𝑒 # 1D452
+ 𝑓 𝑓 # 1D453
+ 𝑔 𝑔 # 1D454
+ 𝑖 𝑖 # 1D456
+ 𝑗 𝑗 # 1D457
+ 𝑘 𝑘 # 1D458
+ 𝑙 𝑙 # 1D459
+ 𝑚 𝑚 # 1D45A
+ 𝑛 𝑛 # 1D45B
+ 𝑜 𝑜 # 1D45C
+ 𝑝 𝑝 # 1D45D
+ 𝑞 𝑞 # 1D45E
+ 𝑟 𝑟 # 1D45F
+ 𝑠 𝑠 # 1D460
+ 𝑡 𝑡 # 1D461
+ 𝑢 𝑢 # 1D462
+ 𝑣 𝑣 # 1D463
+ 𝑤 𝑤 # 1D464
+ 𝑥 𝑥 # 1D465
+ 𝑦 𝑦 # 1D466
+ 𝑧 𝑧 # 1D467
+ 𝑨 𝑨 # 1D468
+ 𝑩 𝑩 # 1D469
+ 𝑪 𝑪 # 1D46A
+ 𝑫 𝑫 # 1D46B
+ 𝑬 𝑬 # 1D46C
+ 𝑭 𝑭 # 1D46D
+ 𝑮 𝑮 # 1D46E
+ 𝑯 𝑯 # 1D46F
+ 𝑰 𝑰 # 1D470
+ 𝑱 𝑱 # 1D471
+ 𝑲 𝑲 # 1D472
+ 𝑳 𝑳 # 1D473
+ 𝑴 𝑴 # 1D474
+ 𝑵 𝑵 # 1D475
+ 𝑶 𝑶 # 1D476
+ 𝑷 𝑷 # 1D477
+ 𝑸 𝑸 # 1D478
+ 𝑹 𝑹 # 1D479
+ 𝑺 𝑺 # 1D47A
+ 𝑻 𝑻 # 1D47B
+ 𝑼 𝑼 # 1D47C
+ 𝑽 𝑽 # 1D47D
+ 𝑾 𝑾 # 1D47E
+ 𝑿 𝑿 # 1D47F
+ 𝒀 𝒀 # 1D480
+ 𝒁 𝒁 # 1D481
+ 𝒂 𝒂 # 1D482
+ 𝒃 𝒃 # 1D483
+ 𝒄 𝒄 # 1D484
+ 𝒅 𝒅 # 1D485
+ 𝒆 𝒆 # 1D486
+ 𝒇 𝒇 # 1D487
+ 𝒈 𝒈 # 1D488
+ 𝒉 𝒉 # 1D489
+ 𝒊 𝒊 # 1D48A
+ 𝒋 𝒋 # 1D48B
+ 𝒌 𝒌 # 1D48C
+ 𝒍 𝒍 # 1D48D
+ 𝒎 𝒎 # 1D48E
+ 𝒏 𝒏 # 1D48F
+ 𝒐 𝒐 # 1D490
+ 𝒑 𝒑 # 1D491
+ 𝒒 𝒒 # 1D492
+ 𝒓 𝒓 # 1D493
+ 𝒔 𝒔 # 1D494
+ 𝒕 𝒕 # 1D495
+ 𝒖 𝒖 # 1D496
+ 𝒗 𝒗 # 1D497
+ 𝒘 𝒘 # 1D498
+ 𝒙 𝒙 # 1D499
+ 𝒚 𝒚 # 1D49A
+ 𝒛 𝒛 # 1D49B
+ 𝒜 𝒜 # 1D49C
+ 𝒞 𝒞 # 1D49E
+ 𝒟 𝒟 # 1D49F
+ 𝒢 𝒢 # 1D4A2
+ 𝒥 𝒥 # 1D4A5
+ 𝒦 𝒦 # 1D4A6
+ 𝒩 𝒩 # 1D4A9
+ 𝒪 𝒪 # 1D4AA
+ 𝒫 𝒫 # 1D4AB
+ 𝒬 𝒬 # 1D4AC
+ 𝒮 𝒮 # 1D4AE
+ 𝒯 𝒯 # 1D4AF
+ 𝒰 𝒰 # 1D4B0
+ 𝒱 𝒱 # 1D4B1
+ 𝒲 𝒲 # 1D4B2
+ 𝒳 𝒳 # 1D4B3
+ 𝒴 𝒴 # 1D4B4
+ 𝒵 𝒵 # 1D4B5
+ 𝒶 𝒶 # 1D4B6
+ 𝒷 𝒷 # 1D4B7
+ 𝒸 𝒸 # 1D4B8
+ 𝒹 𝒹 # 1D4B9
+ 𝒻 𝒻 # 1D4BB
+ 𝒽 𝒽 # 1D4BD
+ 𝒾 𝒾 # 1D4BE
+ 𝒿 𝒿 # 1D4BF
+ 𝓀 𝓀 # 1D4C0
+ 𝓁 𝓁 # 1D4C1
+ 𝓂 𝓂 # 1D4C2
+ 𝓃 𝓃 # 1D4C3
+ 𝓅 𝓅 # 1D4C5
+ 𝓆 𝓆 # 1D4C6
+ 𝓇 𝓇 # 1D4C7
+ 𝓈 𝓈 # 1D4C8
+ 𝓉 𝓉 # 1D4C9
+ 𝓊 𝓊 # 1D4CA
+ 𝓋 𝓋 # 1D4CB
+ 𝓌 𝓌 # 1D4CC
+ 𝓍 𝓍 # 1D4CD
+ 𝓎 𝓎 # 1D4CE
+ 𝓏 𝓏 # 1D4CF
+ 𝓐 𝓐 # 1D4D0
+ 𝓑 𝓑 # 1D4D1
+ 𝓒 𝓒 # 1D4D2
+ 𝓓 𝓓 # 1D4D3
+ 𝓔 𝓔 # 1D4D4
+ 𝓕 𝓕 # 1D4D5
+ 𝓖 𝓖 # 1D4D6
+ 𝓗 𝓗 # 1D4D7
+ 𝓘 𝓘 # 1D4D8
+ 𝓙 𝓙 # 1D4D9
+ 𝓚 𝓚 # 1D4DA
+ 𝓛 𝓛 # 1D4DB
+ 𝓜 𝓜 # 1D4DC
+ 𝓝 𝓝 # 1D4DD
+ 𝓞 𝓞 # 1D4DE
+ 𝓟 𝓟 # 1D4DF
+ 𝓠 𝓠 # 1D4E0
+ 𝓡 𝓡 # 1D4E1
+ 𝓢 𝓢 # 1D4E2
+ 𝓣 𝓣 # 1D4E3
+ 𝓤 𝓤 # 1D4E4
+ 𝓥 𝓥 # 1D4E5
+ 𝓦 𝓦 # 1D4E6
+ 𝓧 𝓧 # 1D4E7
+ 𝓨 𝓨 # 1D4E8
+ 𝓩 𝓩 # 1D4E9
+ 𝓪 𝓪 # 1D4EA
+ 𝓫 𝓫 # 1D4EB
+ 𝓬 𝓬 # 1D4EC
+ 𝓭 𝓭 # 1D4ED
+ 𝓮 𝓮 # 1D4EE
+ 𝓯 𝓯 # 1D4EF
+ 𝓰 𝓰 # 1D4F0
+ 𝓱 𝓱 # 1D4F1
+ 𝓲 𝓲 # 1D4F2
+ 𝓳 𝓳 # 1D4F3
+ 𝓴 𝓴 # 1D4F4
+ 𝓵 𝓵 # 1D4F5
+ 𝓶 𝓶 # 1D4F6
+ 𝓷 𝓷 # 1D4F7
+ 𝓸 𝓸 # 1D4F8
+ 𝓹 𝓹 # 1D4F9
+ 𝓺 𝓺 # 1D4FA
+ 𝓻 𝓻 # 1D4FB
+ 𝓼 𝓼 # 1D4FC
+ 𝓽 𝓽 # 1D4FD
+ 𝓾 𝓾 # 1D4FE
+ 𝓿 𝓿 # 1D4FF
+ 𝔀 𝔀 # 1D500
+ 𝔁 𝔁 # 1D501
+ 𝔂 𝔂 # 1D502
+ 𝔃 𝔃 # 1D503
+ 𝔄 𝔄 # 1D504
+ 𝔅 𝔅 # 1D505
+ 𝔇 𝔇 # 1D507
+ 𝔈 𝔈 # 1D508
+ 𝔉 𝔉 # 1D509
+ 𝔊 𝔊 # 1D50A
+ 𝔍 𝔍 # 1D50D
+ 𝔎 𝔎 # 1D50E
+ 𝔏 𝔏 # 1D50F
+ 𝔐 𝔐 # 1D510
+ 𝔑 𝔑 # 1D511
+ 𝔒 𝔒 # 1D512
+ 𝔓 𝔓 # 1D513
+ 𝔔 𝔔 # 1D514
+ 𝔖 𝔖 # 1D516
+ 𝔗 𝔗 # 1D517
+ 𝔘 𝔘 # 1D518
+ 𝔙 𝔙 # 1D519
+ 𝔚 𝔚 # 1D51A
+ 𝔛 𝔛 # 1D51B
+ 𝔜 𝔜 # 1D51C
+ 𝔞 𝔞 # 1D51E
+ 𝔟 𝔟 # 1D51F
+ 𝔠 𝔠 # 1D520
+ 𝔡 𝔡 # 1D521
+ 𝔢 𝔢 # 1D522
+ 𝔣 𝔣 # 1D523
+ 𝔤 𝔤 # 1D524
+ 𝔥 𝔥 # 1D525
+ 𝔦 𝔦 # 1D526
+ 𝔧 𝔧 # 1D527
+ 𝔨 𝔨 # 1D528
+ 𝔩 𝔩 # 1D529
+ 𝔪 𝔪 # 1D52A
+ 𝔫 𝔫 # 1D52B
+ 𝔬 𝔬 # 1D52C
+ 𝔭 𝔭 # 1D52D
+ 𝔮 𝔮 # 1D52E
+ 𝔯 𝔯 # 1D52F
+ 𝔰 𝔰 # 1D530
+ 𝔱 𝔱 # 1D531
+ 𝔲 𝔲 # 1D532
+ 𝔳 𝔳 # 1D533
+ 𝔴 𝔴 # 1D534
+ 𝔵 𝔵 # 1D535
+ 𝔶 𝔶 # 1D536
+ 𝔷 𝔷 # 1D537
+ 𝔸 𝔸 # 1D538
+ 𝔹 𝔹 # 1D539
+ 𝔻 𝔻 # 1D53B
+ 𝔼 𝔼 # 1D53C
+ 𝔽 𝔽 # 1D53D
+ 𝔾 𝔾 # 1D53E
+ 𝕀 𝕀 # 1D540
+ 𝕁 𝕁 # 1D541
+ 𝕂 𝕂 # 1D542
+ 𝕃 𝕃 # 1D543
+ 𝕄 𝕄 # 1D544
+ 𝕆 𝕆 # 1D546
+ 𝕊 𝕊 # 1D54A
+ 𝕋 𝕋 # 1D54B
+ 𝕌 𝕌 # 1D54C
+ 𝕍 𝕍 # 1D54D
+ 𝕎 𝕎 # 1D54E
+ 𝕏 𝕏 # 1D54F
+ 𝕐 𝕐 # 1D550
+ 𝕒 𝕒 # 1D552
+ 𝕓 𝕓 # 1D553
+ 𝕔 𝕔 # 1D554
+ 𝕕 𝕕 # 1D555
+ 𝕖 𝕖 # 1D556
+ 𝕗 𝕗 # 1D557
+ 𝕘 𝕘 # 1D558
+ 𝕙 𝕙 # 1D559
+ 𝕚 𝕚 # 1D55A
+ 𝕛 𝕛 # 1D55B
+ 𝕜 𝕜 # 1D55C
+ 𝕝 𝕝 # 1D55D
+ 𝕞 𝕞 # 1D55E
+ 𝕟 𝕟 # 1D55F
+ 𝕠 𝕠 # 1D560
+ 𝕡 𝕡 # 1D561
+ 𝕢 𝕢 # 1D562
+ 𝕣 𝕣 # 1D563
+ 𝕤 𝕤 # 1D564
+ 𝕥 𝕥 # 1D565
+ 𝕦 𝕦 # 1D566
+ 𝕧 𝕧 # 1D567
+ 𝕨 𝕨 # 1D568
+ 𝕩 𝕩 # 1D569
+ 𝕪 𝕪 # 1D56A
+ 𝕫 𝕫 # 1D56B
+ 𝕬 𝕬 # 1D56C
+ 𝕭 𝕭 # 1D56D
+ 𝕮 𝕮 # 1D56E
+ 𝕯 𝕯 # 1D56F
+ 𝕰 𝕰 # 1D570
+ 𝕱 𝕱 # 1D571
+ 𝕲 𝕲 # 1D572
+ 𝕳 𝕳 # 1D573
+ 𝕴 𝕴 # 1D574
+ 𝕵 𝕵 # 1D575
+ 𝕶 𝕶 # 1D576
+ 𝕷 𝕷 # 1D577
+ 𝕸 𝕸 # 1D578
+ 𝕹 𝕹 # 1D579
+ 𝕺 𝕺 # 1D57A
+ 𝕻 𝕻 # 1D57B
+ 𝕼 𝕼 # 1D57C
+ 𝕽 𝕽 # 1D57D
+ 𝕾 𝕾 # 1D57E
+ 𝕿 𝕿 # 1D57F
+ 𝖀 𝖀 # 1D580
+ 𝖁 𝖁 # 1D581
+ 𝖂 𝖂 # 1D582
+ 𝖃 𝖃 # 1D583
+ 𝖄 𝖄 # 1D584
+ 𝖅 𝖅 # 1D585
+ 𝖆 𝖆 # 1D586
+ 𝖇 𝖇 # 1D587
+ 𝖈 𝖈 # 1D588
+ 𝖉 𝖉 # 1D589
+ 𝖊 𝖊 # 1D58A
+ 𝖋 𝖋 # 1D58B
+ 𝖌 𝖌 # 1D58C
+ 𝖍 𝖍 # 1D58D
+ 𝖎 𝖎 # 1D58E
+ 𝖏 𝖏 # 1D58F
+ 𝖐 𝖐 # 1D590
+ 𝖑 𝖑 # 1D591
+ 𝖒 𝖒 # 1D592
+ 𝖓 𝖓 # 1D593
+ 𝖔 𝖔 # 1D594
+ 𝖕 𝖕 # 1D595
+ 𝖖 𝖖 # 1D596
+ 𝖗 𝖗 # 1D597
+ 𝖘 𝖘 # 1D598
+ 𝖙 𝖙 # 1D599
+ 𝖚 𝖚 # 1D59A
+ 𝖛 𝖛 # 1D59B
+ 𝖜 𝖜 # 1D59C
+ 𝖝 𝖝 # 1D59D
+ 𝖞 𝖞 # 1D59E
+ 𝖟 𝖟 # 1D59F
+ 𝖠 𝖠 # 1D5A0
+ 𝖡 𝖡 # 1D5A1
+ 𝖢 𝖢 # 1D5A2
+ 𝖣 𝖣 # 1D5A3
+ 𝖤 𝖤 # 1D5A4
+ 𝖥 𝖥 # 1D5A5
+ 𝖦 𝖦 # 1D5A6
+ 𝖧 𝖧 # 1D5A7
+ 𝖨 𝖨 # 1D5A8
+ 𝖩 𝖩 # 1D5A9
+ 𝖪 𝖪 # 1D5AA
+ 𝖫 𝖫 # 1D5AB
+ 𝖬 𝖬 # 1D5AC
+ 𝖭 𝖭 # 1D5AD
+ 𝖮 𝖮 # 1D5AE
+ 𝖯 𝖯 # 1D5AF
+ 𝖰 𝖰 # 1D5B0
+ 𝖱 𝖱 # 1D5B1
+ 𝖲 𝖲 # 1D5B2
+ 𝖳 𝖳 # 1D5B3
+ 𝖴 𝖴 # 1D5B4
+ 𝖵 𝖵 # 1D5B5
+ 𝖶 𝖶 # 1D5B6
+ 𝖷 𝖷 # 1D5B7
+ 𝖸 𝖸 # 1D5B8
+ 𝖹 𝖹 # 1D5B9
+ 𝖺 𝖺 # 1D5BA
+ 𝖻 𝖻 # 1D5BB
+ 𝖼 𝖼 # 1D5BC
+ 𝖽 𝖽 # 1D5BD
+ 𝖾 𝖾 # 1D5BE
+ 𝖿 𝖿 # 1D5BF
+ 𝗀 𝗀 # 1D5C0
+ 𝗁 𝗁 # 1D5C1
+ 𝗂 𝗂 # 1D5C2
+ 𝗃 𝗃 # 1D5C3
+ 𝗄 𝗄 # 1D5C4
+ 𝗅 𝗅 # 1D5C5
+ 𝗆 𝗆 # 1D5C6
+ 𝗇 𝗇 # 1D5C7
+ 𝗈 𝗈 # 1D5C8
+ 𝗉 𝗉 # 1D5C9
+ 𝗊 𝗊 # 1D5CA
+ 𝗋 𝗋 # 1D5CB
+ 𝗌 𝗌 # 1D5CC
+ 𝗍 𝗍 # 1D5CD
+ 𝗎 𝗎 # 1D5CE
+ 𝗏 𝗏 # 1D5CF
+ 𝗐 𝗐 # 1D5D0
+ 𝗑 𝗑 # 1D5D1
+ 𝗒 𝗒 # 1D5D2
+ 𝗓 𝗓 # 1D5D3
+ 𝗔 𝗔 # 1D5D4
+ 𝗕 𝗕 # 1D5D5
+ 𝗖 𝗖 # 1D5D6
+ 𝗗 𝗗 # 1D5D7
+ 𝗘 𝗘 # 1D5D8
+ 𝗙 𝗙 # 1D5D9
+ 𝗚 𝗚 # 1D5DA
+ 𝗛 𝗛 # 1D5DB
+ 𝗜 𝗜 # 1D5DC
+ 𝗝 𝗝 # 1D5DD
+ 𝗞 𝗞 # 1D5DE
+ 𝗟 𝗟 # 1D5DF
+ 𝗠 𝗠 # 1D5E0
+ 𝗡 𝗡 # 1D5E1
+ 𝗢 𝗢 # 1D5E2
+ 𝗣 𝗣 # 1D5E3
+ 𝗤 𝗤 # 1D5E4
+ 𝗥 𝗥 # 1D5E5
+ 𝗦 𝗦 # 1D5E6
+ 𝗧 𝗧 # 1D5E7
+ 𝗨 𝗨 # 1D5E8
+ 𝗩 𝗩 # 1D5E9
+ 𝗪 𝗪 # 1D5EA
+ 𝗫 𝗫 # 1D5EB
+ 𝗬 𝗬 # 1D5EC
+ 𝗭 𝗭 # 1D5ED
+ 𝗮 𝗮 # 1D5EE
+ 𝗯 𝗯 # 1D5EF
+ 𝗰 𝗰 # 1D5F0
+ 𝗱 𝗱 # 1D5F1
+ 𝗲 𝗲 # 1D5F2
+ 𝗳 𝗳 # 1D5F3
+ 𝗴 𝗴 # 1D5F4
+ 𝗵 𝗵 # 1D5F5
+ 𝗶 𝗶 # 1D5F6
+ 𝗷 𝗷 # 1D5F7
+ 𝗸 𝗸 # 1D5F8
+ 𝗹 𝗹 # 1D5F9
+ 𝗺 𝗺 # 1D5FA
+ 𝗻 𝗻 # 1D5FB
+ 𝗼 𝗼 # 1D5FC
+ 𝗽 𝗽 # 1D5FD
+ 𝗾 𝗾 # 1D5FE
+ 𝗿 𝗿 # 1D5FF
+ 𝘀 𝘀 # 1D600
+ 𝘁 𝘁 # 1D601
+ 𝘂 𝘂 # 1D602
+ 𝘃 𝘃 # 1D603
+ 𝘄 𝘄 # 1D604
+ 𝘅 𝘅 # 1D605
+ 𝘆 𝘆 # 1D606
+ 𝘇 𝘇 # 1D607
+ 𝘈 𝘈 # 1D608
+ 𝘉 𝘉 # 1D609
+ 𝘊 𝘊 # 1D60A
+ 𝘋 𝘋 # 1D60B
+ 𝘌 𝘌 # 1D60C
+ 𝘍 𝘍 # 1D60D
+ 𝘎 𝘎 # 1D60E
+ 𝘏 𝘏 # 1D60F
+ 𝘐 𝘐 # 1D610
+ 𝘑 𝘑 # 1D611
+ 𝘒 𝘒 # 1D612
+ 𝘓 𝘓 # 1D613
+ 𝘔 𝘔 # 1D614
+ 𝘕 𝘕 # 1D615
+ 𝘖 𝘖 # 1D616
+ 𝘗 𝘗 # 1D617
+ 𝘘 𝘘 # 1D618
+ 𝘙 𝘙 # 1D619
+ 𝘚 𝘚 # 1D61A
+ 𝘛 𝘛 # 1D61B
+ 𝘜 𝘜 # 1D61C
+ 𝘝 𝘝 # 1D61D
+ 𝘞 𝘞 # 1D61E
+ 𝘟 𝘟 # 1D61F
+ 𝘠 𝘠 # 1D620
+ 𝘡 𝘡 # 1D621
+ 𝘢 𝘢 # 1D622
+ 𝘣 𝘣 # 1D623
+ 𝘤 𝘤 # 1D624
+ 𝘥 𝘥 # 1D625
+ 𝘦 𝘦 # 1D626
+ 𝘧 𝘧 # 1D627
+ 𝘨 𝘨 # 1D628
+ 𝘩 𝘩 # 1D629
+ 𝘪 𝘪 # 1D62A
+ 𝘫 𝘫 # 1D62B
+ 𝘬 𝘬 # 1D62C
+ 𝘭 𝘭 # 1D62D
+ 𝘮 𝘮 # 1D62E
+ 𝘯 𝘯 # 1D62F
+ 𝘰 𝘰 # 1D630
+ 𝘱 𝘱 # 1D631
+ 𝘲 𝘲 # 1D632
+ 𝘳 𝘳 # 1D633
+ 𝘴 𝘴 # 1D634
+ 𝘵 𝘵 # 1D635
+ 𝘶 𝘶 # 1D636
+ 𝘷 𝘷 # 1D637
+ 𝘸 𝘸 # 1D638
+ 𝘹 𝘹 # 1D639
+ 𝘺 𝘺 # 1D63A
+ 𝘻 𝘻 # 1D63B
+ 𝘼 𝘼 # 1D63C
+ 𝘽 𝘽 # 1D63D
+ 𝘾 𝘾 # 1D63E
+ 𝘿 𝘿 # 1D63F
+ 𝙀 𝙀 # 1D640
+ 𝙁 𝙁 # 1D641
+ 𝙂 𝙂 # 1D642
+ 𝙃 𝙃 # 1D643
+ 𝙄 𝙄 # 1D644
+ 𝙅 𝙅 # 1D645
+ 𝙆 𝙆 # 1D646
+ 𝙇 𝙇 # 1D647
+ 𝙈 𝙈 # 1D648
+ 𝙉 𝙉 # 1D649
+ 𝙊 𝙊 # 1D64A
+ 𝙋 𝙋 # 1D64B
+ 𝙌 𝙌 # 1D64C
+ 𝙍 𝙍 # 1D64D
+ 𝙎 𝙎 # 1D64E
+ 𝙏 𝙏 # 1D64F
+ 𝙐 𝙐 # 1D650
+ 𝙑 𝙑 # 1D651
+ 𝙒 𝙒 # 1D652
+ 𝙓 𝙓 # 1D653
+ 𝙔 𝙔 # 1D654
+ 𝙕 𝙕 # 1D655
+ 𝙖 𝙖 # 1D656
+ 𝙗 𝙗 # 1D657
+ 𝙘 𝙘 # 1D658
+ 𝙙 𝙙 # 1D659
+ 𝙚 𝙚 # 1D65A
+ 𝙛 𝙛 # 1D65B
+ 𝙜 𝙜 # 1D65C
+ 𝙝 𝙝 # 1D65D
+ 𝙞 𝙞 # 1D65E
+ 𝙟 𝙟 # 1D65F
+ 𝙠 𝙠 # 1D660
+ 𝙡 𝙡 # 1D661
+ 𝙢 𝙢 # 1D662
+ 𝙣 𝙣 # 1D663
+ 𝙤 𝙤 # 1D664
+ 𝙥 𝙥 # 1D665
+ 𝙦 𝙦 # 1D666
+ 𝙧 𝙧 # 1D667
+ 𝙨 𝙨 # 1D668
+ 𝙩 𝙩 # 1D669
+ 𝙪 𝙪 # 1D66A
+ 𝙫 𝙫 # 1D66B
+ 𝙬 𝙬 # 1D66C
+ 𝙭 𝙭 # 1D66D
+ 𝙮 𝙮 # 1D66E
+ 𝙯 𝙯 # 1D66F
+ 𝙰 𝙰 # 1D670
+ 𝙱 𝙱 # 1D671
+ 𝙲 𝙲 # 1D672
+ 𝙳 𝙳 # 1D673
+ 𝙴 𝙴 # 1D674
+ 𝙵 𝙵 # 1D675
+ 𝙶 𝙶 # 1D676
+ 𝙷 𝙷 # 1D677
+ 𝙸 𝙸 # 1D678
+ 𝙹 𝙹 # 1D679
+ 𝙺 𝙺 # 1D67A
+ 𝙻 𝙻 # 1D67B
+ 𝙼 𝙼 # 1D67C
+ 𝙽 𝙽 # 1D67D
+ 𝙾 𝙾 # 1D67E
+ 𝙿 𝙿 # 1D67F
+ 𝚀 𝚀 # 1D680
+ 𝚁 𝚁 # 1D681
+ 𝚂 𝚂 # 1D682
+ 𝚃 𝚃 # 1D683
+ 𝚄 𝚄 # 1D684
+ 𝚅 𝚅 # 1D685
+ 𝚆 𝚆 # 1D686
+ 𝚇 𝚇 # 1D687
+ 𝚈 𝚈 # 1D688
+ 𝚉 𝚉 # 1D689
+ 𝚊 𝚊 # 1D68A
+ 𝚋 𝚋 # 1D68B
+ 𝚌 𝚌 # 1D68C
+ 𝚍 𝚍 # 1D68D
+ 𝚎 𝚎 # 1D68E
+ 𝚏 𝚏 # 1D68F
+ 𝚐 𝚐 # 1D690
+ 𝚑 𝚑 # 1D691
+ 𝚒 𝚒 # 1D692
+ 𝚓 𝚓 # 1D693
+ 𝚔 𝚔 # 1D694
+ 𝚕 𝚕 # 1D695
+ 𝚖 𝚖 # 1D696
+ 𝚗 𝚗 # 1D697
+ 𝚘 𝚘 # 1D698
+ 𝚙 𝚙 # 1D699
+ 𝚚 𝚚 # 1D69A
+ 𝚛 𝚛 # 1D69B
+ 𝚜 𝚜 # 1D69C
+ 𝚝 𝚝 # 1D69D
+ 𝚞 𝚞 # 1D69E
+ 𝚟 𝚟 # 1D69F
+ 𝚠 𝚠 # 1D6A0
+ 𝚡 𝚡 # 1D6A1
+ 𝚢 𝚢 # 1D6A2
+ 𝚣 𝚣 # 1D6A3
+ 𝚤 𝚤 # 1D6A4
+ 𝚥 𝚥 # 1D6A5
+ 𝚨 𝚨 # 1D6A8
+ 𝚩 𝚩 # 1D6A9
+ 𝚪 𝚪 # 1D6AA
+ 𝚫 𝚫 # 1D6AB
+ 𝚬 𝚬 # 1D6AC
+ 𝚭 𝚭 # 1D6AD
+ 𝚮 𝚮 # 1D6AE
+ 𝚯 𝚯 # 1D6AF
+ 𝚰 𝚰 # 1D6B0
+ 𝚱 𝚱 # 1D6B1
+ 𝚲 𝚲 # 1D6B2
+ 𝚳 𝚳 # 1D6B3
+ 𝚴 𝚴 # 1D6B4
+ 𝚵 𝚵 # 1D6B5
+ 𝚶 𝚶 # 1D6B6
+ 𝚷 𝚷 # 1D6B7
+ 𝚸 𝚸 # 1D6B8
+ 𝚹 𝚹 # 1D6B9
+ 𝚺 𝚺 # 1D6BA
+ 𝚻 𝚻 # 1D6BB
+ 𝚼 𝚼 # 1D6BC
+ 𝚽 𝚽 # 1D6BD
+ 𝚾 𝚾 # 1D6BE
+ 𝚿 𝚿 # 1D6BF
+ 𝛀 𝛀 # 1D6C0
+ 𝛂 𝛂 # 1D6C2
+ 𝛃 𝛃 # 1D6C3
+ 𝛄 𝛄 # 1D6C4
+ 𝛅 𝛅 # 1D6C5
+ 𝛆 𝛆 # 1D6C6
+ 𝛇 𝛇 # 1D6C7
+ 𝛈 𝛈 # 1D6C8
+ 𝛉 𝛉 # 1D6C9
+ 𝛊 𝛊 # 1D6CA
+ 𝛋 𝛋 # 1D6CB
+ 𝛌 𝛌 # 1D6CC
+ 𝛍 𝛍 # 1D6CD
+ 𝛎 𝛎 # 1D6CE
+ 𝛏 𝛏 # 1D6CF
+ 𝛐 𝛐 # 1D6D0
+ 𝛑 𝛑 # 1D6D1
+ 𝛒 𝛒 # 1D6D2
+ 𝛓 𝛓 # 1D6D3
+ 𝛔 𝛔 # 1D6D4
+ 𝛕 𝛕 # 1D6D5
+ 𝛖 𝛖 # 1D6D6
+ 𝛗 𝛗 # 1D6D7
+ 𝛘 𝛘 # 1D6D8
+ 𝛙 𝛙 # 1D6D9
+ 𝛚 𝛚 # 1D6DA
+ 𝛜 𝛜 # 1D6DC
+ 𝛝 𝛝 # 1D6DD
+ 𝛞 𝛞 # 1D6DE
+ 𝛟 𝛟 # 1D6DF
+ 𝛠 𝛠 # 1D6E0
+ 𝛡 𝛡 # 1D6E1
+ 𝛢 𝛢 # 1D6E2
+ 𝛣 𝛣 # 1D6E3
+ 𝛤 𝛤 # 1D6E4
+ 𝛥 𝛥 # 1D6E5
+ 𝛦 𝛦 # 1D6E6
+ 𝛧 𝛧 # 1D6E7
+ 𝛨 𝛨 # 1D6E8
+ 𝛩 𝛩 # 1D6E9
+ 𝛪 𝛪 # 1D6EA
+ 𝛫 𝛫 # 1D6EB
+ 𝛬 𝛬 # 1D6EC
+ 𝛭 𝛭 # 1D6ED
+ 𝛮 𝛮 # 1D6EE
+ 𝛯 𝛯 # 1D6EF
+ 𝛰 𝛰 # 1D6F0
+ 𝛱 𝛱 # 1D6F1
+ 𝛲 𝛲 # 1D6F2
+ 𝛳 𝛳 # 1D6F3
+ 𝛴 𝛴 # 1D6F4
+ 𝛵 𝛵 # 1D6F5
+ 𝛶 𝛶 # 1D6F6
+ 𝛷 𝛷 # 1D6F7
+ 𝛸 𝛸 # 1D6F8
+ 𝛹 𝛹 # 1D6F9
+ 𝛺 𝛺 # 1D6FA
+ 𝛼 𝛼 # 1D6FC
+ 𝛽 𝛽 # 1D6FD
+ 𝛾 𝛾 # 1D6FE
+ 𝛿 𝛿 # 1D6FF
+ 𝜀 𝜀 # 1D700
+ 𝜁 𝜁 # 1D701
+ 𝜂 𝜂 # 1D702
+ 𝜃 𝜃 # 1D703
+ 𝜄 𝜄 # 1D704
+ 𝜅 𝜅 # 1D705
+ 𝜆 𝜆 # 1D706
+ 𝜇 𝜇 # 1D707
+ 𝜈 𝜈 # 1D708
+ 𝜉 𝜉 # 1D709
+ 𝜊 𝜊 # 1D70A
+ 𝜋 𝜋 # 1D70B
+ 𝜌 𝜌 # 1D70C
+ 𝜍 𝜍 # 1D70D
+ 𝜎 𝜎 # 1D70E
+ 𝜏 𝜏 # 1D70F
+ 𝜐 𝜐 # 1D710
+ 𝜑 𝜑 # 1D711
+ 𝜒 𝜒 # 1D712
+ 𝜓 𝜓 # 1D713
+ 𝜔 𝜔 # 1D714
+ 𝜖 𝜖 # 1D716
+ 𝜗 𝜗 # 1D717
+ 𝜘 𝜘 # 1D718
+ 𝜙 𝜙 # 1D719
+ 𝜚 𝜚 # 1D71A
+ 𝜛 𝜛 # 1D71B
+ 𝜜 𝜜 # 1D71C
+ 𝜝 𝜝 # 1D71D
+ 𝜞 𝜞 # 1D71E
+ 𝜟 𝜟 # 1D71F
+ 𝜠 𝜠 # 1D720
+ 𝜡 𝜡 # 1D721
+ 𝜢 𝜢 # 1D722
+ 𝜣 𝜣 # 1D723
+ 𝜤 𝜤 # 1D724
+ 𝜥 𝜥 # 1D725
+ 𝜦 𝜦 # 1D726
+ 𝜧 𝜧 # 1D727
+ 𝜨 𝜨 # 1D728
+ 𝜩 𝜩 # 1D729
+ 𝜪 𝜪 # 1D72A
+ 𝜫 𝜫 # 1D72B
+ 𝜬 𝜬 # 1D72C
+ 𝜭 𝜭 # 1D72D
+ 𝜮 𝜮 # 1D72E
+ 𝜯 𝜯 # 1D72F
+ 𝜰 𝜰 # 1D730
+ 𝜱 𝜱 # 1D731
+ 𝜲 𝜲 # 1D732
+ 𝜳 𝜳 # 1D733
+ 𝜴 𝜴 # 1D734
+ 𝜶 𝜶 # 1D736
+ 𝜷 𝜷 # 1D737
+ 𝜸 𝜸 # 1D738
+ 𝜹 𝜹 # 1D739
+ 𝜺 𝜺 # 1D73A
+ 𝜻 𝜻 # 1D73B
+ 𝜼 𝜼 # 1D73C
+ 𝜽 𝜽 # 1D73D
+ 𝜾 𝜾 # 1D73E
+ 𝜿 𝜿 # 1D73F
+ 𝝀 𝝀 # 1D740
+ 𝝁 𝝁 # 1D741
+ 𝝂 𝝂 # 1D742
+ 𝝃 𝝃 # 1D743
+ 𝝄 𝝄 # 1D744
+ 𝝅 𝝅 # 1D745
+ 𝝆 𝝆 # 1D746
+ 𝝇 𝝇 # 1D747
+ 𝝈 𝝈 # 1D748
+ 𝝉 𝝉 # 1D749
+ 𝝊 𝝊 # 1D74A
+ 𝝋 𝝋 # 1D74B
+ 𝝌 𝝌 # 1D74C
+ 𝝍 𝝍 # 1D74D
+ 𝝎 𝝎 # 1D74E
+ 𝝐 𝝐 # 1D750
+ 𝝑 𝝑 # 1D751
+ 𝝒 𝝒 # 1D752
+ 𝝓 𝝓 # 1D753
+ 𝝔 𝝔 # 1D754
+ 𝝕 𝝕 # 1D755
+ 𝝖 𝝖 # 1D756
+ 𝝗 𝝗 # 1D757
+ 𝝘 𝝘 # 1D758
+ 𝝙 𝝙 # 1D759
+ 𝝚 𝝚 # 1D75A
+ 𝝛 𝝛 # 1D75B
+ 𝝜 𝝜 # 1D75C
+ 𝝝 𝝝 # 1D75D
+ 𝝞 𝝞 # 1D75E
+ 𝝟 𝝟 # 1D75F
+ 𝝠 𝝠 # 1D760
+ 𝝡 𝝡 # 1D761
+ 𝝢 𝝢 # 1D762
+ 𝝣 𝝣 # 1D763
+ 𝝤 𝝤 # 1D764
+ 𝝥 𝝥 # 1D765
+ 𝝦 𝝦 # 1D766
+ 𝝧 𝝧 # 1D767
+ 𝝨 𝝨 # 1D768
+ 𝝩 𝝩 # 1D769
+ 𝝪 𝝪 # 1D76A
+ 𝝫 𝝫 # 1D76B
+ 𝝬 𝝬 # 1D76C
+ 𝝭 𝝭 # 1D76D
+ 𝝮 𝝮 # 1D76E
+ 𝝰 𝝰 # 1D770
+ 𝝱 𝝱 # 1D771
+ 𝝲 𝝲 # 1D772
+ 𝝳 𝝳 # 1D773
+ 𝝴 𝝴 # 1D774
+ 𝝵 𝝵 # 1D775
+ 𝝶 𝝶 # 1D776
+ 𝝷 𝝷 # 1D777
+ 𝝸 𝝸 # 1D778
+ 𝝹 𝝹 # 1D779
+ 𝝺 𝝺 # 1D77A
+ 𝝻 𝝻 # 1D77B
+ 𝝼 𝝼 # 1D77C
+ 𝝽 𝝽 # 1D77D
+ 𝝾 𝝾 # 1D77E
+ 𝝿 𝝿 # 1D77F
+ 𝞀 𝞀 # 1D780
+ 𝞁 𝞁 # 1D781
+ 𝞂 𝞂 # 1D782
+ 𝞃 𝞃 # 1D783
+ 𝞄 𝞄 # 1D784
+ 𝞅 𝞅 # 1D785
+ 𝞆 𝞆 # 1D786
+ 𝞇 𝞇 # 1D787
+ 𝞈 𝞈 # 1D788
+ 𝞊 𝞊 # 1D78A
+ 𝞋 𝞋 # 1D78B
+ 𝞌 𝞌 # 1D78C
+ 𝞍 𝞍 # 1D78D
+ 𝞎 𝞎 # 1D78E
+ 𝞏 𝞏 # 1D78F
+ 𝞐 𝞐 # 1D790
+ 𝞑 𝞑 # 1D791
+ 𝞒 𝞒 # 1D792
+ 𝞓 𝞓 # 1D793
+ 𝞔 𝞔 # 1D794
+ 𝞕 𝞕 # 1D795
+ 𝞖 𝞖 # 1D796
+ 𝞗 𝞗 # 1D797
+ 𝞘 𝞘 # 1D798
+ 𝞙 𝞙 # 1D799
+ 𝞚 𝞚 # 1D79A
+ 𝞛 𝞛 # 1D79B
+ 𝞜 𝞜 # 1D79C
+ 𝞝 𝞝 # 1D79D
+ 𝞞 𝞞 # 1D79E
+ 𝞟 𝞟 # 1D79F
+ 𝞠 𝞠 # 1D7A0
+ 𝞡 𝞡 # 1D7A1
+ 𝞢 𝞢 # 1D7A2
+ 𝞣 𝞣 # 1D7A3
+ 𝞤 𝞤 # 1D7A4
+ 𝞥 𝞥 # 1D7A5
+ 𝞦 𝞦 # 1D7A6
+ 𝞧 𝞧 # 1D7A7
+ 𝞨 𝞨 # 1D7A8
+ 𝞪 𝞪 # 1D7AA
+ 𝞫 𝞫 # 1D7AB
+ 𝞬 𝞬 # 1D7AC
+ 𝞭 𝞭 # 1D7AD
+ 𝞮 𝞮 # 1D7AE
+ 𝞯 𝞯 # 1D7AF
+ 𝞰 𝞰 # 1D7B0
+ 𝞱 𝞱 # 1D7B1
+ 𝞲 𝞲 # 1D7B2
+ 𝞳 𝞳 # 1D7B3
+ 𝞴 𝞴 # 1D7B4
+ 𝞵 𝞵 # 1D7B5
+ 𝞶 𝞶 # 1D7B6
+ 𝞷 𝞷 # 1D7B7
+ 𝞸 𝞸 # 1D7B8
+ 𝞹 𝞹 # 1D7B9
+ 𝞺 𝞺 # 1D7BA
+ 𝞻 𝞻 # 1D7BB
+ 𝞼 𝞼 # 1D7BC
+ 𝞽 𝞽 # 1D7BD
+ 𝞾 𝞾 # 1D7BE
+ 𝞿 𝞿 # 1D7BF
+ 𝟀 𝟀 # 1D7C0
+ 𝟁 𝟁 # 1D7C1
+ 𝟂 𝟂 # 1D7C2
+ 𝟄 𝟄 # 1D7C4
+ 𝟅 𝟅 # 1D7C5
+ 𝟆 𝟆 # 1D7C6
+ 𝟇 𝟇 # 1D7C7
+ 𝟈 𝟈 # 1D7C8
+ 𝟉 𝟉 # 1D7C9
+ 𝟊 𝟊 # 1D7CA
+ 𝟋 𝟋 # 1D7CB
diff --git a/trunk/tests/child-test.c b/trunk/tests/child-test.c
new file mode 100644
index 000000000..b6785728a
--- /dev/null
+++ b/trunk/tests/child-test.c
@@ -0,0 +1,206 @@
+/* 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"
+
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+
+#include <glib.h>
+
+#ifdef G_OS_WIN32
+#include <windows.h>
+#endif
+
+#ifdef G_OS_WIN32
+#define GPID_FORMAT "%p"
+#else
+#define GPID_FORMAT "%d"
+#endif
+
+GMainLoop *main_loop;
+gint alive;
+
+#ifdef G_OS_WIN32
+char *argv0;
+#endif
+
+GPid
+get_a_child (gint ttl)
+{
+ GPid pid;
+
+#ifdef G_OS_WIN32
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ gchar *cmdline;
+
+ memset (&si, 0, sizeof (si));
+ si.cb = sizeof (&si);
+ memset (&pi, 0, sizeof (pi));
+
+ cmdline = g_strdup_printf( "child-test -c%d", ttl);
+
+ if (!CreateProcess (argv0, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
+ g_error ("CreateProcess failed: %s\n", g_win32_error_message (GetLastError ()));
+
+ g_free(cmdline);
+
+ CloseHandle (pi.hThread);
+ pid = pi.hProcess;
+
+ return pid;
+#else
+ pid = fork ();
+ if (pid < 0)
+ exit (1);
+
+ if (pid > 0)
+ return pid;
+
+ sleep (ttl);
+ _exit (0);
+#endif /* G_OS_WIN32 */
+}
+
+gboolean
+child_watch_callback (GPid pid, gint status, gpointer data)
+{
+#ifdef VERBOSE
+ gint ttl = GPOINTER_TO_INT (data);
+
+ g_print ("child " GPID_FORMAT " (ttl %d) exited, status %d\n", pid, ttl, status);
+#endif
+
+ g_spawn_close_pid (pid);
+
+ if (--alive == 0)
+ g_main_loop_quit (main_loop);
+
+ return TRUE;
+}
+
+static gboolean
+quit_loop (gpointer data)
+{
+ GMainLoop *main_loop = data;
+
+ g_main_loop_quit (main_loop);
+
+ return TRUE;
+}
+
+#ifdef TEST_THREAD
+static gpointer
+test_thread (gpointer data)
+{
+ GMainLoop *new_main_loop;
+ GSource *source;
+ GPid pid;
+ gint ttl = GPOINTER_TO_INT (data);
+
+ new_main_loop = g_main_loop_new (NULL, FALSE);
+
+ pid = get_a_child (ttl);
+ source = g_child_watch_source_new (pid);
+ g_source_set_callback (source, (GSourceFunc) child_watch_callback, data, NULL);
+ g_source_attach (source, g_main_loop_get_context (new_main_loop));
+ g_source_unref (source);
+
+#ifdef VERBOSE
+ g_print ("whee! created pid: " GPID_FORMAT " (ttl %d)\n", pid, ttl);
+#endif
+
+ g_main_loop_run (new_main_loop);
+
+ return NULL;
+}
+#endif
+
+int
+main (int argc, char *argv[])
+{
+#ifndef TEST_THREAD
+ GPid pid;
+#endif
+#ifdef G_OS_WIN32
+ argv0 = argv[0];
+ if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'c')
+ {
+ int ttl = atoi (argv[1] + 2);
+ Sleep (ttl * 1000);
+ /* Exit on purpose with STILL_ACTIVE (which isn't a very common
+ * exit status) to verify that g_child_watch_check() in gmain.c
+ * doesn't believe a child still to be active if it happens to
+ * exit with that status.
+ */
+ exit (STILL_ACTIVE);
+ }
+#endif
+ /* Only run the test, if threads are enabled and a default thread
+ * implementation is available.
+ */
+#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE)
+#ifdef TEST_THREAD
+ g_thread_init (NULL);
+#endif
+ main_loop = g_main_loop_new (NULL, FALSE);
+
+#ifdef G_OS_WIN32
+ system ("ipconfig /all");
+#else
+ system ("/bin/true");
+#endif
+
+ alive = 2;
+ g_timeout_add (30000, quit_loop, main_loop);
+
+#ifdef TEST_THREAD
+ g_thread_create (test_thread, GINT_TO_POINTER (10), FALSE, NULL);
+ g_thread_create (test_thread, GINT_TO_POINTER (20), FALSE, NULL);
+#else
+ pid = get_a_child (10);
+ g_child_watch_add (pid, (GChildWatchFunc) child_watch_callback,
+ GINT_TO_POINTER (10));
+ pid = get_a_child (20);
+ g_child_watch_add (pid, (GChildWatchFunc) child_watch_callback,
+ GINT_TO_POINTER (20));
+#endif
+
+ g_main_loop_run (main_loop);
+
+ if (alive > 0)
+ {
+ g_warning ("%d children still alive\n", alive);
+ return 1;
+ }
+
+#endif
+ return 0;
+}
diff --git a/trunk/tests/collate/collate-1.file b/trunk/tests/collate/collate-1.file
new file mode 100644
index 000000000..c8e41e991
--- /dev/null
+++ b/trunk/tests/collate/collate-1.file
@@ -0,0 +1,9 @@
+223
+bar
+baz
+c
+eer34
+er1
+foo
+GTK+
+z
diff --git a/trunk/tests/collate/collate-1.in b/trunk/tests/collate/collate-1.in
new file mode 100644
index 000000000..1fc897788
--- /dev/null
+++ b/trunk/tests/collate/collate-1.in
@@ -0,0 +1,9 @@
+z
+c
+eer34
+223
+er1
+foo
+bar
+baz
+GTK+
diff --git a/trunk/tests/collate/collate-1.unicode b/trunk/tests/collate/collate-1.unicode
new file mode 100644
index 000000000..c8e41e991
--- /dev/null
+++ b/trunk/tests/collate/collate-1.unicode
@@ -0,0 +1,9 @@
+223
+bar
+baz
+c
+eer34
+er1
+foo
+GTK+
+z
diff --git a/trunk/tests/collate/collate-2.file b/trunk/tests/collate/collate-2.file
new file mode 100644
index 000000000..2a5a4daff
--- /dev/null
+++ b/trunk/tests/collate/collate-2.file
@@ -0,0 +1,13 @@
+bla001
+bla02
+bla03
+bla4
+bla10
+bla100
+event.c
+event.h
+eventgenerator.c
+file.c
+file.txt
+file2.bla
+file3.xx
diff --git a/trunk/tests/collate/collate-2.in b/trunk/tests/collate/collate-2.in
new file mode 100644
index 000000000..be294ca34
--- /dev/null
+++ b/trunk/tests/collate/collate-2.in
@@ -0,0 +1,13 @@
+file.txt
+file2.bla
+file.c
+file3.xx
+bla001
+bla02
+bla03
+bla4
+bla10
+bla100
+event.c
+eventgenerator.c
+event.h
diff --git a/trunk/tests/collate/collate-2.unicode b/trunk/tests/collate/collate-2.unicode
new file mode 100644
index 000000000..354685311
--- /dev/null
+++ b/trunk/tests/collate/collate-2.unicode
@@ -0,0 +1,13 @@
+bla001
+bla02
+bla03
+bla10
+bla100
+bla4
+event.c
+eventgenerator.c
+event.h
+file2.bla
+file3.xx
+file.c
+file.txt
diff --git a/trunk/tests/completion-test.c b/trunk/tests/completion-test.c
new file mode 100644
index 000000000..bece9c34a
--- /dev/null
+++ b/trunk/tests/completion-test.c
@@ -0,0 +1,74 @@
+/* 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 <string.h>
+
+#include "glib.h"
+
+int main (int argc, char *argv[])
+{
+ GCompletion *cmp;
+ GList *items;
+ gchar *prefix;
+
+ cmp = g_completion_new (NULL);
+
+ items = NULL;
+ items = g_list_append (items, "a\302\243");
+ items = g_list_append (items, "a\302\244");
+ items = g_list_append (items, "bb");
+ items = g_list_append (items, "bc");
+ g_completion_add_items (cmp, items);
+
+ items = g_completion_complete (cmp, "a", &prefix);
+ g_assert (!strcmp ("a\302", prefix));
+ g_assert (g_list_length (items) == 2);
+ g_free (prefix);
+
+ items = g_completion_complete_utf8 (cmp, "a", &prefix);
+ g_assert (!strcmp ("a", prefix));
+ g_assert (g_list_length (items) == 2);
+ g_free (prefix);
+
+ items = g_completion_complete (cmp, "b", &prefix);
+ g_assert (!strcmp ("b", prefix));
+ g_assert (g_list_length (items) == 2);
+ g_free (prefix);
+
+ items = g_completion_complete_utf8 (cmp, "b", &prefix);
+ g_assert (!strcmp ("b", prefix));
+ g_assert (g_list_length (items) == 2);
+ g_free (prefix);
+
+ items = g_completion_complete (cmp, "a", NULL);
+ g_assert (g_list_length (items) == 2);
+
+ items = g_completion_complete_utf8 (cmp, "a", NULL);
+ g_assert (g_list_length (items) == 2);
+
+ g_completion_free (cmp);
+
+ return 0;
+}
diff --git a/trunk/tests/convert-test.c b/trunk/tests/convert-test.c
new file mode 100644
index 000000000..3ea3a6602
--- /dev/null
+++ b/trunk/tests/convert-test.c
@@ -0,0 +1,659 @@
+/* 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <string.h>
+
+#include <glib.h>
+
+/* Bug 311337 */
+static void
+test_iconv_state (void)
+{
+ gchar *in = "\xf4\xe5\xf8\xe5\xed";
+ gchar *expected = "\xd7\xa4\xd7\x95\xd7\xa8\xd7\x95\xd7\x9d";
+ gchar *out;
+ gsize bytes_read = 0;
+ gsize bytes_written = 0;
+ GError *error = NULL;
+
+ out = g_convert (in, -1, "UTF-8", "CP1255",
+ &bytes_read, &bytes_written, &error);
+
+ g_assert (error == NULL);
+ g_assert (bytes_read == 5);
+ g_assert (bytes_written == 10);
+ g_assert (strcmp (out, expected) == 0);
+ g_free (out);
+}
+
+/* some tests involving "vulgar fraction one half" */
+static void
+test_one_half (void)
+{
+ gchar *in = "\xc2\xbd";
+ gchar *out;
+ gsize bytes_read = 0;
+ gsize bytes_written = 0;
+ GError *error = NULL;
+
+ out = g_convert (in, -1,
+ "ISO-8859-1", "UTF-8",
+ &bytes_read, &bytes_written,
+ &error);
+
+ g_assert (error == NULL);
+ g_assert (bytes_read == 2);
+ g_assert (bytes_written == 1);
+ g_assert (strcmp (out, "\xbd") == 0);
+ g_free (out);
+
+ out = g_convert (in, -1,
+ "ISO-8859-15", "UTF-8",
+ &bytes_read, &bytes_written,
+ &error);
+
+ g_assert (error && error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE);
+ g_assert (bytes_read == 0);
+ g_assert (bytes_written == 0);
+ g_assert (out == NULL);
+ g_clear_error (&error);
+ g_free (out);
+
+ out = g_convert_with_fallback (in, -1,
+ "ISO8859-15", "UTF-8",
+ "a",
+ &bytes_read, &bytes_written,
+ &error);
+
+ g_assert (error == NULL);
+ g_assert (bytes_read == 2);
+ g_assert (bytes_written == 1);
+ g_assert (strcmp (out, "a") == 0);
+ g_free (out);
+}
+
+static void
+test_byte_order (void)
+{
+ gchar in_be[4] = { 0xfe, 0xff, 0x03, 0x93}; /* capital gamma */
+ gchar in_le[4] = { 0xff, 0xfe, 0x93, 0x03};
+ gchar *expected = "\xce\x93";
+ gchar *out;
+ gsize bytes_read = 0;
+ gsize bytes_written = 0;
+ GError *error = NULL;
+
+ out = g_convert (in_be, sizeof (in_be),
+ "UTF-8", "UTF-16",
+ &bytes_read, &bytes_written,
+ &error);
+
+ g_assert (error == NULL);
+ g_assert (bytes_read == 4);
+ g_assert (bytes_written == 2);
+ g_assert (strcmp (out, expected) == 0);
+ g_free (out);
+
+ out = g_convert (in_le, sizeof (in_le),
+ "UTF-8", "UTF-16",
+ &bytes_read, &bytes_written,
+ &error);
+
+ g_assert (error == NULL);
+ g_assert (bytes_read == 4);
+ g_assert (bytes_written == 2);
+ g_assert (strcmp (out, expected) == 0);
+ g_free (out);
+}
+
+static void
+check_utf8_to_ucs4 (const char *utf8,
+ glong utf8_len,
+ const gunichar *ucs4,
+ glong ucs4_len,
+ glong error_pos)
+{
+ gunichar *result, *result2, *result3;
+ glong items_read, items_read2;
+ glong items_written, items_written2;
+ GError *error, *error2, *error3;
+ gint i;
+
+ if (!error_pos)
+ {
+ /* check the fast conversion */
+ result = g_utf8_to_ucs4_fast (utf8, utf8_len, &items_written);
+
+ g_assert (items_written == ucs4_len);
+ g_assert (result);
+ for (i = 0; i <= items_written; i++)
+ g_assert (result[i] == ucs4[i]);
+
+ g_free (result);
+ }
+
+ error = NULL;
+ result = g_utf8_to_ucs4 (utf8, utf8_len, &items_read, &items_written, &error);
+
+ if (utf8_len == strlen (utf8))
+ {
+ /* check that len == -1 yields identical results */
+ error2 = NULL;
+ result2 = g_utf8_to_ucs4 (utf8, -1, &items_read2, &items_written2, &error2);
+ g_assert (error || items_read2 == items_read);
+ g_assert (error || items_written2 == items_written2);
+ g_assert (!!result == !!result2);
+ g_assert (!!error == !!error2);
+ if (result)
+ for (i = 0; i <= items_written; i++)
+ g_assert (result[i] == result2[i]);
+
+ g_free (result2);
+ if (error2)
+ g_error_free (error2);
+ }
+
+ error3 = NULL;
+ result3 = g_utf8_to_ucs4 (utf8, utf8_len, NULL, NULL, &error3);
+
+ if (error3 && error3->code == G_CONVERT_ERROR_PARTIAL_INPUT)
+ {
+ g_assert (error == NULL);
+ g_assert (items_read == error_pos);
+ g_assert (items_written == ucs4_len);
+ g_assert (result);
+ for (i = 0; i <= items_written; i++)
+ g_assert (result[i] == ucs4[i]);
+ }
+ else if (error_pos)
+ {
+ g_assert (error != NULL);
+ g_assert (result == NULL);
+ g_assert (items_read == error_pos);
+ g_error_free (error);
+
+ g_assert (error3 != NULL);
+ g_assert (result3 == NULL);
+ g_error_free (error3);
+ }
+ else
+ {
+ g_assert (error == NULL);
+ g_assert (items_read == utf8_len);
+ g_assert (items_written == ucs4_len);
+ g_assert (result);
+ for (i = 0; i <= items_written; i++)
+ g_assert (result[i] == ucs4[i]);
+
+ g_assert (error3 == NULL);
+ g_assert (result3);
+ for (i = 0; i <= ucs4_len; i++)
+ g_assert (result3[i] == ucs4[i]);
+ }
+
+ g_free (result);
+ g_free (result3);
+}
+
+static void
+check_ucs4_to_utf8 (const gunichar *ucs4,
+ glong ucs4_len,
+ const char *utf8,
+ glong utf8_len,
+ glong error_pos)
+{
+ gchar *result, *result2, *result3;
+ glong items_read, items_read2;
+ glong items_written, items_written2;
+ GError *error, *error2, *error3;
+
+ error = NULL;
+ result = g_ucs4_to_utf8 (ucs4, ucs4_len, &items_read, &items_written, &error);
+
+ if (ucs4[ucs4_len] == 0)
+ {
+ /* check that len == -1 yields identical results */
+ error2 = NULL;
+ result2 = g_ucs4_to_utf8 (ucs4, -1, &items_read2, &items_written2, &error2);
+
+ g_assert (error || items_read2 == items_read);
+ g_assert (error || items_written2 == items_written);
+ g_assert (!!result == !!result2);
+ g_assert (!!error == !!error2);
+ if (result)
+ g_assert (strcmp (result, result2) == 0);
+
+ g_free (result2);
+ if (error2)
+ g_error_free (error2);
+ }
+
+ error3 = NULL;
+ result3 = g_ucs4_to_utf8 (ucs4, ucs4_len, NULL, NULL, &error3);
+
+ if (error_pos)
+ {
+ g_assert (error != NULL);
+ g_assert (result == NULL);
+ g_assert (items_read == error_pos);
+ g_error_free (error);
+
+ g_assert (error3 != NULL);
+ g_assert (result3 == NULL);
+ g_error_free (error3);
+ }
+ else
+ {
+ g_assert (error == NULL);
+ g_assert (items_read == ucs4_len);
+ g_assert (items_written == utf8_len);
+ g_assert (result);
+ g_assert (strcmp (result, utf8) == 0);
+
+ g_assert (error3 == NULL);
+ g_assert (result3);
+ g_assert (strcmp (result3, utf8) == 0);
+ }
+
+ g_free (result);
+ g_free (result3);
+}
+
+static void
+check_utf8_to_utf16 (const char *utf8,
+ glong utf8_len,
+ const gunichar2 *utf16,
+ glong utf16_len,
+ glong error_pos)
+{
+ gunichar2 *result, *result2, *result3;
+ glong items_read, items_read2;
+ glong items_written, items_written2;
+ GError *error, *error2, *error3;
+ gint i;
+
+ error = NULL;
+ result = g_utf8_to_utf16 (utf8, utf8_len, &items_read, &items_written, &error);
+
+ if (utf8_len == strlen (utf8))
+ {
+ /* check that len == -1 yields identical results */
+ error2 = NULL;
+ result2 = g_utf8_to_utf16 (utf8, -1, &items_read2, &items_written2, &error2);
+ g_assert (error || items_read2 == items_read);
+ g_assert (error || items_written2 == items_written2);
+ g_assert (!!result == !!result2);
+ g_assert (!!error == !!error2);
+ if (result)
+ for (i = 0; i <= items_written; i++)
+ g_assert (result[i] == result2[i]);
+
+ g_free (result2);
+ if (error2)
+ g_error_free (error2);
+ }
+
+ error3 = NULL;
+ result3 = g_utf8_to_utf16 (utf8, utf8_len, NULL, NULL, &error3);
+
+ if (error3 && error3->code == G_CONVERT_ERROR_PARTIAL_INPUT)
+ {
+ g_assert (error == NULL);
+ g_assert (items_read == error_pos);
+ g_assert (items_written == utf16_len);
+ g_assert (result);
+ for (i = 0; i <= items_written; i++)
+ g_assert (result[i] == utf16[i]);
+ }
+ else if (error_pos)
+ {
+ g_assert (error != NULL);
+ g_assert (result == NULL);
+ g_assert (items_read == error_pos);
+ g_error_free (error);
+
+ g_assert (error3 != NULL);
+ g_assert (result3 == NULL);
+ g_error_free (error3);
+ }
+ else
+ {
+ g_assert (error == NULL);
+ g_assert (items_read == utf8_len);
+ g_assert (items_written == utf16_len);
+ g_assert (result);
+ for (i = 0; i <= items_written; i++)
+ g_assert (result[i] == utf16[i]);
+
+ g_assert (error3 == NULL);
+ g_assert (result3);
+ for (i = 0; i <= utf16_len; i++)
+ g_assert (result3[i] == utf16[i]);
+ }
+
+ g_free (result);
+ g_free (result3);
+}
+
+static void
+check_utf16_to_utf8 (const gunichar2 *utf16,
+ glong utf16_len,
+ const char *utf8,
+ glong utf8_len,
+ glong error_pos)
+{
+ gchar *result, *result2, *result3;
+ glong items_read, items_read2;
+ glong items_written, items_written2;
+ GError *error, *error2, *error3;
+
+ error = NULL;
+ result = g_utf16_to_utf8 (utf16, utf16_len, &items_read, &items_written, &error);
+ if (utf16[utf16_len] == 0)
+ {
+ /* check that len == -1 yields identical results */
+ error2 = NULL;
+ result2 = g_utf16_to_utf8 (utf16, -1, &items_read2, &items_written2, &error2);
+
+ g_assert (error || items_read2 == items_read);
+ g_assert (error || items_written2 == items_written);
+ g_assert (!!result == !!result2);
+ g_assert (!!error == !!error2);
+ if (result)
+ g_assert (strcmp (result, result2) == 0);
+
+ g_free (result2);
+ if (error2)
+ g_error_free (error2);
+ }
+
+ error3 = NULL;
+ result3 = g_utf16_to_utf8 (utf16, utf16_len, NULL, NULL, &error3);
+
+ if (error3 && error3->code == G_CONVERT_ERROR_PARTIAL_INPUT)
+ {
+ g_assert (error == NULL);
+ g_assert (items_read == error_pos);
+ g_assert (items_read + 1 == utf16_len);
+ g_assert (items_written == utf8_len);
+ g_assert (result);
+ g_assert (strcmp (result, utf8) == 0);
+ }
+ else if (error_pos)
+ {
+ g_assert (error != NULL);
+ g_assert (result == NULL);
+ g_assert (items_read == error_pos);
+ g_error_free (error);
+
+ g_assert (error3 != NULL);
+ g_assert (result3 == NULL);
+ g_error_free (error3);
+ }
+ else
+ {
+ g_assert (error == NULL);
+ g_assert (items_read == utf16_len);
+ g_assert (items_written == utf8_len);
+ g_assert (result);
+ g_assert (strcmp (result, utf8) == 0);
+
+ g_assert (error3 == NULL);
+ g_assert (result3);
+ g_assert (strcmp (result3, utf8) == 0);
+ }
+
+ g_free (result);
+ g_free (result3);
+}
+
+static void
+check_ucs4_to_utf16 (const gunichar *ucs4,
+ glong ucs4_len,
+ const gunichar2 *utf16,
+ glong utf16_len,
+ glong error_pos)
+{
+ gunichar2 *result, *result2, *result3;
+ glong items_read, items_read2;
+ glong items_written, items_written2;
+ GError *error, *error2, *error3;
+ gint i;
+
+ error = NULL;
+ result = g_ucs4_to_utf16 (ucs4, ucs4_len, &items_read, &items_written, &error);
+
+ if (ucs4[ucs4_len] == 0)
+ {
+ /* check that len == -1 yields identical results */
+ error2 = NULL;
+ result2 = g_ucs4_to_utf16 (ucs4, -1, &items_read2, &items_written2, &error2);
+
+ g_assert (error || items_read2 == items_read);
+ g_assert (error || items_written2 == items_written);
+ g_assert (!!result == !!result2);
+ g_assert (!!error == !!error2);
+ if (result)
+ for (i = 0; i <= utf16_len; i++)
+ g_assert (result[i] == result2[i]);
+
+ g_free (result2);
+ if (error2)
+ g_error_free (error2);
+ }
+
+ error3 = NULL;
+ result3 = g_ucs4_to_utf16 (ucs4, -1, NULL, NULL, &error3);
+
+ if (error_pos)
+ {
+ g_assert (error != NULL);
+ g_assert (result == NULL);
+ g_assert (items_read == error_pos);
+ g_error_free (error);
+
+ g_assert (error3 != NULL);
+ g_assert (result3 == NULL);
+ g_error_free (error3);
+ }
+ else
+ {
+ g_assert (error == NULL);
+ g_assert (items_read == ucs4_len);
+ g_assert (items_written == utf16_len);
+ g_assert (result);
+ for (i = 0; i <= utf16_len; i++)
+ g_assert (result[i] == utf16[i]);
+
+ g_assert (error3 == NULL);
+ g_assert (result3);
+ for (i = 0; i <= utf16_len; i++)
+ g_assert (result3[i] == utf16[i]);
+ }
+
+ g_free (result);
+ g_free (result3);
+}
+
+static void
+check_utf16_to_ucs4 (const gunichar2 *utf16,
+ glong utf16_len,
+ const gunichar *ucs4,
+ glong ucs4_len,
+ glong error_pos)
+{
+ gunichar *result, *result2, *result3;
+ glong items_read, items_read2;
+ glong items_written, items_written2;
+ GError *error, *error2, *error3;
+ gint i;
+
+ error = NULL;
+ result = g_utf16_to_ucs4 (utf16, utf16_len, &items_read, &items_written, &error);
+ if (utf16[utf16_len] == 0)
+ {
+ /* check that len == -1 yields identical results */
+ error2 = NULL;
+ result2 = g_utf16_to_ucs4 (utf16, -1, &items_read2, &items_written2, &error2);
+ g_assert (error || items_read2 == items_read);
+ g_assert (error || items_written2 == items_written2);
+ g_assert (!!result == !!result2);
+ g_assert (!!error == !!error2);
+ if (result)
+ for (i = 0; i <= items_written; i++)
+ g_assert (result[i] == result2[i]);
+
+ g_free (result2);
+ if (error2)
+ g_error_free (error2);
+ }
+
+ error3 = NULL;
+ result3 = g_utf16_to_ucs4 (utf16, utf16_len, NULL, NULL, &error3);
+
+ if (error3 && error3->code == G_CONVERT_ERROR_PARTIAL_INPUT)
+ {
+ g_assert (error == NULL);
+ g_assert (items_read == error_pos);
+ g_assert (items_read + 1 == utf16_len);
+ g_assert (items_written == ucs4_len);
+ g_assert (result);
+ for (i = 0; i <= items_written; i++)
+ g_assert (result[i] == ucs4[i]);
+ }
+ else if (error_pos)
+ {
+ g_assert (error != NULL);
+ g_assert (result == NULL);
+ g_assert (items_read == error_pos);
+ g_error_free (error);
+
+ g_assert (error3 != NULL);
+ g_assert (result3 == NULL);
+ g_error_free (error3);
+ }
+ else
+ {
+ g_assert (error == NULL);
+ g_assert (items_read == utf16_len);
+ g_assert (items_written == ucs4_len);
+ g_assert (result);
+ for (i = 0; i <= ucs4_len; i++)
+ g_assert (result[i] == ucs4[i]);
+
+ g_assert (error3 == NULL);
+ g_assert (result3);
+ for (i = 0; i <= ucs4_len; i++)
+ g_assert (result3[i] == ucs4[i]);
+ }
+
+ g_free (result);
+ g_free (result3);
+}
+
+static void
+test_unicode_conversions (void)
+{
+ char *utf8;
+ gunichar ucs4[100];
+ gunichar2 utf16[100];
+
+ utf8 = "abc";
+ ucs4[0] = 0x61; ucs4[1] = 0x62; ucs4[2] = 0x63; ucs4[3] = 0;
+ utf16[0] = 0x61; utf16[1] = 0x62; utf16[2] = 0x63; utf16[3] = 0;
+
+ check_utf8_to_ucs4 (utf8, 3, ucs4, 3, 0);
+ check_ucs4_to_utf8 (ucs4, 3, utf8, 3, 0);
+ check_utf8_to_utf16 (utf8, 3, utf16, 3, 0);
+ check_utf16_to_utf8 (utf16, 3, utf8, 3, 0);
+ check_ucs4_to_utf16 (ucs4, 3, utf16, 3, 0);
+ check_utf16_to_ucs4 (utf16, 3, ucs4, 3, 0);
+
+ utf8 = "\316\261\316\262\316\263";
+ ucs4[0] = 0x03b1; ucs4[1] = 0x03b2; ucs4[2] = 0x03b3; ucs4[3] = 0;
+ utf16[0] = 0x03b1; utf16[1] = 0x03b2; utf16[2] = 0x03b3; utf16[3] = 0;
+
+ check_utf8_to_ucs4 (utf8, 6, ucs4, 3, 0);
+ check_ucs4_to_utf8 (ucs4, 3, utf8, 6, 0);
+ check_utf8_to_utf16 (utf8, 6, utf16, 3, 0);
+ check_utf16_to_utf8 (utf16, 3, utf8, 6, 0);
+ check_ucs4_to_utf16 (ucs4, 3, utf16, 3, 0);
+ check_utf16_to_ucs4 (utf16, 3, ucs4, 3, 0);
+
+ /* partial utf8 character */
+ utf8 = "abc\316";
+ ucs4[0] = 0x61; ucs4[1] = 0x62; ucs4[2] = 0x63; ucs4[3] = 0;
+ utf16[0] = 0x61; utf16[1] = 0x62; utf16[2] = 0x63; utf16[3] = 0;
+
+ check_utf8_to_ucs4 (utf8, 4, ucs4, 3, 3);
+ check_utf8_to_utf16 (utf8, 4, utf16, 3, 3);
+
+ /* invalid utf8 */
+ utf8 = "abc\316\316";
+ ucs4[0] = 0;
+ utf16[0] = 0;
+
+ check_utf8_to_ucs4 (utf8, 5, ucs4, 0, 3);
+ check_utf8_to_utf16 (utf8, 5, utf16, 0, 3);
+
+ /* partial utf16 character */
+ utf8 = "ab";
+ ucs4[0] = 0x61; ucs4[1] = 0x62; ucs4[2] = 0;
+ utf16[0] = 0x61; utf16[1] = 0x62; utf16[2] = 0xd801; utf16[3] = 0;
+
+ check_utf16_to_utf8 (utf16, 3, utf8, 2, 2);
+ check_utf16_to_ucs4 (utf16, 3, ucs4, 2, 2);
+
+ /* invalid utf16 */
+ utf8 = NULL;
+ ucs4[0] = 0;
+ utf16[0] = 0x61; utf16[1] = 0x62; utf16[2] = 0xdc01; utf16[3] = 0;
+
+ check_utf16_to_utf8 (utf16, 3, utf8, 0, 2);
+ check_utf16_to_ucs4 (utf16, 3, ucs4, 0, 2);
+
+ /* invalid ucs4 */
+ utf8 = NULL;
+ ucs4[0] = 0x61; ucs4[1] = 0x62; ucs4[2] = 0x80000000; ucs4[3] = 0;
+ utf16[0] = 0;
+
+ check_ucs4_to_utf8 (ucs4, 3, utf8, 0, 2);
+ check_ucs4_to_utf16 (ucs4, 3, utf16, 0, 2);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_iconv_state ();
+ test_one_half ();
+ test_byte_order ();
+ test_unicode_conversions ();
+
+ return 0;
+}
diff --git a/trunk/tests/cxx-test.C b/trunk/tests/cxx-test.C
new file mode 100644
index 000000000..ae459f85f
--- /dev/null
+++ b/trunk/tests/cxx-test.C
@@ -0,0 +1,9 @@
+#include <glib.h>
+#include <gmodule.h>
+#include <glib-object.h>
+
+int
+main ()
+{
+ return 0;
+}
diff --git a/trunk/tests/date-test.c b/trunk/tests/date-test.c
new file mode 100644
index 000000000..1a350301b
--- /dev/null
+++ b/trunk/tests/date-test.c
@@ -0,0 +1,499 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include "glib.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <locale.h>
+#include <time.h>
+
+gboolean failed = FALSE;
+guint32 passed = 0;
+guint32 notpassed = 0;
+
+#define TEST(m,cond) G_STMT_START { failed = !(cond); \
+if (failed) \
+ exit(1); \
+} G_STMT_END
+
+void g_date_debug_print(GDate* d)
+{
+}
+
+void g_print_dummy(const char *format, ...)
+{
+}
+
+void fflush_dummy (FILE *f)
+{
+}
+
+
+#define g_print g_print_dummy
+#define fflush fflush_dummy
+
+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 = 0;
+ gboolean discontinuity = FALSE;
+
+ 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);
+ guint iso8601_week_of_year = 0;
+
+ 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);
+ if ((m == G_DATE_JANUARY && day <= 4) ||
+ (m == G_DATE_DECEMBER && day >= 29)) {
+ TEST("ISO 8601 week of year on Monday Dec 29 - Jan 4 is 1",
+ (g_date_get_iso8601_week_of_year(d) == 1));
+ } else {
+ TEST("ISO 8601 week of year on Monday 1 more than previous day's week of year",
+ (g_date_get_iso8601_week_of_year(d) - iso8601_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);
+ if (!(day == 1 && m == G_DATE_JANUARY)) {
+ TEST("ISO 8601 week of year on non-Monday 0 more than previous day's week of year (",
+ (g_date_get_iso8601_week_of_year(d) - iso8601_week_of_year) == 0);
+ }
+ }
+
+
+ monday_week_of_year = g_date_get_monday_week_of_year(d);
+ iso8601_week_of_year = g_date_get_iso8601_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/trunk/tests/dirname-test.c b/trunk/tests/dirname-test.c
new file mode 100644
index 000000000..0c8753c70
--- /dev/null
+++ b/trunk/tests/dirname-test.c
@@ -0,0 +1,121 @@
+/* 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <stdio.h>
+#include <string.h>
+#include "glib.h"
+
+int array[10000];
+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"
+
+int
+main (int argc,
+ char *argv[])
+{
+ gint i;
+ struct {
+ gchar *filename;
+ gchar *dirname;
+ } dirname_checks[] = {
+ { "/", "/" },
+ { "////", "/" },
+ { ".////", "." },
+ { ".", "." },
+ { "..", "." },
+ { "../", ".." },
+ { "..////", ".." },
+ { "", "." },
+ { "a/b", "a" },
+ { "a/b/", "a/b" },
+ { "c///", "c" },
+ { "/a/b", "/a" },
+ { "/a/b/", "/a/b" },
+#ifdef G_OS_WIN32
+ { "\\", "\\" },
+ { ".\\\\\\\\", "." },
+ { ".\\/\\/", "." },
+ { ".", "." },
+ { "..", "." },
+ { "..\\", ".." },
+ { "..\\\\\\\\", ".." },
+ { "..\\//\\", ".." },
+ { "", "." },
+ { "a\\b", "a" },
+ { "a\\b\\", "a\\b" },
+ { "\\a\\b", "\\a" },
+ { "\\a\\b\\", "\\a\\b" },
+ { "c\\\\\\", "c" },
+ { "c/\\\\", "c" },
+ { "a:", "a:." },
+ { "a:foo", "a:." },
+ { "a:foo\\bar", "a:foo" },
+ { "a:/foo", "a:/" },
+ { "a:/foo/bar", "a:/foo" },
+ { "a:/", "a:/" },
+ { "a://", "a:/" },
+ { "a:\\foo", "a:\\" },
+ { "a:\\", "a:\\" },
+ { "a:\\\\", "a:\\" },
+ { "a:\\/", "a:\\" },
+#endif
+ };
+ guint n_dirname_checks = sizeof (dirname_checks) / sizeof (dirname_checks[0]);
+
+ 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_error ("%s returned %s, should return %s",
+ dirname_checks[i].filename, dirname,
+ dirname_checks[i].dirname);
+ g_free (dirname);
+ }
+
+ return 0;
+}
+
diff --git a/trunk/tests/env-test.c b/trunk/tests/env-test.c
new file mode 100644
index 000000000..5fd75df3b
--- /dev/null
+++ b/trunk/tests/env-test.c
@@ -0,0 +1,117 @@
+/* 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_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#ifdef GLIB_COMPILATION
+#undef GLIB_COMPILATION
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+int
+main (int argc, char *argv[])
+{
+ gboolean result;
+ const gchar *data;
+ gchar *variable = "TEST_G_SETENV";
+ gchar *value1 = "works";
+ gchar *value2 = "again";
+
+ data = g_getenv (variable);
+ g_assert (data == NULL && "TEST_G_SETENV already set");
+
+ result = g_setenv (variable, value1, TRUE);
+ g_assert (result && "g_setenv() failed");
+
+ data = g_getenv (variable);
+ g_assert (data != NULL && "g_getenv() returns NULL");
+ g_assert (strcmp (data, value1) == 0 && "g_getenv() returns wrong value");
+
+ result = g_setenv (variable, value2, FALSE);
+ g_assert (result && "g_setenv() failed");
+
+ data = g_getenv (variable);
+ g_assert (data != NULL && "g_getenv() returns NULL");
+ g_assert (strcmp (data, value2) != 0 && "g_setenv() always overwrites");
+ g_assert (strcmp (data, value1) == 0 && "g_getenv() returns wrong value");
+
+ result = g_setenv (variable, value2, TRUE);
+ g_assert (result && "g_setenv() failed");
+
+ data = g_getenv (variable);
+ g_assert (data != NULL && "g_getenv() returns NULL");
+ g_assert (strcmp (data, value1) != 0 && "g_setenv() doesn't overwrite");
+ g_assert (strcmp (data, value2) == 0 && "g_getenv() returns wrong value");
+
+ g_unsetenv (variable);
+ data = g_getenv (variable);
+ g_assert (data == NULL && "g_unsetenv() doesn't work");
+
+#if 0
+ /* We can't test this, because it's an illegal argument that
+ * we g_return_if_fail for.
+ */
+ result = g_setenv ("foo=bar", "baz", TRUE);
+ g_assert (!result && "g_setenv() accepts '=' in names");
+#endif
+
+ result = g_setenv ("foo", "bar=baz", TRUE);
+ g_assert (result && "g_setenv() doesn't accept '=' in values");
+#if 0
+ /* While glibc supports '=' in names in getenv(), SUS doesn't say anything about it,
+ * and Solaris doesn't support it.
+ */
+ data = g_getenv ("foo=bar");
+ g_assert (strcmp (data, "baz") == 0 && "g_getenv() doesn't support '=' in names");
+#endif
+ data = g_getenv ("foo");
+ g_assert (strcmp (data, "bar=baz") == 0 && "g_getenv() doesn't support '=' in values");
+
+#if 0
+ /* We can't test this, because it's an illegal argument that
+ * we g_return_if_fail for. Plus how would we check for failure,
+ * since we can't set the value...
+ */
+ g_unsetenv ("foo=bar");
+#endif
+ g_unsetenv ("foo");
+ data = g_getenv ("foo");
+ g_assert (data == NULL && "g_unsetenv() doesn't support '=' in values");
+
+ return 0;
+}
diff --git a/trunk/tests/errorcheck-mutex-test.c b/trunk/tests/errorcheck-mutex-test.c
new file mode 100644
index 000000000..eab95132b
--- /dev/null
+++ b/trunk/tests/errorcheck-mutex-test.c
@@ -0,0 +1,131 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+#define G_ERRORCHECK_MUTEXES
+
+#include <glib.h>
+#include <stdio.h>
+#include <string.h>
+
+static gpointer
+locking_thread (gpointer mutex)
+{
+ g_mutex_lock ((GMutex*)mutex);
+
+ return NULL;
+}
+
+static void
+lock_locked_mutex ()
+{
+ GMutex* mutex = g_mutex_new ();
+ g_mutex_lock (mutex);
+ g_mutex_lock (mutex);
+}
+
+static void
+trylock_locked_mutex ()
+{
+ GMutex* mutex = g_mutex_new ();
+ g_mutex_lock (mutex);
+ g_mutex_trylock (mutex);
+}
+
+static void
+unlock_unlocked_mutex ()
+{
+ GMutex* mutex = g_mutex_new ();
+ g_mutex_lock (mutex);
+ g_mutex_unlock (mutex);
+ g_mutex_unlock (mutex);
+}
+
+static void
+free_locked_mutex ()
+{
+ GMutex* mutex = g_mutex_new ();
+ g_mutex_lock (mutex);
+ g_mutex_free (mutex);
+}
+
+static void
+wait_on_unlocked_mutex ()
+{
+ GMutex* mutex = g_mutex_new ();
+ GCond* cond = g_cond_new ();
+ g_cond_wait (cond, mutex);
+}
+
+static void
+wait_on_otherwise_locked_mutex ()
+{
+ GMutex* mutex = g_mutex_new ();
+ GCond* cond = g_cond_new ();
+ GThread* thread = g_thread_create (locking_thread, mutex, TRUE, NULL);
+ g_assert (thread != NULL);
+ g_usleep (G_USEC_PER_SEC);
+ g_cond_wait (cond, mutex);
+}
+
+static void
+timed_wait_on_unlocked_mutex ()
+{
+ GMutex* mutex = g_mutex_new ();
+ GCond* cond = g_cond_new ();
+ g_cond_timed_wait (cond, mutex, NULL);
+}
+
+static void
+timed_wait_on_otherwise_locked_mutex ()
+{
+ GMutex* mutex = g_mutex_new ();
+ GCond* cond = g_cond_new ();
+ GThread* thread = g_thread_create (locking_thread, mutex, TRUE, NULL);
+ g_assert (thread != NULL);
+ g_usleep (G_USEC_PER_SEC);
+ g_cond_timed_wait (cond, mutex, NULL);
+}
+
+struct
+{
+ char *name;
+ void (*func)();
+} func_table[] =
+{
+ {"lock_locked_mutex", lock_locked_mutex},
+ {"trylock_locked_mutex", trylock_locked_mutex},
+ {"unlock_unlocked_mutex", unlock_unlocked_mutex},
+ {"free_locked_mutex", free_locked_mutex},
+ {"wait_on_unlocked_mutex", wait_on_unlocked_mutex},
+ {"wait_on_otherwise_locked_mutex", wait_on_otherwise_locked_mutex},
+ {"timed_wait_on_unlocked_mutex", timed_wait_on_unlocked_mutex},
+ {"timed_wait_on_otherwise_locked_mutex",
+ timed_wait_on_otherwise_locked_mutex}
+};
+
+int
+main (int argc, char* argv[])
+{
+ int i;
+
+ if (argc == 2)
+ {
+ for (i = 0; i < G_N_ELEMENTS (func_table); i++)
+ {
+ if (strcmp (func_table[i].name, argv[1]) == 0)
+ {
+ g_thread_init (NULL);
+ func_table[i].func ();
+ g_assert_not_reached ();
+ }
+ }
+ }
+
+ fprintf (stderr, "Usage: errorcheck-mutex-test [TEST]\n\n");
+ fprintf (stderr, " where TEST can be one of:\n\n");
+ for (i = 0; i < G_N_ELEMENTS (func_table); i++)
+ {
+ fprintf (stderr, " %s\n", func_table[i].name);
+ }
+
+ return 0;
+}
diff --git a/trunk/tests/file-test.c b/trunk/tests/file-test.c
new file mode 100644
index 000000000..b38d16545
--- /dev/null
+++ b/trunk/tests/file-test.c
@@ -0,0 +1,180 @@
+/* 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_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#ifdef GLIB_COMPILATION
+#undef GLIB_COMPILATION
+#endif
+
+#include <string.h>
+
+#include <glib.h>
+
+#include <gstdio.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef G_OS_WIN32
+#include <io.h> /* For read(), write() etc */
+#endif
+
+static void
+test_mkstemp (void)
+{
+ char template[32];
+ int fd;
+ int i;
+ const char hello[] = "Hello, World";
+ const int hellolen = sizeof (hello) - 1;
+ char chars[62];
+
+ strcpy (template, "foobar");
+ fd = g_mkstemp (template);
+ if (fd != -1)
+ g_warning ("g_mkstemp works even if template doesn't contain XXXXXX");
+ close (fd);
+
+ strcpy (template, "foobarXXX");
+ fd = g_mkstemp (template);
+ if (fd != -1)
+ g_warning ("g_mkstemp works even if template contains less than six X");
+ close (fd);
+
+ strcpy (template, "fooXXXXXX");
+ fd = g_mkstemp (template);
+ g_assert (fd != -1 && "g_mkstemp didn't work for template fooXXXXXX");
+ i = write (fd, hello, hellolen);
+ g_assert (i != -1 && "write() failed");
+ g_assert (i == hellolen && "write() has written too few bytes");
+
+ lseek (fd, 0, 0);
+ i = read (fd, chars, sizeof (chars));
+ g_assert (i != -1 && "read() failed: %s");
+ g_assert (i == hellolen && "read() has got wrong number of bytes");
+
+ chars[i] = 0;
+ g_assert (strcmp (chars, hello) == 0 && "read() didn't get same string back");
+
+ close (fd);
+ remove (template);
+
+ strcpy (template, "fooXXXXXX.pdf");
+ fd = g_mkstemp (template);
+ g_assert (fd != -1 && "g_mkstemp didn't work for template fooXXXXXX.pdf");
+
+ close (fd);
+ remove (template);
+}
+
+static void
+test_readlink (void)
+{
+#ifdef HAVE_SYMLINK
+ FILE *file;
+ int result;
+ char *filename = "file-test-data";
+ char *link1 = "file-test-link1";
+ char *link2 = "file-test-link2";
+ char *link3 = "file-test-link3";
+ char *data;
+ GError *error;
+
+ file = fopen (filename, "w");
+ g_assert (file != NULL && "fopen() failed");
+ fclose (file);
+
+ result = symlink (filename, link1);
+ g_assert (result == 0 && "symlink() failed");
+ result = symlink (link1, link2);
+ g_assert (result == 0 && "symlink() failed");
+
+ error = NULL;
+ data = g_file_read_link (link1, &error);
+ g_assert (data != NULL && "couldn't read link1");
+ g_assert (strcmp (data, filename) == 0 && "link1 contains wrong data");
+ g_free (data);
+
+ error = NULL;
+ data = g_file_read_link (link2, &error);
+ g_assert (data != NULL && "couldn't read link2");
+ g_assert (strcmp (data, link1) == 0 && "link2 contains wrong data");
+ g_free (data);
+
+ error = NULL;
+ data = g_file_read_link (link3, &error);
+ g_assert (data == NULL && "could read link3");
+ g_assert (error != NULL && "error not set");
+
+ error = NULL;
+ data = g_file_read_link (filename, &error);
+ g_assert (data == NULL && "could read regular file as link");
+ g_assert (error != NULL && "error not set");
+
+ remove (filename);
+ remove (link1);
+ remove (link2);
+#endif
+}
+
+static void
+test_get_contents (void)
+{
+ const gchar *text = "abcdefghijklmnopqrstuvwxyz";
+ const gchar *filename = "file-test-get-contents";
+ gchar *contents;
+ gsize len;
+ FILE *f;
+ GError *error = NULL;
+
+ f = g_fopen (filename, "w");
+ fwrite (text, 1, strlen (text), f);
+ fclose (f);
+
+ g_assert (g_file_test (filename, G_FILE_TEST_IS_REGULAR));
+
+ if (! g_file_get_contents (filename, &contents, &len, &error))
+ g_error ("g_file_get_contents() failed: %s", error->message);
+
+ g_assert (strcmp (text, contents) == 0 && "content mismatch");
+
+ g_free (contents);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_mkstemp ();
+ test_readlink ();
+ test_get_contents ();
+
+ return 0;
+}
diff --git a/trunk/tests/gen-casefold-txt.pl b/trunk/tests/gen-casefold-txt.pl
new file mode 100755
index 000000000..d028ea9fe
--- /dev/null
+++ b/trunk/tests/gen-casefold-txt.pl
@@ -0,0 +1,84 @@
+#! /usr/bin/perl -w
+
+# Copyright (C) 1998, 1999 Tom Tromey
+# Copyright (C) 2001 Red Hat Software
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# gen-casefold-test.pl - Generate test cases for casefolding from Unicode data.
+# See http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html
+# Usage:
+# I consider the output of this program to be unrestricted. Use it as
+# you will.
+
+require 5.006;
+
+# Names of fields in the CaseFolding table
+$FOLDING_CODE = 0;
+$FOLDING_STATUS = 1;
+$FOLDING_MAPPING = 2;
+
+my $casefoldlen = 0;
+my @casefold;
+
+if (@ARGV != 2) {
+ $0 =~ s@.*/@@;
+ die "Usage: $0 UNICODE-VERSION CaseFolding.txt\n";
+}
+
+print <<EOT;
+# Test cases generated from Unicode $ARGV[0] data
+# by gen-casefold-test.pl. Do not edit.
+#
+# Some special hand crafted tests
+#
+AaBbCc@@\taabbcc@@
+#
+# Now the automatic tests
+#
+EOT
+
+binmode STDOUT, ":utf8";
+open (INPUT, "< $ARGV[1]") || exit 1;
+
+while (<INPUT>)
+{
+ chop;
+
+ next if /^#/;
+ next if /^\s*$/;
+
+ s/\s*#.*//;
+
+ my @fields = split ('\s*;\s*', $_, 30);
+
+ my $raw_code = $fields[$FOLDING_CODE];
+ my $code = hex ($raw_code);
+
+ if ($#fields != 3)
+ {
+ printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields);
+ next;
+ }
+
+ # skip simple and Turkic mappings
+ next if ($fields[$FOLDING_STATUS] =~ /^[ST]$/);
+
+ @values = map { hex ($_) } split /\s+/, $fields[$FOLDING_MAPPING];
+ printf ("%s\t%s\n", pack ("U", $code), pack ("U*", @values));
+}
+
+close INPUT;
diff --git a/trunk/tests/gen-casemap-txt.pl b/trunk/tests/gen-casemap-txt.pl
new file mode 100755
index 000000000..0b9fc1d6b
--- /dev/null
+++ b/trunk/tests/gen-casemap-txt.pl
@@ -0,0 +1,258 @@
+#! /usr/bin/perl -w
+
+# Copyright (C) 1998, 1999 Tom Tromey
+# Copyright (C) 2001 Red Hat Software
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# gen-casemap-test.pl - Generate test cases for case mapping from Unicode data.
+# See http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html
+# I consider the output of this program to be unrestricted. Use it as
+# you will.
+
+require 5.006;
+use utf8;
+
+if (@ARGV != 3) {
+ $0 =~ s@.*/@@;
+ die "Usage: $0 UNICODE-VERSION UnicodeData.txt SpecialCasing.txt\n";
+}
+
+use vars qw($CODE $NAME $CATEGORY $COMBINING_CLASSES $BIDI_CATEGORY $DECOMPOSITION $DECIMAL_VALUE $DIGIT_VALUE $NUMERIC_VALUE $MIRRORED $OLD_NAME $COMMENT $UPPER $LOWER $TITLE $BREAK_CODE $BREAK_CATEGORY $BREAK_NAME $CASE_CODE $CASE_LOWER $CASE_TITLE $CASE_UPPER $CASE_CONDITION);
+
+# Names of fields in Unicode data table.
+$CODE = 0;
+$NAME = 1;
+$CATEGORY = 2;
+$COMBINING_CLASSES = 3;
+$BIDI_CATEGORY = 4;
+$DECOMPOSITION = 5;
+$DECIMAL_VALUE = 6;
+$DIGIT_VALUE = 7;
+$NUMERIC_VALUE = 8;
+$MIRRORED = 9;
+$OLD_NAME = 10;
+$COMMENT = 11;
+$UPPER = 12;
+$LOWER = 13;
+$TITLE = 14;
+
+# Names of fields in the SpecialCasing table
+$CASE_CODE = 0;
+$CASE_LOWER = 1;
+$CASE_TITLE = 2;
+$CASE_UPPER = 3;
+$CASE_CONDITION = 4;
+
+my @upper;
+my @title;
+my @lower;
+
+binmode STDOUT, ":utf8";
+open (INPUT, "< $ARGV[1]") || exit 1;
+
+$last_code = -1;
+while (<INPUT>)
+{
+ chop;
+ @fields = split (';', $_, 30);
+ if ($#fields != 14)
+ {
+ printf STDERR ("Entry for $fields[$CODE] has wrong number of fields (%d)\n", $#fields);
+ }
+
+ $code = hex ($fields[$CODE]);
+
+ if ($code > $last_code + 1)
+ {
+ # Found a gap.
+ if ($fields[$NAME] =~ /Last>/)
+ {
+ # Fill the gap with the last character read,
+ # since this was a range specified in the char database
+ @gfields = @fields;
+ }
+ else
+ {
+ # The gap represents undefined characters. Only the type
+ # matters.
+ @gfields = ('', '', 'Cn', '0', '', '', '', '', '', '', '',
+ '', '', '', '');
+ }
+ for (++$last_code; $last_code < $code; ++$last_code)
+ {
+ $gfields{$CODE} = sprintf ("%04x", $last_code);
+ &process_one ($last_code, @gfields);
+ }
+ }
+ &process_one ($code, @fields);
+ $last_code = $code;
+}
+
+close INPUT;
+
+open (INPUT, "< $ARGV[2]") || exit 1;
+
+while (<INPUT>)
+{
+ my $code;
+
+ chop;
+
+ next if /^#/;
+ next if /^\s*$/;
+
+ s/\s*#.*//;
+
+ @fields = split ('\s*;\s*', $_, 30);
+
+ $raw_code = $fields[$CASE_CODE];
+ $code = hex ($raw_code);
+
+ if ($#fields != 4 && $#fields != 5)
+ {
+ printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields);
+ next;
+ }
+
+ if (defined $fields[5]) {
+ # Ignore conditional special cases - we'll handle them manually
+ next;
+ }
+
+ $upper[$code] = &make_hex ($fields[$CASE_UPPER]);
+ $lower[$code] = &make_hex ($fields[$CASE_LOWER]);
+ $title[$code] = &make_hex ($fields[$CASE_TITLE]);
+}
+
+close INPUT;
+
+print <<EOT;
+# Test cases generated from Unicode $ARGV[0] data
+# by gen-case-tests.pl. Do not edit.
+#
+# Some special hand crafted tests
+#
+tr_TR\ti\ti\t\x{0130}\t\x{0130}\t# i => LATIN CAPITAL LETTER I WITH DOT ABOVE
+tr_TR\tI\t\x{0131}\tI\tI\t# I => LATIN SMALL LETTER DOTLESS I
+tr_TR\tI\x{0307}\ti\tI\x{0307}\tI\x{0307}\t# I => LATIN SMALL LETTER DOTLESS I
+tr_TR.UTF-8\ti\ti\t\x{0130}\t\x{0130}\t# i => LATIN CAPITAL LETTER I WITH DOT ABOVE
+tr_TR.UTF-8\tI\t\x{0131}\tI\tI\t# I => LATIN SMALL LETTER DOTLESS I
+tr_TR.UTF-8\tI\x{0307}\ti\tI\x{0307}\tI\x{0307}\t# I => LATIN SMALL LETTER DOTLESS I
+# Test reordering of YPOGEGRAMMENI across other accents
+\t\x{03b1}\x{0345}\x{0314}\t\x{03b1}\x{0345}\x{314}\t\x{0391}\x{0345}\x{0314}\t\x{0391}\x{0314}\x{0399}\t
+\t\x{03b1}\x{0314}\x{0345}\t\x{03b1}\x{314}\x{0345}\t\x{0391}\x{0314}\x{0345}\t\x{0391}\x{0314}\x{0399}\t
+# Handling of final and nonfinal sigma
+ ΜΆΙΟΣ μάιος Μάιος ΜΆΙΟΣ
+ ΜΆΙΟΣ μάιος Μάιος ΜΆΙΟΣ
+ ΣΙΓΜΑ σιγμα Σιγμα ΣΙΓΜΑ
+# Lithuanian rule of i followed by letter with dot. Not at all sure
+# about the titlecase part here
+lt_LT\ti\x{117}\ti\x{117}\tIe\tIE\t
+lt_LT\tie\x{307}\tie\x{307}\tIe\tIE\t
+lt_LT\t\x{00cc}\ti\x{0307}\x{0300}\t\x{00cc}\t\x{00cc}\t # LATIN CAPITAL LETTER I WITH GRAVE
+lt_LT\t\x{00CD}\ti\x{0307}\x{0301}\t\x{00CD}\t\x{00CD}\t # LATIN CAPITAL LETTER I WITH ACUTE
+lt_LT\t\x{0128}\ti\x{0307}\x{0303}\t\x{0128}\t\x{0128}\t # LATIN CAPITAL LETTER I WITH TILDE
+lt_LT\tI\x{0301}\ti\x{0307}\x{0301}\tI\x{0301}\tI\x{0301}\t # LATIN CAPITAL LETTER I (with acute accent)
+lt_LT\tI\x{0300}\ti\x{0307}\x{0300}\tI\x{0300}\tI\x{0300}\t # LATIN CAPITAL LETTER I (with grave accent)
+lt_LT\tI\x{0303}\ti\x{0307}\x{0303}\tI\x{0303}\tI\x{0303}\t # LATIN CAPITAL LETTER I (with tilde above)
+lt_LT\tI\x{0328}\x{0301}\ti\x{0307}\x{0328}\x{0301}\tI\x{0328}\x{0301}\tI\x{0328}\x{0301}\t # LATIN CAPITAL LETTER I (with ogonek and acute accent)
+lt_LT\tJ\x{0301}\tj\x{0307}\x{0301}\tJ\x{0301}\tJ\x{0301}\t # LATIN CAPITAL LETTER J (with acute accent)
+lt_LT\t\x{012e}\x{0301}\t\x{012f}\x{0307}\x{0301}\t\x{012e}\x{0301}\t\x{012e}\x{0301}\t # LATIN CAPITAL LETTER I WITH OGONEK (with acute accent)
+lt_LT.UTF-8\ti\x{117}\ti\x{117}\tIe\tIE\t
+lt_LT.UTF-8\tie\x{307}\tie\x{307}\tIe\tIE\t
+lt_LT.UTF-8\t\x{00cc}\ti\x{0307}\x{0300}\t\x{00cc}\t\x{00cc}\t # LATIN CAPITAL LETTER I WITH GRAVE
+lt_LT.UTF-8\t\x{00CD}\ti\x{0307}\x{0301}\t\x{00CD}\t\x{00CD}\t # LATIN CAPITAL LETTER I WITH ACUTE
+lt_LT.UTF-8\t\x{0128}\ti\x{0307}\x{0303}\t\x{0128}\t\x{0128}\t # LATIN CAPITAL LETTER I WITH TILDE
+lt_LT.UTF-8\tI\x{0301}\ti\x{0307}\x{0301}\tI\x{0301}\tI\x{0301}\t # LATIN CAPITAL LETTER I (with acute accent)
+lt_LT.UTF-8\tI\x{0300}\ti\x{0307}\x{0300}\tI\x{0300}\tI\x{0300}\t # LATIN CAPITAL LETTER I (with grave accent)
+lt_LT.UTF-8\tI\x{0303}\ti\x{0307}\x{0303}\tI\x{0303}\tI\x{0303}\t # LATIN CAPITAL LETTER I (with tilde above)
+lt_LT.UTF-8\tI\x{0328}\x{0301}\ti\x{0307}\x{0328}\x{0301}\tI\x{0328}\x{0301}\tI\x{0328}\x{0301}\t # LATIN CAPITAL LETTER I (with ogonek and acute accent)
+lt_LT.UTF-8\tJ\x{0301}\tj\x{0307}\x{0301}\tJ\x{0301}\tJ\x{0301}\t # LATIN CAPITAL LETTER J (with acute accent)
+lt_LT.UTF-8\t\x{012e}\x{0301}\t\x{012f}\x{0307}\x{0301}\t\x{012e}\x{0301}\t\x{012e}\x{0301}\t # LATIN CAPITAL LETTER I WITH OGONEK (with acute accent)
+# Special case not at initial position
+\ta\x{fb04}\ta\x{fb04}\tAffl\tAFFL\t# FB04
+#
+# Now the automatic tests
+#
+EOT
+&print_tests;
+
+exit 0;
+
+# Process a single character.
+sub process_one
+{
+ my ($code, @fields) = @_;
+
+ my $type = $fields[$CATEGORY];
+ if ($type eq 'Ll')
+ {
+ $upper[$code] = make_hex ($fields[$UPPER]);
+ $lower[$code] = pack ("U", $code);
+ $title[$code] = make_hex ($fields[$TITLE]);
+ }
+ elsif ($type eq 'Lu')
+ {
+ $lower[$code] = make_hex ($fields[$LOWER]);
+ $upper[$code] = pack ("U", $code);
+ $title[$code] = make_hex ($fields[$TITLE]);
+ }
+
+ if ($type eq 'Lt')
+ {
+ $upper[$code] = make_hex ($fields[$UPPER]);
+ $lower[$code] = pack ("U", hex ($fields[$LOWER]));
+ $title[$code] = make_hex ($fields[$LOWER]);
+ }
+}
+
+sub print_tests
+{
+ for ($i = 0; $i < 0x10ffff; $i++) {
+ if ($i == 0x3A3) {
+ # Greek sigma needs special tests
+ next;
+ }
+
+ my $lower = $lower[$i];
+ my $title = $title[$i];
+ my $upper = $upper[$i];
+
+ if (defined $upper || defined $lower || defined $title) {
+ printf "\t%s\t%s\t%s\t%s\t# %4X\n",
+ pack ("U", $i),
+ (defined $lower ? $lower : ""),
+ (defined $title ? $title : ""),
+ (defined $upper ? $upper : ""),
+ $i;
+ }
+ }
+}
+
+sub make_hex
+{
+ my $codes = shift;
+
+ $codes =~ s/^\s+//;
+ $codes =~ s/\s+$//;
+
+ if ($codes eq "0" || $codes eq "") {
+ return "";
+ } else {
+ return pack ("U*", map { hex ($_) } split /\s+/, $codes);
+ }
+}
diff --git a/trunk/tests/gio-test.c b/trunk/tests/gio-test.c
new file mode 100644
index 000000000..1ed523607
--- /dev/null
+++ b/trunk/tests/gio-test.c
@@ -0,0 +1,444 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 2000 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.
+ */
+
+/* A test program for the main loop and IO channel code.
+ * Just run it. Optional parameter is number of sub-processes.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include "config.h"
+
+#include <glib.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+
+#ifdef G_OS_WIN32
+ #include <io.h>
+ #include <fcntl.h>
+ #include <process.h>
+ #define STRICT
+ #include <windows.h>
+#else
+ #ifdef HAVE_UNISTD_H
+ #include <unistd.h>
+ #endif
+#endif
+
+static int nrunning;
+static GMainLoop *main_loop;
+
+#define BUFSIZE 5000 /* Larger than the circular buffer in
+ * giowin32.c on purpose.
+ */
+
+static int nkiddies;
+
+static struct {
+ int fd;
+ int seq;
+} *seqtab;
+
+static GIOError
+read_all (int fd,
+ GIOChannel *channel,
+ char *buffer,
+ guint nbytes,
+ guint *bytes_read)
+{
+ guint left = nbytes;
+ gsize nb;
+ GIOError error = G_IO_ERROR_NONE;
+ char *bufp = buffer;
+
+ /* g_io_channel_read() doesn't necessarily return all the
+ * data we want at once.
+ */
+ *bytes_read = 0;
+ while (left)
+ {
+ error = g_io_channel_read (channel, bufp, left, &nb);
+
+ if (error != G_IO_ERROR_NONE)
+ {
+ g_print ("gio-test: ...from %d: G_IO_ERROR_%s\n", fd,
+ (error == G_IO_ERROR_AGAIN ? "AGAIN" :
+ (error == G_IO_ERROR_INVAL ? "INVAL" :
+ (error == G_IO_ERROR_UNKNOWN ? "UNKNOWN" : "???"))));
+ if (error == G_IO_ERROR_AGAIN)
+ continue;
+ break;
+ }
+ if (nb == 0)
+ return error;
+ left -= nb;
+ bufp += nb;
+ *bytes_read += nb;
+ }
+ return error;
+}
+
+static void
+shutdown_source (gpointer data)
+{
+ if (g_source_remove (*(guint *) data))
+ {
+ nrunning--;
+ if (nrunning == 0)
+ g_main_loop_quit (main_loop);
+ }
+}
+
+static gboolean
+recv_message (GIOChannel *channel,
+ GIOCondition cond,
+ gpointer data)
+{
+ gint fd = g_io_channel_unix_get_fd (channel);
+ gboolean retval = TRUE;
+
+#ifdef VERBOSE
+ g_print ("gio-test: ...from %d:%s%s%s%s\n", fd,
+ (cond & G_IO_ERR) ? " ERR" : "",
+ (cond & G_IO_HUP) ? " HUP" : "",
+ (cond & G_IO_IN) ? " IN" : "",
+ (cond & G_IO_PRI) ? " PRI" : "");
+#endif
+
+ if (cond & (G_IO_ERR | G_IO_HUP))
+ {
+ shutdown_source (data);
+ retval = FALSE;
+ }
+
+ if (cond & G_IO_IN)
+ {
+ char buf[BUFSIZE];
+ guint nbytes;
+ guint nb;
+ int i, j, seq;
+ GIOError error;
+
+ error = read_all (fd, channel, (gchar *) &seq, sizeof (seq), &nb);
+ if (error == G_IO_ERROR_NONE)
+ {
+ if (nb == 0)
+ {
+#ifdef VERBOSE
+ g_print ("gio-test: ...from %d: EOF\n", fd);
+#endif
+ shutdown_source (data);
+ return FALSE;
+ }
+
+ g_assert (nb == sizeof (nbytes));
+
+ for (i = 0; i < nkiddies; i++)
+ if (seqtab[i].fd == fd)
+ {
+ if (seq != seqtab[i].seq)
+ {
+ g_print ("gio-test: ...from %d: invalid sequence number %d, expected %d\n",
+ fd, seq, seqtab[i].seq);
+ g_assert_not_reached ();
+ }
+ seqtab[i].seq++;
+ break;
+ }
+
+ error = read_all (fd, channel, (gchar *) &nbytes, sizeof (nbytes), &nb);
+ }
+
+ if (error != G_IO_ERROR_NONE)
+ return FALSE;
+
+ if (nb == 0)
+ {
+#ifdef VERBOSE
+ g_print ("gio-test: ...from %d: EOF\n", fd);
+#endif
+ shutdown_source (data);
+ return FALSE;
+ }
+
+ g_assert (nb == sizeof (nbytes));
+
+ if (nbytes >= BUFSIZE)
+ {
+ g_print ("gio-test: ...from %d: nbytes = %d (%#x)!\n", fd, nbytes, nbytes);
+ g_assert_not_reached ();
+ }
+ g_assert (nbytes >= 0 && nbytes < BUFSIZE);
+#ifdef VERBOSE
+ g_print ("gio-test: ...from %d: %d bytes\n", fd, nbytes);
+#endif
+ if (nbytes > 0)
+ {
+ error = read_all (fd, channel, buf, nbytes, &nb);
+
+ if (error != G_IO_ERROR_NONE)
+ return FALSE;
+
+ if (nb == 0)
+ {
+#ifdef VERBOSE
+ g_print ("gio-test: ...from %d: EOF\n", fd);
+#endif
+ shutdown_source (data);
+ return FALSE;
+ }
+
+ for (j = 0; j < nbytes; j++)
+ if (buf[j] != ' ' + ((nbytes + j) % 95))
+ {
+ g_print ("gio-test: ...from %d: buf[%d] == '%c', should be '%c'\n",
+ fd, j, buf[j], 'a' + ((nbytes + j) % 32));
+ g_assert_not_reached ();
+ }
+#ifdef VERBOSE
+ g_print ("gio-test: ...from %d: OK\n", fd);
+#endif
+ }
+ }
+ return retval;
+}
+
+#ifdef G_OS_WIN32
+
+static gboolean
+recv_windows_message (GIOChannel *channel,
+ GIOCondition cond,
+ gpointer data)
+{
+ GIOError error;
+ MSG msg;
+ guint nb;
+
+ while (1)
+ {
+ error = g_io_channel_read (channel, &msg, sizeof (MSG), &nb);
+
+ if (error != G_IO_ERROR_NONE)
+ {
+ g_print ("gio-test: ...reading Windows message: G_IO_ERROR_%s\n",
+ (error == G_IO_ERROR_AGAIN ? "AGAIN" :
+ (error == G_IO_ERROR_INVAL ? "INVAL" :
+ (error == G_IO_ERROR_UNKNOWN ? "UNKNOWN" : "???"))));
+ if (error == G_IO_ERROR_AGAIN)
+ continue;
+ }
+ break;
+ }
+
+ g_print ("gio-test: ...Windows message for %#x: %d,%d,%d\n",
+ msg.hwnd, msg.message, msg.wParam, msg.lParam);
+
+ return TRUE;
+}
+
+LRESULT CALLBACK
+window_procedure (HWND hwnd,
+ UINT message,
+ WPARAM wparam,
+ LPARAM lparam)
+{
+ g_print ("gio-test: window_procedure for %#x: %d,%d,%d\n",
+ hwnd, message, wparam, lparam);
+ return DefWindowProc (hwnd, message, wparam, lparam);
+}
+
+#endif
+
+int
+main (int argc,
+ char **argv)
+{
+ if (argc < 3)
+ {
+ /* Parent */
+
+ GIOChannel *my_read_channel;
+ gchar *cmdline;
+ guint *id;
+ int i;
+#ifdef G_OS_WIN32
+ GTimeVal start, end;
+ GPollFD pollfd;
+ int pollresult;
+ ATOM klass;
+ static WNDCLASS wcl;
+ HWND hwnd;
+ GIOChannel *windows_messages_channel;
+#endif
+
+ nkiddies = (argc == 1 ? 1 : atoi(argv[1]));
+ seqtab = g_malloc (nkiddies * 2 * sizeof (int));
+
+#ifdef G_OS_WIN32
+ wcl.style = 0;
+ wcl.lpfnWndProc = window_procedure;
+ wcl.cbClsExtra = 0;
+ wcl.cbWndExtra = 0;
+ wcl.hInstance = GetModuleHandle (NULL);
+ wcl.hIcon = NULL;
+ wcl.hCursor = NULL;
+ wcl.hbrBackground = NULL;
+ wcl.lpszMenuName = NULL;
+ wcl.lpszClassName = "gio-test";
+
+ klass = RegisterClass (&wcl);
+
+ if (!klass)
+ {
+ g_print ("gio-test: RegisterClass failed\n");
+ exit (1);
+ }
+
+ hwnd = CreateWindow (MAKEINTATOM(klass), "gio-test", 0, 0, 0, 10, 10,
+ NULL, NULL, wcl.hInstance, NULL);
+ if (!hwnd)
+ {
+ g_print ("gio-test: CreateWindow failed\n");
+ exit (1);
+ }
+
+ windows_messages_channel = g_io_channel_win32_new_messages ((guint)hwnd);
+ g_io_add_watch (windows_messages_channel, G_IO_IN, recv_windows_message, 0);
+#endif
+
+ for (i = 0; i < nkiddies; i++)
+ {
+ int pipe_to_sub[2], pipe_from_sub[2];
+
+ if (pipe (pipe_to_sub) == -1 ||
+ pipe (pipe_from_sub) == -1)
+ perror ("pipe"), exit (1);
+
+ seqtab[i].fd = pipe_from_sub[0];
+ seqtab[i].seq = 0;
+
+ my_read_channel = g_io_channel_unix_new (pipe_from_sub[0]);
+
+ id = g_new (guint, 1);
+ *id =
+ g_io_add_watch (my_read_channel,
+ G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP,
+ recv_message,
+ id);
+
+ nrunning++;
+
+#ifdef G_OS_WIN32
+ cmdline = g_strdup_printf ("%d:%d:%d",
+ pipe_to_sub[0],
+ pipe_from_sub[1],
+ hwnd);
+ _spawnl (_P_NOWAIT, argv[0], argv[0], "--child", cmdline, NULL);
+#else
+ cmdline = g_strdup_printf ("%s --child %d:%d &", argv[0],
+ pipe_to_sub[0], pipe_from_sub[1]);
+
+ system (cmdline);
+#endif
+ close (pipe_to_sub[0]);
+ close (pipe_from_sub [1]);
+
+#ifdef G_OS_WIN32
+ g_get_current_time (&start);
+ g_io_channel_win32_make_pollfd (my_read_channel, G_IO_IN, &pollfd);
+ pollresult = g_io_channel_win32_poll (&pollfd, 1, 100);
+ g_get_current_time (&end);
+ if (end.tv_usec < start.tv_usec)
+ end.tv_sec--, end.tv_usec += 1000000;
+ g_print ("gio-test: had to wait %ld.%03ld s, result:%d\n",
+ end.tv_sec - start.tv_sec,
+ (end.tv_usec - start.tv_usec) / 1000,
+ pollresult);
+#endif
+ }
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+
+ g_main_loop_run (main_loop);
+ }
+ else if (argc == 3)
+ {
+ /* Child */
+
+ int readfd, writefd;
+#ifdef G_OS_WIN32
+ HWND hwnd;
+#endif
+ int i, j;
+ char buf[BUFSIZE];
+ int buflen;
+ GTimeVal tv;
+ int n;
+
+ g_get_current_time (&tv);
+
+ sscanf (argv[2], "%d:%d%n", &readfd, &writefd, &n);
+
+#ifdef G_OS_WIN32
+ sscanf (argv[2] + n, ":%d", &hwnd);
+#endif
+
+ srand (tv.tv_sec ^ (tv.tv_usec / 1000) ^ readfd ^ (writefd << 4));
+
+ for (i = 0; i < 20 + rand() % 20; i++)
+ {
+ g_usleep (100 + (rand() % 10) * 5000);
+ buflen = rand() % BUFSIZE;
+ for (j = 0; j < buflen; j++)
+ buf[j] = ' ' + ((buflen + j) % 95);
+#ifdef VERBOSE
+ g_print ("gio-test: child writing %d+%d bytes to %d\n",
+ (int)(sizeof(i) + sizeof(buflen)), buflen, writefd);
+#endif
+ write (writefd, &i, sizeof (i));
+ write (writefd, &buflen, sizeof (buflen));
+ write (writefd, buf, buflen);
+
+#ifdef G_OS_WIN32
+ if (rand() % 100 < 5)
+ {
+ int msg = WM_USER + (rand() % 100);
+ WPARAM wparam = rand ();
+ LPARAM lparam = rand ();
+ g_print ("gio-test: child posting message %d,%d,%d to %#x\n",
+ msg, wparam, lparam, hwnd);
+ PostMessage (hwnd, msg, wparam, lparam);
+ }
+#endif
+ }
+#ifdef VERBOSE
+ g_print ("gio-test: child exiting, closing %d\n", writefd);
+#endif
+ close (writefd);
+ }
+ else
+ g_print ("Huh?\n");
+
+ return 0;
+}
+
diff --git a/trunk/tests/gobject/Makefile.am b/trunk/tests/gobject/Makefile.am
new file mode 100644
index 000000000..d81c7e753
--- /dev/null
+++ b/trunk/tests/gobject/Makefile.am
@@ -0,0 +1,89 @@
+INCLUDES = \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/glib \
+ -I$(top_srcdir)/gmodule \
+ $(GLIB_DEBUG_FLAGS)
+
+libglib = $(top_builddir)/glib/libglib-2.0.la
+libgthread = $(top_builddir)/gthread/libgthread-2.0.la
+libgmodule = $(top_builddir)/gmodule/libgmodule-2.0.la
+libgobject = $(top_builddir)/gobject/libgobject-2.0.la
+
+########################################################################
+
+noinst_LTLIBRARIES = libtestgobject.la
+
+libtestgobject_la_SOURCES = \
+ testcommon.h \
+ testmarshal.h \
+ testmarshal.c \
+ testmodule.c \
+ testmodule.h
+
+if CROSS_COMPILING
+ glib_genmarshal=$(GLIB_GENMARSHAL)
+else
+ glib_genmarshal=$(top_builddir)/gobject/glib-genmarshal
+endif
+
+testmarshal.h: stamp-testmarshal.h
+ @true
+stamp-testmarshal.h: @REBUILD@ testmarshal.list $(glib_genmarshal)
+ $(glib_genmarshal) --prefix=test_marshal $(srcdir)/testmarshal.list --header >> xgen-gmh \
+ && (cmp -s xgen-gmh testmarshal.h 2>/dev/null || cp xgen-gmh testmarshal.h) \
+ && rm -f xgen-gmh xgen-gmh~ \
+ && echo timestamp > $@
+testmarshal.c: @REBUILD@ testmarshal.list $(glib_genmarshal)
+ $(glib_genmarshal) --prefix=test_marshal $(srcdir)/testmarshal.list --body >> xgen-gmc \
+ && cp xgen-gmc testmarshal.c \
+ && rm -f xgen-gmc xgen-gmc~
+
+BUILT_SOURCES = testmarshal.h testmarshal.c
+CLEANFILES = stamp-testmarshal.h
+
+########################################################################
+
+LDADD = libtestgobject.la $(libgobject)
+
+test_programs = \
+ deftype \
+ gvalue-test \
+ paramspec-test \
+ accumulator \
+ defaultiface \
+ dynamictype \
+ ifacecheck \
+ ifaceinit \
+ ifaceinherit \
+ ifaceproperties \
+ override \
+ singleton \
+ references
+
+check_PROGRAMS = $(test_programs)
+
+TESTS = $(test_programs)
+TESTS_ENVIRONMENT = srcdir=$(srcdir) \
+ LIBCHARSET_ALIAS_DIR=$(top_builddir)/glib/libcharset \
+ MALLOC_CHECK_=2 \
+ MALLOC_PERTURB_=$$(($${RANDOM:-256} % 256))
+
+########################################################################
+
+EXTRA_DIST = \
+ testmarshal.list
+
+BUILT_EXTRA_DIST = \
+ testmarshal.h \
+ testmarshal.c
+
+dist-hook: $(BUILT_EXTRA_DIST)
+ files='$(BUILT_EXTRA_DIST)'; \
+ for f in $$files; do \
+ if test -f $$f; then d=.; else d=$(srcdir); fi; \
+ cp $$d/$$f $(distdir) || exit 1; done
+
+distclean-local:
+ if test $(srcdir) = .; then :; else \
+ rm -f $(BUILT_EXTRA_DIST); \
+ fi
diff --git a/trunk/tests/gobject/accumulator.c b/trunk/tests/gobject/accumulator.c
new file mode 100644
index 000000000..602ab1146
--- /dev/null
+++ b/trunk/tests/gobject/accumulator.c
@@ -0,0 +1,227 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2001, 2003 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.
+ */
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "TestAccumulator"
+
+#undef G_DISABLE_ASSERT
+#undef G_DISABLE_CHECKS
+#undef G_DISABLE_CAST_CHECKS
+
+#include <string.h>
+
+#include <glib-object.h>
+
+#include "testmarshal.h"
+#include "testcommon.h"
+
+/* What this test tests is the behavior of signal accumulators
+ * Two accumulators are tested:
+ *
+ * 1: A custom accumulator that appends the returned strings
+ * 2: The standard g_signal_accumulator_true_handled that stops
+ * emission on TRUE returns.
+ */
+
+/*
+ * TestObject, a parent class for TestObject
+ */
+#define TEST_TYPE_OBJECT (test_object_get_type ())
+typedef struct _TestObject TestObject;
+typedef struct _TestObjectClass TestObjectClass;
+
+struct _TestObject
+{
+ GObject parent_instance;
+};
+struct _TestObjectClass
+{
+ GObjectClass parent_class;
+
+ gchar* (*test_signal1) (TestObject *tobject,
+ gint param);
+ gboolean (*test_signal2) (TestObject *tobject,
+ gint param);
+};
+
+static GType test_object_get_type (void);
+
+static gboolean
+test_signal1_accumulator (GSignalInvocationHint *ihint,
+ GValue *return_accu,
+ const GValue *handler_return,
+ gpointer data)
+{
+ const gchar *accu_string = g_value_get_string (return_accu);
+ const gchar *new_string = g_value_get_string (handler_return);
+ gchar *result_string;
+
+ if (accu_string)
+ result_string = g_strconcat (accu_string, new_string, NULL);
+ else if (new_string)
+ result_string = g_strdup (new_string);
+ else
+ result_string = NULL;
+
+ g_value_set_string_take_ownership (return_accu, result_string);
+
+ return TRUE;
+}
+
+gchar*
+test_object_signal1_callback_before (TestObject *tobject,
+ gint param,
+ gpointer data)
+{
+ return g_strdup ("<before>");
+}
+
+gchar*
+test_object_real_signal1 (TestObject *tobject,
+ gint param)
+{
+ return g_strdup ("<default>");
+}
+
+gchar*
+test_object_signal1_callback_after (TestObject *tobject,
+ gint param,
+ gpointer data)
+{
+ return g_strdup ("<after>");
+}
+
+gboolean
+test_object_signal2_callback_before (TestObject *tobject,
+ gint param)
+{
+ switch (param)
+ {
+ case 1: return TRUE;
+ case 2: return FALSE;
+ case 3: return FALSE;
+ case 4: return FALSE;
+ }
+
+ g_assert_not_reached ();
+ return FALSE;
+}
+
+gboolean
+test_object_real_signal2 (TestObject *tobject,
+ gint param)
+{
+ switch (param)
+ {
+ case 1: g_assert_not_reached (); return FALSE;
+ case 2: return TRUE;
+ case 3: return FALSE;
+ case 4: return FALSE;
+ }
+
+ g_assert_not_reached ();
+ return FALSE;
+}
+
+gboolean
+test_object_signal2_callback_after (TestObject *tobject,
+ gint param)
+{
+ switch (param)
+ {
+ case 1: g_assert_not_reached (); return FALSE;
+ case 2: g_assert_not_reached (); return FALSE;
+ case 3: return TRUE;
+ case 4: return FALSE;
+ }
+
+ g_assert_not_reached ();
+ return FALSE;
+}
+
+static void
+test_object_class_init (TestObjectClass *class)
+{
+ class->test_signal1 = test_object_real_signal1;
+ class->test_signal2 = test_object_real_signal2;
+
+ g_signal_new ("test-signal1",
+ G_OBJECT_CLASS_TYPE (class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (TestObjectClass, test_signal1),
+ test_signal1_accumulator, NULL,
+ test_marshal_STRING__INT,
+ G_TYPE_STRING, 1, G_TYPE_INT);
+ g_signal_new ("test-signal2",
+ G_OBJECT_CLASS_TYPE (class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (TestObjectClass, test_signal2),
+ g_signal_accumulator_true_handled, NULL,
+ test_marshal_BOOLEAN__INT,
+ G_TYPE_BOOLEAN, 1, G_TYPE_INT);
+}
+
+static DEFINE_TYPE(TestObject, test_object,
+ test_object_class_init, NULL, NULL,
+ G_TYPE_OBJECT)
+
+int
+main (int argc,
+ char *argv[])
+{
+ TestObject *object;
+ gchar *string_result;
+ gboolean bool_result;
+
+ g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) |
+ G_LOG_LEVEL_WARNING |
+ G_LOG_LEVEL_CRITICAL);
+ g_type_init ();
+
+ object = g_object_new (TEST_TYPE_OBJECT, NULL);
+
+ g_signal_connect (object, "test-signal1",
+ G_CALLBACK (test_object_signal1_callback_before), NULL);
+ g_signal_connect_after (object, "test-signal1",
+ G_CALLBACK (test_object_signal1_callback_after), NULL);
+
+ g_signal_emit_by_name (object, "test-signal1", 0, &string_result);
+ g_assert (strcmp (string_result, "<before><default><after>") == 0);
+ g_free (string_result);
+
+ g_signal_connect (object, "test-signal2",
+ G_CALLBACK (test_object_signal2_callback_before), NULL);
+ g_signal_connect_after (object, "test-signal2",
+ G_CALLBACK (test_object_signal2_callback_after), NULL);
+
+ bool_result = FALSE;
+ g_signal_emit_by_name (object, "test-signal2", 1, &bool_result);
+ g_assert (bool_result == TRUE);
+ bool_result = FALSE;
+ g_signal_emit_by_name (object, "test-signal2", 2, &bool_result);
+ g_assert (bool_result == TRUE);
+ bool_result = FALSE;
+ g_signal_emit_by_name (object, "test-signal2", 3, &bool_result);
+ g_assert (bool_result == TRUE);
+ bool_result = TRUE;
+ g_signal_emit_by_name (object, "test-signal2", 4, &bool_result);
+ g_assert (bool_result == FALSE);
+
+ return 0;
+}
diff --git a/trunk/tests/gobject/defaultiface.c b/trunk/tests/gobject/defaultiface.c
new file mode 100644
index 000000000..2ebe89055
--- /dev/null
+++ b/trunk/tests/gobject/defaultiface.c
@@ -0,0 +1,191 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2001, 2003 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.
+ */
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "TestDefaultIface"
+
+#undef G_DISABLE_ASSERT
+#undef G_DISABLE_CHECKS
+#undef G_DISABLE_CAST_CHECKS
+
+#include <glib-object.h>
+
+#include "testcommon.h"
+#include "testmodule.h"
+
+/* This test tests getting the default vtable for an interface
+ * and the initialization and finalization of such default
+ * interfaces.
+ *
+ * We test this both for static and for dynamic interfaces.
+ */
+
+/**********************************************************************
+ * Static interface tests
+ **********************************************************************/
+
+typedef struct _TestStaticIfaceClass TestStaticIfaceClass;
+
+struct _TestStaticIfaceClass
+{
+ GTypeInterface base_iface;
+ guint val;
+};
+
+#define TEST_TYPE_STATIC_IFACE (test_static_iface_get_type ())
+
+static void
+test_static_iface_default_init (TestStaticIfaceClass *iface)
+{
+ iface->val = 42;
+}
+
+DEFINE_IFACE (TestStaticIface, test_static_iface,
+ NULL, test_static_iface_default_init)
+
+static void
+test_static_iface (void)
+{
+ TestStaticIfaceClass *static_iface;
+
+ /* Not loaded until we call ref for the first time */
+ static_iface = g_type_default_interface_peek (TEST_TYPE_STATIC_IFACE);
+ g_assert (static_iface == NULL);
+
+ /* Ref loads */
+ static_iface = g_type_default_interface_ref (TEST_TYPE_STATIC_IFACE);
+ g_assert (static_iface && static_iface->val == 42);
+
+ /* Peek then works */
+ static_iface = g_type_default_interface_peek (TEST_TYPE_STATIC_IFACE);
+ g_assert (static_iface && static_iface->val == 42);
+
+ /* Unref does nothing */
+ g_type_default_interface_unref (static_iface);
+
+ /* And peek still works */
+ static_iface = g_type_default_interface_peek (TEST_TYPE_STATIC_IFACE);
+ g_assert (static_iface && static_iface->val == 42);
+}
+
+/**********************************************************************
+ * Dynamic interface tests
+ **********************************************************************/
+
+typedef struct _TestDynamicIfaceClass TestDynamicIfaceClass;
+
+struct _TestDynamicIfaceClass
+{
+ GTypeInterface base_iface;
+ guint val;
+};
+
+static GType test_dynamic_iface_type;
+static gboolean dynamic_iface_init = FALSE;
+
+#define TEST_TYPE_DYNAMIC_IFACE (test_dynamic_iface_type)
+
+static void
+test_dynamic_iface_default_init (TestStaticIfaceClass *iface)
+{
+ dynamic_iface_init = TRUE;
+ iface->val = 42;
+}
+
+static void
+test_dynamic_iface_default_finalize (TestStaticIfaceClass *iface)
+{
+ dynamic_iface_init = FALSE;
+}
+
+static void
+test_dynamic_iface_register (GTypeModule *module)
+{
+ static const GTypeInfo iface_info =
+ {
+ sizeof (TestDynamicIfaceClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) test_dynamic_iface_default_init,
+ (GClassFinalizeFunc) test_dynamic_iface_default_finalize
+ };
+
+ test_dynamic_iface_type = g_type_module_register_type (module, G_TYPE_INTERFACE,
+ "TestDynamicIface", &iface_info, 0);
+}
+
+static void
+module_register (GTypeModule *module)
+{
+ test_dynamic_iface_register (module);
+}
+
+static void
+test_dynamic_iface (void)
+{
+ GTypeModule *module;
+ TestDynamicIfaceClass *dynamic_iface;
+
+ module = test_module_new (module_register);
+
+ /* Not loaded until we call ref for the first time */
+ dynamic_iface = g_type_default_interface_peek (TEST_TYPE_DYNAMIC_IFACE);
+ g_assert (dynamic_iface == NULL);
+
+ /* Ref loads */
+ dynamic_iface = g_type_default_interface_ref (TEST_TYPE_DYNAMIC_IFACE);
+ g_assert (dynamic_iface_init);
+ g_assert (dynamic_iface && dynamic_iface->val == 42);
+
+ /* Peek then works */
+ dynamic_iface = g_type_default_interface_peek (TEST_TYPE_DYNAMIC_IFACE);
+ g_assert (dynamic_iface && dynamic_iface->val == 42);
+
+ /* Unref causes finalize */
+ g_type_default_interface_unref (dynamic_iface);
+ g_assert (!dynamic_iface_init);
+
+ /* Peek returns NULL */
+ dynamic_iface = g_type_default_interface_peek (TEST_TYPE_DYNAMIC_IFACE);
+ g_assert (dynamic_iface == NULL);
+
+ /* Ref reloads */
+ dynamic_iface = g_type_default_interface_ref (TEST_TYPE_DYNAMIC_IFACE);
+ g_assert (dynamic_iface_init);
+ g_assert (dynamic_iface && dynamic_iface->val == 42);
+
+ /* And Unref causes finalize once more*/
+ g_type_default_interface_unref (dynamic_iface);
+ g_assert (!dynamic_iface_init);
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) |
+ G_LOG_LEVEL_WARNING |
+ G_LOG_LEVEL_CRITICAL);
+ g_type_init ();
+
+ test_static_iface ();
+ test_dynamic_iface ();
+
+ return 0;
+}
diff --git a/trunk/tests/gobject/deftype.c b/trunk/tests/gobject/deftype.c
new file mode 100644
index 000000000..924e7ad60
--- /dev/null
+++ b/trunk/tests/gobject/deftype.c
@@ -0,0 +1,59 @@
+/* deftype.c
+ * Copyright (C) 2006 Behdad Esfahbod
+ *
+ * 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-object.h>
+
+/* see http://bugzilla.gnome.org/show_bug.cgi?id=337128 for the purpose of this test */
+
+#define MY_G_IMPLEMENT_INTERFACE(TYPE_IFACE, iface_init) { \
+ static const GInterfaceInfo g_implement_interface_info = { \
+ (GInterfaceInitFunc) iface_init, \
+ NULL, \
+ NULL \
+ }; \
+ g_type_add_interface_static (g_define_type_id, TYPE_IFACE, &g_implement_interface_info); \
+}
+
+#define MY_DEFINE_TYPE(TN, t_n, T_P) \
+ G_DEFINE_TYPE_WITH_CODE (TN, t_n, T_P, \
+ MY_G_IMPLEMENT_INTERFACE (G_TYPE_INTERFACE, NULL))
+
+typedef struct _TypeName {
+ GObject parent_instance;
+ const char *name;
+} TypeName;
+
+typedef struct _TypeNameClass {
+ GObjectClass parent_parent;
+} TypeNameClass;
+
+MY_DEFINE_TYPE (TypeName, type_name, G_TYPE_OBJECT)
+
+static void type_name_init (TypeName *self)
+{
+}
+
+static void type_name_class_init (TypeNameClass *klass)
+{
+}
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/trunk/tests/gobject/dynamictype.c b/trunk/tests/gobject/dynamictype.c
new file mode 100644
index 000000000..2a5415e43
--- /dev/null
+++ b/trunk/tests/gobject/dynamictype.c
@@ -0,0 +1,130 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2001, 2003 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.
+ */
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "TestDynamicType"
+
+#undef G_DISABLE_ASSERT
+#undef G_DISABLE_CHECKS
+#undef G_DISABLE_CAST_CHECKS
+
+#include <glib-object.h>
+
+#include "testcommon.h"
+#include "testmodule.h"
+
+/* This test tests the macros for defining dynamic types.
+ */
+
+static gboolean loaded = FALSE;
+
+#define DYNAMIC_OBJECT_TYPE (dynamic_object_get_type ())
+
+typedef GObject DynamicObject;
+typedef struct _DynamicObjectClass DynamicObjectClass;
+
+struct _DynamicObjectClass
+{
+ GObjectClass parent_class;
+ guint val;
+};
+
+G_DEFINE_DYNAMIC_TYPE(DynamicObject, dynamic_object, G_TYPE_OBJECT);
+
+static void
+dynamic_object_class_init (DynamicObjectClass *class)
+{
+ class->val = 42;
+ loaded = TRUE;
+}
+
+static void
+dynamic_object_class_finalize (DynamicObjectClass *class)
+{
+ loaded = FALSE;
+}
+
+static void
+dynamic_object_init (DynamicObject *dynamic_object)
+{
+}
+
+
+static void
+module_register (GTypeModule *module)
+{
+ dynamic_object_register_type (module);
+}
+
+static void
+test_dynamic_type (void)
+{
+ GTypeModule *module;
+ DynamicObjectClass *class;
+
+ module = test_module_new (module_register);
+
+ /* Not loaded until we call ref for the first time */
+ class = g_type_class_peek (DYNAMIC_OBJECT_TYPE);
+ g_assert (class == NULL);
+ g_assert (!loaded);
+
+ /* Ref loads */
+ class = g_type_class_ref (DYNAMIC_OBJECT_TYPE);
+ g_assert (class && class->val == 42);
+ g_assert (loaded);
+
+ /* Peek then works */
+ class = g_type_class_peek (DYNAMIC_OBJECT_TYPE);
+ g_assert (class && class->val == 42);
+ g_assert (loaded);
+
+ /* Unref causes finalize */
+ g_type_class_unref (class);
+
+ /* Peek returns NULL */
+ class = g_type_class_peek (DYNAMIC_OBJECT_TYPE);
+ g_assert (!class);
+ g_assert (!loaded);
+
+ /* Ref reloads */
+ class = g_type_class_ref (DYNAMIC_OBJECT_TYPE);
+ g_assert (class && class->val == 42);
+ g_assert (loaded);
+
+ /* And Unref causes finalize once more*/
+ g_type_class_unref (class);
+ class = g_type_class_peek (DYNAMIC_OBJECT_TYPE);
+ g_assert (!class);
+ g_assert (!loaded);
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) |
+ G_LOG_LEVEL_WARNING |
+ G_LOG_LEVEL_CRITICAL);
+ g_type_init ();
+
+ test_dynamic_type ();
+
+ return 0;
+}
diff --git a/trunk/tests/gobject/gvalue-test.c b/trunk/tests/gobject/gvalue-test.c
new file mode 100644
index 000000000..2d721e032
--- /dev/null
+++ b/trunk/tests/gobject/gvalue-test.c
@@ -0,0 +1,374 @@
+/* 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <string.h>
+
+#include <glib.h>
+#include <glib-object.h>
+#include "gobject/gvaluecollector.h"
+
+static void
+test_enum_transformation (void)
+{
+ GType type;
+ GValue orig = { 0, };
+ GValue xform = { 0, };
+ GEnumValue values[] = { {0,"0","0"}, {1,"1","1"}};
+
+ type = g_enum_register_static ("TestEnum", values);
+
+ g_value_init (&orig, type);
+ g_value_set_enum (&orig, 1);
+
+ memset (&xform, 0, sizeof (GValue));
+ g_value_init (&xform, G_TYPE_CHAR);
+ g_value_transform (&orig, &xform);
+ g_assert (g_value_get_char (&xform) == 1);
+
+ memset (&xform, 0, sizeof (GValue));
+ g_value_init (&xform, G_TYPE_UCHAR);
+ g_value_transform (&orig, &xform);
+ g_assert (g_value_get_uchar (&xform) == 1);
+
+ memset (&xform, 0, sizeof (GValue));
+ g_value_init (&xform, G_TYPE_INT);
+ g_value_transform (&orig, &xform);
+ g_assert (g_value_get_int (&xform) == 1);
+
+ memset (&xform, 0, sizeof (GValue));
+ g_value_init (&xform, G_TYPE_UINT);
+ g_value_transform (&orig, &xform);
+ g_assert (g_value_get_uint (&xform) == 1);
+
+ memset (&xform, 0, sizeof (GValue));
+ g_value_init (&xform, G_TYPE_LONG);
+ g_value_transform (&orig, &xform);
+ g_assert (g_value_get_long (&xform) == 1);
+
+ memset (&xform, 0, sizeof (GValue));
+ g_value_init (&xform, G_TYPE_ULONG);
+ g_value_transform (&orig, &xform);
+ g_assert (g_value_get_ulong (&xform) == 1);
+
+ memset (&xform, 0, sizeof (GValue));
+ g_value_init (&xform, G_TYPE_INT64);
+ g_value_transform (&orig, &xform);
+ g_assert (g_value_get_int64 (&xform) == 1);
+
+ memset (&xform, 0, sizeof (GValue));
+ g_value_init (&xform, G_TYPE_UINT64);
+ g_value_transform (&orig, &xform);
+ g_assert (g_value_get_uint64 (&xform) == 1);
+}
+
+
+static void
+test_gtype_value (void)
+{
+ GType type;
+ GValue value = { 0, };
+ GValue copy = { 0, };
+
+ g_value_init (&value, G_TYPE_GTYPE);
+
+ g_value_set_gtype (&value, G_TYPE_BOXED);
+ type = g_value_get_gtype (&value);
+ g_assert (type == G_TYPE_BOXED);
+
+ g_value_init (&copy, G_TYPE_GTYPE);
+ g_value_copy (&value, &copy);
+ type = g_value_get_gtype (&copy);
+ g_assert (type == G_TYPE_BOXED);
+}
+
+static gchar *
+collect (GValue *value, ...)
+{
+ gchar *error;
+ va_list var_args;
+
+ error = NULL;
+
+ va_start (var_args, value);
+ G_VALUE_COLLECT (value, var_args, 0, &error);
+ va_end (var_args);
+
+ return error;
+}
+
+static gchar *
+lcopy (GValue *value, ...)
+{
+ gchar *error;
+ va_list var_args;
+
+ error = NULL;
+
+ va_start (var_args, value);
+ G_VALUE_LCOPY (value, var_args, 0, &error);
+ va_end (var_args);
+
+ return error;
+}
+
+static void
+test_collection (void)
+{
+ GValue value = { 0, };
+ gchar *error;
+
+ g_value_init (&value, G_TYPE_CHAR);
+ error = collect (&value, 'c');
+ g_assert (error == NULL);
+ g_assert (g_value_get_char (&value) == 'c');
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_UCHAR);
+ error = collect (&value, 129);
+ g_assert (error == NULL);
+ g_assert (g_value_get_uchar (&value) == 129);
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_BOOLEAN);
+ error = collect (&value, TRUE);
+ g_assert (error == NULL);
+ g_assert (g_value_get_boolean (&value) == TRUE);
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_INT);
+ error = collect (&value, G_MAXINT);
+ g_assert (error == NULL);
+ g_assert (g_value_get_int (&value) == G_MAXINT);
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_UINT);
+ error = collect (&value, G_MAXUINT);
+ g_assert (error == NULL);
+ g_assert (g_value_get_uint (&value) == G_MAXUINT);
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_LONG);
+ error = collect (&value, G_MAXLONG);
+ g_assert (error == NULL);
+ g_assert (g_value_get_long (&value) == G_MAXLONG);
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_ULONG);
+ error = collect (&value, G_MAXULONG);
+ g_assert (error == NULL);
+ g_assert (g_value_get_ulong (&value) == G_MAXULONG);
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_INT64);
+ error = collect (&value, G_MAXINT64);
+ g_assert (error == NULL);
+ g_assert (g_value_get_int64 (&value) == G_MAXINT64);
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_UINT64);
+ error = collect (&value, G_MAXUINT64);
+ g_assert (error == NULL);
+ g_assert (g_value_get_uint64 (&value) == G_MAXUINT64);
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_FLOAT);
+ error = collect (&value, G_MAXFLOAT);
+ g_assert (error == NULL);
+ g_assert (g_value_get_float (&value) == G_MAXFLOAT);
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_DOUBLE);
+ error = collect (&value, G_MAXDOUBLE);
+ g_assert (error == NULL);
+ g_assert (g_value_get_double (&value) == G_MAXDOUBLE);
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_STRING);
+ error = collect (&value, "string ?");
+ g_assert (error == NULL);
+ g_assert (strcmp (g_value_get_string (&value), "string ?") == 0);
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_GTYPE);
+ error = collect (&value, G_TYPE_BOXED);
+ g_assert (error == NULL);
+ g_assert (g_value_get_gtype (&value) == G_TYPE_BOXED);
+}
+
+static void
+test_copying (void)
+{
+ GValue value = { 0, };
+ gchar *error;
+
+ {
+ gchar c = 0;
+
+ g_value_init (&value, G_TYPE_CHAR);
+ g_value_set_char (&value, 'c');
+ error = lcopy (&value, &c);
+ g_assert (error == NULL);
+ g_assert (c == 'c');
+ }
+
+ {
+ guchar c = 0;
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_UCHAR);
+ g_value_set_uchar (&value, 129);
+ error = lcopy (&value, &c);
+ g_assert (error == NULL);
+ g_assert (c == 129);
+ }
+
+ {
+ gint c = 0;
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_INT);
+ g_value_set_int (&value, G_MAXINT);
+ error = lcopy (&value, &c);
+ g_assert (error == NULL);
+ g_assert (c == G_MAXINT);
+ }
+
+ {
+ guint c = 0;
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_UINT);
+ g_value_set_uint (&value, G_MAXUINT);
+ error = lcopy (&value, &c);
+ g_assert (error == NULL);
+ g_assert (c == G_MAXUINT);
+ }
+
+ {
+ glong c = 0;
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_LONG);
+ g_value_set_long (&value, G_MAXLONG);
+ error = lcopy (&value, &c);
+ g_assert (error == NULL);
+ g_assert (c == G_MAXLONG);
+ }
+
+ {
+ gulong c = 0;
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_ULONG);
+ g_value_set_ulong (&value, G_MAXULONG);
+ error = lcopy (&value, &c);
+ g_assert (error == NULL);
+ g_assert (c == G_MAXULONG);
+ }
+
+ {
+ gint64 c = 0;
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_INT64);
+ g_value_set_int64 (&value, G_MAXINT64);
+ error = lcopy (&value, &c);
+ g_assert (error == NULL);
+ g_assert (c == G_MAXINT64);
+ }
+
+ {
+ guint64 c = 0;
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_UINT64);
+ g_value_set_uint64 (&value, G_MAXUINT64);
+ error = lcopy (&value, &c);
+ g_assert (error == NULL);
+ g_assert (c == G_MAXUINT64);
+ }
+
+ {
+ gfloat c = 0;
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_FLOAT);
+ g_value_set_float (&value, G_MAXFLOAT);
+ error = lcopy (&value, &c);
+ g_assert (error == NULL);
+ g_assert (c == G_MAXFLOAT);
+ }
+
+ {
+ gdouble c = 0;
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_DOUBLE);
+ g_value_set_double (&value, G_MAXDOUBLE);
+ error = lcopy (&value, &c);
+ g_assert (error == NULL);
+ g_assert (c == G_MAXDOUBLE);
+ }
+
+ {
+ gchar *c = NULL;
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_string (&value, "string ?");
+ error = lcopy (&value, &c);
+ g_assert (error == NULL);
+ g_assert (strcmp (c, "string ?") == 0);
+ }
+
+ {
+ GType c = G_TYPE_NONE;
+
+ g_value_unset (&value);
+ g_value_init (&value, G_TYPE_GTYPE);
+ g_value_set_gtype (&value, G_TYPE_BOXED);
+ error = lcopy (&value, &c);
+ g_assert (error == NULL);
+ g_assert (c == G_TYPE_BOXED);
+ }
+}
+
+
+int
+main (int argc, char *argv[])
+{
+ g_type_init ();
+
+ test_enum_transformation ();
+ test_gtype_value ();
+ test_collection ();
+ test_copying ();
+
+ return 0;
+}
diff --git a/trunk/tests/gobject/ifacecheck.c b/trunk/tests/gobject/ifacecheck.c
new file mode 100644
index 000000000..f57189a65
--- /dev/null
+++ b/trunk/tests/gobject/ifacecheck.c
@@ -0,0 +1,167 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2001, 2003 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.
+ */
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "TestIfaceCheck"
+
+#undef G_DISABLE_ASSERT
+#undef G_DISABLE_CHECKS
+#undef G_DISABLE_CAST_CHECKS
+
+#include <string.h>
+
+#include <glib-object.h>
+
+#include "testcommon.h"
+
+/* This test tests g_type_add_interface_check_func(), which allows
+ * installing a post-initialization check function.
+ */
+
+#define TEST_TYPE_IFACE (test_iface_get_type ())
+#define TEST_IFACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE, TestIfaceClass))
+typedef struct _TestIfaceClass TestIfaceClass;
+
+struct _TestIfaceClass
+{
+ GTypeInterface base_iface;
+ GString *history;
+};
+
+static void
+test_iface_base_init (TestIfaceClass *iface)
+{
+ iface->history = g_string_new (iface->history ? iface->history->str : NULL);
+}
+
+static DEFINE_IFACE(TestIface, test_iface, test_iface_base_init, NULL)
+
+/*
+ * TestObject1
+ */
+#define TEST_TYPE_OBJECT1 (test_object1_get_type ())
+typedef struct _GObject TestObject1;
+typedef struct _GObjectClass TestObject1Class;
+
+static DEFINE_TYPE_FULL (TestObject1, test_object1,
+ NULL, NULL, NULL,
+ G_TYPE_OBJECT,
+ INTERFACE (NULL, TEST_TYPE_IFACE))
+
+/*
+ * TestObject2
+ */
+#define TEST_TYPE_OBJECT2 (test_object2_get_type ())
+typedef struct _GObject TestObject2;
+typedef struct _GObjectClass TestObject2Class;
+
+static DEFINE_TYPE_FULL (TestObject2, test_object2,
+ NULL, NULL, NULL,
+ G_TYPE_OBJECT,
+ INTERFACE (NULL, TEST_TYPE_IFACE))
+
+/*
+ * TestObject3
+ */
+#define TEST_TYPE_OBJECT3 (test_object3_get_type ())
+typedef struct _GObject TestObject3;
+typedef struct _GObjectClass TestObject3Class;
+
+static DEFINE_TYPE_FULL (TestObject3, test_object3,
+ NULL, NULL, NULL,
+ G_TYPE_OBJECT,
+ INTERFACE (NULL, TEST_TYPE_IFACE))
+
+/*
+ * TestObject4
+ */
+#define TEST_TYPE_OBJECT4 (test_object4_get_type ())
+typedef struct _GObject TestObject4;
+typedef struct _GObjectClass TestObject4Class;
+
+
+static DEFINE_TYPE_FULL (TestObject4, test_object4,
+ NULL, NULL, NULL,
+ G_TYPE_OBJECT, {})
+
+static void
+check_func (gpointer check_data,
+ gpointer g_iface)
+{
+ TestIfaceClass *iface = g_iface;
+
+ g_string_append (iface->history, check_data);
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ TestIfaceClass *iface;
+ GObject *object;
+ char *string1 = "A";
+ char *string2 = "B";
+
+ g_type_init ();
+
+ /* Basic check of interfaces added before class_init time
+ */
+ g_type_add_interface_check (string1, check_func);
+
+ object = g_object_new (TEST_TYPE_OBJECT1, NULL);
+ iface = TEST_IFACE_GET_CLASS (object);
+ g_assert (strcmp (iface->history->str, "A") == 0);
+ g_object_unref (object);
+
+ /* Add a second check function
+ */
+ g_type_add_interface_check (string2, check_func);
+
+ object = g_object_new (TEST_TYPE_OBJECT2, NULL);
+ iface = TEST_IFACE_GET_CLASS (object);
+ g_assert (strcmp (iface->history->str, "AB") == 0);
+ g_object_unref (object);
+
+ /* Remove the first check function
+ */
+ g_type_remove_interface_check (string1, check_func);
+
+ object = g_object_new (TEST_TYPE_OBJECT3, NULL);
+ iface = TEST_IFACE_GET_CLASS (object);
+ g_assert (strcmp (iface->history->str, "B") == 0);
+ g_object_unref (object);
+
+ /* Test interfaces added after class_init time
+ */
+ g_type_class_ref (TEST_TYPE_OBJECT4);
+ {
+ static GInterfaceInfo const iface = {
+ NULL, NULL, NULL
+ };
+
+ g_type_add_interface_static (TEST_TYPE_OBJECT4, TEST_TYPE_IFACE, &iface);
+ }
+
+ object = g_object_new (TEST_TYPE_OBJECT4, NULL);
+ iface = TEST_IFACE_GET_CLASS (object);
+ g_assert (strcmp (iface->history->str, "B") == 0);
+ g_object_unref (object);
+
+ return 0;
+}
diff --git a/trunk/tests/gobject/ifaceinherit.c b/trunk/tests/gobject/ifaceinherit.c
new file mode 100644
index 000000000..f9fe8beb6
--- /dev/null
+++ b/trunk/tests/gobject/ifaceinherit.c
@@ -0,0 +1,227 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2001, 2003 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.
+ */
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "TestIfaceInherit"
+
+#undef G_DISABLE_ASSERT
+#undef G_DISABLE_CHECKS
+#undef G_DISABLE_CAST_CHECKS
+
+#include <glib-object.h>
+
+#include "testcommon.h"
+#include "testmodule.h"
+
+/* This test tests inheritance of interface. We two object
+ * class BaseObject and DerivedObject we add an interface
+ * to BaseObject:
+ *
+ * I1) Before DerivedObject is registered
+ * I2) After DerivedObject is registered, but before
+ * DerivedObject is class initialized
+ * I3) During DerivedObject's class_init
+ * I4) After DerivedObject's class init
+ *
+ * We also do some tests of overriding.
+ *
+ * I5) We add an interface to BaseObject, then add the same
+ * interface to DerivedObject. (Note that this is only legal
+ * before DerivedObject's class_init; the results of
+ * g_type_interface_peek() are not allowed to change from one
+ * non-NULL vtable to another non-NULL vtable)
+ */
+
+/*
+ * BaseObject, a parent class for DerivedObject
+ */
+#define BASE_TYPE_OBJECT (base_object_get_type ())
+typedef struct _BaseObject BaseObject;
+typedef struct _BaseObjectClass BaseObjectClass;
+
+struct _BaseObject
+{
+ GObject parent_instance;
+};
+struct _BaseObjectClass
+{
+ GObjectClass parent_class;
+};
+
+static GType base_object_get_type ();
+static GType derived_object_get_type ();
+
+/*
+ * DerivedObject, the child class of DerivedObject
+ */
+#define DERIVED_TYPE_OBJECT (derived_object_get_type ())
+typedef struct _DerivedObject DerivedObject;
+typedef struct _DerivedObjectClass DerivedObjectClass;
+
+struct _DerivedObject
+{
+ BaseObject parent_instance;
+};
+struct _DerivedObjectClass
+{
+ BaseObjectClass parent_class;
+};
+
+/*
+ * The interfaces
+ */
+typedef struct _TestIfaceClass TestIfaceClass;
+typedef struct _TestIfaceClass TestIface1Class;
+typedef struct _TestIfaceClass TestIface2Class;
+typedef struct _TestIfaceClass TestIface3Class;
+typedef struct _TestIfaceClass TestIface4Class;
+typedef struct _TestIfaceClass TestIface5Class;
+
+struct _TestIfaceClass
+{
+ GTypeInterface base_iface;
+ guint val;
+};
+
+#define TEST_TYPE_IFACE1 (test_iface1_get_type ())
+#define TEST_TYPE_IFACE2 (test_iface2_get_type ())
+#define TEST_TYPE_IFACE3 (test_iface3_get_type ())
+#define TEST_TYPE_IFACE4 (test_iface4_get_type ())
+#define TEST_TYPE_IFACE5 (test_iface5_get_type ())
+
+static DEFINE_IFACE (TestIface1, test_iface1, NULL, NULL)
+static DEFINE_IFACE (TestIface2, test_iface2, NULL, NULL)
+static DEFINE_IFACE (TestIface3, test_iface3, NULL, NULL)
+static DEFINE_IFACE (TestIface4, test_iface4, NULL, NULL)
+static DEFINE_IFACE (TestIface5, test_iface5, NULL, NULL)
+
+static void
+add_interface (GType object_type,
+ GType iface_type,
+ GInterfaceInitFunc init_func)
+{
+ GInterfaceInfo iface_info = { NULL, NULL, NULL };
+
+ iface_info.interface_init = init_func;
+
+ g_type_add_interface_static (object_type, iface_type, &iface_info);
+}
+
+static void
+init_base_interface (TestIfaceClass *iface)
+{
+ iface->val = 21;
+}
+
+static void
+add_base_interface (GType object_type,
+ GType iface_type)
+{
+ add_interface (object_type, iface_type,
+ (GInterfaceInitFunc)init_base_interface);
+}
+
+static gboolean
+interface_is_base (GType object_type,
+ GType iface_type)
+{
+ gpointer g_class = g_type_class_peek (object_type);
+ TestIfaceClass *iface = g_type_interface_peek (g_class, iface_type);
+ return iface && iface->val == 21;
+}
+
+static void
+init_derived_interface (TestIfaceClass *iface)
+{
+ iface->val = 42;
+}
+
+static void
+add_derived_interface (GType object_type,
+ GType iface_type)
+{
+ add_interface (object_type, iface_type,
+ (GInterfaceInitFunc)init_derived_interface);
+}
+
+static gboolean
+interface_is_derived (GType object_type,
+ GType iface_type)
+{
+ gpointer g_class = g_type_class_peek (object_type);
+ TestIfaceClass *iface = g_type_interface_peek (g_class, iface_type);
+ return iface && iface->val == 42;
+}
+
+static void
+derived_object_class_init (BaseObjectClass *class)
+{
+ add_base_interface (BASE_TYPE_OBJECT, TEST_TYPE_IFACE3);
+}
+
+static DEFINE_TYPE(BaseObject, base_object,
+ NULL, NULL, NULL,
+ G_TYPE_OBJECT)
+static DEFINE_TYPE(DerivedObject, derived_object,
+ derived_object_class_init, NULL, NULL,
+ BASE_TYPE_OBJECT)
+
+int
+main (int argc,
+ char *argv[])
+{
+ g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) |
+ G_LOG_LEVEL_WARNING |
+ G_LOG_LEVEL_CRITICAL);
+ g_type_init ();
+
+ /* Register BaseObject */
+ BASE_TYPE_OBJECT;
+
+ add_base_interface (BASE_TYPE_OBJECT, TEST_TYPE_IFACE5);
+
+ /* Class init BaseObject */
+ g_type_class_ref (BASE_TYPE_OBJECT);
+
+ add_base_interface (BASE_TYPE_OBJECT, TEST_TYPE_IFACE1);
+
+ /* Register DerivedObject */
+ DERIVED_TYPE_OBJECT;
+
+ add_base_interface (BASE_TYPE_OBJECT, TEST_TYPE_IFACE2);
+ add_derived_interface (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE5);
+
+ /* Class init DerivedObject */
+ g_type_class_ref (DERIVED_TYPE_OBJECT);
+
+ add_base_interface (BASE_TYPE_OBJECT, TEST_TYPE_IFACE4);
+
+ /* Check that all the non-overridden interfaces were properly inherited
+ */
+ g_assert (interface_is_base (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE1));
+ g_assert (interface_is_base (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE2));
+ g_assert (interface_is_base (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE3));
+ g_assert (interface_is_base (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE4));
+
+ /* Check that all the overridden interfaces were properly overridden
+ */
+ g_assert (interface_is_derived (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE5));
+
+ return 0;
+}
diff --git a/trunk/tests/gobject/ifaceinit.c b/trunk/tests/gobject/ifaceinit.c
new file mode 100644
index 000000000..eaa6d35c5
--- /dev/null
+++ b/trunk/tests/gobject/ifaceinit.c
@@ -0,0 +1,422 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2001, 2003 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.
+ */
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "TestIfaceInit"
+
+#undef G_DISABLE_ASSERT
+#undef G_DISABLE_CHECKS
+#undef G_DISABLE_CAST_CHECKS
+
+#include <glib-object.h>
+
+#include "testcommon.h"
+
+/* What this test tests is the ability to add interfaces dynamically; in
+ * particular adding interfaces to a class while that class is being
+ * initialized.
+ *
+ * The test defines 5 interfaces:
+ *
+ * - TestIface1 is added before the class is initialized
+ * - TestIface2 is added in base_object_base_init()
+ * - TestIface3 is added in test_iface1_base_init()
+ * - TestIface4 is added in test_object_class_init()
+ * - TestIface5 is added in test_object_test_iface1_init()
+ * - TestIface6 is added after the class is initialized
+ */
+
+/* All 6 interfaces actually share the same class structure, though
+ * we use separate typedefs
+ */
+typedef struct _TestIfaceClass TestIfaceClass;
+
+struct _TestIfaceClass
+{
+ GTypeInterface base_iface;
+ guint val;
+ guint base_val;
+ guint default_val;
+};
+
+#define TEST_TYPE_IFACE1 (test_iface1_get_type ())
+#define TEST_IFACE1_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE1, TestIface1Class))
+typedef struct _TestIface1 TestIface1;
+typedef struct _TestIfaceClass TestIface1Class;
+
+static void test_iface1_base_init (TestIface1Class *iface);
+static void test_iface1_default_init (TestIface1Class *iface, gpointer class_data);
+
+static DEFINE_IFACE(TestIface1, test_iface1, test_iface1_base_init, test_iface1_default_init)
+
+#define TEST_TYPE_IFACE2 (test_iface2_get_type ())
+#define TEST_IFACE2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE2, TestIface2Class))
+typedef struct _TestIface2 TestIface2;
+typedef struct _TestIfaceClass TestIface2Class;
+
+static void test_iface2_base_init (TestIface2Class *iface);
+
+static DEFINE_IFACE(TestIface2, test_iface2, test_iface2_base_init, NULL)
+
+#define TEST_TYPE_IFACE3 (test_iface3_get_type ())
+#define TEST_IFACE3_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE3, TestIface3Class))
+typedef struct _TestIface3 TestIface3;
+typedef struct _TestIfaceClass TestIface3Class;
+
+static void test_iface3_base_init (TestIface3Class *iface);
+
+static DEFINE_IFACE(TestIface3, test_iface3, test_iface3_base_init, NULL)
+
+#define TEST_TYPE_IFACE4 (test_iface4_get_type ())
+#define TEST_IFACE4_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE4, TestIface4Class))
+typedef struct _TestIface4 TestIface4;
+typedef struct _TestIfaceClass TestIface4Class;
+
+static void test_iface4_base_init (TestIface4Class *iface);
+
+static DEFINE_IFACE(TestIface4, test_iface4, test_iface4_base_init, NULL)
+
+#define TEST_TYPE_IFACE5 (test_iface5_get_type ())
+#define TEST_IFACE5_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE5, TestIface5Class))
+typedef struct _TestIface5 TestIface5;
+typedef struct _TestIfaceClass TestIface5Class;
+
+static void test_iface5_base_init (TestIface5Class *iface);
+
+static DEFINE_IFACE(TestIface5, test_iface5, test_iface5_base_init, NULL)
+
+#define TEST_TYPE_IFACE6 (test_iface6_get_type ())
+#define TEST_IFACE6_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE6, TestIface6Class))
+typedef struct _TestIface6 TestIface6;
+typedef struct _TestIfaceClass TestIface6Class;
+
+static void test_iface6_base_init (TestIface6Class *iface);
+
+static DEFINE_IFACE(TestIface6, test_iface6, test_iface6_base_init, NULL)
+
+/*
+ * BaseObject, a parent class for TestObject
+ */
+#define BASE_TYPE_OBJECT (base_object_get_type ())
+typedef struct _BaseObject BaseObject;
+typedef struct _BaseObjectClass BaseObjectClass;
+
+struct _BaseObject
+{
+ GObject parent_instance;
+};
+struct _BaseObjectClass
+{
+ GObjectClass parent_class;
+};
+
+/*
+ * TestObject, a parent class for TestObject
+ */
+#define TEST_TYPE_OBJECT (test_object_get_type ())
+typedef struct _TestObject TestObject;
+typedef struct _TestObjectClass TestObjectClass;
+
+struct _TestObject
+{
+ BaseObject parent_instance;
+};
+struct _TestObjectClass
+{
+ BaseObjectClass parent_class;
+};
+
+#define TEST_CALLED_ONCE() G_STMT_START { \
+ static gboolean called = 0; \
+ g_assert (!called); \
+ called = TRUE; \
+} G_STMT_END
+
+#define CHECK_IFACE_TWICE(iface) G_STMT_START { \
+ static guint n_calls = 0; \
+ n_calls++; \
+ g_assert (n_calls <= 2); \
+ g_assert (G_TYPE_IS_INTERFACE (((GTypeInterface*) iface)->g_type)); \
+ if (n_calls == 1) \
+ g_assert (((GTypeInterface*) iface)->g_instance_type == 0); \
+ else \
+ g_assert (G_TYPE_IS_OBJECT (((GTypeInterface*) iface)->g_instance_type)); \
+} G_STMT_END
+
+#define ADD_IFACE(n) G_STMT_START { \
+ static GInterfaceInfo iface_info = { \
+ (GInterfaceInitFunc)test_object_test_iface##n##_init, \
+ NULL, NULL }; \
+ \
+ g_type_add_interface_static (TEST_TYPE_OBJECT, \
+ test_iface##n##_get_type (), \
+ &iface_info); \
+ \
+} G_STMT_END
+
+static gboolean base1, base2, base3, base4, base5, base6;
+static gboolean iface1, iface2, iface3, iface4, iface5, iface6;
+
+static void test_object_test_iface1_init (TestIface1Class *iface);
+static void test_object_test_iface2_init (TestIface1Class *iface);
+static void test_object_test_iface3_init (TestIface3Class *iface);
+static void test_object_test_iface4_init (TestIface4Class *iface);
+static void test_object_test_iface5_init (TestIface5Class *iface);
+static void test_object_test_iface6_init (TestIface6Class *iface);
+
+static GType test_object_get_type (void);
+
+static void
+test_object_test_iface1_init (TestIface1Class *iface)
+{
+ TEST_CALLED_ONCE();
+
+ g_assert (iface->default_val == 0x111111);
+
+ iface->val = 0x10001;
+
+ ADD_IFACE(5);
+
+ iface1 = TRUE;
+}
+
+static void
+test_object_test_iface2_init (TestIface2Class *iface)
+{
+ TEST_CALLED_ONCE();
+
+ iface->val = 0x20002;
+
+ iface2 = TRUE;
+}
+
+static void
+test_object_test_iface3_init (TestIface3Class *iface)
+{
+ TEST_CALLED_ONCE();
+
+ iface->val = 0x30003;
+
+ iface3 = TRUE;
+}
+
+static void
+test_object_test_iface4_init (TestIface4Class *iface)
+{
+ TEST_CALLED_ONCE();
+
+ iface->val = 0x40004;
+
+ iface4 = TRUE;
+}
+
+static void
+test_object_test_iface5_init (TestIface5Class *iface)
+{
+ TEST_CALLED_ONCE();
+
+ iface->val = 0x50005;
+
+ iface5 = TRUE;
+}
+
+static void
+test_object_test_iface6_init (TestIface6Class *iface)
+{
+ TEST_CALLED_ONCE();
+
+ iface->val = 0x60006;
+
+ iface6 = TRUE;
+}
+
+static void
+test_iface1_default_init (TestIface1Class *iface,
+ gpointer class_data)
+{
+ TEST_CALLED_ONCE();
+ g_assert (iface->base_iface.g_type == TEST_TYPE_IFACE1);
+ g_assert (iface->base_iface.g_instance_type == 0);
+ g_assert (iface->base_val == 0x110011);
+ g_assert (iface->val == 0);
+ g_assert (iface->default_val == 0);
+ iface->default_val = 0x111111;
+}
+
+static void
+test_iface1_base_init (TestIface1Class *iface)
+{
+ static guint n_calls = 0;
+ n_calls++;
+ g_assert (n_calls <= 2);
+
+ if (n_calls == 1)
+ {
+ iface->base_val = 0x110011;
+ g_assert (iface->default_val == 0);
+ }
+ else
+ {
+ g_assert (iface->base_val == 0x110011);
+ g_assert (iface->default_val == 0x111111);
+ }
+
+ if (n_calls == 1)
+ ADD_IFACE(3);
+
+ base1 = TRUE;
+}
+
+static void
+test_iface2_base_init (TestIface2Class *iface)
+{
+ CHECK_IFACE_TWICE (iface);
+
+ iface->base_val = 0x220022;
+
+ base2 = TRUE;
+}
+
+static void
+test_iface3_base_init (TestIface3Class *iface)
+{
+ CHECK_IFACE_TWICE (iface);
+
+ iface->base_val = 0x330033;
+
+ base3 = TRUE;
+}
+
+static void
+test_iface4_base_init (TestIface4Class *iface)
+{
+ CHECK_IFACE_TWICE (iface);
+
+ iface->base_val = 0x440044;
+
+ base4 = TRUE;
+}
+
+static void
+test_iface5_base_init (TestIface5Class *iface)
+{
+ CHECK_IFACE_TWICE (iface);
+
+ iface->base_val = 0x550055;
+
+ base5 = TRUE;
+}
+
+static void
+test_iface6_base_init (TestIface6Class *iface)
+{
+ CHECK_IFACE_TWICE (iface);
+
+ iface->base_val = 0x660066;
+
+ base6 = TRUE;
+}
+
+static void
+base_object_base_init (BaseObjectClass *class)
+{
+ static int n_called = 0;
+ n_called++;
+
+ /* The second time this is called is for TestObject */
+ if (n_called == 2)
+ {
+ ADD_IFACE(2);
+
+ /* No interface base init functions should have been called yet
+ */
+ g_assert (!base1 && !base2 && !base3 && !base4 && !base5 && !base6);
+ g_assert (!iface1 && !iface2 && !iface3 && !iface4 && !iface5 && !iface6);
+ }
+}
+
+static void
+test_object_class_init (TestObjectClass *class)
+{
+ ADD_IFACE(4);
+
+ /* At this point, the base init functions for all interfaces that have
+ * been added should be called, but no interface init functions.
+ */
+ g_assert (base1 && base2 && base3 && base4 && !base5 && !base6);
+ g_assert (!iface1 && !iface2 && !iface3 && !iface4 && !iface5 && !iface6);
+}
+
+static DEFINE_TYPE(BaseObject, base_object,
+ NULL, base_object_base_init, NULL,
+ G_TYPE_OBJECT)
+static DEFINE_TYPE(TestObject, test_object,
+ test_object_class_init, NULL, NULL,
+ BASE_TYPE_OBJECT)
+
+int
+main (int argc,
+ char *argv[])
+{
+ TestObject *object;
+ TestObjectClass *object_class;
+ TestIfaceClass *iface;
+
+ g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) |
+ G_LOG_LEVEL_WARNING |
+ G_LOG_LEVEL_CRITICAL);
+ g_type_init ();
+
+ /* We force the interfaces to be registered in a different order
+ * than we add them, so our logic doesn't always deal with interfaces
+ * added at the end.
+ */
+ (void)TEST_TYPE_IFACE4;
+ (void)TEST_TYPE_IFACE2;
+ (void)TEST_TYPE_IFACE6;
+ (void)TEST_TYPE_IFACE5;
+ (void)TEST_TYPE_IFACE3;
+ (void)TEST_TYPE_IFACE1;
+
+ ADD_IFACE(1);
+
+ object_class = g_type_class_ref (TEST_TYPE_OBJECT);
+
+ ADD_IFACE(6);
+
+ /* All base and interface init functions should have been called
+ */
+ g_assert (base1 && base2 && base3 && base4 && base5 && base6);
+ g_assert (iface1 && iface2 && iface3 && iface4 && iface5 && iface6);
+
+ object = g_object_new (TEST_TYPE_OBJECT, NULL);
+
+ iface = TEST_IFACE1_GET_CLASS (object);
+ g_assert (iface && iface->val == 0x10001 && iface->base_val == 0x110011);
+ iface = TEST_IFACE3_GET_CLASS (object);
+ g_assert (iface && iface->val == 0x30003 && iface->base_val == 0x330033);
+ iface = TEST_IFACE4_GET_CLASS (object);
+ g_assert (iface && iface->val == 0x40004 && iface->base_val == 0x440044);
+ iface = TEST_IFACE5_GET_CLASS (object);
+ g_assert (iface && iface->val == 0x50005 && iface->base_val == 0x550055);
+ iface = TEST_IFACE6_GET_CLASS (object);
+ g_assert (iface && iface->val == 0x60006 && iface->base_val == 0x660066);
+
+ return 0;
+}
diff --git a/trunk/tests/gobject/ifaceproperties.c b/trunk/tests/gobject/ifaceproperties.c
new file mode 100644
index 000000000..382edd549
--- /dev/null
+++ b/trunk/tests/gobject/ifaceproperties.c
@@ -0,0 +1,507 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2001, 2003 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.
+ */
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "TestIfaceProperties"
+
+#undef G_DISABLE_ASSERT
+#undef G_DISABLE_CHECKS
+#undef G_DISABLE_CAST_CHECKS
+
+#include <string.h>
+
+#include <glib-object.h>
+
+#include "testcommon.h"
+
+/* This test tests interface properties, implementing interface
+ * properties and #GParamSpecOverride.
+ *
+ * Four properties are tested:
+ *
+ * prop1: Defined in TestIface, Implemented in BaseObject with a GParamSpecOverride
+ * prop2: Defined in TestIface, Implemented in BaseObject with a new property
+ * prop3: Defined in TestIface, Implemented in BaseObject, Overridden in DerivedObject
+ * prop4: Defined in BaseObject, Overridden in DerivedObject
+ */
+
+static GType base_object_get_type ();
+static GType derived_object_get_type ();
+
+enum {
+ BASE_PROP_0,
+ BASE_PROP1,
+ BASE_PROP2,
+ BASE_PROP3,
+ BASE_PROP4
+};
+
+enum {
+ DERIVED_PROP_0,
+ DERIVED_PROP3,
+ DERIVED_PROP4
+};
+
+/*
+ * BaseObject, a parent class for DerivedObject
+ */
+#define BASE_TYPE_OBJECT (base_object_get_type ())
+#define BASE_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BASE_TYPE_OBJECT, BaseObject))
+typedef struct _BaseObject BaseObject;
+typedef struct _BaseObjectClass BaseObjectClass;
+
+struct _BaseObject
+{
+ GObject parent_instance;
+
+ gint val1;
+ gint val2;
+ gint val3;
+ gint val4;
+};
+struct _BaseObjectClass
+{
+ GObjectClass parent_class;
+};
+
+GObjectClass *base_parent_class;
+
+/*
+ * DerivedObject, the child class of DerivedObject
+ */
+#define DERIVED_TYPE_OBJECT (derived_object_get_type ())
+typedef struct _DerivedObject DerivedObject;
+typedef struct _DerivedObjectClass DerivedObjectClass;
+
+struct _DerivedObject
+{
+ BaseObject parent_instance;
+};
+struct _DerivedObjectClass
+{
+ BaseObjectClass parent_class;
+};
+
+/*
+ * The interface
+ */
+typedef struct _TestIfaceClass TestIfaceClass;
+
+struct _TestIfaceClass
+{
+ GTypeInterface base_iface;
+};
+
+#define TEST_TYPE_IFACE (test_iface_get_type ())
+
+/* The paramspecs installed on our interface
+ */
+static GParamSpec *iface_spec1, *iface_spec2, *iface_spec3;
+
+/* The paramspecs inherited by our derived object
+ */
+static GParamSpec *inherited_spec1, *inherited_spec2, *inherited_spec3, *inherited_spec4;
+
+static void
+test_iface_default_init (TestIfaceClass *iface_vtable)
+{
+ inherited_spec1 = iface_spec1 = g_param_spec_int ("prop1",
+ "Prop1",
+ "Property 1",
+ G_MININT, /* min */
+ 0xFFFF, /* max */
+ 42, /* default */
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+ g_object_interface_install_property (iface_vtable, iface_spec1);
+
+ iface_spec2 = g_param_spec_int ("prop2",
+ "Prop2",
+ "Property 2",
+ G_MININT, /* min */
+ G_MAXINT, /* max */
+ 0, /* default */
+ G_PARAM_WRITABLE);
+ g_object_interface_install_property (iface_vtable, iface_spec2);
+
+ inherited_spec3 = iface_spec3 = g_param_spec_int ("prop3",
+ "Prop3",
+ "Property 3",
+ G_MININT, /* min */
+ G_MAXINT, /* max */
+ 0, /* default */
+ G_PARAM_READWRITE);
+ g_object_interface_install_property (iface_vtable, iface_spec3);
+}
+
+static DEFINE_IFACE (TestIface, test_iface, NULL, test_iface_default_init)
+
+
+static GObject*
+base_object_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties)
+{
+ /* The constructor is the one place where a GParamSpecOverride is visible
+ * to the outside world, so we do a bunch of checks here
+ */
+ GValue value1 = { 0, };
+ GValue value2 = { 0, };
+ GParamSpec *pspec;
+
+ g_assert (n_construct_properties == 1);
+
+ pspec = construct_properties->pspec;
+
+ /* Check we got the param spec we expected
+ */
+ g_assert (G_IS_PARAM_SPEC_OVERRIDE (pspec));
+ g_assert (pspec->param_id == BASE_PROP1);
+ g_assert (strcmp (g_param_spec_get_name (pspec), "prop1") == 0);
+ g_assert (g_param_spec_get_redirect_target (pspec) == iface_spec1);
+
+ /* Test redirection of the nick and blurb to the redirect target
+ */
+ g_assert (strcmp (g_param_spec_get_nick (pspec), "Prop1") == 0);
+ g_assert (strcmp (g_param_spec_get_blurb (pspec), "Property 1") == 0);
+
+ /* Test forwarding of the various GParamSpec methods to the redirect target
+ */
+ g_value_init (&value1, G_TYPE_INT);
+ g_value_init (&value2, G_TYPE_INT);
+
+ g_param_value_set_default (pspec, &value1);
+ g_assert (g_value_get_int (&value1) == 42);
+
+ g_value_reset (&value1);
+ g_value_set_int (&value1, 0x10000);
+ g_assert (g_param_value_validate (pspec, &value1));
+ g_assert (g_value_get_int (&value1) == 0xFFFF);
+ g_assert (!g_param_value_validate (pspec, &value1));
+
+ g_value_reset (&value1);
+ g_value_set_int (&value1, 1);
+ g_value_set_int (&value2, 2);
+ g_assert (g_param_values_cmp (pspec, &value1, &value2) < 0);
+ g_assert (g_param_values_cmp (pspec, &value2, &value1) > 0);
+
+ g_value_unset (&value1);
+ g_value_unset (&value2);
+
+ return base_parent_class->constructor (type,
+ n_construct_properties,
+ construct_properties);
+}
+
+static void
+base_object_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ BaseObject *base_object = BASE_OBJECT (object);
+
+ switch (prop_id)
+ {
+ case BASE_PROP1:
+ g_assert (pspec == inherited_spec1);
+ base_object->val1 = g_value_get_int (value);
+ break;
+ case BASE_PROP2:
+ g_assert (pspec == inherited_spec2);
+ base_object->val2 = g_value_get_int (value);
+ break;
+ case BASE_PROP3:
+ g_assert_not_reached ();
+ break;
+ case BASE_PROP4:
+ g_assert_not_reached ();
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+base_object_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ BaseObject *base_object = BASE_OBJECT (object);
+
+ switch (prop_id)
+ {
+ case BASE_PROP1:
+ g_assert (pspec == inherited_spec1);
+ g_value_set_int (value, base_object->val1);
+ break;
+ case BASE_PROP2:
+ g_assert (pspec == inherited_spec2);
+ g_value_set_int (value, base_object->val2);
+ break;
+ case BASE_PROP3:
+ g_assert_not_reached ();
+ break;
+ case BASE_PROP4:
+ g_assert_not_reached ();
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+base_object_notify (GObject *object,
+ GParamSpec *pspec)
+{
+ /* The property passed to notify is the redirect target, not the
+ * GParamSpecOverride
+ */
+ g_assert (pspec == inherited_spec1 ||
+ pspec == inherited_spec2 ||
+ pspec == inherited_spec3 ||
+ pspec == inherited_spec4);
+}
+
+static void
+base_object_class_init (BaseObjectClass *class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+ base_parent_class= g_type_class_peek_parent (class);
+
+ object_class->constructor = base_object_constructor;
+ object_class->set_property = base_object_set_property;
+ object_class->get_property = base_object_get_property;
+ object_class->notify = base_object_notify;
+
+ g_object_class_override_property (object_class, BASE_PROP1, "prop1");
+
+ /* We override this one using a real property, not GParamSpecOverride
+ * We change the flags from READONLY to READWRITE to show that we
+ * can make the flags less restrictive
+ */
+ inherited_spec2 = g_param_spec_int ("prop2",
+ "Prop2",
+ "Property 2",
+ G_MININT, /* min */
+ G_MAXINT, /* max */
+ 0, /* default */
+ G_PARAM_READWRITE);
+ g_object_class_install_property (object_class, BASE_PROP2, inherited_spec2);
+
+ g_object_class_override_property (object_class, BASE_PROP3, "prop3");
+
+ inherited_spec4 = g_param_spec_int ("prop4",
+ "Prop4",
+ "Property 4",
+ G_MININT, /* min */
+ G_MAXINT, /* max */
+ 0, /* default */
+ G_PARAM_READWRITE);
+ g_object_class_install_property (object_class, BASE_PROP4, inherited_spec4);
+}
+
+static void
+base_object_init (BaseObject *base_object)
+{
+ base_object->val1 = 42;
+}
+
+static DEFINE_TYPE_FULL (BaseObject, base_object,
+ base_object_class_init, NULL, base_object_init,
+ G_TYPE_OBJECT,
+ INTERFACE (NULL, TEST_TYPE_IFACE))
+
+static void
+derived_object_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ BaseObject *base_object = BASE_OBJECT (object);
+
+ switch (prop_id)
+ {
+ case DERIVED_PROP3:
+ g_assert (pspec == inherited_spec3);
+ base_object->val3 = g_value_get_int (value);
+ break;
+ case DERIVED_PROP4:
+ g_assert (pspec == inherited_spec4);
+ base_object->val4 = g_value_get_int (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+derived_object_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ BaseObject *base_object = BASE_OBJECT (object);
+
+ switch (prop_id)
+ {
+ case DERIVED_PROP3:
+ g_assert (pspec == inherited_spec3);
+ g_value_set_int (value, base_object->val3);
+ break;
+ case DERIVED_PROP4:
+ g_assert (pspec == inherited_spec4);
+ g_value_set_int (value, base_object->val4);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+derived_object_class_init (DerivedObjectClass *class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+ object_class->set_property = derived_object_set_property;
+ object_class->get_property = derived_object_get_property;
+
+ /* Overriding a property that is itself overridding an interface property */
+ g_object_class_override_property (object_class, DERIVED_PROP3, "prop3");
+
+ /* Overriding a property not from an interface */
+ g_object_class_override_property (object_class, DERIVED_PROP4, "prop4");
+}
+
+static DEFINE_TYPE (DerivedObject, derived_object,
+ derived_object_class_init, NULL, NULL,
+ BASE_TYPE_OBJECT)
+
+/* Helper function for testing ...list_properties()
+ */
+static void
+assert_in_properties (GParamSpec *param_spec,
+ GParamSpec **properties,
+ gint n_properties)
+{
+ gint i;
+ gboolean found = FALSE;
+
+ for (i = 0; i < n_properties; i++)
+ {
+ if (properties[i] == param_spec)
+ found = TRUE;
+ }
+
+ g_assert (found);
+}
+
+int
+main (gint argc,
+ gchar *argv[])
+{
+ BaseObject *object;
+ GObjectClass *object_class;
+ TestIfaceClass *iface_vtable;
+ GParamSpec **properties;
+ gint n_properties;
+
+ gint val1, val2, val3, val4;
+
+ g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) |
+ G_LOG_LEVEL_WARNING |
+ G_LOG_LEVEL_CRITICAL);
+ g_type_init ();
+
+ object = g_object_new (DERIVED_TYPE_OBJECT, NULL);
+
+ /* Test setting and getting the properties
+ */
+ g_object_set (object,
+ "prop1", 0x0101,
+ "prop2", 0x0202,
+ "prop3", 0x0303,
+ "prop4", 0x0404,
+ NULL);
+ g_object_get (object,
+ "prop1", &val1,
+ "prop2", &val2,
+ "prop3", &val3,
+ "prop4", &val4,
+ NULL);
+
+ g_assert (val1 == 0x0101);
+ g_assert (val2 == 0x0202);
+ g_assert (val3 == 0x0303);
+ g_assert (val4 == 0x0404);
+
+ /* Test that the right spec is passed on explicit notifications
+ */
+ g_object_freeze_notify (G_OBJECT (object));
+ g_object_notify (G_OBJECT (object), "prop1");
+ g_object_notify (G_OBJECT (object), "prop2");
+ g_object_notify (G_OBJECT (object), "prop3");
+ g_object_notify (G_OBJECT (object), "prop4");
+ g_object_thaw_notify (G_OBJECT (object));
+
+ /* Test g_object_class_find_property() for overridden properties
+ */
+ object_class = G_OBJECT_GET_CLASS (object);
+
+ g_assert (g_object_class_find_property (object_class, "prop1") == inherited_spec1);
+ g_assert (g_object_class_find_property (object_class, "prop2") == inherited_spec2);
+ g_assert (g_object_class_find_property (object_class, "prop3") == inherited_spec3);
+ g_assert (g_object_class_find_property (object_class, "prop4") == inherited_spec4);
+
+ /* Test g_object_class_list_properties() for overridden properties
+ */
+ properties = g_object_class_list_properties (object_class, &n_properties);
+ g_assert (n_properties == 4);
+ assert_in_properties (inherited_spec1, properties, n_properties);
+ assert_in_properties (inherited_spec2, properties, n_properties);
+ assert_in_properties (inherited_spec3, properties, n_properties);
+ assert_in_properties (inherited_spec4, properties, n_properties);
+ g_free (properties);
+
+ /* Test g_object_interface_find_property()
+ */
+ iface_vtable = g_type_default_interface_peek (TEST_TYPE_IFACE);
+
+ g_assert (g_object_interface_find_property (iface_vtable, "prop1") == iface_spec1);
+ g_assert (g_object_interface_find_property (iface_vtable, "prop2") == iface_spec2);
+ g_assert (g_object_interface_find_property (iface_vtable, "prop3") == iface_spec3);
+
+ /* Test g_object_interface_list_properties()
+ */
+ properties = g_object_interface_list_properties (iface_vtable, &n_properties);
+ g_assert (n_properties == 3);
+ assert_in_properties (iface_spec1, properties, n_properties);
+ assert_in_properties (iface_spec2, properties, n_properties);
+ assert_in_properties (iface_spec3, properties, n_properties);
+ g_free (properties);
+
+ g_object_unref (object);
+
+ return 0;
+}
diff --git a/trunk/tests/gobject/override.c b/trunk/tests/gobject/override.c
new file mode 100644
index 000000000..2d9353d91
--- /dev/null
+++ b/trunk/tests/gobject/override.c
@@ -0,0 +1,324 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * override.c: Closure override test program
+ * Copyright (C) 2001, James Henstridge
+ * Copyright (C) 2003, 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.
+ */
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "TestOverride"
+
+#undef G_DISABLE_ASSERT
+#undef G_DISABLE_CHECKS
+#undef G_DISABLE_CAST_CHECKS
+
+#undef VERBOSE
+
+#include <string.h>
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include "testcommon.h"
+
+static guint foo_signal_id = 0;
+static guint bar_signal_id = 0;
+
+static GType test_i_get_type (void);
+static GType test_a_get_type (void);
+static GType test_b_get_type (void);
+static GType test_c_get_type (void);
+
+static void record (const gchar *str);
+
+#define TEST_TYPE_I (test_i_get_type ())
+
+typedef struct _TestI TestI;
+typedef struct _TestIClass TestIClass;
+
+struct _TestIClass
+{
+ GTypeInterface base_iface;
+};
+
+static void
+test_i_foo (TestI *self)
+{
+ record ("TestI::foo");
+}
+
+static void
+test_i_default_init (gpointer g_class)
+{
+ foo_signal_id = g_signal_newv ("foo",
+ TEST_TYPE_I,
+ G_SIGNAL_RUN_LAST,
+ g_cclosure_new(G_CALLBACK(test_i_foo),
+ NULL, NULL),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0, NULL);
+}
+
+static DEFINE_IFACE (TestI, test_i, NULL, test_i_default_init)
+
+#define TEST_TYPE_A (test_a_get_type())
+
+ typedef struct _TestA TestA;
+ typedef struct _TestAClass TestAClass;
+
+struct _TestA {
+ GObject parent;
+};
+struct _TestAClass {
+ GObjectClass parent_class;
+
+ void (* bar) (TestA *self);
+};
+
+static void
+test_a_foo (TestI *self)
+{
+ GValue args[1] = { { 0, } };
+
+ record ("TestA::foo");
+
+ g_value_init (&args[0], TEST_TYPE_A);
+ g_value_set_object (&args[0], self);
+
+ g_assert (g_signal_get_invocation_hint (self)->signal_id == foo_signal_id);
+ g_signal_chain_from_overridden (args, NULL);
+
+ g_value_unset (&args[0]);
+}
+
+static void
+test_a_bar (TestA *self)
+{
+ record ("TestA::bar");
+}
+
+static void
+test_a_class_init (TestAClass *class)
+{
+ class->bar = test_a_bar;
+
+ bar_signal_id = g_signal_new ("bar",
+ TEST_TYPE_A,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (TestAClass, bar),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0, NULL);
+}
+
+static void
+test_a_interface_init (TestIClass *iface)
+{
+ g_signal_override_class_closure (foo_signal_id,
+ TEST_TYPE_A,
+ g_cclosure_new (G_CALLBACK (test_a_foo),
+ NULL, NULL));
+}
+
+static DEFINE_TYPE_FULL (TestA, test_a,
+ test_a_class_init, NULL, NULL,
+ G_TYPE_OBJECT,
+ INTERFACE (test_a_interface_init, TEST_TYPE_I))
+
+#define TEST_TYPE_B (test_b_get_type())
+
+typedef struct _TestB TestB;
+typedef struct _TestBClass TestBClass;
+
+struct _TestB {
+ TestA parent;
+};
+struct _TestBClass {
+ TestAClass parent_class;
+};
+
+static void
+test_b_foo (TestA *self)
+{
+ GValue args[1] = { { 0, } };
+
+ record ("TestB::foo");
+
+ g_value_init (&args[0], TEST_TYPE_A);
+ g_value_set_object (&args[0], self);
+
+ g_assert (g_signal_get_invocation_hint (self)->signal_id == foo_signal_id);
+ g_signal_chain_from_overridden (args, NULL);
+
+ g_value_unset (&args[0]);
+}
+
+static void
+test_b_bar (TestI *self)
+{
+ GValue args[1] = { { 0, } };
+
+ record ("TestB::bar");
+
+ g_value_init (&args[0], TEST_TYPE_A);
+ g_value_set_object (&args[0], self);
+
+ g_assert (g_signal_get_invocation_hint (self)->signal_id == bar_signal_id);
+ g_signal_chain_from_overridden (args, NULL);
+
+ g_value_unset (&args[0]);
+}
+
+static void
+test_b_class_init (TestBClass *class)
+{
+ g_signal_override_class_closure (foo_signal_id,
+ TEST_TYPE_B,
+ g_cclosure_new (G_CALLBACK (test_b_foo),
+ NULL, NULL));
+ g_signal_override_class_closure (bar_signal_id,
+ TEST_TYPE_B,
+ g_cclosure_new (G_CALLBACK (test_b_bar),
+ NULL, NULL));
+}
+
+static DEFINE_TYPE (TestB, test_b,
+ test_b_class_init, NULL, NULL,
+ TEST_TYPE_A)
+
+#define TEST_TYPE_C (test_c_get_type())
+
+typedef struct _TestC TestC;
+typedef struct _TestCClass TestCClass;
+
+struct _TestC {
+ TestB parent;
+};
+struct _TestCClass {
+ TestBClass parent_class;
+};
+
+static void
+test_c_foo (TestA *self)
+{
+ GValue args[1] = { { 0, } };
+
+ record ("TestC::foo");
+
+ g_value_init (&args[0], TEST_TYPE_A);
+ g_value_set_object (&args[0], self);
+
+ g_assert (g_signal_get_invocation_hint (self)->signal_id == foo_signal_id);
+ g_signal_chain_from_overridden (args, NULL);
+
+ g_value_unset (&args[0]);
+}
+
+static void
+test_c_bar (TestI *self)
+{
+ GValue args[1] = { { 0, } };
+
+ record ("TestC::bar");
+
+ g_value_init (&args[0], TEST_TYPE_A);
+ g_value_set_object (&args[0], self);
+
+ g_assert (g_signal_get_invocation_hint (self)->signal_id == bar_signal_id);
+ g_signal_chain_from_overridden (args, NULL);
+
+ g_value_unset (&args[0]);
+}
+
+static void
+test_c_class_init (TestBClass *class)
+{
+ g_signal_override_class_closure (foo_signal_id,
+ TEST_TYPE_C,
+ g_cclosure_new (G_CALLBACK (test_c_foo),
+ NULL, NULL));
+ g_signal_override_class_closure (bar_signal_id,
+ TEST_TYPE_C,
+ g_cclosure_new (G_CALLBACK (test_c_bar),
+ NULL, NULL));
+}
+
+
+static DEFINE_TYPE (TestC, test_c,
+ test_c_class_init, NULL, NULL,
+ TEST_TYPE_B)
+
+static GString *test_string = NULL;
+gboolean failed = FALSE;
+
+static void
+record (const gchar *str)
+{
+ if (test_string->len)
+ g_string_append_c (test_string, ',');
+ g_string_append (test_string, str);
+}
+
+static void
+test (GType type,
+ const gchar *signal,
+ const gchar *expected)
+{
+ GObject *self = g_object_new (type, NULL);
+
+ test_string = g_string_new (NULL);
+
+ g_signal_emit_by_name (self, signal, 0);
+
+#ifndef VERBOSE
+ if (strcmp (test_string->str, expected) != 0)
+#endif
+ {
+ g_printerr ("*** emitting %s on a %s instance\n"
+ " Expecting: %s\n"
+ " Got: %s\n",
+ signal, g_type_name (type),
+ expected,
+ test_string->str);
+
+ if (strcmp (test_string->str, expected) != 0)
+ failed = TRUE;
+ }
+
+ g_string_free (test_string, TRUE);
+}
+
+int
+main (int argc, char **argv)
+{
+ g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) |
+ G_LOG_LEVEL_WARNING |
+ G_LOG_LEVEL_CRITICAL);
+ g_type_init();
+
+ test (TEST_TYPE_A, "foo", "TestA::foo,TestI::foo");
+ test (TEST_TYPE_A, "bar", "TestA::bar");
+
+ test (TEST_TYPE_B, "foo", "TestB::foo,TestA::foo,TestI::foo");
+ test (TEST_TYPE_B, "bar", "TestB::bar,TestA::bar");
+
+ test (TEST_TYPE_C, "foo", "TestC::foo,TestB::foo,TestA::foo,TestI::foo");
+ test (TEST_TYPE_C, "bar", "TestC::bar,TestB::bar,TestA::bar");
+
+ return failed ? 1 : 0;
+}
diff --git a/trunk/tests/gobject/paramspec-test.c b/trunk/tests/gobject/paramspec-test.c
new file mode 100644
index 000000000..16ee3b19b
--- /dev/null
+++ b/trunk/tests/gobject/paramspec-test.c
@@ -0,0 +1,220 @@
+/* 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <string.h>
+
+#include <glib.h>
+#include <glib-object.h>
+
+static void
+test_param_spec_char (void)
+{
+ GParamSpec *pspec;
+ GValue value = { 0, };
+ gboolean modified;
+
+ pspec = g_param_spec_char ("char", "nick", "blurb",
+ 20, 40, 30, G_PARAM_READWRITE);
+
+ g_assert (strcmp (g_param_spec_get_name (pspec), "char") == 0);
+ g_assert (strcmp (g_param_spec_get_nick (pspec), "nick") == 0);
+ g_assert (strcmp (g_param_spec_get_blurb (pspec), "blurb") == 0);
+
+ g_value_init (&value, G_TYPE_CHAR);
+ g_value_set_char (&value, 30);
+
+ g_assert (g_param_value_defaults (pspec, &value));
+
+ g_value_set_char (&value, 0);
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (modified && g_value_get_char (&value) == 20);
+
+ g_value_set_char (&value, 20);
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (!modified && g_value_get_char (&value) == 20);
+
+ g_value_set_char (&value, 40);
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (!modified && g_value_get_char (&value) == 40);
+
+ g_value_set_char (&value, 60);
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (modified && g_value_get_char (&value) == 40);
+
+ g_param_spec_unref (pspec);
+}
+
+static void
+test_param_spec_string (void)
+{
+ GParamSpec *pspec;
+ GValue value = { 0, };
+ gboolean modified;
+
+ pspec = g_param_spec_string ("string", "nick", "blurb",
+ NULL, G_PARAM_READWRITE);
+ g_value_init (&value, G_TYPE_STRING);
+
+ g_value_set_string (&value, "foobar");
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (!modified);
+
+ g_value_set_string (&value, "");
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (!modified && g_value_get_string (&value) != NULL);
+
+ /* test ensure_non_null */
+
+ G_PARAM_SPEC_STRING (pspec)->ensure_non_null = TRUE;
+
+ g_value_set_string (&value, NULL);
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (modified && g_value_get_string (&value) != NULL);
+
+ G_PARAM_SPEC_STRING (pspec)->ensure_non_null = FALSE;
+
+ /* test null_fold_if_empty */
+
+ G_PARAM_SPEC_STRING (pspec)->null_fold_if_empty = TRUE;
+
+ g_value_set_string (&value, "");
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (modified && g_value_get_string (&value) == NULL);
+
+ g_value_set_static_string (&value, "");
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (modified && g_value_get_string (&value) == NULL);
+
+ G_PARAM_SPEC_STRING (pspec)->null_fold_if_empty = FALSE;
+
+ /* test cset_first */
+
+ G_PARAM_SPEC_STRING (pspec)->cset_first = g_strdup ("abc");
+ G_PARAM_SPEC_STRING (pspec)->substitutor = '-';
+
+ g_value_set_string (&value, "ABC");
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (modified && g_value_get_string (&value)[0] == '-');
+
+ g_value_set_static_string (&value, "ABC");
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (modified && g_value_get_string (&value)[0] == '-');
+
+ /* test cset_nth */
+
+ G_PARAM_SPEC_STRING (pspec)->cset_nth = g_strdup ("abc");
+
+ g_value_set_string (&value, "aBC");
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (modified && g_value_get_string (&value)[1] == '-');
+
+ g_value_set_static_string (&value, "aBC");
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (modified && g_value_get_string (&value)[1] == '-');
+
+ g_value_unset (&value);
+ g_param_spec_unref (pspec);
+}
+
+static void
+test_param_spec_override (void)
+{
+ GParamSpec *ospec, *pspec;
+ GValue value = { 0, };
+ gboolean modified;
+
+ ospec = g_param_spec_char ("char", "nick", "blurb",
+ 20, 40, 30, G_PARAM_READWRITE);
+
+ pspec = g_param_spec_override ("override", ospec);
+
+ g_assert (strcmp (g_param_spec_get_name (pspec), "override") == 0);
+ g_assert (strcmp (g_param_spec_get_nick (pspec), "nick") == 0);
+ g_assert (strcmp (g_param_spec_get_blurb (pspec), "blurb") == 0);
+
+ g_value_init (&value, G_TYPE_CHAR);
+ g_value_set_char (&value, 30);
+
+ g_assert (g_param_value_defaults (pspec, &value));
+
+ g_value_set_char (&value, 0);
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (modified && g_value_get_char (&value) == 20);
+
+ g_value_set_char (&value, 20);
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (!modified && g_value_get_char (&value) == 20);
+
+ g_value_set_char (&value, 40);
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (!modified && g_value_get_char (&value) == 40);
+
+ g_value_set_char (&value, 60);
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (modified && g_value_get_char (&value) == 40);
+
+ g_param_spec_unref (pspec);
+}
+
+static void
+test_param_spec_gtype (void)
+{
+ GParamSpec *pspec;
+ GValue value = { 0, };
+ gboolean modified;
+
+ pspec = g_param_spec_gtype ("gtype", "nick", "blurb",
+ G_TYPE_PARAM, G_PARAM_READWRITE);
+
+ g_value_init (&value, G_TYPE_GTYPE);
+ g_value_set_gtype (&value, G_TYPE_NONE);
+
+ g_assert (g_param_value_defaults (pspec, &value));
+
+ g_value_set_gtype (&value, G_TYPE_INT);
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (modified && g_value_get_gtype (&value) == G_TYPE_NONE);
+
+ g_value_set_gtype (&value, G_TYPE_PARAM_INT);
+ modified = g_param_value_validate (pspec, &value);
+ g_assert (!modified && g_value_get_gtype (&value) == G_TYPE_PARAM_INT);
+}
+
+int
+main (int argc, char *argv[])
+{
+ g_type_init ();
+
+ test_param_spec_char ();
+ test_param_spec_string ();
+ test_param_spec_override ();
+ test_param_spec_gtype ();
+
+ return 0;
+}
diff --git a/trunk/tests/gobject/references.c b/trunk/tests/gobject/references.c
new file mode 100644
index 000000000..86c700f09
--- /dev/null
+++ b/trunk/tests/gobject/references.c
@@ -0,0 +1,281 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2005 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.
+ */
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "TestReferences"
+
+#undef G_DISABLE_ASSERT
+#undef G_DISABLE_CHECKS
+#undef G_DISABLE_CAST_CHECKS
+
+#include <glib-object.h>
+
+/* This test tests weak and toggle references
+ */
+
+static GObject *global_object;
+
+static gboolean object_destroyed;
+static gboolean weak_ref1_notified;
+static gboolean weak_ref2_notified;
+static gboolean toggle_ref1_weakened;
+static gboolean toggle_ref1_strengthened;
+static gboolean toggle_ref2_weakened;
+static gboolean toggle_ref2_strengthened;
+static gboolean toggle_ref3_weakened;
+static gboolean toggle_ref3_strengthened;
+
+/*
+ * TestObject, a parent class for TestObject
+ */
+#define TEST_TYPE_OBJECT (test_object_get_type ())
+typedef struct _TestObject TestObject;
+typedef struct _TestObjectClass TestObjectClass;
+
+struct _TestObject
+{
+ GObject parent_instance;
+};
+struct _TestObjectClass
+{
+ GObjectClass parent_class;
+};
+
+G_DEFINE_TYPE (TestObject, test_object, G_TYPE_OBJECT);
+
+static void
+test_object_finalize (GObject *object)
+{
+ object_destroyed = TRUE;
+
+ G_OBJECT_CLASS (test_object_parent_class)->finalize (object);
+}
+
+static void
+test_object_class_init (TestObjectClass *class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+ object_class->finalize = test_object_finalize;
+}
+
+static void
+test_object_init (TestObject *test_object)
+{
+}
+
+static void
+clear_flags (void)
+{
+ object_destroyed = FALSE;
+ weak_ref1_notified = FALSE;
+ weak_ref2_notified = FALSE;
+ toggle_ref1_weakened = FALSE;
+ toggle_ref1_strengthened = FALSE;
+ toggle_ref2_weakened = FALSE;
+ toggle_ref2_strengthened = FALSE;
+ toggle_ref3_weakened = FALSE;
+ toggle_ref3_strengthened = FALSE;
+}
+
+static void
+weak_ref1 (gpointer data,
+ GObject *object)
+{
+ g_assert (object == global_object);
+ g_assert (data == GUINT_TO_POINTER (42));
+
+ weak_ref1_notified = TRUE;
+}
+
+static void
+weak_ref2 (gpointer data,
+ GObject *object)
+{
+ g_assert (object == global_object);
+ g_assert (data == GUINT_TO_POINTER (24));
+
+ weak_ref2_notified = TRUE;
+}
+
+static void
+toggle_ref1 (gpointer data,
+ GObject *object,
+ gboolean is_last_ref)
+{
+ g_assert (object == global_object);
+ g_assert (data == GUINT_TO_POINTER (42));
+
+ if (is_last_ref)
+ toggle_ref1_weakened = TRUE;
+ else
+ toggle_ref1_strengthened = TRUE;
+}
+
+static void
+toggle_ref2 (gpointer data,
+ GObject *object,
+ gboolean is_last_ref)
+{
+ g_assert (object == global_object);
+ g_assert (data == GUINT_TO_POINTER (24));
+
+ if (is_last_ref)
+ toggle_ref2_weakened = TRUE;
+ else
+ toggle_ref2_strengthened = TRUE;
+}
+
+static void
+toggle_ref3 (gpointer data,
+ GObject *object,
+ gboolean is_last_ref)
+{
+ g_assert (object == global_object);
+ g_assert (data == GUINT_TO_POINTER (34));
+
+ if (is_last_ref)
+ {
+ toggle_ref3_weakened = TRUE;
+ g_object_remove_toggle_ref (object, toggle_ref3, GUINT_TO_POINTER (34));
+ }
+ else
+ toggle_ref3_strengthened = TRUE;
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ GObject *object;
+
+ g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) |
+ G_LOG_LEVEL_WARNING |
+ G_LOG_LEVEL_CRITICAL);
+ g_type_init ();
+
+ /* Test basic weak reference operation
+ */
+ global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL);
+
+ g_object_weak_ref (object, weak_ref1, GUINT_TO_POINTER (42));
+
+ clear_flags ();
+ g_object_unref (object);
+ g_assert (weak_ref1_notified == TRUE);
+ g_assert (object_destroyed == TRUE);
+
+ /* Test two weak references at once
+ */
+ global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL);
+
+ g_object_weak_ref (object, weak_ref1, GUINT_TO_POINTER (42));
+ g_object_weak_ref (object, weak_ref2, GUINT_TO_POINTER (24));
+
+ clear_flags ();
+ g_object_unref (object);
+ g_assert (weak_ref1_notified == TRUE);
+ g_assert (weak_ref2_notified == TRUE);
+ g_assert (object_destroyed == TRUE);
+
+ /* Test remove weak references
+ */
+ global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL);
+
+ g_object_weak_ref (object, weak_ref1, GUINT_TO_POINTER (42));
+ g_object_weak_ref (object, weak_ref2, GUINT_TO_POINTER (24));
+ g_object_weak_unref (object, weak_ref1, GUINT_TO_POINTER (42));
+
+ clear_flags ();
+ g_object_unref (object);
+ g_assert (weak_ref1_notified == FALSE);
+ g_assert (weak_ref2_notified == TRUE);
+ g_assert (object_destroyed == TRUE);
+
+ /* Test basic toggle reference operation
+ */
+ global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL);
+
+ g_object_add_toggle_ref (object, toggle_ref1, GUINT_TO_POINTER (42));
+
+ clear_flags ();
+ g_object_unref (object);
+ g_assert (toggle_ref1_weakened == TRUE);
+ g_assert (toggle_ref1_strengthened == FALSE);
+ g_assert (object_destroyed == FALSE);
+
+ clear_flags ();
+ g_object_ref (object);
+ g_assert (toggle_ref1_weakened == FALSE);
+ g_assert (toggle_ref1_strengthened == TRUE);
+ g_assert (object_destroyed == FALSE);
+
+ g_object_unref (object);
+
+ clear_flags ();
+ g_object_remove_toggle_ref (object, toggle_ref1, GUINT_TO_POINTER (42));
+ g_assert (toggle_ref1_weakened == FALSE);
+ g_assert (toggle_ref1_strengthened == FALSE);
+ g_assert (object_destroyed == TRUE);
+
+ global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL);
+
+ /* Test two toggle references at once
+ */
+ g_object_add_toggle_ref (object, toggle_ref1, GUINT_TO_POINTER (42));
+ g_object_add_toggle_ref (object, toggle_ref2, GUINT_TO_POINTER (24));
+
+ clear_flags ();
+ g_object_unref (object);
+ g_assert (toggle_ref1_weakened == FALSE);
+ g_assert (toggle_ref1_strengthened == FALSE);
+ g_assert (toggle_ref2_weakened == FALSE);
+ g_assert (toggle_ref2_strengthened == FALSE);
+ g_assert (object_destroyed == FALSE);
+
+ clear_flags ();
+ g_object_remove_toggle_ref (object, toggle_ref1, GUINT_TO_POINTER (42));
+ g_assert (toggle_ref1_weakened == FALSE);
+ g_assert (toggle_ref1_strengthened == FALSE);
+ g_assert (toggle_ref2_weakened == TRUE);
+ g_assert (toggle_ref2_strengthened == FALSE);
+ g_assert (object_destroyed == FALSE);
+
+ clear_flags ();
+ g_object_remove_toggle_ref (object, toggle_ref2, GUINT_TO_POINTER (24));
+ g_assert (toggle_ref1_weakened == FALSE);
+ g_assert (toggle_ref1_strengthened == FALSE);
+ g_assert (toggle_ref2_weakened == FALSE);
+ g_assert (toggle_ref2_strengthened == FALSE);
+ g_assert (object_destroyed == TRUE);
+
+ /* Test a toggle reference that removes itself
+ */
+ global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL);
+
+ g_object_add_toggle_ref (object, toggle_ref3, GUINT_TO_POINTER (34));
+
+ clear_flags ();
+ g_object_unref (object);
+ g_assert (toggle_ref3_weakened == TRUE);
+ g_assert (toggle_ref3_strengthened == FALSE);
+ g_assert (object_destroyed == TRUE);
+
+ return 0;
+}
diff --git a/trunk/tests/gobject/singleton.c b/trunk/tests/gobject/singleton.c
new file mode 100644
index 000000000..c7609a646
--- /dev/null
+++ b/trunk/tests/gobject/singleton.c
@@ -0,0 +1,85 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2006 Imendio AB
+ *
+ * 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.
+ */
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "TestSingleton"
+#include <glib-object.h>
+#include <string.h>
+
+/* --- MySingleton class --- */
+typedef struct {
+ GObject parent_instance;
+} MySingleton;
+typedef struct {
+ GObjectClass parent_class;
+} MySingletonClass;
+
+#define MY_TYPE_SINGLETON (my_singleton_get_type ())
+#define MY_SINGLETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), MY_TYPE_SINGLETON, MySingleton))
+#define MY_IS_SINGLETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), MY_TYPE_SINGLETON))
+#define MY_SINGLETON_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), MY_TYPE_SINGLETON, MySingletonClass))
+#define MY_IS_SINGLETON_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((c), MY_TYPE_SINGLETON))
+#define MY_SINGLETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), MY_TYPE_SINGLETON, MySingletonClass))
+
+G_DEFINE_TYPE (MySingleton, my_singleton, G_TYPE_OBJECT);
+
+static MySingleton *the_one_and_only = NULL;
+
+/* --- methods --- */
+static GObject*
+my_singleton_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties)
+{
+ if (the_one_and_only)
+ return g_object_ref (the_one_and_only);
+ else
+ return G_OBJECT_CLASS (my_singleton_parent_class)->constructor (type, n_construct_properties, construct_properties);
+}
+
+static void
+my_singleton_init (MySingleton *self)
+{
+ g_assert (the_one_and_only == NULL);
+ the_one_and_only = self;
+}
+
+static void
+my_singleton_class_init (MySingletonClass *klass)
+{
+ G_OBJECT_CLASS (klass)->constructor = my_singleton_constructor;
+}
+
+/* --- test program --- */
+int
+main (int argc,
+ char *argv[])
+{
+ MySingleton *singleton, *obj;
+ g_type_init_with_debug_flags (G_TYPE_DEBUG_OBJECTS | G_TYPE_DEBUG_SIGNALS);
+ /* create the singleton */
+ singleton = g_object_new (MY_TYPE_SINGLETON, NULL);
+ g_assert (singleton != NULL);
+ /* assert _singleton_ creation */
+ obj = g_object_new (MY_TYPE_SINGLETON, NULL);
+ g_assert (singleton == obj);
+ g_object_unref (obj);
+ /* shutdown */
+ g_object_unref (singleton);
+ return 0;
+}
diff --git a/trunk/tests/gobject/testcommon.h b/trunk/tests/gobject/testcommon.h
new file mode 100644
index 000000000..7bfef05c8
--- /dev/null
+++ b/trunk/tests/gobject/testcommon.h
@@ -0,0 +1,100 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * Copyright (C) 2003 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 __TEST_COMMON_H__
+#define __TEST_COMMON_H__
+
+G_BEGIN_DECLS
+
+#define DEFINE_TYPE_FULL(name, prefix, \
+ class_init, base_init, instance_init, \
+ parent_type, interface_decl) \
+GType \
+prefix ## _get_type (void) \
+{ \
+ static GType object_type = 0; \
+ \
+ if (!object_type) \
+ { \
+ static const GTypeInfo object_info = \
+ { \
+ sizeof (name ## Class), \
+ (GBaseInitFunc) base_init, \
+ (GBaseFinalizeFunc) NULL, \
+ (GClassInitFunc) class_init, \
+ (GClassFinalizeFunc) NULL, \
+ NULL, /* class_data */ \
+ sizeof (name), \
+ 0, /* n_prelocs */ \
+ (GInstanceInitFunc) instance_init \
+ }; \
+ \
+ object_type = g_type_register_static (parent_type, \
+ # name, \
+ &object_info, 0); \
+ interface_decl \
+ } \
+ \
+ return object_type; \
+}
+
+#define DEFINE_TYPE(name, prefix, \
+ class_init, base_init, instance_init, \
+ parent_type) \
+ DEFINE_TYPE_FULL(name, prefix, class_init, base_init, \
+ instance_init, parent_type, {})
+
+#define DEFINE_IFACE(name, prefix, base_init, dflt_init) \
+GType \
+prefix ## _get_type (void) \
+{ \
+ static GType iface_type = 0; \
+ \
+ if (!iface_type) \
+ { \
+ static const GTypeInfo iface_info = \
+ { \
+ sizeof (name ## Class), \
+ (GBaseInitFunc) base_init, \
+ (GBaseFinalizeFunc) NULL, \
+ (GClassInitFunc) dflt_init, \
+ }; \
+ \
+ iface_type = g_type_register_static (G_TYPE_INTERFACE, \
+ # name, \
+ &iface_info, 0); \
+ } \
+ return iface_type; \
+}
+
+#define INTERFACE_FULL(type, init_func, iface_type) \
+{ \
+ static GInterfaceInfo const iface = \
+ { \
+ (GInterfaceInitFunc) init_func, NULL, NULL \
+ }; \
+ \
+ g_type_add_interface_static (type, iface_type, &iface); \
+}
+#define INTERFACE(init_func, iface_type) \
+ INTERFACE_FULL(object_type, init_func, iface_type)
+
+G_END_DECLS
+
+#endif /* __TEST_COMMON_H__ */
diff --git a/trunk/tests/gobject/testmarshal.list b/trunk/tests/gobject/testmarshal.list
new file mode 100644
index 000000000..bed97e2cd
--- /dev/null
+++ b/trunk/tests/gobject/testmarshal.list
@@ -0,0 +1,4 @@
+# Marshallers used in tests
+BOOLEAN:INT
+STRING:INT
+
diff --git a/trunk/tests/gobject/testmodule.c b/trunk/tests/gobject/testmodule.c
new file mode 100644
index 000000000..a6159f16c
--- /dev/null
+++ b/trunk/tests/gobject/testmodule.c
@@ -0,0 +1,69 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * testmodule.c: Dummy dynamic type module
+ * Copyright (C) 2003 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 "testmodule.h"
+#include "testcommon.h"
+
+static gboolean test_module_load (GTypeModule *module);
+static void test_module_unload (GTypeModule *module);
+
+static void
+test_module_class_init (TestModuleClass *class)
+{
+ GTypeModuleClass *module_class = G_TYPE_MODULE_CLASS (class);
+
+ module_class->load = test_module_load;
+ module_class->unload = test_module_unload;
+}
+
+DEFINE_TYPE (TestModule, test_module,
+ test_module_class_init, NULL, NULL,
+ G_TYPE_TYPE_MODULE)
+
+static gboolean
+test_module_load (GTypeModule *module)
+{
+ TestModule *test_module = TEST_MODULE (module);
+
+ test_module->register_func (module);
+
+ return TRUE;
+}
+
+static void
+test_module_unload (GTypeModule *module)
+{
+}
+
+GTypeModule *
+test_module_new (TestModuleRegisterFunc register_func)
+{
+ TestModule *test_module = g_object_new (TEST_TYPE_MODULE, NULL);
+ GTypeModule *module = G_TYPE_MODULE (test_module);
+
+ test_module->register_func = register_func;
+
+ /* Register the types initially */
+ g_type_module_use (module);
+ g_type_module_unuse (module);
+
+ return G_TYPE_MODULE (module);
+}
+
diff --git a/trunk/tests/gobject/testmodule.h b/trunk/tests/gobject/testmodule.h
new file mode 100644
index 000000000..751d8ad52
--- /dev/null
+++ b/trunk/tests/gobject/testmodule.h
@@ -0,0 +1,57 @@
+/* GObject - GLib Type, Object, Parameter and Signal Library
+ * testmodule.h: Dummy dynamic type module
+ * Copyright (C) 2003 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 __TEST_MODULE_H__
+#define __TEST_MODULE_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+typedef struct _TestModule TestModule;
+typedef struct _TestModuleClass TestModuleClass;
+
+#define TEST_TYPE_MODULE (test_module_get_type ())
+#define TEST_MODULE(module) (G_TYPE_CHECK_INSTANCE_CAST ((module), TEST_TYPE_MODULE, TestModule))
+#define TEST_MODULE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), TEST_TYPE_MODULE, TestModuleClass))
+#define TEST_IS_MODULE(module) (G_TYPE_CHECK_INSTANCE_TYPE ((module), TEST_TYPE_MODULE))
+#define TEST_IS_MODULE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), TEST_TYPE_MODULE))
+#define TEST_MODULE_GET_CLASS(module) (G_TYPE_INSTANCE_GET_CLASS ((module), TEST_TYPE_MODULE, TestModuleClass))
+
+typedef void (*TestModuleRegisterFunc) (GTypeModule *module);
+
+struct _TestModule
+{
+ GTypeModule parent_instance;
+
+ TestModuleRegisterFunc register_func;
+};
+
+struct _TestModuleClass
+{
+ GTypeModuleClass parent_class;
+};
+
+GType test_module_get_type (void);
+GTypeModule *test_module_new (TestModuleRegisterFunc register_func);
+
+G_END_DECLS
+
+#endif /* __TEST_MODULE_H__ */
diff --git a/trunk/tests/hash-test.c b/trunk/tests/hash-test.c
new file mode 100644
index 000000000..da77dd38b
--- /dev/null
+++ b/trunk/tests/hash-test.c
@@ -0,0 +1,405 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ * Copyright (C) 1999 The Free Software Foundation
+ *
+ * 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if STDC_HEADERS
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#endif
+
+#include <glib.h>
+
+
+
+int array[10000];
+
+
+
+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_assert_not_reached ();
+}
+
+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);
+}
+
+
+
+/*
+ * This is a simplified version of the pathalias hashing function.
+ * Thanks to Steve Belovin and Peter Honeyman
+ *
+ * hash a string into a long int. 31 bit crc (from andrew appel).
+ * the crc table is computed at run time by crcinit() -- we could
+ * precompute, but it takes 1 clock tick on a 750.
+ *
+ * This fast table calculation works only if POLY is a prime polynomial
+ * in the field of integers modulo 2. Since the coefficients of a
+ * 32-bit polynomial won't fit in a 32-bit word, the high-order bit is
+ * implicit. IT MUST ALSO BE THE CASE that the coefficients of orders
+ * 31 down to 25 are zero. Happily, we have candidates, from
+ * E. J. Watson, "Primitive Polynomials (Mod 2)", Math. Comp. 16 (1962):
+ * x^32 + x^7 + x^5 + x^3 + x^2 + x^1 + x^0
+ * x^31 + x^3 + x^0
+ *
+ * We reverse the bits to get:
+ * 111101010000000000000000000000001 but drop the last 1
+ * f 5 0 0 0 0 0 0
+ * 010010000000000000000000000000001 ditto, for 31-bit crc
+ * 4 8 0 0 0 0 0 0
+ */
+
+#define POLY 0x48000000L /* 31-bit polynomial (avoids sign problems) */
+
+static guint CrcTable[128];
+
+/*
+ - crcinit - initialize tables for hash function
+ */
+static void crcinit(void)
+{
+ int i, j;
+ guint sum;
+
+ for (i = 0; i < 128; ++i) {
+ sum = 0L;
+ for (j = 7 - 1; j >= 0; --j)
+ if (i & (1 << j))
+ sum ^= POLY >> j;
+ CrcTable[i] = sum;
+ }
+}
+
+/*
+ - hash - Honeyman's nice hashing function
+ */
+static guint honeyman_hash(gconstpointer key)
+{
+ const gchar *name = (const gchar *) key;
+ gint size;
+ guint sum = 0;
+
+ g_assert (name != NULL);
+ g_assert (*name != 0);
+
+ size = strlen(name);
+
+ while (size--) {
+ sum = (sum >> 7) ^ CrcTable[(sum ^ (*name++)) & 0x7f];
+ }
+
+ return(sum);
+}
+
+
+static gboolean second_hash_cmp (gconstpointer a, gconstpointer b)
+{
+ return (strcmp (a, b) == 0);
+}
+
+
+
+static guint one_hash(gconstpointer key)
+{
+ return 1;
+}
+
+
+static void not_even_foreach (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ const char *_key = (const char *) key;
+ const char *_value = (const char *) value;
+ int i;
+ char val [20];
+
+ g_assert (_key != NULL);
+ g_assert (*_key != 0);
+ g_assert (_value != NULL);
+ g_assert (*_value != 0);
+
+ i = atoi (_key);
+
+ sprintf (val, "%d value", i);
+ g_assert (strcmp (_value, val) == 0);
+
+ g_assert ((i % 2) != 0);
+ g_assert (i != 3);
+}
+
+
+static gboolean remove_even_foreach (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ const char *_key = (const char *) key;
+ const char *_value = (const char *) value;
+ int i;
+ char val [20];
+
+ g_assert (_key != NULL);
+ g_assert (*_key != 0);
+ g_assert (_value != NULL);
+ g_assert (*_value != 0);
+
+ i = atoi (_key);
+
+ sprintf (val, "%d value", i);
+ g_assert (strcmp (_value, val) == 0);
+
+ return ((i % 2) == 0) ? TRUE : FALSE;
+}
+
+
+
+
+static void second_hash_test (gboolean simple_hash)
+{
+ int i;
+ char key[20] = "", val[20]="", *v, *orig_key, *orig_val;
+ GHashTable *h;
+ gboolean found;
+
+ crcinit ();
+
+ h = g_hash_table_new (simple_hash ? one_hash : honeyman_hash,
+ second_hash_cmp);
+ g_assert (h != NULL);
+ for (i=0; i<20; i++)
+ {
+ sprintf (key, "%d", i);
+ g_assert (atoi (key) == i);
+
+ sprintf (val, "%d value", i);
+ g_assert (atoi (val) == i);
+
+ g_hash_table_insert (h, g_strdup (key), g_strdup (val));
+ }
+
+ g_assert (g_hash_table_size (h) == 20);
+
+ for (i=0; i<20; i++)
+ {
+ sprintf (key, "%d", i);
+ g_assert (atoi(key) == i);
+
+ v = (char *) g_hash_table_lookup (h, key);
+
+ g_assert (v != NULL);
+ g_assert (*v != 0);
+ g_assert (atoi (v) == i);
+ }
+
+ sprintf (key, "%d", 3);
+ g_hash_table_remove (h, key);
+ g_hash_table_foreach_remove (h, remove_even_foreach, NULL);
+ g_hash_table_foreach (h, not_even_foreach, NULL);
+
+ for (i=0; i<20; i++)
+ {
+ if ((i % 2) == 0 || i == 3)
+ continue;
+
+ sprintf (key, "%d", i);
+ g_assert (atoi(key) == i);
+
+ sprintf (val, "%d value", i);
+ g_assert (atoi (val) == i);
+
+ orig_key = orig_val = NULL;
+ found = g_hash_table_lookup_extended (h, key,
+ (gpointer)&orig_key,
+ (gpointer)&orig_val);
+ g_assert (found);
+
+ g_hash_table_remove (h, key);
+
+ g_assert (orig_key != NULL);
+ g_assert (strcmp (key, orig_key) == 0);
+ g_free (orig_key);
+
+ g_assert (orig_val != NULL);
+ g_assert (strcmp (val, orig_val) == 0);
+ g_free (orig_val);
+ }
+
+ g_hash_table_destroy (h);
+}
+
+static gboolean find_first (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ gint *v = value;
+ gint *test = user_data;
+ return (*v == *test);
+}
+
+
+static void direct_hash_test (void)
+{
+ gint i, rc;
+ GHashTable *h;
+
+ h = g_hash_table_new (NULL, NULL);
+ g_assert (h != NULL);
+ for (i=1; i<=20; i++)
+ {
+ g_hash_table_insert (h, GINT_TO_POINTER (i),
+ GINT_TO_POINTER (i + 42));
+ }
+
+ g_assert (g_hash_table_size (h) == 20);
+
+ for (i=1; i<=20; i++)
+ {
+ rc = GPOINTER_TO_INT (
+ g_hash_table_lookup (h, GINT_TO_POINTER (i)));
+
+ g_assert (rc != 0);
+ g_assert ((rc - 42) == i);
+ }
+
+ g_hash_table_destroy (h);
+}
+
+
+
+int
+main (int argc,
+ char *argv[])
+{
+ GHashTable *hash_table;
+ gint i;
+ gint value = 120;
+ gint *pvalue;
+ GList *keys, *values;
+ gint keys_len, values_len;
+
+ 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]);
+ }
+ pvalue = g_hash_table_find (hash_table, find_first, &value);
+ if (!pvalue || *pvalue != value)
+ g_assert_not_reached();
+
+ keys = g_hash_table_get_keys (hash_table);
+ if (!keys)
+ g_assert_not_reached ();
+
+ values = g_hash_table_get_values (hash_table);
+ if (!values)
+ g_assert_not_reached ();
+
+ keys_len = g_list_length (keys);
+ values_len = g_list_length (values);
+ if (values_len != keys_len && keys_len != g_hash_table_size (hash_table))
+ g_assert_not_reached ();
+
+ g_list_free (keys);
+ g_list_free (values);
+
+ g_hash_table_foreach (hash_table, my_hash_callback, NULL);
+
+ for (i = 0; i < 10000; i++)
+ if (array[i] == 0)
+ g_assert_not_reached();
+
+ 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_assert_not_reached();
+
+ g_hash_table_foreach (hash_table, my_hash_callback_remove_test, NULL);
+
+
+ g_hash_table_destroy (hash_table);
+
+ second_hash_test (TRUE);
+ second_hash_test (FALSE);
+ direct_hash_test ();
+
+ return 0;
+
+}
diff --git a/trunk/tests/iochannel-test-infile b/trunk/tests/iochannel-test-infile
new file mode 100644
index 000000000..86e24ee4c
--- /dev/null
+++ b/trunk/tests/iochannel-test-infile
@@ -0,0 +1,5 @@
+Line one
+Line two
+Line three
+/* Hello */
+\x1234\x567890\x6666
diff --git a/trunk/tests/iochannel-test.c b/trunk/tests/iochannel-test.c
new file mode 100644
index 000000000..39b3337a3
--- /dev/null
+++ b/trunk/tests/iochannel-test.c
@@ -0,0 +1,173 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <glib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define BUFFER_SIZE 1024
+
+static void
+test_small_writes (void)
+{
+ GIOChannel *io;
+ GIOStatus status;
+ guint cnt;
+ gchar tmp;
+ GError *error = NULL;
+
+ io = g_io_channel_new_file ("iochannel-test-outfile", "w", &error);
+ if (error)
+ {
+ g_warning ("Unable to open file %s: %s",
+ "iochannel-test-outfile",
+ error->message);
+ g_error_free (error);
+
+ exit (1);
+ }
+
+ g_io_channel_set_encoding (io, NULL, NULL);
+ g_io_channel_set_buffer_size (io, 1022);
+
+ cnt = 2 * g_io_channel_get_buffer_size (io);
+ tmp = 0;
+
+ while (cnt)
+ {
+ status = g_io_channel_write_chars (io, &tmp, 1, NULL, NULL);
+ if (status == G_IO_STATUS_ERROR)
+ break;
+ if (status == G_IO_STATUS_NORMAL)
+ cnt--;
+ }
+
+ g_assert (status == G_IO_STATUS_NORMAL);
+
+ g_io_channel_unref (io);
+}
+
+
+gint main (gint argc, gchar * argv[])
+{
+ GIOChannel *gio_r, *gio_w ;
+ GError *gerr = NULL;
+ GString *buffer;
+ char *filename;
+ char *srcdir = getenv ("srcdir");
+ gint rlength = 0;
+ glong wlength = 0;
+ gsize length_out;
+ const gchar encoding[] = "EUC-JP";
+ GIOStatus status;
+ GIOFlags flags;
+
+ if (!srcdir)
+ srcdir = ".";
+ filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "iochannel-test-infile", NULL);
+
+ setbuf (stdout, NULL); /* For debugging */
+
+ gio_r = g_io_channel_new_file (filename, "r", &gerr);
+ if (gerr)
+ {
+ g_warning ("Unable to open file %s: %s", filename, gerr->message);
+ g_error_free (gerr);
+ return 1;
+ }
+ gio_w = g_io_channel_new_file ("iochannel-test-outfile", "w", &gerr);
+ if (gerr)
+ {
+ g_warning ("Unable to open file %s: %s", "iochannel-test-outfile", gerr->message);
+ g_error_free (gerr);
+ return 1;
+ }
+
+ g_io_channel_set_encoding (gio_r, encoding, &gerr);
+ if (gerr)
+ {
+ g_warning (gerr->message);
+ g_error_free (gerr);
+ return 1;
+ }
+
+ g_io_channel_set_buffer_size (gio_r, BUFFER_SIZE);
+
+ status = g_io_channel_set_flags (gio_r, G_IO_FLAG_NONBLOCK, &gerr);
+ if (status == G_IO_STATUS_ERROR)
+ {
+ g_warning (gerr->message);
+ g_error_free (gerr);
+ gerr = NULL;
+ }
+ flags = g_io_channel_get_flags (gio_r);
+ buffer = g_string_sized_new (BUFFER_SIZE);
+
+ while (TRUE)
+ {
+ do
+ status = g_io_channel_read_line_string (gio_r, buffer, NULL, &gerr);
+ while (status == G_IO_STATUS_AGAIN);
+ if (status != G_IO_STATUS_NORMAL)
+ break;
+
+ rlength += buffer->len;
+
+ do
+ status = g_io_channel_write_chars (gio_w, buffer->str, buffer->len,
+ &length_out, &gerr);
+ while (status == G_IO_STATUS_AGAIN);
+ if (status != G_IO_STATUS_NORMAL)
+ break;
+
+ wlength += length_out;
+
+ if (length_out < buffer->len)
+ g_warning ("Only wrote part of the line.");
+
+#ifdef VERBOSE
+ g_print ("%s", buffer->str);
+#endif
+ g_string_truncate (buffer, 0);
+ }
+
+ switch (status)
+ {
+ case G_IO_STATUS_EOF:
+ break;
+ case G_IO_STATUS_ERROR:
+ g_warning (gerr->message);
+ g_error_free (gerr);
+ gerr = NULL;
+ break;
+ default:
+ g_warning ("Abnormal exit from write loop.");
+ break;
+ }
+
+ do
+ status = g_io_channel_flush (gio_w, &gerr);
+ while (status == G_IO_STATUS_AGAIN);
+
+ if (status == G_IO_STATUS_ERROR)
+ {
+ g_warning (gerr->message);
+ g_error_free (gerr);
+ gerr = NULL;
+ }
+
+#ifdef VERBOSE
+ g_print ("read %d bytes, wrote %ld bytes\n", rlength, wlength);
+#endif
+
+ g_io_channel_unref(gio_r);
+ g_io_channel_unref(gio_w);
+
+ test_small_writes ();
+
+ return 0;
+}
diff --git a/trunk/tests/keyfile-test.c b/trunk/tests/keyfile-test.c
new file mode 100644
index 000000000..564420a80
--- /dev/null
+++ b/trunk/tests/keyfile-test.c
@@ -0,0 +1,1366 @@
+#include <glib.h>
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+
+static GKeyFile *
+load_data (const gchar *data,
+ GKeyFileFlags flags)
+{
+ GKeyFile *keyfile;
+ GError *error = NULL;
+
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, flags, &error);
+ if (error)
+ {
+ g_print ("Could not load data: %s\n", error->message);
+ exit (1);
+ }
+
+ return keyfile;
+}
+
+static void
+check_error (GError **error,
+ GQuark domain,
+ gint code)
+{
+ if (*error == NULL)
+ {
+ g_print ("Missing an error\n");
+ exit (1);
+ }
+
+ if ((*error)->domain != domain)
+ {
+ g_print ("Wrong error domain: got %s, expected %s\n",
+ g_quark_to_string ((*error)->domain),
+ g_quark_to_string (domain));
+ exit (1);
+ }
+
+ if ((*error)->code != code)
+ {
+ g_print ("Wrong error code: got %d, expected %d\n",
+ (*error)->code, code);
+ exit (1);
+ }
+
+ g_error_free (*error);
+ *error = NULL;
+}
+
+static void
+check_no_error (GError **error)
+{
+ if (*error != NULL)
+ {
+ g_print ("Unexpected error: (%s, %d) %s\n",
+ g_quark_to_string ((*error)->domain),
+ (*error)->code, (*error)->message);
+ exit (1);
+ }
+}
+
+static void
+check_string_value (GKeyFile *keyfile,
+ const gchar *group,
+ const gchar *key,
+ const gchar *expected)
+{
+ GError *error = NULL;
+ gchar *value;
+
+ value = g_key_file_get_string (keyfile, group, key, &error);
+ check_no_error (&error);
+ g_assert (value != NULL);
+
+ if (strcmp (value, expected) != 0)
+ {
+ g_print ("Group %s key %s: "
+ "expected string value '%s', actual value '%s'\n",
+ group, key, expected, value);
+ exit (1);
+ }
+
+ g_free (value);
+}
+
+static void
+check_locale_string_value (GKeyFile *keyfile,
+ const gchar *group,
+ const gchar *key,
+ const gchar *locale,
+ const gchar *expected)
+{
+ GError *error = NULL;
+ gchar *value;
+
+ value = g_key_file_get_locale_string (keyfile, group, key, locale, &error);
+ check_no_error (&error);
+ g_assert (value != NULL);
+
+ if (strcmp (value, expected) != 0)
+ {
+ g_print ("Group %s key %s locale %s: "
+ "expected string value '%s', actual value '%s'\n",
+ group, key, locale, expected, value);
+ exit (1);
+ }
+
+ g_free (value);
+}
+
+static void
+check_string_list_value (GKeyFile *keyfile,
+ const gchar *group,
+ const gchar *key,
+ ...)
+{
+ gint i;
+ gchar *v, **value;
+ va_list args;
+ gsize len;
+ GError *error = NULL;
+
+ value = g_key_file_get_string_list (keyfile, group, key, &len, &error);
+ check_no_error (&error);
+ g_assert (value != NULL);
+
+ va_start (args, key);
+ i = 0;
+ v = va_arg (args, gchar*);
+ while (v)
+ {
+ if (value[i] == NULL)
+ {
+ g_print ("Group %s key %s: list too short (%d)\n",
+ group, key, i);
+ exit (1);
+ }
+ if (strcmp (v, value[i]) != 0)
+ {
+ g_print ("Group %s key %s: mismatch at %d, expected %s, got %s\n",
+ group, key, i, v, value[i]);
+ exit (1);
+ }
+
+ i++;
+ v = va_arg (args, gchar*);
+ }
+
+ va_end (args);
+
+ g_strfreev (value);
+}
+
+static void
+check_integer_list_value (GKeyFile *keyfile,
+ const gchar *group,
+ const gchar *key,
+ ...)
+{
+ gint i;
+ gint v, *value;
+ va_list args;
+ gsize len;
+ GError *error = NULL;
+
+ value = g_key_file_get_integer_list (keyfile, group, key, &len, &error);
+ check_no_error (&error);
+ g_assert (value != NULL);
+
+ va_start (args, key);
+ i = 0;
+ v = va_arg (args, gint);
+ while (v != -100)
+ {
+ if (i == len)
+ {
+ g_print ("Group %s key %s: list too short (%d)\n",
+ group, key, i);
+ exit (1);
+ }
+ if (value[i] != v)
+ {
+ g_print ("Group %s key %s: mismatch at %d, expected %d, got %d\n",
+ group, key, i, v, value[i]);
+ exit (1);
+ }
+
+ i++;
+ v = va_arg (args, gint);
+ }
+
+ va_end (args);
+
+ g_free (value);
+}
+
+static void
+check_double_list_value (GKeyFile *keyfile,
+ const gchar *group,
+ const gchar *key,
+ ...)
+{
+ gint i;
+ gdouble v, *value;
+ va_list args;
+ gsize len;
+ GError *error = NULL;
+
+ value = g_key_file_get_double_list (keyfile, group, key, &len, &error);
+ check_no_error (&error);
+ g_assert (value != NULL);
+
+ va_start (args, key);
+ i = 0;
+ v = va_arg (args, gdouble);
+ while (v != -100)
+ {
+ if (i == len)
+ {
+ g_print ("Group %s key %s: list too short (%d)\n",
+ group, key, i);
+ exit (1);
+ }
+ if (value[i] != v)
+ {
+ g_print ("Group %s key %s: mismatch at %d, expected %e, got %e\n",
+ group, key, i, v, value[i]);
+ exit (1);
+ }
+
+ i++;
+ v = va_arg (args, gdouble);
+ }
+
+ va_end (args);
+
+ g_free (value);
+}
+
+static void
+check_boolean_list_value (GKeyFile *keyfile,
+ const gchar *group,
+ const gchar *key,
+ ...)
+{
+ gint i;
+ gboolean v, *value;
+ va_list args;
+ gsize len;
+ GError *error = NULL;
+
+ value = g_key_file_get_boolean_list (keyfile, group, key, &len, &error);
+ check_no_error (&error);
+ g_assert (value != NULL);
+
+ va_start (args, key);
+ i = 0;
+ v = va_arg (args, gboolean);
+ while (v != -100)
+ {
+ if (i == len)
+ {
+ g_print ("Group %s key %s: list too short (%d)\n",
+ group, key, i);
+ exit (1);
+ }
+ if (value[i] != v)
+ {
+ g_print ("Group %s key %s: mismatch at %d, expected %d, got %d\n",
+ group, key, i, v, value[i]);
+ exit (1);
+ }
+
+ i++;
+ v = va_arg (args, gboolean);
+ }
+
+ va_end (args);
+
+ g_free (value);
+}
+
+static void
+check_boolean_value (GKeyFile *keyfile,
+ const gchar *group,
+ const gchar *key,
+ gboolean expected)
+{
+ GError *error = NULL;
+ gboolean value;
+
+ value = g_key_file_get_boolean (keyfile, group, key, &error);
+ check_no_error (&error);
+
+ if (value != expected)
+ {
+ g_print ("Group %s key %s: "
+ "expected boolean value '%s', actual value '%s'\n",
+ group, key,
+ expected ? "true" : "false",
+ value ? "true" : "false");
+ exit (1);
+ }
+}
+
+static void
+check_integer_value (GKeyFile *keyfile,
+ const gchar *group,
+ const gchar *key,
+ gint expected)
+{
+ GError *error = NULL;
+ gint value;
+
+ value = g_key_file_get_integer (keyfile, group, key, &error);
+ check_no_error (&error);
+
+ if (value != expected)
+ {
+ g_print ("Group %s key %s: "
+ "expected integer value %d, actual value %d\n",
+ group, key, expected, value);
+ exit (1);
+ }
+}
+
+static void
+check_double_value (GKeyFile *keyfile,
+ const gchar *group,
+ const gchar *key,
+ gdouble expected)
+{
+ GError *error = NULL;
+ gdouble value;
+
+ value = g_key_file_get_double (keyfile, group, key, &error);
+ check_no_error (&error);
+
+ if (value != expected)
+ {
+ g_print ("Group %s key %s: "
+ "expected integer value %e, actual value %e\n",
+ group, key, expected, value);
+ exit (1);
+ }
+}
+
+static void
+check_name (const gchar *what,
+ const gchar *value,
+ const gchar *expected,
+ gint position)
+{
+ if (!value || strcmp (expected, value) != 0)
+ {
+ g_print ("Wrong %s returned: got '%s' at %d, expected '%s'\n",
+ what, value, position, expected);
+ exit (1);
+ }
+}
+
+static void
+check_length (const gchar *what,
+ gint n_items,
+ gint length,
+ gint expected)
+{
+ if (n_items != length || length != expected)
+ {
+ g_print ("Wrong number of %s returned: got %d items, length %d, expected %d\n",
+ what, n_items, length, expected);
+ exit (1);
+ }
+}
+
+
+/* check that both \n and \r\n are accepted as line ends,
+ * and that stray \r are passed through
+ */
+static void
+test_line_ends (void)
+{
+ GKeyFile *keyfile;
+
+ const gchar *data =
+ "[group1]\n"
+ "key1=value1\n"
+ "key2=value2\r\n"
+ "[group2]\r\n"
+ "key3=value3\r\r\n"
+ "key4=value4\n";
+
+ keyfile = load_data (data, 0);
+
+ check_string_value (keyfile, "group1", "key1", "value1");
+ check_string_value (keyfile, "group1", "key2", "value2");
+ check_string_value (keyfile, "group2", "key3", "value3\r");
+ check_string_value (keyfile, "group2", "key4", "value4");
+
+ g_key_file_free (keyfile);
+}
+
+/* check handling of whitespace
+ */
+static void
+test_whitespace (void)
+{
+ GKeyFile *keyfile;
+
+ const gchar *data =
+ "[group1]\n"
+ "key1 = value1\n"
+ "key2\t=\tvalue2\n"
+ " [ group2 ] \n"
+ "key3 = value3 \n"
+ "key4 = value \t4\n"
+ " key5 = value5\n";
+
+ keyfile = load_data (data, 0);
+
+ check_string_value (keyfile, "group1", "key1", "value1");
+ check_string_value (keyfile, "group1", "key2", "value2");
+ check_string_value (keyfile, " group2 ", "key3", "value3 ");
+ check_string_value (keyfile, " group2 ", "key4", "value \t4");
+ check_string_value (keyfile, " group2 ", "key5", "value5");
+
+ g_key_file_free (keyfile);
+}
+
+/* check handling of comments
+ */
+static void
+test_comments (void)
+{
+ GKeyFile *keyfile;
+ gchar **names;
+ gsize len;
+ GError *error = NULL;
+ gchar *comment;
+
+ const gchar *data =
+ "# top comment\n"
+ "# top comment, continued\n"
+ "[group1]\n"
+ "key1 = value1\n"
+ "# key comment\n"
+ "# key comment, continued\n"
+ "key2 = value2\n"
+ "# line end check\r\n"
+ "key3 = value3\n"
+ "key4 = value4\n"
+ "# group comment\n"
+ "# group comment, continued\n"
+ "[group2]\n";
+
+ const gchar *top_comment= " top comment\n top comment, continued\n";
+ const gchar *group_comment= " group comment\n group comment, continued\n";
+ const gchar *key_comment= " key comment\n key comment, continued\n";
+
+ keyfile = load_data (data, 0);
+
+ check_string_value (keyfile, "group1", "key1", "value1");
+ check_string_value (keyfile, "group1", "key2", "value2");
+ check_string_value (keyfile, "group1", "key3", "value3");
+ check_string_value (keyfile, "group1", "key4", "value4");
+
+ names = g_key_file_get_keys (keyfile, "group1", &len, &error);
+ check_no_error (&error);
+
+ check_length ("keys", g_strv_length (names), len, 4);
+ check_name ("key", names[0], "key1", 0);
+ check_name ("key", names[1], "key2", 1);
+ check_name ("key", names[2], "key3", 2);
+ check_name ("key", names[3], "key4", 3);
+
+ g_strfreev (names);
+
+ g_key_file_free (keyfile);
+
+ keyfile = load_data (data, G_KEY_FILE_KEEP_COMMENTS);
+
+ names = g_key_file_get_keys (keyfile, "group1", &len, &error);
+ check_no_error (&error);
+
+ check_length ("keys", g_strv_length (names), len, 4);
+ check_name ("key", names[0], "key1", 0);
+ check_name ("key", names[1], "key2", 1);
+ check_name ("key", names[2], "key3", 2);
+ check_name ("key", names[3], "key4", 3);
+
+ g_strfreev (names);
+
+ comment = g_key_file_get_comment (keyfile, NULL, NULL, &error);
+ check_no_error (&error);
+ check_name ("top comment", comment, top_comment, 0);
+ g_free (comment);
+
+ comment = g_key_file_get_comment (keyfile, "group1", "key2", &error);
+ check_no_error (&error);
+ check_name ("key comment", comment, key_comment, 0);
+ g_free (comment);
+
+ comment = g_key_file_get_comment (keyfile, "group2", NULL, &error);
+ check_no_error (&error);
+ check_name ("group comment", comment, group_comment, 0);
+ g_free (comment);
+
+ comment = g_key_file_get_comment (keyfile, "group3", NULL, &error);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
+ g_assert (comment == NULL);
+
+ g_key_file_free (keyfile);
+}
+
+
+/* check key and group listing */
+static void
+test_listing (void)
+{
+ GKeyFile *keyfile;
+ gchar **names;
+ gsize len;
+ gchar *start;
+ GError *error = NULL;
+
+ const gchar *data =
+ "[group1]\n"
+ "key1=value1\n"
+ "key2=value2\n"
+ "[group2]\n"
+ "key3=value3\n"
+ "key4=value4\n";
+
+ keyfile = load_data (data, 0);
+
+ names = g_key_file_get_groups (keyfile, &len);
+ if (names == NULL)
+ {
+ g_print ("Error listing groups\n");
+ exit (1);
+ }
+
+ check_length ("groups", g_strv_length (names), len, 2);
+ check_name ("group name", names[0], "group1", 0);
+ check_name ("group name", names[1], "group2", 1);
+
+ g_strfreev (names);
+
+ names = g_key_file_get_keys (keyfile, "group1", &len, &error);
+ check_no_error (&error);
+
+ check_length ("keys", g_strv_length (names), len, 2);
+ check_name ("key", names[0], "key1", 0);
+ check_name ("key", names[1], "key2", 1);
+
+ g_strfreev (names);
+
+ names = g_key_file_get_keys (keyfile, "no-such-group", &len, &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
+
+ g_strfreev (names);
+
+ if (!g_key_file_has_group (keyfile, "group1") ||
+ !g_key_file_has_group (keyfile, "group2") ||
+ g_key_file_has_group (keyfile, "group10") ||
+ g_key_file_has_group (keyfile, "group2 "))
+ {
+ g_print ("Group finding trouble\n");
+ exit (1);
+ }
+
+ start = g_key_file_get_start_group (keyfile);
+ if (!start || strcmp (start, "group1") != 0)
+ {
+ g_print ("Start group finding trouble\n");
+ exit (1);
+ }
+ g_free (start);
+
+ if (!g_key_file_has_key (keyfile, "group1", "key1", &error) ||
+ !g_key_file_has_key (keyfile, "group2", "key3", &error) ||
+ g_key_file_has_key (keyfile, "group2", "no-such-key", &error))
+ {
+ g_print ("Key finding trouble\n");
+ exit (1);
+ }
+ check_no_error (&error);
+
+ g_key_file_has_key (keyfile, "no-such-group", "key", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
+
+ g_key_file_free (keyfile);
+}
+
+/* check parsing of string values */
+static void
+test_string (void)
+{
+ GKeyFile *keyfile;
+ GError *error = NULL;
+ gchar *value;
+
+ const gchar *data =
+ "[valid]\n"
+ "key1=\\s\\n\\t\\r\\\\\n"
+ "key2=\"quoted\"\n"
+ "key3='quoted'\n"
+ "key4=\xe2\x89\xa0\xe2\x89\xa0\n"
+ "[invalid]\n"
+ "key1=\\a\\b\\0800xff\n"
+ "key2=blabla\\\n";
+
+ keyfile = load_data (data, 0);
+
+ check_string_value (keyfile, "valid", "key1", " \n\t\r\\");
+ check_string_value (keyfile, "valid", "key2", "\"quoted\"");
+ check_string_value (keyfile, "valid", "key3", "'quoted'");
+ check_string_value (keyfile, "valid", "key4", "\xe2\x89\xa0\xe2\x89\xa0");
+
+ value = g_key_file_get_string (keyfile, "invalid", "key1", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+ g_free (value);
+
+ value = g_key_file_get_string (keyfile, "invalid", "key2", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+ g_free (value);
+
+ g_key_file_free (keyfile);
+}
+
+/* check parsing of boolean values */
+static void
+test_boolean (void)
+{
+ GKeyFile *keyfile;
+ GError *error = NULL;
+
+ const gchar *data =
+ "[valid]\n"
+ "key1=true\n"
+ "key2=false\n"
+ "key3=1\n"
+ "key4=0\n"
+ "[invalid]\n"
+ "key1=t\n"
+ "key2=f\n"
+ "key3=yes\n"
+ "key4=no\n";
+
+ keyfile = load_data (data, 0);
+
+ check_boolean_value (keyfile, "valid", "key1", TRUE);
+ check_boolean_value (keyfile, "valid", "key2", FALSE);
+ check_boolean_value (keyfile, "valid", "key3", TRUE);
+ check_boolean_value (keyfile, "valid", "key4", FALSE);
+
+ g_key_file_get_boolean (keyfile, "invalid", "key1", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
+ g_key_file_get_boolean (keyfile, "invalid", "key2", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
+ g_key_file_get_boolean (keyfile, "invalid", "key3", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
+ g_key_file_get_boolean (keyfile, "invalid", "key4", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
+ g_key_file_free (keyfile);
+}
+
+/* check parsing of integer and double values */
+static void
+test_number (void)
+{
+ GKeyFile *keyfile;
+ GError *error = NULL;
+
+ const gchar *data =
+ "[valid]\n"
+ "key1=0\n"
+ "key2=1\n"
+ "key3=-1\n"
+ "key4=2324431\n"
+ "key5=-2324431\n"
+ "key6=000111\n"
+ "dkey1=000111\n"
+ "dkey2=145.45\n"
+ "dkey3=-3453.7\n"
+ "[invalid]\n"
+ "key1=0xffff\n"
+ "key2=0.5\n"
+ "key3=1e37\n"
+ "key4=ten\n"
+ "key5=\n"
+ "key6=1.0.0\n"
+ "key7=2x2\n"
+ "key8=abc\n";
+
+ keyfile = load_data (data, 0);
+
+ check_integer_value (keyfile, "valid", "key1", 0);
+ check_integer_value (keyfile, "valid", "key2", 1);
+ check_integer_value (keyfile, "valid", "key3", -1);
+ check_integer_value (keyfile, "valid", "key4", 2324431);
+ check_integer_value (keyfile, "valid", "key5", -2324431);
+ check_integer_value (keyfile, "valid", "key6", 111);
+ check_double_value (keyfile, "valid", "dkey1", 111.0);
+ check_double_value (keyfile, "valid", "dkey2", 145.45);
+ check_double_value (keyfile, "valid", "dkey3", -3453.7);
+
+ g_key_file_get_integer (keyfile, "invalid", "key1", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
+ g_key_file_get_integer (keyfile, "invalid", "key2", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
+ g_key_file_get_integer (keyfile, "invalid", "key3", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
+ g_key_file_get_integer (keyfile, "invalid", "key4", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
+ g_key_file_get_double (keyfile, "invalid", "key5", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
+ g_key_file_get_double (keyfile, "invalid", "key6", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
+ g_key_file_get_double (keyfile, "invalid", "key7", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
+ g_key_file_get_double (keyfile, "invalid", "key8", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
+ g_key_file_free (keyfile);
+}
+
+/* check handling of translated strings */
+static void
+test_locale_string (void)
+{
+ GKeyFile *keyfile;
+
+ const gchar *data =
+ "[valid]\n"
+ "key1=v1\n"
+ "key1[de]=v1-de\n"
+ "key1[de_DE]=v1-de_DE\n"
+ "key1[de_DE.UTF8]=v1-de_DE.UTF8\n"
+ "key1[fr]=v1-fr\n"
+ "key1[en] =v1-en\n"
+ "key1[sr@Latn]=v1-sr\n";
+
+ keyfile = load_data (data, G_KEY_FILE_KEEP_TRANSLATIONS);
+
+ check_locale_string_value (keyfile, "valid", "key1", "it", "v1");
+ check_locale_string_value (keyfile, "valid", "key1", "de", "v1-de");
+ check_locale_string_value (keyfile, "valid", "key1", "de_DE", "v1-de_DE");
+ check_locale_string_value (keyfile, "valid", "key1", "de_DE.UTF8", "v1-de_DE.UTF8");
+ check_locale_string_value (keyfile, "valid", "key1", "fr", "v1-fr");
+ check_locale_string_value (keyfile, "valid", "key1", "fr_FR", "v1-fr");
+ check_locale_string_value (keyfile, "valid", "key1", "en", "v1-en");
+ check_locale_string_value (keyfile, "valid", "key1", "sr@Latn", "v1-sr");
+
+ g_key_file_free (keyfile);
+
+ /* now test that translations are thrown away */
+
+ g_setenv ("LANGUAGE", "de", TRUE);
+ setlocale (LC_ALL, "");
+
+ keyfile = load_data (data, 0);
+
+ check_locale_string_value (keyfile, "valid", "key1", "it", "v1");
+ check_locale_string_value (keyfile, "valid", "key1", "de", "v1-de");
+ check_locale_string_value (keyfile, "valid", "key1", "de_DE", "v1-de");
+ check_locale_string_value (keyfile, "valid", "key1", "de_DE.UTF8", "v1-de");
+ check_locale_string_value (keyfile, "valid", "key1", "fr", "v1");
+ check_locale_string_value (keyfile, "valid", "key1", "fr_FR", "v1");
+ check_locale_string_value (keyfile, "valid", "key1", "en", "v1");
+
+ g_key_file_free (keyfile);
+}
+
+static void
+test_lists (void)
+{
+ GKeyFile *keyfile;
+
+ const gchar *data =
+ "[valid]\n"
+ "key1=v1;v2\n"
+ "key2=v1;v2;\n"
+ "key3=v1,v2\n"
+ "key4=v1\\;v2\n"
+ "key5=true;false\n"
+ "key6=1;0;-1\n"
+ "key7= 1 ; 0 ; -1 \n"
+ "key8=v1\\,v2\n"
+ "key9=0;1.3456;-76532.456\n";
+
+ keyfile = load_data (data, 0);
+
+ check_string_list_value (keyfile, "valid", "key1", "v1", "v2", NULL);
+ check_string_list_value (keyfile, "valid", "key2", "v1", "v2", NULL);
+ check_string_list_value (keyfile, "valid", "key3", "v1,v2", NULL);
+ check_string_list_value (keyfile, "valid", "key4", "v1;v2", NULL);
+ check_boolean_list_value (keyfile, "valid", "key5", TRUE, FALSE, -100);
+ check_integer_list_value (keyfile, "valid", "key6", 1, 0, -1, -100);
+ check_double_list_value (keyfile, "valid", "key9", 0.0, 1.3456, -76532.456, -100.0);
+ /* maybe these should be valid */
+ /* check_integer_list_value (keyfile, "valid", "key7", 1, 0, -1, -100);*/
+ /* check_string_list_value (keyfile, "valid", "key8", "v1\\,v2", NULL);*/
+
+ g_key_file_free (keyfile);
+
+ /* Now check an alternate separator */
+
+ keyfile = load_data (data, 0);
+ g_key_file_set_list_separator (keyfile, ',');
+
+ check_string_list_value (keyfile, "valid", "key1", "v1;v2", NULL);
+ check_string_list_value (keyfile, "valid", "key2", "v1;v2;", NULL);
+ check_string_list_value (keyfile, "valid", "key3", "v1", "v2", NULL);
+
+ g_key_file_free (keyfile);
+}
+
+/* http://bugzilla.gnome.org/show_bug.cgi?id=165887 */
+static void
+test_group_remove (void)
+{
+ GKeyFile *keyfile;
+ gchar **names;
+ gsize len;
+ GError *error = NULL;
+
+ const gchar *data =
+ "[group1]\n"
+ "[group2]\n"
+ "key1=bla\n"
+ "key2=bla\n"
+ "[group3]\n"
+ "key1=bla\n"
+ "key2=bla\n";
+
+ keyfile = load_data (data, 0);
+
+ names = g_key_file_get_groups (keyfile, &len);
+ if (names == NULL)
+ {
+ g_print ("Error listing groups\n");
+ exit (1);
+ }
+
+ check_length ("groups", g_strv_length (names), len, 3);
+ check_name ("group name", names[0], "group1", 0);
+ check_name ("group name", names[1], "group2", 1);
+ check_name ("group name", names[2], "group3", 2);
+
+ g_key_file_remove_group (keyfile, "group1", &error);
+ check_no_error (&error);
+
+ g_strfreev (names);
+
+ names = g_key_file_get_groups (keyfile, &len);
+ if (names == NULL)
+ {
+ g_print ("Error listing groups\n");
+ exit (1);
+ }
+
+ check_length ("groups", g_strv_length (names), len, 2);
+ check_name ("group name", names[0], "group2", 0);
+ check_name ("group name", names[1], "group3", 1);
+
+ g_key_file_remove_group (keyfile, "group2", &error);
+ check_no_error (&error);
+
+ g_strfreev (names);
+
+ names = g_key_file_get_groups (keyfile, &len);
+ if (names == NULL)
+ {
+ g_print ("Error listing groups\n");
+ exit (1);
+ }
+
+ check_length ("groups", g_strv_length (names), len, 1);
+ check_name ("group name", names[0], "group3", 0);
+
+ g_key_file_remove_group (keyfile, "no such group", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
+
+ g_strfreev (names);
+
+ g_key_file_free (keyfile);
+}
+
+/* http://bugzilla.gnome.org/show_bug.cgi?id=165980 */
+static void
+test_key_remove (void)
+{
+ GKeyFile *keyfile;
+ gchar *value;
+ GError *error = NULL;
+
+ const gchar *data =
+ "[group1]\n"
+ "key1=bla\n"
+ "key2=bla\n";
+
+ keyfile = load_data (data, 0);
+
+ check_string_value (keyfile, "group1", "key1", "bla");
+
+ g_key_file_remove_key (keyfile, "group1", "key1", &error);
+ check_no_error (&error);
+
+ value = g_key_file_get_string (keyfile, "group1", "key1", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND);
+ g_free (value);
+
+ g_key_file_remove_key (keyfile, "group1", "key1", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND);
+
+ g_key_file_remove_key (keyfile, "no such group", "key1", &error);
+ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
+
+ g_key_file_free (keyfile);
+}
+
+
+/* http://bugzilla.gnome.org/show_bug.cgi?id=316309 */
+static void
+test_groups (void)
+{
+ GKeyFile *keyfile;
+
+ const gchar *data =
+ "[1]\n"
+ "key1=123\n"
+ "[2]\n"
+ "key2=123\n";
+
+ keyfile = load_data (data, 0);
+
+ check_string_value (keyfile, "1", "key1", "123");
+ check_string_value (keyfile, "2", "key2", "123");
+
+ g_key_file_free (keyfile);
+}
+
+static void
+test_group_names (void)
+{
+ GKeyFile *keyfile;
+ GError *error = NULL;
+ const gchar *data;
+ gchar *value;
+
+ /* [ in group name */
+ data = "[a[b]\n"
+ "key1=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE);
+
+ /* ] in group name */
+ data = "[a]b]\n"
+ "key1=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE);
+
+ /* control char in group name */
+ data = "[a\tb]\n"
+ "key1=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE);
+
+ /* empty group name */
+ data = "[]\n"
+ "key1=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE);
+
+ /* Unicode in group name */
+ data = "[\xc2\xbd]\n"
+ "key1=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_no_error (&error);
+
+ keyfile = g_key_file_new ();
+ g_key_file_set_string (keyfile, "a[b", "key1", "123");
+ value = g_key_file_get_string (keyfile, "a[b", "key1", &error);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
+ g_key_file_free (keyfile);
+
+ keyfile = g_key_file_new ();
+ g_key_file_set_string (keyfile, "a]b", "key1", "123");
+ value = g_key_file_get_string (keyfile, "a]b", "key1", &error);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
+ g_key_file_free (keyfile);
+
+ keyfile = g_key_file_new ();
+ g_key_file_set_string (keyfile, "a\tb", "key1", "123");
+ value = g_key_file_get_string (keyfile, "a\tb", "key1", &error);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
+ g_key_file_free (keyfile);
+
+ keyfile = g_key_file_new ();
+ g_key_file_set_string (keyfile, "\xc2\xbd", "key1", "123");
+ check_string_value (keyfile, "\xc2\xbd", "key1", "123");
+ g_key_file_free (keyfile);
+}
+
+static void
+test_key_names (void)
+{
+ GKeyFile *keyfile;
+ GError *error = NULL;
+ const gchar *data;
+ gchar *value;
+
+ /* [ in key name */
+ data = "[a]\n"
+ "key[=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE);
+
+ /* empty key name */
+ data = "[a]\n"
+ " =123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE);
+
+ /* empty key name */
+ data = "[a]\n"
+ " [de] =123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE);
+
+ /* bad locale suffix */
+ data = "[a]\n"
+ "foo[@#!&%]=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE);
+
+ /* initial space */
+ data = "[a]\n"
+ " foo=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ check_no_error (&error);
+ check_string_value (keyfile, "a", "foo", "123");
+ g_key_file_free (keyfile);
+
+ /* final space */
+ data = "[a]\n"
+ "foo =123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ check_no_error (&error);
+ check_string_value (keyfile, "a", "foo", "123");
+ g_key_file_free (keyfile);
+
+ /* inner space */
+ data = "[a]\n"
+ "foo bar=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ check_no_error (&error);
+ check_string_value (keyfile, "a", "foo bar", "123");
+ g_key_file_free (keyfile);
+
+ /* inner space */
+ data = "[a]\n"
+ "foo [de] =123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE);
+ g_key_file_free (keyfile);
+
+ /* control char in key name */
+ data = "[a]\n"
+ "key\tfoo=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_no_error (&error);
+
+ /* Unicode in key name */
+ data = "[a]\n"
+ "\xc2\xbd=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_no_error (&error);
+
+ keyfile = g_key_file_new ();
+ g_key_file_set_string (keyfile, "a", "x", "123");
+ g_key_file_set_string (keyfile, "a", "key=", "123");
+ value = g_key_file_get_string (keyfile, "a", "key=", &error);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_KEY_NOT_FOUND);
+ g_key_file_free (keyfile);
+
+ keyfile = g_key_file_new ();
+ g_key_file_set_string (keyfile, "a", "x", "123");
+ g_key_file_set_string (keyfile, "a", "key[", "123");
+ value = g_key_file_get_string (keyfile, "a", "key[", &error);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_KEY_NOT_FOUND);
+ g_key_file_free (keyfile);
+
+ keyfile = g_key_file_new ();
+ g_key_file_set_string (keyfile, "a", "x", "123");
+ g_key_file_set_string (keyfile, "a", "key\tfoo", "123");
+ value = g_key_file_get_string (keyfile, "a", "key\tfoo", &error);
+ check_no_error (&error);
+ g_key_file_free (keyfile);
+
+ keyfile = g_key_file_new ();
+ g_key_file_set_string (keyfile, "a", "x", "123");
+ g_key_file_set_string (keyfile, "a", " key", "123");
+ value = g_key_file_get_string (keyfile, "a", " key", &error);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_KEY_NOT_FOUND);
+ g_key_file_free (keyfile);
+
+ keyfile = g_key_file_new ();
+ g_key_file_set_string (keyfile, "a", "x", "123");
+
+ /* Unicode key */
+ g_key_file_set_string (keyfile, "a", "\xc2\xbd", "123");
+ check_string_value (keyfile, "a", "\xc2\xbd", "123");
+
+ /* Keys with / + . (as used by the gnome-vfs mime cache) */
+ g_key_file_set_string (keyfile, "a", "foo/bar", "/");
+ check_string_value (keyfile, "a", "foo/bar", "/");
+ g_key_file_set_string (keyfile, "a", "foo+bar", "+");
+ check_string_value (keyfile, "a", "foo+bar", "+");
+ g_key_file_set_string (keyfile, "a", "foo.bar", ".");
+ check_string_value (keyfile, "a", "foo.bar", ".");
+
+ g_key_file_free (keyfile);
+}
+
+static void
+test_duplicate_keys (void)
+{
+ GKeyFile *keyfile;
+ const gchar *data =
+ "[1]\n"
+ "key1=123\n"
+ "key1=345\n";
+
+ keyfile = load_data (data, 0);
+ check_string_value (keyfile, "1", "key1", "345");
+
+ g_key_file_free (keyfile);
+}
+
+/* http://bugzilla.gnome.org/show_bug.cgi?id=157877 */
+static void
+test_duplicate_groups (void)
+{
+ GKeyFile *keyfile;
+ const gchar *data =
+ "[Desktop Entry]\n"
+ "key1=123\n"
+ "[Desktop Entry]\n"
+ "key2=123\n";
+
+ keyfile = load_data (data, 0);
+ check_string_value (keyfile, "Desktop Entry", "key1", "123");
+ check_string_value (keyfile, "Desktop Entry", "key2", "123");
+
+ g_key_file_free (keyfile);
+}
+
+/* http://bugzilla.gnome.org/show_bug.cgi?id=385910 */
+static void
+test_duplicate_groups2 (void)
+{
+ GKeyFile *keyfile;
+ const gchar *data =
+ "[A]\n"
+ "foo=bar\n"
+ "[B]\n"
+ "foo=baz\n"
+ "[A]\n"
+ "foo=bang\n";
+
+ keyfile = load_data (data, 0);
+ check_string_value (keyfile, "A", "foo", "bang");
+ check_string_value (keyfile, "B", "foo", "baz");
+
+ g_key_file_free (keyfile);
+}
+
+
+/* http://bugzilla.gnome.org/show_bug.cgi?id=420686 */
+static void
+test_reload_idempotency (void)
+{
+ static const gchar *original_data=""
+ "# Top comment\n"
+ "\n"
+ "# First comment\n"
+ "[first]\n"
+ "key=value\n"
+ "# A random comment in the first group\n"
+ "anotherkey=anothervalue\n"
+ "# Second comment - one line\n"
+ "[second]\n"
+ "# Third comment - two lines\n"
+ "# Third comment - two lines\n"
+ "[third]\n"
+ "blank_line=1\n"
+ "\n"
+ "blank_lines=2\n"
+ "\n\n"
+ "[fourth]\n"
+ "[fifth]\n";
+ GKeyFile *keyfile;
+ GError *error = NULL;
+ gchar *data1, *data2;
+ gsize len1, len2;
+
+ /* check that we only insert a single new line between groups */
+ keyfile = g_key_file_new ();
+ if (!g_key_file_load_from_data (keyfile,
+ original_data, strlen(original_data),
+ G_KEY_FILE_KEEP_COMMENTS,
+ &error)) {
+ g_print ("Failed to parse keyfile[1]: %s", error->message);
+ g_error_free (error);
+ exit (1);
+ }
+
+ data1 = g_key_file_to_data (keyfile, &len1, &error);
+ if (data1 == NULL) {
+ g_print ("Failed to extract keyfile[1]: %s", error->message);
+ g_error_free (error);
+ exit (1);
+ }
+ g_key_file_free (keyfile);
+
+ keyfile = g_key_file_new ();
+ if (!g_key_file_load_from_data (keyfile,
+ data1, len1,
+ G_KEY_FILE_KEEP_COMMENTS,
+ &error)) {
+ g_print ("Failed to parse keyfile[2]: %s", error->message);
+ g_error_free (error);
+ exit (1);
+ }
+
+ data2 = g_key_file_to_data (keyfile, &len2, &error);
+ if (data2 == NULL) {
+ g_print ("Failed to extract keyfile[2]: %s", error->message);
+ g_error_free (error);
+ exit (1);
+ }
+ g_key_file_free (keyfile);
+
+
+ if (strcmp(data1, data2) != 0) {
+ g_print ("Reloading GKeyFile is not idempotent.");
+ g_print ("original:\n%s\n---\n", original_data);
+ g_print ("pass1:\n%s\n---\n", data1);
+ g_print ("pass2:\n%s\n---\n", data2);
+ exit (1);
+ }
+
+ g_free (data2);
+ g_free (data1);
+}
+
+
+static void
+log_func (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *message,
+ gpointer user_data)
+{
+}
+
+int
+main (int argc, char *argv[])
+{
+ g_log_set_default_handler (log_func, NULL);
+
+ test_line_ends ();
+ test_whitespace ();
+ test_comments ();
+ test_listing ();
+ test_string ();
+ test_boolean ();
+ test_number ();
+ test_locale_string ();
+ test_lists ();
+ test_group_remove ();
+ test_key_remove ();
+ test_groups ();
+ test_duplicate_keys ();
+ test_duplicate_groups ();
+ test_duplicate_groups2 ();
+ test_group_names ();
+ test_key_names ();
+ test_reload_idempotency ();
+
+ return 0;
+}
diff --git a/trunk/tests/libmoduletestplugin_a.c b/trunk/tests/libmoduletestplugin_a.c
new file mode 100644
index 000000000..150d50d95
--- /dev/null
+++ b/trunk/tests/libmoduletestplugin_a.c
@@ -0,0 +1,71 @@
+/* libgplugin_a.c - test plugin for testgmodule
+ * 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <gmodule.h>
+#include <stdlib.h>
+
+G_MODULE_EXPORT gchar* gplugin_a_state;
+
+G_MODULE_EXPORT void
+gplugin_a_func (void)
+{
+ gplugin_a_state = "Hello world";
+}
+
+G_MODULE_EXPORT void
+gplugin_clash_func (void)
+{
+ gplugin_a_state = "plugin clash";
+}
+
+G_MODULE_EXPORT void
+g_clash_func (void)
+{
+ gplugin_a_state = "global clash";
+}
+
+G_MODULE_EXPORT void
+gplugin_say_boo_func (void)
+{
+ gplugin_a_state = "BOOH";
+}
+
+G_MODULE_EXPORT void
+gplugin_a_module_func (GModule *module)
+{
+ void *f = NULL;
+
+ if (!g_module_symbol (module, "gplugin_say_boo_func", &f ))
+ {
+ g_print ("error: %s\n", g_module_error ());
+ exit (1);
+ }
+
+ ((void(*)(void)) f) ();
+}
diff --git a/trunk/tests/libmoduletestplugin_b.c b/trunk/tests/libmoduletestplugin_b.c
new file mode 100644
index 000000000..26e065d6c
--- /dev/null
+++ b/trunk/tests/libmoduletestplugin_b.c
@@ -0,0 +1,70 @@
+/* libgplugin_b.c - test plugin for testgmodule
+ * 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <gmodule.h>
+
+G_MODULE_EXPORT gchar* gplugin_b_state;
+
+G_MODULE_EXPORT const gchar*
+g_module_check_init (GModule *module)
+{
+ gplugin_b_state = "check-init";
+
+ return NULL;
+}
+
+G_MODULE_EXPORT void
+g_module_unload (GModule *module)
+{
+ gplugin_b_state = "unloaded";
+}
+
+G_MODULE_EXPORT void
+gplugin_b_func (void)
+{
+ gplugin_b_state = "Hello world";
+}
+
+G_MODULE_EXPORT void
+gplugin_clash_func (void)
+{
+ gplugin_b_state = "plugin clash";
+}
+
+G_MODULE_EXPORT void
+g_clash_func (void)
+{
+ gplugin_b_state = "global clash";
+}
+
+G_MODULE_EXPORT void
+gplugin_say_boo_func (void)
+{
+ gplugin_b_state = "BOOH";
+}
diff --git a/trunk/tests/list-test.c b/trunk/tests/list-test.c
new file mode 100644
index 000000000..6e274fc69
--- /dev/null
+++ b/trunk/tests/list-test.c
@@ -0,0 +1,212 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <glib.h>
+
+#define DEBUG_MSG(args)
+/* #define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n"); */
+#define PRINT_MSG(args)
+/* #define PRINT_MSG(args) g_print args ; g_print ("\n"); */
+
+#define SIZE 50
+#define NUMBER_MIN 0000
+#define NUMBER_MAX 9999
+
+
+static guint32 array[SIZE];
+
+
+static gint
+sort (gconstpointer p1, gconstpointer p2)
+{
+ gint32 a, b;
+
+ a = GPOINTER_TO_INT (p1);
+ b = GPOINTER_TO_INT (p2);
+
+ return (a > b ? +1 : a == b ? 0 : -1);
+}
+
+/*
+ * glist sort tests
+ */
+static void
+test_list_sort (void)
+{
+ GList *list = NULL;
+ gint i;
+
+ PRINT_MSG (("testing g_list_sort()"));
+
+ for (i = 0; i < SIZE; i++) {
+ list = g_list_append (list, GINT_TO_POINTER (array[i]));
+ }
+
+ list = g_list_sort (list, sort);
+ for (i = 0; i < SIZE - 1; i++) {
+ gpointer p1, p2;
+
+ p1 = g_list_nth_data (list, i);
+ p2 = g_list_nth_data (list, i+1);
+
+ g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
+ DEBUG_MSG (("list_sort #%3.3d ---> %d", i, GPOINTER_TO_INT (p1)));
+ }
+
+ g_list_free (list);
+}
+
+static void
+test_list_sort_with_data (void)
+{
+ GList *list = NULL;
+ gint i;
+
+ PRINT_MSG (("testing g_list_sort_with_data()"));
+
+ for (i = 0; i < SIZE; i++) {
+ list = g_list_append (list, GINT_TO_POINTER (array[i]));
+ }
+
+ list = g_list_sort_with_data (list, (GCompareDataFunc)sort, NULL);
+ for (i = 0; i < SIZE - 1; i++) {
+ gpointer p1, p2;
+
+ p1 = g_list_nth_data (list, i);
+ p2 = g_list_nth_data (list, i+1);
+
+ g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
+ DEBUG_MSG (("list_sort_with_data #%3.3d ---> %d", i, GPOINTER_TO_INT (p1)));
+ }
+
+ g_list_free (list);
+}
+
+static void
+test_list_insert_sorted (void)
+{
+ GList *list = NULL;
+ gint i;
+
+ PRINT_MSG (("testing g_list_insert_sorted()"));
+
+ for (i = 0; i < SIZE; i++) {
+ list = g_list_insert_sorted (list, GINT_TO_POINTER (array[i]), sort);
+ }
+
+ for (i = 0; i < SIZE - 1; i++) {
+ gpointer p1, p2;
+
+ p1 = g_list_nth_data (list, i);
+ p2 = g_list_nth_data (list, i+1);
+
+ g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
+ DEBUG_MSG (("list_insert_sorted #%3.3d ---> %d", i, GPOINTER_TO_INT (p1)));
+ }
+
+ g_list_free (list);
+}
+
+static void
+test_list_insert_sorted_with_data (void)
+{
+ GList *list = NULL;
+ gint i;
+
+ PRINT_MSG (("testing g_list_insert_sorted_with_data()"));
+
+ for (i = 0; i < SIZE; i++) {
+ list = g_list_insert_sorted_with_data (list,
+ GINT_TO_POINTER (array[i]),
+ (GCompareDataFunc)sort,
+ NULL);
+ }
+
+ for (i = 0; i < SIZE - 1; i++) {
+ gpointer p1, p2;
+
+ p1 = g_list_nth_data (list, i);
+ p2 = g_list_nth_data (list, i+1);
+
+ g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
+ DEBUG_MSG (("list_insert_sorted_with_data #%3.3d ---> %d", i, GPOINTER_TO_INT (p1)));
+ }
+
+ g_list_free (list);
+}
+
+static void
+test_list_reverse (void)
+{
+ GList *list = NULL;
+ GList *st;
+ gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+ gint i;
+
+ PRINT_MSG (("testing g_list_reverse()"));
+
+ for (i = 0; i < 10; i++) {
+ list = g_list_append (list, &nums[i]);
+ }
+
+ list = g_list_reverse (list);
+
+ for (i = 0; i < 10; i++) {
+ st = g_list_nth (list, i);
+ g_assert (*((gint*) st->data) == (9 - i));
+ }
+
+ g_list_free (list);
+}
+
+static void
+test_list_nth (void)
+{
+ GList *list = NULL;
+ GList *st;
+ gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+ gint i;
+
+ PRINT_MSG (("testing g_list_nth()"));
+
+ for (i = 0; i < 10; i++) {
+ list = g_list_append (list, &nums[i]);
+ }
+
+ for (i = 0; i < 10; i++) {
+ st = g_list_nth (list, i);
+ g_assert (*((gint*) st->data) == i);
+ }
+
+ g_list_free (list);
+}
+
+int
+main (int argc, char *argv[])
+{
+ gint i;
+
+ DEBUG_MSG (("debugging messages turned on"));
+
+ DEBUG_MSG (("creating %d random numbers", SIZE));
+
+ /* Create an array of random numbers. */
+ for (i = 0; i < SIZE; i++) {
+ array[i] = g_random_int_range (NUMBER_MIN, NUMBER_MAX);
+ DEBUG_MSG (("number #%3.3d ---> %d", i, array[i]));
+ }
+
+ /* Start tests. */
+ test_list_sort ();
+ test_list_sort_with_data ();
+
+ test_list_insert_sorted ();
+ test_list_insert_sorted_with_data ();
+
+ test_list_reverse ();
+ test_list_nth ();
+
+ PRINT_MSG (("testing finished"));
+
+ return 0;
+}
diff --git a/trunk/tests/mainloop-test.c b/trunk/tests/mainloop-test.c
new file mode 100644
index 000000000..2c8be1034
--- /dev/null
+++ b/trunk/tests/mainloop-test.c
@@ -0,0 +1,437 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <errno.h>
+#include <glib.h>
+#ifdef G_OS_UNIX
+#include <unistd.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef G_OS_WIN32
+#include <fcntl.h> /* For _O_BINARY used by pipe() macro */
+#include <io.h> /* for _pipe() */
+#endif
+
+#define ITERS 10000
+#define INCREMENT 10
+#define NTHREADS 4
+#define NCRAWLERS 4
+#define CRAWLER_TIMEOUT_RANGE 40
+#define RECURSER_TIMEOUT 50
+
+/* The partial ordering between the context array mutex and
+ * crawler array mutex is that the crawler array mutex cannot
+ * be locked while the context array mutex is locked
+ */
+GPtrArray *context_array;
+GMutex *context_array_mutex;
+GCond *context_array_cond;
+
+GMainLoop *main_loop;
+
+G_LOCK_DEFINE_STATIC (crawler_array_lock);
+GPtrArray *crawler_array;
+
+typedef struct _AddrData AddrData;
+typedef struct _TestData TestData;
+
+struct _AddrData
+{
+ GMainLoop *loop;
+ GIOChannel *dest;
+ gint count;
+};
+
+struct _TestData
+{
+ gint current_val;
+ gint iters;
+ GIOChannel *in;
+};
+
+static void cleanup_crawlers (GMainContext *context);
+
+gboolean
+read_all (GIOChannel *channel, char *buf, gsize 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;
+}
+
+gboolean
+write_all (GIOChannel *channel, char *buf, gsize 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;
+}
+
+gboolean
+adder_callback (GIOChannel *source,
+ GIOCondition condition,
+ gpointer data)
+{
+ char buf1[32];
+ char buf2[32];
+
+ char result[32];
+
+ AddrData *addr_data = data;
+
+ if (!read_all (source, buf1, 32) ||
+ !read_all (source, buf2, 32))
+ {
+ g_main_loop_quit (addr_data->loop);
+ return FALSE;
+ }
+
+ sprintf (result, "%d", atoi(buf1) + atoi(buf2));
+ write_all (addr_data->dest, result, 32);
+
+ return TRUE;
+}
+
+gboolean
+timeout_callback (gpointer data)
+{
+ AddrData *addr_data = data;
+
+ addr_data->count++;
+
+ return TRUE;
+}
+
+gpointer
+adder_thread (gpointer data)
+{
+ GMainContext *context;
+ GSource *adder_source;
+ GSource *timeout_source;
+
+ GIOChannel **channels = data;
+ AddrData addr_data;
+
+ context = g_main_context_new ();
+
+ g_mutex_lock (context_array_mutex);
+
+ g_ptr_array_add (context_array, context);
+
+ if (context_array->len == NTHREADS)
+ g_cond_broadcast (context_array_cond);
+
+ g_mutex_unlock (context_array_mutex);
+
+ addr_data.dest = channels[1];
+ addr_data.loop = g_main_loop_new (context, FALSE);
+ addr_data.count = 0;
+
+ adder_source = g_io_create_watch (channels[0], G_IO_IN | G_IO_HUP);
+ g_source_set_callback (adder_source, (GSourceFunc)adder_callback, &addr_data, NULL);
+ g_source_attach (adder_source, context);
+ g_source_unref (adder_source);
+
+ timeout_source = g_timeout_source_new (10);
+ g_source_set_callback (timeout_source, (GSourceFunc)timeout_callback, &addr_data, NULL);
+ g_source_set_priority (timeout_source, G_PRIORITY_HIGH);
+ g_source_attach (timeout_source, context);
+ g_source_unref (timeout_source);
+
+ g_main_loop_run (addr_data.loop);
+
+ g_io_channel_unref (channels[0]);
+ g_io_channel_unref (channels[1]);
+
+ g_free (channels);
+
+ g_main_loop_unref (addr_data.loop);
+
+#ifdef VERBOSE
+ g_print ("Timeout run %d times\n", addr_data.count);
+#endif
+
+ g_mutex_lock (context_array_mutex);
+ g_ptr_array_remove (context_array, context);
+ if (context_array->len == 0)
+ g_main_loop_quit (main_loop);
+ g_mutex_unlock (context_array_mutex);
+
+ cleanup_crawlers (context);
+
+ return NULL;
+}
+
+void
+io_pipe (GIOChannel **channels)
+{
+ gint fds[2];
+
+ if (pipe(fds) < 0)
+ {
+ g_warning ("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]);
+
+ g_io_channel_set_close_on_unref (channels[0], TRUE);
+ g_io_channel_set_close_on_unref (channels[1], TRUE);
+}
+
+void
+do_add (GIOChannel *in, gint a, gint b)
+{
+ char buf1[32];
+ char buf2[32];
+
+ sprintf (buf1, "%d", a);
+ sprintf (buf2, "%d", b);
+
+ write_all (in, buf1, 32);
+ write_all (in, buf2, 32);
+}
+
+gboolean
+adder_response (GIOChannel *source,
+ GIOCondition condition,
+ gpointer data)
+{
+ char result[32];
+ TestData *test_data = data;
+
+ if (!read_all (source, result, 32))
+ return FALSE;
+
+ test_data->current_val = atoi (result);
+ test_data->iters--;
+
+ if (test_data->iters == 0)
+ {
+ if (test_data->current_val != ITERS * INCREMENT)
+ {
+ g_print ("Addition failed: %d != %d\n",
+ test_data->current_val, ITERS * INCREMENT);
+ exit (1);
+ }
+
+ g_io_channel_unref (source);
+ g_io_channel_unref (test_data->in);
+
+ g_free (test_data);
+
+ return FALSE;
+ }
+
+ do_add (test_data->in, test_data->current_val, INCREMENT);
+
+ return TRUE;
+}
+
+void
+create_adder_thread (void)
+{
+ GError *err = NULL;
+ TestData *test_data;
+
+ GIOChannel *in_channels[2];
+ GIOChannel *out_channels[2];
+
+ GIOChannel **sub_channels;
+
+ sub_channels = g_new (GIOChannel *, 2);
+
+ io_pipe (in_channels);
+ io_pipe (out_channels);
+
+ sub_channels[0] = in_channels[0];
+ sub_channels[1] = out_channels[1];
+
+ g_thread_create (adder_thread, sub_channels, FALSE, &err);
+
+ if (err)
+ {
+ g_warning ("Cannot create thread: %s", err->message);
+ exit (1);
+ }
+
+ test_data = g_new (TestData, 1);
+ test_data->in = in_channels[1];
+ test_data->current_val = 0;
+ test_data->iters = ITERS;
+
+ g_io_add_watch (out_channels[0], G_IO_IN | G_IO_HUP,
+ adder_response, test_data);
+
+ do_add (test_data->in, test_data->current_val, INCREMENT);
+}
+
+static void create_crawler (void);
+
+static void
+remove_crawler (void)
+{
+ GSource *other_source;
+
+ if (crawler_array->len > 0)
+ {
+ other_source = crawler_array->pdata[g_random_int_range (0, crawler_array->len)];
+ g_source_destroy (other_source);
+ g_assert (g_ptr_array_remove_fast (crawler_array, other_source));
+ }
+}
+
+static gint
+crawler_callback (gpointer data)
+{
+ GSource *source = data;
+
+ G_LOCK (crawler_array_lock);
+
+ if (!g_ptr_array_remove_fast (crawler_array, source))
+ remove_crawler();
+
+ remove_crawler();
+ G_UNLOCK (crawler_array_lock);
+
+ create_crawler();
+ create_crawler();
+
+ return FALSE;
+}
+
+static void
+create_crawler (void)
+{
+ GSource *source = g_timeout_source_new (g_random_int_range (0, CRAWLER_TIMEOUT_RANGE));
+ g_source_set_callback (source, (GSourceFunc)crawler_callback, source, NULL);
+
+ G_LOCK (crawler_array_lock);
+ g_ptr_array_add (crawler_array, source);
+
+ g_mutex_lock (context_array_mutex);
+ g_source_attach (source, context_array->pdata[g_random_int_range (0, context_array->len)]);
+ g_source_unref (source);
+ g_mutex_unlock (context_array_mutex);
+
+ G_UNLOCK (crawler_array_lock);
+}
+
+static void
+cleanup_crawlers (GMainContext *context)
+{
+ gint i;
+
+ G_LOCK (crawler_array_lock);
+ for (i=0; i < crawler_array->len; i++)
+ {
+ if (g_source_get_context (crawler_array->pdata[i]) == context)
+ {
+ g_source_destroy (g_ptr_array_remove_index (crawler_array, i));
+ i--;
+ }
+ }
+ G_UNLOCK (crawler_array_lock);
+}
+
+static gboolean
+recurser_idle (gpointer data)
+{
+ GMainContext *context = data;
+ gint i;
+
+ for (i = 0; i < 10; i++)
+ g_main_context_iteration (context, FALSE);
+
+ return FALSE;
+}
+
+static gboolean
+recurser_start (gpointer data)
+{
+ GMainContext *context;
+ GSource *source;
+
+ g_mutex_lock (context_array_mutex);
+ context = context_array->pdata[g_random_int_range (0, context_array->len)];
+ source = g_idle_source_new ();
+ g_source_set_callback (source, recurser_idle, context, NULL);
+ g_source_attach (source, context);
+ g_source_unref (source);
+ g_mutex_unlock (context_array_mutex);
+
+ return TRUE;
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ /* Only run the test, if threads are enabled and a default thread
+ implementation is available */
+#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE)
+ gint i;
+
+ g_thread_init (NULL);
+
+ context_array = g_ptr_array_new ();
+ context_array_mutex = g_mutex_new ();
+ context_array_cond = g_cond_new ();
+
+ crawler_array = g_ptr_array_new ();
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+
+ for (i = 0; i < NTHREADS; i++)
+ create_adder_thread ();
+
+ /* Wait for all threads to start
+ */
+ g_mutex_lock (context_array_mutex);
+
+ if (context_array->len < NTHREADS)
+ g_cond_wait (context_array_cond, context_array_mutex);
+
+ g_mutex_unlock (context_array_mutex);
+
+ for (i = 0; i < NCRAWLERS; i++)
+ create_crawler ();
+
+ g_timeout_add (RECURSER_TIMEOUT, recurser_start, NULL);
+
+ g_main_loop_run (main_loop);
+ g_main_loop_unref (main_loop);
+
+#endif
+ return 0;
+}
diff --git a/trunk/tests/makefile.msc.in b/trunk/tests/makefile.msc.in
new file mode 100644
index 000000000..c1f426f5a
--- /dev/null
+++ b/trunk/tests/makefile.msc.in
@@ -0,0 +1,97 @@
+## Makefile for building the GLib test programs with Microsoft C
+## Use: nmake -f makefile.msc check
+
+TOP = ..\..
+
+!INCLUDE ..\build\win32\make.msc
+
+################################################################
+
+INCLUDES = -FImsvc_recommended_pragmas.h -I .. -I ..\glib -I ..\gmodule
+DEFINES = -DHAVE_CONFIG_H -DENABLE_REGEX
+
+NONAUTOMATIC_TESTS = \
+ testglib.exe \
+ testgdate.exe \
+ testgdateparser.exe \
+ unicode-normalize.exe \
+ unicode-collate.exe
+
+TESTS = \
+ atomic-test.exe \
+ array-test.exe \
+ asyncqueue-test.exe \
+ base64-test.exe \
+ bit-test.exe \
+ bookmarkfile-test.exe \
+ child-test.exe \
+ completion-test.exe \
+ convert-test.exe \
+ date-test.exe \
+ dirname-test.exe \
+ env-test.exe \
+ errorcheck-mutex-test.exe \
+ file-test.exe \
+ gio-test.exe \
+ iochannel-test.exe \
+ hash-test.exe \
+ keyfile-test.exe \
+ list-test.exe \
+ mainloop-test.exe \
+ mapping-test.exe \
+ markup-escape-test.exe \
+ markup-test.exe \
+#main? memchunks.exe \
+ module-test.exe \
+ node-test.exe \
+ option-test.exe \
+ patterntest.exe \
+ printf-test.exe \
+ queue-test.exe \
+ qsort-test.exe \
+ rand-test.exe \
+ regex-test.exe \
+ relation-test.exe \
+#_? sequence-test.exe \
+ shell-test.exe \
+ slice-color.exe \
+ slice-test.exe \
+ slist-test.exe \
+ spawn-test.exe \
+# strfunc-test doesn't compile with MSVC
+# strfunc-test.exe\
+ string-test.exe \
+# strtod-test doesn't either
+# strtod-test.exe \
+ thread-test.exe \
+ threadpool-test.exe\
+ tree-test.exe \
+ type-test.exe \
+ unicode-caseconv.exe \
+ unicode-encoding.exe \
+ utf8-validate.exe \
+ utf8-pointer.exe \
+ uri-test.exe \
+
+DLLS = \
+ libmoduletestplugin_a.dll \
+ libmoduletestplugin_b.dll
+
+all : $(TESTS) $(NONAUTOMATIC_TESTS) $(DLLS)
+
+.c.exe :
+ $(CC) $(CFLAGS) -c $<
+ $(CC) $(CFLAGS) -Fe$@ $< ..\glib\glib-2.0.lib ..\gmodule\gmodule-2.0.lib ..\gthread\gthread-2.0.lib $(LDFLAGS) user32.lib /subsystem:console
+
+slice-test.exe : memchunks.obj slice-test.obj
+ $(CC) $(CFLAGS) -Fe$@ memchunks.obj slice-test.obj \
+ ..\glib\glib-2.0.lib ..\gmodule\gmodule-2.0.lib ..\gthread\gthread-2.0.lib $(LDFLAGS) user32.lib /subsystem:console
+
+libmoduletestplugin_a.dll : libmoduletestplugin_a.obj
+ $(CC) $(CFLAGS) -LD libmoduletestplugin_a.obj ..\gmodule\gmodule-2.0.lib ..\glib\glib-2.0.lib $(LDFLAGS)
+
+libmoduletestplugin_b.dll : libmoduletestplugin_b.obj
+ $(CC) $(CFLAGS) -LD libmoduletestplugin_b.obj ..\gmodule\gmodule-2.0.lib ..\glib\glib-2.0.lib $(LDFLAGS)
+
+check: all
+ for %p in ($(TESTS)) do set PATH=..\glib;..\gmodule;..\gobject;..\gthread;%PATH% && %p
diff --git a/trunk/tests/mapping-test.c b/trunk/tests/mapping-test.c
new file mode 100644
index 000000000..1a10b190b
--- /dev/null
+++ b/trunk/tests/mapping-test.c
@@ -0,0 +1,256 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 2005 Matthias Clasen
+ *
+ * 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 "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <sys/types.h>
+#include <signal.h>
+
+#include "glib.h"
+#include "gstdio.h"
+
+static gchar *dir, *filename, *displayname, *childname;
+
+static gboolean stop = FALSE;
+
+#ifndef G_OS_WIN32
+
+static void
+handle_usr1 (int signum)
+{
+ stop = TRUE;
+}
+
+#endif
+
+static gboolean
+check_stop (gpointer data)
+{
+ GMainLoop *loop = data;
+
+#ifdef G_OS_WIN32
+ stop = g_file_test ("STOP", G_FILE_TEST_EXISTS);
+#endif
+
+ if (stop)
+ g_main_loop_quit (loop);
+
+ return TRUE;
+}
+
+static void
+write_or_die (const gchar *filename,
+ const gchar *contents,
+ gssize length)
+{
+ GError *error = NULL;
+ gchar *displayname;
+
+ if (!g_file_set_contents (filename, contents, length, &error))
+ {
+ displayname = g_filename_display_name (childname);
+ g_print ("failed to write '%s': %s\n",
+ displayname, error->message);
+ exit (1);
+ }
+}
+
+static GMappedFile *
+map_or_die (const gchar *filename,
+ gboolean writable)
+{
+ GError *error = NULL;
+ GMappedFile *map;
+ gchar *displayname;
+
+ map = g_mapped_file_new (filename, writable, &error);
+ if (!map)
+ {
+ displayname = g_filename_display_name (childname);
+ g_print ("failed to map '%s' non-writable, shared: %s\n",
+ displayname, error->message);
+ exit (1);
+ }
+
+ return map;
+}
+
+static int
+child_main (int argc, char *argv[])
+{
+ GMappedFile *map;
+ GMainLoop *loop;
+
+ map = map_or_die (filename, FALSE);
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+#ifndef G_OS_WIN32
+ signal (SIGUSR1, handle_usr1);
+#endif
+ g_idle_add (check_stop, loop);
+ g_main_loop_run (loop);
+
+ write_or_die (childname,
+ g_mapped_file_get_contents (map),
+ g_mapped_file_get_length (map));
+
+ return 0;
+}
+
+static void
+test_mapping (void)
+{
+ GMappedFile *map;
+
+ write_or_die (filename, "ABC", -1);
+
+ map = map_or_die (filename, FALSE);
+ g_assert (g_mapped_file_get_length (map) == 3);
+ g_mapped_file_free (map);
+
+ map = map_or_die (filename, TRUE);
+ g_assert (g_mapped_file_get_length (map) == 3);
+ g_mapped_file_free (map);
+}
+
+static void
+test_private (void)
+{
+ GError *error = NULL;
+ GMappedFile *map;
+ gchar *buffer;
+ gsize len;
+
+ write_or_die (filename, "ABC", -1);
+ map = map_or_die (filename, TRUE);
+
+ buffer = (gchar *)g_mapped_file_get_contents (map);
+ buffer[0] = '1';
+ buffer[1] = '2';
+ buffer[2] = '3';
+ g_mapped_file_free (map);
+
+ if (!g_file_get_contents (filename, &buffer, &len, &error))
+ {
+ g_print ("failed to read '%s': %s\n",
+ displayname, error->message);
+ exit (1);
+
+ }
+ g_assert (len == 3);
+ g_assert (strcmp (buffer, "ABC") == 0);
+ g_free (buffer);
+
+}
+
+static void
+test_child_private (gchar *argv0)
+{
+ GError *error = NULL;
+ GMappedFile *map;
+ gchar *buffer;
+ gsize len;
+ gchar *child_argv[3];
+ GPid child_pid;
+
+#ifdef G_OS_WIN32
+ g_remove ("STOP");
+ g_assert (!g_file_test ("STOP", G_FILE_TEST_EXISTS));
+#endif
+
+ write_or_die (filename, "ABC", -1);
+ map = map_or_die (filename, TRUE);
+
+ child_argv[0] = argv0;
+ child_argv[1] = "mapchild";
+ child_argv[2] = NULL;
+ if (!g_spawn_async (dir, child_argv, NULL,
+ 0, NULL, NULL, &child_pid, &error))
+ {
+ g_print ("failed to spawn child: %s\n",
+ error->message);
+ exit (1);
+ }
+
+ /* give the child some time to set up its mapping */
+ g_usleep (2000000);
+
+ buffer = (gchar *)g_mapped_file_get_contents (map);
+ buffer[0] = '1';
+ buffer[1] = '2';
+ buffer[2] = '3';
+ g_mapped_file_free (map);
+
+#ifndef G_OS_WIN32
+ kill (child_pid, SIGUSR1);
+#else
+ g_file_set_contents ("STOP", "Hey there\n", -1, NULL);
+#endif
+
+ /* give the child some time to write the file */
+ g_usleep (2000000);
+
+ if (!g_file_get_contents (childname, &buffer, &len, &error))
+ {
+ gchar *name;
+
+ name = g_filename_display_name (childname);
+ g_print ("failed to read '%s': %s\n", name, error->message);
+ exit (1);
+ }
+ g_assert (len == 3);
+ g_assert (strcmp (buffer, "ABC") == 0);
+ g_free (buffer);
+}
+
+static int
+parent_main (int argc,
+ char *argv[])
+{
+ /* test mapping with various flag combinations */
+ test_mapping ();
+
+ /* test private modification */
+ test_private ();
+
+ /* test multiple clients, non-shared */
+ test_child_private (argv[0]);
+
+ return 0;
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ dir = g_get_current_dir ();
+ filename = g_build_filename (dir, "maptest", NULL);
+ displayname = g_filename_display_name (filename);
+ childname = g_build_filename (dir, "mapchild", NULL);
+
+ if (argc > 1)
+ return child_main (argc, argv);
+ else
+ return parent_main (argc, argv);
+}
diff --git a/trunk/tests/markup-escape-test.c b/trunk/tests/markup-escape-test.c
new file mode 100644
index 000000000..667d4dc96
--- /dev/null
+++ b/trunk/tests/markup-escape-test.c
@@ -0,0 +1,95 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <stdarg.h>
+#include <string.h>
+#include <glib.h>
+
+static void test_format (const gchar *format,
+ const gchar *expected, ...) G_GNUC_PRINTF (1, 3);
+
+static gboolean error = FALSE;
+
+static void
+test (const gchar *original,
+ const gchar *expected)
+{
+ gchar *result = g_markup_escape_text (original, -1);
+
+ if (strcmp (result, expected) != 0)
+ {
+ g_printerr ("g_markup_escape_text(): expected '%s', got '%s'\n",
+ expected, result);
+ error = TRUE;
+ }
+
+ g_free (result);
+}
+
+static void
+test_format (const gchar *format,
+ const gchar *expected,
+ ...)
+{
+ gchar *result;
+
+ va_list args;
+
+ va_start (args, expected);
+ result = g_markup_vprintf_escaped (format, args);
+ va_end (args);
+
+ if (strcmp (result, expected) != 0)
+ {
+ g_printerr ("g_markup_printf_escaped(): expected '%s', got '%s'\n",
+ expected, result);
+ error = TRUE;
+ }
+
+ g_free (result);
+}
+
+int main (int argc, char **argv)
+{
+ /* Tests for g_markup_escape_text() */
+ test ("&", "&amp;");
+ test ("<", "&lt;");
+ test (">", "&gt;");
+ test ("'", "&apos;");
+ test ("\"", "&quot;");
+
+ test ("", "");
+ test ("A", "A");
+ test ("A&", "A&amp;");
+ test ("&A", "&amp;A");
+ test ("A&A", "A&amp;A");
+ test ("&&A", "&amp;&amp;A");
+ test ("A&&", "A&amp;&amp;");
+ test ("A&&A", "A&amp;&amp;A");
+ test ("A&A&A", "A&amp;A&amp;A");
+
+ /* Tests for g_markup_printf_escaped() */
+ test_format ("A", "A");
+ test_format ("A%s", "A&amp;", "&");
+ test_format ("%sA", "&amp;A", "&");
+ test_format ("A%sA", "A&amp;A", "&");
+ test_format ("%s%sA", "&amp;&amp;A", "&", "&");
+ test_format ("A%s%s", "A&amp;&amp;", "&", "&");
+ test_format ("A%s%sA", "A&amp;&amp;A", "&", "&");
+ test_format ("A%sA%sA", "A&amp;A&amp;A", "&", "&");
+
+ test_format ("%s", "&lt;B&gt;&amp;",
+ "<B>&");
+ test_format ("%c%c", "&lt;&amp;",
+ '<', '&');
+ test_format (".%c.%c.", ".&lt;.&amp;.",
+ '<', '&');
+ test_format ("%s", "",
+ "");
+ test_format ("%-5s", "A ",
+ "A");
+ test_format ("%2$s%1$s", "B.A.",
+ "A.", "B.");
+
+ return error ? 1 : 0;
+}
diff --git a/trunk/tests/markup-test.c b/trunk/tests/markup-test.c
new file mode 100644
index 000000000..6d5f44b65
--- /dev/null
+++ b/trunk/tests/markup-test.c
@@ -0,0 +1,214 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <stdio.h>
+#include <glib.h>
+
+static int depth = 0;
+
+static void
+indent (int extra)
+{
+ int i = 0;
+ while (i < depth)
+ {
+ fputs (" ", stdout);
+ ++i;
+ }
+}
+
+static void
+start_element_handler (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ gpointer user_data,
+ GError **error)
+{
+ int i;
+
+ indent (0);
+ printf ("ELEMENT '%s'\n", element_name);
+
+ i = 0;
+ while (attribute_names[i] != NULL)
+ {
+ indent (1);
+
+ printf ("%s=\"%s\"\n",
+ attribute_names[i],
+ attribute_values[i]);
+
+ ++i;
+ }
+
+ ++depth;
+}
+
+static void
+end_element_handler (GMarkupParseContext *context,
+ const gchar *element_name,
+ gpointer user_data,
+ GError **error)
+{
+ --depth;
+ indent (0);
+ printf ("END '%s'\n", element_name);
+ }
+
+static void
+text_handler (GMarkupParseContext *context,
+ const gchar *text,
+ gsize text_len,
+ gpointer user_data,
+ GError **error)
+{
+ indent (0);
+ printf ("TEXT '%.*s'\n", (int)text_len, text);
+}
+
+
+static void
+passthrough_handler (GMarkupParseContext *context,
+ const gchar *passthrough_text,
+ gsize text_len,
+ gpointer user_data,
+ GError **error)
+{
+ indent (0);
+
+ printf ("PASS '%.*s'\n", (int)text_len, passthrough_text);
+}
+
+static void
+error_handler (GMarkupParseContext *context,
+ GError *error,
+ gpointer user_data)
+{
+ fprintf (stderr, " %s\n", error->message);
+}
+
+static const GMarkupParser parser = {
+ start_element_handler,
+ end_element_handler,
+ text_handler,
+ passthrough_handler,
+ error_handler
+};
+
+static const GMarkupParser silent_parser = {
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ error_handler
+};
+
+static int
+test_in_chunks (const gchar *contents,
+ gint length,
+ gint chunk_size)
+{
+ GMarkupParseContext *context;
+ int i = 0;
+
+ context = g_markup_parse_context_new (&silent_parser, 0, NULL, NULL);
+
+ while (i < length)
+ {
+ int this_chunk = MIN (length - i, chunk_size);
+
+ if (!g_markup_parse_context_parse (context,
+ contents + i,
+ this_chunk,
+ NULL))
+ {
+ g_markup_parse_context_free (context);
+ return 1;
+ }
+
+ i += this_chunk;
+ }
+
+ if (!g_markup_parse_context_end_parse (context, NULL))
+ {
+ g_markup_parse_context_free (context);
+ return 1;
+ }
+
+ g_markup_parse_context_free (context);
+
+ return 0;
+}
+
+static int
+test_file (const gchar *filename)
+{
+ gchar *contents;
+ gsize length;
+ GError *error;
+ GMarkupParseContext *context;
+
+ error = NULL;
+ if (!g_file_get_contents (filename,
+ &contents,
+ &length,
+ &error))
+ {
+ fprintf (stderr, "%s\n", error->message);
+ g_error_free (error);
+ return 1;
+ }
+
+ context = g_markup_parse_context_new (&parser, 0, NULL, NULL);
+
+ if (!g_markup_parse_context_parse (context, contents, length, NULL))
+ {
+ g_markup_parse_context_free (context);
+ return 1;
+ }
+
+ if (!g_markup_parse_context_end_parse (context, NULL))
+ {
+ g_markup_parse_context_free (context);
+ return 1;
+ }
+
+ g_markup_parse_context_free (context);
+
+ /* A byte at a time */
+ if (test_in_chunks (contents, length, 1) != 0)
+ return 1;
+
+ /* 2 bytes */
+ if (test_in_chunks (contents, length, 2) != 0)
+ return 1;
+
+ /*5 bytes */
+ if (test_in_chunks (contents, length, 5) != 0)
+ return 1;
+
+ /* 12 bytes */
+ if (test_in_chunks (contents, length, 12) != 0)
+ return 1;
+
+ /* 1024 bytes */
+ if (test_in_chunks (contents, length, 1024) != 0)
+ return 1;
+
+ return 0;
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ if (argc > 1)
+ return test_file (argv[1]);
+ else
+ {
+ fprintf (stderr, "Give a markup file on the command line\n");
+ return 1;
+ }
+}
+
diff --git a/trunk/tests/markups/expected-1 b/trunk/tests/markups/expected-1
new file mode 100644
index 000000000..8b6cdd77c
--- /dev/null
+++ b/trunk/tests/markups/expected-1
@@ -0,0 +1,37 @@
+PASS '<!-- Comment -->'
+PASS '<?PI ?>'
+ELEMENT 'foobar'
+ TEXT '
+'
+ ELEMENT 'e1'
+ TEXT 'Hi & this is some text inside an element Two 'E' chars as character refs: E E and some 'J': J J'
+ END 'e1'
+ TEXT '
+'
+ ELEMENT 'e2:foo'
+ TEXT ' Text '
+ ELEMENT 'childfree'
+ END 'childfree'
+ TEXT ' with some '
+ ELEMENT 'nested'
+ TEXT 'nested elements'
+ END 'nested'
+ TEXT ' and entities "& < >> ' and whitespace '
+ END 'e2:foo'
+ TEXT '
+'
+ ELEMENT 'tag'
+ ab="fo<o"
+ bar="foo"
+ baz="blah"
+ TEXT 'This element has attributes'
+ END 'tag'
+ TEXT '
+'
+ ELEMENT 'nochildren'
+ a="b"
+ xyz="qrs"
+ END 'nochildren'
+ TEXT '
+'
+END 'foobar'
diff --git a/trunk/tests/markups/expected-10 b/trunk/tests/markups/expected-10
new file mode 100644
index 000000000..e7b8af84b
--- /dev/null
+++ b/trunk/tests/markups/expected-10
@@ -0,0 +1,6 @@
+ELEMENT 'foo'
+bar="baz"
+bar2="baz2"
+bar3="baz3"
+ TEXT 'data'
+END 'foo'
diff --git a/trunk/tests/markups/expected-11 b/trunk/tests/markups/expected-11
new file mode 100644
index 000000000..781039429
--- /dev/null
+++ b/trunk/tests/markups/expected-11
@@ -0,0 +1,3 @@
+ELEMENT 'foo'
+ TEXT 'data'
+END 'foo'
diff --git a/trunk/tests/markups/expected-2 b/trunk/tests/markups/expected-2
new file mode 100644
index 000000000..82a531ad6
--- /dev/null
+++ b/trunk/tests/markups/expected-2
@@ -0,0 +1,51 @@
+ELEMENT 'foobar'
+ TEXT '
+Παν語
+
+This is a list of ways to say hello in various languages. Its purpose is to illustrate a number of scripts.
+
+(Converted into UTF-8)
+
+---------------------------------------------------------
+Arabic السلام عليكم
+Czech (česky) Dobrý den
+Danish (Dansk) Hej, Goddag
+English Hello
+Esperanto Saluton
+Estonian Tere, Tervist
+FORTRAN PROGRAM
+Finnish (Suomi) Hei
+French (Français) Bonjour, Salut
+German (Deutsch Nord) Guten Tag
+German (Deutsch Süd) Grüß Gott
+Greek (Ελληνικά) Γειά σας
+Hebrew שלום
+Hindi नमस्ते, नमस्कार।
+Italiano Ciao, Buon giorno
+Maltese Ċaw, Saħħa
+Nederlands, Vlaams Hallo, Dag
+Norwegian (Norsk) Hei, God dag
+Polish Dzień dobry, Hej
+Russian (Русский) Здравствуйте!‎
+Slovak Dobrý deň
+Spanish (Español) ‎¡Hola!‎
+Swedish (Svenska) Hej, Goddag
+Thai (ภาษาไทย) สวัสดีครับ, สวัสดีค่ะ
+Turkish (Türkçe) Merhaba
+Vietnamese (Tiếng Việt) Xin Chào
+Yiddish (ײַדישע) דאָס הײַזעלע
+
+Japanese (日本語) こんにちは, コンニチハ
+Chinese (中文,普通话,汉语) 你好
+Cantonese (粵語,廣東話) 早晨, 你好
+Korean (한글) 안녕하세요, 안녕하십니까
+
+Difference among chinese characters in GB, JIS, KSC, BIG5:‎
+ GB -- 元气 开发
+ JIS -- 元気 開発
+ KSC -- 元氣 開發
+ BIG5 -- 元氣 開發
+
+
+'
+END 'foobar'
diff --git a/trunk/tests/markups/expected-3 b/trunk/tests/markups/expected-3
new file mode 100644
index 000000000..9b4465347
--- /dev/null
+++ b/trunk/tests/markups/expected-3
@@ -0,0 +1,61 @@
+ELEMENT 'foo'
+ TEXT '
+'
+ ELEMENT 'bar'
+ a="1"
+ END 'bar'
+ TEXT '
+'
+ ELEMENT 'bar'
+ a="1"
+ b="2"
+ END 'bar'
+ TEXT '
+'
+ ELEMENT 'bar'
+ a="1"
+ b="2"
+ c="3"
+ END 'bar'
+ TEXT '
+'
+ ELEMENT 'bar'
+ a="1"
+ b="2"
+ c="3"
+ d="4"
+ END 'bar'
+ TEXT '
+'
+ ELEMENT 'bar'
+ a="1"
+ b="2"
+ c="3"
+ d="4"
+ e="5"
+ END 'bar'
+ TEXT '
+'
+ ELEMENT 'bar'
+ a="1"
+ b="2"
+ c="3"
+ d="4"
+ e="5"
+ f="6"
+ END 'bar'
+ TEXT '
+'
+ ELEMENT 'bar'
+ a="1"
+ b="2"
+ c="3"
+ END 'bar'
+ TEXT '
+'
+ ELEMENT 'bar'
+ a="1"
+ END 'bar'
+ TEXT '
+'
+END 'foo'
diff --git a/trunk/tests/markups/expected-4 b/trunk/tests/markups/expected-4
new file mode 100644
index 000000000..395f453b7
--- /dev/null
+++ b/trunk/tests/markups/expected-4
@@ -0,0 +1,29 @@
+ELEMENT 'foo'
+ TEXT '
+'
+ ELEMENT 'bar'
+ a="1"
+ END 'bar'
+ TEXT '
+'
+ ELEMENT 'bar'
+ a="2"
+ END 'bar'
+ TEXT '
+'
+ ELEMENT 'bar'
+ a="3""
+ END 'bar'
+ TEXT '
+'
+ ELEMENT 'bar'
+ a="4'"
+ END 'bar'
+ TEXT '
+'
+ ELEMENT 'bar'
+ a="5''''"
+ END 'bar'
+ TEXT '
+'
+END 'foo'
diff --git a/trunk/tests/markups/expected-5 b/trunk/tests/markups/expected-5
new file mode 100644
index 000000000..12d05c895
--- /dev/null
+++ b/trunk/tests/markups/expected-5
@@ -0,0 +1,4 @@
+PASS '<?xml version="1.0" ?>'
+ELEMENT 'foo'
+ TEXT ''
+END 'foo'
diff --git a/trunk/tests/markups/expected-6 b/trunk/tests/markups/expected-6
new file mode 100644
index 000000000..bfb41cefc
--- /dev/null
+++ b/trunk/tests/markups/expected-6
@@ -0,0 +1,6 @@
+PASS '<!DOCTYPE foo "foo" [
+<!ELEMENT foo ANY >
+]>'
+ELEMENT 'foo'
+ TEXT ''
+END 'foo'
diff --git a/trunk/tests/markups/expected-7 b/trunk/tests/markups/expected-7
new file mode 100644
index 000000000..2fe197564
--- /dev/null
+++ b/trunk/tests/markups/expected-7
@@ -0,0 +1,4 @@
+PASS '<!-- a comment -->'
+ELEMENT 'foo'
+ TEXT ''
+END 'foo'
diff --git a/trunk/tests/markups/expected-8 b/trunk/tests/markups/expected-8
new file mode 100644
index 000000000..5bbda0421
--- /dev/null
+++ b/trunk/tests/markups/expected-8
@@ -0,0 +1,5 @@
+ELEMENT 'foo'
+ TEXT ''
+ PASS '<![CDATA[ some <<<<>>>> CDATA ]]>'
+ TEXT ''
+END 'foo'
diff --git a/trunk/tests/markups/expected-9 b/trunk/tests/markups/expected-9
new file mode 100644
index 000000000..781039429
--- /dev/null
+++ b/trunk/tests/markups/expected-9
@@ -0,0 +1,3 @@
+ELEMENT 'foo'
+ TEXT 'data'
+END 'foo'
diff --git a/trunk/tests/markups/fail-1.gmarkup b/trunk/tests/markups/fail-1.gmarkup
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/trunk/tests/markups/fail-1.gmarkup
diff --git a/trunk/tests/markups/fail-10.gmarkup b/trunk/tests/markups/fail-10.gmarkup
new file mode 100644
index 000000000..fe16558d2
--- /dev/null
+++ b/trunk/tests/markups/fail-10.gmarkup
@@ -0,0 +1,2 @@
+<foo>
+</|foo> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-11.gmarkup b/trunk/tests/markups/fail-11.gmarkup
new file mode 100644
index 000000000..216f40ccf
--- /dev/null
+++ b/trunk/tests/markups/fail-11.gmarkup
@@ -0,0 +1,4 @@
+<foo>
+<bar>
+</foo>
+</bar> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-12.gmarkup b/trunk/tests/markups/fail-12.gmarkup
new file mode 100644
index 000000000..a64029968
--- /dev/null
+++ b/trunk/tests/markups/fail-12.gmarkup
@@ -0,0 +1 @@
+</foo> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-13.gmarkup b/trunk/tests/markups/fail-13.gmarkup
new file mode 100644
index 000000000..a71928806
--- /dev/null
+++ b/trunk/tests/markups/fail-13.gmarkup
@@ -0,0 +1 @@
+</foo|> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-14.gmarkup b/trunk/tests/markups/fail-14.gmarkup
new file mode 100644
index 000000000..ed52a60c2
--- /dev/null
+++ b/trunk/tests/markups/fail-14.gmarkup
@@ -0,0 +1,2 @@
+<foo>
+< \ No newline at end of file
diff --git a/trunk/tests/markups/fail-15.gmarkup b/trunk/tests/markups/fail-15.gmarkup
new file mode 100644
index 000000000..c3b59e0d7
--- /dev/null
+++ b/trunk/tests/markups/fail-15.gmarkup
@@ -0,0 +1,3 @@
+<foo>
+<bar>
+</bar> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-16.gmarkup b/trunk/tests/markups/fail-16.gmarkup
new file mode 100644
index 000000000..20f0148d3
--- /dev/null
+++ b/trunk/tests/markups/fail-16.gmarkup
@@ -0,0 +1 @@
+<foo/ \ No newline at end of file
diff --git a/trunk/tests/markups/fail-17.gmarkup b/trunk/tests/markups/fail-17.gmarkup
new file mode 100644
index 000000000..9f4093ee6
--- /dev/null
+++ b/trunk/tests/markups/fail-17.gmarkup
@@ -0,0 +1 @@
+<fo \ No newline at end of file
diff --git a/trunk/tests/markups/fail-18.gmarkup b/trunk/tests/markups/fail-18.gmarkup
new file mode 100644
index 000000000..e9d02b30e
--- /dev/null
+++ b/trunk/tests/markups/fail-18.gmarkup
@@ -0,0 +1 @@
+<foo bar \ No newline at end of file
diff --git a/trunk/tests/markups/fail-19.gmarkup b/trunk/tests/markups/fail-19.gmarkup
new file mode 100644
index 000000000..a253adf46
--- /dev/null
+++ b/trunk/tests/markups/fail-19.gmarkup
@@ -0,0 +1 @@
+<foo \ No newline at end of file
diff --git a/trunk/tests/markups/fail-2.gmarkup b/trunk/tests/markups/fail-2.gmarkup
new file mode 100644
index 000000000..c7e4a54df
--- /dev/null
+++ b/trunk/tests/markups/fail-2.gmarkup
@@ -0,0 +1 @@
+ν語
diff --git a/trunk/tests/markups/fail-20.gmarkup b/trunk/tests/markups/fail-20.gmarkup
new file mode 100644
index 000000000..39fcbad3a
--- /dev/null
+++ b/trunk/tests/markups/fail-20.gmarkup
@@ -0,0 +1 @@
+<foo bar= \ No newline at end of file
diff --git a/trunk/tests/markups/fail-21.gmarkup b/trunk/tests/markups/fail-21.gmarkup
new file mode 100644
index 000000000..7ae8c6e9a
--- /dev/null
+++ b/trunk/tests/markups/fail-21.gmarkup
@@ -0,0 +1 @@
+<foo bar="fdsf \ No newline at end of file
diff --git a/trunk/tests/markups/fail-22.gmarkup b/trunk/tests/markups/fail-22.gmarkup
new file mode 100644
index 000000000..9e20df031
--- /dev/null
+++ b/trunk/tests/markups/fail-22.gmarkup
@@ -0,0 +1 @@
+<foo> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-23.gmarkup b/trunk/tests/markups/fail-23.gmarkup
new file mode 100644
index 000000000..b57a25b05
--- /dev/null
+++ b/trunk/tests/markups/fail-23.gmarkup
@@ -0,0 +1,2 @@
+<foo>
+<fo \ No newline at end of file
diff --git a/trunk/tests/markups/fail-24.gmarkup b/trunk/tests/markups/fail-24.gmarkup
new file mode 100644
index 000000000..778547fb8
--- /dev/null
+++ b/trunk/tests/markups/fail-24.gmarkup
@@ -0,0 +1 @@
+<!-- dfklsjdf;kljsdf;ljk document ends here \ No newline at end of file
diff --git a/trunk/tests/markups/fail-25.gmarkup b/trunk/tests/markups/fail-25.gmarkup
new file mode 100644
index 000000000..a3674e622
--- /dev/null
+++ b/trunk/tests/markups/fail-25.gmarkup
@@ -0,0 +1 @@
+<? document ending unexpectedly \ No newline at end of file
diff --git a/trunk/tests/markups/fail-26.gmarkup b/trunk/tests/markups/fail-26.gmarkup
new file mode 100644
index 000000000..10e01505a
--- /dev/null
+++ b/trunk/tests/markups/fail-26.gmarkup
@@ -0,0 +1 @@
+<foo>&;</foo> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-27.gmarkup b/trunk/tests/markups/fail-27.gmarkup
new file mode 100644
index 000000000..ab00615bf
--- /dev/null
+++ b/trunk/tests/markups/fail-27.gmarkup
@@ -0,0 +1 @@
+<foo>&|;</foo> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-28.gmarkup b/trunk/tests/markups/fail-28.gmarkup
new file mode 100644
index 000000000..3baf17202
--- /dev/null
+++ b/trunk/tests/markups/fail-28.gmarkup
@@ -0,0 +1 @@
+<foo>&am|;</foo> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-29.gmarkup b/trunk/tests/markups/fail-29.gmarkup
new file mode 100644
index 000000000..4e6912fad
--- /dev/null
+++ b/trunk/tests/markups/fail-29.gmarkup
@@ -0,0 +1 @@
+<foo>&bar;</foo> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-3.gmarkup b/trunk/tests/markups/fail-3.gmarkup
new file mode 100644
index 000000000..0eba18ab3
--- /dev/null
+++ b/trunk/tests/markups/fail-3.gmarkup
@@ -0,0 +1,49 @@
+<foobar>
+Παν語
+
+This is a list of ways to say hello in various languages. Its purpose is to illustrate a number of scripts.
+
+(Converted into UTF-8)
+
+---------------------------------------------------------
+Arabic السلام عليكم
+Czech (česky) Dobrý den
+Danish (Dansk) Hej, Goddag
+English Hello
+Esperanto Saluton
+Estonian Tere, Tervist
+FORTRAN PROGRAM
+Finnish (Suomi) Hei
+French (Français) Bonjour, Salut
+German (Deutsch Nord) Guten Tag
+German (Deutsch Süd) Grüß Gott
+Greek (Ελληνικά) Γειά σας
+Hebrew שלום
+Hindi नमस्ते, मस्कार।
+Italiano Ciao, Buon giorno
+Maltese Ċaw, Saħħa
+Nederlands, Vlaams Hallo, Dag
+Norwegian (Norsk) Hei, God dag
+Polish Dzień dobry, Hej
+Russian (Русский) Здравствуйте!‎
+Slovak Dobrý deň
+Spanish (Español) ‎¡Hola!‎
+Swedish (Svenska) Hej, Goddag
+Thai (ภาษาไทย) สวัสดีครับ, สวัสดีค่ะ
+Turkish (Türkçe) Merhaba
+Vietnamese (Tiếng Việt) Xin Chào
+Yiddish (ײַדישע) דאָס הײַזעלע
+
+Japanese (日本語) こんにちは, コンニチハ
+Chinese (中文,普通话,汉语) 你好
+Cantonese (粵語,廣東話) 早晨, 你好
+Korean (한글) 안녕하세요, 안녕하십니까
+
+Difference among chinese characters in GB, JIS, KSC, BIG5:‎
+ GB -- 元气 开发
+ JIS -- 元気 開発
+ KSC -- 元氣 開發
+ BIG5 -- 元氣 開發
+
+
+</foobar> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-30.gmarkup b/trunk/tests/markups/fail-30.gmarkup
new file mode 100644
index 000000000..c8968a808
--- /dev/null
+++ b/trunk/tests/markups/fail-30.gmarkup
@@ -0,0 +1 @@
+<foo>&sdfkljsdsdfsdfsdfsdf</foo>
diff --git a/trunk/tests/markups/fail-31.gmarkup b/trunk/tests/markups/fail-31.gmarkup
new file mode 100644
index 000000000..cde190d7a
--- /dev/null
+++ b/trunk/tests/markups/fail-31.gmarkup
@@ -0,0 +1 @@
+<foo>&#34592348345343453453455645765736575865767;</foo> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-32.gmarkup b/trunk/tests/markups/fail-32.gmarkup
new file mode 100644
index 000000000..e965f65f7
--- /dev/null
+++ b/trunk/tests/markups/fail-32.gmarkup
@@ -0,0 +1 @@
+<foo>&#x10;</foo> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-33.gmarkup b/trunk/tests/markups/fail-33.gmarkup
new file mode 100644
index 000000000..2cc33f497
--- /dev/null
+++ b/trunk/tests/markups/fail-33.gmarkup
@@ -0,0 +1 @@
+<foo>&#;</foo> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-34.gmarkup b/trunk/tests/markups/fail-34.gmarkup
new file mode 100644
index 000000000..f5523e41a
--- /dev/null
+++ b/trunk/tests/markups/fail-34.gmarkup
@@ -0,0 +1 @@
+<foo>&#234234</foo> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-35.gmarkup b/trunk/tests/markups/fail-35.gmarkup
new file mode 100644
index 000000000..d7f35120a
--- /dev/null
+++ b/trunk/tests/markups/fail-35.gmarkup
@@ -0,0 +1 @@
+<foo>gedit&</foo>
diff --git a/trunk/tests/markups/fail-36.gmarkup b/trunk/tests/markups/fail-36.gmarkup
new file mode 100644
index 000000000..110ce48bb
--- /dev/null
+++ b/trunk/tests/markups/fail-36.gmarkup
Binary files differ
diff --git a/trunk/tests/markups/fail-37.gmarkup b/trunk/tests/markups/fail-37.gmarkup
new file mode 100644
index 000000000..95b7155f2
--- /dev/null
+++ b/trunk/tests/markups/fail-37.gmarkup
@@ -0,0 +1 @@
+< foo>
diff --git a/trunk/tests/markups/fail-38.gmarkup b/trunk/tests/markups/fail-38.gmarkup
new file mode 100644
index 000000000..b7d37df8d
--- /dev/null
+++ b/trunk/tests/markups/fail-38.gmarkup
@@ -0,0 +1 @@
+<foo>data< /foo>
diff --git a/trunk/tests/markups/fail-39.gmarkup b/trunk/tests/markups/fail-39.gmarkup
new file mode 100644
index 000000000..7cf2e2a27
--- /dev/null
+++ b/trunk/tests/markups/fail-39.gmarkup
@@ -0,0 +1 @@
+<foo>data</ foo>
diff --git a/trunk/tests/markups/fail-4.gmarkup b/trunk/tests/markups/fail-4.gmarkup
new file mode 100644
index 000000000..191028156
--- /dev/null
+++ b/trunk/tests/markups/fail-4.gmarkup
@@ -0,0 +1 @@
+foo \ No newline at end of file
diff --git a/trunk/tests/markups/fail-40.gmarkup b/trunk/tests/markups/fail-40.gmarkup
new file mode 100644
index 000000000..f4c1a7025
--- /dev/null
+++ b/trunk/tests/markups/fail-40.gmarkup
@@ -0,0 +1 @@
+<bla>&unknownentityname;</bla>
diff --git a/trunk/tests/markups/fail-5.gmarkup b/trunk/tests/markups/fail-5.gmarkup
new file mode 100644
index 000000000..41d8a3e11
--- /dev/null
+++ b/trunk/tests/markups/fail-5.gmarkup
@@ -0,0 +1,2 @@
+<|foo>
+</|foo>
diff --git a/trunk/tests/markups/fail-6.gmarkup b/trunk/tests/markups/fail-6.gmarkup
new file mode 100644
index 000000000..4c63568bc
--- /dev/null
+++ b/trunk/tests/markups/fail-6.gmarkup
@@ -0,0 +1,2 @@
+<foo|>
+</foo> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-7.gmarkup b/trunk/tests/markups/fail-7.gmarkup
new file mode 100644
index 000000000..5585bd630
--- /dev/null
+++ b/trunk/tests/markups/fail-7.gmarkup
@@ -0,0 +1,2 @@
+<foo bar}"baz">
+</foo> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-8.gmarkup b/trunk/tests/markups/fail-8.gmarkup
new file mode 100644
index 000000000..b355951fb
--- /dev/null
+++ b/trunk/tests/markups/fail-8.gmarkup
@@ -0,0 +1,2 @@
+<foo/}>
+</foo> \ No newline at end of file
diff --git a/trunk/tests/markups/fail-9.gmarkup b/trunk/tests/markups/fail-9.gmarkup
new file mode 100644
index 000000000..edd559685
--- /dev/null
+++ b/trunk/tests/markups/fail-9.gmarkup
@@ -0,0 +1,2 @@
+<foo bar={baz">
+</foo> \ No newline at end of file
diff --git a/trunk/tests/markups/valid-1.gmarkup b/trunk/tests/markups/valid-1.gmarkup
new file mode 100644
index 000000000..6745c5ca6
--- /dev/null
+++ b/trunk/tests/markups/valid-1.gmarkup
@@ -0,0 +1,9 @@
+ <!-- Comment -->
+<?PI ?>
+<foobar>
+<e1>Hi &amp; this is some text inside an element Two 'E' chars as character refs: &#69; &#x45; and some 'J': &#74; &#x4A;</e1>
+<e2:foo> Text <childfree/> with some <nested>nested elements</nested> and entities &quot;&amp; &lt; &gt;&gt; &apos; and whitespace </e2:foo>
+<tag ab="fo&lt;o" bar="foo" baz="blah">This element has attributes</tag>
+<nochildren a="b" xyz="qrs"/>
+</foobar>
+ \ No newline at end of file
diff --git a/trunk/tests/markups/valid-10.gmarkup b/trunk/tests/markups/valid-10.gmarkup
new file mode 100644
index 000000000..cbeb68e43
--- /dev/null
+++ b/trunk/tests/markups/valid-10.gmarkup
@@ -0,0 +1,6 @@
+<foo
+ bar="baz"
+bar2 = "baz2"
+bar3 =
+"baz3"
+>data</foo>
diff --git a/trunk/tests/markups/valid-11.gmarkup b/trunk/tests/markups/valid-11.gmarkup
new file mode 100644
index 000000000..fe1cc4e73
--- /dev/null
+++ b/trunk/tests/markups/valid-11.gmarkup
@@ -0,0 +1,2 @@
+<foo
+>data</foo>
diff --git a/trunk/tests/markups/valid-2.gmarkup b/trunk/tests/markups/valid-2.gmarkup
new file mode 100644
index 000000000..4a3fa6939
--- /dev/null
+++ b/trunk/tests/markups/valid-2.gmarkup
@@ -0,0 +1,49 @@
+<foobar>
+Παν語
+
+This is a list of ways to say hello in various languages. Its purpose is to illustrate a number of scripts.
+
+(Converted into UTF-8)
+
+---------------------------------------------------------
+Arabic السلام عليكم
+Czech (česky) Dobrý den
+Danish (Dansk) Hej, Goddag
+English Hello
+Esperanto Saluton
+Estonian Tere, Tervist
+FORTRAN PROGRAM
+Finnish (Suomi) Hei
+French (Français) Bonjour, Salut
+German (Deutsch Nord) Guten Tag
+German (Deutsch Süd) Grüß Gott
+Greek (Ελληνικά) Γειά σας
+Hebrew שלום
+Hindi नमस्ते, नमस्कार।
+Italiano Ciao, Buon giorno
+Maltese Ċaw, Saħħa
+Nederlands, Vlaams Hallo, Dag
+Norwegian (Norsk) Hei, God dag
+Polish Dzień dobry, Hej
+Russian (Русский) Здравствуйте!‎
+Slovak Dobrý deň
+Spanish (Español) ‎¡Hola!‎
+Swedish (Svenska) Hej, Goddag
+Thai (ภาษาไทย) สวัสดีครับ, สวัสดีค่ะ
+Turkish (Türkçe) Merhaba
+Vietnamese (Tiếng Việt) Xin Chào
+Yiddish (ײַדישע) דאָס הײַזעלע
+
+Japanese (日本語) こんにちは, コンニチハ
+Chinese (中文,普通话,汉语) 你好
+Cantonese (粵語,廣東話) 早晨, 你好
+Korean (한글) 안녕하세요, 안녕하십니까
+
+Difference among chinese characters in GB, JIS, KSC, BIG5:‎
+ GB -- 元气 开发
+ JIS -- 元気 開発
+ KSC -- 元氣 開發
+ BIG5 -- 元氣 開發
+
+
+</foobar> \ No newline at end of file
diff --git a/trunk/tests/markups/valid-3.gmarkup b/trunk/tests/markups/valid-3.gmarkup
new file mode 100644
index 000000000..aed984e2f
--- /dev/null
+++ b/trunk/tests/markups/valid-3.gmarkup
@@ -0,0 +1,10 @@
+<foo>
+<bar a="1"/>
+<bar a="1" b="2"/>
+<bar a="1" b="2" c="3"/>
+<bar a="1" b="2" c="3" d="4"/>
+<bar a="1" b="2" c="3" d="4" e="5"/>
+<bar a="1" b="2" c="3" d="4" e="5" f="6"/>
+<bar a="1" b="2" c="3"/>
+<bar a="1"/>
+</foo>
diff --git a/trunk/tests/markups/valid-4.gmarkup b/trunk/tests/markups/valid-4.gmarkup
new file mode 100644
index 000000000..20361623f
--- /dev/null
+++ b/trunk/tests/markups/valid-4.gmarkup
@@ -0,0 +1,8 @@
+<foo>
+<bar a='1'/>
+<bar a="2"/>
+<bar a='3"'/>
+<bar a="4'"/>
+<bar a="5''''"/>
+</foo>
+
diff --git a/trunk/tests/markups/valid-5.gmarkup b/trunk/tests/markups/valid-5.gmarkup
new file mode 100644
index 000000000..3b861de5a
--- /dev/null
+++ b/trunk/tests/markups/valid-5.gmarkup
@@ -0,0 +1,2 @@
+<?xml version="1.0" ?>
+<foo></foo>
diff --git a/trunk/tests/markups/valid-6.gmarkup b/trunk/tests/markups/valid-6.gmarkup
new file mode 100644
index 000000000..d7c065a32
--- /dev/null
+++ b/trunk/tests/markups/valid-6.gmarkup
@@ -0,0 +1,4 @@
+<!DOCTYPE foo "foo" [
+<!ELEMENT foo ANY >
+]>
+<foo></foo>
diff --git a/trunk/tests/markups/valid-7.gmarkup b/trunk/tests/markups/valid-7.gmarkup
new file mode 100644
index 000000000..832445d6d
--- /dev/null
+++ b/trunk/tests/markups/valid-7.gmarkup
@@ -0,0 +1,2 @@
+<!-- a comment -->
+<foo></foo>
diff --git a/trunk/tests/markups/valid-8.gmarkup b/trunk/tests/markups/valid-8.gmarkup
new file mode 100644
index 000000000..a75aee055
--- /dev/null
+++ b/trunk/tests/markups/valid-8.gmarkup
@@ -0,0 +1 @@
+<foo><![CDATA[ some <<<<>>>> CDATA ]]></foo>
diff --git a/trunk/tests/markups/valid-9.gmarkup b/trunk/tests/markups/valid-9.gmarkup
new file mode 100644
index 000000000..90a99a042
--- /dev/null
+++ b/trunk/tests/markups/valid-9.gmarkup
@@ -0,0 +1,2 @@
+<foo>data</foo
+>
diff --git a/trunk/tests/memchunks.c b/trunk/tests/memchunks.c
new file mode 100644
index 000000000..7a08de0d2
--- /dev/null
+++ b/trunk/tests/memchunks.c
@@ -0,0 +1,612 @@
+/* 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 "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+
+#include "glib.h"
+
+/* notes on macros:
+ * if ENABLE_GC_FRIENDLY is defined, freed memory should be 0-wiped.
+ */
+
+#define MEM_PROFILE_TABLE_SIZE 4096
+
+#define MEM_AREA_SIZE 4L
+
+static guint mem_chunk_recursion = 0;
+# define MEM_CHUNK_ROUTINE_COUNT() (mem_chunk_recursion)
+# define ENTER_MEM_CHUNK_ROUTINE() (mem_chunk_recursion = MEM_CHUNK_ROUTINE_COUNT () + 1)
+# define LEAVE_MEM_CHUNK_ROUTINE() (mem_chunk_recursion = MEM_CHUNK_ROUTINE_COUNT () - 1)
+
+/* --- old memchunk prototypes --- */
+void old_mem_chunks_init (void);
+GMemChunk* old_mem_chunk_new (const gchar *name,
+ gint atom_size,
+ gulong area_size,
+ gint type);
+void old_mem_chunk_destroy (GMemChunk *mem_chunk);
+gpointer old_mem_chunk_alloc (GMemChunk *mem_chunk);
+gpointer old_mem_chunk_alloc0 (GMemChunk *mem_chunk);
+void old_mem_chunk_free (GMemChunk *mem_chunk,
+ gpointer mem);
+void old_mem_chunk_clean (GMemChunk *mem_chunk);
+void old_mem_chunk_reset (GMemChunk *mem_chunk);
+void old_mem_chunk_print (GMemChunk *mem_chunk);
+void old_mem_chunk_info (void);
+
+
+/* --- MemChunks --- */
+#ifndef G_ALLOC_AND_FREE
+typedef struct _GAllocator GAllocator;
+typedef struct _GMemChunk GMemChunk;
+#define G_ALLOC_ONLY 1
+#define G_ALLOC_AND_FREE 2
+#endif
+
+typedef struct _GFreeAtom GFreeAtom;
+typedef struct _GMemArea GMemArea;
+
+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 _GMemChunk
+{
+ 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 */
+ GMemChunk *next; /* pointer to the next chunk */
+ GMemChunk *prev; /* pointer to the previous chunk */
+};
+
+
+static gulong old_mem_chunk_compute_size (gulong size,
+ gulong min_size) G_GNUC_CONST;
+static gint old_mem_chunk_area_compare (GMemArea *a,
+ GMemArea *b);
+static gint old_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 GMemChunk *mem_chunks = NULL;
+
+void
+old_mem_chunks_init (void)
+{
+ mem_chunks_lock = g_mutex_new ();
+}
+
+GMemChunk*
+old_mem_chunk_new (const gchar *name,
+ gint atom_size,
+ gulong area_size,
+ gint type)
+{
+ GMemChunk *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 (GMemChunk, 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) old_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 = old_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 mem_chunk;
+}
+
+void
+old_mem_chunk_destroy (GMemChunk *mem_chunk)
+{
+ GMemArea *mem_areas;
+ GMemArea *temp_area;
+
+ g_return_if_fail (mem_chunk != NULL);
+
+ ENTER_MEM_CHUNK_ROUTINE ();
+
+ mem_areas = mem_chunk->mem_areas;
+ while (mem_areas)
+ {
+ temp_area = mem_areas;
+ mem_areas = mem_areas->next;
+ g_free (temp_area);
+ }
+
+ g_mutex_lock (mem_chunks_lock);
+ if (mem_chunk->next)
+ mem_chunk->next->prev = mem_chunk->prev;
+ if (mem_chunk->prev)
+ mem_chunk->prev->next = mem_chunk->next;
+
+ if (mem_chunk == mem_chunks)
+ mem_chunks = mem_chunks->next;
+ g_mutex_unlock (mem_chunks_lock);
+
+ if (mem_chunk->type == G_ALLOC_AND_FREE)
+ g_tree_destroy (mem_chunk->mem_tree);
+
+ g_free (mem_chunk);
+
+ LEAVE_MEM_CHUNK_ROUTINE ();
+}
+
+gpointer
+old_mem_chunk_alloc (GMemChunk *mem_chunk)
+{
+ GMemArea *temp_area;
+ gpointer mem;
+
+ ENTER_MEM_CHUNK_ROUTINE ();
+
+ g_return_val_if_fail (mem_chunk != NULL, NULL);
+
+ while (mem_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 = mem_chunk->free_atoms;
+ mem_chunk->free_atoms = mem_chunk->free_atoms->next;
+
+ /* Determine which area this piece of memory is allocated from */
+ temp_area = g_tree_search (mem_chunk->mem_tree,
+ (GCompareFunc) old_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 += mem_chunk->atom_size;
+
+ if (temp_area->free == mem_chunk->area_size)
+ {
+ if (temp_area == mem_chunk->mem_area)
+ mem_chunk->mem_area = NULL;
+
+ if (mem_chunk->free_mem_area)
+ {
+ mem_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 == mem_chunk->mem_areas)
+ mem_chunk->mem_areas = mem_chunk->mem_areas->next;
+
+ if (mem_chunk->type == G_ALLOC_AND_FREE)
+ g_tree_remove (mem_chunk->mem_tree, temp_area);
+ g_free (temp_area);
+ }
+ else
+ mem_chunk->free_mem_area = temp_area;
+
+ mem_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 ((!mem_chunk->mem_area) ||
+ ((mem_chunk->mem_area->index + mem_chunk->atom_size) > mem_chunk->area_size))
+ {
+ if (mem_chunk->free_mem_area)
+ {
+ mem_chunk->mem_area = mem_chunk->free_mem_area;
+ mem_chunk->free_mem_area = NULL;
+ }
+ else
+ {
+#ifdef ENABLE_GC_FRIENDLY
+ mem_chunk->mem_area = (GMemArea*) g_malloc0 (sizeof (GMemArea) -
+ MEM_AREA_SIZE +
+ mem_chunk->area_size);
+#else /* !ENABLE_GC_FRIENDLY */
+ mem_chunk->mem_area = (GMemArea*) g_malloc (sizeof (GMemArea) -
+ MEM_AREA_SIZE +
+ mem_chunk->area_size);
+#endif /* ENABLE_GC_FRIENDLY */
+
+ mem_chunk->num_mem_areas += 1;
+ mem_chunk->mem_area->next = mem_chunk->mem_areas;
+ mem_chunk->mem_area->prev = NULL;
+
+ if (mem_chunk->mem_areas)
+ mem_chunk->mem_areas->prev = mem_chunk->mem_area;
+ mem_chunk->mem_areas = mem_chunk->mem_area;
+
+ if (mem_chunk->type == G_ALLOC_AND_FREE)
+ g_tree_insert (mem_chunk->mem_tree, mem_chunk->mem_area, mem_chunk->mem_area);
+ }
+
+ mem_chunk->mem_area->index = 0;
+ mem_chunk->mem_area->free = mem_chunk->area_size;
+ mem_chunk->mem_area->allocated = 0;
+ mem_chunk->mem_area->mark = 0;
+ }
+
+ /* Get the memory and modify the state variables appropriately.
+ */
+ mem = (gpointer) &mem_chunk->mem_area->mem[mem_chunk->mem_area->index];
+ mem_chunk->mem_area->index += mem_chunk->atom_size;
+ mem_chunk->mem_area->free -= mem_chunk->atom_size;
+ mem_chunk->mem_area->allocated += 1;
+
+ outa_here:
+
+ LEAVE_MEM_CHUNK_ROUTINE ();
+
+ return mem;
+}
+
+gpointer
+old_mem_chunk_alloc0 (GMemChunk *mem_chunk)
+{
+ gpointer mem;
+
+ mem = old_mem_chunk_alloc (mem_chunk);
+ if (mem)
+ {
+ memset (mem, 0, mem_chunk->atom_size);
+ }
+
+ return mem;
+}
+
+void
+old_mem_chunk_free (GMemChunk *mem_chunk,
+ gpointer mem)
+{
+ GMemArea *temp_area;
+ GFreeAtom *free_atom;
+
+ g_return_if_fail (mem_chunk != NULL);
+ g_return_if_fail (mem != NULL);
+
+ ENTER_MEM_CHUNK_ROUTINE ();
+
+#ifdef ENABLE_GC_FRIENDLY
+ memset (mem, 0, mem_chunk->atom_size);
+#endif /* ENABLE_GC_FRIENDLY */
+
+ /* Don't do anything if this is an ALLOC_ONLY chunk
+ */
+ if (mem_chunk->type == G_ALLOC_AND_FREE)
+ {
+ /* Place the memory on the "free_atoms" list
+ */
+ free_atom = (GFreeAtom*) mem;
+ free_atom->next = mem_chunk->free_atoms;
+ mem_chunk->free_atoms = free_atom;
+
+ temp_area = g_tree_search (mem_chunk->mem_tree,
+ (GCompareFunc) old_mem_chunk_area_search,
+ mem);
+
+ temp_area->allocated -= 1;
+
+ if (temp_area->allocated == 0)
+ {
+ temp_area->mark = 1;
+ mem_chunk->num_marked_areas += 1;
+ }
+ }
+
+ LEAVE_MEM_CHUNK_ROUTINE ();
+}
+
+/* This doesn't free the free_area if there is one */
+void
+old_mem_chunk_clean (GMemChunk *mem_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 ();
+
+ if (mem_chunk->type == G_ALLOC_AND_FREE)
+ {
+ prev_free_atom = NULL;
+ temp_free_atom = mem_chunk->free_atoms;
+
+ while (temp_free_atom)
+ {
+ mem = (gpointer) temp_free_atom;
+
+ mem_area = g_tree_search (mem_chunk->mem_tree,
+ (GCompareFunc) old_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
+ mem_chunk->free_atoms = temp_free_atom->next;
+ temp_free_atom = temp_free_atom->next;
+
+ mem_area->free += mem_chunk->atom_size;
+ if (mem_area->free == mem_chunk->area_size)
+ {
+ mem_chunk->num_mem_areas -= 1;
+ mem_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 == mem_chunk->mem_areas)
+ mem_chunk->mem_areas = mem_chunk->mem_areas->next;
+ if (mem_area == mem_chunk->mem_area)
+ mem_chunk->mem_area = NULL;
+
+ if (mem_chunk->type == G_ALLOC_AND_FREE)
+ g_tree_remove (mem_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
+old_mem_chunk_reset (GMemChunk *mem_chunk)
+{
+ GMemArea *mem_areas;
+ GMemArea *temp_area;
+
+ g_return_if_fail (mem_chunk != NULL);
+
+ ENTER_MEM_CHUNK_ROUTINE ();
+
+ mem_areas = mem_chunk->mem_areas;
+ mem_chunk->num_mem_areas = 0;
+ mem_chunk->mem_areas = NULL;
+ mem_chunk->mem_area = NULL;
+
+ while (mem_areas)
+ {
+ temp_area = mem_areas;
+ mem_areas = mem_areas->next;
+ g_free (temp_area);
+ }
+
+ mem_chunk->free_atoms = NULL;
+
+ if (mem_chunk->mem_tree)
+ {
+ g_tree_destroy (mem_chunk->mem_tree);
+ mem_chunk->mem_tree = g_tree_new ((GCompareFunc) old_mem_chunk_area_compare);
+ }
+
+ LEAVE_MEM_CHUNK_ROUTINE ();
+}
+
+void
+old_mem_chunk_print (GMemChunk *mem_chunk)
+{
+ GMemArea *mem_areas;
+ gulong mem;
+
+ g_return_if_fail (mem_chunk != NULL);
+
+ mem_areas = mem_chunk->mem_areas;
+ mem = 0;
+
+ while (mem_areas)
+ {
+ mem += mem_chunk->area_size - mem_areas->free;
+ mem_areas = mem_areas->next;
+ }
+
+ g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO,
+ "%s: %ld bytes using %d mem areas",
+ mem_chunk->name, mem, mem_chunk->num_mem_areas);
+}
+
+void
+old_mem_chunk_info (void)
+{
+ GMemChunk *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, 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)
+ {
+ old_mem_chunk_print ((GMemChunk*) mem_chunk);
+ mem_chunk = mem_chunk->next;
+ }
+}
+
+static gulong
+old_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
+old_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
+old_mem_chunk_area_search (GMemArea *a,
+ gchar *addr)
+{
+ if (a->mem <= addr)
+ {
+ if (addr < &a->mem[a->index])
+ return 0;
+ return 1;
+ }
+ return -1;
+}
diff --git a/trunk/tests/module-test.c b/trunk/tests/module-test.c
new file mode 100644
index 000000000..9b95b0a2a
--- /dev/null
+++ b/trunk/tests/module-test.c
@@ -0,0 +1,202 @@
+/* module-test.c - test program for GMODULE
+ * 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <gmodule.h>
+#include <string.h>
+
+gchar* global_state;
+
+G_MODULE_EXPORT void
+g_clash_func (void)
+{
+ global_state = "global clash";
+}
+
+typedef void (*SimpleFunc) (void);
+typedef void (*GModuleFunc) (GModule *);
+
+static gchar **gplugin_a_state;
+static gchar **gplugin_b_state;
+
+static void
+compare (const gchar *desc, const gchar *expected, const gchar *found)
+{
+ if (!expected && !found)
+ return;
+
+ if (expected && found && strcmp (expected, found) == 0)
+ return;
+
+ g_error ("error: %s state should have been \"%s\", but is \"%s\"",
+ desc, expected ? expected : "NULL", found ? found : "NULL");
+}
+
+static void
+test_states (const gchar *global, const gchar *gplugin_a,
+ const gchar *gplugin_b)
+{
+ compare ("global", global, global_state);
+ compare ("Plugin A", gplugin_a, *gplugin_a_state);
+ compare ("Plugin B", gplugin_b, *gplugin_b_state);
+
+ global_state = *gplugin_a_state = *gplugin_b_state = NULL;
+}
+
+static SimpleFunc plugin_clash_func = NULL;
+
+int
+main (int arg,
+ char *argv[])
+{
+ GModule *module_self, *module_a, *module_b;
+ gchar *dir;
+ gchar *plugin_a, *plugin_b;
+ SimpleFunc f_a, f_b, f_self;
+ GModuleFunc gmod_f;
+
+ if (!g_module_supported ())
+ g_error ("dynamic modules not supported");
+
+ dir = g_get_current_dir ();
+
+ plugin_a = g_strconcat (dir, G_DIR_SEPARATOR_S "libmoduletestplugin_a",
+ NULL);
+ plugin_b = g_strconcat (dir, G_DIR_SEPARATOR_S "libmoduletestplugin_b",
+ NULL);
+
+ g_free (dir);
+
+ /* module handles */
+
+ module_self = g_module_open (NULL, G_MODULE_BIND_LAZY);
+ if (!module_self)
+ g_error ("error: %s", g_module_error ());
+
+ if (!g_module_symbol (module_self, "g_module_close", (gpointer *) &f_self))
+ g_error ("error: %s", g_module_error ());
+
+ module_a = g_module_open (plugin_a, G_MODULE_BIND_LAZY);
+ if (!module_a)
+ g_error ("error: %s", g_module_error ());
+
+ module_b = g_module_open (plugin_b, G_MODULE_BIND_LAZY);
+ if (!module_b)
+ g_error ("error: %s", g_module_error ());
+
+ /* get plugin state vars */
+
+ if (!g_module_symbol (module_a, "gplugin_a_state",
+ (gpointer *) &gplugin_a_state))
+ g_error ("error: %s", g_module_error ());
+
+ if (!g_module_symbol (module_b, "gplugin_b_state",
+ (gpointer *) &gplugin_b_state))
+ g_error ("error: %s", g_module_error ());
+ test_states (NULL, NULL, "check-init");
+
+ /* get plugin specific symbols and call them
+ */
+ if (!g_module_symbol (module_a, "gplugin_a_func", (gpointer *) &f_a))
+ g_error ("error: %s", g_module_error ());
+ test_states (NULL, NULL, NULL);
+
+ if (!g_module_symbol (module_b, "gplugin_b_func", (gpointer *) &f_b))
+ g_error ("error: %s", g_module_error ());
+ test_states (NULL, NULL, NULL);
+
+ f_a ();
+ test_states (NULL, "Hello world", NULL);
+
+ f_b ();
+ test_states (NULL, NULL, "Hello world");
+
+ /* get and call globally clashing functions
+ */
+
+ if (!g_module_symbol (module_self, "g_clash_func", (gpointer *) &f_self))
+ g_error ("error: %s", g_module_error ());
+ test_states (NULL, NULL, NULL);
+
+ if (!g_module_symbol (module_a, "g_clash_func", (gpointer *) &f_a))
+ g_error ("error: %s", g_module_error ());
+ test_states (NULL, NULL, NULL);
+
+ if (!g_module_symbol (module_b, "g_clash_func", (gpointer *) &f_b))
+ g_error ("error: %s", g_module_error ());
+ test_states (NULL, NULL, NULL);
+
+ f_self ();
+ test_states ("global clash", NULL, NULL);
+
+ f_a ();
+ test_states (NULL, "global clash", NULL);
+
+ f_b ();
+ test_states (NULL, NULL, "global clash");
+
+ /* get and call clashing plugin functions */
+
+ if (!g_module_symbol (module_a, "gplugin_clash_func", (gpointer *) &f_a))
+ g_error ("error: %s", g_module_error ());
+ test_states (NULL, NULL, NULL);
+
+ if (!g_module_symbol (module_b, "gplugin_clash_func", (gpointer *) &f_b))
+ g_error ("error: %s", g_module_error ());
+ test_states (NULL, NULL, NULL);
+
+ plugin_clash_func = f_a;
+ plugin_clash_func ();
+ test_states (NULL, "plugin clash", NULL);
+
+ plugin_clash_func = f_b;
+ plugin_clash_func ();
+ test_states (NULL, NULL, "plugin clash");
+
+ /* call gmodule function from A */
+
+ if (!g_module_symbol (module_a, "gplugin_a_module_func", (gpointer *) &gmod_f))
+ g_error ("error: %s", g_module_error ());
+ test_states (NULL, NULL, NULL);
+
+ gmod_f (module_b);
+ test_states (NULL, NULL, "BOOH");
+
+ gmod_f (module_a);
+ test_states (NULL, "BOOH", NULL);
+
+ /* unload plugins */
+
+ if (!g_module_close (module_a))
+ g_error ("error: %s", g_module_error ());
+
+ if (!g_module_close (module_b))
+ g_error ("error: %s", g_module_error ());
+
+ return 0;
+}
diff --git a/trunk/tests/node-test.c b/trunk/tests/node-test.c
new file mode 100644
index 000000000..8f5b54d81
--- /dev/null
+++ b/trunk/tests/node-test.c
@@ -0,0 +1,223 @@
+/* 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "glib.h"
+
+int array[10000];
+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); \
+ exit(1); \
+ } \
+} 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"
+
+typedef struct {
+ guint age;
+ gchar name[40];
+} GlibTestInfo;
+
+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_D;
+ GNode *node_F;
+ GNode *node_G;
+ GNode *node_J;
+ guint i;
+ gchar *tstring;
+
+ 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'));
+ node_D = g_node_new (C2P ('D'));
+ g_node_insert (node_B, 1, node_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;
+
+ g_node_append (node_D, g_node_new (C2P ('L')));
+ g_node_append (node_D, g_node_new (C2P ('M')));
+
+ g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring);
+ TEST (tstring, strcmp (tstring, "ABFEDCGLMKJIH") == 0);
+ g_free (tstring); tstring = NULL;
+
+ 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)
+ exit(1);
+}
+
+
+int
+main (int argc,
+ char *argv[])
+{
+ g_node_test ();
+
+ return 0;
+}
+
diff --git a/trunk/tests/option-test.c b/trunk/tests/option-test.c
new file mode 100644
index 000000000..fc8699c1e
--- /dev/null
+++ b/trunk/tests/option-test.c
@@ -0,0 +1,1502 @@
+#include <stdio.h>
+#include <string.h>
+#include <locale.h>
+#include <glib.h>
+
+int error_test1_int;
+char *error_test2_string;
+gboolean error_test3_boolean;
+
+int arg_test1_int;
+gchar *arg_test2_string;
+gchar *arg_test3_filename;
+gdouble arg_test4_double;
+gdouble arg_test5_double;
+gint64 arg_test6_int64;
+gint64 arg_test6_int64_2;
+
+gchar *callback_test1_string;
+int callback_test2_int;
+
+gchar *callback_test_optional_string;
+gboolean callback_test_optional_boolean;
+
+gchar **array_test1_array;
+
+gboolean ignore_test1_boolean;
+gboolean ignore_test2_boolean;
+gchar *ignore_test3_string;
+
+gchar **
+split_string (const char *str, int *argc)
+{
+ gchar **argv;
+ int len;
+
+ argv = g_strsplit (str, " ", 0);
+
+ for (len = 0; argv[len] != NULL; len++);
+
+ if (argc)
+ *argc = len;
+
+ return argv;
+}
+
+gchar *
+join_stringv (int argc, char **argv)
+{
+ int i;
+ GString *str;
+
+ str = g_string_new (NULL);
+
+ for (i = 0; i < argc; i++)
+ {
+ g_string_append (str, argv[i]);
+
+ if (i < argc - 1)
+ g_string_append_c (str, ' ');
+ }
+
+ return g_string_free (str, FALSE);
+}
+
+/* Performs a shallow copy */
+char **
+copy_stringv (char **argv, int argc)
+{
+ return g_memdup (argv, sizeof (char *) * (argc + 1));
+}
+
+
+static gboolean
+error_test1_pre_parse (GOptionContext *context,
+ GOptionGroup *group,
+ gpointer data,
+ GError **error)
+{
+ g_assert (error_test1_int == 0x12345678);
+
+ return TRUE;
+}
+
+static gboolean
+error_test1_post_parse (GOptionContext *context,
+ GOptionGroup *group,
+ gpointer data,
+ GError **error)
+{
+ g_assert (error_test1_int == 20);
+
+ /* Set an error in the post hook */
+ g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, "");
+
+ return FALSE;
+}
+
+void
+error_test1 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionGroup *main_group;
+ GOptionEntry entries [] =
+ { { "test", 0, 0, G_OPTION_ARG_INT, &error_test1_int, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Set pre and post parse hooks */
+ main_group = g_option_context_get_main_group (context);
+ g_option_group_set_parse_hooks (main_group,
+ error_test1_pre_parse, error_test1_post_parse);
+
+ /* Now try parsing */
+ argv = split_string ("program --test 20", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval == FALSE);
+
+ /* On failure, values should be reset */
+ g_assert (error_test1_int == 0x12345678);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+
+}
+
+static gboolean
+error_test2_pre_parse (GOptionContext *context,
+ GOptionGroup *group,
+ gpointer data,
+ GError **error)
+{
+ g_assert (strcmp (error_test2_string, "foo") == 0);
+
+ return TRUE;
+}
+
+static gboolean
+error_test2_post_parse (GOptionContext *context,
+ GOptionGroup *group,
+ gpointer data,
+ GError **error)
+{
+ g_assert (strcmp (error_test2_string, "bar") == 0);
+
+ /* Set an error in the post hook */
+ g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, "");
+
+ return FALSE;
+}
+
+void
+error_test2 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionGroup *main_group;
+ GOptionEntry entries [] =
+ { { "test", 0, 0, G_OPTION_ARG_STRING, &error_test2_string, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Set pre and post parse hooks */
+ main_group = g_option_context_get_main_group (context);
+ g_option_group_set_parse_hooks (main_group,
+ error_test2_pre_parse, error_test2_post_parse);
+
+ /* Now try parsing */
+ argv = split_string ("program --test bar", &argc);
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+
+ g_error_free (error);
+ g_assert (retval == FALSE);
+
+ g_assert (strcmp (error_test2_string, "foo") == 0);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+static gboolean
+error_test3_pre_parse (GOptionContext *context,
+ GOptionGroup *group,
+ gpointer data,
+ GError **error)
+{
+ g_assert (!error_test3_boolean);
+
+ return TRUE;
+}
+
+static gboolean
+error_test3_post_parse (GOptionContext *context,
+ GOptionGroup *group,
+ gpointer data,
+ GError **error)
+{
+ g_assert (error_test3_boolean);
+
+ /* Set an error in the post hook */
+ g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, "");
+
+ return FALSE;
+}
+
+void
+error_test3 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionGroup *main_group;
+ GOptionEntry entries [] =
+ { { "test", 0, 0, G_OPTION_ARG_NONE, &error_test3_boolean, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Set pre and post parse hooks */
+ main_group = g_option_context_get_main_group (context);
+ g_option_group_set_parse_hooks (main_group,
+ error_test3_pre_parse, error_test3_post_parse);
+
+ /* Now try parsing */
+ argv = split_string ("program --test", &argc);
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+
+ g_error_free (error);
+ g_assert (retval == FALSE);
+
+ g_assert (!error_test3_boolean);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+arg_test1 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "test", 0, 0, G_OPTION_ARG_INT, &arg_test1_int, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test 20 --test 30", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Last arg specified is the one that should be stored */
+ g_assert (arg_test1_int == 30);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+arg_test2 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "test", 0, 0, G_OPTION_ARG_STRING, &arg_test2_string, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test foo --test bar", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Last arg specified is the one that should be stored */
+ g_assert (strcmp (arg_test2_string, "bar") == 0);
+
+ g_free (arg_test2_string);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+arg_test3 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "test", 0, 0, G_OPTION_ARG_FILENAME, &arg_test3_filename, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test foo.txt", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Last arg specified is the one that should be stored */
+ g_assert (strcmp (arg_test3_filename, "foo.txt") == 0);
+
+ g_free (arg_test3_filename);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+
+void
+arg_test4 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "test", 0, 0, G_OPTION_ARG_DOUBLE, &arg_test4_double, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test 20.0 --test 30.03", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Last arg specified is the one that should be stored */
+ g_assert (arg_test4_double == 30.03);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+arg_test5 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ char *old_locale, *current_locale;
+ const char *locale = "de_DE";
+ GOptionEntry entries [] =
+ { { "test", 0, 0, G_OPTION_ARG_DOUBLE, &arg_test5_double, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test 20,0 --test 30,03", &argc);
+
+ /* set it to some locale that uses commas instead of decimal points */
+
+ old_locale = g_strdup (setlocale (LC_NUMERIC, locale));
+ current_locale = setlocale (LC_NUMERIC, NULL);
+ if (strcmp (current_locale, locale) != 0)
+ {
+ fprintf (stderr, "Cannot set locale to %s, skipping\n", locale);
+ goto cleanup;
+ }
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Last arg specified is the one that should be stored */
+ g_assert (arg_test5_double == 30.03);
+
+ cleanup:
+ setlocale (LC_NUMERIC, old_locale);
+ g_free (old_locale);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+arg_test6 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "test", 0, 0, G_OPTION_ARG_INT64, &arg_test6_int64, NULL, NULL },
+ { "test2", 0, 0, G_OPTION_ARG_INT64, &arg_test6_int64_2, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test 4294967297 --test 4294967296 --test2 0xfffffffff", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Last arg specified is the one that should be stored */
+ g_assert (arg_test6_int64 == G_GINT64_CONSTANT(4294967296));
+ g_assert (arg_test6_int64_2 == G_GINT64_CONSTANT(0xfffffffff));
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+static gboolean
+callback_parse1 (const gchar *option_name, const gchar *value,
+ gpointer data, GError **error)
+{
+ callback_test1_string = g_strdup (value);
+ return TRUE;
+}
+
+void
+callback_test1 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "test", 0, 0, G_OPTION_ARG_CALLBACK, callback_parse1, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test foo.txt", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ g_assert (strcmp (callback_test1_string, "foo.txt") == 0);
+
+ g_free (callback_test1_string);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+static gboolean
+callback_parse2 (const gchar *option_name, const gchar *value,
+ gpointer data, GError **error)
+{
+ callback_test2_int++;
+ return TRUE;
+}
+
+void
+callback_test2 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "test", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, callback_parse2, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test --test", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ g_assert (callback_test2_int == 2);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+static gboolean
+callback_parse_optional (const gchar *option_name, const gchar *value,
+ gpointer data, GError **error)
+{
+ callback_test_optional_boolean = TRUE;
+ if (value)
+ callback_test_optional_string = g_strdup (value);
+ else
+ callback_test_optional_string = NULL;
+ return TRUE;
+}
+
+void
+callback_test_optional_1 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "test", 0, G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK,
+ callback_parse_optional, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test foo.txt", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ g_assert (strcmp (callback_test_optional_string, "foo.txt") == 0);
+
+ g_assert (callback_test_optional_boolean);
+
+ g_free (callback_test_optional_string);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+callback_test_optional_2 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "test", 0, G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK,
+ callback_parse_optional, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ g_assert (callback_test_optional_string == NULL);
+
+ g_assert (callback_test_optional_boolean);
+
+ g_free (callback_test_optional_string);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+callback_test_optional_3 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK,
+ callback_parse_optional, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program -t foo.txt", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ g_assert (strcmp (callback_test_optional_string, "foo.txt") == 0);
+
+ g_assert (callback_test_optional_boolean);
+
+ g_free (callback_test_optional_string);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+
+void
+callback_test_optional_4 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK,
+ callback_parse_optional, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program -t", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ g_assert (callback_test_optional_string == NULL);
+
+ g_assert (callback_test_optional_boolean);
+
+ g_free (callback_test_optional_string);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+callback_test_optional_5 (void)
+{
+ GOptionContext *context;
+ gboolean dummy;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "dummy", 'd', 0, G_OPTION_ARG_NONE, &dummy, NULL },
+ { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK,
+ callback_parse_optional, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test --dummy", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ g_assert (callback_test_optional_string == NULL);
+
+ g_assert (callback_test_optional_boolean);
+
+ g_free (callback_test_optional_string);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+callback_test_optional_6 (void)
+{
+ GOptionContext *context;
+ gboolean dummy;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "dummy", 'd', 0, G_OPTION_ARG_NONE, &dummy, NULL },
+ { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK,
+ callback_parse_optional, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program -t -d", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ g_assert (callback_test_optional_string == NULL);
+
+ g_assert (callback_test_optional_boolean);
+
+ g_free (callback_test_optional_string);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+callback_test_optional_7 (void)
+{
+ GOptionContext *context;
+ gboolean dummy;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "dummy", 'd', 0, G_OPTION_ARG_NONE, &dummy, NULL },
+ { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK,
+ callback_parse_optional, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program -td", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ g_assert (callback_test_optional_string == NULL);
+
+ g_assert (callback_test_optional_boolean);
+
+ g_free (callback_test_optional_string);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+callback_test_optional_8 (void)
+{
+ GOptionContext *context;
+ gboolean dummy;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "dummy", 'd', 0, G_OPTION_ARG_NONE, &dummy, NULL },
+ { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK,
+ callback_parse_optional, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program -dt foo.txt", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ g_assert (callback_test_optional_string);
+
+ g_assert (callback_test_optional_boolean);
+
+ g_free (callback_test_optional_string);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+static GPtrArray *callback_remaining_args;
+static gboolean
+callback_remaining_test1_callback (const gchar *option_name, const gchar *value,
+ gpointer data, GError **error)
+{
+ g_ptr_array_add (callback_remaining_args, g_strdup (value));
+ return TRUE;
+}
+
+void
+callback_remaining_test1 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_CALLBACK, callback_remaining_test1_callback, NULL, NULL },
+ { NULL } };
+
+ callback_remaining_args = g_ptr_array_new ();
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program foo.txt blah.txt", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ g_assert (callback_remaining_args->len == 2);
+ g_assert (strcmp (callback_remaining_args->pdata[0], "foo.txt") == 0);
+ g_assert (strcmp (callback_remaining_args->pdata[1], "blah.txt") == 0);
+
+ g_ptr_array_foreach (callback_remaining_args, (GFunc) g_free, NULL);
+ g_ptr_array_free (callback_remaining_args, TRUE);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+ignore_test1 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv, **argv_copy;
+ int argc;
+ gchar *arg;
+ GOptionEntry entries [] =
+ { { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_set_ignore_unknown_options (context, TRUE);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test --hello", &argc);
+ argv_copy = copy_stringv (argv, argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Check array */
+ arg = join_stringv (argc, argv);
+ g_assert (strcmp (arg, "program --hello") == 0);
+
+ g_free (arg);
+ g_strfreev (argv_copy);
+ g_free (argv);
+ g_option_context_free (context);
+}
+
+void
+ignore_test2 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ gchar *arg;
+ GOptionEntry entries [] =
+ { { "test", 't', 0, G_OPTION_ARG_NONE, &ignore_test2_boolean, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_set_ignore_unknown_options (context, TRUE);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program -test", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Check array */
+ arg = join_stringv (argc, argv);
+ g_assert (strcmp (arg, "program -es") == 0);
+
+ g_free (arg);
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+ignore_test3 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv, **argv_copy;
+ int argc;
+ gchar *arg;
+ GOptionEntry entries [] =
+ { { "test", 0, 0, G_OPTION_ARG_STRING, &ignore_test3_string, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_set_ignore_unknown_options (context, TRUE);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test foo --hello", &argc);
+ argv_copy = copy_stringv (argv, argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Check array */
+ arg = join_stringv (argc, argv);
+ g_assert (strcmp (arg, "program --hello") == 0);
+
+ g_assert (strcmp (ignore_test3_string, "foo") == 0);
+ g_free (ignore_test3_string);
+
+ g_free (arg);
+ g_strfreev (argv_copy);
+ g_free (argv);
+ g_option_context_free (context);
+}
+
+void
+array_test1 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] =
+ { { "test", 0, 0, G_OPTION_ARG_STRING_ARRAY, &array_test1_array, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test foo --test bar", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Check array */
+ g_assert (strcmp (array_test1_array[0], "foo") == 0);
+ g_assert (strcmp (array_test1_array[1], "bar") == 0);
+ g_assert (array_test1_array[2] == NULL);
+
+ g_strfreev (array_test1_array);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+add_test1 (void)
+{
+ GOptionContext *context;
+
+ GOptionEntry entries1 [] =
+ { { "test1", 0, 0, G_OPTION_ARG_STRING_ARRAY, NULL, NULL, NULL },
+ { NULL } };
+ GOptionEntry entries2 [] =
+ { { "test2", 0, 0, G_OPTION_ARG_STRING_ARRAY, NULL, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries1, NULL);
+ g_option_context_add_main_entries (context, entries2, NULL);
+
+ g_option_context_free (context);
+}
+
+void
+empty_test1 (void)
+{
+ GOptionContext *context;
+ GOptionEntry entries [] =
+ { { NULL } };
+ char *prgname;
+
+ g_set_prgname (NULL);
+ context = g_option_context_new (NULL);
+
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ g_option_context_parse (context, NULL, NULL, NULL);
+
+ prgname = g_get_prgname ();
+ g_assert (prgname && strcmp (prgname, "<unknown>") == 0);
+
+ g_option_context_free (context);
+}
+
+void
+empty_test2 (void)
+{
+ GOptionContext *context;
+
+ context = g_option_context_new (NULL);
+ g_option_context_parse (context, NULL, NULL, NULL);
+
+ g_option_context_free (context);
+}
+
+void
+empty_test3 (void)
+{
+ GOptionContext *context;
+ gint argc;
+ gchar **argv;
+
+ argc = 0;
+ argv = NULL;
+
+ context = g_option_context_new (NULL);
+ g_option_context_parse (context, &argc, &argv, NULL);
+
+ g_option_context_free (context);
+}
+
+/* check that non-option arguments are left in argv by default */
+void
+rest_test1 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] = {
+ { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
+ { NULL }
+ };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program foo --test bar", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Check array */
+ g_assert (ignore_test1_boolean);
+ g_assert (strcmp (argv[0], "program") == 0);
+ g_assert (strcmp (argv[1], "foo") == 0);
+ g_assert (strcmp (argv[2], "bar") == 0);
+ g_assert (argv[3] == NULL);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+/* check that -- works */
+void
+rest_test2 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] = {
+ { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
+ { NULL }
+ };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program foo --test -- -bar", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Check array */
+ g_assert (ignore_test1_boolean);
+ g_assert (strcmp (argv[0], "program") == 0);
+ g_assert (strcmp (argv[1], "foo") == 0);
+ g_assert (strcmp (argv[2], "--") == 0);
+ g_assert (strcmp (argv[3], "-bar") == 0);
+ g_assert (argv[4] == NULL);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+/* check that -- stripping works */
+void
+rest_test2a (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] = {
+ { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
+ { NULL }
+ };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program foo --test -- bar", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Check array */
+ g_assert (ignore_test1_boolean);
+ g_assert (strcmp (argv[0], "program") == 0);
+ g_assert (strcmp (argv[1], "foo") == 0);
+ g_assert (strcmp (argv[2], "bar") == 0);
+ g_assert (argv[3] == NULL);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+rest_test2b (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] = {
+ { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
+ { NULL }
+ };
+
+ context = g_option_context_new (NULL);
+ g_option_context_set_ignore_unknown_options (context, TRUE);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program foo --test -bar --", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Check array */
+ g_assert (ignore_test1_boolean);
+ g_assert (strcmp (argv[0], "program") == 0);
+ g_assert (strcmp (argv[1], "foo") == 0);
+ g_assert (strcmp (argv[2], "-bar") == 0);
+ g_assert (argv[3] == NULL);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+rest_test2c (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] = {
+ { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
+ { NULL }
+ };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test foo -- bar", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Check array */
+ g_assert (ignore_test1_boolean);
+ g_assert (strcmp (argv[0], "program") == 0);
+ g_assert (strcmp (argv[1], "foo") == 0);
+ g_assert (strcmp (argv[2], "bar") == 0);
+ g_assert (argv[3] == NULL);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+rest_test2d (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] = {
+ { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
+ { NULL }
+ };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test -- -bar", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Check array */
+ g_assert (ignore_test1_boolean);
+ g_assert (strcmp (argv[0], "program") == 0);
+ g_assert (strcmp (argv[1], "--") == 0);
+ g_assert (strcmp (argv[2], "-bar") == 0);
+ g_assert (argv[3] == NULL);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+
+/* check that G_OPTION_REMAINING collects non-option arguments */
+void
+rest_test3 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] = {
+ { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
+ { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &array_test1_array, NULL, NULL },
+ { NULL }
+ };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program foo --test bar", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Check array */
+ g_assert (ignore_test1_boolean);
+ g_assert (strcmp (array_test1_array[0], "foo") == 0);
+ g_assert (strcmp (array_test1_array[1], "bar") == 0);
+ g_assert (array_test1_array[2] == NULL);
+
+ g_strfreev (array_test1_array);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+
+/* check that G_OPTION_REMAINING and -- work together */
+void
+rest_test4 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] = {
+ { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
+ { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &array_test1_array, NULL, NULL },
+ { NULL }
+ };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program foo --test -- -bar", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Check array */
+ g_assert (ignore_test1_boolean);
+ g_assert (strcmp (array_test1_array[0], "foo") == 0);
+ g_assert (strcmp (array_test1_array[1], "-bar") == 0);
+ g_assert (array_test1_array[2] == NULL);
+
+ g_strfreev (array_test1_array);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+/* test that G_OPTION_REMAINING works with G_OPTION_ARG_FILENAME_ARRAY */
+void
+rest_test5 (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] = {
+ { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL },
+ { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &array_test1_array, NULL, NULL },
+ { NULL }
+ };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program foo --test bar", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval);
+
+ /* Check array */
+ g_assert (ignore_test1_boolean);
+ g_assert (strcmp (array_test1_array[0], "foo") == 0);
+ g_assert (strcmp (array_test1_array[1], "bar") == 0);
+ g_assert (array_test1_array[2] == NULL);
+
+ g_strfreev (array_test1_array);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+unknown_short_test (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ GOptionEntry entries [] = { { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program -0", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (!retval);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+/* test that lone dashes are treated as non-options */
+void lonely_dash_test (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+
+ context = g_option_context_new (NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program -", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+
+ g_assert (retval);
+
+ g_assert (argv[1] && strcmp (argv[1], "-") == 0);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+void
+missing_arg_test (void)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ gchar **argv;
+ int argc;
+ gchar *arg = NULL;
+ GOptionEntry entries [] =
+ { { "test", 't', 0, G_OPTION_ARG_STRING, &arg, NULL, NULL },
+ { NULL } };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+
+ /* Now try parsing */
+ argv = split_string ("program --test", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval == FALSE);
+ g_clear_error (&error);
+
+ g_strfreev (argv);
+
+ /* Try parsing again */
+ argv = split_string ("program --t", &argc);
+
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+ g_assert (retval == FALSE);
+
+ g_strfreev (argv);
+ g_option_context_free (context);
+}
+
+int
+main (int argc, char **argv)
+{
+ /* Test that restoration on failure works */
+ error_test1_int = 0x12345678;
+ error_test1 ();
+ error_test2_string = "foo";
+ error_test2 ();
+ error_test3_boolean = FALSE;
+ error_test3 ();
+
+ /* Test that special argument parsing works */
+ arg_test1 ();
+ arg_test2 ();
+ arg_test3 ();
+ arg_test4 ();
+ arg_test5 ();
+ arg_test6 ();
+
+ /* Test string arrays */
+ array_test1 ();
+
+ /* Test callback args */
+ callback_test1 ();
+ callback_test2 ();
+
+ /* Test optional arg flag for callback */
+ callback_test_optional_1 ();
+ callback_test_optional_2 ();
+ callback_test_optional_3 ();
+ callback_test_optional_4 ();
+ callback_test_optional_5 ();
+ callback_test_optional_6 ();
+ callback_test_optional_7 ();
+ callback_test_optional_8 ();
+
+ /* Test callback with G_OPTION_REMAINING */
+ callback_remaining_test1 ();
+
+ /* Test ignoring options */
+ ignore_test1 ();
+ ignore_test2 ();
+ ignore_test3 ();
+
+ add_test1 ();
+
+ /* Test parsing empty args */
+ empty_test1 ();
+ empty_test2 ();
+ empty_test3 ();
+
+ /* Test handling of rest args */
+ rest_test1 ();
+ rest_test2 ();
+ rest_test2a ();
+ rest_test2b ();
+ rest_test2c ();
+ rest_test2d ();
+ rest_test3 ();
+ rest_test4 ();
+ rest_test5 ();
+
+ /* test for bug 166609 */
+ unknown_short_test ();
+
+ /* test for bug 168008 */
+ lonely_dash_test ();
+
+ /* test for bug 305576 */
+ missing_arg_test ();
+
+ return 0;
+}
diff --git a/trunk/tests/patterntest.c b/trunk/tests/patterntest.c
new file mode 100644
index 000000000..494de1700
--- /dev/null
+++ b/trunk/tests/patterntest.c
@@ -0,0 +1,310 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 2001 Matthias Clasen <matthiasc@poet.de>
+ *
+ * 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.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <string.h>
+
+#include "glib.h"
+#include "glib/gpattern.h"
+
+static gboolean noisy = FALSE;
+
+static void
+verbose (const gchar *format, ...)
+{
+ gchar *msg;
+ va_list args;
+
+ va_start (args, format);
+ msg = g_strdup_vprintf (format, args);
+ va_end (args);
+
+ if (noisy)
+ g_print (msg);
+ g_free (msg);
+}
+
+/* keep enum and structure of gpattern.c and patterntest.c in sync */
+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;
+
+struct _GPatternSpec
+{
+ GMatchType match_type;
+ guint pattern_length;
+ guint min_length;
+ guint max_length;
+ gchar *pattern;
+};
+
+
+static gchar *
+match_type_name (GMatchType match_type)
+{
+ switch (match_type)
+ {
+ case G_MATCH_ALL:
+ return "G_MATCH_ALL";
+ break;
+ case G_MATCH_ALL_TAIL:
+ return "G_MATCH_ALL_TAIL";
+ break;
+ case G_MATCH_HEAD:
+ return "G_MATCH_HEAD";
+ break;
+ case G_MATCH_TAIL:
+ return "G_MATCH_TAIL";
+ break;
+ case G_MATCH_EXACT:
+ return "G_MATCH_EXACT";
+ break;
+ default:
+ return "unknown GMatchType";
+ break;
+ }
+}
+
+static gboolean
+test_compilation (gchar *src,
+ GMatchType match_type,
+ gchar *pattern,
+ guint min)
+{
+ GPatternSpec *spec;
+
+ verbose ("compiling \"%s\" \t", src);
+ spec = g_pattern_spec_new (src);
+
+ if (spec->match_type != match_type)
+ {
+ g_print ("failed \t(match_type: %s, expected %s)\n",
+ match_type_name (spec->match_type),
+ match_type_name (match_type));
+ g_pattern_spec_free (spec);
+ return FALSE;
+ }
+
+ if (strcmp (spec->pattern, pattern) != 0)
+ {
+ g_print ("failed \t(pattern: \"%s\", expected \"%s\")\n",
+ spec->pattern,
+ pattern);
+ g_pattern_spec_free (spec);
+ return FALSE;
+ }
+
+ if (spec->pattern_length != strlen (spec->pattern))
+ {
+ g_print ("failed \t(pattern_length: %d, expected %d)\n",
+ spec->pattern_length,
+ (gint)strlen (spec->pattern));
+ g_pattern_spec_free (spec);
+ return FALSE;
+ }
+
+ if (spec->min_length != min)
+ {
+ g_print ("failed \t(min_length: %d, expected %d)\n",
+ spec->min_length,
+ min);
+ g_pattern_spec_free (spec);
+ return FALSE;
+ }
+
+ verbose ("passed (%s: \"%s\")\n",
+ match_type_name (spec->match_type),
+ spec->pattern);
+
+ g_pattern_spec_free (spec);
+
+ return TRUE;
+}
+
+static gboolean
+test_match (gchar *pattern,
+ gchar *string,
+ gboolean match)
+{
+ verbose ("matching \"%s\" against \"%s\" \t", string, pattern);
+
+ if (g_pattern_match_simple (pattern, string) != match)
+ {
+ g_print ("failed \t(unexpected %s)\n", (match ? "mismatch" : "match"));
+ return FALSE;
+ }
+
+ verbose ("passed (%s)\n", match ? "match" : "nomatch");
+
+ return TRUE;
+}
+
+static gboolean
+test_equal (gchar *pattern1,
+ gchar *pattern2,
+ gboolean expected)
+{
+ GPatternSpec *p1 = g_pattern_spec_new (pattern1);
+ GPatternSpec *p2 = g_pattern_spec_new (pattern2);
+ gboolean equal = g_pattern_spec_equal (p1, p2);
+
+ verbose ("comparing \"%s\" with \"%s\" \t", pattern1, pattern2);
+
+ if (expected != equal)
+ {
+ g_print ("failed \t{%s, %u, \"%s\"} %s {%s, %u, \"%s\"}\n",
+ match_type_name (p1->match_type), p1->pattern_length, p1->pattern,
+ expected ? "!=" : "==",
+ match_type_name (p2->match_type), p2->pattern_length, p2->pattern);
+ }
+ else
+ verbose ("passed (%s)\n", equal ? "equal" : "unequal");
+
+ g_pattern_spec_free (p1);
+ g_pattern_spec_free (p2);
+
+ return expected == equal;
+}
+
+#define TEST_COMPILATION(src, type, pattern, min) { \
+ total++; \
+ if (test_compilation (src, type, pattern, min)) \
+ passed++; \
+ else \
+ failed++; \
+}
+
+#define TEST_MATCH(pattern, string, match) { \
+ total++; \
+ if (test_match (pattern, string, match)) \
+ passed++; \
+ else \
+ failed++; \
+}
+
+#define TEST_EQUAL(pattern1, pattern2, match) { \
+ total++; \
+ if (test_equal (pattern1, pattern2, match)) \
+ passed++; \
+ else \
+ failed++; \
+}
+
+int
+main (int argc, char** argv)
+{
+ gint total = 0;
+ gint passed = 0;
+ gint failed = 0;
+ gint i;
+
+ for (i = 1; i < argc; i++)
+ if (strcmp ("--noisy", argv[i]) == 0)
+ noisy = TRUE;
+
+ TEST_COMPILATION("*A?B*", G_MATCH_ALL, "*A?B*", 3);
+ TEST_COMPILATION("ABC*DEFGH", G_MATCH_ALL_TAIL, "HGFED*CBA", 8);
+ TEST_COMPILATION("ABCDEF*GH", G_MATCH_ALL, "ABCDEF*GH", 8);
+ TEST_COMPILATION("ABC**?***??**DEF*GH", G_MATCH_ALL, "ABC*???DEF*GH", 11);
+ TEST_COMPILATION("*A?AA", G_MATCH_ALL_TAIL, "AA?A*", 4);
+ TEST_COMPILATION("ABCD*", G_MATCH_HEAD, "ABCD", 4);
+ TEST_COMPILATION("*ABCD", G_MATCH_TAIL, "ABCD", 4);
+ TEST_COMPILATION("ABCDE", G_MATCH_EXACT, "ABCDE", 5);
+ TEST_COMPILATION("A?C?E", G_MATCH_ALL, "A?C?E", 5);
+ TEST_COMPILATION("*?x", G_MATCH_ALL_TAIL, "x?*", 2);
+ TEST_COMPILATION("?*x", G_MATCH_ALL_TAIL, "x?*", 2);
+ TEST_COMPILATION("*?*x", G_MATCH_ALL_TAIL, "x?*", 2);
+ TEST_COMPILATION("x*??", G_MATCH_ALL_TAIL, "??*x", 3);
+
+ TEST_EQUAL("*A?B*", "*A?B*", TRUE);
+ TEST_EQUAL("A*BCD", "A*BCD", TRUE);
+ TEST_EQUAL("ABCD*", "ABCD****", TRUE);
+ TEST_EQUAL("A1*", "A1*", TRUE);
+ TEST_EQUAL("*YZ", "*YZ", TRUE);
+ TEST_EQUAL("A1x", "A1x", TRUE);
+ TEST_EQUAL("AB*CD", "AB**CD", TRUE);
+ TEST_EQUAL("AB*?*CD", "AB*?CD", TRUE);
+ TEST_EQUAL("AB*?CD", "AB?*CD", TRUE);
+ TEST_EQUAL("AB*CD", "AB*?*CD", FALSE);
+ TEST_EQUAL("ABC*", "ABC?", FALSE);
+
+ TEST_MATCH("*x", "x", TRUE);
+ TEST_MATCH("*x", "xx", TRUE);
+ TEST_MATCH("*x", "yyyx", TRUE);
+ TEST_MATCH("*x", "yyxy", FALSE);
+ TEST_MATCH("?x", "x", FALSE);
+ TEST_MATCH("?x", "xx", TRUE);
+ TEST_MATCH("?x", "yyyx", FALSE);
+ TEST_MATCH("?x", "yyxy", FALSE);
+ TEST_MATCH("*?x", "xx", TRUE);
+ TEST_MATCH("?*x", "xx", TRUE);
+ TEST_MATCH("*?x", "x", FALSE);
+ TEST_MATCH("?*x", "x", FALSE);
+ TEST_MATCH("*?*x", "yx", TRUE);
+ TEST_MATCH("*?*x", "xxxx", TRUE);
+ TEST_MATCH("x*??", "xyzw", TRUE);
+ TEST_MATCH("*x", "\xc3\x84x", TRUE);
+ TEST_MATCH("?x", "\xc3\x84x", TRUE);
+ TEST_MATCH("??x", "\xc3\x84x", FALSE);
+ TEST_MATCH("ab\xc3\xa4\xc3\xb6", "ab\xc3\xa4\xc3\xb6", TRUE);
+ TEST_MATCH("ab\xc3\xa4\xc3\xb6", "abao", FALSE);
+ TEST_MATCH("ab?\xc3\xb6", "ab\xc3\xa4\xc3\xb6", TRUE);
+ TEST_MATCH("ab?\xc3\xb6", "abao", FALSE);
+ TEST_MATCH("ab\xc3\xa4?", "ab\xc3\xa4\xc3\xb6", TRUE);
+ TEST_MATCH("ab\xc3\xa4?", "abao", FALSE);
+ TEST_MATCH("ab??", "ab\xc3\xa4\xc3\xb6", TRUE);
+ TEST_MATCH("ab*", "ab\xc3\xa4\xc3\xb6", TRUE);
+ TEST_MATCH("ab*\xc3\xb6", "ab\xc3\xa4\xc3\xb6", TRUE);
+ TEST_MATCH("ab*\xc3\xb6", "aba\xc3\xb6x\xc3\xb6", TRUE);
+ TEST_MATCH("", "abc", FALSE);
+
+ TEST_MATCH("", "", TRUE);
+ TEST_MATCH("abc", "abc", TRUE);
+ TEST_MATCH("*fo1*bar", "yyyfoxfo1bar", TRUE);
+ TEST_MATCH("12*fo1g*bar", "12yyyfoxfo1gbar", TRUE);
+ TEST_MATCH("__________:*fo1g*bar", "__________:yyyfoxfo1gbar", TRUE);
+ TEST_MATCH("*abc*cde", "abcde", FALSE);
+ TEST_MATCH("*abc*cde", "abccde", TRUE);
+ TEST_MATCH("*abc*cde", "abcxcde", TRUE);
+ TEST_MATCH("*abc*?cde", "abccde", FALSE);
+ TEST_MATCH("*abc*?cde", "abcxcde", TRUE);
+ TEST_MATCH("*abc*def", "abababcdededef", TRUE);
+ TEST_MATCH("*abc*def", "abcbcbcdededef", TRUE);
+ TEST_MATCH("*acbc*def", "acbcbcbcdededef", TRUE);
+ TEST_MATCH("*a?bc*def", "acbcbcbcdededef", TRUE);
+ TEST_MATCH("*abc*def", "bcbcbcdefdef", FALSE);
+ TEST_MATCH("*abc*def*ghi", "abcbcbcbcbcbcdefefdefdefghi", TRUE);
+ TEST_MATCH("*abc*def*ghi", "bcbcbcbcbcbcdefdefdefdefghi", FALSE);
+ TEST_MATCH("_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_*abc*def*ghi", "_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_abcbcbcbcbcbcdefefdefdefghi", TRUE);
+ TEST_MATCH("fooooooo*a*bc", "fooooooo_a_bd_a_bc", TRUE);
+
+ verbose ("\n%u tests passed, %u failed\n", passed, failed);
+
+ return failed;
+}
+
+
diff --git a/trunk/tests/printf-test.c b/trunk/tests/printf-test.c
new file mode 100644
index 000000000..99f480379
--- /dev/null
+++ b/trunk/tests/printf-test.c
@@ -0,0 +1,244 @@
+/* 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 2003. 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"
+
+#include <stdio.h>
+#include <string.h>
+
+static gboolean any_failed = FALSE;
+static gboolean failed = FALSE;
+
+#define TEST(message,cond) G_STMT_START { failed = !(cond); \
+if (failed) \
+ { if (!message) \
+ g_print ("(%s:%d) failed for: %s\n", __FILE__, __LINE__, ( # cond )); \
+ else \
+ g_print ("(%s:%d) failed for: %s: (%s)\n", __FILE__, __LINE__, ( # cond ), message ? (gchar*)message : ""); \
+ fflush (stdout); \
+ any_failed = TRUE; \
+ } \
+} G_STMT_END
+
+#define TEST_FAILED(message) \
+ G_STMT_START { g_print ("Error: "); g_print message; g_print ("\n"); any_failed = TRUE; } G_STMT_END
+
+static gboolean
+same_value (const gchar *actual,
+ const gchar *expected)
+{
+ gdouble actual_value, expected_value;
+
+ actual_value = g_ascii_strtod (actual, NULL);
+ expected_value = g_ascii_strtod (expected, NULL);
+
+ return actual_value == expected_value;
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ gchar buf[128];
+ int i;
+ long l;
+
+ /* truncation and return value */
+ TEST (NULL, g_snprintf (buf, 0, "abc") == 3);
+ TEST (NULL, g_snprintf (NULL, 0, "abc") == 3);
+ TEST (NULL, g_snprintf (buf, 5, "abc") == 3);
+ TEST (NULL, g_snprintf (buf, 1, "abc") == 3 && buf[0] == '\0' && !strcmp (buf, ""));
+ TEST (NULL, g_snprintf (buf, 2, "abc") == 3 && buf[1] == '\0' && !strcmp (buf, "a"));
+ TEST (NULL, g_snprintf (buf, 3, "abc") == 3 && buf[2] == '\0' && !strcmp (buf, "ab"));
+ TEST (NULL, g_snprintf (buf, 4, "abc") == 3 && buf[3] == '\0' && !strcmp (buf, "abc"));
+ TEST (NULL, g_snprintf (buf, 5, "abc") == 3 && buf[3] == '\0' && !strcmp (buf, "abc"));
+
+ /* %d, basic formatting */
+ TEST (NULL, g_snprintf (buf, 128, "%d", 5) == 1 && !strcmp (buf, "5"));
+ TEST (NULL, g_snprintf (buf, 128, "%d", 0) == 1 && !strcmp (buf, "0"));
+ TEST (NULL, g_snprintf (buf, 128, "%.0d", 0) == 0 && !strcmp (buf, ""));
+ TEST (NULL, g_snprintf (buf, 128, "%.0d", 1) == 1 && !strcmp (buf, "1"));
+ TEST (NULL, g_snprintf (buf, 128, "%.d", 2) == 1 && !strcmp (buf, "2"));
+ TEST (NULL, g_snprintf (buf, 128, "%d", -1) == 2 && !strcmp (buf, "-1"));
+ TEST (NULL, g_snprintf (buf, 128, "%.3d", 5) == 3 && !strcmp (buf, "005"));
+ TEST (NULL, g_snprintf (buf, 128, "%.3d", -5) == 4 && !strcmp (buf, "-005"));
+ TEST (NULL, g_snprintf (buf, 128, "%5.3d", 5) == 5 && !strcmp (buf, " 005"));
+ TEST (NULL, g_snprintf (buf, 128, "%-5.3d", -5) == 5 && !strcmp (buf, "-005 "));
+ /* %d, length modifiers */
+ TEST (NULL, g_snprintf (buf, 128, "%" G_GINT16_FORMAT, (gint16)-5) == 2 && !strcmp (buf, "-5"));
+ TEST (NULL, g_snprintf (buf, 128, "%" G_GUINT16_FORMAT, (guint16)5) == 1 && !strcmp (buf, "5"));
+ TEST (NULL, g_snprintf (buf, 128, "%" G_GINT32_FORMAT, (gint32)-5) == 2 && !strcmp (buf, "-5"));
+ TEST (NULL, g_snprintf (buf, 128, "%" G_GUINT32_FORMAT, (guint32)5) == 1 && !strcmp (buf, "5"));
+ TEST (NULL, g_snprintf (buf, 128, "%" G_GINT64_FORMAT, (gint64)-5) == 2 && !strcmp (buf, "-5"));
+ TEST (NULL, g_snprintf (buf, 128, "%" G_GUINT64_FORMAT, (guint64)5) == 1 && !strcmp (buf, "5"));
+ TEST (NULL, g_snprintf (buf, 128, "%" G_GSSIZE_FORMAT, (gssize)-5) == 2 && !strcmp (buf, "-5"));
+ TEST (NULL, g_snprintf (buf, 128, "%" G_GSIZE_FORMAT, (gsize)5) == 1 && !strcmp (buf, "5"));
+ /* %d, flags */
+ TEST (NULL, g_snprintf (buf, 128, "%-d", 5) == 1 && !strcmp (buf, "5"));
+ TEST (NULL, g_snprintf (buf, 128, "%-+d", 5) == 2 && !strcmp (buf, "+5"));
+ TEST (NULL, g_snprintf (buf, 128, "%+-d", 5) == 2 && !strcmp (buf, "+5"));
+ TEST (NULL, g_snprintf (buf, 128, "%+d", -5) == 2 && !strcmp (buf, "-5"));
+ TEST (NULL, g_snprintf (buf, 128, "% d", 5) == 2 && !strcmp (buf, " 5"));
+ TEST (NULL, g_snprintf (buf, 128, "% .0d", 0) == 1 && !strcmp (buf, " "));
+ TEST (NULL, g_snprintf (buf, 128, "% +d", 5) == 2 && !strcmp (buf, "+5"));
+ TEST (NULL, g_snprintf (buf, 128, "%03d", 5) == 3 && !strcmp (buf, "005"));
+ TEST (NULL, g_snprintf (buf, 128, "%-03d", -5) == 3 && !strcmp (buf, "-5 "));
+ TEST (NULL, g_snprintf (buf, 128, "%03d", -5) == 3 && !strcmp (buf, "-05"));
+
+ /* %o, basic formatting */
+ TEST (NULL, g_snprintf (buf, 128, "%o", 5) == 1 && !strcmp (buf, "5"));
+ TEST (NULL, g_snprintf (buf, 128, "%o", 8) == 2 && !strcmp (buf, "10"));
+ TEST (NULL, g_snprintf (buf, 128, "%o", 0) == 1 && !strcmp (buf, "0"));
+ TEST (NULL, g_snprintf (buf, 128, "%.0o", 0) == 0 && !strcmp (buf, ""));
+ TEST (NULL, g_snprintf (buf, 128, "%.0o", 1) == 1 && !strcmp (buf, "1"));
+ TEST (NULL, g_snprintf (buf, 128, "%.3o", 5) == 3 && !strcmp (buf, "005"));
+ TEST (NULL, g_snprintf (buf, 128, "%.3o", 8) == 3 && !strcmp (buf, "010"));
+ TEST (NULL, g_snprintf (buf, 128, "%5.3o", 5) == 5 && !strcmp (buf, " 005"));
+
+ /* %u, basic formatting */
+ TEST (NULL, g_snprintf (buf, 128, "%u", 5) == 1 && !strcmp (buf, "5"));
+ TEST (NULL, g_snprintf (buf, 128, "%u", 0) == 1 && !strcmp (buf, "0"));
+ TEST (NULL, g_snprintf (buf, 128, "%.0u", 0) == 0 && !strcmp (buf, ""));
+ TEST (NULL, g_snprintf (buf, 128, "%.0u", 1) == 1 && !strcmp (buf, "1"));
+ TEST (NULL, g_snprintf (buf, 128, "%.3u", 5) == 3 && !strcmp (buf, "005"));
+ TEST (NULL, g_snprintf (buf, 128, "%5.3u", 5) == 5 && !strcmp (buf, " 005"));
+
+ /* %x, basic formatting */
+ TEST (NULL, g_snprintf (buf, 128, "%x", 5) == 1 && !strcmp (buf, "5"));
+ TEST (buf, g_snprintf (buf, 128, "%x", 31) == 2 && !strcmp (buf, "1f"));
+ TEST (NULL, g_snprintf (buf, 128, "%x", 0) == 1 && !strcmp (buf, "0"));
+ TEST (NULL, g_snprintf (buf, 128, "%.0x", 0) == 0 && !strcmp (buf, ""));
+ TEST (NULL, g_snprintf (buf, 128, "%.0x", 1) == 1 && !strcmp (buf, "1"));
+ TEST (NULL, g_snprintf (buf, 128, "%.3x", 5) == 3 && !strcmp (buf, "005"));
+ TEST (NULL, g_snprintf (buf, 128, "%.3x", 31) == 3 && !strcmp (buf, "01f"));
+ TEST (NULL, g_snprintf (buf, 128, "%5.3x", 5) == 5 && !strcmp (buf, " 005"));
+ /* %x, flags */
+ TEST (NULL, g_snprintf (buf, 128, "%-x", 5) == 1 && !strcmp (buf, "5"));
+ TEST (NULL, g_snprintf (buf, 128, "%03x", 5) == 3 && !strcmp (buf, "005"));
+ TEST (NULL, g_snprintf (buf, 128, "%#x", 31) == 4 && !strcmp (buf, "0x1f"));
+ TEST (NULL, g_snprintf (buf, 128, "%#x", 0) == 1 && !strcmp (buf, "0"));
+
+ /* %X, basic formatting */
+ TEST (NULL, g_snprintf (buf, 128, "%X", 5) == 1 && !strcmp (buf, "5"));
+ TEST (buf, g_snprintf (buf, 128, "%X", 31) == 2 && !strcmp (buf, "1F"));
+ TEST (NULL, g_snprintf (buf, 128, "%X", 0) == 1 && !strcmp (buf, "0"));
+ TEST (NULL, g_snprintf (buf, 128, "%.0X", 0) == 0 && !strcmp (buf, ""));
+ TEST (NULL, g_snprintf (buf, 128, "%.0X", 1) == 1 && !strcmp (buf, "1"));
+ TEST (NULL, g_snprintf (buf, 128, "%.3X", 5) == 3 && !strcmp (buf, "005"));
+ TEST (NULL, g_snprintf (buf, 128, "%.3X", 31) == 3 && !strcmp (buf, "01F"));
+ TEST (NULL, g_snprintf (buf, 128, "%5.3X", 5) == 5 && !strcmp (buf, " 005"));
+ /* %X, flags */
+ TEST (NULL, g_snprintf (buf, 128, "%-X", 5) == 1 && !strcmp (buf, "5"));
+ TEST (NULL, g_snprintf (buf, 128, "%03X", 5) == 3 && !strcmp (buf, "005"));
+ TEST (NULL, g_snprintf (buf, 128, "%#X", 31) == 4 && !strcmp (buf, "0X1F"));
+ TEST (NULL, g_snprintf (buf, 128, "%#X", 0) == 1 && !strcmp (buf, "0"));
+
+ /* %f, basic formattting */
+ TEST (NULL, g_snprintf (buf, 128, "%f", G_PI) == 8 && !strncmp (buf, "3.14159", 7));
+ TEST (NULL, g_snprintf (buf, 128, "%.8f", G_PI) == 10 && !strncmp (buf, "3.1415926", 9));
+ TEST (NULL, g_snprintf (buf, 128, "%.0f", G_PI) == 1 && !strcmp (buf, "3"));
+ TEST (NULL, g_snprintf (buf, 128, "%1.f", G_PI) == 1 && !strcmp (buf, "3"));
+ TEST (NULL, g_snprintf (buf, 128, "%3.f", G_PI) == 3 && !strcmp (buf, " 3"));
+ /* %f, flags */
+ TEST (NULL, g_snprintf (buf, 128, "%+f", G_PI) == 9 && !strncmp (buf, "+3.14159", 8));
+ TEST (NULL, g_snprintf (buf, 128, "% f", G_PI) == 9 && !strncmp (buf, " 3.14159", 8));
+ TEST (NULL, g_snprintf (buf, 128, "%#.0f", G_PI) == 2 && !strcmp (buf, "3."));
+ TEST (NULL, g_snprintf (buf, 128, "%05.2f", G_PI) == 5 && !strcmp (buf, "03.14"));
+
+ /* %e, basic formatting */
+ /* for %e we can't expect to reproduce exact strings and lengths, since SUS
+ * only guarantees that the exponent shall always contain at least two
+ * digits. On Windows, it seems to be at least three digits long.
+ * Therefore, we compare the results of parsing the expected result and the
+ * actual result.
+ */
+ TEST (buf, g_snprintf (buf, 128, "%e", G_PI) >= 12 && same_value (buf, "3.141593e+00"));
+ TEST (buf, g_snprintf (buf, 128, "%.8e", G_PI) >= 14 && same_value (buf, "3.14159265e+00"));
+ TEST (buf, g_snprintf (buf, 128, "%.0e", G_PI) >= 5 && same_value (buf, "3e+00"));
+ TEST (buf, g_snprintf (buf, 128, "%.1e", 0.0) >= 7 && same_value (buf, "0.0e+00"));
+ TEST (buf, g_snprintf (buf, 128, "%.1e", 0.00001) >= 7 && same_value (buf, "1.0e-05"));
+ TEST (buf, g_snprintf (buf, 128, "%.1e", 10000.0) >= 7 && same_value (buf, "1.0e+04"));
+ /* %e, flags */
+ TEST (buf, g_snprintf (buf, 128, "%+e", G_PI) >= 13 && same_value (buf, "+3.141593e+00"));
+ TEST (buf, g_snprintf (buf, 128, "% e", G_PI) >= 13 && same_value (buf, " 3.141593e+00"));
+ TEST (buf, g_snprintf (buf, 128, "%#.0e", G_PI) >= 6 && same_value (buf, "3.e+00"));
+ TEST (buf, g_snprintf (buf, 128, "%09.2e", G_PI) >= 9 && same_value (buf, "03.14e+00"));
+
+ /* %c */
+ TEST (NULL, g_snprintf (buf, 128, "%c", 'a') == 1 && !strcmp (buf, "a"));
+
+ /* %s */
+ TEST (NULL, g_snprintf (buf, 128, "%.2s", "abc") == 2 && !strcmp (buf, "ab"));
+ TEST (NULL, g_snprintf (buf, 128, "%.6s", "abc") == 3 && !strcmp (buf, "abc"));
+ TEST (NULL, g_snprintf (buf, 128, "%5s", "abc") == 5 && !strcmp (buf, " abc"));
+ TEST (NULL, g_snprintf (buf, 128, "%-5s", "abc") == 5 && !strcmp (buf, "abc "));
+ TEST (NULL, g_snprintf (buf, 128, "%5.2s", "abc") == 5 && !strcmp (buf, " ab"));
+ TEST (NULL, g_snprintf (buf, 128, "%*s", 5, "abc") == 5 && !strcmp (buf, " abc"));
+#if 0 /* HP-UX doesn't get this right */
+ TEST (NULL, g_snprintf (buf, 128, "%*s", -5, "abc") == 5 && !strcmp (buf, "abc "));
+#endif
+ TEST (NULL, g_snprintf (buf, 128, "%*.*s", 5, 2, "abc") == 5 && !strcmp (buf, " ab"));
+
+ /* %n */
+ TEST (NULL, g_snprintf (buf, 128, "abc%n", &i) == 3 && !strcmp (buf, "abc") && i == 3);
+ TEST (NULL, g_snprintf (buf, 128, "abc%ln", &l) == 3 && !strcmp (buf, "abc") && l == 3);
+
+ /* %% */
+ TEST (NULL, g_snprintf (buf, 128, "%%") == 1 && !strcmp (buf, "%"));
+
+ /* positional parameters */
+ TEST (NULL, g_snprintf (buf, 128, "%2$c %1$c", 'b', 'a') == 3 && !strcmp (buf, "a b"));
+ TEST (NULL, g_snprintf (buf, 128, "%1$*2$.*3$s", "abc", 5, 2) == 5 && !strcmp (buf, " ab"));
+ TEST (NULL, g_snprintf (buf, 128, "%1$s%1$s", "abc") == 6 && !strcmp (buf, "abcabc"));
+
+ /* 64 bit support */
+ TEST (NULL, g_snprintf (buf, 128, "%" G_GINT64_FORMAT, (gint64)123456) == 6 && !strcmp (buf, "123456"));
+ TEST (NULL, g_snprintf (buf, 128, "%" G_GINT64_FORMAT, (gint64)-123456) == 7 && !strcmp (buf, "-123456"));
+ TEST (NULL, g_snprintf (buf, 128, "%" G_GUINT64_FORMAT, (guint64)123456) == 6 && !strcmp (buf, "123456"));
+ TEST (NULL, g_snprintf (buf, 128, "%" G_GINT64_MODIFIER "o", (gint64)123456) == 6 && !strcmp (buf, "361100"));
+ TEST (NULL, g_snprintf (buf, 128, "%#" G_GINT64_MODIFIER "o", (gint64)123456) == 7 && !strcmp (buf, "0361100"));
+ TEST (NULL, g_snprintf (buf, 128, "%" G_GINT64_MODIFIER "x", (gint64)123456) == 5 && !strcmp (buf, "1e240"));
+ TEST (NULL, g_snprintf (buf, 128, "%#" G_GINT64_MODIFIER "x", (gint64)123456) == 7 && !strcmp (buf, "0x1e240"));
+ TEST (NULL, g_snprintf (buf, 128, "%" G_GINT64_MODIFIER "X", (gint64)123456) == 5 && !strcmp (buf, "1E240"));
+#ifdef G_OS_WIN32
+ /* On Win32, test that the "ll" modifier also works, for backward
+ * compatibility. One really should use the G_GINT64_MODIFIER (which
+ * on Win32 is the "I64" that the (msvcrt) C library's printf uses),
+ * but "ll" used to work with the "trio" g_printf implementation in
+ * GLib 2.2, so it's best if it continues to work.
+ */
+ TEST (NULL, g_snprintf (buf, 128, "%" "lli", (gint64)123456) == 6 && !strcmp (buf, "123456"));
+ TEST (NULL, g_snprintf (buf, 128, "%" "lli", (gint64)-123456) == 7 && !strcmp (buf, "-123456"));
+ TEST (NULL, g_snprintf (buf, 128, "%" "llu", (guint64)123456) == 6 && !strcmp (buf, "123456"));
+ TEST (NULL, g_snprintf (buf, 128, "%" "ll" "o", (gint64)123456) == 6 && !strcmp (buf, "361100"));
+ TEST (NULL, g_snprintf (buf, 128, "%#" "ll" "o", (gint64)123456) == 7 && !strcmp (buf, "0361100"));
+ TEST (NULL, g_snprintf (buf, 128, "%" "ll" "x", (gint64)123456) == 5 && !strcmp (buf, "1e240"));
+ TEST (NULL, g_snprintf (buf, 128, "%#" "ll" "x", (gint64)123456) == 7 && !strcmp (buf, "0x1e240"));
+ TEST (NULL, g_snprintf (buf, 128, "%" "ll" "X", (gint64)123456) == 5 && !strcmp (buf, "1E240"));
+#endif
+
+ return any_failed;
+}
diff --git a/trunk/tests/qsort-test.c b/trunk/tests/qsort-test.c
new file mode 100644
index 000000000..2befa2e51
--- /dev/null
+++ b/trunk/tests/qsort-test.c
@@ -0,0 +1,33 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <glib.h>
+
+#define SIZE 100000
+
+guint32 array[SIZE];
+
+static gint
+sort (gconstpointer a, gconstpointer b, gpointer user_data)
+{
+ return *(guint32*)a < *(guint32*)b ? -1 : 1;
+}
+
+int
+main ()
+{
+ int i;
+
+ for (i = 0; i < SIZE; i++)
+ array[i] = g_random_int ();
+
+ g_qsort_with_data (array, SIZE, sizeof (guint32), sort, NULL);
+
+ for (i = 0; i < SIZE - 1; i++)
+ g_assert (array[i] <= array[i+1]);
+
+ /* 0 elemenents is a valid case */
+ g_qsort_with_data (array, 0, sizeof (guint32), sort, NULL);
+
+ return 0;
+}
diff --git a/trunk/tests/queue-test.c b/trunk/tests/queue-test.c
new file mode 100644
index 000000000..448e8bd40
--- /dev/null
+++ b/trunk/tests/queue-test.c
@@ -0,0 +1,962 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <time.h>
+#include <stdlib.h>
+
+#include <glib.h>
+
+
+static gboolean verbose = FALSE;
+
+
+static void
+check_integrity (GQueue *queue)
+{
+ GList *list;
+ GList *last;
+ GList *links;
+ GList *link;
+ gint n;
+
+ g_assert (queue->length < 4000000000u);
+
+ g_assert (g_queue_get_length (queue) == queue->length);
+
+ if (!queue->head)
+ g_assert (!queue->tail);
+ if (!queue->tail)
+ g_assert (!queue->head);
+
+ n = 0;
+ last = NULL;
+ for (list = queue->head; list != NULL; list = list->next)
+ {
+ if (!list->next)
+ last = list;
+ ++n;
+ }
+ g_assert (n == queue->length);
+ g_assert (last == queue->tail);
+
+ n = 0;
+ last = NULL;
+ for (list = queue->tail; list != NULL; list = list->prev)
+ {
+ if (!list->prev)
+ last = list;
+ ++n;
+ }
+ g_assert (n == queue->length);
+ g_assert (last == queue->head);
+
+ links = NULL;
+ for (list = queue->head; list != NULL; list = list->next)
+ links = g_list_prepend (links, list);
+
+ link = links;
+ for (list = queue->tail; list != NULL; list = list->prev)
+ {
+ g_assert (list == link->data);
+ link = link->next;
+ }
+ g_list_free (links);
+
+ links = NULL;
+ for (list = queue->tail; list != NULL; list = list->prev)
+ links = g_list_prepend (links, list);
+
+ link = links;
+ for (list = queue->head; list != NULL; list = list->next)
+ {
+ g_assert (list == link->data);
+ link = link->next;
+ }
+ g_list_free (links);
+}
+
+static gboolean
+rnd_bool (void)
+{
+ return g_random_int_range (0, 2);
+}
+
+static void
+check_max (gpointer elm, gpointer user_data)
+{
+ gint *best = user_data;
+ gint element = GPOINTER_TO_INT (elm);
+
+ if (element > *best)
+ *best = element;
+}
+
+static void
+check_min (gpointer elm, gpointer user_data)
+{
+ gint *best = user_data;
+ gint element = GPOINTER_TO_INT (elm);
+
+ if (element < *best)
+ *best = element;
+}
+
+static gint
+find_min (GQueue *queue)
+{
+ gint min = G_MAXINT;
+
+ g_queue_foreach (queue, check_min, &min);
+
+ return min;
+}
+
+static gint
+find_max (GQueue *queue)
+{
+ gint max = G_MININT;
+
+ g_queue_foreach (queue, check_max, &max);
+
+ return max;
+}
+
+static void
+delete_elm (gpointer elm, gpointer user_data)
+{
+ g_queue_remove ((GQueue *)user_data, elm);
+ check_integrity ((GQueue *)user_data);
+}
+
+static void
+delete_all (GQueue *queue)
+{
+ g_queue_foreach (queue, delete_elm, queue);
+}
+
+static int
+compare_int (gconstpointer a, gconstpointer b, gpointer data)
+{
+ int ai = GPOINTER_TO_INT (a);
+ int bi = GPOINTER_TO_INT (b);
+
+ if (ai > bi)
+ return 1;
+ else if (ai == bi)
+ return 0;
+ else
+ return -1;
+}
+
+static gint
+get_random_position (GQueue *queue, gboolean allow_offlist)
+{
+ int n;
+ enum { OFF_QUEUE, HEAD, TAIL, MIDDLE, LAST } where;
+
+ if (allow_offlist)
+ where = g_random_int_range (OFF_QUEUE, LAST);
+ else
+ where = g_random_int_range (HEAD, LAST);
+
+ switch (where)
+ {
+ case OFF_QUEUE:
+ n = g_random_int ();
+ break;
+
+ case HEAD:
+ n = 0;
+ break;
+
+ case TAIL:
+ if (allow_offlist)
+ n = queue->length;
+ else
+ n = queue->length - 1;
+ break;
+
+ case MIDDLE:
+ if (queue->length == 0)
+ n = 0;
+ else
+ n = g_random_int_range (0, queue->length);
+ break;
+
+ default:
+ g_assert_not_reached();
+ n = 100;
+ break;
+
+ }
+
+ return n;
+}
+
+static void
+random_test (int seed)
+{
+ typedef enum {
+ IS_EMPTY, GET_LENGTH, REVERSE, COPY,
+ FOREACH, FIND, FIND_CUSTOM, SORT,
+ PUSH_HEAD, PUSH_TAIL, PUSH_NTH, POP_HEAD,
+ POP_TAIL, POP_NTH, PEEK_HEAD, PEEK_TAIL,
+ PEEK_NTH, INDEX, REMOVE, REMOVE_ALL,
+ INSERT_BEFORE, INSERT_AFTER, INSERT_SORTED, PUSH_HEAD_LINK,
+ PUSH_TAIL_LINK, PUSH_NTH_LINK, POP_HEAD_LINK, POP_TAIL_LINK,
+ POP_NTH_LINK, PEEK_HEAD_LINK, PEEK_TAIL_LINK, PEEK_NTH_LINK,
+ LINK_INDEX, UNLINK, DELETE_LINK, LAST_OP
+ } QueueOp;
+
+#define N_ITERATIONS 500000
+#define N_QUEUES 3
+
+#define RANDOM_QUEUE() &(queues[g_random_int_range(0, N_QUEUES)])
+
+ typedef struct QueueInfo QueueInfo;
+ struct QueueInfo
+ {
+ GQueue *queue;
+ GList *tail;
+ GList *head;
+ guint length;
+ };
+
+ gint i;
+ QueueOp op;
+ QueueInfo queues[N_QUEUES];
+
+ if (verbose)
+ g_print ("seed: %d\n", seed);
+
+ g_random_set_seed (seed);
+
+ for (i = 0; i < N_QUEUES; ++i)
+ {
+ queues[i].queue = g_queue_new ();
+ queues[i].head = NULL;
+ queues[i].tail = NULL;
+ queues[i].length = 0;
+ }
+
+ for (i = 0; i < N_ITERATIONS; ++i)
+ {
+ int j;
+ QueueInfo *qinf = RANDOM_QUEUE();
+ GQueue *q = qinf->queue;
+ op = g_random_int_range (IS_EMPTY, LAST_OP);
+
+ g_assert (qinf->head == q->head);
+ g_assert (qinf->tail == q->tail);
+ g_assert (qinf->length == q->length);
+
+ switch (op)
+ {
+ case IS_EMPTY:
+ {
+ if (g_queue_is_empty (qinf->queue))
+ {
+ g_assert (q->head == NULL);
+ g_assert (q->tail == NULL);
+ g_assert (q->length == 0);
+ }
+ else
+ {
+ g_assert (q->head);
+ g_assert (q->tail);
+ g_assert (q->length > 0);
+ }
+ }
+ break;
+ case GET_LENGTH:
+ {
+ int l;
+
+ l = g_queue_get_length (q);
+
+ g_assert (qinf->length == q->length);
+ g_assert (qinf->length == l);
+ }
+ break;
+ case REVERSE:
+ g_queue_reverse (q);
+ g_assert (qinf->tail == q->head);
+ g_assert (qinf->head == q->tail);
+ g_assert (qinf->length == q->length);
+ qinf->tail = q->tail;
+ qinf->head = q->head;
+ break;
+ case COPY:
+ {
+ QueueInfo *random_queue = RANDOM_QUEUE();
+ GQueue *new_queue = g_queue_copy (random_queue->queue);
+
+ g_queue_free (qinf->queue);
+ q = qinf->queue = new_queue;
+ qinf->head = new_queue->head;
+ qinf->tail = g_list_last (new_queue->head);
+ qinf->length = new_queue->length;
+ }
+ break;
+ case FOREACH:
+ delete_all (q);
+ qinf->head = NULL;
+ qinf->tail = NULL;
+ qinf->length = 0;
+ break;
+ case FIND:
+ {
+ gboolean find_existing = rnd_bool ();
+ int first = find_max (q);
+ int second = find_min (q);
+
+ if (q->length == 0)
+ find_existing = FALSE;
+
+ if (!find_existing)
+ first++;
+ if (!find_existing)
+ second--;
+
+ if (find_existing)
+ {
+ g_assert (g_queue_find (q, GINT_TO_POINTER (first)));
+ g_assert (g_queue_find (q, GINT_TO_POINTER (second)));
+ }
+ else
+ {
+ g_assert (!g_queue_find (q, GINT_TO_POINTER (first)));
+ g_assert (!g_queue_find (q, GINT_TO_POINTER (second)));
+ }
+ }
+ break;
+ case FIND_CUSTOM:
+ break;
+ case SORT:
+ {
+ if (!g_queue_is_empty (q))
+ {
+ int max = find_max (q);
+ int min = find_min (q);
+ g_queue_remove_all (q, GINT_TO_POINTER (max));
+ check_integrity (q);
+ g_queue_remove_all (q, GINT_TO_POINTER (min));
+ check_integrity (q);
+ g_queue_push_head (q, GINT_TO_POINTER (max));
+ if (max != min)
+ g_queue_push_head (q, GINT_TO_POINTER (min));
+ qinf->length = q->length;
+ }
+
+ check_integrity (q);
+
+ g_queue_sort (q, compare_int, NULL);
+
+ check_integrity (q);
+
+ qinf->head = g_queue_find (q, GINT_TO_POINTER (find_min(q)));
+ qinf->tail = g_queue_find (q, GINT_TO_POINTER (find_max(q)));
+
+ g_assert (qinf->tail == q->tail);
+ }
+ break;
+ case PUSH_HEAD:
+ {
+ int x = g_random_int_range (0, 435435);
+ g_queue_push_head (q, GINT_TO_POINTER (x));
+ if (!qinf->head)
+ qinf->tail = qinf->head = q->head;
+ else
+ qinf->head = qinf->head->prev;
+ qinf->length++;
+ }
+ break;
+ case PUSH_TAIL:
+ {
+ int x = g_random_int_range (0, 236546);
+ g_queue_push_tail (q, GINT_TO_POINTER (x));
+ if (!qinf->tail)
+ qinf->tail = qinf->head = q->head;
+ else
+ qinf->tail = qinf->tail->next;
+ qinf->length++;
+ }
+ break;
+ case PUSH_NTH:
+ {
+ int pos = get_random_position (q, TRUE);
+ int x = g_random_int_range (0, 236546);
+ g_queue_push_nth (q, GINT_TO_POINTER (x), pos);
+ if (qinf->head && qinf->head->prev)
+ qinf->head = qinf->head->prev;
+ else
+ qinf->head = q->head;
+ if (qinf->tail && qinf->tail->next)
+ qinf->tail = qinf->tail->next;
+ else
+ qinf->tail = g_list_last (qinf->head);
+ qinf->length++;
+ }
+ break;
+ case POP_HEAD:
+ if (qinf->head)
+ qinf->head = qinf->head->next;
+ if (!qinf->head)
+ qinf->tail = NULL;
+ qinf->length = (qinf->length == 0)? 0 : qinf->length - 1;
+ g_queue_pop_head (q);
+ break;
+ case POP_TAIL:
+ if (qinf->tail)
+ qinf->tail = qinf->tail->prev;
+ if (!qinf->tail)
+ qinf->head = NULL;
+ qinf->length = (qinf->length == 0)? 0 : qinf->length - 1;
+ g_queue_pop_tail (q);
+ break;
+ case POP_NTH:
+ if (!g_queue_is_empty (q))
+ {
+ int n = get_random_position (q, TRUE);
+ gpointer elm = g_queue_peek_nth (q, n);
+
+ if (n == q->length - 1)
+ qinf->tail = qinf->tail->prev;
+
+ if (n == 0)
+ qinf->head = qinf->head->next;
+
+ if (n >= 0 && n < q->length)
+ qinf->length--;
+
+ g_assert (elm == g_queue_pop_nth (q, n));
+ }
+ break;
+ case PEEK_HEAD:
+ if (qinf->head)
+ g_assert (qinf->head->data == g_queue_peek_head (q));
+ else
+ g_assert (g_queue_peek_head (q) == NULL);
+ break;
+ case PEEK_TAIL:
+ if (qinf->head)
+ g_assert (qinf->tail->data == g_queue_peek_tail (q));
+ else
+ g_assert (g_queue_peek_tail (q) == NULL);
+ break;
+ case PEEK_NTH:
+ if (g_queue_is_empty (q))
+ {
+ for (j = -10; j < 10; ++j)
+ g_assert (g_queue_peek_nth (q, j) == NULL);
+ }
+ else
+ {
+ GList *list;
+ int n = get_random_position (q, TRUE);
+ if (n < 0 || n >= q->length)
+ {
+ g_assert (g_queue_peek_nth (q, n) == NULL);
+ }
+ else
+ {
+ list = qinf->head;
+ for (j = 0; j < n; ++j)
+ list = list->next;
+
+ g_assert (list->data == g_queue_peek_nth (q, n));
+ }
+ }
+ break;
+ case INDEX:
+ case LINK_INDEX:
+ {
+ int x = g_random_int_range (0, 386538);
+ int n;
+ GList *list;
+
+ g_queue_remove_all (q, GINT_TO_POINTER (x));
+ check_integrity (q);
+ g_queue_push_tail (q, GINT_TO_POINTER (x));
+ check_integrity (q);
+ g_queue_sort (q, compare_int, NULL);
+ check_integrity (q);
+
+ n = 0;
+ for (list = q->head; list != NULL; list = list->next)
+ {
+ if (list->data == GINT_TO_POINTER (x))
+ break;
+ n++;
+ }
+ g_assert (list);
+ g_assert (g_queue_index (q, GINT_TO_POINTER (x)) ==
+ g_queue_link_index (q, list));
+ g_assert (g_queue_link_index (q, list) == n);
+
+ qinf->head = q->head;
+ qinf->tail = q->tail;
+ qinf->length = q->length;
+ }
+ break;
+ case REMOVE:
+ if (!g_queue_is_empty (q))
+ g_queue_remove (q, qinf->tail->data);
+ if (!g_queue_is_empty (q))
+ g_queue_remove (q, qinf->head->data);
+ if (!g_queue_is_empty (q))
+ g_queue_remove (q, g_queue_peek_nth (q, get_random_position (q, TRUE)));
+
+ qinf->head = q->head;
+ qinf->tail = q->tail;
+ qinf->length = q->length;
+ break;
+ case REMOVE_ALL:
+ if (!g_queue_is_empty (q))
+ g_queue_remove_all (q, qinf->tail->data);
+ if (!g_queue_is_empty (q))
+ g_queue_remove_all (q, qinf->head->data);
+ if (!g_queue_is_empty (q))
+ g_queue_remove_all (q, g_queue_peek_nth (q, get_random_position (q, TRUE)));
+
+ qinf->head = q->head;
+ qinf->tail = q->tail;
+ qinf->length = q->length;
+ break;
+ case INSERT_BEFORE:
+ if (!g_queue_is_empty (q))
+ {
+ gpointer x = GINT_TO_POINTER (g_random_int_range (0, 386538));
+
+ g_queue_insert_before (q, qinf->tail, x);
+ g_queue_insert_before (q, qinf->head, x);
+ g_queue_insert_before (q, g_queue_find (q, x), x);
+ }
+ qinf->head = q->head;
+ qinf->tail = q->tail;
+ qinf->length = q->length;
+ break;
+ case INSERT_AFTER:
+ if (!g_queue_is_empty (q))
+ {
+ gpointer x = GINT_TO_POINTER (g_random_int_range (0, 386538));
+
+ g_queue_insert_after (q, qinf->tail, x);
+ g_queue_insert_after (q, qinf->head, x);
+ g_queue_insert_after (q, g_queue_find (q, x), x);
+ }
+ qinf->head = q->head;
+ qinf->tail = q->tail;
+ qinf->length = q->length;
+ break;
+ case INSERT_SORTED:
+ {
+ int max = find_max (q);
+ int min = find_min (q);
+
+ if (g_queue_is_empty (q))
+ {
+ max = 345;
+ min = -12;
+ }
+
+ g_queue_sort (q, compare_int, NULL);
+ check_integrity (q);
+ g_queue_insert_sorted (q, GINT_TO_POINTER (max + 1), compare_int, NULL);
+ check_integrity (q);
+ g_assert (GPOINTER_TO_INT (q->tail->data) == max + 1);
+ g_queue_insert_sorted (q, GINT_TO_POINTER (min - 1), compare_int, NULL);
+ check_integrity (q);
+ g_assert (GPOINTER_TO_INT (q->head->data) == min - 1);
+ qinf->head = q->head;
+ qinf->tail = q->tail;
+ qinf->length = q->length;
+ }
+ break;
+ case PUSH_HEAD_LINK:
+ {
+ GList *link = g_list_prepend (NULL, GINT_TO_POINTER (i));
+ g_queue_push_head_link (q, link);
+ if (!qinf->tail)
+ qinf->tail = link;
+ qinf->head = link;
+ qinf->length++;
+ }
+ break;
+ case PUSH_TAIL_LINK:
+ {
+ GList *link = g_list_prepend (NULL, GINT_TO_POINTER (i));
+ g_queue_push_tail_link (q, link);
+ if (!qinf->head)
+ qinf->head = link;
+ qinf->tail = link;
+ qinf->length++;
+ }
+ break;
+ case PUSH_NTH_LINK:
+ {
+ GList *link = g_list_prepend (NULL, GINT_TO_POINTER (i));
+ gint n = get_random_position (q, TRUE);
+ g_queue_push_nth_link (q, n, link);
+
+ if (qinf->head && qinf->head->prev)
+ qinf->head = qinf->head->prev;
+ else
+ qinf->head = q->head;
+ if (qinf->tail && qinf->tail->next)
+ qinf->tail = qinf->tail->next;
+ else
+ qinf->tail = g_list_last (qinf->head);
+ qinf->length++;
+ }
+ break;
+ case POP_HEAD_LINK:
+ if (!g_queue_is_empty (q))
+ {
+ qinf->head = qinf->head->next;
+ if (!qinf->head)
+ qinf->tail = NULL;
+ qinf->length--;
+ g_list_free (g_queue_pop_head_link (q));
+ }
+ break;
+ case POP_TAIL_LINK:
+ if (!g_queue_is_empty (q))
+ {
+ qinf->tail = qinf->tail->prev;
+ if (!qinf->tail)
+ qinf->head = NULL;
+ qinf->length--;
+ g_list_free (g_queue_pop_tail_link (q));
+ }
+ break;
+ case POP_NTH_LINK:
+ if (g_queue_is_empty (q))
+ g_assert (g_queue_pop_nth_link (q, 200) == NULL);
+ else
+ {
+ int n = get_random_position (q, FALSE);
+
+ if (n == g_queue_get_length (q) - 1)
+ qinf->tail = qinf->tail->prev;
+
+ if (n == 0)
+ qinf->head = qinf->head->next;
+
+ qinf->length--;
+
+ g_list_free (g_queue_pop_nth_link (q, n));
+ }
+ break;
+ case PEEK_HEAD_LINK:
+ if (g_queue_is_empty (q))
+ g_assert (g_queue_peek_head_link (q) == NULL);
+ else
+ g_assert (g_queue_peek_head_link (q) == qinf->head);
+ break;
+ case PEEK_TAIL_LINK:
+ if (g_queue_is_empty (q))
+ g_assert (g_queue_peek_tail_link (q) == NULL);
+ else
+ g_assert (g_queue_peek_tail_link (q) == qinf->tail);
+ break;
+ case PEEK_NTH_LINK:
+ if (g_queue_is_empty(q))
+ g_assert (g_queue_peek_nth_link (q, 1000) == NULL);
+ else
+ {
+ gint n = get_random_position (q, FALSE);
+ GList *link;
+
+ link = q->head;
+ for (j = 0; j < n; ++j)
+ link = link->next;
+
+ g_assert (g_queue_peek_nth_link (q, n) == link);
+ }
+ break;
+ case UNLINK:
+ if (!g_queue_is_empty (q))
+ {
+ gint n = g_random_int_range (0, g_queue_get_length (q));
+ GList *link;
+
+ link = q->head;
+ for (j = 0; j < n; ++j)
+ link = link->next;
+
+ g_queue_unlink (q, link);
+ check_integrity (q);
+
+ g_list_free (link);
+
+ qinf->head = q->head;
+ qinf->tail = q->tail;
+ qinf->length--;
+ }
+ break;
+ case DELETE_LINK:
+ if (!g_queue_is_empty (q))
+ {
+ gint n = g_random_int_range (0, g_queue_get_length (q));
+ GList *link;
+
+ link = q->head;
+ for (j = 0; j < n; ++j)
+ link = link->next;
+
+ g_queue_delete_link (q, link);
+ check_integrity (q);
+
+ qinf->head = q->head;
+ qinf->tail = q->tail;
+ qinf->length--;
+ }
+ break;
+ case LAST_OP:
+ default:
+ g_assert_not_reached();
+ break;
+ }
+
+ if (qinf->head != q->head ||
+ qinf->tail != q->tail ||
+ qinf->length != q->length)
+ g_print ("op: %d\n", op);
+
+ g_assert (qinf->head == q->head);
+ g_assert (qinf->tail == q->tail);
+ g_assert (qinf->length == q->length);
+
+ for (j = 0; j < N_QUEUES; ++j)
+ check_integrity (queues[j].queue);
+ }
+
+ for (i = 0; i < N_QUEUES; ++i)
+ g_queue_free (queues[i].queue);
+}
+
+static void
+remove_item (gpointer data, gpointer q)
+{
+ GQueue *queue = q;
+
+ g_queue_remove (queue, data);
+}
+
+int main(int argc, gchar *args[])
+{
+ GQueue *q, *q2;
+ GList *node;
+ gpointer data;
+ int i;
+
+ if (argc > 1 && args[1][0] == '-' && args[1][1] == 'v')
+ verbose = TRUE;
+
+ q = g_queue_new ();
+
+ g_assert (g_queue_is_empty (q) == TRUE);
+
+ g_queue_push_head (q, GINT_TO_POINTER (2));
+ check_integrity (q);
+ g_assert (g_queue_peek_head (q) == GINT_TO_POINTER (2));
+ check_integrity (q);
+ g_assert (g_queue_is_empty (q) == FALSE);
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 1);
+ g_assert (q->head == q->tail);
+ g_queue_push_head (q, GINT_TO_POINTER (1));
+ check_integrity (q);
+ g_assert (q->head->next == q->tail);
+ g_assert (q->tail->prev == q->head);
+ g_assert (g_list_length (q->head) == 2);
+ check_integrity (q);
+ g_assert (q->tail->data == GINT_TO_POINTER (2));
+ g_assert (q->head->data == GINT_TO_POINTER (1));
+ check_integrity (q);
+ g_queue_push_tail (q, GINT_TO_POINTER (3));
+ g_assert (g_list_length (q->head) == 3);
+ g_assert (q->head->data == GINT_TO_POINTER (1));
+ g_assert (q->head->next->data == GINT_TO_POINTER (2));
+ g_assert (q->head->next->next == q->tail);
+ g_assert (q->head->next == q->tail->prev);
+ g_assert (q->tail->data == GINT_TO_POINTER (3));
+ g_queue_push_tail (q, GINT_TO_POINTER (4));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 4);
+ g_assert (q->head->data == GINT_TO_POINTER (1));
+ g_assert (g_queue_peek_tail (q) == GINT_TO_POINTER (4));
+ g_queue_push_tail (q, GINT_TO_POINTER (5));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 5);
+
+ g_assert (g_queue_is_empty (q) == FALSE);
+ check_integrity (q);
+
+ g_assert (q->length == 5);
+ g_assert (q->head->prev == NULL);
+ g_assert (q->head->data == GINT_TO_POINTER (1));
+ g_assert (q->head->next->data == GINT_TO_POINTER (2));
+ g_assert (q->head->next->next->data == GINT_TO_POINTER (3));
+ g_assert (q->head->next->next->next->data == GINT_TO_POINTER (4));
+ g_assert (q->head->next->next->next->next->data == GINT_TO_POINTER (5));
+ g_assert (q->head->next->next->next->next->next == NULL);
+ g_assert (q->head->next->next->next->next == q->tail);
+ g_assert (q->tail->data == GINT_TO_POINTER (5));
+ g_assert (q->tail->prev->data == GINT_TO_POINTER (4));
+ g_assert (q->tail->prev->prev->data == GINT_TO_POINTER (3));
+ g_assert (q->tail->prev->prev->prev->data == GINT_TO_POINTER (2));
+ g_assert (q->tail->prev->prev->prev->prev->data == GINT_TO_POINTER (1));
+ g_assert (q->tail->prev->prev->prev->prev->prev == NULL);
+ g_assert (q->tail->prev->prev->prev->prev == q->head);
+ g_assert (g_queue_peek_tail (q) == GINT_TO_POINTER (5));
+ g_assert (g_queue_peek_head (q) == GINT_TO_POINTER (1));
+
+ g_assert (g_queue_pop_head (q) == GINT_TO_POINTER (1));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 4 && q->length == 4);
+ g_assert (g_queue_pop_tail (q) == GINT_TO_POINTER (5));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 3);
+ g_assert (g_queue_pop_head_link (q)->data == GINT_TO_POINTER (2));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 2);
+ g_assert (g_queue_pop_tail (q) == GINT_TO_POINTER (4));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 1);
+ g_assert (g_queue_pop_head_link (q)->data == GINT_TO_POINTER (3));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 0);
+ g_assert (g_queue_pop_tail (q) == NULL);
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 0);
+ g_assert (g_queue_pop_head (q) == NULL);
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 0);
+
+ g_assert (g_queue_is_empty (q) == TRUE);
+ check_integrity (q);
+
+ /************************/
+
+ g_queue_push_head (q, GINT_TO_POINTER (1));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 1 && 1 == q->length);
+ g_queue_push_head (q, GINT_TO_POINTER (2));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 2 && 2 == q->length);
+ g_queue_push_head (q, GINT_TO_POINTER (3));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 3 && 3 == q->length);
+ g_queue_push_head (q, GINT_TO_POINTER (4));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 4 && 4 == q->length);
+ g_queue_push_head (q, GINT_TO_POINTER (5));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 5 && 5 == q->length);
+
+ g_assert (g_queue_pop_head (q) == GINT_TO_POINTER (5));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 4);
+ node = q->tail;
+ g_assert (node == g_queue_pop_tail_link (q));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 3);
+ data = q->head->data;
+ g_assert (data == g_queue_pop_head (q));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 2);
+ g_assert (g_queue_pop_tail (q) == GINT_TO_POINTER (2));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 1);
+ g_assert (q->head == q->tail);
+ g_assert (g_queue_pop_tail (q) == GINT_TO_POINTER (3));
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 0);
+ g_assert (g_queue_pop_head (q) == NULL);
+ check_integrity (q);
+ g_assert (g_queue_pop_head_link (q) == NULL);
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 0);
+ g_assert (g_queue_pop_tail_link (q) == NULL);
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 0);
+
+ /* */
+ g_queue_reverse (q);
+ check_integrity (q);
+ g_assert (g_list_length (q->head) == 0);
+
+ q2 = g_queue_copy (q);
+ check_integrity (q);
+ check_integrity (q2);
+ g_assert (g_list_length (q->head) == 0);
+ g_assert (g_list_length (q2->head) == 0);
+ g_queue_sort (q, compare_int, NULL);
+ check_integrity (q2);
+ check_integrity (q);
+ g_queue_sort (q2, compare_int, NULL);
+ check_integrity (q2);
+ check_integrity (q);
+
+ for (i = 0; i < 200; ++i)
+ {
+ g_queue_push_nth (q, GINT_TO_POINTER (i), i);
+ g_assert (g_queue_find (q, GINT_TO_POINTER (i)));
+ check_integrity (q);
+ check_integrity (q2);
+ }
+
+ for (i = 0; i < 200; ++i)
+ {
+ g_queue_remove (q, GINT_TO_POINTER (i));
+ check_integrity (q);
+ check_integrity (q2);
+ }
+
+ for (i = 0; i < 200; ++i)
+ {
+ GList *l = g_list_prepend (NULL, GINT_TO_POINTER (i));
+
+ g_queue_push_nth_link (q, i, l);
+ check_integrity (q);
+ check_integrity (q2);
+ g_queue_reverse (q);
+ check_integrity (q);
+ check_integrity (q2);
+ }
+
+ g_queue_free (q2);
+ q2 = g_queue_copy (q);
+
+ g_queue_foreach (q2, remove_item, q2);
+ check_integrity (q2);
+ check_integrity (q);
+
+ /* some checks for off by one errors */
+ g_queue_push_tail (q, GINT_TO_POINTER (1234));
+ check_integrity (q);
+ node = g_queue_peek_tail_link (q);
+ g_assert (node != NULL && node->data == GINT_TO_POINTER (1234));
+ node = g_queue_peek_nth_link (q, g_queue_get_length (q));
+ g_assert (node == NULL);
+ node = g_queue_peek_nth_link (q, g_queue_get_length (q) - 1);
+ g_assert (node->data == GINT_TO_POINTER (1234));
+ node = g_queue_pop_nth_link (q, g_queue_get_length (q));
+ g_assert (node == NULL);
+ node = g_queue_pop_nth_link (q, g_queue_get_length (q) - 1);
+ g_assert (node != NULL && node->data == GINT_TO_POINTER (1234));
+
+ g_queue_free (q);
+
+ if (argc > 2 && args[1][0] == '-' && args[1][1] == 'v')
+ random_test (strtol (args[2], NULL, 0));
+ if (argc > 1)
+ random_test (strtol (args[1], NULL, 0));
+ else
+ random_test (time (0));
+
+ return 0;
+}
+
diff --git a/trunk/tests/rand-test.c b/trunk/tests/rand-test.c
new file mode 100644
index 000000000..141883eb8
--- /dev/null
+++ b/trunk/tests/rand-test.c
@@ -0,0 +1,135 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <glib.h>
+
+/* Outputs tested against the reference implementation mt19937ar.c from
+ http://www.math.keio.ac.jp/~matumoto/MT2002/emt19937ar.html */
+
+/* Tests for a simple seed, first number is the seed */
+const guint32 first_numbers[] =
+{
+ 0x7a7a7a7a,
+ 0xfdcc2d54,
+ 0x3a279ceb,
+ 0xc4d39c33,
+ 0xf31895cd,
+ 0x46ca0afc,
+ 0x3f5484ff,
+ 0x54bc9557,
+ 0xed2c24b1,
+ 0x84062503,
+ 0x8f6404b3,
+ 0x599a94b3,
+ 0xe46d03d5,
+ 0x310beb78,
+ 0x7bee5d08,
+ 0x760d09be,
+ 0x59b6e163,
+ 0xbf6d16ec,
+ 0xcca5fb54,
+ 0x5de7259b,
+ 0x1696330c,
+};
+
+/* array seed */
+const guint32 seed_array[] =
+{
+ 0x6553375f,
+ 0xd6b8d43b,
+ 0xa1e7667f,
+ 0x2b10117c
+};
+
+/* tests for the array seed */
+const guint32 array_outputs[] =
+{
+ 0xc22b7dc3,
+ 0xfdecb8ae,
+ 0xb4af0738,
+ 0x516bc6e1,
+ 0x7e372e91,
+ 0x2d38ff80,
+ 0x6096494a,
+ 0xd162d5a8,
+ 0x3c0aaa0d,
+ 0x10e736ae
+};
+
+const gint length = sizeof (first_numbers) / sizeof (first_numbers[0]);
+const gint seed_length = sizeof (seed_array) / sizeof (seed_array[0]);
+const gint array_length = sizeof (array_outputs) / sizeof (array_outputs[0]);
+
+int main()
+{
+ guint n;
+ guint ones;
+ double proportion;
+
+ GRand* rand = g_rand_new_with_seed (first_numbers[0]);
+ GRand* copy;
+
+ for (n = 1; n < length; n++)
+ g_assert (first_numbers[n] == g_rand_int (rand));
+
+ g_rand_set_seed (rand, 2);
+ g_rand_set_seed_array (rand, seed_array, seed_length);
+
+ for (n = 0; n < array_length; n++)
+ g_assert (array_outputs[n] == g_rand_int (rand));
+
+ copy = g_rand_copy (rand);
+ for (n = 0; n < 100; n++)
+ g_assert (g_rand_int (copy) == g_rand_int (rand));
+
+ for (n = 1; n < 100000; n++)
+ {
+ gint32 i;
+ gdouble d;
+ gboolean b;
+
+ i = g_rand_int_range (rand, 8,16);
+ g_assert (i >= 8 && i < 16);
+
+ i = g_random_int_range (8,16);
+ g_assert (i >= 8 && i < 16);
+
+ d = g_rand_double (rand);
+ g_assert (d >= 0 && d < 1);
+
+ d = g_random_double ();
+ g_assert (d >= 0 && d < 1);
+
+ d = g_rand_double_range (rand, -8, 32);
+ g_assert (d >= -8 && d < 32);
+
+ d = g_random_double_range (-8, 32);
+ g_assert (d >= -8 && d < 32);
+
+ b = g_random_boolean ();
+ g_assert (b == TRUE || b == FALSE);
+
+ b = g_rand_boolean (rand);
+ g_assert (b == TRUE || b == FALSE);
+ }
+
+ /* Statistical sanity check, count the number of ones
+ * when getting random numbers in range [0,3) and see
+ * that it must be semi-close to 0.25 with a VERY large
+ * probability */
+ ones = 0;
+ for (n = 1; n < 100000; n++)
+ {
+ if (g_random_int_range (0, 4) == 1)
+ ones ++;
+ }
+ proportion = (double)ones / (double)100000;
+ /* 0.025 is overkill, but should suffice to test for some unreasonability */
+ g_assert (ABS (proportion - 0.25) < 0.025);
+
+ g_rand_free (rand);
+ g_rand_free (copy);
+
+ return 0;
+}
+
diff --git a/trunk/tests/refcount/Makefile.am b/trunk/tests/refcount/Makefile.am
new file mode 100644
index 000000000..bfb21c0fd
--- /dev/null
+++ b/trunk/tests/refcount/Makefile.am
@@ -0,0 +1,39 @@
+INCLUDES = \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/glib \
+ -I$(top_srcdir)/gmodule \
+ $(GLIB_DEBUG_FLAGS)
+
+libglib = $(top_builddir)/glib/libglib-2.0.la
+libgthread = $(top_builddir)/gthread/libgthread-2.0.la
+libgmodule = $(top_builddir)/gmodule/libgmodule-2.0.la
+libgobject = $(top_builddir)/gobject/libgobject-2.0.la
+
+LDADD = $(libglib) $(libgobject) $(libgthread) $(G_THREAD_LIBS)
+
+test_programs = \
+ closures \
+ objects \
+ objects2 \
+ properties \
+ properties2 \
+ signal1 \
+ signal2 \
+ signal3
+
+
+
+signal1_SOURCES = signals.c
+signal1_CFLAGS = -DTESTNUM=1 $(AM_CFLAGS)
+signal2_SOURCES = signals.c
+signal2_CFLAGS = -DTESTNUM=2 $(AM_CFLAGS)
+signal3_SOURCES = signals.c
+signal3_CFLAGS = -DTESTNUM=3 $(AM_CFLAGS)
+
+check_PROGRAMS = $(test_programs)
+
+all: $(check_PROGRAMS)
+
+TESTS = $(test_programs)
+TESTS_ENVIRONMENT = srcdir=$(srcdir) \
+ LIBCHARSET_ALIAS_DIR=$(top_builddir)/glib/libcharset
diff --git a/trunk/tests/refcount/closures.c b/trunk/tests/refcount/closures.c
new file mode 100644
index 000000000..82a42fe26
--- /dev/null
+++ b/trunk/tests/refcount/closures.c
@@ -0,0 +1,291 @@
+/* Copyright (C) 2005 Imendio AB
+ *
+ * This software is provided "as is"; redistribution and modification
+ * is permitted, provided that the following disclaimer is retained.
+ *
+ * This software 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.
+ * In no event shall the authors or contributors be liable for any
+ * direct, indirect, incidental, special, exemplary, or consequential
+ * damages (including, but not limited to, procurement of substitute
+ * goods or services; loss of use, data, or profits; or business
+ * interruption) however caused and on any theory of liability, whether
+ * in contract, strict liability, or tort (including negligence or
+ * otherwise) arising in any way out of the use of this software, even
+ * if advised of the possibility of such damage.
+ */
+#include <glib-object.h>
+#include <unistd.h>
+
+#define TEST_POINTER1 ((gpointer) 47)
+#define TEST_POINTER2 ((gpointer) 49)
+#define TEST_INT1 (-77)
+#define TEST_INT2 (78)
+
+/* --- GTest class --- */
+typedef struct {
+ GObject object;
+ gint value;
+ gpointer test_pointer1;
+ gpointer test_pointer2;
+} GTest;
+typedef struct {
+ GObjectClass parent_class;
+ void (*test_signal1) (GTest * test, gint an_int);
+ void (*test_signal2) (GTest * test, gint an_int);
+} GTestClass;
+
+#define G_TYPE_TEST (g_test_get_type ())
+#define G_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest))
+#define G_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST))
+#define G_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass))
+#define G_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST))
+#define G_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass))
+
+G_DEFINE_TYPE (GTest, g_test, G_TYPE_OBJECT);
+
+/* --- variables --- */
+static volatile gboolean stopping = FALSE;
+static guint test_signal1 = 0;
+static guint test_signal2 = 0;
+static gboolean seen_signal_handler = FALSE;
+static gboolean seen_cleanup = FALSE;
+static gboolean seen_test_int1 = FALSE;
+static gboolean seen_test_int2 = FALSE;
+static gboolean seen_thread1 = FALSE;
+static gboolean seen_thread2 = FALSE;
+
+/* --- functions --- */
+static void
+g_test_init (GTest * test)
+{
+ g_print ("init %p\n", test);
+
+ test->value = 0;
+ test->test_pointer1 = TEST_POINTER1;
+ test->test_pointer2 = TEST_POINTER2;
+}
+
+enum {
+ ARG_0,
+ ARG_TEST_PROP
+};
+
+static void
+g_test_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GTest *test = G_TEST (object);
+ switch (prop_id)
+ {
+ case ARG_TEST_PROP:
+ test->value = g_value_get_int (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+g_test_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GTest *test = G_TEST (object);
+ switch (prop_id)
+ {
+ case ARG_TEST_PROP:
+ g_value_set_int (value, test->value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+g_test_test_signal2 (GTest *test,
+ gint an_int)
+{
+}
+
+static void
+g_test_emit_test_signal1 (GTest *test,
+ gint vint)
+{
+ g_signal_emit (G_OBJECT (test), test_signal1, 0, vint);
+}
+
+static void
+g_test_emit_test_signal2 (GTest *test,
+ gint vint)
+{
+ g_signal_emit (G_OBJECT (test), test_signal2, 0, vint);
+}
+
+static void
+g_test_class_init (GTestClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gobject_class->set_property = g_test_set_property;
+ gobject_class->get_property = g_test_get_property;
+
+ test_signal1 = g_signal_new ("test-signal1", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GTestClass, test_signal1), NULL, NULL,
+ g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+ test_signal2 = g_signal_new ("test-signal2", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GTestClass, test_signal2), NULL, NULL,
+ g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TEST_PROP,
+ g_param_spec_int ("test-prop", "Test Prop", "Test property",
+ 0, 1, 0, G_PARAM_READWRITE));
+ klass->test_signal2 = g_test_test_signal2;
+}
+
+static inline guint32
+quick_rand32 (void)
+{
+ static guint32 accu = 2147483563;
+ accu = 1664525 * accu + 1013904223;
+ return accu;
+}
+
+static void
+test_closure (GClosure *closure)
+{
+ /* try to produce high contention in closure->ref_count */
+ guint i = 0, n = quick_rand32() % 199;
+ for (i = 0; i < n; i++)
+ g_closure_ref (closure);
+ g_closure_sink (closure); /* NOP */
+ for (i = 0; i < n; i++)
+ g_closure_unref (closure);
+}
+
+static gpointer
+thread1_main (gpointer data)
+{
+ GClosure *closure = data;
+ while (!stopping)
+ {
+ static guint count = 0;
+ test_closure (closure);
+ if (++count % 10000 == 0)
+ {
+ g_printerr ("c");
+ g_thread_yield(); /* force context switch */
+ seen_thread1 = TRUE;
+ }
+ }
+ return NULL;
+}
+
+static gpointer
+thread2_main (gpointer data)
+{
+ GClosure *closure = data;
+ while (!stopping)
+ {
+ static guint count = 0;
+ test_closure (closure);
+ if (++count % 10000 == 0)
+ {
+ g_printerr ("C");
+ g_thread_yield(); /* force context switch */
+ seen_thread2 = TRUE;
+ }
+ }
+ return NULL;
+}
+
+static void
+test_signal_handler (GTest *test,
+ gint vint,
+ gpointer data)
+{
+ g_assert (data == TEST_POINTER2);
+ g_assert (test->test_pointer1 == TEST_POINTER1);
+ seen_signal_handler = TRUE;
+ seen_test_int1 |= vint == TEST_INT1;
+ seen_test_int2 |= vint == TEST_INT2;
+}
+
+static void
+destroy_data (gpointer data,
+ GClosure *closure)
+{
+ seen_cleanup = data == TEST_POINTER2;
+ g_assert (closure->ref_count == 0);
+}
+
+static void
+test_emissions (GTest *test)
+{
+ g_test_emit_test_signal1 (test, TEST_INT1);
+ g_test_emit_test_signal2 (test, TEST_INT2);
+}
+
+int
+main (int argc,
+ char **argv)
+{
+ GThread *thread1, *thread2;
+ GClosure *closure;
+ GTest *object;
+ guint i;
+
+ g_thread_init (NULL);
+ g_print ("START: %s\n", argv[0]);
+ g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK));
+ g_type_init ();
+
+ object = g_object_new (G_TYPE_TEST, NULL);
+ closure = g_cclosure_new (G_CALLBACK (test_signal_handler), TEST_POINTER2, destroy_data);
+
+ g_signal_connect_closure (object, "test-signal1", closure, FALSE);
+ g_signal_connect_closure (object, "test-signal2", closure, FALSE);
+
+ stopping = FALSE;
+
+ thread1 = g_thread_create (thread1_main, closure, TRUE, NULL);
+ thread2 = g_thread_create (thread2_main, closure, TRUE, NULL);
+
+ for (i = 0; i < 1000000; i++)
+ {
+ static guint count = 0;
+ test_emissions (object);
+ if (++count % 10000 == 0)
+ {
+ g_printerr (".");
+ g_thread_yield(); /* force context switch */
+ }
+ }
+
+ stopping = TRUE;
+ g_print ("\nstopping\n");
+
+ /* wait for thread shutdown */
+ g_thread_join (thread1);
+ g_thread_join (thread2);
+
+ /* finalize object, destroy signals, run cleanup code */
+ g_object_unref (object);
+
+ g_print ("stopped\n");
+
+ g_assert (seen_thread1 != FALSE);
+ g_assert (seen_thread2 != FALSE);
+ g_assert (seen_test_int1 != FALSE);
+ g_assert (seen_test_int2 != FALSE);
+ g_assert (seen_signal_handler != FALSE);
+ g_assert (seen_cleanup != FALSE);
+
+ return 0;
+}
diff --git a/trunk/tests/refcount/objects.c b/trunk/tests/refcount/objects.c
new file mode 100644
index 000000000..1481fbff6
--- /dev/null
+++ b/trunk/tests/refcount/objects.c
@@ -0,0 +1,158 @@
+#include <unistd.h>
+#include <glib.h>
+#include <glib-object.h>
+
+#define G_TYPE_TEST (g_test_get_type ())
+#define G_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest))
+#define G_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST))
+#define G_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass))
+#define G_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST))
+#define G_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass))
+
+typedef struct _GTest GTest;
+typedef struct _GTestClass GTestClass;
+
+struct _GTest
+{
+ GObject object;
+};
+
+struct _GTestClass
+{
+ GObjectClass parent_class;
+};
+
+static GType g_test_get_type (void);
+static volatile gboolean stopping;
+
+static void g_test_class_init (GTestClass * klass);
+static void g_test_init (GTest * test);
+static void g_test_dispose (GObject * object);
+
+static GObjectClass *parent_class = NULL;
+
+static GType
+g_test_get_type (void)
+{
+ static GType test_type = 0;
+
+ if (!test_type) {
+ static const GTypeInfo test_info = {
+ sizeof (GTestClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) g_test_class_init,
+ NULL,
+ NULL,
+ sizeof (GTest),
+ 0,
+ (GInstanceInitFunc) g_test_init,
+ NULL
+ };
+
+ test_type = g_type_register_static (G_TYPE_OBJECT, "GTest",
+ &test_info, 0);
+ }
+ return test_type;
+}
+
+static void
+g_test_class_init (GTestClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+
+ parent_class = g_type_class_ref (G_TYPE_OBJECT);
+
+ gobject_class->dispose = g_test_dispose;
+}
+
+static void
+g_test_init (GTest * test)
+{
+ g_print ("init %p\n", test);
+}
+
+static void
+g_test_dispose (GObject * object)
+{
+ GTest *test;
+
+ test = G_TEST (object);
+
+ g_print ("dispose %p!\n", object);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+g_test_do_refcount (GTest * test)
+{
+ g_object_ref (test);
+ g_object_unref (test);
+}
+
+static gpointer
+run_thread (GTest * test)
+{
+ gint i = 1;
+
+ while (!stopping) {
+ g_test_do_refcount (test);
+ if ((i++ % 10000) == 0) {
+ g_print (".");
+ g_thread_yield(); /* force context switch */
+ }
+ }
+
+ return NULL;
+}
+
+int
+main (int argc, char **argv)
+{
+ gint i;
+ GTest *test1, *test2;
+ GArray *test_threads;
+ const guint n_threads = 5;
+
+ g_thread_init (NULL);
+ g_print ("START: %s\n", argv[0]);
+ g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK));
+ g_type_init ();
+
+ test1 = g_object_new (G_TYPE_TEST, NULL);
+ test2 = g_object_new (G_TYPE_TEST, NULL);
+
+ test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
+
+ stopping = FALSE;
+
+ for (i = 0; i < n_threads; i++) {
+ GThread *thread;
+
+ thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
+ g_array_append_val (test_threads, thread);
+
+ thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
+ g_array_append_val (test_threads, thread);
+ }
+ g_usleep (5000000);
+
+ stopping = TRUE;
+
+ g_print ("\nstopping\n");
+
+ /* join all threads */
+ for (i = 0; i < 2 * n_threads; i++) {
+ GThread *thread;
+
+ thread = g_array_index (test_threads, GThread *, i);
+ g_thread_join (thread);
+ }
+
+ g_print ("stopped\n");
+
+ return 0;
+}
diff --git a/trunk/tests/refcount/objects2.c b/trunk/tests/refcount/objects2.c
new file mode 100644
index 000000000..f98373107
--- /dev/null
+++ b/trunk/tests/refcount/objects2.c
@@ -0,0 +1,118 @@
+#include <unistd.h>
+#include <glib.h>
+#include <glib-object.h>
+
+#define G_TYPE_TEST (g_test_get_type ())
+#define G_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest))
+#define G_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST))
+#define G_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass))
+#define G_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST))
+#define G_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass))
+
+typedef struct _GTest GTest;
+typedef struct _GTestClass GTestClass;
+
+struct _GTest
+{
+ GObject object;
+};
+
+struct _GTestClass
+{
+ GObjectClass parent_class;
+};
+
+static GType g_test_get_type (void);
+
+static void g_test_class_init (GTestClass * klass);
+static void g_test_init (GTest * test);
+static void g_test_dispose (GObject * object);
+
+static GObjectClass *parent_class = NULL;
+
+static GType
+g_test_get_type (void)
+{
+ static GType test_type = 0;
+
+ if (!test_type) {
+ static const GTypeInfo test_info = {
+ sizeof (GTestClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) g_test_class_init,
+ NULL,
+ NULL,
+ sizeof (GTest),
+ 0,
+ (GInstanceInitFunc) g_test_init,
+ NULL
+ };
+
+ test_type = g_type_register_static (G_TYPE_OBJECT, "GTest",
+ &test_info, 0);
+ }
+ return test_type;
+}
+
+static void
+g_test_class_init (GTestClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+
+ parent_class = g_type_class_ref (G_TYPE_OBJECT);
+
+ gobject_class->dispose = g_test_dispose;
+}
+
+static void
+g_test_init (GTest * test)
+{
+ g_print ("init %p\n", test);
+}
+
+static void
+g_test_dispose (GObject * object)
+{
+ GTest *test;
+
+ test = G_TEST (object);
+
+ g_print ("dispose %p!\n", object);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+g_test_do_refcount (GTest * test)
+{
+ static guint i = 1;
+ if (i++ % 100000 == 0)
+ g_print (".");
+ g_object_ref (test);
+ g_object_unref (test);
+}
+
+int
+main (int argc, char **argv)
+{
+ gint i;
+ GTest *test;
+
+ g_thread_init (NULL);
+ g_print ("START: %s\n", argv[0]);
+ g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK));
+ g_type_init ();
+
+ test = g_object_new (G_TYPE_TEST, NULL);
+
+ for (i=0; i<100000000; i++) {
+ g_test_do_refcount (test);
+ }
+
+ g_print ("\n");
+
+ return 0;
+}
diff --git a/trunk/tests/refcount/properties.c b/trunk/tests/refcount/properties.c
new file mode 100644
index 000000000..18bab8c3e
--- /dev/null
+++ b/trunk/tests/refcount/properties.c
@@ -0,0 +1,255 @@
+#include <unistd.h>
+#include <glib.h>
+#include <glib-object.h>
+
+#define G_TYPE_TEST (g_test_get_type ())
+#define G_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest))
+#define G_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST))
+#define G_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass))
+#define G_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST))
+#define G_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass))
+
+enum {
+ PROP_0,
+ PROP_DUMMY
+};
+
+typedef struct _GTest GTest;
+typedef struct _GTestClass GTestClass;
+
+struct _GTest
+{
+ GObject object;
+ gint id;
+ gint dummy;
+
+ gint count;
+};
+
+struct _GTestClass
+{
+ GObjectClass parent_class;
+};
+
+static GType g_test_get_type (void);
+static volatile gboolean stopping;
+
+static void g_test_class_init (GTestClass * klass);
+static void g_test_init (GTest * test);
+static void g_test_dispose (GObject * object);
+static void g_test_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void g_test_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
+
+static GObjectClass *parent_class = NULL;
+
+static GType
+g_test_get_type (void)
+{
+ static GType test_type = 0;
+
+ if (!test_type) {
+ static const GTypeInfo test_info = {
+ sizeof (GTestClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) g_test_class_init,
+ NULL,
+ NULL,
+ sizeof (GTest),
+ 0,
+ (GInstanceInitFunc) g_test_init,
+ NULL
+ };
+
+ test_type = g_type_register_static (G_TYPE_OBJECT, "GTest", &test_info, 0);
+ }
+ return test_type;
+}
+
+static void
+g_test_class_init (GTestClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+
+ parent_class = g_type_class_ref (G_TYPE_OBJECT);
+
+ gobject_class->dispose = g_test_dispose;
+ gobject_class->get_property = g_test_get_property;
+ gobject_class->set_property = g_test_set_property;
+
+ g_object_class_install_property (gobject_class,
+ PROP_DUMMY,
+ g_param_spec_int ("dummy",
+ NULL,
+ NULL,
+ 0, G_MAXINT, 0,
+ G_PARAM_READWRITE));
+}
+
+static void
+g_test_init (GTest * test)
+{
+ static guint static_id = 1;
+ test->id = static_id++;
+}
+
+static void
+g_test_dispose (GObject * object)
+{
+ GTest *test;
+
+ test = G_TEST (object);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+g_test_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GTest *test;
+
+ test = G_TEST (object);
+
+ switch (prop_id)
+ {
+ case PROP_DUMMY:
+ g_value_set_int (value, test->dummy);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+g_test_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GTest *test;
+
+ test = G_TEST (object);
+
+ switch (prop_id)
+ {
+ case PROP_DUMMY:
+ test->dummy = g_value_get_int (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+dummy_notify (GObject *object,
+ GParamSpec *pspec)
+{
+ GTest *test;
+
+ test = G_TEST (object);
+
+ test->count++;
+}
+
+static void
+g_test_do_property (GTest * test)
+{
+ gint dummy;
+
+ g_object_get (test, "dummy", &dummy, NULL);
+ g_object_set (test, "dummy", dummy + 1, NULL);
+}
+
+static gpointer
+run_thread (GTest * test)
+{
+ gint i = 1;
+
+ while (!stopping) {
+ g_test_do_property (test);
+ if ((i++ % 10000) == 0)
+ {
+ g_print (".%c", 'a' + test->id);
+ g_thread_yield(); /* force context switch */
+ }
+ }
+
+ return NULL;
+}
+
+int
+main (int argc, char **argv)
+{
+ gint i;
+ GArray *test_objects;
+ GArray *test_threads;
+ const gint n_threads = 5;
+
+ g_thread_init (NULL);
+ g_print ("START: %s\n", argv[0]);
+ g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK));
+ g_type_init ();
+
+ test_objects = g_array_new (FALSE, FALSE, sizeof (GTest *));
+
+ for (i = 0; i < n_threads; i++) {
+ GTest *test;
+
+ test = g_object_new (G_TYPE_TEST, NULL);
+ g_array_append_val (test_objects, test);
+
+ g_assert (test->count == test->dummy);
+ g_signal_connect (test, "notify::dummy", G_CALLBACK (dummy_notify), NULL);
+ }
+
+ test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
+
+ stopping = FALSE;
+
+ for (i = 0; i < n_threads; i++) {
+ GThread *thread;
+ GTest *test;
+
+ test = g_array_index (test_objects, GTest *, i);
+
+ thread = g_thread_create ((GThreadFunc) run_thread, test, TRUE, NULL);
+ g_array_append_val (test_threads, thread);
+ }
+ g_usleep (3000000);
+
+ stopping = TRUE;
+ g_print ("\nstopping\n");
+
+ /* join all threads */
+ for (i = 0; i < n_threads; i++) {
+ GThread *thread;
+
+ thread = g_array_index (test_threads, GThread *, i);
+ g_thread_join (thread);
+ }
+
+ g_print ("stopped\n");
+
+ for (i = 0; i < n_threads; i++) {
+ GTest *test;
+
+ test = g_array_index (test_objects, GTest *, i);
+
+ g_assert (test->count == test->dummy);
+ }
+
+ return 0;
+}
diff --git a/trunk/tests/refcount/properties2.c b/trunk/tests/refcount/properties2.c
new file mode 100644
index 000000000..58f7e3129
--- /dev/null
+++ b/trunk/tests/refcount/properties2.c
@@ -0,0 +1,199 @@
+#include <unistd.h>
+#include <glib.h>
+#include <glib-object.h>
+
+#define G_TYPE_TEST (g_test_get_type ())
+#define G_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest))
+#define G_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST))
+#define G_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass))
+#define G_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST))
+#define G_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass))
+
+enum {
+ PROP_0,
+ PROP_DUMMY
+};
+
+typedef struct _GTest GTest;
+typedef struct _GTestClass GTestClass;
+
+struct _GTest
+{
+ GObject object;
+
+ gint dummy;
+};
+
+struct _GTestClass
+{
+ GObjectClass parent_class;
+};
+
+static GType g_test_get_type (void);
+
+static void g_test_class_init (GTestClass * klass);
+static void g_test_init (GTest * test);
+static void g_test_dispose (GObject * object);
+static void g_test_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void g_test_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
+
+static GObjectClass *parent_class = NULL;
+
+static GType
+g_test_get_type (void)
+{
+ static GType test_type = 0;
+
+ if (!test_type) {
+ static const GTypeInfo test_info = {
+ sizeof (GTestClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) g_test_class_init,
+ NULL,
+ NULL,
+ sizeof (GTest),
+ 0,
+ (GInstanceInitFunc) g_test_init,
+ NULL
+ };
+
+ test_type = g_type_register_static (G_TYPE_OBJECT, "GTest",
+ &test_info, 0);
+ }
+ return test_type;
+}
+
+static void
+g_test_class_init (GTestClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+
+ parent_class = g_type_class_ref (G_TYPE_OBJECT);
+
+ gobject_class->dispose = g_test_dispose;
+ gobject_class->get_property = g_test_get_property;
+ gobject_class->set_property = g_test_set_property;
+
+ g_object_class_install_property (gobject_class,
+ PROP_DUMMY,
+ g_param_spec_int ("dummy",
+ NULL,
+ NULL,
+ 0, G_MAXINT, 0,
+ G_PARAM_READWRITE));
+}
+
+static void
+g_test_init (GTest * test)
+{
+ g_print ("init %p\n", test);
+}
+
+static void
+g_test_dispose (GObject * object)
+{
+ GTest *test;
+
+ test = G_TEST (object);
+
+ g_print ("dispose %p!\n", object);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+g_test_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GTest *test;
+
+ test = G_TEST (object);
+
+ switch (prop_id)
+ {
+ case PROP_DUMMY:
+ g_value_set_int (value, test->dummy);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+g_test_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GTest *test;
+
+ test = G_TEST (object);
+
+ switch (prop_id)
+ {
+ case PROP_DUMMY:
+ test->dummy = g_value_get_int (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gint count = 0;
+
+static void
+dummy_notify (GObject *object,
+ GParamSpec *pspec)
+{
+ count++;
+ if (count % 10000 == 0)
+ g_print (".");
+}
+
+static void
+g_test_do_property (GTest * test)
+{
+ gint dummy;
+
+ g_object_get (test, "dummy", &dummy, NULL);
+ g_object_set (test, "dummy", dummy + 1, NULL);
+}
+
+int
+main (int argc, char **argv)
+{
+ gint i;
+ GTest *test;
+
+ g_thread_init (NULL);
+ g_print ("START: %s\n", argv[0]);
+ g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK));
+ g_type_init ();
+
+ test = g_object_new (G_TYPE_TEST, NULL);
+
+ g_signal_connect (test, "notify::dummy", G_CALLBACK (dummy_notify), NULL);
+
+ g_assert (count == test->dummy);
+
+ for (i=0; i<1000000; i++) {
+ g_test_do_property (test);
+ }
+
+ g_assert (count == test->dummy);
+
+ return 0;
+}
diff --git a/trunk/tests/refcount/signals.c b/trunk/tests/refcount/signals.c
new file mode 100644
index 000000000..953b9b47a
--- /dev/null
+++ b/trunk/tests/refcount/signals.c
@@ -0,0 +1,284 @@
+#include <unistd.h>
+#include <glib.h>
+#include <glib-object.h>
+
+#define G_TYPE_TEST (g_test_get_type ())
+#define G_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest))
+#define G_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST))
+#define G_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass))
+#define G_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST))
+#define G_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass))
+
+static GRand *rand;
+
+typedef struct _GTest GTest;
+typedef struct _GTestClass GTestClass;
+
+struct _GTest
+{
+ GObject object;
+
+ gint value;
+};
+
+struct _GTestClass
+{
+ GObjectClass parent_class;
+
+ void (*test_signal1) (GTest * test, gint an_int);
+ void (*test_signal2) (GTest * test, gint an_int);
+};
+
+static GType g_test_get_type (void);
+static volatile gboolean stopping;
+
+/* Element signals and args */
+enum
+{
+ TEST_SIGNAL1,
+ TEST_SIGNAL2,
+ /* add more above */
+ LAST_SIGNAL
+};
+
+enum
+{
+ ARG_0,
+ ARG_TEST_PROP
+};
+
+static void g_test_class_init (GTestClass * klass);
+static void g_test_init (GTest * test);
+static void g_test_dispose (GObject * object);
+
+static void signal2_handler (GTest * test, gint anint);
+
+static void g_test_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void g_test_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static GObjectClass *parent_class = NULL;
+
+static guint g_test_signals[LAST_SIGNAL] = { 0 };
+
+static GType
+g_test_get_type (void)
+{
+ static GType test_type = 0;
+
+ if (!test_type) {
+ static const GTypeInfo test_info = {
+ sizeof (GTestClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) g_test_class_init,
+ NULL,
+ NULL,
+ sizeof (GTest),
+ 0,
+ (GInstanceInitFunc) g_test_init,
+ NULL
+ };
+
+ rand = g_rand_new();
+
+ test_type = g_type_register_static (G_TYPE_OBJECT, "GTest",
+ &test_info, 0);
+ }
+ return test_type;
+}
+
+static void
+g_test_class_init (GTestClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+
+ parent_class = g_type_class_ref (G_TYPE_OBJECT);
+
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ gobject_class->dispose = g_test_dispose;
+ gobject_class->set_property = g_test_set_property;
+ gobject_class->get_property = g_test_get_property;
+
+ g_test_signals[TEST_SIGNAL1] =
+ g_signal_new ("test-signal1", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal1), NULL,
+ NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+ g_test_signals[TEST_SIGNAL2] =
+ g_signal_new ("test-signal2", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal2), NULL,
+ NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TEST_PROP,
+ g_param_spec_int ("test-prop", "Test Prop", "Test property",
+ 0, 1, 0, G_PARAM_READWRITE));
+
+ klass->test_signal2 = signal2_handler;
+}
+
+static void
+g_test_init (GTest * test)
+{
+ g_print ("init %p\n", test);
+
+ test->value = 0;
+}
+
+static void
+g_test_dispose (GObject * object)
+{
+ GTest *test;
+
+ test = G_TEST (object);
+
+ g_print ("dispose %p!\n", object);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+g_test_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GTest *test;
+
+ test = G_TEST (object);
+
+ switch (prop_id) {
+ case ARG_TEST_PROP:
+ test->value = g_value_get_int (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+g_test_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GTest *test;
+
+ test = G_TEST (object);
+
+ switch (prop_id) {
+ case ARG_TEST_PROP:
+ g_value_set_int (value, test->value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+g_test_do_signal1 (GTest * test)
+{
+ g_signal_emit (G_OBJECT (test), g_test_signals[TEST_SIGNAL1], 0, 0);
+}
+
+static void
+signal2_handler (GTest * test, gint anint)
+{
+}
+
+static void
+g_test_do_signal2 (GTest * test)
+{
+ g_signal_emit (G_OBJECT (test), g_test_signals[TEST_SIGNAL2], 0, 0);
+}
+
+static void
+g_test_do_prop (GTest * test)
+{
+ test->value = g_rand_int (rand);
+ g_object_notify (G_OBJECT (test), "test-prop");
+}
+
+static gpointer
+run_thread (GTest * test)
+{
+ gint i = 1;
+
+ while (!stopping) {
+ if (TESTNUM == 1)
+ g_test_do_signal1 (test);
+ if (TESTNUM == 2)
+ g_test_do_signal2 (test);
+ if (TESTNUM == 3)
+ g_test_do_prop (test);
+ if ((i++ % 10000) == 0) {
+ g_print (".");
+ g_thread_yield(); /* force context switch */
+ }
+ }
+
+ return NULL;
+}
+
+static void
+notify (GObject *object, GParamSpec *spec, gpointer user_data)
+{
+ gint value;
+
+ g_object_get (object, "test-prop", &value, NULL);
+ /*g_print ("+ %d", value);*/
+}
+
+int
+main (int argc, char **argv)
+{
+ gint i;
+ GTest *test1, *test2;
+ GArray *test_threads;
+ const gint n_threads = 1;
+
+ g_thread_init (NULL);
+ g_print ("START: %s\n", argv[0]);
+ g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK));
+ g_type_init ();
+
+ test1 = g_object_new (G_TYPE_TEST, NULL);
+ test2 = g_object_new (G_TYPE_TEST, NULL);
+
+ g_signal_connect (test1, "notify::test-prop", G_CALLBACK (notify), NULL);
+ g_signal_connect (test1, "test-signal1", G_CALLBACK (notify), NULL);
+ g_signal_connect (test1, "test-signal2", G_CALLBACK (notify), NULL);
+
+ test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
+
+ stopping = FALSE;
+
+ for (i = 0; i < n_threads; i++) {
+ GThread *thread;
+
+ thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
+ g_array_append_val (test_threads, thread);
+
+ thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
+ g_array_append_val (test_threads, thread);
+ }
+ g_usleep (5000000);
+
+ stopping = TRUE;
+
+ g_print ("\nstopping\n");
+
+ /* join all threads */
+ for (i = 0; i < 2 * n_threads; i++) {
+ GThread *thread;
+
+ thread = g_array_index (test_threads, GThread *, i);
+ g_thread_join (thread);
+ }
+
+ g_print ("stopped\n");
+
+ return 0;
+}
diff --git a/trunk/tests/regex-test.c b/trunk/tests/regex-test.c
new file mode 100644
index 000000000..26d96776f
--- /dev/null
+++ b/trunk/tests/regex-test.c
@@ -0,0 +1,2104 @@
+/*
+ * Copyright (C) 2005 - 2006, Marco Barisione <marco@barisione.org>
+ *
+ * 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.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <string.h>
+#include <locale.h>
+#include "glib.h"
+
+#ifdef ENABLE_REGEX
+
+/* U+20AC EURO SIGN (symbol, currency) */
+#define EURO "\xe2\x82\xac"
+/* U+00E0 LATIN SMALL LETTER A WITH GRAVE (letter, lowercase) */
+#define AGRAVE "\xc3\xa0"
+/* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE (letter, uppercase) */
+#define AGRAVE_UPPER "\xc3\x80"
+/* U+00E8 LATIN SMALL LETTER E WITH GRAVE (letter, lowercase) */
+#define EGRAVE "\xc3\xa8"
+/* U+00F2 LATIN SMALL LETTER O WITH GRAVE (letter, lowercase) */
+#define OGRAVE "\xc3\xb2"
+/* U+014B LATIN SMALL LETTER ENG (letter, lowercase) */
+#define ENG "\xc5\x8b"
+/* U+0127 LATIN SMALL LETTER H WITH STROKE (letter, lowercase) */
+#define HSTROKE "\xc4\xa7"
+/* U+0634 ARABIC LETTER SHEEN (letter, other) */
+#define SHEEN "\xd8\xb4"
+/* U+1374 ETHIOPIC NUMBER THIRTY (number, other) */
+#define ETH30 "\xe1\x8d\xb4"
+
+/* A random value use to mark untouched integer variables. */
+#define UNTOUCHED -559038737
+
+static gboolean noisy = FALSE;
+static gboolean abort_on_fail = FALSE;
+
+#define PASS passed++
+#define FAIL \
+ G_STMT_START \
+ { \
+ failed++; \
+ if (abort_on_fail) \
+ goto end; \
+ } \
+ G_STMT_END
+
+/* A replacement for strcmp that doesn't crash with null pointers. */
+static gboolean
+streq (const gchar *s1, const gchar *s2)
+{
+ if (s1 == NULL && s2 == NULL)
+ return TRUE;
+ else if (s1 == NULL)
+ return FALSE;
+ else if (s2 == NULL)
+ return FALSE;
+ else
+ return strcmp (s1, s2) == 0;
+}
+
+static void
+verbose (const gchar *format, ...)
+{
+ /* Function copied from glib/tests/patterntest.c by Matthias Clasen. */
+ gchar *msg;
+ va_list args;
+
+ va_start (args, format);
+ msg = g_strdup_vprintf (format, args);
+ va_end (args);
+
+ if (noisy)
+ g_print ("%s", msg);
+ g_free (msg);
+}
+
+static gboolean
+test_new (const gchar *pattern,
+ GRegexCompileFlags compile_opts,
+ GRegexMatchFlags match_opts)
+{
+ GRegex *regex;
+
+ verbose ("compiling \"%s\" \t", pattern);
+
+ regex = g_regex_new (pattern, compile_opts, match_opts, NULL);
+ if (regex == NULL)
+ {
+ g_print ("failed \t(pattern: \"%s\", compile: %d, match %d)\n",
+ pattern, compile_opts, match_opts);
+ return FALSE;
+ }
+
+ if (!streq (g_regex_get_pattern (regex), pattern))
+ {
+ g_print ("failed \t(pattern: \"%s\")\n",
+ pattern);
+ g_regex_unref (regex);
+ return FALSE;
+ }
+
+ g_regex_unref (regex);
+
+ verbose ("passed\n");
+ return TRUE;
+}
+
+#define TEST_NEW(pattern, compile_opts, match_opts) { \
+ total++; \
+ if (test_new (pattern, compile_opts, match_opts)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+static gboolean
+test_new_fail (const gchar *pattern,
+ GRegexCompileFlags compile_opts)
+{
+ GRegex *regex;
+
+ verbose ("compiling \"%s\" (expected a failure) \t", pattern);
+
+ regex = g_regex_new (pattern, compile_opts, 0, NULL);
+
+ if (regex != NULL)
+ {
+ g_print ("failed \t(pattern: \"%s\", compile: %d)\n",
+ pattern, compile_opts);
+ g_regex_unref (regex);
+ return FALSE;
+ }
+
+ verbose ("passed\n");
+ return TRUE;
+}
+
+#define TEST_NEW_FAIL(pattern, compile_opts) { \
+ total++; \
+ if (test_new_fail (pattern, compile_opts)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+static gboolean
+test_match_simple (const gchar *pattern,
+ const gchar *string,
+ GRegexCompileFlags compile_opts,
+ GRegexMatchFlags match_opts,
+ gboolean expected)
+{
+ gboolean match;
+
+ verbose ("matching \"%s\" against \"%s\" \t", string, pattern);
+
+ match = g_regex_match_simple (pattern, string, compile_opts, match_opts);
+ if (match != expected)
+ {
+ g_print ("failed \t(unexpected %s)\n", match ? "match" : "mismatch");
+ return FALSE;
+ }
+ else
+ {
+ verbose ("passed (%s)\n", match ? "match" : "nomatch");
+ return TRUE;
+ }
+}
+
+#define TEST_MATCH_SIMPLE(pattern, string, compile_opts, match_opts, expected) { \
+ total++; \
+ if (test_match_simple (pattern, string, compile_opts, match_opts, expected)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+static gboolean
+test_match (const gchar *pattern,
+ GRegexCompileFlags compile_opts,
+ GRegexMatchFlags match_opts,
+ const gchar *string,
+ gssize string_len,
+ gint start_position,
+ GRegexMatchFlags match_opts2,
+ gboolean expected)
+{
+ GRegex *regex;
+ gboolean match;
+
+ verbose ("matching \"%s\" against \"%s\" (start: %d, len: %d) \t",
+ string, pattern, start_position, string_len);
+
+ regex = g_regex_new (pattern, compile_opts, match_opts, NULL);
+ match = g_regex_match_full (regex, string, string_len,
+ start_position, match_opts2, NULL, NULL);
+ if (match != expected)
+ {
+ gchar *e1 = g_strescape (pattern, NULL);
+ gchar *e2 = g_strescape (string, NULL);
+ g_print ("failed \t(unexpected %s) '%s' against '%s'\n", match ? "match" : "mismatch", e1, e2);
+ g_free (e1);
+ g_free (e2);
+ g_regex_unref (regex);
+ return FALSE;
+ }
+
+ if (string_len == -1 && start_position == 0)
+ {
+ match = g_regex_match (regex, string, match_opts2, NULL);
+ if (match != expected)
+ {
+ g_print ("failed \t(pattern: \"%s\", string: \"%s\")\n",
+ pattern, string);
+ g_regex_unref (regex);
+ return FALSE;
+ }
+ }
+
+ g_regex_unref (regex);
+
+ verbose ("passed (%s)\n", match ? "match" : "nomatch");
+ return TRUE;
+}
+
+#define TEST_MATCH(pattern, compile_opts, match_opts, string, \
+ string_len, start_position, match_opts2, expected) { \
+ total++; \
+ if (test_match (pattern, compile_opts, match_opts, string, \
+ string_len, start_position, match_opts2, expected)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+struct _Match
+{
+ gchar *string;
+ gint start, end;
+};
+typedef struct _Match Match;
+
+static void
+free_match (gpointer data, gpointer user_data)
+{
+ Match *match = data;
+ if (match == NULL)
+ return;
+ g_free (match->string);
+ g_free (match);
+}
+
+static gboolean
+test_match_next (const gchar *pattern,
+ const gchar *string,
+ gssize string_len,
+ gint start_position,
+ ...)
+{
+ GRegex *regex;
+ GMatchInfo *match_info;
+ va_list args;
+ GSList *matches = NULL;
+ GSList *expected = NULL;
+ GSList *l_exp, *l_match;
+ gboolean ret = TRUE;
+
+ verbose ("matching \"%s\" against \"%s\" (start: %d, len: %d) \t",
+ string, pattern, start_position, string_len);
+
+ /* The va_list is a NULL-terminated sequence of: extected matched string,
+ * expected start and expected end. */
+ va_start (args, start_position);
+ while (TRUE)
+ {
+ Match *match;
+ const gchar *expected_string = va_arg (args, const gchar *);
+ if (expected_string == NULL)
+ break;
+ match = g_new0 (Match, 1);
+ match->string = g_strdup (expected_string);
+ match->start = va_arg (args, gint);
+ match->end = va_arg (args, gint);
+ expected = g_slist_prepend (expected, match);
+ }
+ expected = g_slist_reverse (expected);
+ va_end (args);
+
+ regex = g_regex_new (pattern, 0, 0, NULL);
+
+ g_regex_match_full (regex, string, string_len,
+ start_position, 0, &match_info, NULL);
+ while (g_match_info_matches (match_info))
+ {
+ Match *match = g_new0 (Match, 1);
+ match->string = g_match_info_fetch (match_info, 0);
+ match->start = UNTOUCHED;
+ match->end = UNTOUCHED;
+ g_match_info_fetch_pos (match_info, 0, &match->start, &match->end);
+ matches = g_slist_prepend (matches, match);
+ g_match_info_next (match_info, NULL);
+ }
+ g_assert (regex == g_match_info_get_regex (match_info));
+ g_assert (string == g_match_info_get_string (match_info));
+ g_match_info_free (match_info);
+ matches = g_slist_reverse (matches);
+
+ if (g_slist_length (matches) != g_slist_length (expected))
+ {
+ gint match_count = g_slist_length (matches);
+ g_print ("failed \t(got %d %s, expected %d)\n", match_count,
+ match_count == 1 ? "match" : "matches",
+ g_slist_length (expected));
+ ret = FALSE;
+ goto exit;
+ }
+
+ l_exp = expected;
+ l_match = matches;
+ while (l_exp != NULL)
+ {
+ Match *exp = l_exp->data;
+ Match *match = l_match->data;
+
+ if (!streq(exp->string, match->string))
+ {
+ g_print ("failed \t(got \"%s\", expected \"%s\")\n",
+ match->string, exp->string);
+ ret = FALSE;
+ goto exit;
+ }
+
+ if (exp->start != match->start || exp->end != match->end)
+ {
+ g_print ("failed \t(got [%d, %d], expected [%d, %d])\n",
+ match->start, match->end, exp->start, exp->end);
+ ret = FALSE;
+ goto exit;
+ }
+
+ l_exp = g_slist_next (l_exp);
+ l_match = g_slist_next (l_match);
+ }
+
+exit:
+ if (ret)
+ {
+ gint count = g_slist_length (matches);
+ verbose ("passed (%d %s)\n", count, count == 1 ? "match" : "matches");
+ }
+
+ g_regex_unref (regex);
+ g_slist_foreach (expected, free_match, NULL);
+ g_slist_free (expected);
+ g_slist_foreach (matches, free_match, NULL);
+ g_slist_free (matches);
+
+ return ret;
+}
+
+#define TEST_MATCH_NEXT0(pattern, string, string_len, start_position) { \
+ total++; \
+ if (test_match_next (pattern, string, string_len, start_position, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+#define TEST_MATCH_NEXT1(pattern, string, string_len, start_position, \
+ t1, s1, e1) { \
+ total++; \
+ if (test_match_next (pattern, string, string_len, start_position, \
+ t1, s1, e1, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+#define TEST_MATCH_NEXT2(pattern, string, string_len, start_position, \
+ t1, s1, e1, t2, s2, e2) { \
+ total++; \
+ if (test_match_next (pattern, string, string_len, start_position, \
+ t1, s1, e1, t2, s2, e2, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+#define TEST_MATCH_NEXT3(pattern, string, string_len, start_position, \
+ t1, s1, e1, t2, s2, e2, t3, s3, e3) { \
+ total++; \
+ if (test_match_next (pattern, string, string_len, start_position, \
+ t1, s1, e1, t2, s2, e2, t3, s3, e3, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+#define TEST_MATCH_NEXT4(pattern, string, string_len, start_position, \
+ t1, s1, e1, t2, s2, e2, t3, s3, e3, t4, s4, e4) { \
+ total++; \
+ if (test_match_next (pattern, string, string_len, start_position, \
+ t1, s1, e1, t2, s2, e2, t3, s3, e3, t4, s4, e4, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+static gboolean
+test_match_count (const gchar *pattern,
+ const gchar *string,
+ gint start_position,
+ GRegexMatchFlags match_opts,
+ gint expected_count)
+{
+ GRegex *regex;
+ GMatchInfo *match_info;
+ gint count;
+
+ verbose ("fetching match count (string: \"%s\", pattern: \"%s\", start: %d) \t",
+ string, pattern, start_position);
+
+ regex = g_regex_new (pattern, 0, 0, NULL);
+
+ g_regex_match_full (regex, string, -1, start_position,
+ match_opts, &match_info, NULL);
+ count = g_match_info_get_match_count (match_info);
+
+ if (count != expected_count)
+ {
+ g_print ("failed \t(got %d, expected: %d)\n", count, expected_count);
+ return FALSE;
+ }
+
+ g_match_info_free (match_info);
+ g_regex_unref (regex);
+
+ verbose ("passed\n");
+ return TRUE;
+}
+
+#define TEST_MATCH_COUNT(pattern, string, start_position, match_opts, expected_count) { \
+ total++; \
+ if (test_match_count (pattern, string, start_position, match_opts, expected_count)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+static gboolean
+test_partial (const gchar *pattern,
+ const gchar *string,
+ gboolean expected)
+{
+ GRegex *regex;
+ GMatchInfo *match_info;
+
+ verbose ("partial matching (string: \"%s\", pattern: \"%s\") \t",
+ string, pattern);
+
+ regex = g_regex_new (pattern, 0, 0, NULL);
+
+ g_regex_match (regex, string, G_REGEX_MATCH_PARTIAL, &match_info);
+ if (expected != g_match_info_is_partial_match (match_info))
+ {
+ g_print ("failed \t(got %d, expected: %d)\n", !expected, expected);
+ g_regex_unref (regex);
+ return FALSE;
+ }
+
+ if (expected && g_match_info_fetch_pos (match_info, 0, NULL, NULL))
+ {
+ g_print ("failed \t(got sub-pattern 0)\n");
+ g_regex_unref (regex);
+ return FALSE;
+ }
+
+ if (expected && g_match_info_fetch_pos (match_info, 1, NULL, NULL))
+ {
+ g_print ("failed \t(got sub-pattern 1)\n");
+ g_regex_unref (regex);
+ return FALSE;
+ }
+
+ g_match_info_free (match_info);
+ g_regex_unref (regex);
+
+ verbose ("passed\n");
+ return TRUE;
+}
+
+#define TEST_PARTIAL(pattern, string, expected) { \
+ total++; \
+ if (test_partial (pattern, string, expected)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+static gboolean
+test_sub_pattern (const gchar *pattern,
+ const gchar *string,
+ gint start_position,
+ gint sub_n,
+ const gchar *expected_sub,
+ gint expected_start,
+ gint expected_end)
+{
+ GRegex *regex;
+ GMatchInfo *match_info;
+ gchar *sub_expr;
+ gint start = UNTOUCHED, end = UNTOUCHED;
+
+ verbose ("fetching sub-pattern %d from \"%s\" (pattern: \"%s\") \t",
+ sub_n, string, pattern);
+
+ regex = g_regex_new (pattern, 0, 0, NULL);
+ g_regex_match_full (regex, string, -1, start_position, 0, &match_info, NULL);
+
+ sub_expr = g_match_info_fetch (match_info, sub_n);
+ if (!streq(sub_expr, expected_sub))
+ {
+ g_print ("failed \t(got \"%s\", expected \"%s\")\n",
+ sub_expr, expected_sub);
+ g_free (sub_expr);
+ g_regex_unref (regex);
+ return FALSE;
+ }
+ g_free (sub_expr);
+
+ g_match_info_fetch_pos (match_info, sub_n, &start, &end);
+ if (start != expected_start || end != expected_end)
+ {
+ g_print ("failed \t(got [%d, %d], expected [%d, %d])\n",
+ start, end, expected_start, expected_end);
+ g_regex_unref (regex);
+ return FALSE;
+ }
+
+ g_match_info_free (match_info);
+ g_regex_unref (regex);
+
+ verbose ("passed\n");
+ return TRUE;
+}
+
+#define TEST_SUB_PATTERN(pattern, string, start_position, sub_n, expected_sub, \
+ expected_start, expected_end) { \
+ total++; \
+ if (test_sub_pattern (pattern, string, start_position, sub_n, expected_sub, \
+ expected_start, expected_end)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+static gboolean
+test_named_sub_pattern (const gchar *pattern,
+ GRegexCompileFlags flags,
+ const gchar *string,
+ gint start_position,
+ const gchar *sub_name,
+ const gchar *expected_sub,
+ gint expected_start,
+ gint expected_end)
+{
+ GRegex *regex;
+ GMatchInfo *match_info;
+ gint start = UNTOUCHED, end = UNTOUCHED;
+ gchar *sub_expr;
+
+ verbose ("fetching sub-pattern \"%s\" from \"%s\" (pattern: \"%s\") \t",
+ sub_name, string, pattern);
+
+ regex = g_regex_new (pattern, flags, 0, NULL);
+
+ g_regex_match_full (regex, string, -1, start_position, 0, &match_info, NULL);
+ sub_expr = g_match_info_fetch_named (match_info, sub_name);
+ if (!streq (sub_expr, expected_sub))
+ {
+ g_print ("failed \t(got \"%s\", expected \"%s\")\n",
+ sub_expr, expected_sub);
+ g_free (sub_expr);
+ g_regex_unref (regex);
+ return FALSE;
+ }
+ g_free (sub_expr);
+
+ g_match_info_fetch_named_pos (match_info, sub_name, &start, &end);
+ if (start != expected_start || end != expected_end)
+ {
+ g_print ("failed \t(got [%d, %d], expected [%d, %d])\n",
+ start, end, expected_start, expected_end);
+ g_regex_unref (regex);
+ return FALSE;
+ }
+
+ g_match_info_free (match_info);
+ g_regex_unref (regex);
+
+ verbose ("passed\n");
+ return TRUE;
+}
+
+#define TEST_NAMED_SUB_PATTERN(pattern, string, start_position, sub_name, \
+ expected_sub, expected_start, expected_end) { \
+ total++; \
+ if (test_named_sub_pattern (pattern, 0, string, start_position, sub_name, \
+ expected_sub, expected_start, expected_end)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+#define TEST_NAMED_SUB_PATTERN_DUPNAMES(pattern, string, start_position, sub_name, \
+ expected_sub, expected_start, expected_end) { \
+ total++; \
+ if (test_named_sub_pattern (pattern, G_REGEX_DUPNAMES, string, start_position, \
+ sub_name, expected_sub, expected_start, expected_end)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+static gboolean
+test_fetch_all (const gchar *pattern,
+ const gchar *string,
+ ...)
+{
+ GRegex *regex;
+ GMatchInfo *match_info;
+ va_list args;
+ GSList *expected = NULL;
+ GSList *l_exp;
+ gchar **matches;
+ gint match_count;
+ gboolean ret = TRUE;
+ gint i;
+
+ verbose ("fetching all sub-patterns from \"%s\" (pattern: \"%s\") \t",
+ string, pattern);
+
+ /* The va_list is a NULL-terminated sequence of extected strings. */
+ va_start (args, string);
+ while (TRUE)
+ {
+ gchar *expected_string = va_arg (args, gchar *);
+ if (expected_string == NULL)
+ break;
+ else
+ expected = g_slist_prepend (expected, g_strdup (expected_string));
+ }
+ expected = g_slist_reverse (expected);
+ va_end (args);
+
+ regex = g_regex_new (pattern, 0, 0, NULL);
+ g_regex_match (regex, string, 0, &match_info);
+ matches = g_match_info_fetch_all (match_info);
+ if (matches)
+ match_count = g_strv_length (matches);
+ else
+ match_count = 0;
+
+ if (match_count != g_slist_length (expected))
+ {
+ g_print ("failed \t(got %d %s, expected %d)\n", match_count,
+ match_count == 1 ? "match" : "matches",
+ g_slist_length (expected));
+ ret = FALSE;
+ goto exit;
+ }
+
+ l_exp = expected;
+ for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp))
+ {
+ if (!streq(l_exp->data, matches [i]))
+ {
+ g_print ("failed \t(got \"%s\", expected \"%s\")\n",
+ matches [i], (gchar *)l_exp->data);
+ ret = FALSE;
+ goto exit;
+ }
+ }
+
+ verbose ("passed (%d %s)\n", match_count,
+ match_count == 1 ? "match" : "matches");
+
+exit:
+ g_match_info_free (match_info);
+ g_regex_unref (regex);
+ g_slist_foreach (expected, (GFunc)g_free, NULL);
+ g_slist_free (expected);
+ g_strfreev (matches);
+
+ return ret;
+}
+
+#define TEST_FETCH_ALL0(pattern, string) { \
+ total++; \
+ if (test_fetch_all (pattern, string, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+#define TEST_FETCH_ALL1(pattern, string, e1) { \
+ total++; \
+ if (test_fetch_all (pattern, string, e1, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+#define TEST_FETCH_ALL2(pattern, string, e1, e2) { \
+ total++; \
+ if (test_fetch_all (pattern, string, e1, e2, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+#define TEST_FETCH_ALL3(pattern, string, e1, e2, e3) { \
+ total++; \
+ if (test_fetch_all (pattern, string, e1, e2, e3, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+static gboolean
+test_split_simple (const gchar *pattern,
+ const gchar *string,
+ ...)
+{
+ va_list args;
+ GSList *expected = NULL;
+ GSList *l_exp;
+ gchar **tokens;
+ gint token_count;
+ gboolean ret = TRUE;
+ gint i;
+
+ verbose ("splitting \"%s\" against \"%s\" \t", string, pattern);
+
+ /* The va_list is a NULL-terminated sequence of extected strings. */
+ va_start (args, string);
+ while (TRUE)
+ {
+ gchar *expected_string = va_arg (args, gchar *);
+ if (expected_string == NULL)
+ break;
+ else
+ expected = g_slist_prepend (expected, g_strdup (expected_string));
+ }
+ expected = g_slist_reverse (expected);
+ va_end (args);
+
+ tokens = g_regex_split_simple (pattern, string, 0, 0);
+ if (tokens)
+ token_count = g_strv_length (tokens);
+ else
+ token_count = 0;
+
+ if (token_count != g_slist_length (expected))
+ {
+ g_print ("failed \t(got %d %s, expected %d)\n", token_count,
+ token_count == 1 ? "match" : "matches",
+ g_slist_length (expected));
+ ret = FALSE;
+ goto exit;
+ }
+
+ l_exp = expected;
+ for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp))
+ {
+ if (!streq(l_exp->data, tokens [i]))
+ {
+ g_print ("failed \t(got \"%s\", expected \"%s\")\n",
+ tokens[i], (gchar *)l_exp->data);
+ ret = FALSE;
+ goto exit;
+ }
+ }
+
+ verbose ("passed (%d %s)\n", token_count,
+ token_count == 1 ? "token" : "tokens");
+
+exit:
+ g_slist_foreach (expected, (GFunc)g_free, NULL);
+ g_slist_free (expected);
+ g_strfreev (tokens);
+
+ return ret;
+}
+
+#define TEST_SPLIT_SIMPLE0(pattern, string) { \
+ total++; \
+ if (test_split_simple (pattern, string, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+#define TEST_SPLIT_SIMPLE1(pattern, string, e1) { \
+ total++; \
+ if (test_split_simple (pattern, string, e1, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+#define TEST_SPLIT_SIMPLE2(pattern, string, e1, e2) { \
+ total++; \
+ if (test_split_simple (pattern, string, e1, e2, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+#define TEST_SPLIT_SIMPLE3(pattern, string, e1, e2, e3) { \
+ total++; \
+ if (test_split_simple (pattern, string, e1, e2, e3, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+static gboolean
+test_split_full (const gchar *pattern,
+ const gchar *string,
+ gint start_position,
+ gint max_tokens,
+ ...)
+{
+ GRegex *regex;
+ va_list args;
+ GSList *expected = NULL;
+ GSList *l_exp;
+ gchar **tokens;
+ gint token_count;
+ gboolean ret = TRUE;
+ gint i;
+
+ verbose ("splitting \"%s\" against \"%s\" (start: %d, max: %d) \t",
+ string, pattern, start_position, max_tokens);
+
+ /* The va_list is a NULL-terminated sequence of extected strings. */
+ va_start (args, max_tokens);
+ while (TRUE)
+ {
+ gchar *expected_string = va_arg (args, gchar *);
+ if (expected_string == NULL)
+ break;
+ else
+ expected = g_slist_prepend (expected, g_strdup (expected_string));
+ }
+ expected = g_slist_reverse (expected);
+ va_end (args);
+
+ regex = g_regex_new (pattern, 0, 0, NULL);
+ tokens = g_regex_split_full (regex, string, -1, start_position,
+ 0, max_tokens, NULL);
+ if (tokens)
+ token_count = g_strv_length (tokens);
+ else
+ token_count = 0;
+
+ if (token_count != g_slist_length (expected))
+ {
+ g_print ("failed \t(got %d %s, expected %d)\n", token_count,
+ token_count == 1 ? "match" : "matches",
+ g_slist_length (expected));
+ ret = FALSE;
+ goto exit;
+ }
+
+ l_exp = expected;
+ for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp))
+ {
+ if (!streq(l_exp->data, tokens [i]))
+ {
+ g_print ("failed \t(got \"%s\", expected \"%s\")\n",
+ tokens[i], (gchar *)l_exp->data);
+ ret = FALSE;
+ goto exit;
+ }
+ }
+
+ verbose ("passed (%d %s)\n", token_count,
+ token_count == 1 ? "token" : "tokens");
+
+exit:
+ g_regex_unref (regex);
+ g_slist_foreach (expected, (GFunc)g_free, NULL);
+ g_slist_free (expected);
+ g_strfreev (tokens);
+
+ return ret;
+}
+
+static gboolean
+test_split (const gchar *pattern,
+ const gchar *string,
+ ...)
+{
+ GRegex *regex;
+ va_list args;
+ GSList *expected = NULL;
+ GSList *l_exp;
+ gchar **tokens;
+ gint token_count;
+ gboolean ret = TRUE;
+ gint i;
+
+ verbose ("splitting \"%s\" against \"%s\" \t", string, pattern);
+
+ /* The va_list is a NULL-terminated sequence of extected strings. */
+ va_start (args, string);
+ while (TRUE)
+ {
+ gchar *expected_string = va_arg (args, gchar *);
+ if (expected_string == NULL)
+ break;
+ else
+ expected = g_slist_prepend (expected, g_strdup (expected_string));
+ }
+ expected = g_slist_reverse (expected);
+ va_end (args);
+
+ regex = g_regex_new (pattern, 0, 0, NULL);
+ tokens = g_regex_split (regex, string, 0);
+ if (tokens)
+ token_count = g_strv_length (tokens);
+ else
+ token_count = 0;
+
+ if (token_count != g_slist_length (expected))
+ {
+ g_print ("failed \t(got %d %s, expected %d)\n", token_count,
+ token_count == 1 ? "match" : "matches",
+ g_slist_length (expected));
+ ret = FALSE;
+ goto exit;
+ }
+
+ l_exp = expected;
+ for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp))
+ {
+ if (!streq(l_exp->data, tokens [i]))
+ {
+ g_print ("failed \t(got \"%s\", expected \"%s\")\n",
+ tokens[i], (gchar *)l_exp->data);
+ ret = FALSE;
+ goto exit;
+ }
+ }
+
+ verbose ("passed (%d %s)\n", token_count,
+ token_count == 1 ? "token" : "tokens");
+
+exit:
+ g_regex_unref (regex);
+ g_slist_foreach (expected, (GFunc)g_free, NULL);
+ g_slist_free (expected);
+ g_strfreev (tokens);
+
+ return ret;
+}
+
+#define TEST_SPLIT0(pattern, string, start_position, max_tokens) { \
+ total++; \
+ if (test_split_full (pattern, string, start_position, max_tokens, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ if (start_position == 0 && max_tokens <= 0) \
+ { \
+ total++; \
+ if (test_split (pattern, string, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ } \
+}
+
+#define TEST_SPLIT1(pattern, string, start_position, max_tokens, e1) { \
+ total++; \
+ if (test_split_full (pattern, string, start_position, max_tokens, e1, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ if (start_position == 0 && max_tokens <= 0) \
+ { \
+ total++; \
+ if (test_split (pattern, string, e1, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ } \
+}
+
+#define TEST_SPLIT2(pattern, string, start_position, max_tokens, e1, e2) { \
+ total++; \
+ if (test_split_full (pattern, string, start_position, max_tokens, e1, e2, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ if (start_position == 0 && max_tokens <= 0) \
+ { \
+ total++; \
+ if (test_split (pattern, string, e1, e2, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ } \
+}
+
+#define TEST_SPLIT3(pattern, string, start_position, max_tokens, e1, e2, e3) { \
+ total++; \
+ if (test_split_full (pattern, string, start_position, max_tokens, e1, e2, e3, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ if (start_position == 0 && max_tokens <= 0) \
+ { \
+ total++; \
+ if (test_split (pattern, string, e1, e2, e3, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ } \
+}
+
+static gboolean
+test_check_replacement (const gchar *string_to_expand,
+ gboolean expected,
+ gboolean expected_refs)
+{
+ gboolean result;
+ gboolean has_refs;
+
+ verbose ("checking replacement string \"%s\" \t", string_to_expand);
+
+ result = g_regex_check_replacement (string_to_expand, &has_refs, NULL);
+ if (expected != result)
+ {
+ g_print ("failed \t(got \"%s\", expected \"%s\")\n",
+ result ? "TRUE" : "FALSE",
+ expected ? "TRUE" : "FALSE");
+ return FALSE;
+ }
+
+ if (expected && expected_refs != has_refs)
+ {
+ g_print ("failed \t(got has_references \"%s\", expected \"%s\")\n",
+ has_refs ? "TRUE" : "FALSE",
+ expected_refs ? "TRUE" : "FALSE");
+ return FALSE;
+ }
+
+ verbose ("passed\n");
+ return TRUE;
+}
+
+#define TEST_CHECK_REPLACEMENT(string_to_expand, expected, expected_refs) { \
+ total++; \
+ if (test_check_replacement (string_to_expand, expected, expected_refs)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+static gboolean
+test_expand (const gchar *pattern,
+ const gchar *string,
+ const gchar *string_to_expand,
+ gboolean raw,
+ const gchar *expected)
+{
+ GRegex *regex = NULL;
+ GMatchInfo *match_info = NULL;
+ gchar *res;
+
+ verbose ("expanding the references in \"%s\" (pattern: \"%s\", string: \"%s\") \t",
+ string_to_expand, pattern, string);
+
+ if (pattern)
+ {
+ regex = g_regex_new (pattern, raw ? G_REGEX_RAW : 0, 0, NULL);
+ g_regex_match (regex, string, 0, &match_info);
+ }
+
+ res = g_match_info_expand_references (match_info, string_to_expand, NULL);
+ if (!streq (res, expected))
+ {
+ g_print ("failed \t(got \"%s\", expected \"%s\")\n", res, expected);
+ g_free (res);
+ g_match_info_free (match_info);
+ g_regex_unref (regex);
+ return FALSE;
+ }
+
+ g_free (res);
+ g_match_info_free (match_info);
+ if (regex)
+ g_regex_unref (regex);
+
+ verbose ("passed\n");
+ return TRUE;
+}
+
+#define TEST_EXPAND(pattern, string, string_to_expand, raw, expected) { \
+ total++; \
+ if (test_expand (pattern, string, string_to_expand, raw, expected)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+static gboolean
+test_replace (const gchar *pattern,
+ const gchar *string,
+ gint start_position,
+ const gchar *replacement,
+ const gchar *expected)
+{
+ GRegex *regex;
+ gchar *res;
+
+ verbose ("replacing \"%s\" in \"%s\" (pattern: \"%s\", start: %d) \t",
+ replacement, string, pattern, start_position);
+
+ regex = g_regex_new (pattern, 0, 0, NULL);
+ res = g_regex_replace (regex, string, -1, start_position, replacement, 0, NULL);
+ if (!streq (res, expected))
+ {
+ g_print ("failed \t(got \"%s\", expected \"%s\")\n", res, expected);
+ g_free (res);
+ g_regex_unref (regex);
+ return FALSE;
+ }
+
+ g_free (res);
+ g_regex_unref (regex);
+
+ verbose ("passed\n");
+ return TRUE;
+}
+
+#define TEST_REPLACE(pattern, string, start_position, replacement, expected) { \
+ total++; \
+ if (test_replace (pattern, string, start_position, replacement, expected)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+static gboolean
+test_replace_lit (const gchar *pattern,
+ const gchar *string,
+ gint start_position,
+ const gchar *replacement,
+ const gchar *expected)
+{
+ GRegex *regex;
+ gchar *res;
+
+ verbose ("replacing literally \"%s\" in \"%s\" (pattern: \"%s\", start: %d) \t",
+ replacement, string, pattern, start_position);
+
+ regex = g_regex_new (pattern, 0, 0, NULL);
+ res = g_regex_replace_literal (regex, string, -1, start_position,
+ replacement, 0, NULL);
+ if (!streq (res, expected))
+ {
+ g_print ("failed \t(got \"%s\", expected \"%s\")\n", res, expected);
+ g_free (res);
+ g_regex_unref (regex);
+ return FALSE;
+ }
+
+ g_free (res);
+ g_regex_unref (regex);
+
+ verbose ("passed\n");
+ return TRUE;
+}
+
+#define TEST_REPLACE_LIT(pattern, string, start_position, replacement, expected) { \
+ total++; \
+ if (test_replace_lit (pattern, string, start_position, replacement, expected)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+static gboolean
+test_get_string_number (const gchar *pattern,
+ const gchar *name,
+ gint expected_num)
+{
+ GRegex *regex;
+ gint num;
+
+ verbose ("getting the number of \"%s\" (pattern: \"%s\") \t",
+ name, pattern);
+
+ regex = g_regex_new (pattern, 0, 0, NULL);
+ num = g_regex_get_string_number (regex, name);
+ g_regex_unref (regex);
+
+ if (num != expected_num)
+ {
+ g_print ("failed \t(got %d, expected %d)\n", num, expected_num);
+ return FALSE;
+ }
+ else
+ {
+ verbose ("passed\n");
+ return TRUE;
+ }
+}
+
+#define TEST_GET_STRING_NUMBER(pattern, name, expected_num) { \
+ total++; \
+ if (test_get_string_number (pattern, name, expected_num)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+static gboolean
+test_escape (const gchar *string,
+ gint length,
+ const gchar *expected)
+{
+ gchar *escaped;
+
+ verbose ("escaping \"%s\" (len: %d) \t", string, length);
+
+ escaped = g_regex_escape_string (string, length);
+
+ if (!streq (escaped, expected))
+ {
+ g_print ("failed \t(got \"%s\", expected \"%s\")\n", escaped, expected);
+ g_free (escaped);
+ return FALSE;
+ }
+
+ g_free (escaped);
+
+ verbose ("passed\n");
+ return TRUE;
+}
+
+#define TEST_ESCAPE(string, length, expected) { \
+ total++; \
+ if (test_escape (string, length, expected)) \
+ PASS; \
+ else \
+ FAIL; \
+}
+
+static gboolean
+test_match_all_full (const gchar *pattern,
+ const gchar *string,
+ gssize string_len,
+ gint start_position,
+ ...)
+{
+ GRegex *regex;
+ GMatchInfo *match_info;
+ va_list args;
+ GSList *expected = NULL;
+ GSList *l_exp;
+ gboolean match_ok;
+ gboolean ret = TRUE;
+ gint match_count;
+ gint i;
+
+ verbose ("matching all in \"%s\" against \"%s\" (start: %d, len: %d) \t",
+ string, pattern, start_position, string_len);
+
+ /* The va_list is a NULL-terminated sequence of: extected matched string,
+ * expected start and expected end. */
+ va_start (args, start_position);
+ while (TRUE)
+ {
+ Match *match;
+ const gchar *expected_string = va_arg (args, const gchar *);
+ if (expected_string == NULL)
+ break;
+ match = g_new0 (Match, 1);
+ match->string = g_strdup (expected_string);
+ match->start = va_arg (args, gint);
+ match->end = va_arg (args, gint);
+ expected = g_slist_prepend (expected, match);
+ }
+ expected = g_slist_reverse (expected);
+ va_end (args);
+
+ regex = g_regex_new (pattern, 0, 0, NULL);
+ match_ok = g_regex_match_all_full (regex, string, string_len, start_position,
+ 0, &match_info, NULL);
+
+ if (match_ok && g_slist_length (expected) == 0)
+ {
+ g_print ("failed\n");
+ ret = FALSE;
+ goto exit;
+ }
+ if (!match_ok && g_slist_length (expected) != 0)
+ {
+ g_print ("failed\n");
+ ret = FALSE;
+ goto exit;
+ }
+
+ match_count = g_match_info_get_match_count (match_info);
+ if (match_count != g_slist_length (expected))
+ {
+ g_print ("failed \t(got %d %s, expected %d)\n", match_count,
+ match_count == 1 ? "match" : "matches",
+ g_slist_length (expected));
+ ret = FALSE;
+ goto exit;
+ }
+
+ l_exp = expected;
+ for (i = 0; i < match_count; i++)
+ {
+ gint start, end;
+ gchar *matched_string;
+ Match *exp = l_exp->data;
+
+ matched_string = g_match_info_fetch (match_info, i);
+ g_match_info_fetch_pos (match_info, i, &start, &end);
+
+ if (!streq(exp->string, matched_string))
+ {
+ g_print ("failed \t(got \"%s\", expected \"%s\")\n",
+ matched_string, exp->string);
+ g_free (matched_string);
+ ret = FALSE;
+ goto exit;
+ }
+ g_free (matched_string);
+
+ if (exp->start != start || exp->end != end)
+ {
+ g_print ("failed \t(got [%d, %d], expected [%d, %d])\n",
+ start, end, exp->start, exp->end);
+ ret = FALSE;
+ goto exit;
+ }
+
+ l_exp = g_slist_next (l_exp);
+ }
+
+exit:
+ if (ret)
+ {
+ verbose ("passed (%d %s)\n", match_count, match_count == 1 ? "match" : "matches");
+ }
+
+ g_match_info_free (match_info);
+ g_regex_unref (regex);
+ g_slist_foreach (expected, free_match, NULL);
+ g_slist_free (expected);
+
+ return ret;
+}
+
+static gboolean
+test_match_all (const gchar *pattern,
+ const gchar *string,
+ ...)
+{
+ GRegex *regex;
+ GMatchInfo *match_info;
+ va_list args;
+ GSList *expected = NULL;
+ GSList *l_exp;
+ gboolean match_ok;
+ gboolean ret = TRUE;
+ gint match_count;
+ gint i;
+
+ verbose ("matching all in \"%s\" against \"%s\" \t", string, pattern);
+
+ /* The va_list is a NULL-terminated sequence of: extected matched string,
+ * expected start and expected end. */
+ va_start (args, string);
+ while (TRUE)
+ {
+ Match *match;
+ const gchar *expected_string = va_arg (args, const gchar *);
+ if (expected_string == NULL)
+ break;
+ match = g_new0 (Match, 1);
+ match->string = g_strdup (expected_string);
+ match->start = va_arg (args, gint);
+ match->end = va_arg (args, gint);
+ expected = g_slist_prepend (expected, match);
+ }
+ expected = g_slist_reverse (expected);
+ va_end (args);
+
+ regex = g_regex_new (pattern, 0, 0, NULL);
+ match_ok = g_regex_match_all (regex, string, 0, &match_info);
+
+ if (match_ok && g_slist_length (expected) == 0)
+ {
+ g_print ("failed\n");
+ ret = FALSE;
+ goto exit;
+ }
+ if (!match_ok && g_slist_length (expected) != 0)
+ {
+ g_print ("failed\n");
+ ret = FALSE;
+ goto exit;
+ }
+
+ match_count = g_match_info_get_match_count (match_info);
+ if (match_count != g_slist_length (expected))
+ {
+ g_print ("failed \t(got %d %s, expected %d)\n", match_count,
+ match_count == 1 ? "match" : "matches",
+ g_slist_length (expected));
+ ret = FALSE;
+ goto exit;
+ }
+
+ l_exp = expected;
+ for (i = 0; i < match_count; i++)
+ {
+ gint start, end;
+ gchar *matched_string;
+ Match *exp = l_exp->data;
+
+ matched_string = g_match_info_fetch (match_info, i);
+ g_match_info_fetch_pos (match_info, i, &start, &end);
+
+ if (!streq(exp->string, matched_string))
+ {
+ g_print ("failed \t(got \"%s\", expected \"%s\")\n",
+ matched_string, exp->string);
+ g_free (matched_string);
+ ret = FALSE;
+ goto exit;
+ }
+ g_free (matched_string);
+
+ if (exp->start != start || exp->end != end)
+ {
+ g_print ("failed \t(got [%d, %d], expected [%d, %d])\n",
+ start, end, exp->start, exp->end);
+ ret = FALSE;
+ goto exit;
+ }
+
+ l_exp = g_slist_next (l_exp);
+ }
+
+exit:
+ if (ret)
+ {
+ verbose ("passed (%d %s)\n", match_count, match_count == 1 ? "match" : "matches");
+ }
+
+ g_match_info_free (match_info);
+ g_regex_unref (regex);
+ g_slist_foreach (expected, free_match, NULL);
+ g_slist_free (expected);
+
+ return ret;
+}
+
+#define TEST_MATCH_ALL0(pattern, string, string_len, start_position) { \
+ total++; \
+ if (test_match_all_full (pattern, string, string_len, start_position, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ if (string_len == -1 && start_position == 0) \
+ { \
+ total++; \
+ if (test_match_all (pattern, string, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ } \
+}
+
+#define TEST_MATCH_ALL1(pattern, string, string_len, start_position, \
+ t1, s1, e1) { \
+ total++; \
+ if (test_match_all_full (pattern, string, string_len, start_position, \
+ t1, s1, e1, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ if (string_len == -1 && start_position == 0) \
+ { \
+ total++; \
+ if (test_match_all (pattern, string, t1, s1, e1, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ } \
+}
+
+#define TEST_MATCH_ALL2(pattern, string, string_len, start_position, \
+ t1, s1, e1, t2, s2, e2) { \
+ total++; \
+ if (test_match_all_full (pattern, string, string_len, start_position, \
+ t1, s1, e1, t2, s2, e2, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ if (string_len == -1 && start_position == 0) \
+ { \
+ total++; \
+ if (test_match_all (pattern, string, t1, s1, e1, t2, s2, e2, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ } \
+}
+
+#define TEST_MATCH_ALL3(pattern, string, string_len, start_position, \
+ t1, s1, e1, t2, s2, e2, t3, s3, e3) { \
+ total++; \
+ if (test_match_all_full (pattern, string, string_len, start_position, \
+ t1, s1, e1, t2, s2, e2, t3, s3, e3, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ if (string_len == -1 && start_position == 0) \
+ { \
+ total++; \
+ if (test_match_all (pattern, string, t1, s1, e1, t2, s2, e2, t3, s3, e3, NULL)) \
+ PASS; \
+ else \
+ FAIL; \
+ } \
+}
+
+int
+main (int argc, char *argv[])
+{
+ gint total = 0;
+ gint passed = 0;
+ gint failed = 0;
+ gint i = 0;
+
+ setlocale (LC_ALL, "");
+
+ for (i = 1; i < argc; i++)
+ {
+ if (streq ("--noisy", argv[i]))
+ noisy = TRUE;
+ else if (streq ("--abort", argv[i]))
+ abort_on_fail = TRUE;
+ }
+
+ g_setenv ("G_DEBUG", "fatal_warnings", TRUE);
+
+ /* TEST_NEW(pattern, compile_opts, match_opts) */
+ TEST_NEW("", 0, 0);
+ TEST_NEW(".*", 0, 0);
+ TEST_NEW(".*", G_REGEX_OPTIMIZE, 0);
+ TEST_NEW(".*", G_REGEX_MULTILINE, 0);
+ TEST_NEW(".*", G_REGEX_DOTALL, 0);
+ TEST_NEW(".*", G_REGEX_DOTALL, G_REGEX_MATCH_NOTBOL);
+ TEST_NEW("(123\\d*)[a-zA-Z]+(?P<hello>.*)", 0, 0);
+ TEST_NEW("(123\\d*)[a-zA-Z]+(?P<hello>.*)", G_REGEX_CASELESS, 0);
+ TEST_NEW("(123\\d*)[a-zA-Z]+(?P<hello>.*)", G_REGEX_CASELESS | G_REGEX_OPTIMIZE, 0);
+ TEST_NEW("(?P<A>x)|(?P<A>y)", G_REGEX_DUPNAMES, 0);
+ TEST_NEW("(?P<A>x)|(?P<A>y)", G_REGEX_DUPNAMES | G_REGEX_OPTIMIZE, 0);
+ /* This gives "internal error: code overflow" with pcre 6.0 */
+ TEST_NEW("(?i)(?-i)", 0, 0);
+
+ /* TEST_NEW_FAIL(pattern, compile_opts) */
+ TEST_NEW_FAIL("(", 0);
+ TEST_NEW_FAIL(")", 0);
+ TEST_NEW_FAIL("[", 0);
+ TEST_NEW_FAIL("*", 0);
+ TEST_NEW_FAIL("?", 0);
+ TEST_NEW_FAIL("(?P<A>x)|(?P<A>y)", 0);
+
+ /* TEST_MATCH_SIMPLE(pattern, string, compile_opts, match_opts, expected) */
+ TEST_MATCH_SIMPLE("a", "", 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("a", "a", 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("a", "ba", 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("^a", "ba", 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("a", "ba", G_REGEX_ANCHORED, 0, FALSE);
+ TEST_MATCH_SIMPLE("a", "ba", 0, G_REGEX_MATCH_ANCHORED, FALSE);
+ TEST_MATCH_SIMPLE("a", "ab", G_REGEX_ANCHORED, 0, TRUE);
+ TEST_MATCH_SIMPLE("a", "ab", 0, G_REGEX_MATCH_ANCHORED, TRUE);
+ TEST_MATCH_SIMPLE("a", "a", G_REGEX_CASELESS, 0, TRUE);
+ TEST_MATCH_SIMPLE("a", "A", G_REGEX_CASELESS, 0, TRUE);
+ /* These are needed to test extended properties. */
+ TEST_MATCH_SIMPLE(AGRAVE, AGRAVE, G_REGEX_CASELESS, 0, TRUE);
+ TEST_MATCH_SIMPLE(AGRAVE, AGRAVE_UPPER, G_REGEX_CASELESS, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{L}", "a", 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{L}", "1", 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{L}", AGRAVE, 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{L}", AGRAVE_UPPER, 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{L}", SHEEN, 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{L}", ETH30, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Ll}", "a", 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{Ll}", AGRAVE, 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{Ll}", AGRAVE_UPPER, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Ll}", ETH30, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Sc}", AGRAVE, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Sc}", EURO, 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{Sc}", ETH30, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{N}", "a", 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{N}", "1", 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{N}", AGRAVE, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{N}", AGRAVE_UPPER, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{N}", SHEEN, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{N}", ETH30, 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{Nd}", "a", 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Nd}", "1", 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{Nd}", AGRAVE, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Nd}", AGRAVE_UPPER, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Nd}", SHEEN, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Nd}", ETH30, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Common}", SHEEN, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Common}", "a", 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Common}", AGRAVE, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Common}", AGRAVE_UPPER, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Common}", ETH30, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Common}", "%", 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{Common}", "1", 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{Arabic}", SHEEN, 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{Arabic}", "a", 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Arabic}", AGRAVE, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Arabic}", AGRAVE_UPPER, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Arabic}", ETH30, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Arabic}", "%", 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Arabic}", "1", 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Latin}", SHEEN, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Latin}", "a", 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{Latin}", AGRAVE, 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{Latin}", AGRAVE_UPPER, 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{Latin}", ETH30, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Latin}", "%", 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Latin}", "1", 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Ethiopic}", SHEEN, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Ethiopic}", "a", 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Ethiopic}", AGRAVE, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Ethiopic}", AGRAVE_UPPER, 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Ethiopic}", ETH30, 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{Ethiopic}", "%", 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{Ethiopic}", "1", 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("\\p{L}(?<=\\p{Arabic})", SHEEN, 0, 0, TRUE);
+ TEST_MATCH_SIMPLE("\\p{L}(?<=\\p{Latin})", SHEEN, 0, 0, FALSE);
+ /* Invalid patterns. */
+ TEST_MATCH_SIMPLE("\\", "a", 0, 0, FALSE);
+ TEST_MATCH_SIMPLE("[", "", 0, 0, FALSE);
+
+ /* TEST_MATCH(pattern, compile_opts, match_opts, string,
+ * string_len, start_position, match_opts2, expected) */
+ TEST_MATCH("a", 0, 0, "a", -1, 0, 0, TRUE);
+ TEST_MATCH("a", 0, 0, "A", -1, 0, 0, FALSE);
+ TEST_MATCH("a", G_REGEX_CASELESS, 0, "A", -1, 0, 0, TRUE);
+ TEST_MATCH("a", 0, 0, "ab", -1, 1, 0, FALSE);
+ TEST_MATCH("a", 0, 0, "ba", 1, 0, 0, FALSE);
+ TEST_MATCH("a", 0, 0, "bab", -1, 0, 0, TRUE);
+ TEST_MATCH("a", 0, 0, "b", -1, 0, 0, FALSE);
+ TEST_MATCH("a", 0, G_REGEX_ANCHORED, "a", -1, 0, 0, TRUE);
+ TEST_MATCH("a", 0, G_REGEX_ANCHORED, "ab", -1, 1, 0, FALSE);
+ TEST_MATCH("a", 0, G_REGEX_ANCHORED, "ba", 1, 0, 0, FALSE);
+ TEST_MATCH("a", 0, G_REGEX_ANCHORED, "bab", -1, 0, 0, FALSE);
+ TEST_MATCH("a", 0, G_REGEX_ANCHORED, "b", -1, 0, 0, FALSE);
+ TEST_MATCH("a", 0, 0, "a", -1, 0, G_REGEX_ANCHORED, TRUE);
+ TEST_MATCH("a", 0, 0, "ab", -1, 1, G_REGEX_ANCHORED, FALSE);
+ TEST_MATCH("a", 0, 0, "ba", 1, 0, G_REGEX_ANCHORED, FALSE);
+ TEST_MATCH("a", 0, 0, "bab", -1, 0, G_REGEX_ANCHORED, FALSE);
+ TEST_MATCH("a", 0, 0, "b", -1, 0, G_REGEX_ANCHORED, FALSE);
+ TEST_MATCH("a|b", 0, 0, "a", -1, 0, 0, TRUE);
+ TEST_MATCH("\\d", 0, 0, EURO, -1, 0, 0, FALSE);
+ TEST_MATCH("^.$", 0, 0, EURO, -1, 0, 0, TRUE);
+ TEST_MATCH("^.{3}$", 0, 0, EURO, -1, 0, 0, FALSE);
+ TEST_MATCH("^.$", G_REGEX_RAW, 0, EURO, -1, 0, 0, FALSE);
+ TEST_MATCH("^.{3}$", G_REGEX_RAW, 0, EURO, -1, 0, 0, TRUE);
+ TEST_MATCH(AGRAVE, G_REGEX_CASELESS, 0, AGRAVE_UPPER, -1, 0, 0, TRUE);
+
+ /* New lines handling. */
+ TEST_MATCH("^a\\Rb$", 0, 0, "a\r\nb", -1, 0, 0, TRUE);
+ TEST_MATCH("^a\\Rb$", 0, 0, "a\nb", -1, 0, 0, TRUE);
+ TEST_MATCH("^a\\Rb$", 0, 0, "a\rb", -1, 0, 0, TRUE);
+ TEST_MATCH("^a\\Rb$", 0, 0, "a\n\rb", -1, 0, 0, FALSE);
+ TEST_MATCH("^a\\R\\Rb$", 0, 0, "a\n\rb", -1, 0, 0, TRUE);
+ TEST_MATCH("^a\\nb$", 0, 0, "a\r\nb", -1, 0, 0, FALSE);
+ TEST_MATCH("^a\\r\\nb$", 0, 0, "a\r\nb", -1, 0, 0, TRUE);
+
+ TEST_MATCH("^b$", 0, 0, "a\nb\nc", -1, 0, 0, FALSE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE, 0, "a\nb\nc", -1, 0, 0, TRUE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE, 0, "a\r\nb\r\nc", -1, 0, 0, TRUE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE, 0, "a\rb\rc", -1, 0, 0, TRUE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, 0, "a\nb\nc", -1, 0, 0, FALSE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_LF, 0, "a\nb\nc", -1, 0, 0, TRUE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CRLF, 0, "a\nb\nc", -1, 0, 0, FALSE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, 0, "a\r\nb\r\nc", -1, 0, 0, FALSE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_LF, 0, "a\r\nb\r\nc", -1, 0, 0, FALSE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CRLF, 0, "a\r\nb\r\nc", -1, 0, 0, TRUE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, 0, "a\rb\rc", -1, 0, 0, TRUE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_LF, 0, "a\rb\rc", -1, 0, 0, FALSE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CRLF, 0, "a\rb\rc", -1, 0, 0, FALSE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CR, "a\nb\nc", -1, 0, 0, FALSE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_LF, "a\nb\nc", -1, 0, 0, TRUE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CRLF, "a\nb\nc", -1, 0, 0, FALSE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CR, "a\r\nb\r\nc", -1, 0, 0, FALSE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_LF, "a\r\nb\r\nc", -1, 0, 0, FALSE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CRLF, "a\r\nb\r\nc", -1, 0, 0, TRUE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CR, "a\rb\rc", -1, 0, 0, TRUE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_LF, "a\rb\rc", -1, 0, 0, FALSE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CRLF, "a\rb\rc", -1, 0, 0, FALSE);
+
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_ANY, "a\nb\nc", -1, 0, 0, TRUE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_ANY, "a\rb\rc", -1, 0, 0, TRUE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_ANY, "a\r\nb\r\nc", -1, 0, 0, TRUE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_LF, "a\nb\nc", -1, 0, 0, TRUE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_LF, "a\rb\rc", -1, 0, 0, FALSE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_CRLF, "a\r\nb\r\nc", -1, 0, 0, TRUE);
+ TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_CRLF, "a\rb\rc", -1, 0, 0, FALSE);
+
+ TEST_MATCH("a#\nb", G_REGEX_EXTENDED, 0, "a", -1, 0, 0, FALSE);
+ TEST_MATCH("a#\r\nb", G_REGEX_EXTENDED, 0, "a", -1, 0, 0, FALSE);
+ TEST_MATCH("a#\rb", G_REGEX_EXTENDED, 0, "a", -1, 0, 0, FALSE);
+ TEST_MATCH("a#\nb", G_REGEX_EXTENDED, G_REGEX_MATCH_NEWLINE_CR, "a", -1, 0, 0, FALSE);
+ TEST_MATCH("a#\nb", G_REGEX_EXTENDED | G_REGEX_NEWLINE_CR, 0, "a", -1, 0, 0, TRUE);
+
+ /* TEST_MATCH_NEXT#(pattern, string, string_len, start_position, ...) */
+ TEST_MATCH_NEXT0("a", "x", -1, 0);
+ TEST_MATCH_NEXT0("a", "ax", -1, 1);
+ TEST_MATCH_NEXT0("a", "xa", 1, 0);
+ TEST_MATCH_NEXT0("a", "axa", 1, 2);
+ TEST_MATCH_NEXT1("a", "a", -1, 0, "a", 0, 1);
+ TEST_MATCH_NEXT1("a", "xax", -1, 0, "a", 1, 2);
+ TEST_MATCH_NEXT1(EURO, ENG EURO, -1, 0, EURO, 2, 5);
+ TEST_MATCH_NEXT1("a*", "", -1, 0, "", 0, 0);
+ TEST_MATCH_NEXT2("a*", "aa", -1, 0, "aa", 0, 2, "", 2, 2);
+ TEST_MATCH_NEXT2(EURO "*", EURO EURO, -1, 0, EURO EURO, 0, 6, "", 6, 6);
+ TEST_MATCH_NEXT2("a", "axa", -1, 0, "a", 0, 1, "a", 2, 3);
+ TEST_MATCH_NEXT2("a+", "aaxa", -1, 0, "aa", 0, 2, "a", 3, 4);
+ TEST_MATCH_NEXT2("a", "aa", -1, 0, "a", 0, 1, "a", 1, 2);
+ TEST_MATCH_NEXT2("a", "ababa", -1, 2, "a", 2, 3, "a", 4, 5);
+ TEST_MATCH_NEXT2(EURO "+", EURO "-" EURO, -1, 0, EURO, 0, 3, EURO, 4, 7);
+ TEST_MATCH_NEXT3("", "ab", -1, 0, "", 0, 0, "", 1, 1, "", 2, 2);
+ TEST_MATCH_NEXT3("", AGRAVE "b", -1, 0, "", 0, 0, "", 2, 2, "", 3, 3);
+ TEST_MATCH_NEXT3("a", "aaxa", -1, 0, "a", 0, 1, "a", 1, 2, "a", 3, 4);
+ TEST_MATCH_NEXT3("a", "aa" OGRAVE "a", -1, 0, "a", 0, 1, "a", 1, 2, "a", 4, 5);
+ TEST_MATCH_NEXT3("a*", "aax", -1, 0, "aa", 0, 2, "", 2, 2, "", 3, 3);
+ TEST_MATCH_NEXT4("a*", "aaxa", -1, 0, "aa", 0, 2, "", 2, 2, "a", 3, 4, "", 4, 4);
+
+ /* TEST_MATCH_COUNT(pattern, string, start_position, match_opts, expected_count) */
+ TEST_MATCH_COUNT("a", "", 0, 0, 0);
+ TEST_MATCH_COUNT("a", "a", 0, 0, 1);
+ TEST_MATCH_COUNT("a", "a", 1, 0, 0);
+ TEST_MATCH_COUNT("(.)", "a", 0, 0, 2);
+ TEST_MATCH_COUNT("(.)", EURO, 0, 0, 2);
+ TEST_MATCH_COUNT("(?:.)", "a", 0, 0, 1);
+ TEST_MATCH_COUNT("(?P<A>.)", "a", 0, 0, 2);
+ TEST_MATCH_COUNT("a$", "a", 0, G_REGEX_MATCH_NOTEOL, 0);
+ TEST_MATCH_COUNT("(a)?(b)", "b", 0, 0, 3);
+ TEST_MATCH_COUNT("(a)?(b)", "ab", 0, 0, 3);
+
+ /* TEST_PARTIAL(pattern, string, expected) */
+ TEST_PARTIAL("^ab", "a", TRUE);
+ TEST_PARTIAL("^ab", "xa", FALSE);
+ TEST_PARTIAL("ab", "xa", TRUE);
+ TEST_PARTIAL("ab", "ab", FALSE); /* normal match. */
+ TEST_PARTIAL("a+b", "aa", FALSE); /* PCRE_ERROR_BAD_PARTIAL */
+ TEST_PARTIAL("(a)+b", "aa", TRUE);
+ TEST_PARTIAL("a?b", "a", TRUE);
+
+ /* TEST_SUB_PATTERN(pattern, string, start_position, sub_n, expected_sub,
+ * expected_start, expected_end) */
+ TEST_SUB_PATTERN("a", "a", 0, 0, "a", 0, 1);
+ TEST_SUB_PATTERN("a(.)", "ab", 0, 1, "b", 1, 2);
+ TEST_SUB_PATTERN("a(.)", "a" EURO, 0, 1, EURO, 1, 4);
+ TEST_SUB_PATTERN("(?:.*)(a)(.)", "xxa" ENG, 0, 2, ENG, 3, 5);
+ TEST_SUB_PATTERN("(" HSTROKE ")", "a" HSTROKE ENG, 0, 1, HSTROKE, 1, 3);
+ TEST_SUB_PATTERN("a", "a", 0, 1, NULL, UNTOUCHED, UNTOUCHED);
+ TEST_SUB_PATTERN("a", "a", 0, 1, NULL, UNTOUCHED, UNTOUCHED);
+ TEST_SUB_PATTERN("(a)?(b)", "b", 0, 0, "b", 0, 1);
+ TEST_SUB_PATTERN("(a)?(b)", "b", 0, 1, "", -1, -1);
+ TEST_SUB_PATTERN("(a)?(b)", "b", 0, 2, "b", 0, 1);
+
+ /* TEST_NAMED_SUB_PATTERN(pattern, string, start_position, sub_name,
+ * expected_sub, expected_start, expected_end) */
+ TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "ab", 0, "A", "b", 1, 2);
+ TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "aab", 1, "A", "b", 2, 3);
+ TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", EURO "ab", 0, "A", "b", 4, 5);
+ TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", EURO "ab", 0, "B", NULL, UNTOUCHED, UNTOUCHED);
+ TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", EURO "ab", 0, "C", NULL, UNTOUCHED, UNTOUCHED);
+ TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "a" EGRAVE "x", 0, "A", EGRAVE, 1, 3);
+ TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "a" EGRAVE "x", 0, "B", "x", 3, 4);
+ TEST_NAMED_SUB_PATTERN("(?P<A>a)?(?P<B>b)", "b", 0, "A", "", -1, -1);
+ TEST_NAMED_SUB_PATTERN("(?P<A>a)?(?P<B>b)", "b", 0, "B", "b", 0, 1);
+
+ /* TEST_NAMED_SUB_PATTERN_DUPNAMES(pattern, string, start_position, sub_name,
+ * expected_sub, expected_start, expected_end) */
+ TEST_NAMED_SUB_PATTERN_DUPNAMES("(?P<N>a)|(?P<N>b)", "ab", 0, "N", "a", 0, 1);
+ TEST_NAMED_SUB_PATTERN_DUPNAMES("(?P<N>aa)|(?P<N>a)", "aa", 0, "N", "aa", 0, 2);
+ TEST_NAMED_SUB_PATTERN_DUPNAMES("(?P<N>aa)(?P<N>a)", "aaa", 0, "N", "aa", 0, 2);
+ TEST_NAMED_SUB_PATTERN_DUPNAMES("(?P<N>x)|(?P<N>a)", "a", 0, "N", "a", 0, 1);
+ TEST_NAMED_SUB_PATTERN_DUPNAMES("(?P<N>x)y|(?P<N>a)b", "ab", 0, "N", "a", 0, 1);
+
+ /* DUPNAMES option inside the pattern */
+ TEST_NAMED_SUB_PATTERN("(?J)(?P<N>a)|(?P<N>b)", "ab", 0, "N", "a", 0, 1);
+ TEST_NAMED_SUB_PATTERN("(?J)(?P<N>aa)|(?P<N>a)", "aa", 0, "N", "aa", 0, 2);
+ TEST_NAMED_SUB_PATTERN("(?J)(?P<N>aa)(?P<N>a)", "aaa", 0, "N", "aa", 0, 2);
+ TEST_NAMED_SUB_PATTERN("(?J)(?P<N>x)|(?P<N>a)", "a", 0, "N", "a", 0, 1);
+ TEST_NAMED_SUB_PATTERN("(?J)(?P<N>x)y|(?P<N>a)b", "ab", 0, "N", "a", 0, 1);
+
+ /* TEST_FETCH_ALL#(pattern, string, ...) */
+ TEST_FETCH_ALL0("a", "");
+ TEST_FETCH_ALL0("a", "b");
+ TEST_FETCH_ALL1("a", "a", "a");
+ TEST_FETCH_ALL1("a+", "aa", "aa");
+ TEST_FETCH_ALL1("(?:a)", "a", "a");
+ TEST_FETCH_ALL2("(a)", "a", "a", "a");
+ TEST_FETCH_ALL2("a(.)", "ab", "ab", "b");
+ TEST_FETCH_ALL2("a(.)", "a" HSTROKE, "a" HSTROKE, HSTROKE);
+ TEST_FETCH_ALL3("(?:.*)(a)(.)", "xyazk", "xyaz", "a", "z");
+ TEST_FETCH_ALL3("(?P<A>.)(a)", "xa", "xa", "x", "a");
+ TEST_FETCH_ALL3("(?P<A>.)(a)", ENG "a", ENG "a", ENG, "a");
+ TEST_FETCH_ALL3("(a)?(b)", "b", "b", "", "b");
+ TEST_FETCH_ALL3("(a)?(b)", "ab", "ab", "a", "b");
+
+ /* TEST_SPLIT_SIMPLE#(pattern, string, ...) */
+ TEST_SPLIT_SIMPLE0("", "");
+ TEST_SPLIT_SIMPLE0("a", "");
+ TEST_SPLIT_SIMPLE1(",", "a", "a");
+ TEST_SPLIT_SIMPLE1("(,)\\s*", "a", "a");
+ TEST_SPLIT_SIMPLE2(",", "a,b", "a", "b");
+ TEST_SPLIT_SIMPLE3(",", "a,b,c", "a", "b", "c");
+ TEST_SPLIT_SIMPLE3(",\\s*", "a,b,c", "a", "b", "c");
+ TEST_SPLIT_SIMPLE3(",\\s*", "a, b, c", "a", "b", "c");
+ TEST_SPLIT_SIMPLE3("(,)\\s*", "a,b", "a", ",", "b");
+ TEST_SPLIT_SIMPLE3("(,)\\s*", "a, b", "a", ",", "b");
+ /* Not matched sub-strings. */
+ TEST_SPLIT_SIMPLE2("a|(b)", "xay", "x", "y");
+ TEST_SPLIT_SIMPLE3("a|(b)", "xby", "x", "b", "y");
+ /* Empty matches. */
+ TEST_SPLIT_SIMPLE3("", "abc", "a", "b", "c");
+ TEST_SPLIT_SIMPLE3(" *", "ab c", "a", "b", "c");
+ /* Invalid patterns. */
+ TEST_SPLIT_SIMPLE0("\\", "");
+ TEST_SPLIT_SIMPLE0("[", "");
+
+ /* TEST_SPLIT#(pattern, string, start_position, max_tokens, ...) */
+ TEST_SPLIT0("", "", 0, 0);
+ TEST_SPLIT0("a", "", 0, 0);
+ TEST_SPLIT0("a", "", 0, 1);
+ TEST_SPLIT0("a", "", 0, 2);
+ TEST_SPLIT0("a", "a", 1, 0);
+ TEST_SPLIT1(",", "a", 0, 0, "a");
+ TEST_SPLIT1(",", "a,b", 0, 1, "a,b");
+ TEST_SPLIT1("(,)\\s*", "a", 0, 0, "a");
+ TEST_SPLIT1(",", "a,b", 2, 0, "b");
+ TEST_SPLIT2(",", "a,b", 0, 0, "a", "b");
+ TEST_SPLIT2(",", "a,b,c", 0, 2, "a", "b,c");
+ TEST_SPLIT2(",", "a,b", 1, 0, "", "b");
+ TEST_SPLIT2(",", "a,", 0, 0, "a", "");
+ TEST_SPLIT3(",", "a,b,c", 0, 0, "a", "b", "c");
+ TEST_SPLIT3(",\\s*", "a,b,c", 0, 0, "a", "b", "c");
+ TEST_SPLIT3(",\\s*", "a, b, c", 0, 0, "a", "b", "c");
+ TEST_SPLIT3("(,)\\s*", "a,b", 0, 0, "a", ",", "b");
+ TEST_SPLIT3("(,)\\s*", "a, b", 0, 0, "a", ",", "b");
+ /* Not matched sub-strings. */
+ TEST_SPLIT2("a|(b)", "xay", 0, 0, "x", "y");
+ TEST_SPLIT3("a|(b)", "xby", 0, -1, "x", "b", "y");
+ /* Empty matches. */
+ TEST_SPLIT2(" *", "ab c", 1, 0, "b", "c");
+ TEST_SPLIT3("", "abc", 0, 0, "a", "b", "c");
+ TEST_SPLIT3(" *", "ab c", 0, 0, "a", "b", "c");
+ TEST_SPLIT1(" *", "ab c", 0, 1, "ab c");
+ TEST_SPLIT2(" *", "ab c", 0, 2, "a", "b c");
+ TEST_SPLIT3(" *", "ab c", 0, 3, "a", "b", "c");
+ TEST_SPLIT3(" *", "ab c", 0, 4, "a", "b", "c");
+
+ /* TEST_CHECK_REPLACEMENT(string_to_expand, expected, expected_refs) */
+ TEST_CHECK_REPLACEMENT("", TRUE, FALSE);
+ TEST_CHECK_REPLACEMENT("a", TRUE, FALSE);
+ TEST_CHECK_REPLACEMENT("\\t\\n\\v\\r\\f\\a\\b\\\\\\x{61}", TRUE, FALSE);
+ TEST_CHECK_REPLACEMENT("\\0", TRUE, TRUE);
+ TEST_CHECK_REPLACEMENT("\\n\\2", TRUE, TRUE);
+ TEST_CHECK_REPLACEMENT("\\g<foo>", TRUE, TRUE);
+ /* Invalid strings */
+ TEST_CHECK_REPLACEMENT("\\Q", FALSE, FALSE);
+ TEST_CHECK_REPLACEMENT("x\\Ay", FALSE, FALSE);
+
+ /* TEST_EXPAND(pattern, string, string_to_expand, raw, expected) */
+ TEST_EXPAND("a", "a", "", FALSE, "");
+ TEST_EXPAND("a", "a", "\\0", FALSE, "a");
+ TEST_EXPAND("a", "a", "\\1", FALSE, "");
+ TEST_EXPAND("(a)", "ab", "\\1", FALSE, "a");
+ TEST_EXPAND("(a)", "a", "\\1", FALSE, "a");
+ TEST_EXPAND("(a)", "a", "\\g<1>", FALSE, "a");
+ TEST_EXPAND("a", "a", "\\0130", FALSE, "X");
+ TEST_EXPAND("a", "a", "\\\\\\0", FALSE, "\\a");
+ TEST_EXPAND("a(?P<G>.)c", "xabcy", "X\\g<G>X", FALSE, "XbX");
+ TEST_EXPAND("(.)(?P<1>.)", "ab", "\\1", FALSE, "a");
+ TEST_EXPAND("(.)(?P<1>.)", "ab", "\\g<1>", FALSE, "a");
+ TEST_EXPAND(".", EURO, "\\0", FALSE, EURO);
+ TEST_EXPAND("(.)", EURO, "\\1", FALSE, EURO);
+ TEST_EXPAND("(?P<G>.)", EURO, "\\g<G>", FALSE, EURO);
+ TEST_EXPAND(".", "a", EURO, FALSE, EURO);
+ TEST_EXPAND(".", "a", EURO "\\0", FALSE, EURO "a");
+ TEST_EXPAND(".", "", "\\Lab\\Ec", FALSE, "abc");
+ TEST_EXPAND(".", "", "\\LaB\\EC", FALSE, "abC");
+ TEST_EXPAND(".", "", "\\Uab\\Ec", FALSE, "ABc");
+ TEST_EXPAND(".", "", "a\\ubc", FALSE, "aBc");
+ TEST_EXPAND(".", "", "a\\lbc", FALSE, "abc");
+ TEST_EXPAND(".", "", "A\\uBC", FALSE, "ABC");
+ TEST_EXPAND(".", "", "A\\lBC", FALSE, "AbC");
+ TEST_EXPAND(".", "", "A\\l\\\\BC", FALSE, "A\\BC");
+ TEST_EXPAND(".", "", "\\L" AGRAVE "\\E", FALSE, AGRAVE);
+ TEST_EXPAND(".", "", "\\U" AGRAVE "\\E", FALSE, AGRAVE_UPPER);
+ TEST_EXPAND(".", "", "\\u" AGRAVE "a", FALSE, AGRAVE_UPPER "a");
+ TEST_EXPAND(".", "ab", "x\\U\\0y\\Ez", FALSE, "xAYz");
+ TEST_EXPAND(".(.)", "AB", "x\\L\\1y\\Ez", FALSE, "xbyz");
+ TEST_EXPAND(".", "ab", "x\\u\\0y\\Ez", FALSE, "xAyz");
+ TEST_EXPAND(".(.)", "AB", "x\\l\\1y\\Ez", FALSE, "xbyz");
+ TEST_EXPAND(".(.)", "a" AGRAVE_UPPER, "x\\l\\1y", FALSE, "x" AGRAVE "y");
+ TEST_EXPAND("a", "bab", "\\x{61}", FALSE, "a");
+ TEST_EXPAND("a", "bab", "\\x61", FALSE, "a");
+ TEST_EXPAND("a", "bab", "\\x5a", FALSE, "Z");
+ TEST_EXPAND("a", "bab", "\\0\\x5A", FALSE, "aZ");
+ TEST_EXPAND("a", "bab", "\\1\\x{5A}", FALSE, "Z");
+ TEST_EXPAND("a", "bab", "\\x{00E0}", FALSE, AGRAVE);
+ TEST_EXPAND("", "bab", "\\x{0634}", FALSE, SHEEN);
+ TEST_EXPAND("", "bab", "\\x{634}", FALSE, SHEEN);
+ TEST_EXPAND("", "", "\\t", FALSE, "\t");
+ TEST_EXPAND("", "", "\\v", FALSE, "\v");
+ TEST_EXPAND("", "", "\\r", FALSE, "\r");
+ TEST_EXPAND("", "", "\\n", FALSE, "\n");
+ TEST_EXPAND("", "", "\\f", FALSE, "\f");
+ TEST_EXPAND("", "", "\\a", FALSE, "\a");
+ TEST_EXPAND("", "", "\\b", FALSE, "\b");
+ TEST_EXPAND("a(.)", "abc", "\\0\\b\\1", FALSE, "ab\bb");
+ TEST_EXPAND("a(.)", "abc", "\\0141", FALSE, "a");
+ TEST_EXPAND("a(.)", "abc", "\\078", FALSE, "\a8");
+ TEST_EXPAND("a(.)", "abc", "\\077", FALSE, "?");
+ TEST_EXPAND("a(.)", "abc", "\\0778", FALSE, "?8");
+ TEST_EXPAND("a(.)", "a" AGRAVE "b", "\\1", FALSE, AGRAVE);
+ TEST_EXPAND("a(.)", "a" AGRAVE "b", "\\1", TRUE, "\xc3");
+ TEST_EXPAND("a(.)", "a" AGRAVE "b", "\\0", TRUE, "a\xc3");
+ /* Invalid strings. */
+ TEST_EXPAND("", "", "\\Q", FALSE, NULL);
+ TEST_EXPAND("", "", "x\\Ay", FALSE, NULL);
+ TEST_EXPAND("", "", "\\g<", FALSE, NULL);
+ TEST_EXPAND("", "", "\\g<>", FALSE, NULL);
+ TEST_EXPAND("", "", "\\g<1a>", FALSE, NULL);
+ TEST_EXPAND("", "", "\\g<a$>", FALSE, NULL);
+ TEST_EXPAND("", "", "\\", FALSE, NULL);
+ TEST_EXPAND("a", "a", "\\x{61", FALSE, NULL);
+ TEST_EXPAND("a", "a", "\\x6X", FALSE, NULL);
+ /* Pattern-less. */
+ TEST_EXPAND(NULL, NULL, "", FALSE, "");
+ TEST_EXPAND(NULL, NULL, "\\n", FALSE, "\n");
+ /* Invalid strings */
+ TEST_EXPAND(NULL, NULL, "\\Q", FALSE, NULL);
+ TEST_EXPAND(NULL, NULL, "x\\Ay", FALSE, NULL);
+
+ /* TEST_REPLACE(pattern, string, start_position, replacement, expected) */
+ TEST_REPLACE("a", "ababa", 0, "A", "AbAbA");
+ TEST_REPLACE("a", "ababa", 1, "A", "abAbA");
+ TEST_REPLACE("a", "ababa", 2, "A", "abAbA");
+ TEST_REPLACE("a", "ababa", 3, "A", "ababA");
+ TEST_REPLACE("a", "ababa", 4, "A", "ababA");
+ TEST_REPLACE("a", "ababa", 5, "A", "ababa");
+ TEST_REPLACE("a", "ababa", 6, "A", "ababa");
+ TEST_REPLACE("a", "abababa", 2, "A", "abAbAbA");
+ TEST_REPLACE("a", "abab", 0, "A", "AbAb");
+ TEST_REPLACE("a", "baba", 0, "A", "bAbA");
+ TEST_REPLACE("a", "bab", 0, "A", "bAb");
+ TEST_REPLACE("$^", "abc", 0, "X", "abc");
+ TEST_REPLACE("(.)a", "ciao", 0, "a\\1", "caio");
+ TEST_REPLACE("a.", "abc", 0, "\\0\\0", "ababc");
+ TEST_REPLACE("a", "asd", 0, "\\0101", "Asd");
+ TEST_REPLACE("(a).\\1", "aba cda", 0, "\\1\\n", "a\n cda");
+ TEST_REPLACE("a" AGRAVE "a", "a" AGRAVE "a", 0, "x", "x");
+ TEST_REPLACE("a" AGRAVE "a", "a" AGRAVE "a", 0, OGRAVE, OGRAVE);
+ TEST_REPLACE("[^-]", "-" EURO "-x-" HSTROKE, 0, "a", "-a-a-a");
+ TEST_REPLACE("[^-]", "-" EURO "-" HSTROKE, 0, "a\\g<0>a", "-a" EURO "a-a" HSTROKE "a");
+ TEST_REPLACE("-", "-" EURO "-" HSTROKE, 0, "", EURO HSTROKE);
+ TEST_REPLACE(".*", "hello", 0, "\\U\\0\\E", "HELLO");
+ TEST_REPLACE(".*", "hello", 0, "\\u\\0", "Hello");
+ TEST_REPLACE("\\S+", "hello world", 0, "\\U-\\0-", "-HELLO- -WORLD-");
+ TEST_REPLACE(".", "a", 0, "\\A", NULL);
+ TEST_REPLACE(".", "a", 0, "\\g", NULL);
+
+ /* TEST_REPLACE_LIT(pattern, string, start_position, replacement, expected) */
+ TEST_REPLACE_LIT("a", "ababa", 0, "A", "AbAbA");
+ TEST_REPLACE_LIT("a", "ababa", 1, "A", "abAbA");
+ TEST_REPLACE_LIT("a", "ababa", 2, "A", "abAbA");
+ TEST_REPLACE_LIT("a", "ababa", 3, "A", "ababA");
+ TEST_REPLACE_LIT("a", "ababa", 4, "A", "ababA");
+ TEST_REPLACE_LIT("a", "ababa", 5, "A", "ababa");
+ TEST_REPLACE_LIT("a", "ababa", 6, "A", "ababa");
+ TEST_REPLACE_LIT("a", "abababa", 2, "A", "abAbAbA");
+ TEST_REPLACE_LIT("a", "abcadaa", 0, "A", "AbcAdAA");
+ TEST_REPLACE_LIT("$^", "abc", 0, "X", "abc");
+ TEST_REPLACE_LIT("(.)a", "ciao", 0, "a\\1", "ca\\1o");
+ TEST_REPLACE_LIT("a.", "abc", 0, "\\0\\0\\n", "\\0\\0\\nc");
+ TEST_REPLACE_LIT("a" AGRAVE "a", "a" AGRAVE "a", 0, "x", "x");
+ TEST_REPLACE_LIT("a" AGRAVE "a", "a" AGRAVE "a", 0, OGRAVE, OGRAVE);
+ TEST_REPLACE_LIT(AGRAVE, "-" AGRAVE "-" HSTROKE, 0, "a" ENG "a", "-a" ENG "a-" HSTROKE);
+ TEST_REPLACE_LIT("[^-]", "-" EURO "-" AGRAVE "-" HSTROKE, 0, "a", "-a-a-a");
+ TEST_REPLACE_LIT("[^-]", "-" EURO "-" AGRAVE, 0, "a\\g<0>a", "-a\\g<0>a-a\\g<0>a");
+ TEST_REPLACE_LIT("-", "-" EURO "-" AGRAVE "-" HSTROKE, 0, "", EURO AGRAVE HSTROKE);
+
+ /* TEST_GET_STRING_NUMBER(pattern, name, expected_num) */
+ TEST_GET_STRING_NUMBER("", "A", -1);
+ TEST_GET_STRING_NUMBER("(?P<A>.)", "A", 1);
+ TEST_GET_STRING_NUMBER("(?P<A>.)", "B", -1);
+ TEST_GET_STRING_NUMBER("(?P<A>.)(?P<B>a)", "A", 1);
+ TEST_GET_STRING_NUMBER("(?P<A>.)(?P<B>a)", "B", 2);
+ TEST_GET_STRING_NUMBER("(?P<A>.)(?P<B>a)", "C", -1);
+ TEST_GET_STRING_NUMBER("(?P<A>.)(.)(?P<B>a)", "A", 1);
+ TEST_GET_STRING_NUMBER("(?P<A>.)(.)(?P<B>a)", "B", 3);
+ TEST_GET_STRING_NUMBER("(?P<A>.)(.)(?P<B>a)", "C", -1);
+ TEST_GET_STRING_NUMBER("(?:a)(?P<A>.)", "A", 1);
+ TEST_GET_STRING_NUMBER("(?:a)(?P<A>.)", "B", -1);
+
+ /* TEST_ESCAPE(string, length, expected) */
+ TEST_ESCAPE("hello world", -1, "hello world");
+ TEST_ESCAPE("hello world", 5, "hello");
+ TEST_ESCAPE("hello.world", -1, "hello\\.world");
+ TEST_ESCAPE("a(b\\b.$", -1, "a\\(b\\\\b\\.\\$");
+ TEST_ESCAPE("hello\0world", -1, "hello");
+ TEST_ESCAPE("hello\0world", 11, "hello\\0world");
+ TEST_ESCAPE(EURO "*" ENG, -1, EURO "\\*" ENG);
+ TEST_ESCAPE("a$", -1, "a\\$");
+ TEST_ESCAPE("$a", -1, "\\$a");
+ TEST_ESCAPE("a$a", -1, "a\\$a");
+ TEST_ESCAPE("$a$", -1, "\\$a\\$");
+ TEST_ESCAPE("$a$", 0, "");
+ TEST_ESCAPE("$a$", 1, "\\$");
+ TEST_ESCAPE("$a$", 2, "\\$a");
+ TEST_ESCAPE("$a$", 3, "\\$a\\$");
+ TEST_ESCAPE("$a$", 4, "\\$a\\$\\0");
+ TEST_ESCAPE("|()[]{}^$*+?.", -1, "\\|\\(\\)\\[\\]\\{\\}\\^\\$\\*\\+\\?\\.");
+ TEST_ESCAPE("a|a(a)a[a]a{a}a^a$a*a+a?a.a", -1,
+ "a\\|a\\(a\\)a\\[a\\]a\\{a\\}a\\^a\\$a\\*a\\+a\\?a\\.a");
+
+ /* TEST_MATCH_ALL#(pattern, string, string_len, start_position, ...) */
+ TEST_MATCH_ALL0("<.*>", "", -1, 0);
+ TEST_MATCH_ALL0("a+", "", -1, 0);
+ TEST_MATCH_ALL0("a+", "a", 0, 0);
+ TEST_MATCH_ALL0("a+", "a", -1, 1);
+ TEST_MATCH_ALL1("<.*>", "<a>", -1, 0, "<a>", 0, 3);
+ TEST_MATCH_ALL1("a+", "a", -1, 0, "a", 0, 1);
+ TEST_MATCH_ALL1("a+", "aa", 1, 0, "a", 0, 1);
+ TEST_MATCH_ALL1("a+", "aa", -1, 1, "a", 1, 2);
+ TEST_MATCH_ALL1("a+", "aa", 2, 1, "a", 1, 2);
+ TEST_MATCH_ALL1(".+", ENG, -1, 0, ENG, 0, 2);
+ TEST_MATCH_ALL2("<.*>", "<a><b>", -1, 0, "<a><b>", 0, 6, "<a>", 0, 3);
+ TEST_MATCH_ALL2("a+", "aa", -1, 0, "aa", 0, 2, "a", 0, 1);
+ TEST_MATCH_ALL2(".+", ENG EURO, -1, 0, ENG EURO, 0, 5, ENG, 0, 2);
+ TEST_MATCH_ALL3("<.*>", "<a><b><c>", -1, 0, "<a><b><c>", 0, 9,
+ "<a><b>", 0, 6, "<a>", 0, 3);
+ TEST_MATCH_ALL3("a+", "aaa", -1, 0, "aaa", 0, 3, "aa", 0, 2, "a", 0, 1);
+
+end: /* if abort_on_fail is TRUE the flow passes to this label. */
+ verbose ("\n%u tests passed, %u failed\n", passed, failed);
+ return failed;
+}
+
+#else /* ENABLE_REGEX false */
+
+int
+main (int argc, char *argv[])
+{
+ g_print ("GRegex is disabled.\n");
+ return 0;
+}
+
+#endif /* ENABLE_REGEX */
diff --git a/trunk/tests/relation-test.c b/trunk/tests/relation-test.c
new file mode 100644
index 000000000..35f5a16e6
--- /dev/null
+++ b/trunk/tests/relation-test.c
@@ -0,0 +1,139 @@
+/* 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <stdio.h>
+#include <string.h>
+#include "glib.h"
+
+int array[10000];
+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"
+
+typedef struct {
+ guint age;
+ gchar name[40];
+} GlibTestInfo;
+
+
+
+int
+main (int argc,
+ char *argv[])
+{
+ gint i;
+ GRelation *relation;
+ GTuples *tuples;
+ gint data [1024];
+
+
+ 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;
+
+ return 0;
+}
+
diff --git a/trunk/tests/run-bookmark-test.sh b/trunk/tests/run-bookmark-test.sh
new file mode 100755
index 000000000..3bed44d22
--- /dev/null
+++ b/trunk/tests/run-bookmark-test.sh
@@ -0,0 +1,34 @@
+#! /bin/sh
+
+fail ()
+{
+ echo "Test failed: $*"
+ exit 1
+}
+
+echo_v ()
+{
+ if [ "$verbose" = "1" ]; then
+ echo "$*"
+ fi
+}
+
+error_out=/dev/null
+if [ "$1" = "-v" ]; then
+ verbose=1
+ error_out=/dev/stderr
+fi
+for I in ${srcdir:-.}/bookmarks/fail-*.xbel; do
+ echo_v "Parsing $I, should fail"
+ ./bookmarkfile-test $I > /dev/null 2> $error_out && fail "failed to generate error on $I"
+ if test "$?" != "1"; then
+ fail "unexpected error on $I"
+ fi
+done
+
+for I in ${srcdir:-.}/bookmarks/valid-*.xbel; do
+ echo_v "Parsing $I, should succeed"
+ ./bookmarkfile-test $I > /dev/null 2> $error_out || fail "failed on $I"
+done
+
+echo_v "All tests passed."
diff --git a/trunk/tests/run-collate-tests.sh b/trunk/tests/run-collate-tests.sh
new file mode 100755
index 000000000..24f3d690c
--- /dev/null
+++ b/trunk/tests/run-collate-tests.sh
@@ -0,0 +1,38 @@
+#! /bin/sh
+
+fail ()
+{
+ echo "Test failed: $*"
+ exit 1
+}
+
+echo_v ()
+{
+ if [ "$verbose" = "1" ]; then
+ echo "$*"
+ fi
+}
+
+error_out=/dev/null
+if [ "$1" = "-v" ]; then
+ verbose=1
+ error_out=/dev/stderr
+fi
+for I in ${srcdir:-.}/collate/*.in; do
+ echo_v "Sorting $I"
+ name=`basename $I .in`
+ ./unicode-collate $I > collate.out
+ if [ $? -eq 2 ]; then
+ exit 0
+ fi
+ diff collate.out ${srcdir:-.}/collate/$name.unicode ||
+ fail "unexpected error when using g_utf8_collate() on $I"
+ ./unicode-collate --key $I > collate.out
+ diff collate.out ${srcdir:-.}/collate/$name.unicode ||
+ fail "unexpected error when using g_utf8_collate_key() on $I"
+ ./unicode-collate --file $I > collate.out
+ diff collate.out ${srcdir:-.}/collate/$name.file ||
+ fail "unexpected error when using g_utf8_collate_key_for_filename() on $I"
+done
+
+echo_v "All tests passed."
diff --git a/trunk/tests/run-markup-tests.sh b/trunk/tests/run-markup-tests.sh
new file mode 100755
index 000000000..38074cc7c
--- /dev/null
+++ b/trunk/tests/run-markup-tests.sh
@@ -0,0 +1,41 @@
+#! /bin/sh
+
+fail ()
+{
+ echo "Test failed: $*"
+ exit 1
+}
+
+echo_v ()
+{
+ if [ "$verbose" = "1" ]; then
+ echo "$*"
+ fi
+}
+
+error_out=/dev/null
+if [ "$1" = "-v" ]; then
+ verbose=1
+ error_out=/dev/stderr
+fi
+for I in ${srcdir:-.}/markups/fail-*.gmarkup; do
+ echo_v "Parsing $I, should fail"
+ ./markup-test $I > /dev/null 2> $error_out && fail "failed to generate error on $I"
+ if test "$?" != "1"; then
+ fail "unexpected error on $I"
+ fi
+done
+
+I=1
+while test $I -lt 100 ; do
+ F=${srcdir:-.}/markups/valid-$I.gmarkup
+ if [ -f $F ] ; then
+ echo_v "Parsing $F, should succeed"
+ ./markup-test $F > actual 2> $error_out || fail "failed on $F"
+ diff ${srcdir:-.}/markups/expected-$I actual || fail "unexpected output on $F"
+ rm actual
+ fi
+ I=`expr $I + 1`
+done
+
+echo_v "All tests passed."
diff --git a/trunk/tests/sequence-test.c b/trunk/tests/sequence-test.c
new file mode 100644
index 000000000..2a88c7df4
--- /dev/null
+++ b/trunk/tests/sequence-test.c
@@ -0,0 +1,1301 @@
+#include <stdio.h>
+#include <glib.h>
+#include <stdlib.h>
+
+/* Keep this in sync with gsequence.c !!! */
+typedef struct _GSequenceNode GSequenceNode;
+
+struct _GSequence
+{
+ GSequenceNode * end_node;
+ GDestroyNotify data_destroy_notify;
+ gboolean access_prohibited;
+ GSequence * real_sequence;
+};
+
+struct _GSequenceNode
+{
+ gint n_nodes;
+ GSequenceNode * parent;
+ GSequenceNode * left;
+ GSequenceNode * right;
+ gpointer data;
+};
+
+static guint
+get_priority (GSequenceNode *node)
+{
+ guint key = GPOINTER_TO_UINT (node);
+
+ key = (key << 15) - key - 1;
+ key = key ^ (key >> 12);
+ key = key + (key << 2);
+ key = key ^ (key >> 4);
+ key = key + (key << 3) + (key << 11);
+ key = key ^ (key >> 16);
+
+ return key? key : 1;
+}
+
+static void
+check_node (GSequenceNode *node)
+{
+ if (node)
+ {
+ g_assert (node->parent != node);
+ if (node->parent)
+ g_assert (node->parent->left == node || node->parent->right == node);
+ g_assert (node->n_nodes == 1 + (node->left ? node->left->n_nodes : 0) + (node->right ? node->right->n_nodes : 0));
+ if (node->left)
+ g_assert (get_priority (node) >= get_priority (node->left));
+ if (node->right)
+ g_assert (get_priority (node) >= get_priority (node->right));
+ check_node (node->left);
+ check_node (node->right);
+ }
+}
+
+void
+g_sequence_check (GSequence *seq)
+{
+ GSequenceNode *node = seq->end_node;
+
+ while (node->parent)
+ node = node->parent;
+
+ check_node (node);
+
+ while (node->right)
+ node = node->right;
+
+ g_assert (seq->end_node == node);
+ g_assert (node->data == seq);
+
+}
+
+
+enum {
+ NEW, FREE, GET_LENGTH, FOREACH, FOREACH_RANGE, SORT, SORT_ITER,
+
+ /* Getting iters */
+ GET_BEGIN_ITER, GET_END_ITER, GET_ITER_AT_POS, APPEND, PREPEND,
+ INSERT_BEFORE, MOVE, SWAP, INSERT_SORTED, INSERT_SORTED_ITER, SORT_CHANGED,
+ SORT_CHANGED_ITER, REMOVE, REMOVE_RANGE, MOVE_RANGE, SEARCH, SEARCH_ITER,
+
+ /* dereferencing */
+ GET, SET,
+
+ /* operations on GSequenceIter * */
+ ITER_IS_BEGIN, ITER_IS_END, ITER_NEXT, ITER_PREV, ITER_GET_POSITION,
+ ITER_MOVE, ITER_GET_SEQUENCE,
+
+ /* search */
+ ITER_COMPARE, RANGE_GET_MIDPOINT,
+ N_OPS
+};
+
+typedef struct SequenceInfo
+{
+ GQueue * queue;
+ GSequence * sequence;
+ int n_items;
+} SequenceInfo;
+
+typedef struct
+{
+ SequenceInfo *seq;
+ int number;
+} Item;
+
+void g_sequence_check (GSequence *sequence);
+
+static Item *
+fix_pointer (gconstpointer data)
+{
+ return (Item *)((char *)data - 1);
+}
+
+static Item *
+get_item (GSequenceIter *iter)
+{
+ return fix_pointer (g_sequence_get (iter));
+}
+
+static void
+check_integrity (SequenceInfo *info)
+{
+ GList *list;
+ GSequenceIter *iter;
+ int i;
+
+ g_sequence_check (info->sequence);
+
+ if (g_sequence_get_length (info->sequence) != info->n_items)
+ g_print ("%d %d\n",
+ g_sequence_get_length (info->sequence), info->n_items);
+ g_assert (info->n_items == g_queue_get_length (info->queue));
+ g_assert (g_sequence_get_length (info->sequence) == info->n_items);
+
+ iter = g_sequence_get_begin_iter (info->sequence);
+ list = info->queue->head;
+ i = 0;
+ while (iter != g_sequence_get_end_iter (info->sequence))
+ {
+ Item *item;
+ g_assert (list->data == iter);
+ item = get_item (list->data);
+ g_assert (item->seq == info);
+
+ iter = g_sequence_iter_next (iter);
+ list = list->next;
+ i++;
+ }
+
+ g_assert (info->n_items == g_queue_get_length (info->queue));
+ g_assert (g_sequence_get_length (info->sequence) == info->n_items);
+}
+
+static gpointer
+new_item (SequenceInfo *seq)
+{
+ Item *item = g_new (Item, 1);
+ seq->n_items++;
+ item->seq = seq;
+ item->number = g_random_int ();
+
+ /* There have been bugs in the past where the GSequence would
+ * dereference the user pointers. This will make sure such
+ * behavior causes crashes
+ */
+ return ((char *)item + 1);
+}
+
+static void
+free_item (gpointer data)
+{
+ Item *item = fix_pointer (data);
+ item->seq->n_items--;
+ g_free (item);
+}
+
+static void
+seq_foreach (gpointer data,
+ gpointer user_data)
+{
+ Item *item = fix_pointer (data);
+ GList **link = user_data;
+ GSequenceIter *iter;
+
+ g_assert (*link != NULL);
+
+ iter = (*link)->data;
+
+ g_assert (get_item (iter) == item);
+
+ item->number = g_random_int();
+
+ *link = (*link)->next;
+}
+
+static gint
+compare_items (gconstpointer a,
+ gconstpointer b,
+ gpointer data)
+{
+ const Item *item_a = fix_pointer (a);
+ const Item *item_b = fix_pointer (b);
+
+ if (item_a->number < item_b->number)
+ {
+ return -1;
+ }
+ else if (item_a->number == item_b->number)
+ {
+ /* Force an arbitrary order on the items
+ * We have to do this, since g_queue_insert_sorted() and
+ * g_sequence_insert_sorted() do not agree on the exact
+ * position the item is inserted if the new item is
+ * equal to an existing one.
+ */
+ if (item_a < item_b)
+ return -1;
+ else if (item_a == item_b)
+ return 0;
+ else
+ return 1;
+ }
+ else
+ {
+ return 1;
+ }
+}
+
+static void
+check_sorted (SequenceInfo *info)
+{
+ GList *list;
+ int last;
+ GSequenceIter *last_iter;
+
+ check_integrity (info);
+
+ last = G_MININT;
+ last_iter = NULL;
+ for (list = info->queue->head; list != NULL; list = list->next)
+ {
+ GSequenceIter *iter = list->data;
+ Item *item = get_item (iter);
+
+ g_assert (item->number >= last);
+ /* Check that the ordering is the same as that of the queue,
+ * ie. that the sort is stable
+ */
+ if (last_iter)
+ g_assert (iter == g_sequence_iter_next (last_iter));
+
+ last = item->number;
+ last_iter = iter;
+ }
+}
+
+static gint
+compare_iters (gconstpointer a,
+ gconstpointer b,
+ gpointer data)
+{
+ GSequence *seq = data;
+ GSequenceIter *iter_a = (GSequenceIter *)a;
+ GSequenceIter *iter_b = (GSequenceIter *)b;
+ /* compare_items() will fix up the pointers */
+ Item *item_a = g_sequence_get (iter_a);
+ Item *item_b = g_sequence_get (iter_b);
+
+ if (seq)
+ {
+ g_assert (g_sequence_iter_get_sequence (iter_a) == seq);
+ g_assert (g_sequence_iter_get_sequence (iter_b) == seq);
+ }
+
+ return compare_items (item_a, item_b, data);
+}
+
+/* A version of g_queue_link_index() that treats NULL as just
+ * beyond the queue
+ */
+static int
+queue_link_index (SequenceInfo *seq, GList *link)
+{
+ if (link)
+ return g_queue_link_index (seq->queue, link);
+ else
+ return g_queue_get_length (seq->queue);
+}
+
+static void
+get_random_range (SequenceInfo *seq,
+ GSequenceIter **begin_iter,
+ GSequenceIter **end_iter,
+ GList **begin_link,
+ GList **end_link)
+{
+ int length = g_queue_get_length (seq->queue);
+ int b = g_random_int_range (0, length + 1);
+ int e = g_random_int_range (b, length + 1);
+
+ g_assert (length == g_sequence_get_length (seq->sequence));
+
+ if (begin_iter)
+ *begin_iter = g_sequence_get_iter_at_pos (seq->sequence, b);
+ if (end_iter)
+ *end_iter = g_sequence_get_iter_at_pos (seq->sequence, e);
+ if (begin_link)
+ *begin_link = g_queue_peek_nth_link (seq->queue, b);
+ if (end_link)
+ *end_link = g_queue_peek_nth_link (seq->queue, e);
+ if (begin_iter && begin_link)
+ {
+ g_assert (
+ queue_link_index (seq, *begin_link) ==
+ g_sequence_iter_get_position (*begin_iter));
+ }
+ if (end_iter && end_link)
+ {
+ g_assert (
+ queue_link_index (seq, *end_link) ==
+ g_sequence_iter_get_position (*end_iter));
+ }
+}
+
+static gint
+get_random_position (SequenceInfo *seq)
+{
+ int length = g_queue_get_length (seq->queue);
+
+ g_assert (length == g_sequence_get_length (seq->sequence));
+
+ return g_random_int_range (-2, length + 5);
+}
+
+static GSequenceIter *
+get_random_iter (SequenceInfo *seq,
+ GList **link)
+{
+ GSequenceIter *iter;
+ int pos = get_random_position (seq);
+ if (link)
+ *link = g_queue_peek_nth_link (seq->queue, pos);
+ iter = g_sequence_get_iter_at_pos (seq->sequence, pos);
+ if (link)
+ g_assert (queue_link_index (seq, *link) == g_sequence_iter_get_position (iter));
+ return iter;
+}
+
+static void
+dump_info (SequenceInfo *seq)
+{
+#if 0
+ GSequenceIter *iter;
+ GList *list;
+
+ iter = g_sequence_get_begin_iter (seq->sequence);
+ list = seq->queue->head;
+
+ while (iter != g_sequence_get_end_iter (seq->sequence))
+ {
+ Item *item = get_item (iter);
+ g_print ("%p %p %d\n", list->data, iter, item->number);
+
+ iter = g_sequence_iter_next (iter);
+ list = list->next;
+ }
+#endif
+}
+
+/* A version of g_queue_insert_before() that appends if link is NULL */
+static void
+queue_insert_before (SequenceInfo *seq, GList *link, gpointer data)
+{
+ if (link)
+ g_queue_insert_before (seq->queue, link, data);
+ else
+ g_queue_push_tail (seq->queue, data);
+}
+
+static void
+run_random_tests (guint32 seed)
+{
+#define N_ITERATIONS 60000
+#define N_SEQUENCES 8
+#define N_TIMES 24
+
+ SequenceInfo sequences[N_SEQUENCES];
+ int k;
+
+ g_print (" seed: %u\n", seed);
+
+ g_random_set_seed (seed);
+
+ for (k = 0; k < N_SEQUENCES; ++k)
+ {
+ sequences[k].queue = g_queue_new ();
+ sequences[k].sequence = g_sequence_new (free_item);
+ sequences[k].n_items = 0;
+ }
+
+#define RANDOM_SEQUENCE() &(sequences[g_random_int_range (0, N_SEQUENCES)])
+
+ for (k = 0; k < N_ITERATIONS; ++k)
+ {
+ int i;
+ SequenceInfo *seq = RANDOM_SEQUENCE();
+ int op = g_random_int_range (0, N_OPS);
+
+#if 0
+ g_print ("%d on %p\n", op, seq);
+#endif
+
+ switch (op)
+ {
+ case NEW:
+ case FREE:
+ {
+ g_queue_free (seq->queue);
+ g_sequence_free (seq->sequence);
+
+ g_assert (seq->n_items == 0);
+
+ seq->queue = g_queue_new ();
+ seq->sequence = g_sequence_new (free_item);
+
+ check_integrity (seq);
+ }
+ break;
+ case GET_LENGTH:
+ {
+ int slen = g_sequence_get_length (seq->sequence);
+ int qlen = g_queue_get_length (seq->queue);
+
+ g_assert (slen == qlen);
+ }
+ break;
+ case FOREACH:
+ {
+ GList *link = seq->queue->head;
+ g_sequence_foreach (seq->sequence, seq_foreach, &link);
+ g_assert (link == NULL);
+ }
+ break;
+ case FOREACH_RANGE:
+ {
+ GSequenceIter *begin_iter, *end_iter;
+ GList *begin_link, *end_link;
+
+ get_random_range (seq, &begin_iter, &end_iter, &begin_link, &end_link);
+
+ check_integrity (seq);
+
+ g_sequence_foreach_range (begin_iter, end_iter, seq_foreach, &begin_link);
+
+ g_assert (begin_link == end_link);
+ }
+ break;
+ case SORT:
+ {
+ dump_info (seq);
+
+ g_sequence_sort (seq->sequence, compare_items, NULL);
+ g_queue_sort (seq->queue, compare_iters, NULL);
+
+ check_sorted (seq);
+
+ dump_info (seq);
+ }
+ break;
+ case SORT_ITER:
+ {
+ check_integrity (seq);
+ g_sequence_sort_iter (seq->sequence,
+ (GSequenceIterCompareFunc)compare_iters, seq->sequence);
+ g_queue_sort (seq->queue, compare_iters, NULL);
+ check_sorted (seq);
+ }
+ break;
+
+ /* Getting iters */
+ case GET_END_ITER:
+ case GET_BEGIN_ITER:
+ {
+ GSequenceIter *begin_iter;
+ GSequenceIter *end_iter;
+ GSequenceIter *penultimate_iter;
+
+ begin_iter = g_sequence_get_begin_iter (seq->sequence);
+ check_integrity (seq);
+
+ end_iter = g_sequence_get_end_iter (seq->sequence);
+ check_integrity (seq);
+
+ penultimate_iter = g_sequence_iter_prev (end_iter);
+ check_integrity (seq);
+
+ if (g_sequence_get_length (seq->sequence) > 0)
+ {
+ g_assert (seq->queue->head);
+ g_assert (seq->queue->head->data == begin_iter);
+ g_assert (seq->queue->tail);
+ g_assert (seq->queue->tail->data == penultimate_iter);
+ }
+ else
+ {
+ g_assert (penultimate_iter == end_iter);
+ g_assert (begin_iter == end_iter);
+ g_assert (penultimate_iter == begin_iter);
+ g_assert (seq->queue->head == NULL);
+ g_assert (seq->queue->tail == NULL);
+ }
+ }
+ break;
+ case GET_ITER_AT_POS:
+ {
+ int i;
+
+ g_assert (g_queue_get_length (seq->queue) == g_sequence_get_length (seq->sequence));
+
+ for (i = 0; i < 10; ++i)
+ {
+ int pos = get_random_position (seq);
+ GSequenceIter *iter = g_sequence_get_iter_at_pos (seq->sequence, pos);
+ GList *link = g_queue_peek_nth_link (seq->queue, pos);
+ check_integrity (seq);
+ if (pos >= g_sequence_get_length (seq->sequence) || pos < 0)
+ {
+ g_assert (iter == g_sequence_get_end_iter (seq->sequence));
+ g_assert (link == NULL);
+ }
+ else
+ {
+ g_assert (link);
+ g_assert (link->data == iter);
+ }
+ }
+ }
+ break;
+ case APPEND:
+ {
+ for (i = 0; i < 10; ++i)
+ {
+ GSequenceIter *iter = g_sequence_append (seq->sequence, new_item (seq));
+ g_queue_push_tail (seq->queue, iter);
+ }
+ }
+ break;
+ case PREPEND:
+ {
+ for (i = 0; i < 10; ++i)
+ {
+ GSequenceIter *iter = g_sequence_prepend (seq->sequence, new_item (seq));
+ g_queue_push_head (seq->queue, iter);
+ }
+ }
+ break;
+ case INSERT_BEFORE:
+ {
+ for (i = 0; i < 10; ++i)
+ {
+ GList *link;
+ GSequenceIter *iter = get_random_iter (seq, &link);
+ GSequenceIter *new_iter;
+ check_integrity (seq);
+
+ new_iter = g_sequence_insert_before (iter, new_item (seq));
+
+ queue_insert_before (seq, link, new_iter);
+ }
+ }
+ break;
+ case MOVE:
+ {
+ GList *link1, *link2;
+ SequenceInfo *seq1 = RANDOM_SEQUENCE();
+ SequenceInfo *seq2 = RANDOM_SEQUENCE();
+ GSequenceIter *iter1 = get_random_iter (seq1, &link1);
+ GSequenceIter *iter2 = get_random_iter (seq2, &link2);
+
+ if (!g_sequence_iter_is_end (iter1))
+ {
+ g_sequence_move (iter1, iter2);
+
+ if (!link2)
+ g_assert (g_sequence_iter_is_end (iter2));
+
+ queue_insert_before (seq2, link2, link1->data);
+
+ g_queue_delete_link (seq1->queue, link1);
+
+ get_item (iter1)->seq = seq2;
+
+ seq1->n_items--;
+ seq2->n_items++;
+ }
+
+ check_integrity (seq);
+
+ iter1 = get_random_iter (seq, NULL);
+
+ /* Moving an iter to itself should have no effect */
+ if (!g_sequence_iter_is_end (iter1))
+ g_sequence_move (iter1, iter1);
+ }
+ break;
+ case SWAP:
+ {
+ GList *link1, *link2;
+ SequenceInfo *seq1 = RANDOM_SEQUENCE();
+ SequenceInfo *seq2 = RANDOM_SEQUENCE();
+ GSequenceIter *iter1 = get_random_iter (seq1, &link1);
+ GSequenceIter *iter2 = get_random_iter (seq2, &link2);
+
+ if (!g_sequence_iter_is_end (iter1) &&
+ !g_sequence_iter_is_end (iter2))
+ {
+ gpointer tmp;
+
+ g_sequence_swap (iter1, iter2);
+
+ get_item (iter1)->seq = seq2;
+ get_item (iter2)->seq = seq1;
+
+ tmp = link1->data;
+ link1->data = link2->data;
+ link2->data = tmp;
+ }
+ }
+ break;
+ case INSERT_SORTED:
+ {
+ int i;
+ dump_info (seq);
+
+ g_sequence_sort (seq->sequence, compare_items, NULL);
+ g_queue_sort (seq->queue, compare_iters, NULL);
+
+ check_sorted (seq);
+
+ for (i = 0; i < N_TIMES; ++i)
+ {
+ GSequenceIter *iter =
+ g_sequence_insert_sorted (seq->sequence, new_item(seq), compare_items, NULL);
+
+ g_queue_insert_sorted (seq->queue, iter, compare_iters, NULL);
+ }
+
+ check_sorted (seq);
+
+ dump_info (seq);
+ }
+ break;
+ case INSERT_SORTED_ITER:
+ {
+ int i;
+ dump_info (seq);
+
+ g_sequence_sort (seq->sequence, compare_items, NULL);
+ g_queue_sort (seq->queue, compare_iters, NULL);
+
+ check_sorted (seq);
+
+ for (i = 0; i < N_TIMES; ++i)
+ {
+ GSequenceIter *iter;
+
+ iter = g_sequence_insert_sorted_iter (seq->sequence,
+ new_item (seq),
+ (GSequenceIterCompareFunc)compare_iters,
+ seq->sequence);
+
+ g_queue_insert_sorted (seq->queue, iter, compare_iters, NULL);
+ }
+
+ check_sorted (seq);
+
+ dump_info (seq);
+ }
+ break;
+ case SORT_CHANGED:
+ {
+ int i;
+
+ g_sequence_sort (seq->sequence, compare_items, NULL);
+ g_queue_sort (seq->queue, compare_iters, NULL);
+
+ check_sorted (seq);
+
+ for (i = 0; i < N_TIMES; ++i)
+ {
+ GList *link;
+ GSequenceIter *iter = get_random_iter (seq, &link);
+
+ if (!g_sequence_iter_is_end (iter))
+ {
+ g_sequence_set (iter, new_item (seq));
+ g_sequence_sort_changed (iter, compare_items, NULL);
+
+ g_queue_delete_link (seq->queue, link);
+ g_queue_insert_sorted (seq->queue, iter, compare_iters, NULL);
+ }
+
+ check_sorted (seq);
+ }
+ }
+ break;
+ case SORT_CHANGED_ITER:
+ {
+ int i;
+
+ g_sequence_sort (seq->sequence, compare_items, NULL);
+ g_queue_sort (seq->queue, compare_iters, NULL);
+
+ check_sorted (seq);
+
+ for (i = 0; i < N_TIMES; ++i)
+ {
+ GList *link;
+ GSequenceIter *iter = get_random_iter (seq, &link);
+
+ if (!g_sequence_iter_is_end (iter))
+ {
+ g_sequence_set (iter, new_item (seq));
+ g_sequence_sort_changed_iter (iter,
+ (GSequenceIterCompareFunc)compare_iters, seq->sequence);
+
+ g_queue_delete_link (seq->queue, link);
+ g_queue_insert_sorted (seq->queue, iter, compare_iters, NULL);
+ }
+
+ check_sorted (seq);
+ }
+ }
+ break;
+ case REMOVE:
+ {
+ int i;
+
+ for (i = 0; i < N_TIMES; ++i)
+ {
+ GList *link;
+ GSequenceIter *iter = get_random_iter (seq, &link);
+
+ if (!g_sequence_iter_is_end (iter))
+ {
+ g_sequence_remove (iter);
+ g_queue_delete_link (seq->queue, link);
+ }
+ }
+ }
+ break;
+ case REMOVE_RANGE:
+ {
+ GSequenceIter *begin_iter, *end_iter;
+ GList *begin_link, *end_link;
+ GList *list;
+
+ get_random_range (seq, &begin_iter, &end_iter, &begin_link, &end_link);
+
+ g_sequence_remove_range (begin_iter, end_iter);
+
+ list = begin_link;
+ while (list != end_link)
+ {
+ GList *next = list->next;
+
+ g_queue_delete_link (seq->queue, list);
+
+ list = next;
+ }
+ }
+ break;
+ case MOVE_RANGE:
+ {
+ SequenceInfo *src = RANDOM_SEQUENCE();
+ SequenceInfo *dst = RANDOM_SEQUENCE();
+
+ GSequenceIter *begin_iter, *end_iter;
+ GList *begin_link, *end_link;
+
+ GSequenceIter *dst_iter;
+ GList *dst_link;
+
+ GList *list;
+
+ g_assert (src->queue);
+ g_assert (dst->queue);
+
+ get_random_range (src, &begin_iter, &end_iter, &begin_link, &end_link);
+ dst_iter = get_random_iter (dst, &dst_link);
+
+ g_sequence_move_range (dst_iter, begin_iter, end_iter);
+
+ if (dst_link == begin_link || (src == dst && dst_link == end_link))
+ {
+ check_integrity (src);
+ check_integrity (dst);
+ break;
+ }
+
+ if (queue_link_index (src, begin_link) >=
+ queue_link_index (src, end_link))
+ {
+ break;
+ }
+
+ if (src == dst &&
+ queue_link_index (src, dst_link) >= queue_link_index (src, begin_link) &&
+ queue_link_index (src, dst_link) <= queue_link_index (src, end_link))
+ {
+ break;
+ }
+
+ list = begin_link;
+ while (list != end_link)
+ {
+ GList *next = list->next;
+ Item *item = get_item (list->data);
+
+ g_assert (dst->queue);
+ queue_insert_before (dst, dst_link, list->data);
+ g_queue_delete_link (src->queue, list);
+
+ g_assert (item->seq == src);
+
+ src->n_items--;
+ dst->n_items++;
+ item->seq = dst;
+
+ list = next;
+ }
+ }
+ break;
+ case SEARCH:
+ {
+ Item *item;
+ GSequenceIter *search_iter;
+ GSequenceIter *insert_iter;
+
+ g_sequence_sort (seq->sequence, compare_items, NULL);
+ g_queue_sort (seq->queue, compare_iters, NULL);
+
+ check_sorted (seq);
+
+ item = new_item (seq);
+ search_iter = g_sequence_search (seq->sequence, item, compare_items, NULL);
+
+ insert_iter = g_sequence_insert_sorted (seq->sequence, item, compare_items, NULL);
+
+ g_assert (search_iter == g_sequence_iter_next (insert_iter));
+
+ g_queue_insert_sorted (seq->queue, insert_iter, compare_iters, NULL);
+ }
+ break;
+ case SEARCH_ITER:
+ {
+ Item *item;
+ GSequenceIter *search_iter;
+ GSequenceIter *insert_iter;
+
+ g_sequence_sort (seq->sequence, compare_items, NULL);
+ g_queue_sort (seq->queue, compare_iters, NULL);
+
+ check_sorted (seq);
+
+ item = new_item (seq);
+ search_iter = g_sequence_search_iter (seq->sequence,
+ item,
+ (GSequenceIterCompareFunc)compare_iters, seq->sequence);
+
+ insert_iter = g_sequence_insert_sorted (seq->sequence, item, compare_items, NULL);
+
+ g_assert (search_iter == g_sequence_iter_next (insert_iter));
+
+ g_queue_insert_sorted (seq->queue, insert_iter, compare_iters, NULL);
+ }
+ break;
+
+ /* dereferencing */
+ case GET:
+ case SET:
+ {
+ GSequenceIter *iter;
+ GList *link;
+
+ iter = get_random_iter (seq, &link);
+
+ if (!g_sequence_iter_is_end (iter))
+ {
+ Item *item;
+ int i;
+
+ check_integrity (seq);
+
+ /* Test basic functionality */
+ item = new_item (seq);
+ g_sequence_set (iter, item);
+ g_assert (g_sequence_get (iter) == item);
+
+ /* Make sure that existing items are freed */
+ for (i = 0; i < N_TIMES; ++i)
+ g_sequence_set (iter, new_item (seq));
+
+ check_integrity (seq);
+
+ g_sequence_set (iter, new_item (seq));
+ }
+ }
+ break;
+
+ /* operations on GSequenceIter * */
+ case ITER_IS_BEGIN:
+ {
+ GSequenceIter *iter;
+
+ iter = g_sequence_get_iter_at_pos (seq->sequence, 0);
+
+ g_assert (g_sequence_iter_is_begin (iter));
+
+ check_integrity (seq);
+
+ if (g_sequence_get_length (seq->sequence) > 0)
+ {
+ g_assert (!g_sequence_iter_is_begin (g_sequence_get_end_iter (seq->sequence)));
+ }
+ else
+ {
+ g_assert (g_sequence_iter_is_begin (g_sequence_get_end_iter (seq->sequence)));
+ }
+
+ g_assert (g_sequence_iter_is_begin (g_sequence_get_begin_iter (seq->sequence)));
+ }
+ break;
+ case ITER_IS_END:
+ {
+ GSequenceIter *iter;
+ int len = g_sequence_get_length (seq->sequence);
+
+ iter = g_sequence_get_iter_at_pos (seq->sequence, len);
+
+ g_assert (g_sequence_iter_is_end (iter));
+
+ if (len > 0)
+ {
+ g_assert (!g_sequence_iter_is_end (g_sequence_get_begin_iter (seq->sequence)));
+ }
+ else
+ {
+ g_assert (g_sequence_iter_is_end (g_sequence_get_begin_iter (seq->sequence)));
+ }
+
+ g_assert (g_sequence_iter_is_end (g_sequence_get_end_iter (seq->sequence)));
+ }
+ break;
+ case ITER_NEXT:
+ {
+ GSequenceIter *iter1, *iter2, *iter3, *end;
+
+ iter1 = g_sequence_append (seq->sequence, new_item (seq));
+ iter2 = g_sequence_append (seq->sequence, new_item (seq));
+ iter3 = g_sequence_append (seq->sequence, new_item (seq));
+
+ end = g_sequence_get_end_iter (seq->sequence);
+
+ g_assert (g_sequence_iter_next (iter1) == iter2);
+ g_assert (g_sequence_iter_next (iter2) == iter3);
+ g_assert (g_sequence_iter_next (iter3) == end);
+ g_assert (g_sequence_iter_next (end) == end);
+
+ g_queue_push_tail (seq->queue, iter1);
+ g_queue_push_tail (seq->queue, iter2);
+ g_queue_push_tail (seq->queue, iter3);
+ }
+ break;
+ case ITER_PREV:
+ {
+ GSequenceIter *iter1, *iter2, *iter3, *begin;
+
+ iter1 = g_sequence_prepend (seq->sequence, new_item (seq));
+ iter2 = g_sequence_prepend (seq->sequence, new_item (seq));
+ iter3 = g_sequence_prepend (seq->sequence, new_item (seq));
+
+ begin = g_sequence_get_begin_iter (seq->sequence);
+
+ g_assert (g_sequence_iter_prev (iter1) == iter2);
+ g_assert (g_sequence_iter_prev (iter2) == iter3);
+ g_assert (iter3 == begin);
+ g_assert (g_sequence_iter_prev (iter3) == begin);
+ g_assert (g_sequence_iter_prev (begin) == begin);
+
+ g_queue_push_head (seq->queue, iter1);
+ g_queue_push_head (seq->queue, iter2);
+ g_queue_push_head (seq->queue, iter3);
+ }
+ break;
+ case ITER_GET_POSITION:
+ {
+ GList *link;
+ GSequenceIter *iter = get_random_iter (seq, &link);
+
+ g_assert (g_sequence_iter_get_position (iter) ==
+ queue_link_index (seq, link));
+ }
+ break;
+ case ITER_MOVE:
+ {
+ int len = g_sequence_get_length (seq->sequence);
+ GSequenceIter *iter;
+ int pos;
+
+ iter = get_random_iter (seq, NULL);
+ pos = g_sequence_iter_get_position (iter);
+ iter = g_sequence_iter_move (iter, len - pos);
+ g_assert (g_sequence_iter_is_end (iter));
+
+
+ iter = get_random_iter (seq, NULL);
+ pos = g_sequence_iter_get_position (iter);
+ while (pos < len)
+ {
+ g_assert (!g_sequence_iter_is_end (iter));
+ pos++;
+ iter = g_sequence_iter_move (iter, 1);
+ }
+ g_assert (g_sequence_iter_is_end (iter));
+ }
+ break;
+ case ITER_GET_SEQUENCE:
+ {
+ GSequenceIter *iter = get_random_iter (seq, NULL);
+
+ g_assert (g_sequence_iter_get_sequence (iter) == seq->sequence);
+ }
+ break;
+
+ /* search */
+ case ITER_COMPARE:
+ {
+ GList *link1, *link2;
+ GSequenceIter *iter1 = get_random_iter (seq, &link1);
+ GSequenceIter *iter2 = get_random_iter (seq, &link2);
+
+ int cmp = g_sequence_iter_compare (iter1, iter2);
+ int pos1 = queue_link_index (seq, link1);
+ int pos2 = queue_link_index (seq, link2);
+
+ if (cmp == 0)
+ {
+ g_assert (pos1 == pos2);
+ }
+ else if (cmp < 0)
+ {
+ g_assert (pos1 < pos2);
+ }
+ else
+ {
+ g_assert (pos1 > pos2);
+ }
+ }
+ break;
+ case RANGE_GET_MIDPOINT:
+ {
+ GSequenceIter *iter1 = get_random_iter (seq, NULL);
+ GSequenceIter *iter2 = get_random_iter (seq, NULL);
+ GSequenceIter *iter3;
+ int cmp;
+
+ cmp = g_sequence_iter_compare (iter1, iter2);
+
+ if (cmp > 0)
+ {
+ GSequenceIter *tmp;
+
+ tmp = iter1;
+ iter1 = iter2;
+ iter2 = tmp;
+ }
+
+ iter3 = g_sequence_range_get_midpoint (iter1, iter2);
+
+ if (cmp == 0)
+ {
+ g_assert (iter3 == iter1);
+ g_assert (iter3 == iter2);
+ }
+
+ g_assert (g_sequence_iter_get_position (iter3) >=
+ g_sequence_iter_get_position (iter1));
+ g_assert (g_sequence_iter_get_position (iter2) >=
+ g_sequence_iter_get_position (iter3));
+ }
+ break;
+
+ }
+
+ check_integrity (seq);
+ }
+}
+
+/* Random seeds known to have failed at one point
+ */
+static gulong seeds[] =
+ {
+ 825541564u,
+ 801678400u,
+ 1477639090u,
+ 3369132895u,
+ 1192944867u,
+ 770458294u,
+ 1099575817u,
+ 590523467u,
+ 3583571454u,
+ 579241222u
+ };
+
+static void standalone_tests (void);
+
+static guint32
+get_seed (int argc, char **argv)
+{
+ if (argc > 1)
+ {
+ char *endptr;
+
+ return strtol (argv[1], &endptr, 0);
+ }
+ else
+ {
+ return g_random_int();
+ }
+}
+
+int
+main (int argc,
+ char **argv)
+{
+ guint32 seed = get_seed (argc, argv);
+ int i;
+
+ /* Run stand alone tests */
+ g_print ("running standalone tests\n");
+ standalone_tests();
+
+ g_print ("running regression tests:\n");
+ /* Run regression tests */
+ for (i = 0; i < G_N_ELEMENTS (seeds); ++i)
+ {
+ run_random_tests (seeds[i]);
+ }
+
+ /* Run with a new random seed */
+ g_print ("random seed:\n");
+ run_random_tests (seed);
+
+
+ return 0;
+}
+
+
+/* Single, stand-alone tests */
+
+static void
+test_out_of_range_jump (void)
+{
+ GSequence *seq = g_sequence_new (NULL);
+ GSequenceIter *iter = g_sequence_get_begin_iter (seq);
+
+ g_sequence_iter_move (iter, 5);
+
+ g_assert (g_sequence_iter_is_begin (iter));
+ g_assert (g_sequence_iter_is_end (iter));
+}
+
+static int
+compare (gconstpointer a, gconstpointer b, gpointer userdata)
+{
+ int ai, bi;
+
+ ai = GPOINTER_TO_INT (a);
+ bi = GPOINTER_TO_INT (b);
+
+ if (ai < bi)
+ return -1;
+ else if (ai > bi)
+ return 1;
+ else
+ return 0;
+}
+
+static int
+compare_iter (GSequenceIter *a,
+ GSequenceIter *b,
+ gpointer data)
+{
+ return compare (g_sequence_get (a),
+ g_sequence_get (b),
+ data);
+}
+
+static void
+test_insert_sorted_non_pointer (void)
+{
+ int i;
+
+ for (i = 0; i < 10; i++)
+ {
+ GSequence *seq = g_sequence_new (NULL);
+ int j;
+
+ for (j = 0; j < 10000; j++)
+ {
+ g_sequence_insert_sorted (seq, GINT_TO_POINTER (g_random_int()),
+ compare, NULL);
+
+ g_sequence_insert_sorted_iter (seq, GINT_TO_POINTER (g_random_int()),
+ compare_iter, NULL);
+ }
+
+ g_sequence_check (seq);
+
+ g_sequence_free (seq);
+ }
+}
+
+static void
+test_stable_sort (void)
+{
+ int i;
+ GSequence *seq = g_sequence_new (NULL);
+
+#define N_ITEMS 1000
+
+ GSequenceIter *iters[N_ITEMS];
+ GSequenceIter *iter;
+
+ for (i = 0; i < N_ITEMS; ++i)
+ {
+ iters[i] = g_sequence_append (seq, GINT_TO_POINTER (3000));
+ g_sequence_check (seq);
+ g_assert (g_sequence_iter_get_sequence (iters[i]) == seq);
+ }
+
+ i = 0;
+ iter = g_sequence_get_begin_iter (seq);
+ g_assert (g_sequence_iter_get_sequence (iter) == seq);
+ g_sequence_check (seq);
+ while (!g_sequence_iter_is_end (iter))
+ {
+ g_assert (g_sequence_iter_get_sequence (iters[i]) == seq);
+ g_assert (iters[i++] == iter);
+
+ iter = g_sequence_iter_next (iter);
+ g_sequence_check (seq);
+ }
+
+ g_sequence_sort (seq, compare, NULL);
+
+ i = 0;
+ iter = g_sequence_get_begin_iter (seq);
+ while (!g_sequence_iter_is_end (iter))
+ {
+ g_assert (g_sequence_iter_get_sequence (iters[i]) == seq);
+ g_assert (iters[i] == iter);
+
+ iter = g_sequence_iter_next (iter);
+ g_sequence_check (seq);
+
+ i++;
+ }
+
+ for (i = N_ITEMS - 1; i >= 0; --i)
+ {
+ g_sequence_check (seq);
+ g_assert (g_sequence_iter_get_sequence (iters[i]) == seq);
+ g_assert (g_sequence_get_end_iter (seq) != iters[i]);
+ g_sequence_sort_changed (iters[i], compare, NULL);
+ }
+
+ i = 0;
+ iter = g_sequence_get_begin_iter (seq);
+ while (!g_sequence_iter_is_end (iter))
+ {
+ g_assert (iters[i++] == iter);
+
+ iter = g_sequence_iter_next (iter);
+ g_sequence_check (seq);
+ }
+}
+
+static void
+standalone_tests (void)
+{
+ test_out_of_range_jump ();
+ test_insert_sorted_non_pointer ();
+ test_stable_sort ();
+}
+
diff --git a/trunk/tests/shell-test.c b/trunk/tests/shell-test.c
new file mode 100644
index 000000000..437f20e51
--- /dev/null
+++ b/trunk/tests/shell-test.c
@@ -0,0 +1,297 @@
+/* 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <glib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+typedef struct _TestResult TestResult;
+
+struct _TestResult
+{
+ gint argc;
+ const gchar **argv;
+};
+
+static const gchar *
+test_command_lines[] =
+{
+ /* 0 */ "foo bar",
+ /* 1 */ "foo 'bar'",
+ /* 2 */ "foo \"bar\"",
+ /* 3 */ "foo '' 'bar'",
+ /* 4 */ "foo \"bar\"'baz'blah'foo'\\''blah'\"boo\"",
+ /* 5 */ "foo \t \tblah\tfoo\t\tbar baz",
+ /* 6 */ "foo ' spaces more spaces lots of spaces in this ' \t",
+ /* 7 */ "foo \\\nbar",
+ /* 8 */ "foo '' ''",
+ /* 9 */ "foo \\\" la la la",
+ /* 10 */ "foo \\ foo woo woo\\ ",
+ /* 11 */ "foo \"yada yada \\$\\\"\"",
+ /* 12 */ "foo \"c:\\\\\"",
+ NULL
+};
+
+static const gchar *result0[] = { "foo", "bar", NULL };
+static const gchar *result1[] = { "foo", "bar", NULL };
+static const gchar *result2[] = { "foo", "bar", NULL };
+static const gchar *result3[] = { "foo", "", "bar", NULL };
+static const gchar *result4[] = { "foo", "barbazblahfoo'blahboo", NULL };
+static const gchar *result5[] = { "foo", "blah", "foo", "bar", "baz", NULL };
+static const gchar *result6[] = { "foo", " spaces more spaces lots of spaces in this ", NULL };
+static const gchar *result7[] = { "foo", "bar", NULL };
+static const gchar *result8[] = { "foo", "", "", NULL };
+static const gchar *result9[] = { "foo", "\"", "la", "la", "la", NULL };
+static const gchar *result10[] = { "foo", " foo", "woo", "woo ", NULL };
+static const gchar *result11[] = { "foo", "yada yada $\"", NULL };
+static const gchar *result12[] = { "foo", "c:\\", NULL };
+
+static const TestResult
+correct_results[] =
+{
+ { G_N_ELEMENTS (result0) - 1, result0 },
+ { G_N_ELEMENTS (result1) - 1, result1 },
+ { G_N_ELEMENTS (result2) - 1, result2 },
+ { G_N_ELEMENTS (result3) - 1, result3 },
+ { G_N_ELEMENTS (result4) - 1, result4 },
+ { G_N_ELEMENTS (result5) - 1, result5 },
+ { G_N_ELEMENTS (result6) - 1, result6 },
+ { G_N_ELEMENTS (result7) - 1, result7 },
+ { G_N_ELEMENTS (result8) - 1, result8 },
+ { G_N_ELEMENTS (result9) - 1, result9 },
+ { G_N_ELEMENTS (result10) - 1, result10 },
+ { G_N_ELEMENTS (result11) - 1, result11 },
+ { G_N_ELEMENTS (result12) - 1, result12 }
+};
+
+static void
+print_test (const gchar *cmdline, gint argc, gchar **argv,
+ const TestResult *result)
+{
+ gint i;
+
+ fprintf (stderr, "Command line was: '%s'\n", cmdline);
+
+ fprintf (stderr, "Expected result (%d args):\n", result->argc);
+
+ i = 0;
+ while (result->argv[i])
+ {
+ fprintf (stderr, " %3d '%s'\n", i, result->argv[i]);
+ ++i;
+ }
+
+ fprintf (stderr, "Actual result (%d args):\n", argc);
+
+ i = 0;
+ while (argv[i])
+ {
+ fprintf (stderr, " %3d '%s'\n", i, argv[i]);
+ ++i;
+ }
+}
+
+static void
+do_argv_test (const gchar *cmdline, const TestResult *result)
+{
+ gint argc;
+ gchar **argv;
+ GError *err;
+ gint i;
+
+ err = NULL;
+ if (!g_shell_parse_argv (cmdline, &argc, &argv, &err))
+ {
+ fprintf (stderr, "Error parsing command line that should work fine: %s\n",
+ err->message);
+
+ exit (1);
+ }
+
+ if (argc != result->argc)
+ {
+ fprintf (stderr, "Expected and actual argc don't match\n");
+ print_test (cmdline, argc, argv, result);
+ exit (1);
+ }
+
+ i = 0;
+ while (argv[i])
+ {
+ if (strcmp (argv[i], result->argv[i]) != 0)
+ {
+ fprintf (stderr, "Expected and actual arg %d do not match\n", i);
+ print_test (cmdline, argc, argv, result);
+ exit (1);
+ }
+
+ ++i;
+ }
+
+ if (argv[i] != NULL)
+ {
+ fprintf (stderr, "argv didn't get NULL-terminated\n");
+ exit (1);
+ }
+ g_strfreev (argv);
+}
+
+static void
+run_tests (void)
+{
+ gint i;
+
+ i = 0;
+ while (test_command_lines[i])
+ {
+ do_argv_test (test_command_lines[i], &correct_results[i]);
+ ++i;
+ }
+}
+
+static gboolean any_test_failed = FALSE;
+
+#define CHECK_STRING_RESULT(expression, expected_value) \
+ check_string_result (#expression, __FILE__, __LINE__, expression, expected_value)
+
+static void
+check_string_result (const char *expression,
+ const char *file_name,
+ int line_number,
+ char *result,
+ const char *expected)
+{
+ gboolean match;
+
+ if (expected == NULL)
+ match = result == NULL;
+ else
+ match = result != NULL && strcmp (result, expected) == 0;
+
+ if (!match)
+ {
+ if (!any_test_failed)
+ fprintf (stderr, "\n");
+
+ fprintf (stderr, "FAIL: check failed in %s, line %d\n", file_name, line_number);
+ fprintf (stderr, " evaluated: %s\n", expression);
+ fprintf (stderr, " expected: %s\n", expected == NULL ? "NULL" : expected);
+ fprintf (stderr, " got: %s\n", result == NULL ? "NULL" : result);
+
+ any_test_failed = TRUE;
+ }
+
+ g_free (result);
+}
+
+static char *
+test_shell_unquote (const char *str)
+{
+ char *result;
+ GError *error;
+
+ error = NULL;
+ result = g_shell_unquote (str, &error);
+ if (error == NULL)
+ return result;
+
+ /* Leaks the error, which is no big deal and easy to fix if we
+ * decide it matters.
+ */
+
+ if (error->domain != G_SHELL_ERROR)
+ return g_strdup ("error in domain other than G_SHELL_ERROR");
+
+ /* It would be nice to check the error message too, but that's
+ * localized, so it's too much of a pain.
+ */
+ switch (error->code)
+ {
+ case G_SHELL_ERROR_BAD_QUOTING:
+ return g_strdup ("G_SHELL_ERROR_BAD_QUOTING");
+ case G_SHELL_ERROR_EMPTY_STRING:
+ return g_strdup ("G_SHELL_ERROR_EMPTY_STRING");
+ case G_SHELL_ERROR_FAILED:
+ return g_strdup ("G_SHELL_ERROR_FAILED");
+ default:
+ return g_strdup ("bad error code in G_SHELL_ERROR domain");
+ }
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ run_tests ();
+
+ CHECK_STRING_RESULT (g_shell_quote (""), "''");
+ CHECK_STRING_RESULT (g_shell_quote ("a"), "'a'");
+ CHECK_STRING_RESULT (g_shell_quote ("("), "'('");
+ CHECK_STRING_RESULT (g_shell_quote ("'"), "''\\'''");
+ CHECK_STRING_RESULT (g_shell_quote ("'a"), "''\\''a'");
+ CHECK_STRING_RESULT (g_shell_quote ("a'"), "'a'\\'''");
+ CHECK_STRING_RESULT (g_shell_quote ("a'a"), "'a'\\''a'");
+
+ CHECK_STRING_RESULT (test_shell_unquote (""), "");
+ CHECK_STRING_RESULT (test_shell_unquote ("a"), "a");
+ CHECK_STRING_RESULT (test_shell_unquote ("'a'"), "a");
+ CHECK_STRING_RESULT (test_shell_unquote ("'('"), "(");
+ CHECK_STRING_RESULT (test_shell_unquote ("''\\'''"), "'");
+ CHECK_STRING_RESULT (test_shell_unquote ("''\\''a'"), "'a");
+ CHECK_STRING_RESULT (test_shell_unquote ("'a'\\'''"), "a'");
+ CHECK_STRING_RESULT (test_shell_unquote ("'a'\\''a'"), "a'a");
+
+ CHECK_STRING_RESULT (test_shell_unquote ("\\\\"), "\\");
+ CHECK_STRING_RESULT (test_shell_unquote ("\\\n"), "");
+
+ CHECK_STRING_RESULT (test_shell_unquote ("'\\''"), "G_SHELL_ERROR_BAD_QUOTING");
+
+#if defined (_MSC_VER) && (_MSC_VER <= 1200)
+ /* using \x22 instead of \" to work around a msvc 5.0, 6.0 compiler bug */
+ CHECK_STRING_RESULT (test_shell_unquote ("\x22\\\x22\""), "\"");
+#else
+ CHECK_STRING_RESULT (test_shell_unquote ("\"\\\"\""), "\"");
+#endif
+
+ CHECK_STRING_RESULT (test_shell_unquote ("\""), "G_SHELL_ERROR_BAD_QUOTING");
+ CHECK_STRING_RESULT (test_shell_unquote ("'"), "G_SHELL_ERROR_BAD_QUOTING");
+
+ CHECK_STRING_RESULT (test_shell_unquote ("\x22\\\\\""), "\\");
+ CHECK_STRING_RESULT (test_shell_unquote ("\x22\\`\""), "`");
+ CHECK_STRING_RESULT (test_shell_unquote ("\x22\\$\""), "$");
+ CHECK_STRING_RESULT (test_shell_unquote ("\x22\\\n\""), "\n");
+
+ CHECK_STRING_RESULT (test_shell_unquote ("\"\\'\""), "\\'");
+ CHECK_STRING_RESULT (test_shell_unquote ("\x22\\\r\""), "\\\r");
+ CHECK_STRING_RESULT (test_shell_unquote ("\x22\\n\""), "\\n");
+
+ return any_test_failed ? 1 : 0;
+}
diff --git a/trunk/tests/slice-color.c b/trunk/tests/slice-color.c
new file mode 100644
index 000000000..c4a417d24
--- /dev/null
+++ b/trunk/tests/slice-color.c
@@ -0,0 +1,178 @@
+/* GLIB sliced memory - fast threaded memory chunk allocator
+ * Copyright (C) 2005 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.
+ */
+#include <glib.h>
+#include <string.h>
+
+#define ALIGN(size, base) ((base) * (gsize) (((size) + (base) - 1) / (base)))
+
+static gdouble parse_memsize (const gchar *cstring);
+static void usage (void);
+
+static void
+fill_memory (guint **mem,
+ guint n,
+ guint val)
+{
+ guint j, o = 0;
+ for (j = 0; j < n; j++)
+ mem[j][o] = val;
+}
+
+static guint64
+access_memory3 (guint **mema,
+ guint **memb,
+ guint **memd,
+ guint n,
+ guint64 repeats)
+{
+ guint64 accu = 0, i, j;
+ const guint o = 0;
+ for (i = 0; i < repeats; i++)
+ {
+ for (j = 1; j < n; j += 2)
+ memd[j][o] = mema[j][o] + memb[j][o];
+ }
+ for (i = 0; i < repeats; i++)
+ for (j = 0; j < n; j++)
+ accu += memd[j][o];
+ return accu;
+}
+
+static void
+touch_mem (guint64 block_size,
+ guint64 n_blocks,
+ guint64 repeats)
+{
+ guint64 j, accu, n = n_blocks;
+ GTimer *timer;
+ guint **memc;
+ guint **memb;
+ guint **mema = g_new (guint*, n);
+ for (j = 0; j < n; j++)
+ mema[j] = g_slice_alloc (block_size);
+ memb = g_new (guint*, n);
+ for (j = 0; j < n; j++)
+ memb[j] = g_slice_alloc (block_size);
+ memc = g_new (guint*, n);
+ for (j = 0; j < n; j++)
+ memc[j] = g_slice_alloc (block_size);
+
+ timer = g_timer_new();
+ fill_memory (mema, n, 2);
+ fill_memory (memb, n, 3);
+ fill_memory (memc, n, 4);
+ access_memory3 (mema, memb, memc, n, 3);
+ g_timer_start (timer);
+ accu = access_memory3 (mema, memb, memc, n, repeats);
+ g_timer_stop (timer);
+
+ g_print ("Access-time = %fs\n", g_timer_elapsed (timer, NULL));
+ g_assert (accu / repeats == (2 + 3) * n / 2 + 4 * n / 2);
+
+ for (j = 0; j < n; j++)
+ {
+ g_slice_free1 (block_size, mema[j]);
+ g_slice_free1 (block_size, memb[j]);
+ g_slice_free1 (block_size, memc[j]);
+ }
+ g_timer_destroy (timer);
+ g_free (mema);
+ g_free (memb);
+ g_free (memc);
+}
+
+static void
+usage (void)
+{
+ g_print ("Usage: slice-color <block-size> [memory-size] [repeats] [colorization]\n");
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ guint64 block_size = 512, area_size = 1024 * 1024, n_blocks, repeats = 1000000;
+
+ if (argc > 1)
+ block_size = parse_memsize (argv[1]);
+ else
+ {
+ usage();
+ block_size = 512;
+ }
+ if (argc > 2)
+ area_size = parse_memsize (argv[2]);
+ if (argc > 3)
+ repeats = parse_memsize (argv[3]);
+ if (argc > 4)
+ g_slice_set_config (G_SLICE_CONFIG_COLOR_INCREMENT, parse_memsize (argv[4]));
+
+ /* figure number of blocks from block and area size.
+ * divide area by 3 because touch_mem() allocates 3 areas
+ */
+ n_blocks = area_size / 3 / ALIGN (block_size, sizeof (gsize) * 2);
+
+ /* basic sanity checks */
+ if (!block_size || !n_blocks || block_size >= area_size)
+ {
+ g_printerr ("Invalid arguments: block-size=%llu memory-size=%llu\n", block_size, area_size);
+ usage();
+ return 1;
+ }
+
+ g_printerr ("Will allocate and touch %llu blocks of %llu bytes (= %llu bytes) %llu times with color increment: 0x%08llx\n",
+ n_blocks, block_size, n_blocks * block_size, repeats, g_slice_get_config (G_SLICE_CONFIG_COLOR_INCREMENT));
+
+ touch_mem (block_size, n_blocks, repeats);
+
+ return 0;
+}
+
+static gdouble
+parse_memsize (const gchar *cstring)
+{
+ gchar *mem = g_strdup (cstring);
+ gchar *string = g_strstrip (mem);
+ guint l = strlen (string);
+ gdouble f = 0;
+ gchar *derr = NULL;
+ gdouble msize;
+
+ switch (l ? string[l - 1] : 0)
+ {
+ case 'k': f = 1000; break;
+ case 'K': f = 1024; break;
+ case 'm': f = 1000000; break;
+ case 'M': f = 1024 * 1024; break;
+ case 'g': f = 1000000000; break;
+ case 'G': f = 1024 * 1024 * 1024; break;
+ }
+ if (f)
+ string[l - 1] = 0;
+ msize = g_ascii_strtod (string, &derr);
+ g_free (mem);
+ if (derr && *derr)
+ {
+ g_printerr ("failed to parse number at: %s\n", derr);
+ msize = 0;
+ }
+ if (f)
+ msize *= f;
+ return msize;
+}
diff --git a/trunk/tests/slice-test.c b/trunk/tests/slice-test.c
new file mode 100644
index 000000000..22f252b0a
--- /dev/null
+++ b/trunk/tests/slice-test.c
@@ -0,0 +1,310 @@
+/* GLIB sliced memory - fast threaded memory chunk allocator
+ * Copyright (C) 2005 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.
+ */
+#include <glib.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#define quick_rand32() (rand_accu = 1664525 * rand_accu + 1013904223, rand_accu)
+static guint prime_size = 1021; // 769; // 509
+static gboolean clean_memchunks = FALSE;
+static guint number_of_blocks = 10000; /* total number of blocks allocated */
+static guint number_of_repetitions = 10000; /* number of alloc+free repetitions */
+static gboolean want_corruption = FALSE;
+
+/* --- old memchunk prototypes (memchunks.c) --- */
+void old_mem_chunks_init (void);
+GMemChunk* old_mem_chunk_new (const gchar *name,
+ gint atom_size,
+ gulong area_size,
+ gint type);
+void old_mem_chunk_destroy (GMemChunk *mem_chunk);
+gpointer old_mem_chunk_alloc (GMemChunk *mem_chunk);
+gpointer old_mem_chunk_alloc0 (GMemChunk *mem_chunk);
+void old_mem_chunk_free (GMemChunk *mem_chunk,
+ gpointer mem);
+void old_mem_chunk_clean (GMemChunk *mem_chunk);
+void old_mem_chunk_reset (GMemChunk *mem_chunk);
+void old_mem_chunk_print (GMemChunk *mem_chunk);
+void old_mem_chunk_info (void);
+#ifndef G_ALLOC_AND_FREE
+#define G_ALLOC_AND_FREE 2
+#endif
+
+/* --- functions --- */
+static inline int
+corruption (void)
+{
+ if (G_UNLIKELY (want_corruption))
+ {
+ /* corruption per call likelyness is about 1:4000000 */
+ guint32 r = g_random_int() % 8000009;
+ return r == 277 ? +1 : r == 281 ? -1 : 0;
+ }
+ return 0;
+}
+
+static inline gpointer
+memchunk_alloc (GMemChunk **memchunkp,
+ guint size)
+{
+ size = MAX (size, 1);
+ if (G_UNLIKELY (!*memchunkp))
+ *memchunkp = old_mem_chunk_new ("", size, 4096, G_ALLOC_AND_FREE);
+ return old_mem_chunk_alloc (*memchunkp);
+}
+
+static inline void
+memchunk_free (GMemChunk *memchunk,
+ gpointer chunk)
+{
+ old_mem_chunk_free (memchunk, chunk);
+ if (clean_memchunks)
+ old_mem_chunk_clean (memchunk);
+}
+
+static gpointer
+test_memchunk_thread (gpointer data)
+{
+ GMemChunk **memchunks;
+ guint i, j;
+ guint8 **ps;
+ guint *ss;
+ guint32 rand_accu = 2147483563;
+ /* initialize random numbers */
+ if (data)
+ rand_accu = *(guint32*) data;
+ else
+ {
+ GTimeVal rand_tv;
+ g_get_current_time (&rand_tv);
+ rand_accu = rand_tv.tv_usec + (rand_tv.tv_sec << 16);
+ }
+
+ /* prepare for memchunk creation */
+ memchunks = g_alloca (sizeof (memchunks[0]) * prime_size);
+ memset (memchunks, 0, sizeof (memchunks[0]) * prime_size);
+
+ ps = g_new (guint8*, number_of_blocks);
+ ss = g_new (guint, number_of_blocks);
+ /* create number_of_blocks random sizes */
+ for (i = 0; i < number_of_blocks; i++)
+ ss[i] = quick_rand32() % prime_size;
+ /* allocate number_of_blocks blocks */
+ for (i = 0; i < number_of_blocks; i++)
+ ps[i] = memchunk_alloc (&memchunks[ss[i]], ss[i]);
+ for (j = 0; j < number_of_repetitions; j++)
+ {
+ /* free number_of_blocks/2 blocks */
+ for (i = 0; i < number_of_blocks; i += 2)
+ memchunk_free (memchunks[ss[i]], ps[i]);
+ /* allocate number_of_blocks/2 blocks with new sizes */
+ for (i = 0; i < number_of_blocks; i += 2)
+ {
+ ss[i] = quick_rand32() % prime_size;
+ ps[i] = memchunk_alloc (&memchunks[ss[i]], ss[i]);
+ }
+ }
+ /* free number_of_blocks blocks */
+ for (i = 0; i < number_of_blocks; i++)
+ memchunk_free (memchunks[ss[i]], ps[i]);
+ /* alloc and free many equally sized chunks in a row */
+ for (i = 0; i < number_of_repetitions; i++)
+ {
+ guint sz = quick_rand32() % prime_size;
+ guint k = number_of_blocks / 100;
+ for (j = 0; j < k; j++)
+ ps[j] = memchunk_alloc (&memchunks[sz], sz);
+ for (j = 0; j < k; j++)
+ memchunk_free (memchunks[sz], ps[j]);
+ }
+ /* cleanout memchunks */
+ for (i = 0; i < prime_size; i++)
+ if (memchunks[i])
+ old_mem_chunk_destroy (memchunks[i]);
+ g_free (ps);
+ g_free (ss);
+
+ return NULL;
+}
+
+static gpointer
+test_sliced_mem_thread (gpointer data)
+{
+ guint32 rand_accu = 2147483563;
+ guint i, j;
+ guint8 **ps;
+ guint *ss;
+
+ /* initialize random numbers */
+ if (data)
+ rand_accu = *(guint32*) data;
+ else
+ {
+ GTimeVal rand_tv;
+ g_get_current_time (&rand_tv);
+ rand_accu = rand_tv.tv_usec + (rand_tv.tv_sec << 16);
+ }
+
+ ps = g_new (guint8*, number_of_blocks);
+ ss = g_new (guint, number_of_blocks);
+ /* create number_of_blocks random sizes */
+ for (i = 0; i < number_of_blocks; i++)
+ ss[i] = quick_rand32() % prime_size;
+ /* allocate number_of_blocks blocks */
+ for (i = 0; i < number_of_blocks; i++)
+ ps[i] = g_slice_alloc (ss[i] + corruption());
+ for (j = 0; j < number_of_repetitions; j++)
+ {
+ /* free number_of_blocks/2 blocks */
+ for (i = 0; i < number_of_blocks; i += 2)
+ g_slice_free1 (ss[i] + corruption(), ps[i] + corruption());
+ /* allocate number_of_blocks/2 blocks with new sizes */
+ for (i = 0; i < number_of_blocks; i += 2)
+ {
+ ss[i] = quick_rand32() % prime_size;
+ ps[i] = g_slice_alloc (ss[i] + corruption());
+ }
+ }
+ /* free number_of_blocks blocks */
+ for (i = 0; i < number_of_blocks; i++)
+ g_slice_free1 (ss[i] + corruption(), ps[i] + corruption());
+ /* alloc and free many equally sized chunks in a row */
+ for (i = 0; i < number_of_repetitions; i++)
+ {
+ guint sz = quick_rand32() % prime_size;
+ guint k = number_of_blocks / 100;
+ for (j = 0; j < k; j++)
+ ps[j] = g_slice_alloc (sz + corruption());
+ for (j = 0; j < k; j++)
+ g_slice_free1 (sz + corruption(), ps[j] + corruption());
+ }
+ g_free (ps);
+ g_free (ss);
+
+ return NULL;
+}
+
+static void
+usage (void)
+{
+ g_print ("Usage: slice-test [n_threads] [G|S|M|O][f][c][~] [maxblocksize] [seed]\n");
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ guint seed32, *seedp = NULL;
+ gboolean ccounters = FALSE, use_memchunks = FALSE;
+ guint n_threads = 1;
+ const gchar *mode = "slab allocator + magazine cache", *emode = " ";
+ if (argc > 1)
+ n_threads = g_ascii_strtoull (argv[1], NULL, 10);
+ if (argc > 2)
+ {
+ guint i, l = strlen (argv[2]);
+ for (i = 0; i < l; i++)
+ switch (argv[2][i])
+ {
+ case 'G': /* GLib mode */
+ g_slice_set_config (G_SLICE_CONFIG_ALWAYS_MALLOC, FALSE);
+ g_slice_set_config (G_SLICE_CONFIG_BYPASS_MAGAZINES, FALSE);
+ mode = "slab allocator + magazine cache";
+ break;
+ case 'S': /* slab mode */
+ g_slice_set_config (G_SLICE_CONFIG_ALWAYS_MALLOC, FALSE);
+ g_slice_set_config (G_SLICE_CONFIG_BYPASS_MAGAZINES, TRUE);
+ mode = "slab allocator";
+ break;
+ case 'M': /* malloc mode */
+ g_slice_set_config (G_SLICE_CONFIG_ALWAYS_MALLOC, TRUE);
+ mode = "system malloc";
+ break;
+ case 'O': /* old memchunks */
+ use_memchunks = TRUE;
+ mode = "old memchunks";
+ break;
+ case 'f': /* eager freeing */
+ g_slice_set_config (G_SLICE_CONFIG_WORKING_SET_MSECS, 0);
+ clean_memchunks = TRUE;
+ emode = " with eager freeing";
+ break;
+ case 'c': /* print contention counters */
+ ccounters = TRUE;
+ break;
+ case '~':
+ want_corruption = TRUE; /* force occasional corruption */
+ break;
+ default:
+ usage();
+ return 1;
+ }
+ }
+ if (argc > 3)
+ prime_size = g_ascii_strtoull (argv[3], NULL, 10);
+ if (argc > 4)
+ {
+ seed32 = g_ascii_strtoull (argv[4], NULL, 10);
+ seedp = &seed32;
+ }
+
+ g_thread_init (NULL);
+
+ if (argc <= 1)
+ usage();
+
+ {
+ gchar strseed[64] = "<random>";
+ GThread **threads;
+ guint i;
+
+ if (seedp)
+ g_snprintf (strseed, 64, "%u", *seedp);
+ g_print ("Starting %d threads allocating random blocks <= %u bytes with seed=%s using %s%s\n", n_threads, prime_size, strseed, mode, emode);
+
+ threads = g_alloca (sizeof(GThread*) * n_threads);
+ if (!use_memchunks)
+ for (i = 0; i < n_threads; i++)
+ threads[i] = g_thread_create_full (test_sliced_mem_thread, seedp, 0, TRUE, FALSE, 0, NULL);
+ else
+ {
+ old_mem_chunks_init();
+ for (i = 0; i < n_threads; i++)
+ threads[i] = g_thread_create_full (test_memchunk_thread, seedp, 0, TRUE, FALSE, 0, NULL);
+ }
+ for (i = 0; i < n_threads; i++)
+ g_thread_join (threads[i]);
+
+ if (ccounters)
+ {
+ guint n, n_chunks = g_slice_get_config (G_SLICE_CONFIG_CHUNK_SIZES);
+ g_print (" ChunkSize | MagazineSize | Contention\n");
+ for (i = 0; i < n_chunks; i++)
+ {
+ gint64 *vals = g_slice_get_config_state (G_SLICE_CONFIG_CONTENTION_COUNTER, i, &n);
+ g_print (" %9llu | %9llu | %9llu\n", vals[0], vals[2], vals[1]);
+ g_free (vals);
+ }
+ }
+ else
+ g_print ("Done.\n");
+ return 0;
+ }
+}
diff --git a/trunk/tests/slist-test.c b/trunk/tests/slist-test.c
new file mode 100644
index 000000000..c269809a9
--- /dev/null
+++ b/trunk/tests/slist-test.c
@@ -0,0 +1,204 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <glib.h>
+
+#define DEBUG_MSG(args)
+/* #define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n"); */
+#define PRINT_MSG(args)
+/* #define PRINT_MSG(args) g_print args ; g_print ("\n"); */
+
+#define SIZE 50
+#define NUMBER_MIN 0000
+#define NUMBER_MAX 9999
+
+
+static guint32 array[SIZE];
+
+
+static gint
+sort (gconstpointer p1, gconstpointer p2)
+{
+ gint32 a, b;
+
+ a = GPOINTER_TO_INT (p1);
+ b = GPOINTER_TO_INT (p2);
+
+ return (a > b ? +1 : a == b ? 0 : -1);
+}
+
+/*
+ * gslist sort tests
+ */
+static void
+test_slist_sort (void)
+{
+ GSList *slist = NULL;
+ gint i;
+
+ PRINT_MSG (("testing g_slist_sort()"));
+
+ for (i = 0; i < SIZE; i++) {
+ slist = g_slist_append (slist, GINT_TO_POINTER (array[i]));
+ }
+
+ slist = g_slist_sort (slist, sort);
+ for (i = 0; i < SIZE - 1; i++) {
+ gpointer p1, p2;
+
+ p1 = g_slist_nth_data (slist, i);
+ p2 = g_slist_nth_data (slist, i+1);
+
+ g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
+ DEBUG_MSG (("slist_sort #%3.3d ---> %d", i, GPOINTER_TO_INT (p1)));
+ }
+}
+
+static void
+test_slist_sort_with_data (void)
+{
+ GSList *slist = NULL;
+ gint i;
+
+ PRINT_MSG (("testing g_slist_sort_with_data()"));
+
+ for (i = 0; i < SIZE; i++) {
+ slist = g_slist_append (slist, GINT_TO_POINTER (array[i]));
+ }
+
+ slist = g_slist_sort_with_data (slist, (GCompareDataFunc)sort, NULL);
+ for (i = 0; i < SIZE - 1; i++) {
+ gpointer p1, p2;
+
+ p1 = g_slist_nth_data (slist, i);
+ p2 = g_slist_nth_data (slist, i+1);
+
+ g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
+ DEBUG_MSG (("slist_sort_with_data #%3.3d ---> %d", i, GPOINTER_TO_INT (p1)));
+ }
+}
+
+static void
+test_slist_insert_sorted (void)
+{
+ GSList *slist = NULL;
+ gint i;
+
+ PRINT_MSG (("testing g_slist_insert_sorted()"));
+
+ for (i = 0; i < SIZE; i++) {
+ slist = g_slist_insert_sorted (slist, GINT_TO_POINTER (array[i]), sort);
+ }
+
+ for (i = 0; i < SIZE - 1; i++) {
+ gpointer p1, p2;
+
+ p1 = g_slist_nth_data (slist, i);
+ p2 = g_slist_nth_data (slist, i+1);
+
+ g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
+ DEBUG_MSG (("slist_insert_sorted #%3.3d ---> %d", i, GPOINTER_TO_INT (p1)));
+ }
+}
+
+static void
+test_slist_insert_sorted_with_data (void)
+{
+ GSList *slist = NULL;
+ gint i;
+
+ PRINT_MSG (("testing g_slist_insert_sorted_with_data()"));
+
+ for (i = 0; i < SIZE; i++) {
+ slist = g_slist_insert_sorted_with_data (slist,
+ GINT_TO_POINTER (array[i]),
+ (GCompareDataFunc)sort,
+ NULL);
+ }
+
+ for (i = 0; i < SIZE - 1; i++) {
+ gpointer p1, p2;
+
+ p1 = g_slist_nth_data (slist, i);
+ p2 = g_slist_nth_data (slist, i+1);
+
+ g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
+ DEBUG_MSG (("slist_insert_sorted_with_data #%3.3d ---> %d", i, GPOINTER_TO_INT (p1)));
+ }
+}
+
+static void
+test_slist_reverse (void)
+{
+ GSList *slist = NULL;
+ GSList *st;
+ gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+ gint i;
+
+ PRINT_MSG (("testing g_slist_reverse()"));
+
+ 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);
+ g_assert (*((gint*) st->data) == (9 - i));
+ }
+
+ g_slist_free (slist);
+}
+
+static void
+test_slist_nth (void)
+{
+ GSList *slist = NULL;
+ GSList *st;
+ gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+ gint i;
+
+ PRINT_MSG (("testing g_slist_nth()"));
+
+ for (i = 0; i < 10; i++) {
+ slist = g_slist_append (slist, &nums[i]);
+ }
+
+ for (i = 0; i < 10; i++) {
+ st = g_slist_nth (slist, i);
+ g_assert (*((gint*) st->data) == i);
+ }
+
+ g_slist_free (slist);
+}
+
+int
+main (int argc, char *argv[])
+{
+ gint i;
+
+ DEBUG_MSG (("debugging messages turned on"));
+
+ DEBUG_MSG (("creating %d random numbers", SIZE));
+
+ /* Create an array of random numbers. */
+ for (i = 0; i < SIZE; i++) {
+ array[i] = g_random_int_range (NUMBER_MIN, NUMBER_MAX);
+ DEBUG_MSG (("number #%3.3d ---> %d", i, array[i]));
+ }
+
+ /* Start tests. */
+ test_slist_sort ();
+ test_slist_sort_with_data ();
+
+ test_slist_insert_sorted ();
+ test_slist_insert_sorted_with_data ();
+
+ test_slist_reverse ();
+ test_slist_nth ();
+
+ PRINT_MSG (("testing finished"));
+
+ return 0;
+}
diff --git a/trunk/tests/spawn-test-win32-gui.c b/trunk/tests/spawn-test-win32-gui.c
new file mode 100644
index 000000000..45529d011
--- /dev/null
+++ b/trunk/tests/spawn-test-win32-gui.c
@@ -0,0 +1,111 @@
+#include <windows.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+
+#ifdef __CYGWIN__
+/* For read() and write() */
+#include <unistd.h>
+/* Cygwin does not prototype __argc and __argv in stdlib.h */
+extern int __argc;
+extern char** __argv;
+#endif
+
+int _stdcall
+WinMain (struct HINSTANCE__ *hInstance,
+ struct HINSTANCE__ *hPrevInstance,
+ char *lpszCmdLine,
+ int nCmdShow)
+{
+ char buf[100];
+
+ if (__argc >= 2 && strcmp (__argv[1], "nop") == 0)
+ {
+ sprintf (buf, "spawn-test-win32-gui: argv[0]=\"%s\"", __argv[0]);
+ MessageBox (NULL, buf, lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL);
+ }
+ else if (__argc <= 2)
+ {
+ MessageBox (NULL, "spawn-test-win32-gui: Will write to stdout",
+ lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL);
+
+ printf ("This is stdout\n");
+ fflush (stdout);
+
+ MessageBox (NULL, "spawn-test-win32-gui: Will write to stderr",
+ lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL);
+
+ fprintf (stderr, "This is stderr\n");
+ fflush (stderr);
+ }
+ else if (__argc == 4 && strcmp (__argv[1], "pipes") == 0)
+ {
+ int infd = atoi (__argv[2]);
+ int outfd = atoi (__argv[3]);
+ int k, n;
+
+ if (infd < 0 || outfd < 0)
+ {
+ MessageBox (NULL, "spawn-test-win32-gui: illegal fds on command line",
+ lpszCmdLine, MB_ICONERROR|MB_SYSTEMMODAL);
+ exit (1);
+ }
+
+ MessageBox (NULL, "spawn-test-win32-gui: Will write to parent",
+ lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL);
+
+ n = strlen ("Hello there");
+ if (write (outfd, &n, sizeof (n)) == -1 ||
+ write (outfd, "Hello there", n) == -1)
+ {
+ sprintf (buf, "spawn-test-win32-gui: Write: %s", strerror (errno));
+ MessageBox (NULL, buf, lpszCmdLine, MB_ICONERROR|MB_SYSTEMMODAL);
+ exit (1);
+ }
+
+ MessageBox (NULL, "spawn-test-win32-gui: Will read from parent",
+ lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL);
+
+ if ((k = read (infd, &n, sizeof (n))) != sizeof (n))
+ {
+ sprintf (buf, "spawn-test-win32-gui: Got only %d bytes, wanted %d",
+ k, sizeof (n));
+ MessageBox (NULL, buf, lpszCmdLine, MB_ICONERROR|MB_SYSTEMMODAL);
+ exit (1);
+ }
+
+ sprintf (buf, "spawn-test-win32-gui: Parent says %d bytes to read", n);
+ MessageBox (NULL, buf, lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL);
+
+ if ((k = read (infd, buf, n)) != n)
+ {
+ if (k == -1)
+ sprintf (buf, "spawn-test-win32-gui: Read: %s", strerror (errno));
+ else
+ sprintf (buf, "spawn-test-win32-gui: Got only %d bytes", k);
+ MessageBox (NULL, buf, lpszCmdLine, MB_ICONERROR|MB_SYSTEMMODAL);
+ exit (1);
+ }
+
+ MessageBox (NULL, "spawn-test-win32-gui: Will write more to parent",
+ lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL);
+
+ n = strlen ("See ya");
+ if (write (outfd, &n, sizeof (n)) == -1 ||
+ write (outfd, "See ya", n) == -1)
+ {
+ sprintf (buf, "spawn-test-win32-gui: Write: %s", strerror (errno));
+ MessageBox (NULL, buf, lpszCmdLine, MB_ICONERROR|MB_SYSTEMMODAL);
+ exit (1);
+ }
+ }
+
+ Sleep (2000);
+
+ MessageBox (NULL, "spawn-test-win32-gui: Done, exiting.",
+ lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL);
+
+ return 0;
+}
diff --git a/trunk/tests/spawn-test.c b/trunk/tests/spawn-test.c
new file mode 100644
index 000000000..501049be5
--- /dev/null
+++ b/trunk/tests/spawn-test.c
@@ -0,0 +1,293 @@
+/* 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <glib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef G_OS_WIN32
+#include <fcntl.h>
+#include <io.h>
+#endif
+
+
+static void
+run_tests (void)
+{
+ GError *err;
+ gchar *output = NULL;
+#ifdef G_OS_WIN32
+ gchar *erroutput = NULL;
+ int pipedown[2], pipeup[2];
+ gchar **argv = 0;
+#endif
+
+ err = NULL;
+ if (!g_spawn_command_line_sync ("nonexistent_application foo 'bar baz' blah blah",
+ NULL, NULL, NULL,
+ &err))
+ {
+ g_error_free (err);
+ }
+ else
+ {
+ g_warning ("no error for sync spawn of nonexistent application");
+ exit (1);
+ }
+
+ err = NULL;
+ if (!g_spawn_command_line_async ("nonexistent_application foo bar baz \"blah blah\"",
+ &err))
+ {
+ g_error_free (err);
+ }
+ else
+ {
+ g_warning ("no error for async spawn of nonexistent application");
+ exit (1);
+ }
+
+ err = NULL;
+#ifdef G_OS_UNIX
+ if (!g_spawn_command_line_sync ("/bin/sh -c 'echo hello'",
+ &output, NULL, NULL,
+ &err))
+ {
+ fprintf (stderr, "Error: %s\n", err->message);
+ g_error_free (err);
+ exit (1);
+ }
+ else
+ {
+ g_assert (output != NULL);
+
+ if (strcmp (output, "hello\n") != 0)
+ {
+ printf ("output was '%s', should have been 'hello'\n",
+ output);
+
+ exit (1);
+ }
+
+ g_free (output);
+ }
+#else
+#ifdef G_OS_WIN32
+ printf ("Running netstat synchronously, collecting its output\n");
+
+ if (!g_spawn_command_line_sync ("netstat -n",
+ &output, &erroutput, NULL,
+ &err))
+ {
+ fprintf (stderr, "Error: %s\n", err->message);
+ g_error_free (err);
+ exit (1);
+ }
+ else
+ {
+ g_assert (output != NULL);
+ g_assert (erroutput != NULL);
+
+ if (strstr (output, "Active Connections") == 0)
+ {
+ printf ("output was '%s', should have contained 'Active Connections'\n",
+ output);
+
+ exit (1);
+ }
+ if (erroutput[0] != '\0')
+ {
+ printf ("error output was '%s', should have been empty\n",
+ erroutput);
+ exit (1);
+ }
+
+ g_free (output);
+ output = NULL;
+ g_free (erroutput);
+ erroutput = NULL;
+ }
+
+ printf ("Running spawn-test-win32-gui in various ways. Click on the OK buttons.\n");
+
+ printf ("First asynchronously (without wait).\n");
+
+ if (!g_spawn_command_line_async ("'.\\spawn-test-win32-gui.exe' 1", &err))
+ {
+ fprintf (stderr, "Error: %s\n", err->message);
+ g_error_free (err);
+ exit (1);
+ }
+
+ printf ("Now synchronously, collecting its output.\n");
+ if (!g_spawn_command_line_sync ("'.\\spawn-test-win32-gui.exe' 2",
+ &output, &erroutput, NULL,
+ &err))
+ {
+ fprintf (stderr, "Error: %s\n", err->message);
+ g_error_free (err);
+ exit (1);
+ }
+ else
+ {
+ g_assert (output != NULL);
+ g_assert (erroutput != NULL);
+
+ if (strcmp (output, "This is stdout\r\n") != 0)
+ {
+ printf ("output was '%s', should have been 'This is stdout'\n",
+ g_strescape (output, NULL));
+
+ exit (1);
+ }
+ if (strcmp (erroutput, "This is stderr\r\n") != 0)
+ {
+ printf ("error output was '%s', should have been 'This is stderr'\n",
+ g_strescape (erroutput, NULL));
+ exit (1);
+ }
+
+ g_free (output);
+ g_free (erroutput);
+ }
+
+ printf ("Now with G_SPAWN_FILE_AND_ARGV_ZERO.\n");
+
+ if (!g_shell_parse_argv ("'.\\spawn-test-win32-gui.exe' this-should-be-argv-zero nop", NULL, &argv, &err))
+ {
+ fprintf (stderr, "Error parsing command line? %s\n", err->message);
+ g_error_free (err);
+ exit (1);
+ }
+
+ if (!g_spawn_async (NULL, argv, NULL,
+ G_SPAWN_FILE_AND_ARGV_ZERO,
+ NULL, NULL, NULL,
+ &err))
+ {
+ fprintf (stderr, "Error: %s\n", err->message);
+ g_error_free (err);
+ exit (1);
+ }
+
+ printf ("Now talking to it through pipes.\n");
+
+ if (pipe (pipedown) < 0 ||
+ pipe (pipeup) < 0)
+ {
+ fprintf (stderr, "Could not create pipes\n");
+ exit (1);
+ }
+
+ if (!g_shell_parse_argv (g_strdup_printf ("'.\\spawn-test-win32-gui.exe' pipes %d %d",
+ pipedown[0], pipeup[1]),
+ NULL, &argv,
+ &err))
+ {
+ fprintf (stderr, "Error parsing command line? %s\n", err->message);
+ g_error_free (err);
+ exit (1);
+ }
+
+ if (!g_spawn_async (NULL, argv, NULL,
+ G_SPAWN_LEAVE_DESCRIPTORS_OPEN |
+ G_SPAWN_DO_NOT_REAP_CHILD,
+ NULL, NULL, NULL,
+ &err))
+ {
+ fprintf (stderr, "Error: %s\n", err->message);
+ g_error_free (err);
+ exit (1);
+ }
+ else
+ {
+ int k, n;
+ char buf[100];
+
+ if ((k = read (pipeup[0], &n, sizeof (n))) != sizeof (n))
+ {
+ if (k == -1)
+ fprintf (stderr, "Read error: %s\n", g_strerror (errno));
+ else
+ fprintf (stderr, "Wanted to read %d bytes, got %d\n",
+ sizeof (n), k);
+ exit (1);
+ }
+
+ if ((k = read (pipeup[0], buf, n)) != n)
+ {
+ if (k == -1)
+ fprintf (stderr, "Read error: %s\n", g_strerror (errno));
+ else
+ fprintf (stderr, "Wanted to read %d bytes, got %d\n",
+ n, k);
+ exit (1);
+ }
+
+ n = strlen ("Bye then");
+ if (write (pipedown[1], &n, sizeof (n)) == -1 ||
+ write (pipedown[1], "Bye then", n) == -1)
+ {
+ fprintf (stderr, "Write error: %s\n", g_strerror (errno));
+ exit (1);
+ }
+
+ if ((k = read (pipeup[0], &n, sizeof (n))) != sizeof (n))
+ {
+ if (k == -1)
+ fprintf (stderr, "Read error: %s\n", g_strerror (errno));
+ else
+ fprintf (stderr, "Wanted to read %d bytes, got %d\n",
+ sizeof (n), k);
+ exit (1);
+ }
+
+ if ((k = read (pipeup[0], buf, n)) != n)
+ {
+ if (k == -1)
+ fprintf (stderr, "Read error: %s\n", g_strerror (errno));
+ else
+ fprintf (stderr, "Wanted to read %d bytes, got %d\n",
+ n, k);
+ exit (1);
+ }
+ }
+#endif
+#endif
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ run_tests ();
+
+ return 0;
+}
diff --git a/trunk/tests/strfunc-test.c b/trunk/tests/strfunc-test.c
new file mode 100644
index 000000000..f861b440c
--- /dev/null
+++ b/trunk/tests/strfunc-test.c
@@ -0,0 +1,775 @@
+/* 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <stdio.h>
+#include <string.h>
+#include "glib.h"
+#include <stdarg.h>
+#include <ctype.h>
+
+static gboolean any_failed = FALSE;
+static gboolean failed = FALSE;
+
+#define TEST(m,cond) G_STMT_START { failed = !(cond); \
+if (failed) \
+ { if (!m) \
+ g_print ("(%s:%d) failed for: %s\n", __FILE__, __LINE__, ( # cond )); \
+ else \
+ g_print ("(%s:%d) failed for: %s: (%s)\n", __FILE__, __LINE__, ( # cond ), m ? (gchar*)m : ""); \
+ fflush (stdout); \
+ any_failed = TRUE; \
+ } \
+} G_STMT_END
+
+#define TEST_FAILED(message) \
+ G_STMT_START { g_print ("Error: "); g_print message; g_print ("\n"); any_failed = TRUE; } G_STMT_END
+
+#define GLIB_TEST_STRING "el dorado "
+
+static gboolean
+strv_check (gchar **strv, ...)
+{
+ gboolean ok = TRUE;
+ gint i = 0;
+ va_list list;
+
+ va_start (list, strv);
+ while (ok)
+ {
+ const gchar *str = va_arg (list, const char *);
+ if (strv[i] == NULL)
+ {
+ ok = str == NULL;
+ break;
+ }
+ if (str == NULL)
+ ok = FALSE;
+ else if (strcmp (strv[i], str) != 0)
+ ok = FALSE;
+ i++;
+ }
+ va_end (list);
+
+ g_strfreev (strv);
+
+ return ok;
+}
+
+static gboolean
+str_check (gchar *str,
+ gchar *expected)
+{
+ gboolean ok = (strcmp (str, expected) == 0);
+
+ g_free (str);
+
+ return ok;
+}
+
+static gboolean
+strchomp_check (gchar *str,
+ gchar *expected)
+{
+ gchar *tmp = strdup (str);
+ gboolean ok;
+
+ g_strchomp (tmp);
+ ok = (strcmp (tmp, expected) == 0);
+ g_free (tmp);
+
+ return ok;
+}
+
+#define FOR_ALL_CTYPE(macro) \
+ macro(isalnum) \
+ macro(isalpha) \
+ macro(iscntrl) \
+ macro(isdigit) \
+ macro(isgraph) \
+ macro(islower) \
+ macro(isprint) \
+ macro(ispunct) \
+ macro(isspace) \
+ macro(isupper) \
+ macro(isxdigit)
+
+#define DEFINE_CALL_CTYPE(function) \
+ static int \
+ call_##function (int c) \
+ { \
+ return function (c); \
+ }
+
+#define DEFINE_CALL_G_ASCII_CTYPE(function) \
+ static gboolean \
+ call_g_ascii_##function (gchar c) \
+ { \
+ return g_ascii_##function (c); \
+ }
+
+FOR_ALL_CTYPE (DEFINE_CALL_CTYPE)
+FOR_ALL_CTYPE (DEFINE_CALL_G_ASCII_CTYPE)
+
+static void
+test_is_function (const char *name,
+ gboolean (* ascii_function) (gchar),
+ int (* c_library_function) (int),
+ gboolean (* unicode_function) (gunichar))
+{
+ int c;
+
+ for (c = 0; c <= 0x7F; c++)
+ {
+ gboolean ascii_result = ascii_function ((gchar)c);
+ gboolean c_library_result = c_library_function (c) != 0;
+ gboolean unicode_result = unicode_function ((gunichar) c);
+ if (ascii_result != c_library_result && c != '\v')
+ TEST_FAILED (("g_ascii_%s returned %d and %s returned %d for 0x%X",
+ name, ascii_result, name, c_library_result, c));
+ if (ascii_result != unicode_result)
+ TEST_FAILED (("g_ascii_%s returned %d and g_unichar_%s returned %d for 0x%X",
+ name, ascii_result, name, unicode_result, c));
+ }
+ for (c = 0x80; c <= 0xFF; c++)
+ {
+ gboolean ascii_result = ascii_function ((gchar)c);
+ if (ascii_result)
+ TEST_FAILED (("g_ascii_%s returned TRUE for 0x%X",
+ name, c));
+ }
+}
+
+static void
+test_to_function (const char *name,
+ gchar (* ascii_function) (gchar),
+ int (* c_library_function) (int),
+ gunichar (* unicode_function) (gunichar))
+{
+ int c;
+
+ for (c = 0; c <= 0x7F; c++)
+ {
+ int ascii_result = (guchar) ascii_function ((gchar) c);
+ int c_library_result = c_library_function (c);
+ int unicode_result = unicode_function ((gunichar) c);
+ if (ascii_result != c_library_result)
+ TEST_FAILED (("g_ascii_%s returned 0x%X and %s returned 0x%X for 0x%X",
+ name, ascii_result, name, c_library_result, c));
+ if (ascii_result != unicode_result)
+ TEST_FAILED (("g_ascii_%s returned 0x%X and g_unichar_%s returned 0x%X for 0x%X",
+ name, ascii_result, name, unicode_result, c));
+ }
+ for (c = 0x80; c <= 0xFF; c++)
+ {
+ int ascii_result = (guchar) ascii_function ((gchar) c);
+ if (ascii_result != c)
+ TEST_FAILED (("g_ascii_%s returned 0x%X for 0x%X",
+ name, ascii_result, c));
+ }
+}
+
+static void
+test_digit_function (const char *name,
+ int (* ascii_function) (gchar),
+ int (* unicode_function) (gunichar))
+{
+ int c;
+
+ for (c = 0; c <= 0x7F; c++)
+ {
+ int ascii_result = ascii_function ((gchar) c);
+ int unicode_result = unicode_function ((gunichar) c);
+ if (ascii_result != unicode_result)
+ TEST_FAILED (("g_ascii_%s_value returned %d and g_unichar_%s_value returned %d for 0x%X",
+ name, ascii_result, name, unicode_result, c));
+ }
+ for (c = 0x80; c <= 0xFF; c++)
+ {
+ int ascii_result = ascii_function ((gchar) c);
+ if (ascii_result != -1)
+ TEST_FAILED (("g_ascii_%s_value returned %d for 0x%X",
+ name, ascii_result, c));
+ }
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ gchar *string;
+ gchar *vec[] = { "Foo", "Bar", NULL };
+ gchar **copy;
+ gchar *args[10];
+
+ TEST (NULL, g_ascii_strcasecmp ("FroboZZ", "frobozz") == 0);
+ TEST (NULL, g_ascii_strcasecmp ("frobozz", "frobozz") == 0);
+ TEST (NULL, g_ascii_strcasecmp ("frobozz", "FROBOZZ") == 0);
+ TEST (NULL, g_ascii_strcasecmp ("FROBOZZ", "froboz") != 0);
+ TEST (NULL, g_ascii_strcasecmp ("", "") == 0);
+ TEST (NULL, g_ascii_strcasecmp ("!#%&/()", "!#%&/()") == 0);
+ TEST (NULL, g_ascii_strcasecmp ("a", "b") < 0);
+ TEST (NULL, g_ascii_strcasecmp ("a", "B") < 0);
+ TEST (NULL, g_ascii_strcasecmp ("A", "b") < 0);
+ TEST (NULL, g_ascii_strcasecmp ("A", "B") < 0);
+ TEST (NULL, g_ascii_strcasecmp ("b", "a") > 0);
+ TEST (NULL, g_ascii_strcasecmp ("b", "A") > 0);
+ TEST (NULL, g_ascii_strcasecmp ("B", "a") > 0);
+ TEST (NULL, g_ascii_strcasecmp ("B", "A") > 0);
+
+ TEST (NULL, g_strdup (NULL) == NULL);
+ string = g_strdup (GLIB_TEST_STRING);
+ TEST (NULL, string != NULL);
+ TEST (NULL, strcmp (string, GLIB_TEST_STRING) == 0);
+ g_free(string);
+
+ string = g_strconcat (GLIB_TEST_STRING, NULL);
+ TEST (NULL, string != NULL);
+ TEST (NULL, strcmp (string, GLIB_TEST_STRING) == 0);
+ g_free(string);
+
+ string = g_strconcat (GLIB_TEST_STRING, GLIB_TEST_STRING,
+ GLIB_TEST_STRING, NULL);
+ TEST (NULL, string != NULL);
+ TEST (NULL, strcmp (string, GLIB_TEST_STRING GLIB_TEST_STRING
+ GLIB_TEST_STRING) == 0);
+ g_free(string);
+
+ string = g_strdup_printf ("%05d %-5s", 21, "test");
+ TEST (NULL, string != NULL);
+ TEST (NULL, strcmp(string, "00021 test ") == 0);
+ g_free (string);
+
+ TEST (NULL, strcmp
+ (g_strcompress ("abc\\\\\\\"\\b\\f\\n\\r\\t\\003\\177\\234\\313\\12345z"),
+ "abc\\\"\b\f\n\r\t\003\177\234\313\12345z") == 0);
+ TEST (NULL, strcmp (g_strescape("abc\\\"\b\f\n\r\t\003\177\234\313", NULL),
+ "abc\\\\\\\"\\b\\f\\n\\r\\t\\003\\177\\234\\313") == 0);
+ TEST (NULL, strcmp(g_strescape("abc\\\"\b\f\n\r\t\003\177\234\313",
+ "\b\f\001\002\003\004"),
+ "abc\\\\\\\"\b\f\\n\\r\\t\003\\177\\234\\313") == 0);
+
+ copy = g_strdupv (vec);
+ TEST (NULL, strcmp (copy[0], "Foo") == 0);
+ TEST (NULL, strcmp (copy[1], "Bar") == 0);
+ TEST (NULL, copy[2] == NULL);
+ g_strfreev (copy);
+
+ TEST (NULL, strcmp (g_strstr_len ("FooBarFooBarFoo", 6, "Bar"),
+ "BarFooBarFoo") == 0);
+ TEST (NULL, strcmp (g_strrstr ("FooBarFooBarFoo", "Bar"),
+ "BarFoo") == 0);
+ TEST (NULL, strcmp (g_strrstr_len ("FooBarFooBarFoo", 14, "BarFoo"),
+ "BarFooBarFoo") == 0);
+
+ /* Test g_strsplit() */
+ TEST (NULL, strv_check (g_strsplit ("", ",", 0), NULL));
+ TEST (NULL, strv_check (g_strsplit ("x", ",", 0), "x", NULL));
+ TEST (NULL, strv_check (g_strsplit ("x,y", ",", 0), "x", "y", NULL));
+ TEST (NULL, strv_check (g_strsplit ("x,y,", ",", 0), "x", "y", "", NULL));
+ TEST (NULL, strv_check (g_strsplit (",x,y", ",", 0), "", "x", "y", NULL));
+ TEST (NULL, strv_check (g_strsplit (",x,y,", ",", 0), "", "x", "y", "", NULL));
+ TEST (NULL, strv_check (g_strsplit ("x,y,z", ",", 0), "x", "y", "z", NULL));
+ TEST (NULL, strv_check (g_strsplit ("x,y,z,", ",", 0), "x", "y", "z", "", NULL));
+ TEST (NULL, strv_check (g_strsplit (",x,y,z", ",", 0), "", "x", "y", "z", NULL));
+ TEST (NULL, strv_check (g_strsplit (",x,y,z,", ",", 0), "", "x", "y", "z", "", NULL));
+ TEST (NULL, strv_check (g_strsplit (",,x,,y,,z,,", ",", 0), "", "", "x", "", "y", "", "z", "", "", NULL));
+ TEST (NULL, strv_check (g_strsplit (",,x,,y,,z,,", ",,", 0), "", "x", "y", "z", "", NULL));
+
+ TEST (NULL, strv_check (g_strsplit ("", ",", 1), NULL));
+ TEST (NULL, strv_check (g_strsplit ("x", ",", 1), "x", NULL));
+ TEST (NULL, strv_check (g_strsplit ("x,y", ",", 1), "x,y", NULL));
+ TEST (NULL, strv_check (g_strsplit ("x,y,", ",", 1), "x,y,", NULL));
+ TEST (NULL, strv_check (g_strsplit (",x,y", ",", 1), ",x,y", NULL));
+ TEST (NULL, strv_check (g_strsplit (",x,y,", ",", 1), ",x,y,", NULL));
+ TEST (NULL, strv_check (g_strsplit ("x,y,z", ",", 1), "x,y,z", NULL));
+ TEST (NULL, strv_check (g_strsplit ("x,y,z,", ",", 1), "x,y,z,", NULL));
+ TEST (NULL, strv_check (g_strsplit (",x,y,z", ",", 1), ",x,y,z", NULL));
+ TEST (NULL, strv_check (g_strsplit (",x,y,z,", ",", 1), ",x,y,z,", NULL));
+ TEST (NULL, strv_check (g_strsplit (",,x,,y,,z,,", ",", 1), ",,x,,y,,z,,", NULL));
+ TEST (NULL, strv_check (g_strsplit (",,x,,y,,z,,", ",,", 1), ",,x,,y,,z,,", NULL));
+
+ TEST (NULL, strv_check (g_strsplit ("", ",", 2), NULL));
+ TEST (NULL, strv_check (g_strsplit ("x", ",", 2), "x", NULL));
+ TEST (NULL, strv_check (g_strsplit ("x,y", ",", 2), "x", "y", NULL));
+ TEST (NULL, strv_check (g_strsplit ("x,y,", ",", 2), "x", "y,", NULL));
+ TEST (NULL, strv_check (g_strsplit (",x,y", ",", 2), "", "x,y", NULL));
+ TEST (NULL, strv_check (g_strsplit (",x,y,", ",", 2), "", "x,y,", NULL));
+ TEST (NULL, strv_check (g_strsplit ("x,y,z", ",", 2), "x", "y,z", NULL));
+ TEST (NULL, strv_check (g_strsplit ("x,y,z,", ",", 2), "x", "y,z,", NULL));
+ TEST (NULL, strv_check (g_strsplit (",x,y,z", ",", 2), "", "x,y,z", NULL));
+ TEST (NULL, strv_check (g_strsplit (",x,y,z,", ",", 2), "", "x,y,z,", NULL));
+ TEST (NULL, strv_check (g_strsplit (",,x,,y,,z,,", ",", 2), "", ",x,,y,,z,,", NULL));
+ TEST (NULL, strv_check (g_strsplit (",,x,,y,,z,,", ",,", 2), "", "x,,y,,z,,", NULL));
+
+ /* Test g_strsplit_set() */
+ TEST (NULL, strv_check (g_strsplit_set ("", ",/", 0), NULL));
+ TEST (NULL, strv_check (g_strsplit_set (":def/ghi:", ":/", -1), "", "def", "ghi", "", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("abc:def/ghi", ":/", -1), "abc", "def", "ghi", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",;,;,;,;", ",;", -1), "", "", "", "", "", "", "", "", "", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",,abc.def", ".,", -1), "", "", "abc", "def", NULL));
+
+ TEST (NULL, strv_check (g_strsplit_set (",x.y", ",.", 0), "", "x", "y", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (".x,y,", ",.", 0), "", "x", "y", "", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x,y.z", ",.", 0), "x", "y", "z", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x.y,z,", ",.", 0), "x", "y", "z", "", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x.y,z", ",.", 0), "", "x", "y", "z", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x,y,z,", ",.", 0), "", "x", "y", "z", "", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",.x,,y,;z..", ".,;", 0), "", "", "x", "", "y", "", "z", "", "", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",,x,,y,,z,,", ",,", 0), "", "", "x", "", "y", "", "z", "", "", NULL));
+
+ TEST (NULL, strv_check (g_strsplit_set ("x,y.z", ",.", 1), "x,y.z", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x.y,z,", ",.", 1), "x.y,z,", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x,y,z", ",.", 1), ",x,y,z", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x,y.z,", ",.", 1), ",x,y.z,", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",,x,.y,,z,,", ",.", 1), ",,x,.y,,z,,", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",.x,,y,,z,,", ",,..", 1), ",.x,,y,,z,,", NULL));
+
+ TEST (NULL, strv_check (g_strsplit_set ("", ",", 0), NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x", ",", 0), "x", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x,y", ",", 0), "x", "y", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x,y,", ",", 0), "x", "y", "", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x,y", ",", 0), "", "x", "y", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x,y,", ",", 0), "", "x", "y", "", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x,y,z", ",", 0), "x", "y", "z", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x,y,z,", ",", 0), "x", "y", "z", "", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x,y,z", ",", 0), "", "x", "y", "z", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x,y,z,", ",", 0), "", "x", "y", "z", "", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",,x,,y,,z,,", ",", 0), "", "", "x", "", "y", "", "z", "", "", NULL));
+
+ TEST (NULL, strv_check (g_strsplit_set ("", ",", 1), NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x", ",", 1), "x", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x,y", ",", 1), "x,y", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x,y,", ",", 1), "x,y,", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x,y", ",", 1), ",x,y", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x,y,", ",", 1), ",x,y,", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x,y,z", ",", 1), "x,y,z", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x,y,z,", ",", 1), "x,y,z,", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x,y,z", ",", 1), ",x,y,z", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x,y,z,", ",", 1), ",x,y,z,", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",,x,,y,,z,,", ",", 1), ",,x,,y,,z,,", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",,x,,y,,z,,", ",,", 1), ",,x,,y,,z,,", NULL));
+
+ TEST (NULL, strv_check (g_strsplit_set ("", ",", 2), NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x", ",", 2), "x", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x,y", ",", 2), "x", "y", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x,y,", ",", 2), "x", "y,", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x,y", ",", 2), "", "x,y", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x,y,", ",", 2), "", "x,y,", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x,y,z", ",", 2), "x", "y,z", NULL));
+ TEST (NULL, strv_check (g_strsplit_set ("x,y,z,", ",", 2), "x", "y,z,", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x,y,z", ",", 2), "", "x,y,z", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",x,y,z,", ",", 2), "", "x,y,z,", NULL));
+ TEST (NULL, strv_check (g_strsplit_set (",,x,,y,,z,,", ",", 2), "", ",x,,y,,z,,", NULL));
+
+ TEST (NULL, strv_check (g_strsplit_set (",,x,.y,..z,,", ",.", 3), "", "", "x,.y,..z,,", NULL));
+
+
+
+ #define TEST_IS(name) test_is_function (#name, call_g_ascii_##name, call_##name, g_unichar_##name);
+
+ FOR_ALL_CTYPE(TEST_IS)
+
+ #undef TEST_IS
+
+ #define TEST_TO(name) test_to_function (#name, g_ascii_##name, name, g_unichar_##name)
+
+ TEST_TO (tolower);
+ TEST_TO (toupper);
+
+ #undef TEST_TO
+
+ #define TEST_DIGIT(name) test_digit_function (#name, g_ascii_##name##_value, g_unichar_##name##_value)
+
+ TEST_DIGIT (digit);
+ TEST_DIGIT (xdigit);
+
+ #undef TEST_DIGIT
+
+ /* Tests for strchomp () */
+ TEST (NULL, strchomp_check ("", ""));
+ TEST (NULL, strchomp_check (" ", ""));
+ TEST (NULL, strchomp_check (" \t\r\n", ""));
+ TEST (NULL, strchomp_check ("a ", "a"));
+ TEST (NULL, strchomp_check ("a ", "a"));
+ TEST (NULL, strchomp_check ("a a", "a a"));
+ TEST (NULL, strchomp_check ("a a ", "a a"));
+
+ /* Tests for g_build_path, g_build_filename */
+
+ TEST (NULL, str_check (g_build_path ("", NULL), ""));
+ TEST (NULL, str_check (g_build_path ("", "", NULL), ""));
+ TEST (NULL, str_check (g_build_path ("", "x", NULL), "x"));
+ TEST (NULL, str_check (g_build_path ("", "x", "y", NULL), "xy"));
+ TEST (NULL, str_check (g_build_path ("", "x", "y", "z", NULL), "xyz"));
+
+ TEST (NULL, str_check (g_build_path (":", NULL), ""));
+ TEST (NULL, str_check (g_build_path (":", ":", NULL), ":"));
+ TEST (NULL, str_check (g_build_path (":", ":x", NULL), ":x"));
+ TEST (NULL, str_check (g_build_path (":", "x:", NULL), "x:"));
+ TEST (NULL, str_check (g_build_path (":", "", "x", NULL), "x"));
+ TEST (NULL, str_check (g_build_path (":", "", ":x", NULL), ":x"));
+ TEST (NULL, str_check (g_build_path (":", ":", "x", NULL), ":x"));
+ TEST (NULL, str_check (g_build_path (":", "::", "x", NULL), "::x"));
+ TEST (NULL, str_check (g_build_path (":", "x", "", NULL), "x"));
+ TEST (NULL, str_check (g_build_path (":", "x:", "", NULL), "x:"));
+ TEST (NULL, str_check (g_build_path (":", "x", ":", NULL), "x:"));
+ TEST (NULL, str_check (g_build_path (":", "x", "::", NULL), "x::"));
+ TEST (NULL, str_check (g_build_path (":", "x", "y", NULL), "x:y"));
+ TEST (NULL, str_check (g_build_path (":", ":x", "y", NULL), ":x:y"));
+ TEST (NULL, str_check (g_build_path (":", "x", "y:", NULL), "x:y:"));
+ TEST (NULL, str_check (g_build_path (":", ":x:", ":y:", NULL), ":x:y:"));
+ TEST (NULL, str_check (g_build_path (":", ":x::", "::y:", NULL), ":x:y:"));
+ TEST (NULL, str_check (g_build_path (":", "x", "","y", NULL), "x:y"));
+ TEST (NULL, str_check (g_build_path (":", "x", ":", "y", NULL), "x:y"));
+ TEST (NULL, str_check (g_build_path (":", "x", "::", "y", NULL), "x:y"));
+ TEST (NULL, str_check (g_build_path (":", "x", "y", "z", NULL), "x:y:z"));
+ TEST (NULL, str_check (g_build_path (":", ":x:", ":y:", ":z:", NULL), ":x:y:z:"));
+ TEST (NULL, str_check (g_build_path (":", "::x::", "::y::", "::z::", NULL), "::x:y:z::"));
+
+ TEST (NULL, str_check (g_build_path ("::", NULL), ""));
+ TEST (NULL, str_check (g_build_path ("::", "::", NULL), "::"));
+ TEST (NULL, str_check (g_build_path ("::", ":::", NULL), ":::"));
+ TEST (NULL, str_check (g_build_path ("::", "::x", NULL), "::x"));
+ TEST (NULL, str_check (g_build_path ("::", "x::", NULL), "x::"));
+ TEST (NULL, str_check (g_build_path ("::", "", "x", NULL), "x"));
+ TEST (NULL, str_check (g_build_path ("::", "", "::x", NULL), "::x"));
+ TEST (NULL, str_check (g_build_path ("::", "::", "x", NULL), "::x"));
+ TEST (NULL, str_check (g_build_path ("::", "::::", "x", NULL), "::::x"));
+ TEST (NULL, str_check (g_build_path ("::", "x", "", NULL), "x"));
+ TEST (NULL, str_check (g_build_path ("::", "x::", "", NULL), "x::"));
+ TEST (NULL, str_check (g_build_path ("::", "x", "::", NULL), "x::"));
+ /* This following is weird, but keeps the definition simple */
+ TEST (NULL, str_check (g_build_path ("::", "x", ":::", NULL), "x:::::"));
+ TEST (NULL, str_check (g_build_path ("::", "x", "::::", NULL), "x::::"));
+ TEST (NULL, str_check (g_build_path ("::", "x", "y", NULL), "x::y"));
+ TEST (NULL, str_check (g_build_path ("::", "::x", "y", NULL), "::x::y"));
+ TEST (NULL, str_check (g_build_path ("::", "x", "y::", NULL), "x::y::"));
+ TEST (NULL, str_check (g_build_path ("::", "::x::", "::y::", NULL), "::x::y::"));
+ TEST (NULL, str_check (g_build_path ("::", "::x:::", ":::y::", NULL), "::x::::y::"));
+ TEST (NULL, str_check (g_build_path ("::", "::x::::", "::::y::", NULL), "::x::y::"));
+ TEST (NULL, str_check (g_build_path ("::", "x", "", "y", NULL), "x::y"));
+ TEST (NULL, str_check (g_build_path ("::", "x", "::", "y", NULL), "x::y"));
+ TEST (NULL, str_check (g_build_path ("::", "x", "::::", "y", NULL), "x::y"));
+ TEST (NULL, str_check (g_build_path ("::", "x", "y", "z", NULL), "x::y::z"));
+ TEST (NULL, str_check (g_build_path ("::", "::x::", "::y::", "::z::", NULL), "::x::y::z::"));
+ TEST (NULL, str_check (g_build_path ("::", ":::x:::", ":::y:::", ":::z:::", NULL), ":::x::::y::::z:::"));
+ TEST (NULL, str_check (g_build_path ("::", "::::x::::", "::::y::::", "::::z::::", NULL), "::::x::y::z::::"));
+
+ args[0] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("", args), ""));
+ args[0] = ""; args[1] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("", args), ""));
+ args[0] = "x"; args[1] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("", args), "x"));
+ args[0] = "x"; args[1] = "y"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("", args), "xy"));
+ args[0] = "x"; args[1] = "y"; args[2] = "z", args[3] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("", args), "xyz"));
+
+ args[0] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), ""));
+ args[0] = ":"; args[1] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), ":"));
+ args[0] = ":x"; args[1] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), ":x"));
+ args[0] = "x:"; args[1] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), "x:"));
+ args[0] = ""; args[1] = "x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), "x"));
+ args[0] = ""; args[1] = ":x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), ":x"));
+ args[0] = ":"; args[1] = "x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), ":x"));
+ args[0] = "::"; args[1] = "x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), "::x"));
+ args[0] = "x"; args[1] = ""; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), "x"));
+ args[0] = "x:"; args[1] = ""; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), "x:"));
+ args[0] = "x"; args[1] = ":"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), "x:"));
+ args[0] = "x"; args[1] = "::"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), "x::"));
+ args[0] = "x"; args[1] = "y"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), "x:y"));
+ args[0] = ":x"; args[1] = "y"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), ":x:y"));
+ args[0] = "x"; args[1] = "y:"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), "x:y:"));
+ args[0] = ":x:"; args[1] = ":y:"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), ":x:y:"));
+ args[0] = ":x::"; args[1] = "::y:"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), ":x:y:"));
+ args[0] = "x"; args[1] = ""; args[2] = "y"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), "x:y"));
+ args[0] = "x"; args[1] = ":"; args[2] = "y"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), "x:y"));
+ args[0] = "x"; args[1] = "::"; args[2] = "y"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), "x:y"));
+ args[0] = "x"; args[1] = "y"; args[2] = "z"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), "x:y:z"));
+ args[0] = ":x:"; args[1] = ":y:"; args[2] = ":z:"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), ":x:y:z:"));
+ args[0] = "::x::"; args[1] = "::y::"; args[2] = "::z::"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_pathv (":", args), "::x:y:z::"));
+
+ args[0] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), ""));
+ args[0] = "::"; args[1] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "::"));
+ args[0] = ":::"; args[1] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), ":::"));
+ args[0] = "::x"; args[1] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "::x"));
+ args[0] = "x::"; args[1] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "x::"));
+ args[0] = ""; args[1] = "x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "x"));
+ args[0] = ""; args[1] = "::x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "::x"));
+ args[0] = "::"; args[1] = "x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "::x"));
+ args[0] = "::::"; args[1] = "x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "::::x"));
+ args[0] = "x"; args[1] = ""; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "x"));
+ args[0] = "x::"; args[1] = ""; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "x::"));
+ args[0] = "x"; args[1] = "::"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "x::"));
+ /* This following is weird, but keeps the definition simple */
+ args[0] = "x"; args[1] = ":::"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "x:::::"));
+ args[0] = "x"; args[1] = "::::"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "x::::"));
+ args[0] = "x"; args[1] = "y"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "x::y"));
+ args[0] = "::x"; args[1] = "y"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "::x::y"));
+ args[0] = "x"; args[1] = "y::"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "x::y::"));
+ args[0] = "::x::"; args[1] = "::y::"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "::x::y::"));
+ args[0] = "::x:::"; args[1] = ":::y::"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "::x::::y::"));
+ args[0] = "::x::::"; args[1] = "::::y::"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "::x::y::"));
+ args[0] = "x"; args[1] = ""; args[2] = "y"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "x::y"));
+ args[0] = "x"; args[1] = "::"; args[2] = "y"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "x::y"));
+ args[0] = "x"; args[1] = "::::"; args[2] = "y"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "x::y"));
+ args[0] = "x"; args[1] = "y"; args[2] = "z"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "x::y::z"));
+ args[0] = "::x::"; args[1] = "::y::"; args[2] = "::z::"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "::x::y::z::"));
+ args[0] = ":::x:::"; args[1] = ":::y:::"; args[2] = ":::z:::"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), ":::x::::y::::z:::"));
+ args[0] = "::::x::::"; args[1] = "::::y::::"; args[2] = "::::z::::"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_pathv ("::", args), "::::x::y::z::::"));
+
+#define S G_DIR_SEPARATOR_S
+
+ TEST (NULL, str_check (g_build_filename (NULL), ""));
+ TEST (NULL, str_check (g_build_filename (S, NULL), S));
+ TEST (NULL, str_check (g_build_filename (S"x", NULL), S"x"));
+ TEST (NULL, str_check (g_build_filename ("x"S, NULL), "x"S));
+ TEST (NULL, str_check (g_build_filename ("", "x", NULL), "x"));
+ TEST (NULL, str_check (g_build_filename ("", S"x", NULL), S"x"));
+ TEST (NULL, str_check (g_build_filename (S, "x", NULL), S"x"));
+ TEST (NULL, str_check (g_build_filename (S S, "x", NULL), S S"x"));
+ TEST (NULL, str_check (g_build_filename ("x", "", NULL), "x"));
+ TEST (NULL, str_check (g_build_filename ("x"S, "", NULL), "x"S));
+ TEST (NULL, str_check (g_build_filename ("x", S, NULL), "x"S));
+ TEST (NULL, str_check (g_build_filename ("x", S S, NULL), "x"S S));
+ TEST (NULL, str_check (g_build_filename ("x", "y", NULL), "x"S"y"));
+ TEST (NULL, str_check (g_build_filename (S"x", "y", NULL), S"x"S"y"));
+ TEST (NULL, str_check (g_build_filename ("x", "y"S, NULL), "x"S"y"S));
+ TEST (NULL, str_check (g_build_filename (S"x"S, S"y"S, NULL), S"x"S"y"S));
+ TEST (NULL, str_check (g_build_filename (S"x"S S, S S"y"S, NULL), S"x"S"y"S));
+ TEST (NULL, str_check (g_build_filename ("x", "", "y", NULL), "x"S"y"));
+ TEST (NULL, str_check (g_build_filename ("x", S, "y", NULL), "x"S"y"));
+ TEST (NULL, str_check (g_build_filename ("x", S S, "y", NULL), "x"S"y"));
+ TEST (NULL, str_check (g_build_filename ("x", "y", "z", NULL), "x"S"y"S"z"));
+ TEST (NULL, str_check (g_build_filename (S"x"S, S"y"S, S"z"S, NULL), S"x"S"y"S"z"S));
+ TEST (NULL, str_check (g_build_filename (S S"x"S S, S S"y"S S, S S"z"S S, NULL), S S"x"S"y"S"z"S S));
+
+ args[0] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), ""));
+ args[0] = S; args[1] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), S));
+ args[0] = S"x"; args[1] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), S"x"));
+ args[0] = "x"S; args[1] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"S));
+ args[0] = ""; args[1] = "x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"));
+ args[0] = ""; args[1] = S"x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), S"x"));
+ args[0] = S; args[1] = "x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), S"x"));
+ args[0] = S S; args[1] = "x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), S S"x"));
+ args[0] = "x"; args[1] = ""; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"));
+ args[0] = "x"S; args[1] = ""; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"S));
+ args[0] = "x"; args[1] = S; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"S));
+ args[0] = "x"; args[1] = S S; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"S S));
+ args[0] = "x"; args[1] = "y"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"S"y"));
+ args[0] = S"x"; args[1] = "y"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), S"x"S"y"));
+ args[0] = "x"; args[1] = "y"S; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"S"y"S));
+ args[0] = S"x"S; args[1] = S"y"S; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), S"x"S"y"S));
+ args[0] = S"x"S S; args[1] = S S"y"S; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), S"x"S"y"S));
+ args[0] = "x"; args[1] = ""; args[2] = "y"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"S"y"));
+ args[0] = "x"; args[1] = S; args[2] = "y"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"S"y"));
+ args[0] = "x"; args[1] = S S; args[2] = "y"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"S"y"));
+ args[0] = "x"; args[1] = "y"; args[2] = "z"; args[3] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"S"y"S"z"));
+ args[0] = S"x"S; args[1] = S"y"S; args[2] = S"z"S; args[3] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), S"x"S"y"S"z"S));
+ args[0] = S S"x"S S; args[1] = S S"y"S S; args[2] = S S"z"S S; args[3] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), S S"x"S"y"S"z"S S));
+
+#ifdef G_OS_WIN32
+
+ /* Test also using the slash as file name separator */
+#define U "/"
+ TEST (NULL, str_check (g_build_filename (NULL), ""));
+ TEST (NULL, str_check (g_build_filename (U, NULL), U));
+ TEST (NULL, str_check (g_build_filename (U"x", NULL), U"x"));
+ TEST (NULL, str_check (g_build_filename ("x"U, NULL), "x"U));
+ TEST (NULL, str_check (g_build_filename ("", U"x", NULL), U"x"));
+ TEST (NULL, str_check (g_build_filename ("", U"x", NULL), U"x"));
+ TEST (NULL, str_check (g_build_filename (U, "x", NULL), U"x"));
+ TEST (NULL, str_check (g_build_filename (U U, "x", NULL), U U"x"));
+ TEST (NULL, str_check (g_build_filename (U S, "x", NULL), U S"x"));
+ TEST (NULL, str_check (g_build_filename ("x"U, "", NULL), "x"U));
+ TEST (NULL, str_check (g_build_filename ("x"S"y", "z"U"a", NULL), "x"S"y"S"z"U"a"));
+ TEST (NULL, str_check (g_build_filename ("x", U, NULL), "x"U));
+ TEST (NULL, str_check (g_build_filename ("x", U U, NULL), "x"U U));
+ TEST (NULL, str_check (g_build_filename ("x", S U, NULL), "x"S U));
+ TEST (NULL, str_check (g_build_filename (U"x", "y", NULL), U"x"U"y"));
+ TEST (NULL, str_check (g_build_filename ("x", "y"U, NULL), "x"U"y"U));
+ TEST (NULL, str_check (g_build_filename (U"x"U, U"y"U, NULL), U"x"U"y"U));
+ TEST (NULL, str_check (g_build_filename (U"x"U U, U U"y"U, NULL), U"x"U"y"U));
+ TEST (NULL, str_check (g_build_filename ("x", U, "y", NULL), "x"U"y"));
+ TEST (NULL, str_check (g_build_filename ("x", U U, "y", NULL), "x"U"y"));
+ TEST (NULL, str_check (g_build_filename ("x", U S, "y", NULL), "x"S"y"));
+ TEST (NULL, str_check (g_build_filename ("x", S U, "y", NULL), "x"U"y"));
+ TEST (NULL, str_check (g_build_filename ("x", U "y", "z", NULL), "x"U"y"U"z"));
+ TEST (NULL, str_check (g_build_filename ("x", S "y", "z", NULL), "x"S"y"S"z"));
+ TEST (NULL, str_check (g_build_filename ("x", S "y", "z", U, "a", "b", NULL), "x"S"y"S"z"U"a"U"b"));
+ TEST (NULL, str_check (g_build_filename (U"x"U, U"y"U, U"z"U, NULL), U"x"U"y"U"z"U));
+ TEST (NULL, str_check (g_build_filename (U U"x"U U, U U"y"U U, U U"z"U U, NULL), U U"x"U"y"U"z"U U));
+
+ args[0] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), ""));
+ args[0] = U; args[1] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), U));
+ args[0] = U"x"; args[1] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), U"x"));
+ args[0] = "x"U; args[1] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"U));
+ args[0] = ""; args[1] = U"x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), U"x"));
+ args[0] = ""; args[1] = U"x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), U"x"));
+ args[0] = U; args[1] = "x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), U"x"));
+ args[0] = U U; args[1] = "x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), U U"x"));
+ args[0] = U S; args[1] = "x"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), U S"x"));
+ args[0] = "x"U; args[1] = ""; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"U));
+ args[0] = "x"S"y"; args[1] = "z"U"a"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"S"y"S"z"U"a"));
+ args[0] = "x"; args[1] = U; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"U));
+ args[0] = "x"; args[1] = U U; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"U U));
+ args[0] = "x"; args[1] = S U; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"S U));
+ args[0] = U"x"; args[1] = "y"; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), U"x"U"y"));
+ args[0] = "x"; args[1] = "y"U; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"U"y"U));
+ args[0] = U"x"U; args[1] = U"y"U; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), U"x"U"y"U));
+ args[0] = U"x"U U; args[1] = U U"y"U; args[2] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), U"x"U"y"U));
+ args[0] = "x"; args[1] = U; args[2] = "y", args[3] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"U"y"));
+ args[0] = "x"; args[1] = U U; args[2] = "y", args[3] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"U"y"));
+ args[0] = "x"; args[1] = U S; args[2] = "y", args[3] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"S"y"));
+ args[0] = "x"; args[1] = S U; args[2] = "y", args[3] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"U"y"));
+ args[0] = "x"; args[1] = U "y"; args[2] = "z", args[3] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"U"y"U"z"));
+ args[0] = "x"; args[1] = S "y"; args[2] = "z", args[3] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"S"y"S"z"));
+ args[0] = "x"; args[1] = S "y"; args[2] = "z", args[3] = U;
+ args[4] = "a"; args[5] = "b"; args[6] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), "x"S"y"S"z"U"a"U"b"));
+ args[0] = U"x"U; args[1] = U"y"U; args[2] = U"z"U, args[3] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), U"x"U"y"U"z"U));
+ args[0] = U U"x"U U; args[1] = U U"y"U U; args[2] = U U"z"U U, args[3] = NULL;
+ TEST (NULL, str_check (g_build_filenamev (args), U U"x"U"y"U"z"U U));
+#endif /* G_OS_WIN32 */
+
+#undef S
+
+ {
+ gchar buf[5];
+
+ TEST (NULL, 3 == g_snprintf (buf, 0, "%s", "abc"));
+ TEST (NULL, 3 == g_snprintf (NULL,0, "%s", "abc"));
+ TEST (NULL, 3 == g_snprintf (buf, 5, "%s", "abc"));
+ TEST (NULL, 4 == g_snprintf (buf, 5, "%s", "abcd"));
+ TEST (NULL, 9 == g_snprintf (buf, 5, "%s", "abcdefghi"));
+ }
+
+ TEST (NULL, g_strv_length (g_strsplit ("1,2,3,4", ",", -1)) == 4);
+
+ return any_failed;
+}
diff --git a/trunk/tests/string-test.c b/trunk/tests/string-test.c
new file mode 100644
index 000000000..4ba7fc218
--- /dev/null
+++ b/trunk/tests/string-test.c
@@ -0,0 +1,309 @@
+/* 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <stdio.h>
+#include <string.h>
+#include "glib.h"
+#include "glib/gprintf.h"
+
+int array[10000];
+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"
+
+typedef struct {
+ guint age;
+ gchar name[40];
+} GlibTestInfo;
+
+int
+main (int argc,
+ char *argv[])
+{
+ GStringChunk *string_chunk;
+
+ gchar *tmp_string = NULL, *tmp_string_2;
+ gint i;
+ GString *string1, *string2;
+
+ 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);
+
+ string1 = g_string_new ("hi pete!");
+ string2 = g_string_new (NULL);
+
+ g_assert (string1 != NULL);
+ g_assert (string2 != NULL);
+ g_assert (strlen (string1->str) == string1->len);
+ g_assert (strlen (string2->str) == string2->len);
+ g_assert (string2->len == 0);
+ g_assert (strcmp ("hi pete!", string1->str) == 0);
+ g_assert (strcmp ("", string2->str) == 0);
+
+ for (i = 0; i < 10000; i++)
+ g_string_append_c (string1, 'a'+(i%26));
+
+ g_assert((strlen("hi pete!") + 10000) == string1->len);
+ g_assert((strlen("hi pete!") + 10000) == strlen(string1->str));
+
+#ifndef G_OS_WIN32
+ /* MSVC and mingw32 use the same run-time C library, which doesn't like
+ the %10000.10000f format... */
+ g_string_printf (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_printf (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_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);
+
+ /* insert_len with string overlap */
+ string1 = g_string_new ("textbeforetextafter");
+ g_string_insert_len (string1, 10, string1->str + 8, 5);
+ g_assert (strcmp (string1->str, "textbeforeretextextafter") == 0);
+ g_string_free (string1, TRUE);
+
+ string1 = g_string_new ("boring text");
+ g_string_insert_len (string1, 7, string1->str + 2, 4);
+ g_assert (strcmp (string1->str, "boring ringtext") == 0);
+ g_string_free (string1, TRUE);
+
+ string1 = g_string_new ("boring text");
+ g_string_insert_len (string1, 6, string1->str + 7, 4);
+ g_assert (strcmp (string1->str, "boringtext text") == 0);
+ g_string_free (string1, TRUE);
+
+ /* assign_len with string overlap */
+ string1 = g_string_new ("textbeforetextafter");
+ g_string_assign (string1, string1->str + 10);
+ g_assert (strcmp (string1->str, "textafter") == 0);
+ g_string_free (string1, TRUE);
+
+ string1 = g_string_new ("boring text");
+ g_string_assign (string1, string1->str);
+ g_assert (strcmp (string1->str, "boring text") == 0);
+ g_string_free (string1, TRUE);
+
+ /* insert_unichar with insertion in middle */
+ string1 = g_string_new ("firsthalf");
+ g_string_insert_unichar (string1, 5, 0x0041);
+ g_assert (strcmp (string1->str, "first\x41half") == 0);
+ g_string_free (string1, TRUE);
+
+ string1 = g_string_new ("firsthalf");
+ g_string_insert_unichar (string1, 5, 0x0298);
+ g_assert (strcmp (string1->str, "first\xCA\x98half") == 0);
+ g_string_free (string1, TRUE);
+
+ string1 = g_string_new ("firsthalf");
+ g_string_insert_unichar (string1, 5, 0xFFFD);
+ g_assert (strcmp (string1->str, "first\xEF\xBF\xBDhalf") == 0);
+ g_string_free (string1, TRUE);
+
+ string1 = g_string_new ("firsthalf");
+ g_string_insert_unichar (string1, 5, 0x1D100);
+ g_assert (strcmp (string1->str, "first\xF0\x9D\x84\x80half") == 0);
+ g_string_free (string1, TRUE);
+
+ /* insert_unichar with insertion at end */
+ string1 = g_string_new ("start");
+ g_string_insert_unichar (string1, -1, 0x0041);
+ g_assert (strcmp (string1->str, "start\x41") == 0);
+ g_string_free (string1, TRUE);
+
+ string1 = g_string_new ("start");
+ g_string_insert_unichar (string1, -1, 0x0298);
+ g_assert (strcmp (string1->str, "start\xCA\x98") == 0);
+ g_string_free (string1, TRUE);
+
+ string1 = g_string_new ("start");
+ g_string_insert_unichar (string1, -1, 0xFFFD);
+ g_assert (strcmp (string1->str, "start\xEF\xBF\xBD") == 0);
+ g_string_free (string1, TRUE);
+
+ string1 = g_string_new ("start");
+ g_string_insert_unichar (string1, -1, 0x1D100);
+ g_assert (strcmp (string1->str, "start\xF0\x9D\x84\x80") == 0);
+ g_string_free (string1, TRUE);
+
+ /* 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_printf (string1, "fiddle%cxyzzy", '\0');
+ g_assert (string1->len == 12);
+ g_assert (memcmp (string1->str, "fiddle\0xyzzy", 13) == 0);
+
+ g_string_free (string1, TRUE);
+ g_string_free (string2, TRUE);
+
+ g_assert (g_str_has_prefix("foobar", "gazonk") == FALSE);
+ g_assert (g_str_has_prefix("xyzzy", "xyzzy") == TRUE);
+ g_assert (g_str_has_prefix("xyzzy", "xy") == TRUE);
+ g_assert (g_str_has_prefix("xyzzy", "") == TRUE);
+ g_assert (g_str_has_prefix("xyz", "xyzzy") == FALSE);
+ g_assert (g_str_has_prefix("", "xyzzy") == FALSE);
+ g_assert (g_str_has_prefix("", "") == TRUE);
+
+ g_assert (g_str_has_suffix("foobar", "gazonk") == FALSE);
+ g_assert (g_str_has_suffix("xyzzy", "xyzzy") == TRUE);
+ g_assert (g_str_has_suffix("xyzzy", "zy") == TRUE);
+ g_assert (g_str_has_suffix("xyzzy", "") == TRUE);
+ g_assert (g_str_has_suffix("zzy", "xyzzy") == FALSE);
+ g_assert (g_str_has_suffix("", "xyzzy") == FALSE);
+ g_assert (g_str_has_suffix("", "") == TRUE);
+
+ tmp_string = (gchar *) g_malloc (10);
+ g_snprintf (tmp_string, 10, "%2$s %1$s", "a", "b");
+ g_assert (strcmp (tmp_string, "b a") == 0);
+ g_free (tmp_string);
+
+ return 0;
+}
+
+
diff --git a/trunk/tests/strtod-test.c b/trunk/tests/strtod-test.c
new file mode 100644
index 000000000..8da7f377b
--- /dev/null
+++ b/trunk/tests/strtod-test.c
@@ -0,0 +1,146 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+/* for NAN and INFINITY */
+#define _ISOC99_SOURCE
+
+#include <glib.h>
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+
+static char *locales[] = {"sv_SE", "en_US", "fa_IR", "C", "ru_RU"};
+
+void
+test_string (char *number, double res, gboolean check_end, int correct_len)
+{
+ double d;
+ int l;
+ char *dummy;
+
+ /* we try a copy of number, with some free space for malloc before that.
+ * This is supposed to smash the some wrong pointer calculations. */
+
+ dummy = g_malloc (100000);
+ number = g_strdup (number);
+ g_free (dummy);
+
+ for (l = 0; l < G_N_ELEMENTS (locales); l++)
+ {
+ gboolean ok;
+ char *end = "(unset)";
+
+ setlocale (LC_NUMERIC, locales[l]);
+ d = g_ascii_strtod (number, &end);
+ ok = isnan (res) ? isnan (d) : (d == res);
+ if (!ok)
+ {
+ g_print ("g_ascii_strtod on \"%s\" for locale %s failed\n", number, locales[l]);
+ g_print ("expected %f (nan %d) actual %f (nan %d)\n",
+ res, isnan (res),
+ d, isnan (d));
+ }
+
+ ok = (end - number) == (check_end ? correct_len : strlen (number));
+ if (!ok) {
+ if (end == NULL)
+ g_print ("g_ascii_strtod on \"%s\" for locale %s endptr was NULL\n",
+ number, locales[l]);
+ else if (end >= number && end <= number + strlen (number))
+ g_print ("g_ascii_strtod on \"%s\" for locale %s endptr was wrong, leftover: \"%s\"\n",
+ number, locales[l], end);
+ else
+ g_print ("g_ascii_strtod on \"%s\" for locale %s endptr was REALLY wrong (number=%p, end=%p)\n",
+ number, locales[l], number, end);
+ }
+ }
+
+ g_free (number);
+}
+
+
+static void
+test_number (gdouble num, gchar *fmt, gchar *str)
+{
+ int l;
+ gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
+
+ for (l = 0; l < G_N_ELEMENTS (locales); l++)
+ {
+ g_ascii_formatd (buf, G_ASCII_DTOSTR_BUF_SIZE, fmt, num);
+ g_assert (strcmp (buf, str) == 0);
+ }
+}
+
+int
+main ()
+{
+ gdouble d, our_nan, our_inf;
+ char buffer[G_ASCII_DTOSTR_BUF_SIZE];
+
+#ifdef NAN
+ our_nan = NAN;
+#else
+ /* Do this before any call to setlocale. */
+ our_nan = atof ("NaN");
+#endif
+ g_assert (isnan (our_nan));
+
+#ifdef INFINITY
+ our_inf = INFINITY;
+#else
+ our_inf = atof ("Infinity");
+#endif
+ g_assert (our_inf > 1 && our_inf == our_inf / 2);
+
+ test_string ("123.123", 123.123, FALSE, 0);
+ test_string ("123.123e2", 123.123e2, FALSE, 0);
+ test_string ("123.123e-2", 123.123e-2, FALSE, 0);
+ test_string ("-123.123", -123.123, FALSE, 0);
+ test_string ("-123.123e2", -123.123e2, FALSE, 0);
+ test_string ("-123.123e-2", -123.123e-2, FALSE, 0);
+ test_string ("5.4", 5.4, TRUE, 3);
+ test_string ("5.4,5.5", 5.4, TRUE, 3);
+ test_string ("5,4", 5.0, TRUE, 1);
+ /* the following are for #156421 */
+ test_string ("1e1", 1e1, FALSE, 0);
+ test_string ("NAN", our_nan, FALSE, 0);
+ test_string ("-nan", -our_nan, FALSE, 0);
+ test_string ("INF", our_inf, FALSE, 0);
+ test_string ("-infinity", -our_inf, FALSE, 0);
+ test_string ("-.75,0", -0.75, TRUE, 4);
+
+ d = 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0;
+ g_assert (d == g_ascii_strtod (g_ascii_dtostr (buffer, sizeof (buffer), d), NULL));
+
+ d = -179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0;
+ g_assert (d == g_ascii_strtod (g_ascii_dtostr (buffer, sizeof (buffer), d), NULL));
+
+ d = pow (2.0, -1024.1);
+ g_assert (d == g_ascii_strtod (g_ascii_dtostr (buffer, sizeof (buffer), d), NULL));
+
+ d = -pow (2.0, -1024.1);
+ g_assert (d == g_ascii_strtod (g_ascii_dtostr (buffer, sizeof (buffer), d), NULL));
+
+ /* for #343899 */
+ test_string (" 0.75", 0.75, FALSE, 0);
+ test_string (" +0.75", 0.75, FALSE, 0);
+ test_string (" -0.75", -0.75, FALSE, 0);
+ test_string ("\f0.75", 0.75, FALSE, 0);
+ test_string ("\n0.75", 0.75, FALSE, 0);
+ test_string ("\r0.75", 0.75, FALSE, 0);
+ test_string ("\t0.75", 0.75, FALSE, 0);
+#if 0
+ /* g_ascii_isspace() returns FALSE for vertical tab, see #59388 */
+ test_string ("\v0.75", 0.75, FALSE, 0);
+#endif
+
+ /* for #343899 */
+ test_number (0.75, "%0.2f", "0.75");
+ test_number (0.75, "%5.2f", " 0.75");
+ test_number (-0.75, "%0.2f", "-0.75");
+ test_number (-0.75, "%5.2f", "-0.75");
+ test_number (1e99, "%.0e", "1e+99");
+ return 0;
+}
diff --git a/trunk/tests/strtoll-test.c b/trunk/tests/strtoll-test.c
new file mode 100644
index 000000000..43005d59d
--- /dev/null
+++ b/trunk/tests/strtoll-test.c
@@ -0,0 +1,71 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <errno.h>
+#include <string.h>
+#include <glib.h>
+
+
+static void
+test_uint64 (const gchar *str,
+ const gchar *end,
+ gint base,
+ guint64 result,
+ gint error)
+{
+ guint64 actual;
+ gchar *endptr = NULL;
+ gint err;
+
+ errno = 0;
+ actual = g_ascii_strtoull (str, &endptr, base);
+ err = errno;
+
+ g_assert (actual == result);
+ g_assert (strcmp (end, endptr) == 0);
+ g_assert (err == error);
+}
+
+static void
+test_int64 (const gchar *str,
+ const gchar *end,
+ gint base,
+ gint64 result,
+ gint error)
+{
+ gint64 actual;
+ gchar *endptr = NULL;
+ gint err;
+
+ errno = 0;
+ actual = g_ascii_strtoll (str, &endptr, base);
+ err = errno;
+
+ g_assert (actual == result);
+ g_assert (strcmp (end, endptr) == 0);
+ g_assert (err == error);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_uint64 ("0", "", 10, 0, 0);
+ test_uint64 ("+0", "", 10, 0, 0);
+ test_uint64 ("-0", "", 10, 0, 0);
+ test_uint64 ("18446744073709551615", "", 10, G_MAXUINT64, 0);
+ test_uint64 ("18446744073709551616", "", 10, G_MAXUINT64, ERANGE);
+ test_uint64 ("20xyz", "xyz", 10, 20, 0);
+ test_uint64 ("-1", "", 10, G_MAXUINT64, 0);
+
+ test_int64 ("0", "", 10, 0, 0);
+ test_int64 ("9223372036854775807", "", 10, G_MAXINT64, 0);
+ test_int64 ("9223372036854775808", "", 10, G_MAXINT64, ERANGE);
+ test_int64 ("-9223372036854775808", "", 10, G_MININT64, 0);
+ test_int64 ("-9223372036854775809", "", 10, G_MININT64, ERANGE);
+ test_int64 ("32768", "", 10, 32768, 0);
+ test_int64 ("-32768", "", 10, -32768, 0);
+ test_int64 ("001", "", 10, 1, 0);
+ test_int64 ("-001", "", 10, -1, 0);
+
+ return 0;
+}
diff --git a/trunk/tests/testgdate.c b/trunk/tests/testgdate.c
new file mode 100644
index 000000000..85d22dce2
--- /dev/null
+++ b/trunk/tests/testgdate.c
@@ -0,0 +1,506 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#ifdef GLIB_COMPILATION
+#undef GLIB_COMPILATION
+#endif
+
+#include "glib.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <locale.h>
+#include <time.h>
+
+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);
+ guint iso8601_week_of_year = 0;
+
+ 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);
+ if ((m == G_DATE_JANUARY && day <= 4) ||
+ (m == G_DATE_DECEMBER && day >= 29)) {
+ TEST("ISO 8601 week of year on Monday Dec 29 - Jan 4 is 1",
+ (g_date_get_iso8601_week_of_year(d) == 1));
+ } else {
+ TEST("ISO 8601 week of year on Monday 1 more than previous day's week of year",
+ (g_date_get_iso8601_week_of_year(d) - iso8601_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);
+ if (!(day == 1 && m == G_DATE_JANUARY)) {
+ TEST("ISO 8601 week of year on non-Monday 0 more than previous day's week of year (",
+ (g_date_get_iso8601_week_of_year(d) - iso8601_week_of_year) == 0);
+ }
+ }
+
+
+ monday_week_of_year = g_date_get_monday_week_of_year(d);
+ iso8601_week_of_year = g_date_get_iso8601_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/trunk/tests/testgdateparser.c b/trunk/tests/testgdateparser.c
new file mode 100644
index 000000000..f0e284a2b
--- /dev/null
+++ b/trunk/tests/testgdateparser.c
@@ -0,0 +1,115 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#ifdef GLIB_COMPILATION
+#undef GLIB_COMPILATION
+#endif
+
+#include "glib.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <locale.h>
+
+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/trunk/tests/testglib.c b/trunk/tests/testglib.c
new file mode 100644
index 000000000..9105321fb
--- /dev/null
+++ b/trunk/tests/testglib.c
@@ -0,0 +1,1562 @@
+/* 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_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#ifdef GLIB_COMPILATION
+#undef GLIB_COMPILATION
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#include "glib.h"
+#include "gstdio.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef G_OS_WIN32
+#include <io.h> /* For read(), write() etc */
+#endif
+
+static int array[10000];
+static gboolean failed = FALSE;
+
+/* We write (m ? m : "") even in the m != NULL case to suppress a warning with GCC-3.1
+ */
+#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 ? 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;
+}
+
+static gboolean
+find_first_that(gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ gint *v = value;
+ gint *test = user_data;
+ return (*v == *test);
+}
+
+
+static gboolean
+test_g_mkdir_with_parents_1 (const gchar *base)
+{
+ char *p0 = g_build_filename (base, "fum", NULL);
+ char *p1 = g_build_filename (p0, "tem", NULL);
+ char *p2 = g_build_filename (p1, "zap", NULL);
+ FILE *f;
+
+ g_remove (p2);
+ g_remove (p1);
+ g_remove (p0);
+
+ if (g_file_test (p0, G_FILE_TEST_EXISTS))
+ {
+ g_print ("failed, %s exists, cannot test g_mkdir_with_parents\n", p0);
+ return FALSE;
+ }
+
+ if (g_file_test (p1, G_FILE_TEST_EXISTS))
+ {
+ g_print ("failed, %s exists, cannot test g_mkdir_with_parents\n", p1);
+ return FALSE;
+ }
+
+ if (g_file_test (p2, G_FILE_TEST_EXISTS))
+ {
+ g_print ("failed, %s exists, cannot test g_mkdir_with_parents\n", p2);
+ return FALSE;
+ }
+
+ if (g_mkdir_with_parents (p2, 0666) == -1)
+ {
+ g_print ("failed, g_mkdir_with_parents(%s) failed: %s\n", p2, g_strerror (errno));
+ return FALSE;
+ }
+
+ if (!g_file_test (p2, G_FILE_TEST_IS_DIR))
+ {
+ g_print ("failed, g_mkdir_with_parents(%s) succeeded, but %s is not a directory\n", p2, p2);
+ return FALSE;
+ }
+
+ if (!g_file_test (p1, G_FILE_TEST_IS_DIR))
+ {
+ g_print ("failed, g_mkdir_with_parents(%s) succeeded, but %s is not a directory\n", p2, p1);
+ return FALSE;
+ }
+
+ if (!g_file_test (p0, G_FILE_TEST_IS_DIR))
+ {
+ g_print ("failed, g_mkdir_with_parents(%s) succeeded, but %s is not a directory\n", p2, p0);
+ return FALSE;
+ }
+
+ g_rmdir (p2);
+ if (g_file_test (p2, G_FILE_TEST_EXISTS))
+ {
+ g_print ("failed, did g_rmdir(%s), but %s is still there\n", p2, p2);
+ return FALSE;
+ }
+
+ g_rmdir (p1);
+ if (g_file_test (p1, G_FILE_TEST_EXISTS))
+ {
+ g_print ("failed, did g_rmdir(%s), but %s is still there\n", p1, p1);
+ return FALSE;
+ }
+
+ f = g_fopen (p1, "w");
+ if (f == NULL)
+ {
+ g_print ("failed, couldn't create file %s\n", p1);
+ return FALSE;
+ }
+ fclose (f);
+
+ if (g_mkdir_with_parents (p1, 0666) == 0)
+ {
+ g_print ("failed, g_mkdir_with_parents(%s) succeeded, even if %s is a file\n", p1, p1);
+ return FALSE;
+ }
+
+ if (g_mkdir_with_parents (p2, 0666) == 0)
+ {
+ g_print ("failed, g_mkdir_with_parents(%s) succeeded, even if %s is a file\n", p2, p1);
+ return FALSE;
+ }
+
+ g_remove (p2);
+ g_remove (p1);
+ g_remove (p0);
+
+ return TRUE;
+}
+
+static gboolean
+test_g_mkdir_with_parents (void)
+{
+ g_print ("checking g_mkdir_with_parents()...");
+ if (!test_g_mkdir_with_parents_1 ("hum"))
+ return FALSE;
+ g_remove ("hum");
+ if (!test_g_mkdir_with_parents_1 ("hii///haa/hee"))
+ return FALSE;
+ g_remove ("hii/haa/hee");
+ g_remove ("hii/haa");
+ g_remove ("hii");
+ if (!test_g_mkdir_with_parents_1 (g_get_current_dir ()))
+ return FALSE;
+
+ return TRUE;
+}
+
+static void
+test_g_parse_debug_string (void)
+{
+ GDebugKey keys[3] = {
+ { "foo", 1 },
+ { "bar", 2 },
+ { "baz", 4 }
+ };
+ guint n_keys = 3;
+ guint result;
+
+ result = g_parse_debug_string ("bar:foo:blubb", keys, n_keys);
+ g_assert (result == 3);
+
+ result = g_parse_debug_string (":baz::_E@~!_::", keys, n_keys);
+ g_assert (result == 4);
+
+ result = g_parse_debug_string ("", keys, n_keys);
+ g_assert (result == 0);
+
+ result = g_parse_debug_string (" : ", keys, n_keys);
+ g_assert (result == 0);
+}
+
+
+int
+main (int argc,
+ char *argv[])
+{
+ const gchar *s;
+ gchar **sv;
+ GList *list, *t;
+ GSList *slist, *st;
+ GHashTable *hash_table;
+ GMemChunk *mem_chunk;
+ GStringChunk *string_chunk;
+ GTimer *timer, *timer2;
+ gdouble elapsed;
+ gulong elapsed_usecs;
+ 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;
+ gint value = 120;
+ gint *pvalue=NULL;
+ GTimeVal ref_date, date;
+ gchar *date_str;
+
+ gchar *mem[10000], *tmp_string = NULL, *tmp_string_2;
+ gint i, j;
+ GArray *garray;
+ GPtrArray *gparray;
+ GByteArray *gbarray;
+ GString *string1, *string2;
+ const gchar *charset;
+ GTree *tree;
+ char chars[62];
+ GRelation *relation;
+ GTuples *tuples;
+ gint data [1024];
+ struct {
+ gchar *filename;
+ gchar *dirname;
+ } dirname_checks[] = {
+ { "/", "/" },
+ { "////", "/" },
+ { ".////", "." },
+ { "../", ".." },
+ { "..////", ".." },
+ { "a/b", "a" },
+ { "a/b/", "a/b" },
+ { "c///", "c" },
+#ifdef G_OS_WIN32
+ { "\\", "\\" },
+ { ".\\\\\\\\", "." },
+ { "..\\", ".." },
+ { "..\\\\\\\\", ".." },
+ { "a\\b", "a" },
+ { "a\\b/", "a\\b" },
+ { "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[] = {
+ { "/", "" },
+ { "//", "" },
+ { "/foo", "foo" },
+ { "//foo", "foo" },
+ { "a/b", NULL },
+#ifdef G_OS_WIN32
+ { "\\", "" },
+ { "\\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);
+
+#ifndef G_DISABLE_ASSERT
+ guint16 gu16t1 = 0x44afU, gu16t2 = 0xaf44U;
+ guint32 gu32t1 = 0x02a7f109U, gu32t2 = 0x09f1a702U;
+ 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
+ /* Can't calculate GLib DLL name at runtime. */
+ gchar *glib_dll = "libglib-2.0-0.dll";
+#endif
+#ifdef G_WITH_CYGWIN
+ gchar *glib_dll = "cygglib-2.0-0.dll";
+#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 ("host: %s\n", g_get_host_name ());
+ s = g_get_home_dir ();
+ g_print ("home: %s\n", s ? s : "NULL!");
+ s = g_get_user_data_dir ();
+ g_print ("user_data: %s\n", s ? s : "NULL!");
+ s = g_get_user_config_dir ();
+ g_print ("user_config: %s\n", s ? s : "NULL!");
+ s = g_get_user_cache_dir ();
+ g_print ("user_cache: %s\n", s ? s : "NULL!");
+ sv = (gchar **) g_get_system_data_dirs ();
+ g_print ("system_data: %s\n", sv ? g_strjoinv (G_SEARCHPATH_SEPARATOR_S, sv) : "NULL!");
+ sv = (gchar **) g_get_system_config_dirs ();
+ g_print ("system_config: %s\n", s ? g_strjoinv (G_SEARCHPATH_SEPARATOR_S, sv) : "NULL!");
+ g_print ("tmp-dir: %s\n", g_get_tmp_dir ());
+ sv = (gchar **) g_get_language_names ();
+ g_print ("languages: %s\n", s ? g_strjoinv (":", sv) : "NULL!");
+
+ /* special dirs */
+ s = g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP);
+ g_print ("user_special[DESKTOP]: %s\n", s ? s : "NULL!");
+ s = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
+ g_print ("user_special[DOCUMENTS]: %s\n", s ? s : "NULL!");
+ s = g_get_user_special_dir (G_USER_DIRECTORY_PUBLIC_SHARE);
+ g_print ("user_special[PUBLIC_SHARE]: %s\n", s ? s : "NULL!");
+
+ /* type sizes */
+ g_print ("checking size of gint8: %" G_GSIZE_FORMAT, sizeof (gint8));
+ TEST (NULL, sizeof (gint8) == 1);
+ g_print ("\nchecking size of gint16: %" G_GSIZE_FORMAT, sizeof (gint16));
+ TEST (NULL, sizeof (gint16) == 2);
+ g_print ("\nchecking size of gint32: %" G_GSIZE_FORMAT, sizeof (gint32));
+ TEST (NULL, sizeof (gint32) == 4);
+ g_print ("\nchecking size of gsize: %" G_GSIZE_FORMAT, sizeof (gsize));
+ g_print ("\nchecking size of gint64: %" G_GSIZE_FORMAT, sizeof (gint64));
+ TEST (NULL, sizeof (gint64) == 8);
+ g_print ("\n");
+
+ g_print ("checking g_path_get_basename()...");
+ string = g_path_get_basename (G_DIR_SEPARATOR_S "foo" G_DIR_SEPARATOR_S "dir" G_DIR_SEPARATOR_S);
+ g_assert (strcmp (string, "dir") == 0);
+ g_free (string);
+ string = g_path_get_basename (G_DIR_SEPARATOR_S "foo" G_DIR_SEPARATOR_S "file");
+ g_assert (strcmp (string, "file") == 0);
+ g_free (string);
+ g_print ("ok\n");
+#ifdef G_OS_WIN32
+ string = g_path_get_basename ("/foo/dir/");
+ g_assert (strcmp (string, "dir") == 0);
+ g_free (string);
+ string = g_path_get_basename ("/foo/file");
+ g_assert (strcmp (string, "file") == 0);
+ g_free (string);
+#endif
+
+ 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 : "<NULL>"),
+ (skipped ? skipped : "<NULL>"));
+ n_skip_root_checks = 0;
+ }
+ }
+ if (n_skip_root_checks)
+ g_print ("ok\n");
+
+ if (test_g_mkdir_with_parents ())
+ 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_foreach (tree, my_traverse, 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_foreach (tree, my_traverse, 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]);
+ }
+ pvalue = g_hash_table_find (hash_table, find_first_that, &value);
+ if (*pvalue != value)
+ g_print("g_hash_table_find failed");
+
+ 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_printf (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_printf (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 = %lu...\n", (gulong)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_timer_continue...\n");
+
+ timer2 = g_timer_new ();
+
+ g_print ("\trun for 1 second...\n");
+ timer = g_timer_new();
+ g_usleep(G_USEC_PER_SEC); /* run timer for 1 second */
+ g_timer_stop(timer);
+
+ g_print ("\tstop for 1 second...\n");
+ g_usleep(G_USEC_PER_SEC); /* wait for 1 second */
+ g_print ("\trun for 2 seconds...\n");
+
+ g_timer_continue(timer);
+ g_usleep(2*G_USEC_PER_SEC); /* run timer for 2 seconds */
+ g_timer_stop(timer);
+
+ g_print ("\tstop for 1.5 seconds...\n");
+ g_usleep((3*G_USEC_PER_SEC)/2); /* wait for 1.5 seconds */
+ g_print ("\trun for 0.2 seconds...\n");
+
+ g_timer_continue(timer);
+ g_usleep(G_USEC_PER_SEC/5); /* run timer for 0.2 seconds */
+ g_timer_stop(timer);
+
+ g_print ("\tstop for 4 seconds...\n");
+ g_usleep(4*G_USEC_PER_SEC); /* wait for 4 seconds */
+ g_print ("\trun for 5.8 seconds...\n");
+
+ g_timer_continue(timer);
+ g_usleep((29*G_USEC_PER_SEC)/5); /* run timer for 5.8 seconds */
+ g_timer_stop(timer);
+
+ elapsed = g_timer_elapsed (timer, &elapsed_usecs);
+ g_print ("\t=> timer = %.6f = %d.%06ld (should be: 9.000000) (%.6f off)\n", elapsed, (int) elapsed, elapsed_usecs, ABS (elapsed - 9.));
+
+ if (elapsed > 8.8 && elapsed < 9.2)
+ g_print ("g_timer_continue ... ok\n\n");
+ else
+ g_print ("g_timer_continue ... ***** FAILED *****\n\n");
+
+ g_timer_stop(timer2);
+
+ elapsed = g_timer_elapsed(timer2, &elapsed_usecs);
+ g_print ("\t=> timer2 = %.6f = %d.%06ld (should be: %.6f) (%.6f off)\n\n", elapsed, (int) elapsed, elapsed_usecs, 9.+6.5, ABS (elapsed - (9.+6.5)));
+
+ if (elapsed > (8.8+6.5) && elapsed < (9.2+6.5))
+ g_print ("timer2 ... ok\n\n");
+ else
+ g_print ("timer2 ... ***** FAILED *****\n\n");
+
+ g_timer_destroy(timer);
+ g_timer_destroy(timer2);
+
+#define REF_SEC_UTC 320063760
+#define REF_STR_UTC "1980-02-22T10:36:00Z"
+#define REF_STR_CEST "1980-02-22T12:36:00+02:00"
+#define REF_STR_EST "1980-02-22T05:36:00-05:00"
+
+ g_print ("checking g_time_val_from_iso8601...\n");
+ ref_date.tv_sec = REF_SEC_UTC;
+ ref_date.tv_usec = 0;
+ g_assert (g_time_val_from_iso8601 (REF_STR_UTC, &date) != FALSE);
+ g_print ("\t=> UTC stamp = %ld (should be: %ld) (%ld off)\n", date.tv_sec, ref_date.tv_sec, date.tv_sec - ref_date.tv_sec);
+ g_assert (date.tv_sec == ref_date.tv_sec);
+
+ g_assert (g_time_val_from_iso8601 (REF_STR_CEST, &date) != FALSE);
+ g_print ("\t=> CEST stamp = %ld (should be: %ld) (%ld off)\n", date.tv_sec, ref_date.tv_sec, date.tv_sec - ref_date.tv_sec);
+ g_assert (date.tv_sec == ref_date.tv_sec);
+
+ g_assert (g_time_val_from_iso8601 (REF_STR_EST, &date) != FALSE);
+ g_print ("\t=> EST stamp = %ld (should be: %ld) (%ld off)\n", date.tv_sec, ref_date.tv_sec, date.tv_sec - ref_date.tv_sec);
+ g_assert (date.tv_sec == ref_date.tv_sec);
+ g_print ("ok\n");
+
+ g_print ("checking g_time_val_to_iso8601...\n");
+ ref_date.tv_sec = REF_SEC_UTC;
+ ref_date.tv_usec = 1;
+ date_str = g_time_val_to_iso8601 (&ref_date);
+ g_assert (date_str != NULL);
+ g_print ("\t=> date string = %s (should be: %s)\n", date_str, REF_STR_UTC);
+ g_assert (strcmp (date_str, REF_STR_UTC) == 0);
+ g_free (date_str);
+ g_print ("ok\n");
+
+ g_print ("checking g_ascii_strcasecmp...");
+ g_assert (g_ascii_strcasecmp ("FroboZZ", "frobozz") == 0);
+ g_assert (g_ascii_strcasecmp ("frobozz", "frobozz") == 0);
+ g_assert (g_ascii_strcasecmp ("frobozz", "FROBOZZ") == 0);
+ g_assert (g_ascii_strcasecmp ("FROBOZZ", "froboz") > 0);
+ g_assert (g_ascii_strcasecmp ("", "") == 0);
+ g_assert (g_ascii_strcasecmp ("!#%&/()", "!#%&/()") == 0);
+ g_assert (g_ascii_strcasecmp ("a", "b") < 0);
+ g_assert (g_ascii_strcasecmp ("a", "B") < 0);
+ g_assert (g_ascii_strcasecmp ("A", "b") < 0);
+ g_assert (g_ascii_strcasecmp ("A", "B") < 0);
+ g_assert (g_ascii_strcasecmp ("b", "a") > 0);
+ g_assert (g_ascii_strcasecmp ("b", "A") > 0);
+ g_assert (g_ascii_strcasecmp ("B", "a") > 0);
+ g_assert (g_ascii_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_message ("non-printable UTF-8: \"\xc3\xa4\xda\x85\"");
+ g_message ("unsafe chars: \"\x10\x11\x12\n\t\x7f\x81\x82\x83\"");
+
+ 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);
+ g_assert (GUINT64_SWAP_LE_BE (gu64t1) == gu64t2);
+
+ g_print ("ok\n");
+
+ if (g_get_charset ((G_CONST_RETURN char**)&charset))
+ g_print ("current charset is UTF-8: %s\n", charset);
+ else
+ g_print ("current charset is not UTF-8: %s\n", charset);
+
+#ifdef G_PLATFORM_WIN32
+ g_print ("current locale: %s\n", g_win32_getlocale ());
+ g_print ("GLib DLL name tested for: %s\n", glib_dll);
+
+ 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, "lib\\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"));
+
+ g_print ("a Win32 error message: %s\n", g_win32_error_message (2));
+
+#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);
+
+#ifdef G_OS_WIN32
+ strcpy (template, "zap/barXXXXXX");
+ fd = g_file_open_tmp (template, &name_used, &error);
+ if (fd != -1)
+ g_print ("g_file_open_tmp works even if template contains '/'\n");
+ else
+ g_print ("g_file_open_tmp correctly returns error: %s\n",
+ error->message);
+ close (fd);
+ g_clear_error (&error);
+#endif
+
+ 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);
+
+ test_g_parse_debug_string ();
+
+ return 0;
+}
+
diff --git a/trunk/tests/thread-test.c b/trunk/tests/thread-test.c
new file mode 100644
index 000000000..63f7e02be
--- /dev/null
+++ b/trunk/tests/thread-test.c
@@ -0,0 +1,402 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <glib.h>
+
+/* GMutex */
+
+static GMutex* test_g_mutex_mutex = NULL;
+static guint test_g_mutex_int = 0;
+static gboolean test_g_mutex_thread_ready;
+G_LOCK_DEFINE_STATIC (test_g_mutex);
+
+static gpointer
+test_g_mutex_thread (gpointer data)
+{
+ g_assert (GPOINTER_TO_INT (data) == 42);
+ g_assert (g_mutex_trylock (test_g_mutex_mutex) == FALSE);
+ g_assert (G_TRYLOCK (test_g_mutex) == FALSE);
+ test_g_mutex_thread_ready = TRUE;
+ g_mutex_lock (test_g_mutex_mutex);
+ g_assert (test_g_mutex_int == 42);
+ g_mutex_unlock (test_g_mutex_mutex);
+
+ return GINT_TO_POINTER (41);
+}
+
+static void
+test_g_mutex (void)
+{
+ GThread *thread;
+ test_g_mutex_mutex = g_mutex_new ();
+
+ g_assert (g_mutex_trylock (test_g_mutex_mutex));
+ g_assert (G_TRYLOCK (test_g_mutex));
+ test_g_mutex_thread_ready = FALSE;
+ thread = g_thread_create (test_g_mutex_thread, GINT_TO_POINTER (42),
+ TRUE, NULL);
+ /* This busy wait is only for testing purposes and not an example of
+ * good code!*/
+ while (!test_g_mutex_thread_ready)
+ g_usleep (G_USEC_PER_SEC / 5);
+ test_g_mutex_int = 42;
+ G_UNLOCK (test_g_mutex);
+ g_mutex_unlock (test_g_mutex_mutex);
+ g_assert (GPOINTER_TO_INT (g_thread_join (thread)) == 41);
+ g_mutex_free (test_g_mutex_mutex);
+}
+
+/* GStaticRecMutex */
+
+static GStaticRecMutex test_g_static_rec_mutex_mutex = G_STATIC_REC_MUTEX_INIT;
+static guint test_g_static_rec_mutex_int = 0;
+static gboolean test_g_static_rec_mutex_thread_ready;
+
+static gpointer
+test_g_static_rec_mutex_thread (gpointer data)
+{
+ g_assert (GPOINTER_TO_INT (data) == 42);
+ g_assert (g_static_rec_mutex_trylock (&test_g_static_rec_mutex_mutex)
+ == FALSE);
+ test_g_static_rec_mutex_thread_ready = TRUE;
+ g_static_rec_mutex_lock (&test_g_static_rec_mutex_mutex);
+ g_static_rec_mutex_lock (&test_g_static_rec_mutex_mutex);
+ g_assert (test_g_static_rec_mutex_int == 42);
+ test_g_static_rec_mutex_thread_ready = FALSE;
+ g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex);
+ g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex);
+
+ g_thread_exit (GINT_TO_POINTER (43));
+
+ g_assert_not_reached ();
+ return NULL;
+}
+
+static void
+test_g_static_rec_mutex (void)
+{
+ GThread *thread;
+
+ g_assert (g_static_rec_mutex_trylock (&test_g_static_rec_mutex_mutex));
+ test_g_static_rec_mutex_thread_ready = FALSE;
+ thread = g_thread_create (test_g_static_rec_mutex_thread,
+ GINT_TO_POINTER (42), TRUE, NULL);
+ /* This busy wait is only for testing purposes and not an example of
+ * good code!*/
+ while (!test_g_static_rec_mutex_thread_ready)
+ g_usleep (G_USEC_PER_SEC / 5);
+
+ g_assert (g_static_rec_mutex_trylock (&test_g_static_rec_mutex_mutex));
+ test_g_static_rec_mutex_int = 41;
+ g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex);
+ test_g_static_rec_mutex_int = 42;
+ g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex);
+
+ /* This busy wait is only for testing purposes and not an example of
+ * good code!*/
+ while (test_g_static_rec_mutex_thread_ready)
+ g_usleep (G_USEC_PER_SEC / 5);
+
+ g_static_rec_mutex_lock (&test_g_static_rec_mutex_mutex);
+ test_g_static_rec_mutex_int = 0;
+ g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex);
+
+ g_assert (GPOINTER_TO_INT (g_thread_join (thread)) == 43);
+}
+
+/* GStaticPrivate */
+
+#define THREADS 10
+
+static GStaticPrivate test_g_static_private_private1 = G_STATIC_PRIVATE_INIT;
+static GStaticPrivate test_g_static_private_private2 = G_STATIC_PRIVATE_INIT;
+static GStaticMutex test_g_static_private_mutex = G_STATIC_MUTEX_INIT;
+static guint test_g_static_private_counter = 0;
+static guint test_g_static_private_ready = 0;
+
+static gpointer
+test_g_static_private_constructor (void)
+{
+ g_static_mutex_lock (&test_g_static_private_mutex);
+ test_g_static_private_counter++;
+ g_static_mutex_unlock (&test_g_static_private_mutex);
+ return g_new (guint,1);
+}
+
+static void
+test_g_static_private_destructor (gpointer data)
+{
+ g_static_mutex_lock (&test_g_static_private_mutex);
+ test_g_static_private_counter--;
+ g_static_mutex_unlock (&test_g_static_private_mutex);
+ g_free (data);
+}
+
+
+static gpointer
+test_g_static_private_thread (gpointer data)
+{
+ guint number = GPOINTER_TO_INT (data);
+ guint i;
+ guint *private1, *private2;
+ for (i = 0; i < 10; i++)
+ {
+ number = number * 11 + 1; /* A very simple and bad RNG ;-) */
+ private1 = g_static_private_get (&test_g_static_private_private1);
+ if (!private1 || number % 7 > 3)
+ {
+ private1 = test_g_static_private_constructor ();
+ g_static_private_set (&test_g_static_private_private1, private1,
+ test_g_static_private_destructor);
+ }
+ *private1 = number;
+ private2 = g_static_private_get (&test_g_static_private_private2);
+ if (!private2 || number % 13 > 5)
+ {
+ private2 = test_g_static_private_constructor ();
+ g_static_private_set (&test_g_static_private_private2, private2,
+ test_g_static_private_destructor);
+ }
+ *private2 = number * 2;
+ g_usleep (G_USEC_PER_SEC / 5);
+ g_assert (number == *private1);
+ g_assert (number * 2 == *private2);
+ }
+ g_static_mutex_lock (&test_g_static_private_mutex);
+ test_g_static_private_ready++;
+ g_static_mutex_unlock (&test_g_static_private_mutex);
+
+ /* Busy wait is not nice but that's just a test */
+ while (test_g_static_private_ready != 0)
+ g_usleep (G_USEC_PER_SEC / 5);
+
+ for (i = 0; i < 10; i++)
+ {
+ private2 = g_static_private_get (&test_g_static_private_private2);
+ number = number * 11 + 1; /* A very simple and bad RNG ;-) */
+ if (!private2 || number % 13 > 5)
+ {
+ private2 = test_g_static_private_constructor ();
+ g_static_private_set (&test_g_static_private_private2, private2,
+ test_g_static_private_destructor);
+ }
+ *private2 = number * 2;
+ g_usleep (G_USEC_PER_SEC / 5);
+ g_assert (number * 2 == *private2);
+ }
+
+ return GINT_TO_POINTER (GPOINTER_TO_INT (data) * 3);
+}
+
+static void
+test_g_static_private (void)
+{
+ GThread *threads[THREADS];
+ guint i;
+
+ test_g_static_private_ready = 0;
+
+ for (i = 0; i < THREADS; i++)
+ {
+ threads[i] = g_thread_create (test_g_static_private_thread,
+ GINT_TO_POINTER (i), TRUE, NULL);
+ }
+
+ /* Busy wait is not nice but that's just a test */
+ while (test_g_static_private_ready != THREADS)
+ g_usleep (G_USEC_PER_SEC / 5);
+
+ /* Reuse the static private */
+ g_static_private_free (&test_g_static_private_private2);
+ g_static_private_init (&test_g_static_private_private2);
+
+ test_g_static_private_ready = 0;
+
+ for (i = 0; i < THREADS; i++)
+ g_assert (GPOINTER_TO_INT (g_thread_join (threads[i])) == i * 3);
+
+ g_assert (test_g_static_private_counter == 0);
+}
+
+/* GStaticRWLock */
+
+/* -1 = writing; >0 = # of readers */
+static gint test_g_static_rw_lock_state = 0;
+G_LOCK_DEFINE (test_g_static_rw_lock_state);
+
+static gboolean test_g_static_rw_lock_run = TRUE;
+static GStaticRWLock test_g_static_rw_lock_lock = G_STATIC_RW_LOCK_INIT;
+
+static gpointer
+test_g_static_rw_lock_thread (gpointer data)
+{
+ while (test_g_static_rw_lock_run)
+ {
+ if (g_random_double() > .2) /* I'm a reader */
+ {
+
+ if (g_random_double() > .2) /* I'll block */
+ g_static_rw_lock_reader_lock (&test_g_static_rw_lock_lock);
+ else /* I'll only try */
+ if (!g_static_rw_lock_reader_trylock (&test_g_static_rw_lock_lock))
+ continue;
+ G_LOCK (test_g_static_rw_lock_state);
+ g_assert (test_g_static_rw_lock_state >= 0);
+ test_g_static_rw_lock_state++;
+ G_UNLOCK (test_g_static_rw_lock_state);
+
+ g_usleep (g_random_int_range (20,1000));
+
+ G_LOCK (test_g_static_rw_lock_state);
+ test_g_static_rw_lock_state--;
+ G_UNLOCK (test_g_static_rw_lock_state);
+
+ g_static_rw_lock_reader_unlock (&test_g_static_rw_lock_lock);
+ }
+ else /* I'm a writer */
+ {
+
+ if (g_random_double() > .2) /* I'll block */
+ g_static_rw_lock_writer_lock (&test_g_static_rw_lock_lock);
+ else /* I'll only try */
+ if (!g_static_rw_lock_writer_trylock (&test_g_static_rw_lock_lock))
+ continue;
+ G_LOCK (test_g_static_rw_lock_state);
+ g_assert (test_g_static_rw_lock_state == 0);
+ test_g_static_rw_lock_state = -1;
+ G_UNLOCK (test_g_static_rw_lock_state);
+
+ g_usleep (g_random_int_range (20,1000));
+
+ G_LOCK (test_g_static_rw_lock_state);
+ test_g_static_rw_lock_state = 0;
+ G_UNLOCK (test_g_static_rw_lock_state);
+
+ g_static_rw_lock_writer_unlock (&test_g_static_rw_lock_lock);
+ }
+ }
+ return NULL;
+}
+
+static void
+test_g_static_rw_lock ()
+{
+ GThread *threads[THREADS];
+ guint i;
+ for (i = 0; i < THREADS; i++)
+ {
+ threads[i] = g_thread_create (test_g_static_rw_lock_thread,
+ NULL, TRUE, NULL);
+ }
+ g_usleep (G_USEC_PER_SEC * 5);
+ test_g_static_rw_lock_run = FALSE;
+ for (i = 0; i < THREADS; i++)
+ {
+ g_thread_join (threads[i]);
+ }
+ g_assert (test_g_static_rw_lock_state == 0);
+}
+
+#define G_ONCE_SIZE 100
+#define G_ONCE_THREADS 10
+
+G_LOCK_DEFINE (test_g_once);
+static guint test_g_once_guint_array[G_ONCE_SIZE];
+static GOnce test_g_once_array[G_ONCE_SIZE];
+
+static gpointer
+test_g_once_init_func(gpointer arg)
+{
+ guint *count = arg;
+ g_usleep (g_random_int_range (20,1000));
+ (*count)++;
+ g_usleep (g_random_int_range (20,1000));
+ return arg;
+}
+
+static gpointer
+test_g_once_thread (gpointer ignore)
+{
+ guint i;
+ G_LOCK (test_g_once);
+ /* Don't start before all threads are created */
+ G_UNLOCK (test_g_once);
+ for (i = 0; i < 1000; i++)
+ {
+ guint pos = g_random_int_range (0, G_ONCE_SIZE);
+ gpointer ret = g_once (test_g_once_array + pos, test_g_once_init_func,
+ test_g_once_guint_array + pos);
+ g_assert (ret == test_g_once_guint_array + pos);
+ }
+
+ /* Make sure, that all counters are touched at least once */
+ for (i = 0; i < G_ONCE_SIZE; i++)
+ {
+ gpointer ret = g_once (test_g_once_array + i, test_g_once_init_func,
+ test_g_once_guint_array + i);
+ g_assert (ret == test_g_once_guint_array + i);
+ }
+
+ return NULL;
+}
+
+static void
+test_g_thread_once (void)
+{
+ static GOnce once_init = G_ONCE_INIT;
+ GThread *threads[G_ONCE_THREADS];
+ guint i;
+ for (i = 0; i < G_ONCE_SIZE; i++)
+ {
+ test_g_once_array[i] = once_init;
+ test_g_once_guint_array[i] = i;
+ }
+ G_LOCK (test_g_once);
+ for (i = 0; i < G_ONCE_THREADS; i++)
+ {
+ threads[i] = g_thread_create (test_g_once_thread, GUINT_TO_POINTER(i%2),
+ TRUE, NULL);
+ }
+ G_UNLOCK (test_g_once);
+ for (i = 0; i < G_ONCE_THREADS; i++)
+ {
+ g_thread_join (threads[i]);
+ }
+
+ for (i = 0; i < G_ONCE_SIZE; i++)
+ {
+ g_assert (test_g_once_guint_array[i] == i + 1);
+ }
+}
+
+/* run all the tests */
+void
+run_all_tests()
+{
+ test_g_mutex ();
+ test_g_static_rec_mutex ();
+ test_g_static_private ();
+ test_g_static_rw_lock ();
+ test_g_thread_once ();
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ /* Only run the test, if threads are enabled and a default thread
+ implementation is available */
+#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE)
+ g_thread_init (NULL);
+ run_all_tests ();
+
+ /* Now we rerun all tests, but this time we fool the system into
+ * thinking, that the available thread system is not native, but
+ * userprovided. */
+
+ g_thread_use_default_impl = FALSE;
+ run_all_tests ();
+
+#endif
+ return 0;
+}
diff --git a/trunk/tests/threadpool-test.c b/trunk/tests/threadpool-test.c
new file mode 100644
index 000000000..889fee9b9
--- /dev/null
+++ b/trunk/tests/threadpool-test.c
@@ -0,0 +1,473 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <config.h>
+
+#include <glib.h>
+
+#define DEBUG_MSG(x)
+/* #define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n"); */
+
+#define WAIT 5 /* seconds */
+#define MAX_THREADS 10
+
+/* if > 0 the test will run continously (since the test ends when
+ * thread count is 0), if -1 it means no limit to unused threads
+ * if 0 then no unused threads are possible */
+#define MAX_UNUSED_THREADS -1
+
+G_LOCK_DEFINE_STATIC (thread_counter_pools);
+
+static gulong abs_thread_counter = 0;
+static gulong running_thread_counter = 0;
+static gulong leftover_task_counter = 0;
+
+G_LOCK_DEFINE_STATIC (last_thread);
+
+static guint last_thread_id = 0;
+
+G_LOCK_DEFINE_STATIC (thread_counter_sort);
+
+static gulong sort_thread_counter = 0;
+
+static GThreadPool *idle_pool = NULL;
+
+static GMainLoop *main_loop = NULL;
+
+static void
+test_thread_functions (void)
+{
+ gint max_unused_threads;
+ guint max_idle_time;
+
+ /* This function attempts to call functions which don't need a
+ * threadpool to operate to make sure no uninitialised pointers
+ * accessed and no errors occur.
+ */
+
+ max_unused_threads = 3;
+
+ DEBUG_MSG (("[funcs] Setting max unused threads to %d",
+ max_unused_threads));
+ g_thread_pool_set_max_unused_threads (max_unused_threads);
+
+ DEBUG_MSG (("[funcs] Getting max unused threads = %d",
+ g_thread_pool_get_max_unused_threads ()));
+ g_assert (g_thread_pool_get_max_unused_threads() == max_unused_threads);
+
+ DEBUG_MSG (("[funcs] Getting num unused threads = %d",
+ g_thread_pool_get_num_unused_threads ()));
+ g_assert (g_thread_pool_get_num_unused_threads () == 0);
+
+ DEBUG_MSG (("[funcs] Stopping unused threads"));
+ g_thread_pool_stop_unused_threads ();
+
+ max_idle_time = 10 * G_USEC_PER_SEC;
+
+ DEBUG_MSG (("[funcs] Setting max idle time to %d",
+ max_idle_time));
+ g_thread_pool_set_max_idle_time (max_idle_time);
+
+ DEBUG_MSG (("[funcs] Getting max idle time = %d",
+ g_thread_pool_get_max_idle_time ()));
+ g_assert (g_thread_pool_get_max_idle_time () == max_idle_time);
+
+ DEBUG_MSG (("[funcs] Setting max idle time to 0"));
+ g_thread_pool_set_max_idle_time (0);
+
+ DEBUG_MSG (("[funcs] Getting max idle time = %d",
+ g_thread_pool_get_max_idle_time ()));
+ g_assert (g_thread_pool_get_max_idle_time () == 0);
+}
+
+static void
+test_count_threads_foreach (GThread *thread,
+ guint *count)
+{
+ ++*count;
+}
+
+static guint
+test_count_threads (void)
+{
+ guint count = 0;
+
+ g_thread_foreach ((GFunc) test_count_threads_foreach, &count);
+
+ /* Exclude main thread */
+ return count - 1;
+}
+
+static void
+test_thread_stop_unused (void)
+{
+ GThreadPool *pool;
+ guint i;
+ guint limit = 100;
+
+ /* Spawn a few threads. */
+ g_thread_pool_set_max_unused_threads (-1);
+ pool = g_thread_pool_new ((GFunc) g_usleep, NULL, -1, FALSE, NULL);
+
+ for (i = 0; i < limit; i++)
+ g_thread_pool_push (pool, GUINT_TO_POINTER (1000), NULL);
+
+ DEBUG_MSG (("[unused] ===> pushed %d threads onto the idle pool",
+ limit));
+
+ /* Wait for the threads to migrate. */
+ g_usleep (G_USEC_PER_SEC);
+
+ DEBUG_MSG (("[unused] current threads %d",
+ test_count_threads()));
+
+ DEBUG_MSG (("[unused] stopping unused threads"));
+ g_thread_pool_stop_unused_threads ();
+
+ DEBUG_MSG (("[unused] waiting ONE second for threads to die"));
+
+ /* Some time for threads to die. */
+ g_usleep (G_USEC_PER_SEC);
+
+ DEBUG_MSG (("[unused] stopped idle threads, %d remain, %d threads still exist",
+ g_thread_pool_get_num_unused_threads (),
+ test_count_threads ()));
+
+ g_assert (g_thread_pool_get_num_unused_threads () == test_count_threads ());
+ g_assert (g_thread_pool_get_num_unused_threads () == 0);
+
+ g_thread_pool_set_max_unused_threads (MAX_THREADS);
+
+ DEBUG_MSG (("[unused] cleaning up thread pool"));
+ g_thread_pool_free (pool, FALSE, TRUE);
+}
+
+static void
+test_thread_pools_entry_func (gpointer data, gpointer user_data)
+{
+ guint id = 0;
+
+ id = GPOINTER_TO_UINT (data);
+
+ DEBUG_MSG (("[pool] ---> [%3.3d] entered thread.", id));
+
+ G_LOCK (thread_counter_pools);
+ abs_thread_counter++;
+ running_thread_counter++;
+ G_UNLOCK (thread_counter_pools);
+
+ g_usleep (g_random_int_range (0, 4000));
+
+ G_LOCK (thread_counter_pools);
+ running_thread_counter--;
+ leftover_task_counter--;
+
+ DEBUG_MSG (("[pool] ---> [%3.3d] exiting thread (abs count:%ld, "
+ "running count:%ld, left over:%ld)",
+ id, abs_thread_counter,
+ running_thread_counter, leftover_task_counter));
+ G_UNLOCK (thread_counter_pools);
+}
+
+static void
+test_thread_pools (void)
+{
+ GThreadPool *pool1, *pool2, *pool3;
+ guint runs;
+ guint i;
+
+ pool1 = g_thread_pool_new ((GFunc)test_thread_pools_entry_func, NULL, 3, FALSE, NULL);
+ pool2 = g_thread_pool_new ((GFunc)test_thread_pools_entry_func, NULL, 5, TRUE, NULL);
+ pool3 = g_thread_pool_new ((GFunc)test_thread_pools_entry_func, NULL, 7, TRUE, NULL);
+
+ runs = 300;
+ for (i = 0; i < runs; i++)
+ {
+ g_thread_pool_push (pool1, GUINT_TO_POINTER (i + 1), NULL);
+ g_thread_pool_push (pool2, GUINT_TO_POINTER (i + 1), NULL);
+ g_thread_pool_push (pool3, GUINT_TO_POINTER (i + 1), NULL);
+ leftover_task_counter += 3;
+ }
+
+ g_thread_pool_free (pool1, TRUE, TRUE);
+ g_thread_pool_free (pool2, FALSE, TRUE);
+ g_thread_pool_free (pool3, FALSE, TRUE);
+
+ g_assert (runs * 3 == abs_thread_counter + leftover_task_counter);
+ g_assert (running_thread_counter == 0);
+}
+
+static gint
+test_thread_sort_compare_func (gconstpointer a, gconstpointer b, gpointer user_data)
+{
+ guint32 id1, id2;
+
+ id1 = GPOINTER_TO_UINT (a);
+ id2 = GPOINTER_TO_UINT (b);
+
+ return (id1 > id2 ? +1 : id1 == id2 ? 0 : -1);
+}
+
+static void
+test_thread_sort_entry_func (gpointer data, gpointer user_data)
+{
+ guint thread_id;
+ gboolean is_sorted;
+
+ G_LOCK (last_thread);
+
+ thread_id = GPOINTER_TO_UINT (data);
+ is_sorted = GPOINTER_TO_INT (user_data);
+
+ DEBUG_MSG (("%s ---> entered thread:%2.2d, last thread:%2.2d",
+ is_sorted ? "[ sorted]" : "[unsorted]",
+ thread_id, last_thread_id));
+
+ if (is_sorted) {
+ static gboolean last_failed = FALSE;
+
+ if (last_thread_id > thread_id) {
+ if (last_failed) {
+ g_assert (last_thread_id <= thread_id);
+ }
+
+ /* Here we remember one fail and if it concurrently fails, it
+ * can not be sorted. the last thread id might be < this thread
+ * id if something is added to the queue since threads were
+ * created
+ */
+ last_failed = TRUE;
+ } else {
+ last_failed = FALSE;
+ }
+
+ last_thread_id = thread_id;
+ }
+
+ G_UNLOCK (last_thread);
+
+ g_usleep (WAIT * 1000);
+}
+
+static void
+test_thread_sort (gboolean sort)
+{
+ GThreadPool *pool;
+ guint limit;
+ guint max_threads;
+ gint i;
+
+ limit = MAX_THREADS * 10;
+
+ if (sort) {
+ max_threads = 1;
+ } else {
+ max_threads = MAX_THREADS;
+ }
+
+ /* It is important that we only have a maximum of 1 thread for this
+ * test since the results can not be guranteed to be sorted if > 1.
+ *
+ * Threads are scheduled by the operating system and are executed at
+ * random. It cannot be assumed that threads are executed in the
+ * order they are created. This was discussed in bug #334943.
+ */
+
+ pool = g_thread_pool_new (test_thread_sort_entry_func,
+ GINT_TO_POINTER (sort),
+ max_threads,
+ FALSE,
+ NULL);
+
+ g_thread_pool_set_max_unused_threads (MAX_UNUSED_THREADS);
+
+ if (sort) {
+ g_thread_pool_set_sort_function (pool,
+ test_thread_sort_compare_func,
+ GUINT_TO_POINTER (69));
+ }
+
+ for (i = 0; i < limit; i++) {
+ guint id;
+
+ id = g_random_int_range (1, limit) + 1;
+ g_thread_pool_push (pool, GUINT_TO_POINTER (id), NULL);
+ DEBUG_MSG (("%s ===> pushed new thread with id:%d, number "
+ "of threads:%d, unprocessed:%d",
+ sort ? "[ sorted]" : "[unsorted]",
+ id,
+ g_thread_pool_get_num_threads (pool),
+ g_thread_pool_unprocessed (pool)));
+ }
+
+ g_assert (g_thread_pool_get_max_threads (pool) == max_threads);
+ g_assert (g_thread_pool_get_num_threads (pool) == g_thread_pool_get_max_threads (pool));
+}
+
+static void
+test_thread_idle_time_entry_func (gpointer data, gpointer user_data)
+{
+ guint thread_id;
+
+ thread_id = GPOINTER_TO_UINT (data);
+
+ DEBUG_MSG (("[idle] ---> entered thread:%2.2d", thread_id));
+
+ g_usleep (WAIT * 1000);
+
+ DEBUG_MSG (("[idle] <--- exiting thread:%2.2d", thread_id));
+}
+
+static gboolean
+test_thread_idle_timeout (gpointer data)
+{
+ guint interval;
+ gint i;
+
+ interval = GPOINTER_TO_UINT (data);
+
+ for (i = 0; i < 2; i++) {
+ g_thread_pool_push (idle_pool, GUINT_TO_POINTER (100 + i), NULL);
+ DEBUG_MSG (("[idle] ===> pushed new thread with id:%d, number "
+ "of threads:%d, unprocessed:%d",
+ 100 + i,
+ g_thread_pool_get_num_threads (idle_pool),
+ g_thread_pool_unprocessed (idle_pool)));
+ }
+
+
+ return FALSE;
+}
+
+static void
+test_thread_idle_time ()
+{
+ guint limit = 50;
+ guint interval = 10000;
+ gint i;
+
+ idle_pool = g_thread_pool_new (test_thread_idle_time_entry_func,
+ NULL,
+ MAX_THREADS,
+ FALSE,
+ NULL);
+
+ g_thread_pool_set_max_unused_threads (MAX_UNUSED_THREADS);
+ g_thread_pool_set_max_idle_time (interval);
+
+ g_assert (g_thread_pool_get_max_unused_threads () == MAX_UNUSED_THREADS);
+ g_assert (g_thread_pool_get_max_idle_time () == interval);
+
+ for (i = 0; i < limit; i++) {
+ g_thread_pool_push (idle_pool, GUINT_TO_POINTER (i + 1), NULL);
+ DEBUG_MSG (("[idle] ===> pushed new thread with id:%d, "
+ "number of threads:%d, unprocessed:%d",
+ i,
+ g_thread_pool_get_num_threads (idle_pool),
+ g_thread_pool_unprocessed (idle_pool)));
+ }
+
+ g_timeout_add ((interval - 1000),
+ test_thread_idle_timeout,
+ GUINT_TO_POINTER (interval));
+}
+
+static gboolean
+test_check_start_and_stop (gpointer user_data)
+{
+ static guint test_number = 0;
+ static gboolean run_next = FALSE;
+ gboolean continue_timeout = TRUE;
+ gboolean quit = TRUE;
+
+ if (test_number == 0) {
+ run_next = TRUE;
+ DEBUG_MSG (("***** RUNNING TEST %2.2d *****", test_number));
+ }
+
+ if (run_next) {
+ test_number++;
+
+ switch (test_number) {
+ case 1:
+ test_thread_functions ();
+ break;
+ case 2:
+ test_thread_stop_unused ();
+ break;
+ case 3:
+ test_thread_pools ();
+ break;
+ case 4:
+ test_thread_sort (FALSE);
+ break;
+ case 5:
+ test_thread_sort (TRUE);
+ break;
+ case 6:
+ test_thread_stop_unused ();
+ break;
+ case 7:
+ test_thread_idle_time ();
+ break;
+ default:
+ DEBUG_MSG (("***** END OF TESTS *****"));
+ g_main_loop_quit (main_loop);
+ continue_timeout = FALSE;
+ break;
+ }
+
+ run_next = FALSE;
+ return TRUE;
+ }
+
+ if (test_number == 3) {
+ G_LOCK (thread_counter_pools);
+ quit &= running_thread_counter <= 0;
+ DEBUG_MSG (("***** POOL RUNNING THREAD COUNT:%ld",
+ running_thread_counter));
+ G_UNLOCK (thread_counter_pools);
+ }
+
+ if (test_number == 4 || test_number == 5) {
+ G_LOCK (thread_counter_sort);
+ quit &= sort_thread_counter <= 0;
+ DEBUG_MSG (("***** POOL SORT THREAD COUNT:%ld",
+ sort_thread_counter));
+ G_UNLOCK (thread_counter_sort);
+ }
+
+ if (test_number == 7) {
+ guint idle;
+
+ idle = g_thread_pool_get_num_unused_threads ();
+ quit &= idle < 1;
+ DEBUG_MSG (("***** POOL IDLE THREAD COUNT:%d, UNPROCESSED JOBS:%d",
+ idle, g_thread_pool_unprocessed (idle_pool)));
+ }
+
+ if (quit) {
+ run_next = TRUE;
+ }
+
+ return continue_timeout;
+}
+
+int
+main (int argc, char *argv[])
+{
+ /* Only run the test, if threads are enabled and a default thread
+ implementation is available */
+
+#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE)
+ g_thread_init (NULL);
+
+ DEBUG_MSG (("Starting... (in one second)"));
+ g_timeout_add (1000, test_check_start_and_stop, NULL);
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (main_loop);
+#endif
+
+ return 0;
+}
diff --git a/trunk/tests/timeloop-basic.c b/trunk/tests/timeloop-basic.c
new file mode 100644
index 000000000..56861f33e
--- /dev/null
+++ b/trunk/tests/timeloop-basic.c
@@ -0,0 +1,235 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/resource.h>
+#include <sys/time.h>
+#include <sys/poll.h>
+
+#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; i++)
+ {
+ if (poll_fds[i].events & (POLLIN | POLLHUP))
+ {
+ if (!input_callback (poll_fds[i].fd, write_fds[i]))
+ write_fds[i] = -1;
+ }
+ }
+
+ if (old_n_active_children > n_active_children)
+ {
+ j = 0;
+ for (i=0; i<old_n_active_children; i++)
+ {
+ if (write_fds[i] != -1)
+ {
+ if (j < i)
+ {
+ poll_fds[j] = poll_fds[i];
+ write_fds[j] = write_fds[i];
+ }
+ j++;
+ }
+ }
+ }
+ }
+
+ 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;
+}
+
diff --git a/trunk/tests/timeloop-closure.c b/trunk/tests/timeloop-closure.c
new file mode 100644
index 000000000..ecbe29087
--- /dev/null
+++ b/trunk/tests/timeloop-closure.c
@@ -0,0 +1,222 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#include <glib.h>
+#include <glib-object.h>
+
+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 (void)
+{
+ int pid;
+ GIOChannel *in_channels[2];
+ GIOChannel *out_channels[2];
+ GSource *source;
+
+ 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]);
+
+ source = g_io_create_watch (out_channels[0], G_IO_IN | G_IO_HUP);
+ g_source_set_closure (source,
+ g_cclosure_new (G_CALLBACK (input_callback), in_channels[1], NULL));
+ g_source_attach (source, NULL);
+ }
+ 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;
+
+ g_type_init ();
+
+ 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;
+}
diff --git a/trunk/tests/timeloop.c b/trunk/tests/timeloop.c
new file mode 100644
index 000000000..457e74de7
--- /dev/null
+++ b/trunk/tests/timeloop.c
@@ -0,0 +1,216 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#include <glib.h>
+
+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 (void)
+{
+ 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;
+}
diff --git a/trunk/tests/tree-test.c b/trunk/tests/tree-test.c
new file mode 100644
index 000000000..c5cb105aa
--- /dev/null
+++ b/trunk/tests/tree-test.c
@@ -0,0 +1,246 @@
+/* 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <stdio.h>
+#include <string.h>
+#include "glib.h"
+
+
+static gint
+my_compare (gconstpointer a,
+ gconstpointer b)
+{
+ const char *cha = a;
+ const char *chb = b;
+
+ return *cha - *chb;
+}
+
+static gint
+my_search (gconstpointer a,
+ gconstpointer b)
+{
+ return my_compare (b, a);
+}
+
+static gpointer destroyed_key = NULL;
+static gpointer destroyed_value = NULL;
+
+static void
+my_key_destroy (gpointer key)
+{
+ destroyed_key = key;
+}
+
+static void
+my_value_destroy (gpointer value)
+{
+ destroyed_value = value;
+}
+
+static gint
+my_traverse (gpointer key,
+ gpointer value,
+ gpointer data)
+{
+ char *ch = key;
+ g_assert ((*ch) > 0);
+ return FALSE;
+}
+
+char chars[] =
+ "0123456789"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz";
+
+char chars2[] =
+ "0123456789"
+ "abcdefghijklmnopqrstuvwxyz";
+
+static gint
+check_order (gpointer key,
+ gpointer value,
+ gpointer data)
+{
+ char **p = data;
+ char *ch = key;
+
+ g_assert (**p == *ch);
+
+ (*p)++;
+
+ return FALSE;
+}
+
+
+
+int
+main (int argc,
+ char *argv[])
+{
+ gint i;
+ GTree *tree;
+ gboolean removed;
+ char c, d;
+ char *p;
+
+ tree = g_tree_new (my_compare);
+
+ for (i = 0; chars[i]; i++)
+ g_tree_insert (tree, &chars[i], &chars[i]);
+
+ g_tree_foreach (tree, my_traverse, NULL);
+
+ g_assert (g_tree_nnodes (tree) == strlen (chars));
+ g_assert (g_tree_height (tree) == 6);
+
+ p = chars;
+ g_tree_foreach (tree, check_order, &p);
+
+ for (i = 0; i < 26; i++)
+ {
+ removed = g_tree_remove (tree, &chars[i + 10]);
+ g_assert (removed);
+ }
+
+ c = '\0';
+ removed = g_tree_remove (tree, &c);
+ g_assert (removed == FALSE);
+
+ g_tree_foreach (tree, my_traverse, NULL);
+
+ g_assert (g_tree_nnodes (tree) == strlen (chars2));
+ g_assert (g_tree_height (tree) == 6);
+
+ p = chars2;
+ g_tree_foreach (tree, check_order, &p);
+
+ for (i = 25; i >= 0; i--)
+ g_tree_insert (tree, &chars[i + 10], &chars[i + 10]);
+
+ p = chars;
+ g_tree_foreach (tree, check_order, &p);
+
+ c = '0';
+ p = g_tree_lookup (tree, &c);
+ g_assert (p && *p == c);
+
+ c = 'A';
+ p = g_tree_lookup (tree, &c);
+ g_assert (p && *p == c);
+
+ c = 'a';
+ p = g_tree_lookup (tree, &c);
+ g_assert (p && *p == c);
+
+ c = 'z';
+ p = g_tree_lookup (tree, &c);
+ g_assert (p && *p == c);
+
+ c = '!';
+ p = g_tree_lookup (tree, &c);
+ g_assert (p == NULL);
+
+ c = '=';
+ p = g_tree_lookup (tree, &c);
+ g_assert (p == NULL);
+
+ c = '|';
+ p = g_tree_lookup (tree, &c);
+ g_assert (p == NULL);
+
+ c = '0';
+ p = g_tree_search (tree, my_search, &c);
+ g_assert (p && *p == c);
+
+ c = 'A';
+ p = g_tree_search (tree, my_search, &c);
+ g_assert (p && *p == c);
+
+ c = 'a';
+ p = g_tree_search (tree, my_search, &c);
+ g_assert (p &&*p == c);
+
+ c = 'z';
+ p = g_tree_search (tree, my_search, &c);
+ g_assert (p && *p == c);
+
+ c = '!';
+ p = g_tree_search (tree, my_search, &c);
+ g_assert (p == NULL);
+
+ c = '=';
+ p = g_tree_search (tree, my_search, &c);
+ g_assert (p == NULL);
+
+ c = '|';
+ p = g_tree_search (tree, my_search, &c);
+ g_assert (p == NULL);
+
+
+ g_tree_destroy (tree);
+
+ tree = g_tree_new_full ((GCompareDataFunc)my_compare, NULL,
+ my_key_destroy,
+ my_value_destroy);
+
+ for (i = 0; chars[i]; i++)
+ g_tree_insert (tree, &chars[i], &chars[i]);
+
+ c = '0';
+ g_tree_insert (tree, &c, &c);
+ g_assert (destroyed_key == &c);
+ g_assert (destroyed_value == &chars[0]);
+ destroyed_key = NULL;
+ destroyed_value = NULL;
+
+ d = '1';
+ g_tree_replace (tree, &d, &d);
+ g_assert (destroyed_key == &chars[1]);
+ g_assert (destroyed_value == &chars[1]);
+ destroyed_key = NULL;
+ destroyed_value = NULL;
+
+ c = '2';
+ removed = g_tree_remove (tree, &c);
+ g_assert (removed);
+ g_assert (destroyed_key == &chars[2]);
+ g_assert (destroyed_value == &chars[2]);
+ destroyed_key = NULL;
+ destroyed_value = NULL;
+
+ c = '3';
+ removed = g_tree_steal (tree, &c);
+ g_assert (removed);
+ g_assert (destroyed_key == NULL);
+ g_assert (destroyed_value == NULL);
+
+ return 0;
+}
+
diff --git a/trunk/tests/type-test.c b/trunk/tests/type-test.c
new file mode 100644
index 000000000..cbaaa7d51
--- /dev/null
+++ b/trunk/tests/type-test.c
@@ -0,0 +1,142 @@
+/* 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <stdio.h>
+#include <string.h>
+#include "glib.h"
+
+
+
+int
+main (int argc,
+ char *argv[])
+{
+ gchar *string;
+ gushort gus;
+ guint gui;
+ gulong gul;
+ gsize gsz;
+ gshort gs;
+ gint gi;
+ glong gl;
+ gint16 gi16t1;
+ gint16 gi16t2;
+ gint32 gi32t1;
+ gint32 gi32t2;
+ guint16 gu16t1 = 0x44afU, gu16t2 = 0xaf44U;
+ guint32 gu32t1 = 0x02a7f109U, gu32t2 = 0x09f1a702U;
+ guint64 gu64t1 = G_GINT64_CONSTANT(0x1d636b02300a7aa7U),
+ gu64t2 = G_GINT64_CONSTANT(0xa77a0a30026b631dU);
+ gint64 gi64t1;
+ gint64 gi64t2;
+ gssize gsst1;
+ gssize gsst2;
+ gsize gst1;
+ gsize gst2;
+
+ /* type sizes */
+ g_assert (sizeof (gint8) == 1);
+ g_assert (sizeof (gint16) == 2);
+ g_assert (sizeof (gint32) == 4);
+ g_assert (sizeof (gint64) == 8);
+
+ g_assert (GUINT16_SWAP_LE_BE (gu16t1) == gu16t2);
+ g_assert (GUINT32_SWAP_LE_BE (gu32t1) == gu32t2);
+ g_assert (GUINT64_SWAP_LE_BE (gu64t1) == gu64t2);
+
+ /* Test the G_(MIN|MAX|MAXU)(SHORT|INT|LONG) macros */
+
+ gus = G_MAXUSHORT;
+ gus++;
+ g_assert (gus == 0);
+
+ gui = G_MAXUINT;
+ gui++;
+ g_assert (gui == 0);
+
+ gul = G_MAXULONG;
+ gul++;
+ g_assert (gul == 0);
+
+ gsz = G_MAXSIZE;
+ gsz++;
+
+ g_assert (gsz == 0);
+
+ gs = G_MAXSHORT;
+ gs++;
+ g_assert (gs == G_MINSHORT);
+
+ gi = G_MAXINT;
+ gi++;
+ g_assert (gi == G_MININT);
+
+ gl = G_MAXLONG;
+ gl++;
+ g_assert (gl == G_MINLONG);
+
+ /* Test the G_G(U)?INT(16|32|64)_FORMAT macros */
+
+ gi16t1 = -0x3AFA;
+ gu16t1 = 0xFAFA;
+ gi32t1 = -0x3AFAFAFA;
+ gu32t1 = 0xFAFAFAFA;
+
+#define FORMAT "%" G_GINT16_FORMAT " %" G_GINT32_FORMAT \
+ " %" G_GUINT16_FORMAT " %" G_GUINT32_FORMAT "\n"
+ string = g_strdup_printf (FORMAT, gi16t1, gi32t1, gu16t1, gu32t1);
+ sscanf (string, FORMAT, &gi16t2, &gi32t2, &gu16t2, &gu32t2);
+ g_free (string);
+ g_assert (gi16t1 == gi16t2);
+ g_assert (gi32t1 == gi32t2);
+ g_assert (gu16t1 == gu16t2);
+ g_assert (gu32t1 == gu32t2);
+
+ gi64t1 = G_GINT64_CONSTANT (-0x3AFAFAFAFAFAFAFA);
+ gu64t1 = G_GINT64_CONSTANT (0xFAFAFAFAFAFAFAFA);
+
+#define FORMAT64 "%" G_GINT64_FORMAT " %" G_GUINT64_FORMAT "\n"
+ string = g_strdup_printf (FORMAT64, gi64t1, gu64t1);
+ sscanf (string, FORMAT64, &gi64t2, &gu64t2);
+ g_free (string);
+ g_assert (gi64t1 == gi64t2);
+ g_assert (gu64t1 == gu64t2);
+
+ gsst1 = -0x3AFAFAFA;
+ gst1 = 0xFAFAFAFA;
+
+#define FORMATSIZE "%" G_GSSIZE_FORMAT " %" G_GSIZE_FORMAT "\n"
+ string = g_strdup_printf (FORMATSIZE, gsst1, gst1);
+ sscanf (string, FORMATSIZE, &gsst2, &gst2);
+ g_free (string);
+ g_assert (gsst1 == gsst2);
+ g_assert (gst1 == gst2);
+
+ return 0;
+}
diff --git a/trunk/tests/unicode-caseconv.c b/trunk/tests/unicode-caseconv.c
new file mode 100644
index 000000000..0563ab6c5
--- /dev/null
+++ b/trunk/tests/unicode-caseconv.c
@@ -0,0 +1,132 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <locale.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <glib.h>
+#include <string.h>
+
+int main (int argc, char **argv)
+{
+ FILE *infile;
+ char buffer[1024];
+ char **strings;
+ char *srcdir = getenv ("srcdir");
+ char *filename;
+ const char *locale;
+ const char *test;
+ const char *expected;
+ char *convert;
+ char *current_locale = setlocale (LC_CTYPE, NULL);
+ gint result = 0;
+
+ if (!srcdir)
+ srcdir = ".";
+ filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "casemap.txt", NULL);
+
+ infile = fopen (filename, "r");
+ if (!infile)
+ {
+ fprintf (stderr, "Failed to open %s\n", filename );
+ exit (1);
+ }
+
+ while (fgets (buffer, sizeof(buffer), infile))
+ {
+ if (buffer[0] == '#')
+ continue;
+
+ strings = g_strsplit (buffer, "\t", -1);
+
+ locale = strings[0];
+
+ if (!locale[0])
+ locale = "C";
+
+ if (strcmp (locale, current_locale) != 0)
+ {
+ setlocale (LC_CTYPE, locale);
+ current_locale = setlocale (LC_CTYPE, NULL);
+
+ if (strncmp (current_locale, locale, 2) != 0)
+ {
+ fprintf (stderr, "Cannot set locale to %s, skipping\n", locale);
+ goto next;
+ }
+ }
+
+ test = strings[1];
+
+ /* gen-casemap-txt.pl uses an empty string when a single character
+ * doesn't have an equivalent in a particular case; since that behavior
+ * is nonsense for multicharacter strings, it would make more sense
+ * to put the expected result .. the original character unchanged. But
+ * for now, we just work around it here and take the empty string to mean
+ * "same as original"
+ */
+
+ convert = g_utf8_strup (test, -1);
+ expected = strings[4][0] ? strings[4] : test;
+ if (strcmp (convert, expected) != 0)
+ {
+ fprintf (stderr, "Failure: toupper(%s) == %s, should have been %s\n",
+ test, convert, expected);
+ result = 1;
+ }
+ g_free (convert);
+
+ convert = g_utf8_strdown (test, -1);
+ expected = strings[2][0] ? strings[2] : test;
+ if (strcmp (convert, expected) != 0)
+ {
+ fprintf (stderr, "Failure: tolower(%s) == %s, should have been %s\n",
+ test, convert, expected);
+ result = 1;
+ }
+ g_free (convert);
+
+ next:
+ g_strfreev (strings);
+ }
+
+ fclose (infile);
+
+ g_free (filename);
+ filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "casefold.txt", NULL);
+
+ infile = fopen (filename, "r");
+ if (!infile)
+ {
+ fprintf (stderr, "Failed to open %s\n", filename );
+ g_free (filename);
+ exit (1);
+ }
+
+ while (fgets (buffer, sizeof(buffer), infile))
+ {
+ if (buffer[0] == '#')
+ continue;
+
+ buffer[strlen(buffer) - 1] = '\0';
+ strings = g_strsplit (buffer, "\t", -1);
+
+ test = strings[0];
+
+ convert = g_utf8_casefold (test, -1);
+ if (strcmp (convert, strings[1]) != 0)
+ {
+ fprintf (stderr, "Failure: casefold(%s) == '%s', should have been '%s'\n",
+ test, convert, strings[1]);
+ result = 1;
+ }
+ g_free (convert);
+
+ g_strfreev (strings);
+ }
+
+ fclose (infile);
+ g_free (filename);
+
+ return result;
+}
diff --git a/trunk/tests/unicode-collate.c b/trunk/tests/unicode-collate.c
new file mode 100644
index 000000000..785f16909
--- /dev/null
+++ b/trunk/tests/unicode-collate.c
@@ -0,0 +1,124 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+
+typedef struct {
+ const char *key;
+ const char *str;
+} Line;
+
+
+int
+compare_collate (const void *a, const void *b)
+{
+ const Line *line_a = a;
+ const Line *line_b = b;
+
+ return g_utf8_collate (line_a->str, line_b->str);
+}
+
+int
+compare_key (const void *a, const void *b)
+{
+ const Line *line_a = a;
+ const Line *line_b = b;
+
+ return strcmp (line_a->key, line_b->key);
+}
+
+int main (int argc, char **argv)
+{
+ GIOChannel *in;
+ GError *error = NULL;
+ GArray *line_array = g_array_new (FALSE, FALSE, sizeof(Line));
+ guint i;
+ gboolean do_key = FALSE;
+ gboolean do_file = FALSE;
+ gchar *locale;
+
+ /* FIXME: need to modify environment here,
+ * since g_utf8_collate_key calls setlocal (LC_COLLATE, "")
+ */
+ g_setenv ("LC_ALL", "en_US", TRUE);
+ locale = setlocale (LC_ALL, "");
+ if (locale == NULL || strcmp (locale, "en_US") != 0)
+ {
+ fprintf (stderr, "No suitable locale, skipping test\n");
+ return 2;
+ }
+
+ if (argc != 1 && argc != 2 && argc != 3)
+ {
+ fprintf (stderr, "Usage: unicode-collate [--key|--file] [FILE]\n");
+ return 1;
+ }
+
+ i = 1;
+ if (argc > 1)
+ {
+ if (strcmp (argv[1], "--key") == 0)
+ {
+ do_key = TRUE;
+ i = 2;
+ }
+ else if (strcmp (argv[1], "--file") == 0)
+ {
+ do_key = TRUE;
+ do_file = TRUE;
+ i = 2;
+ }
+ }
+
+ if (argc > i)
+ {
+ in = g_io_channel_new_file (argv[i], "r", &error);
+ if (!in)
+ {
+ fprintf (stderr, "Cannot open %s: %s\n", argv[i], error->message);
+ return 1;
+ }
+ }
+ else
+ {
+ in = g_io_channel_unix_new (fileno (stdin));
+ }
+
+ while (TRUE)
+ {
+ gsize term_pos;
+ gchar *str;
+ Line line;
+
+ if (g_io_channel_read_line (in, &str, NULL, &term_pos, &error) != G_IO_STATUS_NORMAL)
+ break;
+
+ str[term_pos] = '\0';
+
+ if (do_file)
+ line.key = g_utf8_collate_key_for_filename (str, -1);
+ else
+ line.key = g_utf8_collate_key (str, -1);
+ line.str = str;
+
+ g_array_append_val (line_array, line);
+ }
+
+ if (error)
+ {
+ fprintf (stderr, "Error reading test file, %s\n", error->message);
+ return 1;
+ }
+
+ qsort (line_array->data, line_array->len, sizeof (Line), do_key ? compare_key : compare_collate);
+ for (i = 0; i < line_array->len; i++)
+ printf ("%s\n", g_array_index (line_array, Line, i).str);
+
+ g_io_channel_unref (in);
+
+ return 0;
+}
diff --git a/trunk/tests/unicode-encoding.c b/trunk/tests/unicode-encoding.c
new file mode 100644
index 000000000..09b339297
--- /dev/null
+++ b/trunk/tests/unicode-encoding.c
@@ -0,0 +1,422 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+
+static gint exit_status = 0;
+
+static void
+croak (char *format, ...)
+{
+ va_list va;
+
+ va_start (va, format);
+ vfprintf (stderr, format, va);
+ va_end (va);
+
+ exit (1);
+}
+
+static void
+fail (char *format, ...)
+{
+ va_list va;
+
+ va_start (va, format);
+ vfprintf (stderr, format, va);
+ va_end (va);
+
+ exit_status |= 1;
+}
+
+typedef enum
+{
+ VALID,
+ INCOMPLETE,
+ NOTUNICODE,
+ OVERLONG,
+ MALFORMED
+} Status;
+
+static gboolean
+ucs4_equal (gunichar *a, gunichar *b)
+{
+ while (*a && *b && (*a == *b))
+ {
+ a++;
+ b++;
+ }
+
+ return (*a == *b);
+}
+
+static gboolean
+utf16_equal (gunichar2 *a, gunichar2 *b)
+{
+ while (*a && *b && (*a == *b))
+ {
+ a++;
+ b++;
+ }
+
+ return (*a == *b);
+}
+
+static gint
+utf16_count (gunichar2 *a)
+{
+ gint result = 0;
+
+ while (a[result])
+ result++;
+
+ return result;
+}
+
+static void
+process (gint line,
+ gchar *utf8,
+ Status status,
+ gunichar *ucs4,
+ gint ucs4_len)
+{
+ const gchar *end;
+ gboolean is_valid = g_utf8_validate (utf8, -1, &end);
+ GError *error = NULL;
+ glong items_read, items_written;
+
+ switch (status)
+ {
+ case VALID:
+ if (!is_valid)
+ {
+ fail ("line %d: valid but g_utf8_validate returned FALSE\n", line);
+ return;
+ }
+ break;
+ case NOTUNICODE:
+ case INCOMPLETE:
+ case OVERLONG:
+ case MALFORMED:
+ if (is_valid)
+ {
+ fail ("line %d: invalid but g_utf8_validate returned TRUE\n", line);
+ return;
+ }
+ break;
+ }
+
+ if (status == INCOMPLETE)
+ {
+ gunichar *ucs4_result;
+
+ ucs4_result = g_utf8_to_ucs4 (utf8, -1, NULL, NULL, &error);
+
+ if (!error || !g_error_matches (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT))
+ {
+ fail ("line %d: incomplete input not properly detected\n", line);
+ return;
+ }
+ g_clear_error (&error);
+
+ ucs4_result = g_utf8_to_ucs4 (utf8, -1, &items_read, NULL, &error);
+
+ if (!ucs4_result || items_read == strlen (utf8))
+ {
+ fail ("line %d: incomplete input not properly detected\n", line);
+ return;
+ }
+
+ g_free (ucs4_result);
+ }
+
+ if (status == VALID || status == NOTUNICODE)
+ {
+ gunichar *ucs4_result;
+ gchar *utf8_result;
+
+ ucs4_result = g_utf8_to_ucs4 (utf8, -1, &items_read, &items_written, &error);
+ if (!ucs4_result)
+ {
+ fail ("line %d: conversion to ucs4 failed: %s\n", line, error->message);
+ return;
+ }
+
+ if (!ucs4_equal (ucs4_result, ucs4) ||
+ items_read != strlen (utf8) ||
+ items_written != ucs4_len)
+ {
+ fail ("line %d: results of conversion to ucs4 do not match expected.\n", line);
+ return;
+ }
+
+ g_free (ucs4_result);
+
+ ucs4_result = g_utf8_to_ucs4_fast (utf8, -1, &items_written);
+
+ if (!ucs4_equal (ucs4_result, ucs4) ||
+ items_written != ucs4_len)
+ {
+ fail ("line %d: results of conversion to ucs4 do not match expected.\n", line);
+ return;
+ }
+
+ utf8_result = g_ucs4_to_utf8 (ucs4_result, -1, &items_read, &items_written, &error);
+ if (!utf8_result)
+ {
+ fail ("line %d: conversion back to utf8 failed: %s", line, error->message);
+ return;
+ }
+
+ if (strcmp (utf8_result, utf8) != 0 ||
+ items_read != ucs4_len ||
+ items_written != strlen (utf8))
+ {
+ fail ("line %d: conversion back to utf8 did not match original\n", line);
+ return;
+ }
+
+ g_free (utf8_result);
+ g_free (ucs4_result);
+ }
+
+ if (status == VALID)
+ {
+ gunichar2 *utf16_expected_tmp;
+ gunichar2 *utf16_expected;
+ gunichar2 *utf16_from_utf8;
+ gunichar2 *utf16_from_ucs4;
+ gunichar *ucs4_result;
+ gsize bytes_written;
+ gint n_chars;
+ gchar *utf8_result;
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+#define TARGET "UTF-16LE"
+#else
+#define TARGET "UTF-16"
+#endif
+
+ if (!(utf16_expected_tmp = (gunichar2 *)g_convert (utf8, -1, TARGET, "UTF-8",
+ NULL, &bytes_written, NULL)))
+ {
+ fail ("line %d: could not convert to UTF-16 via g_convert\n", line);
+ return;
+ }
+
+ /* zero-terminate and remove BOM
+ */
+ n_chars = bytes_written / 2;
+ if (utf16_expected_tmp[0] == 0xfeff) /* BOM */
+ {
+ n_chars--;
+ utf16_expected = g_new (gunichar2, n_chars + 1);
+ memcpy (utf16_expected, utf16_expected_tmp + 1, sizeof(gunichar2) * n_chars);
+ }
+ else if (utf16_expected_tmp[0] == 0xfffe) /* ANTI-BOM */
+ {
+ fail ("line %d: conversion via iconv to \"UTF-16\" is not native-endian\n", line);
+ return;
+ }
+ else
+ {
+ utf16_expected = g_new (gunichar2, n_chars + 1);
+ memcpy (utf16_expected, utf16_expected_tmp, sizeof(gunichar2) * n_chars);
+ }
+
+ utf16_expected[n_chars] = '\0';
+
+ if (!(utf16_from_utf8 = g_utf8_to_utf16 (utf8, -1, &items_read, &items_written, &error)))
+ {
+ fail ("line %d: conversion to ucs16 failed: %s\n", line, error->message);
+ return;
+ }
+
+ if (items_read != strlen (utf8) ||
+ utf16_count (utf16_from_utf8) != items_written)
+ {
+ fail ("line %d: length error in conversion to ucs16\n", line);
+ return;
+ }
+
+ if (!(utf16_from_ucs4 = g_ucs4_to_utf16 (ucs4, -1, &items_read, &items_written, &error)))
+ {
+ fail ("line %d: conversion to ucs16 failed: %s\n", line, error->message);
+ return;
+ }
+
+ if (items_read != ucs4_len ||
+ utf16_count (utf16_from_ucs4) != items_written)
+ {
+ fail ("line %d: length error in conversion to ucs16\n", line);
+ return;
+ }
+
+ if (!utf16_equal (utf16_from_utf8, utf16_expected) ||
+ !utf16_equal (utf16_from_ucs4, utf16_expected))
+ {
+ fail ("line %d: results of conversion to ucs16 do not match\n", line);
+ return;
+ }
+
+ if (!(utf8_result = g_utf16_to_utf8 (utf16_from_utf8, -1, &items_read, &items_written, &error)))
+ {
+ fail ("line %d: conversion back to utf8 failed: %s\n", line, error->message);
+ return;
+ }
+
+ if (items_read != utf16_count (utf16_from_utf8) ||
+ items_written != strlen (utf8))
+ {
+ fail ("line %d: length error in conversion from ucs16 to utf8\n", line);
+ return;
+ }
+
+ if (!(ucs4_result = g_utf16_to_ucs4 (utf16_from_ucs4, -1, &items_read, &items_written, &error)))
+ {
+ fail ("line %d: conversion back to utf8/ucs4 failed\n", line);
+ return;
+ }
+
+ if (items_read != utf16_count (utf16_from_utf8) ||
+ items_written != ucs4_len)
+ {
+ fail ("line %d: length error in conversion from ucs16 to ucs4\n", line);
+ return;
+ }
+
+ if (strcmp (utf8, utf8_result) != 0 ||
+ !ucs4_equal (ucs4, ucs4_result))
+ {
+ fail ("line %d: conversion back to utf8/ucs4 did not match original\n", line);
+ return;
+ }
+
+ g_free (utf16_expected_tmp);
+ g_free (utf16_expected);
+ g_free (utf16_from_utf8);
+ g_free (utf16_from_ucs4);
+ g_free (utf8_result);
+ g_free (ucs4_result);
+ }
+}
+
+int
+main (int argc, char **argv)
+{
+ gchar *srcdir = getenv ("srcdir");
+ gchar *testfile;
+ gchar *contents;
+ GError *error = NULL;
+ gchar *p, *end;
+ char *tmp;
+ gint state = 0;
+ gint line = 1;
+ gint start_line = 0; /* Quiet GCC */
+ gchar *utf8 = NULL; /* Quiet GCC */
+ GArray *ucs4;
+ Status status = VALID; /* Quiet GCC */
+
+ if (!srcdir)
+ srcdir = ".";
+
+ testfile = g_strconcat (srcdir, G_DIR_SEPARATOR_S "utf8.txt", NULL);
+
+ g_file_get_contents (testfile, &contents, NULL, &error);
+ if (error)
+ croak ("Cannot open utf8.txt: %s", error->message);
+
+ ucs4 = g_array_new (TRUE, FALSE, sizeof(gunichar));
+
+ p = contents;
+
+ /* Loop over lines */
+ while (*p)
+ {
+ while (*p && (*p == ' ' || *p == '\t'))
+ p++;
+
+ end = p;
+ while (*end && (*end != '\r' && *end != '\n'))
+ end++;
+
+ if (!*p || *p == '#' || *p == '\r' || *p == '\n')
+ goto next_line;
+
+ tmp = g_strstrip (g_strndup (p, end - p));
+
+ switch (state)
+ {
+ case 0:
+ /* UTF-8 string */
+ start_line = line;
+ utf8 = tmp;
+ tmp = NULL;
+ break;
+
+ case 1:
+ /* Status */
+ if (!strcmp (tmp, "VALID"))
+ status = VALID;
+ else if (!strcmp (tmp, "INCOMPLETE"))
+ status = INCOMPLETE;
+ else if (!strcmp (tmp, "NOTUNICODE"))
+ status = NOTUNICODE;
+ else if (!strcmp (tmp, "OVERLONG"))
+ status = OVERLONG;
+ else if (!strcmp (tmp, "MALFORMED"))
+ status = MALFORMED;
+ else
+ croak ("Invalid status on line %d\n", line);
+
+ if (status != VALID && status != NOTUNICODE)
+ state++; /* No UCS-4 data */
+
+ break;
+
+ case 2:
+ /* UCS-4 version */
+
+ p = strtok (tmp, " \t");
+ while (p)
+ {
+ gchar *endptr;
+
+ gunichar ch = strtoul (p, &endptr, 16);
+ if (*endptr != '\0')
+ croak ("Invalid UCS-4 character on line %d\n", line);
+
+ g_array_append_val (ucs4, ch);
+
+ p = strtok (NULL, " \t");
+ }
+
+ break;
+ }
+
+ g_free (tmp);
+ state = (state + 1) % 3;
+
+ if (state == 0)
+ {
+ process (start_line, utf8, status, (gunichar *)ucs4->data, ucs4->len);
+ g_array_set_size (ucs4, 0);
+ g_free (utf8);
+ }
+
+ next_line:
+ p = end;
+ if (*p && *p == '\r')
+ p++;
+ if (*p && *p == '\n')
+ p++;
+
+ line++;
+ }
+
+ return exit_status;
+}
diff --git a/trunk/tests/unicode-normalize.c b/trunk/tests/unicode-normalize.c
new file mode 100644
index 000000000..9679e2550
--- /dev/null
+++ b/trunk/tests/unicode-normalize.c
@@ -0,0 +1,210 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+gboolean success = TRUE;
+
+static char *
+decode (const gchar *input)
+{
+ unsigned ch;
+ int offset = 0;
+ GString *result = g_string_new (NULL);
+
+ do
+ {
+ if (sscanf (input + offset, "%x", &ch) != 1)
+ {
+ fprintf (stderr, "Error parsing character string %s\n", input);
+ exit (1);
+ }
+
+ g_string_append_unichar (result, ch);
+
+ while (input[offset] && input[offset] != ' ')
+ offset++;
+ while (input[offset] && input[offset] == ' ')
+ offset++;
+ }
+ while (input[offset]);
+
+ return g_string_free (result, FALSE);
+}
+
+const char *names[4] = {
+ "NFD",
+ "NFC",
+ "NFKD",
+ "NFKC"
+};
+
+static char *
+encode (const gchar *input)
+{
+ GString *result = g_string_new(NULL);
+
+ const gchar *p = input;
+ while (*p)
+ {
+ gunichar c = g_utf8_get_char (p);
+ g_string_append_printf (result, "%04X ", c);
+ p = g_utf8_next_char(p);
+ }
+
+ return g_string_free (result, FALSE);
+}
+
+static void
+test_form (int line,
+ GNormalizeMode mode,
+ gboolean do_compat,
+ int expected,
+ char **c,
+ char **raw)
+{
+ int i;
+
+ gboolean mode_is_compat = (mode == G_NORMALIZE_NFKC ||
+ mode == G_NORMALIZE_NFKD);
+
+ if (mode_is_compat || !do_compat)
+ {
+ for (i = 0; i < 3; i++)
+ {
+ char *result = g_utf8_normalize (c[i], -1, mode);
+ if (strcmp (result, c[expected]) != 0)
+ {
+ char *result_raw = encode(result);
+ fprintf (stderr, "\nFailure: %d/%d: %s\n", line, i + 1, raw[5]);
+ fprintf (stderr, " g_utf8_normalize (%s, %s) != %s but %s\n",
+ raw[i], names[mode], raw[expected], result_raw);
+ g_free (result_raw);
+ success = FALSE;
+ }
+
+ g_free (result);
+ }
+ }
+ if (mode_is_compat || do_compat)
+ {
+ for (i = 3; i < 5; i++)
+ {
+ char *result = g_utf8_normalize (c[i], -1, mode);
+ if (strcmp (result, c[expected]) != 0)
+ {
+ char *result_raw = encode(result);
+ fprintf (stderr, "\nFailure: %d/%d: %s\n", line, i, raw[5]);
+ fprintf (stderr, " g_utf8_normalize (%s, %s) != %s but %s\n",
+ raw[i], names[mode], raw[expected], result_raw);
+ g_free (result_raw);
+ success = FALSE;
+ }
+
+ g_free (result);
+ }
+ }
+}
+
+static gboolean
+process_one (int line, gchar **columns)
+{
+ char *c[5];
+ int i;
+ gboolean skip = FALSE;
+
+ for (i=0; i < 5; i++)
+ {
+ c[i] = decode(columns[i]);
+ if (!c[i])
+ skip = TRUE;
+ }
+
+ if (!skip)
+ {
+ test_form (line, G_NORMALIZE_NFD, FALSE, 2, c, columns);
+ test_form (line, G_NORMALIZE_NFD, TRUE, 4, c, columns);
+ test_form (line, G_NORMALIZE_NFC, FALSE, 1, c, columns);
+ test_form (line, G_NORMALIZE_NFC, TRUE, 3, c, columns);
+ test_form (line, G_NORMALIZE_NFKD, TRUE, 4, c, columns);
+ test_form (line, G_NORMALIZE_NFKC, TRUE, 3, c, columns);
+ }
+
+ for (i=0; i < 5; i++)
+ g_free (c[i]);
+
+ return TRUE;
+}
+
+int main (int argc, char **argv)
+{
+ GIOChannel *in;
+ GError *error = NULL;
+ GString *buffer = g_string_new (NULL);
+ int line_to_do = 0;
+ int line = 1;
+
+ if (argc != 2 && argc != 3)
+ {
+ fprintf (stderr, "Usage: unicode-normalize NormalizationTest.txt LINE\n");
+ return 1;
+ }
+
+ if (argc == 3)
+ line_to_do = atoi(argv[2]);
+
+ in = g_io_channel_new_file (argv[1], "r", &error);
+ if (!in)
+ {
+ fprintf (stderr, "Cannot open %s: %s\n", argv[1], error->message);
+ return 1;
+ }
+
+ while (TRUE)
+ {
+ gsize term_pos;
+ gchar **columns;
+
+ if (g_io_channel_read_line_string (in, buffer, &term_pos, &error) != G_IO_STATUS_NORMAL)
+ break;
+
+ if (line_to_do && line != line_to_do)
+ goto next;
+
+ buffer->str[term_pos] = '\0';
+
+ if (buffer->str[0] == '#') /* Comment */
+ goto next;
+ if (buffer->str[0] == '@') /* Part */
+ {
+ fprintf (stderr, "\nProcessing %s\n", buffer->str + 1);
+ goto next;
+ }
+
+ columns = g_strsplit (buffer->str, ";", -1);
+ if (!columns[0])
+ goto next;
+
+ if (!process_one (line, columns))
+ return 1;
+ g_strfreev (columns);
+
+ next:
+ g_string_truncate (buffer, 0);
+ line++;
+ }
+
+ if (error)
+ {
+ fprintf (stderr, "Error reading test file, %s\n", error->message);
+ return 1;
+ }
+
+ g_io_channel_unref (in);
+ g_string_free (buffer, TRUE);
+
+ return !success;
+}
diff --git a/trunk/tests/uri-test.c b/trunk/tests/uri-test.c
new file mode 100644
index 000000000..340d774a2
--- /dev/null
+++ b/trunk/tests/uri-test.c
@@ -0,0 +1,477 @@
+/* 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/.
+ */
+
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
+#include <config.h>
+
+#include <glib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+typedef struct
+{
+ char *filename;
+ char *hostname;
+ char *expected_result;
+ GConvertError expected_error; /* If failed */
+} ToUriTest;
+
+ToUriTest
+to_uri_tests[] = {
+ { "/etc", NULL, "file:///etc"},
+ { "/etc", "", "file:///etc"},
+ { "/etc", "otherhost", "file://otherhost/etc"},
+#ifdef G_OS_WIN32
+ { "/etc", "localhost", "file:///etc"},
+ { "c:\\windows", NULL, "file:///c:/windows"},
+ { "c:\\windows", "localhost", "file:///c:/windows"},
+ { "c:\\windows", "otherhost", "file://otherhost/c:/windows"},
+ { "\\\\server\\share\\dir", NULL, "file:////server/share/dir"},
+ { "\\\\server\\share\\dir", "localhost", "file:////server/share/dir"},
+#else
+ { "/etc", "localhost", "file://localhost/etc"},
+ { "c:\\windows", NULL, NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH}, /* it's important to get this error on Unix */
+ { "c:\\windows", "localhost", NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH},
+ { "c:\\windows", "otherhost", NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH},
+#endif
+ { "etc", "localhost", NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH},
+#ifndef G_PLATFORM_WIN32
+ { "/etc/\xE5\xE4\xF6", NULL, "file:///etc/%E5%E4%F6" },
+ { "/etc/\xC3\xB6\xC3\xA4\xC3\xA5", NULL, "file:///etc/%C3%B6%C3%A4%C3%A5"},
+#endif
+ { "/etc", "\xC3\xB6\xC3\xA4\xC3\xA5", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE},
+ { "/etc", "\xE5\xE4\xF6", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE},
+ { "/etc/file with #%", NULL, "file:///etc/file%20with%20%23%25"},
+ { "", NULL, NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH},
+ { "", "", NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH},
+ { "", "localhost", NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH},
+ { "", "otherhost", NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH},
+ { "/0123456789", NULL, "file:///0123456789"},
+ { "/ABCDEFGHIJKLMNOPQRSTUVWXYZ", NULL, "file:///ABCDEFGHIJKLMNOPQRSTUVWXYZ"},
+ { "/abcdefghijklmnopqrstuvwxyz", NULL, "file:///abcdefghijklmnopqrstuvwxyz"},
+ { "/-_.!~*'()", NULL, "file:///-_.!~*'()"},
+#ifdef G_OS_WIN32
+ /* As '\\' is a path separator on Win32, it gets turned into '/' in the URI */
+ { "/\"#%<>[\\]^`{|}\x7F", NULL, "file:///%22%23%25%3C%3E%5B/%5D%5E%60%7B%7C%7D%7F"},
+#else
+ /* On Unix, '\\' is a normal character in the file name */
+ { "/\"#%<>[\\]^`{|}\x7F", NULL, "file:///%22%23%25%3C%3E%5B%5C%5D%5E%60%7B%7C%7D%7F"},
+#endif
+ { "/;@+$,", NULL, "file:///%3B@+$,"},
+ /* This and some of the following are of course as such illegal file names on Windows,
+ * and would not occur in real life.
+ */
+ { "/:", NULL, "file:///:"},
+ { "/?&=", NULL, "file:///%3F&="},
+ { "/", "0123456789-", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE},
+ { "/", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "file://ABCDEFGHIJKLMNOPQRSTUVWXYZ/"},
+ { "/", "abcdefghijklmnopqrstuvwxyz", "file://abcdefghijklmnopqrstuvwxyz/"},
+ { "/", "_.!~*'()", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE},
+ { "/", "\"#%<>[\\]^`{|}\x7F", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE},
+ { "/", ";?&=+$,", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE},
+ { "/", "/", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE},
+ { "/", "@:", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE},
+ { "/", "\x80\xFF", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE},
+ { "/", "\xC3\x80\xC3\xBF", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE},
+};
+
+
+typedef struct
+{
+ char *uri;
+ char *expected_filename;
+ char *expected_hostname;
+ GConvertError expected_error; /* If failed */
+} FromUriTest;
+
+FromUriTest
+from_uri_tests[] = {
+ { "file:///etc", "/etc"},
+ { "file:/etc", "/etc"},
+#ifdef G_OS_WIN32
+ /* On Win32 we don't return "localhost" hostames, just in case
+ * it isn't recognized anyway.
+ */
+ { "file://localhost/etc", "/etc", NULL},
+ { "file://localhost/etc/%23%25%20file", "/etc/#% file", NULL},
+ { "file://localhost/\xE5\xE4\xF6", "/\xe5\xe4\xf6", NULL},
+ { "file://localhost/%E5%E4%F6", "/\xe5\xe4\xf6", NULL},
+#else
+ { "file://localhost/etc", "/etc", "localhost"},
+ { "file://localhost/etc/%23%25%20file", "/etc/#% file", "localhost"},
+ { "file://localhost/\xE5\xE4\xF6", "/\xe5\xe4\xf6", "localhost"},
+ { "file://localhost/%E5%E4%F6", "/\xe5\xe4\xf6", "localhost"},
+#endif
+ { "file://otherhost/etc", "/etc", "otherhost"},
+ { "file://otherhost/etc/%23%25%20file", "/etc/#% file", "otherhost"},
+ { "file://%C3%B6%C3%A4%C3%A5/etc", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "file:////etc/%C3%B6%C3%C3%C3%A5", "//etc/\xc3\xb6\xc3\xc3\xc3\xa5", NULL},
+ { "file://\xE5\xE4\xF6/etc", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "file://%E5%E4%F6/etc", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "file:///some/file#bad", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "file://some", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "file:test", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "http://www.yahoo.com/", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "file:////etc", "//etc"},
+ { "file://///etc", "///etc"},
+#ifdef G_OS_WIN32
+ /* URIs with backslashes come from some nonstandard application, but accept them anyhow */
+ { "file:///c:\\foo", "c:\\foo"},
+ { "file:///c:/foo\\bar", "c:\\foo\\bar"},
+ /* Accept also the old Netscape drive-letter-and-vertical bar convention */
+ { "file:///c|/foo", "c:\\foo"},
+ { "file:////server/share/dir", "\\\\server\\share\\dir"},
+ { "file://localhost//server/share/foo", "\\\\server\\share\\foo"},
+ { "file://otherhost//server/share/foo", "\\\\server\\share\\foo", "otherhost"},
+#else
+ { "file:///c:\\foo", "/c:\\foo"},
+ { "file:///c:/foo", "/c:/foo"},
+ { "file:////c:/foo", "//c:/foo"},
+#endif
+ { "file://0123456789/", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "file://ABCDEFGHIJKLMNOPQRSTUVWXYZ/", "/", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"},
+ { "file://abcdefghijklmnopqrstuvwxyz/", "/", "abcdefghijklmnopqrstuvwxyz"},
+ { "file://-_.!~*'()/", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "file://\"<>[\\]^`{|}\x7F/", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "file://;?&=+$,/", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "file://%C3%80%C3%BF/", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "file://@/", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "file://:/", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "file://#/", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "file://%23/", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+ { "file://%2F/", NULL, NULL, G_CONVERT_ERROR_BAD_URI},
+};
+
+
+static gboolean any_failed = FALSE;
+
+static void
+run_to_uri_tests (void)
+{
+ int i;
+ gchar *res;
+ GError *error;
+
+ for (i = 0; i < G_N_ELEMENTS (to_uri_tests); i++)
+ {
+ error = NULL;
+ res = g_filename_to_uri (to_uri_tests[i].filename,
+ to_uri_tests[i].hostname,
+ &error);
+
+ if (to_uri_tests[i].expected_result == NULL)
+ {
+ if (res != NULL)
+ {
+ g_print ("\ng_filename_to_uri() test %d failed, expected to return NULL, actual result: %s\n", i, res);
+ any_failed = TRUE;
+ }
+ else
+ {
+ if (error == NULL)
+ {
+ g_print ("\ng_filename_to_uri() test %d failed, returned NULL, but didn't set error\n", i);
+ any_failed = TRUE;
+ }
+ else if (error->domain != G_CONVERT_ERROR)
+ {
+ g_print ("\ng_filename_to_uri() test %d failed, returned NULL, set non G_CONVERT_ERROR error\n", i);
+ any_failed = TRUE;
+ }
+ else if (error->code != to_uri_tests[i].expected_error)
+ {
+ g_print ("\ng_filename_to_uri() test %d failed as expected, but set wrong errorcode %d instead of expected %d \n",
+ i, error->code, to_uri_tests[i].expected_error);
+ any_failed = TRUE;
+ }
+ }
+ }
+ else if (res == NULL || strcmp (res, to_uri_tests[i].expected_result) != 0)
+ {
+ g_print ("\ng_filename_to_uri() test %d failed, expected result: %s, actual result: %s\n",
+ i, to_uri_tests[i].expected_result, (res) ? res : "NULL");
+ if (error)
+ g_print ("Error message: %s\n", error->message);
+ any_failed = TRUE;
+ }
+ g_free (res);
+ }
+}
+
+static void
+run_from_uri_tests (void)
+{
+ int i;
+ gchar *res;
+ gchar *hostname;
+ GError *error;
+
+ for (i = 0; i < G_N_ELEMENTS (from_uri_tests); i++)
+ {
+ error = NULL;
+ res = g_filename_from_uri (from_uri_tests[i].uri,
+ &hostname,
+ &error);
+
+ if (from_uri_tests[i].expected_filename == NULL)
+ {
+ if (res != NULL)
+ {
+ g_print ("\ng_filename_from_uri() test %d failed, expected to return NULL, actual result: %s\n", i, res);
+ any_failed = TRUE;
+ }
+ else
+ {
+ if (error == NULL)
+ {
+ g_print ("\ng_filename_from_uri() test %d failed, returned NULL, but didn't set error\n", i);
+ any_failed = TRUE;
+ }
+ else if (error->domain != G_CONVERT_ERROR)
+ {
+ g_print ("\ng_filename_from_uri() test %d failed, returned NULL, set non G_CONVERT_ERROR error\n", i);
+ any_failed = TRUE;
+ }
+ else if (error->code != from_uri_tests[i].expected_error)
+ {
+ g_print ("\ng_filename_from_uri() test %d failed as expected, but set wrong errorcode %d instead of expected %d \n",
+ i, error->code, from_uri_tests[i].expected_error);
+ any_failed = TRUE;
+ }
+ }
+ }
+ else
+ {
+#ifdef G_OS_WIN32
+ gchar *slash, *p;
+
+ p = from_uri_tests[i].expected_filename = g_strdup (from_uri_tests[i].expected_filename);
+ while ((slash = strchr (p, '/')) != NULL)
+ {
+ *slash = '\\';
+ p = slash + 1;
+ }
+#endif
+ if (res == NULL || strcmp (res, from_uri_tests[i].expected_filename) != 0)
+ {
+ g_print ("\ng_filename_from_uri() test %d failed, expected result: %s, actual result: %s\n",
+ i, from_uri_tests[i].expected_filename, (res) ? res : "NULL");
+ any_failed = TRUE;
+ }
+
+ if (from_uri_tests[i].expected_hostname == NULL)
+ {
+ if (hostname != NULL)
+ {
+ g_print ("\ng_filename_from_uri() test %d failed, expected no hostname, got: %s\n",
+ i, hostname);
+ any_failed = TRUE;
+ }
+ }
+ else if (hostname == NULL ||
+ strcmp (hostname, from_uri_tests[i].expected_hostname) != 0)
+ {
+ g_print ("\ng_filename_from_uri() test %d failed, expected hostname: %s, actual result: %s\n",
+ i, from_uri_tests[i].expected_hostname, (hostname) ? hostname : "NULL");
+ any_failed = TRUE;
+ }
+ }
+ }
+}
+
+static gint
+safe_strcmp (const gchar *a, const gchar *b)
+{
+ return strcmp (a ? a : "", b ? b : "");
+}
+
+static gint
+safe_strcmp_filename (const gchar *a, const gchar *b)
+{
+#ifndef G_OS_WIN32
+ return safe_strcmp (a, b);
+#else
+ if (!a || !b)
+ return safe_strcmp (a, b);
+ else
+ {
+ while (*a && *b)
+ {
+ if ((G_IS_DIR_SEPARATOR (*a) && G_IS_DIR_SEPARATOR (*b)) ||
+ *a == *b)
+ a++, b++;
+ else
+ return (*a - *b);
+ }
+ return (*a - *b);
+ }
+#endif
+}
+
+static gint
+safe_strcmp_hostname (const gchar *a, const gchar *b)
+{
+#ifndef G_OS_WIN32
+ return safe_strcmp (a, b);
+#else
+ if (safe_strcmp (a, "localhost") == 0 && b == NULL)
+ return 0;
+ else
+ return safe_strcmp (a, b);
+#endif
+}
+
+static void
+run_roundtrip_tests (void)
+{
+ int i;
+ gchar *uri, *hostname, *res;
+ GError *error;
+
+ for (i = 0; i < G_N_ELEMENTS (to_uri_tests); i++)
+ {
+ if (to_uri_tests[i].expected_error != 0)
+ continue;
+
+ error = NULL;
+ uri = g_filename_to_uri (to_uri_tests[i].filename,
+ to_uri_tests[i].hostname,
+ &error);
+
+ if (error != NULL)
+ {
+ g_print ("g_filename_to_uri failed unexpectedly: %s\n",
+ error->message);
+ any_failed = TRUE;
+ continue;
+ }
+
+ error = NULL;
+ res = g_filename_from_uri (uri, &hostname, &error);
+ if (error != NULL)
+ {
+ g_print ("g_filename_from_uri failed unexpectedly: %s\n",
+ error->message);
+ any_failed = TRUE;
+ continue;
+ }
+
+ if (safe_strcmp_filename (to_uri_tests[i].filename, res))
+ {
+ g_print ("roundtrip test %d failed, filename modified: "
+ " expected \"%s\", but got \"%s\"\n",
+ i, to_uri_tests[i].filename, res);
+ any_failed = TRUE;
+ }
+
+ if (safe_strcmp_hostname (to_uri_tests[i].hostname, hostname))
+ {
+ g_print ("roundtrip test %d failed, hostname modified: "
+ " expected \"%s\", but got \"%s\"\n",
+ i, to_uri_tests[i].hostname, hostname);
+ any_failed = TRUE;
+ }
+ }
+}
+
+static void
+run_uri_list_tests (void)
+{
+ /* straight from the RFC */
+ gchar *list =
+ "# urn:isbn:0-201-08372-8\r\n"
+ "http://www.huh.org/books/foo.html\r\n"
+ "http://www.huh.org/books/foo.pdf \r\n"
+ " ftp://ftp.foo.org/books/foo.txt\r\n";
+ gchar *expected_uris[] = {
+ "http://www.huh.org/books/foo.html",
+ "http://www.huh.org/books/foo.pdf",
+ "ftp://ftp.foo.org/books/foo.txt"
+ };
+
+ gchar **uris;
+ gint j;
+
+ uris = g_uri_list_extract_uris (list);
+
+ if (g_strv_length (uris) != 3)
+ {
+ g_print ("uri list test failed: "
+ " expected %d uris, but got %d\n",
+ 3, g_strv_length (uris));
+ any_failed = TRUE;
+ }
+
+ for (j = 0; j < 3; j++)
+ {
+ if (safe_strcmp (uris[j], expected_uris[j]))
+ {
+ g_print ("uri list test failed: "
+ " expected \"%s\", but got \"%s\"\n",
+ expected_uris[j], uris[j]);
+ any_failed = TRUE;
+ }
+ }
+
+ g_strfreev (uris);
+
+ uris = g_uri_list_extract_uris ("# just hot air\r\n# more hot air");
+ if (g_strv_length (uris) != 0)
+ {
+ g_print ("uri list test 2 failed: "
+ " expected %d uris, but got %d (first is \"%s\")\n",
+ 0, g_strv_length (uris), uris[0]);
+ any_failed = TRUE;
+ }
+
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+#ifdef G_OS_UNIX
+# ifdef HAVE_UNSETENV
+ unsetenv ("G_BROKEN_FILENAMES");
+# else
+ /* putenv with no = isn't standard, but works to unset the variable
+ * on some systems
+ */
+ putenv ("G_BROKEN_FILENAMES");
+# endif
+#endif
+
+ run_to_uri_tests ();
+ run_from_uri_tests ();
+ run_roundtrip_tests ();
+ run_uri_list_tests ();
+
+ return any_failed ? 1 : 0;
+}
diff --git a/trunk/tests/utf8-pointer.c b/trunk/tests/utf8-pointer.c
new file mode 100644
index 000000000..6ac256641
--- /dev/null
+++ b/trunk/tests/utf8-pointer.c
@@ -0,0 +1,99 @@
+/* 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 <string.h>
+#include <glib.h>
+
+/* Test conversions between offsets and pointers */
+
+static void test_utf8 (gchar *string)
+{
+ gint num_chars;
+ gchar **p;
+ gint i, j;
+
+ g_assert (g_utf8_validate (string, -1, NULL));
+
+ num_chars = g_utf8_strlen (string, -1);
+
+ p = (gchar **) g_malloc (num_chars * sizeof (gchar *));
+
+ p[0] = string;
+ for (i = 1; i < num_chars; i++)
+ p[i] = g_utf8_next_char (p[i-1]);
+
+ for (i = 0; i < num_chars; i++)
+ for (j = 0; j < num_chars; j++)
+ {
+ g_assert (g_utf8_offset_to_pointer (p[i], j - i) == p[j]);
+ g_assert (g_utf8_pointer_to_offset (p[i], p[j]) == j - i);
+ }
+
+ g_free (p);
+}
+
+gchar *longline = "asdasdas dsaf asfd as fdasdf asfd asdf as dfas dfasdf a"
+"asd fasdf asdf asdf asd fasfd as fdasfd asdf as fdççççççççças ffsd asfd as fdASASASAs As"
+"Asfdsf sdfg sdfg dsfg dfg sdfgsdfgsdfgsdfg sdfgsdfg sdfg sdfg sdf gsdfg sdfg sd"
+"asd fasdf asdf asdf asd fasfd as fdaèèèèèèè òòòòòòòòòòòòsfd asdf as fdas ffsd asfd as fdASASASAs D"
+"Asfdsf sdfg sdfg dsfg dfg sdfgsdfgsdfgsdfg sdfgsdfg sdfgùùùùùùùùùùùùùù sdfg sdf gsdfg sdfg sd"
+"asd fasdf asdf asdf asd fasfd as fdasfd asd@@@@@@@f as fdas ffsd asfd as fdASASASAs D "
+"Asfdsf sdfg sdfg dsfg dfg sdfgsdfgsdfgsdfg sdfgsdf€€€€€€€€€€€€€€€€€€g sdfg sdfg sdf gsdfg sdfg sd"
+"asd fasdf asdf asdf asd fasfd as fdasfd asdf as fdas ffsd asfd as fdASASASAs D"
+"Asfdsf sdfg sdfg dsfg dfg sdfgsdfgsdfgsdfg sdfgsdfg sdfg sdfg sdf gsdfg sdfg sd\n\nlalala\n";
+
+static void
+test_length (void)
+{
+ g_assert (g_utf8_strlen ("1234", -1) == 4);
+ g_assert (g_utf8_strlen ("1234", 0) == 0);
+ g_assert (g_utf8_strlen ("1234", 1) == 1);
+ g_assert (g_utf8_strlen ("1234", 2) == 2);
+ g_assert (g_utf8_strlen ("1234", 3) == 3);
+ g_assert (g_utf8_strlen ("1234", 4) == 4);
+ g_assert (g_utf8_strlen ("1234", 5) == 4);
+
+ g_assert (g_utf8_strlen (longline, -1) == 762);
+ g_assert (g_utf8_strlen (longline, strlen (longline)) == 762);
+ g_assert (g_utf8_strlen (longline, 1024) == 762);
+
+ g_assert (g_utf8_strlen (NULL, 0) == 0);
+
+ g_assert (g_utf8_strlen ("a\340\250\201c", -1) == 3);
+ g_assert (g_utf8_strlen ("a\340\250\201c", 1) == 1);
+ g_assert (g_utf8_strlen ("a\340\250\201c", 2) == 1);
+ g_assert (g_utf8_strlen ("a\340\250\201c", 3) == 1);
+ g_assert (g_utf8_strlen ("a\340\250\201c", 4) == 2);
+ g_assert (g_utf8_strlen ("a\340\250\201c", 5) == 3);
+}
+
+int main (int argc, char *argv[])
+{
+ test_utf8 (longline);
+ test_length ();
+
+ return 0;
+}
diff --git a/trunk/tests/utf8-validate.c b/trunk/tests/utf8-validate.c
new file mode 100644
index 000000000..98f0b1f86
--- /dev/null
+++ b/trunk/tests/utf8-validate.c
@@ -0,0 +1,319 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 2001 Matthias Clasen <matthiasc@poet.de>
+ *
+ * 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"
+
+#define UNICODE_VALID(Char) \
+ ((Char) < 0x110000 && \
+ (((Char) & 0xFFFFF800) != 0xD800) && \
+ ((Char) < 0xFDD0 || (Char) > 0xFDEF) && \
+ ((Char) & 0xFFFE) != 0xFFFE)
+
+
+
+static gboolean any_failed = FALSE;
+
+struct {
+ const gchar *text;
+ gint max_len;
+ gint offset;
+ gboolean valid;
+} test[] = {
+ /* some tests to check max_len handling */
+ /* length 1 */
+ { "abcde", -1, 5, TRUE },
+ { "abcde", 3, 3, TRUE },
+ { "abcde", 5, 5, TRUE },
+ { "abcde", 7, 5, FALSE },
+ /* length 2 */
+ { "\xc2\xa9\xc2\xa9\xc2\xa9", -1, 6, TRUE },
+ { "\xc2\xa9\xc2\xa9\xc2\xa9", 1, 0, FALSE },
+ { "\xc2\xa9\xc2\xa9\xc2\xa9", 2, 2, TRUE },
+ { "\xc2\xa9\xc2\xa9\xc2\xa9", 3, 2, FALSE },
+ { "\xc2\xa9\xc2\xa9\xc2\xa9", 4, 4, TRUE },
+ { "\xc2\xa9\xc2\xa9\xc2\xa9", 5, 4, FALSE },
+ { "\xc2\xa9\xc2\xa9\xc2\xa9", 6, 6, TRUE },
+ { "\xc2\xa9\xc2\xa9\xc2\xa9", 7, 6, FALSE },
+ /* length 3 */
+ { "\xe2\x89\xa0\xe2\x89\xa0", -1, 6, TRUE },
+ { "\xe2\x89\xa0\xe2\x89\xa0", 1, 0, FALSE },
+ { "\xe2\x89\xa0\xe2\x89\xa0", 2, 0, FALSE },
+ { "\xe2\x89\xa0\xe2\x89\xa0", 3, 3, TRUE },
+ { "\xe2\x89\xa0\xe2\x89\xa0", 4, 3, FALSE },
+ { "\xe2\x89\xa0\xe2\x89\xa0", 5, 3, FALSE },
+ { "\xe2\x89\xa0\xe2\x89\xa0", 6, 6, TRUE },
+ { "\xe2\x89\xa0\xe2\x89\xa0", 7, 6, FALSE },
+
+ /* examples from http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt */
+ /* greek 'kosme' */
+ { "\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5", -1, 11, TRUE },
+ /* first sequence of each length */
+ { "\x00", -1, 0, TRUE },
+ { "\xc2\x80", -1, 2, TRUE },
+ { "\xe0\xa0\x80", -1, 3, TRUE },
+ { "\xf0\x90\x80\x80", -1, 4, TRUE },
+ { "\xf8\x88\x80\x80\x80", -1, 0, FALSE },
+ { "\xfc\x84\x80\x80\x80\x80", -1, 0, FALSE },
+ /* last sequence of each length */
+ { "\x7f", -1, 1, TRUE },
+ { "\xdf\xbf", -1, 2, TRUE },
+ { "\xef\xbf\xbf", -1, 0, FALSE },
+ { "\xf7\xbf\xbf\xbf", -1, 0, FALSE },
+ { "\xfb\xbf\xbf\xbf\xbf", -1, 0, FALSE },
+ { "\xfd\xbf\xbf\xbf\xbf\xbf", -1, 0, FALSE },
+ /* other boundary conditions */
+ { "\xed\x9f\xbf", -1, 3, TRUE },
+ { "\xee\x80\x80", -1, 3, TRUE },
+ { "\xef\xbf\xbd", -1, 3, TRUE },
+ { "\xf4\x8f\xbf\xbf", -1, 0, FALSE },
+ { "\xf4\x90\x80\x80", -1, 0, FALSE },
+ /* malformed sequences */
+ /* continuation bytes */
+ { "\x80", -1, 0, FALSE },
+ { "\xbf", -1, 0, FALSE },
+ { "\x80\xbf", -1, 0, FALSE },
+ { "\x80\xbf\x80", -1, 0, FALSE },
+ { "\x80\xbf\x80\xbf", -1, 0, FALSE },
+ { "\x80\xbf\x80\xbf\x80", -1, 0, FALSE },
+ { "\x80\xbf\x80\xbf\x80\xbf", -1, 0, FALSE },
+ { "\x80\xbf\x80\xbf\x80\xbf\x80", -1, 0, FALSE },
+
+ /* all possible continuation byte */
+ { "\x80", -1, 0, FALSE },
+ { "\x81", -1, 0, FALSE },
+ { "\x82", -1, 0, FALSE },
+ { "\x83", -1, 0, FALSE },
+ { "\x84", -1, 0, FALSE },
+ { "\x85", -1, 0, FALSE },
+ { "\x86", -1, 0, FALSE },
+ { "\x87", -1, 0, FALSE },
+ { "\x88", -1, 0, FALSE },
+ { "\x89", -1, 0, FALSE },
+ { "\x8a", -1, 0, FALSE },
+ { "\x8b", -1, 0, FALSE },
+ { "\x8c", -1, 0, FALSE },
+ { "\x8d", -1, 0, FALSE },
+ { "\x8e", -1, 0, FALSE },
+ { "\x8f", -1, 0, FALSE },
+ { "\x90", -1, 0, FALSE },
+ { "\x91", -1, 0, FALSE },
+ { "\x92", -1, 0, FALSE },
+ { "\x93", -1, 0, FALSE },
+ { "\x94", -1, 0, FALSE },
+ { "\x95", -1, 0, FALSE },
+ { "\x96", -1, 0, FALSE },
+ { "\x97", -1, 0, FALSE },
+ { "\x98", -1, 0, FALSE },
+ { "\x99", -1, 0, FALSE },
+ { "\x9a", -1, 0, FALSE },
+ { "\x9b", -1, 0, FALSE },
+ { "\x9c", -1, 0, FALSE },
+ { "\x9d", -1, 0, FALSE },
+ { "\x9e", -1, 0, FALSE },
+ { "\x9f", -1, 0, FALSE },
+ { "\xa0", -1, 0, FALSE },
+ { "\xa1", -1, 0, FALSE },
+ { "\xa2", -1, 0, FALSE },
+ { "\xa3", -1, 0, FALSE },
+ { "\xa4", -1, 0, FALSE },
+ { "\xa5", -1, 0, FALSE },
+ { "\xa6", -1, 0, FALSE },
+ { "\xa7", -1, 0, FALSE },
+ { "\xa8", -1, 0, FALSE },
+ { "\xa9", -1, 0, FALSE },
+ { "\xaa", -1, 0, FALSE },
+ { "\xab", -1, 0, FALSE },
+ { "\xac", -1, 0, FALSE },
+ { "\xad", -1, 0, FALSE },
+ { "\xae", -1, 0, FALSE },
+ { "\xaf", -1, 0, FALSE },
+ { "\xb0", -1, 0, FALSE },
+ { "\xb1", -1, 0, FALSE },
+ { "\xb2", -1, 0, FALSE },
+ { "\xb3", -1, 0, FALSE },
+ { "\xb4", -1, 0, FALSE },
+ { "\xb5", -1, 0, FALSE },
+ { "\xb6", -1, 0, FALSE },
+ { "\xb7", -1, 0, FALSE },
+ { "\xb8", -1, 0, FALSE },
+ { "\xb9", -1, 0, FALSE },
+ { "\xba", -1, 0, FALSE },
+ { "\xbb", -1, 0, FALSE },
+ { "\xbc", -1, 0, FALSE },
+ { "\xbd", -1, 0, FALSE },
+ { "\xbe", -1, 0, FALSE },
+ { "\xbf", -1, 0, FALSE },
+ /* lone start characters */
+ { "\xc0\x20", -1, 0, FALSE },
+ { "\xc1\x20", -1, 0, FALSE },
+ { "\xc2\x20", -1, 0, FALSE },
+ { "\xc3\x20", -1, 0, FALSE },
+ { "\xc4\x20", -1, 0, FALSE },
+ { "\xc5\x20", -1, 0, FALSE },
+ { "\xc6\x20", -1, 0, FALSE },
+ { "\xc7\x20", -1, 0, FALSE },
+ { "\xc8\x20", -1, 0, FALSE },
+ { "\xc9\x20", -1, 0, FALSE },
+ { "\xca\x20", -1, 0, FALSE },
+ { "\xcb\x20", -1, 0, FALSE },
+ { "\xcc\x20", -1, 0, FALSE },
+ { "\xcd\x20", -1, 0, FALSE },
+ { "\xce\x20", -1, 0, FALSE },
+ { "\xcf\x20", -1, 0, FALSE },
+ { "\xd0\x20", -1, 0, FALSE },
+ { "\xd1\x20", -1, 0, FALSE },
+ { "\xd2\x20", -1, 0, FALSE },
+ { "\xd3\x20", -1, 0, FALSE },
+ { "\xd4\x20", -1, 0, FALSE },
+ { "\xd5\x20", -1, 0, FALSE },
+ { "\xd6\x20", -1, 0, FALSE },
+ { "\xd7\x20", -1, 0, FALSE },
+ { "\xd8\x20", -1, 0, FALSE },
+ { "\xd9\x20", -1, 0, FALSE },
+ { "\xda\x20", -1, 0, FALSE },
+ { "\xdb\x20", -1, 0, FALSE },
+ { "\xdc\x20", -1, 0, FALSE },
+ { "\xdd\x20", -1, 0, FALSE },
+ { "\xde\x20", -1, 0, FALSE },
+ { "\xdf\x20", -1, 0, FALSE },
+ { "\xe0\x20", -1, 0, FALSE },
+ { "\xe1\x20", -1, 0, FALSE },
+ { "\xe2\x20", -1, 0, FALSE },
+ { "\xe3\x20", -1, 0, FALSE },
+ { "\xe4\x20", -1, 0, FALSE },
+ { "\xe5\x20", -1, 0, FALSE },
+ { "\xe6\x20", -1, 0, FALSE },
+ { "\xe7\x20", -1, 0, FALSE },
+ { "\xe8\x20", -1, 0, FALSE },
+ { "\xe9\x20", -1, 0, FALSE },
+ { "\xea\x20", -1, 0, FALSE },
+ { "\xeb\x20", -1, 0, FALSE },
+ { "\xec\x20", -1, 0, FALSE },
+ { "\xed\x20", -1, 0, FALSE },
+ { "\xee\x20", -1, 0, FALSE },
+ { "\xef\x20", -1, 0, FALSE },
+ { "\xf0\x20", -1, 0, FALSE },
+ { "\xf1\x20", -1, 0, FALSE },
+ { "\xf2\x20", -1, 0, FALSE },
+ { "\xf3\x20", -1, 0, FALSE },
+ { "\xf4\x20", -1, 0, FALSE },
+ { "\xf5\x20", -1, 0, FALSE },
+ { "\xf6\x20", -1, 0, FALSE },
+ { "\xf7\x20", -1, 0, FALSE },
+ { "\xf8\x20", -1, 0, FALSE },
+ { "\xf9\x20", -1, 0, FALSE },
+ { "\xfa\x20", -1, 0, FALSE },
+ { "\xfb\x20", -1, 0, FALSE },
+ { "\xfc\x20", -1, 0, FALSE },
+ { "\xfd\x20", -1, 0, FALSE },
+ /* missing continuation bytes */
+ { "\x20\xc0", -1, 1, FALSE },
+ { "\x20\xe0\x80", -1, 1, FALSE },
+ { "\x20\xf0\x80\x80", -1, 1, FALSE },
+ { "\x20\xf8\x80\x80\x80", -1, 1, FALSE },
+ { "\x20\xfc\x80\x80\x80\x80", -1, 1, FALSE },
+ { "\x20\xdf", -1, 1, FALSE },
+ { "\x20\xef\xbf", -1, 1, FALSE },
+ { "\x20\xf7\xbf\xbf", -1, 1, FALSE },
+ { "\x20\xfb\xbf\xbf\xbf", -1, 1, FALSE },
+ { "\x20\xfd\xbf\xbf\xbf\xbf", -1, 1, FALSE },
+ /* impossible bytes */
+ { "\x20\xfe\x20", -1, 1, FALSE },
+ { "\x20\xff\x20", -1, 1, FALSE },
+ /* overlong sequences */
+ { "\x20\xc0\xaf\x20", -1, 1, FALSE },
+ { "\x20\xe0\x80\xaf\x20", -1, 1, FALSE },
+ { "\x20\xf0\x80\x80\xaf\x20", -1, 1, FALSE },
+ { "\x20\xf8\x80\x80\x80\xaf\x20", -1, 1, FALSE },
+ { "\x20\xfc\x80\x80\x80\x80\xaf\x20", -1, 1, FALSE },
+ { "\x20\xc1\xbf\x20", -1, 1, FALSE },
+ { "\x20\xe0\x9f\xbf\x20", -1, 1, FALSE },
+ { "\x20\xf0\x8f\xbf\xbf\x20", -1, 1, FALSE },
+ { "\x20\xf8\x87\xbf\xbf\xbf\x20", -1, 1, FALSE },
+ { "\x20\xfc\x83\xbf\xbf\xbf\xbf\x20", -1, 1, FALSE },
+ { "\x20\xc0\x80\x20", -1, 1, FALSE },
+ { "\x20\xe0\x80\x80\x20", -1, 1, FALSE },
+ { "\x20\xf0\x80\x80\x80\x20", -1, 1, FALSE },
+ { "\x20\xf8\x80\x80\x80\x80\x20", -1, 1, FALSE },
+ { "\x20\xfc\x80\x80\x80\x80\x80\x20", -1, 1, FALSE },
+ /* illegal code positions */
+ { "\x20\xed\xa0\x80\x20", -1, 1, FALSE },
+ { "\x20\xed\xad\xbf\x20", -1, 1, FALSE },
+ { "\x20\xed\xae\x80\x20", -1, 1, FALSE },
+ { "\x20\xed\xaf\xbf\x20", -1, 1, FALSE },
+ { "\x20\xed\xb0\x80\x20", -1, 1, FALSE },
+ { "\x20\xed\xbe\x80\x20", -1, 1, FALSE },
+ { "\x20\xed\xbf\xbf\x20", -1, 1, FALSE },
+ { "\x20\xed\xa0\x80\xed\xb0\x80\x20", -1, 1, FALSE },
+ { "\x20\xed\xa0\x80\xed\xbf\xbf\x20", -1, 1, FALSE },
+ { "\x20\xed\xad\xbf\xed\xb0\x80\x20", -1, 1, FALSE },
+ { "\x20\xed\xad\xbf\xed\xbf\xbf\x20", -1, 1, FALSE },
+ { "\x20\xed\xae\x80\xed\xb0\x80\x20", -1, 1, FALSE },
+ { "\x20\xed\xae\x80\xed\xbf\xbf\x20", -1, 1, FALSE },
+ { "\x20\xed\xaf\xbf\xed\xb0\x80\x20", -1, 1, FALSE },
+ { "\x20\xed\xaf\xbf\xed\xbf\xbf\x20", -1, 1, FALSE },
+ { "\x20\xef\xbf\xbe\x20", -1, 1, FALSE },
+ { "\x20\xef\xbf\xbf\x20", -1, 1, FALSE },
+
+ { NULL, }
+};
+
+static void
+do_test (gint index,
+ const gchar *text,
+ gint max_len,
+ gint offset,
+ gboolean valid)
+{
+ const gchar *end;
+ gboolean result;
+
+ result = g_utf8_validate (text, max_len, &end);
+
+ if (result != valid || end - text != offset)
+ {
+ GString *str;
+ const gchar *p;
+
+ any_failed = TRUE;
+
+ str = g_string_new (0);
+ for (p = text; *p; p++)
+ g_string_append_printf (str, "\\x%02hhx", *p);
+ g_print ("%d: g_utf8_validate (\"%s\", %d) failed, "
+ "expected %s %d, got %s %d\n",
+ index,
+ str->str, max_len,
+ valid ? "TRUE" : "FALSE", offset,
+ result ? "TRUE" : "FALSE", (gint) (end - text));
+ g_string_free (str, FALSE);
+ }
+}
+
+int
+main (int argc, char *argv[])
+{
+ gint i;
+
+ for (i = 0; test[i].text; i++)
+ do_test (i, test[i].text, test[i].max_len,
+ test[i].offset, test[i].valid);
+
+ return any_failed ? 1 : 0;
+}
diff --git a/trunk/tests/utf8.txt b/trunk/tests/utf8.txt
new file mode 100644
index 000000000..3f1f22c46
--- /dev/null
+++ b/trunk/tests/utf8.txt
@@ -0,0 +1,301 @@
+# This file is derived from
+#
+# http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
+#
+# Which was created by Markus Kuhn <mkuhn@acm.org> - 2000-09-02
+#
+# lines begining with # and blank lines are ignored
+#
+# Beyond that, this file consists of a series of test cases. Each test case consists of
+# 2 or 3 lines:
+#
+# 1. A UTF-8 string
+# 2. A status
+# VALID : The string is a valid UTF-8 representation of valid Unicode
+# INCOMPLETE : The string has a partial character at the end
+# NOTUNICODE : The string is valid UTF-8, but the characters represented
+# are not valid unicode (
+# OVERLONG : The string includes overlong sequences
+# MALFORMED : The string is not valid UTF-8
+# 3. If the status is VALID or NOTUNICODE, the UCS-4 representation of the string,
+# as a series of hex numbers.
+
+# 1 Some correct UTF-8 text
+κόσμε
+VALID
+03ba 1f79 03c3 03bc 03b5
+
+# 2.1 First possible sequence of a certain length
+#
+# FIXME - handle NULLS?
+#
+# [ NULL BYTE ]
+#VALID
+#0000
+
+VALID
+0080
+
+ࠀ
+VALID
+0800
+
+𐀀
+VALID
+00010000
+
+
+NOTUNICODE
+00200000
+
+
+NOTUNICODE
+04000000
+
+
+VALID
+0000007f
+
+߿
+VALID
+000007ff
+
+￿
+NOTUNICODE
+0000ffff
+
+
+NOTUNICODE
+001fffff
+
+
+NOTUNICODE
+03ffffff
+
+
+NOTUNICODE
+7fffffff
+
+# 2.3 Other boundary conditions
+
+퟿
+VALID
+d7ff
+
+
+VALID
+e000
+
+�
+VALID
+fffd
+
+􏿽
+VALID
+0010fffd
+
+􏿿
+NOTUNICODE
+0010ffff
+
+
+NOTUNICODE
+00110000
+
+# 3.1 Unexpected continuation bytes
+
+
+MALFORMED
+
+MALFORMED
+
+MALFORMED
+
+MALFORMED
+
+MALFORMED
+
+MALFORMED
+
+MALFORMED
+
+MALFORMED
+
+MALFORMED
+
+# 3.2 Lonely start characters
+
+
+MALFORMED
+
+MALFORMED
+
+MALFORMED
+
+MALFORMED
+
+MALFORMED
+
+# 3.3 Sequences with last continuation byte missing
+
+
+INCOMPLETE
+
+INCOMPLETE
+
+INCOMPLETE
+
+INCOMPLETE
+
+INCOMPLETE
+
+INCOMPLETE
+
+INCOMPLETE
+
+INCOMPLETE
+
+INCOMPLETE
+
+INCOMPLETE
+
+# 3.4 Concatenation of incomplete sequences
+
+
+MALFORMED
+
+# 3.5 Impossible bytes
+
+
+MALFORMED
+
+MALFORMED
+
+MALFORMED
+
+# Examples of an overlong ASCII character
+
+
+OVERLONG
+
+OVERLONG
+
+OVERLONG
+
+OVERLONG
+
+OVERLONG
+
+# Maximum overlong sequences
+
+
+OVERLONG
+
+OVERLONG
+
+OVERLONG
+
+OVERLONG
+
+OVERLONG
+
+# Overlong representation of the NUL character
+
+
+OVERLONG
+
+OVERLONG
+
+OVERLONG
+
+OVERLONG
+
+OVERLONG
+
+# Illegal code positions
+
+# Single UTF-16 surrogates
+
+
+NOTUNICODE
+d800
+
+
+NOTUNICODE
+db7f
+
+
+NOTUNICODE
+db80
+
+
+NOTUNICODE
+dbff
+
+
+NOTUNICODE
+dc00
+
+
+NOTUNICODE
+df80
+
+
+NOTUNICODE
+dfff
+
+# Paired UTF-16 surrogates
+
+
+NOTUNICODE
+d800 dc00
+
+
+NOTUNICODE
+d800 dfff
+
+
+NOTUNICODE
+db7f dc00
+
+
+NOTUNICODE
+db7f dfff
+
+
+NOTUNICODE
+db80 dc00
+
+
+NOTUNICODE
+db80 dfff
+
+
+NOTUNICODE
+dbff dc00
+
+
+NOTUNICODE
+dbff dfff
+
+# Other illegal code positions
+
+￾
+NOTUNICODE
+fffe
+
+￿
+NOTUNICODE
+ffff
+
+################
+#
+# Some more tests, not from Markus Kuhn's file
+#
+
+# Mixed plane 0 and higher planes
+
+A𐀀B􏿽C
+VALID
+41 00010000 42 10fffd 43
diff --git a/trunk/win32-fixup.pl b/trunk/win32-fixup.pl
new file mode 100644
index 000000000..cb1a7a859
--- /dev/null
+++ b/trunk/win32-fixup.pl
@@ -0,0 +1,35 @@
+#!/usr/bin/perl
+
+$major = 1;
+$minor = 3;
+$micro = 7;
+$binary_age = 0;
+$interface_age = 0;
+$gettext_package = "glib20";
+
+sub process_file
+{
+ my $outfilename = shift;
+ my $infilename = $outfilename . ".in";
+
+ open (INPUT, "< $infilename") || exit 1;
+ open (OUTPUT, "> $outfilename") || exit 1;
+
+ while (<INPUT>) {
+ s/\@GLIB_MAJOR_VERSION\@/$major/g;
+ s/\@GLIB_MINOR_VERSION\@/$minor/g;
+ s/\@GLIB_MICRO_VERSION\@/$micro/g;
+ s/\@GLIB_INTERFACE_AGE\@/$interface_age/g;
+ s/\@GLIB_BINARY_AGE\@/$binary_age/g;
+ s/\@GETTEXT_PACKAGE\@/$gettext_package/g;
+ print OUTPUT;
+ }
+}
+
+process_file ("config.h.win32");
+process_file ("glibconfig.h.win32");
+process_file ("glib/makefile.msc");
+process_file ("gmodule/makefile.msc");
+process_file ("gobject/makefile.msc");
+process_file ("gthread/makefile.msc");
+process_file ("tests/makefile.msc");